diff --git a/dpf/LICENSE b/dpf/LICENSE new file mode 100644 index 0000000..6ecc24c --- /dev/null +++ b/dpf/LICENSE @@ -0,0 +1,13 @@ +DISTRHO Plugin Framework (DPF) +Copyright (C) 2012-2014 Filipe Coelho + +Permission to use, copy, modify, and/or distribute this software for any purpose with +or without fee is hereby granted, provided that the above copyright notice and this +permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN +NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/dpf/README.md b/dpf/README.md new file mode 100644 index 0000000..08ff3a1 --- /dev/null +++ b/dpf/README.md @@ -0,0 +1,32 @@ +# DPF - DISTRHO Plugin Framework + +DPF is designed to make development of new plugins an easy and enjoyable task.
+It allows developers to create plugins with custom UIs using a simple C++ API.
+The framework facilitates exporting various different plugin formats from the same code-base.
+ +DPF can build for LADSPA, DSSI, LV2 and VST formats.
+LADSPA, DSSI and VST implementations are complete, LV2 at ~95% completion.
+A JACK/Standalone mode is also available, allowing you to quickly test plugins.
+ +Plugin DSP and UI communication is done via key-value string pairs.
+You send messages from the UI to the DSP side, which is automatically saved in the host when required.
+ +Getting time information from the host is possible.
+It uses the same format as the JACK Transport API, making porting some code easier.
+ + +List of plugins made with DPF:
+ - [DISTRHO Mini-Series](https://github.com/DISTRHO/Mini-Series) + - [DISTRHO MVerb](https://github.com/DISTRHO/MVerb) + - [DISTRHO Nekobi](https://github.com/DISTRHO/Nekobi) + - [DISTRHO ProM](https://github.com/DISTRHO/ProM) + - [DISTRHO ndc Plugs](https://github.com/DISTRHO/ndc-Plugs) + - [Juice Plugins](https://github.com/DISTRHO/JuicePlugins) (work in progress) + - [ZamAudio Suite](https://github.com/zamaudio/zam-plugins) + + +Plugin examples are available [here](https://github.com/DISTRHO/plugin-examples).
+OpenGL UI examples are available [here](https://github.com/DISTRHO/gl-examples). + + +Online documentation is available at [https://distrho.github.io/DPF/](https://distrho.github.io/DPF/). diff --git a/dpf/dgl/Application.hpp b/dpf/dgl/Application.hpp new file mode 100644 index 0000000..03d003b --- /dev/null +++ b/dpf/dgl/Application.hpp @@ -0,0 +1,91 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_APP_HPP_INCLUDED +#define DGL_APP_HPP_INCLUDED + +#include "Base.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- +// Forward class names + +class Window; + +// ----------------------------------------------------------------------- + +/** + Base DGL Application class. + + One application instance is required for creating a window. + There's no single/global application instance in DGL, and multiple + windows can share the same app instance. + + In standalone mode an application will automatically quit its + event-loop when all its windows are closed. + */ +class Application +{ +public: + /** + Constructor. + */ + Application(); + + /** + Destructor. + */ + ~Application(); + + /** + Idle function. + This runs the application event-loop once. + */ + void idle(); + + /** + Run the application event-loop until all Windows are closed. + idle() is called at regular intervals. + @note This function is meant for standalones only, *never* call this from plugins. + */ + void exec(); + + /** + Quit the application. + This stops the event-loop and closes all Windows. + */ + void quit(); + + /** + Check if the application is about to quit. + Returning true means there's no event-loop running at the moment (or it's just about to stop). + */ + bool isQuiting() const noexcept; + +private: + struct PrivateData; + PrivateData* const pData; + friend class Window; + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Application) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_APP_HPP_INCLUDED diff --git a/dpf/dgl/Base.hpp b/dpf/dgl/Base.hpp new file mode 100644 index 0000000..71a0ec3 --- /dev/null +++ b/dpf/dgl/Base.hpp @@ -0,0 +1,195 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_BASE_HPP_INCLUDED +#define DGL_BASE_HPP_INCLUDED + +#include "../distrho/extra/LeakDetector.hpp" +#include "../distrho/extra/ScopedPointer.hpp" + +// ----------------------------------------------------------------------- +// Define namespace + +#ifndef DGL_NAMESPACE +# define DGL_NAMESPACE DGL +#endif + +#define START_NAMESPACE_DGL namespace DGL_NAMESPACE { +#define END_NAMESPACE_DGL } +#define USE_NAMESPACE_DGL using namespace DGL_NAMESPACE; + +#ifdef DISTRHO_OS_WINDOWS +// ----------------------------------------------------------------------- +// Fix OpenGL includes for Windows, based on glfw code + +#ifndef APIENTRY +# define APIENTRY __stdcall +#endif // APIENTRY + +/* We need WINGDIAPI defined */ +#ifndef WINGDIAPI +# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__) +# define WINGDIAPI __declspec(dllimport) +# elif defined(__LCC__) +# define WINGDIAPI __stdcall +# else +# define WINGDIAPI extern +# endif +# define DGL_WINGDIAPI_DEFINED +#endif // WINGDIAPI + +/* Some files also need CALLBACK defined */ +#ifndef CALLBACK +# if defined(_MSC_VER) +# if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) +# define CALLBACK __stdcall +# else +# define CALLBACK +# endif +# else +# define CALLBACK __stdcall +# endif +# define DGL_CALLBACK_DEFINED +#endif // CALLBACK + +/* Most GL/glu.h variants on Windows need wchar_t */ +#include + +#endif // DISTRHO_OS_WINDOWS + +// ----------------------------------------------------------------------- +// OpenGL includes + +#ifdef DISTRHO_OS_MAC +# include "OpenGL/gl.h" +#else +# define GL_GLEXT_PROTOTYPES +# include "GL/gl.h" +# include "GL/glext.h" +#endif + +// ----------------------------------------------------------------------- +// Missing OpenGL defines + +#if defined(GL_BGR_EXT) && ! defined(GL_BGR) +# define GL_BGR GL_BGR_EXT +#endif + +#if defined(GL_BGRA_EXT) && ! defined(GL_BGRA) +# define GL_BGRA GL_BGRA_EXT +#endif + +#ifndef GL_CLAMP_TO_BORDER +# define GL_CLAMP_TO_BORDER 0x812D +#endif + +#ifdef DISTRHO_OS_WINDOWS +// ----------------------------------------------------------------------- +// Fix OpenGL includes for Windows, based on glfw code + +#ifdef DGL_WINGDIAPI_DEFINED +# undef WINGDIAPI +# undef DGL_WINGDIAPI_DEFINED +#endif + +#ifdef DGL_CALLBACK_DEFINED +# undef CALLBACK +# undef DGL_CALLBACK_DEFINED +#endif + +#endif // DISTRHO_OS_WINDOWS + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- +// Base DGL enums + +/** + Convenience symbols for ASCII control characters. + */ +enum Char { + kCharBackspace = 0x08, + kCharEscape = 0x1B, + kCharDelete = 0x7F +}; + +/** + Keyboard modifier flags. + */ +enum Modifier { + kModifierShift = 1 << 0, /**< Shift key */ + kModifierControl = 1 << 1, /**< Control key */ + kModifierAlt = 1 << 2, /**< Alt/Option key */ + kModifierSuper = 1 << 3 /**< Mod4/Command/Windows key */ +}; + +/** + Special (non-Unicode) keyboard keys. + */ +enum Key { + kKeyF1 = 1, + kKeyF2, + kKeyF3, + kKeyF4, + kKeyF5, + kKeyF6, + kKeyF7, + kKeyF8, + kKeyF9, + kKeyF10, + kKeyF11, + kKeyF12, + kKeyLeft, + kKeyUp, + kKeyRight, + kKeyDown, + kKeyPageUp, + kKeyPageDown, + kKeyHome, + kKeyEnd, + kKeyInsert, + kKeyShift, + kKeyControl, + kKeyAlt, + kKeySuper +}; + +// ----------------------------------------------------------------------- +// Base DGL classes + +/** + Idle callback. + */ +class IdleCallback +{ +public: + virtual ~IdleCallback() {} + virtual void idleCallback() = 0; +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#ifndef DONT_SET_USING_DGL_NAMESPACE + // If your code uses a lot of DGL classes, then this will obviously save you + // a lot of typing, but can be disabled by setting DONT_SET_USING_DGL_NAMESPACE. + using namespace DGL_NAMESPACE; +#endif + +// ----------------------------------------------------------------------- + +#endif // DGL_BASE_HPP_INCLUDED diff --git a/dpf/dgl/Color.hpp b/dpf/dgl/Color.hpp new file mode 100644 index 0000000..e7a0a40 --- /dev/null +++ b/dpf/dgl/Color.hpp @@ -0,0 +1,110 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_COLOR_HPP_INCLUDED +#define DGL_COLOR_HPP_INCLUDED + +#include "Base.hpp" + +struct NVGcolor; + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +/** + A color made from red, green, blue and alpha floating-point values in [0..1] range. +*/ +struct Color { + /** + Direct access to the color values. + */ + union { + float rgba[4]; + struct { float red, green, blue, alpha; }; + }; + + /** + Create solid black color. + */ + Color() noexcept; + + /** + Create a color from red, green, blue and alpha numeric values. + Values must be in [0..255] range. + */ + Color(int red, int green, int blue, int alpha = 255) noexcept; + + /** + Create a color from red, green, blue and alpha floating-point values. + Values must in [0..1] range. + */ + Color(float red, float green, float blue, float alpha = 1.0f) noexcept; + + /** + Create a color by copying another color. + */ + Color(const Color& color) noexcept; + Color& operator=(const Color& color) noexcept; + + /** + Create a color by linearly interpolating two other colors. + */ + Color(const Color& color1, const Color& color2, float u) noexcept; + + /** + Create a color specified by hue, saturation and lightness. + Values must in [0..1] range. + */ + static Color fromHSL(float hue, float saturation, float lightness, float alpha = 1.0f); + + /** + Create a color from a HTML string like "#333" or "#112233". + */ + static Color fromHTML(const char* rgb, float alpha = 1.0f); + + /** + Linearly interpolate this color against another. + */ + void interpolate(const Color& other, float u) noexcept; + + /** + Check if this color matches another. + @note Comparison is forced within 8-bit color values. + */ + bool isEqual(const Color& color, bool withAlpha = true) noexcept; + bool isNotEqual(const Color& color, bool withAlpha = true) noexcept; + bool operator==(const Color& color) noexcept; + bool operator!=(const Color& color) noexcept; + + /** + Fix color bounds if needed. + */ + void fixBounds() noexcept; + + /** + @internal + Needed for NanoVG compatibility. + */ + Color(const NVGcolor&) noexcept; + operator NVGcolor() const noexcept; +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_COLOR_HPP_INCLUDED diff --git a/dpf/dgl/Geometry.hpp b/dpf/dgl/Geometry.hpp new file mode 100644 index 0000000..a7ec43b --- /dev/null +++ b/dpf/dgl/Geometry.hpp @@ -0,0 +1,750 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_GEOMETRY_HPP_INCLUDED +#define DGL_GEOMETRY_HPP_INCLUDED + +#include "Base.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- +// Forward class names + +template class Line; +template class Circle; +template class Triangle; +template class Rectangle; + +// ----------------------------------------------------------------------- + +/** + DGL Point class. + + This class describes a single point in space, defined by an X and Y value. + */ +template +class Point +{ +public: + /** + Constructor for (0, 0) point. + */ + Point() noexcept; + + /** + Constructor using custom X and Y values. + */ + Point(const T& x, const T& y) noexcept; + + /** + Constructor using another Point class values. + */ + Point(const Point& pos) noexcept; + + /** + Get X value. + */ + const T& getX() const noexcept; + + /** + Get Y value. + */ + const T& getY() const noexcept; + + /** + Set X value to @a x. + */ + void setX(const T& x) noexcept; + + /** + Set Y value to @a y. + */ + void setY(const T& y) noexcept; + + /** + Set X and Y values to @a x and @a y respectively. + */ + void setPos(const T& x, const T& y) noexcept; + + /** + Set X and Y values according to @a pos. + */ + void setPos(const Point& pos) noexcept; + + /** + Move this point by @a x and @a y values. + */ + void moveBy(const T& x, const T& y) noexcept; + + /** + Move this point by @a pos. + */ + void moveBy(const Point& pos) noexcept; + + /** + Return true if point is (0, 0). + */ + bool isZero() const noexcept; + + /** + Return true if point is not (0, 0). + */ + bool isNotZero() const noexcept; + + Point operator+(const Point& pos) noexcept; + Point operator-(const Point& pos) noexcept; + Point& operator=(const Point& pos) noexcept; + Point& operator+=(const Point& pos) noexcept; + Point& operator-=(const Point& pos) noexcept; + bool operator==(const Point& pos) const noexcept; + bool operator!=(const Point& pos) const noexcept; + +private: + T fX, fY; + template friend class Line; + template friend class Circle; + template friend class Triangle; + template friend class Rectangle; +}; + +// ----------------------------------------------------------------------- + +/** + DGL Size class. + + This class describes a size, defined by a width and height value. + */ +template +class Size +{ +public: + /** + Constructor for null size (0x0). + */ + Size() noexcept; + + /** + Constructor using custom width and height values. + */ + Size(const T& width, const T& height) noexcept; + + /** + Constructor using another Size class values. + */ + Size(const Size& size) noexcept; + + /** + Get width. + */ + const T& getWidth() const noexcept; + + /** + Get height. + */ + const T& getHeight() const noexcept; + + /** + Set width. + */ + void setWidth(const T& width) noexcept; + + /** + Set height. + */ + void setHeight(const T& height) noexcept; + + /** + Set size to @a width and @a height. + */ + void setSize(const T& width, const T& height) noexcept; + + /** + Set size. + */ + void setSize(const Size& size) noexcept; + + /** + Grow size by @a multiplier. + */ + void growBy(double multiplier) noexcept; + + /** + Shrink size by @a divider. + */ + void shrinkBy(double divider) noexcept; + + /** + Return true if size is null (0x0). + An null size is also invalid. + */ + bool isNull() const noexcept; + + /** + Return true if size is not null (0x0). + A non-null size is still invalid if its width or height is negative. + */ + bool isNotNull() const noexcept; + + /** + Return true if size is valid (width and height are higher than zero). + */ + bool isValid() const noexcept; + + /** + Return true if size is invalid (width or height are lower or equal to zero). + An invalid size might not be null under some circumstances. + */ + bool isInvalid() const noexcept; + + Size operator+(const Size& size) noexcept; + Size operator-(const Size& size) noexcept; + Size& operator=(const Size& size) noexcept; + Size& operator+=(const Size& size) noexcept; + Size& operator-=(const Size& size) noexcept; + Size& operator*=(double m) noexcept; + Size& operator/=(double d) noexcept; + bool operator==(const Size& size) const noexcept; + bool operator!=(const Size& size) const noexcept; + +private: + T fWidth, fHeight; + template friend class Rectangle; +}; + +// ----------------------------------------------------------------------- + +/** + DGL Line class. + + This class describes a line, defined by two points. + */ +template +class Line +{ +public: + /** + Constructor for a null line ([0,0] to [0,0]). + */ + Line() noexcept; + + /** + Constructor using custom start X, start Y, end X and end Y values. + */ + Line(const T& startX, const T& startY, const T& endX, const T& endY) noexcept; + + /** + Constructor using custom start X, start Y and end pos values. + */ + Line(const T& startX, const T& startY, const Point& endPos) noexcept; + + /** + Constructor using custom start pos, end X and end Y values. + */ + Line(const Point& startPos, const T& endX, const T& endY) noexcept; + + /** + Constructor using custom start and end pos values. + */ + Line(const Point& startPos, const Point& endPos) noexcept; + + /** + Constructor using another Line class values. + */ + Line(const Line& line) noexcept; + + /** + Get start X value. + */ + const T& getStartX() const noexcept; + + /** + Get start Y value. + */ + const T& getStartY() const noexcept; + + /** + Get end X value. + */ + const T& getEndX() const noexcept; + + /** + Get end Y value. + */ + const T& getEndY() const noexcept; + + /** + Get start position. + */ + const Point& getStartPos() const noexcept; + + /** + Get end position. + */ + const Point& getEndPos() const noexcept; + + /** + Set start X value to @a x. + */ + void setStartX(const T& x) noexcept; + + /** + Set start Y value to @a y. + */ + void setStartY(const T& y) noexcept; + + /** + Set start X and Y values to @a x and @a y respectively. + */ + void setStartPos(const T& x, const T& y) noexcept; + + /** + Set start X and Y values according to @a pos. + */ + void setStartPos(const Point& pos) noexcept; + + /** + Set end X value to @a x. + */ + void setEndX(const T& x) noexcept; + + /** + Set end Y value to @a y. + */ + void setEndY(const T& y) noexcept; + + /** + Set end X and Y values to @a x and @a y respectively. + */ + void setEndPos(const T& x, const T& y) noexcept; + + /** + Set end X and Y values according to @a pos. + */ + void setEndPos(const Point& pos) noexcept; + + /** + Move this line by @a x and @a y values. + */ + void moveBy(const T& x, const T& y) noexcept; + + /** + Move this line by @a pos. + */ + void moveBy(const Point& pos) noexcept; + + /** + Draw this line using the current OpenGL state. + */ + void draw(); + + /** + Return true if line is null (start and end pos are equal). + */ + bool isNull() const noexcept; + + /** + Return true if line is not null (start and end pos are different). + */ + bool isNotNull() const noexcept; + + Line& operator=(const Line& line) noexcept; + bool operator==(const Line& line) const noexcept; + bool operator!=(const Line& line) const noexcept; + +private: + Point fPosStart, fPosEnd; +}; + +// ----------------------------------------------------------------------- + +/** + DGL Circle class. + + This class describes a circle, defined by position, size and a minimum of 3 segments. + + TODO: report if circle starts at top-left, bottom-right or center. + and size grows from which point? + */ +template +class Circle +{ +public: + /** + Constructor for a null circle. + */ + Circle() noexcept; + + /** + Constructor using custom X, Y and size values. + */ + Circle(const T& x, const T& y, const float size, const uint numSegments = 300); + + /** + Constructor using custom position and size values. + */ + Circle(const Point& pos, const float size, const uint numSegments = 300); + + /** + Constructor using another Circle class values. + */ + Circle(const Circle& cir) noexcept; + + /** + Get X value. + */ + const T& getX() const noexcept; + + /** + Get Y value. + */ + const T& getY() const noexcept; + + /** + Get position. + */ + const Point& getPos() const noexcept; + + /** + Set X value to @a x. + */ + void setX(const T& x) noexcept; + + /** + Set Y value to @a y. + */ + void setY(const T& y) noexcept; + + /** + Set X and Y values to @a x and @a y respectively. + */ + void setPos(const T& x, const T& y) noexcept; + + /** + Set X and Y values according to @a pos. + */ + void setPos(const Point& pos) noexcept; + + /** + Get size. + */ + float getSize() const noexcept; + + /** + Set size. + @note Must always be > 0 + */ + void setSize(const float size) noexcept; + + /** + Get the current number of line segments that make this circle. + */ + uint getNumSegments() const noexcept; + + /** + Set the number of line segments that will make this circle. + @note Must always be >= 3 + */ + void setNumSegments(const uint num); + + /** + Draw this circle using the current OpenGL state. + */ + void draw(); + + /** + Draw lines (outline of this circle) using the current OpenGL state. + */ + void drawOutline(); + + Circle& operator=(const Circle& cir) noexcept; + bool operator==(const Circle& cir) const noexcept; + bool operator!=(const Circle& cir) const noexcept; + +private: + Point fPos; + float fSize; + uint fNumSegments; + + // cached values + float fTheta, fCos, fSin; + + void _draw(const bool outline); +}; + +// ----------------------------------------------------------------------- + +/** + DGL Triangle class. + + This class describes a triangle, defined by 3 points. + */ +template +class Triangle +{ +public: + /** + Constructor for a null triangle. + */ + Triangle() noexcept; + + /** + Constructor using custom X and Y values. + */ + Triangle(const T& x1, const T& y1, const T& x2, const T& y2, const T& x3, const T& y3) noexcept; + + /** + Constructor using custom position values. + */ + Triangle(const Point& pos1, const Point& pos2, const Point& pos3) noexcept; + + /** + Constructor using another Triangle class values. + */ + Triangle(const Triangle& tri) noexcept; + + /** + Draw this triangle using the current OpenGL state. + */ + void draw(); + + /** + Draw lines (outline of this triangle) using the current OpenGL state. + */ + void drawOutline(); + + /** + Return true if triangle is null (all its points are equal). + An null triangle is also invalid. + */ + bool isNull() const noexcept; + + /** + Return true if triangle is not null (one its points is different from the others). + A non-null triangle is still invalid if two of its points are equal. + */ + bool isNotNull() const noexcept; + + /** + Return true if triangle is valid (all its points are different). + */ + bool isValid() const noexcept; + + /** + Return true if triangle is invalid (one or two of its points are equal). + An invalid triangle might not be null under some circumstances. + */ + bool isInvalid() const noexcept; + + Triangle& operator=(const Triangle& tri) noexcept; + bool operator==(const Triangle& tri) const noexcept; + bool operator!=(const Triangle& tri) const noexcept; + +private: + Point fPos1, fPos2, fPos3; + + void _draw(const bool outline); +}; + +// ----------------------------------------------------------------------- + +/** + DGL Rectangle class. + + This class describes a rectangle, defined by a starting point and a size. + */ +template +class Rectangle +{ +public: + /** + Constructor for a null rectangle. + */ + Rectangle() noexcept; + + /** + Constructor using custom X, Y, width and height values. + */ + Rectangle(const T& x, const T& y, const T& width, const T& height) noexcept; + + /** + Constructor using custom X, Y and size values. + */ + Rectangle(const T& x, const T& y, const Size& size) noexcept; + + /** + Constructor using custom pos, width and height values. + */ + Rectangle(const Point& pos, const T& width, const T& height) noexcept; + + /** + Constructor using custom position and size. + */ + Rectangle(const Point& pos, const Size& size) noexcept; + + /** + Constructor using another Rectangle class values. + */ + Rectangle(const Rectangle& rect) noexcept; + + /** + Get X value. + */ + const T& getX() const noexcept; + + /** + Get Y value. + */ + const T& getY() const noexcept; + + /** + Get width. + */ + const T& getWidth() const noexcept; + + /** + Get height. + */ + const T& getHeight() const noexcept; + + /** + Get position. + */ + const Point& getPos() const noexcept; + + /** + Get size. + */ + const Size& getSize() const noexcept; + + /** + Set X value as @a x. + */ + void setX(const T& x) noexcept; + + /** + Set Y value as @a y. + */ + void setY(const T& y) noexcept; + + /** + Set X and Y values as @a x and @a y respectively. + */ + void setPos(const T& x, const T& y) noexcept; + + /** + Set X and Y values according to @a pos. + */ + void setPos(const Point& pos) noexcept; + + /** + Move this rectangle by @a x and @a y values. + */ + void moveBy(const T& x, const T& y) noexcept; + + /** + Move this rectangle by @a pos. + */ + void moveBy(const Point& pos) noexcept; + + /** + Set width. + */ + void setWidth(const T& width) noexcept; + + /** + Set height. + */ + void setHeight(const T& height) noexcept; + + /** + Set size using @a width and @a height. + */ + void setSize(const T& width, const T& height) noexcept; + + /** + Set size. + */ + void setSize(const Size& size) noexcept; + + /** + Grow size by @a multiplier. + */ + void growBy(double multiplier) noexcept; + + /** + Shrink size by @a divider. + */ + void shrinkBy(double divider) noexcept; + + /** + Set rectangle using @a pos and @a size. + */ + void setRectangle(const Point& pos, const Size& size) noexcept; + + /** + Set rectangle. + */ + void setRectangle(const Rectangle& rect) noexcept; + + /** + Check if this rectangle contains the point defined by @a X and @a Y. + */ + bool contains(const T& x, const T& y) const noexcept; + + /** + Check if this rectangle contains the point @a pos. + */ + bool contains(const Point& pos) const noexcept; + + /** + Check if this rectangle contains X. + */ + bool containsX(const T& x) const noexcept; + + /** + Check if this rectangle contains Y. + */ + bool containsY(const T& y) const noexcept; + + /** + Draw this rectangle using the current OpenGL state. + */ + void draw(); + + /** + Draw lines (outline of this rectangle) using the current OpenGL state. + */ + void drawOutline(); + + Rectangle& operator=(const Rectangle& rect) noexcept; + Rectangle& operator*=(double m) noexcept; + Rectangle& operator/=(double d) noexcept; + bool operator==(const Rectangle& size) const noexcept; + bool operator!=(const Rectangle& size) const noexcept; + +private: + Point fPos; + Size fSize; + + void _draw(const bool outline); +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_GEOMETRY_HPP_INCLUDED diff --git a/dpf/dgl/Image.hpp b/dpf/dgl/Image.hpp new file mode 100644 index 0000000..4136f3f --- /dev/null +++ b/dpf/dgl/Image.hpp @@ -0,0 +1,147 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_IMAGE_HPP_INCLUDED +#define DGL_IMAGE_HPP_INCLUDED + +#include "Geometry.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +/** + Base DGL Image class. + + This is an Image class that handles raw image data in pixels. + You can init the image data on the contructor or later on by calling loadFromMemory(). + + To generate raw data useful for this class see the utils/png2rgba.py script. + Be careful when using a PNG without alpha channel, for those the format is 'GL_BGR' + instead of the default 'GL_BGRA'. + + Images are drawn on screen via 2D textures. + */ +class Image +{ +public: + /** + Constructor for a null Image. + */ + Image(); + + /** + Constructor using raw image data. + @note @a rawData must remain valid for the lifetime of this Image. + */ + Image(const char* const rawData, const uint width, const uint height, const GLenum format = GL_BGRA, const GLenum type = GL_UNSIGNED_BYTE); + + /** + Constructor using raw image data. + @note @a rawData must remain valid for the lifetime of this Image. + */ + Image(const char* const rawData, const Size& size, const GLenum format = GL_BGRA, const GLenum type = GL_UNSIGNED_BYTE); + + /** + Constructor using another image data. + */ + Image(const Image& image); + + /** + Destructor. + */ + ~Image(); + + /** + Load image data from memory. + @note @a rawData must remain valid for the lifetime of this Image. + */ + void loadFromMemory(const char* const rawData, const uint width, const uint height, const GLenum format = GL_BGRA, const GLenum type = GL_UNSIGNED_BYTE) noexcept; + + /** + Load image data from memory. + @note @a rawData must remain valid for the lifetime of this Image. + */ + void loadFromMemory(const char* const rawData, const Size& size, const GLenum format = GL_BGRA, const GLenum type = GL_UNSIGNED_BYTE) noexcept; + + /** + Check if this image is valid. + */ + bool isValid() const noexcept; + + /** + Get width. + */ + uint getWidth() const noexcept; + + /** + Get height. + */ + uint getHeight() const noexcept; + + /** + Get size. + */ + const Size& getSize() const noexcept; + + /** + Get the raw image data. + */ + const char* getRawData() const noexcept; + + /** + Get the image format. + */ + GLenum getFormat() const noexcept; + + /** + Get the image type. + */ + GLenum getType() const noexcept; + + /** + Draw this image at (0, 0) point. + */ + void draw(); + + /** + Draw this image at (x, y) point. + */ + void drawAt(const int x, const int y); + + /** + Draw this image at position @a pos. + */ + void drawAt(const Point& pos); + + Image& operator=(const Image& image) noexcept; + bool operator==(const Image& image) const noexcept; + bool operator!=(const Image& image) const noexcept; + +private: + const char* fRawData; + Size fSize; + GLenum fFormat; + GLenum fType; + GLuint fTextureId; + bool fIsReady; +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_IMAGE_HPP_INCLUDED diff --git a/dpf/dgl/ImageAboutWindow.hpp b/dpf/dgl/ImageAboutWindow.hpp new file mode 100644 index 0000000..9291c57 --- /dev/null +++ b/dpf/dgl/ImageAboutWindow.hpp @@ -0,0 +1,23 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_IMAGE_ABOUT_WINDOW_HPP_INCLUDED +#define DGL_IMAGE_ABOUT_WINDOW_HPP_INCLUDED + +#warning This is a deprecated file, please include ImageWidgets.hpp instead. +#include "ImageWidgets.hpp" + +#endif // DGL_IMAGE_ABOUT_WINDOW_HPP_INCLUDED diff --git a/dpf/dgl/ImageButton.hpp b/dpf/dgl/ImageButton.hpp new file mode 100644 index 0000000..5771f66 --- /dev/null +++ b/dpf/dgl/ImageButton.hpp @@ -0,0 +1,23 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_IMAGE_BUTTON_HPP_INCLUDED +#define DGL_IMAGE_BUTTON_HPP_INCLUDED + +#warning This is a deprecated file, please include ImageWidgets.hpp instead. +#include "ImageWidgets.hpp" + +#endif // DGL_IMAGE_BUTTON_HPP_INCLUDED diff --git a/dpf/dgl/ImageKnob.hpp b/dpf/dgl/ImageKnob.hpp new file mode 100644 index 0000000..64ccaa0 --- /dev/null +++ b/dpf/dgl/ImageKnob.hpp @@ -0,0 +1,23 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_IMAGE_KNOB_HPP_INCLUDED +#define DGL_IMAGE_KNOB_HPP_INCLUDED + +#warning This is a deprecated file, please include ImageWidgets.hpp instead. +#include "ImageWidgets.hpp" + +#endif // DGL_IMAGE_KNOB_HPP_INCLUDED diff --git a/dpf/dgl/ImageSlider.hpp b/dpf/dgl/ImageSlider.hpp new file mode 100644 index 0000000..2c16cb6 --- /dev/null +++ b/dpf/dgl/ImageSlider.hpp @@ -0,0 +1,23 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_IMAGE_SLIDER_HPP_INCLUDED +#define DGL_IMAGE_SLIDER_HPP_INCLUDED + +#warning This is a deprecated file, please include ImageWidgets.hpp instead. +#include "ImageWidgets.hpp" + +#endif // DGL_IMAGE_SLIDER_HPP_INCLUDED diff --git a/dpf/dgl/ImageSwitch.hpp b/dpf/dgl/ImageSwitch.hpp new file mode 100644 index 0000000..b8767d5 --- /dev/null +++ b/dpf/dgl/ImageSwitch.hpp @@ -0,0 +1,23 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_IMAGE_SWITCH_HPP_INCLUDED +#define DGL_IMAGE_SWITCH_HPP_INCLUDED + +#warning This is a deprecated file, please include ImageWidgets.hpp instead. +#include "ImageWidgets.hpp" + +#endif // DGL_IMAGE_SWITCH_HPP_INCLUDED diff --git a/dpf/dgl/ImageWidgets.hpp b/dpf/dgl/ImageWidgets.hpp new file mode 100644 index 0000000..c3e0c09 --- /dev/null +++ b/dpf/dgl/ImageWidgets.hpp @@ -0,0 +1,271 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_IMAGE_WIDGETS_HPP_INCLUDED +#define DGL_IMAGE_WIDGETS_HPP_INCLUDED + +#include "Image.hpp" +#include "Widget.hpp" +#include "Window.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +class ImageAboutWindow : public Window, + public Widget +{ +public: + explicit ImageAboutWindow(Window& parent, const Image& image = Image()); + explicit ImageAboutWindow(Widget* widget, const Image& image = Image()); + + void setImage(const Image& image); + +protected: + void onDisplay() override; + bool onKeyboard(const KeyboardEvent&) override; + bool onMouse(const MouseEvent&) override; + void onReshape(uint width, uint height) override; + +private: + Image fImgBackground; + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ImageAboutWindow) +}; + +// ----------------------------------------------------------------------- + +class ImageButton : public Widget +{ +public: + class Callback + { + public: + virtual ~Callback() {} + virtual void imageButtonClicked(ImageButton* imageButton, int button) = 0; + }; + + explicit ImageButton(Window& parent, const Image& image); + explicit ImageButton(Window& parent, const Image& imageNormal, const Image& imageDown); + explicit ImageButton(Window& parent, const Image& imageNormal, const Image& imageHover, const Image& imageDown); + + explicit ImageButton(Widget* widget, const Image& image); + explicit ImageButton(Widget* widget, const Image& imageNormal, const Image& imageDown); + explicit ImageButton(Widget* widget, const Image& imageNormal, const Image& imageHover, const Image& imageDown); + + ~ImageButton() override; + + void setCallback(Callback* callback) noexcept; + +protected: + void onDisplay() override; + bool onMouse(const MouseEvent&) override; + bool onMotion(const MotionEvent&) override; + +private: + struct PrivateData; + PrivateData* const pData; + + DISTRHO_LEAK_DETECTOR(ImageButton) +}; + +// ----------------------------------------------------------------------- + +class ImageKnob : public Widget +{ +public: + enum Orientation { + Horizontal, + Vertical + }; + + class Callback + { + public: + virtual ~Callback() {} + virtual void imageKnobDragStarted(ImageKnob* imageKnob) = 0; + virtual void imageKnobDragFinished(ImageKnob* imageKnob) = 0; + virtual void imageKnobValueChanged(ImageKnob* imageKnob, float value) = 0; + }; + + explicit ImageKnob(Window& parent, const Image& image, Orientation orientation = Vertical) noexcept; + explicit ImageKnob(Widget* widget, const Image& image, Orientation orientation = Vertical) noexcept; + explicit ImageKnob(const ImageKnob& imageKnob); + ImageKnob& operator=(const ImageKnob& imageKnob); + ~ImageKnob() override; + + float getValue() const noexcept; + + void setDefault(float def) noexcept; + void setRange(float min, float max) noexcept; + void setStep(float step) noexcept; + void setValue(float value, bool sendCallback = false) noexcept; + void setUsingLogScale(bool yesNo) noexcept; + + void setCallback(Callback* callback) noexcept; + void setOrientation(Orientation orientation) noexcept; + void setRotationAngle(int angle); + + void setImageLayerCount(uint count) noexcept; + +protected: + void onDisplay() override; + bool onMouse(const MouseEvent&) override; + bool onMotion(const MotionEvent&) override; + bool onScroll(const ScrollEvent&) override; + +private: + Image fImage; + float fMinimum; + float fMaximum; + float fStep; + float fValue; + float fValueDef; + float fValueTmp; + bool fUsingDefault; + bool fUsingLog; + Orientation fOrientation; + + int fRotationAngle; + bool fDragging; + int fLastX; + int fLastY; + + Callback* fCallback; + + bool fIsImgVertical; + uint fImgLayerWidth; + uint fImgLayerHeight; + uint fImgLayerCount; + bool fIsReady; + GLuint fTextureId; + + float _logscale(float value) const; + float _invlogscale(float value) const; + + DISTRHO_LEAK_DETECTOR(ImageKnob) +}; + +// ----------------------------------------------------------------------- + +// note set range and step before setting the value + +class ImageSlider : public Widget +{ +public: + class Callback + { + public: + virtual ~Callback() {} + virtual void imageSliderDragStarted(ImageSlider* imageSlider) = 0; + virtual void imageSliderDragFinished(ImageSlider* imageSlider) = 0; + virtual void imageSliderValueChanged(ImageSlider* imageSlider, float value) = 0; + }; + + explicit ImageSlider(Window& parent, const Image& image) noexcept; + explicit ImageSlider(Widget* widget, const Image& image) noexcept; + + float getValue() const noexcept; + void setValue(float value, bool sendCallback = false) noexcept; + + void setStartPos(const Point& startPos) noexcept; + void setStartPos(int x, int y) noexcept; + void setEndPos(const Point& endPos) noexcept; + void setEndPos(int x, int y) noexcept; + + void setInverted(bool inverted) noexcept; + void setRange(float min, float max) noexcept; + void setStep(float step) noexcept; + + void setCallback(Callback* callback) noexcept; + +protected: + void onDisplay() override; + bool onMouse(const MouseEvent&) override; + bool onMotion(const MotionEvent&) override; + +private: + Image fImage; + float fMinimum; + float fMaximum; + float fStep; + float fValue; + float fValueTmp; + + bool fDragging; + bool fInverted; + bool fValueIsSet; + int fStartedX; + int fStartedY; + + Callback* fCallback; + + Point fStartPos; + Point fEndPos; + Rectangle fSliderArea; + + void _recheckArea() noexcept; + + // these should not be used + void setAbsoluteX(int) const noexcept {} + void setAbsoluteY(int) const noexcept {} + void setAbsolutePos(int, int) const noexcept {} + void setAbsolutePos(const Point&) const noexcept {} + + DISTRHO_LEAK_DETECTOR(ImageSlider) +}; + +// ----------------------------------------------------------------------- + +class ImageSwitch : public Widget +{ +public: + class Callback + { + public: + virtual ~Callback() {} + virtual void imageSwitchClicked(ImageSwitch* imageButton, bool down) = 0; + }; + + explicit ImageSwitch(Window& parent, const Image& imageNormal, const Image& imageDown) noexcept; + explicit ImageSwitch(Widget* widget, const Image& imageNormal, const Image& imageDown) noexcept; + explicit ImageSwitch(const ImageSwitch& imageSwitch) noexcept; + ImageSwitch& operator=(const ImageSwitch& imageSwitch) noexcept; + + bool isDown() const noexcept; + void setDown(bool down) noexcept; + + void setCallback(Callback* callback) noexcept; + +protected: + void onDisplay() override; + bool onMouse(const MouseEvent&) override; + +private: + Image fImageNormal; + Image fImageDown; + bool fIsDown; + + Callback* fCallback; + + DISTRHO_LEAK_DETECTOR(ImageSwitch) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_IMAGE_WIDGETS_HPP_INCLUDED diff --git a/dpf/dgl/Makefile b/dpf/dgl/Makefile new file mode 100644 index 0000000..feedd05 --- /dev/null +++ b/dpf/dgl/Makefile @@ -0,0 +1,81 @@ +#!/usr/bin/make -f +# Makefile for dgl # +# ---------------- # +# Created by falkTX +# + +include Makefile.mk + +# -------------------------------------------------------------- + +BUILD_C_FLAGS += $(DGL_FLAGS) -I. -Isrc +BUILD_CXX_FLAGS += $(DGL_FLAGS) -I. -Isrc +LINK_FLAGS += $(DGL_LIBS) + +# -------------------------------------------------------------- + +OBJS = \ + src/Application.cpp.o \ + src/Color.cpp.o \ + src/Geometry.cpp.o \ + src/Image.cpp.o \ + src/ImageWidgets.cpp.o \ + src/NanoVG.cpp.o \ + src/NanoWidgets.cpp.o \ + src/Widget.cpp.o + +ifeq ($(MACOS),true) +OBJS += src/Window.mm.o +else +OBJS += src/Window.cpp.o +endif + +TARGET = ../libdgl.a + +# -------------------------------------------------------------- + +all: $(TARGET) + +# -------------------------------------------------------------- + +../libdgl.a: $(OBJS) + rm -f $@ + $(AR) crs $@ $^ + +../libdgl.dll: $(OBJS) + # -Wl,--output-def,$@.def,--out-implib,$@.a + $(CXX) $^ -shared $(LINK_FLAGS) -o $@ + +../libdgl.dylib: $(OBJS) + $(CXX) $^ -dynamiclib $(LINK_FLAGS) -o $@ + +../libdgl.so: $(OBJS) + $(CXX) $^ -shared $(LINK_FLAGS) -o $@ + +# -------------------------------------------------------------- + +%.c.o: %.c + $(CC) $< $(BUILD_C_FLAGS) -c -o $@ + +%.cpp.o: %.cpp + $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ + +src/Window.cpp.o: src/Window.cpp src/pugl/* + $(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ + +src/Window.mm.o: src/Window.cpp src/pugl/* + $(CXX) $< $(BUILD_CXX_FLAGS) -ObjC++ -c -o $@ + +# -------------------------------------------------------------- + +clean: + rm -f src/*.d src/*.o ../libdgl.* + +debug: + $(MAKE) DEBUG=true + +# -------------------------------------------------------------- + +-include $(OBJS:%.o=%.d) + +# -------------------------------------------------------------- diff --git a/dpf/dgl/Makefile.mk b/dpf/dgl/Makefile.mk new file mode 100644 index 0000000..505bb8c --- /dev/null +++ b/dpf/dgl/Makefile.mk @@ -0,0 +1,132 @@ +#!/usr/bin/make -f +# Makefile for dgl # +# ---------------- # +# Created by falkTX +# + +AR ?= ar +CC ?= gcc +CXX ?= g++ + +# -------------------------------------------------------------- +# Fallback to Linux if no other OS defined + +ifneq ($(HAIKU),true) +ifneq ($(MACOS),true) +ifneq ($(WIN32),true) +LINUX=true +endif +endif +endif + +# -------------------------------------------------------------- +# Set build and link flags + +BASE_FLAGS = -Wall -Wextra -pipe -MD -MP +BASE_OPTS = -O2 -ffast-math -mtune=generic -msse -msse2 -fdata-sections -ffunction-sections + +ifneq ($(MACOS),true) +# MacOS doesn't support this +BASE_OPTS += -mfpmath=sse +endif + +ifeq ($(MACOS),true) +# MacOS linker flags +LINK_OPTS = -fdata-sections -ffunction-sections -Wl,-dead_strip -Wl,-dead_strip_dylibs +else +# Common linker flags +LINK_OPTS = -fdata-sections -ffunction-sections -Wl,--gc-sections -Wl,-O1 -Wl,--as-needed -Wl,--strip-all +endif + +ifeq ($(RASPPI),true) +# Raspberry-Pi optimization flags +BASE_OPTS = -O2 -ffast-math -march=armv6 -mfpu=vfp -mfloat-abi=hard +LINK_OPTS = -Wl,-O1 -Wl,--as-needed -Wl,--strip-all +endif + +ifeq ($(PANDORA),true) +# OpenPandora optimization flags +BASE_OPTS = -O2 -ffast-math -march=armv7-a -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp +LINK_OPTS = -Wl,-O1 -Wl,--as-needed -Wl,--strip-all +endif + +ifneq ($(NOOPT),true) +# No optimization flags +BASE_OPTS = -O2 -ffast-math -fdata-sections -ffunction-sections +endif + +ifneq ($(WIN32),true) +# not needed for Windows +BASE_FLAGS += -fPIC -DPIC +endif + +ifeq ($(DEBUG),true) +BASE_FLAGS += -DDEBUG -O0 -g +LINK_OPTS = +else +BASE_FLAGS += -DNDEBUG $(BASE_OPTS) -fvisibility=hidden +CXXFLAGS += -fvisibility-inlines-hidden +endif + +BUILD_C_FLAGS = $(BASE_FLAGS) -std=c99 -std=gnu99 $(CFLAGS) +BUILD_CXX_FLAGS = $(BASE_FLAGS) -std=c++0x -std=gnu++0x $(CXXFLAGS) $(CPPFLAGS) +LINK_FLAGS = $(LINK_OPTS) -Wl,--no-undefined $(LDFLAGS) + +ifeq ($(MACOS),true) +# No C++11 support +BUILD_CXX_FLAGS = $(BASE_FLAGS) $(CXXFLAGS) $(CPPFLAGS) +LINK_FLAGS = $(LINK_OPTS) $(LDFLAGS) +endif + +# -------------------------------------------------------------- +# Strict test build + +ifeq ($(TESTBUILD),true) +BASE_FLAGS += -Werror -Wcast-qual -Wconversion -Wformat -Wformat-security -Wredundant-decls -Wshadow -Wstrict-overflow -fstrict-overflow -Wundef -Wwrite-strings +BASE_FLAGS += -Wpointer-arith -Wabi -Winit-self -Wuninitialized -Wstrict-overflow=5 +# BASE_FLAGS += -Wfloat-equal +ifeq ($(CC),clang) +BASE_FLAGS += -Wdocumentation -Wdocumentation-unknown-command +BASE_FLAGS += -Weverything -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-padded -Wno-exit-time-destructors -Wno-float-equal +else +BASE_FLAGS += -Wcast-align -Wunsafe-loop-optimizations +endif +ifneq ($(MACOS),true) +BASE_FLAGS += -Wmissing-declarations -Wsign-conversion +ifneq ($(CC),clang) +BASE_FLAGS += -Wlogical-op +endif +endif +CFLAGS += -Wold-style-definition -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes +CXXFLAGS += -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual +endif + +# -------------------------------------------------------------- +# Check for required libs + +ifeq ($(LINUX),true) +ifneq ($(shell pkg-config --exists gl && echo true),true) +$(error OpenGL missing, cannot continue) +endif +ifneq ($(shell pkg-config --exists x11 && echo true),true) +$(error X11 missing, cannot continue) +endif +endif + +# -------------------------------------------------------------- +# Set libs stuff + +ifeq ($(LINUX),true) +DGL_FLAGS = $(shell pkg-config --cflags gl x11) +DGL_LIBS = $(shell pkg-config --libs gl x11) +endif + +ifeq ($(MACOS),true) +DGL_LIBS = -framework OpenGL -framework Cocoa +endif + +ifeq ($(WIN32),true) +DGL_LIBS = -lopengl32 -lgdi32 +endif + +# -------------------------------------------------------------- diff --git a/dpf/dgl/NanoVG.hpp b/dpf/dgl/NanoVG.hpp new file mode 100644 index 0000000..18ec1de --- /dev/null +++ b/dpf/dgl/NanoVG.hpp @@ -0,0 +1,917 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_NANO_WIDGET_HPP_INCLUDED +#define DGL_NANO_WIDGET_HPP_INCLUDED + +#include "Color.hpp" +#include "Widget.hpp" + +struct NVGcontext; +struct NVGpaint; + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- +// Forward class names + +class NanoVG; + +// ----------------------------------------------------------------------- +// NanoImage + +/** + NanoVG Image class. + + This implements NanoVG images as a C++ class where deletion is handled automatically. + Images need to be created within a NanoVG or NanoWidget class. + */ +class NanoImage +{ +private: + struct Handle { + NVGcontext* context; + int imageId; + + Handle() noexcept + : context(nullptr), + imageId(0) {} + + Handle(NVGcontext* c, int id) noexcept + : context(c), + imageId(id) {} + }; + +public: + /** + Constructor for an invalid/null image. + */ + NanoImage(); + + /** + Constructor. + */ + NanoImage(const Handle& handle); + + /** + Destructor. + */ + ~NanoImage(); + + /** + Create a new image without recreating the C++ class. + */ + NanoImage& operator=(const Handle& handle); + + /** + Wherever this image is valid. + */ + bool isValid() const noexcept; + + /** + Get size. + */ + Size getSize() const noexcept; + + /** + Get the OpenGL texture handle. + */ + GLuint getTextureHandle() const; + +private: + Handle fHandle; + Size fSize; + friend class NanoVG; + + /** @internal */ + void _updateSize(); + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NanoImage) +}; + +// ----------------------------------------------------------------------- +// NanoVG + +/** + NanoVG class. + + This class exposes the NanoVG drawing API. + All calls should be wrapped in beginFrame() and endFrame(). + + @section State Handling + NanoVG contains state which represents how paths will be rendered. + The state contains transform, fill and stroke styles, text and font styles, and scissor clipping. + + @section Render styles + Fill and stroke render style can be either a solid color or a paint which is a gradient or a pattern. + Solid color is simply defined as a color value, different kinds of paints can be created + using linearGradient(), boxGradient(), radialGradient() and imagePattern(). + + Current render style can be saved and restored using save() and restore(). + + @section Transforms + The paths, gradients, patterns and scissor region are transformed by an transformation + matrix at the time when they are passed to the API. + The current transformation matrix is a affine matrix: + [sx kx tx] + [ky sy ty] + [ 0 0 1] + Where: sx,sy define scaling, kx,ky skewing, and tx,ty translation. + The last row is assumed to be 0,0,1 and is not stored. + + Apart from resetTransform(), each transformation function first creates + specific transformation matrix and pre-multiplies the current transformation by it. + + Current coordinate system (transformation) can be saved and restored using save() and restore(). + + @section Images + NanoVG allows you to load jpg, png, psd, tga, pic and gif files to be used for rendering. + In addition you can upload your own image. The image loading is provided by stb_image. + + @section Paints + NanoVG supports four types of paints: linear gradient, box gradient, radial gradient and image pattern. + These can be used as paints for strokes and fills. + + @section Scissoring + Scissoring allows you to clip the rendering into a rectangle. This is useful for various + user interface cases like rendering a text edit or a timeline. + + @section Paths + Drawing a new shape starts with beginPath(), it clears all the currently defined paths. + Then you define one or more paths and sub-paths which describe the shape. The are functions + to draw common shapes like rectangles and circles, and lower level step-by-step functions, + which allow to define a path curve by curve. + + NanoVG uses even-odd fill rule to draw the shapes. Solid shapes should have counter clockwise + winding and holes should have counter clockwise order. To specify winding of a path you can + call pathWinding(). This is useful especially for the common shapes, which are drawn CCW. + + Finally you can fill the path using current fill style by calling fill(), and stroke it + with current stroke style by calling stroke(). + + The curve segments and sub-paths are transformed by the current transform. + + @section Text + NanoVG allows you to load .ttf files and use the font to render text. + + The appearance of the text can be defined by setting the current text style + and by specifying the fill color. Common text and font settings such as + font size, letter spacing and text align are supported. Font blur allows you + to create simple text effects such as drop shadows. + + At render time the font face can be set based on the font handles or name. + + Font measure functions return values in local space, the calculations are + carried in the same resolution as the final rendering. This is done because + the text glyph positions are snapped to the nearest pixels sharp rendering. + + The local space means that values are not rotated or scale as per the current + transformation. For example if you set font size to 12, which would mean that + line height is 16, then regardless of the current scaling and rotation, the + returned line height is always 16. Some measures may vary because of the scaling + since aforementioned pixel snapping. + + While this may sound a little odd, the setup allows you to always render the + same way regardless of scaling. i.e. following works regardless of scaling: + + @code + const char* txt = "Text me up."; + textBounds(vg, x,y, txt, NULL, bounds); + beginPath(vg); + roundedRect(vg, bounds[0], bounds[1], bounds[2]-bounds[0], bounds[3]-bounds[1]); + fill(vg); + @endcode + + Note: currently only solid color fill is supported for text. + */ +class NanoVG +{ +public: + enum CreateFlags { + /** + Flag indicating if geometry based anti-aliasing is used (may not be needed when using MSAA). + */ + CREATE_ANTIALIAS = 1 << 0, + + /** + Flag indicating if strokes should be drawn using stencil buffer. The rendering will be a little + slower, but path overlaps (i.e. self-intersecting or sharp turns) will be drawn just once. + */ + CREATE_STENCIL_STROKES = 1 << 1, + + /** + Flag indicating that additional debug checks are done. + */ + CREATE_DEBUG = 1 << 2, + }; + + enum ImageFlags { + IMAGE_GENERATE_MIPMAPS = 1 << 0, // Generate mipmaps during creation of the image. + IMAGE_REPEAT_X = 1 << 1, // Repeat image in X direction. + IMAGE_REPEAT_Y = 1 << 2, // Repeat image in Y direction. + IMAGE_FLIP_Y = 1 << 3, // Flips (inverses) image in Y direction when rendered. + IMAGE_PREMULTIPLIED = 1 << 4 // Image data has premultiplied alpha. + }; + + enum Align { + // Horizontal align + ALIGN_LEFT = 1 << 0, // Align horizontally to left (default). + ALIGN_CENTER = 1 << 1, // Align horizontally to center. + ALIGN_RIGHT = 1 << 2, // Align horizontally to right. + // Vertical align + ALIGN_TOP = 1 << 3, // Align vertically to top. + ALIGN_MIDDLE = 1 << 4, // Align vertically to middle. + ALIGN_BOTTOM = 1 << 5, // Align vertically to bottom. + ALIGN_BASELINE = 1 << 6 // Align vertically to baseline (default). + }; + + enum LineCap { + BUTT, + ROUND, + SQUARE, + BEVEL, + MITER + }; + + enum Solidity { + SOLID = 1, // CCW + HOLE = 2 // CW + }; + + enum Winding { + CCW = 1, // Winding for solid shapes + CW = 2 // Winding for holes + }; + + struct Paint { + float xform[6]; + float extent[2]; + float radius; + float feather; + Color innerColor; + Color outerColor; + int imageId; + + Paint() noexcept; + + /** + @internal + */ + Paint(const NVGpaint&) noexcept; + operator NVGpaint() const noexcept; + }; + + struct GlyphPosition { + const char* str; // Position of the glyph in the input string. + float x; // The x-coordinate of the logical glyph position. + float minx, maxx; // The bounds of the glyph shape. + }; + + struct TextRow { + const char* start; // Pointer to the input text where the row starts. + const char* end; // Pointer to the input text where the row ends (one past the last character). + const char* next; // Pointer to the beginning of the next row. + float width; // Logical width of the row. + float minx, maxx; // Actual bounds of the row. Logical with and bounds can differ because of kerning and some parts over extending. + }; + + typedef int FontId; + + /** + Constructor. + @see CreateFlags + */ + NanoVG(int flags = CREATE_ANTIALIAS); + + /** + Constructor reusing a NanoVG context, used for subwidgets. + */ + NanoVG(NanoWidget* groupWidget); + + /** + Destructor. + */ + virtual ~NanoVG(); + + /** + Get the NanoVG context. + You should not need this under normal circumstances. + */ + NVGcontext* getContext() const noexcept + { + return fContext; + } + + /** + Begin drawing a new frame. + */ + void beginFrame(const uint width, const uint height, const float scaleFactor = 1.0f); + + /** + Begin drawing a new frame inside a widget. + */ + void beginFrame(Widget* const widget); + + /** + Cancels drawing the current frame. + */ + void cancelFrame(); + + /** + Ends drawing flushing remaining render state. + */ + void endFrame(); + + /* -------------------------------------------------------------------- + * State Handling */ + + /** + Pushes and saves the current render state into a state stack. + A matching restore() must be used to restore the state. + */ + void save(); + + /** + Pops and restores current render state. + */ + void restore(); + + /** + Resets current render state to default values. Does not affect the render state stack. + */ + void reset(); + + /* -------------------------------------------------------------------- + * Render styles */ + + /** + Sets current stroke style to a solid color. + */ + void strokeColor(const Color& color); + + /** + Sets current stroke style to a solid color, made from red, green, blue and alpha numeric values. + Values must be in [0..255] range. + */ + void strokeColor(const int red, const int green, const int blue, const int alpha = 255); + + /** + Sets current stroke style to a solid color, made from red, green, blue and alpha numeric values. + Values must in [0..1] range. + */ + void strokeColor(const float red, const float green, const float blue, const float alpha = 1.0f); + + /** + Sets current stroke style to a paint, which can be a one of the gradients or a pattern. + */ + void strokePaint(const Paint& paint); + + /** + Sets current fill style to a solid color. + */ + void fillColor(const Color& color); + + /** + Sets current fill style to a solid color, made from red, green, blue and alpha numeric values. + Values must be in [0..255] range. + */ + void fillColor(const int red, const int green, const int blue, const int alpha = 255); + + /** + Sets current fill style to a solid color, made from red, green, blue and alpha numeric values. + Values must in [0..1] range. + */ + void fillColor(const float red, const float green, const float blue, const float alpha = 1.0f); + + /** + Sets current fill style to a paint, which can be a one of the gradients or a pattern. + */ + void fillPaint(const Paint& paint); + + /** + Sets the miter limit of the stroke style. + Miter limit controls when a sharp corner is beveled. + */ + void miterLimit(float limit); + + /** + Sets the stroke width of the stroke style. + */ + void strokeWidth(float size); + + /** + Sets how the end of the line (cap) is drawn, + Can be one of: BUTT, ROUND, SQUARE. + */ + void lineCap(LineCap cap = BUTT); + + /** + Sets how sharp path corners are drawn. + Can be one of MITER, ROUND, BEVEL. + */ + void lineJoin(LineCap join = MITER); + + /** + Sets the transparency applied to all rendered shapes. + Already transparent paths will get proportionally more transparent as well. + */ + void globalAlpha(float alpha); + + /* -------------------------------------------------------------------- + * Transforms */ + + /** + Resets current transform to a identity matrix. + */ + void resetTransform(); + + /** + Pre-multiplies current coordinate system by specified matrix. + The parameters are interpreted as matrix as follows: + [a c e] + [b d f] + [0 0 1] + */ + void transform(float a, float b, float c, float d, float e, float f); + + /** + Translates current coordinate system. + */ + void translate(float x, float y); + + /** + Rotates current coordinate system. Angle is specified in radians. + */ + void rotate(float angle); + + /** + Skews the current coordinate system along X axis. Angle is specified in radians. + */ + void skewX(float angle); + + /** + Skews the current coordinate system along Y axis. Angle is specified in radians. + */ + void skewY(float angle); + + /** + Scales the current coordinate system. + */ + void scale(float x, float y); + + /** + Stores the top part (a-f) of the current transformation matrix in to the specified buffer. + [a c e] + [b d f] + [0 0 1] + */ + void currentTransform(float xform[6]); + + /** + The following functions can be used to make calculations on 2x3 transformation matrices. + A 2x3 matrix is represented as float[6]. */ + + /** + Sets the transform to identity matrix. + */ + static void transformIdentity(float dst[6]); + + /** + Sets the transform to translation matrix + */ + static void transformTranslate(float dst[6], float tx, float ty); + + /** + Sets the transform to scale matrix. + */ + static void transformScale(float dst[6], float sx, float sy); + + /** + Sets the transform to rotate matrix. Angle is specified in radians. + */ + static void transformRotate(float dst[6], float a); + + /** + Sets the transform to skew-x matrix. Angle is specified in radians. + */ + static void transformSkewX(float dst[6], float a); + + /** + Sets the transform to skew-y matrix. Angle is specified in radians. + */ + static void transformSkewY(float dst[6], float a); + + /** + Sets the transform to the result of multiplication of two transforms, of A = A*B. + */ + static void transformMultiply(float dst[6], const float src[6]); + + /** + Sets the transform to the result of multiplication of two transforms, of A = B*A. + */ + static void transformPremultiply(float dst[6], const float src[6]); + + /** + Sets the destination to inverse of specified transform. + Returns 1 if the inverse could be calculated, else 0. + */ + static int transformInverse(float dst[6], const float src[6]); + + /** + Transform a point by given transform. + */ + static void transformPoint(float& dstx, float& dsty, const float xform[6], float srcx, float srcy); + + /** + Convert degrees to radians. + */ + static float degToRad(float deg); + + /** + Convert radians to degrees. + */ + static float radToDeg(float rad); + + /* -------------------------------------------------------------------- + * Images */ + + /** + Creates image by loading it from the disk from specified file name. + */ + NanoImage::Handle createImageFromFile(const char* filename, ImageFlags imageFlags); + + /** + Creates image by loading it from the disk from specified file name. + Overloaded function for convenience. + @see ImageFlags + */ + NanoImage::Handle createImageFromFile(const char* filename, int imageFlags); + + /** + Creates image by loading it from the specified chunk of memory. + */ + NanoImage::Handle createImageFromMemory(uchar* data, uint dataSize, ImageFlags imageFlags); + + /** + Creates image by loading it from the specified chunk of memory. + Overloaded function for convenience. + @see ImageFlags + */ + NanoImage::Handle createImageFromMemory(uchar* data, uint dataSize, int imageFlags); + + /** + Creates image from specified image data. + */ + NanoImage::Handle createImageFromRGBA(uint w, uint h, const uchar* data, ImageFlags imageFlags); + + /** + Creates image from specified image data. + Overloaded function for convenience. + @see ImageFlags + */ + NanoImage::Handle createImageFromRGBA(uint w, uint h, const uchar* data, int imageFlags); + + /** + Creates image from an OpenGL texture handle. + */ + NanoImage::Handle createImageFromTextureHandle(GLuint textureId, uint w, uint h, ImageFlags imageFlags, bool deleteTexture = false); + + /** + Creates image from an OpenGL texture handle. + Overloaded function for convenience. + @see ImageFlags + */ + NanoImage::Handle createImageFromTextureHandle(GLuint textureId, uint w, uint h, int imageFlags, bool deleteTexture = false); + + /* -------------------------------------------------------------------- + * Paints */ + + /** + Creates and returns a linear gradient. Parameters (sx,sy)-(ex,ey) specify the start and end coordinates + of the linear gradient, icol specifies the start color and ocol the end color. + The gradient is transformed by the current transform when it is passed to fillPaint() or strokePaint(). + */ + Paint linearGradient(float sx, float sy, float ex, float ey, const Color& icol, const Color& ocol); + + /** + Creates and returns a box gradient. Box gradient is a feathered rounded rectangle, it is useful for rendering + drop shadows or highlights for boxes. Parameters (x,y) define the top-left corner of the rectangle, + (w,h) define the size of the rectangle, r defines the corner radius, and f feather. Feather defines how blurry + the border of the rectangle is. Parameter icol specifies the inner color and ocol the outer color of the gradient. + The gradient is transformed by the current transform when it is passed to fillPaint() or strokePaint(). + */ + Paint boxGradient(float x, float y, float w, float h, float r, float f, const Color& icol, const Color& ocol); + + /** + Creates and returns a radial gradient. Parameters (cx,cy) specify the center, inr and outr specify + the inner and outer radius of the gradient, icol specifies the start color and ocol the end color. + The gradient is transformed by the current transform when it is passed to fillPaint() or strokePaint(). + */ + Paint radialGradient(float cx, float cy, float inr, float outr, const Color& icol, const Color& ocol); + + /** + Creates and returns an image pattern. Parameters (ox,oy) specify the left-top location of the image pattern, + (ex,ey) the size of one image, angle rotation around the top-left corner, image is handle to the image to render. + The gradient is transformed by the current transform when it is passed to fillPaint() or strokePaint(). + */ + Paint imagePattern(float ox, float oy, float ex, float ey, float angle, const NanoImage& image, float alpha); + + /* -------------------------------------------------------------------- + * Scissoring */ + + /** + Sets the current scissor rectangle. + The scissor rectangle is transformed by the current transform. + */ + void scissor(float x, float y, float w, float h); + + /** + Intersects current scissor rectangle with the specified rectangle. + The scissor rectangle is transformed by the current transform. + Note: in case the rotation of previous scissor rect differs from + the current one, the intersection will be done between the specified + rectangle and the previous scissor rectangle transformed in the current + transform space. The resulting shape is always rectangle. + */ + void intersectScissor(float x, float y, float w, float h); + + /** + Reset and disables scissoring. + */ + void resetScissor(); + + /* -------------------------------------------------------------------- + * Paths */ + + /** + Clears the current path and sub-paths. + */ + void beginPath(); + + /** + Starts new sub-path with specified point as first point. + */ + void moveTo(float x, float y); + + /** + Adds line segment from the last point in the path to the specified point. + */ + void lineTo(float x, float y); + + /** + Adds cubic bezier segment from last point in the path via two control points to the specified point. + */ + void bezierTo(float c1x, float c1y, float c2x, float c2y, float x, float y); + + /** + Adds quadratic bezier segment from last point in the path via a control point to the specified point. + */ + void quadTo(float cx, float cy, float x, float y); + + /** + Adds an arc segment at the corner defined by the last path point, and two specified points. + */ + void arcTo(float x1, float y1, float x2, float y2, float radius); + + /** + Closes current sub-path with a line segment. + */ + void closePath(); + + /** + Sets the current sub-path winding. + */ + void pathWinding(Winding dir); + + /** + Creates new circle arc shaped sub-path. The arc center is at cx,cy, the arc radius is r, + and the arc is drawn from angle a0 to a1, and swept in direction dir (NVG_CCW or NVG_CW). + Angles are specified in radians. + */ + void arc(float cx, float cy, float r, float a0, float a1, Winding dir); + + /** + Creates new rectangle shaped sub-path. + */ + void rect(float x, float y, float w, float h); + + /** + Creates new rounded rectangle shaped sub-path. + */ + void roundedRect(float x, float y, float w, float h, float r); + + /** + Creates new ellipse shaped sub-path. + */ + void ellipse(float cx, float cy, float rx, float ry); + + /** + Creates new circle shaped sub-path. + */ + void circle(float cx, float cy, float r); + + /** + Fills the current path with current fill style. + */ + void fill(); + + /** + Fills the current path with current stroke style. + */ + void stroke(); + + /* -------------------------------------------------------------------- + * Text */ + + /** + Creates font by loading it from the disk from specified file name. + Returns handle to the font. + */ + FontId createFontFromFile(const char* name, const char* filename); + + /** + Creates font by loading it from the specified memory chunk. + Returns handle to the font. + */ + FontId createFontFromMemory(const char* name, const uchar* data, uint dataSize, bool freeData); + + /** + Finds a loaded font of specified name, and returns handle to it, or -1 if the font is not found. + */ + FontId findFont(const char* name); + + /** + Sets the font size of current text style. + */ + void fontSize(float size); + + /** + Sets the blur of current text style. + */ + void fontBlur(float blur); + + /** + Sets the letter spacing of current text style. + */ + void textLetterSpacing(float spacing); + + /** + Sets the proportional line height of current text style. The line height is specified as multiple of font size. + */ + void textLineHeight(float lineHeight); + + /** + Sets the text align of current text style. + */ + void textAlign(Align align); + + /** + Sets the text align of current text style. + Overloaded function for convenience. + @see Align + */ + void textAlign(int align); + + /** + Sets the font face based on specified id of current text style. + */ + void fontFaceId(FontId font); + + /** + Sets the font face based on specified name of current text style. + */ + void fontFace(const char* font); + + /** + Draws text string at specified location. If end is specified only the sub-string up to the end is drawn. + */ + float text(float x, float y, const char* string, const char* end); + + /** + Draws multi-line text string at specified location wrapped at the specified width. If end is specified only the sub-string up to the end is drawn. + White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. + Words longer than the max width are slit at nearest character (i.e. no hyphenation). + */ + void textBox(float x, float y, float breakRowWidth, const char* string, const char* end); + + /** + Measures the specified text string. The bounds value are [xmin,ymin, xmax,ymax]. + Returns the horizontal advance of the measured text (i.e. where the next character should drawn). + Measured values are returned in local coordinate space. + */ + float textBounds(float x, float y, const char* string, const char* end, Rectangle& bounds); + + /** + Measures the specified multi-text string. Parameter bounds should be a pointer to float[4], + if the bounding box of the text should be returned. The bounds value are [xmin,ymin, xmax,ymax] + Measured values are returned in local coordinate space. + */ + void textBoxBounds(float x, float y, float breakRowWidth, const char* string, const char* end, float bounds[4]); + + /** + Calculates the glyph x positions of the specified text. If end is specified only the sub-string will be used. + Measured values are returned in local coordinate space. + */ + int textGlyphPositions(float x, float y, const char* string, const char* end, GlyphPosition& positions, int maxPositions); + + /** + Returns the vertical metrics based on the current text style. + Measured values are returned in local coordinate space. + */ + void textMetrics(float* ascender, float* descender, float* lineh); + + /** + Breaks the specified text into lines. If end is specified only the sub-string will be used. + White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. + Words longer than the max width are slit at nearest character (i.e. no hyphenation). + */ + int textBreakLines(const char* string, const char* end, float breakRowWidth, TextRow& rows, int maxRows); + +private: + NVGcontext* const fContext; + bool fInFrame; + bool fIsSubWidget; + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NanoVG) +}; + +// ----------------------------------------------------------------------- +// NanoWidget + +/** + NanoVG Widget class. + + This class implements the NanoVG drawing API inside a DGL Widget. + The drawing function onDisplay() is implemented internally but a + new onNanoDisplay() needs to be overridden instead. + */ +class NanoWidget : public Widget, + public NanoVG +{ +public: + /** + Constructor. + @see CreateFlags + */ + explicit NanoWidget(Window& parent, int flags = CREATE_ANTIALIAS); + + /** + Constructor for a subwidget. + */ + explicit NanoWidget(Widget* groupWidget, int flags = CREATE_ANTIALIAS); + + /** + Constructor for a subwidget, reusing a NanoVG context. + */ + explicit NanoWidget(NanoWidget* groupWidget); + + /** + Destructor. + */ + virtual ~NanoWidget(); + +protected: + /** + New virtual onDisplay function. + @see onDisplay + */ + virtual void onNanoDisplay() = 0; + +private: + struct PrivateData; + PrivateData* const nData; + + /** + Widget display function. + Implemented internally to wrap begin/endFrame() automatically. + */ + void onDisplay() override; + + // these should not be used + void beginFrame(uint,uint) {} + void beginFrame(uint,uint,float) {} + void beginFrame(Widget*) {} + void cancelFrame() {} + void endFrame() {} + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NanoWidget) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_NANO_WIDGET_HPP_INCLUDED diff --git a/dpf/dgl/NanoWidgets.hpp b/dpf/dgl/NanoWidgets.hpp new file mode 100644 index 0000000..1636b3d --- /dev/null +++ b/dpf/dgl/NanoWidgets.hpp @@ -0,0 +1,67 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_NANO_WIDGETS_HPP_INCLUDED +#define DGL_NANO_WIDGETS_HPP_INCLUDED + +#include "NanoVG.hpp" +#include "../distrho/extra/String.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +class BlendishButton : public NanoWidget +{ +public: + class Callback + { + public: + virtual ~Callback() {} + virtual void blendishButtonClicked(BlendishButton* blendishButton, int button) = 0; + }; + + explicit BlendishButton(Window& parent, const char* text = "", int iconId = -1); + explicit BlendishButton(NanoWidget* widget, const char* text = "", int iconId = -1); + ~BlendishButton() override; + + int getIconId() const noexcept; + void setIconId(int iconId) noexcept; + + const char* getText() const noexcept; + void setText(const char* text) noexcept; + + void setCallback(Callback* callback) noexcept; + +protected: + void onNanoDisplay() override; + bool onMouse(const MouseEvent&) override; + bool onMotion(const MotionEvent&) override; + +private: + struct PrivateData; + PrivateData* const pData; + + void _updateBounds(); + + DISTRHO_LEAK_DETECTOR(BlendishButton) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_NANO_WIDGETS_HPP_INCLUDED diff --git a/dpf/dgl/StandaloneWindow.hpp b/dpf/dgl/StandaloneWindow.hpp new file mode 100644 index 0000000..72d6ea2 --- /dev/null +++ b/dpf/dgl/StandaloneWindow.hpp @@ -0,0 +1,61 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_STANDALONE_WINDOW_HPP_INCLUDED +#define DGL_STANDALONE_WINDOW_HPP_INCLUDED + +#include "Application.hpp" +#include "Widget.hpp" +#include "Window.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +class StandaloneWindow : public Application, + public Window +{ +public: + /** + Constructor. + */ + StandaloneWindow(); + + /** + Show window and execute application. + */ + void exec(); + +private: + Widget* fWidget; + + /** @internal */ + void onReshape(uint width, uint height) override; + + /** @internal */ + void _addWidget(Widget* widget) override; + + /** @internal */ + void _removeWidget(Widget* widget) override; + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(StandaloneWindow) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_STANDALONE_WINDOW_HPP_INCLUDED diff --git a/dpf/dgl/Widget.hpp b/dpf/dgl/Widget.hpp new file mode 100644 index 0000000..195f08c --- /dev/null +++ b/dpf/dgl/Widget.hpp @@ -0,0 +1,385 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_WIDGET_HPP_INCLUDED +#define DGL_WIDGET_HPP_INCLUDED + +#include "Geometry.hpp" + +#include + +// ----------------------------------------------------------------------- +// Forward class names + +START_NAMESPACE_DISTRHO +class UI; +END_NAMESPACE_DISTRHO + +START_NAMESPACE_DGL + +class Application; +class ImageSlider; +class NanoWidget; +class Window; +class StandaloneWindow; + +// ----------------------------------------------------------------------- + +/** + Base DGL Widget class. + + This is the base Widget class, from which all widgets are built. + + All widgets have a parent Window where they'll be drawn. + This parent is never changed during the widget lifetime. + + Widgets receive events in relative coordinates. + (0, 0) means its top-left position. + + Windows paint widgets in the order they are constructed. + Early widgets are drawn first, at the bottom, then newer ones on top. + Events are sent in the inverse order so that the top-most widget gets + a chance to catch the event and stop its propagation. + + All widget event callbacks do nothing by default. + */ +class Widget +{ +public: + /** + Base event data. + @a mod The currently active keyboard modifiers, @see Modifier. + @a time The timestamp (if any). + */ + struct BaseEvent { + uint mod; + uint32_t time; + + /** Constuctor */ + BaseEvent() noexcept : mod(0x0), time(0) {} + /** Destuctor */ + virtual ~BaseEvent() noexcept {} + }; + + /** + Keyboard event. + @a press True if the key was pressed, false if released. + @a key Unicode point of the key pressed. + @see onKeyboard + */ + struct KeyboardEvent : BaseEvent { + bool press; + uint key; + + /** Constuctor */ + KeyboardEvent() noexcept + : BaseEvent(), + press(false), + key(0) {} + }; + + /** + Special keyboard event. + @a press True if the key was pressed, false if released. + @a key The key pressed. + @see onSpecial + */ + struct SpecialEvent : BaseEvent { + bool press; + Key key; + + /** Constuctor */ + SpecialEvent() noexcept + : BaseEvent(), + press(false), + key(Key(0)) {} + }; + + /** + Mouse event. + @a button The button number (1 = left, 2 = middle, 3 = right). + @a press True if the key was pressed, false if released. + @a pos The widget-relative coordinates of the pointer. + @see onMouse + */ + struct MouseEvent : BaseEvent { + int button; + bool press; + Point pos; + + /** Constuctor */ + MouseEvent() noexcept + : BaseEvent(), + button(0), + press(false), + pos(0, 0) {} + }; + + /** + Mouse motion event. + @a pos The widget-relative coordinates of the pointer. + @see onMotion + */ + struct MotionEvent : BaseEvent { + Point pos; + + /** Constuctor */ + MotionEvent() noexcept + : BaseEvent(), + pos(0, 0) {} + }; + + /** + Mouse scroll event. + @a pos The widget-relative coordinates of the pointer. + @a delta The scroll distance. + @see onScroll + */ + struct ScrollEvent : BaseEvent { + Point pos; + Point delta; + + /** Constuctor */ + ScrollEvent() noexcept + : BaseEvent(), + pos(0, 0), + delta(0.0f, 0.0f) {} + }; + + /** + Resize event. + @a size The new widget size. + @a oldSize The previous size, may be null. + @see onResize + */ + struct ResizeEvent { + Size size; + Size oldSize; + + /** Constuctor */ + ResizeEvent() noexcept + : size(0, 0), + oldSize(0, 0) {} + }; + + /** + Constructor. + */ + explicit Widget(Window& parent); + + /** + Constructor for a subwidget. + */ + explicit Widget(Widget* groupWidget); + + /** + Destructor. + */ + virtual ~Widget(); + + /** + Check if this widget is visible within its parent window. + Invisible widgets do not receive events except resize. + */ + bool isVisible() const noexcept; + + /** + Set widget visible (or not) according to @a yesNo. + */ + void setVisible(bool yesNo); + + /** + Show widget. + This is the same as calling setVisible(true). + */ + void show(); + + /** + Hide widget. + This is the same as calling setVisible(false). + */ + void hide(); + + /** + Get width. + */ + uint getWidth() const noexcept; + + /** + Get height. + */ + uint getHeight() const noexcept; + + /** + Get size. + */ + const Size& getSize() const noexcept; + + /** + Set width. + */ + void setWidth(uint width) noexcept; + + /** + Set height. + */ + void setHeight(uint height) noexcept; + + /** + Set size using @a width and @a height values. + */ + void setSize(uint width, uint height) noexcept; + + /** + Set size. + */ + void setSize(const Size& size) noexcept; + + /** + Get absolute X. + */ + int getAbsoluteX() const noexcept; + + /** + Get absolute Y. + */ + int getAbsoluteY() const noexcept; + + /** + Get absolute position. + */ + const Point& getAbsolutePos() const noexcept; + + /** + Set absolute X. + */ + void setAbsoluteX(int x) noexcept; + + /** + Set absolute Y. + */ + void setAbsoluteY(int y) noexcept; + + /** + Set absolute position using @a x and @a y values. + */ + void setAbsolutePos(int x, int y) noexcept; + + /** + Set absolute position. + */ + void setAbsolutePos(const Point& pos) noexcept; + + /** + Get this widget's window application. + Same as calling getParentWindow().getApp(). + */ + Application& getParentApp() const noexcept; + + /** + Get parent window, as passed in the constructor. + */ + Window& getParentWindow() const noexcept; + + /** + Check if this widget contains the point defined by @a x and @a y. + */ + bool contains(int x, int y) const noexcept; + + /** + Check if this widget contains the point @a pos. + */ + bool contains(const Point& pos) const noexcept; + + /** + Tell this widget's window to repaint itself. + */ + void repaint() noexcept; + + /** + Get the Id associated with this widget. + @see setId + */ + uint getId() const noexcept; + + /** + Set an Id to be associated with this widget. + @see getId + */ + void setId(uint id) noexcept; + +protected: + /** + A function called to draw the view contents with OpenGL. + */ + virtual void onDisplay() = 0; + + /** + A function called when a key is pressed or released. + @return True to stop event propagation, false otherwise. + */ + virtual bool onKeyboard(const KeyboardEvent&); + + /** + A function called when a special key is pressed or released. + @return True to stop event propagation, false otherwise. + */ + virtual bool onSpecial(const SpecialEvent&); + + /** + A function called when a mouse button is pressed or released. + @return True to stop event propagation, false otherwise. + */ + virtual bool onMouse(const MouseEvent&); + + /** + A function called when the pointer moves. + @return True to stop event propagation, false otherwise. + */ + virtual bool onMotion(const MotionEvent&); + + /** + A function called on scrolling (e.g. mouse wheel or track pad). + @return True to stop event propagation, false otherwise. + */ + virtual bool onScroll(const ScrollEvent&); + + /** + A function called when the widget is resized. + */ + virtual void onResize(const ResizeEvent&); + +private: + struct PrivateData; + PrivateData* const pData; + + /** @internal */ + explicit Widget(Widget* groupWidget, bool addToSubWidgets); + + friend class ImageSlider; + friend class NanoWidget; + friend class Window; + friend class StandaloneWindow; + friend class DISTRHO_NAMESPACE::UI; + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Widget) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_WIDGET_HPP_INCLUDED diff --git a/dpf/dgl/Window.hpp b/dpf/dgl/Window.hpp new file mode 100644 index 0000000..3e1f75c --- /dev/null +++ b/dpf/dgl/Window.hpp @@ -0,0 +1,134 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_WINDOW_HPP_INCLUDED +#define DGL_WINDOW_HPP_INCLUDED + +#include "Geometry.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +class Application; +class Widget; +class StandaloneWindow; + +class Window +{ +public: + /** + File browser options. + */ + struct FileBrowserOptions { + const char* startDir; + const char* title; + uint width; + uint height; + + /** + File browser buttons. + + 0 means hidden. + 1 means visible and unchecked. + 2 means visible and checked. + */ + struct Buttons { + uint listAllFiles; + uint showHidden; + uint showPlaces; + + /** Constuctor for default values */ + Buttons() + : listAllFiles(2), + showHidden(1), + showPlaces(1) {} + } buttons; + + /** Constuctor for default values */ + FileBrowserOptions() + : startDir(nullptr), + title(nullptr), + width(0), + height(0), + buttons() {} + }; + + explicit Window(Application& app); + explicit Window(Application& app, Window& parent); + explicit Window(Application& app, intptr_t parentId); + virtual ~Window(); + + void show(); + void hide(); + void close(); + void exec(bool lockWait = false); + + void focus(); + void repaint() noexcept; + + bool openFileBrowser(const FileBrowserOptions& options); + + bool isVisible() const noexcept; + void setVisible(bool yesNo); + + bool isResizable() const noexcept; + void setResizable(bool yesNo); + + uint getWidth() const noexcept; + uint getHeight() const noexcept; + Size getSize() const noexcept; + void setSize(uint width, uint height); + void setSize(Size size); + + const char* getTitle() const noexcept; + void setTitle(const char* title); + + void setTransientWinId(uintptr_t winId); + + Application& getApp() const noexcept; + intptr_t getWindowId() const noexcept; + + void addIdleCallback(IdleCallback* const callback); + void removeIdleCallback(IdleCallback* const callback); + +protected: + virtual void onDisplayBefore(); + virtual void onDisplayAfter(); + virtual void onReshape(uint width, uint height); + virtual void onClose(); + + virtual void fileBrowserSelected(const char* filename); + +private: + struct PrivateData; + PrivateData* const pData; + friend class Application; + friend class Widget; + friend class StandaloneWindow; + + virtual void _addWidget(Widget* const widget); + virtual void _removeWidget(Widget* const widget); + void _idle(); + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Window) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_WINDOW_HPP_INCLUDED diff --git a/dpf/dgl/src/Application.cpp b/dpf/dgl/src/Application.cpp new file mode 100644 index 0000000..0d9f67a --- /dev/null +++ b/dpf/dgl/src/Application.cpp @@ -0,0 +1,75 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "ApplicationPrivateData.hpp" +#include "../Window.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +Application::Application() + : pData(new PrivateData()), + leakDetector_Application() {} + +Application::~Application() +{ + delete pData; +} + +void Application::idle() +{ + for (std::list::iterator it = pData->windows.begin(), ite = pData->windows.end(); it != ite; ++it) + { + Window* const window(*it); + window->_idle(); + } + + for (std::list::iterator it = pData->idleCallbacks.begin(), ite = pData->idleCallbacks.end(); it != ite; ++it) + { + IdleCallback* const idleCallback(*it); + idleCallback->idleCallback(); + } +} + +void Application::exec() +{ + for (; pData->doLoop;) + { + idle(); + d_msleep(10); + } +} + +void Application::quit() +{ + pData->doLoop = false; + + for (std::list::reverse_iterator rit = pData->windows.rbegin(), rite = pData->windows.rend(); rit != rite; ++rit) + { + Window* const window(*rit); + window->close(); + } +} + +bool Application::isQuiting() const noexcept +{ + return !pData->doLoop; +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL diff --git a/dpf/dgl/src/ApplicationPrivateData.hpp b/dpf/dgl/src/ApplicationPrivateData.hpp new file mode 100644 index 0000000..a0b1c1b --- /dev/null +++ b/dpf/dgl/src/ApplicationPrivateData.hpp @@ -0,0 +1,71 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_APP_PRIVATE_DATA_HPP_INCLUDED +#define DGL_APP_PRIVATE_DATA_HPP_INCLUDED + +#include "../Application.hpp" +#include "../../distrho/extra/Sleep.hpp" + +#include + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +struct Application::PrivateData { + bool doLoop; + uint visibleWindows; + std::list windows; + std::list idleCallbacks; + + PrivateData() + : doLoop(true), + visibleWindows(0), + windows(), + idleCallbacks() {} + + ~PrivateData() + { + DISTRHO_SAFE_ASSERT(! doLoop); + DISTRHO_SAFE_ASSERT(visibleWindows == 0); + + windows.clear(); + idleCallbacks.clear(); + } + + void oneShown() noexcept + { + if (++visibleWindows == 1) + doLoop = true; + } + + void oneHidden() noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(visibleWindows > 0,); + + if (--visibleWindows == 0) + doLoop = false; + } + + DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_APP_PRIVATE_DATA_HPP_INCLUDED diff --git a/dpf/dgl/src/Color.cpp b/dpf/dgl/src/Color.cpp new file mode 100644 index 0000000..eef4b6a --- /dev/null +++ b/dpf/dgl/src/Color.cpp @@ -0,0 +1,245 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "../Color.hpp" + +#include "nanovg/nanovg.h" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +static void fixRange(float& value) +{ + /**/ if (value < 0.0f) + value = 0.0f; + else if (value > 1.0f) + value = 1.0f; +} + +static float getFixedRange(const float& value) +{ + if (value <= 0.0f) + return 0.0f; + if (value >= 1.0f) + return 1.0f; + return value; +} + +static uchar getFixedRange2(const float& value) +{ + const float value2(getFixedRange(value)*255.0f); + if (value2 <= 0.0f) + return 0; + if (value2 >= 255.0f) + return 255; + return static_cast(value2); +} + +// ----------------------------------------------------------------------- + +Color::Color() noexcept + : red(1.0f), + green(1.0f), + blue(1.0f), + alpha(1.0f) {} + +Color::Color(int r, int g, int b, int a) noexcept + : red(static_cast(r)/255.0f), + green(static_cast(g)/255.0f), + blue(static_cast(b)/255.0f), + alpha(static_cast(a)/255.0f) +{ + fixBounds(); +} + +Color::Color(float r, float g, float b, float a) noexcept + : red(r), + green(g), + blue(b), + alpha(a) +{ + fixBounds(); +} + +Color::Color(const Color& color) noexcept + : red(color.red), + green(color.green), + blue(color.blue), + alpha(color.alpha) +{ + fixBounds(); +} + +Color& Color::operator=(const Color& color) noexcept +{ + red = color.red; + green = color.green; + blue = color.blue; + alpha = color.alpha; + fixBounds(); + return *this; +} + +Color::Color(const Color& color1, const Color& color2, float u) noexcept + : red(color1.red), + green(color1.green), + blue(color1.blue), + alpha(color1.alpha) +{ + interpolate(color2, u); +} + +Color Color::fromHSL(float hue, float saturation, float lightness, float alpha) +{ + return nvgHSLA(hue, saturation, lightness, static_cast(getFixedRange(alpha)*255.0f)); +} + +Color Color::fromHTML(const char* rgb, float alpha) +{ + Color fallback; + DISTRHO_SAFE_ASSERT_RETURN(rgb != nullptr && rgb[0] != '\0', fallback); + + if (rgb[0] == '#') ++rgb; + DISTRHO_SAFE_ASSERT_RETURN(rgb[0] != '\0', fallback); + + std::size_t rgblen(std::strlen(rgb)); + DISTRHO_SAFE_ASSERT_RETURN(rgblen == 3 || rgblen == 6, fallback); + + char rgbtmp[3] = { '\0', '\0', '\0' }; + int r, g, b; + + if (rgblen == 3) + { + rgbtmp[0] = rgb[0]; + r = static_cast(std::strtol(rgbtmp, nullptr, 16)); + + rgbtmp[0] = rgb[1]; + g = static_cast(std::strtol(rgbtmp, nullptr, 16)); + + rgbtmp[0] = rgb[2]; + b = static_cast(std::strtol(rgbtmp, nullptr, 16)); + } + else + { + rgbtmp[0] = rgb[0]; + rgbtmp[1] = rgb[1]; + r = static_cast(std::strtol(rgbtmp, nullptr, 16)); + + rgbtmp[0] = rgb[2]; + rgbtmp[1] = rgb[3]; + g = static_cast(std::strtol(rgbtmp, nullptr, 16)); + + rgbtmp[0] = rgb[4]; + rgbtmp[1] = rgb[5]; + b = static_cast(std::strtol(rgbtmp, nullptr, 16)); + } + + return Color(r, g, b, static_cast(getFixedRange(alpha)*255.0f)); +} + +void Color::interpolate(const Color& other, float u) noexcept +{ + fixRange(u); + const float oneMinusU(1.0f - u); + + red = red * oneMinusU + other.red * u; + green = green * oneMinusU + other.green * u; + blue = blue * oneMinusU + other.blue * u; + alpha = alpha * oneMinusU + other.alpha * u; + + fixBounds(); +} + +// ----------------------------------------------------------------------- + +bool Color::isEqual(const Color& color, bool withAlpha) noexcept +{ + const uchar r1 = getFixedRange2(rgba[0]); + const uchar g1 = getFixedRange2(rgba[1]); + const uchar b1 = getFixedRange2(rgba[2]); + const uchar a1 = getFixedRange2(rgba[3]); + + const uchar r2 = getFixedRange2(color.rgba[0]); + const uchar g2 = getFixedRange2(color.rgba[1]); + const uchar b2 = getFixedRange2(color.rgba[2]); + const uchar a2 = getFixedRange2(color.rgba[3]); + + if (withAlpha) + return (r1 == r2 && g1 == g2 && b1 == b2 && a1 == a2); + else + return (r1 == r2 && g1 == g2 && b1 == b2); +} + +bool Color::isNotEqual(const Color& color, bool withAlpha) noexcept +{ + const uchar r1 = getFixedRange2(rgba[0]); + const uchar g1 = getFixedRange2(rgba[1]); + const uchar b1 = getFixedRange2(rgba[2]); + const uchar a1 = getFixedRange2(rgba[3]); + + const uchar r2 = getFixedRange2(color.rgba[0]); + const uchar g2 = getFixedRange2(color.rgba[1]); + const uchar b2 = getFixedRange2(color.rgba[2]); + const uchar a2 = getFixedRange2(color.rgba[3]); + + if (withAlpha) + return (r1 != r2 || g1 != g2 || b1 != b2 || a1 != a2); + else + return (r1 != r2 || g1 != g2 || b1 != b2); +} + +bool Color::operator==(const Color& color) noexcept +{ + return isEqual(color, true); +} + +bool Color::operator!=(const Color& color) noexcept +{ + return isNotEqual(color, true); +} + +// ----------------------------------------------------------------------- + +void Color::fixBounds() noexcept +{ + fixRange(red); + fixRange(green); + fixRange(blue); + fixRange(alpha); +} + +// ----------------------------------------------------------------------- + +Color::Color(const NVGcolor& c) noexcept + : red(c.r), green(c.g), blue(c.b), alpha(c.a) +{ + fixBounds(); +} + +Color::operator NVGcolor() const noexcept +{ + NVGcolor nc; + nc.r = red; + nc.g = green; + nc.b = blue; + nc.a = alpha; + return nc; +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL diff --git a/dpf/dgl/src/Common.hpp b/dpf/dgl/src/Common.hpp new file mode 100644 index 0000000..084d27e --- /dev/null +++ b/dpf/dgl/src/Common.hpp @@ -0,0 +1,129 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_COMMON_HPP_INCLUDED +#define DGL_COMMON_HPP_INCLUDED + +#include "../ImageWidgets.hpp" +#include "../NanoWidgets.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +struct ButtonImpl { + enum State { + kStateNormal = 0, + kStateHover, + kStateDown + }; + + int button; + int state; + Widget* self; + + BlendishButton::Callback* callback_b; + ImageButton::Callback* callback_i; + + ButtonImpl(Widget* const s) noexcept + : button(-1), + state(kStateNormal), + self(s), + callback_b(nullptr), + callback_i(nullptr) {} + + bool onMouse(const Widget::MouseEvent& ev) + { + // button was released, handle it now + if (button != -1 && ! ev.press) + { + DISTRHO_SAFE_ASSERT(state == kStateDown); + + // release button + const int button2 = button; + button = -1; + + // cursor was moved outside the button bounds, ignore click + if (! self->contains(ev.pos)) + { + state = kStateNormal; + self->repaint(); + return true; + } + + // still on bounds, register click + state = kStateHover; + self->repaint(); + + if (callback_b != nullptr) + callback_b->blendishButtonClicked((BlendishButton*)self, button2); + if (callback_i != nullptr) + callback_i->imageButtonClicked((ImageButton*)self, button2); + + return true; + } + + // button was pressed, wait for release + if (ev.press && self->contains(ev.pos)) + { + button = ev.button; + state = kStateDown; + self->repaint(); + return true; + } + + return false; + } + + bool onMotion(const Widget::MotionEvent& ev) + { + // keep pressed + if (button != -1) + return true; + + if (self->contains(ev.pos)) + { + // check if entering hover + if (state == kStateNormal) + { + state = kStateHover; + self->repaint(); + return true; + } + } + else + { + // check if exiting hover + if (state == kStateHover) + { + state = kStateNormal; + self->repaint(); + return true; + } + } + + return false; + } + + DISTRHO_PREVENT_HEAP_ALLOCATION + DISTRHO_DECLARE_NON_COPY_STRUCT(ButtonImpl) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_APP_PRIVATE_DATA_HPP_INCLUDED diff --git a/dpf/dgl/src/Geometry.cpp b/dpf/dgl/src/Geometry.cpp new file mode 100644 index 0000000..65dde8c --- /dev/null +++ b/dpf/dgl/src/Geometry.cpp @@ -0,0 +1,1072 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "../Geometry.hpp" + +#include + +START_NAMESPACE_DGL + +static const float M_2PIf = 3.14159265358979323846f*2.0f; + +// ----------------------------------------------------------------------- +// Point + +template +Point::Point() noexcept + : fX(0), + fY(0) {} + +template +Point::Point(const T& x, const T& y) noexcept + : fX(x), + fY(y) {} + +template +Point::Point(const Point& pos) noexcept + : fX(pos.fX), + fY(pos.fY) {} + +template +const T& Point::getX() const noexcept +{ + return fX; +} + +template +const T& Point::getY() const noexcept +{ + return fY; +} + +template +void Point::setX(const T& x) noexcept +{ + fX = x; +} + +template +void Point::setY(const T& y) noexcept +{ + fY = y; +} + +template +void Point::setPos(const T& x, const T& y) noexcept +{ + fX = x; + fY = y; +} + +template +void Point::setPos(const Point& pos) noexcept +{ + fX = pos.fX; + fY = pos.fY; +} + +template +void Point::moveBy(const T& x, const T& y) noexcept +{ + fX = static_cast(fX+x); + fY = static_cast(fY+y); +} + +template +void Point::moveBy(const Point& pos) noexcept +{ + fX = static_cast(fX+pos.fX); + fY = static_cast(fY+pos.fY); +} + +template +bool Point::isZero() const noexcept +{ + return fX == 0 && fY == 0; +} + +template +bool Point::isNotZero() const noexcept +{ + return fX != 0 || fY != 0; +} + +template +Point Point::operator+(const Point& pos) noexcept +{ + return Point(fX+pos.fX, fY+pos.fY); +} + +template +Point Point::operator-(const Point& pos) noexcept +{ + return Point(fX-pos.fX, fY-pos.fY); +} + +template +Point& Point::operator=(const Point& pos) noexcept +{ + fX = pos.fX; + fY = pos.fY; + return *this; +} + +template +Point& Point::operator+=(const Point& pos) noexcept +{ + fX = static_cast(fX+pos.fX); + fY = static_cast(fY+pos.fY); + return *this; +} + +template +Point& Point::operator-=(const Point& pos) noexcept +{ + fX = static_cast(fX-pos.fX); + fY = static_cast(fY-pos.fY); + return *this; +} + +template +bool Point::operator==(const Point& pos) const noexcept +{ + return (fX == pos.fX && fY == pos.fY); +} + +template +bool Point::operator!=(const Point& pos) const noexcept +{ + return (fX != pos.fX || fY != pos.fY); +} + +// ----------------------------------------------------------------------- +// Size + +template +Size::Size() noexcept + : fWidth(0), + fHeight(0) {} + +template +Size::Size(const T& width, const T& height) noexcept + : fWidth(width), + fHeight(height) {} + +template +Size::Size(const Size& size) noexcept + : fWidth(size.fWidth), + fHeight(size.fHeight) {} + +template +const T& Size::getWidth() const noexcept +{ + return fWidth; +} + +template +const T& Size::getHeight() const noexcept +{ + return fHeight; +} + +template +void Size::setWidth(const T& width) noexcept +{ + fWidth = width; +} + +template +void Size::setHeight(const T& height) noexcept +{ + fHeight = height; +} + +template +void Size::setSize(const T& width, const T& height) noexcept +{ + fWidth = width; + fHeight = height; +} + +template +void Size::setSize(const Size& size) noexcept +{ + fWidth = size.fWidth; + fHeight = size.fHeight; +} + +template +void Size::growBy(double multiplier) noexcept +{ + fWidth = static_cast(static_cast(fWidth)*multiplier); + fHeight = static_cast(static_cast(fHeight)*multiplier); +} + +template +void Size::shrinkBy(double divider) noexcept +{ + fWidth = static_cast(static_cast(fWidth)/divider); + fHeight = static_cast(static_cast(fHeight)/divider); +} + +template +bool Size::isNull() const noexcept +{ + return fWidth == 0 && fHeight == 0; +} + +template +bool Size::isNotNull() const noexcept +{ + return fWidth != 0 || fHeight != 0; +} + +template +bool Size::isValid() const noexcept +{ + return fWidth > 1 && fHeight > 1; +} + +template +bool Size::isInvalid() const noexcept +{ + return fWidth <= 0 || fHeight <= 0; +} + +template +Size Size::operator+(const Size& size) noexcept +{ + return Size(fWidth+size.fWidth, fHeight+size.fHeight); +} + +template +Size Size::operator-(const Size& size) noexcept +{ + return Size(fWidth-size.fWidth, fHeight-size.fHeight); +} + +template +Size& Size::operator=(const Size& size) noexcept +{ + fWidth = size.fWidth; + fHeight = size.fHeight; + return *this; +} + +template +Size& Size::operator+=(const Size& size) noexcept +{ + fWidth = static_cast(fWidth+size.fWidth); + fHeight = static_cast(fHeight+size.fHeight); + return *this; +} + +template +Size& Size::operator-=(const Size& size) noexcept +{ + fWidth = static_cast(fWidth-size.fWidth); + fHeight = static_cast(fHeight-size.fHeight); + return *this; +} + +template +Size& Size::operator*=(double m) noexcept +{ + fWidth = static_cast(static_cast(fWidth)*m); + fHeight = static_cast(static_cast(fHeight)*m); + return *this; +} + +template +Size& Size::operator/=(double d) noexcept +{ + fWidth = static_cast(static_cast(fWidth)/d); + fHeight = static_cast(static_cast(fHeight)/d); + return *this; +} + +template +bool Size::operator==(const Size& size) const noexcept +{ + return (fWidth == size.fWidth && fHeight == size.fHeight); +} + +template +bool Size::operator!=(const Size& size) const noexcept +{ + return (fWidth != size.fWidth || fHeight != size.fHeight); +} + +// ----------------------------------------------------------------------- +// Line + +template +Line::Line() noexcept + : fPosStart(0, 0), + fPosEnd(0, 0) {} + +template +Line::Line(const T& startX, const T& startY, const T& endX, const T& endY) noexcept + : fPosStart(startX, startY), + fPosEnd(endX, endY) {} + +template +Line::Line(const T& startX, const T& startY, const Point& endPos) noexcept + : fPosStart(startX, startY), + fPosEnd(endPos) {} + +template +Line::Line(const Point& startPos, const T& endX, const T& endY) noexcept + : fPosStart(startPos), + fPosEnd(endX, endY) {} + +template +Line::Line(const Point& startPos, const Point& endPos) noexcept + : fPosStart(startPos), + fPosEnd(endPos) {} + +template +Line::Line(const Line& line) noexcept + : fPosStart(line.fPosStart), + fPosEnd(line.fPosEnd) {} + +template +const T& Line::getStartX() const noexcept +{ + return fPosStart.fX; +} + +template +const T& Line::getStartY() const noexcept +{ + return fPosStart.fY; +} + +template +const T& Line::getEndX() const noexcept +{ + return fPosEnd.fX; +} + +template +const T& Line::getEndY() const noexcept +{ + return fPosEnd.fY; +} + +template +const Point& Line::getStartPos() const noexcept +{ + return fPosStart; +} + +template +const Point& Line::getEndPos() const noexcept +{ + return fPosEnd; +} + +template +void Line::setStartX(const T& x) noexcept +{ + fPosStart.fX = x; +} + +template +void Line::setStartY(const T& y) noexcept +{ + fPosStart.fY = y; +} + +template +void Line::setStartPos(const T& x, const T& y) noexcept +{ + fPosStart = Point(x, y); +} + +template +void Line::setStartPos(const Point& pos) noexcept +{ + fPosStart = pos; +} + +template +void Line::setEndX(const T& x) noexcept +{ + fPosEnd.fX = x; +} + +template +void Line::setEndY(const T& y) noexcept +{ + fPosEnd.fY = y; +} + +template +void Line::setEndPos(const T& x, const T& y) noexcept +{ + fPosEnd = Point(x, y); +} + +template +void Line::setEndPos(const Point& pos) noexcept +{ + fPosEnd = pos; +} + +template +void Line::moveBy(const T& x, const T& y) noexcept +{ + fPosStart.moveBy(x, y); + fPosEnd.moveBy(x, y); +} + +template +void Line::moveBy(const Point& pos) noexcept +{ + fPosStart.moveBy(pos); + fPosEnd.moveBy(pos); +} + +template +void Line::draw() +{ + DISTRHO_SAFE_ASSERT_RETURN(fPosStart != fPosEnd,); + + glBegin(GL_LINES); + + { + glVertex2d(fPosStart.fX, fPosStart.fY); + glVertex2d(fPosEnd.fX, fPosEnd.fY); + } + + glEnd(); +} + +template +bool Line::isNull() const noexcept +{ + return fPosStart == fPosEnd; +} + +template +bool Line::isNotNull() const noexcept +{ + return fPosStart != fPosEnd; +} + +template +Line& Line::operator=(const Line& line) noexcept +{ + fPosStart = line.fPosStart; + fPosEnd = line.fPosEnd; + return *this; +} + +template +bool Line::operator==(const Line& line) const noexcept +{ + return (fPosStart == line.fPosStart && fPosEnd == line.fPosEnd); +} + +template +bool Line::operator!=(const Line& line) const noexcept +{ + return (fPosStart != line.fPosStart || fPosEnd != line.fPosEnd); +} + +// ----------------------------------------------------------------------- +// Circle + +template +Circle::Circle() noexcept + : fPos(0, 0), + fSize(0.0f), + fNumSegments(0), + fTheta(0.0f), + fCos(0.0f), + fSin(0.0f) {} + +template +Circle::Circle(const T& x, const T& y, const float size, const uint numSegments) + : fPos(x, y), + fSize(size), + fNumSegments(numSegments >= 3 ? numSegments : 3), + fTheta(M_2PIf / static_cast(fNumSegments)), + fCos(std::cos(fTheta)), + fSin(std::sin(fTheta)) +{ + DISTRHO_SAFE_ASSERT(fSize > 0.0f); +} + +template +Circle::Circle(const Point& pos, const float size, const uint numSegments) + : fPos(pos), + fSize(size), + fNumSegments(numSegments >= 3 ? numSegments : 3), + fTheta(M_2PIf / static_cast(fNumSegments)), + fCos(std::cos(fTheta)), + fSin(std::sin(fTheta)) +{ + DISTRHO_SAFE_ASSERT(fSize > 0.0f); +} + +template +Circle::Circle(const Circle& cir) noexcept + : fPos(cir.fPos), + fSize(cir.fSize), + fNumSegments(cir.fNumSegments), + fTheta(cir.fTheta), + fCos(cir.fCos), + fSin(cir.fSin) +{ + DISTRHO_SAFE_ASSERT(fSize > 0.0f); +} + +template +const T& Circle::getX() const noexcept +{ + return fPos.fX; +} + +template +const T& Circle::getY() const noexcept +{ + return fPos.fX; +} + +template +const Point& Circle::getPos() const noexcept +{ + return fPos; +} + +template +void Circle::setX(const T& x) noexcept +{ + fPos.fX = x; +} + +template +void Circle::setY(const T& y) noexcept +{ + fPos.fY = y; +} + +template +void Circle::setPos(const T& x, const T& y) noexcept +{ + fPos.fX = x; + fPos.fY = y; +} + +template +void Circle::setPos(const Point& pos) noexcept +{ + fPos = pos; +} + +template +float Circle::getSize() const noexcept +{ + return fSize; +} + +template +void Circle::setSize(const float size) noexcept +{ + DISTRHO_SAFE_ASSERT_RETURN(size > 0.0f,); + + fSize = size; +} + +template +uint Circle::getNumSegments() const noexcept +{ + return fNumSegments; +} + +template +void Circle::setNumSegments(const uint num) +{ + DISTRHO_SAFE_ASSERT_RETURN(num >= 3,); + + if (fNumSegments == num) + return; + + fNumSegments = num; + + fTheta = M_2PIf / static_cast(fNumSegments); + fCos = std::cos(fTheta); + fSin = std::sin(fTheta); +} + +template +void Circle::draw() +{ + _draw(false); +} + +template +void Circle::drawOutline() +{ + _draw(true); +} + +template +Circle& Circle::operator=(const Circle& cir) noexcept +{ + fPos = cir.fPos; + fSize = cir.fSize; + fTheta = cir.fTheta; + fCos = cir.fCos; + fSin = cir.fSin; + fNumSegments = cir.fNumSegments; + return *this; +} + +template +bool Circle::operator==(const Circle& cir) const noexcept +{ + return (fPos == cir.fPos && d_isEqual(fSize, cir.fSize) && fNumSegments == cir.fNumSegments); +} + +template +bool Circle::operator!=(const Circle& cir) const noexcept +{ + return (fPos != cir.fPos || d_isNotEqual(fSize, cir.fSize) || fNumSegments != cir.fNumSegments); +} + +template +void Circle::_draw(const bool outline) +{ + DISTRHO_SAFE_ASSERT_RETURN(fNumSegments >= 3 && fSize > 0.0f,); + + float t, x = fSize, y = 0.0f; + + glBegin(outline ? GL_LINE_LOOP : GL_POLYGON); + + for (uint i=0; i +Triangle::Triangle() noexcept + : fPos1(0, 0), + fPos2(0, 0), + fPos3(0, 0) {} + +template +Triangle::Triangle(const T& x1, const T& y1, const T& x2, const T& y2, const T& x3, const T& y3) noexcept + : fPos1(x1, y1), + fPos2(x2, y2), + fPos3(x3, y3) {} + +template +Triangle::Triangle(const Point& pos1, const Point& pos2, const Point& pos3) noexcept + : fPos1(pos1), + fPos2(pos2), + fPos3(pos3) {} + +template +Triangle::Triangle(const Triangle& tri) noexcept + : fPos1(tri.fPos1), + fPos2(tri.fPos2), + fPos3(tri.fPos3) {} + +template +void Triangle::draw() +{ + _draw(false); +} + +template +void Triangle::drawOutline() +{ + _draw(true); +} + +template +bool Triangle::isNull() const noexcept +{ + return fPos1 == fPos2 && fPos1 == fPos3; +} + +template +bool Triangle::isNotNull() const noexcept +{ + return fPos1 != fPos2 || fPos1 != fPos3; +} + +template +bool Triangle::isValid() const noexcept +{ + return fPos1 != fPos2 && fPos1 != fPos3; +} + +template +bool Triangle::isInvalid() const noexcept +{ + return fPos1 == fPos2 || fPos1 == fPos3; +} + +template +Triangle& Triangle::operator=(const Triangle& tri) noexcept +{ + fPos1 = tri.fPos1; + fPos2 = tri.fPos2; + fPos3 = tri.fPos3; + return *this; +} + +template +bool Triangle::operator==(const Triangle& tri) const noexcept +{ + return (fPos1 == tri.fPos1 && fPos2 == tri.fPos2 && fPos3 == tri.fPos3); +} + +template +bool Triangle::operator!=(const Triangle& tri) const noexcept +{ + return (fPos1 != tri.fPos1 || fPos2 != tri.fPos2 || fPos3 != tri.fPos3); +} + +template +void Triangle::_draw(const bool outline) +{ + DISTRHO_SAFE_ASSERT_RETURN(fPos1 != fPos2 && fPos1 != fPos3,); + + glBegin(outline ? GL_LINE_LOOP : GL_TRIANGLES); + + { + glVertex2d(fPos1.fX, fPos1.fY); + glVertex2d(fPos2.fX, fPos2.fY); + glVertex2d(fPos3.fX, fPos3.fY); + } + + glEnd(); +} + +// ----------------------------------------------------------------------- +// Rectangle + +template +Rectangle::Rectangle() noexcept + : fPos(0, 0), + fSize(0, 0) {} + +template +Rectangle::Rectangle(const T& x, const T& y, const T& width, const T& height) noexcept + : fPos(x, y), + fSize(width, height) {} + +template +Rectangle::Rectangle(const T& x, const T& y, const Size& size) noexcept + : fPos(x, y), + fSize(size) {} + +template +Rectangle::Rectangle(const Point& pos, const T& width, const T& height) noexcept + : fPos(pos), + fSize(width, height) {} + +template +Rectangle::Rectangle(const Point& pos, const Size& size) noexcept + : fPos(pos), + fSize(size) {} + +template +Rectangle::Rectangle(const Rectangle& rect) noexcept + : fPos(rect.fPos), + fSize(rect.fSize) {} + +template +const T& Rectangle::getX() const noexcept +{ + return fPos.fX; +} + +template +const T& Rectangle::getY() const noexcept +{ + return fPos.fY; +} + +template +const T& Rectangle::getWidth() const noexcept +{ + return fSize.fWidth; +} + +template +const T& Rectangle::getHeight() const noexcept +{ + return fSize.fHeight; +} + +template +const Point& Rectangle::getPos() const noexcept +{ + return fPos; +} + +template +const Size& Rectangle::getSize() const noexcept +{ + return fSize; +} + +template +void Rectangle::setX(const T& x) noexcept +{ + fPos.fX = x; +} + +template +void Rectangle::setY(const T& y) noexcept +{ + fPos.fY = y; +} + +template +void Rectangle::setPos(const T& x, const T& y) noexcept +{ + fPos.fX = x; + fPos.fY = y; +} + +template +void Rectangle::setPos(const Point& pos) noexcept +{ + fPos = pos; +} + +template +void Rectangle::moveBy(const T& x, const T& y) noexcept +{ + fPos.moveBy(x, y); +} + +template +void Rectangle::moveBy(const Point& pos) noexcept +{ + fPos.moveBy(pos); +} + +template +void Rectangle::setWidth(const T& width) noexcept +{ + fSize.fWidth = width; +} + +template +void Rectangle::setHeight(const T& height) noexcept +{ + fSize.fHeight = height; +} + +template +void Rectangle::setSize(const T& width, const T& height) noexcept +{ + fSize.fWidth = width; + fSize.fHeight = height; +} + +template +void Rectangle::setSize(const Size& size) noexcept +{ + fSize = size; +} + +template +void Rectangle::growBy(double multiplier) noexcept +{ + fSize.growBy(multiplier); +} + +template +void Rectangle::shrinkBy(double divider) noexcept +{ + fSize.shrinkBy(divider); +} + +template +void Rectangle::setRectangle(const Point& pos, const Size& size) noexcept +{ + fPos = pos; + fSize = size; +} + +template +void Rectangle::setRectangle(const Rectangle& rect) noexcept +{ + fPos = rect.fPos; + fSize = rect.fSize; +} + +template +bool Rectangle::contains(const T& x, const T& y) const noexcept +{ + return (x >= fPos.fX && y >= fPos.fY && x <= fPos.fX+fSize.fWidth && y <= fPos.fY+fSize.fHeight); +} + +template +bool Rectangle::contains(const Point& pos) const noexcept +{ + return contains(pos.fX, pos.fY); +} + +template +bool Rectangle::containsX(const T& x) const noexcept +{ + return (x >= fPos.fX && x <= fPos.fX + fSize.fWidth); +} + +template +bool Rectangle::containsY(const T& y) const noexcept +{ + return (y >= fPos.fY && y <= fPos.fY + fSize.fHeight); +} + +template +void Rectangle::draw() +{ + _draw(false); +} + +template +void Rectangle::drawOutline() +{ + _draw(true); +} + +template +Rectangle& Rectangle::operator=(const Rectangle& rect) noexcept +{ + fPos = rect.fPos; + fSize = rect.fSize; + return *this; +} + +template +Rectangle& Rectangle::operator*=(double m) noexcept +{ + fSize *= m; + return *this; +} + +template +Rectangle& Rectangle::operator/=(double d) noexcept +{ + fSize /= d; + return *this; +} + +template +bool Rectangle::operator==(const Rectangle& rect) const noexcept +{ + return (fPos == rect.fPos && fSize == rect.fSize); +} + +template +bool Rectangle::operator!=(const Rectangle& rect) const noexcept +{ + return (fPos != rect.fPos || fSize != rect.fSize); +} + +template +void Rectangle::_draw(const bool outline) +{ + DISTRHO_SAFE_ASSERT_RETURN(fSize.isValid(),); + + glBegin(outline ? GL_LINE_LOOP : GL_QUADS); + + { + glTexCoord2f(0.0f, 0.0f); + glVertex2d(fPos.fX, fPos.fY); + + glTexCoord2f(1.0f, 0.0f); + glVertex2d(fPos.fX+fSize.fWidth, fPos.fY); + + glTexCoord2f(1.0f, 1.0f); + glVertex2d(fPos.fX+fSize.fWidth, fPos.fY+fSize.fHeight); + + glTexCoord2f(0.0f, 1.0f); + glVertex2d(fPos.fX, fPos.fY+fSize.fHeight); + } + + glEnd(); +} + +// ----------------------------------------------------------------------- +// Possible template data types + +template class Point; +template class Point; +template class Point; +template class Point; +template class Point; +template class Point; + +template class Size; +template class Size; +template class Size; +template class Size; +template class Size; +template class Size; + +template class Line; +template class Line; +template class Line; +template class Line; +template class Line; +template class Line; + +template class Circle; +template class Circle; +template class Circle; +template class Circle; +template class Circle; +template class Circle; + +template class Triangle; +template class Triangle; +template class Triangle; +template class Triangle; +template class Triangle; +template class Triangle; + +template class Rectangle; +template class Rectangle; +template class Rectangle; +template class Rectangle; +template class Rectangle; +template class Rectangle; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL diff --git a/dpf/dgl/src/Image.cpp b/dpf/dgl/src/Image.cpp new file mode 100644 index 0000000..db9bd47 --- /dev/null +++ b/dpf/dgl/src/Image.cpp @@ -0,0 +1,192 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "../Image.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +Image::Image() + : fRawData(nullptr), + fSize(0, 0), + fFormat(0), + fType(0), + fTextureId(0), + fIsReady(false) +{ + glGenTextures(1, &fTextureId); +} + +Image::Image(const char* const rawData, const uint width, const uint height, const GLenum format, const GLenum type) + : fRawData(rawData), + fSize(width, height), + fFormat(format), + fType(type), + fTextureId(0), + fIsReady(false) +{ + glGenTextures(1, &fTextureId); +} + +Image::Image(const char* const rawData, const Size& size, const GLenum format, const GLenum type) + : fRawData(rawData), + fSize(size), + fFormat(format), + fType(type), + fTextureId(0), + fIsReady(false) +{ + glGenTextures(1, &fTextureId); +} + +Image::Image(const Image& image) + : fRawData(image.fRawData), + fSize(image.fSize), + fFormat(image.fFormat), + fType(image.fType), + fTextureId(0), + fIsReady(false) +{ + glGenTextures(1, &fTextureId); +} + +Image::~Image() +{ + if (fTextureId != 0) + { + glDeleteTextures(1, &fTextureId); + fTextureId = 0; + } +} + +void Image::loadFromMemory(const char* const rawData, const uint width, const uint height, const GLenum format, const GLenum type) noexcept +{ + loadFromMemory(rawData, Size(width, height), format, type); +} + +void Image::loadFromMemory(const char* const rawData, const Size& size, const GLenum format, const GLenum type) noexcept +{ + fRawData = rawData; + fSize = size; + fFormat = format; + fType = type; + fIsReady = false; +} + +bool Image::isValid() const noexcept +{ + return (fRawData != nullptr && fSize.getWidth() > 0 && fSize.getHeight() > 0); +} + +uint Image::getWidth() const noexcept +{ + return fSize.getWidth(); +} + +uint Image::getHeight() const noexcept +{ + return fSize.getHeight(); +} + +const Size& Image::getSize() const noexcept +{ + return fSize; +} + +const char* Image::getRawData() const noexcept +{ + return fRawData; +} + +GLenum Image::getFormat() const noexcept +{ + return fFormat; +} + +GLenum Image::getType() const noexcept +{ + return fType; +} + +void Image::draw() +{ + drawAt(0, 0); +} + +void Image::drawAt(const int x, const int y) +{ + drawAt(Point(x, y)); +} + +void Image::drawAt(const Point& pos) +{ + if (fTextureId == 0 || ! isValid()) + return; + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, fTextureId); + + if (! fIsReady) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + + static const float trans[] = { 0.0f, 0.0f, 0.0f, 0.0f }; + glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, trans); + + glPixelStorei(GL_PACK_ALIGNMENT, 1); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, + static_cast(fSize.getWidth()), static_cast(fSize.getHeight()), 0, + fFormat, fType, fRawData); + + fIsReady = true; + } + + Rectangle(pos, static_cast(fSize.getWidth()), static_cast(fSize.getHeight())).draw(); + + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); +} + +// ----------------------------------------------------------------------- + +Image& Image::operator=(const Image& image) noexcept +{ + fRawData = image.fRawData; + fSize = image.fSize; + fFormat = image.fFormat; + fType = image.fType; + fIsReady = false; + return *this; +} + +bool Image::operator==(const Image& image) const noexcept +{ + return (fRawData == image.fRawData && fSize == image.fSize); +} + +bool Image::operator!=(const Image& image) const noexcept +{ + return !operator==(image); +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL diff --git a/dpf/dgl/src/ImageWidgets.cpp b/dpf/dgl/src/ImageWidgets.cpp new file mode 100644 index 0000000..ec02c02 --- /dev/null +++ b/dpf/dgl/src/ImageWidgets.cpp @@ -0,0 +1,1094 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "../ImageWidgets.hpp" +#include "Common.hpp" +#include "WidgetPrivateData.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +ImageAboutWindow::ImageAboutWindow(Window& parent, const Image& image) + : Window(parent.getApp(), parent), + Widget((Window&)*this), + fImgBackground(image), + leakDetector_ImageAboutWindow() +{ + Window::setResizable(false); + Window::setSize(image.getSize()); + Window::setTitle("About"); +} + +ImageAboutWindow::ImageAboutWindow(Widget* widget, const Image& image) + : Window(widget->getParentApp(), widget->getParentWindow()), + Widget((Window&)*this), + fImgBackground(image), + leakDetector_ImageAboutWindow() +{ + Window::setResizable(false); + Window::setSize(image.getSize()); + Window::setTitle("About"); +} + +void ImageAboutWindow::setImage(const Image& image) +{ + if (fImgBackground == image) + return; + + fImgBackground = image; + Window::setSize(image.getSize()); +} + +void ImageAboutWindow::onDisplay() +{ + fImgBackground.draw(); +} + +bool ImageAboutWindow::onKeyboard(const KeyboardEvent& ev) +{ + if (ev.press && ev.key == kCharEscape) + { + Window::close(); + return true; + } + + return false; +} + +bool ImageAboutWindow::onMouse(const MouseEvent& ev) +{ + if (ev.press) + { + Window::close(); + return true; + } + + return false; +} + +void ImageAboutWindow::onReshape(uint width, uint height) +{ + Widget::setSize(width, height); + Window::onReshape(width, height); +} + +// ----------------------------------------------------------------------- + +struct ImageButton::PrivateData { + ButtonImpl impl; + Image imageNormal; + Image imageHover; + Image imageDown; + + PrivateData(Widget* const s, const Image& normal, const Image& hover, const Image& down) + : impl(s), + imageNormal(normal), + imageHover(hover), + imageDown(down) {} + + DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData) +}; + +// ----------------------------------------------------------------------- + +ImageButton::ImageButton(Window& parent, const Image& image) + : Widget(parent), + pData(new PrivateData(this, image, image, image)), + leakDetector_ImageButton() +{ + setSize(image.getSize()); +} + +ImageButton::ImageButton(Window& parent, const Image& imageNormal, const Image& imageDown) + : Widget(parent), + pData(new PrivateData(this, imageNormal, imageNormal, imageDown)), + leakDetector_ImageButton() +{ + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize()); + + setSize(imageNormal.getSize()); +} + +ImageButton::ImageButton(Window& parent, const Image& imageNormal, const Image& imageHover, const Image& imageDown) + : Widget(parent), + pData(new PrivateData(this, imageNormal, imageHover, imageDown)), + leakDetector_ImageButton() +{ + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageHover.getSize() && imageHover.getSize() == imageDown.getSize()); + + setSize(imageNormal.getSize()); +} + +ImageButton::ImageButton(Widget* widget, const Image& image) + : Widget(widget->getParentWindow()), + pData(new PrivateData(this, image, image, image)), + leakDetector_ImageButton() +{ + setSize(image.getSize()); +} + +ImageButton::ImageButton(Widget* widget, const Image& imageNormal, const Image& imageDown) + : Widget(widget->getParentWindow()), + pData(new PrivateData(this, imageNormal, imageNormal, imageDown)), + leakDetector_ImageButton() +{ + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageDown.getSize()); + + setSize(imageNormal.getSize()); +} + +ImageButton::ImageButton(Widget* widget, const Image& imageNormal, const Image& imageHover, const Image& imageDown) + : Widget(widget->getParentWindow()), + pData(new PrivateData(this, imageNormal, imageHover, imageDown)), + leakDetector_ImageButton() +{ + DISTRHO_SAFE_ASSERT(imageNormal.getSize() == imageHover.getSize() && imageHover.getSize() == imageDown.getSize()); + + setSize(imageNormal.getSize()); +} + +ImageButton::~ImageButton() +{ + delete pData; +} + +void ImageButton::setCallback(Callback* callback) noexcept +{ + pData->impl.callback_i = callback; +} + +void ImageButton::onDisplay() +{ + switch (pData->impl.state) + { + case ButtonImpl::kStateDown: + pData->imageDown.draw(); + break; + case ButtonImpl::kStateHover: + pData->imageHover.draw(); + break; + default: + pData->imageNormal.draw(); + break; + } +} + +bool ImageButton::onMouse(const MouseEvent& ev) +{ + return pData->impl.onMouse(ev); +} + +bool ImageButton::onMotion(const MotionEvent& ev) +{ + return pData->impl.onMotion(ev); +} + +// ----------------------------------------------------------------------- + +ImageKnob::ImageKnob(Window& parent, const Image& image, Orientation orientation) noexcept + : Widget(parent), + fImage(image), + fMinimum(0.0f), + fMaximum(1.0f), + fStep(0.0f), + fValue(0.5f), + fValueDef(fValue), + fValueTmp(fValue), + fUsingDefault(false), + fUsingLog(false), + fOrientation(orientation), + fRotationAngle(0), + fDragging(false), + fLastX(0), + fLastY(0), + fCallback(nullptr), + fIsImgVertical(image.getHeight() > image.getWidth()), + fImgLayerWidth(fIsImgVertical ? image.getWidth() : image.getHeight()), + fImgLayerHeight(fImgLayerWidth), + fImgLayerCount(fIsImgVertical ? image.getHeight()/fImgLayerHeight : image.getWidth()/fImgLayerWidth), + fIsReady(false), + fTextureId(0), + leakDetector_ImageKnob() +{ + glGenTextures(1, &fTextureId); + setSize(fImgLayerWidth, fImgLayerHeight); +} + +ImageKnob::ImageKnob(Widget* widget, const Image& image, Orientation orientation) noexcept + : Widget(widget->getParentWindow()), + fImage(image), + fMinimum(0.0f), + fMaximum(1.0f), + fStep(0.0f), + fValue(0.5f), + fValueDef(fValue), + fValueTmp(fValue), + fUsingDefault(false), + fUsingLog(false), + fOrientation(orientation), + fRotationAngle(0), + fDragging(false), + fLastX(0), + fLastY(0), + fCallback(nullptr), + fIsImgVertical(image.getHeight() > image.getWidth()), + fImgLayerWidth(fIsImgVertical ? image.getWidth() : image.getHeight()), + fImgLayerHeight(fImgLayerWidth), + fImgLayerCount(fIsImgVertical ? image.getHeight()/fImgLayerHeight : image.getWidth()/fImgLayerWidth), + fIsReady(false), + fTextureId(0), + leakDetector_ImageKnob() +{ + glGenTextures(1, &fTextureId); + setSize(fImgLayerWidth, fImgLayerHeight); +} + +ImageKnob::ImageKnob(const ImageKnob& imageKnob) + : Widget(imageKnob.getParentWindow()), + fImage(imageKnob.fImage), + fMinimum(imageKnob.fMinimum), + fMaximum(imageKnob.fMaximum), + fStep(imageKnob.fStep), + fValue(imageKnob.fValue), + fValueDef(imageKnob.fValueDef), + fValueTmp(fValue), + fUsingDefault(imageKnob.fUsingDefault), + fUsingLog(imageKnob.fUsingLog), + fOrientation(imageKnob.fOrientation), + fRotationAngle(imageKnob.fRotationAngle), + fDragging(false), + fLastX(0), + fLastY(0), + fCallback(imageKnob.fCallback), + fIsImgVertical(imageKnob.fIsImgVertical), + fImgLayerWidth(imageKnob.fImgLayerWidth), + fImgLayerHeight(imageKnob.fImgLayerHeight), + fImgLayerCount(imageKnob.fImgLayerCount), + fIsReady(false), + fTextureId(0), + leakDetector_ImageKnob() +{ + glGenTextures(1, &fTextureId); + setSize(fImgLayerWidth, fImgLayerHeight); +} + +ImageKnob& ImageKnob::operator=(const ImageKnob& imageKnob) +{ + fImage = imageKnob.fImage; + fMinimum = imageKnob.fMinimum; + fMaximum = imageKnob.fMaximum; + fStep = imageKnob.fStep; + fValue = imageKnob.fValue; + fValueDef = imageKnob.fValueDef; + fValueTmp = fValue; + fUsingDefault = imageKnob.fUsingDefault; + fUsingLog = imageKnob.fUsingLog; + fOrientation = imageKnob.fOrientation; + fRotationAngle = imageKnob.fRotationAngle; + fDragging = false; + fLastX = 0; + fLastY = 0; + fCallback = imageKnob.fCallback; + fIsImgVertical = imageKnob.fIsImgVertical; + fImgLayerWidth = imageKnob.fImgLayerWidth; + fImgLayerHeight = imageKnob.fImgLayerHeight; + fImgLayerCount = imageKnob.fImgLayerCount; + fIsReady = false; + + if (fTextureId != 0) + { + glDeleteTextures(1, &fTextureId); + fTextureId = 0; + } + + glGenTextures(1, &fTextureId); + setSize(fImgLayerWidth, fImgLayerHeight); + + return *this; +} + +ImageKnob::~ImageKnob() +{ + if (fTextureId != 0) + { + glDeleteTextures(1, &fTextureId); + fTextureId = 0; + } +} + +float ImageKnob::getValue() const noexcept +{ + return fValue; +} + +// NOTE: value is assumed to be scaled if using log +void ImageKnob::setDefault(float value) noexcept +{ + fValueDef = value; + fUsingDefault = true; +} + +void ImageKnob::setRange(float min, float max) noexcept +{ + DISTRHO_SAFE_ASSERT_RETURN(max > min,); + + if (fValue < min) + { + fValue = min; + repaint(); + + if (fCallback != nullptr) + { + try { + fCallback->imageKnobValueChanged(this, fValue); + } DISTRHO_SAFE_EXCEPTION("ImageKnob::setRange < min"); + } + } + else if (fValue > max) + { + fValue = max; + repaint(); + + if (fCallback != nullptr) + { + try { + fCallback->imageKnobValueChanged(this, fValue); + } DISTRHO_SAFE_EXCEPTION("ImageKnob::setRange > max"); + } + } + + fMinimum = min; + fMaximum = max; +} + +void ImageKnob::setStep(float step) noexcept +{ + fStep = step; +} + +// NOTE: value is assumed to be scaled if using log +void ImageKnob::setValue(float value, bool sendCallback) noexcept +{ + if (d_isEqual(fValue, value)) + return; + + fValue = value; + + if (d_isZero(fStep)) + fValueTmp = value; + + if (fRotationAngle == 0) + fIsReady = false; + + repaint(); + + if (sendCallback && fCallback != nullptr) + { + try { + fCallback->imageKnobValueChanged(this, fValue); + } DISTRHO_SAFE_EXCEPTION("ImageKnob::setValue"); + } +} + +void ImageKnob::setUsingLogScale(bool yesNo) noexcept +{ + fUsingLog = yesNo; +} + +void ImageKnob::setCallback(Callback* callback) noexcept +{ + fCallback = callback; +} + +void ImageKnob::setOrientation(Orientation orientation) noexcept +{ + if (fOrientation == orientation) + return; + + fOrientation = orientation; +} + +void ImageKnob::setRotationAngle(int angle) +{ + if (fRotationAngle == angle) + return; + + fRotationAngle = angle; + fIsReady = false; +} + +void ImageKnob::setImageLayerCount(uint count) noexcept +{ + DISTRHO_SAFE_ASSERT_RETURN(count > 1,); + + fImgLayerCount = count; + + if (fIsImgVertical) + fImgLayerHeight = fImage.getHeight()/count; + else + fImgLayerWidth = fImage.getWidth()/count; + + setSize(fImgLayerWidth, fImgLayerHeight); +} + +void ImageKnob::onDisplay() +{ + const float normValue = ((fUsingLog ? _invlogscale(fValue) : fValue) - fMinimum) / (fMaximum - fMinimum); + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, fTextureId); + + if (! fIsReady) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + + static const float trans[] = { 0.0f, 0.0f, 0.0f, 0.0f }; + glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, trans); + + glPixelStorei(GL_PACK_ALIGNMENT, 1); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + uint imageDataOffset = 0; + + if (fRotationAngle == 0) + { + DISTRHO_SAFE_ASSERT_RETURN(fImgLayerCount > 0,); + DISTRHO_SAFE_ASSERT_RETURN(normValue >= 0.0f,); + + const uint& v1(fIsImgVertical ? fImgLayerWidth : fImgLayerHeight); + const uint& v2(fIsImgVertical ? fImgLayerHeight : fImgLayerWidth); + + const uint layerDataSize = v1 * v2 * ((fImage.getFormat() == GL_BGRA || fImage.getFormat() == GL_RGBA) ? 4 : 3); + /* */ imageDataOffset = layerDataSize * uint(normValue * float(fImgLayerCount-1)); + } + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, + static_cast(getWidth()), static_cast(getHeight()), 0, + fImage.getFormat(), fImage.getType(), fImage.getRawData() + imageDataOffset); + + fIsReady = true; + } + + const int w = static_cast(getWidth()); + const int h = static_cast(getHeight()); + + if (fRotationAngle != 0) + { + glPushMatrix(); + + const int w2 = w/2; + const int h2 = h/2; + + glTranslatef(static_cast(w2), static_cast(h2), 0.0f); + glRotatef(normValue*static_cast(fRotationAngle), 0.0f, 0.0f, 1.0f); + + Rectangle(-w2, -h2, w, h).draw(); + + glPopMatrix(); + } + else + { + Rectangle(0, 0, w, h).draw(); + } + + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); +} + +bool ImageKnob::onMouse(const MouseEvent& ev) +{ + if (ev.button != 1) + return false; + + if (ev.press) + { + if (! contains(ev.pos)) + return false; + + if ((ev.mod & kModifierShift) != 0 && fUsingDefault) + { + setValue(fValueDef, true); + fValueTmp = fValue; + return true; + } + + fDragging = true; + fLastX = ev.pos.getX(); + fLastY = ev.pos.getY(); + + if (fCallback != nullptr) + fCallback->imageKnobDragStarted(this); + + return true; + } + else if (fDragging) + { + if (fCallback != nullptr) + fCallback->imageKnobDragFinished(this); + + fDragging = false; + return true; + } + + return false; +} + +bool ImageKnob::onMotion(const MotionEvent& ev) +{ + if (! fDragging) + return false; + + bool doVal = false; + float d, value = 0.0f; + + if (fOrientation == ImageKnob::Horizontal) + { + if (const int movX = ev.pos.getX() - fLastX) + { + d = (ev.mod & kModifierControl) ? 2000.0f : 200.0f; + value = (fUsingLog ? _invlogscale(fValueTmp) : fValueTmp) + (float(fMaximum - fMinimum) / d * float(movX)); + doVal = true; + } + } + else if (fOrientation == ImageKnob::Vertical) + { + if (const int movY = fLastY - ev.pos.getY()) + { + d = (ev.mod & kModifierControl) ? 2000.0f : 200.0f; + value = (fUsingLog ? _invlogscale(fValueTmp) : fValueTmp) + (float(fMaximum - fMinimum) / d * float(movY)); + doVal = true; + } + } + + if (! doVal) + return false; + + if (fUsingLog) + value = _logscale(value); + + if (value < fMinimum) + { + fValueTmp = value = fMinimum; + } + else if (value > fMaximum) + { + fValueTmp = value = fMaximum; + } + else if (d_isNotZero(fStep)) + { + fValueTmp = value; + const float rest = std::fmod(value, fStep); + value = value - rest + (rest > fStep/2.0f ? fStep : 0.0f); + } + + setValue(value, true); + + fLastX = ev.pos.getX(); + fLastY = ev.pos.getY(); + + return true; +} + +bool ImageKnob::onScroll(const ScrollEvent& ev) +{ + if (! contains(ev.pos)) + return false; + + const float d = (ev.mod & kModifierControl) ? 2000.0f : 200.0f; + float value = (fUsingLog ? _invlogscale(fValueTmp) : fValueTmp) + (float(fMaximum - fMinimum) / d * 10.f * ev.delta.getY()); + + if (fUsingLog) + value = _logscale(value); + + if (value < fMinimum) + { + fValueTmp = value = fMinimum; + } + else if (value > fMaximum) + { + fValueTmp = value = fMaximum; + } + else if (d_isNotZero(fStep)) + { + fValueTmp = value; + const float rest = std::fmod(value, fStep); + value = value - rest + (rest > fStep/2.0f ? fStep : 0.0f); + } + + setValue(value, true); + return true; +} + +// ----------------------------------------------------------------------- + +float ImageKnob::_logscale(float value) const +{ + const float b = std::log(fMaximum/fMinimum)/(fMaximum-fMinimum); + const float a = fMaximum/std::exp(fMaximum*b); + return a * std::exp(b*value); +} + +float ImageKnob::_invlogscale(float value) const +{ + const float b = std::log(fMaximum/fMinimum)/(fMaximum-fMinimum); + const float a = fMaximum/std::exp(fMaximum*b); + return std::log(value/a)/b; +} + +// ----------------------------------------------------------------------- + +ImageSlider::ImageSlider(Window& parent, const Image& image) noexcept + : Widget(parent), + fImage(image), + fMinimum(0.0f), + fMaximum(1.0f), + fStep(0.0f), + fValue(0.5f), + fValueTmp(fValue), + fDragging(false), + fInverted(false), + fValueIsSet(false), + fStartedX(0), + fStartedY(0), + fCallback(nullptr), + fStartPos(), + fEndPos(), + fSliderArea(), + leakDetector_ImageSlider() +{ + pData->needsFullViewport = true; +} + +ImageSlider::ImageSlider(Widget* widget, const Image& image) noexcept + : Widget(widget->getParentWindow()), + fImage(image), + fMinimum(0.0f), + fMaximum(1.0f), + fStep(0.0f), + fValue(0.5f), + fValueTmp(fValue), + fDragging(false), + fInverted(false), + fValueIsSet(false), + fStartedX(0), + fStartedY(0), + fCallback(nullptr), + fStartPos(), + fEndPos(), + fSliderArea(), + leakDetector_ImageSlider() +{ + pData->needsFullViewport = true; +} + +float ImageSlider::getValue() const noexcept +{ + return fValue; +} + +void ImageSlider::setValue(float value, bool sendCallback) noexcept +{ + if (! fValueIsSet) + fValueIsSet = true; + + if (d_isEqual(fValue, value)) + return; + + fValue = value; + + if (d_isZero(fStep)) + fValueTmp = value; + + repaint(); + + if (sendCallback && fCallback != nullptr) + { + try { + fCallback->imageSliderValueChanged(this, fValue); + } DISTRHO_SAFE_EXCEPTION("ImageSlider::setValue"); + } +} + +void ImageSlider::setStartPos(const Point& startPos) noexcept +{ + fStartPos = startPos; + _recheckArea(); +} + +void ImageSlider::setStartPos(int x, int y) noexcept +{ + setStartPos(Point(x, y)); +} + +void ImageSlider::setEndPos(const Point& endPos) noexcept +{ + fEndPos = endPos; + _recheckArea(); +} + +void ImageSlider::setEndPos(int x, int y) noexcept +{ + setEndPos(Point(x, y)); +} + +void ImageSlider::setInverted(bool inverted) noexcept +{ + if (fInverted == inverted) + return; + + fInverted = inverted; + repaint(); +} + +void ImageSlider::setRange(float min, float max) noexcept +{ + fMinimum = min; + fMaximum = max; + + if (fValue < min) + { + fValue = min; + repaint(); + + if (fCallback != nullptr && fValueIsSet) + { + try { + fCallback->imageSliderValueChanged(this, fValue); + } DISTRHO_SAFE_EXCEPTION("ImageSlider::setRange < min"); + } + } + else if (fValue > max) + { + fValue = max; + repaint(); + + if (fCallback != nullptr && fValueIsSet) + { + try { + fCallback->imageSliderValueChanged(this, fValue); + } DISTRHO_SAFE_EXCEPTION("ImageSlider::setRange > max"); + } + } +} + +void ImageSlider::setStep(float step) noexcept +{ + fStep = step; +} + +void ImageSlider::setCallback(Callback* callback) noexcept +{ + fCallback = callback; +} + +void ImageSlider::onDisplay() +{ +#if 0 // DEBUG, paints slider area + glColor3f(0.4f, 0.5f, 0.1f); + glRecti(fSliderArea.getX(), fSliderArea.getY(), fSliderArea.getX()+fSliderArea.getWidth(), fSliderArea.getY()+fSliderArea.getHeight()); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); +#endif + + const float normValue = (fValue - fMinimum) / (fMaximum - fMinimum); + + int x, y; + + if (fStartPos.getY() == fEndPos.getY()) + { + // horizontal + if (fInverted) + x = fEndPos.getX() - static_cast(normValue*static_cast(fEndPos.getX()-fStartPos.getX())); + else + x = fStartPos.getX() + static_cast(normValue*static_cast(fEndPos.getX()-fStartPos.getX())); + + y = fStartPos.getY(); + } + else + { + // vertical + x = fStartPos.getX(); + + if (fInverted) + y = fEndPos.getY() - static_cast(normValue*static_cast(fEndPos.getY()-fStartPos.getY())); + else + y = fStartPos.getY() + static_cast(normValue*static_cast(fEndPos.getY()-fStartPos.getY())); + } + + fImage.drawAt(x, y); +} + +bool ImageSlider::onMouse(const MouseEvent& ev) +{ + if (ev.button != 1) + return false; + + if (ev.press) + { + if (! fSliderArea.contains(ev.pos)) + return false; + + float vper; + const int x = ev.pos.getX(); + const int y = ev.pos.getY(); + + if (fStartPos.getY() == fEndPos.getY()) + { + // horizontal + vper = float(x - fSliderArea.getX()) / float(fSliderArea.getWidth()); + } + else + { + // vertical + vper = float(y - fSliderArea.getY()) / float(fSliderArea.getHeight()); + } + + float value; + + if (fInverted) + value = fMaximum - vper * (fMaximum - fMinimum); + else + value = fMinimum + vper * (fMaximum - fMinimum); + + if (value < fMinimum) + { + fValueTmp = value = fMinimum; + } + else if (value > fMaximum) + { + fValueTmp = value = fMaximum; + } + else if (d_isNotZero(fStep)) + { + fValueTmp = value; + const float rest = std::fmod(value, fStep); + value = value - rest + (rest > fStep/2.0f ? fStep : 0.0f); + } + + fDragging = true; + fStartedX = x; + fStartedY = y; + + if (fCallback != nullptr) + fCallback->imageSliderDragStarted(this); + + setValue(value, true); + + return true; + } + else if (fDragging) + { + if (fCallback != nullptr) + fCallback->imageSliderDragFinished(this); + + fDragging = false; + return true; + } + + return false; +} + +bool ImageSlider::onMotion(const MotionEvent& ev) +{ + if (! fDragging) + return false; + + const bool horizontal = fStartPos.getY() == fEndPos.getY(); + const int x = ev.pos.getX(); + const int y = ev.pos.getY(); + + if ((horizontal && fSliderArea.containsX(x)) || (fSliderArea.containsY(y) && ! horizontal)) + { + float vper; + + if (horizontal) + { + // horizontal + vper = float(x - fSliderArea.getX()) / float(fSliderArea.getWidth()); + } + else + { + // vertical + vper = float(y - fSliderArea.getY()) / float(fSliderArea.getHeight()); + } + + float value; + + if (fInverted) + value = fMaximum - vper * (fMaximum - fMinimum); + else + value = fMinimum + vper * (fMaximum - fMinimum); + + if (value < fMinimum) + { + fValueTmp = value = fMinimum; + } + else if (value > fMaximum) + { + fValueTmp = value = fMaximum; + } + else if (d_isNotZero(fStep)) + { + fValueTmp = value; + const float rest = std::fmod(value, fStep); + value = value - rest + (rest > fStep/2.0f ? fStep : 0.0f); + } + + setValue(value, true); + } + else if (horizontal) + { + if (x < fSliderArea.getX()) + setValue(fInverted ? fMaximum : fMinimum, true); + else + setValue(fInverted ? fMinimum : fMaximum, true); + } + else + { + if (y < fSliderArea.getY()) + setValue(fInverted ? fMaximum : fMinimum, true); + else + setValue(fInverted ? fMinimum : fMaximum, true); + } + + return true; +} + +void ImageSlider::_recheckArea() noexcept +{ + if (fStartPos.getY() == fEndPos.getY()) + { + // horizontal + fSliderArea = Rectangle(fStartPos.getX(), + fStartPos.getY(), + fEndPos.getX() + static_cast(fImage.getWidth()) - fStartPos.getX(), + static_cast(fImage.getHeight())); + } + else + { + // vertical + fSliderArea = Rectangle(fStartPos.getX(), + fStartPos.getY(), + static_cast(fImage.getWidth()), + fEndPos.getY() + static_cast(fImage.getHeight()) - fStartPos.getY()); + } +} + +// ----------------------------------------------------------------------- + +ImageSwitch::ImageSwitch(Window& parent, const Image& imageNormal, const Image& imageDown) noexcept + : Widget(parent), + fImageNormal(imageNormal), + fImageDown(imageDown), + fIsDown(false), + fCallback(nullptr), + leakDetector_ImageSwitch() +{ + DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); + + setSize(fImageNormal.getSize()); +} + +ImageSwitch::ImageSwitch(Widget* widget, const Image& imageNormal, const Image& imageDown) noexcept + : Widget(widget->getParentWindow()), + fImageNormal(imageNormal), + fImageDown(imageDown), + fIsDown(false), + fCallback(nullptr), + leakDetector_ImageSwitch() +{ + DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); + + setSize(fImageNormal.getSize()); +} + +ImageSwitch::ImageSwitch(const ImageSwitch& imageSwitch) noexcept + : Widget(imageSwitch.getParentWindow()), + fImageNormal(imageSwitch.fImageNormal), + fImageDown(imageSwitch.fImageDown), + fIsDown(imageSwitch.fIsDown), + fCallback(imageSwitch.fCallback), + leakDetector_ImageSwitch() +{ + DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); + + setSize(fImageNormal.getSize()); +} + +ImageSwitch& ImageSwitch::operator=(const ImageSwitch& imageSwitch) noexcept +{ + fImageNormal = imageSwitch.fImageNormal; + fImageDown = imageSwitch.fImageDown; + fIsDown = imageSwitch.fIsDown; + fCallback = imageSwitch.fCallback; + + DISTRHO_SAFE_ASSERT(fImageNormal.getSize() == fImageDown.getSize()); + + setSize(fImageNormal.getSize()); + + return *this; +} + +bool ImageSwitch::isDown() const noexcept +{ + return fIsDown; +} + +void ImageSwitch::setDown(bool down) noexcept +{ + if (fIsDown == down) + return; + + fIsDown = down; + repaint(); +} + +void ImageSwitch::setCallback(Callback* callback) noexcept +{ + fCallback = callback; +} + +void ImageSwitch::onDisplay() +{ + if (fIsDown) + fImageDown.draw(); + else + fImageNormal.draw(); +} + +bool ImageSwitch::onMouse(const MouseEvent& ev) +{ + if (ev.press && contains(ev.pos)) + { + fIsDown = !fIsDown; + + repaint(); + + if (fCallback != nullptr) + fCallback->imageSwitchClicked(this, fIsDown); + + return true; + } + + return false; +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL diff --git a/dpf/dgl/src/NanoVG.cpp b/dpf/dgl/src/NanoVG.cpp new file mode 100644 index 0000000..95d4880 --- /dev/null +++ b/dpf/dgl/src/NanoVG.cpp @@ -0,0 +1,931 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "../NanoVG.hpp" +#include "WidgetPrivateData.hpp" + +// ----------------------------------------------------------------------- +// Ignore some warnings if debugging + +#if 0 //def DEBUG +# define NANOVG_GL3 0 +# define NANOVG_GLES2 0 +# define NANOVG_GLES3 0 +# define NANOVG_GL_USE_UNIFORMBUFFER 0 +# if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Weverything" +# elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wall" +# pragma GCC diagnostic ignored "-Wextra" +# pragma GCC diagnostic ignored "-Wconversion" +# pragma GCC diagnostic ignored "-Weffc++" +# pragma GCC diagnostic ignored "-Wsign-conversion" +# pragma GCC diagnostic ignored "-Wundef" +# pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" +# endif +#endif + +// ----------------------------------------------------------------------- +// Include NanoVG OpenGL implementation + +//#define STB_IMAGE_STATIC +#define NANOVG_GL2_IMPLEMENTATION +#include "nanovg/nanovg_gl.h" + +#if defined(NANOVG_GL2) +# define nvgCreateGL nvgCreateGL2 +# define nvgDeleteGL nvgDeleteGL2 +#elif defined(NANOVG_GL3) +# define nvgCreateGL nvgCreateGL3 +# define nvgDeleteGL nvgDeleteGL3 +#elif defined(NANOVG_GLES2) +# define nvgCreateGL nvgCreateGLES2 +# define nvgDeleteGL nvgDeleteGLES2 +#elif defined(NANOVG_GLES3) +# define nvgCreateGL nvgCreateGLES3 +# define nvgDeleteGL nvgDeleteGLES3 +#endif + +// ----------------------------------------------------------------------- +// Restore normal state if debugging + +#if 0//def DEBUG +# if defined(__clang__) +# pragma clang diagnostic pop +# elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic pop +# endif +#endif + +// ----------------------------------------------------------------------- + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- +// NanoImage + +NanoImage::NanoImage() + : fHandle(), + fSize(), + leakDetector_NanoImage() {} + +NanoImage::NanoImage(const Handle& handle) + : fHandle(handle), + fSize(), + leakDetector_NanoImage() +{ + DISTRHO_SAFE_ASSERT_RETURN(fHandle.context != nullptr && fHandle.imageId != 0,); + + _updateSize(); +} + +NanoImage::~NanoImage() +{ + if (fHandle.context != nullptr && fHandle.imageId != 0) + nvgDeleteImage(fHandle.context, fHandle.imageId); +} + +NanoImage& NanoImage::operator=(const Handle& handle) +{ + if (fHandle.context != nullptr && fHandle.imageId != 0) + nvgDeleteImage(fHandle.context, fHandle.imageId); + + fHandle.context = handle.context; + fHandle.imageId = handle.imageId; + + return *this; +} + +bool NanoImage::isValid() const noexcept +{ + return (fHandle.context != nullptr && fHandle.imageId != 0); +} + +Size NanoImage::getSize() const noexcept +{ + return fSize; +} + +GLuint NanoImage::getTextureHandle() const +{ + DISTRHO_SAFE_ASSERT_RETURN(fHandle.context != nullptr && fHandle.imageId != 0, 0); + + return nvglImageHandle(fHandle.context, fHandle.imageId); +} + +void NanoImage::_updateSize() +{ + int w=0, h=0; + + nvgImageSize(fHandle.context, fHandle.imageId, &w, &h); + + if (w < 0) w = 0; + if (h < 0) h = 0; + + fSize.setSize(static_cast(w), static_cast(h)); +} + +// ----------------------------------------------------------------------- +// Paint + +NanoVG::Paint::Paint() noexcept + : radius(0.0f), feather(0.0f), innerColor(), outerColor(), imageId(0) +{ + std::memset(xform, 0, sizeof(float)*6); + std::memset(extent, 0, sizeof(float)*2); +} + +NanoVG::Paint::Paint(const NVGpaint& p) noexcept + : radius(p.radius), feather(p.feather), innerColor(p.innerColor), outerColor(p.outerColor), imageId(p.image) +{ + std::memcpy(xform, p.xform, sizeof(float)*6); + std::memcpy(extent, p.extent, sizeof(float)*2); +} + +NanoVG::Paint::operator NVGpaint() const noexcept +{ + NVGpaint p; + p.radius = radius; + p.feather = feather; + p.innerColor = innerColor; + p.outerColor = outerColor; + p.image = imageId; + std::memcpy(p.xform, xform, sizeof(float)*6); + std::memcpy(p.extent, extent, sizeof(float)*2); + return p; +} + +// ----------------------------------------------------------------------- +// NanoVG + +NanoVG::NanoVG(int flags) + : fContext(nvgCreateGL(flags)), + fInFrame(false), + fIsSubWidget(false), + leakDetector_NanoVG() +{ + DISTRHO_SAFE_ASSERT_RETURN(fContext != nullptr,); +} + +NanoVG::NanoVG(NanoWidget* groupWidget) + : fContext(groupWidget->fContext), + fInFrame(false), + fIsSubWidget(true), + leakDetector_NanoVG() +{ +} + +NanoVG::~NanoVG() +{ + DISTRHO_SAFE_ASSERT(! fInFrame); + + if (fContext != nullptr && ! fIsSubWidget) + nvgDeleteGL(fContext); +} + +// ----------------------------------------------------------------------- + +void NanoVG::beginFrame(const uint width, const uint height, const float scaleFactor) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(scaleFactor > 0.0f,); + DISTRHO_SAFE_ASSERT_RETURN(! fInFrame,); + + fInFrame = true; + nvgBeginFrame(fContext, static_cast(width), static_cast(height), scaleFactor); +} + +void NanoVG::beginFrame(Widget* const widget) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(widget != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(! fInFrame,); + + Window& window(widget->getParentWindow()); + + fInFrame = true; + nvgBeginFrame(fContext, static_cast(window.getWidth()), static_cast(window.getHeight()), 1.0f); +} + +void NanoVG::cancelFrame() +{ + DISTRHO_SAFE_ASSERT_RETURN(fInFrame,); + + if (fContext != nullptr) + nvgCancelFrame(fContext); + + fInFrame = false; +} + +void NanoVG::endFrame() +{ + DISTRHO_SAFE_ASSERT_RETURN(fInFrame,); + + // Save current blend state + GLboolean blendEnabled; + GLint blendSrc, blendDst; + glGetBooleanv(GL_BLEND, &blendEnabled); + glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrc); + glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDst); + + if (fContext != nullptr) + nvgEndFrame(fContext); + + // Restore blend state + if (blendEnabled) + glEnable(GL_BLEND); + else + glDisable(GL_BLEND); + + glBlendFunc(blendSrc, blendDst); + + fInFrame = false; +} + +// ----------------------------------------------------------------------- +// State Handling + +void NanoVG::save() +{ + if (fContext != nullptr) + nvgSave(fContext); +} + +void NanoVG::restore() +{ + if (fContext != nullptr) + nvgRestore(fContext); +} + +void NanoVG::reset() +{ + if (fContext != nullptr) + nvgReset(fContext); +} + +// ----------------------------------------------------------------------- +// Render styles + +void NanoVG::strokeColor(const Color& color) +{ + if (fContext != nullptr) + nvgStrokeColor(fContext, color); +} + +void NanoVG::strokeColor(const int red, const int green, const int blue, const int alpha) +{ + if (fContext != nullptr) + { + DISTRHO_SAFE_ASSERT_RETURN(red >= 0 && red <= 255,); + DISTRHO_SAFE_ASSERT_RETURN(green >= 0 && green <= 255,); + DISTRHO_SAFE_ASSERT_RETURN(blue >= 0 && blue <= 255,); + DISTRHO_SAFE_ASSERT_RETURN(alpha >= 0 && alpha <= 255,); + + nvgStrokeColor(fContext, nvgRGBA(static_cast(red), + static_cast(green), + static_cast(blue), + static_cast(alpha))); + } +} + +void NanoVG::strokeColor(const float red, const float green, const float blue, const float alpha) +{ + if (fContext != nullptr) + nvgStrokeColor(fContext, nvgRGBAf(red, green, blue, alpha)); +} + +void NanoVG::strokePaint(const Paint& paint) +{ + if (fContext != nullptr) + nvgStrokePaint(fContext, paint); +} + +void NanoVG::fillColor(const Color& color) +{ + if (fContext != nullptr) + nvgFillColor(fContext, color); +} + +void NanoVG::fillColor(const int red, const int green, const int blue, const int alpha) +{ + if (fContext != nullptr) + { + DISTRHO_SAFE_ASSERT_RETURN(red >= 0 && red <= 255,); + DISTRHO_SAFE_ASSERT_RETURN(green >= 0 && green <= 255,); + DISTRHO_SAFE_ASSERT_RETURN(blue >= 0 && blue <= 255,); + DISTRHO_SAFE_ASSERT_RETURN(alpha >= 0 && alpha <= 255,); + + nvgFillColor(fContext, nvgRGBA(static_cast(red), + static_cast(green), + static_cast(blue), + static_cast(alpha))); + } +} + +void NanoVG::fillColor(const float red, const float green, const float blue, const float alpha) +{ + if (fContext != nullptr) + nvgFillColor(fContext, nvgRGBAf(red, green, blue, alpha)); +} + +void NanoVG::fillPaint(const Paint& paint) +{ + if (fContext != nullptr) + nvgFillPaint(fContext, paint); +} + +void NanoVG::miterLimit(float limit) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(limit > 0.0f,); + + nvgMiterLimit(fContext, limit); +} + +void NanoVG::strokeWidth(float size) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(size > 0.0f,); + + nvgStrokeWidth(fContext, size); +} + +void NanoVG::lineCap(NanoVG::LineCap cap) +{ + if (fContext != nullptr) + nvgLineCap(fContext, cap); +} + +void NanoVG::lineJoin(NanoVG::LineCap join) +{ + if (fContext != nullptr) + nvgLineJoin(fContext, join); +} + +void NanoVG::globalAlpha(float alpha) +{ + if (fContext != nullptr) + nvgGlobalAlpha(fContext, alpha); +} + +// ----------------------------------------------------------------------- +// Transforms + +void NanoVG::resetTransform() +{ + if (fContext != nullptr) + nvgResetTransform(fContext); +} + +void NanoVG::transform(float a, float b, float c, float d, float e, float f) +{ + if (fContext != nullptr) + nvgTransform(fContext, a, b, c, d, e, f); +} + +void NanoVG::translate(float x, float y) +{ + if (fContext != nullptr) + nvgTranslate(fContext, x, y); +} + +void NanoVG::rotate(float angle) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(angle > 0.0f,); + + nvgRotate(fContext, angle); +} + +void NanoVG::skewX(float angle) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(angle > 0.0f,); + + nvgSkewX(fContext, angle); +} + +void NanoVG::skewY(float angle) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(angle > 0.0f,); + + nvgSkewY(fContext, angle); +} + +void NanoVG::scale(float x, float y) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(x > 0.0f,); + DISTRHO_SAFE_ASSERT_RETURN(y > 0.0f,); + + nvgScale(fContext, x, y); +} + +void NanoVG::currentTransform(float xform[6]) +{ + if (fContext != nullptr) + nvgCurrentTransform(fContext, xform); +} + +void NanoVG::transformIdentity(float dst[6]) +{ + nvgTransformIdentity(dst); +} + +void NanoVG::transformTranslate(float dst[6], float tx, float ty) +{ + nvgTransformTranslate(dst, tx, ty); +} + +void NanoVG::transformScale(float dst[6], float sx, float sy) +{ + nvgTransformScale(dst, sx, sy); +} + +void NanoVG::transformRotate(float dst[6], float a) +{ + nvgTransformRotate(dst, a); +} + +void NanoVG::transformSkewX(float dst[6], float a) +{ + nvgTransformSkewX(dst, a); +} + +void NanoVG::transformSkewY(float dst[6], float a) +{ + nvgTransformSkewY(dst, a); +} + +void NanoVG::transformMultiply(float dst[6], const float src[6]) +{ + nvgTransformMultiply(dst, src); +} + +void NanoVG::transformPremultiply(float dst[6], const float src[6]) +{ + nvgTransformPremultiply(dst, src); +} + +int NanoVG::transformInverse(float dst[6], const float src[6]) +{ + return nvgTransformInverse(dst, src); +} + +void NanoVG::transformPoint(float& dstx, float& dsty, const float xform[6], float srcx, float srcy) +{ + nvgTransformPoint(&dstx, &dsty, xform, srcx, srcy); +} + +float NanoVG::degToRad(float deg) +{ + return nvgDegToRad(deg); +} + +float NanoVG::radToDeg(float rad) +{ + return nvgRadToDeg(rad); +} + +// ----------------------------------------------------------------------- +// Images + +NanoImage::Handle NanoVG::createImageFromFile(const char* filename, ImageFlags imageFlags) +{ + return createImageFromFile(filename, static_cast(imageFlags)); +} + +NanoImage::Handle NanoVG::createImageFromFile(const char* filename, int imageFlags) +{ + if (fContext == nullptr) return NanoImage::Handle(); + DISTRHO_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', NanoImage::Handle()); + + return NanoImage::Handle(fContext, nvgCreateImage(fContext, filename, imageFlags)); +} + +NanoImage::Handle NanoVG::createImageFromMemory(uchar* data, uint dataSize, ImageFlags imageFlags) +{ + return createImageFromMemory(data, dataSize, static_cast(imageFlags)); +} + +NanoImage::Handle NanoVG::createImageFromMemory(uchar* data, uint dataSize, int imageFlags) +{ + if (fContext == nullptr) return NanoImage::Handle(); + DISTRHO_SAFE_ASSERT_RETURN(data != nullptr, NanoImage::Handle()); + DISTRHO_SAFE_ASSERT_RETURN(dataSize > 0, NanoImage::Handle()); + + return NanoImage::Handle(fContext, nvgCreateImageMem(fContext, imageFlags, data,static_cast(dataSize))); +} + +NanoImage::Handle NanoVG::createImageFromRGBA(uint w, uint h, const uchar* data, ImageFlags imageFlags) +{ + return createImageFromRGBA(w, h, data, static_cast(imageFlags)); +} + +NanoImage::Handle NanoVG::createImageFromRGBA(uint w, uint h, const uchar* data, int imageFlags) +{ + if (fContext == nullptr) return NanoImage::Handle(); + DISTRHO_SAFE_ASSERT_RETURN(data != nullptr, NanoImage::Handle()); + + return NanoImage::Handle(fContext, nvgCreateImageRGBA(fContext, + static_cast(w), + static_cast(h), imageFlags, data)); +} + +NanoImage::Handle NanoVG::createImageFromTextureHandle(GLuint textureId, uint w, uint h, ImageFlags imageFlags, bool deleteTexture) +{ + return createImageFromTextureHandle(textureId, w, h, static_cast(imageFlags), deleteTexture); +} + +NanoImage::Handle NanoVG::createImageFromTextureHandle(GLuint textureId, uint w, uint h, int imageFlags, bool deleteTexture) +{ + if (fContext == nullptr) return NanoImage::Handle(); + DISTRHO_SAFE_ASSERT_RETURN(textureId != 0, NanoImage::Handle()); + + if (! deleteTexture) + imageFlags |= NVG_IMAGE_NODELETE; + + return NanoImage::Handle(fContext, nvglCreateImageFromHandle(fContext, + textureId, + static_cast(w), + static_cast(h), imageFlags)); +} + +// ----------------------------------------------------------------------- +// Paints + +NanoVG::Paint NanoVG::linearGradient(float sx, float sy, float ex, float ey, const Color& icol, const Color& ocol) +{ + if (fContext == nullptr) return Paint(); + return nvgLinearGradient(fContext, sx, sy, ex, ey, icol, ocol); +} + +NanoVG::Paint NanoVG::boxGradient(float x, float y, float w, float h, float r, float f, const Color& icol, const Color& ocol) +{ + if (fContext == nullptr) return Paint(); + return nvgBoxGradient(fContext, x, y, w, h, r, f, icol, ocol); +} + +NanoVG::Paint NanoVG::radialGradient(float cx, float cy, float inr, float outr, const Color& icol, const Color& ocol) +{ + if (fContext == nullptr) return Paint(); + return nvgRadialGradient(fContext, cx, cy, inr, outr, icol, ocol); +} + +NanoVG::Paint NanoVG::imagePattern(float ox, float oy, float ex, float ey, float angle, const NanoImage& image, float alpha) +{ + if (fContext == nullptr) return Paint(); + + const int imageId(image.fHandle.imageId); + DISTRHO_SAFE_ASSERT_RETURN(imageId != 0, Paint()); + + return nvgImagePattern(fContext, ox, oy, ex, ey, angle, imageId, alpha); +} + +// ----------------------------------------------------------------------- +// Scissoring + +void NanoVG::scissor(float x, float y, float w, float h) +{ + if (fContext != nullptr) + nvgScissor(fContext, x, y, w, h); +} + +void NanoVG::intersectScissor(float x, float y, float w, float h) +{ + if (fContext != nullptr) + nvgIntersectScissor(fContext, x, y, w, h); +} + +void NanoVG::resetScissor() +{ + if (fContext != nullptr) + nvgResetScissor(fContext); +} + +// ----------------------------------------------------------------------- +// Paths + +void NanoVG::beginPath() +{ + if (fContext != nullptr) + nvgBeginPath(fContext); +} + +void NanoVG::moveTo(float x, float y) +{ + if (fContext != nullptr) + nvgMoveTo(fContext, x, y); +} + +void NanoVG::lineTo(float x, float y) +{ + if (fContext != nullptr) + nvgLineTo(fContext, x, y); +} + +void NanoVG::bezierTo(float c1x, float c1y, float c2x, float c2y, float x, float y) +{ + if (fContext != nullptr) + nvgBezierTo(fContext, c1x, c1y, c2x, c2y, x, y); +} + +void NanoVG::quadTo(float cx, float cy, float x, float y) +{ + if (fContext != nullptr) + nvgQuadTo(fContext, cx, cy, x, y); +} + +void NanoVG::arcTo(float x1, float y1, float x2, float y2, float radius) +{ + if (fContext != nullptr) + nvgArcTo(fContext, x1, y1, x2, y2, radius); +} + +void NanoVG::closePath() +{ + if (fContext != nullptr) + nvgClosePath(fContext); +} + +void NanoVG::pathWinding(NanoVG::Winding dir) +{ + if (fContext != nullptr) + nvgPathWinding(fContext, dir); +} + +void NanoVG::arc(float cx, float cy, float r, float a0, float a1, NanoVG::Winding dir) +{ + if (fContext != nullptr) + nvgArc(fContext, cx, cy, r, a0, a1, dir); +} + +void NanoVG::rect(float x, float y, float w, float h) +{ + if (fContext != nullptr) + nvgRect(fContext, x, y, w, h); +} + +void NanoVG::roundedRect(float x, float y, float w, float h, float r) +{ + if (fContext != nullptr) + nvgRoundedRect(fContext, x, y, w, h, r); +} + +void NanoVG::ellipse(float cx, float cy, float rx, float ry) +{ + if (fContext != nullptr) + nvgEllipse(fContext, cx, cy, rx, ry); +} + +void NanoVG::circle(float cx, float cy, float r) +{ + if (fContext != nullptr) + nvgCircle(fContext, cx, cy, r); +} + +void NanoVG::fill() +{ + if (fContext != nullptr) + nvgFill(fContext); +} + +void NanoVG::stroke() +{ + if (fContext != nullptr) + nvgStroke(fContext); +} + +// ----------------------------------------------------------------------- +// Text + +NanoVG::FontId NanoVG::createFontFromFile(const char* name, const char* filename) +{ + if (fContext == nullptr) return -1; + DISTRHO_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', -1); + DISTRHO_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', -1); + + return nvgCreateFont(fContext, name, filename); +} + +NanoVG::FontId NanoVG::createFontFromMemory(const char* name, const uchar* data, uint dataSize, bool freeData) +{ + if (fContext == nullptr) return -1; + DISTRHO_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', -1); + DISTRHO_SAFE_ASSERT_RETURN(data != nullptr, -1); + + return nvgCreateFontMem(fContext, name, const_cast(data), static_cast(dataSize), freeData); +} + +NanoVG::FontId NanoVG::findFont(const char* name) +{ + if (fContext == nullptr) return -1; + DISTRHO_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', -1); + + return nvgFindFont(fContext, name); +} + +void NanoVG::fontSize(float size) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(size > 0.0f,); + + nvgFontSize(fContext, size); +} + +void NanoVG::fontBlur(float blur) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(blur >= 0.0f,); + + nvgFontBlur(fContext, blur); +} + +void NanoVG::textLetterSpacing(float spacing) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(spacing >= 0.0f,); + + nvgTextLetterSpacing(fContext, spacing); +} + +void NanoVG::textLineHeight(float lineHeight) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(lineHeight > 0.0f,); + + nvgTextLineHeight(fContext, lineHeight); +} + +void NanoVG::textAlign(NanoVG::Align align) +{ + if (fContext != nullptr) + nvgTextAlign(fContext, align); +} + +void NanoVG::textAlign(int align) +{ + if (fContext != nullptr) + nvgTextAlign(fContext, align); +} + +void NanoVG::fontFaceId(FontId font) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(font >= 0,); + + nvgFontFaceId(fContext, font); +} + +void NanoVG::fontFace(const char* font) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(font != nullptr && font[0] != '\0',); + + nvgFontFace(fContext, font); +} + +float NanoVG::text(float x, float y, const char* string, const char* end) +{ + if (fContext == nullptr) return 0.0f; + DISTRHO_SAFE_ASSERT_RETURN(string != nullptr && string[0] != '\0', 0.0f); + + return nvgText(fContext, x, y, string, end); +} + +void NanoVG::textBox(float x, float y, float breakRowWidth, const char* string, const char* end) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(string != nullptr && string[0] != '\0',); + + nvgTextBox(fContext, x, y, breakRowWidth, string, end); +} + +float NanoVG::textBounds(float x, float y, const char* string, const char* end, Rectangle& bounds) +{ + if (fContext == nullptr) return 0.0f; + DISTRHO_SAFE_ASSERT_RETURN(string != nullptr && string[0] != '\0', 0.0f); + + float b[4]; + const float ret = nvgTextBounds(fContext, x, y, string, end, b); + bounds = Rectangle(b[0], b[1], b[2], b[3]); + return ret; +} + +void NanoVG::textBoxBounds(float x, float y, float breakRowWidth, const char* string, const char* end, float bounds[4]) +{ + if (fContext == nullptr) return; + DISTRHO_SAFE_ASSERT_RETURN(string != nullptr && string[0] != '\0',); + + nvgTextBoxBounds(fContext, x, y, breakRowWidth, string, end, bounds); +} + +int NanoVG::textGlyphPositions(float x, float y, const char* string, const char* end, NanoVG::GlyphPosition& positions, int maxPositions) +{ + if (fContext == nullptr) return 0; + DISTRHO_SAFE_ASSERT_RETURN(string != nullptr && string[0] != '\0', 0); + + return nvgTextGlyphPositions(fContext, x, y, string, end, (NVGglyphPosition*)&positions, maxPositions); +} + +void NanoVG::textMetrics(float* ascender, float* descender, float* lineh) +{ + if (fContext != nullptr) + nvgTextMetrics(fContext, ascender, descender, lineh); +} + +int NanoVG::textBreakLines(const char* string, const char* end, float breakRowWidth, NanoVG::TextRow& rows, int maxRows) +{ + if (fContext != nullptr) + return nvgTextBreakLines(fContext, string, end, breakRowWidth, (NVGtextRow*)&rows, maxRows); + return 0; +} + +// ----------------------------------------------------------------------- + +struct NanoWidget::PrivateData { + NanoWidget* const self; + std::vector subWidgets; + + PrivateData(NanoWidget* const s) + : self(s), + subWidgets() {} + + ~PrivateData() + { + subWidgets.clear(); + } +}; + +NanoWidget::NanoWidget(Window& parent, int flags) + : Widget(parent), + NanoVG(flags), + nData(new PrivateData(this)), + leakDetector_NanoWidget() +{ + pData->needsScaling = true; +} + +NanoWidget::NanoWidget(Widget* groupWidget, int flags) + : Widget(groupWidget, true), + NanoVG(flags), + nData(new PrivateData(this)), + leakDetector_NanoWidget() +{ + pData->needsScaling = true; +} + +NanoWidget::NanoWidget(NanoWidget* groupWidget) + : Widget(groupWidget, false), + NanoVG(groupWidget), + nData(new PrivateData(this)), + leakDetector_NanoWidget() +{ + pData->needsScaling = true; + groupWidget->nData->subWidgets.push_back(this); +} + +NanoWidget::~NanoWidget() +{ + delete nData; +} + +void NanoWidget::onDisplay() +{ + NanoVG::beginFrame(getWidth(), getHeight()); + onNanoDisplay(); + + for (std::vector::iterator it = nData->subWidgets.begin(); it != nData->subWidgets.end(); ++it) + { + NanoWidget* const widget(*it); + widget->onNanoDisplay(); + } + + NanoVG::endFrame(); +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +extern "C" { +#include "nanovg/nanovg.c" +} + +// ----------------------------------------------------------------------- diff --git a/dpf/dgl/src/NanoWidgets.cpp b/dpf/dgl/src/NanoWidgets.cpp new file mode 100644 index 0000000..6a0e8ba --- /dev/null +++ b/dpf/dgl/src/NanoWidgets.cpp @@ -0,0 +1,146 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "../NanoWidgets.hpp" +#include "Common.hpp" + +#define BLENDISH_IMPLEMENTATION +#include "nanovg/nanovg.h" +#include "oui-blendish/blendish.h" +#include "oui-blendish/blendish_resources.h" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +static void registerBlendishResourcesIfNeeded(NVGcontext* const context) +{ + if (nvgFindFont(context, "__dpf_blendish__") >= 0) + return; + + using namespace blendish_resources; + + bndSetFont(nvgCreateFontMem(context, "__dpf_blendish__", (const uchar*)dejavusans_ttf, dejavusans_ttf_size, 0)); + bndSetIconImage(nvgCreateImageMem(context, 0, (const uchar*)blender_icons16_png, blender_icons16_png_size)); +} + +// ----------------------------------------------------------------------- + +struct BlendishButton::PrivateData { + ButtonImpl impl; + int iconId; + DISTRHO_NAMESPACE::String text; + + PrivateData(Widget* const s, const char* const t, const int i) noexcept + : impl(s), + iconId(i), + text(t) {} + + DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData) +}; + +// ----------------------------------------------------------------------- + +BlendishButton::BlendishButton(Window& parent, const char* text, int iconId) + : NanoWidget(parent), + pData(new PrivateData(this, text, iconId)), + leakDetector_BlendishButton() +{ + registerBlendishResourcesIfNeeded(getContext()); + _updateBounds(); +} + +BlendishButton::BlendishButton(NanoWidget* widget, const char* text, int iconId) + : NanoWidget(widget), + pData(new PrivateData(this, text, iconId)), + leakDetector_BlendishButton() +{ + registerBlendishResourcesIfNeeded(getContext()); + _updateBounds(); +} + +BlendishButton::~BlendishButton() +{ + delete pData; +} + +int BlendishButton::getIconId() const noexcept +{ + return pData->iconId; +} + +void BlendishButton::setIconId(int iconId) noexcept +{ + if (pData->iconId == iconId) + return; + + pData->iconId = iconId; + _updateBounds(); + repaint(); +} + +const char* BlendishButton::getText() const noexcept +{ + return pData->text; +} + +void BlendishButton::setText(const char* text) noexcept +{ + if (pData->text == text) + return; + + pData->text = text; + _updateBounds(); + repaint(); +} + +void BlendishButton::setCallback(Callback* callback) noexcept +{ + pData->impl.callback_b = callback; +} + +void BlendishButton::onNanoDisplay() +{ + bndToolButton(getContext(), + getAbsoluteX(), getAbsoluteY(), getWidth(), getHeight(), + 0, static_cast(pData->impl.state), pData->iconId, pData->text); +} + +bool BlendishButton::onMouse(const MouseEvent& ev) +{ + return pData->impl.onMouse(ev); +} + +bool BlendishButton::onMotion(const MotionEvent& ev) +{ + return pData->impl.onMotion(ev); +} + +void BlendishButton::_updateBounds() +{ + const float width = bndLabelWidth (getContext(), pData->iconId, pData->text); + const float height = bndLabelHeight(getContext(), pData->iconId, pData->text, width); + + setSize(width, height); +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#include "oui-blendish/blendish_resources.cpp" + +// ----------------------------------------------------------------------- diff --git a/dpf/dgl/src/Widget.cpp b/dpf/dgl/src/Widget.cpp new file mode 100644 index 0000000..ec03d72 --- /dev/null +++ b/dpf/dgl/src/Widget.cpp @@ -0,0 +1,253 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "WidgetPrivateData.hpp" + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- +// Widget + +Widget::Widget(Window& parent) + : pData(new PrivateData(this, parent, nullptr, false)), + leakDetector_Widget() +{ + parent._addWidget(this); +} + +Widget::Widget(Widget* groupWidget) + : pData(new PrivateData(this, groupWidget->getParentWindow(), groupWidget, true)), + leakDetector_Widget() +{ + pData->parent._addWidget(this); +} + +Widget::Widget(Widget* groupWidget, bool addToSubWidgets) + : pData(new PrivateData(this, groupWidget->getParentWindow(), groupWidget, addToSubWidgets)), + leakDetector_Widget() +{ + pData->parent._addWidget(this); +} + +Widget::~Widget() +{ + pData->parent._removeWidget(this); + delete pData; +} + +bool Widget::isVisible() const noexcept +{ + return pData->visible; +} + +void Widget::setVisible(bool yesNo) +{ + if (pData->visible == yesNo) + return; + + pData->visible = yesNo; + pData->parent.repaint(); +} + +void Widget::show() +{ + setVisible(true); +} + +void Widget::hide() +{ + setVisible(false); +} + +uint Widget::getWidth() const noexcept +{ + return pData->size.getWidth(); +} + +uint Widget::getHeight() const noexcept +{ + return pData->size.getHeight(); +} + +const Size& Widget::getSize() const noexcept +{ + return pData->size; +} + +void Widget::setWidth(uint width) noexcept +{ + if (pData->size.getWidth() == width) + return; + + ResizeEvent ev; + ev.oldSize = pData->size; + ev.size = Size(width, pData->size.getHeight()); + + pData->size.setWidth(width); + onResize(ev); + + pData->parent.repaint(); +} + +void Widget::setHeight(uint height) noexcept +{ + if (pData->size.getHeight() == height) + return; + + ResizeEvent ev; + ev.oldSize = pData->size; + ev.size = Size(pData->size.getWidth(), height); + + pData->size.setHeight(height); + onResize(ev); + + pData->parent.repaint(); +} + +void Widget::setSize(uint width, uint height) noexcept +{ + setSize(Size(width, height)); +} + +void Widget::setSize(const Size& size) noexcept +{ + if (pData->size == size) + return; + + ResizeEvent ev; + ev.oldSize = pData->size; + ev.size = size; + + pData->size = size; + onResize(ev); + + pData->parent.repaint(); +} + +int Widget::getAbsoluteX() const noexcept +{ + return pData->absolutePos.getX(); +} + +int Widget::getAbsoluteY() const noexcept +{ + return pData->absolutePos.getY(); +} + +const Point& Widget::getAbsolutePos() const noexcept +{ + return pData->absolutePos; +} + +void Widget::setAbsoluteX(int x) noexcept +{ + if (pData->absolutePos.getX() == x) + return; + + pData->absolutePos.setX(x); + pData->parent.repaint(); +} + +void Widget::setAbsoluteY(int y) noexcept +{ + if (pData->absolutePos.getY() == y) + return; + + pData->absolutePos.setY(y); + pData->parent.repaint(); +} + +void Widget::setAbsolutePos(int x, int y) noexcept +{ + setAbsolutePos(Point(x, y)); +} + +void Widget::setAbsolutePos(const Point& pos) noexcept +{ + if (pData->absolutePos == pos) + return; + + pData->absolutePos = pos; + pData->parent.repaint(); +} + +Application& Widget::getParentApp() const noexcept +{ + return pData->parent.getApp(); +} + +Window& Widget::getParentWindow() const noexcept +{ + return pData->parent; +} + +bool Widget::contains(int x, int y) const noexcept +{ + return (x >= 0 && y >= 0 && static_cast(x) < pData->size.getWidth() && static_cast(y) < pData->size.getHeight()); +} + +bool Widget::contains(const Point& pos) const noexcept +{ + return contains(pos.getX(), pos.getY()); +} + +void Widget::repaint() noexcept +{ + pData->parent.repaint(); +} + +uint Widget::getId() const noexcept +{ + return pData->id; +} + +void Widget::setId(uint id) noexcept +{ + pData->id = id; +} + +bool Widget::onKeyboard(const KeyboardEvent&) +{ + return false; +} + +bool Widget::onSpecial(const SpecialEvent&) +{ + return false; +} + +bool Widget::onMouse(const MouseEvent&) +{ + return false; +} + +bool Widget::onMotion(const MotionEvent&) +{ + return false; +} + +bool Widget::onScroll(const ScrollEvent&) +{ + return false; +} + +void Widget::onResize(const ResizeEvent&) +{ +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL diff --git a/dpf/dgl/src/WidgetPrivateData.hpp b/dpf/dgl/src/WidgetPrivateData.hpp new file mode 100644 index 0000000..5a65622 --- /dev/null +++ b/dpf/dgl/src/WidgetPrivateData.hpp @@ -0,0 +1,133 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DGL_WIDGET_PRIVATE_DATA_HPP_INCLUDED +#define DGL_WIDGET_PRIVATE_DATA_HPP_INCLUDED + +#include "../Widget.hpp" +#include "../Window.hpp" + +#include + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- + +struct Widget::PrivateData { + Widget* const self; + Window& parent; + Point absolutePos; + Size size; + std::vector subWidgets; + + uint id; + bool needsFullViewport; + bool needsScaling; + bool skipDisplay; + bool visible; + + PrivateData(Widget* const s, Window& p, Widget* groupWidget, bool addToSubWidgets) + : self(s), + parent(p), + absolutePos(0, 0), + size(0, 0), + id(0), + needsFullViewport(false), + needsScaling(false), + skipDisplay(false), + visible(true) + { + if (addToSubWidgets && groupWidget != nullptr) + groupWidget->pData->subWidgets.push_back(self); + } + + ~PrivateData() + { + subWidgets.clear(); + } + + void display(const uint width, const uint height) + { + if (skipDisplay || ! visible) + return; + + bool needsDisableScissor = false; + + // reset color + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + if (needsFullViewport || (absolutePos.isZero() && size == Size(width, height))) + { + // full viewport size + glViewport(0, 0, static_cast(width), static_cast(height)); + } + else if (needsScaling) + { + // limit viewport to widget bounds + glViewport(absolutePos.getX(), + height - static_cast(self->getHeight()) - absolutePos.getY(), + static_cast(self->getWidth()), + static_cast(self->getHeight())); + } + else + { + // only set viewport pos + glViewport(absolutePos.getX(), + /*height - static_cast(self->getHeight())*/ - absolutePos.getY(), + static_cast(width), + static_cast(height)); + + // then cut the outer bounds + glScissor(absolutePos.getX(), + height - static_cast(self->getHeight()) - absolutePos.getY(), + static_cast(self->getWidth()), + static_cast(self->getHeight())); + + glEnable(GL_SCISSOR_TEST); + needsDisableScissor = true; + } + + // display widget + self->onDisplay(); + + if (needsDisableScissor) + { + glDisable(GL_SCISSOR_TEST); + needsDisableScissor = false; + } + + displaySubWidgets(width, height); + } + + void displaySubWidgets(const uint width, const uint height) + { + for (std::vector::iterator it = subWidgets.begin(); it != subWidgets.end(); ++it) + { + Widget* const widget(*it); + DISTRHO_SAFE_ASSERT_CONTINUE(widget->pData != this); + + widget->pData->display(width, height); + } + } + + DISTRHO_DECLARE_NON_COPY_STRUCT(PrivateData) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#endif // DGL_WIDGET_PRIVATE_DATA_HPP_INCLUDED diff --git a/dpf/dgl/src/Window.cpp b/dpf/dgl/src/Window.cpp new file mode 100644 index 0000000..ee33f3c --- /dev/null +++ b/dpf/dgl/src/Window.cpp @@ -0,0 +1,1240 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +// we need this for now +//#define PUGL_GRAB_FOCUS 1 + +#include "../../distrho/src/DistrhoDefines.h" + +#undef PUGL_HAVE_CAIRO +#undef PUGL_HAVE_GL +#define PUGL_HAVE_GL 1 + +#include "pugl/pugl.h" + +#if defined(DISTRHO_OS_WINDOWS) +# include "pugl/pugl_win.cpp" +#elif defined(DISTRHO_OS_MAC) +# include "pugl/pugl_osx.m" +#elif defined(DISTRHO_OS_LINUX) +# include +# include +extern "C" { +# include "pugl/pugl_x11.c" +} +#else +# error Unsupported platform +#endif + +#include "ApplicationPrivateData.hpp" +#include "WidgetPrivateData.hpp" +#include "../StandaloneWindow.hpp" +#include "../../distrho/extra/String.hpp" + +#define FOR_EACH_WIDGET(it) \ + for (std::list::iterator it = fWidgets.begin(); it != fWidgets.end(); ++it) + +#define FOR_EACH_WIDGET_INV(rit) \ + for (std::list::reverse_iterator rit = fWidgets.rbegin(); rit != fWidgets.rend(); ++rit) + +#ifdef DEBUG +# define DBG(msg) std::fprintf(stderr, "%s", msg); +# define DBGp(...) std::fprintf(stderr, __VA_ARGS__); +# define DBGF std::fflush(stderr); +#else +# define DBG(msg) +# define DBGp(...) +# define DBGF +#endif + +START_NAMESPACE_DGL + +// ----------------------------------------------------------------------- +// Window Private + +struct Window::PrivateData { + PrivateData(Application& app, Window* const self) + : fApp(app), + fSelf(self), + fView(puglInit()), + fFirstInit(true), + fVisible(false), + fResizable(true), + fUsingEmbed(false), + fWidth(1), + fHeight(1), + fTitle(nullptr), + fWidgets(), + fModal(), +#if defined(DISTRHO_OS_WINDOWS) + hwnd(0), +#elif defined(DISTRHO_OS_LINUX) + xDisplay(nullptr), + xWindow(0), +#elif defined(DISTRHO_OS_MAC) + fNeedsIdle(true), + mView(nullptr), + mWindow(nullptr), +#endif + leakDetector_PrivateData() + { + DBG("Creating window without parent..."); DBGF; + init(); + } + + PrivateData(Application& app, Window* const self, Window& parent) + : fApp(app), + fSelf(self), + fView(puglInit()), + fFirstInit(true), + fVisible(false), + fResizable(true), + fUsingEmbed(false), + fWidth(1), + fHeight(1), + fTitle(nullptr), + fWidgets(), + fModal(parent.pData), +#if defined(DISTRHO_OS_WINDOWS) + hwnd(0), +#elif defined(DISTRHO_OS_LINUX) + xDisplay(nullptr), + xWindow(0), +#elif defined(DISTRHO_OS_MAC) + fNeedsIdle(false), + mView(nullptr), + mWindow(nullptr), +#endif + leakDetector_PrivateData() + { + DBG("Creating window with parent..."); DBGF; + init(); + + const PuglInternals* const parentImpl(parent.pData->fView->impl); +#if defined(DISTRHO_OS_LINUX) + XSetTransientForHint(xDisplay, xWindow, parentImpl->win); +//#elif defined(DISTRHO_OS_MAC) +// [parentImpl->window orderWindow:NSWindowBelow relativeTo:[[mView window] windowNumber]]; +#else + // unused + return; (void)parentImpl; +#endif + } + + PrivateData(Application& app, Window* const self, const intptr_t parentId) + : fApp(app), + fSelf(self), + fView(puglInit()), + fFirstInit(true), + fVisible(parentId != 0), + fResizable(parentId == 0), + fUsingEmbed(parentId != 0), + fWidth(1), + fHeight(1), + fTitle(nullptr), + fWidgets(), + fModal(), +#if defined(DISTRHO_OS_WINDOWS) + hwnd(0), +#elif defined(DISTRHO_OS_LINUX) + xDisplay(nullptr), + xWindow(0), +#elif defined(DISTRHO_OS_MAC) + fNeedsIdle(parentId == 0), + mView(nullptr), + mWindow(nullptr), +#endif + leakDetector_PrivateData() + { + if (fUsingEmbed) + { + DBG("Creating embedded window..."); DBGF; + puglInitWindowParent(fView, parentId); + } + else + { + DBG("Creating window without parent..."); DBGF; + } + + init(); + + if (fUsingEmbed) + { + DBG("NOTE: Embed window is always visible and non-resizable\n"); + puglShowWindow(fView); + fApp.pData->oneShown(); + fFirstInit = false; + } + } + + void init() + { + if (fSelf == nullptr || fView == nullptr) + { + DBG("Failed!\n"); + return; + } + + puglInitContextType(fView, PUGL_GL); + puglInitUserResizable(fView, fResizable); + puglInitWindowSize(fView, static_cast(fWidth), static_cast(fHeight)); + + puglSetHandle(fView, this); + puglSetDisplayFunc(fView, onDisplayCallback); + puglSetKeyboardFunc(fView, onKeyboardCallback); + puglSetMotionFunc(fView, onMotionCallback); + puglSetMouseFunc(fView, onMouseCallback); + puglSetScrollFunc(fView, onScrollCallback); + puglSetSpecialFunc(fView, onSpecialCallback); + puglSetReshapeFunc(fView, onReshapeCallback); + puglSetCloseFunc(fView, onCloseCallback); + puglSetFileSelectedFunc(fView, fileBrowserSelectedCallback); + + puglCreateWindow(fView, nullptr); + + PuglInternals* impl = fView->impl; +#if defined(DISTRHO_OS_WINDOWS) + hwnd = impl->hwnd; + DISTRHO_SAFE_ASSERT(hwnd != 0); +#elif defined(DISTRHO_OS_MAC) + mView = impl->glview; + mWindow = impl->window; + DISTRHO_SAFE_ASSERT(mView != nullptr); + if (fUsingEmbed) { + DISTRHO_SAFE_ASSERT(mWindow == nullptr); + } else { + DISTRHO_SAFE_ASSERT(mWindow != nullptr); + } +#elif defined(DISTRHO_OS_LINUX) + xDisplay = impl->display; + xWindow = impl->win; + DISTRHO_SAFE_ASSERT(xWindow != 0); + + if (! fUsingEmbed) + { + pid_t pid = getpid(); + Atom _nwp = XInternAtom(xDisplay, "_NET_WM_PID", True); + XChangeProperty(xDisplay, xWindow, _nwp, XA_CARDINAL, 32, PropModeReplace, (const uchar*)&pid, 1); + } +#endif + puglEnterContext(fView); + + fApp.pData->windows.push_back(fSelf); + + DBG("Success!\n"); + } + + ~PrivateData() + { + DBG("Destroying window..."); DBGF; + + if (fModal.enabled) + { + exec_fini(); + close(); + } + + fWidgets.clear(); + + if (fUsingEmbed) + { + puglHideWindow(fView); + fApp.pData->oneHidden(); + } + + if (fSelf != nullptr) + { + fApp.pData->windows.remove(fSelf); + fSelf = nullptr; + } + + if (fView != nullptr) + { + puglDestroy(fView); + fView = nullptr; + } + +#if defined(DISTRHO_OS_WINDOWS) + hwnd = 0; +#elif defined(DISTRHO_OS_MAC) + mView = nullptr; + mWindow = nullptr; +#elif defined(DISTRHO_OS_LINUX) + xDisplay = nullptr; + xWindow = 0; +#endif + + DBG("Success!\n"); + } + + // ------------------------------------------------------------------- + + void close() + { + DBG("Window close\n"); + + if (fUsingEmbed) + return; + + setVisible(false); + + if (! fFirstInit) + { + fApp.pData->oneHidden(); + fFirstInit = true; + } + } + + void exec(const bool lockWait) + { + DBG("Window exec\n"); + exec_init(); + + if (lockWait) + { + for (; fVisible && fModal.enabled;) + { + idle(); + d_msleep(10); + } + + exec_fini(); + } + else + { + idle(); + } + } + + // ------------------------------------------------------------------- + + void exec_init() + { + DBG("Window modal loop starting..."); DBGF; + DISTRHO_SAFE_ASSERT_RETURN(fModal.parent != nullptr, setVisible(true)); + + fModal.enabled = true; + fModal.parent->fModal.childFocus = this; + +#ifdef DISTRHO_OS_WINDOWS + // Center this window + PuglInternals* const parentImpl = fModal.parent->fView->impl; + + RECT curRect; + RECT parentRect; + GetWindowRect(hwnd, &curRect); + GetWindowRect(parentImpl->hwnd, &parentRect); + + int x = parentRect.left+(parentRect.right-curRect.right)/2; + int y = parentRect.top +(parentRect.bottom-curRect.bottom)/2; + + SetWindowPos(hwnd, 0, x, y, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER); + UpdateWindow(hwnd); +#endif + + fModal.parent->setVisible(true); + setVisible(true); + + DBG("Ok\n"); + } + + void exec_fini() + { + DBG("Window modal loop stopping..."); DBGF; + fModal.enabled = false; + + if (fModal.parent != nullptr) + { + fModal.parent->fModal.childFocus = nullptr; + + // the mouse position probably changed since the modal appeared, + // so send a mouse motion event to the modal's parent window +#if defined(DISTRHO_OS_WINDOWS) + // TODO +#elif defined(DISTRHO_OS_MAC) + // TODO +#elif defined(DISTRHO_OS_LINUX) + int i, wx, wy; + uint u; + ::Window w; + if (XQueryPointer(fModal.parent->xDisplay, fModal.parent->xWindow, &w, &w, &i, &i, &wx, &wy, &u) == True) + fModal.parent->onPuglMotion(wx, wy); +#endif + } + + DBG("Ok\n"); + } + + // ------------------------------------------------------------------- + + void focus() + { + DBG("Window focus\n"); +#if defined(DISTRHO_OS_WINDOWS) + SetForegroundWindow(hwnd); + SetActiveWindow(hwnd); + SetFocus(hwnd); +#elif defined(DISTRHO_OS_MAC) + if (mWindow != nullptr) + { + // TODO + //[NSApp activateIgnoringOtherApps:YES]; + //[mWindow makeKeyAndOrderFront:mWindow]; + } +#elif defined(DISTRHO_OS_LINUX) + XRaiseWindow(xDisplay, xWindow); + XSetInputFocus(xDisplay, xWindow, RevertToPointerRoot, CurrentTime); + XFlush(xDisplay); +#endif + } + + // ------------------------------------------------------------------- + + void setVisible(const bool yesNo) + { + if (fVisible == yesNo) + { + DBG("Window setVisible matches current state, ignoring request\n"); + return; + } + if (fUsingEmbed) + { + DBG("Window setVisible cannot be called when embedded\n"); + return; + } + + DBG("Window setVisible called\n"); + + fVisible = yesNo; + + if (yesNo && fFirstInit) + setSize(fWidth, fHeight, true); + +#if defined(DISTRHO_OS_WINDOWS) + if (yesNo) + ShowWindow(hwnd, fFirstInit ? SW_SHOWNORMAL : SW_RESTORE); + else + ShowWindow(hwnd, SW_HIDE); + + UpdateWindow(hwnd); +#elif defined(DISTRHO_OS_MAC) + if (yesNo) + { + if (mWindow != nullptr) + [mWindow setIsVisible:YES]; + else + [mView setHidden:NO]; + } + else + { + if (mWindow != nullptr) + [mWindow setIsVisible:NO]; + else + [mView setHidden:YES]; + } +#elif defined(DISTRHO_OS_LINUX) + if (yesNo) + XMapRaised(xDisplay, xWindow); + else + XUnmapWindow(xDisplay, xWindow); + + XFlush(xDisplay); +#endif + + if (yesNo) + { + if (fFirstInit) + { + fApp.pData->oneShown(); + fFirstInit = false; + } + } + else if (fModal.enabled) + exec_fini(); + } + + // ------------------------------------------------------------------- + + void setResizable(const bool yesNo) + { + if (fResizable == yesNo) + { + DBG("Window setResizable matches current state, ignoring request\n"); + return; + } + if (fUsingEmbed) + { + DBG("Window setResizable cannot be called when embedded\n"); + return; + } + + DBG("Window setResizable called\n"); + + fResizable = yesNo; + +#if defined(DISTRHO_OS_WINDOWS) + const int winFlags = fResizable ? GetWindowLong(hwnd, GWL_STYLE) | WS_SIZEBOX + : GetWindowLong(hwnd, GWL_STYLE) & ~WS_SIZEBOX; + SetWindowLong(hwnd, GWL_STYLE, winFlags); +#elif defined(DISTRHO_OS_MAC) + const uint flags(yesNo ? (NSViewWidthSizable|NSViewHeightSizable) : 0x0); + [mView setAutoresizingMask:flags]; +#endif + + setSize(fWidth, fHeight, true); + } + + // ------------------------------------------------------------------- + + void setSize(uint width, uint height, const bool forced = false) + { + if (width <= 1 || height <= 1) + { + DBGp("Window setSize called with invalid value(s) %i %i, ignoring request\n", width, height); + return; + } + + if (fWidth == width && fHeight == height && ! forced) + { + DBGp("Window setSize matches current size, ignoring request (%i %i)\n", width, height); + return; + } + + fWidth = width; + fHeight = height; + + DBGp("Window setSize called %s, size %i %i, resizable %s\n", forced ? "(forced)" : "(not forced)", width, height, fResizable?"true":"false"); + +#if defined(DISTRHO_OS_WINDOWS) + const int winFlags = WS_POPUPWINDOW | WS_CAPTION | (fResizable ? WS_SIZEBOX : 0x0); + RECT wr = { 0, 0, static_cast(width), static_cast(height) }; + AdjustWindowRectEx(&wr, fUsingEmbed ? WS_CHILD : winFlags, FALSE, WS_EX_TOPMOST); + + SetWindowPos(hwnd, 0, 0, 0, wr.right-wr.left, wr.bottom-wr.top, + SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOZORDER); + + if (! forced) + UpdateWindow(hwnd); +#elif defined(DISTRHO_OS_MAC) + [mView setFrame:NSMakeRect(0, 0, width, height)]; + + if (mWindow != nullptr) + { + const NSSize size = NSMakeSize(width, height); + [mWindow setContentSize:size]; + + if (fResizable) + { + [mWindow setContentMinSize:NSMakeSize(1, 1)]; + [mWindow setContentMaxSize:NSMakeSize(99999, 99999)]; + [[mWindow standardWindowButton:NSWindowZoomButton] setHidden:NO]; + } + else + { + [mWindow setContentMinSize:size]; + [mWindow setContentMaxSize:size]; + [[mWindow standardWindowButton:NSWindowZoomButton] setHidden:YES]; + } + } +#elif defined(DISTRHO_OS_LINUX) + XResizeWindow(xDisplay, xWindow, width, height); + + if (! fResizable) + { + XSizeHints sizeHints; + memset(&sizeHints, 0, sizeof(sizeHints)); + + sizeHints.flags = PSize|PMinSize|PMaxSize; + sizeHints.width = static_cast(width); + sizeHints.height = static_cast(height); + sizeHints.min_width = static_cast(width); + sizeHints.min_height = static_cast(height); + sizeHints.max_width = static_cast(width); + sizeHints.max_height = static_cast(height); + + XSetNormalHints(xDisplay, xWindow, &sizeHints); + } + + if (! forced) + XFlush(xDisplay); +#endif + + puglPostRedisplay(fView); + } + + // ------------------------------------------------------------------- + + const char* getTitle() const noexcept + { + static const char* const kFallback = ""; + + return fTitle != nullptr ? fTitle : kFallback; + } + + void setTitle(const char* const title) + { + DBGp("Window setTitle \"%s\"\n", title); + + if (fTitle != nullptr) + std::free(fTitle); + + fTitle = strdup(title); + +#if defined(DISTRHO_OS_WINDOWS) + SetWindowTextA(hwnd, title); +#elif defined(DISTRHO_OS_MAC) + if (mWindow != nullptr) + { + NSString* titleString = [[NSString alloc] + initWithBytes:title + length:strlen(title) + encoding:NSUTF8StringEncoding]; + + [mWindow setTitle:titleString]; + } +#elif defined(DISTRHO_OS_LINUX) + XStoreName(xDisplay, xWindow, title); +#endif + } + + void setTransientWinId(const uintptr_t winId) + { +#if defined(DISTRHO_OS_LINUX) + XSetTransientForHint(xDisplay, xWindow, static_cast< ::Window>(winId)); +#else + return; + // unused + (void)winId; +#endif + } + + // ------------------------------------------------------------------- + + void addWidget(Widget* const widget) + { + fWidgets.push_back(widget); + } + + void removeWidget(Widget* const widget) + { + fWidgets.remove(widget); + } + + void idle() + { + puglProcessEvents(fView); + +#ifdef DISTRHO_OS_MAC + if (fNeedsIdle) + { + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + NSEvent* event; + + for (;;) + { + event = [NSApp + nextEventMatchingMask:NSAnyEventMask + untilDate:[NSDate distantPast] + inMode:NSDefaultRunLoopMode + dequeue:YES]; + + if (event == nil) + break; + + [NSApp sendEvent: event]; + } + + [pool release]; + } +#endif + + if (fModal.enabled && fModal.parent != nullptr) + fModal.parent->idle(); + } + + // ------------------------------------------------------------------- + + void onPuglDisplay() + { + fSelf->onDisplayBefore(); + + FOR_EACH_WIDGET(it) + { + Widget* const widget(*it); + widget->pData->display(fWidth, fHeight); + } + + fSelf->onDisplayAfter(); + } + + void onPuglKeyboard(const bool press, const uint key) + { + DBGp("PUGL: onKeyboard : %i %i\n", press, key); + + if (fModal.childFocus != nullptr) + return fModal.childFocus->focus(); + + Widget::KeyboardEvent ev; + ev.press = press; + ev.key = key; + ev.mod = static_cast(puglGetModifiers(fView)); + ev.time = puglGetEventTimestamp(fView); + + FOR_EACH_WIDGET_INV(rit) + { + Widget* const widget(*rit); + + if (widget->isVisible() && widget->onKeyboard(ev)) + break; + } + } + + void onPuglSpecial(const bool press, const Key key) + { + DBGp("PUGL: onSpecial : %i %i\n", press, key); + + if (fModal.childFocus != nullptr) + return fModal.childFocus->focus(); + + Widget::SpecialEvent ev; + ev.press = press; + ev.key = key; + ev.mod = static_cast(puglGetModifiers(fView)); + ev.time = puglGetEventTimestamp(fView); + + FOR_EACH_WIDGET_INV(rit) + { + Widget* const widget(*rit); + + if (widget->isVisible() && widget->onSpecial(ev)) + break; + } + } + + void onPuglMouse(const int button, const bool press, const int x, const int y) + { + DBGp("PUGL: onMouse : %i %i %i %i\n", button, press, x, y); + + // FIXME - pugl sends 2 of these for each window on init, don't ask me why. we'll ignore it + if (press && button == 0 && x == 0 && y == 0) return; + + if (fModal.childFocus != nullptr) + return fModal.childFocus->focus(); + + Widget::MouseEvent ev; + ev.button = button; + ev.press = press; + ev.mod = static_cast(puglGetModifiers(fView)); + ev.time = puglGetEventTimestamp(fView); + + FOR_EACH_WIDGET_INV(rit) + { + Widget* const widget(*rit); + + ev.pos = Point(x-widget->getAbsoluteX(), y-widget->getAbsoluteY()); + + if (widget->isVisible() && widget->onMouse(ev)) + break; + } + } + + void onPuglMotion(const int x, const int y) + { + DBGp("PUGL: onMotion : %i %i\n", x, y); + + if (fModal.childFocus != nullptr) + return; + + Widget::MotionEvent ev; + ev.mod = static_cast(puglGetModifiers(fView)); + ev.time = puglGetEventTimestamp(fView); + + FOR_EACH_WIDGET_INV(rit) + { + Widget* const widget(*rit); + + ev.pos = Point(x-widget->getAbsoluteX(), y-widget->getAbsoluteY()); + + if (widget->isVisible() && widget->onMotion(ev)) + break; + } + } + + void onPuglScroll(const int x, const int y, const float dx, const float dy) + { + DBGp("PUGL: onScroll : %i %i %f %f\n", x, y, dx, dy); + + if (fModal.childFocus != nullptr) + return; + + Widget::ScrollEvent ev; + ev.delta = Point(dx, dy); + ev.mod = static_cast(puglGetModifiers(fView)); + ev.time = puglGetEventTimestamp(fView); + + FOR_EACH_WIDGET_INV(rit) + { + Widget* const widget(*rit); + + ev.pos = Point(x-widget->getAbsoluteX(), y-widget->getAbsoluteY()); + + if (widget->isVisible() && widget->onScroll(ev)) + break; + } + } + + void onPuglReshape(const int width, const int height) + { + DBGp("PUGL: onReshape : %i %i\n", width, height); + + if (width <= 1 && height <= 1) + return; + + fWidth = static_cast(width); + fHeight = static_cast(height); + + fSelf->onReshape(fWidth, fHeight); + + FOR_EACH_WIDGET(it) + { + Widget* const widget(*it); + + if (widget->pData->needsFullViewport) + widget->setSize(fWidth, fHeight); + } + } + + void onPuglClose() + { + DBG("PUGL: onClose\n"); + + if (fModal.enabled) + exec_fini(); + + fSelf->onClose(); + + if (fModal.childFocus != nullptr) + fModal.childFocus->fSelf->onClose(); + + close(); + } + + // ------------------------------------------------------------------- + + Application& fApp; + Window* fSelf; + PuglView* fView; + + bool fFirstInit; + bool fVisible; + bool fResizable; + bool fUsingEmbed; + uint fWidth; + uint fHeight; + char* fTitle; + std::list fWidgets; + + struct Modal { + bool enabled; + PrivateData* parent; + PrivateData* childFocus; + + Modal() + : enabled(false), + parent(nullptr), + childFocus(nullptr) {} + + Modal(PrivateData* const p) + : enabled(false), + parent(p), + childFocus(nullptr) {} + + ~Modal() + { + DISTRHO_SAFE_ASSERT(! enabled); + DISTRHO_SAFE_ASSERT(childFocus == nullptr); + } + + DISTRHO_DECLARE_NON_COPY_STRUCT(Modal) + } fModal; + +#if defined(DISTRHO_OS_WINDOWS) + HWND hwnd; +#elif defined(DISTRHO_OS_LINUX) + Display* xDisplay; + ::Window xWindow; +#elif defined(DISTRHO_OS_MAC) + bool fNeedsIdle; + PuglOpenGLView* mView; + id mWindow; +#endif + + // ------------------------------------------------------------------- + // Callbacks + + #define handlePtr ((PrivateData*)puglGetHandle(view)) + + static void onDisplayCallback(PuglView* view) + { + handlePtr->onPuglDisplay(); + } + + static void onKeyboardCallback(PuglView* view, bool press, uint32_t key) + { + handlePtr->onPuglKeyboard(press, key); + } + + static void onSpecialCallback(PuglView* view, bool press, PuglKey key) + { + handlePtr->onPuglSpecial(press, static_cast(key)); + } + + static void onMouseCallback(PuglView* view, int button, bool press, int x, int y) + { + handlePtr->onPuglMouse(button, press, x, y); + } + + static void onMotionCallback(PuglView* view, int x, int y) + { + handlePtr->onPuglMotion(x, y); + } + + static void onScrollCallback(PuglView* view, int x, int y, float dx, float dy) + { + handlePtr->onPuglScroll(x, y, dx, dy); + } + + static void onReshapeCallback(PuglView* view, int width, int height) + { + handlePtr->onPuglReshape(width, height); + } + + static void onCloseCallback(PuglView* view) + { + handlePtr->onPuglClose(); + } + + static void fileBrowserSelectedCallback(PuglView* view, const char* filename) + { + handlePtr->fSelf->fileBrowserSelected(filename); + } + + #undef handlePtr + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PrivateData) +}; + +// ----------------------------------------------------------------------- +// Window + +Window::Window(Application& app) + : pData(new PrivateData(app, this)), + leakDetector_Window() {} + +Window::Window(Application& app, Window& parent) + : pData(new PrivateData(app, this, parent)), + leakDetector_Window() {} + +Window::Window(Application& app, intptr_t parentId) + : pData(new PrivateData(app, this, parentId)), + leakDetector_Window() {} + +Window::~Window() +{ + delete pData; +} + +void Window::show() +{ + pData->setVisible(true); +} + +void Window::hide() +{ + pData->setVisible(false); +} + +void Window::close() +{ + pData->close(); +} + +void Window::exec(bool lockWait) +{ + pData->exec(lockWait); +} + +void Window::focus() +{ + pData->focus(); +} + +void Window::repaint() noexcept +{ + puglPostRedisplay(pData->fView); +} + +// static int fib_filter_filename_filter(const char* const name) +// { +// return 1; +// (void)name; +// } + +bool Window::openFileBrowser(const FileBrowserOptions& options) +{ +#ifdef SOFD_HAVE_X11 + using DISTRHO_NAMESPACE::String; + + // -------------------------------------------------------------------------- + // configure start dir + + // TODO: get abspath if needed + // TODO: cross-platform + + String startDir(options.startDir); + + if (startDir.isEmpty()) + { + if (char* const dir_name = get_current_dir_name()) + { + startDir = dir_name; + std::free(dir_name); + } + } + + DISTRHO_SAFE_ASSERT_RETURN(startDir.isNotEmpty(), false); + + if (! startDir.endsWith('/')) + startDir += "/"; + + DISTRHO_SAFE_ASSERT_RETURN(x_fib_configure(0, startDir) == 0, false); + + // -------------------------------------------------------------------------- + // configure title + + String title(options.title); + + if (title.isEmpty()) + { + title = pData->getTitle(); + + if (title.isEmpty()) + title = "FileBrowser"; + } + + DISTRHO_SAFE_ASSERT_RETURN(x_fib_configure(1, title) == 0, false); + + // -------------------------------------------------------------------------- + // configure filters + + x_fib_cfg_filter_callback(nullptr); //fib_filter_filename_filter); + + // -------------------------------------------------------------------------- + // configure buttons + + x_fib_cfg_buttons(3, options.buttons.listAllFiles-1); + x_fib_cfg_buttons(1, options.buttons.showHidden-1); + x_fib_cfg_buttons(2, options.buttons.showPlaces-1); + + // -------------------------------------------------------------------------- + // show + + return (x_fib_show(pData->xDisplay, pData->xWindow, /*options.width*/0, /*options.height*/0) == 0); +#else + // not implemented + return false; +#endif +} + +bool Window::isVisible() const noexcept +{ + return pData->fVisible; +} + +void Window::setVisible(bool yesNo) +{ + pData->setVisible(yesNo); +} + +bool Window::isResizable() const noexcept +{ + return pData->fResizable; +} + +void Window::setResizable(bool yesNo) +{ + pData->setResizable(yesNo); +} + +uint Window::getWidth() const noexcept +{ + return pData->fWidth; +} + +uint Window::getHeight() const noexcept +{ + return pData->fHeight; +} + +Size Window::getSize() const noexcept +{ + return Size(pData->fWidth, pData->fHeight); +} + +void Window::setSize(uint width, uint height) +{ + pData->setSize(width, height); +} + +void Window::setSize(Size size) +{ + pData->setSize(size.getWidth(), size.getHeight()); +} + +const char* Window::getTitle() const noexcept +{ + return pData->getTitle(); +} + +void Window::setTitle(const char* title) +{ + pData->setTitle(title); +} + +void Window::setTransientWinId(uintptr_t winId) +{ + pData->setTransientWinId(winId); +} + +Application& Window::getApp() const noexcept +{ + return pData->fApp; +} + +intptr_t Window::getWindowId() const noexcept +{ + return puglGetNativeWindow(pData->fView); +} + +void Window::_addWidget(Widget* const widget) +{ + pData->addWidget(widget); +} + +void Window::_removeWidget(Widget* const widget) +{ + pData->removeWidget(widget); +} + +void Window::_idle() +{ + pData->idle(); +} + +// ----------------------------------------------------------------------- + +void Window::addIdleCallback(IdleCallback* const callback) +{ + DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,) + + pData->fApp.pData->idleCallbacks.push_back(callback); +} + +void Window::removeIdleCallback(IdleCallback* const callback) +{ + DISTRHO_SAFE_ASSERT_RETURN(callback != nullptr,) + + pData->fApp.pData->idleCallbacks.remove(callback); +} + +// ----------------------------------------------------------------------- + +void Window::onDisplayBefore() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glLoadIdentity(); +} + +void Window::onDisplayAfter() +{ +} + +void Window::onReshape(uint width, uint height) +{ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0, static_cast(width), static_cast(height), 0.0, 0.0, 1.0); + glViewport(0, 0, static_cast(width), static_cast(height)); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +void Window::onClose() +{ +} + +void Window::fileBrowserSelected(const char*) +{ +} + +// ----------------------------------------------------------------------- + +StandaloneWindow::StandaloneWindow() + : Application(), + Window((Application&)*this), + fWidget(nullptr) {} + +void StandaloneWindow::exec() +{ + Window::show(); + Application::exec(); +} + +void StandaloneWindow::onReshape(uint width, uint height) +{ + if (fWidget != nullptr) + fWidget->setSize(width, height); + Window::onReshape(width, height); +} + +void StandaloneWindow::_addWidget(Widget* widget) +{ + if (fWidget == nullptr) + { + fWidget = widget; + fWidget->pData->needsFullViewport = true; + } + Window::_addWidget(widget); +} + +void StandaloneWindow::_removeWidget(Widget* widget) +{ + if (fWidget == widget) + { + fWidget->pData->needsFullViewport = false; + fWidget = nullptr; + } + Window::_removeWidget(widget); +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DGL + +#undef DBG +#undef DBGF diff --git a/dpf/dgl/src/nanovg/LICENSE.txt b/dpf/dgl/src/nanovg/LICENSE.txt new file mode 100644 index 0000000..2a03a1a --- /dev/null +++ b/dpf/dgl/src/nanovg/LICENSE.txt @@ -0,0 +1,18 @@ +Copyright (c) 2013 Mikko Mononen memon@inside.org + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + diff --git a/dpf/dgl/src/nanovg/fontstash.h b/dpf/dgl/src/nanovg/fontstash.h new file mode 100644 index 0000000..79e2f82 --- /dev/null +++ b/dpf/dgl/src/nanovg/fontstash.h @@ -0,0 +1,1691 @@ +// +// Copyright (c) 2009-2013 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef FONS_H +#define FONS_H + +#define FONS_INVALID -1 + +enum FONSflags { + FONS_ZERO_TOPLEFT = 1, + FONS_ZERO_BOTTOMLEFT = 2, +}; + +enum FONSalign { + // Horizontal align + FONS_ALIGN_LEFT = 1<<0, // Default + FONS_ALIGN_CENTER = 1<<1, + FONS_ALIGN_RIGHT = 1<<2, + // Vertical align + FONS_ALIGN_TOP = 1<<3, + FONS_ALIGN_MIDDLE = 1<<4, + FONS_ALIGN_BOTTOM = 1<<5, + FONS_ALIGN_BASELINE = 1<<6, // Default +}; + +enum FONSerrorCode { + // Font atlas is full. + FONS_ATLAS_FULL = 1, + // Scratch memory used to render glyphs is full, requested size reported in 'val', you may need to bump up FONS_SCRATCH_BUF_SIZE. + FONS_SCRATCH_FULL = 2, + // Calls to fonsPushState has created too large stack, if you need deep state stack bump up FONS_MAX_STATES. + FONS_STATES_OVERFLOW = 3, + // Trying to pop too many states fonsPopState(). + FONS_STATES_UNDERFLOW = 4, +}; + +struct FONSparams { + int width, height; + unsigned char flags; + void* userPtr; + int (*renderCreate)(void* uptr, int width, int height); + int (*renderResize)(void* uptr, int width, int height); + void (*renderUpdate)(void* uptr, int* rect, const unsigned char* data); + void (*renderDraw)(void* uptr, const float* verts, const float* tcoords, const unsigned int* colors, int nverts); + void (*renderDelete)(void* uptr); +}; +typedef struct FONSparams FONSparams; + +struct FONSquad +{ + float x0,y0,s0,t0; + float x1,y1,s1,t1; +}; +typedef struct FONSquad FONSquad; + +struct FONStextIter { + float x, y, nextx, nexty, scale, spacing; + unsigned int codepoint; + short isize, iblur; + struct FONSfont* font; + int prevGlyphIndex; + const char* str; + const char* next; + const char* end; + unsigned int utf8state; +}; +typedef struct FONStextIter FONStextIter; + +typedef struct FONScontext FONScontext; + +// Constructor and destructor. +FONScontext* fonsCreateInternal(FONSparams* params); +void fonsDeleteInternal(FONScontext* s); + +void fonsSetErrorCallback(FONScontext* s, void (*callback)(void* uptr, int error, int val), void* uptr); +// Returns current atlas size. +void fonsGetAtlasSize(FONScontext* s, int* width, int* height); +// Expands the atlas size. +int fonsExpandAtlas(FONScontext* s, int width, int height); +// Resets the whole stash. +int fonsResetAtlas(FONScontext* stash, int width, int height); + +// Add fonts +int fonsAddFont(FONScontext* s, const char* name, const char* path); +int fonsAddFontMem(FONScontext* s, const char* name, const unsigned char* data, int ndata, int freeData); +int fonsGetFontByName(FONScontext* s, const char* name); + +// State handling +void fonsPushState(FONScontext* s); +void fonsPopState(FONScontext* s); +void fonsClearState(FONScontext* s); + +// State setting +void fonsSetSize(FONScontext* s, float size); +void fonsSetColor(FONScontext* s, unsigned int color); +void fonsSetSpacing(FONScontext* s, float spacing); +void fonsSetBlur(FONScontext* s, float blur); +void fonsSetAlign(FONScontext* s, int align); +void fonsSetFont(FONScontext* s, int font); + +// Draw text +float fonsDrawText(FONScontext* s, float x, float y, const char* string, const char* end); + +// Measure text +float fonsTextBounds(FONScontext* s, float x, float y, const char* string, const char* end, float* bounds); +void fonsLineBounds(FONScontext* s, float y, float* miny, float* maxy); +void fonsVertMetrics(FONScontext* s, float* ascender, float* descender, float* lineh); + +// Text iterator +int fonsTextIterInit(FONScontext* stash, FONStextIter* iter, float x, float y, const char* str, const char* end); +int fonsTextIterNext(FONScontext* stash, FONStextIter* iter, struct FONSquad* quad); + +// Pull texture changes +const unsigned char* fonsGetTextureData(FONScontext* stash, int* width, int* height); +int fonsValidateTexture(FONScontext* s, int* dirty); + +// Draws the stash texture for debugging +void fonsDrawDebug(FONScontext* s, float x, float y); + +#endif // FONTSTASH_H + + +#ifdef FONTSTASH_IMPLEMENTATION + +#define FONS_NOTUSED(v) (void)sizeof(v) + +#ifdef FONS_USE_FREETYPE + +#include +#include FT_FREETYPE_H +#include FT_ADVANCES_H +#include + +struct FONSttFontImpl { + FT_Face font; +}; +typedef struct FONSttFontImpl FONSttFontImpl; + +static FT_Library ftLibrary; + +int fons__tt_init(FONScontext *context) +{ + FT_Error ftError; + FONS_NOTUSED(context); + ftError = FT_Init_FreeType(&ftLibrary); + return ftError == 0; +} + +int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, const unsigned char *data, int dataSize) +{ + FT_Error ftError; + FONS_NOTUSED(context); + + //font->font.userdata = stash; + ftError = FT_New_Memory_Face(ftLibrary, (const FT_Byte*)data, dataSize, 0, &font->font); + return ftError == 0; +} + +void fons__tt_getFontVMetrics(FONSttFontImpl *font, int *ascent, int *descent, int *lineGap) +{ + *ascent = font->font->ascender; + *descent = font->font->descender; + *lineGap = font->font->height - (*ascent - *descent); +} + +float fons__tt_getPixelHeightScale(FONSttFontImpl *font, float size) +{ + return size / (font->font->ascender - font->font->descender); +} + +int fons__tt_getGlyphIndex(FONSttFontImpl *font, int codepoint) +{ + return FT_Get_Char_Index(font->font, codepoint); +} + +int fons__tt_buildGlyphBitmap(FONSttFontImpl *font, int glyph, float size, float scale, + int *advance, int *lsb, int *x0, int *y0, int *x1, int *y1) +{ + FT_Error ftError; + FT_GlyphSlot ftGlyph; + FONS_NOTUSED(scale); + + ftError = FT_Set_Pixel_Sizes(font->font, 0, (FT_UInt)(size * (float)font->font->units_per_EM / (float)(font->font->ascender - font->font->descender))); + if (ftError) return 0; + ftError = FT_Load_Glyph(font->font, glyph, FT_LOAD_RENDER); + if (ftError) return 0; + ftError = FT_Get_Advance(font->font, glyph, FT_LOAD_NO_SCALE, (FT_Fixed*)advance); + if (ftError) return 0; + ftGlyph = font->font->glyph; + *lsb = ftGlyph->metrics.horiBearingX; + *x0 = ftGlyph->bitmap_left; + *x1 = *x0 + ftGlyph->bitmap.width; + *y0 = -ftGlyph->bitmap_top; + *y1 = *y0 + ftGlyph->bitmap.rows; + return 1; +} + +void fons__tt_renderGlyphBitmap(FONSttFontImpl *font, unsigned char *output, int outWidth, int outHeight, int outStride, + float scaleX, float scaleY, int glyph) +{ + FT_GlyphSlot ftGlyph = font->font->glyph; + int ftGlyphOffset = 0; + int x, y; + FONS_NOTUSED(outWidth); + FONS_NOTUSED(outHeight); + FONS_NOTUSED(scaleX); + FONS_NOTUSED(scaleY); + FONS_NOTUSED(glyph); // glyph has already been loaded by fons__tt_buildGlyphBitmap + + for ( y = 0; y < ftGlyph->bitmap.rows; y++ ) { + for ( x = 0; x < ftGlyph->bitmap.width; x++ ) { + output[(y * outStride) + x] = ftGlyph->bitmap.buffer[ftGlyphOffset++]; + } + } +} + +int fons__tt_getGlyphKernAdvance(FONSttFontImpl *font, int glyph1, int glyph2) +{ + FT_Vector ftKerning; + FT_Get_Kerning(font->font, glyph1, glyph2, FT_KERNING_DEFAULT, &ftKerning); + return ftKerning.x; +} + +#else + +#define STB_TRUETYPE_IMPLEMENTATION +static void* fons__tmpalloc(size_t size, void* up); +static void fons__tmpfree(void* ptr, void* up); +#define STBTT_malloc(x,u) fons__tmpalloc(x,u) +#define STBTT_free(x,u) fons__tmpfree(x,u) +#include "stb_truetype.h" + +struct FONSttFontImpl { + stbtt_fontinfo font; +}; +typedef struct FONSttFontImpl FONSttFontImpl; + +int fons__tt_init(FONScontext *context) +{ + FONS_NOTUSED(context); + return 1; +} + +int fons__tt_loadFont(FONScontext *context, FONSttFontImpl *font, const unsigned char *data, int dataSize) +{ + int stbError; + FONS_NOTUSED(dataSize); + + font->font.userdata = context; + stbError = stbtt_InitFont(&font->font, data, 0); + return stbError; +} + +void fons__tt_getFontVMetrics(FONSttFontImpl *font, int *ascent, int *descent, int *lineGap) +{ + stbtt_GetFontVMetrics(&font->font, ascent, descent, lineGap); +} + +float fons__tt_getPixelHeightScale(FONSttFontImpl *font, float size) +{ + return stbtt_ScaleForPixelHeight(&font->font, size); +} + +int fons__tt_getGlyphIndex(FONSttFontImpl *font, int codepoint) +{ + return stbtt_FindGlyphIndex(&font->font, codepoint); +} + +int fons__tt_buildGlyphBitmap(FONSttFontImpl *font, int glyph, float size, float scale, + int *advance, int *lsb, int *x0, int *y0, int *x1, int *y1) +{ + FONS_NOTUSED(size); + stbtt_GetGlyphHMetrics(&font->font, glyph, advance, lsb); + stbtt_GetGlyphBitmapBox(&font->font, glyph, scale, scale, x0, y0, x1, y1); + return 1; +} + +void fons__tt_renderGlyphBitmap(FONSttFontImpl *font, unsigned char *output, int outWidth, int outHeight, int outStride, + float scaleX, float scaleY, int glyph) +{ + stbtt_MakeGlyphBitmap(&font->font, output, outWidth, outHeight, outStride, scaleX, scaleY, glyph); +} + +int fons__tt_getGlyphKernAdvance(FONSttFontImpl *font, int glyph1, int glyph2) +{ + return stbtt_GetGlyphKernAdvance(&font->font, glyph1, glyph2); +} + +#endif + +#ifndef FONS_SCRATCH_BUF_SIZE +# define FONS_SCRATCH_BUF_SIZE 16000 +#endif +#ifndef FONS_HASH_LUT_SIZE +# define FONS_HASH_LUT_SIZE 256 +#endif +#ifndef FONS_INIT_FONTS +# define FONS_INIT_FONTS 4 +#endif +#ifndef FONS_INIT_GLYPHS +# define FONS_INIT_GLYPHS 256 +#endif +#ifndef FONS_INIT_ATLAS_NODES +# define FONS_INIT_ATLAS_NODES 256 +#endif +#ifndef FONS_VERTEX_COUNT +# define FONS_VERTEX_COUNT 1024 +#endif +#ifndef FONS_MAX_STATES +# define FONS_MAX_STATES 20 +#endif + +static unsigned int fons__hashint(unsigned int a) +{ + a += ~(a<<15); + a ^= (a>>10); + a += (a<<3); + a ^= (a>>6); + a += ~(a<<11); + a ^= (a>>16); + return a; +} + +static int fons__mini(int a, int b) +{ + return a < b ? a : b; +} + +static int fons__maxi(int a, int b) +{ + return a > b ? a : b; +} + +struct FONSglyph +{ + unsigned int codepoint; + int index; + int next; + short size, blur; + short x0,y0,x1,y1; + short xadv,xoff,yoff; +}; +typedef struct FONSglyph FONSglyph; + +struct FONSfont +{ + FONSttFontImpl font; + char name[64]; + const unsigned char* data; + int dataSize; + unsigned char freeData; + float ascender; + float descender; + float lineh; + FONSglyph* glyphs; + int cglyphs; + int nglyphs; + int lut[FONS_HASH_LUT_SIZE]; +}; +typedef struct FONSfont FONSfont; + +struct FONSstate +{ + int font; + int align; + float size; + unsigned int color; + float blur; + float spacing; +}; +typedef struct FONSstate FONSstate; + +struct FONSatlasNode { + short x, y, width; +}; +typedef struct FONSatlasNode FONSatlasNode; + +struct FONSatlas +{ + int width, height; + FONSatlasNode* nodes; + int nnodes; + int cnodes; +}; +typedef struct FONSatlas FONSatlas; + +struct FONScontext +{ + FONSparams params; + float itw,ith; + unsigned char* texData; + int dirtyRect[4]; + FONSfont** fonts; + FONSatlas* atlas; + int cfonts; + int nfonts; + float verts[FONS_VERTEX_COUNT*2]; + float tcoords[FONS_VERTEX_COUNT*2]; + unsigned int colors[FONS_VERTEX_COUNT]; + int nverts; + unsigned char* scratch; + int nscratch; + FONSstate states[FONS_MAX_STATES]; + int nstates; + void (*handleError)(void* uptr, int error, int val); + void* errorUptr; +}; + +static void* fons__tmpalloc(size_t size, void* up) +{ + unsigned char* ptr; + FONScontext* stash = (FONScontext*)up; + + // 16-byte align the returned pointer + size = (size + 0xf) & ~0xf; + + if (stash->nscratch+(int)size > FONS_SCRATCH_BUF_SIZE) { + if (stash->handleError) + stash->handleError(stash->errorUptr, FONS_SCRATCH_FULL, stash->nscratch+(int)size); + return NULL; + } + ptr = stash->scratch + stash->nscratch; + stash->nscratch += (int)size; + return ptr; +} + +static void fons__tmpfree(void* ptr, void* up) +{ + (void)ptr; + (void)up; + // empty +} + +// Copyright (c) 2008-2010 Bjoern Hoehrmann +// See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details. + +#define FONS_UTF8_ACCEPT 0 +#define FONS_UTF8_REJECT 12 + +static unsigned int fons__decutf8(unsigned int* state, unsigned int* codep, unsigned int byte) +{ + static const unsigned char utf8d[] = { + // The first part of the table maps bytes to character classes that + // to reduce the size of the transition table and create bitmasks. + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, + + // The second part is a transition table that maps a combination + // of a state of the automaton and a character class to a state. + 0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12, + 12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12, + 12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12, + 12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12, + 12,36,12,12,12,12,12,12,12,12,12,12, + }; + + unsigned int type = utf8d[byte]; + + *codep = (*state != FONS_UTF8_ACCEPT) ? + (byte & 0x3fu) | (*codep << 6) : + (0xff >> type) & (byte); + + *state = utf8d[256 + *state + type]; + return *state; +} + +// Atlas based on Skyline Bin Packer by Jukka Jylänki + +static void fons__deleteAtlas(FONSatlas* atlas) +{ + if (atlas == NULL) return; + if (atlas->nodes != NULL) free(atlas->nodes); + free(atlas); +} + +static FONSatlas* fons__allocAtlas(int w, int h, int nnodes) +{ + FONSatlas* atlas = NULL; + + // Allocate memory for the font stash. + atlas = (FONSatlas*)malloc(sizeof(FONSatlas)); + if (atlas == NULL) goto error; + memset(atlas, 0, sizeof(FONSatlas)); + + atlas->width = w; + atlas->height = h; + + // Allocate space for skyline nodes + atlas->nodes = (FONSatlasNode*)malloc(sizeof(FONSatlasNode) * nnodes); + if (atlas->nodes == NULL) goto error; + memset(atlas->nodes, 0, sizeof(FONSatlasNode) * nnodes); + atlas->nnodes = 0; + atlas->cnodes = nnodes; + + // Init root node. + atlas->nodes[0].x = 0; + atlas->nodes[0].y = 0; + atlas->nodes[0].width = (short)w; + atlas->nnodes++; + + return atlas; + +error: + if (atlas) fons__deleteAtlas(atlas); + return NULL; +} + +static int fons__atlasInsertNode(FONSatlas* atlas, int idx, int x, int y, int w) +{ + int i; + // Insert node + if (atlas->nnodes+1 > atlas->cnodes) { + atlas->cnodes = atlas->cnodes == 0 ? 8 : atlas->cnodes * 2; + atlas->nodes = (FONSatlasNode*)realloc(atlas->nodes, sizeof(FONSatlasNode) * atlas->cnodes); + if (atlas->nodes == NULL) + return 0; + } + for (i = atlas->nnodes; i > idx; i--) + atlas->nodes[i] = atlas->nodes[i-1]; + atlas->nodes[idx].x = (short)x; + atlas->nodes[idx].y = (short)y; + atlas->nodes[idx].width = (short)w; + atlas->nnodes++; + + return 1; +} + +static void fons__atlasRemoveNode(FONSatlas* atlas, int idx) +{ + int i; + if (atlas->nnodes == 0) return; + for (i = idx; i < atlas->nnodes-1; i++) + atlas->nodes[i] = atlas->nodes[i+1]; + atlas->nnodes--; +} + +static void fons__atlasExpand(FONSatlas* atlas, int w, int h) +{ + // Insert node for empty space + if (w > atlas->width) + fons__atlasInsertNode(atlas, atlas->nnodes, atlas->width, 0, w - atlas->width); + atlas->width = w; + atlas->height = h; +} + +static void fons__atlasReset(FONSatlas* atlas, int w, int h) +{ + atlas->width = w; + atlas->height = h; + atlas->nnodes = 0; + + // Init root node. + atlas->nodes[0].x = 0; + atlas->nodes[0].y = 0; + atlas->nodes[0].width = (short)w; + atlas->nnodes++; +} + +static int fons__atlasAddSkylineLevel(FONSatlas* atlas, int idx, int x, int y, int w, int h) +{ + int i; + + // Insert new node + if (fons__atlasInsertNode(atlas, idx, x, y+h, w) == 0) + return 0; + + // Delete skyline segments that fall under the shadow of the new segment. + for (i = idx+1; i < atlas->nnodes; i++) { + if (atlas->nodes[i].x < atlas->nodes[i-1].x + atlas->nodes[i-1].width) { + int shrink = atlas->nodes[i-1].x + atlas->nodes[i-1].width - atlas->nodes[i].x; + atlas->nodes[i].x += (short)shrink; + atlas->nodes[i].width -= (short)shrink; + if (atlas->nodes[i].width <= 0) { + fons__atlasRemoveNode(atlas, i); + i--; + } else { + break; + } + } else { + break; + } + } + + // Merge same height skyline segments that are next to each other. + for (i = 0; i < atlas->nnodes-1; i++) { + if (atlas->nodes[i].y == atlas->nodes[i+1].y) { + atlas->nodes[i].width += atlas->nodes[i+1].width; + fons__atlasRemoveNode(atlas, i+1); + i--; + } + } + + return 1; +} + +static int fons__atlasRectFits(FONSatlas* atlas, int i, int w, int h) +{ + // Checks if there is enough space at the location of skyline span 'i', + // and return the max height of all skyline spans under that at that location, + // (think tetris block being dropped at that position). Or -1 if no space found. + int x = atlas->nodes[i].x; + int y = atlas->nodes[i].y; + int spaceLeft; + if (x + w > atlas->width) + return -1; + spaceLeft = w; + while (spaceLeft > 0) { + if (i == atlas->nnodes) return -1; + y = fons__maxi(y, atlas->nodes[i].y); + if (y + h > atlas->height) return -1; + spaceLeft -= atlas->nodes[i].width; + ++i; + } + return y; +} + +static int fons__atlasAddRect(FONSatlas* atlas, int rw, int rh, int* rx, int* ry) +{ + int besth = atlas->height, bestw = atlas->width, besti = -1; + int bestx = -1, besty = -1, i; + + // Bottom left fit heuristic. + for (i = 0; i < atlas->nnodes; i++) { + int y = fons__atlasRectFits(atlas, i, rw, rh); + if (y != -1) { + if (y + rh < besth || (y + rh == besth && atlas->nodes[i].width < bestw)) { + besti = i; + bestw = atlas->nodes[i].width; + besth = y + rh; + bestx = atlas->nodes[i].x; + besty = y; + } + } + } + + if (besti == -1) + return 0; + + // Perform the actual packing. + if (fons__atlasAddSkylineLevel(atlas, besti, bestx, besty, rw, rh) == 0) + return 0; + + *rx = bestx; + *ry = besty; + + return 1; +} + +static void fons__addWhiteRect(FONScontext* stash, int w, int h) +{ + int x, y, gx, gy; + unsigned char* dst; + if (fons__atlasAddRect(stash->atlas, w, h, &gx, &gy) == 0) + return; + + // Rasterize + dst = &stash->texData[gx + gy * stash->params.width]; + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) + dst[x] = 0xff; + dst += stash->params.width; + } + + stash->dirtyRect[0] = fons__mini(stash->dirtyRect[0], gx); + stash->dirtyRect[1] = fons__mini(stash->dirtyRect[1], gy); + stash->dirtyRect[2] = fons__maxi(stash->dirtyRect[2], gx+w); + stash->dirtyRect[3] = fons__maxi(stash->dirtyRect[3], gy+h); +} + +FONScontext* fonsCreateInternal(FONSparams* params) +{ + FONScontext* stash = NULL; + + // Allocate memory for the font stash. + stash = (FONScontext*)malloc(sizeof(FONScontext)); + if (stash == NULL) goto error; + memset(stash, 0, sizeof(FONScontext)); + + stash->params = *params; + + // Allocate scratch buffer. + stash->scratch = (unsigned char*)malloc(FONS_SCRATCH_BUF_SIZE); + if (stash->scratch == NULL) goto error; + + // Initialize implementation library + if (!fons__tt_init(stash)) goto error; + + if (stash->params.renderCreate != NULL) { + if (stash->params.renderCreate(stash->params.userPtr, stash->params.width, stash->params.height) == 0) + goto error; + } + + stash->atlas = fons__allocAtlas(stash->params.width, stash->params.height, FONS_INIT_ATLAS_NODES); + if (stash->atlas == NULL) goto error; + + // Allocate space for fonts. + stash->fonts = (FONSfont**)malloc(sizeof(FONSfont*) * FONS_INIT_FONTS); + if (stash->fonts == NULL) goto error; + memset(stash->fonts, 0, sizeof(FONSfont*) * FONS_INIT_FONTS); + stash->cfonts = FONS_INIT_FONTS; + stash->nfonts = 0; + + // Create texture for the cache. + stash->itw = 1.0f/stash->params.width; + stash->ith = 1.0f/stash->params.height; + stash->texData = (unsigned char*)malloc(stash->params.width * stash->params.height); + if (stash->texData == NULL) goto error; + memset(stash->texData, 0, stash->params.width * stash->params.height); + + stash->dirtyRect[0] = stash->params.width; + stash->dirtyRect[1] = stash->params.height; + stash->dirtyRect[2] = 0; + stash->dirtyRect[3] = 0; + + // Add white rect at 0,0 for debug drawing. + fons__addWhiteRect(stash, 2,2); + + fonsPushState(stash); + fonsClearState(stash); + + return stash; + +error: + fonsDeleteInternal(stash); + return NULL; +} + +static FONSstate* fons__getState(FONScontext* stash) +{ + return &stash->states[stash->nstates-1]; +} + +void fonsSetSize(FONScontext* stash, float size) +{ + fons__getState(stash)->size = size; +} + +void fonsSetColor(FONScontext* stash, unsigned int color) +{ + fons__getState(stash)->color = color; +} + +void fonsSetSpacing(FONScontext* stash, float spacing) +{ + fons__getState(stash)->spacing = spacing; +} + +void fonsSetBlur(FONScontext* stash, float blur) +{ + fons__getState(stash)->blur = blur; +} + +void fonsSetAlign(FONScontext* stash, int align) +{ + fons__getState(stash)->align = align; +} + +void fonsSetFont(FONScontext* stash, int font) +{ + fons__getState(stash)->font = font; +} + +void fonsPushState(FONScontext* stash) +{ + if (stash->nstates >= FONS_MAX_STATES) { + if (stash->handleError) + stash->handleError(stash->errorUptr, FONS_STATES_OVERFLOW, 0); + return; + } + if (stash->nstates > 0) + memcpy(&stash->states[stash->nstates], &stash->states[stash->nstates-1], sizeof(FONSstate)); + stash->nstates++; +} + +void fonsPopState(FONScontext* stash) +{ + if (stash->nstates <= 1) { + if (stash->handleError) + stash->handleError(stash->errorUptr, FONS_STATES_UNDERFLOW, 0); + return; + } + stash->nstates--; +} + +void fonsClearState(FONScontext* stash) +{ + FONSstate* state = fons__getState(stash); + state->size = 12.0f; + state->color = 0xffffffff; + state->font = 0; + state->blur = 0; + state->spacing = 0; + state->align = FONS_ALIGN_LEFT | FONS_ALIGN_BASELINE; +} + +static void fons__freeFont(FONSfont* font) +{ + if (font == NULL) return; + if (font->glyphs) free(font->glyphs); + if (font->freeData && font->data) free((void*)font->data); + free(font); +} + +static int fons__allocFont(FONScontext* stash) +{ + FONSfont* font = NULL; + if (stash->nfonts+1 > stash->cfonts) { + stash->cfonts = stash->cfonts == 0 ? 8 : stash->cfonts * 2; + stash->fonts = (FONSfont**)realloc(stash->fonts, sizeof(FONSfont*) * stash->cfonts); + if (stash->fonts == NULL) + return -1; + } + font = (FONSfont*)malloc(sizeof(FONSfont)); + if (font == NULL) goto error; + memset(font, 0, sizeof(FONSfont)); + + font->glyphs = (FONSglyph*)malloc(sizeof(FONSglyph) * FONS_INIT_GLYPHS); + if (font->glyphs == NULL) goto error; + font->cglyphs = FONS_INIT_GLYPHS; + font->nglyphs = 0; + + stash->fonts[stash->nfonts++] = font; + return stash->nfonts-1; + +error: + fons__freeFont(font); + + return FONS_INVALID; +} + +int fonsAddFont(FONScontext* stash, const char* name, const char* path) +{ + FILE* fp = 0; + int dataSize = 0; + unsigned char* data = NULL; + size_t ignore; + + // Read in the font data. + fp = fopen(path, "rb"); + if (fp == NULL) goto error; + fseek(fp,0,SEEK_END); + dataSize = (int)ftell(fp); + fseek(fp,0,SEEK_SET); + data = (unsigned char*)malloc(dataSize); + if (data == NULL) goto error; + ignore = fread(data, 1, dataSize, fp); + fclose(fp); + fp = 0; + + return fonsAddFontMem(stash, name, data, dataSize, 1); + +error: + if (data) free(data); + if (fp) fclose(fp); + return FONS_INVALID; + + FONS_NOTUSED(ignore); +} + +int fonsAddFontMem(FONScontext* stash, const char* name, const unsigned char* data, int dataSize, int freeData) +{ + int i, ascent, descent, fh, lineGap; + FONSfont* font; + + int idx = fons__allocFont(stash); + if (idx == FONS_INVALID) + return FONS_INVALID; + + font = stash->fonts[idx]; + + strncpy(font->name, name, sizeof(font->name)); + font->name[sizeof(font->name)-1] = '\0'; + + // Init hash lookup. + for (i = 0; i < FONS_HASH_LUT_SIZE; ++i) + font->lut[i] = -1; + + // Read in the font data. + font->dataSize = dataSize; + font->data = data; + font->freeData = (unsigned char)freeData; + + // Init font + stash->nscratch = 0; + if (!fons__tt_loadFont(stash, &font->font, data, dataSize)) goto error; + + // Store normalized line height. The real line height is got + // by multiplying the lineh by font size. + fons__tt_getFontVMetrics( &font->font, &ascent, &descent, &lineGap); + fh = ascent - descent; + font->ascender = (float)ascent / (float)fh; + font->descender = (float)descent / (float)fh; + font->lineh = (float)(fh + lineGap) / (float)fh; + + return idx; + +error: + fons__freeFont(font); + stash->nfonts--; + return FONS_INVALID; +} + +int fonsGetFontByName(FONScontext* s, const char* name) +{ + int i; + for (i = 0; i < s->nfonts; i++) { + if (strcmp(s->fonts[i]->name, name) == 0) + return i; + } + return FONS_INVALID; +} + + +static FONSglyph* fons__allocGlyph(FONSfont* font) +{ + if (font->nglyphs+1 > font->cglyphs) { + font->cglyphs = font->cglyphs == 0 ? 8 : font->cglyphs * 2; + font->glyphs = (FONSglyph*)realloc(font->glyphs, sizeof(FONSglyph) * font->cglyphs); + if (font->glyphs == NULL) return NULL; + } + font->nglyphs++; + return &font->glyphs[font->nglyphs-1]; +} + + +// Based on Exponential blur, Jani Huhtanen, 2006 + +#define APREC 16 +#define ZPREC 7 + +static void fons__blurCols(unsigned char* dst, int w, int h, int dstStride, int alpha) +{ + int x, y; + for (y = 0; y < h; y++) { + int z = 0; // force zero border + for (x = 1; x < w; x++) { + z += (alpha * (((int)(dst[x]) << ZPREC) - z)) >> APREC; + dst[x] = (unsigned char)(z >> ZPREC); + } + dst[w-1] = 0; // force zero border + z = 0; + for (x = w-2; x >= 0; x--) { + z += (alpha * (((int)(dst[x]) << ZPREC) - z)) >> APREC; + dst[x] = (unsigned char)(z >> ZPREC); + } + dst[0] = 0; // force zero border + dst += dstStride; + } +} + +static void fons__blurRows(unsigned char* dst, int w, int h, int dstStride, int alpha) +{ + int x, y; + for (x = 0; x < w; x++) { + int z = 0; // force zero border + for (y = dstStride; y < h*dstStride; y += dstStride) { + z += (alpha * (((int)(dst[y]) << ZPREC) - z)) >> APREC; + dst[y] = (unsigned char)(z >> ZPREC); + } + dst[(h-1)*dstStride] = 0; // force zero border + z = 0; + for (y = (h-2)*dstStride; y >= 0; y -= dstStride) { + z += (alpha * (((int)(dst[y]) << ZPREC) - z)) >> APREC; + dst[y] = (unsigned char)(z >> ZPREC); + } + dst[0] = 0; // force zero border + dst++; + } +} + + +static void fons__blur(FONScontext* stash, unsigned char* dst, int w, int h, int dstStride, int blur) +{ + int alpha; + float sigma; + (void)stash; + + if (blur < 1) + return; + // Calculate the alpha such that 90% of the kernel is within the radius. (Kernel extends to infinity) + sigma = (float)blur * 0.57735f; // 1 / sqrt(3) + alpha = (int)((1< 20) iblur = 20; + pad = iblur+2; + + // Reset allocator. + stash->nscratch = 0; + + // Find code point and size. + h = fons__hashint(codepoint) & (FONS_HASH_LUT_SIZE-1); + i = font->lut[h]; + while (i != -1) { + if (font->glyphs[i].codepoint == codepoint && font->glyphs[i].size == isize && font->glyphs[i].blur == iblur) + return &font->glyphs[i]; + i = font->glyphs[i].next; + } + + // Could not find glyph, create it. + scale = fons__tt_getPixelHeightScale(&font->font, size); + g = fons__tt_getGlyphIndex(&font->font, codepoint); + fons__tt_buildGlyphBitmap(&font->font, g, size, scale, &advance, &lsb, &x0, &y0, &x1, &y1); + gw = x1-x0 + pad*2; + gh = y1-y0 + pad*2; + + // Find free spot for the rect in the atlas + added = fons__atlasAddRect(stash->atlas, gw, gh, &gx, &gy); + if (added == 0 && stash->handleError != NULL) { + // Atlas is full, let the user to resize the atlas (or not), and try again. + stash->handleError(stash->errorUptr, FONS_ATLAS_FULL, 0); + added = fons__atlasAddRect(stash->atlas, gw, gh, &gx, &gy); + } + if (added == 0) return NULL; + + // Init glyph. + glyph = fons__allocGlyph(font); + glyph->codepoint = codepoint; + glyph->size = isize; + glyph->blur = iblur; + glyph->index = g; + glyph->x0 = (short)gx; + glyph->y0 = (short)gy; + glyph->x1 = (short)(glyph->x0+gw); + glyph->y1 = (short)(glyph->y0+gh); + glyph->xadv = (short)(scale * advance * 10.0f); + glyph->xoff = (short)(x0 - pad); + glyph->yoff = (short)(y0 - pad); + glyph->next = 0; + + // Insert char to hash lookup. + glyph->next = font->lut[h]; + font->lut[h] = font->nglyphs-1; + + // Rasterize + dst = &stash->texData[(glyph->x0+pad) + (glyph->y0+pad) * stash->params.width]; + fons__tt_renderGlyphBitmap(&font->font, dst, gw-pad*2,gh-pad*2, stash->params.width, scale,scale, g); + + // Make sure there is one pixel empty border. + dst = &stash->texData[glyph->x0 + glyph->y0 * stash->params.width]; + for (y = 0; y < gh; y++) { + dst[y*stash->params.width] = 0; + dst[gw-1 + y*stash->params.width] = 0; + } + for (x = 0; x < gw; x++) { + dst[x] = 0; + dst[x + (gh-1)*stash->params.width] = 0; + } + + // Debug code to color the glyph background +/* unsigned char* fdst = &stash->texData[glyph->x0 + glyph->y0 * stash->params.width]; + for (y = 0; y < gh; y++) { + for (x = 0; x < gw; x++) { + int a = (int)fdst[x+y*stash->params.width] + 20; + if (a > 255) a = 255; + fdst[x+y*stash->params.width] = a; + } + }*/ + + // Blur + if (iblur > 0) { + stash->nscratch = 0; + bdst = &stash->texData[glyph->x0 + glyph->y0 * stash->params.width]; + fons__blur(stash, bdst, gw,gh, stash->params.width, iblur); + } + + stash->dirtyRect[0] = fons__mini(stash->dirtyRect[0], glyph->x0); + stash->dirtyRect[1] = fons__mini(stash->dirtyRect[1], glyph->y0); + stash->dirtyRect[2] = fons__maxi(stash->dirtyRect[2], glyph->x1); + stash->dirtyRect[3] = fons__maxi(stash->dirtyRect[3], glyph->y1); + + return glyph; +} + +static void fons__getQuad(FONScontext* stash, FONSfont* font, + int prevGlyphIndex, FONSglyph* glyph, + float scale, float spacing, float* x, float* y, FONSquad* q) +{ + float rx,ry,xoff,yoff,x0,y0,x1,y1; + + if (prevGlyphIndex != -1) { + float adv = fons__tt_getGlyphKernAdvance(&font->font, prevGlyphIndex, glyph->index) * scale; + *x += (int)(adv + spacing + 0.5f); + } + + // Each glyph has 2px border to allow good interpolation, + // one pixel to prevent leaking, and one to allow good interpolation for rendering. + // Inset the texture region by one pixel for correct interpolation. + xoff = (short)(glyph->xoff+1); + yoff = (short)(glyph->yoff+1); + x0 = (float)(glyph->x0+1); + y0 = (float)(glyph->y0+1); + x1 = (float)(glyph->x1-1); + y1 = (float)(glyph->y1-1); + + if (stash->params.flags & FONS_ZERO_TOPLEFT) { + rx = (float)(int)(*x + xoff); + ry = (float)(int)(*y + yoff); + + q->x0 = rx; + q->y0 = ry; + q->x1 = rx + x1 - x0; + q->y1 = ry + y1 - y0; + + q->s0 = x0 * stash->itw; + q->t0 = y0 * stash->ith; + q->s1 = x1 * stash->itw; + q->t1 = y1 * stash->ith; + } else { + rx = (float)(int)(*x + xoff); + ry = (float)(int)(*y - yoff); + + q->x0 = rx; + q->y0 = ry; + q->x1 = rx + x1 - x0; + q->y1 = ry - y1 + y0; + + q->s0 = x0 * stash->itw; + q->t0 = y0 * stash->ith; + q->s1 = x1 * stash->itw; + q->t1 = y1 * stash->ith; + } + + *x += (int)(glyph->xadv / 10.0f + 0.5f); +} + +static void fons__flush(FONScontext* stash) +{ + // Flush texture + if (stash->dirtyRect[0] < stash->dirtyRect[2] && stash->dirtyRect[1] < stash->dirtyRect[3]) { + if (stash->params.renderUpdate != NULL) + stash->params.renderUpdate(stash->params.userPtr, stash->dirtyRect, stash->texData); + // Reset dirty rect + stash->dirtyRect[0] = stash->params.width; + stash->dirtyRect[1] = stash->params.height; + stash->dirtyRect[2] = 0; + stash->dirtyRect[3] = 0; + } + + // Flush triangles + if (stash->nverts > 0) { + if (stash->params.renderDraw != NULL) + stash->params.renderDraw(stash->params.userPtr, stash->verts, stash->tcoords, stash->colors, stash->nverts); + stash->nverts = 0; + } +} + +static __inline void fons__vertex(FONScontext* stash, float x, float y, float s, float t, unsigned int c) +{ + stash->verts[stash->nverts*2+0] = x; + stash->verts[stash->nverts*2+1] = y; + stash->tcoords[stash->nverts*2+0] = s; + stash->tcoords[stash->nverts*2+1] = t; + stash->colors[stash->nverts] = c; + stash->nverts++; +} + +static float fons__getVertAlign(FONScontext* stash, FONSfont* font, int align, short isize) +{ + if (stash->params.flags & FONS_ZERO_TOPLEFT) { + if (align & FONS_ALIGN_TOP) { + return font->ascender * (float)isize/10.0f; + } else if (align & FONS_ALIGN_MIDDLE) { + return (font->ascender + font->descender) / 2.0f * (float)isize/10.0f; + } else if (align & FONS_ALIGN_BASELINE) { + return 0.0f; + } else if (align & FONS_ALIGN_BOTTOM) { + return font->descender * (float)isize/10.0f; + } + } else { + if (align & FONS_ALIGN_TOP) { + return -font->ascender * (float)isize/10.0f; + } else if (align & FONS_ALIGN_MIDDLE) { + return -(font->ascender + font->descender) / 2.0f * (float)isize/10.0f; + } else if (align & FONS_ALIGN_BASELINE) { + return 0.0f; + } else if (align & FONS_ALIGN_BOTTOM) { + return -font->descender * (float)isize/10.0f; + } + } + return 0.0; +} + +float fonsDrawText(FONScontext* stash, + float x, float y, + const char* str, const char* end) +{ + FONSstate* state = fons__getState(stash); + unsigned int codepoint; + unsigned int utf8state = 0; + FONSglyph* glyph = NULL; + FONSquad q; + int prevGlyphIndex = -1; + short isize = (short)(state->size*10.0f); + short iblur = (short)state->blur; + float scale; + FONSfont* font; + float width; + + if (stash == NULL) return x; + if (state->font < 0 || state->font >= stash->nfonts) return x; + font = stash->fonts[state->font]; + if (font->data == NULL) return x; + + scale = fons__tt_getPixelHeightScale(&font->font, (float)isize/10.0f); + + if (end == NULL) + end = str + strlen(str); + + // Align horizontally + if (state->align & FONS_ALIGN_LEFT) { + // empty + } else if (state->align & FONS_ALIGN_RIGHT) { + width = fonsTextBounds(stash, x,y, str, end, NULL); + x -= width; + } else if (state->align & FONS_ALIGN_CENTER) { + width = fonsTextBounds(stash, x,y, str, end, NULL); + x -= width * 0.5f; + } + // Align vertically. + y += fons__getVertAlign(stash, font, state->align, isize); + + for (; str != end; ++str) { + if (fons__decutf8(&utf8state, &codepoint, *(const unsigned char*)str)) + continue; + glyph = fons__getGlyph(stash, font, codepoint, isize, iblur); + if (glyph != NULL) { + fons__getQuad(stash, font, prevGlyphIndex, glyph, scale, state->spacing, &x, &y, &q); + + if (stash->nverts+6 > FONS_VERTEX_COUNT) + fons__flush(stash); + + fons__vertex(stash, q.x0, q.y0, q.s0, q.t0, state->color); + fons__vertex(stash, q.x1, q.y1, q.s1, q.t1, state->color); + fons__vertex(stash, q.x1, q.y0, q.s1, q.t0, state->color); + + fons__vertex(stash, q.x0, q.y0, q.s0, q.t0, state->color); + fons__vertex(stash, q.x0, q.y1, q.s0, q.t1, state->color); + fons__vertex(stash, q.x1, q.y1, q.s1, q.t1, state->color); + } + prevGlyphIndex = glyph != NULL ? glyph->index : -1; + } + fons__flush(stash); + + return x; +} + +int fonsTextIterInit(FONScontext* stash, FONStextIter* iter, + float x, float y, const char* str, const char* end) +{ + FONSstate* state = fons__getState(stash); + float width; + + memset(iter, 0, sizeof(*iter)); + + if (stash == NULL) return 0; + if (state->font < 0 || state->font >= stash->nfonts) return 0; + iter->font = stash->fonts[state->font]; + if (iter->font->data == NULL) return 0; + + iter->isize = (short)(state->size*10.0f); + iter->iblur = (short)state->blur; + iter->scale = fons__tt_getPixelHeightScale(&iter->font->font, (float)iter->isize/10.0f); + + // Align horizontally + if (state->align & FONS_ALIGN_LEFT) { + // empty + } else if (state->align & FONS_ALIGN_RIGHT) { + width = fonsTextBounds(stash, x,y, str, end, NULL); + x -= width; + } else if (state->align & FONS_ALIGN_CENTER) { + width = fonsTextBounds(stash, x,y, str, end, NULL); + x -= width * 0.5f; + } + // Align vertically. + y += fons__getVertAlign(stash, iter->font, state->align, iter->isize); + + if (end == NULL) + end = str + strlen(str); + + iter->x = iter->nextx = x; + iter->y = iter->nexty = y; + iter->spacing = state->spacing; + iter->str = str; + iter->next = str; + iter->end = end; + iter->codepoint = 0; + iter->prevGlyphIndex = -1; + + return 1; +} + +int fonsTextIterNext(FONScontext* stash, FONStextIter* iter, FONSquad* quad) +{ + FONSglyph* glyph = NULL; + const char* str = iter->next; + iter->str = iter->next; + + if (str == iter->end) + return 0; + + for (; str != iter->end; str++) { + if (fons__decutf8(&iter->utf8state, &iter->codepoint, *(const unsigned char*)str)) + continue; + str++; + // Get glyph and quad + iter->x = iter->nextx; + iter->y = iter->nexty; + glyph = fons__getGlyph(stash, iter->font, iter->codepoint, iter->isize, iter->iblur); + if (glyph != NULL) + fons__getQuad(stash, iter->font, iter->prevGlyphIndex, glyph, iter->scale, iter->spacing, &iter->nextx, &iter->nexty, quad); + iter->prevGlyphIndex = glyph != NULL ? glyph->index : -1; + break; + } + iter->next = str; + + return 1; +} + +void fonsDrawDebug(FONScontext* stash, float x, float y) +{ + int i; + int w = stash->params.width; + int h = stash->params.height; + float u = w == 0 ? 0 : (1.0f / w); + float v = h == 0 ? 0 : (1.0f / h); + + if (stash->nverts+6+6 > FONS_VERTEX_COUNT) + fons__flush(stash); + + // Draw background + fons__vertex(stash, x+0, y+0, u, v, 0x0fffffff); + fons__vertex(stash, x+w, y+h, u, v, 0x0fffffff); + fons__vertex(stash, x+w, y+0, u, v, 0x0fffffff); + + fons__vertex(stash, x+0, y+0, u, v, 0x0fffffff); + fons__vertex(stash, x+0, y+h, u, v, 0x0fffffff); + fons__vertex(stash, x+w, y+h, u, v, 0x0fffffff); + + // Draw texture + fons__vertex(stash, x+0, y+0, 0, 0, 0xffffffff); + fons__vertex(stash, x+w, y+h, 1, 1, 0xffffffff); + fons__vertex(stash, x+w, y+0, 1, 0, 0xffffffff); + + fons__vertex(stash, x+0, y+0, 0, 0, 0xffffffff); + fons__vertex(stash, x+0, y+h, 0, 1, 0xffffffff); + fons__vertex(stash, x+w, y+h, 1, 1, 0xffffffff); + + // Drawbug draw atlas + for (i = 0; i < stash->atlas->nnodes; i++) { + FONSatlasNode* n = &stash->atlas->nodes[i]; + + if (stash->nverts+6 > FONS_VERTEX_COUNT) + fons__flush(stash); + + fons__vertex(stash, x+n->x+0, y+n->y+0, u, v, 0xc00000ff); + fons__vertex(stash, x+n->x+n->width, y+n->y+1, u, v, 0xc00000ff); + fons__vertex(stash, x+n->x+n->width, y+n->y+0, u, v, 0xc00000ff); + + fons__vertex(stash, x+n->x+0, y+n->y+0, u, v, 0xc00000ff); + fons__vertex(stash, x+n->x+0, y+n->y+1, u, v, 0xc00000ff); + fons__vertex(stash, x+n->x+n->width, y+n->y+1, u, v, 0xc00000ff); + } + + fons__flush(stash); +} + +float fonsTextBounds(FONScontext* stash, + float x, float y, + const char* str, const char* end, + float* bounds) +{ + FONSstate* state = fons__getState(stash); + unsigned int codepoint; + unsigned int utf8state = 0; + FONSquad q; + FONSglyph* glyph = NULL; + int prevGlyphIndex = -1; + short isize = (short)(state->size*10.0f); + short iblur = (short)state->blur; + float scale; + FONSfont* font; + float startx, advance; + float minx, miny, maxx, maxy; + + if (stash == NULL) return 0; + if (state->font < 0 || state->font >= stash->nfonts) return 0; + font = stash->fonts[state->font]; + if (font->data == NULL) return 0; + + scale = fons__tt_getPixelHeightScale(&font->font, (float)isize/10.0f); + + // Align vertically. + y += fons__getVertAlign(stash, font, state->align, isize); + + minx = maxx = x; + miny = maxy = y; + startx = x; + + if (end == NULL) + end = str + strlen(str); + + for (; str != end; ++str) { + if (fons__decutf8(&utf8state, &codepoint, *(const unsigned char*)str)) + continue; + glyph = fons__getGlyph(stash, font, codepoint, isize, iblur); + if (glyph != NULL) { + fons__getQuad(stash, font, prevGlyphIndex, glyph, scale, state->spacing, &x, &y, &q); + if (q.x0 < minx) minx = q.x0; + if (q.x1 > maxx) maxx = q.x1; + if (stash->params.flags & FONS_ZERO_TOPLEFT) { + if (q.y0 < miny) miny = q.y0; + if (q.y1 > maxy) maxy = q.y1; + } else { + if (q.y1 < miny) miny = q.y1; + if (q.y0 > maxy) maxy = q.y0; + } + } + prevGlyphIndex = glyph != NULL ? glyph->index : -1; + } + + advance = x - startx; + + // Align horizontally + if (state->align & FONS_ALIGN_LEFT) { + // empty + } else if (state->align & FONS_ALIGN_RIGHT) { + minx -= advance; + maxx -= advance; + } else if (state->align & FONS_ALIGN_CENTER) { + minx -= advance * 0.5f; + maxx -= advance * 0.5f; + } + + if (bounds) { + bounds[0] = minx; + bounds[1] = miny; + bounds[2] = maxx; + bounds[3] = maxy; + } + + return advance; +} + +void fonsVertMetrics(FONScontext* stash, + float* ascender, float* descender, float* lineh) +{ + FONSfont* font; + FONSstate* state = fons__getState(stash); + short isize; + + if (stash == NULL) return; + if (state->font < 0 || state->font >= stash->nfonts) return; + font = stash->fonts[state->font]; + isize = (short)(state->size*10.0f); + if (font->data == NULL) return; + + if (ascender) + *ascender = font->ascender*isize/10.0f; + if (descender) + *descender = font->descender*isize/10.0f; + if (lineh) + *lineh = font->lineh*isize/10.0f; +} + +void fonsLineBounds(FONScontext* stash, float y, float* miny, float* maxy) +{ + FONSfont* font; + FONSstate* state = fons__getState(stash); + short isize; + + if (stash == NULL) return; + if (state->font < 0 || state->font >= stash->nfonts) return; + font = stash->fonts[state->font]; + isize = (short)(state->size*10.0f); + if (font->data == NULL) return; + + y += fons__getVertAlign(stash, font, state->align, isize); + + if (stash->params.flags & FONS_ZERO_TOPLEFT) { + *miny = y - font->ascender * (float)isize/10.0f; + *maxy = *miny + font->lineh*isize/10.0f; + } else { + *maxy = y + font->descender * (float)isize/10.0f; + *miny = *maxy - font->lineh*isize/10.0f; + } +} + +const unsigned char* fonsGetTextureData(FONScontext* stash, int* width, int* height) +{ + if (width != NULL) + *width = stash->params.width; + if (height != NULL) + *height = stash->params.height; + return stash->texData; +} + +int fonsValidateTexture(FONScontext* stash, int* dirty) +{ + if (stash->dirtyRect[0] < stash->dirtyRect[2] && stash->dirtyRect[1] < stash->dirtyRect[3]) { + dirty[0] = stash->dirtyRect[0]; + dirty[1] = stash->dirtyRect[1]; + dirty[2] = stash->dirtyRect[2]; + dirty[3] = stash->dirtyRect[3]; + // Reset dirty rect + stash->dirtyRect[0] = stash->params.width; + stash->dirtyRect[1] = stash->params.height; + stash->dirtyRect[2] = 0; + stash->dirtyRect[3] = 0; + return 1; + } + return 0; +} + +void fonsDeleteInternal(FONScontext* stash) +{ + int i; + if (stash == NULL) return; + + if (stash->params.renderDelete) + stash->params.renderDelete(stash->params.userPtr); + + for (i = 0; i < stash->nfonts; ++i) + fons__freeFont(stash->fonts[i]); + + if (stash->atlas) fons__deleteAtlas(stash->atlas); + if (stash->fonts) free(stash->fonts); + if (stash->texData) free(stash->texData); + if (stash->scratch) free(stash->scratch); + free(stash); +} + +void fonsSetErrorCallback(FONScontext* stash, void (*callback)(void* uptr, int error, int val), void* uptr) +{ + if (stash == NULL) return; + stash->handleError = callback; + stash->errorUptr = uptr; +} + +void fonsGetAtlasSize(FONScontext* stash, int* width, int* height) +{ + if (stash == NULL) return; + *width = stash->params.width; + *height = stash->params.height; +} + +int fonsExpandAtlas(FONScontext* stash, int width, int height) +{ + int i, maxy = 0; + unsigned char* data = NULL; + if (stash == NULL) return 0; + + width = fons__maxi(width, stash->params.width); + height = fons__maxi(height, stash->params.height); + + if (width == stash->params.width && height == stash->params.height) + return 1; + + // Flush pending glyphs. + fons__flush(stash); + + // Create new texture + if (stash->params.renderResize != NULL) { + if (stash->params.renderResize(stash->params.userPtr, width, height) == 0) + return 0; + } + // Copy old texture data over. + data = (unsigned char*)malloc(width * height); + if (data == NULL) + return 0; + for (i = 0; i < stash->params.height; i++) { + unsigned char* dst = &data[i*width]; + unsigned char* src = &stash->texData[i*stash->params.width]; + memcpy(dst, src, stash->params.width); + if (width > stash->params.width) + memset(dst+stash->params.width, 0, width - stash->params.width); + } + if (height > stash->params.height) + memset(&data[stash->params.height * width], 0, (height - stash->params.height) * width); + + free(stash->texData); + stash->texData = data; + + // Increase atlas size + fons__atlasExpand(stash->atlas, width, height); + + // Add existing data as dirty. + for (i = 0; i < stash->atlas->nnodes; i++) + maxy = fons__maxi(maxy, stash->atlas->nodes[i].y); + stash->dirtyRect[0] = 0; + stash->dirtyRect[1] = 0; + stash->dirtyRect[2] = stash->params.width; + stash->dirtyRect[3] = maxy; + + stash->params.width = width; + stash->params.height = height; + stash->itw = 1.0f/stash->params.width; + stash->ith = 1.0f/stash->params.height; + + return 1; +} + +int fonsResetAtlas(FONScontext* stash, int width, int height) +{ + int i, j; + if (stash == NULL) return 0; + + // Flush pending glyphs. + fons__flush(stash); + + // Create new texture + if (stash->params.renderResize != NULL) { + if (stash->params.renderResize(stash->params.userPtr, width, height) == 0) + return 0; + } + + // Reset atlas + fons__atlasReset(stash->atlas, width, height); + + // Clear texture data. + stash->texData = (unsigned char*)realloc(stash->texData, width * height); + if (stash->texData == NULL) return 0; + memset(stash->texData, 0, width * height); + + // Reset dirty rect + stash->dirtyRect[0] = width; + stash->dirtyRect[1] = height; + stash->dirtyRect[2] = 0; + stash->dirtyRect[3] = 0; + + // Reset cached glyphs + for (i = 0; i < stash->nfonts; i++) { + FONSfont* font = stash->fonts[i]; + font->nglyphs = 0; + for (j = 0; j < FONS_HASH_LUT_SIZE; j++) + font->lut[j] = -1; + } + + stash->params.width = width; + stash->params.height = height; + stash->itw = 1.0f/stash->params.width; + stash->ith = 1.0f/stash->params.height; + + // Add white rect at 0,0 for debug drawing. + fons__addWhiteRect(stash, 2,2); + + return 1; +} + + +#endif diff --git a/dpf/dgl/src/nanovg/nanovg.c b/dpf/dgl/src/nanovg/nanovg.c new file mode 100644 index 0000000..315be35 --- /dev/null +++ b/dpf/dgl/src/nanovg/nanovg.c @@ -0,0 +1,2752 @@ +// +// Copyright (c) 2013 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include +#include +#include "nanovg.h" +#define FONTSTASH_IMPLEMENTATION +#include "fontstash.h" +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" + +#ifdef _MSC_VER +#pragma warning(disable: 4100) // unreferenced formal parameter +#pragma warning(disable: 4127) // conditional expression is constant +#pragma warning(disable: 4204) // nonstandard extension used : non-constant aggregate initializer +#pragma warning(disable: 4706) // assignment within conditional expression +#endif + +#define NVG_INIT_FONTIMAGE_SIZE 512 +#define NVG_MAX_FONTIMAGE_SIZE 2048 +#define NVG_MAX_FONTIMAGES 4 + +#define NVG_INIT_COMMANDS_SIZE 256 +#define NVG_INIT_POINTS_SIZE 128 +#define NVG_INIT_PATHS_SIZE 16 +#define NVG_INIT_VERTS_SIZE 256 +#define NVG_MAX_STATES 32 + +#define NVG_KAPPA90 0.5522847493f // Length proportional to radius of a cubic bezier handle for 90deg arcs. + +#define NVG_COUNTOF(arr) (sizeof(arr) / sizeof(0[arr])) + + +enum NVGcommands { + NVG_MOVETO = 0, + NVG_LINETO = 1, + NVG_BEZIERTO = 2, + NVG_CLOSE = 3, + NVG_WINDING = 4, +}; + +enum NVGpointFlags +{ + NVG_PT_CORNER = 0x01, + NVG_PT_LEFT = 0x02, + NVG_PT_BEVEL = 0x04, + NVG_PR_INNERBEVEL = 0x08, +}; + +struct NVGstate { + NVGpaint fill; + NVGpaint stroke; + float strokeWidth; + float miterLimit; + int lineJoin; + int lineCap; + float alpha; + float xform[6]; + NVGscissor scissor; + float fontSize; + float letterSpacing; + float lineHeight; + float fontBlur; + int textAlign; + int fontId; +}; +typedef struct NVGstate NVGstate; + +struct NVGpoint { + float x,y; + float dx, dy; + float len; + float dmx, dmy; + unsigned char flags; +}; +typedef struct NVGpoint NVGpoint; + +struct NVGpathCache { + NVGpoint* points; + int npoints; + int cpoints; + NVGpath* paths; + int npaths; + int cpaths; + NVGvertex* verts; + int nverts; + int cverts; + float bounds[4]; +}; +typedef struct NVGpathCache NVGpathCache; + +struct NVGcontext { + NVGparams params; + float* commands; + int ccommands; + int ncommands; + float commandx, commandy; + NVGstate states[NVG_MAX_STATES]; + int nstates; + NVGpathCache* cache; + float tessTol; + float distTol; + float fringeWidth; + float devicePxRatio; + struct FONScontext* fs; + int fontImages[NVG_MAX_FONTIMAGES]; + int fontImageIdx; + int drawCallCount; + int fillTriCount; + int strokeTriCount; + int textTriCount; +}; + +static float nvg__sqrtf(float a) { return sqrtf(a); } +static float nvg__modf(float a, float b) { return fmodf(a, b); } +static float nvg__sinf(float a) { return sinf(a); } +static float nvg__cosf(float a) { return cosf(a); } +static float nvg__tanf(float a) { return tanf(a); } +static float nvg__atan2f(float a,float b) { return atan2f(a, b); } +static float nvg__acosf(float a) { return acosf(a); } + +static int nvg__mini(int a, int b) { return a < b ? a : b; } +static int nvg__maxi(int a, int b) { return a > b ? a : b; } +static int nvg__clampi(int a, int mn, int mx) { return a < mn ? mn : (a > mx ? mx : a); } +static float nvg__minf(float a, float b) { return a < b ? a : b; } +static float nvg__maxf(float a, float b) { return a > b ? a : b; } +static float nvg__absf(float a) { return a >= 0.0f ? a : -a; } +static float nvg__signf(float a) { return a >= 0.0f ? 1.0f : -1.0f; } +static float nvg__clampf(float a, float mn, float mx) { return a < mn ? mn : (a > mx ? mx : a); } +static float nvg__cross(float dx0, float dy0, float dx1, float dy1) { return dx1*dy0 - dx0*dy1; } + +static float nvg__normalize(float *x, float* y) +{ + float d = nvg__sqrtf((*x)*(*x) + (*y)*(*y)); + if (d > 1e-6f) { + float id = 1.0f / d; + *x *= id; + *y *= id; + } + return d; +} + + +static void nvg__deletePathCache(NVGpathCache* c) +{ + if (c == NULL) return; + if (c->points != NULL) free(c->points); + if (c->paths != NULL) free(c->paths); + if (c->verts != NULL) free(c->verts); + free(c); +} + +static NVGpathCache* nvg__allocPathCache(void) +{ + NVGpathCache* c = (NVGpathCache*)malloc(sizeof(NVGpathCache)); + if (c == NULL) goto error; + memset(c, 0, sizeof(NVGpathCache)); + + c->points = (NVGpoint*)malloc(sizeof(NVGpoint)*NVG_INIT_POINTS_SIZE); + if (!c->points) goto error; + c->npoints = 0; + c->cpoints = NVG_INIT_POINTS_SIZE; + + c->paths = (NVGpath*)malloc(sizeof(NVGpath)*NVG_INIT_PATHS_SIZE); + if (!c->paths) goto error; + c->npaths = 0; + c->cpaths = NVG_INIT_PATHS_SIZE; + + c->verts = (NVGvertex*)malloc(sizeof(NVGvertex)*NVG_INIT_VERTS_SIZE); + if (!c->verts) goto error; + c->nverts = 0; + c->cverts = NVG_INIT_VERTS_SIZE; + + return c; +error: + nvg__deletePathCache(c); + return NULL; +} + +static void nvg__setDevicePixelRatio(NVGcontext* ctx, float ratio) +{ + ctx->tessTol = 0.25f / ratio; + ctx->distTol = 0.01f / ratio; + ctx->fringeWidth = 1.0f / ratio; + ctx->devicePxRatio = ratio; +} + +NVGcontext* nvgCreateInternal(NVGparams* params) +{ + FONSparams fontParams; + NVGcontext* ctx = (NVGcontext*)malloc(sizeof(NVGcontext)); + int i; + if (ctx == NULL) goto error; + memset(ctx, 0, sizeof(NVGcontext)); + + ctx->params = *params; + for (i = 0; i < NVG_MAX_FONTIMAGES; i++) + ctx->fontImages[i] = 0; + + ctx->commands = (float*)malloc(sizeof(float)*NVG_INIT_COMMANDS_SIZE); + if (!ctx->commands) goto error; + ctx->ncommands = 0; + ctx->ccommands = NVG_INIT_COMMANDS_SIZE; + + ctx->cache = nvg__allocPathCache(); + if (ctx->cache == NULL) goto error; + + nvgSave(ctx); + nvgReset(ctx); + + nvg__setDevicePixelRatio(ctx, 1.0f); + + if (ctx->params.renderCreate(ctx->params.userPtr) == 0) goto error; + + // Init font rendering + memset(&fontParams, 0, sizeof(fontParams)); + fontParams.width = NVG_INIT_FONTIMAGE_SIZE; + fontParams.height = NVG_INIT_FONTIMAGE_SIZE; + fontParams.flags = FONS_ZERO_TOPLEFT; + fontParams.renderCreate = NULL; + fontParams.renderUpdate = NULL; + fontParams.renderDraw = NULL; + fontParams.renderDelete = NULL; + fontParams.userPtr = NULL; + ctx->fs = fonsCreateInternal(&fontParams); + if (ctx->fs == NULL) goto error; + + // Create font texture + ctx->fontImages[0] = ctx->params.renderCreateTexture(ctx->params.userPtr, NVG_TEXTURE_ALPHA, fontParams.width, fontParams.height, 0, NULL); + if (ctx->fontImages[0] == 0) goto error; + ctx->fontImageIdx = 0; + + return ctx; + +error: + nvgDeleteInternal(ctx); + return 0; +} + +NVGparams* nvgInternalParams(NVGcontext* ctx) +{ + return &ctx->params; +} + +void nvgDeleteInternal(NVGcontext* ctx) +{ + int i; + if (ctx == NULL) return; + if (ctx->commands != NULL) free(ctx->commands); + if (ctx->cache != NULL) nvg__deletePathCache(ctx->cache); + + if (ctx->fs) + fonsDeleteInternal(ctx->fs); + + for (i = 0; i < NVG_MAX_FONTIMAGES; i++) { + if (ctx->fontImages[i] != 0) { + nvgDeleteImage(ctx, ctx->fontImages[i]); + ctx->fontImages[i] = 0; + } + } + + if (ctx->params.renderDelete != NULL) + ctx->params.renderDelete(ctx->params.userPtr); + + free(ctx); +} + +void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio) +{ +/* printf("Tris: draws:%d fill:%d stroke:%d text:%d TOT:%d\n", + ctx->drawCallCount, ctx->fillTriCount, ctx->strokeTriCount, ctx->textTriCount, + ctx->fillTriCount+ctx->strokeTriCount+ctx->textTriCount);*/ + + ctx->nstates = 0; + nvgSave(ctx); + nvgReset(ctx); + + nvg__setDevicePixelRatio(ctx, devicePixelRatio); + + ctx->params.renderViewport(ctx->params.userPtr, windowWidth, windowHeight); + + ctx->drawCallCount = 0; + ctx->fillTriCount = 0; + ctx->strokeTriCount = 0; + ctx->textTriCount = 0; +} + +void nvgCancelFrame(NVGcontext* ctx) +{ + ctx->params.renderCancel(ctx->params.userPtr); +} + +void nvgEndFrame(NVGcontext* ctx) +{ + ctx->params.renderFlush(ctx->params.userPtr); + if (ctx->fontImageIdx != 0) { + int fontImage = ctx->fontImages[ctx->fontImageIdx]; + int i, j, iw, ih; + // delete images that smaller than current one + if (fontImage == 0) + return; + nvgImageSize(ctx, fontImage, &iw, &ih); + for (i = j = 0; i < ctx->fontImageIdx; i++) { + if (ctx->fontImages[i] != 0) { + int nw, nh; + nvgImageSize(ctx, ctx->fontImages[i], &nw, &nh); + if (nw < iw || nh < ih) + nvgDeleteImage(ctx, ctx->fontImages[i]); + else + ctx->fontImages[j++] = ctx->fontImages[i]; + } + } + // make current font image to first + ctx->fontImages[j++] = ctx->fontImages[0]; + ctx->fontImages[0] = fontImage; + ctx->fontImageIdx = 0; + // clear all images after j + for (i = j; i < NVG_MAX_FONTIMAGES; i++) + ctx->fontImages[i] = 0; + } +} + +NVGcolor nvgRGB(unsigned char r, unsigned char g, unsigned char b) +{ + return nvgRGBA(r,g,b,255); +} + +NVGcolor nvgRGBf(float r, float g, float b) +{ + return nvgRGBAf(r,g,b,1.0f); +} + +NVGcolor nvgRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a) +{ + NVGcolor color; + // Use longer initialization to suppress warning. + color.r = r / 255.0f; + color.g = g / 255.0f; + color.b = b / 255.0f; + color.a = a / 255.0f; + return color; +} + +NVGcolor nvgRGBAf(float r, float g, float b, float a) +{ + NVGcolor color; + // Use longer initialization to suppress warning. + color.r = r; + color.g = g; + color.b = b; + color.a = a; + return color; +} + +NVGcolor nvgTransRGBA(NVGcolor c, unsigned char a) +{ + c.a = a / 255.0f; + return c; +} + +NVGcolor nvgTransRGBAf(NVGcolor c, float a) +{ + c.a = a; + return c; +} + +NVGcolor nvgLerpRGBA(NVGcolor c0, NVGcolor c1, float u) +{ + int i; + float oneminu; + NVGcolor cint; + + u = nvg__clampf(u, 0.0f, 1.0f); + oneminu = 1.0f - u; + for( i = 0; i <4; i++ ) + { + cint.rgba[i] = c0.rgba[i] * oneminu + c1.rgba[i] * u; + } + + return cint; +} + +NVGcolor nvgHSL(float h, float s, float l) +{ + return nvgHSLA(h,s,l,255); +} + +static float nvg__hue(float h, float m1, float m2) +{ + if (h < 0) h += 1; + if (h > 1) h -= 1; + if (h < 1.0f/6.0f) + return m1 + (m2 - m1) * h * 6.0f; + else if (h < 3.0f/6.0f) + return m2; + else if (h < 4.0f/6.0f) + return m1 + (m2 - m1) * (2.0f/3.0f - h) * 6.0f; + return m1; +} + +NVGcolor nvgHSLA(float h, float s, float l, unsigned char a) +{ + float m1, m2; + NVGcolor col; + h = nvg__modf(h, 1.0f); + if (h < 0.0f) h += 1.0f; + s = nvg__clampf(s, 0.0f, 1.0f); + l = nvg__clampf(l, 0.0f, 1.0f); + m2 = l <= 0.5f ? (l * (1 + s)) : (l + s - l * s); + m1 = 2 * l - m2; + col.r = nvg__clampf(nvg__hue(h + 1.0f/3.0f, m1, m2), 0.0f, 1.0f); + col.g = nvg__clampf(nvg__hue(h, m1, m2), 0.0f, 1.0f); + col.b = nvg__clampf(nvg__hue(h - 1.0f/3.0f, m1, m2), 0.0f, 1.0f); + col.a = a/255.0f; + return col; +} + + +static NVGstate* nvg__getState(NVGcontext* ctx) +{ + return &ctx->states[ctx->nstates-1]; +} + +void nvgTransformIdentity(float* t) +{ + t[0] = 1.0f; t[1] = 0.0f; + t[2] = 0.0f; t[3] = 1.0f; + t[4] = 0.0f; t[5] = 0.0f; +} + +void nvgTransformTranslate(float* t, float tx, float ty) +{ + t[0] = 1.0f; t[1] = 0.0f; + t[2] = 0.0f; t[3] = 1.0f; + t[4] = tx; t[5] = ty; +} + +void nvgTransformScale(float* t, float sx, float sy) +{ + t[0] = sx; t[1] = 0.0f; + t[2] = 0.0f; t[3] = sy; + t[4] = 0.0f; t[5] = 0.0f; +} + +void nvgTransformRotate(float* t, float a) +{ + float cs = nvg__cosf(a), sn = nvg__sinf(a); + t[0] = cs; t[1] = sn; + t[2] = -sn; t[3] = cs; + t[4] = 0.0f; t[5] = 0.0f; +} + +void nvgTransformSkewX(float* t, float a) +{ + t[0] = 1.0f; t[1] = 0.0f; + t[2] = nvg__tanf(a); t[3] = 1.0f; + t[4] = 0.0f; t[5] = 0.0f; +} + +void nvgTransformSkewY(float* t, float a) +{ + t[0] = 1.0f; t[1] = nvg__tanf(a); + t[2] = 0.0f; t[3] = 1.0f; + t[4] = 0.0f; t[5] = 0.0f; +} + +void nvgTransformMultiply(float* t, const float* s) +{ + float t0 = t[0] * s[0] + t[1] * s[2]; + float t2 = t[2] * s[0] + t[3] * s[2]; + float t4 = t[4] * s[0] + t[5] * s[2] + s[4]; + t[1] = t[0] * s[1] + t[1] * s[3]; + t[3] = t[2] * s[1] + t[3] * s[3]; + t[5] = t[4] * s[1] + t[5] * s[3] + s[5]; + t[0] = t0; + t[2] = t2; + t[4] = t4; +} + +void nvgTransformPremultiply(float* t, const float* s) +{ + float s2[6]; + memcpy(s2, s, sizeof(float)*6); + nvgTransformMultiply(s2, t); + memcpy(t, s2, sizeof(float)*6); +} + +int nvgTransformInverse(float* inv, const float* t) +{ + double invdet, det = (double)t[0] * t[3] - (double)t[2] * t[1]; + if (det > -1e-6 && det < 1e-6) { + nvgTransformIdentity(inv); + return 0; + } + invdet = 1.0 / det; + inv[0] = (float)(t[3] * invdet); + inv[2] = (float)(-t[2] * invdet); + inv[4] = (float)(((double)t[2] * t[5] - (double)t[3] * t[4]) * invdet); + inv[1] = (float)(-t[1] * invdet); + inv[3] = (float)(t[0] * invdet); + inv[5] = (float)(((double)t[1] * t[4] - (double)t[0] * t[5]) * invdet); + return 1; +} + +void nvgTransformPoint(float* dx, float* dy, const float* t, float sx, float sy) +{ + *dx = sx*t[0] + sy*t[2] + t[4]; + *dy = sx*t[1] + sy*t[3] + t[5]; +} + +float nvgDegToRad(float deg) +{ + return deg / 180.0f * NVG_PI; +} + +float nvgRadToDeg(float rad) +{ + return rad / NVG_PI * 180.0f; +} + +static void nvg__setPaintColor(NVGpaint* p, NVGcolor color) +{ + memset(p, 0, sizeof(*p)); + nvgTransformIdentity(p->xform); + p->radius = 0.0f; + p->feather = 1.0f; + p->innerColor = color; + p->outerColor = color; +} + + +// State handling +void nvgSave(NVGcontext* ctx) +{ + if (ctx->nstates >= NVG_MAX_STATES) + return; + if (ctx->nstates > 0) + memcpy(&ctx->states[ctx->nstates], &ctx->states[ctx->nstates-1], sizeof(NVGstate)); + ctx->nstates++; +} + +void nvgRestore(NVGcontext* ctx) +{ + if (ctx->nstates <= 1) + return; + ctx->nstates--; +} + +void nvgReset(NVGcontext* ctx) +{ + NVGstate* state = nvg__getState(ctx); + memset(state, 0, sizeof(*state)); + + nvg__setPaintColor(&state->fill, nvgRGBA(255,255,255,255)); + nvg__setPaintColor(&state->stroke, nvgRGBA(0,0,0,255)); + state->strokeWidth = 1.0f; + state->miterLimit = 10.0f; + state->lineCap = NVG_BUTT; + state->lineJoin = NVG_MITER; + state->alpha = 1.0f; + nvgTransformIdentity(state->xform); + + state->scissor.extent[0] = -1.0f; + state->scissor.extent[1] = -1.0f; + + state->fontSize = 16.0f; + state->letterSpacing = 0.0f; + state->lineHeight = 1.0f; + state->fontBlur = 0.0f; + state->textAlign = NVG_ALIGN_LEFT | NVG_ALIGN_BASELINE; + state->fontId = 0; +} + +// State setting +void nvgStrokeWidth(NVGcontext* ctx, float width) +{ + NVGstate* state = nvg__getState(ctx); + state->strokeWidth = width; +} + +void nvgMiterLimit(NVGcontext* ctx, float limit) +{ + NVGstate* state = nvg__getState(ctx); + state->miterLimit = limit; +} + +void nvgLineCap(NVGcontext* ctx, int cap) +{ + NVGstate* state = nvg__getState(ctx); + state->lineCap = cap; +} + +void nvgLineJoin(NVGcontext* ctx, int join) +{ + NVGstate* state = nvg__getState(ctx); + state->lineJoin = join; +} + +void nvgGlobalAlpha(NVGcontext* ctx, float alpha) +{ + NVGstate* state = nvg__getState(ctx); + state->alpha = alpha; +} + +void nvgTransform(NVGcontext* ctx, float a, float b, float c, float d, float e, float f) +{ + NVGstate* state = nvg__getState(ctx); + float t[6] = { a, b, c, d, e, f }; + nvgTransformPremultiply(state->xform, t); +} + +void nvgResetTransform(NVGcontext* ctx) +{ + NVGstate* state = nvg__getState(ctx); + nvgTransformIdentity(state->xform); +} + +void nvgTranslate(NVGcontext* ctx, float x, float y) +{ + NVGstate* state = nvg__getState(ctx); + float t[6]; + nvgTransformTranslate(t, x,y); + nvgTransformPremultiply(state->xform, t); +} + +void nvgRotate(NVGcontext* ctx, float angle) +{ + NVGstate* state = nvg__getState(ctx); + float t[6]; + nvgTransformRotate(t, angle); + nvgTransformPremultiply(state->xform, t); +} + +void nvgSkewX(NVGcontext* ctx, float angle) +{ + NVGstate* state = nvg__getState(ctx); + float t[6]; + nvgTransformSkewX(t, angle); + nvgTransformPremultiply(state->xform, t); +} + +void nvgSkewY(NVGcontext* ctx, float angle) +{ + NVGstate* state = nvg__getState(ctx); + float t[6]; + nvgTransformSkewY(t, angle); + nvgTransformPremultiply(state->xform, t); +} + +void nvgScale(NVGcontext* ctx, float x, float y) +{ + NVGstate* state = nvg__getState(ctx); + float t[6]; + nvgTransformScale(t, x,y); + nvgTransformPremultiply(state->xform, t); +} + +void nvgCurrentTransform(NVGcontext* ctx, float* xform) +{ + NVGstate* state = nvg__getState(ctx); + if (xform == NULL) return; + memcpy(xform, state->xform, sizeof(float)*6); +} + +void nvgStrokeColor(NVGcontext* ctx, NVGcolor color) +{ + NVGstate* state = nvg__getState(ctx); + nvg__setPaintColor(&state->stroke, color); +} + +void nvgStrokePaint(NVGcontext* ctx, NVGpaint paint) +{ + NVGstate* state = nvg__getState(ctx); + state->stroke = paint; + nvgTransformMultiply(state->stroke.xform, state->xform); +} + +void nvgFillColor(NVGcontext* ctx, NVGcolor color) +{ + NVGstate* state = nvg__getState(ctx); + nvg__setPaintColor(&state->fill, color); +} + +void nvgFillPaint(NVGcontext* ctx, NVGpaint paint) +{ + NVGstate* state = nvg__getState(ctx); + state->fill = paint; + nvgTransformMultiply(state->fill.xform, state->xform); +} + +int nvgCreateImage(NVGcontext* ctx, const char* filename, int imageFlags) +{ + int w, h, n, image; + unsigned char* img; + stbi_set_unpremultiply_on_load(1); + stbi_convert_iphone_png_to_rgb(1); + img = stbi_load(filename, &w, &h, &n, 4); + if (img == NULL) { +// printf("Failed to load %s - %s\n", filename, stbi_failure_reason()); + return 0; + } + image = nvgCreateImageRGBA(ctx, w, h, imageFlags, img); + stbi_image_free(img); + return image; +} + +int nvgCreateImageMem(NVGcontext* ctx, int imageFlags, const unsigned char* data, int ndata) +{ + int w, h, n, image; + unsigned char* img = stbi_load_from_memory(data, ndata, &w, &h, &n, 4); + if (img == NULL) { +// printf("Failed to load %s - %s\n", filename, stbi_failure_reason()); + return 0; + } + image = nvgCreateImageRGBA(ctx, w, h, imageFlags, img); + stbi_image_free(img); + return image; +} + +int nvgCreateImageRGBA(NVGcontext* ctx, int w, int h, int imageFlags, const unsigned char* data) +{ + return ctx->params.renderCreateTexture(ctx->params.userPtr, NVG_TEXTURE_RGBA, w, h, imageFlags, data); +} + +void nvgUpdateImage(NVGcontext* ctx, int image, const unsigned char* data) +{ + int w, h; + ctx->params.renderGetTextureSize(ctx->params.userPtr, image, &w, &h); + ctx->params.renderUpdateTexture(ctx->params.userPtr, image, 0,0, w,h, data); +} + +void nvgImageSize(NVGcontext* ctx, int image, int* w, int* h) +{ + ctx->params.renderGetTextureSize(ctx->params.userPtr, image, w, h); +} + +void nvgDeleteImage(NVGcontext* ctx, int image) +{ + ctx->params.renderDeleteTexture(ctx->params.userPtr, image); +} + +NVGpaint nvgLinearGradient(NVGcontext* ctx, + float sx, float sy, float ex, float ey, + NVGcolor icol, NVGcolor ocol) +{ + NVGpaint p; + float dx, dy, d; + const float large = 1e5; + NVG_NOTUSED(ctx); + memset(&p, 0, sizeof(p)); + + // Calculate transform aligned to the line + dx = ex - sx; + dy = ey - sy; + d = sqrtf(dx*dx + dy*dy); + if (d > 0.0001f) { + dx /= d; + dy /= d; + } else { + dx = 0; + dy = 1; + } + + p.xform[0] = dy; p.xform[1] = -dx; + p.xform[2] = dx; p.xform[3] = dy; + p.xform[4] = sx - dx*large; p.xform[5] = sy - dy*large; + + p.extent[0] = large; + p.extent[1] = large + d*0.5f; + + p.radius = 0.0f; + + p.feather = nvg__maxf(1.0f, d); + + p.innerColor = icol; + p.outerColor = ocol; + + return p; +} + +NVGpaint nvgRadialGradient(NVGcontext* ctx, + float cx, float cy, float inr, float outr, + NVGcolor icol, NVGcolor ocol) +{ + NVGpaint p; + float r = (inr+outr)*0.5f; + float f = (outr-inr); + NVG_NOTUSED(ctx); + memset(&p, 0, sizeof(p)); + + nvgTransformIdentity(p.xform); + p.xform[4] = cx; + p.xform[5] = cy; + + p.extent[0] = r; + p.extent[1] = r; + + p.radius = r; + + p.feather = nvg__maxf(1.0f, f); + + p.innerColor = icol; + p.outerColor = ocol; + + return p; +} + +NVGpaint nvgBoxGradient(NVGcontext* ctx, + float x, float y, float w, float h, float r, float f, + NVGcolor icol, NVGcolor ocol) +{ + NVGpaint p; + NVG_NOTUSED(ctx); + memset(&p, 0, sizeof(p)); + + nvgTransformIdentity(p.xform); + p.xform[4] = x+w*0.5f; + p.xform[5] = y+h*0.5f; + + p.extent[0] = w*0.5f; + p.extent[1] = h*0.5f; + + p.radius = r; + + p.feather = nvg__maxf(1.0f, f); + + p.innerColor = icol; + p.outerColor = ocol; + + return p; +} + + +NVGpaint nvgImagePattern(NVGcontext* ctx, + float cx, float cy, float w, float h, float angle, + int image, float alpha) +{ + NVGpaint p; + NVG_NOTUSED(ctx); + memset(&p, 0, sizeof(p)); + + nvgTransformRotate(p.xform, angle); + p.xform[4] = cx; + p.xform[5] = cy; + + p.extent[0] = w; + p.extent[1] = h; + + p.image = image; + + p.innerColor = p.outerColor = nvgRGBAf(1,1,1,alpha); + + return p; +} + +// Scissoring +void nvgScissor(NVGcontext* ctx, float x, float y, float w, float h) +{ + NVGstate* state = nvg__getState(ctx); + + w = nvg__maxf(0.0f, w); + h = nvg__maxf(0.0f, h); + + nvgTransformIdentity(state->scissor.xform); + state->scissor.xform[4] = x+w*0.5f; + state->scissor.xform[5] = y+h*0.5f; + nvgTransformMultiply(state->scissor.xform, state->xform); + + state->scissor.extent[0] = w*0.5f; + state->scissor.extent[1] = h*0.5f; +} + +static void nvg__isectRects(float* dst, + float ax, float ay, float aw, float ah, + float bx, float by, float bw, float bh) +{ + float minx = nvg__maxf(ax, bx); + float miny = nvg__maxf(ay, by); + float maxx = nvg__minf(ax+aw, bx+bw); + float maxy = nvg__minf(ay+ah, by+bh); + dst[0] = minx; + dst[1] = miny; + dst[2] = nvg__maxf(0.0f, maxx - minx); + dst[3] = nvg__maxf(0.0f, maxy - miny); +} + +void nvgIntersectScissor(NVGcontext* ctx, float x, float y, float w, float h) +{ + NVGstate* state = nvg__getState(ctx); + float pxform[6], invxorm[6]; + float rect[4]; + float ex, ey, tex, tey; + + // If no previous scissor has been set, set the scissor as current scissor. + if (state->scissor.extent[0] < 0) { + nvgScissor(ctx, x, y, w, h); + return; + } + + // Transform the current scissor rect into current transform space. + // If there is difference in rotation, this will be approximation. + memcpy(pxform, state->scissor.xform, sizeof(float)*6); + ex = state->scissor.extent[0]; + ey = state->scissor.extent[1]; + nvgTransformInverse(invxorm, state->xform); + nvgTransformMultiply(pxform, invxorm); + tex = ex*nvg__absf(pxform[0]) + ey*nvg__absf(pxform[2]); + tey = ex*nvg__absf(pxform[1]) + ey*nvg__absf(pxform[3]); + + // Intersect rects. + nvg__isectRects(rect, pxform[4]-tex,pxform[5]-tey,tex*2,tey*2, x,y,w,h); + + nvgScissor(ctx, rect[0], rect[1], rect[2], rect[3]); +} + +void nvgResetScissor(NVGcontext* ctx) +{ + NVGstate* state = nvg__getState(ctx); + memset(state->scissor.xform, 0, sizeof(state->scissor.xform)); + state->scissor.extent[0] = -1.0f; + state->scissor.extent[1] = -1.0f; +} + +static int nvg__ptEquals(float x1, float y1, float x2, float y2, float tol) +{ + float dx = x2 - x1; + float dy = y2 - y1; + return dx*dx + dy*dy < tol*tol; +} + +static float nvg__distPtSeg(float x, float y, float px, float py, float qx, float qy) +{ + float pqx, pqy, dx, dy, d, t; + pqx = qx-px; + pqy = qy-py; + dx = x-px; + dy = y-py; + d = pqx*pqx + pqy*pqy; + t = pqx*dx + pqy*dy; + if (d > 0) t /= d; + if (t < 0) t = 0; + else if (t > 1) t = 1; + dx = px + t*pqx - x; + dy = py + t*pqy - y; + return dx*dx + dy*dy; +} + +static void nvg__appendCommands(NVGcontext* ctx, float* vals, int nvals) +{ + NVGstate* state = nvg__getState(ctx); + int i; + + if (ctx->ncommands+nvals > ctx->ccommands) { + float* commands; + int ccommands = ctx->ncommands+nvals + ctx->ccommands/2; + commands = (float*)realloc(ctx->commands, sizeof(float)*ccommands); + if (commands == NULL) return; + ctx->commands = commands; + ctx->ccommands = ccommands; + } + + if ((int)vals[0] != NVG_CLOSE && (int)vals[0] != NVG_WINDING) { + ctx->commandx = vals[nvals-2]; + ctx->commandy = vals[nvals-1]; + } + + // transform commands + i = 0; + while (i < nvals) { + int cmd = (int)vals[i]; + switch (cmd) { + case NVG_MOVETO: + nvgTransformPoint(&vals[i+1],&vals[i+2], state->xform, vals[i+1],vals[i+2]); + i += 3; + break; + case NVG_LINETO: + nvgTransformPoint(&vals[i+1],&vals[i+2], state->xform, vals[i+1],vals[i+2]); + i += 3; + break; + case NVG_BEZIERTO: + nvgTransformPoint(&vals[i+1],&vals[i+2], state->xform, vals[i+1],vals[i+2]); + nvgTransformPoint(&vals[i+3],&vals[i+4], state->xform, vals[i+3],vals[i+4]); + nvgTransformPoint(&vals[i+5],&vals[i+6], state->xform, vals[i+5],vals[i+6]); + i += 7; + break; + case NVG_CLOSE: + i++; + break; + case NVG_WINDING: + i += 2; + break; + default: + i++; + } + } + + memcpy(&ctx->commands[ctx->ncommands], vals, nvals*sizeof(float)); + + ctx->ncommands += nvals; +} + + +static void nvg__clearPathCache(NVGcontext* ctx) +{ + ctx->cache->npoints = 0; + ctx->cache->npaths = 0; +} + +static NVGpath* nvg__lastPath(NVGcontext* ctx) +{ + if (ctx->cache->npaths > 0) + return &ctx->cache->paths[ctx->cache->npaths-1]; + return NULL; +} + +static void nvg__addPath(NVGcontext* ctx) +{ + NVGpath* path; + if (ctx->cache->npaths+1 > ctx->cache->cpaths) { + NVGpath* paths; + int cpaths = ctx->cache->npaths+1 + ctx->cache->cpaths/2; + paths = (NVGpath*)realloc(ctx->cache->paths, sizeof(NVGpath)*cpaths); + if (paths == NULL) return; + ctx->cache->paths = paths; + ctx->cache->cpaths = cpaths; + } + path = &ctx->cache->paths[ctx->cache->npaths]; + memset(path, 0, sizeof(*path)); + path->first = ctx->cache->npoints; + path->winding = NVG_CCW; + + ctx->cache->npaths++; +} + +static NVGpoint* nvg__lastPoint(NVGcontext* ctx) +{ + if (ctx->cache->npoints > 0) + return &ctx->cache->points[ctx->cache->npoints-1]; + return NULL; +} + +static void nvg__addPoint(NVGcontext* ctx, float x, float y, int flags) +{ + NVGpath* path = nvg__lastPath(ctx); + NVGpoint* pt; + if (path == NULL) return; + + if (path->count > 0 && ctx->cache->npoints > 0) { + pt = nvg__lastPoint(ctx); + if (nvg__ptEquals(pt->x,pt->y, x,y, ctx->distTol)) { + pt->flags |= flags; + return; + } + } + + if (ctx->cache->npoints+1 > ctx->cache->cpoints) { + NVGpoint* points; + int cpoints = ctx->cache->npoints+1 + ctx->cache->cpoints/2; + points = (NVGpoint*)realloc(ctx->cache->points, sizeof(NVGpoint)*cpoints); + if (points == NULL) return; + ctx->cache->points = points; + ctx->cache->cpoints = cpoints; + } + + pt = &ctx->cache->points[ctx->cache->npoints]; + memset(pt, 0, sizeof(*pt)); + pt->x = x; + pt->y = y; + pt->flags = (unsigned char)flags; + + ctx->cache->npoints++; + path->count++; +} + +static void nvg__closePath(NVGcontext* ctx) +{ + NVGpath* path = nvg__lastPath(ctx); + if (path == NULL) return; + path->closed = 1; +} + +static void nvg__pathWinding(NVGcontext* ctx, int winding) +{ + NVGpath* path = nvg__lastPath(ctx); + if (path == NULL) return; + path->winding = winding; +} + +static float nvg__getAverageScale(float *t) +{ + float sx = sqrtf(t[0]*t[0] + t[2]*t[2]); + float sy = sqrtf(t[1]*t[1] + t[3]*t[3]); + return (sx + sy) * 0.5f; +} + +static NVGvertex* nvg__allocTempVerts(NVGcontext* ctx, int nverts) +{ + if (nverts > ctx->cache->cverts) { + NVGvertex* verts; + int cverts = (nverts + 0xff) & ~0xff; // Round up to prevent allocations when things change just slightly. + verts = (NVGvertex*)realloc(ctx->cache->verts, sizeof(NVGvertex)*cverts); + if (verts == NULL) return NULL; + ctx->cache->verts = verts; + ctx->cache->cverts = cverts; + } + + return ctx->cache->verts; +} + +static float nvg__triarea2(float ax, float ay, float bx, float by, float cx, float cy) +{ + float abx = bx - ax; + float aby = by - ay; + float acx = cx - ax; + float acy = cy - ay; + return acx*aby - abx*acy; +} + +static float nvg__polyArea(NVGpoint* pts, int npts) +{ + int i; + float area = 0; + for (i = 2; i < npts; i++) { + NVGpoint* a = &pts[0]; + NVGpoint* b = &pts[i-1]; + NVGpoint* c = &pts[i]; + area += nvg__triarea2(a->x,a->y, b->x,b->y, c->x,c->y); + } + return area * 0.5f; +} + +static void nvg__polyReverse(NVGpoint* pts, int npts) +{ + NVGpoint tmp; + int i = 0, j = npts-1; + while (i < j) { + tmp = pts[i]; + pts[i] = pts[j]; + pts[j] = tmp; + i++; + j--; + } +} + + +static void nvg__vset(NVGvertex* vtx, float x, float y, float u, float v) +{ + vtx->x = x; + vtx->y = y; + vtx->u = u; + vtx->v = v; +} + +static void nvg__tesselateBezier(NVGcontext* ctx, + float x1, float y1, float x2, float y2, + float x3, float y3, float x4, float y4, + int level, int type) +{ + float x12,y12,x23,y23,x34,y34,x123,y123,x234,y234,x1234,y1234; + float dx,dy,d2,d3; + + if (level > 10) return; + + x12 = (x1+x2)*0.5f; + y12 = (y1+y2)*0.5f; + x23 = (x2+x3)*0.5f; + y23 = (y2+y3)*0.5f; + x34 = (x3+x4)*0.5f; + y34 = (y3+y4)*0.5f; + x123 = (x12+x23)*0.5f; + y123 = (y12+y23)*0.5f; + + dx = x4 - x1; + dy = y4 - y1; + d2 = nvg__absf(((x2 - x4) * dy - (y2 - y4) * dx)); + d3 = nvg__absf(((x3 - x4) * dy - (y3 - y4) * dx)); + + if ((d2 + d3)*(d2 + d3) < ctx->tessTol * (dx*dx + dy*dy)) { + nvg__addPoint(ctx, x4, y4, type); + return; + } + +/* if (nvg__absf(x1+x3-x2-x2) + nvg__absf(y1+y3-y2-y2) + nvg__absf(x2+x4-x3-x3) + nvg__absf(y2+y4-y3-y3) < ctx->tessTol) { + nvg__addPoint(ctx, x4, y4, type); + return; + }*/ + + x234 = (x23+x34)*0.5f; + y234 = (y23+y34)*0.5f; + x1234 = (x123+x234)*0.5f; + y1234 = (y123+y234)*0.5f; + + nvg__tesselateBezier(ctx, x1,y1, x12,y12, x123,y123, x1234,y1234, level+1, 0); + nvg__tesselateBezier(ctx, x1234,y1234, x234,y234, x34,y34, x4,y4, level+1, type); +} + +static void nvg__flattenPaths(NVGcontext* ctx) +{ + NVGpathCache* cache = ctx->cache; +// NVGstate* state = nvg__getState(ctx); + NVGpoint* last; + NVGpoint* p0; + NVGpoint* p1; + NVGpoint* pts; + NVGpath* path; + int i, j; + float* cp1; + float* cp2; + float* p; + float area; + + if (cache->npaths > 0) + return; + + // Flatten + i = 0; + while (i < ctx->ncommands) { + int cmd = (int)ctx->commands[i]; + switch (cmd) { + case NVG_MOVETO: + nvg__addPath(ctx); + p = &ctx->commands[i+1]; + nvg__addPoint(ctx, p[0], p[1], NVG_PT_CORNER); + i += 3; + break; + case NVG_LINETO: + p = &ctx->commands[i+1]; + nvg__addPoint(ctx, p[0], p[1], NVG_PT_CORNER); + i += 3; + break; + case NVG_BEZIERTO: + last = nvg__lastPoint(ctx); + if (last != NULL) { + cp1 = &ctx->commands[i+1]; + cp2 = &ctx->commands[i+3]; + p = &ctx->commands[i+5]; + nvg__tesselateBezier(ctx, last->x,last->y, cp1[0],cp1[1], cp2[0],cp2[1], p[0],p[1], 0, NVG_PT_CORNER); + } + i += 7; + break; + case NVG_CLOSE: + nvg__closePath(ctx); + i++; + break; + case NVG_WINDING: + nvg__pathWinding(ctx, (int)ctx->commands[i+1]); + i += 2; + break; + default: + i++; + } + } + + cache->bounds[0] = cache->bounds[1] = 1e6f; + cache->bounds[2] = cache->bounds[3] = -1e6f; + + // Calculate the direction and length of line segments. + for (j = 0; j < cache->npaths; j++) { + path = &cache->paths[j]; + pts = &cache->points[path->first]; + + // If the first and last points are the same, remove the last, mark as closed path. + p0 = &pts[path->count-1]; + p1 = &pts[0]; + if (nvg__ptEquals(p0->x,p0->y, p1->x,p1->y, ctx->distTol)) { + path->count--; + p0 = &pts[path->count-1]; + path->closed = 1; + } + + // Enforce winding. + if (path->count > 2) { + area = nvg__polyArea(pts, path->count); + if (path->winding == NVG_CCW && area < 0.0f) + nvg__polyReverse(pts, path->count); + if (path->winding == NVG_CW && area > 0.0f) + nvg__polyReverse(pts, path->count); + } + + for(i = 0; i < path->count; i++) { + // Calculate segment direction and length + p0->dx = p1->x - p0->x; + p0->dy = p1->y - p0->y; + p0->len = nvg__normalize(&p0->dx, &p0->dy); + // Update bounds + cache->bounds[0] = nvg__minf(cache->bounds[0], p0->x); + cache->bounds[1] = nvg__minf(cache->bounds[1], p0->y); + cache->bounds[2] = nvg__maxf(cache->bounds[2], p0->x); + cache->bounds[3] = nvg__maxf(cache->bounds[3], p0->y); + // Advance + p0 = p1++; + } + } +} + +static int nvg__curveDivs(float r, float arc, float tol) +{ + float da = acosf(r / (r + tol)) * 2.0f; + return nvg__maxi(2, (int)ceilf(arc / da)); +} + +static void nvg__chooseBevel(int bevel, NVGpoint* p0, NVGpoint* p1, float w, + float* x0, float* y0, float* x1, float* y1) +{ + if (bevel) { + *x0 = p1->x + p0->dy * w; + *y0 = p1->y - p0->dx * w; + *x1 = p1->x + p1->dy * w; + *y1 = p1->y - p1->dx * w; + } else { + *x0 = p1->x + p1->dmx * w; + *y0 = p1->y + p1->dmy * w; + *x1 = p1->x + p1->dmx * w; + *y1 = p1->y + p1->dmy * w; + } +} + +static NVGvertex* nvg__roundJoin(NVGvertex* dst, NVGpoint* p0, NVGpoint* p1, + float lw, float rw, float lu, float ru, int ncap, float fringe) +{ + int i, n; + float dlx0 = p0->dy; + float dly0 = -p0->dx; + float dlx1 = p1->dy; + float dly1 = -p1->dx; + NVG_NOTUSED(fringe); + + if (p1->flags & NVG_PT_LEFT) { + float lx0,ly0,lx1,ly1,a0,a1; + nvg__chooseBevel(p1->flags & NVG_PR_INNERBEVEL, p0, p1, lw, &lx0,&ly0, &lx1,&ly1); + a0 = atan2f(-dly0, -dlx0); + a1 = atan2f(-dly1, -dlx1); + if (a1 > a0) a1 -= NVG_PI*2; + + nvg__vset(dst, lx0, ly0, lu,1); dst++; + nvg__vset(dst, p1->x - dlx0*rw, p1->y - dly0*rw, ru,1); dst++; + + n = nvg__clampi((int)ceilf(((a0 - a1) / NVG_PI) * ncap), 2, ncap); + for (i = 0; i < n; i++) { + float u = i/(float)(n-1); + float a = a0 + u*(a1-a0); + float rx = p1->x + cosf(a) * rw; + float ry = p1->y + sinf(a) * rw; + nvg__vset(dst, p1->x, p1->y, 0.5f,1); dst++; + nvg__vset(dst, rx, ry, ru,1); dst++; + } + + nvg__vset(dst, lx1, ly1, lu,1); dst++; + nvg__vset(dst, p1->x - dlx1*rw, p1->y - dly1*rw, ru,1); dst++; + + } else { + float rx0,ry0,rx1,ry1,a0,a1; + nvg__chooseBevel(p1->flags & NVG_PR_INNERBEVEL, p0, p1, -rw, &rx0,&ry0, &rx1,&ry1); + a0 = atan2f(dly0, dlx0); + a1 = atan2f(dly1, dlx1); + if (a1 < a0) a1 += NVG_PI*2; + + nvg__vset(dst, p1->x + dlx0*rw, p1->y + dly0*rw, lu,1); dst++; + nvg__vset(dst, rx0, ry0, ru,1); dst++; + + n = nvg__clampi((int)ceilf(((a1 - a0) / NVG_PI) * ncap), 2, ncap); + for (i = 0; i < n; i++) { + float u = i/(float)(n-1); + float a = a0 + u*(a1-a0); + float lx = p1->x + cosf(a) * lw; + float ly = p1->y + sinf(a) * lw; + nvg__vset(dst, lx, ly, lu,1); dst++; + nvg__vset(dst, p1->x, p1->y, 0.5f,1); dst++; + } + + nvg__vset(dst, p1->x + dlx1*rw, p1->y + dly1*rw, lu,1); dst++; + nvg__vset(dst, rx1, ry1, ru,1); dst++; + + } + return dst; +} + +static NVGvertex* nvg__bevelJoin(NVGvertex* dst, NVGpoint* p0, NVGpoint* p1, + float lw, float rw, float lu, float ru, float fringe) +{ + float rx0,ry0,rx1,ry1; + float lx0,ly0,lx1,ly1; + float dlx0 = p0->dy; + float dly0 = -p0->dx; + float dlx1 = p1->dy; + float dly1 = -p1->dx; + NVG_NOTUSED(fringe); + + if (p1->flags & NVG_PT_LEFT) { + nvg__chooseBevel(p1->flags & NVG_PR_INNERBEVEL, p0, p1, lw, &lx0,&ly0, &lx1,&ly1); + + nvg__vset(dst, lx0, ly0, lu,1); dst++; + nvg__vset(dst, p1->x - dlx0*rw, p1->y - dly0*rw, ru,1); dst++; + + if (p1->flags & NVG_PT_BEVEL) { + nvg__vset(dst, lx0, ly0, lu,1); dst++; + nvg__vset(dst, p1->x - dlx0*rw, p1->y - dly0*rw, ru,1); dst++; + + nvg__vset(dst, lx1, ly1, lu,1); dst++; + nvg__vset(dst, p1->x - dlx1*rw, p1->y - dly1*rw, ru,1); dst++; + } else { + rx0 = p1->x - p1->dmx * rw; + ry0 = p1->y - p1->dmy * rw; + + nvg__vset(dst, p1->x, p1->y, 0.5f,1); dst++; + nvg__vset(dst, p1->x - dlx0*rw, p1->y - dly0*rw, ru,1); dst++; + + nvg__vset(dst, rx0, ry0, ru,1); dst++; + nvg__vset(dst, rx0, ry0, ru,1); dst++; + + nvg__vset(dst, p1->x, p1->y, 0.5f,1); dst++; + nvg__vset(dst, p1->x - dlx1*rw, p1->y - dly1*rw, ru,1); dst++; + } + + nvg__vset(dst, lx1, ly1, lu,1); dst++; + nvg__vset(dst, p1->x - dlx1*rw, p1->y - dly1*rw, ru,1); dst++; + + } else { + nvg__chooseBevel(p1->flags & NVG_PR_INNERBEVEL, p0, p1, -rw, &rx0,&ry0, &rx1,&ry1); + + nvg__vset(dst, p1->x + dlx0*lw, p1->y + dly0*lw, lu,1); dst++; + nvg__vset(dst, rx0, ry0, ru,1); dst++; + + if (p1->flags & NVG_PT_BEVEL) { + nvg__vset(dst, p1->x + dlx0*lw, p1->y + dly0*lw, lu,1); dst++; + nvg__vset(dst, rx0, ry0, ru,1); dst++; + + nvg__vset(dst, p1->x + dlx1*lw, p1->y + dly1*lw, lu,1); dst++; + nvg__vset(dst, rx1, ry1, ru,1); dst++; + } else { + lx0 = p1->x + p1->dmx * lw; + ly0 = p1->y + p1->dmy * lw; + + nvg__vset(dst, p1->x + dlx0*lw, p1->y + dly0*lw, lu,1); dst++; + nvg__vset(dst, p1->x, p1->y, 0.5f,1); dst++; + + nvg__vset(dst, lx0, ly0, lu,1); dst++; + nvg__vset(dst, lx0, ly0, lu,1); dst++; + + nvg__vset(dst, p1->x + dlx1*lw, p1->y + dly1*lw, lu,1); dst++; + nvg__vset(dst, p1->x, p1->y, 0.5f,1); dst++; + } + + nvg__vset(dst, p1->x + dlx1*lw, p1->y + dly1*lw, lu,1); dst++; + nvg__vset(dst, rx1, ry1, ru,1); dst++; + } + + return dst; +} + +static NVGvertex* nvg__buttCapStart(NVGvertex* dst, NVGpoint* p, + float dx, float dy, float w, float d, float aa) +{ + float px = p->x - dx*d; + float py = p->y - dy*d; + float dlx = dy; + float dly = -dx; + nvg__vset(dst, px + dlx*w - dx*aa, py + dly*w - dy*aa, 0,0); dst++; + nvg__vset(dst, px - dlx*w - dx*aa, py - dly*w - dy*aa, 1,0); dst++; + nvg__vset(dst, px + dlx*w, py + dly*w, 0,1); dst++; + nvg__vset(dst, px - dlx*w, py - dly*w, 1,1); dst++; + return dst; +} + +static NVGvertex* nvg__buttCapEnd(NVGvertex* dst, NVGpoint* p, + float dx, float dy, float w, float d, float aa) +{ + float px = p->x + dx*d; + float py = p->y + dy*d; + float dlx = dy; + float dly = -dx; + nvg__vset(dst, px + dlx*w, py + dly*w, 0,1); dst++; + nvg__vset(dst, px - dlx*w, py - dly*w, 1,1); dst++; + nvg__vset(dst, px + dlx*w + dx*aa, py + dly*w + dy*aa, 0,0); dst++; + nvg__vset(dst, px - dlx*w + dx*aa, py - dly*w + dy*aa, 1,0); dst++; + return dst; +} + + +static NVGvertex* nvg__roundCapStart(NVGvertex* dst, NVGpoint* p, + float dx, float dy, float w, int ncap, float aa) +{ + int i; + float px = p->x; + float py = p->y; + float dlx = dy; + float dly = -dx; + NVG_NOTUSED(aa); + for (i = 0; i < ncap; i++) { + float a = i/(float)(ncap-1)*NVG_PI; + float ax = cosf(a) * w, ay = sinf(a) * w; + nvg__vset(dst, px - dlx*ax - dx*ay, py - dly*ax - dy*ay, 0,1); dst++; + nvg__vset(dst, px, py, 0.5f,1); dst++; + } + nvg__vset(dst, px + dlx*w, py + dly*w, 0,1); dst++; + nvg__vset(dst, px - dlx*w, py - dly*w, 1,1); dst++; + return dst; +} + +static NVGvertex* nvg__roundCapEnd(NVGvertex* dst, NVGpoint* p, + float dx, float dy, float w, int ncap, float aa) +{ + int i; + float px = p->x; + float py = p->y; + float dlx = dy; + float dly = -dx; + NVG_NOTUSED(aa); + nvg__vset(dst, px + dlx*w, py + dly*w, 0,1); dst++; + nvg__vset(dst, px - dlx*w, py - dly*w, 1,1); dst++; + for (i = 0; i < ncap; i++) { + float a = i/(float)(ncap-1)*NVG_PI; + float ax = cosf(a) * w, ay = sinf(a) * w; + nvg__vset(dst, px, py, 0.5f,1); dst++; + nvg__vset(dst, px - dlx*ax + dx*ay, py - dly*ax + dy*ay, 0,1); dst++; + } + return dst; +} + + +static void nvg__calculateJoins(NVGcontext* ctx, float w, int lineJoin, float miterLimit) +{ + NVGpathCache* cache = ctx->cache; + int i, j; + float iw = 0.0f; + + if (w > 0.0f) iw = 1.0f / w; + + // Calculate which joins needs extra vertices to append, and gather vertex count. + for (i = 0; i < cache->npaths; i++) { + NVGpath* path = &cache->paths[i]; + NVGpoint* pts = &cache->points[path->first]; + NVGpoint* p0 = &pts[path->count-1]; + NVGpoint* p1 = &pts[0]; + int nleft = 0; + + path->nbevel = 0; + + for (j = 0; j < path->count; j++) { + float dlx0, dly0, dlx1, dly1, dmr2, cross, limit; + dlx0 = p0->dy; + dly0 = -p0->dx; + dlx1 = p1->dy; + dly1 = -p1->dx; + // Calculate extrusions + p1->dmx = (dlx0 + dlx1) * 0.5f; + p1->dmy = (dly0 + dly1) * 0.5f; + dmr2 = p1->dmx*p1->dmx + p1->dmy*p1->dmy; + if (dmr2 > 0.000001f) { + float scale = 1.0f / dmr2; + if (scale > 600.0f) { + scale = 600.0f; + } + p1->dmx *= scale; + p1->dmy *= scale; + } + + // Clear flags, but keep the corner. + p1->flags = (p1->flags & NVG_PT_CORNER) ? NVG_PT_CORNER : 0; + + // Keep track of left turns. + cross = p1->dx * p0->dy - p0->dx * p1->dy; + if (cross > 0.0f) { + nleft++; + p1->flags |= NVG_PT_LEFT; + } + + // Calculate if we should use bevel or miter for inner join. + limit = nvg__maxf(1.01f, nvg__minf(p0->len, p1->len) * iw); + if ((dmr2 * limit*limit) < 1.0f) + p1->flags |= NVG_PR_INNERBEVEL; + + // Check to see if the corner needs to be beveled. + if (p1->flags & NVG_PT_CORNER) { + if ((dmr2 * miterLimit*miterLimit) < 1.0f || lineJoin == NVG_BEVEL || lineJoin == NVG_ROUND) { + p1->flags |= NVG_PT_BEVEL; + } + } + + if ((p1->flags & (NVG_PT_BEVEL | NVG_PR_INNERBEVEL)) != 0) + path->nbevel++; + + p0 = p1++; + } + + path->convex = (nleft == path->count) ? 1 : 0; + } +} + + +static int nvg__expandStroke(NVGcontext* ctx, float w, int lineCap, int lineJoin, float miterLimit) +{ + NVGpathCache* cache = ctx->cache; + NVGvertex* verts; + NVGvertex* dst; + int cverts, i, j; + float aa = ctx->fringeWidth; + int ncap = nvg__curveDivs(w, NVG_PI, ctx->tessTol); // Calculate divisions per half circle. + + nvg__calculateJoins(ctx, w, lineJoin, miterLimit); + + // Calculate max vertex usage. + cverts = 0; + for (i = 0; i < cache->npaths; i++) { + NVGpath* path = &cache->paths[i]; + int loop = (path->closed == 0) ? 0 : 1; + if (lineJoin == NVG_ROUND) + cverts += (path->count + path->nbevel*(ncap+2) + 1) * 2; // plus one for loop + else + cverts += (path->count + path->nbevel*5 + 1) * 2; // plus one for loop + if (loop == 0) { + // space for caps + if (lineCap == NVG_ROUND) { + cverts += (ncap*2 + 2)*2; + } else { + cverts += (3+3)*2; + } + } + } + + verts = nvg__allocTempVerts(ctx, cverts); + if (verts == NULL) return 0; + + for (i = 0; i < cache->npaths; i++) { + NVGpath* path = &cache->paths[i]; + NVGpoint* pts = &cache->points[path->first]; + NVGpoint* p0; + NVGpoint* p1; + int s, e, loop; + float dx, dy; + + path->fill = 0; + path->nfill = 0; + + // Calculate fringe or stroke + loop = (path->closed == 0) ? 0 : 1; + dst = verts; + path->stroke = dst; + + if (loop) { + // Looping + p0 = &pts[path->count-1]; + p1 = &pts[0]; + s = 0; + e = path->count; + } else { + // Add cap + p0 = &pts[0]; + p1 = &pts[1]; + s = 1; + e = path->count-1; + } + + if (loop == 0) { + // Add cap + dx = p1->x - p0->x; + dy = p1->y - p0->y; + nvg__normalize(&dx, &dy); + if (lineCap == NVG_BUTT) + dst = nvg__buttCapStart(dst, p0, dx, dy, w, -aa*0.5f, aa); + else if (lineCap == NVG_BUTT || lineCap == NVG_SQUARE) + dst = nvg__buttCapStart(dst, p0, dx, dy, w, w-aa, aa); + else if (lineCap == NVG_ROUND) + dst = nvg__roundCapStart(dst, p0, dx, dy, w, ncap, aa); + } + + for (j = s; j < e; ++j) { + if ((p1->flags & (NVG_PT_BEVEL | NVG_PR_INNERBEVEL)) != 0) { + if (lineJoin == NVG_ROUND) { + dst = nvg__roundJoin(dst, p0, p1, w, w, 0, 1, ncap, aa); + } else { + dst = nvg__bevelJoin(dst, p0, p1, w, w, 0, 1, aa); + } + } else { + nvg__vset(dst, p1->x + (p1->dmx * w), p1->y + (p1->dmy * w), 0,1); dst++; + nvg__vset(dst, p1->x - (p1->dmx * w), p1->y - (p1->dmy * w), 1,1); dst++; + } + p0 = p1++; + } + + if (loop) { + // Loop it + nvg__vset(dst, verts[0].x, verts[0].y, 0,1); dst++; + nvg__vset(dst, verts[1].x, verts[1].y, 1,1); dst++; + } else { + // Add cap + dx = p1->x - p0->x; + dy = p1->y - p0->y; + nvg__normalize(&dx, &dy); + if (lineCap == NVG_BUTT) + dst = nvg__buttCapEnd(dst, p1, dx, dy, w, -aa*0.5f, aa); + else if (lineCap == NVG_BUTT || lineCap == NVG_SQUARE) + dst = nvg__buttCapEnd(dst, p1, dx, dy, w, w-aa, aa); + else if (lineCap == NVG_ROUND) + dst = nvg__roundCapEnd(dst, p1, dx, dy, w, ncap, aa); + } + + path->nstroke = (int)(dst - verts); + + verts = dst; + } + + return 1; +} + +static int nvg__expandFill(NVGcontext* ctx, float w, int lineJoin, float miterLimit) +{ + NVGpathCache* cache = ctx->cache; + NVGvertex* verts; + NVGvertex* dst; + int cverts, convex, i, j; + float aa = ctx->fringeWidth; + int fringe = w > 0.0f; + + nvg__calculateJoins(ctx, w, lineJoin, miterLimit); + + // Calculate max vertex usage. + cverts = 0; + for (i = 0; i < cache->npaths; i++) { + NVGpath* path = &cache->paths[i]; + cverts += path->count + path->nbevel + 1; + if (fringe) + cverts += (path->count + path->nbevel*5 + 1) * 2; // plus one for loop + } + + verts = nvg__allocTempVerts(ctx, cverts); + if (verts == NULL) return 0; + + convex = cache->npaths == 1 && cache->paths[0].convex; + + for (i = 0; i < cache->npaths; i++) { + NVGpath* path = &cache->paths[i]; + NVGpoint* pts = &cache->points[path->first]; + NVGpoint* p0; + NVGpoint* p1; + float rw, lw, woff; + float ru, lu; + + // Calculate shape vertices. + woff = 0.5f*aa; + dst = verts; + path->fill = dst; + + if (fringe) { + // Looping + p0 = &pts[path->count-1]; + p1 = &pts[0]; + for (j = 0; j < path->count; ++j) { + if (p1->flags & NVG_PT_BEVEL) { + float dlx0 = p0->dy; + float dly0 = -p0->dx; + float dlx1 = p1->dy; + float dly1 = -p1->dx; + if (p1->flags & NVG_PT_LEFT) { + float lx = p1->x + p1->dmx * woff; + float ly = p1->y + p1->dmy * woff; + nvg__vset(dst, lx, ly, 0.5f,1); dst++; + } else { + float lx0 = p1->x + dlx0 * woff; + float ly0 = p1->y + dly0 * woff; + float lx1 = p1->x + dlx1 * woff; + float ly1 = p1->y + dly1 * woff; + nvg__vset(dst, lx0, ly0, 0.5f,1); dst++; + nvg__vset(dst, lx1, ly1, 0.5f,1); dst++; + } + } else { + nvg__vset(dst, p1->x + (p1->dmx * woff), p1->y + (p1->dmy * woff), 0.5f,1); dst++; + } + p0 = p1++; + } + } else { + for (j = 0; j < path->count; ++j) { + nvg__vset(dst, pts[j].x, pts[j].y, 0.5f,1); + dst++; + } + } + + path->nfill = (int)(dst - verts); + verts = dst; + + // Calculate fringe + if (fringe) { + lw = w + woff; + rw = w - woff; + lu = 0; + ru = 1; + dst = verts; + path->stroke = dst; + + // Create only half a fringe for convex shapes so that + // the shape can be rendered without stenciling. + if (convex) { + lw = woff; // This should generate the same vertex as fill inset above. + lu = 0.5f; // Set outline fade at middle. + } + + // Looping + p0 = &pts[path->count-1]; + p1 = &pts[0]; + + for (j = 0; j < path->count; ++j) { + if ((p1->flags & (NVG_PT_BEVEL | NVG_PR_INNERBEVEL)) != 0) { + dst = nvg__bevelJoin(dst, p0, p1, lw, rw, lu, ru, ctx->fringeWidth); + } else { + nvg__vset(dst, p1->x + (p1->dmx * lw), p1->y + (p1->dmy * lw), lu,1); dst++; + nvg__vset(dst, p1->x - (p1->dmx * rw), p1->y - (p1->dmy * rw), ru,1); dst++; + } + p0 = p1++; + } + + // Loop it + nvg__vset(dst, verts[0].x, verts[0].y, lu,1); dst++; + nvg__vset(dst, verts[1].x, verts[1].y, ru,1); dst++; + + path->nstroke = (int)(dst - verts); + verts = dst; + } else { + path->stroke = NULL; + path->nstroke = 0; + } + } + + return 1; +} + + +// Draw +void nvgBeginPath(NVGcontext* ctx) +{ + ctx->ncommands = 0; + nvg__clearPathCache(ctx); +} + +void nvgMoveTo(NVGcontext* ctx, float x, float y) +{ + float vals[] = { NVG_MOVETO, x, y }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgLineTo(NVGcontext* ctx, float x, float y) +{ + float vals[] = { NVG_LINETO, x, y }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgBezierTo(NVGcontext* ctx, float c1x, float c1y, float c2x, float c2y, float x, float y) +{ + float vals[] = { NVG_BEZIERTO, c1x, c1y, c2x, c2y, x, y }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgQuadTo(NVGcontext* ctx, float cx, float cy, float x, float y) +{ + float x0 = ctx->commandx; + float y0 = ctx->commandy; + float vals[] = { NVG_BEZIERTO, + x0 + 2.0f/3.0f*(cx - x0), y0 + 2.0f/3.0f*(cy - y0), + x + 2.0f/3.0f*(cx - x), y + 2.0f/3.0f*(cy - y), + x, y }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgArcTo(NVGcontext* ctx, float x1, float y1, float x2, float y2, float radius) +{ + float x0 = ctx->commandx; + float y0 = ctx->commandy; + float dx0,dy0, dx1,dy1, a, d, cx,cy, a0,a1; + int dir; + + if (ctx->ncommands == 0) { + return; + } + + // Handle degenerate cases. + if (nvg__ptEquals(x0,y0, x1,y1, ctx->distTol) || + nvg__ptEquals(x1,y1, x2,y2, ctx->distTol) || + nvg__distPtSeg(x1,y1, x0,y0, x2,y2) < ctx->distTol*ctx->distTol || + radius < ctx->distTol) { + nvgLineTo(ctx, x1,y1); + return; + } + + // Calculate tangential circle to lines (x0,y0)-(x1,y1) and (x1,y1)-(x2,y2). + dx0 = x0-x1; + dy0 = y0-y1; + dx1 = x2-x1; + dy1 = y2-y1; + nvg__normalize(&dx0,&dy0); + nvg__normalize(&dx1,&dy1); + a = nvg__acosf(dx0*dx1 + dy0*dy1); + d = radius / nvg__tanf(a/2.0f); + +// printf("a=%f° d=%f\n", a/NVG_PI*180.0f, d); + + if (d > 10000.0f) { + nvgLineTo(ctx, x1,y1); + return; + } + + if (nvg__cross(dx0,dy0, dx1,dy1) > 0.0f) { + cx = x1 + dx0*d + dy0*radius; + cy = y1 + dy0*d + -dx0*radius; + a0 = nvg__atan2f(dx0, -dy0); + a1 = nvg__atan2f(-dx1, dy1); + dir = NVG_CW; +// printf("CW c=(%f, %f) a0=%f° a1=%f°\n", cx, cy, a0/NVG_PI*180.0f, a1/NVG_PI*180.0f); + } else { + cx = x1 + dx0*d + -dy0*radius; + cy = y1 + dy0*d + dx0*radius; + a0 = nvg__atan2f(-dx0, dy0); + a1 = nvg__atan2f(dx1, -dy1); + dir = NVG_CCW; +// printf("CCW c=(%f, %f) a0=%f° a1=%f°\n", cx, cy, a0/NVG_PI*180.0f, a1/NVG_PI*180.0f); + } + + nvgArc(ctx, cx, cy, radius, a0, a1, dir); +} + +void nvgClosePath(NVGcontext* ctx) +{ + float vals[] = { NVG_CLOSE }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgPathWinding(NVGcontext* ctx, int dir) +{ + float vals[] = { NVG_WINDING, (float)dir }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgArc(NVGcontext* ctx, float cx, float cy, float r, float a0, float a1, int dir) +{ + float a = 0, da = 0, hda = 0, kappa = 0; + float dx = 0, dy = 0, x = 0, y = 0, tanx = 0, tany = 0; + float px = 0, py = 0, ptanx = 0, ptany = 0; + float vals[3 + 5*7 + 100]; + int i, ndivs, nvals; + int move = ctx->ncommands > 0 ? NVG_LINETO : NVG_MOVETO; + + // Clamp angles + da = a1 - a0; + if (dir == NVG_CW) { + if (nvg__absf(da) >= NVG_PI*2) { + da = NVG_PI*2; + } else { + while (da < 0.0f) da += NVG_PI*2; + } + } else { + if (nvg__absf(da) >= NVG_PI*2) { + da = -NVG_PI*2; + } else { + while (da > 0.0f) da -= NVG_PI*2; + } + } + + // Split arc into max 90 degree segments. + ndivs = nvg__maxi(1, nvg__mini((int)(nvg__absf(da) / (NVG_PI*0.5f) + 0.5f), 5)); + hda = (da / (float)ndivs) / 2.0f; + kappa = nvg__absf(4.0f / 3.0f * (1.0f - nvg__cosf(hda)) / nvg__sinf(hda)); + + if (dir == NVG_CCW) + kappa = -kappa; + + nvals = 0; + for (i = 0; i <= ndivs; i++) { + a = a0 + da * (i/(float)ndivs); + dx = nvg__cosf(a); + dy = nvg__sinf(a); + x = cx + dx*r; + y = cy + dy*r; + tanx = -dy*r*kappa; + tany = dx*r*kappa; + + if (i == 0) { + vals[nvals++] = (float)move; + vals[nvals++] = x; + vals[nvals++] = y; + } else { + vals[nvals++] = NVG_BEZIERTO; + vals[nvals++] = px+ptanx; + vals[nvals++] = py+ptany; + vals[nvals++] = x-tanx; + vals[nvals++] = y-tany; + vals[nvals++] = x; + vals[nvals++] = y; + } + px = x; + py = y; + ptanx = tanx; + ptany = tany; + } + + nvg__appendCommands(ctx, vals, nvals); +} + +void nvgRect(NVGcontext* ctx, float x, float y, float w, float h) +{ + float vals[] = { + NVG_MOVETO, x,y, + NVG_LINETO, x,y+h, + NVG_LINETO, x+w,y+h, + NVG_LINETO, x+w,y, + NVG_CLOSE + }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgRoundedRect(NVGcontext* ctx, float x, float y, float w, float h, float r) +{ + if (r < 0.1f) { + nvgRect(ctx, x,y,w,h); + return; + } + else { + float rx = nvg__minf(r, nvg__absf(w)*0.5f) * nvg__signf(w), ry = nvg__minf(r, nvg__absf(h)*0.5f) * nvg__signf(h); + float vals[] = { + NVG_MOVETO, x, y+ry, + NVG_LINETO, x, y+h-ry, + NVG_BEZIERTO, x, y+h-ry*(1-NVG_KAPPA90), x+rx*(1-NVG_KAPPA90), y+h, x+rx, y+h, + NVG_LINETO, x+w-rx, y+h, + NVG_BEZIERTO, x+w-rx*(1-NVG_KAPPA90), y+h, x+w, y+h-ry*(1-NVG_KAPPA90), x+w, y+h-ry, + NVG_LINETO, x+w, y+ry, + NVG_BEZIERTO, x+w, y+ry*(1-NVG_KAPPA90), x+w-rx*(1-NVG_KAPPA90), y, x+w-rx, y, + NVG_LINETO, x+rx, y, + NVG_BEZIERTO, x+rx*(1-NVG_KAPPA90), y, x, y+ry*(1-NVG_KAPPA90), x, y+ry, + NVG_CLOSE + }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); + } +} + +void nvgEllipse(NVGcontext* ctx, float cx, float cy, float rx, float ry) +{ + float vals[] = { + NVG_MOVETO, cx-rx, cy, + NVG_BEZIERTO, cx-rx, cy+ry*NVG_KAPPA90, cx-rx*NVG_KAPPA90, cy+ry, cx, cy+ry, + NVG_BEZIERTO, cx+rx*NVG_KAPPA90, cy+ry, cx+rx, cy+ry*NVG_KAPPA90, cx+rx, cy, + NVG_BEZIERTO, cx+rx, cy-ry*NVG_KAPPA90, cx+rx*NVG_KAPPA90, cy-ry, cx, cy-ry, + NVG_BEZIERTO, cx-rx*NVG_KAPPA90, cy-ry, cx-rx, cy-ry*NVG_KAPPA90, cx-rx, cy, + NVG_CLOSE + }; + nvg__appendCommands(ctx, vals, NVG_COUNTOF(vals)); +} + +void nvgCircle(NVGcontext* ctx, float cx, float cy, float r) +{ + nvgEllipse(ctx, cx,cy, r,r); +} + +void nvgDebugDumpPathCache(NVGcontext* ctx) +{ + const NVGpath* path; + int i, j; + + printf("Dumping %d cached paths\n", ctx->cache->npaths); + for (i = 0; i < ctx->cache->npaths; i++) { + path = &ctx->cache->paths[i]; + printf(" - Path %d\n", i); + if (path->nfill) { + printf(" - fill: %d\n", path->nfill); + for (j = 0; j < path->nfill; j++) + printf("%f\t%f\n", path->fill[j].x, path->fill[j].y); + } + if (path->nstroke) { + printf(" - stroke: %d\n", path->nstroke); + for (j = 0; j < path->nstroke; j++) + printf("%f\t%f\n", path->stroke[j].x, path->stroke[j].y); + } + } +} + +void nvgFill(NVGcontext* ctx) +{ + NVGstate* state = nvg__getState(ctx); + const NVGpath* path; + NVGpaint fillPaint = state->fill; + int i; + + nvg__flattenPaths(ctx); + if (ctx->params.edgeAntiAlias) + nvg__expandFill(ctx, ctx->fringeWidth, NVG_MITER, 2.4f); + else + nvg__expandFill(ctx, 0.0f, NVG_MITER, 2.4f); + + // Apply global alpha + fillPaint.innerColor.a *= state->alpha; + fillPaint.outerColor.a *= state->alpha; + + ctx->params.renderFill(ctx->params.userPtr, &fillPaint, &state->scissor, ctx->fringeWidth, + ctx->cache->bounds, ctx->cache->paths, ctx->cache->npaths); + + // Count triangles + for (i = 0; i < ctx->cache->npaths; i++) { + path = &ctx->cache->paths[i]; + ctx->fillTriCount += path->nfill-2; + ctx->fillTriCount += path->nstroke-2; + ctx->drawCallCount += 2; + } +} + +void nvgStroke(NVGcontext* ctx) +{ + NVGstate* state = nvg__getState(ctx); + float scale = nvg__getAverageScale(state->xform); + float strokeWidth = nvg__clampf(state->strokeWidth * scale, 0.0f, 200.0f); + NVGpaint strokePaint = state->stroke; + const NVGpath* path; + int i; + + if (strokeWidth < ctx->fringeWidth) { + // If the stroke width is less than pixel size, use alpha to emulate coverage. + // Since coverage is area, scale by alpha*alpha. + float alpha = nvg__clampf(strokeWidth / ctx->fringeWidth, 0.0f, 1.0f); + strokePaint.innerColor.a *= alpha*alpha; + strokePaint.outerColor.a *= alpha*alpha; + strokeWidth = ctx->fringeWidth; + } + + // Apply global alpha + strokePaint.innerColor.a *= state->alpha; + strokePaint.outerColor.a *= state->alpha; + + nvg__flattenPaths(ctx); + + if (ctx->params.edgeAntiAlias) + nvg__expandStroke(ctx, strokeWidth*0.5f + ctx->fringeWidth*0.5f, state->lineCap, state->lineJoin, state->miterLimit); + else + nvg__expandStroke(ctx, strokeWidth*0.5f, state->lineCap, state->lineJoin, state->miterLimit); + + ctx->params.renderStroke(ctx->params.userPtr, &strokePaint, &state->scissor, ctx->fringeWidth, + strokeWidth, ctx->cache->paths, ctx->cache->npaths); + + // Count triangles + for (i = 0; i < ctx->cache->npaths; i++) { + path = &ctx->cache->paths[i]; + ctx->strokeTriCount += path->nstroke-2; + ctx->drawCallCount++; + } +} + +// Add fonts +int nvgCreateFont(NVGcontext* ctx, const char* name, const char* path) +{ + return fonsAddFont(ctx->fs, name, path); +} + +int nvgCreateFontMem(NVGcontext* ctx, const char* name, const unsigned char* data, int ndata, int freeData) +{ + return fonsAddFontMem(ctx->fs, name, data, ndata, freeData); +} + +int nvgFindFont(NVGcontext* ctx, const char* name) +{ + if (name == NULL) return -1; + return fonsGetFontByName(ctx->fs, name); +} + +// State setting +void nvgFontSize(NVGcontext* ctx, float size) +{ + NVGstate* state = nvg__getState(ctx); + state->fontSize = size; +} + +void nvgFontBlur(NVGcontext* ctx, float blur) +{ + NVGstate* state = nvg__getState(ctx); + state->fontBlur = blur; +} + +void nvgTextLetterSpacing(NVGcontext* ctx, float spacing) +{ + NVGstate* state = nvg__getState(ctx); + state->letterSpacing = spacing; +} + +void nvgTextLineHeight(NVGcontext* ctx, float lineHeight) +{ + NVGstate* state = nvg__getState(ctx); + state->lineHeight = lineHeight; +} + +void nvgTextAlign(NVGcontext* ctx, int align) +{ + NVGstate* state = nvg__getState(ctx); + state->textAlign = align; +} + +void nvgFontFaceId(NVGcontext* ctx, int font) +{ + NVGstate* state = nvg__getState(ctx); + state->fontId = font; +} + +void nvgFontFace(NVGcontext* ctx, const char* font) +{ + NVGstate* state = nvg__getState(ctx); + state->fontId = fonsGetFontByName(ctx->fs, font); +} + +static float nvg__quantize(float a, float d) +{ + return ((int)(a / d + 0.5f)) * d; +} + +static float nvg__getFontScale(NVGstate* state) +{ + return nvg__minf(nvg__quantize(nvg__getAverageScale(state->xform), 0.01f), 4.0f); +} + +static void nvg__flushTextTexture(NVGcontext* ctx) +{ + int dirty[4]; + + if (fonsValidateTexture(ctx->fs, dirty)) { + int fontImage = ctx->fontImages[ctx->fontImageIdx]; + // Update texture + if (fontImage != 0) { + int iw, ih; + const unsigned char* data = fonsGetTextureData(ctx->fs, &iw, &ih); + int x = dirty[0]; + int y = dirty[1]; + int w = dirty[2] - dirty[0]; + int h = dirty[3] - dirty[1]; + ctx->params.renderUpdateTexture(ctx->params.userPtr, fontImage, x,y, w,h, data); + } + } +} + +static int nvg__allocTextAtlas(NVGcontext* ctx) +{ + int iw, ih; + nvg__flushTextTexture(ctx); + if (ctx->fontImageIdx >= NVG_MAX_FONTIMAGES-1) + return 0; + // if next fontImage already have a texture + if (ctx->fontImages[ctx->fontImageIdx+1] != 0) + nvgImageSize(ctx, ctx->fontImages[ctx->fontImageIdx+1], &iw, &ih); + else { // calculate the new font image size and create it. + nvgImageSize(ctx, ctx->fontImages[ctx->fontImageIdx], &iw, &ih); + if (iw > ih) + ih *= 2; + else + iw *= 2; + if (iw > NVG_MAX_FONTIMAGE_SIZE || ih > NVG_MAX_FONTIMAGE_SIZE) + iw = ih = NVG_MAX_FONTIMAGE_SIZE; + ctx->fontImages[ctx->fontImageIdx+1] = ctx->params.renderCreateTexture(ctx->params.userPtr, NVG_TEXTURE_ALPHA, iw, ih, 0, NULL); + } + ++ctx->fontImageIdx; + fonsResetAtlas(ctx->fs, iw, ih); + return 1; +} + +static void nvg__renderText(NVGcontext* ctx, NVGvertex* verts, int nverts) +{ + NVGstate* state = nvg__getState(ctx); + NVGpaint paint = state->fill; + + // Render triangles. + paint.image = ctx->fontImages[ctx->fontImageIdx]; + + // Apply global alpha + paint.innerColor.a *= state->alpha; + paint.outerColor.a *= state->alpha; + + ctx->params.renderTriangles(ctx->params.userPtr, &paint, &state->scissor, verts, nverts); + + ctx->drawCallCount++; + ctx->textTriCount += nverts/3; +} + +float nvgText(NVGcontext* ctx, float x, float y, const char* string, const char* end) +{ + NVGstate* state = nvg__getState(ctx); + FONStextIter iter, prevIter; + FONSquad q; + NVGvertex* verts; + float scale = nvg__getFontScale(state) * ctx->devicePxRatio; + float invscale = 1.0f / scale; + int cverts = 0; + int nverts = 0; + + if (end == NULL) + end = string + strlen(string); + + if (state->fontId == FONS_INVALID) return x; + + fonsSetSize(ctx->fs, state->fontSize*scale); + fonsSetSpacing(ctx->fs, state->letterSpacing*scale); + fonsSetBlur(ctx->fs, state->fontBlur*scale); + fonsSetAlign(ctx->fs, state->textAlign); + fonsSetFont(ctx->fs, state->fontId); + + cverts = nvg__maxi(2, (int)(end - string)) * 6; // conservative estimate. + verts = nvg__allocTempVerts(ctx, cverts); + if (verts == NULL) return x; + + fonsTextIterInit(ctx->fs, &iter, x*scale, y*scale, string, end); + prevIter = iter; + while (fonsTextIterNext(ctx->fs, &iter, &q)) { + float c[4*2]; + if (iter.prevGlyphIndex == -1) { // can not retrieve glyph? + if (!nvg__allocTextAtlas(ctx)) + break; // no memory :( + if (nverts != 0) { + nvg__renderText(ctx, verts, nverts); + nverts = 0; + } + iter = prevIter; + fonsTextIterNext(ctx->fs, &iter, &q); // try again + if (iter.prevGlyphIndex == -1) // still can not find glyph? + break; + } + prevIter = iter; + // Transform corners. + nvgTransformPoint(&c[0],&c[1], state->xform, q.x0*invscale, q.y0*invscale); + nvgTransformPoint(&c[2],&c[3], state->xform, q.x1*invscale, q.y0*invscale); + nvgTransformPoint(&c[4],&c[5], state->xform, q.x1*invscale, q.y1*invscale); + nvgTransformPoint(&c[6],&c[7], state->xform, q.x0*invscale, q.y1*invscale); + // Create triangles + if (nverts+6 <= cverts) { + nvg__vset(&verts[nverts], c[0], c[1], q.s0, q.t0); nverts++; + nvg__vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++; + nvg__vset(&verts[nverts], c[2], c[3], q.s1, q.t0); nverts++; + nvg__vset(&verts[nverts], c[0], c[1], q.s0, q.t0); nverts++; + nvg__vset(&verts[nverts], c[6], c[7], q.s0, q.t1); nverts++; + nvg__vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++; + } + } + + // TODO: add back-end bit to do this just once per frame. + nvg__flushTextTexture(ctx); + + nvg__renderText(ctx, verts, nverts); + + return iter.x; +} + +void nvgTextBox(NVGcontext* ctx, float x, float y, float breakRowWidth, const char* string, const char* end) +{ + NVGstate* state = nvg__getState(ctx); + NVGtextRow rows[2]; + int nrows = 0, i; + int oldAlign = state->textAlign; + int haling = state->textAlign & (NVG_ALIGN_LEFT | NVG_ALIGN_CENTER | NVG_ALIGN_RIGHT); + int valign = state->textAlign & (NVG_ALIGN_TOP | NVG_ALIGN_MIDDLE | NVG_ALIGN_BOTTOM | NVG_ALIGN_BASELINE); + float lineh = 0; + + if (state->fontId == FONS_INVALID) return; + + nvgTextMetrics(ctx, NULL, NULL, &lineh); + + state->textAlign = NVG_ALIGN_LEFT | valign; + + while ((nrows = nvgTextBreakLines(ctx, string, end, breakRowWidth, rows, 2))) { + for (i = 0; i < nrows; i++) { + NVGtextRow* row = &rows[i]; + if (haling & NVG_ALIGN_LEFT) + nvgText(ctx, x, y, row->start, row->end); + else if (haling & NVG_ALIGN_CENTER) + nvgText(ctx, x + breakRowWidth*0.5f - row->width*0.5f, y, row->start, row->end); + else if (haling & NVG_ALIGN_RIGHT) + nvgText(ctx, x + breakRowWidth - row->width, y, row->start, row->end); + y += lineh * state->lineHeight; + } + string = rows[nrows-1].next; + } + + state->textAlign = oldAlign; +} + +int nvgTextGlyphPositions(NVGcontext* ctx, float x, float y, const char* string, const char* end, NVGglyphPosition* positions, int maxPositions) +{ + NVGstate* state = nvg__getState(ctx); + float scale = nvg__getFontScale(state) * ctx->devicePxRatio; + float invscale = 1.0f / scale; + FONStextIter iter, prevIter; + FONSquad q; + int npos = 0; + + if (state->fontId == FONS_INVALID) return 0; + + if (end == NULL) + end = string + strlen(string); + + if (string == end) + return 0; + + fonsSetSize(ctx->fs, state->fontSize*scale); + fonsSetSpacing(ctx->fs, state->letterSpacing*scale); + fonsSetBlur(ctx->fs, state->fontBlur*scale); + fonsSetAlign(ctx->fs, state->textAlign); + fonsSetFont(ctx->fs, state->fontId); + + fonsTextIterInit(ctx->fs, &iter, x*scale, y*scale, string, end); + prevIter = iter; + while (fonsTextIterNext(ctx->fs, &iter, &q)) { + if (iter.prevGlyphIndex < 0 && nvg__allocTextAtlas(ctx)) { // can not retrieve glyph? + iter = prevIter; + fonsTextIterNext(ctx->fs, &iter, &q); // try again + } + prevIter = iter; + positions[npos].str = iter.str; + positions[npos].x = iter.x * invscale; + positions[npos].minx = nvg__minf(iter.x, q.x0) * invscale; + positions[npos].maxx = nvg__maxf(iter.nextx, q.x1) * invscale; + npos++; + if (npos >= maxPositions) + break; + } + + return npos; +} + +enum NVGcodepointType { + NVG_SPACE, + NVG_NEWLINE, + NVG_CHAR, +}; + +int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, float breakRowWidth, NVGtextRow* rows, int maxRows) +{ + NVGstate* state = nvg__getState(ctx); + float scale = nvg__getFontScale(state) * ctx->devicePxRatio; + float invscale = 1.0f / scale; + FONStextIter iter, prevIter; + FONSquad q; + int nrows = 0; + float rowStartX = 0; + float rowWidth = 0; + float rowMinX = 0; + float rowMaxX = 0; + const char* rowStart = NULL; + const char* rowEnd = NULL; + const char* wordStart = NULL; + float wordStartX = 0; + float wordMinX = 0; + const char* breakEnd = NULL; + float breakWidth = 0; + float breakMaxX = 0; + int type = NVG_SPACE, ptype = NVG_SPACE; + unsigned int pcodepoint = 0; + + if (maxRows == 0) return 0; + if (state->fontId == FONS_INVALID) return 0; + + if (end == NULL) + end = string + strlen(string); + + if (string == end) return 0; + + fonsSetSize(ctx->fs, state->fontSize*scale); + fonsSetSpacing(ctx->fs, state->letterSpacing*scale); + fonsSetBlur(ctx->fs, state->fontBlur*scale); + fonsSetAlign(ctx->fs, state->textAlign); + fonsSetFont(ctx->fs, state->fontId); + + breakRowWidth *= scale; + + fonsTextIterInit(ctx->fs, &iter, 0, 0, string, end); + prevIter = iter; + while (fonsTextIterNext(ctx->fs, &iter, &q)) { + if (iter.prevGlyphIndex < 0 && nvg__allocTextAtlas(ctx)) { // can not retrieve glyph? + iter = prevIter; + fonsTextIterNext(ctx->fs, &iter, &q); // try again + } + prevIter = iter; + switch (iter.codepoint) { + case 9: // \t + case 11: // \v + case 12: // \f + case 32: // space + case 0x00a0: // NBSP + type = NVG_SPACE; + break; + case 10: // \n + type = pcodepoint == 13 ? NVG_SPACE : NVG_NEWLINE; + break; + case 13: // \r + type = pcodepoint == 10 ? NVG_SPACE : NVG_NEWLINE; + break; + case 0x0085: // NEL + type = NVG_NEWLINE; + break; + default: + type = NVG_CHAR; + break; + } + + if (type == NVG_NEWLINE) { + // Always handle new lines. + rows[nrows].start = rowStart != NULL ? rowStart : iter.str; + rows[nrows].end = rowEnd != NULL ? rowEnd : iter.str; + rows[nrows].width = rowWidth * invscale; + rows[nrows].minx = rowMinX * invscale; + rows[nrows].maxx = rowMaxX * invscale; + rows[nrows].next = iter.next; + nrows++; + if (nrows >= maxRows) + return nrows; + // Set null break point + breakEnd = rowStart; + breakWidth = 0.0; + breakMaxX = 0.0; + // Indicate to skip the white space at the beginning of the row. + rowStart = NULL; + rowEnd = NULL; + rowWidth = 0; + rowMinX = rowMaxX = 0; + } else { + if (rowStart == NULL) { + // Skip white space until the beginning of the line + if (type == NVG_CHAR) { + // The current char is the row so far + rowStartX = iter.x; + rowStart = iter.str; + rowEnd = iter.next; + rowWidth = iter.nextx - rowStartX; // q.x1 - rowStartX; + rowMinX = q.x0 - rowStartX; + rowMaxX = q.x1 - rowStartX; + wordStart = iter.str; + wordStartX = iter.x; + wordMinX = q.x0 - rowStartX; + // Set null break point + breakEnd = rowStart; + breakWidth = 0.0; + breakMaxX = 0.0; + } + } else { + float nextWidth = iter.nextx - rowStartX; + + // track last non-white space character + if (type == NVG_CHAR) { + rowEnd = iter.next; + rowWidth = iter.nextx - rowStartX; + rowMaxX = q.x1 - rowStartX; + } + // track last end of a word + if (ptype == NVG_CHAR && type == NVG_SPACE) { + breakEnd = iter.str; + breakWidth = rowWidth; + breakMaxX = rowMaxX; + } + // track last beginning of a word + if (ptype == NVG_SPACE && type == NVG_CHAR) { + wordStart = iter.str; + wordStartX = iter.x; + wordMinX = q.x0 - rowStartX; + } + + // Break to new line when a character is beyond break width. + if (type == NVG_CHAR && nextWidth > breakRowWidth) { + // The run length is too long, need to break to new line. + if (breakEnd == rowStart) { + // The current word is longer than the row length, just break it from here. + rows[nrows].start = rowStart; + rows[nrows].end = iter.str; + rows[nrows].width = rowWidth * invscale; + rows[nrows].minx = rowMinX * invscale; + rows[nrows].maxx = rowMaxX * invscale; + rows[nrows].next = iter.str; + nrows++; + if (nrows >= maxRows) + return nrows; + rowStartX = iter.x; + rowStart = iter.str; + rowEnd = iter.next; + rowWidth = iter.nextx - rowStartX; + rowMinX = q.x0 - rowStartX; + rowMaxX = q.x1 - rowStartX; + wordStart = iter.str; + wordStartX = iter.x; + wordMinX = q.x0 - rowStartX; + } else { + // Break the line from the end of the last word, and start new line from the beginning of the new. + rows[nrows].start = rowStart; + rows[nrows].end = breakEnd; + rows[nrows].width = breakWidth * invscale; + rows[nrows].minx = rowMinX * invscale; + rows[nrows].maxx = breakMaxX * invscale; + rows[nrows].next = wordStart; + nrows++; + if (nrows >= maxRows) + return nrows; + rowStartX = wordStartX; + rowStart = wordStart; + rowEnd = iter.next; + rowWidth = iter.nextx - rowStartX; + rowMinX = wordMinX; + rowMaxX = q.x1 - rowStartX; + // No change to the word start + } + // Set null break point + breakEnd = rowStart; + breakWidth = 0.0; + breakMaxX = 0.0; + } + } + } + + pcodepoint = iter.codepoint; + ptype = type; + } + + // Break the line from the end of the last word, and start new line from the beginning of the new. + if (rowStart != NULL) { + rows[nrows].start = rowStart; + rows[nrows].end = rowEnd; + rows[nrows].width = rowWidth * invscale; + rows[nrows].minx = rowMinX * invscale; + rows[nrows].maxx = rowMaxX * invscale; + rows[nrows].next = end; + nrows++; + } + + return nrows; +} + +float nvgTextBounds(NVGcontext* ctx, float x, float y, const char* string, const char* end, float* bounds) +{ + NVGstate* state = nvg__getState(ctx); + float scale = nvg__getFontScale(state) * ctx->devicePxRatio; + float invscale = 1.0f / scale; + float width; + + if (state->fontId == FONS_INVALID) return 0; + + fonsSetSize(ctx->fs, state->fontSize*scale); + fonsSetSpacing(ctx->fs, state->letterSpacing*scale); + fonsSetBlur(ctx->fs, state->fontBlur*scale); + fonsSetAlign(ctx->fs, state->textAlign); + fonsSetFont(ctx->fs, state->fontId); + + width = fonsTextBounds(ctx->fs, x*scale, y*scale, string, end, bounds); + if (bounds != NULL) { + // Use line bounds for height. + fonsLineBounds(ctx->fs, y*scale, &bounds[1], &bounds[3]); + bounds[0] *= invscale; + bounds[1] *= invscale; + bounds[2] *= invscale; + bounds[3] *= invscale; + } + return width * invscale; +} + +void nvgTextBoxBounds(NVGcontext* ctx, float x, float y, float breakRowWidth, const char* string, const char* end, float* bounds) +{ + NVGstate* state = nvg__getState(ctx); + NVGtextRow rows[2]; + float scale = nvg__getFontScale(state) * ctx->devicePxRatio; + float invscale = 1.0f / scale; + int nrows = 0, i; + int oldAlign = state->textAlign; + int haling = state->textAlign & (NVG_ALIGN_LEFT | NVG_ALIGN_CENTER | NVG_ALIGN_RIGHT); + int valign = state->textAlign & (NVG_ALIGN_TOP | NVG_ALIGN_MIDDLE | NVG_ALIGN_BOTTOM | NVG_ALIGN_BASELINE); + float lineh = 0, rminy = 0, rmaxy = 0; + float minx, miny, maxx, maxy; + + if (state->fontId == FONS_INVALID) { + if (bounds != NULL) + bounds[0] = bounds[1] = bounds[2] = bounds[3] = 0.0f; + return; + } + + nvgTextMetrics(ctx, NULL, NULL, &lineh); + + state->textAlign = NVG_ALIGN_LEFT | valign; + + minx = maxx = x; + miny = maxy = y; + + fonsSetSize(ctx->fs, state->fontSize*scale); + fonsSetSpacing(ctx->fs, state->letterSpacing*scale); + fonsSetBlur(ctx->fs, state->fontBlur*scale); + fonsSetAlign(ctx->fs, state->textAlign); + fonsSetFont(ctx->fs, state->fontId); + fonsLineBounds(ctx->fs, 0, &rminy, &rmaxy); + rminy *= invscale; + rmaxy *= invscale; + + while ((nrows = nvgTextBreakLines(ctx, string, end, breakRowWidth, rows, 2))) { + for (i = 0; i < nrows; i++) { + NVGtextRow* row = &rows[i]; + float rminx, rmaxx, dx = 0; + // Horizontal bounds + if (haling & NVG_ALIGN_LEFT) + dx = 0; + else if (haling & NVG_ALIGN_CENTER) + dx = breakRowWidth*0.5f - row->width*0.5f; + else if (haling & NVG_ALIGN_RIGHT) + dx = breakRowWidth - row->width; + rminx = x + row->minx + dx; + rmaxx = x + row->maxx + dx; + minx = nvg__minf(minx, rminx); + maxx = nvg__maxf(maxx, rmaxx); + // Vertical bounds. + miny = nvg__minf(miny, y + rminy); + maxy = nvg__maxf(maxy, y + rmaxy); + + y += lineh * state->lineHeight; + } + string = rows[nrows-1].next; + } + + state->textAlign = oldAlign; + + if (bounds != NULL) { + bounds[0] = minx; + bounds[1] = miny; + bounds[2] = maxx; + bounds[3] = maxy; + } +} + +void nvgTextMetrics(NVGcontext* ctx, float* ascender, float* descender, float* lineh) +{ + NVGstate* state = nvg__getState(ctx); + float scale = nvg__getFontScale(state) * ctx->devicePxRatio; + float invscale = 1.0f / scale; + + if (state->fontId == FONS_INVALID) return; + + fonsSetSize(ctx->fs, state->fontSize*scale); + fonsSetSpacing(ctx->fs, state->letterSpacing*scale); + fonsSetBlur(ctx->fs, state->fontBlur*scale); + fonsSetAlign(ctx->fs, state->textAlign); + fonsSetFont(ctx->fs, state->fontId); + + fonsVertMetrics(ctx->fs, ascender, descender, lineh); + if (ascender != NULL) + *ascender *= invscale; + if (descender != NULL) + *descender *= invscale; + if (lineh != NULL) + *lineh *= invscale; +} +// vim: ft=c nu noet ts=4 diff --git a/dpf/dgl/src/nanovg/nanovg.h b/dpf/dgl/src/nanovg/nanovg.h new file mode 100644 index 0000000..5b27c9b --- /dev/null +++ b/dpf/dgl/src/nanovg/nanovg.h @@ -0,0 +1,620 @@ +// +// Copyright (c) 2013 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef NANOVG_H +#define NANOVG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define NVG_PI 3.14159265358979323846264338327f + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union +#endif + +typedef struct NVGcontext NVGcontext; + +struct NVGcolor { + union { + float rgba[4]; + struct { + float r,g,b,a; + }; + }; +}; +typedef struct NVGcolor NVGcolor; + +struct NVGpaint { + float xform[6]; + float extent[2]; + float radius; + float feather; + NVGcolor innerColor; + NVGcolor outerColor; + int image; +}; +typedef struct NVGpaint NVGpaint; + +enum NVGwinding { + NVG_CCW = 1, // Winding for solid shapes + NVG_CW = 2, // Winding for holes +}; + +enum NVGsolidity { + NVG_SOLID = 1, // CCW + NVG_HOLE = 2, // CW +}; + +enum NVGlineCap { + NVG_BUTT, + NVG_ROUND, + NVG_SQUARE, + NVG_BEVEL, + NVG_MITER, +}; + +enum NVGalign { + // Horizontal align + NVG_ALIGN_LEFT = 1<<0, // Default, align text horizontally to left. + NVG_ALIGN_CENTER = 1<<1, // Align text horizontally to center. + NVG_ALIGN_RIGHT = 1<<2, // Align text horizontally to right. + // Vertical align + NVG_ALIGN_TOP = 1<<3, // Align text vertically to top. + NVG_ALIGN_MIDDLE = 1<<4, // Align text vertically to middle. + NVG_ALIGN_BOTTOM = 1<<5, // Align text vertically to bottom. + NVG_ALIGN_BASELINE = 1<<6, // Default, align text vertically to baseline. +}; + +struct NVGglyphPosition { + const char* str; // Position of the glyph in the input string. + float x; // The x-coordinate of the logical glyph position. + float minx, maxx; // The bounds of the glyph shape. +}; +typedef struct NVGglyphPosition NVGglyphPosition; + +struct NVGtextRow { + const char* start; // Pointer to the input text where the row starts. + const char* end; // Pointer to the input text where the row ends (one past the last character). + const char* next; // Pointer to the beginning of the next row. + float width; // Logical width of the row. + float minx, maxx; // Actual bounds of the row. Logical with and bounds can differ because of kerning and some parts over extending. +}; +typedef struct NVGtextRow NVGtextRow; + +enum NVGimageFlags { + NVG_IMAGE_GENERATE_MIPMAPS = 1<<0, // Generate mipmaps during creation of the image. + NVG_IMAGE_REPEATX = 1<<1, // Repeat image in X direction. + NVG_IMAGE_REPEATY = 1<<2, // Repeat image in Y direction. + NVG_IMAGE_FLIPY = 1<<3, // Flips (inverses) image in Y direction when rendered. + NVG_IMAGE_PREMULTIPLIED = 1<<4, // Image data has premultiplied alpha. +}; + +// Begin drawing a new frame +// Calls to nanovg drawing API should be wrapped in nvgBeginFrame() & nvgEndFrame() +// nvgBeginFrame() defines the size of the window to render to in relation currently +// set viewport (i.e. glViewport on GL backends). Device pixel ration allows to +// control the rendering on Hi-DPI devices. +// For example, GLFW returns two dimension for an opened window: window size and +// frame buffer size. In that case you would set windowWidth/Height to the window size +// devicePixelRatio to: frameBufferWidth / windowWidth. +void nvgBeginFrame(NVGcontext* ctx, int windowWidth, int windowHeight, float devicePixelRatio); + +// Cancels drawing the current frame. +void nvgCancelFrame(NVGcontext* ctx); + +// Ends drawing flushing remaining render state. +void nvgEndFrame(NVGcontext* ctx); + +// +// Color utils +// +// Colors in NanoVG are stored as unsigned ints in ABGR format. + +// Returns a color value from red, green, blue values. Alpha will be set to 255 (1.0f). +NVGcolor nvgRGB(unsigned char r, unsigned char g, unsigned char b); + +// Returns a color value from red, green, blue values. Alpha will be set to 1.0f. +NVGcolor nvgRGBf(float r, float g, float b); + + +// Returns a color value from red, green, blue and alpha values. +NVGcolor nvgRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a); + +// Returns a color value from red, green, blue and alpha values. +NVGcolor nvgRGBAf(float r, float g, float b, float a); + + +// Linearly interpolates from color c0 to c1, and returns resulting color value. +NVGcolor nvgLerpRGBA(NVGcolor c0, NVGcolor c1, float u); + +// Sets transparency of a color value. +NVGcolor nvgTransRGBA(NVGcolor c0, unsigned char a); + +// Sets transparency of a color value. +NVGcolor nvgTransRGBAf(NVGcolor c0, float a); + +// Returns color value specified by hue, saturation and lightness. +// HSL values are all in range [0..1], alpha will be set to 255. +NVGcolor nvgHSL(float h, float s, float l); + +// Returns color value specified by hue, saturation and lightness and alpha. +// HSL values are all in range [0..1], alpha in range [0..255] +NVGcolor nvgHSLA(float h, float s, float l, unsigned char a); + +// +// State Handling +// +// NanoVG contains state which represents how paths will be rendered. +// The state contains transform, fill and stroke styles, text and font styles, +// and scissor clipping. + +// Pushes and saves the current render state into a state stack. +// A matching nvgRestore() must be used to restore the state. +void nvgSave(NVGcontext* ctx); + +// Pops and restores current render state. +void nvgRestore(NVGcontext* ctx); + +// Resets current render state to default values. Does not affect the render state stack. +void nvgReset(NVGcontext* ctx); + +// +// Render styles +// +// Fill and stroke render style can be either a solid color or a paint which is a gradient or a pattern. +// Solid color is simply defined as a color value, different kinds of paints can be created +// using nvgLinearGradient(), nvgBoxGradient(), nvgRadialGradient() and nvgImagePattern(). +// +// Current render style can be saved and restored using nvgSave() and nvgRestore(). + +// Sets current stroke style to a solid color. +void nvgStrokeColor(NVGcontext* ctx, NVGcolor color); + +// Sets current stroke style to a paint, which can be a one of the gradients or a pattern. +void nvgStrokePaint(NVGcontext* ctx, NVGpaint paint); + +// Sets current fill style to a solid color. +void nvgFillColor(NVGcontext* ctx, NVGcolor color); + +// Sets current fill style to a paint, which can be a one of the gradients or a pattern. +void nvgFillPaint(NVGcontext* ctx, NVGpaint paint); + +// Sets the miter limit of the stroke style. +// Miter limit controls when a sharp corner is beveled. +void nvgMiterLimit(NVGcontext* ctx, float limit); + +// Sets the stroke width of the stroke style. +void nvgStrokeWidth(NVGcontext* ctx, float size); + +// Sets how the end of the line (cap) is drawn, +// Can be one of: NVG_BUTT (default), NVG_ROUND, NVG_SQUARE. +void nvgLineCap(NVGcontext* ctx, int cap); + +// Sets how sharp path corners are drawn. +// Can be one of NVG_MITER (default), NVG_ROUND, NVG_BEVEL. +void nvgLineJoin(NVGcontext* ctx, int join); + +// Sets the transparency applied to all rendered shapes. +// Already transparent paths will get proportionally more transparent as well. +void nvgGlobalAlpha(NVGcontext* ctx, float alpha); + +// +// Transforms +// +// The paths, gradients, patterns and scissor region are transformed by an transformation +// matrix at the time when they are passed to the API. +// The current transformation matrix is a affine matrix: +// [sx kx tx] +// [ky sy ty] +// [ 0 0 1] +// Where: sx,sy define scaling, kx,ky skewing, and tx,ty translation. +// The last row is assumed to be 0,0,1 and is not stored. +// +// Apart from nvgResetTransform(), each transformation function first creates +// specific transformation matrix and pre-multiplies the current transformation by it. +// +// Current coordinate system (transformation) can be saved and restored using nvgSave() and nvgRestore(). + +// Resets current transform to a identity matrix. +void nvgResetTransform(NVGcontext* ctx); + +// Premultiplies current coordinate system by specified matrix. +// The parameters are interpreted as matrix as follows: +// [a c e] +// [b d f] +// [0 0 1] +void nvgTransform(NVGcontext* ctx, float a, float b, float c, float d, float e, float f); + +// Translates current coordinate system. +void nvgTranslate(NVGcontext* ctx, float x, float y); + +// Rotates current coordinate system. Angle is specified in radians. +void nvgRotate(NVGcontext* ctx, float angle); + +// Skews the current coordinate system along X axis. Angle is specified in radians. +void nvgSkewX(NVGcontext* ctx, float angle); + +// Skews the current coordinate system along Y axis. Angle is specified in radians. +void nvgSkewY(NVGcontext* ctx, float angle); + +// Scales the current coordinate system. +void nvgScale(NVGcontext* ctx, float x, float y); + +// Stores the top part (a-f) of the current transformation matrix in to the specified buffer. +// [a c e] +// [b d f] +// [0 0 1] +// There should be space for 6 floats in the return buffer for the values a-f. +void nvgCurrentTransform(NVGcontext* ctx, float* xform); + + +// The following functions can be used to make calculations on 2x3 transformation matrices. +// A 2x3 matrix is represented as float[6]. + +// Sets the transform to identity matrix. +void nvgTransformIdentity(float* dst); + +// Sets the transform to translation matrix matrix. +void nvgTransformTranslate(float* dst, float tx, float ty); + +// Sets the transform to scale matrix. +void nvgTransformScale(float* dst, float sx, float sy); + +// Sets the transform to rotate matrix. Angle is specified in radians. +void nvgTransformRotate(float* dst, float a); + +// Sets the transform to skew-x matrix. Angle is specified in radians. +void nvgTransformSkewX(float* dst, float a); + +// Sets the transform to skew-y matrix. Angle is specified in radians. +void nvgTransformSkewY(float* dst, float a); + +// Sets the transform to the result of multiplication of two transforms, of A = A*B. +void nvgTransformMultiply(float* dst, const float* src); + +// Sets the transform to the result of multiplication of two transforms, of A = B*A. +void nvgTransformPremultiply(float* dst, const float* src); + +// Sets the destination to inverse of specified transform. +// Returns 1 if the inverse could be calculated, else 0. +int nvgTransformInverse(float* dst, const float* src); + +// Transform a point by given transform. +void nvgTransformPoint(float* dstx, float* dsty, const float* xform, float srcx, float srcy); + +// Converts degrees to radians and vice versa. +float nvgDegToRad(float deg); +float nvgRadToDeg(float rad); + +// +// Images +// +// NanoVG allows you to load jpg, png, psd, tga, pic and gif files to be used for rendering. +// In addition you can upload your own image. The image loading is provided by stb_image. +// The parameter imageFlags is combination of flags defined in NVGimageFlags. + +// Creates image by loading it from the disk from specified file name. +// Returns handle to the image. +int nvgCreateImage(NVGcontext* ctx, const char* filename, int imageFlags); + +// Creates image by loading it from the specified chunk of memory. +// Returns handle to the image. +int nvgCreateImageMem(NVGcontext* ctx, int imageFlags, const unsigned char* data, int ndata); + +// Creates image from specified image data. +// Returns handle to the image. +int nvgCreateImageRGBA(NVGcontext* ctx, int w, int h, int imageFlags, const unsigned char* data); + +// Updates image data specified by image handle. +void nvgUpdateImage(NVGcontext* ctx, int image, const unsigned char* data); + +// Returns the dimensions of a created image. +void nvgImageSize(NVGcontext* ctx, int image, int* w, int* h); + +// Deletes created image. +void nvgDeleteImage(NVGcontext* ctx, int image); + +// +// Paints +// +// NanoVG supports four types of paints: linear gradient, box gradient, radial gradient and image pattern. +// These can be used as paints for strokes and fills. + +// Creates and returns a linear gradient. Parameters (sx,sy)-(ex,ey) specify the start and end coordinates +// of the linear gradient, icol specifies the start color and ocol the end color. +// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint(). +NVGpaint nvgLinearGradient(NVGcontext* ctx, float sx, float sy, float ex, float ey, + NVGcolor icol, NVGcolor ocol); + +// Creates and returns a box gradient. Box gradient is a feathered rounded rectangle, it is useful for rendering +// drop shadows or highlights for boxes. Parameters (x,y) define the top-left corner of the rectangle, +// (w,h) define the size of the rectangle, r defines the corner radius, and f feather. Feather defines how blurry +// the border of the rectangle is. Parameter icol specifies the inner color and ocol the outer color of the gradient. +// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint(). +NVGpaint nvgBoxGradient(NVGcontext* ctx, float x, float y, float w, float h, + float r, float f, NVGcolor icol, NVGcolor ocol); + +// Creates and returns a radial gradient. Parameters (cx,cy) specify the center, inr and outr specify +// the inner and outer radius of the gradient, icol specifies the start color and ocol the end color. +// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint(). +NVGpaint nvgRadialGradient(NVGcontext* ctx, float cx, float cy, float inr, float outr, + NVGcolor icol, NVGcolor ocol); + +// Creates and returns an image patter. Parameters (ox,oy) specify the left-top location of the image pattern, +// (ex,ey) the size of one image, angle rotation around the top-left corner, image is handle to the image to render. +// The gradient is transformed by the current transform when it is passed to nvgFillPaint() or nvgStrokePaint(). +NVGpaint nvgImagePattern(NVGcontext* ctx, float ox, float oy, float ex, float ey, + float angle, int image, float alpha); + +// +// Scissoring +// +// Scissoring allows you to clip the rendering into a rectangle. This is useful for various +// user interface cases like rendering a text edit or a timeline. + +// Sets the current scissor rectangle. +// The scissor rectangle is transformed by the current transform. +void nvgScissor(NVGcontext* ctx, float x, float y, float w, float h); + +// Intersects current scissor rectangle with the specified rectangle. +// The scissor rectangle is transformed by the current transform. +// Note: in case the rotation of previous scissor rect differs from +// the current one, the intersection will be done between the specified +// rectangle and the previous scissor rectangle transformed in the current +// transform space. The resulting shape is always rectangle. +void nvgIntersectScissor(NVGcontext* ctx, float x, float y, float w, float h); + +// Reset and disables scissoring. +void nvgResetScissor(NVGcontext* ctx); + +// +// Paths +// +// Drawing a new shape starts with nvgBeginPath(), it clears all the currently defined paths. +// Then you define one or more paths and sub-paths which describe the shape. The are functions +// to draw common shapes like rectangles and circles, and lower level step-by-step functions, +// which allow to define a path curve by curve. +// +// NanoVG uses even-odd fill rule to draw the shapes. Solid shapes should have counter clockwise +// winding and holes should have counter clockwise order. To specify winding of a path you can +// call nvgPathWinding(). This is useful especially for the common shapes, which are drawn CCW. +// +// Finally you can fill the path using current fill style by calling nvgFill(), and stroke it +// with current stroke style by calling nvgStroke(). +// +// The curve segments and sub-paths are transformed by the current transform. + +// Clears the current path and sub-paths. +void nvgBeginPath(NVGcontext* ctx); + +// Starts new sub-path with specified point as first point. +void nvgMoveTo(NVGcontext* ctx, float x, float y); + +// Adds line segment from the last point in the path to the specified point. +void nvgLineTo(NVGcontext* ctx, float x, float y); + +// Adds cubic bezier segment from last point in the path via two control points to the specified point. +void nvgBezierTo(NVGcontext* ctx, float c1x, float c1y, float c2x, float c2y, float x, float y); + +// Adds quadratic bezier segment from last point in the path via a control point to the specified point. +void nvgQuadTo(NVGcontext* ctx, float cx, float cy, float x, float y); + +// Adds an arc segment at the corner defined by the last path point, and two specified points. +void nvgArcTo(NVGcontext* ctx, float x1, float y1, float x2, float y2, float radius); + +// Closes current sub-path with a line segment. +void nvgClosePath(NVGcontext* ctx); + +// Sets the current sub-path winding, see NVGwinding and NVGsolidity. +void nvgPathWinding(NVGcontext* ctx, int dir); + +// Creates new circle arc shaped sub-path. The arc center is at cx,cy, the arc radius is r, +// and the arc is drawn from angle a0 to a1, and swept in direction dir (NVG_CCW, or NVG_CW). +// Angles are specified in radians. +void nvgArc(NVGcontext* ctx, float cx, float cy, float r, float a0, float a1, int dir); + +// Creates new rectangle shaped sub-path. +void nvgRect(NVGcontext* ctx, float x, float y, float w, float h); + +// Creates new rounded rectangle shaped sub-path. +void nvgRoundedRect(NVGcontext* ctx, float x, float y, float w, float h, float r); + +// Creates new ellipse shaped sub-path. +void nvgEllipse(NVGcontext* ctx, float cx, float cy, float rx, float ry); + +// Creates new circle shaped sub-path. +void nvgCircle(NVGcontext* ctx, float cx, float cy, float r); + +// Fills the current path with current fill style. +void nvgFill(NVGcontext* ctx); + +// Fills the current path with current stroke style. +void nvgStroke(NVGcontext* ctx); + + +// +// Text +// +// NanoVG allows you to load .ttf files and use the font to render text. +// +// The appearance of the text can be defined by setting the current text style +// and by specifying the fill color. Common text and font settings such as +// font size, letter spacing and text align are supported. Font blur allows you +// to create simple text effects such as drop shadows. +// +// At render time the font face can be set based on the font handles or name. +// +// Font measure functions return values in local space, the calculations are +// carried in the same resolution as the final rendering. This is done because +// the text glyph positions are snapped to the nearest pixels sharp rendering. +// +// The local space means that values are not rotated or scale as per the current +// transformation. For example if you set font size to 12, which would mean that +// line height is 16, then regardless of the current scaling and rotation, the +// returned line height is always 16. Some measures may vary because of the scaling +// since aforementioned pixel snapping. +// +// While this may sound a little odd, the setup allows you to always render the +// same way regardless of scaling. I.e. following works regardless of scaling: +// +// const char* txt = "Text me up."; +// nvgTextBounds(vg, x,y, txt, NULL, bounds); +// nvgBeginPath(vg); +// nvgRoundedRect(vg, bounds[0],bounds[1], bounds[2]-bounds[0], bounds[3]-bounds[1]); +// nvgFill(vg); +// +// Note: currently only solid color fill is supported for text. + +// Creates font by loading it from the disk from specified file name. +// Returns handle to the font. +int nvgCreateFont(NVGcontext* ctx, const char* name, const char* filename); + +// Creates image by loading it from the specified memory chunk. +// Returns handle to the font. +int nvgCreateFontMem(NVGcontext* ctx, const char* name, const unsigned char* data, int ndata, int freeData); + +// Finds a loaded font of specified name, and returns handle to it, or -1 if the font is not found. +int nvgFindFont(NVGcontext* ctx, const char* name); + +// Sets the font size of current text style. +void nvgFontSize(NVGcontext* ctx, float size); + +// Sets the blur of current text style. +void nvgFontBlur(NVGcontext* ctx, float blur); + +// Sets the letter spacing of current text style. +void nvgTextLetterSpacing(NVGcontext* ctx, float spacing); + +// Sets the proportional line height of current text style. The line height is specified as multiple of font size. +void nvgTextLineHeight(NVGcontext* ctx, float lineHeight); + +// Sets the text align of current text style, see NVGalign for options. +void nvgTextAlign(NVGcontext* ctx, int align); + +// Sets the font face based on specified id of current text style. +void nvgFontFaceId(NVGcontext* ctx, int font); + +// Sets the font face based on specified name of current text style. +void nvgFontFace(NVGcontext* ctx, const char* font); + +// Draws text string at specified location. If end is specified only the sub-string up to the end is drawn. +float nvgText(NVGcontext* ctx, float x, float y, const char* string, const char* end); + +// Draws multi-line text string at specified location wrapped at the specified width. If end is specified only the sub-string up to the end is drawn. +// White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. +// Words longer than the max width are slit at nearest character (i.e. no hyphenation). +void nvgTextBox(NVGcontext* ctx, float x, float y, float breakRowWidth, const char* string, const char* end); + +// Measures the specified text string. Parameter bounds should be a pointer to float[4], +// if the bounding box of the text should be returned. The bounds value are [xmin,ymin, xmax,ymax] +// Returns the horizontal advance of the measured text (i.e. where the next character should drawn). +// Measured values are returned in local coordinate space. +float nvgTextBounds(NVGcontext* ctx, float x, float y, const char* string, const char* end, float* bounds); + +// Measures the specified multi-text string. Parameter bounds should be a pointer to float[4], +// if the bounding box of the text should be returned. The bounds value are [xmin,ymin, xmax,ymax] +// Measured values are returned in local coordinate space. +void nvgTextBoxBounds(NVGcontext* ctx, float x, float y, float breakRowWidth, const char* string, const char* end, float* bounds); + +// Calculates the glyph x positions of the specified text. If end is specified only the sub-string will be used. +// Measured values are returned in local coordinate space. +int nvgTextGlyphPositions(NVGcontext* ctx, float x, float y, const char* string, const char* end, NVGglyphPosition* positions, int maxPositions); + +// Returns the vertical metrics based on the current text style. +// Measured values are returned in local coordinate space. +void nvgTextMetrics(NVGcontext* ctx, float* ascender, float* descender, float* lineh); + +// Breaks the specified text into lines. If end is specified only the sub-string will be used. +// White space is stripped at the beginning of the rows, the text is split at word boundaries or when new-line characters are encountered. +// Words longer than the max width are slit at nearest character (i.e. no hyphenation). +int nvgTextBreakLines(NVGcontext* ctx, const char* string, const char* end, float breakRowWidth, NVGtextRow* rows, int maxRows); + +// +// Internal Render API +// +enum NVGtexture { + NVG_TEXTURE_ALPHA = 0x01, + NVG_TEXTURE_RGBA = 0x02, +}; + +struct NVGscissor { + float xform[6]; + float extent[2]; +}; +typedef struct NVGscissor NVGscissor; + +struct NVGvertex { + float x,y,u,v; +}; +typedef struct NVGvertex NVGvertex; + +struct NVGpath { + int first; + int count; + unsigned char closed; + int nbevel; + NVGvertex* fill; + int nfill; + NVGvertex* stroke; + int nstroke; + int winding; + int convex; +}; +typedef struct NVGpath NVGpath; + +struct NVGparams { + void* userPtr; + int edgeAntiAlias; + int (*renderCreate)(void* uptr); + int (*renderCreateTexture)(void* uptr, int type, int w, int h, int imageFlags, const unsigned char* data); + int (*renderDeleteTexture)(void* uptr, int image); + int (*renderUpdateTexture)(void* uptr, int image, int x, int y, int w, int h, const unsigned char* data); + int (*renderGetTextureSize)(void* uptr, int image, int* w, int* h); + void (*renderViewport)(void* uptr, int width, int height); + void (*renderCancel)(void* uptr); + void (*renderFlush)(void* uptr); + void (*renderFill)(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, const float* bounds, const NVGpath* paths, int npaths); + void (*renderStroke)(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, float strokeWidth, const NVGpath* paths, int npaths); + void (*renderTriangles)(void* uptr, NVGpaint* paint, NVGscissor* scissor, const NVGvertex* verts, int nverts); + void (*renderDelete)(void* uptr); +}; +typedef struct NVGparams NVGparams; + +// Constructor and destructor, called by the render back-end. +NVGcontext* nvgCreateInternal(NVGparams* params); +void nvgDeleteInternal(NVGcontext* ctx); + +NVGparams* nvgInternalParams(NVGcontext* ctx); + +// Debug function to dump cached path data. +void nvgDebugDumpPathCache(NVGcontext* ctx); + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#define NVG_NOTUSED(v) for (;;) { (void)(1 ? (void)0 : ( (void)(v) ) ); break; } + +#ifdef __cplusplus +} +#endif + +#endif // NANOVG_H diff --git a/dpf/dgl/src/nanovg/nanovg_gl.h b/dpf/dgl/src/nanovg/nanovg_gl.h new file mode 100644 index 0000000..0b3c4c9 --- /dev/null +++ b/dpf/dgl/src/nanovg/nanovg_gl.h @@ -0,0 +1,1525 @@ +// +// Copyright (c) 2009-2013 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// +#ifndef NANOVG_GL_H +#define NANOVG_GL_H + +#ifdef __cplusplus +extern "C" { +#endif + +// Create flags + +enum NVGcreateFlags { + // Flag indicating if geometry based anti-aliasing is used (may not be needed when using MSAA). + NVG_ANTIALIAS = 1<<0, + // Flag indicating if strokes should be drawn using stencil buffer. The rendering will be a little + // slower, but path overlaps (i.e. self-intersecting or sharp turns) will be drawn just once. + NVG_STENCIL_STROKES = 1<<1, + // Flag indicating that additional debug checks are done. + NVG_DEBUG = 1<<2, +}; + +#if defined NANOVG_GL2_IMPLEMENTATION +# define NANOVG_GL2 1 +# define NANOVG_GL_IMPLEMENTATION 1 +#elif defined NANOVG_GL3_IMPLEMENTATION +# define NANOVG_GL3 1 +# define NANOVG_GL_IMPLEMENTATION 1 +# define NANOVG_GL_USE_UNIFORMBUFFER 1 +#elif defined NANOVG_GLES2_IMPLEMENTATION +# define NANOVG_GLES2 1 +# define NANOVG_GL_IMPLEMENTATION 1 +#elif defined NANOVG_GLES3_IMPLEMENTATION +# define NANOVG_GLES3 1 +# define NANOVG_GL_IMPLEMENTATION 1 +#endif + +#define NANOVG_GL_USE_STATE_FILTER (1) + +// Creates NanoVG contexts for different OpenGL (ES) versions. +// Flags should be combination of the create flags above. + +#if defined NANOVG_GL2 + +NVGcontext* nvgCreateGL2(int flags); +void nvgDeleteGL2(NVGcontext* ctx); + +#endif + +#if defined NANOVG_GL3 + +NVGcontext* nvgCreateGL3(int flags); +void nvgDeleteGL3(NVGcontext* ctx); + +#endif + +#if defined NANOVG_GLES2 + +NVGcontext* nvgCreateGLES2(int flags); +void nvgDeleteGLES2(NVGcontext* ctx); + +#endif + +#if defined NANOVG_GLES3 + +NVGcontext* nvgCreateGLES3(int flags); +void nvgDeleteGLES3(NVGcontext* ctx); + +#endif + +// These are additional flags on top of NVGimageFlags. +enum NVGimageFlagsGL { + NVG_IMAGE_NODELETE = 1<<16, // Do not delete GL texture handle. +}; + +int nvglCreateImageFromHandle(NVGcontext* ctx, GLuint textureId, int w, int h, int flags); +GLuint nvglImageHandle(NVGcontext* ctx, int image); + + +#ifdef __cplusplus +} +#endif + +#endif /* NANOVG_GL_H */ + +#ifdef NANOVG_GL_IMPLEMENTATION + +#include +#include +#include +#include +#include "nanovg.h" + +enum GLNVGuniformLoc { + GLNVG_LOC_VIEWSIZE, + GLNVG_LOC_TEX, + GLNVG_LOC_FRAG, + GLNVG_MAX_LOCS +}; + +enum GLNVGshaderType { + NSVG_SHADER_FILLGRAD, + NSVG_SHADER_FILLIMG, + NSVG_SHADER_SIMPLE, + NSVG_SHADER_IMG +}; + +#if NANOVG_GL_USE_UNIFORMBUFFER +enum GLNVGuniformBindings { + GLNVG_FRAG_BINDING = 0, +}; +#endif + +struct GLNVGshader { + GLuint prog; + GLuint frag; + GLuint vert; + GLint loc[GLNVG_MAX_LOCS]; +}; +typedef struct GLNVGshader GLNVGshader; + +struct GLNVGtexture { + int id; + GLuint tex; + int width, height; + int type; + int flags; +}; +typedef struct GLNVGtexture GLNVGtexture; + +enum GLNVGcallType { + GLNVG_NONE = 0, + GLNVG_FILL, + GLNVG_CONVEXFILL, + GLNVG_STROKE, + GLNVG_TRIANGLES, +}; + +struct GLNVGcall { + int type; + int image; + int pathOffset; + int pathCount; + int triangleOffset; + int triangleCount; + int uniformOffset; +}; +typedef struct GLNVGcall GLNVGcall; + +struct GLNVGpath { + int fillOffset; + int fillCount; + int strokeOffset; + int strokeCount; +}; +typedef struct GLNVGpath GLNVGpath; + +struct GLNVGfragUniforms { + #if NANOVG_GL_USE_UNIFORMBUFFER + float scissorMat[12]; // matrices are actually 3 vec4s + float paintMat[12]; + struct NVGcolor innerCol; + struct NVGcolor outerCol; + float scissorExt[2]; + float scissorScale[2]; + float extent[2]; + float radius; + float feather; + float strokeMult; + float strokeThr; + int texType; + int type; + #else + // note: after modifying layout or size of uniform array, + // don't forget to also update the fragment shader source! + #define NANOVG_GL_UNIFORMARRAY_SIZE 11 + union { + struct { + float scissorMat[12]; // matrices are actually 3 vec4s + float paintMat[12]; + struct NVGcolor innerCol; + struct NVGcolor outerCol; + float scissorExt[2]; + float scissorScale[2]; + float extent[2]; + float radius; + float feather; + float strokeMult; + float strokeThr; + float texType; + float type; + }; + float uniformArray[NANOVG_GL_UNIFORMARRAY_SIZE][4]; + }; + #endif +}; +typedef struct GLNVGfragUniforms GLNVGfragUniforms; + +struct GLNVGcontext { + GLNVGshader shader; + GLNVGtexture* textures; + float view[2]; + int ntextures; + int ctextures; + int textureId; + GLuint vertBuf; +#if defined NANOVG_GL3 + GLuint vertArr; +#endif +#if NANOVG_GL_USE_UNIFORMBUFFER + GLuint fragBuf; +#endif + int fragSize; + int flags; + + // Per frame buffers + GLNVGcall* calls; + int ccalls; + int ncalls; + GLNVGpath* paths; + int cpaths; + int npaths; + struct NVGvertex* verts; + int cverts; + int nverts; + unsigned char* uniforms; + int cuniforms; + int nuniforms; + + // cached state + #if NANOVG_GL_USE_STATE_FILTER + GLuint boundTexture; + GLuint stencilMask; + GLenum stencilFunc; + GLint stencilFuncRef; + GLuint stencilFuncMask; + #endif +}; +typedef struct GLNVGcontext GLNVGcontext; + +static int glnvg__maxi(int a, int b) { return a > b ? a : b; } + +#ifdef NANOVG_GLES2 +static unsigned int glnvg__nearestPow2(unsigned int num) +{ + unsigned n = num > 0 ? num - 1 : 0; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n++; + return n; +} +#endif + +static void glnvg__bindTexture(GLNVGcontext* gl, GLuint tex) +{ +#if NANOVG_GL_USE_STATE_FILTER + if (gl->boundTexture != tex) { + gl->boundTexture = tex; + glBindTexture(GL_TEXTURE_2D, tex); + } +#else + glBindTexture(GL_TEXTURE_2D, tex); +#endif +} + +static void glnvg__stencilMask(GLNVGcontext* gl, GLuint mask) +{ +#if NANOVG_GL_USE_STATE_FILTER + if (gl->stencilMask != mask) { + gl->stencilMask = mask; + glStencilMask(mask); + } +#else + glStencilMask(mask); +#endif +} + +static void glnvg__stencilFunc(GLNVGcontext* gl, GLenum func, GLint ref, GLuint mask) +{ +#if NANOVG_GL_USE_STATE_FILTER + if ((gl->stencilFunc != func) || + (gl->stencilFuncRef != ref) || + (gl->stencilFuncMask != mask)) { + + gl->stencilFunc = func; + gl->stencilFuncRef = ref; + gl->stencilFuncMask = mask; + glStencilFunc(func, ref, mask); + } +#else + glStencilFunc(func, ref, mask); +#endif +} + +static GLNVGtexture* glnvg__allocTexture(GLNVGcontext* gl) +{ + GLNVGtexture* tex = NULL; + int i; + + for (i = 0; i < gl->ntextures; i++) { + if (gl->textures[i].id == 0) { + tex = &gl->textures[i]; + break; + } + } + if (tex == NULL) { + if (gl->ntextures+1 > gl->ctextures) { + GLNVGtexture* textures; + int ctextures = glnvg__maxi(gl->ntextures+1, 4) + gl->ctextures/2; // 1.5x Overallocate + textures = (GLNVGtexture*)realloc(gl->textures, sizeof(GLNVGtexture)*ctextures); + if (textures == NULL) return NULL; + gl->textures = textures; + gl->ctextures = ctextures; + } + tex = &gl->textures[gl->ntextures++]; + } + + memset(tex, 0, sizeof(*tex)); + tex->id = ++gl->textureId; + + return tex; +} + +static GLNVGtexture* glnvg__findTexture(GLNVGcontext* gl, int id) +{ + int i; + for (i = 0; i < gl->ntextures; i++) + if (gl->textures[i].id == id) + return &gl->textures[i]; + return NULL; +} + +static int glnvg__deleteTexture(GLNVGcontext* gl, int id) +{ + int i; + for (i = 0; i < gl->ntextures; i++) { + if (gl->textures[i].id == id) { + if (gl->textures[i].tex != 0 && (gl->textures[i].flags & NVG_IMAGE_NODELETE) == 0) + glDeleteTextures(1, &gl->textures[i].tex); + memset(&gl->textures[i], 0, sizeof(gl->textures[i])); + return 1; + } + } + return 0; +} + +static void glnvg__dumpShaderError(GLuint shader, const char* name, const char* type) +{ + char str[512+1]; + int len = 0; + glGetShaderInfoLog(shader, 512, &len, str); + if (len > 512) len = 512; + str[len] = '\0'; + printf("Shader %s/%s error:\n%s\n", name, type, str); +} + +static void glnvg__dumpProgramError(GLuint prog, const char* name) +{ + char str[512+1]; + int len = 0; + glGetProgramInfoLog(prog, 512, &len, str); + if (len > 512) len = 512; + str[len] = '\0'; + printf("Program %s error:\n%s\n", name, str); +} + +static void glnvg__checkError(GLNVGcontext* gl, const char* str) +{ + GLenum err; + if ((gl->flags & NVG_DEBUG) == 0) return; + err = glGetError(); + if (err != GL_NO_ERROR) { + printf("Error %08x after %s\n", err, str); + return; + } +} + +static int glnvg__createShader(GLNVGshader* shader, const char* name, const char* header, const char* opts, const char* vshader, const char* fshader) +{ + GLint status; + GLuint prog, vert, frag; + const char* str[3]; + str[0] = header; + str[1] = opts != NULL ? opts : ""; + + memset(shader, 0, sizeof(*shader)); + + prog = glCreateProgram(); + vert = glCreateShader(GL_VERTEX_SHADER); + frag = glCreateShader(GL_FRAGMENT_SHADER); + str[2] = vshader; + glShaderSource(vert, 3, str, 0); + str[2] = fshader; + glShaderSource(frag, 3, str, 0); + + glCompileShader(vert); + glGetShaderiv(vert, GL_COMPILE_STATUS, &status); + if (status != GL_TRUE) { + glnvg__dumpShaderError(vert, name, "vert"); + return 0; + } + + glCompileShader(frag); + glGetShaderiv(frag, GL_COMPILE_STATUS, &status); + if (status != GL_TRUE) { + glnvg__dumpShaderError(frag, name, "frag"); + return 0; + } + + glAttachShader(prog, vert); + glAttachShader(prog, frag); + + glBindAttribLocation(prog, 0, "vertex"); + glBindAttribLocation(prog, 1, "tcoord"); + + glLinkProgram(prog); + glGetProgramiv(prog, GL_LINK_STATUS, &status); + if (status != GL_TRUE) { + glnvg__dumpProgramError(prog, name); + return 0; + } + + shader->prog = prog; + shader->vert = vert; + shader->frag = frag; + + return 1; +} + +static void glnvg__deleteShader(GLNVGshader* shader) +{ + if (shader->prog != 0) + glDeleteProgram(shader->prog); + if (shader->vert != 0) + glDeleteShader(shader->vert); + if (shader->frag != 0) + glDeleteShader(shader->frag); +} + +static void glnvg__getUniforms(GLNVGshader* shader) +{ + shader->loc[GLNVG_LOC_VIEWSIZE] = glGetUniformLocation(shader->prog, "viewSize"); + shader->loc[GLNVG_LOC_TEX] = glGetUniformLocation(shader->prog, "tex"); + +#if NANOVG_GL_USE_UNIFORMBUFFER + shader->loc[GLNVG_LOC_FRAG] = glGetUniformBlockIndex(shader->prog, "frag"); +#else + shader->loc[GLNVG_LOC_FRAG] = glGetUniformLocation(shader->prog, "frag"); +#endif +} + +static int glnvg__renderCreate(void* uptr) +{ + GLNVGcontext* gl = (GLNVGcontext*)uptr; + int align = 4; + + // TODO: mediump float may not be enough for GLES2 in iOS. + // see the following discussion: https://github.com/memononen/nanovg/issues/46 + static const char* shaderHeader = +#if defined NANOVG_GL2 + "#define NANOVG_GL2 1\n" +#elif defined NANOVG_GL3 + "#version 150 core\n" + "#define NANOVG_GL3 1\n" +#elif defined NANOVG_GLES2 + "#version 100\n" + "#define NANOVG_GL2 1\n" +#elif defined NANOVG_GLES3 + "#version 300 es\n" + "#define NANOVG_GL3 1\n" +#endif + +#if NANOVG_GL_USE_UNIFORMBUFFER + "#define USE_UNIFORMBUFFER 1\n" +#else + "#define UNIFORMARRAY_SIZE 11\n" +#endif + "\n"; + + static const char* fillVertShader = + "#ifdef NANOVG_GL3\n" + " uniform vec2 viewSize;\n" + " in vec2 vertex;\n" + " in vec2 tcoord;\n" + " out vec2 ftcoord;\n" + " out vec2 fpos;\n" + "#else\n" + " uniform vec2 viewSize;\n" + " attribute vec2 vertex;\n" + " attribute vec2 tcoord;\n" + " varying vec2 ftcoord;\n" + " varying vec2 fpos;\n" + "#endif\n" + "void main(void) {\n" + " ftcoord = tcoord;\n" + " fpos = vertex;\n" + " gl_Position = vec4(2.0*vertex.x/viewSize.x - 1.0, 1.0 - 2.0*vertex.y/viewSize.y, 0, 1);\n" + "}\n"; + + static const char* fillFragShader = + "#ifdef GL_ES\n" + "#if defined(GL_FRAGMENT_PRECISION_HIGH) || defined(NANOVG_GL3)\n" + " precision highp float;\n" + "#else\n" + " precision mediump float;\n" + "#endif\n" + "#endif\n" + "#ifdef NANOVG_GL3\n" + "#ifdef USE_UNIFORMBUFFER\n" + " layout(std140) uniform frag {\n" + " mat3 scissorMat;\n" + " mat3 paintMat;\n" + " vec4 innerCol;\n" + " vec4 outerCol;\n" + " vec2 scissorExt;\n" + " vec2 scissorScale;\n" + " vec2 extent;\n" + " float radius;\n" + " float feather;\n" + " float strokeMult;\n" + " float strokeThr;\n" + " int texType;\n" + " int type;\n" + " };\n" + "#else\n" // NANOVG_GL3 && !USE_UNIFORMBUFFER + " uniform vec4 frag[UNIFORMARRAY_SIZE];\n" + "#endif\n" + " uniform sampler2D tex;\n" + " in vec2 ftcoord;\n" + " in vec2 fpos;\n" + " out vec4 outColor;\n" + "#else\n" // !NANOVG_GL3 + " uniform vec4 frag[UNIFORMARRAY_SIZE];\n" + " uniform sampler2D tex;\n" + " varying vec2 ftcoord;\n" + " varying vec2 fpos;\n" + "#endif\n" + "#ifndef USE_UNIFORMBUFFER\n" + " #define scissorMat mat3(frag[0].xyz, frag[1].xyz, frag[2].xyz)\n" + " #define paintMat mat3(frag[3].xyz, frag[4].xyz, frag[5].xyz)\n" + " #define innerCol frag[6]\n" + " #define outerCol frag[7]\n" + " #define scissorExt frag[8].xy\n" + " #define scissorScale frag[8].zw\n" + " #define extent frag[9].xy\n" + " #define radius frag[9].z\n" + " #define feather frag[9].w\n" + " #define strokeMult frag[10].x\n" + " #define strokeThr frag[10].y\n" + " #define texType int(frag[10].z)\n" + " #define type int(frag[10].w)\n" + "#endif\n" + "\n" + "float sdroundrect(vec2 pt, vec2 ext, float rad) {\n" + " vec2 ext2 = ext - vec2(rad,rad);\n" + " vec2 d = abs(pt) - ext2;\n" + " return min(max(d.x,d.y),0.0) + length(max(d,0.0)) - rad;\n" + "}\n" + "\n" + "// Scissoring\n" + "float scissorMask(vec2 p) {\n" + " vec2 sc = (abs((scissorMat * vec3(p,1.0)).xy) - scissorExt);\n" + " sc = vec2(0.5,0.5) - sc * scissorScale;\n" + " return clamp(sc.x,0.0,1.0) * clamp(sc.y,0.0,1.0);\n" + "}\n" + "#ifdef EDGE_AA\n" + "// Stroke - from [0..1] to clipped pyramid, where the slope is 1px.\n" + "float strokeMask() {\n" + " return min(1.0, (1.0-abs(ftcoord.x*2.0-1.0))*strokeMult) * min(1.0, ftcoord.y);\n" + "}\n" + "#endif\n" + "\n" + "void main(void) {\n" + " vec4 result;\n" + " float scissor = scissorMask(fpos);\n" + "#ifdef EDGE_AA\n" + " float strokeAlpha = strokeMask();\n" + "#else\n" + " float strokeAlpha = 1.0;\n" + "#endif\n" + " if (type == 0) { // Gradient\n" + " // Calculate gradient color using box gradient\n" + " vec2 pt = (paintMat * vec3(fpos,1.0)).xy;\n" + " float d = clamp((sdroundrect(pt, extent, radius) + feather*0.5) / feather, 0.0, 1.0);\n" + " vec4 color = mix(innerCol,outerCol,d);\n" + " // Combine alpha\n" + " color *= strokeAlpha * scissor;\n" + " result = color;\n" + " } else if (type == 1) { // Image\n" + " // Calculate color fron texture\n" + " vec2 pt = (paintMat * vec3(fpos,1.0)).xy / extent;\n" + "#ifdef NANOVG_GL3\n" + " vec4 color = texture(tex, pt);\n" + "#else\n" + " vec4 color = texture2D(tex, pt);\n" + "#endif\n" + " if (texType == 1) color = vec4(color.xyz*color.w,color.w);" + " if (texType == 2) color = vec4(color.x);" + " // Apply color tint and alpha.\n" + " color *= innerCol;\n" + " // Combine alpha\n" + " color *= strokeAlpha * scissor;\n" + " result = color;\n" + " } else if (type == 2) { // Stencil fill\n" + " result = vec4(1,1,1,1);\n" + " } else if (type == 3) { // Textured tris\n" + "#ifdef NANOVG_GL3\n" + " vec4 color = texture(tex, ftcoord);\n" + "#else\n" + " vec4 color = texture2D(tex, ftcoord);\n" + "#endif\n" + " if (texType == 1) color = vec4(color.xyz*color.w,color.w);" + " if (texType == 2) color = vec4(color.x);" + " color *= scissor;\n" + " result = color * innerCol;\n" + " }\n" + "#ifdef EDGE_AA\n" + " if (strokeAlpha < strokeThr) discard;\n" + "#endif\n" + "#ifdef NANOVG_GL3\n" + " outColor = result;\n" + "#else\n" + " gl_FragColor = result;\n" + "#endif\n" + "}\n"; + + glnvg__checkError(gl, "init"); + + if (gl->flags & NVG_ANTIALIAS) { + if (glnvg__createShader(&gl->shader, "shader", shaderHeader, "#define EDGE_AA 1\n", fillVertShader, fillFragShader) == 0) + return 0; + } else { + if (glnvg__createShader(&gl->shader, "shader", shaderHeader, NULL, fillVertShader, fillFragShader) == 0) + return 0; + } + + glnvg__checkError(gl, "uniform locations"); + glnvg__getUniforms(&gl->shader); + + // Create dynamic vertex array +#if defined NANOVG_GL3 + glGenVertexArrays(1, &gl->vertArr); +#endif + glGenBuffers(1, &gl->vertBuf); + +#if NANOVG_GL_USE_UNIFORMBUFFER + // Create UBOs + glUniformBlockBinding(gl->shader.prog, gl->shader.loc[GLNVG_LOC_FRAG], GLNVG_FRAG_BINDING); + glGenBuffers(1, &gl->fragBuf); + glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &align); +#endif + gl->fragSize = sizeof(GLNVGfragUniforms) + align - sizeof(GLNVGfragUniforms) % align; + + glnvg__checkError(gl, "create done"); + + glFinish(); + + return 1; +} + +static int glnvg__renderCreateTexture(void* uptr, int type, int w, int h, int imageFlags, const unsigned char* data) +{ + GLNVGcontext* gl = (GLNVGcontext*)uptr; + GLNVGtexture* tex = glnvg__allocTexture(gl); + + if (tex == NULL) return 0; + +#ifdef NANOVG_GLES2 + // Check for non-power of 2. + if (glnvg__nearestPow2(w) != (unsigned int)w || glnvg__nearestPow2(h) != (unsigned int)h) { + // No repeat + if ((imageFlags & NVG_IMAGE_REPEATX) != 0 || (imageFlags & NVG_IMAGE_REPEATY) != 0) { + printf("Repeat X/Y is not supported for non power-of-two textures (%d x %d)\n", w, h); + imageFlags &= ~(NVG_IMAGE_REPEATX | NVG_IMAGE_REPEATY); + } + // No mips. + if (imageFlags & NVG_IMAGE_GENERATE_MIPMAPS) { + printf("Mip-maps is not support for non power-of-two textures (%d x %d)\n", w, h); + imageFlags &= ~NVG_IMAGE_GENERATE_MIPMAPS; + } + } +#endif + + glGenTextures(1, &tex->tex); + tex->width = w; + tex->height = h; + tex->type = type; + tex->flags = imageFlags; + glnvg__bindTexture(gl, tex->tex); + + glPixelStorei(GL_UNPACK_ALIGNMENT,1); +#ifndef NANOVG_GLES2 + glPixelStorei(GL_UNPACK_ROW_LENGTH, tex->width); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); +#endif + +#if defined (NANOVG_GL2) + // GL 1.4 and later has support for generating mipmaps using a tex parameter. + if (imageFlags & NVG_IMAGE_GENERATE_MIPMAPS) { + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); + } +#endif + + if (type == NVG_TEXTURE_RGBA) + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + else +#if defined(NANOVG_GLES2) + glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, w, h, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data); +#elif defined(NANOVG_GLES3) + glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, w, h, 0, GL_RED, GL_UNSIGNED_BYTE, data); +#else + glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, w, h, 0, GL_RED, GL_UNSIGNED_BYTE, data); +#endif + + if (imageFlags & NVG_IMAGE_GENERATE_MIPMAPS) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + } else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + if (imageFlags & NVG_IMAGE_REPEATX) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + else + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + + if (imageFlags & NVG_IMAGE_REPEATY) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + else + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); +#ifndef NANOVG_GLES2 + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); +#endif + + // The new way to build mipmaps on GLES and GL3 +#if !defined(NANOVG_GL2) + if (imageFlags & NVG_IMAGE_GENERATE_MIPMAPS) { + glGenerateMipmap(GL_TEXTURE_2D); + } +#endif + + glnvg__checkError(gl, "create tex"); + glnvg__bindTexture(gl, 0); + + return tex->id; +} + + +static int glnvg__renderDeleteTexture(void* uptr, int image) +{ + GLNVGcontext* gl = (GLNVGcontext*)uptr; + return glnvg__deleteTexture(gl, image); +} + +static int glnvg__renderUpdateTexture(void* uptr, int image, int x, int y, int w, int h, const unsigned char* data) +{ + GLNVGcontext* gl = (GLNVGcontext*)uptr; + GLNVGtexture* tex = glnvg__findTexture(gl, image); + + if (tex == NULL) return 0; + glnvg__bindTexture(gl, tex->tex); + + glPixelStorei(GL_UNPACK_ALIGNMENT,1); + +#ifndef NANOVG_GLES2 + glPixelStorei(GL_UNPACK_ROW_LENGTH, tex->width); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, x); + glPixelStorei(GL_UNPACK_SKIP_ROWS, y); +#else + // No support for all of skip, need to update a whole row at a time. + if (tex->type == NVG_TEXTURE_RGBA) + data += y*tex->width*4; + else + data += y*tex->width; + x = 0; + w = tex->width; +#endif + + if (tex->type == NVG_TEXTURE_RGBA) + glTexSubImage2D(GL_TEXTURE_2D, 0, x,y, w,h, GL_RGBA, GL_UNSIGNED_BYTE, data); + else +#ifdef NANOVG_GLES2 + glTexSubImage2D(GL_TEXTURE_2D, 0, x,y, w,h, GL_LUMINANCE, GL_UNSIGNED_BYTE, data); +#else + glTexSubImage2D(GL_TEXTURE_2D, 0, x,y, w,h, GL_RED, GL_UNSIGNED_BYTE, data); +#endif + + glPixelStorei(GL_UNPACK_ALIGNMENT, 4); +#ifndef NANOVG_GLES2 + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); +#endif + + glnvg__bindTexture(gl, 0); + + return 1; +} + +static int glnvg__renderGetTextureSize(void* uptr, int image, int* w, int* h) +{ + GLNVGcontext* gl = (GLNVGcontext*)uptr; + GLNVGtexture* tex = glnvg__findTexture(gl, image); + if (tex == NULL) return 0; + *w = tex->width; + *h = tex->height; + return 1; +} + +static void glnvg__xformToMat3x4(float* m3, float* t) +{ + m3[0] = t[0]; + m3[1] = t[1]; + m3[2] = 0.0f; + m3[3] = 0.0f; + m3[4] = t[2]; + m3[5] = t[3]; + m3[6] = 0.0f; + m3[7] = 0.0f; + m3[8] = t[4]; + m3[9] = t[5]; + m3[10] = 1.0f; + m3[11] = 0.0f; +} + +static NVGcolor glnvg__premulColor(NVGcolor c) +{ + c.r *= c.a; + c.g *= c.a; + c.b *= c.a; + return c; +} + +static int glnvg__convertPaint(GLNVGcontext* gl, GLNVGfragUniforms* frag, NVGpaint* paint, + NVGscissor* scissor, float width, float fringe, float strokeThr) +{ + GLNVGtexture* tex = NULL; + float invxform[6]; + + memset(frag, 0, sizeof(*frag)); + + frag->innerCol = glnvg__premulColor(paint->innerColor); + frag->outerCol = glnvg__premulColor(paint->outerColor); + + if (scissor->extent[0] < -0.5f || scissor->extent[1] < -0.5f) { + memset(frag->scissorMat, 0, sizeof(frag->scissorMat)); + frag->scissorExt[0] = 1.0f; + frag->scissorExt[1] = 1.0f; + frag->scissorScale[0] = 1.0f; + frag->scissorScale[1] = 1.0f; + } else { + nvgTransformInverse(invxform, scissor->xform); + glnvg__xformToMat3x4(frag->scissorMat, invxform); + frag->scissorExt[0] = scissor->extent[0]; + frag->scissorExt[1] = scissor->extent[1]; + frag->scissorScale[0] = sqrtf(scissor->xform[0]*scissor->xform[0] + scissor->xform[2]*scissor->xform[2]) / fringe; + frag->scissorScale[1] = sqrtf(scissor->xform[1]*scissor->xform[1] + scissor->xform[3]*scissor->xform[3]) / fringe; + } + + memcpy(frag->extent, paint->extent, sizeof(frag->extent)); + frag->strokeMult = (width*0.5f + fringe*0.5f) / fringe; + frag->strokeThr = strokeThr; + + if (paint->image != 0) { + tex = glnvg__findTexture(gl, paint->image); + if (tex == NULL) return 0; + if ((tex->flags & NVG_IMAGE_FLIPY) != 0) { + float flipped[6]; + nvgTransformScale(flipped, 1.0f, -1.0f); + nvgTransformMultiply(flipped, paint->xform); + nvgTransformInverse(invxform, flipped); + } else { + nvgTransformInverse(invxform, paint->xform); + } + frag->type = NSVG_SHADER_FILLIMG; + + if (tex->type == NVG_TEXTURE_RGBA) + frag->texType = (tex->flags & NVG_IMAGE_PREMULTIPLIED) ? 0 : 1; + else + frag->texType = 2; +// printf("frag->texType = %d\n", frag->texType); + } else { + frag->type = NSVG_SHADER_FILLGRAD; + frag->radius = paint->radius; + frag->feather = paint->feather; + nvgTransformInverse(invxform, paint->xform); + } + + glnvg__xformToMat3x4(frag->paintMat, invxform); + + return 1; +} + +static GLNVGfragUniforms* nvg__fragUniformPtr(GLNVGcontext* gl, int i); + +static void glnvg__setUniforms(GLNVGcontext* gl, int uniformOffset, int image) +{ +#if NANOVG_GL_USE_UNIFORMBUFFER + glBindBufferRange(GL_UNIFORM_BUFFER, GLNVG_FRAG_BINDING, gl->fragBuf, uniformOffset, sizeof(GLNVGfragUniforms)); +#else + GLNVGfragUniforms* frag = nvg__fragUniformPtr(gl, uniformOffset); + glUniform4fv(gl->shader.loc[GLNVG_LOC_FRAG], NANOVG_GL_UNIFORMARRAY_SIZE, &(frag->uniformArray[0][0])); +#endif + + if (image != 0) { + GLNVGtexture* tex = glnvg__findTexture(gl, image); + glnvg__bindTexture(gl, tex != NULL ? tex->tex : 0); + glnvg__checkError(gl, "tex paint tex"); + } else { + glnvg__bindTexture(gl, 0); + } +} + +static void glnvg__renderViewport(void* uptr, int width, int height) +{ + GLNVGcontext* gl = (GLNVGcontext*)uptr; + gl->view[0] = (float)width; + gl->view[1] = (float)height; +} + +static void glnvg__fill(GLNVGcontext* gl, GLNVGcall* call) +{ + GLNVGpath* paths = &gl->paths[call->pathOffset]; + int i, npaths = call->pathCount; + + // Draw shapes + glEnable(GL_STENCIL_TEST); + glnvg__stencilMask(gl, 0xff); + glnvg__stencilFunc(gl, GL_ALWAYS, 0, 0xff); + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + + // set bindpoint for solid loc + glnvg__setUniforms(gl, call->uniformOffset, 0); + glnvg__checkError(gl, "fill simple"); + + glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_INCR_WRAP); + glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_DECR_WRAP); + glDisable(GL_CULL_FACE); + for (i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_FAN, paths[i].fillOffset, paths[i].fillCount); + glEnable(GL_CULL_FACE); + + // Draw anti-aliased pixels + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + + glnvg__setUniforms(gl, call->uniformOffset + gl->fragSize, call->image); + glnvg__checkError(gl, "fill fill"); + + if (gl->flags & NVG_ANTIALIAS) { + glnvg__stencilFunc(gl, GL_EQUAL, 0x00, 0xff); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + // Draw fringes + for (i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); + } + + // Draw fill + glnvg__stencilFunc(gl, GL_NOTEQUAL, 0x0, 0xff); + glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO); + glDrawArrays(GL_TRIANGLES, call->triangleOffset, call->triangleCount); + + glDisable(GL_STENCIL_TEST); +} + +static void glnvg__convexFill(GLNVGcontext* gl, GLNVGcall* call) +{ + GLNVGpath* paths = &gl->paths[call->pathOffset]; + int i, npaths = call->pathCount; + + glnvg__setUniforms(gl, call->uniformOffset, call->image); + glnvg__checkError(gl, "convex fill"); + + for (i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_FAN, paths[i].fillOffset, paths[i].fillCount); + if (gl->flags & NVG_ANTIALIAS) { + // Draw fringes + for (i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); + } +} + +static void glnvg__stroke(GLNVGcontext* gl, GLNVGcall* call) +{ + GLNVGpath* paths = &gl->paths[call->pathOffset]; + int npaths = call->pathCount, i; + + if (gl->flags & NVG_STENCIL_STROKES) { + + glEnable(GL_STENCIL_TEST); + glnvg__stencilMask(gl, 0xff); + + // Fill the stroke base without overlap + glnvg__stencilFunc(gl, GL_EQUAL, 0x0, 0xff); + glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); + glnvg__setUniforms(gl, call->uniformOffset + gl->fragSize, call->image); + glnvg__checkError(gl, "stroke fill 0"); + for (i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); + + // Draw anti-aliased pixels. + glnvg__setUniforms(gl, call->uniformOffset, call->image); + glnvg__stencilFunc(gl, GL_EQUAL, 0x00, 0xff); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + for (i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); + + // Clear stencil buffer. + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + glnvg__stencilFunc(gl, GL_ALWAYS, 0x0, 0xff); + glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO); + glnvg__checkError(gl, "stroke fill 1"); + for (i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + + glDisable(GL_STENCIL_TEST); + +// glnvg__convertPaint(gl, nvg__fragUniformPtr(gl, call->uniformOffset + gl->fragSize), paint, scissor, strokeWidth, fringe, 1.0f - 0.5f/255.0f); + + } else { + glnvg__setUniforms(gl, call->uniformOffset, call->image); + glnvg__checkError(gl, "stroke fill"); + // Draw Strokes + for (i = 0; i < npaths; i++) + glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); + } +} + +static void glnvg__triangles(GLNVGcontext* gl, GLNVGcall* call) +{ + glnvg__setUniforms(gl, call->uniformOffset, call->image); + glnvg__checkError(gl, "triangles fill"); + + glDrawArrays(GL_TRIANGLES, call->triangleOffset, call->triangleCount); +} + +static void glnvg__renderCancel(void* uptr) { + GLNVGcontext* gl = (GLNVGcontext*)uptr; + gl->nverts = 0; + gl->npaths = 0; + gl->ncalls = 0; + gl->nuniforms = 0; +} + +static void glnvg__renderFlush(void* uptr) +{ + GLNVGcontext* gl = (GLNVGcontext*)uptr; + int i; + + if (gl->ncalls > 0) { + + // Setup require GL state. + glUseProgram(gl->shader.prog); + + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glFrontFace(GL_CCW); + glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + glDisable(GL_SCISSOR_TEST); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glStencilMask(0xffffffff); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + glStencilFunc(GL_ALWAYS, 0, 0xffffffff); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, 0); + #if NANOVG_GL_USE_STATE_FILTER + gl->boundTexture = 0; + gl->stencilMask = 0xffffffff; + gl->stencilFunc = GL_ALWAYS; + gl->stencilFuncRef = 0; + gl->stencilFuncMask = 0xffffffff; + #endif + +#if NANOVG_GL_USE_UNIFORMBUFFER + // Upload ubo for frag shaders + glBindBuffer(GL_UNIFORM_BUFFER, gl->fragBuf); + glBufferData(GL_UNIFORM_BUFFER, gl->nuniforms * gl->fragSize, gl->uniforms, GL_STREAM_DRAW); +#endif + + // Upload vertex data +#if defined NANOVG_GL3 + glBindVertexArray(gl->vertArr); +#endif + glBindBuffer(GL_ARRAY_BUFFER, gl->vertBuf); + glBufferData(GL_ARRAY_BUFFER, gl->nverts * sizeof(NVGvertex), gl->verts, GL_STREAM_DRAW); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(NVGvertex), (const GLvoid*)(size_t)0); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(NVGvertex), (const GLvoid*)(0 + 2*sizeof(float))); + + // Set view and texture just once per frame. + glUniform1i(gl->shader.loc[GLNVG_LOC_TEX], 0); + glUniform2fv(gl->shader.loc[GLNVG_LOC_VIEWSIZE], 1, gl->view); + +#if NANOVG_GL_USE_UNIFORMBUFFER + glBindBuffer(GL_UNIFORM_BUFFER, gl->fragBuf); +#endif + + for (i = 0; i < gl->ncalls; i++) { + GLNVGcall* call = &gl->calls[i]; + if (call->type == GLNVG_FILL) + glnvg__fill(gl, call); + else if (call->type == GLNVG_CONVEXFILL) + glnvg__convexFill(gl, call); + else if (call->type == GLNVG_STROKE) + glnvg__stroke(gl, call); + else if (call->type == GLNVG_TRIANGLES) + glnvg__triangles(gl, call); + } + + glDisableVertexAttribArray(0); + glDisableVertexAttribArray(1); +#if defined NANOVG_GL3 + glBindVertexArray(0); +#endif + glDisable(GL_CULL_FACE); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glUseProgram(0); + glnvg__bindTexture(gl, 0); + } + + // Reset calls + gl->nverts = 0; + gl->npaths = 0; + gl->ncalls = 0; + gl->nuniforms = 0; +} + +static int glnvg__maxVertCount(const NVGpath* paths, int npaths) +{ + int i, count = 0; + for (i = 0; i < npaths; i++) { + count += paths[i].nfill; + count += paths[i].nstroke; + } + return count; +} + +static GLNVGcall* glnvg__allocCall(GLNVGcontext* gl) +{ + GLNVGcall* ret = NULL; + if (gl->ncalls+1 > gl->ccalls) { + GLNVGcall* calls; + int ccalls = glnvg__maxi(gl->ncalls+1, 128) + gl->ccalls/2; // 1.5x Overallocate + calls = (GLNVGcall*)realloc(gl->calls, sizeof(GLNVGcall) * ccalls); + if (calls == NULL) return NULL; + gl->calls = calls; + gl->ccalls = ccalls; + } + ret = &gl->calls[gl->ncalls++]; + memset(ret, 0, sizeof(GLNVGcall)); + return ret; +} + +static int glnvg__allocPaths(GLNVGcontext* gl, int n) +{ + int ret = 0; + if (gl->npaths+n > gl->cpaths) { + GLNVGpath* paths; + int cpaths = glnvg__maxi(gl->npaths + n, 128) + gl->cpaths/2; // 1.5x Overallocate + paths = (GLNVGpath*)realloc(gl->paths, sizeof(GLNVGpath) * cpaths); + if (paths == NULL) return -1; + gl->paths = paths; + gl->cpaths = cpaths; + } + ret = gl->npaths; + gl->npaths += n; + return ret; +} + +static int glnvg__allocVerts(GLNVGcontext* gl, int n) +{ + int ret = 0; + if (gl->nverts+n > gl->cverts) { + NVGvertex* verts; + int cverts = glnvg__maxi(gl->nverts + n, 4096) + gl->cverts/2; // 1.5x Overallocate + verts = (NVGvertex*)realloc(gl->verts, sizeof(NVGvertex) * cverts); + if (verts == NULL) return -1; + gl->verts = verts; + gl->cverts = cverts; + } + ret = gl->nverts; + gl->nverts += n; + return ret; +} + +static int glnvg__allocFragUniforms(GLNVGcontext* gl, int n) +{ + int ret = 0, structSize = gl->fragSize; + if (gl->nuniforms+n > gl->cuniforms) { + unsigned char* uniforms; + int cuniforms = glnvg__maxi(gl->nuniforms+n, 128) + gl->cuniforms/2; // 1.5x Overallocate + uniforms = (unsigned char*)realloc(gl->uniforms, structSize * cuniforms); + if (uniforms == NULL) return -1; + gl->uniforms = uniforms; + gl->cuniforms = cuniforms; + } + ret = gl->nuniforms * structSize; + gl->nuniforms += n; + return ret; +} + +static GLNVGfragUniforms* nvg__fragUniformPtr(GLNVGcontext* gl, int i) +{ + return (GLNVGfragUniforms*)&gl->uniforms[i]; +} + +static void glnvg__vset(NVGvertex* vtx, float x, float y, float u, float v) +{ + vtx->x = x; + vtx->y = y; + vtx->u = u; + vtx->v = v; +} + +static void glnvg__renderFill(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, + const float* bounds, const NVGpath* paths, int npaths) +{ + GLNVGcontext* gl = (GLNVGcontext*)uptr; + GLNVGcall* call = glnvg__allocCall(gl); + NVGvertex* quad; + GLNVGfragUniforms* frag; + int i, maxverts, offset; + + if (call == NULL) return; + + call->type = GLNVG_FILL; + call->pathOffset = glnvg__allocPaths(gl, npaths); + if (call->pathOffset == -1) goto error; + call->pathCount = npaths; + call->image = paint->image; + + if (npaths == 1 && paths[0].convex) + call->type = GLNVG_CONVEXFILL; + + // Allocate vertices for all the paths. + maxverts = glnvg__maxVertCount(paths, npaths) + 6; + offset = glnvg__allocVerts(gl, maxverts); + if (offset == -1) goto error; + + for (i = 0; i < npaths; i++) { + GLNVGpath* copy = &gl->paths[call->pathOffset + i]; + const NVGpath* path = &paths[i]; + memset(copy, 0, sizeof(GLNVGpath)); + if (path->nfill > 0) { + copy->fillOffset = offset; + copy->fillCount = path->nfill; + memcpy(&gl->verts[offset], path->fill, sizeof(NVGvertex) * path->nfill); + offset += path->nfill; + } + if (path->nstroke > 0) { + copy->strokeOffset = offset; + copy->strokeCount = path->nstroke; + memcpy(&gl->verts[offset], path->stroke, sizeof(NVGvertex) * path->nstroke); + offset += path->nstroke; + } + } + + // Quad + call->triangleOffset = offset; + call->triangleCount = 6; + quad = &gl->verts[call->triangleOffset]; + glnvg__vset(&quad[0], bounds[0], bounds[3], 0.5f, 1.0f); + glnvg__vset(&quad[1], bounds[2], bounds[3], 0.5f, 1.0f); + glnvg__vset(&quad[2], bounds[2], bounds[1], 0.5f, 1.0f); + + glnvg__vset(&quad[3], bounds[0], bounds[3], 0.5f, 1.0f); + glnvg__vset(&quad[4], bounds[2], bounds[1], 0.5f, 1.0f); + glnvg__vset(&quad[5], bounds[0], bounds[1], 0.5f, 1.0f); + + // Setup uniforms for draw calls + if (call->type == GLNVG_FILL) { + call->uniformOffset = glnvg__allocFragUniforms(gl, 2); + if (call->uniformOffset == -1) goto error; + // Simple shader for stencil + frag = nvg__fragUniformPtr(gl, call->uniformOffset); + memset(frag, 0, sizeof(*frag)); + frag->strokeThr = -1.0f; + frag->type = NSVG_SHADER_SIMPLE; + // Fill shader + glnvg__convertPaint(gl, nvg__fragUniformPtr(gl, call->uniformOffset + gl->fragSize), paint, scissor, fringe, fringe, -1.0f); + } else { + call->uniformOffset = glnvg__allocFragUniforms(gl, 1); + if (call->uniformOffset == -1) goto error; + // Fill shader + glnvg__convertPaint(gl, nvg__fragUniformPtr(gl, call->uniformOffset), paint, scissor, fringe, fringe, -1.0f); + } + + return; + +error: + // We get here if call alloc was ok, but something else is not. + // Roll back the last call to prevent drawing it. + if (gl->ncalls > 0) gl->ncalls--; +} + +static void glnvg__renderStroke(void* uptr, NVGpaint* paint, NVGscissor* scissor, float fringe, + float strokeWidth, const NVGpath* paths, int npaths) +{ + GLNVGcontext* gl = (GLNVGcontext*)uptr; + GLNVGcall* call = glnvg__allocCall(gl); + int i, maxverts, offset; + + if (call == NULL) return; + + call->type = GLNVG_STROKE; + call->pathOffset = glnvg__allocPaths(gl, npaths); + if (call->pathOffset == -1) goto error; + call->pathCount = npaths; + call->image = paint->image; + + // Allocate vertices for all the paths. + maxverts = glnvg__maxVertCount(paths, npaths); + offset = glnvg__allocVerts(gl, maxverts); + if (offset == -1) goto error; + + for (i = 0; i < npaths; i++) { + GLNVGpath* copy = &gl->paths[call->pathOffset + i]; + const NVGpath* path = &paths[i]; + memset(copy, 0, sizeof(GLNVGpath)); + if (path->nstroke) { + copy->strokeOffset = offset; + copy->strokeCount = path->nstroke; + memcpy(&gl->verts[offset], path->stroke, sizeof(NVGvertex) * path->nstroke); + offset += path->nstroke; + } + } + + if (gl->flags & NVG_STENCIL_STROKES) { + // Fill shader + call->uniformOffset = glnvg__allocFragUniforms(gl, 2); + if (call->uniformOffset == -1) goto error; + + glnvg__convertPaint(gl, nvg__fragUniformPtr(gl, call->uniformOffset), paint, scissor, strokeWidth, fringe, -1.0f); + glnvg__convertPaint(gl, nvg__fragUniformPtr(gl, call->uniformOffset + gl->fragSize), paint, scissor, strokeWidth, fringe, 1.0f - 0.5f/255.0f); + + } else { + // Fill shader + call->uniformOffset = glnvg__allocFragUniforms(gl, 1); + if (call->uniformOffset == -1) goto error; + glnvg__convertPaint(gl, nvg__fragUniformPtr(gl, call->uniformOffset), paint, scissor, strokeWidth, fringe, -1.0f); + } + + return; + +error: + // We get here if call alloc was ok, but something else is not. + // Roll back the last call to prevent drawing it. + if (gl->ncalls > 0) gl->ncalls--; +} + +static void glnvg__renderTriangles(void* uptr, NVGpaint* paint, NVGscissor* scissor, + const NVGvertex* verts, int nverts) +{ + GLNVGcontext* gl = (GLNVGcontext*)uptr; + GLNVGcall* call = glnvg__allocCall(gl); + GLNVGfragUniforms* frag; + + if (call == NULL) return; + + call->type = GLNVG_TRIANGLES; + call->image = paint->image; + + // Allocate vertices for all the paths. + call->triangleOffset = glnvg__allocVerts(gl, nverts); + if (call->triangleOffset == -1) goto error; + call->triangleCount = nverts; + + memcpy(&gl->verts[call->triangleOffset], verts, sizeof(NVGvertex) * nverts); + + // Fill shader + call->uniformOffset = glnvg__allocFragUniforms(gl, 1); + if (call->uniformOffset == -1) goto error; + frag = nvg__fragUniformPtr(gl, call->uniformOffset); + glnvg__convertPaint(gl, frag, paint, scissor, 1.0f, 1.0f, -1.0f); + frag->type = NSVG_SHADER_IMG; + + return; + +error: + // We get here if call alloc was ok, but something else is not. + // Roll back the last call to prevent drawing it. + if (gl->ncalls > 0) gl->ncalls--; +} + +static void glnvg__renderDelete(void* uptr) +{ + GLNVGcontext* gl = (GLNVGcontext*)uptr; + int i; + if (gl == NULL) return; + + glnvg__deleteShader(&gl->shader); + +#if NANOVG_GL3 +#if NANOVG_GL_USE_UNIFORMBUFFER + if (gl->fragBuf != 0) + glDeleteBuffers(1, &gl->fragBuf); +#endif + if (gl->vertArr != 0) + glDeleteVertexArrays(1, &gl->vertArr); +#endif + if (gl->vertBuf != 0) + glDeleteBuffers(1, &gl->vertBuf); + + for (i = 0; i < gl->ntextures; i++) { + if (gl->textures[i].tex != 0 && (gl->textures[i].flags & NVG_IMAGE_NODELETE) == 0) + glDeleteTextures(1, &gl->textures[i].tex); + } + free(gl->textures); + + free(gl->paths); + free(gl->verts); + free(gl->uniforms); + free(gl->calls); + + free(gl); +} + + +#if defined NANOVG_GL2 +NVGcontext* nvgCreateGL2(int flags) +#elif defined NANOVG_GL3 +NVGcontext* nvgCreateGL3(int flags) +#elif defined NANOVG_GLES2 +NVGcontext* nvgCreateGLES2(int flags) +#elif defined NANOVG_GLES3 +NVGcontext* nvgCreateGLES3(int flags) +#endif +{ + NVGparams params; + NVGcontext* ctx = NULL; + GLNVGcontext* gl = (GLNVGcontext*)malloc(sizeof(GLNVGcontext)); + if (gl == NULL) goto error; + memset(gl, 0, sizeof(GLNVGcontext)); + + memset(¶ms, 0, sizeof(params)); + params.renderCreate = glnvg__renderCreate; + params.renderCreateTexture = glnvg__renderCreateTexture; + params.renderDeleteTexture = glnvg__renderDeleteTexture; + params.renderUpdateTexture = glnvg__renderUpdateTexture; + params.renderGetTextureSize = glnvg__renderGetTextureSize; + params.renderViewport = glnvg__renderViewport; + params.renderCancel = glnvg__renderCancel; + params.renderFlush = glnvg__renderFlush; + params.renderFill = glnvg__renderFill; + params.renderStroke = glnvg__renderStroke; + params.renderTriangles = glnvg__renderTriangles; + params.renderDelete = glnvg__renderDelete; + params.userPtr = gl; + params.edgeAntiAlias = flags & NVG_ANTIALIAS ? 1 : 0; + + gl->flags = flags; + + ctx = nvgCreateInternal(¶ms); + if (ctx == NULL) goto error; + + return ctx; + +error: + // 'gl' is freed by nvgDeleteInternal. + if (ctx != NULL) nvgDeleteInternal(ctx); + return NULL; +} + +#if defined NANOVG_GL2 +void nvgDeleteGL2(NVGcontext* ctx) +#elif defined NANOVG_GL3 +void nvgDeleteGL3(NVGcontext* ctx) +#elif defined NANOVG_GLES2 +void nvgDeleteGLES2(NVGcontext* ctx) +#elif defined NANOVG_GLES3 +void nvgDeleteGLES3(NVGcontext* ctx) +#endif +{ + nvgDeleteInternal(ctx); +} + +int nvglCreateImageFromHandle(NVGcontext* ctx, GLuint textureId, int w, int h, int imageFlags) +{ + GLNVGcontext* gl = (GLNVGcontext*)nvgInternalParams(ctx)->userPtr; + GLNVGtexture* tex = glnvg__allocTexture(gl); + + if (tex == NULL) return 0; + + tex->type = NVG_TEXTURE_RGBA; + tex->tex = textureId; + tex->flags = imageFlags; + tex->width = w; + tex->height = h; + + return tex->id; +} + +GLuint nvglImageHandle(NVGcontext* ctx, int image) +{ + GLNVGcontext* gl = (GLNVGcontext*)nvgInternalParams(ctx)->userPtr; + GLNVGtexture* tex = glnvg__findTexture(gl, image); + return tex->tex; +} + +#endif /* NANOVG_GL_IMPLEMENTATION */ diff --git a/dpf/dgl/src/nanovg/nanovg_gl_utils.h b/dpf/dgl/src/nanovg/nanovg_gl_utils.h new file mode 100644 index 0000000..89ae481 --- /dev/null +++ b/dpf/dgl/src/nanovg/nanovg_gl_utils.h @@ -0,0 +1,132 @@ +// +// Copyright (c) 2009-2013 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// +#ifndef NANOVG_GL_UTILS_H +#define NANOVG_GL_UTILS_H + +struct NVGLUframebuffer { + NVGcontext* ctx; + GLuint fbo; + GLuint rbo; + GLuint texture; + int image; +}; +typedef struct NVGLUframebuffer NVGLUframebuffer; + +// Helper function to create GL frame buffer to render to. +void nvgluBindFramebuffer(NVGLUframebuffer* fb); +NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h, int imageFlags); +void nvgluDeleteFramebuffer(NVGcontext* ctx, NVGLUframebuffer* fb); + +#endif // NANOVG_GL_UTILS_H + +#ifdef NANOVG_GL_IMPLEMENTATION + +#if defined(NANOVG_GL3) || defined(NANOVG_GLES2) || defined(NANOVG_GLES3) +// FBO is core in OpenGL 3>. +# define NANOVG_FBO_VALID 1 +#elif defined(NANOVG_GL2) +// On OS X including glext defines FBO on GL2 too. +# ifdef __APPLE__ +# include +# define NANOVG_FBO_VALID 1 +# endif +#endif + +static GLint defaultFBO = -1; + +NVGLUframebuffer* nvgluCreateFramebuffer(NVGcontext* ctx, int w, int h, int imageFlags) +{ +#ifdef NANOVG_FBO_VALID + GLint defaultFBO; + GLint defaultRBO; + NVGLUframebuffer* fb = NULL; + + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); + glGetIntegerv(GL_RENDERBUFFER_BINDING, &defaultRBO); + + fb = (NVGLUframebuffer*)malloc(sizeof(NVGLUframebuffer)); + if (fb == NULL) goto error; + memset(fb, 0, sizeof(NVGLUframebuffer)); + + fb->image = nvgCreateImageRGBA(ctx, w, h, imageFlags | NVG_IMAGE_FLIPY | NVG_IMAGE_PREMULTIPLIED, NULL); + fb->texture = nvglImageHandle(ctx, fb->image); + + // frame buffer object + glGenFramebuffers(1, &fb->fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fb->fbo); + + // render buffer object + glGenRenderbuffers(1, &fb->rbo); + glBindRenderbuffer(GL_RENDERBUFFER, fb->rbo); + glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, w, h); + + // combine all + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb->texture, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fb->rbo); + + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) goto error; + + glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO); + glBindRenderbuffer(GL_RENDERBUFFER, defaultRBO); + return fb; +error: + glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO); + glBindRenderbuffer(GL_RENDERBUFFER, defaultRBO); + nvgluDeleteFramebuffer(ctx, fb); + return NULL; +#else + NVG_NOTUSED(ctx); + NVG_NOTUSED(w); + NVG_NOTUSED(h); + NVG_NOTUSED(imageFlags); + return NULL; +#endif +} + +void nvgluBindFramebuffer(NVGLUframebuffer* fb) +{ +#ifdef NANOVG_FBO_VALID + if (defaultFBO == -1) glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO); + glBindFramebuffer(GL_FRAMEBUFFER, fb != NULL ? fb->fbo : defaultFBO); +#else + NVG_NOTUSED(fb); +#endif +} + +void nvgluDeleteFramebuffer(NVGcontext* ctx, NVGLUframebuffer* fb) +{ +#ifdef NANOVG_FBO_VALID + if (fb == NULL) return; + if (fb->fbo != 0) + glDeleteFramebuffers(1, &fb->fbo); + if (fb->rbo != 0) + glDeleteRenderbuffers(1, &fb->rbo); + if (fb->image >= 0) + nvgDeleteImage(ctx, fb->image); + fb->fbo = 0; + fb->rbo = 0; + fb->texture = 0; + fb->image = -1; + free(fb); +#else + NVG_NOTUSED(ctx); + NVG_NOTUSED(fb); +#endif +} + +#endif // NANOVG_GL_IMPLEMENTATION diff --git a/dpf/dgl/src/nanovg/stb_image.h b/dpf/dgl/src/nanovg/stb_image.h new file mode 100644 index 0000000..a5868ea --- /dev/null +++ b/dpf/dgl/src/nanovg/stb_image.h @@ -0,0 +1,4648 @@ +/* stb_image - v1.39 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c + when you control the images you're loading + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline (no JPEG progressive) + PNG 8-bit-per-channel only + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + + - stbi__jpeg_huff_decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - stbi__jpeg_huff_decode from arbitrary I/O callbacks + - overridable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) + + Latest revisions: + 1.39 (2014-06-15) TGA optimization fix, multiple BMP fixes + 1.38 (2014-06-06) suppress MSVC run-time warnings, fix accidental rename of 'skip' + 1.37 (2014-06-04) remove duplicate typedef + 1.36 (2014-06-03) converted to header file, allow reading incorrect iphoned-images without iphone flag + 1.35 (2014-05-27) warnings, bugfixes, TGA optimization, etc + 1.34 (unknown ) warning fix + 1.33 (2011-07-14) minor fixes suggested by Dave Moore + + See end of file for full revision history. + + TODO: + stbi_info support for BMP,PSD,HDR,PIC + + + ============================ Contributors ========================= + + Image formats Bug fixes & warning fixes + Sean Barrett (jpeg, png, bmp) Marc LeBlanc + Nicolas Schulz (hdr, psd) Christpher Lloyd + Jonathan Dummer (tga) Dave Moore + Jean-Marc Lienher (gif) Won Chun + Tom Seddon (pic) the Horde3D community + Thatcher Ulrich (psd) Janez Zemva + Jonathan Blow + Laurent Gomila + Extensions, features Aruelien Pocheville + Jetro Lauha (stbi_info) Ryamond Barbiero + James "moose2000" Brown (iPhone PNG) David Woo + Ben "Disch" Wenger (io callbacks) Roy Eltham + Martin "SpartanJ" Golini Luke Graham + Thomas Ruf + John Bartholomew + Optimizations & bugfixes Ken Hamada + Fabian "ryg" Giesen Cort Stratton + Arseny Kapoulkine Blazej Dariusz Roszkowski + Thibault Reuille + If your name should be here but Paul Du Bois + isn't, let Sean know. Guillaume George + Jerry Jansson + Hayaki Saito +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// Limitations: +// - no jpeg progressive support +// - non-HDR formats support 8-bit samples only (jpeg, png) +// - no delayed line count (jpeg) -- IJG doesn't support either +// - no 1-bit BMP +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data) +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *comp -- outputs # of image components in image file +// int req_comp -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'req_comp' if req_comp is non-zero, or *comp otherwise. +// If req_comp is non-zero, *comp has the number of components that _would_ +// have been output otherwise. E.g. if you set req_comp to 4, you will always +// get RGBA output, but you can check *comp to easily see if it's opaque. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *comp will be unchanged. The function stbi_failure_reason() +// can be queried for an extremely brief, end-user unfriendly explanation +// of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid +// compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// =========================================================================== +// +// iPhone PNG support: +// +// By default we convert iphone-formatted PNGs back to RGB; nominally they +// would silently load as BGR, except the existing code should have just +// failed on such iPhone PNGs. But you can disable this conversion by +// by calling stbi_convert_iphone_png_to_rgb(0), in which case +// you will always just get the native iphone "format" through. +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image now supports loading HDR images in general, and currently +// the Radiance .HDR file format, although the support is provided +// generically. You can still load any file through the existing interface; +// if you attempt to load an HDR file, it will be automatically remapped to +// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). + + +#ifndef STBI_NO_STDIO + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#define _CRT_SECURE_NO_WARNINGS // suppress warnings about fopen() +#pragma warning(push) +#pragma warning(disable:4996) // suppress even more warnings about fopen() +#endif +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for req_comp + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +typedef unsigned char stbi_uc; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int (*eof) (void *user); // returns nonzero if we are at end of file/data +} stbi_io_callbacks; + +STBIDEF stbi_uc *stbi_load_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); + +#ifndef STBI_NO_HDR + STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); + #endif + + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp); + + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); + + STBIDEF void stbi_ldr_to_hdr_gamma(float gamma); + STBIDEF void stbi_ldr_to_hdr_scale(float scale); +#endif // STBI_NO_HDR + +// stbi_is_hdr is always defined +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// NOT THREADSAFE +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); + +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply); + +// indicate whether we should process iphone images back to canonical format, +// or just pass them through "as-is" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +// define faster low-level operations (typically SIMD support) +#ifdef STBI_SIMD +typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize); +// compute an integer IDCT on "input" +// input[x] = data[x] * dequantize[x] +// write results to 'out': 64 samples, each run of 8 spaced by 'out_stride' +// CLAMP results to 0..255 +typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step); +// compute a conversion from YCbCr to RGB +// 'count' pixels +// write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B +// y: Y input channel +// cb: Cb input channel; scale/biased to be 0..255 +// cr: Cr input channel; scale/biased to be 0..255 + +STBIDEF void stbi_install_idct(stbi_idct_8x8 func); +STBIDEF void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func); +#endif // STBI_SIMD + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#ifndef STBI_NO_HDR +#include // ldexp +#include // strcmp, strtok +#endif + +#ifndef STBI_NO_STDIO +#include +#endif +#include +#include +#include +#include +#include // ptrdiff_t on osx + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + + +#ifdef _MSC_VER +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-stbi__jpeg_huff_decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + fseek((FILE*) user, n, SEEK_CUR); +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; +} + +static int stbi__jpeg_test(stbi__context *s); +static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_test(stbi__context *s); +static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__bmp_test(stbi__context *s); +static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__tga_test(stbi__context *s); +static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_test(stbi__context *s); +static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +#ifndef STBI_NO_HDR +static int stbi__hdr_test(stbi__context *s); +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +#endif +static int stbi__pic_test(stbi__context *s); +static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__gif_test(stbi__context *s); +static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp); +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp); + + +// this is not threadsafe +static const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + free(retval_from_stbi_load); +} + +#ifndef STBI_NO_HDR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp); +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp); +#endif + +static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp); + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp); + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp); + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp); + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp); + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp); + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + return stbi__tga_load(s,x,y,comp,req_comp); + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +#ifndef STBI_NO_STDIO +STBIDEF unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi_load_main(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} +#endif //!STBI_NO_STDIO + +STBIDEF unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi_load_main(&s,x,y,comp,req_comp); +} + +unsigned char *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi_load_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_HDR + +float *stbi_loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) + return stbi__hdr_load(s,x,y,comp,req_comp); + #endif + data = stbi_load_main(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi_loadf_main(&s,x,y,comp,req_comp); +} + +float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi_loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = fopen(filename, "rb"); + float *result; + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi_loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_HDR + +// these is-hdr-or-not is defined independent of whether STBI_NO_HDR is +// defined, for API simplicity; if STBI_NO_HDR is defined, it always +// reports false! + +int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_file(&s,f); + return stbi__hdr_test(&s); + #else + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + return 0; + #endif +} + +#ifndef STBI_NO_HDR +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; } +void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; } + +void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; } +void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; } +#endif + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + SCAN_load=0, + SCAN_type, + SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, stbi__err.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} + +static void stbi__skip(stbi__context *s, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} + +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} + +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} + +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} + +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} + +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + return z + (stbi__get16le(s) << 16); +} + +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (stbi__err.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + assert(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) malloc(req_comp * x * y); + if (good == NULL) { + free(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define COMBO(a,b) ((a)*8+(b)) + #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (COMBO(img_n, req_comp)) { + CASE(1,2) dest[0]=src[0], dest[1]=255; break; + CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; + CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; + CASE(2,1) dest[0]=src[0]; break; + CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; + CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; + CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; + CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; + CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break; + CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; + CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; + CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; + default: assert(0); + } + #undef CASE + } + + free(data); + return good; +} + +#ifndef STBI_NO_HDR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output = (float *) malloc(x * y * comp * sizeof(float)); + if (output == NULL) { free(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; + } + free(data); + return output; +} + +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output = (stbi_uc *) malloc(x * y * comp); + if (output == NULL) { free(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + free(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder (not actually fully baseline implementation) +// +// simple implementation +// - channel subsampling of at most 2 in each dimension +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - uses a lot of intermediate memory, could cache poorly +// - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4 +// stb_jpeg: 1.34 seconds (MSVC6, default release build) +// stb_jpeg: 1.06 seconds (MSVC6, processor = Pentium Pro) +// IJL11.dll: 1.08 seconds (compiled by intel) +// IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG) +// IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro) + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + #ifdef STBI_SIMD + unsigned short dequant2[4][64]; + #endif + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi_uc dequant[4][64]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data; + stbi_uc *linebuf; + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int scan_n, order[4]; + int restart_interval, todo; +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0,code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) + for (j=0; j < count[i]; ++j) + h->size[k++] = (stbi_uc) (i+1); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// stbi__jpeg_huff_decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + assert((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// combined JPEG 'receive' and JPEG 'extend', since baseline +// always extends everything it receives. +stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n) +{ + unsigned int m = 1 << (n-1); + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + + #if 1 + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + #else + k = (j->code_buffer >> (32 - n)) & stbi__bmask[n]; + j->code_bits -= n; + j->code_buffer <<= n; + #endif + // the following test is probably a random branch that won't + // predict well. I tried to table accelerate it but failed. + // maybe it's compiling as a conditional move? + if (k < m) + return (-1 << n) + k + 1; + else + return k; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// stbi__jpeg_huff_decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, int b) +{ + int diff,dc,k; + int t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) dc; + + // stbi__jpeg_huff_decode AC components, see JPEG spec + k = 1; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // stbi__jpeg_huff_decode into unzigzag'd location + data[stbi__jpeg_dezigzag[k++]] = (short) stbi__extend_receive(j,s); + } + } while (k < 64); + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) (int) (((x) * 4096 + 0.5)) +#define stbi__fsh(x) ((x) << 12) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +#ifdef STBI_SIMD +typedef unsigned short stbi_dequantize_t; +#else +typedef stbi_uc stbi_dequantize_t; +#endif + +// .344 seconds on 3*anemones.jpg +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64], stbi_dequantize_t *dequantize) +{ + int i,val[64],*v=val; + stbi_dequantize_t *dq = dequantize; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d,++dq, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0] * dq[0] << 2; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24], + d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SIMD +static stbi_idct_8x8 stbi__idct_installed = stbi__idct_block; + +STBIDEF void stbi_install_idct(stbi_idct_8x8 func) +{ + stbi__idct_installed = func; +} +#endif + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (z->scan_n == 1) { + int i,j; + #ifdef STBI_SIMD + __declspec(align(16)) + #endif + short data[64]; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; + #ifdef STBI_SIMD + stbi__idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); + #else + stbi__idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); + #endif + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + } else { // interleaved! + int i,j,k,x,y; + short data[64]; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0; + #ifdef STBI_SIMD + stbi__idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]); + #else + stbi__idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]); + #endif + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + } + return 1; +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xC2: // stbi__SOF - progressive + return stbi__err("progressive jpeg","JPEG format not supported (progressive)"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4; + int t = q & 15,i; + if (p != 0) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s); + #ifdef STBI_SIMD + for (i=0; i < 64; ++i) + z->dequant2[t][i] = z->dequant[t][i]; + #endif + L -= 65; + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + L -= n; + } + return L==0; + } + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + stbi__skip(z->s, stbi__get16be(z->s)-2); + return 1; + } + return 0; +} + +// after we see stbi__SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad stbi__SOS component count","Corrupt JPEG"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad stbi__SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + if (stbi__get8(z->s) != 0) return stbi__err("bad stbi__SOS","Corrupt JPEG"); + stbi__get8(z->s); // should be 63, but might be 0 + if (stbi__get8(z->s) != 0) return stbi__err("bad stbi__SOS","Corrupt JPEG"); + + return 1; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad stbi__SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + c = stbi__get8(s); + if (c != 3 && c != 1) return stbi__err("bad component count","Corrupt JPEG"); // JFIF requires + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad stbi__SOF len","Corrupt JPEG"); + + for (i=0; i < s->img_n; ++i) { + z->img_comp[i].id = stbi__get8(s); + if (z->img_comp[i].id != i+1) // JFIF requires + if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files! + return stbi__err("bad component ID","Corrupt JPEG"); + q = stbi__get8(s); + z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG"); + z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != SCAN_load) return 1; + + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to stbi__jpeg_huff_decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (stbi__err.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to stbi__jpeg_huff_decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (stbi__err.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].raw_data = malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); + if (z->img_comp[i].raw_data == NULL) { + for(--i; i >= 0; --i) { + free(z->img_comp[i].raw_data); + z->img_comp[i].data = NULL; + } + return stbi__err("outofmem", "Out of memory"); + } + // align blocks for installable-idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + z->img_comp[i].linebuf = NULL; + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (stbi__err.g. stbi__SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1) +#define stbi__SOS(x) ((x) == 0xda) + +static int decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no stbi__SOI","Corrupt JPEG"); + if (scan == SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no stbi__SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +static int decode_jpeg_image(stbi__jpeg *j) +{ + int m; + j->restart_interval = 0; + if (!decode_jpeg_header(j, SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + // handle 0s at the end of image data from IP Kamera 9060 + while (!stbi__at_eof(j->s)) { + int x = stbi__get8(j->s); + if (x == 255) { + j->marker = stbi__get8(j->s); + break; + } else if (x != 0) { + return 0; + } + } + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + } else { + if (!stbi__process_marker(j, m)) return 0; + } + m = stbi__get_marker(j); + } + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +#define float2fixed(x) ((int) ((x) * 65536 + 0.5)) + +// 0.38 seconds on 3*anemones.jpg (0.25 with processor = Pro) +// VC6 without processor=Pro is generating multiple LEAs per multiply! +static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 16) + 32768; // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr*float2fixed(1.40200f); + g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); + b = y_fixed + cb*float2fixed(1.77200f); + r >>= 16; + g >>= 16; + b >>= 16; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#ifdef STBI_SIMD +static stbi_YCbCr_to_RGB_run stbi__YCbCr_installed = stbi__YCbCr_to_RGB_row; + +STBIDEF void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func) +{ + stbi__YCbCr_installed = func; +} +#endif + + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + int i; + for (i=0; i < j->s->img_n; ++i) { + if (j->img_comp[i].data) { + free(j->img_comp[i].raw_data); + j->img_comp[i].data = NULL; + } + if (j->img_comp[i].linebuf) { + free(j->img_comp[i].linebuf); + j->img_comp[i].linebuf = NULL; + } + } +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n; + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + z->s->img_n = 0; + + // load a jpeg image from whichever source + if (!decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n; + + if (z->s->img_n == 3 && n < 3) + decode_n = 1; + else + decode_n = z->s->img_n; + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4]; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = stbi__resample_row_hv_2; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) malloc(n * z->s->img_x * z->s->img_y + 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + #ifdef STBI_SIMD + stbi__YCbCr_installed(out, y, coutput[1], coutput[2], z->s->img_x, n); + #else + stbi__YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s->img_x, n); + #endif + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n; // report original components, not output + return output; + } +} + +static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__jpeg j; + j.s = s; + return load_jpeg_image(&j, x,y,comp,req_comp); +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg j; + j.s = s; + r = decode_jpeg_header(&j, SCAN_type); + stbi__rewind(s); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!decode_jpeg_header(j, SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__jpeg j; + j.s = s; + return stbi__jpeg_info_raw(&j, x, y, comp); +} + +// public domain zlib stbi__jpeg_huff_decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[288]; + stbi__uint16 value[288]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + assert(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // stbi__err.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 255, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + assert(sizes[i] <= (1 << i)); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt JPEG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int k = stbi__bit_reverse(next_code[s],s); + while (k < (1 << STBI__ZFAST_BITS)) { + z->fast[k] = (stbi__uint16) c; + k += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + if (z->zbuffer >= z->zbuffer_end) return 0; + return *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + assert(z->code_buffer < (1U << z->num_bits)); + z->code_buffer |= stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + if (a->num_bits < 16) stbi__fill_bits(a); + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b < 0xffff) { + s = z->size[b]; + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; + } + + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s == 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + assert(z->size[b] == s); + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +static int stbi__zexpand(stbi__zbuf *z, int n) // need to make room for n bytes +{ + char *q; + int cur, limit; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (int) (z->zout - z->zout_start); + limit = (int) (z->zout_end - z->zout_start); + while (cur + n > limit) + limit *= 2; + q = (char *) realloc(z->zout_start, limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static int stbi__zlength_extra[31]= +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (a->zout >= a->zout_end) if (!stbi__zexpand(a, 1)) return 0; + *a->zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) return 1; + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (a->zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (a->zout + len > a->zout_end) if (!stbi__zexpand(a, len)) return 0; + p = (stbi_uc *) (a->zout - dist); + while (len--) + *a->zout++ = *p++; + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < hlit + hdist) { + int c = stbi__zhuffman_decode(a, &z_codelength); + assert(c >= 0 && c < 19); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else if (c == 16) { + c = stbi__zreceive(a,2)+3; + memset(lencodes+n, lencodes[n-1], c); + n += c; + } else if (c == 17) { + c = stbi__zreceive(a,3)+3; + memset(lencodes+n, 0, c); + n += c; + } else { + assert(c == 18); + c = stbi__zreceive(a,7)+11; + memset(lencodes+n, 0, c); + n += c; + } + } + if (n != hlit+hdist) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncomperssed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + assert(a->num_bits == 0); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +// @TODO: should statically initialize these for optimal thread safety +static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32]; +static void stbi__init_zdefaults(void) +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncomperssed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zdefault_distance[31]) stbi__init_zdefaults(); + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + free(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + free(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + free(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + + +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +#define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; +} stbi__png; + + +enum { + STBI__F_none=0, STBI__F_sub=1, STBI__F_up=2, STBI__F_avg=3, STBI__F_paeth=4, + STBI__F_avg_first, STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, STBI__F_sub, STBI__F_none, STBI__F_avg_first, STBI__F_paeth_first +}; + +static int stbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y) +{ + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n; + int k; + int img_n = s->img_n; // copy it into a local for later + assert(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) malloc(x * y * out_n); + if (!a->out) return stbi__err("outofmem", "Out of memory"); + if (s->img_x == x && s->img_y == y) { + if (raw_len != (img_n * x + 1) * y) return stbi__err("not enough pixels","Corrupt PNG"); + } else { // interlaced: + if (raw_len < (img_n * x + 1) * y) return stbi__err("not enough pixels","Corrupt PNG"); + } + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *prior = cur - stride; + int filter = *raw++; + if (filter > 4) return stbi__err("invalid filter","Corrupt PNG"); + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + // handle first pixel explicitly + for (k=0; k < img_n; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + if (img_n != out_n) cur[img_n] = 255; + raw += img_n; + cur += out_n; + prior += out_n; + // this is a little gross, so that we don't switch per-pixel or per-component + if (img_n == out_n) { + #define CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \ + for (k=0; k < img_n; ++k) + switch (filter) { + CASE(STBI__F_none) cur[k] = raw[k]; break; + CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-img_n]); break; + CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-img_n])>>1)); break; + CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-img_n],prior[k],prior[k-img_n])); break; + CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-img_n] >> 1)); break; + CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-img_n],0,0)); break; + } + #undef CASE + } else { + assert(img_n+1 == out_n); + #define CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ + for (k=0; k < img_n; ++k) + switch (filter) { + CASE(STBI__F_none) cur[k] = raw[k]; break; + CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); break; + CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); break; + CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); break; + CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); break; + CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); break; + } + #undef CASE + } + } + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, int interlaced) +{ + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, raw, raw_len, out_n, a->s->img_x, a->s->img_y); + + // de-interlacing + final = (stbi_uc *) malloc(a->s->img_x * a->s->img_y * out_n); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + if (!stbi__create_png_image_raw(a, raw, raw_len, out_n, x, y)) { + free(final); + return 0; + } + for (j=0; j < y; ++j) + for (i=0; i < x; ++i) + memcpy(final + (j*yspc[p]+yorig[p])*a->s->img_x*out_n + (i*xspc[p]+xorig[p])*out_n, + a->out + (j*x+i)*out_n, out_n); + free(a->out); + raw += (x*out_n+1)*y; + raw_len -= (x*out_n+1)*y; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + assert(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) malloc(pixel_count * pal_img_n); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + free(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__unpremultiply_on_load = 0; +static int stbi__de_iphone_flag = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag = flag_true_if_should_convert; +} + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + assert(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + p[0] = p[2] * 255 / a; + p[1] = p[1] * 255 / a; + p[2] = t * 255 / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case PNG_TYPE('I','H','D','R'): { + int depth,color,comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + depth = stbi__get8(s); if (depth != 8) return stbi__err("8bit only","PNG not supported: 8-bit only"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to stbi__jpeg_huff_decode"); + if (scan == SCAN_header) return 1; + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + for (k=0; k < s->img_n; ++k) + tc[k] = (stbi_uc) (stbi__get16be(s) & 255); // non 8-bit images will be larger + } + break; + } + + case PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; } + if (ioff + c.length > idata_limit) { + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + p = (stbi_uc *) realloc(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, 16384, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + free(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace)) return 0; + if (has_trans) + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } + free(z->expanded); z->expanded = NULL; + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp) +{ + unsigned char *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, SCAN_load, req_comp)) { + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + free(p->out); p->out = NULL; + free(p->expanded); p->expanded = NULL; + free(p->idata); p->idata = NULL; + + return result; +} + +static unsigned char *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} + +// Microsoft/Windows BMP image +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) n += 16, z >>= 16; + if (z >= 0x00100) n += 8, z >>= 8; + if (z >= 0x00010) n += 4, z >>= 4; + if (z >= 0x00004) n += 2, z >>= 2; + if (z >= 0x00002) n += 1, z >>= 1; + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +static int stbi__shiftsigned(int v, int shift, int bits) +{ + int result; + int z=0; + + if (shift < 0) v <<= -shift; + else v >>= shift; + result = v; + + z = bits; + while (z < 8) { + result += v >> z; + z += bits; + } + return result; +} + +static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0; + stbi_uc pal[256][4]; + int psize=0,i,j,compress=0,width; + int bpp, flip_vertically, pad, target, offset, hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + offset = stbi__get32le(s); + hsz = stbi__get32le(s); + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + bpp = stbi__get16le(s); + if (bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit"); + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + if (hsz == 12) { + if (bpp < 24) + psize = (offset - 14 - 24) / 3; + } else { + compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (bpp == 16 || bpp == 32) { + mr = mg = mb = 0; + if (compress == 0) { + if (bpp == 32) { + mr = 0xffu << 16; + mg = 0xffu << 8; + mb = 0xffu << 0; + ma = 0xffu << 24; + fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255 + STBI_NOTUSED(fake_a); + } else { + mr = 31u << 10; + mg = 31u << 5; + mb = 31u << 0; + } + } else if (compress == 3) { + mr = stbi__get32le(s); + mg = stbi__get32le(s); + mb = stbi__get32le(s); + // not documented, but generated by photoshop and handled by mspaint + if (mr == mg && mg == mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + assert(hsz == 108 || hsz == 124); + mr = stbi__get32le(s); + mg = stbi__get32le(s); + mb = stbi__get32le(s); + ma = stbi__get32le(s); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + if (bpp < 16) + psize = (offset - 14 - hsz) >> 2; + } + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly stbi__jpeg_huff_decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + out = (stbi_uc *) malloc(target * s->img_x * s->img_y); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { free(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4)); + if (bpp == 4) width = (s->img_x + 1) >> 1; + else if (bpp == 8) width = s->img_x; + else { free(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, offset - 14 - hsz); + if (bpp == 24) width = 3 * s->img_x; + else if (bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (bpp == 24) { + easy = 1; + } else if (bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { free(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + if (target == 4) out[z++] = a; + } + } else { + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (stbi__uint32) (bpp == 16 ? stbi__get16le(s) : stbi__get32le(s)); + int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i], p1[i] = p2[i], p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} + +// Targa Truevision - TGA +// by Jonathan Dummer + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp; + int sz; + stbi__get8(s); // discard Offset + sz = stbi__get8(s); // color type + if( sz > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + sz = stbi__get8(s); // image type + // only RGB or grey allowed, +/- RLE + if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0; + stbi__skip(s,9); + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + sz = stbi__get8(s); // bits per pixel + // only RGB or RGBA or grey allowed + if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) { + stbi__rewind(s); + return 0; + } + tga_comp = sz; + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp / 8; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res; + int sz; + stbi__get8(s); // discard Offset + sz = stbi__get8(s); // color type + if ( sz > 1 ) return 0; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE + stbi__get16be(s); // discard palette start + stbi__get16be(s); // discard palette length + stbi__get8(s); // discard bits per palette color entry + stbi__get16be(s); // discard x origin + stbi__get16be(s); // discard y origin + if ( stbi__get16be(s) < 1 ) return 0; // test width + if ( stbi__get16be(s) < 1 ) return 0; // test height + sz = stbi__get8(s); // bits per pixel + if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) + res = 0; + else + res = 1; + stbi__rewind(s); + return res; +} + +static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp = tga_bits_per_pixel / 8; + int tga_inverted = stbi__get8(s); + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4]; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + /* int tga_alpha_bits = tga_inverted & 15; */ + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // error check + if ( //(tga_indexed) || + (tga_width < 1) || (tga_height < 1) || + (tga_image_type < 1) || (tga_image_type > 3) || + ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) && + (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32)) + ) + { + return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA + } + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) + { + tga_comp = tga_palette_bits / 8; + } + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + tga_data = (unsigned char*)malloc( tga_width * tga_height * tga_comp ); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE) { + for (i=0; i < tga_height; ++i) { + int y = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + y*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)malloc( tga_palette_len * tga_palette_bits / 8 ); + if (!tga_palette) { + free(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) { + free(tga_data); + free(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in 1 byte, then perform the lookup + int pal_idx = stbi__get8(s); + if ( pal_idx >= tga_palette_len ) + { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_bits_per_pixel / 8; + for (j = 0; j*8 < tga_bits_per_pixel; ++j) + { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else + { + // read in the data raw + for (j = 0; j*8 < tga_bits_per_pixel; ++j) + { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + free( tga_palette ); + } + } + + // swap RGB + if (tga_comp >= 3) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + // OK, done + return tga_data; +} + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +static int stbi__psd_test(stbi__context *s) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + int pixelCount; + int channelCount, compression; + int channel, i, count, len; + int w,h; + stbi_uc *out; + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + // Make sure the depth is 8 bits. + if (stbi__get16be(s) != 8) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Create the destination image. + out = (stbi_uc *) malloc(4 * w*h); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4; + } else { + // Read the RLE data. + count = 0; + while (count < pixelCount) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len ^= 0x0FF; + len += 2; + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out + channel; + if (channel > channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4; + } else { + // Read the data. + for (i = 0; i < pixelCount; i++) + *p = stbi__get8(s), p += 4; + } + } + } + + if (req_comp && req_comp != 4) { + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = channelCount; + *y = h; + *x = w; + + return out; +} + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +static int stbi__pic_is4(stbi__context *s,const char *str) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + int i; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp) +{ + stbi_uc *result; + int i, x,y; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if ((1 << 28) / x < y) return stbi__errpuc("too large", "Image too large to stbi__jpeg_huff_decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) malloc(x*y*4); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + free(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out; // output buffer (always 4 components) + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[4096]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif g; + if (!stbi__gif_header(s, &g, comp, 1)) { + stbi__rewind( s ); + return 0; + } + if (x) *x = g.w; + if (y) *y = g.h; + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + + // recurse to stbi__jpeg_huff_decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + p = &g->out[g->cur_x + g->cur_y]; + c = &g->color_table[g->codes[code].suffix * 4]; + + if (c[3] >= 128) { + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (code = 0; code < clear; code++) { + g->codes[code].prefix = -1; + g->codes[code].first = (stbi_uc) code; + g->codes[code].suffix = (stbi_uc) code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) return stbi__errpuc("no clear code", "Corrupt GIF"); + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF"); + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +static void stbi__fill_gif_background(stbi__gif *g) +{ + int i; + stbi_uc *c = g->pal[g->bgindex]; + // @OPTIMIZE: write a dword at a time + for (i = 0; i < g->w * g->h * 4; i += 4) { + stbi_uc *p = &g->out[i]; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp) +{ + int i; + stbi_uc *old_out = 0; + + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + g->out = (stbi_uc *) malloc(4 * g->w * g->h); + if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); + stbi__fill_gif_background(g); + } else { + // animated-gif-only path + if (((g->eflags & 0x1C) >> 2) == 3) { + old_out = g->out; + g->out = (stbi_uc *) malloc(4 * g->w * g->h); + if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); + memcpy(g->out, old_out, g->w*g->h*4); + } + } + + for (;;) { + switch (stbi__get8(s)) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + for (i=0; i < 256; ++i) // @OPTIMIZE: stbi__jpeg_reset only the previous transparent + g->pal[i][3] = 255; + if (g->transparent >= 0 && (g->eflags & 0x01)) + g->pal[g->transparent][3] = 0; + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (o == NULL) return NULL; + + if (req_comp && req_comp != 4) + o = stbi__convert_format(o, 4, req_comp, g->w, g->h); + return o; + } + + case 0x21: // Comment Extension. + { + int len; + if (stbi__get8(s) == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + stbi__get16le(s); // delay + g->transparent = stbi__get8(s); + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) + stbi__skip(s, len); + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) 1; + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } +} + +static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(stbi__gif)); + + u = stbi__gif_load_next(s, &g, comp, req_comp); + if (u == (void *) 1) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + } + + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} + + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s) +{ + const char *signature = "#?RADIANCE\n"; + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s); + stbi__rewind(s); + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + + + // Check identifier + if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + // Read data + hdr_data = (float *) malloc(height * width * req_comp * sizeof(float)); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + free(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { free(hdr_data); free(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) scanline = (stbi_uc *) malloc(width * 4); + + for (k = 0; k < 4; ++k) { + i = 0; + while (i < width) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + free(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + + if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') { + stbi__rewind( s ); + return 0; + } + stbi__skip(s,12); + hsz = stbi__get32le(s); + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) { + stbi__rewind( s ); + return 0; + } + if (hsz == 12) { + *x = stbi__get16le(s); + *y = stbi__get16le(s); + } else { + *x = stbi__get32le(s); + *y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) { + stbi__rewind( s ); + return 0; + } + *comp = stbi__get16le(s) / 8; + return 1; +} + +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + if (stbi__get16be(s) != 8) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained; + stbi__pic_packet packets[10]; + + stbi__skip(s, 92); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) return 0; + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + if (stbi__jpeg_info(s, x, y, comp)) + return 1; + if (stbi__png_info(s, x, y, comp)) + return 1; + if (stbi__gif_info(s, x, y, comp)) + return 1; + if (stbi__bmp_info(s, x, y, comp)) + return 1; + if (stbi__psd_info(s, x, y, comp)) + return 1; + if (stbi__pic_info(s, x, y, comp)) + return 1; + #ifndef STBI_NO_HDR + if (stbi__hdr_info(s, x, y, comp)) + return 1; + #endif + // test tga last because it's a crappy test! + if (stbi__tga_info(s, x, y, comp)) + return 1; + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +#if !defined(STBI_NO_STDIO) && defined(_MSC_VER) && _MSC_VER >= 1400 +#pragma warning(pop) +#endif + + +/* + revision history: + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 2008-08-02 + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 first released version +*/ diff --git a/dpf/dgl/src/nanovg/stb_truetype.h b/dpf/dgl/src/nanovg/stb_truetype.h new file mode 100644 index 0000000..570f236 --- /dev/null +++ b/dpf/dgl/src/nanovg/stb_truetype.h @@ -0,0 +1,2081 @@ +// stb_truetype.h - v0.8 - public domain +// authored from 2009-2013 by Sean Barrett / RAD Game Tools +// +// This library processes TrueType files: +// parse files +// extract glyph metrics +// extract glyph shapes +// render glyphs to one-channel bitmaps with antialiasing (box filter) +// +// Todo: +// non-MS cmaps +// crashproof on bad data +// hinting? (no longer patented) +// cleartype-style AA? +// optimize: use simple memory allocator for intermediates +// optimize: build edge-list directly from curves +// optimize: rasterize directly from curves? +// +// ADDITIONAL CONTRIBUTORS +// +// Mikko Mononen: compound shape support, more cmap formats +// Tor Andersson: kerning, subpixel rendering +// +// Bug/warning reports: +// "Zer" on mollyrocket (with fix) +// Cass Everitt +// stoiko (Haemimont Games) +// Brian Hook +// Walter van Niftrik +// David Gow +// David Given +// Ivan-Assen Ivanov +// Anthony Pesch +// +// VERSION HISTORY +// +// 0.8 (2014-05-25) fix a few more warnings +// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back +// 0.6c (2012-07-24) improve documentation +// 0.6b (2012-07-20) fix a few more warnings +// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, +// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty +// 0.5 (2011-12-09) bugfixes: +// subpixel glyph renderer computed wrong bounding box +// first vertex of shape can be off-curve (FreeSans) +// 0.4b (2011-12-03) fixed an error in the font baking example +// 0.4 (2011-12-01) kerning, subpixel rendering (tor) +// bugfixes for: +// codepoint-to-glyph conversion using table fmt=12 +// codepoint-to-glyph conversion using table fmt=4 +// stbtt_GetBakedQuad with non-square texture (Zer) +// updated Hello World! sample to use kerning and subpixel +// fixed some warnings +// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) +// userdata, malloc-from-userdata, non-zero fill (STB) +// 0.2 (2009-03-11) Fix unsigned/signed char warnings +// 0.1 (2009-03-09) First public release +// +// LICENSE +// +// This software is in the public domain. Where that dedication is not +// recognized, you are granted a perpetual, irrevokable license to copy +// and modify this file as you see fit. +// +// USAGE +// +// Include this file in whatever places neeed to refer to it. In ONE C/C++ +// file, write: +// #define STB_TRUETYPE_IMPLEMENTATION +// before the #include of this file. This expands out the actual +// implementation into that C/C++ file. +// +// Simple 3D API (don't ship this, but it's fine for tools and quick start, +// and you can cut and paste from it to move to more advanced) +// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture +// stbtt_GetBakedQuad() -- compute quad to draw for a given char +// +// "Load" a font file from a memory buffer (you have to keep the buffer loaded) +// stbtt_InitFont() +// stbtt_GetFontOffsetForIndex() -- use for TTC font collections +// +// Render a unicode codepoint to a bitmap +// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap +// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide +// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be +// +// Character advance/positioning +// stbtt_GetCodepointHMetrics() +// stbtt_GetFontVMetrics() +// stbtt_GetCodepointKernAdvance() +// +// ADDITIONAL DOCUMENTATION +// +// Immediately after this block comment are a series of sample programs. +// +// After the sample programs is the "header file" section. This section +// includes documentation for each API function. +// +// Some important concepts to understand to use this library: +// +// Codepoint +// Characters are defined by unicode codepoints, e.g. 65 is +// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is +// the hiragana for "ma". +// +// Glyph +// A visual character shape (every codepoint is rendered as +// some glyph) +// +// Glyph index +// A font-specific integer ID representing a glyph +// +// Baseline +// Glyph shapes are defined relative to a baseline, which is the +// bottom of uppercase characters. Characters extend both above +// and below the baseline. +// +// Current Point +// As you draw text to the screen, you keep track of a "current point" +// which is the origin of each character. The current point's vertical +// position is the baseline. Even "baked fonts" use this model. +// +// Vertical Font Metrics +// The vertical qualities of the font, used to vertically position +// and space the characters. See docs for stbtt_GetFontVMetrics. +// +// Font Size in Pixels or Points +// The preferred interface for specifying font sizes in stb_truetype +// is to specify how tall the font's vertical extent should be in pixels. +// If that sounds good enough, skip the next paragraph. +// +// Most font APIs instead use "points", which are a common typographic +// measurement for describing font size, defined as 72 points per inch. +// stb_truetype provides a point API for compatibility. However, true +// "per inch" conventions don't make much sense on computer displays +// since they different monitors have different number of pixels per +// inch. For example, Windows traditionally uses a convention that +// there are 96 pixels per inch, thus making 'inch' measurements have +// nothing to do with inches, and thus effectively defining a point to +// be 1.333 pixels. Additionally, the TrueType font data provides +// an explicit scale factor to scale a given font's glyphs to points, +// but the author has observed that this scale factor is often wrong +// for non-commercial fonts, thus making fonts scaled in points +// according to the TrueType spec incoherently sized in practice. +// +// ADVANCED USAGE +// +// Quality: +// +// - Use the functions with Subpixel at the end to allow your characters +// to have subpixel positioning. Since the font is anti-aliased, not +// hinted, this is very import for quality. (This is not possible with +// baked fonts.) +// +// - Kerning is now supported, and if you're supporting subpixel rendering +// then kerning is worth using to give your text a polished look. +// +// Performance: +// +// - Convert Unicode codepoints to glyph indexes and operate on the glyphs; +// if you don't do this, stb_truetype is forced to do the conversion on +// every call. +// +// - There are a lot of memory allocations. We should modify it to take +// a temp buffer and allocate from the temp buffer (without freeing), +// should help performance a lot. +// +// NOTES +// +// The system uses the raw data found in the .ttf file without changing it +// and without building auxiliary data structures. This is a bit inefficient +// on little-endian systems (the data is big-endian), but assuming you're +// caching the bitmaps or glyph shapes this shouldn't be a big deal. +// +// It appears to be very hard to programmatically determine what font a +// given file is in a general way. I provide an API for this, but I don't +// recommend it. +// +// +// SOURCE STATISTICS (based on v0.6c, 2050 LOC) +// +// Documentation & header file 520 LOC \___ 660 LOC documentation +// Sample code 140 LOC / +// Truetype parsing 620 LOC ---- 620 LOC TrueType +// Software rasterization 240 LOC \ . +// Curve tesselation 120 LOC \__ 550 LOC Bitmap creation +// Bitmap management 100 LOC / +// Baked bitmap interface 70 LOC / +// Font name matching & access 150 LOC ---- 150 +// C runtime library abstraction 60 LOC ---- 60 + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// +//// SAMPLE PROGRAMS +//// +// +// Incomplete text-in-3d-api example, which draws quads properly aligned to be lossless +// +#if 0 +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "stb_truetype.h" + +char ttf_buffer[1<<20]; +unsigned char temp_bitmap[512*512]; + +stbtt_bakedchar cdata[96]; // ASCII 32..126 is 95 glyphs +GLstbtt_uint ftex; + +void my_stbtt_initfont(void) +{ + fread(ttf_buffer, 1, 1<<20, fopen("c:/windows/fonts/times.ttf", "rb")); + stbtt_BakeFontBitmap(data,0, 32.0, temp_bitmap,512,512, 32,96, cdata); // no guarantee this fits! + // can free ttf_buffer at this point + glGenTextures(1, &ftex); + glBindTexture(GL_TEXTURE_2D, ftex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 512,512, 0, GL_ALPHA, GL_UNSIGNED_BYTE, temp_bitmap); + // can free temp_bitmap at this point + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); +} + +void my_stbtt_print(float x, float y, char *text) +{ + // assume orthographic projection with units = screen pixels, origin at top left + glBindTexture(GL_TEXTURE_2D, ftex); + glBegin(GL_QUADS); + while (*text) { + if (*text >= 32 && *text < 128) { + stbtt_aligned_quad q; + stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9 + glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y0); + glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y0); + glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y1); + glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y1); + } + ++text; + } + glEnd(); +} +#endif +// +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program (this compiles): get a single bitmap, print as ASCII art +// +#if 0 +#include +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "stb_truetype.h" + +char ttf_buffer[1<<25]; + +int main(int argc, char **argv) +{ + stbtt_fontinfo font; + unsigned char *bitmap; + int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); + + fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); + + stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); + bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); + + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) + putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); + putchar('\n'); + } + return 0; +} +#endif +// +// Output: +// +// .ii. +// @@@@@@. +// V@Mio@@o +// :i. V@V +// :oM@@M +// :@@@MM@M +// @@o o@M +// :@@. M@M +// @@@o@@@@ +// :M@@V:@@. +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program: print "Hello World!" banner, with bugs +// +#if 0 +char buffer[24<<20]; +unsigned char screen[20][79]; + +int main(int arg, char **argv) +{ + stbtt_fontinfo font; + int i,j,ascent,baseline,ch=0; + float scale, xpos=2; // leave a little padding in case the character extends left + char *text = "Heljo World!"; + + fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); + stbtt_InitFont(&font, buffer, 0); + + scale = stbtt_ScaleForPixelHeight(&font, 15); + stbtt_GetFontVMetrics(&font, &ascent,0,0); + baseline = (int) (ascent*scale); + + while (text[ch]) { + int advance,lsb,x0,y0,x1,y1; + float x_shift = xpos - (float) floor(xpos); + stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); + stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); + stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); + // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong + // because this API is really for baking character bitmaps into textures. if you want to render + // a sequence of characters, you really need to render each bitmap to a temp buffer, then + // "alpha blend" that into the working buffer + xpos += (advance * scale); + if (text[ch+1]) + xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); + ++ch; + } + + for (j=0; j < 20; ++j) { + for (i=0; i < 78; ++i) + putchar(" .:ioVM@"[screen[j][i]>>5]); + putchar('\n'); + } + + return 0; +} +#endif + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// +//// INTEGRATION WITH YOUR CODEBASE +//// +//// The following sections allow you to supply alternate definitions +//// of C library functions used by stb_truetype. + +#ifdef STB_TRUETYPE_IMPLEMENTATION + // #define your own (u)stbtt_int8/16/32 before including to override this + #ifndef stbtt_uint8 + typedef unsigned char stbtt_uint8; + typedef signed char stbtt_int8; + typedef unsigned short stbtt_uint16; + typedef signed short stbtt_int16; + typedef unsigned int stbtt_uint32; + typedef signed int stbtt_int32; + #endif + + typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; + typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; + + // #define your own STBTT_sort() to override this to avoid qsort + #ifndef STBTT_sort + #include + #define STBTT_sort(data,num_items,item_size,compare_func) qsort(data,num_items,item_size,compare_func) + #endif + + // #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h + #ifndef STBTT_ifloor + #include + #define STBTT_ifloor(x) ((int) floor(x)) + #define STBTT_iceil(x) ((int) ceil(x)) + #endif + + #ifndef STBTT_sqrt + #include + #define STBTT_sqrt(x) sqrt(x) + #endif + + // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h + #ifndef STBTT_malloc + #include + #define STBTT_malloc(x,u) ((void)(u),malloc(x)) + #define STBTT_free(x,u) free(x) + #endif + + #ifndef STBTT_assert + #include + #define STBTT_assert(x) assert(x) + #endif + + #ifndef STBTT_strlen + #include + #define STBTT_strlen(x) strlen(x) + #endif + + #ifndef STBTT_memcpy + #include + #define STBTT_memcpy memcpy + #define STBTT_memset memset + #endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// INTERFACE +//// +//// + +#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ +#define __STB_INCLUDE_STB_TRUETYPE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// TEXTURE BAKING API +// +// If you use this API, you only have to call two functions ever. +// + +typedef struct +{ + unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap + float xoff,yoff,xadvance; +} stbtt_bakedchar; + +extern int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char *pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar *chardata); // you allocate this, it's num_chars long +// if return is positive, the first unused row of the bitmap +// if return is negative, returns the negative of the number of characters that fit +// if return is 0, no characters fit and no rows were used +// This uses a very crappy packing. + +typedef struct +{ + float x0,y0,s0,t0; // top-left + float x1,y1,s1,t1; // bottom-right +} stbtt_aligned_quad; + +extern void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph, // same data as above + int char_index, // character to display + float *xpos, float *ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad *q, // output: quad to draw + int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier +// Call GetBakedQuad with char_index = 'character - first_char', and it +// creates the quad you need to draw and advances the current position. +// +// The coordinate system used assumes y increases downwards. +// +// Characters will extend both above and below the current position; +// see discussion of "BASELINE" above. +// +// It's inefficient; you might want to c&p it and optimize it. + + +////////////////////////////////////////////////////////////////////////////// +// +// FONT LOADING +// +// + +extern int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); +// Each .ttf/.ttc file may have more than one font. Each font has a sequential +// index number starting from 0. Call this function to get the font offset for +// a given index; it returns -1 if the index is out of range. A regular .ttf +// file will only define one font and it always be at offset 0, so it will +// return '0' for index 0, and -1 for all other indices. You can just skip +// this step if you know it's that kind of font. + + +// The following structure is defined publically so you can declare one on +// the stack or as a global or etc, but you should treat it as opaque. +typedef struct stbtt_fontinfo +{ + void * userdata; + unsigned char * data; // pointer to .ttf file + int fontstart; // offset of start of font + + int numGlyphs; // number of glyphs, needed for range checking + + int loca,head,glyf,hhea,hmtx,kern; // table locations as offset from start of .ttf + int index_map; // a cmap mapping for our chosen character encoding + int indexToLocFormat; // format needed to map from glyph index to glyph +} stbtt_fontinfo; + +extern int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); +// Given an offset into the file that defines a font, this function builds +// the necessary cached info for the rest of the system. You must allocate +// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't +// need to do anything special to free it, because the contents are pure +// value data with no additional data structures. Returns 0 on failure. + + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER TO GLYPH-INDEX CONVERSIOn + +int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); +// If you're going to perform multiple operations on the same character +// and you want a speed-up, call this function with the character you're +// going to process, then use glyph-based functions instead of the +// codepoint-based functions. + + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER PROPERTIES +// + +extern float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); +// computes a scale factor to produce a font whose "height" is 'pixels' tall. +// Height is measured as the distance from the highest ascender to the lowest +// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics +// and computing: +// scale = pixels / (ascent - descent) +// so if you prefer to measure height by the ascent only, use a similar calculation. + +extern float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels); +// computes a scale factor to produce a font whose EM size is mapped to +// 'pixels' tall. This is probably what traditional APIs compute, but +// I'm not positive. + +extern void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); +// ascent is the coordinate above the baseline the font extends; descent +// is the coordinate below the baseline the font extends (i.e. it is typically negative) +// lineGap is the spacing between one row's descent and the next row's ascent... +// so you should advance the vertical position by "*ascent - *descent + *lineGap" +// these are expressed in unscaled coordinates, so you must multiply by +// the scale factor for a given size + +extern void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1); +// the bounding box around all possible characters + +extern void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); +// leftSideBearing is the offset from the current horizontal position to the left edge of the character +// advanceWidth is the offset from the current horizontal position to the next horizontal position +// these are expressed in unscaled coordinates + +extern int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); +// an additional amount to add to the 'advance' value between ch1 and ch2 + +extern int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); +// Gets the bounding box of the visible part of the glyph, in unscaled coordinates + +extern void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); +extern int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); +extern int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); +// as above, but takes one or more glyph indices for greater efficiency + + +////////////////////////////////////////////////////////////////////////////// +// +// GLYPH SHAPES (you probably don't need these, but they have to go before +// the bitmaps for C declaration-order reasons) +// + +#ifndef STBTT_vmove // you can predefine these to use different values (but why?) + enum { + STBTT_vmove=1, + STBTT_vline, + STBTT_vcurve + }; +#endif + +#ifndef stbtt_vertex // you can predefine this to use different values + // (we share this with other code at RAD) + #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file + typedef struct + { + stbtt_vertex_type x,y,cx,cy; + unsigned char type,padding; + } stbtt_vertex; +#endif + +extern int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index); +// returns non-zero if nothing is drawn for this glyph + +extern int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); +extern int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); +// returns # of vertices and fills *vertices with the pointer to them +// these are expressed in "unscaled" coordinates +// +// The shape is a series of countours. Each one starts with +// a STBTT_moveto, then consists of a series of mixed +// STBTT_lineto and STBTT_curveto segments. A lineto +// draws a line from previous endpoint to its x,y; a curveto +// draws a quadratic bezier from previous endpoint to +// its x,y, using cx,cy as the bezier control point. + +extern void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); +// frees the data allocated above + +////////////////////////////////////////////////////////////////////////////// +// +// BITMAP RENDERING +// + +extern void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); +// frees the bitmap allocated below + +extern unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); +// allocates a large-enough single-channel 8bpp bitmap and renders the +// specified character/glyph at the specified scale into it, with +// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). +// *width & *height are filled out with the width & height of the bitmap, +// which is stored left-to-right, top-to-bottom. +// +// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap + +extern unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); +// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel +// shift for the character + +extern void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); +// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap +// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap +// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the +// width and height and positioning info for it first. + +extern void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); +// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel +// shift for the character + +extern void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); +// get the bbox of the bitmap centered around the glyph origin; so the +// bitmap width is ix1-ix0, height is iy1-iy0, and location to place +// the bitmap top left is (leftSideBearing*scale,iy0). +// (Note that the bitmap uses y-increases-down, but the shape uses +// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) + +extern void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); +// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel +// shift for the character + +// the following functions are equivalent to the above functions, but operate +// on glyph indices instead of Unicode codepoints (for efficiency) +extern unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); +extern unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); +extern void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); +extern void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); +extern void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); +extern void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); + + +// @TODO: don't expose this structure +typedef struct +{ + int w,h,stride; + unsigned char *pixels; +} stbtt__bitmap; + +extern void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata); + +////////////////////////////////////////////////////////////////////////////// +// +// Finding the right font... +// +// You should really just solve this offline, keep your own tables +// of what font is what, and don't try to get it out of the .ttf file. +// That's because getting it out of the .ttf file is really hard, because +// the names in the file can appear in many possible encodings, in many +// possible languages, and e.g. if you need a case-insensitive comparison, +// the details of that depend on the encoding & language in a complex way +// (actually underspecified in truetype, but also gigantic). +// +// But you can use the provided functions in two possible ways: +// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on +// unicode-encoded names to try to find the font you want; +// you can run this before calling stbtt_InitFont() +// +// stbtt_GetFontNameString() lets you get any of the various strings +// from the file yourself and do your own comparisons on them. +// You have to have called stbtt_InitFont() first. + + +extern int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); +// returns the offset (not index) of the font that matches, or -1 if none +// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". +// if you use any other flag, use a font name like "Arial"; this checks +// the 'macStyle' header field; i don't know if fonts set this consistently +#define STBTT_MACSTYLE_DONTCARE 0 +#define STBTT_MACSTYLE_BOLD 1 +#define STBTT_MACSTYLE_ITALIC 2 +#define STBTT_MACSTYLE_UNDERSCORE 4 +#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 + +extern int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); +// returns 1/0 whether the first string interpreted as utf8 is identical to +// the second string interpreted as big-endian utf16... useful for strings from next func + +extern const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); +// returns the string (which may be big-endian double byte, e.g. for unicode) +// and puts the length in bytes in *length. +// +// some of the values for the IDs are below; for more see the truetype spec: +// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html +// http://www.microsoft.com/typography/otspec/name.htm + +enum { // platformID + STBTT_PLATFORM_ID_UNICODE =0, + STBTT_PLATFORM_ID_MAC =1, + STBTT_PLATFORM_ID_ISO =2, + STBTT_PLATFORM_ID_MICROSOFT =3 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_UNICODE + STBTT_UNICODE_EID_UNICODE_1_0 =0, + STBTT_UNICODE_EID_UNICODE_1_1 =1, + STBTT_UNICODE_EID_ISO_10646 =2, + STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, + STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT + STBTT_MS_EID_SYMBOL =0, + STBTT_MS_EID_UNICODE_BMP =1, + STBTT_MS_EID_SHIFTJIS =2, + STBTT_MS_EID_UNICODE_FULL =10 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes + STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, + STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, + STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, + STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 +}; + +enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... + // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs + STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, + STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, + STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, + STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, + STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, + STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D +}; + +enum { // languageID for STBTT_PLATFORM_ID_MAC + STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, + STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, + STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, + STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , + STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , + STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, + STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 +}; + +#ifdef __cplusplus +} +#endif + +#endif // __STB_INCLUDE_STB_TRUETYPE_H__ + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// IMPLEMENTATION +//// +//// + +#ifdef STB_TRUETYPE_IMPLEMENTATION + +////////////////////////////////////////////////////////////////////////// +// +// accessors to parse data from file +// + +// on platforms that don't allow misaligned reads, if we want to allow +// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE + +#define ttBYTE(p) (* (stbtt_uint8 *) (p)) +#define ttCHAR(p) (* (stbtt_int8 *) (p)) +#define ttFixed(p) ttLONG(p) + +#if defined(STB_TRUETYPE_BIGENDIAN) && !defined(ALLOW_UNALIGNED_TRUETYPE) + + #define ttUSHORT(p) (* (stbtt_uint16 *) (p)) + #define ttSHORT(p) (* (stbtt_int16 *) (p)) + #define ttULONG(p) (* (stbtt_uint32 *) (p)) + #define ttLONG(p) (* (stbtt_int32 *) (p)) + +#else + + stbtt_uint16 ttUSHORT(const stbtt_uint8 *p) { return p[0]*256 + p[1]; } + stbtt_int16 ttSHORT(const stbtt_uint8 *p) { return p[0]*256 + p[1]; } + stbtt_uint32 ttULONG(const stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } + stbtt_int32 ttLONG(const stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } + +#endif + +#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) +#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) + +static int stbtt__isfont(const stbtt_uint8 *font) +{ + // check the version number + if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1 + if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! + if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF + if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0 + return 0; +} + +// @OPTIMIZE: binary search +static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) +{ + stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); + stbtt_uint32 tabledir = fontstart + 12; + stbtt_int32 i; + for (i=0; i < num_tables; ++i) { + stbtt_uint32 loc = tabledir + 16*i; + if (stbtt_tag(data+loc+0, tag)) + return ttULONG(data+loc+8); + } + return 0; +} + +int stbtt_GetFontOffsetForIndex(const unsigned char *font_collection, int index) +{ + // if it's just a font, there's only one valid index + if (stbtt__isfont(font_collection)) + return index == 0 ? 0 : -1; + + // check if it's a TTC + if (stbtt_tag(font_collection, "ttcf")) { + // version 1? + if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { + stbtt_int32 n = ttLONG(font_collection+8); + if (index >= n) + return -1; + return ttULONG(font_collection+12+index*14); + } + } + return -1; +} + +int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data2, int fontstart) +{ + stbtt_uint8 *data = (stbtt_uint8 *) data2; + stbtt_uint32 cmap, t; + stbtt_int32 i,numTables; + + info->data = data; + info->fontstart = fontstart; + + cmap = stbtt__find_table(data, fontstart, "cmap"); // required + info->loca = stbtt__find_table(data, fontstart, "loca"); // required + info->head = stbtt__find_table(data, fontstart, "head"); // required + info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required + info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required + info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required + info->kern = stbtt__find_table(data, fontstart, "kern"); // not required + if (!cmap || !info->loca || !info->head || !info->glyf || !info->hhea || !info->hmtx) + return 0; + + t = stbtt__find_table(data, fontstart, "maxp"); + if (t) + info->numGlyphs = ttUSHORT(data+t+4); + else + info->numGlyphs = 0xffff; + + // find a cmap encoding table we understand *now* to avoid searching + // later. (todo: could make this installable) + // the same regardless of glyph. + numTables = ttUSHORT(data + cmap + 2); + info->index_map = 0; + for (i=0; i < numTables; ++i) { + stbtt_uint32 encoding_record = cmap + 4 + 8 * i; + // find an encoding we understand: + switch(ttUSHORT(data+encoding_record)) { + case STBTT_PLATFORM_ID_MICROSOFT: + switch (ttUSHORT(data+encoding_record+2)) { + case STBTT_MS_EID_UNICODE_BMP: + case STBTT_MS_EID_UNICODE_FULL: + // MS/Unicode + info->index_map = cmap + ttULONG(data+encoding_record+4); + break; + } + break; + } + } + if (info->index_map == 0) + return 0; + + info->indexToLocFormat = ttUSHORT(data+info->head + 50); + return 1; +} + +int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) +{ + stbtt_uint8 *data = info->data; + stbtt_uint32 index_map = info->index_map; + + stbtt_uint16 format = ttUSHORT(data + index_map + 0); + if (format == 0) { // apple byte encoding + stbtt_int32 bytes = ttUSHORT(data + index_map + 2); + if (unicode_codepoint < bytes-6) + return ttBYTE(data + index_map + 6 + unicode_codepoint); + return 0; + } else if (format == 6) { + stbtt_uint32 first = ttUSHORT(data + index_map + 6); + stbtt_uint32 count = ttUSHORT(data + index_map + 8); + if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) + return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); + return 0; + } else if (format == 2) { + STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean + return 0; + } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges + stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; + stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; + stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); + stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; + stbtt_uint16 item, offset, start, end; + + // do a binary search of the segments + stbtt_uint32 endCount = index_map + 14; + stbtt_uint32 search = endCount; + + if (unicode_codepoint > 0xffff) + return 0; + + // they lie from endCount .. endCount + segCount + // but searchRange is the nearest power of two, so... + if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) + search += rangeShift*2; + + // now decrement to bias correctly to find smallest + search -= 2; + while (entrySelector) { + searchRange >>= 1; + start = ttUSHORT(data + search + searchRange*2 + segcount*2 + 2); + end = ttUSHORT(data + search + searchRange*2); + if (unicode_codepoint > end) + search += searchRange*2; + --entrySelector; + } + search += 2; + + item = (stbtt_uint16) ((search - endCount) >> 1); + + STBTT_assert(unicode_codepoint <= ttUSHORT(data + endCount + 2*item)); + start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); + end = ttUSHORT(data + index_map + 14 + 2 + 2*item); + if (unicode_codepoint < start) + return 0; + + offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); + if (offset == 0) + return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); + + return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); + } else if (format == 12 || format == 13) { + stbtt_uint32 ngroups = ttULONG(data+index_map+12); + stbtt_int32 low,high; + low = 0; high = (stbtt_int32)ngroups; + // Binary search the right group. + while (low < high) { + stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high + stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); + stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); + if ((stbtt_uint32) unicode_codepoint < start_char) + high = mid; + else if ((stbtt_uint32) unicode_codepoint > end_char) + low = mid+1; + else { + stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); + if (format == 12) + return start_glyph + unicode_codepoint-start_char; + else // format == 13 + return start_glyph; + } + } + return 0; // not found + } + // @TODO + STBTT_assert(0); + return 0; +} + +int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) +{ + return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); +} + +static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) +{ + v->type = type; + v->x = (stbtt_int16) x; + v->y = (stbtt_int16) y; + v->cx = (stbtt_int16) cx; + v->cy = (stbtt_int16) cy; +} + +static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) +{ + int g1,g2; + + if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range + if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format + + if (info->indexToLocFormat == 0) { + g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; + g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; + } else { + g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); + g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); + } + + return g1==g2 ? -1 : g1; // if length is 0, return -1 +} + +int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) +{ + int g = stbtt__GetGlyfOffset(info, glyph_index); + if (g < 0) return 0; + + if (x0) *x0 = ttSHORT(info->data + g + 2); + if (y0) *y0 = ttSHORT(info->data + g + 4); + if (x1) *x1 = ttSHORT(info->data + g + 6); + if (y1) *y1 = ttSHORT(info->data + g + 8); + return 1; +} + +int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) +{ + return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); +} + +int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index) +{ + stbtt_int16 numberOfContours; + int g = stbtt__GetGlyfOffset(info, glyph_index); + if (g < 0) return 1; + numberOfContours = ttSHORT(info->data + g); + return numberOfContours == 0; +} + +static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, + stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) +{ + if (start_off) { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); + } else { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); + } + return num_vertices; +} + +int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) +{ + stbtt_int16 numberOfContours; + stbtt_uint8 *endPtsOfContours; + stbtt_uint8 *data = info->data; + stbtt_vertex *vertices=0; + int num_vertices=0; + int g = stbtt__GetGlyfOffset(info, glyph_index); + + *pvertices = NULL; + + if (g < 0) return 0; + + numberOfContours = ttSHORT(data + g); + + if (numberOfContours > 0) { + stbtt_uint8 flags=0,flagcount; + stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; + stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; + stbtt_uint8 *points; + endPtsOfContours = (data + g + 10); + ins = ttUSHORT(data + g + 10 + numberOfContours * 2); + points = data + g + 10 + numberOfContours * 2 + 2 + ins; + + n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); + + m = n + 2*numberOfContours; // a loose bound on how many vertices we might need + vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); + if (vertices == 0) + return 0; + + next_move = 0; + flagcount=0; + + // in first pass, we load uninterpreted data into the allocated array + // above, shifted to the end of the array so we won't overwrite it when + // we create our final data starting from the front + + off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated + + // first load flags + + for (i=0; i < n; ++i) { + if (flagcount == 0) { + flags = *points++; + if (flags & 8) + flagcount = *points++; + } else + --flagcount; + vertices[off+i].type = flags; + } + + // now load x coordinates + x=0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + if (flags & 2) { + stbtt_int16 dx = *points++; + x += (flags & 16) ? dx : -dx; // ??? + } else { + if (!(flags & 16)) { + x = x + (stbtt_int16) (points[0]*256 + points[1]); + points += 2; + } + } + vertices[off+i].x = (stbtt_int16) x; + } + + // now load y coordinates + y=0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + if (flags & 4) { + stbtt_int16 dy = *points++; + y += (flags & 32) ? dy : -dy; // ??? + } else { + if (!(flags & 32)) { + y = y + (stbtt_int16) (points[0]*256 + points[1]); + points += 2; + } + } + vertices[off+i].y = (stbtt_int16) y; + } + + // now convert them to our format + num_vertices=0; + sx = sy = cx = cy = scx = scy = 0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + x = (stbtt_int16) vertices[off+i].x; + y = (stbtt_int16) vertices[off+i].y; + + if (next_move == i) { + if (i != 0) + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); + + // now start the new one + start_off = !(flags & 1); + if (start_off) { + // if we start off with an off-curve point, then when we need to find a point on the curve + // where we can start, and we need to save some state for when we wraparound. + scx = x; + scy = y; + if (!(vertices[off+i+1].type & 1)) { + // next point is also a curve point, so interpolate an on-point curve + sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; + sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; + } else { + // otherwise just use the next point as our start point + sx = (stbtt_int32) vertices[off+i+1].x; + sy = (stbtt_int32) vertices[off+i+1].y; + ++i; // we're using point i+1 as the starting point, so skip it + } + } else { + sx = x; + sy = y; + } + stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); + was_off = 0; + next_move = 1 + ttUSHORT(endPtsOfContours+j*2); + ++j; + } else { + if (!(flags & 1)) { // if it's a curve + if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); + cx = x; + cy = y; + was_off = 1; + } else { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); + was_off = 0; + } + } + } + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); + } else if (numberOfContours == -1) { + // Compound shapes. + int more = 1; + stbtt_uint8 *comp = data + g + 10; + num_vertices = 0; + vertices = 0; + while (more) { + stbtt_uint16 flags, gidx; + int comp_num_verts = 0, i; + stbtt_vertex *comp_verts = 0, *tmp = 0; + float mtx[6] = {1,0,0,1,0,0}, m, n; + + flags = ttSHORT(comp); comp+=2; + gidx = ttSHORT(comp); comp+=2; + + if (flags & 2) { // XY values + if (flags & 1) { // shorts + mtx[4] = ttSHORT(comp); comp+=2; + mtx[5] = ttSHORT(comp); comp+=2; + } else { + mtx[4] = ttCHAR(comp); comp+=1; + mtx[5] = ttCHAR(comp); comp+=1; + } + } + else { + // @TODO handle matching point + STBTT_assert(0); + } + if (flags & (1<<3)) { // WE_HAVE_A_SCALE + mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = mtx[2] = 0; + } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE + mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = mtx[2] = 0; + mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO + mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + } + + // Find transformation scales. + m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); + n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); + + // Get indexed glyph. + comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); + if (comp_num_verts > 0) { + // Transform vertices. + for (i = 0; i < comp_num_verts; ++i) { + stbtt_vertex* v = &comp_verts[i]; + stbtt_vertex_type x,y; + x=v->x; y=v->y; + v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); + v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); + x=v->cx; y=v->cy; + v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); + v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); + } + // Append vertices. + tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); + if (!tmp) { + if (vertices) STBTT_free(vertices, info->userdata); + if (comp_verts) STBTT_free(comp_verts, info->userdata); + return 0; + } + if (num_vertices > 0) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); + STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); + if (vertices) STBTT_free(vertices, info->userdata); + vertices = tmp; + STBTT_free(comp_verts, info->userdata); + num_vertices += comp_num_verts; + } + // More components ? + more = flags & (1<<5); + } + } else if (numberOfContours < 0) { + // @TODO other compound variations? + STBTT_assert(0); + } else { + // numberOfCounters == 0, do nothing + } + + *pvertices = vertices; + return num_vertices; +} + +void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) +{ + stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); + if (glyph_index < numOfLongHorMetrics) { + if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); + if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); + } else { + if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); + if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); + } +} + +int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) +{ + stbtt_uint8 *data = info->data + info->kern; + stbtt_uint32 needle, straw; + int l, r, m; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format + return 0; + + l = 0; + r = ttUSHORT(data+10) - 1; + needle = glyph1 << 16 | glyph2; + while (l <= r) { + m = (l + r) >> 1; + straw = ttULONG(data+18+(m*6)); // note: unaligned read + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else + return ttSHORT(data+22+(m*6)); + } + return 0; +} + +int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) +{ + if (!info->kern) // if no kerning table, don't waste time looking up both codepoint->glyphs + return 0; + return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); +} + +void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) +{ + stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); +} + +void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) +{ + if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); + if (descent) *descent = ttSHORT(info->data+info->hhea + 6); + if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); +} + +void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1) +{ + *x0 = ttSHORT(info->data + info->head + 36); + *y0 = ttSHORT(info->data + info->head + 38); + *x1 = ttSHORT(info->data + info->head + 40); + *y1 = ttSHORT(info->data + info->head + 42); +} + +float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) +{ + int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); + return (float) height / fheight; +} + +float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels) +{ + int unitsPerEm = ttUSHORT(info->data + info->head + 18); + return pixels / unitsPerEm; +} + +void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) +{ + STBTT_free(v, info->userdata); +} + +////////////////////////////////////////////////////////////////////////////// +// +// antialiasing software rasterizer +// + +void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + int x0,y0,x1,y1; + if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) + x0=y0=x1=y1=0; // e.g. space character + // now move to integral bboxes (treating pixels as little squares, what pixels get touched)? + if (ix0) *ix0 = STBTT_ifloor(x0 * scale_x + shift_x); + if (iy0) *iy0 = -STBTT_iceil (y1 * scale_y + shift_y); + if (ix1) *ix1 = STBTT_iceil (x1 * scale_x + shift_x); + if (iy1) *iy1 = -STBTT_ifloor(y0 * scale_y + shift_y); +} +void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); +} + +void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); +} + +void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); +} + +typedef struct stbtt__edge { + float x0,y0, x1,y1; + int invert; +} stbtt__edge; + +typedef struct stbtt__active_edge +{ + int x,dx; + float ey; + struct stbtt__active_edge *next; + int valid; +} stbtt__active_edge; + +#define FIXSHIFT 10 +#define FIX (1 << FIXSHIFT) +#define FIXMASK (FIX-1) + +static stbtt__active_edge *new_active(stbtt__edge *e, int off_x, float start_point, void *userdata) +{ + stbtt__active_edge *z = (stbtt__active_edge *) STBTT_malloc(sizeof(*z), userdata); // @TODO: make a pool of these!!! + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(e->y0 <= start_point); + if (!z) return z; + // round dx down to avoid going too far + if (dxdy < 0) + z->dx = -STBTT_ifloor(FIX * -dxdy); + else + z->dx = STBTT_ifloor(FIX * dxdy); + z->x = STBTT_ifloor(FIX * (e->x0 + dxdy * (start_point - e->y0))); + z->x -= off_x * FIX; + z->ey = e->y1; + z->next = 0; + z->valid = e->invert ? 1 : -1; + return z; +} + +// note: this routine clips fills that extend off the edges... ideally this +// wouldn't happen, but it could happen if the truetype glyph bounding boxes +// are wrong, or if the user supplies a too-small bitmap +static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) +{ + // non-zero winding fill + int x0=0, w=0; + + while (e) { + if (w == 0) { + // if we're currently at zero, we need to record the edge start point + x0 = e->x; w += e->valid; + } else { + int x1 = e->x; w += e->valid; + // if we went to zero, we need to draw + if (w == 0) { + int i = x0 >> FIXSHIFT; + int j = x1 >> FIXSHIFT; + + if (i < len && j >= 0) { + if (i == j) { + // x0,x1 are the same pixel, so compute combined coverage + scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> FIXSHIFT); + } else { + if (i >= 0) // add antialiasing for x0 + scanline[i] = scanline[i] + (stbtt_uint8) (((FIX - (x0 & FIXMASK)) * max_weight) >> FIXSHIFT); + else + i = -1; // clip + + if (j < len) // add antialiasing for x1 + scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & FIXMASK) * max_weight) >> FIXSHIFT); + else + j = len; // clip + + for (++i; i < j; ++i) // fill pixels between x0 and x1 + scanline[i] = scanline[i] + (stbtt_uint8) max_weight; + } + } + } + } + + e = e->next; + } +} + +static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) +{ + stbtt__active_edge *active = NULL; + int y,j=0; + int max_weight = (255 / vsubsample); // weight per vertical scanline + int s; // vertical subsample index + unsigned char scanline_data[512], *scanline; + + if (result->w > 512) + scanline = (unsigned char *) STBTT_malloc(result->w, userdata); + else + scanline = scanline_data; + + y = off_y * vsubsample; + e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; + + while (j < result->h) { + STBTT_memset(scanline, 0, result->w); + for (s=0; s < vsubsample; ++s) { + // find center of pixel for this scanline + float scan_y = y + 0.5f; + stbtt__active_edge **step = &active; + + // update all active edges; + // remove all active edges that terminate before the center of this scanline + while (*step) { + stbtt__active_edge * z = *step; + if (z->ey <= scan_y) { + *step = z->next; // delete from list + STBTT_assert(z->valid); + z->valid = 0; + STBTT_free(z, userdata); + } else { + z->x += z->dx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + } + + // resort the list if needed + for(;;) { + int changed=0; + step = &active; + while (*step && (*step)->next) { + if ((*step)->x > (*step)->next->x) { + stbtt__active_edge *t = *step; + stbtt__active_edge *q = t->next; + + t->next = q->next; + q->next = t; + *step = q; + changed = 1; + } + step = &(*step)->next; + } + if (!changed) break; + } + + // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline + while (e->y0 <= scan_y) { + if (e->y1 > scan_y) { + stbtt__active_edge *z = new_active(e, off_x, scan_y, userdata); + // find insertion point + if (active == NULL) + active = z; + else if (z->x < active->x) { + // insert at front + z->next = active; + active = z; + } else { + // find thing to insert AFTER + stbtt__active_edge *p = active; + while (p->next && p->next->x < z->x) + p = p->next; + // at this point, p->next->x is NOT < z->x + z->next = p->next; + p->next = z; + } + } + ++e; + } + + // now process all active edges in XOR fashion + if (active) + stbtt__fill_active_edges(scanline, result->w, active, max_weight); + + ++y; + } + STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); + ++j; + } + + while (active) { + stbtt__active_edge *z = active; + active = active->next; + STBTT_free(z, userdata); + } + + if (scanline != scanline_data) + STBTT_free(scanline, userdata); +} + +static int stbtt__edge_compare(const void *p, const void *q) +{ + stbtt__edge *a = (stbtt__edge *) p; + stbtt__edge *b = (stbtt__edge *) q; + + if (a->y0 < b->y0) return -1; + if (a->y0 > b->y0) return 1; + return 0; +} + +typedef struct +{ + float x,y; +} stbtt__point; + +static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) +{ + float y_scale_inv = invert ? -scale_y : scale_y; + stbtt__edge *e; + int n,i,j,k,m; + int vsubsample = result->h < 8 ? 15 : 5; + // vsubsample should divide 255 evenly; otherwise we won't reach full opacity + + // now we have to blow out the windings into explicit edge lists + n = 0; + for (i=0; i < windings; ++i) + n += wcount[i]; + + e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel + if (e == 0) return; + n = 0; + + m=0; + for (i=0; i < windings; ++i) { + stbtt__point *p = pts + m; + m += wcount[i]; + j = wcount[i]-1; + for (k=0; k < wcount[i]; j=k++) { + int a=k,b=j; + // skip the edge if horizontal + if (p[j].y == p[k].y) + continue; + // add edge from j to k to the list + e[n].invert = 0; + if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { + e[n].invert = 1; + a=j,b=k; + } + e[n].x0 = p[a].x * scale_x + shift_x; + e[n].y0 = p[a].y * y_scale_inv * vsubsample + shift_y; + e[n].x1 = p[b].x * scale_x + shift_x; + e[n].y1 = p[b].y * y_scale_inv * vsubsample + shift_y; + ++n; + } + } + + // now sort the edges by their highest point (should snap to integer, and then by x) + STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); + + // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule + stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); + + STBTT_free(e, userdata); +} + +static void stbtt__add_point(stbtt__point *points, int n, float x, float y) +{ + if (!points) return; // during first pass, it's unallocated + points[n].x = x; + points[n].y = y; +} + +// tesselate until threshhold p is happy... @TODO warped to compensate for non-linear stretching +static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) +{ + // midpoint + float mx = (x0 + 2*x1 + x2)/4; + float my = (y0 + 2*y1 + y2)/4; + // versus directly drawn line + float dx = (x0+x2)/2 - mx; + float dy = (y0+y2)/2 - my; + if (n > 16) // 65536 segments on one curve better be enough! + return 1; + if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA + stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); + stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); + } else { + stbtt__add_point(points, *num_points,x2,y2); + *num_points = *num_points+1; + } + return 1; +} + +// returns number of contours +stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) +{ + stbtt__point *points=0; + int num_points=0; + + float objspace_flatness_squared = objspace_flatness * objspace_flatness; + int i,n=0,start=0, pass; + + // count how many "moves" there are to get the contour count + for (i=0; i < num_verts; ++i) + if (vertices[i].type == STBTT_vmove) + ++n; + + *num_contours = n; + if (n == 0) return 0; + + *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); + + if (*contour_lengths == 0) { + *num_contours = 0; + return 0; + } + + // make two passes through the points so we don't need to realloc + for (pass=0; pass < 2; ++pass) { + float x=0,y=0; + if (pass == 1) { + points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); + if (points == NULL) goto error; + } + num_points = 0; + n= -1; + for (i=0; i < num_verts; ++i) { + switch (vertices[i].type) { + case STBTT_vmove: + // start the next contour + if (n >= 0) + (*contour_lengths)[n] = num_points - start; + ++n; + start = num_points; + + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x,y); + break; + case STBTT_vline: + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vcurve: + stbtt__tesselate_curve(points, &num_points, x,y, + vertices[i].cx, vertices[i].cy, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + } + } + (*contour_lengths)[n] = num_points - start; + } + + return points; +error: + STBTT_free(points, userdata); + STBTT_free(*contour_lengths, userdata); + *contour_lengths = 0; + *num_contours = 0; + return NULL; +} + +void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) +{ + float scale = scale_x > scale_y ? scale_y : scale_x; + int winding_count, *winding_lengths; + stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); + if (windings) { + stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); + STBTT_free(winding_lengths, userdata); + STBTT_free(windings, userdata); + } +} + +void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) +{ + STBTT_free(bitmap, userdata); +} + +unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) +{ + int ix0,iy0,ix1,iy1; + stbtt__bitmap gbm; + stbtt_vertex *vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + + if (scale_x == 0) scale_x = scale_y; + if (scale_y == 0) { + if (scale_x == 0) return NULL; + scale_y = scale_x; + } + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); + + // now we get the size + gbm.w = (ix1 - ix0); + gbm.h = (iy1 - iy0); + gbm.pixels = NULL; // in case we error + + if (width ) *width = gbm.w; + if (height) *height = gbm.h; + if (xoff ) *xoff = ix0; + if (yoff ) *yoff = iy0; + + if (gbm.w && gbm.h) { + gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); + if (gbm.pixels) { + gbm.stride = gbm.w; + + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + } + } + STBTT_free(vertices, info->userdata); + return gbm.pixels; +} + +unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); +} + +void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) +{ + int ix0,iy0; + stbtt_vertex *vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + stbtt__bitmap gbm; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); + gbm.pixels = output; + gbm.w = out_w; + gbm.h = out_h; + gbm.stride = out_stride; + + if (gbm.w && gbm.h) + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); + + STBTT_free(vertices, info->userdata); +} + +void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); +} + +unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); +} + +void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); +} + +unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); +} + +void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) +{ + stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); +} + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-CRAPPY packing to keep source code small + +extern int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char *pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar *chardata) +{ + float scale; + int x,y,bottom_y, i; + stbtt_fontinfo f; + stbtt_InitFont(&f, data, offset); + STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels + x=y=1; + bottom_y = 1; + + scale = stbtt_ScaleForPixelHeight(&f, pixel_height); + + for (i=0; i < num_chars; ++i) { + int advance, lsb, x0,y0,x1,y1,gw,gh; + int g = stbtt_FindGlyphIndex(&f, first_char + i); + stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); + stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); + gw = x1-x0; + gh = y1-y0; + if (x + gw + 1 >= pw) + y = bottom_y, x = 1; // advance to next row + if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row + return -i; + STBTT_assert(x+gw < pw); + STBTT_assert(y+gh < ph); + stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); + chardata[i].x0 = (stbtt_int16) x; + chardata[i].y0 = (stbtt_int16) y; + chardata[i].x1 = (stbtt_int16) (x + gw); + chardata[i].y1 = (stbtt_int16) (y + gh); + chardata[i].xadvance = scale * advance; + chardata[i].xoff = (float) x0; + chardata[i].yoff = (float) y0; + x = x + gw + 2; + if (y+gh+2 > bottom_y) + bottom_y = y+gh+2; + } + return bottom_y; +} + +void stbtt_GetBakedQuad(stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) +{ + float d3d_bias = opengl_fillrule ? 0 : -0.5f; + float ipw = 1.0f / pw, iph = 1.0f / ph; + stbtt_bakedchar *b = chardata + char_index; + int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5); + int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5); + + q->x0 = round_x + d3d_bias; + q->y0 = round_y + d3d_bias; + q->x1 = round_x + b->x1 - b->x0 + d3d_bias; + q->y1 = round_y + b->y1 - b->y0 + d3d_bias; + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// font name matching -- recommended not to use this +// + +// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(const stbtt_uint8 *s1, stbtt_int32 len1, const stbtt_uint8 *s2, stbtt_int32 len2) +{ + stbtt_int32 i=0; + + // convert utf16 to utf8 and compare the results while converting + while (len2) { + stbtt_uint16 ch = s2[0]*256 + s2[1]; + if (ch < 0x80) { + if (i >= len1) return -1; + if (s1[i++] != ch) return -1; + } else if (ch < 0x800) { + if (i+1 >= len1) return -1; + if (s1[i++] != 0xc0 + (ch >> 6)) return -1; + if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; + } else if (ch >= 0xd800 && ch < 0xdc00) { + stbtt_uint32 c; + stbtt_uint16 ch2 = s2[2]*256 + s2[3]; + if (i+3 >= len1) return -1; + c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; + if (s1[i++] != 0xf0 + (c >> 18)) return -1; + if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; + s2 += 2; // plus another 2 below + len2 -= 2; + } else if (ch >= 0xdc00 && ch < 0xe000) { + return -1; + } else { + if (i+2 >= len1) return -1; + if (s1[i++] != 0xe0 + (ch >> 12)) return -1; + if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; + } + s2 += 2; + len2 -= 2; + } + return i; +} + +int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((const stbtt_uint8*) s1, len1, (const stbtt_uint8*) s2, len2); +} + +// returns results in whatever encoding you request... but note that 2-byte encodings +// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare +const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) +{ + stbtt_int32 i,count,stringOffset; + stbtt_uint8 *fc = font->data; + stbtt_uint32 offset = font->fontstart; + stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); + if (!nm) return NULL; + + count = ttUSHORT(fc+nm+2); + stringOffset = nm + ttUSHORT(fc+nm+4); + for (i=0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) + && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { + *length = ttUSHORT(fc+loc+8); + return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); + } + } + return NULL; +} + +static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) +{ + stbtt_int32 i; + stbtt_int32 count = ttUSHORT(fc+nm+2); + stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); + + for (i=0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + stbtt_int32 id = ttUSHORT(fc+loc+6); + if (id == target_id) { + // find the encoding + stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); + + // is this a Unicode encoding? + if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { + stbtt_int32 slen = ttUSHORT(fc+loc+8); + stbtt_int32 off = ttUSHORT(fc+loc+10); + + // check if there's a prefix match + stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); + if (matchlen >= 0) { + // check for target_id+1 immediately following, with same encoding & language + if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { + slen = ttUSHORT(fc+loc+12+8); + off = ttUSHORT(fc+loc+12+10); + if (slen == 0) { + if (matchlen == nlen) + return 1; + } else if (matchlen < nlen && name[matchlen] == ' ') { + ++matchlen; + if (stbtt_CompareUTF8toUTF16_bigendian((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) + return 1; + } + } else { + // if nothing immediately following + if (matchlen == nlen) + return 1; + } + } + } + + // @TODO handle other encodings + } + } + return 0; +} + +static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) +{ + stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name); + stbtt_uint32 nm,hd; + if (!stbtt__isfont(fc+offset)) return 0; + + // check italics/bold/underline flags in macStyle... + if (flags) { + hd = stbtt__find_table(fc, offset, "head"); + if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; + } + + nm = stbtt__find_table(fc, offset, "name"); + if (!nm) return 0; + + if (flags) { + // if we checked the macStyle flags, then just check the family and ignore the subfamily + if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } else { + if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + + return 0; +} + +int stbtt_FindMatchingFont(const unsigned char *font_collection, const char *name_utf8, stbtt_int32 flags) +{ + stbtt_int32 i; + for (i=0;;++i) { + stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); + if (off < 0) return off; + if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) + return off; + } +} + +#endif // STB_TRUETYPE_IMPLEMENTATION diff --git a/dpf/dgl/src/oui-blendish/LICENSE b/dpf/dgl/src/oui-blendish/LICENSE new file mode 100644 index 0000000..c160346 --- /dev/null +++ b/dpf/dgl/src/oui-blendish/LICENSE @@ -0,0 +1,21 @@ +Blendish - Blender 2.5 UI based theming functions for NanoVG + +Copyright (c) 2014 Leonard Ritter + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/dpf/dgl/src/oui-blendish/blendish.h b/dpf/dgl/src/oui-blendish/blendish.h new file mode 100644 index 0000000..9f8c9d2 --- /dev/null +++ b/dpf/dgl/src/oui-blendish/blendish.h @@ -0,0 +1,2399 @@ +/* +Blendish - Blender 2.5 UI based theming functions for NanoVG + +Copyright (c) 2014 Leonard Ritter + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#ifndef BLENDISH_H +#define BLENDISH_H + +#ifndef NANOVG_H +#error "nanovg.h must be included first." +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* + +Revision 6 (2014-09-21) + +Summary +------- + +Blendish is a small collection of drawing functions for NanoVG, designed to +replicate the look of the Blender 2.5+ User Interface. You can use these +functions to theme your UI library. Several metric constants for faithful +reproduction are also included. + +Blendish supports the original Blender icon sheet; As the licensing of Blenders +icons is unclear, they are not included in Blendishes repository, but a SVG +template, "icons_template.svg" is provided, which you can use to build your own +icon sheet. + +To use icons, you must first load the icon sheet using one of the +nvgCreateImage*() functions and then pass the image handle to bndSetIconImage(); +otherwise, no icons will be drawn. See bndSetIconImage() for more information. + +Blendish will not render text until a suitable UI font has been passed to +bndSetFont() has been called. See bndSetFont() for more information. + + +Drawbacks +--------- + +There is no support for varying dpi resolutions yet. The library is hardcoded +to the equivalent of 72 dpi in the Blender system settings. + +Support for label truncation is missing. Text rendering breaks when widgets are +too short to contain their labels. + +Usage +----- + +To use this header file in implementation mode, define BLENDISH_IMPLEMENTATION +before including blendish.h, otherwise the file will be in header-only mode. + +*/ + +// you can override this from the outside to pick +// the export level you need +#ifndef BND_EXPORT +#define BND_EXPORT +#endif + +// if that typedef is provided elsewhere, you may define +// BLENDISH_NO_NVG_TYPEDEFS before including the header. +#ifndef BLENDISH_NO_NVG_TYPEDEFS +typedef struct NVGcontext NVGcontext; +typedef struct NVGcolor NVGcolor; +typedef struct NVGglyphPosition NVGglyphPosition; +#endif + +// describes the theme used to draw a single widget or widget box; +// these values correspond to the same values that can be retrieved from +// the Theme panel in the Blender preferences +typedef struct BNDwidgetTheme { + // color of widget box outline + NVGcolor outlineColor; + // color of widget item (meaning changes depending on class) + NVGcolor itemColor; + // fill color of widget box + NVGcolor innerColor; + // fill color of widget box when active + NVGcolor innerSelectedColor; + // color of text label + NVGcolor textColor; + // color of text label when active + NVGcolor textSelectedColor; + // delta modifier for upper part of gradient (-100 to 100) + int shadeTop; + // delta modifier for lower part of gradient (-100 to 100) + int shadeDown; +} BNDwidgetTheme; + +// describes the theme used to draw nodes +typedef struct BNDnodeTheme { + // inner color of selected node (and downarrow) + NVGcolor nodeSelectedColor; + // outline of wires + NVGcolor wiresColor; + // color of text label when active + NVGcolor textSelectedColor; + + // inner color of active node (and dragged wire) + NVGcolor activeNodeColor; + // color of selected wire + NVGcolor wireSelectColor; + // color of background of node + NVGcolor nodeBackdropColor; + + // how much a noodle curves (0 to 10) + int noodleCurving; +} BNDnodeTheme; + +// describes the theme used to draw widgets +typedef struct BNDtheme { + // the background color of panels and windows + NVGcolor backgroundColor; + // theme for labels + BNDwidgetTheme regularTheme; + // theme for tool buttons + BNDwidgetTheme toolTheme; + // theme for radio buttons + BNDwidgetTheme radioTheme; + // theme for text fields + BNDwidgetTheme textFieldTheme; + // theme for option buttons (checkboxes) + BNDwidgetTheme optionTheme; + // theme for choice buttons (comboboxes) + // Blender calls them "menu buttons" + BNDwidgetTheme choiceTheme; + // theme for number fields + BNDwidgetTheme numberFieldTheme; + // theme for slider controls + BNDwidgetTheme sliderTheme; + // theme for scrollbars + BNDwidgetTheme scrollBarTheme; + // theme for tooltips + BNDwidgetTheme tooltipTheme; + // theme for menu backgrounds + BNDwidgetTheme menuTheme; + // theme for menu items + BNDwidgetTheme menuItemTheme; + // theme for nodes + BNDnodeTheme nodeTheme; +} BNDtheme; + +// how text on a control is aligned +typedef enum BNDtextAlignment { + BND_LEFT = 0, + BND_CENTER, +} BNDtextAlignment; + +// states altering the styling of a widget +typedef enum BNDwidgetState { + // not interacting + BND_DEFAULT = 0, + // the mouse is hovering over the control + BND_HOVER, + // the widget is activated (pressed) or in an active state (toggled) + BND_ACTIVE +} BNDwidgetState; + +// flags indicating which corners are sharp (for grouping widgets) +typedef enum BNDcornerFlags { + // all corners are round + BND_CORNER_NONE = 0, + // sharp top left corner + BND_CORNER_TOP_LEFT = 1, + // sharp top right corner + BND_CORNER_TOP_RIGHT = 2, + // sharp bottom right corner + BND_CORNER_DOWN_RIGHT = 4, + // sharp bottom left corner + BND_CORNER_DOWN_LEFT = 8, + // all corners are sharp; + // you can invert a set of flags using ^= BND_CORNER_ALL + BND_CORNER_ALL = 0xF, + // top border is sharp + BND_CORNER_TOP = 3, + // bottom border is sharp + BND_CORNER_DOWN = 0xC, + // left border is sharp + BND_CORNER_LEFT = 9, + // right border is sharp + BND_CORNER_RIGHT = 6 +} BNDcornerFlags; + +// build an icon ID from two coordinates into the icon sheet, where +// (0,0) designates the upper-leftmost icon, (1,0) the one right next to it, +// and so on. +#define BND_ICONID(x,y) ((x)|((y)<<8)) +// alpha of disabled widget groups +// can be used in conjunction with nvgGlobalAlpha() +#define BND_DISABLED_ALPHA 0.5 + +enum { + // default widget height + BND_WIDGET_HEIGHT = 21, + // default toolbutton width (if icon only) + BND_TOOL_WIDTH = 20, + + // default radius of node ports + BND_NODE_PORT_RADIUS = 5, + // top margin of node content + BND_NODE_MARGIN_TOP = 25, + // bottom margin of node content + BND_NODE_MARGIN_DOWN = 5, + // left and right margin of node content + BND_NODE_MARGIN_SIDE = 10, + // height of node title bar + BND_NODE_TITLE_HEIGHT = 20, + // width of node title arrow click area + BND_NODE_ARROW_AREA_WIDTH = 20, + + // size of splitter corner click area + BND_SPLITTER_AREA_SIZE = 12, + + // width of vertical scrollbar + BND_SCROLLBAR_WIDTH = 13, + // height of horizontal scrollbar + BND_SCROLLBAR_HEIGHT = 14, + + // default vertical spacing + BND_VSPACING = 1, + // default vertical spacing between groups + BND_VSPACING_GROUP = 8, + // default horizontal spacing + BND_HSPACING = 8, +}; + +typedef enum BNDicon { + BND_ICON_NONE = BND_ICONID(0,29), + BND_ICON_QUESTION = BND_ICONID(1,29), + BND_ICON_ERROR = BND_ICONID(2,29), + BND_ICON_CANCEL = BND_ICONID(3,29), + BND_ICON_TRIA_RIGHT = BND_ICONID(4,29), + BND_ICON_TRIA_DOWN = BND_ICONID(5,29), + BND_ICON_TRIA_LEFT = BND_ICONID(6,29), + BND_ICON_TRIA_UP = BND_ICONID(7,29), + BND_ICON_ARROW_LEFTRIGHT = BND_ICONID(8,29), + BND_ICON_PLUS = BND_ICONID(9,29), + BND_ICON_DISCLOSURE_TRI_DOWN = BND_ICONID(10,29), + BND_ICON_DISCLOSURE_TRI_RIGHT = BND_ICONID(11,29), + BND_ICON_RADIOBUT_OFF = BND_ICONID(12,29), + BND_ICON_RADIOBUT_ON = BND_ICONID(13,29), + BND_ICON_MENU_PANEL = BND_ICONID(14,29), + BND_ICON_BLENDER = BND_ICONID(15,29), + BND_ICON_GRIP = BND_ICONID(16,29), + BND_ICON_DOT = BND_ICONID(17,29), + BND_ICON_COLLAPSEMENU = BND_ICONID(18,29), + BND_ICON_X = BND_ICONID(19,29), + BND_ICON_GO_LEFT = BND_ICONID(21,29), + BND_ICON_PLUG = BND_ICONID(22,29), + BND_ICON_UI = BND_ICONID(23,29), + BND_ICON_NODE = BND_ICONID(24,29), + BND_ICON_NODE_SEL = BND_ICONID(25,29), + + BND_ICON_FULLSCREEN = BND_ICONID(0,28), + BND_ICON_SPLITSCREEN = BND_ICONID(1,28), + BND_ICON_RIGHTARROW_THIN = BND_ICONID(2,28), + BND_ICON_BORDERMOVE = BND_ICONID(3,28), + BND_ICON_VIEWZOOM = BND_ICONID(4,28), + BND_ICON_ZOOMIN = BND_ICONID(5,28), + BND_ICON_ZOOMOUT = BND_ICONID(6,28), + BND_ICON_PANEL_CLOSE = BND_ICONID(7,28), + BND_ICON_COPY_ID = BND_ICONID(8,28), + BND_ICON_EYEDROPPER = BND_ICONID(9,28), + BND_ICON_LINK_AREA = BND_ICONID(10,28), + BND_ICON_AUTO = BND_ICONID(11,28), + BND_ICON_CHECKBOX_DEHLT = BND_ICONID(12,28), + BND_ICON_CHECKBOX_HLT = BND_ICONID(13,28), + BND_ICON_UNLOCKED = BND_ICONID(14,28), + BND_ICON_LOCKED = BND_ICONID(15,28), + BND_ICON_UNPINNED = BND_ICONID(16,28), + BND_ICON_PINNED = BND_ICONID(17,28), + BND_ICON_SCREEN_BACK = BND_ICONID(18,28), + BND_ICON_RIGHTARROW = BND_ICONID(19,28), + BND_ICON_DOWNARROW_HLT = BND_ICONID(20,28), + BND_ICON_DOTSUP = BND_ICONID(21,28), + BND_ICON_DOTSDOWN = BND_ICONID(22,28), + BND_ICON_LINK = BND_ICONID(23,28), + BND_ICON_INLINK = BND_ICONID(24,28), + BND_ICON_PLUGIN = BND_ICONID(25,28), + + BND_ICON_HELP = BND_ICONID(0,27), + BND_ICON_GHOST_ENABLED = BND_ICONID(1,27), + BND_ICON_COLOR = BND_ICONID(2,27), + BND_ICON_LINKED = BND_ICONID(3,27), + BND_ICON_UNLINKED = BND_ICONID(4,27), + BND_ICON_HAND = BND_ICONID(5,27), + BND_ICON_ZOOM_ALL = BND_ICONID(6,27), + BND_ICON_ZOOM_SELECTED = BND_ICONID(7,27), + BND_ICON_ZOOM_PREVIOUS = BND_ICONID(8,27), + BND_ICON_ZOOM_IN = BND_ICONID(9,27), + BND_ICON_ZOOM_OUT = BND_ICONID(10,27), + BND_ICON_RENDER_REGION = BND_ICONID(11,27), + BND_ICON_BORDER_RECT = BND_ICONID(12,27), + BND_ICON_BORDER_LASSO = BND_ICONID(13,27), + BND_ICON_FREEZE = BND_ICONID(14,27), + BND_ICON_STYLUS_PRESSURE = BND_ICONID(15,27), + BND_ICON_GHOST_DISABLED = BND_ICONID(16,27), + BND_ICON_NEW = BND_ICONID(17,27), + BND_ICON_FILE_TICK = BND_ICONID(18,27), + BND_ICON_QUIT = BND_ICONID(19,27), + BND_ICON_URL = BND_ICONID(20,27), + BND_ICON_RECOVER_LAST = BND_ICONID(21,27), + BND_ICON_FULLSCREEN_ENTER = BND_ICONID(23,27), + BND_ICON_FULLSCREEN_EXIT = BND_ICONID(24,27), + BND_ICON_BLANK1 = BND_ICONID(25,27), + + BND_ICON_LAMP = BND_ICONID(0,26), + BND_ICON_MATERIAL = BND_ICONID(1,26), + BND_ICON_TEXTURE = BND_ICONID(2,26), + BND_ICON_ANIM = BND_ICONID(3,26), + BND_ICON_WORLD = BND_ICONID(4,26), + BND_ICON_SCENE = BND_ICONID(5,26), + BND_ICON_EDIT = BND_ICONID(6,26), + BND_ICON_GAME = BND_ICONID(7,26), + BND_ICON_RADIO = BND_ICONID(8,26), + BND_ICON_SCRIPT = BND_ICONID(9,26), + BND_ICON_PARTICLES = BND_ICONID(10,26), + BND_ICON_PHYSICS = BND_ICONID(11,26), + BND_ICON_SPEAKER = BND_ICONID(12,26), + BND_ICON_TEXTURE_SHADED = BND_ICONID(13,26), + + BND_ICON_VIEW3D = BND_ICONID(0,25), + BND_ICON_IPO = BND_ICONID(1,25), + BND_ICON_OOPS = BND_ICONID(2,25), + BND_ICON_BUTS = BND_ICONID(3,25), + BND_ICON_FILESEL = BND_ICONID(4,25), + BND_ICON_IMAGE_COL = BND_ICONID(5,25), + BND_ICON_INFO = BND_ICONID(6,25), + BND_ICON_SEQUENCE = BND_ICONID(7,25), + BND_ICON_TEXT = BND_ICONID(8,25), + BND_ICON_IMASEL = BND_ICONID(9,25), + BND_ICON_SOUND = BND_ICONID(10,25), + BND_ICON_ACTION = BND_ICONID(11,25), + BND_ICON_NLA = BND_ICONID(12,25), + BND_ICON_SCRIPTWIN = BND_ICONID(13,25), + BND_ICON_TIME = BND_ICONID(14,25), + BND_ICON_NODETREE = BND_ICONID(15,25), + BND_ICON_LOGIC = BND_ICONID(16,25), + BND_ICON_CONSOLE = BND_ICONID(17,25), + BND_ICON_PREFERENCES = BND_ICONID(18,25), + BND_ICON_CLIP = BND_ICONID(19,25), + BND_ICON_ASSET_MANAGER = BND_ICONID(20,25), + + BND_ICON_OBJECT_DATAMODE = BND_ICONID(0,24), + BND_ICON_EDITMODE_HLT = BND_ICONID(1,24), + BND_ICON_FACESEL_HLT = BND_ICONID(2,24), + BND_ICON_VPAINT_HLT = BND_ICONID(3,24), + BND_ICON_TPAINT_HLT = BND_ICONID(4,24), + BND_ICON_WPAINT_HLT = BND_ICONID(5,24), + BND_ICON_SCULPTMODE_HLT = BND_ICONID(6,24), + BND_ICON_POSE_HLT = BND_ICONID(7,24), + BND_ICON_PARTICLEMODE = BND_ICONID(8,24), + BND_ICON_LIGHTPAINT = BND_ICONID(9,24), + + BND_ICON_SCENE_DATA = BND_ICONID(0,23), + BND_ICON_RENDERLAYERS = BND_ICONID(1,23), + BND_ICON_WORLD_DATA = BND_ICONID(2,23), + BND_ICON_OBJECT_DATA = BND_ICONID(3,23), + BND_ICON_MESH_DATA = BND_ICONID(4,23), + BND_ICON_CURVE_DATA = BND_ICONID(5,23), + BND_ICON_META_DATA = BND_ICONID(6,23), + BND_ICON_LATTICE_DATA = BND_ICONID(7,23), + BND_ICON_LAMP_DATA = BND_ICONID(8,23), + BND_ICON_MATERIAL_DATA = BND_ICONID(9,23), + BND_ICON_TEXTURE_DATA = BND_ICONID(10,23), + BND_ICON_ANIM_DATA = BND_ICONID(11,23), + BND_ICON_CAMERA_DATA = BND_ICONID(12,23), + BND_ICON_PARTICLE_DATA = BND_ICONID(13,23), + BND_ICON_LIBRARY_DATA_DIRECT = BND_ICONID(14,23), + BND_ICON_GROUP = BND_ICONID(15,23), + BND_ICON_ARMATURE_DATA = BND_ICONID(16,23), + BND_ICON_POSE_DATA = BND_ICONID(17,23), + BND_ICON_BONE_DATA = BND_ICONID(18,23), + BND_ICON_CONSTRAINT = BND_ICONID(19,23), + BND_ICON_SHAPEKEY_DATA = BND_ICONID(20,23), + BND_ICON_CONSTRAINT_BONE = BND_ICONID(21,23), + BND_ICON_CAMERA_STEREO = BND_ICONID(22,23), + BND_ICON_PACKAGE = BND_ICONID(23,23), + BND_ICON_UGLYPACKAGE = BND_ICONID(24,23), + + BND_ICON_BRUSH_DATA = BND_ICONID(0,22), + BND_ICON_IMAGE_DATA = BND_ICONID(1,22), + BND_ICON_FILE = BND_ICONID(2,22), + BND_ICON_FCURVE = BND_ICONID(3,22), + BND_ICON_FONT_DATA = BND_ICONID(4,22), + BND_ICON_RENDER_RESULT = BND_ICONID(5,22), + BND_ICON_SURFACE_DATA = BND_ICONID(6,22), + BND_ICON_EMPTY_DATA = BND_ICONID(7,22), + BND_ICON_SETTINGS = BND_ICONID(8,22), + BND_ICON_RENDER_ANIMATION = BND_ICONID(9,22), + BND_ICON_RENDER_STILL = BND_ICONID(10,22), + BND_ICON_BOIDS = BND_ICONID(12,22), + BND_ICON_STRANDS = BND_ICONID(13,22), + BND_ICON_LIBRARY_DATA_INDIRECT = BND_ICONID(14,22), + BND_ICON_GREASEPENCIL = BND_ICONID(15,22), + BND_ICON_LINE_DATA = BND_ICONID(16,22), + BND_ICON_GROUP_BONE = BND_ICONID(18,22), + BND_ICON_GROUP_VERTEX = BND_ICONID(19,22), + BND_ICON_GROUP_VCOL = BND_ICONID(20,22), + BND_ICON_GROUP_UVS = BND_ICONID(21,22), + BND_ICON_RNA = BND_ICONID(24,22), + BND_ICON_RNA_ADD = BND_ICONID(25,22), + + BND_ICON_OUTLINER_OB_EMPTY = BND_ICONID(0,20), + BND_ICON_OUTLINER_OB_MESH = BND_ICONID(1,20), + BND_ICON_OUTLINER_OB_CURVE = BND_ICONID(2,20), + BND_ICON_OUTLINER_OB_LATTICE = BND_ICONID(3,20), + BND_ICON_OUTLINER_OB_META = BND_ICONID(4,20), + BND_ICON_OUTLINER_OB_LAMP = BND_ICONID(5,20), + BND_ICON_OUTLINER_OB_CAMERA = BND_ICONID(6,20), + BND_ICON_OUTLINER_OB_ARMATURE = BND_ICONID(7,20), + BND_ICON_OUTLINER_OB_FONT = BND_ICONID(8,20), + BND_ICON_OUTLINER_OB_SURFACE = BND_ICONID(9,20), + BND_ICON_OUTLINER_OB_SPEAKER = BND_ICONID(10,20), + BND_ICON_RESTRICT_VIEW_OFF = BND_ICONID(19,20), + BND_ICON_RESTRICT_VIEW_ON = BND_ICONID(20,20), + BND_ICON_RESTRICT_SELECT_OFF = BND_ICONID(21,20), + BND_ICON_RESTRICT_SELECT_ON = BND_ICONID(22,20), + BND_ICON_RESTRICT_RENDER_OFF = BND_ICONID(23,20), + BND_ICON_RESTRICT_RENDER_ON = BND_ICONID(24,20), + + BND_ICON_OUTLINER_DATA_EMPTY = BND_ICONID(0,19), + BND_ICON_OUTLINER_DATA_MESH = BND_ICONID(1,19), + BND_ICON_OUTLINER_DATA_CURVE = BND_ICONID(2,19), + BND_ICON_OUTLINER_DATA_LATTICE = BND_ICONID(3,19), + BND_ICON_OUTLINER_DATA_META = BND_ICONID(4,19), + BND_ICON_OUTLINER_DATA_LAMP = BND_ICONID(5,19), + BND_ICON_OUTLINER_DATA_CAMERA = BND_ICONID(6,19), + BND_ICON_OUTLINER_DATA_ARMATURE = BND_ICONID(7,19), + BND_ICON_OUTLINER_DATA_FONT = BND_ICONID(8,19), + BND_ICON_OUTLINER_DATA_SURFACE = BND_ICONID(9,19), + BND_ICON_OUTLINER_DATA_SPEAKER = BND_ICONID(10,19), + BND_ICON_OUTLINER_DATA_POSE = BND_ICONID(11,19), + + BND_ICON_MESH_PLANE = BND_ICONID(0,18), + BND_ICON_MESH_CUBE = BND_ICONID(1,18), + BND_ICON_MESH_CIRCLE = BND_ICONID(2,18), + BND_ICON_MESH_UVSPHERE = BND_ICONID(3,18), + BND_ICON_MESH_ICOSPHERE = BND_ICONID(4,18), + BND_ICON_MESH_GRID = BND_ICONID(5,18), + BND_ICON_MESH_MONKEY = BND_ICONID(6,18), + BND_ICON_MESH_CYLINDER = BND_ICONID(7,18), + BND_ICON_MESH_TORUS = BND_ICONID(8,18), + BND_ICON_MESH_CONE = BND_ICONID(9,18), + BND_ICON_LAMP_POINT = BND_ICONID(12,18), + BND_ICON_LAMP_SUN = BND_ICONID(13,18), + BND_ICON_LAMP_SPOT = BND_ICONID(14,18), + BND_ICON_LAMP_HEMI = BND_ICONID(15,18), + BND_ICON_LAMP_AREA = BND_ICONID(16,18), + BND_ICON_META_EMPTY = BND_ICONID(19,18), + BND_ICON_META_PLANE = BND_ICONID(20,18), + BND_ICON_META_CUBE = BND_ICONID(21,18), + BND_ICON_META_BALL = BND_ICONID(22,18), + BND_ICON_META_ELLIPSOID = BND_ICONID(23,18), + BND_ICON_META_CAPSULE = BND_ICONID(24,18), + + BND_ICON_SURFACE_NCURVE = BND_ICONID(0,17), + BND_ICON_SURFACE_NCIRCLE = BND_ICONID(1,17), + BND_ICON_SURFACE_NSURFACE = BND_ICONID(2,17), + BND_ICON_SURFACE_NCYLINDER = BND_ICONID(3,17), + BND_ICON_SURFACE_NSPHERE = BND_ICONID(4,17), + BND_ICON_SURFACE_NTORUS = BND_ICONID(5,17), + BND_ICON_CURVE_BEZCURVE = BND_ICONID(9,17), + BND_ICON_CURVE_BEZCIRCLE = BND_ICONID(10,17), + BND_ICON_CURVE_NCURVE = BND_ICONID(11,17), + BND_ICON_CURVE_NCIRCLE = BND_ICONID(12,17), + BND_ICON_CURVE_PATH = BND_ICONID(13,17), + BND_ICON_COLOR_RED = BND_ICONID(19,17), + BND_ICON_COLOR_GREEN = BND_ICONID(20,17), + BND_ICON_COLOR_BLUE = BND_ICONID(21,17), + + BND_ICON_FORCE_FORCE = BND_ICONID(0,16), + BND_ICON_FORCE_WIND = BND_ICONID(1,16), + BND_ICON_FORCE_VORTEX = BND_ICONID(2,16), + BND_ICON_FORCE_MAGNETIC = BND_ICONID(3,16), + BND_ICON_FORCE_HARMONIC = BND_ICONID(4,16), + BND_ICON_FORCE_CHARGE = BND_ICONID(5,16), + BND_ICON_FORCE_LENNARDJONES = BND_ICONID(6,16), + BND_ICON_FORCE_TEXTURE = BND_ICONID(7,16), + BND_ICON_FORCE_CURVE = BND_ICONID(8,16), + BND_ICON_FORCE_BOID = BND_ICONID(9,16), + BND_ICON_FORCE_TURBULENCE = BND_ICONID(10,16), + BND_ICON_FORCE_DRAG = BND_ICONID(11,16), + BND_ICON_FORCE_SMOKEFLOW = BND_ICONID(12,16), + + BND_ICON_MODIFIER = BND_ICONID(0,12), + BND_ICON_MOD_WAVE = BND_ICONID(1,12), + BND_ICON_MOD_BUILD = BND_ICONID(2,12), + BND_ICON_MOD_DECIM = BND_ICONID(3,12), + BND_ICON_MOD_MIRROR = BND_ICONID(4,12), + BND_ICON_MOD_SOFT = BND_ICONID(5,12), + BND_ICON_MOD_SUBSURF = BND_ICONID(6,12), + BND_ICON_HOOK = BND_ICONID(7,12), + BND_ICON_MOD_PHYSICS = BND_ICONID(8,12), + BND_ICON_MOD_PARTICLES = BND_ICONID(9,12), + BND_ICON_MOD_BOOLEAN = BND_ICONID(10,12), + BND_ICON_MOD_EDGESPLIT = BND_ICONID(11,12), + BND_ICON_MOD_ARRAY = BND_ICONID(12,12), + BND_ICON_MOD_UVPROJECT = BND_ICONID(13,12), + BND_ICON_MOD_DISPLACE = BND_ICONID(14,12), + BND_ICON_MOD_CURVE = BND_ICONID(15,12), + BND_ICON_MOD_LATTICE = BND_ICONID(16,12), + BND_ICON_CONSTRAINT_DATA = BND_ICONID(17,12), + BND_ICON_MOD_ARMATURE = BND_ICONID(18,12), + BND_ICON_MOD_SHRINKWRAP = BND_ICONID(19,12), + BND_ICON_MOD_CAST = BND_ICONID(20,12), + BND_ICON_MOD_MESHDEFORM = BND_ICONID(21,12), + BND_ICON_MOD_BEVEL = BND_ICONID(22,12), + BND_ICON_MOD_SMOOTH = BND_ICONID(23,12), + BND_ICON_MOD_SIMPLEDEFORM = BND_ICONID(24,12), + BND_ICON_MOD_MASK = BND_ICONID(25,12), + + BND_ICON_MOD_CLOTH = BND_ICONID(0,11), + BND_ICON_MOD_EXPLODE = BND_ICONID(1,11), + BND_ICON_MOD_FLUIDSIM = BND_ICONID(2,11), + BND_ICON_MOD_MULTIRES = BND_ICONID(3,11), + BND_ICON_MOD_SMOKE = BND_ICONID(4,11), + BND_ICON_MOD_SOLIDIFY = BND_ICONID(5,11), + BND_ICON_MOD_SCREW = BND_ICONID(6,11), + BND_ICON_MOD_VERTEX_WEIGHT = BND_ICONID(7,11), + BND_ICON_MOD_DYNAMICPAINT = BND_ICONID(8,11), + BND_ICON_MOD_REMESH = BND_ICONID(9,11), + BND_ICON_MOD_OCEAN = BND_ICONID(10,11), + BND_ICON_MOD_WARP = BND_ICONID(11,11), + BND_ICON_MOD_SKIN = BND_ICONID(12,11), + BND_ICON_MOD_TRIANGULATE = BND_ICONID(13,11), + BND_ICON_MOD_WIREFRAME = BND_ICONID(14,11), + + BND_ICON_REC = BND_ICONID(0,10), + BND_ICON_PLAY = BND_ICONID(1,10), + BND_ICON_FF = BND_ICONID(2,10), + BND_ICON_REW = BND_ICONID(3,10), + BND_ICON_PAUSE = BND_ICONID(4,10), + BND_ICON_PREV_KEYFRAME = BND_ICONID(5,10), + BND_ICON_NEXT_KEYFRAME = BND_ICONID(6,10), + BND_ICON_PLAY_AUDIO = BND_ICONID(7,10), + BND_ICON_PLAY_REVERSE = BND_ICONID(8,10), + BND_ICON_PREVIEW_RANGE = BND_ICONID(9,10), + BND_ICON_ACTION_TWEAK = BND_ICONID(10,10), + BND_ICON_PMARKER_ACT = BND_ICONID(11,10), + BND_ICON_PMARKER_SEL = BND_ICONID(12,10), + BND_ICON_PMARKER = BND_ICONID(13,10), + BND_ICON_MARKER_HLT = BND_ICONID(14,10), + BND_ICON_MARKER = BND_ICONID(15,10), + BND_ICON_SPACE2 = BND_ICONID(16,10), + BND_ICON_SPACE3 = BND_ICONID(17,10), + BND_ICON_KEYINGSET = BND_ICONID(18,10), + BND_ICON_KEY_DEHLT = BND_ICONID(19,10), + BND_ICON_KEY_HLT = BND_ICONID(20,10), + BND_ICON_MUTE_IPO_OFF = BND_ICONID(21,10), + BND_ICON_MUTE_IPO_ON = BND_ICONID(22,10), + BND_ICON_VISIBLE_IPO_OFF = BND_ICONID(23,10), + BND_ICON_VISIBLE_IPO_ON = BND_ICONID(24,10), + BND_ICON_DRIVER = BND_ICONID(25,10), + + BND_ICON_SOLO_OFF = BND_ICONID(0,9), + BND_ICON_SOLO_ON = BND_ICONID(1,9), + BND_ICON_FRAME_PREV = BND_ICONID(2,9), + BND_ICON_FRAME_NEXT = BND_ICONID(3,9), + BND_ICON_NLA_PUSHDOWN = BND_ICONID(4,9), + BND_ICON_IPO_CONSTANT = BND_ICONID(5,9), + BND_ICON_IPO_LINEAR = BND_ICONID(6,9), + BND_ICON_IPO_BEZIER = BND_ICONID(7,9), + BND_ICON_IPO_SINE = BND_ICONID(8,9), + BND_ICON_IPO_QUAD = BND_ICONID(9,9), + BND_ICON_IPO_CUBIC = BND_ICONID(10,9), + BND_ICON_IPO_QUART = BND_ICONID(11,9), + BND_ICON_IPO_QUINT = BND_ICONID(12,9), + BND_ICON_IPO_EXPO = BND_ICONID(13,9), + BND_ICON_IPO_CIRC = BND_ICONID(14,9), + BND_ICON_IPO_BOUNCE = BND_ICONID(15,9), + BND_ICON_IPO_ELASTIC = BND_ICONID(16,9), + BND_ICON_IPO_BACK = BND_ICONID(17,9), + BND_ICON_IPO_EASE_IN = BND_ICONID(18,9), + BND_ICON_IPO_EASE_OUT = BND_ICONID(19,9), + BND_ICON_IPO_EASE_IN_OUT = BND_ICONID(20,9), + + BND_ICON_VERTEXSEL = BND_ICONID(0,8), + BND_ICON_EDGESEL = BND_ICONID(1,8), + BND_ICON_FACESEL = BND_ICONID(2,8), + BND_ICON_LOOPSEL = BND_ICONID(3,8), + BND_ICON_ROTATE = BND_ICONID(5,8), + BND_ICON_CURSOR = BND_ICONID(6,8), + BND_ICON_ROTATECOLLECTION = BND_ICONID(7,8), + BND_ICON_ROTATECENTER = BND_ICONID(8,8), + BND_ICON_ROTACTIVE = BND_ICONID(9,8), + BND_ICON_ALIGN = BND_ICONID(10,8), + BND_ICON_SMOOTHCURVE = BND_ICONID(12,8), + BND_ICON_SPHERECURVE = BND_ICONID(13,8), + BND_ICON_ROOTCURVE = BND_ICONID(14,8), + BND_ICON_SHARPCURVE = BND_ICONID(15,8), + BND_ICON_LINCURVE = BND_ICONID(16,8), + BND_ICON_NOCURVE = BND_ICONID(17,8), + BND_ICON_RNDCURVE = BND_ICONID(18,8), + BND_ICON_PROP_OFF = BND_ICONID(19,8), + BND_ICON_PROP_ON = BND_ICONID(20,8), + BND_ICON_PROP_CON = BND_ICONID(21,8), + BND_ICON_SCULPT_DYNTOPO = BND_ICONID(22,8), + BND_ICON_PARTICLE_POINT = BND_ICONID(23,8), + BND_ICON_PARTICLE_TIP = BND_ICONID(24,8), + BND_ICON_PARTICLE_PATH = BND_ICONID(25,8), + + BND_ICON_MAN_TRANS = BND_ICONID(0,7), + BND_ICON_MAN_ROT = BND_ICONID(1,7), + BND_ICON_MAN_SCALE = BND_ICONID(2,7), + BND_ICON_MANIPUL = BND_ICONID(3,7), + BND_ICON_SNAP_OFF = BND_ICONID(4,7), + BND_ICON_SNAP_ON = BND_ICONID(5,7), + BND_ICON_SNAP_NORMAL = BND_ICONID(6,7), + BND_ICON_SNAP_INCREMENT = BND_ICONID(7,7), + BND_ICON_SNAP_VERTEX = BND_ICONID(8,7), + BND_ICON_SNAP_EDGE = BND_ICONID(9,7), + BND_ICON_SNAP_FACE = BND_ICONID(10,7), + BND_ICON_SNAP_VOLUME = BND_ICONID(11,7), + BND_ICON_STICKY_UVS_LOC = BND_ICONID(13,7), + BND_ICON_STICKY_UVS_DISABLE = BND_ICONID(14,7), + BND_ICON_STICKY_UVS_VERT = BND_ICONID(15,7), + BND_ICON_CLIPUV_DEHLT = BND_ICONID(16,7), + BND_ICON_CLIPUV_HLT = BND_ICONID(17,7), + BND_ICON_SNAP_PEEL_OBJECT = BND_ICONID(18,7), + BND_ICON_GRID = BND_ICONID(19,7), + + BND_ICON_PASTEDOWN = BND_ICONID(0,6), + BND_ICON_COPYDOWN = BND_ICONID(1,6), + BND_ICON_PASTEFLIPUP = BND_ICONID(2,6), + BND_ICON_PASTEFLIPDOWN = BND_ICONID(3,6), + BND_ICON_SNAP_SURFACE = BND_ICONID(8,6), + BND_ICON_AUTOMERGE_ON = BND_ICONID(9,6), + BND_ICON_AUTOMERGE_OFF = BND_ICONID(10,6), + BND_ICON_RETOPO = BND_ICONID(11,6), + BND_ICON_UV_VERTEXSEL = BND_ICONID(12,6), + BND_ICON_UV_EDGESEL = BND_ICONID(13,6), + BND_ICON_UV_FACESEL = BND_ICONID(14,6), + BND_ICON_UV_ISLANDSEL = BND_ICONID(15,6), + BND_ICON_UV_SYNC_SELECT = BND_ICONID(16,6), + + BND_ICON_BBOX = BND_ICONID(0,5), + BND_ICON_WIRE = BND_ICONID(1,5), + BND_ICON_SOLID = BND_ICONID(2,5), + BND_ICON_SMOOTH = BND_ICONID(3,5), + BND_ICON_POTATO = BND_ICONID(4,5), + BND_ICON_ORTHO = BND_ICONID(6,5), + BND_ICON_LOCKVIEW_OFF = BND_ICONID(9,5), + BND_ICON_LOCKVIEW_ON = BND_ICONID(10,5), + BND_ICON_AXIS_SIDE = BND_ICONID(12,5), + BND_ICON_AXIS_FRONT = BND_ICONID(13,5), + BND_ICON_AXIS_TOP = BND_ICONID(14,5), + BND_ICON_NDOF_DOM = BND_ICONID(15,5), + BND_ICON_NDOF_TURN = BND_ICONID(16,5), + BND_ICON_NDOF_FLY = BND_ICONID(17,5), + BND_ICON_NDOF_TRANS = BND_ICONID(18,5), + BND_ICON_LAYER_USED = BND_ICONID(19,5), + BND_ICON_LAYER_ACTIVE = BND_ICONID(20,5), + + BND_ICON_SORTALPHA = BND_ICONID(0,3), + BND_ICON_SORTBYEXT = BND_ICONID(1,3), + BND_ICON_SORTTIME = BND_ICONID(2,3), + BND_ICON_SORTSIZE = BND_ICONID(3,3), + BND_ICON_LONGDISPLAY = BND_ICONID(4,3), + BND_ICON_SHORTDISPLAY = BND_ICONID(5,3), + BND_ICON_GHOST = BND_ICONID(6,3), + BND_ICON_IMGDISPLAY = BND_ICONID(7,3), + BND_ICON_SAVE_AS = BND_ICONID(8,3), + BND_ICON_SAVE_COPY = BND_ICONID(9,3), + BND_ICON_BOOKMARKS = BND_ICONID(10,3), + BND_ICON_FONTPREVIEW = BND_ICONID(11,3), + BND_ICON_FILTER = BND_ICONID(12,3), + BND_ICON_NEWFOLDER = BND_ICONID(13,3), + BND_ICON_OPEN_RECENT = BND_ICONID(14,3), + BND_ICON_FILE_PARENT = BND_ICONID(15,3), + BND_ICON_FILE_REFRESH = BND_ICONID(16,3), + BND_ICON_FILE_FOLDER = BND_ICONID(17,3), + BND_ICON_FILE_BLANK = BND_ICONID(18,3), + BND_ICON_FILE_BLEND = BND_ICONID(19,3), + BND_ICON_FILE_IMAGE = BND_ICONID(20,3), + BND_ICON_FILE_MOVIE = BND_ICONID(21,3), + BND_ICON_FILE_SCRIPT = BND_ICONID(22,3), + BND_ICON_FILE_SOUND = BND_ICONID(23,3), + BND_ICON_FILE_FONT = BND_ICONID(24,3), + BND_ICON_FILE_TEXT = BND_ICONID(25,3), + + BND_ICON_RECOVER_AUTO = BND_ICONID(0,2), + BND_ICON_SAVE_PREFS = BND_ICONID(1,2), + BND_ICON_LINK_BLEND = BND_ICONID(2,2), + BND_ICON_APPEND_BLEND = BND_ICONID(3,2), + BND_ICON_IMPORT = BND_ICONID(4,2), + BND_ICON_EXPORT = BND_ICONID(5,2), + BND_ICON_EXTERNAL_DATA = BND_ICONID(6,2), + BND_ICON_LOAD_FACTORY = BND_ICONID(7,2), + BND_ICON_LOOP_BACK = BND_ICONID(13,2), + BND_ICON_LOOP_FORWARDS = BND_ICONID(14,2), + BND_ICON_BACK = BND_ICONID(15,2), + BND_ICON_FORWARD = BND_ICONID(16,2), + BND_ICON_FILE_BACKUP = BND_ICONID(24,2), + BND_ICON_DISK_DRIVE = BND_ICONID(25,2), + + BND_ICON_MATPLANE = BND_ICONID(0,1), + BND_ICON_MATSPHERE = BND_ICONID(1,1), + BND_ICON_MATCUBE = BND_ICONID(2,1), + BND_ICON_MONKEY = BND_ICONID(3,1), + BND_ICON_HAIR = BND_ICONID(4,1), + BND_ICON_ALIASED = BND_ICONID(5,1), + BND_ICON_ANTIALIASED = BND_ICONID(6,1), + BND_ICON_MAT_SPHERE_SKY = BND_ICONID(7,1), + BND_ICON_WORDWRAP_OFF = BND_ICONID(12,1), + BND_ICON_WORDWRAP_ON = BND_ICONID(13,1), + BND_ICON_SYNTAX_OFF = BND_ICONID(14,1), + BND_ICON_SYNTAX_ON = BND_ICONID(15,1), + BND_ICON_LINENUMBERS_OFF = BND_ICONID(16,1), + BND_ICON_LINENUMBERS_ON = BND_ICONID(17,1), + BND_ICON_SCRIPTPLUGINS = BND_ICONID(18,1), + + BND_ICON_SEQ_SEQUENCER = BND_ICONID(0,0), + BND_ICON_SEQ_PREVIEW = BND_ICONID(1,0), + BND_ICON_SEQ_LUMA_WAVEFORM = BND_ICONID(2,0), + BND_ICON_SEQ_CHROMA_SCOPE = BND_ICONID(3,0), + BND_ICON_SEQ_HISTOGRAM = BND_ICONID(4,0), + BND_ICON_SEQ_SPLITVIEW = BND_ICONID(5,0), + BND_ICON_IMAGE_RGB = BND_ICONID(9,0), + BND_ICON_IMAGE_RGB_ALPHA = BND_ICONID(10,0), + BND_ICON_IMAGE_ALPHA = BND_ICONID(11,0), + BND_ICON_IMAGE_ZDEPTH = BND_ICONID(12,0), + BND_ICON_IMAGEFILE = BND_ICONID(13,0), +} BNDicon; + +//////////////////////////////////////////////////////////////////////////////// + +// set the current theme all widgets will be drawn with. +// the default Blender 2.6 theme is set by default. +BND_EXPORT void bndSetTheme(BNDtheme theme); + +// Returns the currently set theme +BND_EXPORT const BNDtheme *bndGetTheme(); + +// designates an image handle as returned by nvgCreateImage*() as the themes' +// icon sheet. The icon sheet format must be compatible to Blender 2.6's icon +// sheet; the order of icons does not matter. +// A valid icon sheet is e.g. shown at +// http://wiki.blender.org/index.php/Dev:2.5/Doc/How_to/Add_an_icon +BND_EXPORT void bndSetIconImage(int image); + +// designates an image handle as returned by nvgCreateFont*() as the themes' +// UI font. Blender's original UI font Droid Sans is perfectly suited and +// available here: +// https://svn.blender.org/svnroot/bf-blender/trunk/blender/release/datafiles/fonts/ +BND_EXPORT void bndSetFont(int font); + +//////////////////////////////////////////////////////////////////////////////// + +// High Level Functions +// -------------------- +// Use these functions to draw themed widgets with your NVGcontext. + +// Draw a label with its lower left origin at (x,y) and size of (w,h). +// if iconid >= 0, an icon will be added to the widget +// if label is not NULL, a label will be added to the widget +// widget looks best when height is BND_WIDGET_HEIGHT +BND_EXPORT void bndLabel(NVGcontext *ctx, + float x, float y, float w, float h, int iconid, const char *label); + +// Draw a tool button with its lower left origin at (x,y) and size of (w,h), +// where flags is one or multiple flags from BNDcornerFlags and state denotes +// the widgets current UI state. +// if iconid >= 0, an icon will be added to the widget +// if label is not NULL, a label will be added to the widget +// widget looks best when height is BND_WIDGET_HEIGHT +BND_EXPORT void bndToolButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + int iconid, const char *label); + +// Draw a radio button with its lower left origin at (x,y) and size of (w,h), +// where flags is one or multiple flags from BNDcornerFlags and state denotes +// the widgets current UI state. +// if iconid >= 0, an icon will be added to the widget +// if label is not NULL, a label will be added to the widget +// widget looks best when height is BND_WIDGET_HEIGHT +BND_EXPORT void bndRadioButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + int iconid, const char *label); + + +// Calculate the corresponding text position for given coordinates px/py +// in a text field. +// See bndTextField for more info. +BND_EXPORT int bndTextFieldTextPosition(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, const char *text, int px, int py); + +// Draw a text field with its lower left origin at (x,y) and size of (w,h), +// where flags is one or multiple flags from BNDcornerFlags and state denotes +// the widgets current UI state. +// if iconid >= 0, an icon will be added to the widget +// if text is not NULL, text will be printed to the widget +// cbegin must be >= 0 and <= strlen(text) and denotes the beginning of the caret +// cend must be >= cbegin and <= strlen(text) and denotes the end of the caret +// if cend < cbegin, then no caret will be drawn +// widget looks best when height is BND_WIDGET_HEIGHT +BND_EXPORT void bndTextField(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + int iconid, const char *text, int cbegin, int cend); + +// Draw an option button with its lower left origin at (x,y) and size of (w,h), +// where flags is one or multiple flags from BNDcornerFlags and state denotes +// the widgets current UI state. +// if label is not NULL, a label will be added to the widget +// widget looks best when height is BND_WIDGET_HEIGHT +BND_EXPORT void bndOptionButton(NVGcontext *ctx, + float x, float y, float w, float h, BNDwidgetState state, + const char *label); + +// Draw a choice button with its lower left origin at (x,y) and size of (w,h), +// where flags is one or multiple flags from BNDcornerFlags and state denotes +// the widgets current UI state. +// if iconid >= 0, an icon will be added to the widget +// if label is not NULL, a label will be added to the widget +// widget looks best when height is BND_WIDGET_HEIGHT +BND_EXPORT void bndChoiceButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + int iconid, const char *label); + +// Draw a color button with its lower left origin at (x,y) and size of (w,h), +// where flags is one or multiple flags from BNDcornerFlags and state denotes +// the widgets current UI state. +// widget looks best when height is BND_WIDGET_HEIGHT +BND_EXPORT void bndColorButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, NVGcolor color); + +// Draw a number field with its lower left origin at (x,y) and size of (w,h), +// where flags is one or multiple flags from BNDcornerFlags and state denotes +// the widgets current UI state. +// if label is not NULL, a label will be added to the widget +// if value is not NULL, a value will be added to the widget, along with +// a ":" separator +// widget looks best when height is BND_WIDGET_HEIGHT +BND_EXPORT void bndNumberField(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + const char *label, const char *value); + +// Draw slider control with its lower left origin at (x,y) and size of (w,h), +// where flags is one or multiple flags from BNDcornerFlags and state denotes +// the widgets current UI state. +// progress must be in the range 0..1 and controls the size of the slider bar +// if label is not NULL, a label will be added to the widget +// if value is not NULL, a value will be added to the widget, along with +// a ":" separator +// widget looks best when height is BND_WIDGET_HEIGHT +BND_EXPORT void bndSlider(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + float progress, const char *label, const char *value); + +// Draw scrollbar with its lower left origin at (x,y) and size of (w,h), +// where state denotes the widgets current UI state. +// offset is in the range 0..1 and controls the position of the scroll handle +// size is in the range 0..1 and controls the size of the scroll handle +// horizontal widget looks best when height is BND_SCROLLBAR_HEIGHT, +// vertical looks best when width is BND_SCROLLBAR_WIDTH +BND_EXPORT void bndScrollBar(NVGcontext *ctx, + float x, float y, float w, float h, BNDwidgetState state, + float offset, float size); + +// Draw a menu background with its lower left origin at (x,y) and size of (w,h), +// where flags is one or multiple flags from BNDcornerFlags. +BND_EXPORT void bndMenuBackground(NVGcontext *ctx, + float x, float y, float w, float h, int flags); + +// Draw a menu label with its lower left origin at (x,y) and size of (w,h). +// if iconid >= 0, an icon will be added to the widget +// if label is not NULL, a label will be added to the widget +// widget looks best when height is BND_WIDGET_HEIGHT +BND_EXPORT void bndMenuLabel(NVGcontext *ctx, + float x, float y, float w, float h, int iconid, const char *label); + +// Draw a menu item with its lower left origin at (x,y) and size of (w,h), +// where state denotes the widgets current UI state. +// if iconid >= 0, an icon will be added to the widget +// if label is not NULL, a label will be added to the widget +// widget looks best when height is BND_WIDGET_HEIGHT +BND_EXPORT void bndMenuItem(NVGcontext *ctx, + float x, float y, float w, float h, BNDwidgetState state, + int iconid, const char *label); + +// Draw a tooltip background with its lower left origin at (x,y) and size of (w,h) +BND_EXPORT void bndTooltipBackground(NVGcontext *ctx, float x, float y, float w, float h); + +// Draw a node port at the given position filled with the given color +BND_EXPORT void bndNodePort(NVGcontext *ctx, float x, float y, BNDwidgetState state, + NVGcolor color); + +// Draw a node wire originating at (x0,y0) and floating to (x1,y1), with +// a colored gradient based on the states state0 and state1: +// BND_DEFAULT: default wire color +// BND_HOVER: selected wire color +// BND_ACTIVE: dragged wire color +BND_EXPORT void bndNodeWire(NVGcontext *ctx, float x0, float y0, float x1, float y1, + BNDwidgetState state0, BNDwidgetState state1); + +// Draw a node wire originating at (x0,y0) and floating to (x1,y1), with +// a colored gradient based on the two colors color0 and color1 +BND_EXPORT void bndColoredNodeWire(NVGcontext *ctx, float x0, float y0, float x1, float y1, + NVGcolor color0, NVGcolor color1); + +// Draw a node background with its upper left origin at (x,y) and size of (w,h) +// where titleColor provides the base color for the title bar +BND_EXPORT void bndNodeBackground(NVGcontext *ctx, float x, float y, float w, float h, + BNDwidgetState state, int iconid, const char *label, NVGcolor titleColor); + +// Draw a window with the upper right and lower left splitter widgets into +// the rectangle at origin (x,y) and size (w, h) +BND_EXPORT void bndSplitterWidgets(NVGcontext *ctx, float x, float y, float w, float h); + +// Draw the join area overlay stencil into the rectangle +// at origin (x,y) and size (w,h) +// vertical is 0 or 1 and designates the arrow orientation, +// mirror is 0 or 1 and flips the arrow side +BND_EXPORT void bndJoinAreaOverlay(NVGcontext *ctx, float x, float y, float w, float h, + int vertical, int mirror); + +//////////////////////////////////////////////////////////////////////////////// + +// Estimator Functions +// ------------------- +// Use these functions to estimate sizes for widgets with your NVGcontext. + +// returns the ideal width for a label with given icon and text +BND_EXPORT float bndLabelWidth(NVGcontext *ctx, int iconid, const char *label); + +// returns the height for a label with given icon, text and width; this +// function is primarily useful in conjunction with multiline labels and textboxes +BND_EXPORT float bndLabelHeight(NVGcontext *ctx, int iconid, const char *label, + float width); + +//////////////////////////////////////////////////////////////////////////////// + +// Low Level Functions +// ------------------- +// these are part of the implementation detail and can be used to theme +// new kinds of controls in a similar fashion. + +// make color transparent using the default alpha value +BND_EXPORT NVGcolor bndTransparent(NVGcolor color); + +// offset a color by a given integer delta in the range -100 to 100 +BND_EXPORT NVGcolor bndOffsetColor(NVGcolor color, int delta); + +// assigns radius r to the four entries of array radiuses depending on whether +// the corner is marked as sharp or not; see BNDcornerFlags for possible +// flag values. +BND_EXPORT void bndSelectCorners(float *radiuses, float r, int flags); + +// computes the upper and lower gradient colors for the inner box from a widget +// theme and the widgets state. If flipActive is set and the state is +// BND_ACTIVE, the upper and lower colors will be swapped. +BND_EXPORT void bndInnerColors(NVGcolor *shade_top, NVGcolor *shade_down, + const BNDwidgetTheme *theme, BNDwidgetState state, int flipActive); + +// computes the text color for a widget label from a widget theme and the +// widgets state. +BND_EXPORT NVGcolor bndTextColor(const BNDwidgetTheme *theme, BNDwidgetState state); + +// computes the bounds of the scrollbar handle from the scrollbar size +// and the handles offset and size. +// offset is in the range 0..1 and defines the position of the scroll handle +// size is in the range 0..1 and defines the size of the scroll handle +BND_EXPORT void bndScrollHandleRect(float *x, float *y, float *w, float *h, + float offset, float size); + +// Add a rounded box path at position (x,y) with size (w,h) and a separate +// radius for each corner listed in clockwise order, so that cr0 = top left, +// cr1 = top right, cr2 = bottom right, cr3 = bottom left; +// this is a low level drawing function: the path must be stroked or filled +// to become visible. +BND_EXPORT void bndRoundedBox(NVGcontext *ctx, float x, float y, float w, float h, + float cr0, float cr1, float cr2, float cr3); + +// Draw a flat panel without any decorations at position (x,y) with size (w,h) +// and fills it with backgroundColor +BND_EXPORT void bndBackground(NVGcontext *ctx, float x, float y, float w, float h); + +// Draw a beveled border at position (x,y) with size (w,h) shaded with +// lighter and darker versions of backgroundColor +BND_EXPORT void bndBevel(NVGcontext *ctx, float x, float y, float w, float h); + +// Draw a lower inset for a rounded box at position (x,y) with size (w,h) +// that gives the impression the surface has been pushed in. +// cr2 and cr3 contain the radiuses of the bottom right and bottom left +// corners of the rounded box. +BND_EXPORT void bndBevelInset(NVGcontext *ctx, float x, float y, float w, float h, + float cr2, float cr3); + +// Draw an icon with (x,y) as its upper left coordinate; the iconid selects +// the icon from the sheet; use the BND_ICONID macro to build icon IDs. +BND_EXPORT void bndIcon(NVGcontext *ctx, float x, float y, int iconid); + +// Draw a drop shadow around the rounded box at (x,y) with size (w,h) and +// radius r, with feather as its maximum range in pixels. +// No shadow will be painted inside the rounded box. +BND_EXPORT void bndDropShadow(NVGcontext *ctx, float x, float y, float w, float h, + float r, float feather, float alpha); + +// Draw the inner part of a widget box, with a gradient from shade_top to +// shade_down. If h>w, the gradient will be horizontal instead of +// vertical. +BND_EXPORT void bndInnerBox(NVGcontext *ctx, float x, float y, float w, float h, + float cr0, float cr1, float cr2, float cr3, + NVGcolor shade_top, NVGcolor shade_down); + +// Draw the outline part of a widget box with the given color +BND_EXPORT void bndOutlineBox(NVGcontext *ctx, float x, float y, float w, float h, + float cr0, float cr1, float cr2, float cr3, NVGcolor color); + +// Draw an optional icon specified by and an optional label with +// given alignment (BNDtextAlignment), fontsize and color within a widget box. +// if iconid is >= 0, an icon will be drawn and the labels remaining space +// will be adjusted. +// if label is not NULL, it will be drawn with the specified alignment, fontsize +// and color. +// if value is not NULL, label and value will be drawn with a ":" separator +// inbetween. +BND_EXPORT void bndIconLabelValue(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, NVGcolor color, int align, float fontsize, const char *label, + const char *value); + +// Draw an optional icon specified by and an optional label with +// given alignment (BNDtextAlignment), fontsize and color within a node title bar +// if iconid is >= 0, an icon will be drawn +// if label is not NULL, it will be drawn with the specified alignment, fontsize +// and color. +BND_EXPORT void bndNodeIconLabel(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, NVGcolor color, NVGcolor shadowColor, int align, + float fontsize, const char *label); + +// Calculate the corresponding text position for given coordinates px/py +// in an iconLabel. +// See bndIconLabelCaret for more info. +BND_EXPORT int bndIconLabelTextPosition(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, float fontsize, const char *label, int px, int py); + +// Draw an optional icon specified by , an optional label and +// a caret with given fontsize and color within a widget box. +// if iconid is >= 0, an icon will be drawn and the labels remaining space +// will be adjusted. +// if label is not NULL, it will be drawn with the specified alignment, fontsize +// and color. +// cbegin must be >= 0 and <= strlen(text) and denotes the beginning of the caret +// cend must be >= cbegin and <= strlen(text) and denotes the end of the caret +// if cend < cbegin, then no caret will be drawn +BND_EXPORT void bndIconLabelCaret(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, NVGcolor color, float fontsize, const char *label, + NVGcolor caretcolor, int cbegin, int cend); + +// Draw a checkmark for an option box with the given upper left coordinates +// (ox,oy) with the specified color. +BND_EXPORT void bndCheck(NVGcontext *ctx, float ox, float oy, NVGcolor color); + +// Draw a horizontal arrow for a number field with its center at (x,y) and +// size s; if s is negative, the arrow points to the left. +BND_EXPORT void bndArrow(NVGcontext *ctx, float x, float y, float s, NVGcolor color); + +// Draw an up/down arrow for a choice box with its center at (x,y) and size s +BND_EXPORT void bndUpDownArrow(NVGcontext *ctx, float x, float y, float s, NVGcolor color); + +// Draw a node down-arrow with its tip at (x,y) and size s +BND_EXPORT void bndNodeArrowDown(NVGcontext *ctx, float x, float y, float s, NVGcolor color); + +// return the color of a node wire based on state +// BND_HOVER indicates selected state, +// BND_ACTIVE indicates dragged state +BND_EXPORT NVGcolor bndNodeWireColor(const BNDnodeTheme *theme, BNDwidgetState state); + +#ifdef __cplusplus +}; +#endif + +#endif // BLENDISH_H + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +#ifdef BLENDISH_IMPLEMENTATION + +#include +#include + +#ifdef _MSC_VER + #pragma warning (disable: 4996) // Switch off security warnings + #pragma warning (disable: 4100) // Switch off unreferenced formal parameter warnings + #pragma warning (disable: 4244) + #pragma warning (disable: 4305) + #ifdef __cplusplus + #define BND_INLINE inline + #else + #define BND_INLINE + #endif + +#include + +static float bnd_fminf ( float a, float b ) +{ + return _isnan(a) ? b : ( _isnan(b) ? a : ((a < b) ? a : b)); +} + +static float bnd_fmaxf ( float a, float b ) +{ + return _isnan(a) ? b : ( _isnan(b) ? a : ((a > b) ? a : b)); +} + +static double bnd_fmin ( double a, double b ) +{ + return _isnan(a) ? b : ( _isnan(b) ? a : ((a < b) ? a : b)); +} + +static double bnd_fmax ( double a, double b ) +{ + return _isnan(a) ? b : ( _isnan(b) ? a : ((a > b) ? a : b)); +} + +#else + #define BND_INLINE inline + #define bnd_fminf(a, b) fminf(a, b) + #define bnd_fmaxf(a, b) fmaxf(a, b) + #define bnd_fmin(a, b) fmin(a, b) + #define bnd_fmax(a, b) fmax(a, b) +#endif + +//////////////////////////////////////////////////////////////////////////////// + +// default text size +#define BND_LABEL_FONT_SIZE 13 + +// default text padding in inner box +#define BND_PAD_LEFT 8 +#define BND_PAD_RIGHT 8 + +// label: value separator string +#define BND_LABEL_SEPARATOR ": " + +// alpha intensity of transparent items (0xa4) +#define BND_TRANSPARENT_ALPHA 0.643 + +// shade intensity of beveled panels +#define BND_BEVEL_SHADE 30 +// shade intensity of beveled insets +#define BND_INSET_BEVEL_SHADE 30 +// shade intensity of hovered inner boxes +#define BND_HOVER_SHADE 15 +// shade intensity of splitter bevels +#define BND_SPLITTER_SHADE 100 + +// width of icon sheet +#define BND_ICON_SHEET_WIDTH 602 +// height of icon sheet +#define BND_ICON_SHEET_HEIGHT 640 +// gridsize of icon sheet in both dimensions +#define BND_ICON_SHEET_GRID 21 +// offset of first icon tile relative to left border +#define BND_ICON_SHEET_OFFSET_X 5 +// offset of first icon tile relative to top border +#define BND_ICON_SHEET_OFFSET_Y 10 +// resolution of single icon +#define BND_ICON_SHEET_RES 16 + +// size of number field arrow +#define BND_NUMBER_ARROW_SIZE 4 + +// default text color +#define BND_COLOR_TEXT {{{ 0,0,0,1 }}} +// default highlighted text color +#define BND_COLOR_TEXT_SELECTED {{{ 1,1,1,1 }}} + +// radius of tool button +#define BND_TOOL_RADIUS 4 + +// radius of option button +#define BND_OPTION_RADIUS 4 +// width of option button checkbox +#define BND_OPTION_WIDTH 14 +// height of option button checkbox +#define BND_OPTION_HEIGHT 15 + +// radius of text field +#define BND_TEXT_RADIUS 4 + +// radius of number button +#define BND_NUMBER_RADIUS 10 + +// radius of menu popup +#define BND_MENU_RADIUS 3 +// feather of menu popup shadow +#define BND_SHADOW_FEATHER 12 +// alpha of menu popup shadow +#define BND_SHADOW_ALPHA 0.5 + +// radius of scrollbar +#define BND_SCROLLBAR_RADIUS 7 +// shade intensity of active scrollbar +#define BND_SCROLLBAR_ACTIVE_SHADE 15 + +// max glyphs for position testing +#define BND_MAX_GLYPHS 1024 + +// max rows for position testing +#define BND_MAX_ROWS 32 + +// text distance from bottom +#define BND_TEXT_PAD_DOWN 7 + +// stroke width of wire outline +#define BND_NODE_WIRE_OUTLINE_WIDTH 4 +// stroke width of wire +#define BND_NODE_WIRE_WIDTH 2 +// radius of node box +#define BND_NODE_RADIUS 8 +// feather of node title text +#define BND_NODE_TITLE_FEATHER 1 +// size of node title arrow +#define BND_NODE_ARROW_SIZE 9 + +//////////////////////////////////////////////////////////////////////////////// + +BND_INLINE float bnd_clamp(float v, float mn, float mx) { + return (v > mx)?mx:(v < mn)?mn:v; +} + +//////////////////////////////////////////////////////////////////////////////// + +// the initial theme +static BNDtheme bnd_theme = { + // backgroundColor + {{{ 0.447, 0.447, 0.447, 1.0 }}}, + // regularTheme + { + {{{ 0.098,0.098,0.098,1 }}}, // color_outline + {{{ 0.098,0.098,0.098,1 }}}, // color_item + {{{ 0.6,0.6,0.6,1 }}}, // color_inner + {{{ 0.392,0.392,0.392,1 }}}, // color_inner_selected + BND_COLOR_TEXT, // color_text + BND_COLOR_TEXT_SELECTED, // color_text_selected + 0, // shade_top + 0, // shade_down + }, + // toolTheme + { + {{{ 0.098,0.098,0.098,1 }}}, // color_outline + {{{ 0.098,0.098,0.098,1 }}}, // color_item + {{{ 0.6,0.6,0.6,1 }}}, // color_inner + {{{ 0.392,0.392,0.392,1 }}}, // color_inner_selected + BND_COLOR_TEXT, // color_text + BND_COLOR_TEXT_SELECTED, // color_text_selected + 15, // shade_top + -15, // shade_down + }, + // radioTheme + { + {{{ 0,0,0,1 }}}, // color_outline + {{{ 1,1,1,1 }}}, // color_item + {{{ 0.275,0.275,0.275,1 }}}, // color_inner + {{{ 0.337,0.502,0.761,1 }}}, // color_inner_selected + BND_COLOR_TEXT_SELECTED, // color_text + BND_COLOR_TEXT, // color_text_selected + 15, // shade_top + -15, // shade_down + }, + // textFieldTheme + { + {{{ 0.098,0.098,0.098,1 }}}, // color_outline + {{{ 0.353, 0.353, 0.353,1 }}}, // color_item + {{{ 0.6, 0.6, 0.6,1 }}}, // color_inner + {{{ 0.6, 0.6, 0.6,1 }}}, // color_inner_selected + BND_COLOR_TEXT, // color_text + BND_COLOR_TEXT_SELECTED, // color_text_selected + 0, // shade_top + 25, // shade_down + }, + // optionTheme + { + {{{ 0,0,0,1 }}}, // color_outline + {{{ 1,1,1,1 }}}, // color_item + {{{ 0.275,0.275,0.275,1 }}}, // color_inner + {{{ 0.275,0.275,0.275,1 }}}, // color_inner_selected + BND_COLOR_TEXT, // color_text + BND_COLOR_TEXT_SELECTED, // color_text_selected + 15, // shade_top + -15, // shade_down + }, + // choiceTheme + { + {{{ 0,0,0,1 }}}, // color_outline + {{{ 1,1,1,1 }}}, // color_item + {{{ 0.275,0.275,0.275,1 }}}, // color_inner + {{{ 0.275,0.275,0.275,1 }}}, // color_inner_selected + BND_COLOR_TEXT_SELECTED, // color_text + {{{ 0.8,0.8,0.8,1 }}}, // color_text_selected + 15, // shade_top + -15, // shade_down + }, + // numberFieldTheme + { + {{{ 0.098,0.098,0.098,1 }}}, // color_outline + {{{ 0.353, 0.353, 0.353,1 }}}, // color_item + {{{ 0.706, 0.706, 0.706,1 }}}, // color_inner + {{{ 0.6, 0.6, 0.6,1 }}}, // color_inner_selected + BND_COLOR_TEXT, // color_text + BND_COLOR_TEXT_SELECTED, // color_text_selected + -20, // shade_top + 0, // shade_down + }, + // sliderTheme + { + {{{ 0.098,0.098,0.098,1 }}}, // color_outline + {{{ 0.502,0.502,0.502,1 }}}, // color_item + {{{ 0.706, 0.706, 0.706,1 }}}, // color_inner + {{{ 0.6, 0.6, 0.6,1 }}}, // color_inner_selected + BND_COLOR_TEXT, // color_text + BND_COLOR_TEXT_SELECTED, // color_text_selected + -20, // shade_top + 0, // shade_down + }, + // scrollBarTheme + { + {{{ 0.196,0.196,0.196,1 }}}, // color_outline + {{{ 0.502,0.502,0.502,1 }}}, // color_item + {{{ 0.314, 0.314, 0.314,0.706 }}}, // color_inner + {{{ 0.392, 0.392, 0.392,0.706 }}}, // color_inner_selected + BND_COLOR_TEXT, // color_text + BND_COLOR_TEXT_SELECTED, // color_text_selected + 5, // shade_top + -5, // shade_down + }, + // tooltipTheme + { + {{{ 0,0,0,1 }}}, // color_outline + {{{ 0.392,0.392,0.392,1 }}}, // color_item + {{{ 0.098, 0.098, 0.098, 0.902 }}}, // color_inner + {{{ 0.176, 0.176, 0.176, 0.902 }}}, // color_inner_selected + {{{ 0.627, 0.627, 0.627, 1 }}}, // color_text + BND_COLOR_TEXT_SELECTED, // color_text_selected + 0, // shade_top + 0, // shade_down + }, + // menuTheme + { + {{{ 0,0,0,1 }}}, // color_outline + {{{ 0.392,0.392,0.392,1 }}}, // color_item + {{{ 0.098, 0.098, 0.098, 0.902 }}}, // color_inner + {{{ 0.176, 0.176, 0.176, 0.902 }}}, // color_inner_selected + {{{ 0.627, 0.627, 0.627, 1 }}}, // color_text + BND_COLOR_TEXT_SELECTED, // color_text_selected + 0, // shade_top + 0, // shade_down + }, + // menuItemTheme + { + {{{ 0,0,0,1 }}}, // color_outline + {{{ 0.675,0.675,0.675,0.502 }}}, // color_item + {{{ 0,0,0,0 }}}, // color_inner + {{{ 0.337,0.502,0.761,1 }}}, // color_inner_selected + BND_COLOR_TEXT_SELECTED, // color_text + BND_COLOR_TEXT, // color_text_selected + 38, // shade_top + 0, // shade_down + }, + // nodeTheme + { + {{{ 0.945,0.345,0,1 }}}, // nodeSelectedColor + {{{ 0,0,0,1 }}}, // wiresColor + {{{ 0.498,0.439,0.439,1 }}}, // textSelectedColor + {{{ 1,0.667,0.251,1 }}}, // activeNodeColor + {{{ 1,1,1,1 }}}, // wireSelectColor + {{{ 0.608,0.608,0.608,0.627 }}}, // nodeBackdropColor + 5, // noodleCurving + }, +}; + +//////////////////////////////////////////////////////////////////////////////// + +void bndSetTheme(BNDtheme theme) { + bnd_theme = theme; +} + +const BNDtheme *bndGetTheme() { + return &bnd_theme; +} + +// the handle to the image containing the icon sheet +static int bnd_icon_image = -1; + +void bndSetIconImage(int image) { + bnd_icon_image = image; +} + +// the handle to the UI font +static int bnd_font = -1; + +void bndSetFont(int font) { + bnd_font = font; +} + +//////////////////////////////////////////////////////////////////////////////// + +void bndLabel(NVGcontext *ctx, + float x, float y, float w, float h, int iconid, const char *label) { + bndIconLabelValue(ctx,x,y,w,h,iconid, + bnd_theme.regularTheme.textColor, BND_LEFT, + BND_LABEL_FONT_SIZE, label, NULL); +} + +void bndToolButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + int iconid, const char *label) { + float cr[4]; + NVGcolor shade_top, shade_down; + + bndSelectCorners(cr, BND_TOOL_RADIUS, flags); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndInnerColors(&shade_top, &shade_down, &bnd_theme.toolTheme, state, 1); + bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); + bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], + bndTransparent(bnd_theme.toolTheme.outlineColor)); + bndIconLabelValue(ctx,x,y,w,h,iconid, + bndTextColor(&bnd_theme.toolTheme, state), BND_CENTER, + BND_LABEL_FONT_SIZE, label, NULL); +} + +void bndRadioButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + int iconid, const char *label) { + float cr[4]; + NVGcolor shade_top, shade_down; + + bndSelectCorners(cr, BND_OPTION_RADIUS, flags); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndInnerColors(&shade_top, &shade_down, &bnd_theme.radioTheme, state, 1); + bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); + bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], + bndTransparent(bnd_theme.radioTheme.outlineColor)); + bndIconLabelValue(ctx,x,y,w,h,iconid, + bndTextColor(&bnd_theme.radioTheme, state), BND_CENTER, + BND_LABEL_FONT_SIZE, label, NULL); +} + +int bndTextFieldTextPosition(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, const char *text, int px, int py) { + return bndIconLabelTextPosition(ctx, x, y, w, h, + iconid, BND_LABEL_FONT_SIZE, text, px, py); +} + +void bndTextField(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + int iconid, const char *text, int cbegin, int cend) { + float cr[4]; + NVGcolor shade_top, shade_down; + + bndSelectCorners(cr, BND_TEXT_RADIUS, flags); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndInnerColors(&shade_top, &shade_down, &bnd_theme.textFieldTheme, state, 0); + bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); + bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], + bndTransparent(bnd_theme.textFieldTheme.outlineColor)); + if (state != BND_ACTIVE) { + cend = -1; + } + bndIconLabelCaret(ctx,x,y,w,h,iconid, + bndTextColor(&bnd_theme.textFieldTheme, state), BND_LABEL_FONT_SIZE, + text, bnd_theme.textFieldTheme.itemColor, cbegin, cend); +} + +void bndOptionButton(NVGcontext *ctx, + float x, float y, float w, float h, BNDwidgetState state, + const char *label) { + float ox, oy; + NVGcolor shade_top, shade_down; + + ox = x; + oy = y+h-BND_OPTION_HEIGHT-3; + + bndBevelInset(ctx,ox,oy, + BND_OPTION_WIDTH,BND_OPTION_HEIGHT, + BND_OPTION_RADIUS,BND_OPTION_RADIUS); + bndInnerColors(&shade_top, &shade_down, &bnd_theme.optionTheme, state, 1); + bndInnerBox(ctx,ox,oy, + BND_OPTION_WIDTH,BND_OPTION_HEIGHT, + BND_OPTION_RADIUS,BND_OPTION_RADIUS,BND_OPTION_RADIUS,BND_OPTION_RADIUS, + shade_top, shade_down); + bndOutlineBox(ctx,ox,oy, + BND_OPTION_WIDTH,BND_OPTION_HEIGHT, + BND_OPTION_RADIUS,BND_OPTION_RADIUS,BND_OPTION_RADIUS,BND_OPTION_RADIUS, + bndTransparent(bnd_theme.optionTheme.outlineColor)); + if (state == BND_ACTIVE) { + bndCheck(ctx,ox,oy, bndTransparent(bnd_theme.optionTheme.itemColor)); + } + bndIconLabelValue(ctx,x+12,y,w-12,h,-1, + bndTextColor(&bnd_theme.optionTheme, state), BND_LEFT, + BND_LABEL_FONT_SIZE, label, NULL); +} + +void bndChoiceButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + int iconid, const char *label) { + float cr[4]; + NVGcolor shade_top, shade_down; + + bndSelectCorners(cr, BND_OPTION_RADIUS, flags); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndInnerColors(&shade_top, &shade_down, &bnd_theme.choiceTheme, state, 1); + bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); + bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], + bndTransparent(bnd_theme.choiceTheme.outlineColor)); + bndIconLabelValue(ctx,x,y,w,h,iconid, + bndTextColor(&bnd_theme.choiceTheme, state), BND_LEFT, + BND_LABEL_FONT_SIZE, label, NULL); + bndUpDownArrow(ctx,x+w-10,y+10,5, + bndTransparent(bnd_theme.choiceTheme.itemColor)); +} + +void bndColorButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, NVGcolor color) { + float cr[4]; + bndSelectCorners(cr, BND_TOOL_RADIUS, flags); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], color, color); + bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], + bndTransparent(bnd_theme.toolTheme.outlineColor)); +} + +void bndNumberField(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + const char *label, const char *value) { + float cr[4]; + NVGcolor shade_top, shade_down; + + bndSelectCorners(cr, BND_NUMBER_RADIUS, flags); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndInnerColors(&shade_top, &shade_down, &bnd_theme.numberFieldTheme, state, 0); + bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); + bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], + bndTransparent(bnd_theme.numberFieldTheme.outlineColor)); + bndIconLabelValue(ctx,x,y,w,h,-1, + bndTextColor(&bnd_theme.numberFieldTheme, state), BND_CENTER, + BND_LABEL_FONT_SIZE, label, value); + bndArrow(ctx,x+8,y+10,-BND_NUMBER_ARROW_SIZE, + bndTransparent(bnd_theme.numberFieldTheme.itemColor)); + bndArrow(ctx,x+w-8,y+10,BND_NUMBER_ARROW_SIZE, + bndTransparent(bnd_theme.numberFieldTheme.itemColor)); +} + +void bndSlider(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + float progress, const char *label, const char *value) { + float cr[4]; + NVGcolor shade_top, shade_down; + + bndSelectCorners(cr, BND_NUMBER_RADIUS, flags); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndInnerColors(&shade_top, &shade_down, &bnd_theme.sliderTheme, state, 0); + bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); + + if (state == BND_ACTIVE) { + shade_top = bndOffsetColor( + bnd_theme.sliderTheme.itemColor, bnd_theme.sliderTheme.shadeTop); + shade_down = bndOffsetColor( + bnd_theme.sliderTheme.itemColor, bnd_theme.sliderTheme.shadeDown); + } else { + shade_top = bndOffsetColor( + bnd_theme.sliderTheme.itemColor, bnd_theme.sliderTheme.shadeDown); + shade_down = bndOffsetColor( + bnd_theme.sliderTheme.itemColor, bnd_theme.sliderTheme.shadeTop); + } + nvgScissor(ctx,x,y,8+(w-8)*bnd_clamp(progress,0,1),h); + bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); + nvgResetScissor(ctx); + + bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], + bndTransparent(bnd_theme.sliderTheme.outlineColor)); + bndIconLabelValue(ctx,x,y,w,h,-1, + bndTextColor(&bnd_theme.sliderTheme, state), BND_CENTER, + BND_LABEL_FONT_SIZE, label, value); +} + +void bndScrollBar(NVGcontext *ctx, + float x, float y, float w, float h, BNDwidgetState state, + float offset, float size) { + + bndBevelInset(ctx,x,y,w,h, + BND_SCROLLBAR_RADIUS, BND_SCROLLBAR_RADIUS); + bndInnerBox(ctx,x,y,w,h, + BND_SCROLLBAR_RADIUS,BND_SCROLLBAR_RADIUS, + BND_SCROLLBAR_RADIUS,BND_SCROLLBAR_RADIUS, + bndOffsetColor( + bnd_theme.scrollBarTheme.innerColor, 3*bnd_theme.scrollBarTheme.shadeDown), + bndOffsetColor( + bnd_theme.scrollBarTheme.innerColor, 3*bnd_theme.scrollBarTheme.shadeTop)); + bndOutlineBox(ctx,x,y,w,h, + BND_SCROLLBAR_RADIUS,BND_SCROLLBAR_RADIUS, + BND_SCROLLBAR_RADIUS,BND_SCROLLBAR_RADIUS, + bndTransparent(bnd_theme.scrollBarTheme.outlineColor)); + + NVGcolor itemColor = bndOffsetColor( + bnd_theme.scrollBarTheme.itemColor, + (state == BND_ACTIVE)?BND_SCROLLBAR_ACTIVE_SHADE:0); + + bndScrollHandleRect(&x,&y,&w,&h,offset,size); + + bndInnerBox(ctx,x,y,w,h, + BND_SCROLLBAR_RADIUS,BND_SCROLLBAR_RADIUS, + BND_SCROLLBAR_RADIUS,BND_SCROLLBAR_RADIUS, + bndOffsetColor( + itemColor, 3*bnd_theme.scrollBarTheme.shadeTop), + bndOffsetColor( + itemColor, 3*bnd_theme.scrollBarTheme.shadeDown)); + bndOutlineBox(ctx,x,y,w,h, + BND_SCROLLBAR_RADIUS,BND_SCROLLBAR_RADIUS, + BND_SCROLLBAR_RADIUS,BND_SCROLLBAR_RADIUS, + bndTransparent(bnd_theme.scrollBarTheme.outlineColor)); +} + +void bndMenuBackground(NVGcontext *ctx, + float x, float y, float w, float h, int flags) { + float cr[4]; + NVGcolor shade_top, shade_down; + + bndSelectCorners(cr, BND_MENU_RADIUS, flags); + bndInnerColors(&shade_top, &shade_down, &bnd_theme.menuTheme, + BND_DEFAULT, 0); + bndInnerBox(ctx,x,y,w,h+1,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); + bndOutlineBox(ctx,x,y,w,h+1,cr[0],cr[1],cr[2],cr[3], + bndTransparent(bnd_theme.menuTheme.outlineColor)); + bndDropShadow(ctx,x,y,w,h,BND_MENU_RADIUS, + BND_SHADOW_FEATHER,BND_SHADOW_ALPHA); +} + +void bndTooltipBackground(NVGcontext *ctx, float x, float y, float w, float h) { + NVGcolor shade_top, shade_down; + + bndInnerColors(&shade_top, &shade_down, &bnd_theme.tooltipTheme, + BND_DEFAULT, 0); + bndInnerBox(ctx,x,y,w,h+1, + BND_MENU_RADIUS,BND_MENU_RADIUS,BND_MENU_RADIUS,BND_MENU_RADIUS, + shade_top, shade_down); + bndOutlineBox(ctx,x,y,w,h+1, + BND_MENU_RADIUS,BND_MENU_RADIUS,BND_MENU_RADIUS,BND_MENU_RADIUS, + bndTransparent(bnd_theme.tooltipTheme.outlineColor)); + bndDropShadow(ctx,x,y,w,h,BND_MENU_RADIUS, + BND_SHADOW_FEATHER,BND_SHADOW_ALPHA); +} + +void bndMenuLabel(NVGcontext *ctx, + float x, float y, float w, float h, int iconid, const char *label) { + bndIconLabelValue(ctx,x,y,w,h,iconid, + bnd_theme.menuTheme.textColor, BND_LEFT, + BND_LABEL_FONT_SIZE, label, NULL); +} + +void bndMenuItem(NVGcontext *ctx, + float x, float y, float w, float h, BNDwidgetState state, + int iconid, const char *label) { + if (state != BND_DEFAULT) { + bndInnerBox(ctx,x,y,w,h,0,0,0,0, + bndOffsetColor(bnd_theme.menuItemTheme.innerSelectedColor, + bnd_theme.menuItemTheme.shadeTop), + bndOffsetColor(bnd_theme.menuItemTheme.innerSelectedColor, + bnd_theme.menuItemTheme.shadeDown)); + state = BND_ACTIVE; + } + bndIconLabelValue(ctx,x,y,w,h,iconid, + bndTextColor(&bnd_theme.menuItemTheme, state), BND_LEFT, + BND_LABEL_FONT_SIZE, label, NULL); +} + +void bndNodePort(NVGcontext *ctx, float x, float y, BNDwidgetState state, + NVGcolor color) { + nvgBeginPath(ctx); + nvgCircle(ctx, x, y, BND_NODE_PORT_RADIUS); + nvgStrokeColor(ctx,bnd_theme.nodeTheme.wiresColor); + nvgStrokeWidth(ctx,1.0f); + nvgStroke(ctx); + nvgFillColor(ctx,(state != BND_DEFAULT)? + bndOffsetColor(color, BND_HOVER_SHADE):color); + nvgFill(ctx); +} + +void bndColoredNodeWire(NVGcontext *ctx, float x0, float y0, float x1, float y1, + NVGcolor color0, NVGcolor color1) { + float length = bnd_fmaxf(fabsf(x1 - x0),fabsf(y1 - y0)); + float delta = length*(float)bnd_theme.nodeTheme.noodleCurving/10.0f; + + nvgBeginPath(ctx); + nvgMoveTo(ctx, x0, y0); + nvgBezierTo(ctx, + x0 + delta, y0, + x1 - delta, y1, + x1, y1); + NVGcolor colorw = bnd_theme.nodeTheme.wiresColor; + colorw.a = (color0.a= 0) { + w += BND_ICON_SHEET_RES; + } + if (label && (bnd_font >= 0)) { + nvgFontFaceId(ctx, bnd_font); + nvgFontSize(ctx, BND_LABEL_FONT_SIZE); + w += nvgTextBounds(ctx, 1, 1, label, NULL, NULL); + } + return w; +} + +float bndLabelHeight(NVGcontext *ctx, int iconid, const char *label, float width) { + int h = BND_WIDGET_HEIGHT; + width -= BND_TEXT_RADIUS*2; + if (iconid >= 0) { + width -= BND_ICON_SHEET_RES; + } + if (label && (bnd_font >= 0)) { + nvgFontFaceId(ctx, bnd_font); + nvgFontSize(ctx, BND_LABEL_FONT_SIZE); + float bounds[4]; + nvgTextBoxBounds(ctx, 1, 1, width, label, NULL, bounds); + int bh = (int)(bounds[3] - bounds[1]) + BND_TEXT_PAD_DOWN; + if (bh > h) + h = bh; + } + return h; +} + +//////////////////////////////////////////////////////////////////////////////// + +void bndRoundedBox(NVGcontext *ctx, float x, float y, float w, float h, + float cr0, float cr1, float cr2, float cr3) { + float d; + + w = bnd_fmaxf(0, w); + h = bnd_fmaxf(0, h); + d = bnd_fminf(w, h); + + nvgMoveTo(ctx, x,y+h*0.5f); + nvgArcTo(ctx, x,y, x+w,y, bnd_fminf(cr0, d/2)); + nvgArcTo(ctx, x+w,y, x+w,y+h, bnd_fminf(cr1, d/2)); + nvgArcTo(ctx, x+w,y+h, x,y+h, bnd_fminf(cr2, d/2)); + nvgArcTo(ctx, x,y+h, x,y, bnd_fminf(cr3, d/2)); + nvgClosePath(ctx); +} + +NVGcolor bndTransparent(NVGcolor color) { + color.a *= BND_TRANSPARENT_ALPHA; + return color; +} + +NVGcolor bndOffsetColor(NVGcolor color, int delta) { + float offset = (float)delta / 255.0f; + return delta?( + nvgRGBAf( + bnd_clamp(color.r+offset,0,1), + bnd_clamp(color.g+offset,0,1), + bnd_clamp(color.b+offset,0,1), + color.a) + ):color; +} + +void bndBevel(NVGcontext *ctx, float x, float y, float w, float h) { + nvgStrokeWidth(ctx, 1); + + x += 0.5f; + y += 0.5f; + w -= 1; + h -= 1; + + nvgBeginPath(ctx); + nvgMoveTo(ctx, x, y+h); + nvgLineTo(ctx, x+w, y+h); + nvgLineTo(ctx, x+w, y); + nvgStrokeColor(ctx, bndTransparent( + bndOffsetColor(bnd_theme.backgroundColor, -BND_BEVEL_SHADE))); + nvgStroke(ctx); + + nvgBeginPath(ctx); + nvgMoveTo(ctx, x, y+h); + nvgLineTo(ctx, x, y); + nvgLineTo(ctx, x+w, y); + nvgStrokeColor(ctx, bndTransparent( + bndOffsetColor(bnd_theme.backgroundColor, BND_BEVEL_SHADE))); + nvgStroke(ctx); +} + +void bndBevelInset(NVGcontext *ctx, float x, float y, float w, float h, + float cr2, float cr3) { + float d; + + y -= 0.5f; + d = bnd_fminf(w, h); + cr2 = bnd_fminf(cr2, d/2); + cr3 = bnd_fminf(cr3, d/2); + + nvgBeginPath(ctx); + nvgMoveTo(ctx, x+w,y+h-cr2); + nvgArcTo(ctx, x+w,y+h, x,y+h, cr2); + nvgArcTo(ctx, x,y+h, x,y, cr3); + + NVGcolor bevelColor = bndOffsetColor(bnd_theme.backgroundColor, + BND_INSET_BEVEL_SHADE); + + nvgStrokeWidth(ctx, 1); + nvgStrokePaint(ctx, + nvgLinearGradient(ctx, + x,y+h-bnd_fmaxf(cr2,cr3)-1, + x,y+h-1, + nvgRGBAf(bevelColor.r, bevelColor.g, bevelColor.b, 0), + bevelColor)); + nvgStroke(ctx); +} + +void bndBackground(NVGcontext *ctx, float x, float y, float w, float h) { + nvgBeginPath(ctx); + nvgRect(ctx, x, y, w, h); + nvgFillColor(ctx, bnd_theme.backgroundColor); + nvgFill(ctx); +} + +void bndIcon(NVGcontext *ctx, float x, float y, int iconid) { + int ix, iy, u, v; + if (bnd_icon_image < 0) return; // no icons loaded + + ix = iconid & 0xff; + iy = (iconid>>8) & 0xff; + u = BND_ICON_SHEET_OFFSET_X + ix*BND_ICON_SHEET_GRID; + v = BND_ICON_SHEET_OFFSET_Y + iy*BND_ICON_SHEET_GRID; + + nvgBeginPath(ctx); + nvgRect(ctx,x,y,BND_ICON_SHEET_RES,BND_ICON_SHEET_RES); + nvgFillPaint(ctx, + nvgImagePattern(ctx,x-u,y-v, + BND_ICON_SHEET_WIDTH, + BND_ICON_SHEET_HEIGHT, + 0,bnd_icon_image,1)); + nvgFill(ctx); +} + +void bndDropShadow(NVGcontext *ctx, float x, float y, float w, float h, + float r, float feather, float alpha) { + + nvgBeginPath(ctx); + y += feather; + h -= feather; + + nvgMoveTo(ctx, x-feather, y-feather); + nvgLineTo(ctx, x, y-feather); + nvgLineTo(ctx, x, y+h-feather); + nvgArcTo(ctx, x,y+h,x+r,y+h,r); + nvgArcTo(ctx, x+w,y+h,x+w,y+h-r,r); + nvgLineTo(ctx, x+w, y-feather); + nvgLineTo(ctx, x+w+feather, y-feather); + nvgLineTo(ctx, x+w+feather, y+h+feather); + nvgLineTo(ctx, x-feather, y+h+feather); + nvgClosePath(ctx); + + nvgFillPaint(ctx, nvgBoxGradient(ctx, + x - feather*0.5f,y - feather*0.5f, + w + feather,h+feather, + r+feather*0.5f, + feather, + nvgRGBAf(0,0,0,alpha*alpha), + nvgRGBAf(0,0,0,0))); + nvgFill(ctx); +} + +void bndInnerBox(NVGcontext *ctx, float x, float y, float w, float h, + float cr0, float cr1, float cr2, float cr3, + NVGcolor shade_top, NVGcolor shade_down) { + nvgBeginPath(ctx); + bndRoundedBox(ctx,x+1,y+1,w-2,h-3,bnd_fmaxf(0,cr0-1), + bnd_fmaxf(0,cr1-1),bnd_fmaxf(0,cr2-1),bnd_fmaxf(0,cr3-1)); + nvgFillPaint(ctx,((h-2)>w)? + nvgLinearGradient(ctx,x,y,x+w,y,shade_top,shade_down): + nvgLinearGradient(ctx,x,y,x,y+h,shade_top,shade_down)); + nvgFill(ctx); +} + +void bndOutlineBox(NVGcontext *ctx, float x, float y, float w, float h, + float cr0, float cr1, float cr2, float cr3, NVGcolor color) { + nvgBeginPath(ctx); + bndRoundedBox(ctx,x+0.5f,y+0.5f,w-1,h-2,cr0,cr1,cr2,cr3); + nvgStrokeColor(ctx,color); + nvgStrokeWidth(ctx,1); + nvgStroke(ctx); +} + +void bndSelectCorners(float *radiuses, float r, int flags) { + radiuses[0] = (flags & BND_CORNER_TOP_LEFT)?0:r; + radiuses[1] = (flags & BND_CORNER_TOP_RIGHT)?0:r; + radiuses[2] = (flags & BND_CORNER_DOWN_RIGHT)?0:r; + radiuses[3] = (flags & BND_CORNER_DOWN_LEFT)?0:r; +} + +void bndInnerColors( + NVGcolor *shade_top, NVGcolor *shade_down, + const BNDwidgetTheme *theme, BNDwidgetState state, int flipActive) { + + switch(state) { + default: + case BND_DEFAULT: { + *shade_top = bndOffsetColor(theme->innerColor, theme->shadeTop); + *shade_down = bndOffsetColor(theme->innerColor, theme->shadeDown); + } break; + case BND_HOVER: { + NVGcolor color = bndOffsetColor(theme->innerColor, BND_HOVER_SHADE); + *shade_top = bndOffsetColor(color, theme->shadeTop); + *shade_down = bndOffsetColor(color, theme->shadeDown); + } break; + case BND_ACTIVE: { + *shade_top = bndOffsetColor(theme->innerSelectedColor, + flipActive?theme->shadeDown:theme->shadeTop); + *shade_down = bndOffsetColor(theme->innerSelectedColor, + flipActive?theme->shadeTop:theme->shadeDown); + } break; + } +} + +NVGcolor bndTextColor(const BNDwidgetTheme *theme, BNDwidgetState state) { + return (state == BND_ACTIVE)?theme->textSelectedColor:theme->textColor; +} + +void bndIconLabelValue(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, NVGcolor color, int align, float fontsize, const char *label, + const char *value) { + float pleft = BND_PAD_LEFT; + if (label) { + if (iconid >= 0) { + bndIcon(ctx,x+4,y+2,iconid); + pleft += BND_ICON_SHEET_RES; + } + + if (bnd_font < 0) return; + nvgFontFaceId(ctx, bnd_font); + nvgFontSize(ctx, fontsize); + nvgBeginPath(ctx); + nvgFillColor(ctx, color); + if (value) { + float label_width = nvgTextBounds(ctx, 1, 1, label, NULL, NULL); + float sep_width = nvgTextBounds(ctx, 1, 1, + BND_LABEL_SEPARATOR, NULL, NULL); + + nvgTextAlign(ctx, NVG_ALIGN_LEFT|NVG_ALIGN_BASELINE); + x += pleft; + if (align == BND_CENTER) { + float width = label_width + sep_width + + nvgTextBounds(ctx, 1, 1, value, NULL, NULL); + x += ((w-BND_PAD_RIGHT-pleft)-width)*0.5f; + } + y += BND_WIDGET_HEIGHT-BND_TEXT_PAD_DOWN; + nvgText(ctx, x, y, label, NULL); + x += label_width; + nvgText(ctx, x, y, BND_LABEL_SEPARATOR, NULL); + x += sep_width; + nvgText(ctx, x, y, value, NULL); + } else { + nvgTextAlign(ctx, + (align==BND_LEFT)?(NVG_ALIGN_LEFT|NVG_ALIGN_BASELINE): + (NVG_ALIGN_CENTER|NVG_ALIGN_BASELINE)); + nvgTextBox(ctx,x+pleft,y+BND_WIDGET_HEIGHT-BND_TEXT_PAD_DOWN, + w-BND_PAD_RIGHT-pleft,label, NULL); + } + } else if (iconid >= 0) { + bndIcon(ctx,x+2,y+2,iconid); + } +} + +void bndNodeIconLabel(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, NVGcolor color, NVGcolor shadowColor, + int align, float fontsize, const char *label) { + if (label && (bnd_font >= 0)) { + nvgFontFaceId(ctx, bnd_font); + nvgFontSize(ctx, fontsize); + nvgBeginPath(ctx); + nvgTextAlign(ctx, NVG_ALIGN_LEFT|NVG_ALIGN_BASELINE); + nvgFillColor(ctx, shadowColor); + nvgFontBlur(ctx, BND_NODE_TITLE_FEATHER); + nvgTextBox(ctx,x+1,y+h+3-BND_TEXT_PAD_DOWN, + w,label, NULL); + nvgFillColor(ctx, color); + nvgFontBlur(ctx, 0); + nvgTextBox(ctx,x,y+h+2-BND_TEXT_PAD_DOWN, + w,label, NULL); + } + if (iconid >= 0) { + bndIcon(ctx,x+w-BND_ICON_SHEET_RES,y+3,iconid); + } +} + +int bndIconLabelTextPosition(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, float fontsize, const char *label, int px, int py) { + float bounds[4]; + float pleft = BND_TEXT_RADIUS; + if (!label) return -1; + if (iconid >= 0) + pleft += BND_ICON_SHEET_RES; + + if (bnd_font < 0) return -1; + + x += pleft; + y += BND_WIDGET_HEIGHT - BND_TEXT_PAD_DOWN; + + nvgFontFaceId(ctx, bnd_font); + nvgFontSize(ctx, fontsize); + nvgTextAlign(ctx, NVG_ALIGN_LEFT | NVG_ALIGN_BASELINE); + + w -= BND_TEXT_RADIUS + pleft; + + float asc, desc, lh; + static NVGtextRow rows[BND_MAX_ROWS]; + int nrows = nvgTextBreakLines( + ctx, label, NULL, w, rows, BND_MAX_ROWS); + if (nrows == 0) return 0; + nvgTextBoxBounds(ctx, x, y, w, label, NULL, bounds); + nvgTextMetrics(ctx, &asc, &desc, &lh); + + // calculate vertical position + int row = bnd_clamp((int)((float)(py - bounds[1]) / lh), 0, nrows - 1); + // search horizontal position + static NVGglyphPosition glyphs[BND_MAX_GLYPHS]; + int nglyphs = nvgTextGlyphPositions( + ctx, x, y, rows[row].start, rows[row].end + 1, glyphs, BND_MAX_GLYPHS); + int col, p = 0; + for (col = 0; col < nglyphs && glyphs[col].x < px; ++col) + p = glyphs[col].str - label; + // see if we should move one character further + if (col > 0 && col < nglyphs && glyphs[col].x - px < px - glyphs[col - 1].x) + p = glyphs[col].str - label; + return p; +} + +static void bndCaretPosition(NVGcontext *ctx, float x, float y, + float desc, float lineHeight, const char *caret, NVGtextRow *rows,int nrows, + int *cr, float *cx, float *cy) { + static NVGglyphPosition glyphs[BND_MAX_GLYPHS]; + int i,r,nglyphs; + for (r=0; r < nrows && rows[r].end < caret; ++r); + *cr = r; + *cx = x; + *cy = y-lineHeight-desc + r*lineHeight; + if (nrows == 0) return; + *cx = rows[r].minx; + nglyphs = nvgTextGlyphPositions( + ctx, x, y, rows[r].start, rows[r].end+1, glyphs, BND_MAX_GLYPHS); + for (i=0; i < nglyphs; ++i) { + *cx=glyphs[i].x; + if (glyphs[i].str == caret) break; + } +} + +void bndIconLabelCaret(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, NVGcolor color, float fontsize, const char *label, + NVGcolor caretcolor, int cbegin, int cend) { + float pleft = BND_TEXT_RADIUS; + if (!label) return; + if (iconid >= 0) { + bndIcon(ctx,x+4,y+2,iconid); + pleft += BND_ICON_SHEET_RES; + } + + if (bnd_font < 0) return; + + x+=pleft; + y+=BND_WIDGET_HEIGHT-BND_TEXT_PAD_DOWN; + + nvgFontFaceId(ctx, bnd_font); + nvgFontSize(ctx, fontsize); + nvgTextAlign(ctx, NVG_ALIGN_LEFT|NVG_ALIGN_BASELINE); + + w -= BND_TEXT_RADIUS+pleft; + + if (cend >= cbegin) { + int c0r,c1r; + float c0x,c0y,c1x,c1y; + float desc,lh; + static NVGtextRow rows[BND_MAX_ROWS]; + int nrows = nvgTextBreakLines( + ctx, label, label+cend+1, w, rows, BND_MAX_ROWS); + nvgTextMetrics(ctx, NULL, &desc, &lh); + + bndCaretPosition(ctx, x, y, desc, lh, label+cbegin, + rows, nrows, &c0r, &c0x, &c0y); + bndCaretPosition(ctx, x, y, desc, lh, label+cend, + rows, nrows, &c1r, &c1x, &c1y); + + nvgBeginPath(ctx); + if (cbegin == cend) { + nvgFillColor(ctx, nvgRGBf(0.337,0.502,0.761)); + nvgRect(ctx, c0x-1, c0y, 2, lh+1); + } else { + nvgFillColor(ctx, caretcolor); + if (c0r == c1r) { + nvgRect(ctx, c0x-1, c0y, c1x-c0x+1, lh+1); + } else { + int blk=c1r-c0r-1; + nvgRect(ctx, c0x-1, c0y, x+w-c0x+1, lh+1); + nvgRect(ctx, x, c1y, c1x-x+1, lh+1); + + if (blk) + nvgRect(ctx, x, c0y+lh, w, blk*lh+1); + } + } + nvgFill(ctx); + } + + nvgBeginPath(ctx); + nvgFillColor(ctx, color); + nvgTextBox(ctx,x,y,w,label, NULL); +} + +void bndCheck(NVGcontext *ctx, float ox, float oy, NVGcolor color) { + nvgBeginPath(ctx); + nvgStrokeWidth(ctx,2); + nvgStrokeColor(ctx,color); + nvgLineCap(ctx,NVG_BUTT); + nvgLineJoin(ctx,NVG_MITER); + nvgMoveTo(ctx,ox+4,oy+5); + nvgLineTo(ctx,ox+7,oy+8); + nvgLineTo(ctx,ox+14,oy+1); + nvgStroke(ctx); +} + +void bndArrow(NVGcontext *ctx, float x, float y, float s, NVGcolor color) { + nvgBeginPath(ctx); + nvgMoveTo(ctx,x,y); + nvgLineTo(ctx,x-s,y+s); + nvgLineTo(ctx,x-s,y-s); + nvgClosePath(ctx); + nvgFillColor(ctx,color); + nvgFill(ctx); +} + +void bndUpDownArrow(NVGcontext *ctx, float x, float y, float s, NVGcolor color) { + float w; + + nvgBeginPath(ctx); + w = 1.1f*s; + nvgMoveTo(ctx,x,y-1); + nvgLineTo(ctx,x+0.5*w,y-s-1); + nvgLineTo(ctx,x+w,y-1); + nvgClosePath(ctx); + nvgMoveTo(ctx,x,y+1); + nvgLineTo(ctx,x+0.5*w,y+s+1); + nvgLineTo(ctx,x+w,y+1); + nvgClosePath(ctx); + nvgFillColor(ctx,color); + nvgFill(ctx); +} + +void bndNodeArrowDown(NVGcontext *ctx, float x, float y, float s, NVGcolor color) { + float w; + nvgBeginPath(ctx); + w = 1.0f*s; + nvgMoveTo(ctx,x,y); + nvgLineTo(ctx,x+0.5*w,y-s); + nvgLineTo(ctx,x-0.5*w,y-s); + nvgClosePath(ctx); + nvgFillColor(ctx,color); + nvgFill(ctx); +} + +void bndScrollHandleRect(float *x, float *y, float *w, float *h, + float offset, float size) { + size = bnd_clamp(size,0,1); + offset = bnd_clamp(offset,0,1); + if ((*h) > (*w)) { + float hs = bnd_fmaxf(size*(*h), (*w)+1); + *y = (*y) + ((*h)-hs)*offset; + *h = hs; + } else { + float ws = bnd_fmaxf(size*(*w), (*h)-1); + *x = (*x) + ((*w)-ws)*offset; + *w = ws; + } +} + +NVGcolor bndNodeWireColor(const BNDnodeTheme *theme, BNDwidgetState state) { + switch(state) { + default: + case BND_DEFAULT: return nvgRGBf(0.5f,0.5f,0.5f); + case BND_HOVER: return theme->wireSelectColor; + case BND_ACTIVE: return theme->activeNodeColor; + } +} + +//////////////////////////////////////////////////////////////////////////////// + +#ifdef BND_INLINE +#undef BND_INLINE +#endif + +#endif // BLENDISH_IMPLEMENTATION diff --git a/dpf/dgl/src/oui-blendish/blendish_resources.cpp b/dpf/dgl/src/oui-blendish/blendish_resources.cpp new file mode 100644 index 0000000..a1cdcd4 --- /dev/null +++ b/dpf/dgl/src/oui-blendish/blendish_resources.cpp @@ -0,0 +1,24815 @@ +/* (Auto-generated binary data file). */ + +#include "blendish_resources.h" + +static const unsigned char temp1[] = {137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,2,90,0,0,2,128,8,6,0,0,0,68,254,214,163,0,0,0,4,115,66,73, + 84,8,8,8,8,124,8,100,136,0,0,0,9,112,72,89,115,0,0,13,215,0,0,13,215,1,66,40,155,120,0,0,0,25,116,69,88,116,83,111, + 102,116,119,97,114,101,0,119,119,119,46,105,110,107,115,99,97,112,101,46,111,114,103,155,238,60,26,0,0,0,29,116,69,88,116,84,105,116,108,101, + 0,66,108,101,110,100,101,114,32,105,99,111,110,115,32,118,46,32,50,46,53,46,48,56,74,212,185,78,0,0,0,22,116,69,88,116,65,117,116,104, + 111,114,0,65,110,100,114,122,101,106,32,65,109,98,114,111,197,188,92,53,214,138,0,0,0,158,116,69,88,116,68,101,115,99,114,105,112,116,105,111, + 110,0,84,104,105,115,32,99,111,110,116,101,110,116,32,105,115,32,117,110,100,101,114,32,67,67,32,65,116,116,114,105,98,117,116,105,111,110,45,78, + 111,110,67,111,109,109,101,114,99,105,97,108,32,83,104,97,114,101,65,108,105,107,101,32,108,105,99,101,110,99,101,32,51,46,48,32,97,115,32,108, + 111,110,103,32,97,115,32,105,116,39,115,32,117,115,101,100,32,102,111,114,32,66,108,101,110,100,101,114,32,51,68,32,71,85,73,46,32,65,110,121, + 32,111,116,104,101,114,32,117,115,101,115,32,97,114,101,32,110,111,116,32,97,108,108,111,119,101,100,46,43,245,213,180,0,0,0,24,116,69,88,116, + 67,114,101,97,116,105,111,110,32,84,105,109,101,0,50,49,46,48,53,46,50,48,49,50,12,64,242,4,0,0,0,99,116,69,88,116,67,111,112,121, + 114,105,103,104,116,0,67,67,32,65,116,116,114,105,98,117,116,105,111,110,45,78,111,110,67,111,109,109,101,114,99,105,97,108,45,83,104,97,114,101, + 65,108,105,107,101,32,104,116,116,112,58,47,47,99,114,101,97,116,105,118,101,99,111,109,109,111,110,115,46,111,114,103,47,108,105,99,101,110,115,101, + 115,47,98,121,45,110,99,45,115,97,47,51,46,48,47,222,4,26,229,0,0,32,0,73,68,65,84,120,156,236,157,119,124,20,69,255,199,63,179,183, + 123,253,82,72,39,161,37,116,164,55,9,72,135,128,130,88,48,8,136,32,162,136,128,82,124,4,20,4,164,91,168,42,242,128,138,96,5,21,145,32, + 77,122,135,0,2,34,1,33,132,20,210,73,187,94,118,126,127,36,123,92,46,215,2,199,243,19,221,247,235,181,175,187,109,159,157,185,157,189,253,236, + 119,102,103,8,165,20,34,34,34,34,34,34,34,34,34,254,135,249,255,78,128,136,136,136,136,136,136,136,200,63,149,106,27,173,164,164,36,159,67,96, + 132,144,62,190,106,86,76,221,255,238,154,190,108,87,93,77,97,242,163,102,247,10,205,57,126,212,188,159,233,236,254,119,213,20,242,235,171,110,117,52, + 157,191,251,41,157,62,149,251,191,131,166,183,109,239,33,157,30,181,239,242,188,207,121,64,210,217,253,239,166,233,92,126,124,209,173,174,166,99,186,253, + 152,78,175,229,254,239,162,233,105,251,123,76,167,91,109,95,203,146,155,115,63,199,219,190,255,36,216,234,108,92,29,163,81,29,6,12,24,64,28,244, + 201,223,85,83,32,41,41,137,10,250,254,192,159,90,21,236,247,183,166,211,239,233,47,230,12,24,48,128,36,37,37,29,0,208,221,79,154,251,43,52, + 239,249,188,59,229,213,47,186,213,53,89,213,213,244,87,185,191,223,154,142,203,238,165,172,58,107,250,163,220,187,58,239,254,212,244,215,181,228,180,191, + 95,174,165,251,81,230,93,148,159,123,214,117,214,244,199,181,228,172,233,143,114,255,191,208,20,150,223,203,181,228,74,211,31,229,222,221,185,191,87,221, + 7,141,106,69,180,238,231,15,84,113,34,122,248,91,211,223,105,190,31,102,211,215,8,204,223,65,19,254,61,71,115,42,52,231,248,81,179,135,191,206, + 209,253,40,239,142,154,254,210,119,214,241,199,121,114,165,121,175,233,117,147,206,123,194,149,230,189,150,251,255,149,38,252,123,142,252,114,45,57,105,250, + 237,90,114,206,175,63,34,26,142,154,254,186,150,92,164,243,158,207,147,43,205,123,77,175,155,116,222,19,174,52,253,113,15,185,95,186,15,18,213,138, + 104,221,47,238,135,33,2,202,47,62,127,106,223,143,168,206,253,138,188,249,43,170,227,66,247,128,31,229,252,22,125,18,168,72,159,95,158,112,31,68, + 196,107,73,188,150,240,55,187,150,92,149,155,1,3,6,204,73,74,74,154,237,79,205,123,197,89,211,95,134,200,69,222,239,233,90,114,222,215,31,215, + 146,23,205,123,138,56,187,203,255,189,232,62,104,252,45,140,22,112,167,144,248,249,201,4,240,115,148,204,223,220,167,116,10,79,162,127,235,188,227,62, + 164,179,226,73,121,182,63,53,43,120,80,126,83,241,90,18,175,37,191,224,207,107,201,169,76,250,37,173,254,46,231,174,52,253,113,12,71,13,127,149, + 209,251,157,119,127,94,75,247,227,220,63,112,80,74,239,219,4,160,143,168,41,106,138,154,162,166,168,41,106,138,154,162,230,191,117,18,187,119,16,17, + 17,17,17,17,17,17,185,79,144,10,103,42,34,34,34,34,34,34,34,34,226,103,220,182,209,138,137,137,217,166,82,169,26,184,91,175,213,106,111,101, + 101,101,245,188,63,201,18,241,5,241,28,137,60,40,16,66,24,220,121,203,153,7,64,169,248,148,39,34,34,242,47,192,173,209,146,203,229,113,127,254, + 249,103,35,158,231,97,179,217,96,181,90,237,159,38,147,9,221,186,117,171,118,67,250,168,168,168,131,18,137,164,94,117,246,177,217,108,55,179,179,179, + 31,113,183,158,16,114,20,64,28,33,196,113,153,199,79,0,89,102,179,185,173,39,77,66,72,156,179,158,27,45,225,187,71,205,224,224,224,211,44,203, + 214,114,165,229,238,59,207,243,215,115,115,115,59,187,211,188,31,231,232,223,76,84,84,212,65,150,101,171,93,62,111,221,186,229,182,124,70,71,71,159, + 101,24,38,186,26,146,18,158,231,83,110,221,186,245,136,59,35,34,148,121,79,34,206,229,137,16,146,97,181,90,219,123,216,222,173,166,135,50,239,81, + 211,97,91,134,101,217,197,17,17,17,227,116,58,157,1,0,149,72,36,52,52,52,84,72,27,0,192,106,181,230,221,190,125,187,133,55,61,17,17,17, + 145,7,9,183,55,98,158,231,25,163,209,136,43,87,174,192,205,255,189,237,46,142,215,40,249,183,221,17,1,17,145,176,154,205,80,135,133,219,181,115, + 46,93,132,213,98,134,213,100,66,157,14,157,132,52,160,89,179,102,18,47,154,181,150,44,89,18,17,16,16,0,131,193,0,131,193,0,163,209,8,131, + 193,0,147,201,4,147,201,4,179,217,12,179,217,12,171,213,10,163,209,136,61,123,246,120,75,123,173,5,11,22,68,4,6,6,218,245,132,73,208,20, + 116,45,22,11,12,6,3,246,238,221,235,81,147,101,217,90,89,89,89,17,82,169,20,148,82,240,60,239,170,113,97,37,234,215,175,111,246,164,121,159, + 206,209,191,153,70,11,190,73,138,8,82,202,97,229,121,12,108,85,223,190,226,250,186,77,160,86,27,120,171,21,13,39,140,176,47,111,218,180,169,199, + 242,73,41,173,187,224,155,164,96,95,53,11,10,10,244,77,154,52,201,66,249,171,207,238,34,62,181,244,122,125,68,133,190,125,161,96,88,24,134,169, + 52,237,220,185,19,3,7,14,244,150,247,90,147,39,79,142,176,88,44,48,153,76,48,26,141,176,88,44,176,90,173,246,201,102,179,217,39,147,201,132, + 19,39,78,120,211,20,34,89,75,250,246,237,59,58,41,41,73,189,101,203,22,117,189,122,245,32,149,74,193,178,172,61,141,44,203,226,225,135,31,254, + 215,188,238,45,34,34,242,239,193,173,209,50,26,141,169,109,218,180,161,21,223,99,228,114,185,212,113,61,33,36,186,81,163,70,41,206,251,121,171,174, + 10,136,136,196,140,218,33,0,128,119,210,10,4,45,188,215,185,181,125,155,119,51,139,1,0,74,165,18,196,241,49,218,13,106,181,26,125,251,246,133, + 76,38,67,251,246,237,193,113,156,203,73,42,149,130,227,56,111,114,32,132,64,163,209,96,238,220,185,0,0,150,101,161,86,200,49,177,115,123,40,64, + 241,223,139,87,97,226,41,88,150,181,79,190,104,74,165,82,92,184,112,1,44,203,66,34,145,216,63,133,239,91,183,110,197,51,207,60,3,150,101,161, + 84,42,1,47,253,140,56,158,35,147,201,84,83,38,147,153,1,8,230,76,74,8,137,186,155,115,244,111,38,72,41,199,200,213,63,1,0,210,151,77, + 0,80,126,238,78,188,250,142,125,155,186,47,15,1,33,4,28,199,129,97,188,191,79,226,171,102,97,97,161,126,232,208,161,135,3,2,2,118,150,148, + 148,120,212,164,148,34,61,61,29,44,203,186,45,239,12,195,96,233,210,165,248,235,175,191,124,202,187,193,96,192,218,181,107,97,179,217,42,233,10,223, + 157,151,121,163,194,100,205,79,72,72,24,145,148,148,84,131,16,130,143,62,250,8,28,199,97,192,128,1,8,13,13,197,174,93,187,32,149,74,241,230, + 155,111,250,148,70,17,17,145,127,45,28,128,214,0,194,81,30,68,40,5,16,236,176,62,175,226,51,220,97,254,148,11,157,14,21,219,8,235,133,121, + 19,0,153,139,229,5,0,148,21,147,17,192,81,0,205,29,142,35,236,231,152,142,74,199,101,129,242,241,135,0,236,7,208,67,232,68,239,214,173,91, + 143,10,27,213,175,95,255,207,148,148,148,38,130,231,169,168,158,146,90,173,214,70,66,85,149,16,45,234,211,167,143,199,39,124,171,185,114,144,198,177, + 234,192,121,185,227,167,59,8,33,48,155,205,24,50,100,8,0,184,189,233,56,78,62,120,55,152,76,38,176,44,139,198,181,195,49,171,95,27,116,164, + 22,104,203,8,172,197,90,60,161,177,224,207,102,109,177,230,102,30,210,74,202,192,178,172,79,154,60,207,187,53,89,18,137,4,171,87,175,198,208,161, + 67,33,145,72,124,210,115,60,71,113,113,113,73,41,41,41,161,132,16,35,0,216,108,54,185,213,106,13,180,90,173,161,54,155,45,180,58,231,232,223, + 140,149,231,43,205,187,43,155,190,150,79,95,53,11,11,11,245,3,7,14,60,46,151,203,191,140,140,140,204,202,200,200,240,168,73,41,173,98,126,156, + 31,42,62,252,240,67,172,92,185,18,61,123,246,244,41,157,70,163,17,132,16,172,89,179,166,202,186,121,243,230,85,57,158,39,205,138,7,36,38,58, + 58,250,213,29,59,118,4,10,219,134,133,133,129,227,56,180,104,209,2,129,129,129,56,124,248,48,108,54,155,207,215,165,136,136,200,63,23,87,94,196, + 129,110,51,102,204,104,191,120,241,226,133,241,241,241,223,30,61,122,244,27,66,200,54,97,37,165,116,32,0,8,203,42,230,59,160,178,233,225,0,132, + 19,66,182,9,219,59,206,59,44,239,3,64,38,204,207,152,49,163,249,226,197,139,23,78,159,62,253,173,69,139,22,73,103,204,152,209,114,241,226,197, + 11,133,227,184,74,135,35,194,99,169,199,94,133,133,42,170,203,151,47,187,171,162,178,67,41,245,248,111,169,14,11,183,71,178,222,173,27,106,95,62, + 55,163,200,126,3,91,213,174,1,212,106,53,250,189,251,190,199,99,1,229,55,45,147,201,132,220,220,92,123,148,193,219,228,171,166,74,169,192,158,201, + 45,144,94,32,195,156,99,133,72,58,247,23,56,142,67,255,102,45,240,168,52,0,51,235,202,48,249,234,13,88,124,108,211,75,41,117,105,176,132,239, + 66,21,138,175,70,203,17,158,231,211,13,6,67,193,149,43,87,244,124,249,141,93,73,41,173,65,8,41,69,121,148,171,166,67,58,196,59,154,27,6, + 182,170,111,143,58,157,8,232,109,95,254,140,246,130,253,156,76,93,253,30,0,160,103,219,135,189,94,15,190,104,22,20,20,232,31,233,221,227,128,77, + 111,90,63,98,196,136,212,125,251,246,41,125,73,171,43,163,37,68,109,5,147,197,178,44,76,38,147,79,121,55,153,76,110,175,15,161,170,175,58,17, + 45,0,208,106,181,166,159,127,254,25,171,86,173,66,104,104,40,18,18,18,80,179,102,77,108,218,180,9,148,82,76,152,48,1,74,165,82,136,94,251, + 164,41,34,34,242,143,197,147,23,145,47,94,188,120,161,179,145,113,156,119,52,80,78,102,74,160,219,140,25,51,154,123,74,128,163,233,18,150,9,199, + 37,132,108,91,180,104,209,64,47,233,200,131,19,246,127,75,79,221,247,27,141,198,212,86,173,90,249,228,38,116,58,93,182,167,245,194,141,201,249,79, + 213,49,74,160,209,104,160,14,212,128,241,241,127,215,98,177,216,141,202,238,221,187,161,84,42,241,216,99,143,221,83,68,203,108,54,67,38,229,192,132, + 69,98,228,178,125,40,40,213,219,111,48,251,175,167,226,76,78,46,38,199,247,134,90,153,139,50,147,201,167,200,27,207,243,85,76,22,203,178,24,50, + 100,136,61,154,32,172,175,168,146,114,43,26,22,22,118,154,101,217,90,14,139,20,113,113,113,192,157,118,61,132,231,249,178,224,224,224,31,1,68,83, + 74,107,1,8,0,188,159,35,17,215,229,211,121,57,239,20,169,186,27,205,130,130,2,253,192,129,3,143,219,244,166,245,153,153,153,199,1,40,58,118, + 236,88,109,163,37,24,44,142,227,176,116,233,82,172,92,185,210,190,222,87,163,101,181,90,43,25,168,171,87,175,86,58,150,179,177,243,84,109,74,41, + 165,132,16,30,0,31,23,23,103,223,39,42,42,10,193,193,193,224,121,30,60,207,67,161,80,64,169,84,66,42,149,186,213,18,17,17,249,247,224,193, + 139,232,167,79,159,254,22,33,100,91,69,100,233,34,224,214,80,185,162,3,42,155,181,42,134,8,184,19,161,114,54,91,142,223,5,102,204,152,209,220, + 69,58,170,84,87,218,255,85,157,186,221,175,132,99,21,149,63,112,85,93,232,120,35,211,4,7,66,169,86,67,34,97,64,8,241,104,240,132,170,67, + 225,143,127,220,184,113,30,219,173,248,218,158,202,108,54,131,97,37,184,21,21,11,27,115,200,190,175,48,49,44,135,180,168,38,144,92,62,11,206,199, + 27,174,115,68,107,194,132,9,88,187,118,45,24,134,177,255,38,44,203,162,97,195,134,72,77,77,245,168,197,178,108,173,180,180,180,8,199,223,81,48, + 177,148,82,216,108,54,212,175,95,223,144,146,146,242,186,79,137,19,177,227,206,52,59,47,183,217,120,159,163,48,174,182,43,40,40,208,39,38,38,30, + 40,46,46,94,255,208,67,15,93,69,121,247,7,62,117,34,44,148,21,71,131,37,152,172,21,43,86,84,50,69,22,139,197,167,7,1,139,197,82,197, + 240,124,240,193,7,149,62,1,160,115,231,206,62,69,134,1,80,134,97,168,84,42,69,223,190,125,209,178,101,75,108,217,178,5,60,207,99,252,248,241, + 80,42,149,88,190,124,57,172,86,43,150,44,89,34,70,180,68,68,68,60,121,17,227,162,69,139,46,46,90,180,200,30,89,2,92,87,213,57,75,162, + 220,84,133,11,38,13,229,109,173,92,181,223,130,59,77,103,227,5,148,71,186,92,164,195,185,186,242,127,63,214,97,246,31,23,240,126,151,54,0,42, + 87,23,174,126,184,9,212,26,53,212,1,26,36,110,61,4,0,21,127,250,211,189,106,90,44,22,187,209,42,40,40,240,104,178,170,19,209,98,100,44, + 54,215,186,13,42,227,192,154,44,149,140,150,132,229,144,30,26,11,134,147,130,181,89,125,210,164,148,86,169,42,28,53,106,20,8,33,246,183,175,90, + 181,106,229,168,229,81,148,16,130,255,132,148,183,193,115,174,142,93,146,111,240,154,30,145,170,100,159,94,135,63,127,120,21,0,240,136,86,107,63,23, + 11,90,221,121,119,96,217,133,3,246,232,227,187,120,227,174,52,11,10,10,244,29,155,54,63,46,13,9,90,127,243,230,205,227,0,152,103,159,125,54, + 184,85,171,86,62,93,147,194,203,21,206,38,203,49,146,37,124,90,44,22,159,242,46,180,149,242,134,80,141,232,173,204,83,74,105,72,72,8,36,18, + 9,130,130,130,16,16,16,96,127,227,86,161,80,64,165,82,217,219,119,250,104,220,68,68,68,254,189,212,16,140,78,133,89,2,80,185,77,150,163,25, + 114,87,133,88,17,129,58,232,229,88,73,40,55,104,46,17,34,107,142,203,156,143,235,8,11,220,25,152,82,248,172,89,179,230,175,26,141,38,214,75, + 66,236,84,231,45,54,155,229,78,99,120,193,100,17,66,160,9,208,64,169,81,67,25,160,169,180,206,23,132,170,67,137,68,98,191,233,124,249,229,151, + 208,104,52,120,225,133,23,170,221,70,11,168,48,90,82,6,187,228,123,33,145,177,149,76,22,203,178,144,112,28,178,53,53,193,112,28,88,171,111,81, + 178,226,226,98,176,44,139,89,179,102,217,159,224,29,77,86,117,242,236,9,134,16,33,186,37,111,216,176,225,27,132,144,186,0,234,105,181,90,121,86, + 86,86,175,123,62,192,63,24,106,187,99,74,220,53,120,175,238,57,114,214,20,34,89,210,144,160,245,77,154,52,177,71,178,84,42,149,240,182,169,87, + 24,134,113,105,178,156,223,16,100,89,182,188,44,123,121,59,210,49,162,181,104,209,34,187,174,99,36,75,160,58,215,145,160,189,127,255,126,36,39,39, + 99,220,184,113,80,42,149,88,185,114,37,172,86,43,230,205,155,7,165,82,9,153,76,230,93,72,68,68,228,31,141,179,23,113,34,207,169,29,20,113, + 50,53,121,64,85,131,229,88,77,232,240,221,241,233,83,208,53,57,85,41,58,47,23,62,11,22,45,90,180,79,136,100,57,44,175,148,14,71,92,58, + 4,185,92,30,123,229,202,21,123,71,152,158,62,77,38,19,122,246,236,233,115,100,76,120,235,144,101,37,149,140,133,42,64,3,85,96,0,148,26,141, + 179,225,240,120,87,99,24,198,254,68,236,104,180,102,207,158,13,150,101,177,118,237,90,0,192,27,111,188,225,115,27,45,65,19,54,130,12,122,13,109, + 150,61,3,211,87,22,228,28,249,29,44,203,34,162,211,163,224,59,62,3,157,82,3,214,102,245,249,173,195,194,194,66,164,166,166,66,34,145,96,202, + 148,41,149,250,58,114,126,147,109,247,238,221,94,243,14,84,141,100,205,190,89,104,215,81,42,149,204,239,191,255,30,203,243,124,156,94,175,111,208,185, + 115,231,234,53,42,250,23,66,121,107,165,121,31,170,17,189,158,35,71,77,161,77,86,113,113,241,250,155,55,111,158,0,192,140,24,49,34,88,165,82, + 225,179,207,62,211,1,144,109,218,180,201,163,219,114,52,231,222,76,22,199,113,229,101,217,7,132,170,109,97,242,214,48,222,151,50,47,164,149,16,2, + 155,205,6,165,82,89,41,146,165,80,40,32,151,203,125,74,159,136,136,200,191,26,183,85,125,46,232,224,96,154,188,237,231,110,125,117,142,231,17,151, + 6,137,97,24,24,141,70,92,186,116,201,87,29,159,59,198,172,221,254,97,188,155,89,12,66,8,254,219,249,33,168,3,53,80,169,213,24,188,229,128, + 253,143,251,194,194,55,32,87,107,16,221,53,193,171,158,240,36,238,108,180,138,138,138,192,113,28,230,207,159,15,134,97,176,100,201,18,196,196,196,224, + 214,173,91,216,180,105,147,87,93,179,217,12,137,77,130,154,207,55,133,106,84,16,2,159,239,134,26,125,103,35,211,196,226,168,65,133,110,134,63,32, + 219,181,2,38,222,230,243,27,88,86,171,21,7,14,28,112,110,240,110,111,83,101,181,90,97,177,88,96,54,155,177,100,201,18,95,222,240,172,52,47, + 220,208,132,117,148,82,73,74,74,74,56,165,52,4,64,16,128,124,159,18,250,47,166,102,167,9,8,111,255,10,0,96,235,162,23,237,203,103,93,184, + 83,62,151,126,85,62,0,64,147,122,222,203,167,163,102,65,65,129,190,127,207,206,7,13,60,247,69,139,22,45,42,69,178,20,10,5,169,152,247,41, + 92,198,48,12,36,18,73,149,234,66,119,102,203,151,54,90,86,171,21,82,169,212,126,29,185,43,215,213,141,104,49,12,131,23,95,124,17,53,107,214, + 180,71,178,222,125,247,93,40,149,74,204,152,49,3,22,139,5,43,86,172,240,89,79,68,68,68,196,11,126,51,73,254,192,229,63,169,193,96,184,209, + 178,101,75,151,59,24,12,134,24,133,66,81,233,95,150,84,116,94,234,92,133,72,8,233,67,41,221,227,172,33,68,111,2,2,3,160,208,168,161,114, + 138,98,41,2,2,33,215,104,192,72,171,254,153,187,210,20,218,150,56,26,45,97,42,46,46,6,199,113,88,181,106,21,2,3,3,97,52,26,189,106, + 10,55,29,137,68,2,93,122,41,254,92,184,7,50,197,81,52,72,24,138,154,156,18,210,195,63,66,111,171,220,102,203,23,205,70,141,26,225,157,119, + 222,169,210,173,131,59,98,98,98,188,230,221,57,146,181,244,161,58,144,202,164,152,250,71,58,140,70,35,25,58,116,40,15,64,15,32,79,175,215,223, + 244,229,247,188,87,254,9,154,158,222,138,21,224,169,205,213,118,46,53,133,72,150,129,231,190,72,77,77,21,34,89,65,42,149,10,159,126,250,169,14, + 0,51,111,222,60,85,221,186,117,171,244,113,230,170,44,73,36,18,44,91,182,204,101,155,44,87,166,203,151,188,11,215,145,227,190,221,187,119,119,217, + 97,169,43,243,230,74,83,72,107,104,104,168,61,146,101,179,217,236,111,27,10,189,207,187,123,168,248,39,148,37,81,83,212,20,53,255,221,184,188,203, + 103,101,101,245,119,183,67,131,6,13,174,92,185,114,165,161,48,20,71,197,31,167,212,96,48,52,234,220,185,179,215,208,14,207,243,144,203,229,160,148, + 162,215,59,139,65,24,128,65,229,155,88,68,151,222,144,72,88,240,229,67,125,120,125,235,80,175,215,87,186,57,184,154,202,202,202,96,52,26,189,190, + 150,46,96,48,24,42,117,193,64,40,143,180,223,190,175,242,246,161,48,249,218,110,71,161,80,84,170,250,241,132,183,254,174,132,155,147,99,213,163,84, + 38,5,43,229,132,136,86,233,149,43,87,18,125,74,152,8,128,59,47,44,0,64,227,206,143,129,231,109,160,54,91,165,97,146,154,198,246,7,79,109, + 48,91,116,48,26,141,222,186,61,33,249,249,249,250,196,196,196,3,0,62,127,226,137,39,82,80,254,198,11,213,104,52,114,142,227,120,0,133,0,232, + 237,219,183,131,50,51,51,121,131,193,80,199,91,58,147,146,146,112,233,210,37,116,237,218,181,210,112,80,66,84,212,177,119,119,95,202,167,80,93,238, + 170,71,120,119,70,206,87,132,198,240,82,169,20,243,231,207,135,84,42,133,74,165,2,0,172,88,177,194,222,249,170,136,136,136,200,63,145,187,121,235, + 80,226,161,90,209,99,21,162,213,106,205,168,91,183,110,181,14,102,179,217,114,60,173,231,121,62,99,211,166,77,82,160,106,227,101,119,159,148,82,143, + 154,148,210,140,173,91,183,218,223,115,119,188,73,185,250,78,202,27,159,123,212,180,217,108,25,245,234,221,25,175,216,23,99,102,177,88,50,61,173,231, + 121,30,139,243,244,142,233,198,212,63,210,221,142,157,40,226,25,155,205,230,161,124,190,237,110,31,111,229,243,106,227,198,141,51,131,131,131,183,71,70, + 70,22,28,57,114,36,180,67,135,14,161,142,219,116,232,208,161,166,211,110,38,184,31,231,16,132,144,140,39,158,120,194,101,153,7,96,55,240,78,229, + 211,99,87,243,148,210,140,147,39,79,74,29,247,119,167,239,112,29,121,238,190,190,124,155,180,54,109,218,48,142,58,238,202,190,197,98,113,217,175,141, + 136,136,136,200,131,76,181,141,150,94,175,79,111,217,178,165,203,214,181,174,170,166,28,201,207,207,111,95,221,227,121,195,108,54,119,126,16,52,243,242, + 242,252,154,119,171,213,154,81,209,65,169,199,109,252,121,204,127,58,254,62,71,0,144,147,147,211,209,223,154,86,171,213,239,229,211,98,177,248,93,19, + 0,10,10,10,226,239,135,174,136,136,136,200,131,66,181,141,150,56,24,241,223,131,251,97,90,69,68,68,68,68,68,68,252,139,79,189,80,139,136,136, + 136,136,136,136,136,136,84,31,130,242,81,170,171,80,157,183,9,8,33,46,53,60,225,77,95,212,20,53,69,77,81,83,212,20,53,69,205,127,158,166, + 55,237,127,220,219,140,66,195,233,251,49,1,232,35,106,138,154,162,166,168,41,106,138,154,162,166,168,249,111,157,196,170,67,17,17,17,17,17,17,17, + 145,251,196,255,124,80,105,145,114,8,33,18,74,169,207,61,234,251,64,13,0,238,6,140,51,1,184,125,23,154,4,128,180,98,18,58,58,178,0,48, + 87,76,62,244,33,49,151,201,202,170,209,156,218,184,14,148,16,142,231,113,174,78,157,218,103,129,254,38,0,208,68,53,107,166,81,43,251,24,205,166, + 88,57,39,187,84,164,45,219,109,200,73,185,113,23,105,21,17,17,17,17,17,249,219,225,214,104,5,4,4,156,102,24,166,150,183,254,121,4,42,198, + 50,203,40,44,44,244,233,109,56,66,8,11,32,81,163,209,244,228,56,174,11,0,88,44,150,35,101,101,101,251,0,108,162,148,250,54,64,91,85,221, + 64,0,67,0,12,175,88,244,53,128,239,41,165,37,119,169,215,50,40,40,232,7,142,227,104,126,126,126,39,0,8,13,13,61,110,177,88,72,73,73, + 201,96,74,233,249,106,234,49,28,199,45,237,218,181,107,55,66,200,231,148,210,85,119,147,46,23,200,25,134,113,105,80,120,158,175,231,106,185,23,164, + 0,130,86,173,90,21,186,113,227,198,54,25,25,25,45,0,160,86,173,90,23,70,140,24,113,118,226,196,137,5,0,138,81,110,184,220,146,149,85,163, + 121,110,246,245,113,57,185,151,134,0,64,84,205,22,223,75,36,140,52,38,230,204,49,85,216,240,176,198,77,234,191,242,237,103,171,164,245,98,107,99, + 239,209,51,173,39,190,254,86,115,69,100,227,15,69,179,245,191,35,48,48,240,52,195,48,181,0,247,215,184,171,107,222,102,179,101,20,20,20,184,188, + 222,3,3,3,79,179,44,91,203,221,190,238,150,241,60,127,61,47,47,207,101,87,19,65,65,65,199,88,150,141,245,85,75,248,180,90,173,25,238,222, + 210,13,10,10,58,45,145,72,106,121,202,167,171,117,60,207,95,207,205,205,117,151,206,42,121,247,71,58,239,70,211,83,58,221,65,8,25,2,96,14, + 202,31,180,150,80,74,191,168,206,254,34,34,34,149,113,107,180,24,134,169,149,153,153,25,161,86,171,1,220,25,143,79,24,76,154,231,121,80,74,237, + 159,86,171,21,77,155,54,245,233,160,132,144,22,129,129,129,155,103,204,152,81,39,49,49,81,38,12,53,147,149,149,213,232,135,31,126,120,110,254,252, + 249,179,9,33,207,80,74,47,248,168,199,0,232,13,96,84,155,54,109,158,126,247,221,119,165,189,122,245,130,205,102,195,246,237,219,187,206,155,55,111, + 21,33,228,71,0,235,1,252,70,41,245,105,112,101,66,200,35,81,81,81,223,28,62,124,184,102,106,106,170,45,49,49,241,59,0,56,125,250,116,156, + 205,102,35,157,58,117,74,34,132,12,163,148,30,246,41,227,229,60,253,218,107,175,61,59,97,194,132,136,23,94,120,97,52,128,85,21,199,34,0,64, + 43,42,191,171,129,61,146,69,41,149,122,216,46,10,190,71,182,212,169,169,169,53,58,119,238,252,106,110,110,238,100,71,221,156,156,28,36,39,39,155, + 23,46,92,184,236,232,209,163,159,196,198,198,222,6,160,117,39,68,109,92,135,156,220,75,67,186,197,175,10,2,128,77,91,95,29,122,242,108,94,192, + 182,29,107,158,147,41,164,198,141,255,93,38,109,216,160,30,246,159,190,138,19,151,10,73,139,71,6,178,197,219,54,244,5,176,198,135,116,138,248,1, + 137,68,18,147,145,145,17,161,82,169,92,14,28,239,212,46,67,232,0,21,141,26,53,114,171,201,178,108,173,204,204,204,8,133,66,97,255,239,112,254, + 207,0,42,143,215,73,41,69,227,198,141,221,26,119,134,97,234,222,188,121,51,66,165,82,217,117,92,165,79,64,48,28,141,27,55,246,148,247,74,233, + 244,69,147,82,138,134,13,27,186,141,70,11,121,23,70,192,240,150,111,65,51,54,54,214,237,181,239,74,211,151,116,214,175,95,223,227,131,80,197,182, + 44,128,185,0,212,0,102,2,152,123,235,214,173,70,18,137,4,181,106,213,154,67,8,249,30,192,252,176,176,48,38,63,63,255,77,74,169,87,77,17, + 17,145,59,184,53,90,132,16,168,213,106,124,247,221,119,110,135,227,112,252,94,167,142,215,81,67,4,221,246,177,177,177,7,14,31,62,172,172,89,243, + 78,135,216,38,147,9,53,106,212,192,248,241,227,101,143,63,254,120,195,132,132,132,227,132,144,238,148,210,211,94,244,158,14,15,15,255,104,214,172,89, + 145,207,62,251,44,66,67,43,117,186,141,196,196,68,12,30,60,88,154,146,146,50,244,203,47,191,28,186,122,245,234,108,66,200,68,74,233,143,158,116, + 85,42,213,19,13,26,52,248,244,240,225,195,17,17,17,17,136,139,139,99,222,124,243,205,134,141,26,53,82,214,170,85,139,185,117,235,22,182,108,217, + 18,51,108,216,176,205,50,153,236,21,147,201,244,179,15,121,151,133,134,134,190,245,202,43,175,132,149,148,148,88,147,147,147,175,8,203,101,50,217,188, + 248,248,248,14,132,144,175,40,165,235,188,105,57,96,143,100,85,68,237,156,199,50,177,8,235,125,140,108,201,206,157,59,23,18,31,31,255,163,209,104, + 108,59,110,220,184,155,11,23,46,84,6,6,6,6,2,32,37,37,37,183,231,206,157,107,90,190,124,249,180,102,205,154,245,62,118,236,216,211,173,91, + 183,182,160,220,196,85,129,18,98,79,79,122,102,30,14,28,229,101,239,204,120,163,214,123,11,98,211,78,253,145,206,179,202,64,252,114,240,34,114,10, + 202,240,235,177,63,16,21,26,64,164,114,174,121,112,173,230,221,139,51,255,56,120,23,198,83,164,154,16,66,160,82,169,240,203,47,191,84,25,186,202, + 213,176,86,44,203,34,56,56,216,235,232,6,10,133,2,187,119,239,118,57,246,162,171,33,125,130,130,130,0,184,31,84,155,16,2,133,66,129,35,71, + 142,128,97,24,151,67,3,57,47,83,171,213,96,60,140,117,37,104,30,60,120,208,171,150,240,169,209,104,0,160,202,152,148,142,200,229,114,28,62,124, + 216,109,158,157,191,107,42,198,123,245,166,121,228,200,145,74,67,127,57,15,9,230,56,175,86,171,237,15,112,94,152,187,101,203,150,183,34,34,34,48, + 104,208,160,103,154,54,109,26,17,28,28,140,207,63,255,28,81,81,81,49,90,173,246,234,150,45,91,162,243,243,243,241,218,107,175,73,1,188,234,131, + 166,136,136,191,225,0,180,6,16,142,242,81,104,74,1,4,163,252,222,35,3,80,0,64,89,49,25,1,148,1,8,171,216,55,31,229,255,45,142,6, + 33,15,149,7,159,238,80,161,45,140,80,17,238,176,78,56,134,243,188,243,167,75,109,22,0,146,146,146,132,155,89,143,1,3,6,28,168,148,51,31, + 76,150,48,78,153,243,53,77,171,14,48,43,87,171,213,63,28,63,126,92,25,30,126,39,15,70,163,17,165,165,165,40,43,43,67,105,105,41,2,2, + 2,176,105,211,38,101,239,222,189,127,32,132,52,162,148,26,221,105,2,88,118,235,214,173,72,171,213,10,153,204,117,19,37,134,97,208,180,105,83,188, + 245,214,91,232,215,175,95,84,207,158,61,151,1,176,27,45,23,154,80,169,84,159,38,39,39,71,168,84,42,92,185,114,5,25,25,25,152,58,117,106, + 109,158,231,145,158,158,142,171,87,175,34,51,51,19,95,126,249,101,196,147,79,62,249,41,128,74,70,203,149,38,128,113,147,39,79,110,82,163,70,13, + 230,253,247,223,47,210,106,181,31,87,44,127,103,229,202,149,207,119,235,214,45,98,204,152,49,148,16,178,145,82,90,197,184,56,105,186,138,100,217,0, + 252,233,180,91,83,167,72,87,20,202,11,97,145,11,77,2,32,40,33,33,97,138,209,104,108,123,248,240,225,191,186,116,233,82,23,192,45,84,20,190, + 160,160,32,245,178,101,203,34,7,14,28,152,210,171,87,175,182,9,9,9,83,242,242,242,22,86,172,167,206,154,60,143,115,81,53,91,124,127,240,216, + 196,33,251,143,152,164,111,188,62,251,102,157,218,245,138,207,93,41,180,253,113,61,15,165,122,43,158,234,85,62,128,121,167,22,117,240,209,119,135,49, + 126,210,219,220,143,223,111,24,252,23,133,26,64,146,135,223,243,158,16,53,203,169,168,98,2,199,113,120,244,209,71,65,8,169,50,150,39,199,113,56, + 118,236,24,122,245,234,5,142,227,240,226,139,47,250,164,201,178,44,18,18,18,236,227,40,58,234,57,155,6,87,158,192,57,239,148,82,176,44,11,134, + 97,220,14,164,237,172,233,237,127,73,72,167,39,45,199,117,222,210,41,68,147,124,53,89,190,106,10,233,100,89,22,157,59,119,198,217,179,103,61,154, + 46,87,254,210,77,89,82,156,63,127,30,221,187,119,199,185,115,231,162,56,142,67,114,114,50,100,50,25,22,45,90,196,52,109,218,52,58,32,32,0, + 251,246,237,67,86,86,150,175,154,247,132,168,249,239,212,244,228,69,0,116,155,49,99,70,251,197,139,23,47,140,143,143,255,246,232,209,163,223,16,66, + 182,81,74,7,10,159,51,102,204,104,190,120,241,226,133,211,167,79,127,107,209,162,69,23,9,33,219,0,192,121,190,34,253,3,29,180,57,0,225,130, + 14,0,56,111,235,106,222,249,211,141,246,157,136,214,128,1,3,72,69,38,137,195,198,62,27,45,95,30,156,88,150,157,176,112,225,194,72,79,38,171, + 172,172,12,89,89,89,168,91,183,46,94,124,241,197,200,85,171,86,77,0,240,129,7,89,169,68,34,193,201,147,39,145,155,155,139,150,45,91,34,54, + 54,182,210,6,215,174,93,195,246,237,219,81,84,84,132,118,237,218,1,229,237,143,92,210,186,117,235,57,77,155,54,77,72,72,72,176,42,149,74,156, + 59,119,14,109,219,182,197,119,223,125,135,58,117,234,64,165,82,33,37,37,5,45,91,182,196,129,3,7,16,30,30,142,54,109,218,88,219,181,107,119, + 168,176,176,112,223,141,27,55,230,184,210,37,132,72,99,98,98,102,143,29,59,86,150,149,149,197,175,95,191,254,48,165,244,48,33,100,194,219,111,191, + 61,186,95,191,126,17,103,206,156,41,62,117,234,212,9,87,38,203,5,174,34,89,149,218,181,85,84,217,24,245,122,189,201,104,52,90,24,134,185,65, + 8,49,217,108,54,119,117,62,138,81,163,70,213,207,207,207,31,63,105,210,164,212,10,147,117,25,229,13,224,1,0,86,171,213,88,86,86,86,18,31, + 31,95,119,216,176,97,127,125,243,205,55,227,71,141,26,181,105,253,250,245,101,0,244,206,130,117,234,212,62,43,145,48,82,109,105,200,245,205,155,214, + 77,222,190,117,66,237,244,244,204,134,161,97,225,90,169,38,60,107,211,215,95,156,6,96,202,202,43,193,249,107,217,224,56,9,46,165,23,163,91,255, + 68,238,175,43,11,30,65,133,209,18,185,175,80,97,16,234,253,251,247,123,140,104,29,59,118,12,28,199,65,169,84,98,249,242,229,30,69,5,99,32, + 68,139,188,153,25,97,112,116,119,8,102,67,24,232,221,121,250,248,227,143,49,105,210,164,74,199,168,48,27,30,163,100,142,6,198,57,125,117,235,213, + 67,110,78,78,165,101,190,12,74,111,179,217,192,113,28,214,174,93,139,129,3,7,98,219,182,109,30,63,31,125,244,81,48,12,227,49,122,43,164,179, + 115,231,206,48,155,205,246,52,95,190,124,217,165,238,234,213,171,189,166,179,130,153,115,231,206,125,90,171,213,214,14,15,15,135,92,46,135,82,169,132, + 82,169,132,66,161,64,94,94,30,50,51,51,233,162,69,139,242,0,76,243,85,84,68,228,110,112,229,69,42,144,47,94,188,120,161,179,137,113,68,88, + 79,8,217,182,104,209,162,129,192,29,83,228,56,95,177,185,227,216,170,221,102,204,152,209,220,97,62,207,209,68,9,11,61,29,219,105,251,74,227,182, + 218,141,86,69,198,122,8,243,12,195,64,248,243,245,102,178,220,61,57,58,19,20,20,244,216,83,79,61,101,55,57,6,131,193,110,176,4,147,37,204, + 167,164,164,160,125,251,246,210,160,160,160,199,224,217,104,149,103,132,101,17,29,29,141,252,252,124,92,184,112,1,117,235,214,133,197,98,193,206,157,59, + 81,92,92,12,142,227,32,149,74,97,54,123,110,94,208,180,105,211,71,55,110,220,216,126,195,134,13,183,37,18,9,46,95,190,140,175,191,254,26,148, + 82,132,135,135,67,167,211,33,39,39,7,251,246,237,131,213,106,133,70,163,65,92,92,156,236,137,39,158,120,100,238,220,185,28,202,27,145,186,162,243, + 224,193,131,131,2,3,3,241,250,235,175,83,179,217,188,136,16,210,121,240,224,193,179,39,78,156,24,122,227,198,13,211,75,47,189,116,210,108,54,191, + 15,0,132,16,142,82,106,113,163,5,192,115,36,203,98,177,8,191,105,106,89,89,25,194,194,194,234,122,105,195,5,0,210,35,71,142,116,6,32,153, + 55,111,158,2,64,14,28,76,150,201,100,66,89,89,25,180,90,173,165,184,184,56,247,63,255,249,143,245,155,111,190,145,84,236,115,9,46,140,22,208, + 223,244,208,67,106,25,165,146,183,215,172,89,163,233,215,175,31,163,209,104,80,90,90,26,248,235,142,29,154,222,61,31,137,91,184,248,189,93,129,181, + 90,230,28,57,119,29,153,217,197,48,89,44,136,171,25,4,128,247,169,45,157,200,189,81,241,34,139,61,162,229,104,42,14,30,60,136,254,253,251,219, + 175,117,169,84,90,41,242,229,77,147,101,89,244,239,223,191,74,132,103,67,39,186,162,0,0,32,0,73,68,65,84,255,254,253,46,163,79,222,112,52, + 69,206,230,200,149,1,99,24,166,74,251,37,87,154,238,170,52,1,84,89,231,139,209,18,242,59,113,226,68,112,28,135,55,223,124,19,44,203,162,77, + 155,54,96,89,22,241,241,241,224,56,14,189,122,245,170,118,222,143,31,63,142,182,109,219,218,211,212,166,77,27,116,232,208,1,44,203,162,107,215,174, + 224,56,14,9,9,9,62,105,10,13,223,227,227,227,99,38,79,158,140,31,127,252,17,83,167,78,181,90,44,150,235,0,240,242,203,47,199,77,157,58, + 85,162,213,106,73,108,108,108,216,229,203,151,79,19,66,196,6,242,34,247,13,103,47,226,128,126,250,244,233,111,17,66,182,9,17,42,160,114,228,201, + 213,188,51,14,102,72,168,218,235,128,202,38,78,168,246,27,224,97,95,147,147,177,114,174,58,116,172,146,244,28,209,18,254,124,125,53,90,222,48,24, + 12,173,35,34,34,132,239,85,76,150,227,167,201,100,66,108,108,44,12,6,67,107,175,194,149,127,8,212,172,89,19,102,179,25,235,214,173,131,84,42, + 133,84,122,199,95,152,76,158,131,69,127,252,241,71,234,241,227,199,219,182,107,215,174,198,79,63,253,148,215,189,123,247,240,126,253,250,65,169,84,66, + 175,215,195,98,177,160,83,167,78,104,218,180,41,50,50,50,240,235,175,191,230,55,106,212,40,236,196,137,19,124,118,118,118,154,7,233,190,189,123,247, + 6,33,4,59,118,236,200,167,148,158,82,40,20,219,23,44,88,80,195,100,50,241,35,70,140,184,89,88,88,56,9,128,89,46,151,175,76,72,72,136, + 151,72,36,95,217,108,54,207,97,3,23,56,255,182,90,173,22,10,133,194,151,174,36,184,194,194,194,22,0,160,86,171,67,0,252,37,172,208,235,245, + 149,204,176,201,100,50,132,132,132,168,1,160,98,31,231,182,97,0,0,66,72,184,74,165,218,156,150,118,61,192,177,253,92,112,112,48,134,15,27,198, + 116,233,220,89,214,170,117,235,132,153,31,110,248,46,58,52,208,20,23,29,10,139,205,130,61,187,118,242,148,183,236,170,110,222,69,170,143,99,213,161, + 115,68,139,227,56,28,56,112,160,202,50,169,84,138,255,254,247,191,30,117,5,99,32,152,42,119,85,103,78,85,93,30,255,72,132,40,187,68,34,193, + 218,181,107,193,243,60,38,79,158,92,169,58,209,81,223,23,28,77,96,211,217,60,0,19,50,150,202,237,251,59,167,183,98,31,159,162,100,171,86,173, + 242,41,162,53,96,192,0,175,198,213,177,134,193,49,93,103,207,158,117,169,187,102,205,26,175,191,39,42,26,190,135,132,132,32,57,57,25,74,165,18, + 132,144,91,51,103,206,92,22,28,28,220,167,184,184,184,94,82,82,18,91,84,84,132,132,132,4,166,75,151,46,141,126,251,237,183,143,9,33,27,252, + 220,61,141,136,8,0,143,17,45,227,162,69,139,46,46,90,180,200,101,196,74,216,200,121,222,25,135,168,84,7,148,27,162,112,193,188,161,188,89,205, + 41,31,246,149,57,87,29,122,202,147,115,68,107,174,48,239,248,231,235,75,245,161,143,225,116,150,16,2,131,193,224,210,96,57,154,3,179,217,140,194, + 194,66,216,108,182,187,238,235,203,213,147,172,55,163,117,225,194,133,23,70,143,30,157,21,20,20,212,42,47,47,47,151,231,249,94,199,142,29,11,103, + 89,22,129,129,129,8,12,12,196,246,237,219,161,82,169,48,113,226,196,92,155,205,118,48,32,32,32,84,175,215,255,158,157,157,61,211,157,46,199,113, + 9,93,187,118,69,114,114,50,110,223,190,189,155,16,210,102,204,152,49,253,107,215,174,77,22,44,88,96,184,118,237,218,114,0,185,106,181,122,227,198, + 141,27,123,182,107,215,46,96,196,136,17,32,132,172,161,148,26,124,205,179,86,171,173,100,176,74,74,74,80,90,90,10,181,90,237,83,119,25,148,82, + 14,229,109,173,132,246,86,246,115,83,17,205,18,206,15,101,89,150,150,111,66,93,154,44,0,80,171,213,243,54,108,216,160,116,126,73,193,102,179,33, + 39,39,7,129,129,129,152,53,115,166,244,221,169,99,218,74,52,145,199,24,134,192,100,166,69,148,55,237,212,230,60,123,200,215,124,139,220,27,130,49, + 24,52,104,80,149,234,66,169,84,138,221,187,119,227,201,39,159,180,63,184,180,107,215,206,235,195,149,96,12,30,127,252,113,0,229,145,161,157,59,119, + 186,172,246,19,34,82,158,112,52,48,18,137,4,175,189,246,26,88,150,197,71,31,125,132,41,83,166,128,97,24,44,93,186,20,12,195,224,157,119,222, + 241,41,223,206,6,230,198,123,229,159,181,166,148,160,96,117,36,0,32,32,48,80,200,144,79,154,66,222,89,150,181,71,178,90,183,110,13,142,227,16, + 31,31,15,150,101,237,145,172,199,30,123,204,241,119,244,120,0,65,147,101,89,92,185,114,197,158,230,248,248,248,74,145,44,150,101,49,96,64,149,135, + 113,183,240,60,143,117,235,214,65,38,147,9,70,11,50,153,172,243,148,41,83,158,118,181,253,67,15,61,196,161,252,101,0,209,104,137,248,29,103,47, + 226,64,13,199,54,87,190,234,57,152,40,251,60,80,181,26,176,34,66,118,208,155,150,171,125,189,193,2,229,14,210,213,202,234,24,45,137,68,226,245, + 143,87,165,82,157,207,205,205,141,87,42,149,149,76,150,43,195,37,145,72,144,157,157,13,149,74,85,173,126,170,188,225,173,234,176,194,212,76,21,230, + 9,33,125,30,123,236,177,245,187,119,239,174,185,103,207,30,156,56,113,2,225,225,225,88,181,106,213,173,156,156,156,23,40,165,187,125,57,110,253,250, + 245,91,104,52,26,28,57,114,4,0,14,0,24,51,126,252,120,98,177,88,176,122,245,106,45,128,29,193,193,193,73,155,54,109,106,219,170,85,43,217, + 158,61,123,74,78,156,56,241,155,143,38,203,198,243,124,21,131,229,248,155,6,4,4,248,242,167,104,9,10,10,186,80,82,82,146,168,215,235,75,228, + 114,121,64,73,73,137,209,209,96,9,250,44,203,114,87,174,92,201,2,16,23,20,20,116,1,14,85,140,142,176,44,219,187,119,239,222,149,204,178,217, + 108,70,78,78,14,178,179,179,97,54,155,209,174,93,59,34,33,22,73,225,205,223,199,250,144,70,17,63,67,8,161,194,181,46,188,37,232,60,177,44, + 139,157,59,119,218,231,25,134,193,23,95,184,175,61,114,52,69,187,119,239,118,27,197,114,81,117,232,53,52,46,108,255,201,39,159,148,15,111,81,17, + 201,98,24,6,211,167,79,135,92,46,199,130,5,11,48,125,250,116,176,44,235,181,234,208,209,192,212,123,83,103,95,46,84,29,90,42,218,67,17,66, + 28,205,150,199,136,150,163,121,243,20,205,243,237,165,192,202,13,236,89,150,133,66,161,112,89,125,234,66,211,219,1,102,199,196,196,204,9,15,15,111, + 176,108,217,50,137,82,169,196,152,49,99,98,180,90,237,16,0,88,190,124,57,38,79,158,12,0,152,54,109,26,22,47,94,12,189,94,95,230,131,174, + 136,72,181,113,231,69,42,200,115,106,95,69,28,171,241,60,124,58,111,15,135,101,142,186,121,168,124,31,115,92,238,108,174,156,143,225,184,77,165,246, + 89,128,151,238,29,170,211,24,222,151,136,150,78,167,251,109,199,142,29,29,134,13,27,198,122,170,54,212,106,181,136,140,140,196,197,139,23,173,58,157, + 238,55,111,186,54,155,239,15,86,222,140,150,51,148,210,61,81,81,81,18,139,197,130,134,13,27,34,38,38,6,6,131,1,69,69,69,18,95,77,22, + 33,68,218,190,125,123,9,0,20,21,21,1,229,175,154,54,110,212,168,17,146,147,147,81,88,88,248,35,128,126,115,231,206,109,215,169,83,39,233,119, + 223,125,167,27,55,110,220,143,22,139,101,142,47,250,60,207,155,172,86,107,44,195,48,230,162,162,162,76,199,223,51,50,50,50,68,173,86,147,156,156, + 28,143,237,189,42,176,180,106,213,234,228,205,155,55,49,111,222,188,188,133,11,23,54,42,45,45,189,93,92,92,108,117,52,91,6,131,129,9,11,11, + 147,175,94,189,90,9,0,173,90,181,58,9,55,70,75,171,213,214,86,169,84,246,121,163,209,136,236,236,108,100,103,103,35,39,39,7,165,165,165,136, + 139,139,131,78,167,171,235,75,94,69,252,143,243,91,114,142,215,183,227,141,188,58,215,58,112,199,192,12,26,52,200,222,182,75,136,144,9,211,230,205, + 155,29,171,13,1,31,141,214,39,159,124,130,215,94,123,13,10,133,2,203,150,45,171,84,117,232,108,94,120,158,247,106,138,88,150,69,236,52,61,178, + 87,134,128,227,56,132,142,203,169,84,69,231,194,16,249,148,206,133,11,23,250,165,234,208,81,179,110,221,186,0,128,181,107,215,34,49,49,17,135,14, + 29,186,235,170,67,74,233,247,132,144,109,86,171,245,74,179,102,205,98,10,10,10,240,250,235,175,51,155,55,111,150,2,192,164,73,147,48,105,210,164, + 74,251,24,12,6,177,237,164,200,255,7,110,171,244,238,147,174,223,142,231,177,90,206,177,145,168,55,163,229,75,68,203,104,52,46,123,253,245,215,199, + 247,233,211,39,36,32,32,0,89,89,89,85,76,86,89,89,25,52,26,13,244,122,61,182,110,221,90,98,52,26,151,121,201,131,197,98,177,32,34,34, + 2,249,249,249,224,221,180,159,102,24,6,74,165,18,101,101,101,128,27,83,224,14,74,41,204,102,51,44,22,11,44,22,11,204,102,179,215,167,100,39, + 84,66,199,175,90,173,22,0,180,209,209,209,13,21,10,5,82,83,83,129,242,55,251,250,244,239,223,159,43,40,40,160,47,189,244,210,97,74,233,88, + 234,185,119,124,211,193,131,7,99,1,64,169,84,166,0,64,70,70,134,165,168,168,168,82,164,80,165,82,209,39,159,124,178,38,165,20,7,15,30,140, + 149,74,165,20,110,250,188,2,96,248,249,231,159,255,8,10,10,250,102,241,226,197,195,6,14,28,120,177,69,139,22,177,90,173,54,87,175,215,235,13, + 6,3,149,72,36,210,26,53,106,40,118,237,218,245,215,177,99,199,250,4,6,6,126,243,243,207,63,255,1,192,101,228,77,173,86,103,232,116,186,122, + 194,57,117,52,89,217,217,217,160,148,226,250,245,235,80,169,84,55,171,243,131,138,248,23,225,161,202,57,242,226,188,204,87,147,37,192,178,44,118,237, + 218,229,54,170,83,29,227,230,104,138,166,76,153,130,149,43,87,86,137,104,45,88,176,0,0,48,115,230,76,159,219,104,1,229,209,171,236,149,33,136, + 122,173,176,82,218,1,128,8,233,171,102,151,110,44,203,98,222,188,121,85,26,169,59,86,237,85,167,138,79,72,103,110,110,46,88,150,69,72,72,8, + 134,15,31,142,132,132,4,123,21,228,93,234,206,255,241,199,31,99,2,2,2,144,150,150,70,203,202,202,72,65,65,1,0,215,17,45,157,78,39,135, + 24,209,18,17,241,25,143,29,249,1,240,201,100,185,251,3,38,132,244,113,156,167,148,22,235,116,186,225,125,251,246,213,235,116,58,212,175,95,31,114, + 185,28,22,139,5,38,147,9,82,169,20,53,107,214,132,213,106,197,154,53,107,244,58,157,110,56,165,180,216,147,38,128,183,219,183,111,111,72,73,73, + 65,157,58,117,16,16,16,80,101,56,138,192,192,64,4,7,7,35,57,57,25,11,22,44,208,3,120,219,139,102,21,4,131,37,24,46,111,70,203,73, + 83,45,68,117,116,58,29,0,88,106,215,174,29,5,0,215,175,95,7,128,27,113,113,113,61,235,215,175,79,14,29,58,4,74,233,78,87,38,203,73, + 179,176,107,215,174,105,93,187,118,53,153,76,38,169,201,100,146,22,23,23,155,195,194,194,34,194,194,194,194,34,35,35,67,34,34,34,130,179,178,178, + 172,86,171,85,106,179,217,164,93,187,118,53,61,252,240,195,55,225,208,59,188,147,38,15,160,100,205,154,53,115,57,142,75,235,220,185,115,243,105,211, + 166,221,176,88,44,198,152,152,152,26,81,81,81,74,157,78,87,186,104,209,162,220,149,43,87,246,225,56,46,109,205,154,53,115,1,148,84,236,91,69, + 211,106,181,254,182,103,207,30,171,197,98,65,102,102,38,178,178,178,112,235,214,45,251,103,112,112,48,78,158,60,105,51,155,205,30,251,100,241,229,28, + 85,23,81,179,28,161,91,1,79,6,75,120,152,242,85,211,209,20,37,38,38,226,217,103,159,197,208,161,67,49,124,248,112,140,24,49,194,173,113,115, + 190,174,156,243,238,216,199,215,180,105,211,48,115,230,76,204,158,61,27,114,185,28,179,102,205,194,156,57,115,48,103,206,28,103,147,69,60,105,10,121, + 231,56,14,197,107,99,160,91,95,15,166,175,26,148,87,29,82,122,103,242,49,157,194,255,15,199,113,152,53,107,22,142,29,59,134,255,252,231,63,216, + 187,119,47,38,76,152,128,237,219,183,99,236,216,177,72,74,74,178,127,10,178,222,52,133,188,119,239,222,29,58,157,206,110,100,95,121,229,149,74,122, + 99,199,142,245,233,247,172,192,240,237,183,223,226,179,207,62,67,98,98,226,173,193,131,7,219,74,74,202,71,44,155,52,105,146,189,231,249,197,139,23, + 151,111,108,48,200,125,208,188,39,68,205,127,167,230,63,21,143,143,124,86,171,21,181,107,215,174,52,118,22,195,48,149,166,234,180,51,0,0,74,233, + 46,66,200,211,93,186,116,249,234,181,215,94,11,104,211,166,13,87,175,94,61,104,181,90,164,166,166,226,226,197,139,214,159,127,254,185,68,167,211,61, + 71,41,245,250,214,25,165,116,3,33,100,103,191,126,253,222,233,212,169,211,43,179,103,207,150,52,110,220,24,197,197,197,168,81,163,6,34,34,34,112, + 249,242,101,108,221,186,213,150,159,159,255,41,128,119,41,165,85,234,80,189,29,198,108,54,99,232,208,161,224,121,30,203,151,47,7,33,164,58,143,183, + 102,179,217,76,1,144,252,252,124,0,208,85,244,46,141,171,87,175,2,64,90,108,108,108,0,0,236,217,179,135,0,240,117,72,31,10,135,200,86,211, + 166,77,83,129,170,195,154,8,235,81,30,201,242,150,110,195,144,33,67,114,117,58,93,191,41,83,166,188,243,201,39,159,12,251,228,147,79,170,108,20, + 24,24,248,205,210,165,75,223,29,50,100,72,46,220,68,179,0,64,171,213,206,28,57,114,228,144,243,231,207,7,40,20,10,104,181,90,20,20,20,192, + 108,54,35,46,46,14,185,185,185,216,176,97,67,169,94,175,159,227,99,158,69,252,140,163,49,112,23,213,242,102,178,220,193,178,44,126,249,229,151,42, + 81,44,95,26,191,187,75,167,171,182,73,158,162,98,158,30,138,132,110,105,156,219,139,113,156,111,125,3,122,210,101,89,22,239,191,255,62,88,150,117, + 27,201,170,78,228,73,208,12,9,9,1,0,8,67,38,13,24,48,224,158,116,1,204,174,120,131,84,13,96,230,141,27,55,78,183,110,221,186,17,224, + 58,162,37,34,34,82,61,220,26,45,155,205,150,209,164,73,19,0,222,7,46,21,176,88,44,25,190,28,148,82,186,147,16,18,183,116,233,210,215,213, + 106,117,31,157,78,215,18,40,111,44,175,213,106,247,24,141,198,21,180,26,131,64,87,24,167,9,132,144,229,253,250,245,91,208,171,87,175,103,166,78, + 157,74,40,165,88,189,122,53,189,118,237,218,102,0,111,83,74,175,249,170,233,72,72,72,200,31,95,124,241,69,228,79,63,253,4,139,197,130,21,43, + 86,32,32,32,224,143,106,164,47,151,101,217,245,157,59,119,126,254,216,177,99,27,40,165,191,203,100,178,47,31,121,228,145,145,199,142,29,251,154,82, + 122,145,101,217,47,59,117,234,52,242,212,169,83,155,40,165,103,171,145,188,194,174,93,187,222,6,16,101,181,186,174,105,236,218,181,171,9,64,54,188, + 155,44,129,146,209,163,71,155,71,143,30,61,117,200,144,33,235,78,157,58,213,177,168,168,168,37,0,4,7,7,159,239,208,161,195,201,239,191,255,254, + 50,202,35,89,30,27,235,83,74,243,8,33,79,182,108,217,242,199,249,243,231,171,155,55,111,206,54,108,216,16,55,110,220,192,133,11,23,172,159,127, + 254,121,153,94,175,31,68,41,245,101,12,70,145,251,128,16,125,10,14,14,174,244,16,37,244,75,85,221,234,66,1,65,211,249,1,77,34,145,184,213, + 244,212,109,130,128,70,163,177,119,110,234,75,147,5,222,93,123,2,135,116,10,154,194,228,131,201,242,250,134,96,197,16,56,62,107,250,210,189,131,90, + 173,134,197,98,177,235,250,240,230,167,247,140,148,71,207,237,81,126,66,200,236,115,231,206,109,0,32,117,213,70,75,68,68,164,122,184,53,90,133,133, + 133,46,71,145,247,23,21,70,234,221,138,201,95,154,215,0,12,33,132,124,176,119,239,222,89,21,139,231,81,47,227,37,122,227,207,63,255,28,200,113, + 220,127,191,249,230,155,78,148,82,4,5,5,29,191,113,227,198,203,213,209,176,90,173,163,9,33,227,133,183,8,77,38,211,104,66,200,235,148,210,50, + 135,245,246,249,106,66,1,24,41,165,209,110,214,27,225,187,201,18,48,0,48,125,255,253,247,101,0,206,225,78,63,89,150,138,201,0,135,234,66,143, + 137,163,116,31,33,164,225,172,89,179,22,74,36,146,222,90,173,54,70,173,86,167,91,173,214,223,116,58,221,219,148,210,130,106,166,77,196,143,152,76, + 166,204,38,77,154,176,64,213,7,40,79,55,114,79,15,86,54,155,45,163,81,163,70,94,31,206,92,104,102,186,91,71,41,77,139,139,139,99,124,213, + 18,48,155,205,185,158,210,25,23,23,231,115,250,28,210,233,49,239,177,177,177,46,243,238,9,158,231,221,230,221,106,181,222,149,166,167,223,211,29,148, + 210,239,99,98,98,38,135,134,134,54,53,24,12,50,131,193,32,117,140,10,42,149,202,98,171,187,167,58,17,17,145,42,220,117,31,85,127,103,42,140, + 213,227,126,212,51,2,120,222,15,58,6,167,249,50,79,243,213,228,126,68,132,120,0,58,175,91,249,0,165,52,31,192,75,254,208,18,241,47,249,249, + 249,15,251,91,179,160,160,192,239,15,106,121,121,121,241,254,214,204,207,207,247,123,58,31,20,77,79,100,102,102,250,189,76,136,136,252,91,185,187,58, + 1,17,17,17,17,17,17,17,17,17,175,16,0,46,223,28,160,213,24,153,251,110,222,62,240,166,47,106,138,154,162,166,168,41,106,138,154,162,230,63, + 79,211,155,118,117,252,199,3,129,240,234,238,253,152,0,244,17,53,69,77,81,83,212,20,53,69,77,81,83,212,252,183,78,98,213,225,223,136,118,132, + 184,29,51,240,239,164,41,34,34,34,34,34,34,226,27,46,27,195,43,107,145,142,234,16,102,131,205,76,111,91,12,244,133,210,27,52,69,93,155,244, + 5,131,103,1,196,202,164,210,154,38,147,57,13,20,59,109,12,182,24,210,232,141,187,77,64,68,68,196,25,165,82,25,89,82,82,146,119,251,246,237, + 214,65,65,65,55,131,131,131,89,147,201,116,225,214,173,91,253,239,70,179,113,184,186,95,155,22,245,63,191,122,61,227,136,173,152,127,249,92,81,81, + 177,247,189,254,247,154,0,64,8,145,52,14,69,127,2,140,9,170,175,232,223,36,156,28,160,192,103,108,62,126,254,131,210,234,141,23,116,159,52,9, + 33,76,96,96,224,166,160,160,160,4,150,101,109,66,7,151,132,16,154,157,157,141,178,178,178,112,234,166,23,251,255,101,89,18,17,17,17,17,241,29, + 142,227,150,133,132,132,140,214,106,181,85,186,233,113,49,148,85,134,78,167,251,159,190,148,241,79,193,181,209,210,72,151,46,223,49,188,225,233,27,59, + 176,110,104,206,124,117,29,18,212,251,217,135,122,245,27,222,26,193,17,74,200,53,12,138,242,75,27,252,121,58,189,207,190,239,175,188,167,8,147,164, + 241,165,172,133,82,170,181,88,44,35,40,165,41,190,38,64,173,86,215,188,126,253,122,100,76,76,140,5,0,66,66,66,164,142,243,119,131,84,42,25, + 189,126,209,235,81,41,231,79,60,51,225,253,159,155,54,136,210,244,248,43,187,44,255,110,245,4,205,47,230,191,26,117,229,143,51,126,209,108,16,65, + 226,88,138,209,173,107,73,95,120,233,201,174,81,3,251,116,65,141,136,154,200,72,191,217,119,251,158,35,125,191,223,113,178,168,113,56,249,82,34,193, + 186,75,217,244,210,255,151,38,0,4,5,5,173,28,53,106,212,227,189,123,247,230,130,130,130,16,17,17,1,133,66,1,185,92,142,78,157,58,21,148, + 149,149,177,0,92,27,173,106,150,37,85,93,50,71,127,19,11,41,165,226,120,106,255,16,8,33,141,107,215,174,253,163,82,169,12,76,73,73,153,73, + 41,93,127,31,143,53,188,83,167,78,43,206,157,59,119,198,104,52,190,94,157,255,34,17,145,127,19,18,137,100,69,143,30,61,134,173,94,189,58,96, + 215,174,93,1,15,61,244,16,76,38,147,125,188,97,157,78,103,31,22,207,102,179,97,245,234,213,255,223,73,126,96,113,105,180,228,10,73,120,112,80, + 13,212,168,205,34,170,78,141,65,111,172,26,200,70,54,80,32,199,118,17,57,180,8,54,171,9,210,26,106,52,234,87,3,109,18,122,73,126,89,115, + 33,238,198,30,14,175,62,63,197,246,242,75,47,239,4,80,183,186,9,81,169,84,53,234,213,171,151,21,21,21,165,4,0,43,49,75,3,227,152,95, + 195,227,148,15,223,186,170,251,143,46,141,126,230,110,223,30,132,176,105,117,239,228,69,97,83,37,205,95,246,217,224,25,67,219,146,181,83,122,55,123, + 117,229,111,199,26,133,42,187,95,41,208,103,249,154,30,87,154,115,63,92,55,120,214,243,157,238,90,211,17,150,98,251,158,61,187,27,133,112,122,80, + 221,29,191,86,171,118,93,188,242,98,93,188,244,210,75,193,127,166,229,78,26,51,225,141,23,0,4,253,127,105,2,128,90,173,142,111,219,182,45,87, + 88,88,136,176,176,48,123,71,150,50,153,204,235,190,119,81,150,230,253,242,209,165,78,164,1,121,138,254,69,221,141,201,40,242,128,64,8,105,220,178, + 101,203,195,71,143,30,13,45,42,42,66,167,78,157,222,3,176,254,126,29,175,125,251,246,75,14,29,58,20,114,228,200,145,190,195,134,13,59,72,8, + 233,86,93,179,69,8,105,92,167,78,157,31,21,10,69,64,74,74,202,116,74,233,215,254,74,31,33,100,84,124,124,252,135,103,206,156,57,109,50,153, + 38,137,70,80,228,255,3,66,200,123,61,123,246,124,122,245,234,213,161,132,16,252,250,235,175,184,122,245,170,189,51,97,31,59,237,245,229,56,45,0, + 16,74,233,249,123,79,245,131,139,199,126,180,24,194,224,221,141,195,88,91,72,38,126,207,221,143,125,159,222,198,95,251,12,38,67,41,95,16,217,84, + 26,221,234,9,21,58,62,153,131,199,198,53,196,94,245,13,156,255,235,172,68,165,82,5,184,211,11,11,11,75,10,8,8,8,100,24,198,126,6,245, + 122,189,106,214,172,89,124,74,74,138,134,16,162,41,188,93,128,230,157,26,208,184,254,52,234,209,137,109,163,194,234,40,48,171,219,201,105,0,92,26, + 173,22,209,154,119,250,141,232,55,179,171,92,202,241,22,51,120,155,25,188,197,12,86,66,113,238,74,38,218,214,86,96,253,132,246,245,199,126,114,234, + 98,253,112,121,135,107,121,70,175,189,195,187,211,148,179,119,175,233,138,232,102,93,193,235,11,64,136,4,214,130,171,176,21,221,0,19,88,11,22,89, + 24,138,243,178,96,53,252,5,41,43,169,86,59,186,123,213,12,14,14,158,40,151,203,151,40,149,74,43,195,48,148,16,66,101,50,153,122,243,230,205, + 120,247,221,119,17,16,16,0,165,82,9,165,82,9,133,66,225,243,197,88,157,178,36,87,75,30,221,188,228,194,44,0,51,171,147,119,145,191,23,142, + 38,203,96,48,224,207,63,255,68,94,94,94,117,70,61,168,54,41,41,41,183,143,30,61,26,93,171,86,45,124,253,245,215,225,99,198,140,57,68,8, + 233,234,171,161,113,54,134,237,218,181,251,16,128,223,140,86,199,142,29,23,28,58,116,168,198,145,35,71,18,18,19,19,239,202,8,138,136,220,43,17, + 17,17,99,62,253,244,211,96,225,255,219,213,200,8,153,153,153,72,187,122,1,122,51,197,35,221,122,250,172,77,8,145,3,72,36,132,140,111,209,162, + 69,7,74,41,24,134,57,78,41,93,14,224,39,119,205,76,254,201,216,141,86,82,82,210,1,0,24,48,96,64,119,251,74,5,69,33,123,20,105,41, + 57,88,63,38,215,106,40,226,47,18,11,134,107,179,145,107,206,102,142,169,74,162,235,167,157,78,149,12,94,96,67,143,97,77,241,193,115,95,195,100, + 53,216,27,95,83,167,87,52,67,66,66,130,79,157,58,21,202,48,12,120,158,7,207,243,48,26,141,217,111,189,245,86,196,224,193,131,53,31,44,125, + 143,233,250,100,107,12,251,160,30,169,223,62,10,69,217,38,124,241,250,159,40,189,101,254,198,157,102,139,6,181,222,88,56,241,41,14,86,51,168,69, + 11,152,116,128,69,7,222,162,5,145,5,3,230,50,132,203,11,240,253,248,38,193,111,124,243,87,74,147,40,77,175,203,217,101,7,29,53,254,23,154, + 174,160,188,21,218,29,211,33,9,109,0,89,147,129,144,183,28,134,204,148,211,56,243,221,2,100,92,56,128,232,166,157,42,111,127,159,53,131,131,131, + 39,55,136,139,251,112,197,242,229,228,183,159,126,68,92,221,218,0,0,169,38,8,203,63,251,12,26,141,198,110,178,148,74,165,219,177,234,92,165,179, + 74,89,42,228,175,89,74,48,195,84,74,127,86,70,147,90,233,231,76,239,165,157,54,61,43,148,165,147,191,164,191,169,168,75,62,19,218,108,249,146, + 247,234,34,106,222,63,77,66,72,243,230,205,155,31,63,122,244,168,74,175,215,99,211,166,77,152,61,123,182,197,108,54,179,132,144,159,93,236,126,10, + 192,199,212,105,232,45,87,233,36,132,4,2,24,15,160,131,11,157,188,167,159,126,218,50,119,238,92,174,127,255,254,248,229,151,95,194,6,15,30,124, + 150,16,210,70,48,52,238,242,238,104,178,244,122,61,46,92,184,128,194,194,194,223,171,155,119,79,84,24,193,154,49,49,49,216,184,113,99,248,200,145, + 35,221,154,173,7,241,188,139,154,15,134,102,89,89,153,121,215,174,93,216,185,115,39,212,106,53,2,2,2,236,6,75,48,95,151,46,93,194,129,143, + 94,197,141,203,231,49,252,189,173,94,53,9,33,245,0,188,162,209,104,198,244,232,209,163,198,160,65,131,16,26,26,10,171,213,138,244,244,244,78,219, + 182,109,235,116,244,232,209,44,66,200,74,0,107,41,165,69,174,210,234,202,139,60,232,176,0,144,148,148,68,1,244,112,94,201,72,8,116,182,66,116, + 110,248,20,122,28,86,178,121,185,249,173,167,62,254,229,70,141,86,173,152,49,99,70,221,71,30,121,68,50,97,250,75,56,245,99,30,122,62,147,135, + 174,195,98,144,246,251,165,109,110,15,198,178,224,121,30,199,143,31,135,205,102,131,209,104,132,201,100,66,171,86,173,10,62,250,116,133,230,137,113,93, + 48,238,203,70,8,173,163,192,254,245,153,248,227,7,106,78,255,211,124,195,88,128,53,238,52,207,166,164,207,126,241,205,15,22,40,165,18,197,219,207, + 197,35,76,110,1,209,68,64,218,227,29,144,128,242,17,105,248,252,20,92,90,59,14,58,147,81,162,181,240,123,229,50,217,110,147,217,252,5,165,116, + 243,189,104,98,199,155,88,246,84,176,228,249,13,198,95,219,69,147,176,228,44,170,247,244,99,63,68,136,148,143,64,27,202,163,49,8,20,103,207,158, + 197,148,37,39,32,97,147,241,106,183,157,120,98,226,82,108,158,63,28,18,171,14,132,0,54,171,5,160,158,71,206,113,214,52,26,13,0,40,172,217, + 191,227,173,165,95,33,185,48,8,146,219,87,48,232,33,41,164,44,241,168,41,151,203,23,172,92,185,146,216,180,90,244,104,28,135,182,189,187,162,172, + 164,4,191,255,121,3,233,233,233,120,236,177,199,236,227,203,197,198,198,98,235,214,170,23,159,59,92,148,165,198,51,158,216,188,165,252,73,7,203,1, + 140,184,176,77,103,173,221,166,224,185,158,207,228,161,231,243,245,184,155,211,207,37,2,88,226,243,65,68,254,78,124,122,226,196,9,149,208,206,227,229, + 151,95,198,248,241,227,57,0,189,156,55,204,205,205,197,145,35,71,6,77,156,56,113,104,133,233,112,59,202,1,33,164,70,219,182,109,143,238,219,183, + 175,113,64,192,157,224,57,207,243,48,155,205,176,88,44,48,155,205,48,26,141,48,26,141,8,12,12,196,209,163,71,21,33,33,33,223,3,104,233,65, + 183,146,201,58,115,230,12,70,142,28,153,103,181,90,253,58,208,95,73,73,201,51,137,137,137,7,55,108,216,16,30,23,23,135,175,191,254,58,252,197, + 23,95,172,86,212,77,68,228,94,33,132,160,89,179,102,184,114,229,74,165,234,66,199,49,72,99,99,99,49,113,238,39,88,251,122,111,252,56,181,11, + 58,190,233,246,214,14,66,200,244,167,159,126,122,65,100,100,36,211,162,69,11,212,172,89,19,70,163,17,197,197,197,160,148,34,44,44,12,47,188,240, + 2,158,124,242,201,232,131,7,15,46,217,183,111,223,92,66,200,23,0,86,80,74,175,8,58,238,188,200,131,142,61,162,53,96,192,128,3,194,247,210, + 219,134,99,103,47,31,175,47,141,3,8,3,92,163,219,1,74,80,100,52,131,55,73,154,190,253,246,219,108,151,46,93,184,77,155,54,161,239,35,3, + 176,125,251,42,116,30,92,134,186,205,195,96,101,204,110,187,19,176,217,108,48,155,203,95,122,179,90,173,176,90,173,48,155,205,72,203,76,149,49,181, + 243,153,23,62,109,6,101,16,135,31,22,92,131,233,66,157,146,169,163,95,41,121,243,205,55,11,40,45,205,118,167,201,132,234,62,62,127,45,167,231, + 170,41,143,15,8,15,148,129,150,21,129,139,95,136,35,169,20,239,127,253,51,20,50,22,143,183,145,226,147,36,3,150,124,248,11,102,134,134,74,8, + 33,253,151,47,95,222,159,16,242,10,165,180,138,137,243,69,115,250,243,29,208,178,247,28,240,95,13,194,235,15,19,229,75,91,84,227,1,188,239,46, + 157,77,34,72,39,69,140,244,135,198,141,226,212,189,123,245,225,182,253,186,91,54,246,213,137,56,124,228,60,114,115,115,241,116,66,60,6,62,159,1, + 56,180,1,231,109,158,35,172,206,154,71,142,28,150,245,239,212,20,111,61,211,28,209,193,28,66,59,62,135,253,211,166,97,217,178,101,248,124,197,28, + 188,24,175,241,168,41,151,203,173,251,182,108,65,247,250,245,81,55,58,6,150,146,18,240,101,90,80,10,212,173,91,23,235,214,173,3,199,113,144,201, + 100,120,238,185,231,60,166,77,192,83,89,170,21,83,7,211,198,188,100,127,210,49,228,153,190,186,184,93,103,47,75,20,104,231,211,65,68,254,142,168, + 45,22,11,132,241,156,211,211,211,61,110,220,170,85,43,172,95,191,254,161,81,163,70,29,36,132,116,113,142,108,1,229,145,172,182,109,219,30,61,120, + 240,96,99,131,193,128,235,215,175,251,148,16,90,254,96,161,117,183,158,16,82,175,69,139,22,71,142,30,61,26,162,215,235,113,246,236,89,60,247,220, + 115,230,194,194,194,139,0,22,187,169,30,47,68,249,56,170,105,46,244,234,2,120,29,64,61,87,59,230,230,230,94,28,49,98,196,35,27,55,110,148, + 214,175,95,31,191,252,242,75,88,98,98,226,17,66,72,7,74,105,170,79,153,18,17,185,71,28,7,38,191,112,225,2,194,20,54,168,229,44,108,86, + 11,172,22,51,148,22,19,88,150,197,111,103,82,209,183,169,219,22,65,2,163,230,205,155,199,216,108,54,228,231,231,195,104,52,86,90,41,244,39,165, + 82,169,240,232,163,143,162,95,191,126,242,228,228,228,113,123,246,236,121,133,16,50,155,82,58,79,216,214,209,139,252,83,112,217,70,203,194,99,238,194, + 39,142,169,57,5,121,136,242,80,75,136,36,128,231,169,212,102,0,134,14,26,37,237,210,165,139,100,211,166,77,136,140,140,196,240,225,195,241,69,194, + 74,90,84,88,66,88,94,9,2,40,92,105,146,118,132,139,177,70,134,254,118,104,151,50,88,21,170,231,121,30,86,171,21,153,183,210,165,91,14,125, + 17,253,234,198,38,118,147,117,99,135,212,60,248,177,238,165,77,154,52,49,50,12,227,214,25,60,244,16,145,178,37,1,63,174,156,244,232,128,142,245, + 148,48,229,167,66,22,82,11,208,68,99,241,134,159,144,158,91,6,99,113,38,210,126,251,21,159,174,94,141,99,199,142,225,231,159,126,64,131,70,77, + 48,119,238,92,156,63,127,126,9,80,57,90,230,139,38,0,172,218,116,14,159,207,76,0,24,41,26,7,223,70,110,137,105,122,64,64,192,75,101,101, + 101,243,41,165,27,42,105,214,32,181,107,132,7,239,218,240,197,103,154,58,113,141,113,254,212,33,108,216,113,22,135,143,236,130,193,96,64,114,114,50, + 26,132,115,224,203,178,193,83,27,132,10,57,222,230,254,197,75,103,77,91,113,58,158,31,253,18,114,110,101,98,236,216,151,49,190,111,109,252,182,127, + 7,6,15,30,140,103,158,121,6,132,16,124,190,98,14,166,213,117,223,190,156,16,34,205,47,45,197,201,63,47,131,227,100,176,100,231,227,210,141,52, + 132,197,198,218,77,49,33,4,82,169,212,190,15,207,243,106,0,13,1,92,112,165,169,203,70,238,71,207,94,166,156,10,68,38,147,217,163,154,225,65, + 81,120,162,231,19,206,79,58,211,246,158,223,226,181,44,137,60,16,12,233,216,177,227,217,95,127,253,85,33,147,201,176,117,235,86,204,158,61,219,82, + 88,88,120,8,78,166,39,50,50,178,249,151,95,126,25,27,23,23,135,85,171,86,61,52,120,240,224,241,0,22,186,208,28,191,111,223,190,198,6,131, + 1,103,207,158,197,200,145,35,83,115,114,114,46,58,109,163,142,141,141,237,250,225,135,31,114,237,218,181,67,73,73,9,250,246,237,171,3,240,138,135, + 180,78,216,191,127,127,136,94,175,71,105,105,41,122,244,232,129,130,130,2,41,92,68,223,4,244,122,61,234,213,171,215,24,64,103,231,117,161,161,161, + 159,221,188,121,179,167,82,169,244,112,72,192,108,54,35,35,35,3,193,193,193,216,182,109,91,72,131,6,13,102,2,24,237,113,39,17,17,63,33,24, + 45,134,97,160,47,72,199,198,181,111,2,54,51,168,69,15,152,117,128,185,12,188,73,7,34,85,2,22,143,149,53,0,0,147,201,132,111,191,253,22, + 109,219,182,69,179,102,205,80,86,86,102,55,93,38,147,9,142,227,144,51,12,131,14,29,58,160,81,163,70,100,242,228,201,195,1,204,115,175,252,224, + 35,24,173,185,142,245,162,134,155,52,21,192,211,26,141,102,115,251,246,237,187,12,27,54,76,29,25,25,9,171,213,10,74,41,182,109,219,134,200,200, + 72,60,247,220,115,232,219,183,175,193,88,132,133,171,19,179,222,224,173,153,22,2,76,115,117,32,205,109,124,220,238,69,174,225,134,228,233,96,211,154, + 22,191,240,204,43,121,183,139,110,75,214,124,183,180,206,168,53,113,36,40,82,134,3,95,102,33,214,220,31,45,19,106,112,127,252,241,71,88,171,86, + 173,220,70,178,236,134,232,181,132,1,15,215,85,224,187,157,39,144,216,66,6,24,3,65,8,32,145,48,40,187,117,30,183,78,172,69,116,199,182,24, + 61,122,52,44,185,151,113,252,213,64,212,95,114,212,252,222,123,239,73,195,194,194,2,171,171,153,115,246,59,88,12,69,208,148,181,5,144,0,163,201, + 136,97,155,173,152,189,240,131,26,99,199,142,173,17,26,26,58,31,64,37,163,165,12,196,33,161,219,0,0,32,0,73,68,65,84,148,125,244,206,180, + 201,202,90,97,26,36,111,89,138,105,27,46,96,199,158,253,48,24,12,56,116,232,16,38,140,123,9,203,159,111,130,147,167,207,224,102,129,9,44,172, + 224,100,10,152,242,74,192,187,169,230,115,212,52,156,251,10,23,175,221,130,209,194,195,172,136,68,175,248,54,88,241,203,33,116,111,28,133,23,70,141, + 194,186,207,62,195,224,193,131,17,25,25,137,101,239,190,1,202,187,214,164,148,114,37,6,96,239,205,92,236,189,178,11,53,163,35,161,215,233,16,152, + 175,135,78,167,131,76,38,131,96,150,10,11,11,209,172,89,51,176,44,43,143,141,141,253,221,249,169,68,128,55,225,241,93,63,28,32,12,195,216,47, + 58,157,78,7,189,94,95,169,231,92,225,73,167,126,147,122,100,221,208,143,96,54,102,195,152,15,177,79,173,7,20,74,105,10,33,164,77,159,62,125, + 14,109,222,188,57,236,177,199,30,67,131,6,13,184,167,158,122,42,92,171,213,246,118,220,150,16,82,99,228,200,145,167,211,211,211,99,43,22,185,106, + 123,5,0,29,2,2,2,112,253,250,117,193,100,181,119,174,102,148,203,229,59,207,157,59,199,201,100,50,156,58,117,10,163,70,141,202,79,77,77,245, + 86,45,23,108,50,153,236,109,14,51,50,50,188,230,239,230,205,155,224,121,222,232,106,29,195,48,242,228,228,100,68,71,71,123,212,96,24,166,210,67, + 11,0,151,109,86,68,68,238,7,6,131,193,110,180,148,161,181,145,48,118,1,2,228,18,44,124,161,11,226,130,1,40,67,32,237,54,13,36,184,110, + 197,30,95,121,146,179,152,76,38,180,111,223,30,169,169,169,72,78,78,182,27,174,252,252,124,100,101,85,126,57,255,228,201,147,56,115,230,12,186,117, + 235,230,172,51,247,31,219,70,107,192,128,1,115,146,146,146,186,87,90,193,178,131,187,119,239,30,191,120,241,226,200,58,117,234,224,232,209,163,246,118, + 15,207,63,255,60,212,106,53,250,245,235,167,79,79,79,31,170,211,153,126,1,48,223,211,129,84,53,164,67,30,125,173,46,0,96,239,186,107,65,107, + 191,251,24,18,194,242,189,38,132,146,90,205,212,40,200,52,226,224,154,2,180,169,151,207,111,221,186,142,25,60,120,48,171,213,106,9,202,199,99,172, + 2,87,18,248,241,138,9,189,6,60,92,87,142,175,182,159,192,251,191,166,95,234,18,25,209,44,74,87,0,90,112,21,79,119,80,162,224,232,41,156, + 201,76,67,72,72,8,138,139,139,241,198,27,111,96,246,254,159,81,191,121,59,137,82,169,132,217,108,182,84,71,243,173,145,29,49,108,219,108,108,221, + 246,21,222,156,241,14,244,87,246,33,241,139,28,60,54,225,67,76,154,52,9,203,150,45,131,94,175,79,114,78,171,141,39,93,30,238,222,79,98,188, + 185,15,211,214,159,195,142,189,135,96,48,24,80,80,80,0,181,90,141,245,27,191,5,0,24,1,60,250,198,179,246,253,114,114,114,144,185,121,180,203, + 16,148,160,105,72,219,135,49,43,143,98,196,216,41,224,184,242,90,219,38,181,187,163,73,194,88,0,64,39,0,37,37,37,80,171,213,232,211,167,15, + 162,163,191,197,224,199,251,216,92,105,82,74,81,171,118,3,180,127,184,21,0,32,52,84,13,173,86,15,99,89,38,14,159,220,11,142,227,112,238,220, + 57,100,101,101,33,36,36,4,35,70,140,0,202,245,61,62,149,240,60,143,175,191,254,218,167,39,157,134,245,154,96,238,216,143,81,82,82,130,201,147, + 39,87,123,140,45,145,191,15,21,102,171,235,227,143,63,126,112,195,134,13,225,181,107,215,70,64,64,64,160,139,237,110,19,66,46,114,28,23,235,74, + 199,21,57,57,57,23,93,181,229,138,138,138,106,99,50,153,112,230,204,25,12,31,62,60,47,59,59,219,151,183,250,230,247,238,221,251,241,93,187,118, + 133,40,20,10,92,188,120,17,195,135,15,55,23,22,22,30,134,251,42,199,27,0,86,184,90,145,151,151,55,188,91,183,110,179,0,132,184,217,87,221, + 168,81,163,71,78,159,62,45,37,132,224,198,141,27,72,76,76,44,4,240,145,151,116,138,136,248,13,193,104,17,66,208,186,117,107,236,222,149,135,49, + 189,26,32,46,42,0,180,36,19,210,94,179,113,46,79,137,15,150,109,247,69,238,157,167,159,126,250,243,241,227,199,7,117,234,212,9,25,25,25,118, + 195,213,166,77,27,180,106,213,10,215,174,93,195,206,157,59,113,230,204,25,200,229,114,52,104,208,0,101,31,124,8,124,8,251,125,216,149,23,249,39, + 224,178,141,22,0,4,6,6,142,30,59,118,108,205,232,232,104,116,235,214,77,151,155,155,171,157,58,117,106,68,104,104,40,26,54,108,136,122,245,234, + 149,228,231,231,15,49,26,141,187,124,57,80,89,174,121,251,177,239,178,135,198,63,27,133,94,99,106,97,47,110,4,93,220,91,136,65,137,229,55,245, + 31,230,94,67,253,136,150,183,53,26,77,32,33,4,10,133,2,22,139,5,112,99,180,90,197,6,63,211,177,54,139,175,126,61,137,247,119,100,45,166, + 132,156,253,49,249,246,166,241,29,120,92,92,49,8,223,156,140,198,142,29,219,241,219,111,191,97,237,218,181,40,40,40,128,74,165,130,76,218,26,59, + 119,253,36,249,225,135,31,176,119,239,222,117,190,106,154,190,77,68,135,196,141,168,25,170,65,120,120,56,84,180,20,131,6,13,180,155,172,229,203,151, + 99,202,148,41,187,0,76,113,145,92,57,39,83,224,232,249,191,240,228,144,242,182,77,197,197,197,8,14,14,70,68,68,132,219,223,204,102,179,97,233, + 210,135,220,213,245,201,57,153,2,167,255,76,69,243,142,61,209,181,107,87,143,191,191,86,171,133,209,104,68,199,142,29,17,18,21,235,82,147,82,74, + 195,195,130,192,162,176,124,159,146,98,216,172,60,106,132,168,33,147,201,112,248,240,97,176,44,139,97,195,134,225,235,175,191,246,244,84,226,136,191,158, + 116,68,30,64,42,204,86,183,254,253,251,47,15,15,15,111,157,157,157,253,150,243,54,132,144,26,207,60,243,76,123,161,61,151,47,68,70,70,54,39, + 132,212,112,54,91,105,105,105,111,182,108,217,242,221,210,210,210,98,157,78,151,232,75,3,115,74,105,42,33,164,75,175,94,189,14,109,221,186,53,172, + 105,211,166,248,234,171,175,164,35,70,140,104,94,80,80,80,237,238,23,42,218,109,189,232,106,29,33,164,113,147,38,77,14,159,60,121,82,202,113,28, + 78,157,58,133,145,35,71,230,167,165,165,117,165,84,28,21,65,228,127,3,33,4,122,189,30,132,16,80,74,177,103,247,110,204,24,212,0,79,181,11, + 135,246,214,21,168,130,194,65,130,235,225,131,101,219,113,241,122,129,87,61,74,233,22,66,200,222,183,222,122,235,63,113,113,113,111,140,27,55,78,222, + 166,77,27,100,100,100,224,198,141,27,56,115,230,12,142,31,63,14,160,188,145,125,76,76,12,46,95,190,140,164,0,77,9,80,54,219,81,235,95,211, + 70,11,0,40,165,209,106,181,26,189,122,245,210,165,166,166,14,49,153,76,215,223,123,239,189,253,227,198,141,139,204,201,201,129,205,102,179,250,106,178, + 0,64,151,137,55,126,158,151,241,40,128,64,193,108,197,15,137,2,97,128,83,63,231,162,236,114,0,175,14,34,38,171,213,74,71,143,30,109,35,132, + 88,242,243,221,119,188,126,34,37,127,254,179,239,253,54,225,114,182,113,93,74,142,110,62,33,132,249,242,140,106,127,211,80,182,199,79,151,210,240,213, + 175,135,176,119,239,94,172,158,249,2,90,245,127,1,11,22,109,133,76,38,3,165,20,191,254,250,43,158,123,238,185,111,44,22,203,68,95,53,123,212, + 207,132,113,77,151,255,99,239,188,227,163,40,222,63,254,153,221,107,185,187,244,228,146,144,78,147,18,170,128,128,20,233,32,161,139,52,41,98,193,47, + 42,168,8,2,63,11,138,64,80,44,20,11,10,42,69,132,128,8,8,74,149,222,3,130,2,1,2,4,146,64,58,73,46,185,126,183,243,251,227,110, + 207,203,229,42,197,175,242,221,247,235,181,185,108,251,236,204,214,103,158,121,102,6,180,194,218,207,231,161,3,251,48,125,182,131,145,245,234,171,187,1, + 12,164,148,214,168,78,16,177,184,144,117,246,232,195,173,59,116,195,91,207,207,197,136,17,35,16,24,24,136,171,87,175,98,253,250,245,208,233,106,140, + 126,0,0,200,207,207,183,92,188,120,113,177,171,117,188,102,203,71,187,226,173,241,111,33,47,47,207,109,119,11,173,90,181,194,216,177,99,113,251,246, + 109,28,58,116,8,215,174,93,91,229,242,26,105,52,215,103,207,123,51,57,40,40,136,145,201,100,40,41,41,65,116,116,52,8,33,120,236,177,199,16, + 16,16,128,62,125,250,32,32,32,0,229,229,229,56,127,254,188,203,82,137,19,46,75,58,167,78,157,66,139,22,45,208,172,89,51,252,254,251,239,56, + 114,228,136,199,146,142,192,191,23,155,161,210,155,159,119,14,22,31,58,116,104,235,85,171,86,213,202,207,207,199,153,51,103,0,107,87,15,174,56,81, + 80,80,48,64,161,80,96,197,138,21,181,199,142,29,123,146,16,194,199,104,241,193,233,223,225,14,58,68,229,189,111,143,63,254,248,129,244,244,244,200, + 6,13,26,96,197,138,21,170,39,159,124,50,29,64,83,127,245,220,33,151,203,23,30,59,118,44,66,44,22,227,200,145,35,24,53,106,84,81,65,65, + 129,208,151,150,192,223,14,31,176,126,228,200,97,204,232,95,7,131,90,4,99,197,207,135,48,170,165,28,48,200,252,214,163,148,170,1,188,69,8,89, + 242,250,235,175,191,153,146,146,242,194,179,207,62,43,106,220,184,49,242,242,242,112,237,218,53,212,171,87,15,57,57,57,88,189,122,181,161,168,168,232, + 83,0,105,148,210,123,50,156,221,63,26,119,163,77,3,104,16,20,20,116,67,42,149,246,181,205,135,41,149,202,203,19,39,78,180,84,86,86,210,208, + 208,208,92,111,35,86,195,105,116,239,184,184,184,140,46,253,218,106,198,125,85,151,126,165,238,72,191,82,119,164,31,101,63,66,235,181,87,153,230,206, + 155,155,191,109,219,182,235,59,118,236,200,222,177,99,71,246,238,221,187,179,175,93,187,118,89,165,82,29,244,164,233,56,53,136,13,12,111,16,165,216, + 83,47,82,66,41,165,180,79,159,62,180,100,97,91,58,253,241,4,218,173,107,87,218,163,71,15,58,98,196,8,78,36,18,165,1,96,252,209,156,214, + 45,130,158,124,163,46,109,151,146,72,115,115,115,105,90,90,26,165,148,210,79,62,249,132,18,130,253,0,100,238,210,249,80,56,186,14,120,180,158,230, + 218,193,213,116,99,218,211,180,69,147,6,244,210,165,75,52,47,47,143,110,217,178,133,134,133,133,150,3,232,27,33,199,115,98,49,218,0,104,110,155, + 162,125,209,60,249,205,171,244,235,87,186,208,121,99,90,210,215,83,147,105,175,38,33,134,24,37,254,15,192,204,49,99,198,112,102,179,153,86,84,84, + 208,165,75,151,82,66,200,102,0,18,119,121,7,16,4,96,118,157,58,117,116,109,218,180,161,173,90,181,162,15,63,252,48,109,222,188,57,77,73,73, + 161,245,235,215,167,117,235,214,165,241,241,241,244,181,215,94,163,189,123,247,166,129,129,129,229,0,6,251,162,185,96,193,2,186,125,251,118,250,245,215, + 95,211,57,115,230,208,87,95,125,149,182,106,213,138,182,111,223,158,62,249,228,147,62,107,222,139,73,208,252,239,104,2,216,126,238,220,57,202,99,177, + 88,104,94,94,30,221,177,99,7,141,137,137,249,19,64,176,43,77,0,193,141,27,55,190,144,153,153,73,111,220,184,65,141,70,163,93,227,194,133,11, + 20,192,190,187,77,39,128,6,113,113,113,133,123,247,238,165,153,153,153,52,38,38,38,231,94,230,61,57,57,185,176,168,168,136,238,217,179,135,170,84, + 170,66,0,13,254,137,215,72,208,124,176,53,149,74,101,193,162,69,139,232,212,169,83,105,187,198,9,212,176,118,56,93,250,116,67,26,25,17,78,79, + 188,158,72,181,31,36,81,75,225,121,122,234,98,33,29,241,214,86,58,226,173,173,84,169,84,22,248,147,78,88,11,82,171,90,181,106,101,89,180,104, + 17,125,225,133,23,104,82,82,146,5,214,206,199,227,238,117,30,255,201,147,39,143,214,69,0,137,128,213,181,31,24,24,120,116,240,224,193,181,135,13, + 27,198,172,89,179,198,162,209,104,246,185,219,215,29,12,195,24,231,191,62,191,224,213,17,221,163,1,200,91,166,70,98,227,220,107,104,145,220,233,54, + 1,209,222,188,121,211,30,172,35,22,139,209,168,81,35,191,244,51,243,212,165,0,186,73,196,204,145,236,236,236,118,201,201,201,168,247,127,251,244,137, + 117,234,137,62,248,112,186,232,228,201,147,152,53,107,214,50,147,201,52,221,95,205,6,49,129,67,55,159,43,24,169,21,5,166,42,149,74,209,200,145, + 35,49,127,254,124,76,159,62,189,0,64,17,128,239,8,33,71,40,165,139,156,53,46,150,208,223,90,198,137,223,30,253,244,11,179,135,116,111,46,237, + 151,34,99,6,244,237,133,213,107,55,160,105,211,166,248,246,219,239,130,159,124,242,201,41,197,26,189,207,221,239,58,107,202,136,133,49,27,52,244,204, + 149,66,67,169,198,244,89,126,21,62,237,214,173,91,241,55,223,124,67,52,26,13,62,253,244,83,204,154,53,107,11,165,116,40,245,48,176,52,117,40, + 149,92,189,122,213,94,42,73,74,74,66,94,94,30,246,236,217,227,119,169,132,122,41,233,92,191,126,253,127,183,164,243,191,137,236,232,209,163,144,201, + 254,42,53,159,57,115,6,47,191,252,242,57,91,76,85,141,174,29,0,128,82,90,65,8,233,208,183,111,223,3,139,22,45,106,108,11,45,0,0,236, + 221,187,23,176,134,57,222,21,212,86,213,217,187,119,239,133,17,17,17,45,242,243,243,223,190,91,77,71,178,179,179,95,107,214,172,217,92,181,90,93, + 225,107,213,166,128,192,253,64,171,181,182,36,84,196,212,71,183,247,246,66,23,16,139,142,157,58,99,249,161,95,241,113,31,9,140,233,163,208,124,232, + 74,172,121,175,47,0,32,240,19,255,244,169,181,42,124,52,33,228,131,140,140,140,255,3,64,1,188,79,169,239,227,236,62,40,120,28,130,135,39,48, + 48,240,155,212,212,212,186,159,124,242,9,179,97,195,6,203,171,175,190,154,103,52,26,39,251,123,48,189,94,127,243,202,205,155,33,159,108,58,92,48, + 119,225,172,200,5,159,159,12,232,217,225,241,202,212,190,131,244,173,91,183,54,59,247,87,115,226,196,9,10,216,2,134,252,192,100,166,105,47,191,252, + 242,166,153,51,103,146,167,158,122,74,6,88,95,196,239,188,243,206,38,179,217,60,209,95,61,0,184,152,95,185,30,192,250,248,248,248,43,193,193,193, + 117,8,33,24,53,106,20,198,141,27,23,13,224,137,162,162,34,52,109,218,20,0,106,24,90,0,112,58,207,244,81,253,8,242,203,242,141,71,158,80, + 4,72,219,232,171,12,185,3,7,12,24,182,98,229,202,176,196,196,68,72,165,82,191,187,50,112,214,212,25,13,103,204,38,238,167,11,197,244,52,33, + 164,113,173,90,181,2,202,202,202,240,249,231,159,251,100,100,57,66,41,45,4,240,50,33,228,227,87,94,121,229,189,86,173,90,141,28,51,102,12,19, + 21,21,133,244,244,116,238,250,245,235,223,1,120,135,82,154,231,107,122,239,135,166,192,191,146,113,207,61,247,156,115,176,184,203,158,225,157,161,214,192, + 249,71,83,83,83,157,123,134,119,27,156,238,47,54,227,167,215,189,208,114,161,253,61,238,225,144,62,2,2,119,10,111,104,181,104,209,2,104,209,194, + 190,124,195,239,209,88,255,71,33,134,54,207,133,254,171,142,32,193,137,119,117,28,74,233,159,0,134,123,221,240,1,198,39,67,171,178,178,114,250,150, + 45,91,90,239,218,181,11,106,181,250,55,163,209,56,133,122,232,189,217,29,69,69,69,99,39,79,158,188,92,34,145,196,152,205,230,66,139,133,202,54, + 173,221,198,109,251,113,167,142,97,152,26,45,225,12,6,131,166,164,164,228,57,127,143,67,41,221,66,8,121,38,43,43,235,195,176,176,176,112,147,201, + 100,62,115,230,204,119,22,139,101,34,189,203,113,150,242,243,243,179,18,18,18,0,128,1,96,143,222,53,155,205,20,128,199,1,166,47,151,208,76,56, + 180,204,35,132,44,236,217,179,231,135,65,65,65,13,213,106,245,59,30,118,245,89,147,135,82,122,158,16,50,119,231,206,157,195,11,11,11,119,3,120, + 217,87,35,203,73,231,158,151,74,132,146,206,255,54,212,67,176,184,143,251,87,192,117,63,91,2,2,2,62,192,113,92,238,199,31,127,236,118,253,75, + 59,24,188,180,131,111,51,117,205,190,207,223,144,180,7,18,159,12,45,91,9,207,115,167,48,190,233,104,1,140,184,91,29,31,143,245,45,128,111,239, + 181,174,217,108,238,115,175,180,168,117,232,129,254,247,74,207,133,254,255,1,248,191,123,164,117,207,75,37,66,73,71,64,64,64,224,239,71,163,209,180, + 254,111,167,225,127,9,198,251,38,2,2,2,2,2,2,2,2,2,119,2,1,224,178,83,72,234,199,8,226,132,16,191,59,150,244,166,47,104,10,154, + 130,166,160,41,104,10,154,130,230,131,167,233,77,219,31,251,227,95,193,253,108,210,136,127,105,211,87,65,83,208,20,52,255,125,154,176,22,28,201,63, + 61,157,255,11,154,252,181,128,181,214,132,241,245,218,252,55,243,238,79,250,30,132,243,249,79,212,124,80,39,159,98,180,238,53,196,218,188,144,1,192, + 81,219,213,17,248,103,97,187,70,124,51,80,42,92,39,129,127,34,132,16,149,68,34,121,85,34,145,60,22,16,16,240,16,165,148,11,12,12,60,111, + 52,26,247,26,141,198,143,169,181,107,17,129,191,17,135,119,7,139,191,62,182,22,0,22,91,79,228,255,168,119,9,33,196,110,20,16,66,56,252,195, + 190,75,247,227,124,254,91,52,31,20,220,26,90,132,144,22,74,165,242,29,169,84,90,135,16,98,169,170,170,58,171,215,235,151,82,74,143,220,205,1, + 9,33,203,163,163,163,199,149,148,148,112,12,195,32,32,32,192,62,138,184,88,44,214,150,149,149,213,24,11,205,23,162,154,13,126,93,68,200,36,11, + 181,44,45,56,187,105,142,183,229,2,238,33,132,16,137,68,50,36,60,60,60,180,168,168,136,242,131,223,178,44,203,15,132,107,46,43,43,251,206,87, + 189,240,240,240,227,225,225,225,161,252,254,132,16,148,148,148,148,21,20,20,60,2,0,114,185,252,144,82,169,140,16,137,68,96,89,22,44,203,66,163, + 209,148,20,23,23,119,184,111,153,20,184,175,172,95,191,158,237,29,247,76,61,17,213,54,103,24,26,194,113,164,220,76,228,103,182,231,45,207,242,101, + 255,161,67,135,186,28,143,211,17,66,200,160,200,200,200,165,91,182,108,9,105,216,176,161,168,180,180,148,36,36,36,160,188,188,188,195,254,253,251,31, + 25,55,110,220,120,66,200,56,74,233,111,119,159,163,7,27,153,76,246,105,116,116,244,179,149,149,149,26,66,8,37,132,128,239,110,199,249,215,98,177, + 228,22,23,23,187,12,166,118,248,216,138,165,82,233,199,49,49,49,99,53,26,141,198,166,71,9,33,168,85,171,86,53,61,0,48,153,76,185,69,69, + 69,62,5,104,71,69,69,45,149,203,229,79,105,52,154,42,155,97,100,199,233,99,126,165,168,168,200,237,216,100,124,90,165,82,233,194,232,232,232,167, + 109,121,7,33,132,170,84,42,191,243,238,136,72,36,202,96,24,166,5,231,48,174,148,115,247,69,14,104,77,38,147,203,239,158,243,249,140,142,142,30, + 235,152,78,66,8,84,42,213,93,93,163,127,170,230,131,132,91,67,171,101,203,150,63,28,59,118,236,33,126,160,98,157,78,215,108,241,226,197,99,8, + 33,105,148,210,25,119,114,48,66,200,138,78,157,58,141,216,191,127,63,179,105,211,38,166,77,155,54,32,132,192,98,177,192,98,177,160,105,211,166,242, + 59,204,7,66,148,138,233,167,118,126,21,208,162,199,115,147,0,204,241,182,220,67,26,91,0,120,19,64,29,63,147,80,4,96,6,165,244,148,171,149, + 225,225,225,135,25,134,241,75,147,227,184,171,165,165,165,143,186,91,127,63,52,109,70,214,19,157,58,117,10,217,181,107,23,201,201,201,33,114,185,28, + 28,199,193,98,177,192,100,50,33,37,37,197,47,79,104,104,104,104,240,244,233,211,235,61,254,248,227,216,176,97,3,198,140,25,131,142,29,59,94,226, + 215,43,149,202,136,115,231,206,61,20,30,30,14,141,70,131,242,242,114,244,236,217,211,159,67,220,19,66,67,67,255,12,10,10,10,99,89,214,254,70, + 116,85,8,227,151,89,44,22,170,213,106,175,150,150,150,186,124,153,183,123,56,225,125,194,16,123,95,81,212,108,41,61,250,123,222,155,119,155,206,136, + 136,136,83,50,153,44,218,219,118,142,47,118,157,78,87,80,82,82,242,176,151,237,147,1,244,103,89,182,190,72,36,106,8,32,217,108,54,71,3,128, + 68,34,41,96,89,54,219,100,50,101,26,12,134,203,0,182,80,15,99,243,245,142,123,166,30,49,107,134,170,245,92,95,69,221,180,6,154,43,211,47, + 42,100,154,109,189,227,158,89,239,171,177,229,37,173,67,158,120,226,137,101,171,87,175,14,6,128,202,202,74,122,225,194,5,4,6,6,114,18,137,132, + 164,166,166,74,46,93,186,84,171,107,215,174,233,132,144,65,148,210,131,126,104,55,0,176,14,214,1,165,95,160,214,214,177,119,147,214,56,0,3,0, + 52,144,72,36,181,141,70,99,49,128,12,0,187,40,165,151,8,33,73,42,149,234,123,142,227,244,37,37,37,207,80,107,247,23,213,104,223,58,241,36, + 195,48,241,176,221,142,28,181,228,30,57,153,115,79,62,80,44,203,46,28,60,120,240,211,235,215,175,87,100,100,100,40,26,55,110,108,47,16,113,28, + 87,227,25,168,93,219,227,216,223,4,128,136,97,152,79,135,14,29,58,114,213,170,85,138,235,215,175,43,98,99,99,237,154,142,70,28,79,108,172,111, + 141,218,35,34,34,150,63,254,248,227,163,87,174,92,41,222,188,121,179,60,50,50,18,17,17,17,144,72,36,53,182,237,208,161,131,183,193,51,25,134, + 97,22,14,28,56,112,244,218,181,107,21,199,142,29,83,52,109,218,20,44,203,222,105,222,1,0,132,144,223,235,214,173,219,40,43,43,139,201,200,200, + 96,188,157,207,160,160,32,79,223,61,251,249,28,48,96,192,200,117,235,214,41,78,157,58,165,104,216,176,161,93,211,161,218,206,215,116,254,91,52,31, + 24,60,125,48,165,70,163,17,251,246,237,3,195,48,8,15,15,199,184,113,227,176,115,231,206,233,132,144,159,253,245,108,17,66,150,219,140,44,49,0, + 252,248,212,32,92,21,3,47,23,26,32,145,72,112,229,202,21,176,44,235,183,107,49,32,32,96,44,165,244,173,136,168,68,153,86,107,130,238,230,73, + 133,92,46,207,230,31,228,208,200,56,235,242,91,39,21,10,133,226,10,203,178,179,213,106,245,10,119,122,245,235,215,95,253,231,159,127,54,114,245,224, + 122,66,163,209,32,49,49,49,9,64,125,87,235,197,98,113,252,245,235,215,163,248,241,22,249,7,206,249,151,255,223,104,52,34,37,37,197,99,191,87, + 158,52,205,102,51,2,2,2,192,48,214,134,165,6,131,1,149,149,149,30,53,121,79,22,111,100,1,192,154,53,107,16,19,19,131,168,168,40,40,149, + 74,200,229,114,187,166,175,176,44,139,222,189,123,99,214,172,89,72,75,75,195,212,169,83,171,189,104,197,98,49,194,195,195,241,235,175,191,34,56,56, + 24,73,73,73,224,13,252,123,129,50,153,52,103,25,50,87,85,71,222,246,214,101,205,84,205,117,186,220,213,118,114,185,92,117,229,202,21,21,203,178, + 53,174,135,243,53,250,51,243,44,210,22,189,139,11,249,71,163,21,73,228,25,87,154,132,33,225,71,78,222,176,151,84,251,116,107,36,106,215,42,233, + 115,235,28,7,134,1,56,206,250,233,36,4,212,108,226,110,159,56,147,231,181,39,114,150,101,99,179,179,179,163,124,61,71,102,179,25,177,177,177,174, + 7,194,228,211,74,72,223,38,77,154,252,56,113,226,68,73,253,250,245,137,68,34,129,72,36,130,72,100,125,69,112,28,151,68,41,77,226,56,174,75, + 65,65,1,93,188,120,241,7,132,144,193,148,210,109,174,244,68,84,219,92,173,231,250,30,56,141,71,134,246,120,3,191,166,79,127,164,83,75,14,65, + 10,109,22,128,59,50,180,218,183,74,60,39,11,144,133,27,77,102,70,165,138,136,88,185,114,37,99,50,153,168,78,167,163,148,82,180,105,211,134,99, + 24,134,28,58,116,136,153,55,111,30,54,109,218,68,211,211,211,131,219,183,111,191,146,16,146,66,41,213,120,59,6,33,164,65,147,38,77,78,31,59, + 118,44,192,104,52,162,93,187,118,71,9,33,173,232,29,244,224,78,8,9,3,240,209,140,25,51,70,79,156,56,145,13,13,13,133,84,42,133,90,173, + 70,86,86,214,216,239,190,251,142,18,66,62,3,16,148,157,157,221,254,248,241,227,232,218,181,235,100,0,175,58,107,49,12,27,127,232,248,53,251,8, + 244,3,122,55,147,60,218,38,169,0,0,106,150,5,40,56,11,151,123,236,116,174,87,67,140,16,242,193,144,33,67,70,173,95,191,62,16,0,190,248, + 226,11,12,25,50,4,225,225,225,80,40,20,144,72,36,16,139,197,213,126,61,104,241,213,70,31,12,31,62,124,232,170,85,171,130,0,96,213,170,85, + 24,52,104,16,34,34,34,16,20,20,4,169,84,234,118,92,86,79,68,68,68,44,239,248,200,35,227,87,174,92,9,0,248,191,87,94,193,227,109,219, + 34,80,33,135,66,46,5,127,46,164,172,24,125,94,158,228,45,223,12,128,5,67,134,12,25,182,118,237,218,32,0,200,200,200,64,97,97,33,162,163, + 163,33,151,203,33,149,74,237,121,38,132,64,46,247,238,7,32,132,28,175,83,167,78,131,172,172,44,9,112,239,206,231,224,193,131,135,174,91,183,46, + 8,0,190,251,238,59,244,232,209,3,97,97,97,246,243,41,145,72,30,40,205,7,13,183,134,214,233,211,167,159,80,42,149,243,0,168,164,82,105,232, + 200,145,35,19,198,143,31,143,225,195,135,99,207,158,61,19,0,248,108,104,17,66,72,116,116,244,184,253,251,247,219,191,208,6,167,151,131,76,38,243, + 251,3,110,227,173,147,19,38,196,164,101,85,226,232,241,76,4,128,33,89,31,127,172,210,93,186,4,139,193,128,247,174,168,113,244,120,38,100,102,142, + 156,157,242,114,76,139,79,62,123,11,128,91,67,139,16,34,211,235,245,184,116,233,146,187,77,92,146,147,147,3,142,227,220,14,1,66,8,129,68,34, + 193,31,127,252,225,210,75,226,76,82,82,146,39,87,179,87,205,237,219,183,99,202,148,41,200,204,204,4,63,84,137,15,154,36,60,60,60,148,55,178, + 0,171,17,36,151,203,33,22,139,137,72,36,34,124,213,30,33,132,248,90,231,206,48,12,86,175,94,141,249,243,231,99,218,180,105,88,186,116,41,154, + 55,111,110,95,47,18,137,80,81,81,129,176,176,48,132,133,133,85,51,16,239,134,176,58,36,216,108,193,146,102,61,35,70,61,254,114,18,137,76,12, + 192,91,157,143,191,1,235,88,91,53,96,89,150,48,12,131,140,140,12,151,122,132,16,104,180,85,88,180,252,67,20,5,100,160,207,27,137,72,77,108, + 201,184,211,116,62,59,31,127,178,72,1,142,194,26,4,194,1,28,64,65,193,81,14,5,121,89,120,103,214,135,62,127,125,196,98,49,46,95,190,108, + 79,23,239,25,230,13,35,71,175,65,114,114,178,215,123,73,34,145,188,251,211,79,63,73,87,175,94,141,181,107,215,130,16,2,153,76,6,165,82,137, + 208,208,80,68,68,68,216,167,248,248,120,242,205,55,223,72,154,55,111,254,46,0,151,134,22,195,208,16,69,221,180,6,67,123,188,1,0,24,250,6, + 197,237,75,115,90,48,101,111,135,248,154,71,103,228,242,128,200,221,7,46,170,166,77,155,134,5,159,14,6,195,48,80,171,213,132,82,74,0,10,150, + 21,225,216,177,99,248,250,235,175,241,252,243,207,227,242,229,203,76,157,58,117,44,147,38,77,10,95,176,96,193,243,0,60,14,34,66,8,105,208,172, + 89,179,131,135,15,31,14,208,104,52,224,56,14,219,182,109,83,244,232,209,227,0,33,164,147,191,198,86,114,114,242,230,195,135,15,119,80,169,84,40, + 47,47,71,69,69,5,76,38,19,88,150,69,82,82,18,62,248,224,3,50,112,224,192,151,198,142,29,171,147,203,229,176,117,132,156,236,74,203,249,81, + 91,188,228,243,80,74,173,247,15,229,104,181,223,210,194,108,188,242,154,111,253,31,39,36,36,188,176,97,195,134,64,126,62,54,54,214,254,49,116,54, + 10,248,201,195,189,68,0,48,137,137,137,227,191,255,254,123,187,102,100,100,36,68,34,17,196,98,49,68,34,17,24,134,193,129,3,7,48,239,221,25, + 8,83,197,98,209,146,47,188,166,51,42,42,106,105,223,190,125,159,90,177,226,175,87,119,179,186,117,145,218,161,45,162,34,131,17,25,22,100,61,79, + 28,193,153,204,107,30,181,108,134,1,147,144,144,240,76,122,122,186,61,157,44,203,218,243,10,88,11,207,188,23,223,96,48,160,117,235,214,94,159,35, + 177,88,220,234,202,149,43,246,151,151,47,231,211,83,82,109,233,28,207,27,194,0,16,30,30,94,77,79,44,22,35,253,215,149,206,121,188,107,77,127, + 175,187,179,230,181,107,215,48,119,238,220,106,215,157,247,110,197,197,197,97,241,226,197,94,207,167,19,109,0,168,28,230,13,0,164,14,191,69,176,142, + 48,225,188,29,191,92,12,160,133,109,157,5,128,26,64,168,11,61,119,58,197,176,118,174,173,114,218,222,249,56,53,16,1,192,214,173,91,249,167,184, + 75,106,106,234,62,219,255,101,50,153,44,71,161,80,196,0,80,111,219,182,13,207,63,255,60,108,174,213,1,17,17,17,53,220,233,26,141,230,180,94, + 175,127,131,82,106,43,105,217,155,104,50,165,165,165,220,206,157,59,153,85,131,123,193,64,129,150,111,205,67,239,126,253,176,61,78,10,22,192,35,23, + 138,161,80,40,68,98,177,216,196,95,12,254,194,56,198,110,81,167,102,159,132,16,54,64,36,66,187,131,91,49,229,224,86,60,162,148,162,36,125,45, + 212,135,246,131,97,8,58,43,35,49,117,212,78,60,26,34,131,84,175,1,195,48,53,140,75,71,205,75,151,46,61,25,28,28,60,207,233,4,251,194, + 85,0,239,187,210,180,165,19,148,82,52,111,222,28,132,16,187,183,192,241,5,228,56,157,62,125,186,198,1,60,105,2,128,82,169,132,82,169,196,158, + 61,123,236,219,116,239,222,29,58,157,14,225,225,225,62,105,22,21,21,209,155,55,111,146,85,171,86,65,44,22,35,34,34,2,10,133,130,172,92,185, + 114,134,68,34,137,215,233,116,156,193,96,128,84,42,93,196,123,183,68,34,81,85,121,121,121,132,59,77,150,101,49,113,226,68,188,254,250,235,88,186, + 116,41,38,76,152,0,231,245,58,157,14,145,145,145,118,99,203,249,1,116,214,244,70,72,2,169,35,13,19,255,250,220,199,13,235,213,109,29,140,178, + 124,3,190,157,124,129,170,111,25,215,120,74,103,121,121,57,58,118,236,88,227,26,137,68,34,48,34,128,11,173,192,216,133,245,209,167,117,3,94,19, + 110,53,57,138,63,79,109,199,185,179,187,192,89,56,88,56,10,74,45,224,204,64,198,206,163,15,221,186,122,51,142,130,218,199,23,144,149,87,154,187, + 68,202,26,2,216,180,183,88,255,169,183,188,139,68,34,232,116,58,252,244,211,79,184,112,225,2,182,109,219,6,173,86,139,200,200,72,132,134,134,162, + 109,219,182,24,59,118,44,146,147,107,126,187,157,53,41,165,43,114,114,114,90,118,236,216,145,148,149,149,161,172,172,12,90,173,22,22,139,5,102,179, + 25,34,145,8,1,1,1,144,203,229,136,142,142,134,78,167,163,122,189,126,133,59,77,142,35,229,154,43,211,47,254,154,62,253,145,161,111,80,172,159, + 79,80,47,81,166,217,125,50,104,252,166,131,83,123,2,160,156,237,173,195,0,212,100,225,138,95,159,241,209,75,158,210,105,245,38,114,56,124,248,16, + 222,122,235,45,232,245,122,155,65,9,48,140,8,39,78,156,192,23,95,124,129,113,227,198,34,49,49,1,102,179,133,84,84,84,88,58,118,236,40,253, + 242,203,47,187,195,102,104,185,58,159,14,70,86,132,86,171,133,90,109,141,161,151,74,165,88,191,126,125,100,255,254,253,247,19,66,58,187,51,182,92, + 105,6,5,5,37,177,44,139,63,254,248,3,95,126,249,37,118,239,222,141,130,130,130,219,177,177,177,33,93,186,116,97,94,121,229,21,180,108,217,18, + 223,126,251,173,203,225,183,156,243,158,125,233,0,178,47,31,4,199,89,189,171,214,201,245,255,238,74,64,206,233,172,170,170,210,157,62,125,58,112,217, + 178,101,136,138,138,66,237,218,181,161,80,40,16,16,16,80,237,35,235,248,225,245,246,108,106,181,90,93,118,118,118,224,15,63,252,128,136,136,8,36, + 39,39,67,161,80,64,42,149,66,36,18,129,16,130,85,171,86,97,205,172,81,200,206,60,139,65,169,53,195,4,156,53,21,10,197,83,43,86,172,168, + 230,2,137,14,11,131,72,204,128,21,19,132,117,31,12,0,184,189,103,163,219,222,33,157,52,137,90,173,214,29,59,118,44,240,228,201,147,224,56,14, + 201,201,201,208,104,52,8,14,14,182,231,127,231,206,157,24,56,112,32,86,175,94,141,246,237,219,123,205,59,199,113,220,233,211,167,25,127,206,167,183, + 188,87,85,85,233,50,50,50,2,191,255,254,123,132,133,133,33,62,62,222,238,113,227,141,163,249,159,207,170,166,17,64,106,221,181,166,191,215,221,89, + 115,240,224,193,168,87,175,30,130,131,131,161,84,42,237,218,158,52,221,216,34,60,42,66,200,207,14,199,239,103,171,93,179,255,186,219,206,246,111,231, + 25,51,102,180,78,75,75,155,219,190,125,251,31,14,31,62,188,198,157,158,59,157,25,51,102,52,73,75,75,155,235,184,189,139,227,212,192,110,116,164, + 166,166,18,91,38,9,33,164,118,171,86,173,78,236,217,179,39,60,40,40,200,190,241,141,27,55,80,86,86,134,160,160,160,224,143,63,254,56,184,75, + 151,46,136,142,142,182,223,44,151,46,93,74,105,208,160,65,5,0,103,191,45,199,48,12,30,125,244,81,252,105,187,175,122,247,235,135,248,248,120,240, + 65,30,1,1,1,120,233,165,151,200,148,41,83,68,188,55,131,82,10,173,86,139,90,181,106,185,245,217,242,23,170,137,182,24,27,187,118,1,67,0, + 77,198,81,72,164,4,12,75,240,48,45,193,47,221,30,3,3,10,195,233,195,0,220,190,131,248,99,158,2,112,95,2,132,40,165,200,202,202,242,201, + 163,101,195,171,185,239,78,147,247,104,28,62,124,24,22,75,181,184,98,79,154,148,97,24,40,149,74,196,196,196,64,46,151,67,161,80,144,31,126,248, + 225,205,218,181,107,215,154,50,101,10,83,81,81,193,60,250,232,163,24,50,100,136,136,175,226,108,210,164,137,231,76,16,130,125,251,246,225,203,47,191, + 196,132,9,19,92,122,180,248,96,201,224,224,59,106,11,81,141,160,68,210,33,60,41,224,231,231,62,107,28,18,145,24,128,189,223,229,97,231,103,185, + 151,212,5,230,143,76,21,216,234,113,223,160,32,156,58,245,87,152,29,127,127,157,61,127,26,115,151,205,209,140,65,0,0,32,0,73,68,65,84,79, + 193,200,5,41,224,53,175,108,149,226,82,134,225,182,254,54,150,186,210,226,0,24,205,38,104,42,181,246,170,71,139,197,130,179,123,127,127,232,234,239, + 151,154,252,252,195,106,49,0,232,246,110,116,220,173,214,144,207,215,53,232,18,46,57,182,183,212,120,204,149,46,159,38,145,72,132,113,227,198,33,45, + 45,13,79,61,245,20,182,109,219,134,183,223,126,27,207,62,251,172,125,59,231,224,83,119,152,76,166,175,198,140,25,51,97,253,250,245,13,223,120,227, + 13,134,247,104,41,20,10,16,66,160,211,233,160,215,235,161,213,106,145,153,153,201,61,247,220,115,23,13,6,195,87,238,244,204,68,126,70,33,211,108, + 171,27,207,212,171,186,246,97,80,199,182,201,90,34,111,85,62,184,65,15,218,119,92,114,24,40,5,229,0,142,2,122,125,21,94,122,105,178,87,111, + 30,103,177,208,43,23,246,34,243,194,121,4,4,4,160,180,180,20,252,227,44,18,137,240,254,236,217,120,126,194,4,36,38,38,0,212,234,73,253,225, + 135,31,216,22,45,90,192,96,48,52,115,167,235,104,100,233,116,58,156,62,125,26,93,187,118,69,78,78,14,206,159,63,143,135,30,122,8,43,87,174, + 84,141,28,57,210,163,177,229,204,217,179,103,103,180,104,209,98,97,101,101,101,105,101,101,229,66,0,107,40,165,101,132,144,198,89,89,89,139,183,111, + 223,222,233,157,119,222,97,109,158,44,30,215,102,2,165,48,153,204,208,106,245,30,13,44,126,158,82,111,225,73,246,188,211,134,13,27,162,127,255,254, + 16,139,197,80,40,20,8,12,12,172,86,109,230,108,32,120,128,2,224,8,33,136,141,141,69,223,190,125,33,145,72,170,105,242,247,97,223,190,125,49, + 233,189,183,240,213,164,110,248,114,204,67,232,241,126,129,199,116,106,52,154,202,223,126,251,77,254,250,132,9,104,81,191,62,34,131,131,145,24,173,130, + 92,38,133,196,49,77,196,251,187,149,82,74,9,33,28,203,178,104,218,180,41,10,10,10,112,237,218,53,92,187,118,13,12,195,160,99,199,142,224,171, + 206,47,95,190,140,247,222,123,15,122,189,222,231,112,6,111,231,115,249,242,229,248,246,219,111,193,48,12,102,207,174,49,122,90,181,164,194,118,62,27, + 53,106,132,199,30,123,172,218,249,148,203,229,118,163,8,0,114,142,85,218,175,87,92,92,156,95,154,59,142,223,192,178,157,191,65,111,224,80,161,49, + 85,219,161,86,100,48,14,126,255,134,95,233,252,234,171,175,80,94,94,14,150,101,171,121,179,120,39,74,66,66,2,190,252,242,75,151,98,142,182,136, + 203,131,121,48,104,220,108,199,223,92,178,180,180,180,185,206,251,123,211,115,92,239,180,191,193,201,56,115,123,19,187,172,58,148,201,100,51,127,251,237, + 183,240,242,242,114,92,190,124,25,12,195,216,235,212,69,34,17,140,70,35,174,92,185,130,176,176,48,20,22,22,66,38,147,129,101,89,24,12,6,0, + 168,17,112,75,41,165,114,185,28,148,82,76,42,178,134,8,253,26,43,65,54,128,212,34,123,96,49,44,22,11,54,108,216,128,192,192,64,4,5,5, + 217,127,189,85,35,157,189,150,133,2,49,1,115,120,31,8,3,48,4,32,44,192,48,20,12,177,45,39,128,50,34,204,163,142,51,62,4,198,123,12, + 128,119,210,178,123,159,92,121,178,156,255,223,187,119,175,47,233,3,165,20,245,234,213,67,96,96,160,125,218,190,125,187,125,155,238,221,187,195,98,177, + 32,34,34,194,171,38,165,148,74,36,18,112,28,135,168,168,40,136,197,98,178,114,229,202,25,117,234,212,169,245,218,107,175,49,44,203,226,212,169,83, + 56,119,238,28,146,147,147,125,142,217,42,43,43,187,53,99,198,12,203,140,25,214,54,20,77,154,52,65,89,89,89,33,191,190,162,162,162,164,87,175, + 94,213,226,54,138,139,139,75,188,158,0,23,4,38,146,70,177,141,20,219,95,88,218,68,33,15,17,99,195,156,43,56,184,50,255,27,125,1,150,2, + 184,68,61,12,90,76,8,65,69,69,5,58,117,234,4,190,5,164,88,44,6,17,81,4,212,175,192,11,95,55,6,175,121,105,11,240,237,103,203,48, + 108,216,48,29,165,149,249,174,244,56,142,131,217,104,134,70,167,67,165,90,99,247,14,21,222,44,8,125,99,202,171,226,5,47,61,13,0,152,242,233, + 18,168,151,254,245,34,219,248,250,200,168,193,11,126,152,14,96,160,167,188,86,86,86,66,167,211,161,110,221,186,56,124,248,48,212,106,53,250,244,233, + 3,66,136,189,133,168,175,80,74,13,132,144,14,253,250,245,59,241,201,39,159,212,109,220,184,49,169,170,170,130,70,163,129,227,239,217,179,103,233,154, + 53,107,174,106,52,154,71,41,165,6,119,122,219,243,150,103,245,142,123,102,253,238,83,108,191,168,122,23,131,243,110,215,53,151,228,201,170,42,180,153, + 58,11,61,7,106,1,44,224,64,205,28,44,182,106,47,111,112,148,194,104,50,131,82,14,217,217,217,200,204,188,128,71,30,121,4,183,111,223,134,132, + 82,76,191,114,5,77,2,100,168,148,72,65,109,85,137,79,63,253,180,89,171,213,50,132,184,255,2,215,170,85,235,115,222,200,202,200,200,192,232,209, + 163,13,197,197,197,82,0,120,234,169,167,12,171,86,173,146,214,171,87,15,43,87,174,84,13,25,50,36,29,64,83,31,207,233,106,0,171,157,151,71, + 68,68,44,186,113,227,70,23,199,152,31,179,217,62,4,171,194,165,22,7,152,76,38,104,181,122,148,151,171,97,48,154,108,239,76,14,22,139,217,246, + 203,193,108,123,143,74,37,162,160,86,205,106,85,82,74,193,16,82,118,242,236,173,4,87,186,188,225,195,7,148,243,6,129,175,222,44,23,88,136,173, + 149,89,68,68,4,196,98,49,86,175,94,141,51,135,182,67,202,82,88,204,38,152,77,70,88,76,6,136,89,22,187,79,93,67,207,70,65,222,52,65, + 8,161,145,145,145,72,109,223,30,253,218,183,183,54,111,19,137,16,40,147,65,33,9,176,122,178,0,80,11,227,165,40,109,135,227,211,25,29,29,141, + 147,39,79,98,210,164,73,152,63,127,62,228,114,185,189,245,243,133,11,23,176,110,221,58,244,236,217,211,175,106,46,199,243,249,213,87,95,97,243,230, + 205,120,249,229,151,49,102,204,24,172,94,189,26,151,47,95,134,197,98,177,14,232,236,25,11,127,239,242,213,123,82,169,180,154,247,137,55,0,253,189, + 70,142,154,79,15,170,133,205,135,214,128,128,224,232,247,175,86,243,60,125,177,246,128,223,154,239,188,243,78,181,116,250,226,205,242,21,39,175,147,47, + 219,241,177,32,218,233,211,167,207,36,132,252,60,125,250,244,153,243,230,205,251,211,23,61,55,235,249,2,123,170,195,50,215,49,39,112,99,104,41,20, + 138,71,2,3,3,113,249,242,101,244,233,211,199,80,82,82,114,81,44,22,63,84,92,92,44,43,44,44,132,70,163,169,156,61,123,246,53,0,242,118, + 237,218,213,219,189,123,55,114,114,114,176,106,213,42,0,216,232,74,147,97,24,112,28,103,191,41,156,139,175,44,203,226,200,145,35,56,114,164,122,232, + 215,178,101,203,188,126,48,134,252,180,5,167,78,157,178,127,28,121,43,218,241,151,101,89,4,4,4,0,9,46,223,55,46,241,22,24,239,45,0,222, + 21,190,198,126,57,122,35,188,145,151,151,231,118,255,35,71,142,216,61,90,190,104,178,44,11,139,197,2,185,92,78,36,18,9,145,72,36,241,188,145, + 197,178,172,253,129,145,201,100,144,201,100,213,74,169,30,210,215,213,211,250,194,194,66,191,186,113,32,173,136,88,81,130,161,4,40,168,186,129,189,124, + 172,152,178,54,137,10,137,146,238,120,102,81,99,187,145,117,104,101,254,23,250,2,124,4,224,154,167,152,50,210,138,136,99,16,41,61,123,225,52,50, + 50,50,236,121,42,45,43,193,115,51,159,192,200,197,13,237,70,86,92,85,55,188,245,213,243,104,214,172,25,88,150,245,216,13,129,209,100,130,86,99, + 128,186,82,139,119,231,217,134,222,124,23,199,0,28,235,240,194,36,76,236,221,179,27,252,172,166,230,211,22,21,21,133,125,251,246,129,16,130,244,244, + 116,132,132,132,160,119,239,222,8,14,14,198,244,233,211,241,228,147,79,250,245,50,163,148,150,19,66,58,188,242,202,43,39,62,252,240,195,196,132,132, + 4,24,12,6,24,141,70,24,12,6,100,101,101,97,205,154,53,57,26,141,166,3,165,180,220,155,222,246,188,229,89,63,238,159,114,179,199,240,33,218, + 11,5,191,34,63,191,4,102,115,30,56,139,25,70,179,197,234,225,51,155,97,54,91,32,145,176,193,31,206,121,117,39,7,10,134,33,134,161,67,135, + 62,238,172,199,81,10,202,113,136,139,141,68,230,217,237,40,47,43,194,207,27,142,66,171,213,0,96,192,190,216,15,231,127,254,18,242,115,181,97,14, + 8,192,31,231,50,73,118,118,78,128,197,194,225,161,218,129,49,238,210,25,26,26,218,184,188,188,28,103,207,158,197,216,177,99,243,75,74,74,206,3, + 232,14,0,37,37,37,7,71,143,30,221,120,197,138,21,49,181,107,215,70,96,96,160,87,151,43,33,36,16,192,68,0,189,96,141,3,225,41,5,48, + 91,165,82,201,50,50,50,106,180,180,219,191,127,63,0,184,244,98,82,216,60,90,58,29,138,74,110,227,217,23,222,180,45,183,253,165,213,183,253,207, + 203,8,0,128,226,130,44,60,253,236,36,153,167,244,114,28,231,242,67,232,71,140,142,245,184,86,79,17,127,14,16,24,24,104,173,126,219,180,6,91, + 63,122,1,176,24,65,77,90,192,168,1,140,149,224,12,26,16,137,28,48,105,61,234,218,244,104,96,96,32,2,229,114,68,133,134,90,59,129,100,89, + 136,197,34,112,38,128,88,172,199,165,28,192,121,237,24,196,154,214,200,200,72,112,28,7,185,92,142,236,236,108,76,156,56,17,70,163,17,131,6,13, + 130,193,96,128,78,167,131,86,171,69,157,58,117,160,209,120,109,71,97,199,241,124,126,249,229,151,8,11,11,195,165,75,151,208,181,107,87,156,60,121, + 18,173,91,91,219,40,84,85,85,161,184,184,24,214,24,67,215,105,228,207,39,199,113,246,243,201,27,91,142,85,124,0,252,190,70,206,154,214,246,1, + 168,113,221,39,143,233,238,183,230,188,121,243,80,84,84,84,195,147,197,255,31,23,23,135,47,190,240,30,155,231,230,120,188,247,200,85,203,235,84,167, + 237,0,107,172,213,9,0,250,121,243,230,253,57,111,222,188,126,132,144,159,231,205,155,215,207,105,59,111,58,206,235,139,124,77,179,221,208,178,185,234, + 186,56,174,228,79,116,120,120,56,155,152,152,200,4,7,7,163,172,172,12,42,149,138,22,21,21,13,87,40,20,179,126,248,225,135,122,149,149,149,184, + 112,225,2,22,45,90,116,12,192,66,87,7,226,13,173,109,42,155,235,216,230,201,114,156,239,223,191,63,106,215,174,93,205,155,37,151,203,61,222,60, + 252,58,222,35,196,178,44,26,52,104,32,191,122,245,170,86,34,145,32,62,62,94,158,159,159,175,229,251,129,242,7,111,129,241,222,2,224,157,211,73, + 8,65,155,54,109,170,121,176,28,127,29,255,223,188,121,51,224,165,234,144,215,108,220,184,177,253,124,5,5,5,241,251,2,0,250,244,233,3,142,227, + 16,25,25,233,147,38,111,212,218,2,224,161,211,233,56,181,90,205,100,100,100,64,42,149,34,40,40,200,30,171,19,16,16,96,247,102,254,157,4,222, + 198,103,221,158,139,127,78,87,105,193,193,181,183,190,32,132,188,136,186,144,132,75,217,159,199,47,106,20,23,18,45,197,190,21,55,113,112,69,254,114, + 125,33,22,81,74,175,250,162,249,200,51,178,160,15,127,121,26,25,107,43,17,42,142,2,43,98,81,65,242,240,220,55,245,193,107,94,220,68,81,25, + 118,5,159,22,124,10,199,192,92,87,80,202,193,96,50,65,171,213,162,178,178,18,0,144,245,199,134,106,219,24,245,110,29,108,94,225,95,176,165,165, + 165,216,190,125,59,126,253,245,87,251,75,220,217,168,246,213,224,162,148,22,17,66,58,78,157,58,245,232,251,239,191,31,27,30,30,14,163,209,136,27, + 55,110,224,155,111,190,185,169,209,104,58,82,74,125,126,193,128,2,38,147,25,58,141,30,229,21,106,204,154,243,157,187,45,25,0,40,45,204,68,255, + 1,79,74,93,109,64,41,133,209,104,70,114,66,36,46,103,158,193,152,103,94,251,235,32,14,199,163,213,119,66,225,173,11,24,247,204,100,183,165,181, + 243,231,207,191,218,186,117,235,57,106,181,186,76,163,209,60,9,96,129,195,106,77,73,73,73,167,1,3,6,124,18,30,30,222,170,176,176,112,166,151, + 28,3,192,244,236,236,236,153,73,73,73,213,22,234,245,122,36,37,37,53,40,44,44,28,213,185,115,231,183,0,132,59,172,14,2,176,3,192,231,174, + 4,41,229,236,85,135,149,149,90,4,135,214,66,222,181,125,94,19,34,97,117,160,156,251,106,68,98,235,114,192,149,23,203,209,155,229,199,253,67,99, + 98,172,54,45,255,193,126,252,137,49,120,124,98,26,20,98,96,238,211,29,80,39,20,128,60,28,146,206,111,128,132,38,89,119,156,184,197,39,253,105, + 95,126,137,83,182,247,113,188,74,133,169,195,135,131,154,128,195,231,206,97,237,111,191,97,120,215,174,80,4,184,12,121,115,155,119,137,68,130,172,172, + 44,28,62,124,24,141,26,53,194,229,203,151,171,117,67,65,41,245,57,255,206,231,51,61,61,29,185,185,185,96,24,6,91,182,108,65,94,94,30,26, + 54,108,8,157,78,7,157,78,135,221,187,119,163,109,219,182,110,245,40,165,84,165,82,129,82,90,45,168,222,85,64,189,63,215,200,149,38,207,157,94, + 119,71,205,57,115,230,184,108,0,224,139,166,43,91,196,5,25,168,238,77,2,31,47,197,27,70,206,243,0,194,248,101,211,167,79,159,233,235,126,142, + 243,188,71,204,73,215,43,34,192,90,39,234,184,176,180,180,244,232,209,163,71,83,148,74,37,50,51,51,165,193,193,193,41,182,229,96,24,6,233,233, + 233,65,125,251,246,221,185,96,193,130,120,142,227,80,80,80,128,215,95,127,189,210,108,54,143,160,148,154,93,29,136,183,100,61,177,101,75,205,135,109, + 211,166,77,62,85,129,240,134,148,72,36,66,88,88,152,86,171,213,66,161,80,32,44,44,76,171,209,104,160,84,42,249,186,98,134,16,34,245,84,237, + 193,227,67,96,124,181,0,120,95,56,119,238,156,79,219,49,12,227,182,164,227,76,118,182,235,238,140,248,216,40,190,207,60,95,53,109,165,60,202,27, + 126,10,133,2,225,225,225,144,201,100,144,203,229,213,140,44,153,76,230,245,193,241,214,33,169,92,46,63,174,84,42,67,29,171,235,212,106,117,89,73, + 73,201,35,174,244,20,97,146,97,143,79,74,2,0,132,68,73,254,243,243,194,235,128,17,133,253,166,37,183,142,111,172,68,73,158,30,219,23,95,191, + 164,47,196,18,0,62,185,16,171,107,230,34,244,86,39,68,132,69,34,47,226,71,240,154,151,54,139,176,250,235,117,72,73,73,113,44,165,185,245,146, + 113,160,48,27,205,208,106,117,168,84,123,47,181,251,139,193,96,128,76,38,195,154,53,107,208,161,67,7,180,107,215,14,128,127,177,89,174,160,148,230, + 18,66,186,44,92,184,240,216,199,31,127,28,86,89,89,137,111,191,253,182,188,178,178,178,11,165,52,215,47,45,142,194,100,52,66,163,211,163,170,210, + 122,14,174,252,185,193,203,94,30,180,204,38,60,250,72,61,20,21,151,64,161,12,195,205,107,7,188,238,199,66,99,117,117,184,211,165,116,13,0,123, + 131,6,23,65,191,87,0,248,252,82,5,208,54,41,41,9,249,249,213,107,148,175,95,191,14,139,197,162,167,214,126,178,158,113,56,30,75,41,245,232, + 135,161,148,90,189,163,90,61,42,43,173,222,21,93,85,177,31,73,114,15,111,108,184,139,201,186,147,123,136,16,2,177,88,12,150,101,241,210,75,47, + 225,236,153,51,232,30,91,129,58,49,65,160,21,121,144,116,123,7,191,23,201,177,224,19,151,141,86,61,178,206,33,4,98,193,186,117,46,215,93,25, + 232,177,214,221,14,159,247,139,23,47,66,46,151,195,98,177,212,248,222,248,155,127,199,243,57,106,212,40,140,29,59,22,203,151,47,135,82,169,68,84, + 84,20,118,236,216,129,130,130,2,136,68,34,212,170,85,203,167,130,42,239,37,227,175,209,197,171,231,176,235,240,47,184,158,123,13,55,243,115,252,74, + 159,59,77,30,254,186,255,184,235,52,158,232,233,177,235,61,183,154,239,188,243,14,10,11,11,171,121,178,28,223,75,238,60,90,206,182,136,19,197,78, + 177,80,252,188,193,201,232,113,158,119,222,30,0,10,1,176,94,246,115,158,47,158,55,111,222,94,222,19,102,211,101,169,151,248,44,192,125,247,14,105, + 3,7,14,28,176,104,209,34,85,64,64,128,189,5,210,244,233,211,49,117,234,84,212,173,91,23,42,149,42,46,52,52,20,37,37,37,152,63,127,62, + 178,179,179,159,167,46,58,218,227,225,63,76,157,174,170,33,149,254,85,96,229,61,91,0,48,126,252,248,26,30,45,254,2,121,194,100,50,33,34,34, + 2,26,141,6,44,203,98,208,160,65,236,31,127,252,97,233,221,187,55,6,15,30,204,158,57,115,198,146,154,154,10,150,101,209,173,91,183,138,31,127, + 252,113,10,33,228,35,111,198,214,189,12,140,231,111,50,95,3,42,125,49,46,61,105,18,66,160,209,104,32,18,137,236,129,242,190,104,242,85,135,142, + 15,32,195,48,8,13,13,181,151,80,120,143,22,111,104,121,211,245,214,33,169,66,161,8,206,204,204,172,199,55,188,40,46,46,70,183,110,221,220,26, + 72,149,133,198,109,71,214,230,143,104,63,60,6,221,158,141,7,128,255,252,185,167,20,237,158,180,150,164,191,125,41,147,211,231,73,141,1,1,248,88, + 167,211,77,38,132,132,200,229,242,153,148,82,177,78,167,123,149,186,232,128,210,89,115,207,178,223,112,96,79,41,38,127,111,13,218,223,56,251,26,38, + 140,152,131,198,141,27,219,95,74,182,23,164,251,136,16,14,48,154,45,168,212,234,80,169,245,189,234,193,27,252,243,176,116,233,82,156,63,127,30,58, + 157,14,139,23,47,182,55,42,112,52,178,238,212,224,162,148,102,61,252,240,195,92,159,62,125,112,244,232,81,200,100,50,19,165,212,239,254,175,56,202, + 193,104,54,67,167,213,162,178,170,202,223,221,157,211,4,163,209,12,150,161,48,26,77,0,40,244,218,82,159,119,191,171,131,251,135,221,170,62,127,254, + 60,12,6,3,222,123,239,61,203,137,19,39,246,2,120,1,176,247,227,52,234,177,199,30,155,157,154,154,26,74,8,153,76,41,253,206,157,32,165,20, + 38,179,205,104,191,203,243,232,136,99,141,128,171,152,172,59,233,102,197,241,195,202,113,28,158,127,238,57,244,136,173,192,224,86,42,84,221,186,4,69, + 136,10,36,52,25,11,62,217,134,63,175,250,28,138,73,1,160,119,231,129,104,222,168,102,247,96,29,187,91,203,100,7,119,31,71,65,241,77,159,211, + 9,88,243,94,85,85,229,214,115,229,143,71,139,135,63,143,211,167,79,199,83,79,61,133,170,170,42,152,76,38,108,219,182,13,43,86,172,64,70,70, + 6,44,22,11,250,247,239,15,150,101,61,158,100,231,107,244,211,142,181,184,173,46,133,84,34,69,105,89,49,174,231,93,67,116,132,219,154,113,159,52, + 29,191,33,13,83,103,1,0,98,85,33,126,25,90,142,154,31,126,248,97,13,227,253,30,116,217,115,220,203,188,191,251,255,109,184,52,180,40,165,215, + 8,33,237,134,15,31,62,29,214,250,77,0,40,7,176,110,231,206,157,3,163,162,162,186,182,111,223,94,36,149,74,113,248,240,97,252,248,227,143,223, + 81,74,215,122,58,144,84,42,213,38,39,39,203,249,151,63,255,32,6,7,7,179,243,231,207,39,203,150,45,115,185,223,150,45,91,188,94,160,242,242, + 114,84,85,85,33,36,36,4,70,163,17,125,250,244,177,156,63,127,30,18,137,4,3,6,12,176,156,59,119,206,126,161,191,254,250,235,120,173,86,251, + 232,175,191,254,218,11,64,103,111,39,136,199,33,48,62,16,62,6,192,187,208,240,217,208,242,181,58,206,157,230,164,73,53,59,236,243,69,83,34,145, + 152,249,158,223,25,134,129,209,104,196,195,15,63,140,194,194,66,251,67,163,84,42,237,70,150,47,134,150,173,250,217,109,135,164,34,145,8,6,131,1, + 157,59,119,6,33,4,75,150,44,241,152,86,77,30,94,95,255,238,149,72,0,221,121,195,168,253,176,24,16,6,56,177,169,16,33,85,13,244,23,42, + 142,54,169,170,170,66,98,98,226,138,70,141,26,169,14,30,60,24,203,207,3,104,233,74,115,243,251,55,135,0,144,184,210,76,9,233,133,118,109,30, + 181,23,18,248,128,115,143,47,96,142,35,129,129,17,136,141,109,0,85,148,14,156,47,193,35,126,48,109,218,180,106,198,20,117,209,243,50,0,159,239, + 57,103,120,45,63,90,201,214,212,0,236,85,94,85,85,186,59,214,1,0,142,163,48,153,76,208,104,245,208,27,238,78,203,87,162,162,162,218,17,66, + 54,57,45,46,5,48,219,67,193,210,126,161,115,114,114,208,187,119,111,252,242,203,47,236,198,141,27,187,111,222,188,249,92,189,122,245,114,134,13,27, + 150,48,97,194,4,89,231,206,157,81,92,92,140,86,173,90,189,11,224,59,119,233,160,182,42,88,173,78,143,170,170,123,239,29,117,229,205,186,155,15, + 35,127,79,190,253,246,91,232,81,171,12,131,90,132,96,197,207,135,48,170,165,28,48,120,12,25,115,9,159,150,136,184,218,168,221,180,93,141,245,1, + 33,214,190,92,107,55,109,7,54,231,178,95,218,206,85,111,206,207,244,157,120,244,196,98,49,190,253,246,91,44,91,182,12,109,218,180,65,112,112,176, + 221,200,58,115,230,12,62,248,224,3,4,4,4,96,242,228,201,208,233,116,62,53,17,229,175,209,230,93,235,81,81,89,14,134,48,40,45,47,129,78, + 175,197,180,255,120,237,231,216,163,166,227,59,226,218,174,121,0,128,13,59,253,254,196,217,53,103,206,156,137,252,252,252,106,158,172,187,137,203,250,183, + 227,182,195,82,74,233,53,0,207,59,47,39,132,4,189,251,238,187,61,249,113,139,62,249,228,19,132,135,135,119,136,136,136,248,211,96,48,20,87,85, + 85,77,229,141,16,66,72,15,106,235,107,35,63,63,223,101,16,105,80,80,144,177,103,207,158,226,90,181,106,85,107,109,168,84,42,237,219,56,62,240, + 142,154,252,58,179,217,140,105,211,166,97,238,220,185,72,76,76,68,106,106,42,250,245,235,7,66,8,250,244,233,131,212,212,191,170,114,67,67,67,37, + 191,252,242,203,99,12,195,156,115,167,233,10,62,48,222,100,50,249,20,0,239,172,201,223,108,147,38,77,194,220,185,115,49,115,166,231,80,15,91,211, + 215,106,79,248,223,161,89,82,82,242,157,227,122,165,82,185,100,240,224,193,162,156,156,156,106,198,149,227,228,226,197,84,77,211,91,135,164,44,203,34, + 58,58,26,239,191,255,62,34,34,34,16,19,19,99,239,120,211,149,38,165,244,22,33,100,252,250,119,175,124,3,155,177,21,16,40,66,101,169,17,155, + 62,200,206,77,144,52,145,171,213,106,249,238,221,187,97,52,26,213,38,147,41,74,173,86,131,159,119,167,153,156,156,92,89,188,39,49,252,8,110,192, + 81,115,231,194,34,60,156,168,195,23,95,124,97,79,119,96,96,32,230,204,153,3,56,121,74,28,53,45,148,203,248,48,237,173,142,223,174,218,44,150, + 73,129,35,251,55,160,226,118,245,234,36,189,241,175,166,212,210,135,187,195,112,106,119,141,235,230,234,186,3,86,99,122,214,172,89,152,53,107,86,141, + 125,28,89,186,180,102,239,19,190,220,243,142,248,98,108,185,212,228,40,81,40,195,16,160,140,69,74,147,48,112,174,35,11,124,210,228,227,148,116,58, + 61,52,26,159,66,35,125,79,103,117,78,28,63,126,124,64,68,68,4,114,115,115,85,98,177,120,128,227,74,173,86,139,228,228,228,6,0,236,67,89, + 185,211,156,52,105,146,254,205,55,223,148,141,24,49,2,131,7,15,198,136,17,35,100,18,137,164,190,213,59,103,68,110,110,46,118,239,222,141,162,162, + 162,11,158,210,201,81,74,228,138,80,4,40,107,33,165,105,40,56,206,191,243,232,46,157,142,94,113,71,111,150,63,70,150,187,251,19,0,78,236,222, + 132,183,95,109,138,239,182,30,195,162,227,64,243,208,66,164,168,138,192,21,93,192,235,163,90,99,193,247,39,1,0,251,247,121,214,132,53,12,200,109, + 26,116,90,143,131,104,184,77,167,99,65,149,247,92,57,30,199,91,140,150,171,235,206,107,174,89,179,6,87,174,92,1,33,4,106,181,26,183,110,221, + 194,161,67,135,176,118,237,90,12,29,58,20,128,53,22,118,228,200,145,140,39,77,231,107,52,229,185,255,195,155,11,94,3,5,69,195,122,41,152,62, + 113,22,218,52,111,127,199,121,119,215,109,135,55,111,150,39,205,133,11,23,222,209,189,244,160,226,215,152,117,0,16,25,25,57,226,177,199,30,131,94, + 175,135,74,165,66,118,118,54,24,134,169,11,88,171,240,226,226,226,214,1,168,235,171,30,203,178,48,155,205,246,216,31,126,2,128,254,253,251,99,203, + 150,45,94,75,20,49,49,49,72,72,72,192,43,175,188,82,163,149,3,239,61,99,24,6,114,185,28,91,183,110,205,47,45,45,45,245,43,160,23,127, + 5,198,31,60,120,208,231,0,120,71,140,70,99,206,165,75,151,106,45,93,186,148,5,92,127,252,28,217,191,127,191,25,94,134,42,185,31,154,206,240, + 47,26,119,70,150,47,221,8,120,235,144,84,36,18,225,226,197,139,120,251,237,183,65,8,193,134,13,222,99,120,108,113,68,118,99,171,101,106,36,126, + 156,115,149,86,222,52,205,63,93,118,250,70,120,120,248,139,176,182,10,73,59,117,234,84,80,120,120,248,44,126,222,157,166,197,98,185,54,109,226,219, + 161,31,126,49,155,57,130,235,104,153,26,137,141,115,175,97,198,11,239,163,95,159,129,53,90,137,109,220,184,209,192,113,156,219,113,240,206,94,40,94, + 214,34,37,42,172,255,227,29,155,129,16,24,13,53,107,170,3,111,91,131,228,165,15,119,199,224,143,214,98,227,148,225,190,228,61,235,192,129,3,225, + 75,151,46,21,1,222,175,251,129,3,7,204,119,82,237,199,127,112,140,70,35,180,218,59,243,162,80,74,15,207,155,243,102,207,149,171,183,137,9,49, + 224,200,190,13,40,47,115,29,206,32,21,139,176,108,197,143,102,137,152,117,25,116,98,225,56,54,60,50,1,70,139,12,173,90,183,131,197,98,6,231, + 165,91,8,66,0,139,133,130,250,208,39,157,3,159,13,26,52,104,196,226,197,139,83,92,173,244,161,17,76,182,78,167,67,94,94,30,52,26,205,250, + 25,51,102,24,183,109,219,246,204,144,33,67,208,162,69,11,212,170,85,11,183,110,221,66,86,86,22,86,172,88,65,15,29,58,180,30,192,139,158,18, + 68,41,221,148,54,231,205,177,43,190,223,38,101,136,17,71,246,111,64,249,109,151,189,138,216,145,72,196,88,254,221,143,70,137,68,156,233,105,59,126, + 208,248,123,225,201,114,102,192,232,137,24,188,112,17,234,182,233,141,180,249,61,176,124,206,147,248,184,143,4,198,244,81,104,62,116,37,214,188,215,23, + 0,16,235,114,172,134,154,136,69,18,220,112,225,177,42,43,183,6,192,171,213,254,121,58,249,188,3,238,61,87,254,122,180,120,77,106,235,59,175,184, + 184,24,58,157,206,30,159,26,18,242,215,224,8,67,135,14,197,83,79,61,229,213,163,229,120,141,186,60,218,19,199,58,121,188,164,126,165,211,157,161, + 117,47,52,93,221,75,255,249,207,127,0,224,127,202,187,229,183,161,85,81,81,113,134,82,218,140,191,89,170,28,226,5,174,95,191,14,142,227,252,10, + 70,97,24,6,6,131,129,239,28,179,90,191,76,124,112,188,167,7,159,82,106,41,45,45,197,99,143,61,134,78,157,58,217,171,79,28,39,30,163,209, + 136,141,27,55,130,227,56,151,65,214,158,112,8,140,175,132,159,1,240,0,80,88,88,216,187,115,231,206,59,69,34,145,79,163,104,114,28,151,93,80, + 80,80,163,137,251,253,214,116,134,111,45,234,206,200,2,188,191,136,188,117,72,42,18,137,160,84,42,241,211,79,63,33,50,50,210,231,180,241,198,214, + 186,119,174,164,165,207,190,210,217,98,192,90,67,25,50,0,156,160,148,58,119,76,218,199,155,94,110,110,110,215,225,195,135,111,39,132,36,107,15,148, + 133,108,152,157,45,21,155,229,218,119,54,191,167,157,251,222,252,26,69,102,163,209,120,177,176,176,240,73,79,154,191,159,43,252,192,211,250,46,145,178, + 125,0,84,131,63,90,123,99,111,177,33,169,75,164,244,250,198,215,71,36,122,218,39,63,63,191,215,240,225,195,127,241,245,186,155,205,230,107,249,249, + 249,126,93,119,192,106,104,101,102,102,114,207,62,251,108,113,81,81,145,199,124,186,99,250,219,139,62,158,251,238,75,17,125,122,182,107,3,6,48,232, + 221,218,39,148,0,84,36,102,115,166,206,252,244,57,87,27,24,140,198,130,55,255,111,114,216,183,223,109,96,2,2,100,56,118,112,19,42,202,11,93, + 109,106,71,34,22,97,209,146,85,156,136,97,60,143,203,226,152,16,74,43,8,33,29,158,120,226,137,23,241,87,232,132,35,217,112,211,186,218,198,194, + 132,132,132,166,44,203,202,0,188,77,41,189,78,8,249,236,208,161,67,189,0,180,101,89,182,150,197,98,201,131,181,208,179,150,82,250,187,183,52,253, + 126,174,96,66,139,198,170,248,62,61,218,246,6,33,212,96,240,92,214,35,4,20,148,82,137,68,156,121,252,247,155,205,221,111,87,109,4,142,123,222, + 130,248,197,23,95,196,139,47,90,109,72,74,41,150,44,233,132,245,127,28,196,208,230,185,208,127,213,17,36,216,227,173,94,45,157,0,240,127,111,61, + 123,207,210,230,152,119,62,125,247,34,70,139,215,124,230,153,103,208,176,97,67,176,44,139,13,27,54,32,38,38,6,173,91,183,198,232,209,163,177,126, + 253,122,116,236,216,145,47,168,122,44,45,220,143,107,244,223,212,252,95,50,176,120,252,54,180,140,70,227,59,181,107,215,22,7,4,4,164,88,44,22, + 80,74,97,177,88,168,205,168,241,187,21,158,88,44,214,61,244,208,67,196,85,235,4,254,127,165,82,233,182,56,205,178,236,188,228,228,228,25,132,239, + 4,196,134,171,122,118,142,227,56,145,72,52,207,159,244,241,220,109,96,60,165,180,10,128,103,255,238,63,64,211,25,177,88,92,213,168,81,35,123,60, + 146,115,159,40,132,16,200,229,114,143,209,185,222,58,36,173,170,170,186,213,187,119,111,139,227,122,199,14,77,61,97,51,182,166,0,72,130,117,236,169, + 203,30,235,24,60,107,85,1,232,0,0,132,144,104,171,102,165,1,168,188,76,125,24,144,248,142,32,244,122,223,17,207,36,237,45,54,36,1,0,111, + 108,193,67,195,18,74,169,22,192,99,247,37,61,14,92,189,122,213,208,182,109,219,213,106,181,122,226,221,228,127,230,59,75,124,233,18,193,43,231,46, + 150,54,19,179,204,245,65,3,122,196,91,171,222,12,148,56,212,220,58,95,116,254,13,192,136,152,171,25,127,20,248,220,215,29,96,53,182,0,204,189, + 147,116,218,98,183,186,57,45,251,29,128,87,131,202,19,191,159,47,242,219,88,246,134,217,108,206,173,91,215,90,1,225,171,49,97,50,153,60,182,60, + 53,153,76,185,206,222,95,71,254,68,8,102,30,5,172,195,196,149,248,164,169,211,233,74,219,183,111,239,151,219,197,108,54,123,124,135,56,230,189,86, + 173,90,136,141,141,181,255,242,56,47,247,150,78,0,218,224,224,224,106,35,153,80,74,73,219,182,109,249,112,8,166,178,178,146,235,220,185,51,195,178, + 172,197,246,30,245,232,134,187,31,215,200,147,102,108,236,74,87,187,220,149,230,157,166,243,65,193,111,67,139,82,122,3,192,168,123,149,128,130,130,130, + 187,26,115,165,188,188,124,57,220,12,18,44,112,247,148,148,148,68,120,223,202,51,222,58,36,45,40,40,240,216,161,169,55,168,117,108,77,207,99,120, + 252,3,52,93,177,183,200,48,174,198,50,155,209,245,223,166,170,170,42,209,91,183,3,238,24,58,116,232,189,141,252,7,64,173,227,202,248,222,227,176, + 128,87,138,139,139,107,54,225,187,75,138,138,138,238,185,102,105,105,169,219,33,148,238,148,251,145,119,147,201,116,247,99,136,57,113,63,210,249,111,209, + 124,80,16,162,212,4,4,4,92,114,167,70,150,128,128,128,128,192,95,16,0,61,92,173,240,167,69,18,33,196,165,134,39,188,233,11,154,130,166,160, + 41,104,10,154,130,166,160,249,224,105,122,211,246,199,254,248,87,224,42,120,252,94,77,0,122,8,154,130,166,160,41,104,10,154,130,166,160,41,104,254, + 175,78,66,213,161,128,128,128,128,128,128,128,192,125,66,48,180,4,4,4,4,4,4,4,4,238,19,130,161,37,32,32,32,32,32,32,32,112,159,16, + 12,45,1,1,1,1,1,1,1,129,251,132,96,104,9,8,8,8,8,8,8,8,220,39,136,173,245,128,128,128,128,128,128,128,128,128,192,61,70,4, + 0,91,183,110,181,91,91,169,169,169,254,141,160,41,32,32,32,32,32,32,32,112,151,60,168,182,136,125,8,158,7,41,83,2,2,2,2,2,2,2, + 255,62,30,68,91,196,30,163,229,104,73,10,8,8,8,8,8,8,8,252,221,60,136,182,136,221,208,122,16,173,72,1,1,1,1,1,1,129,127,15, + 15,162,45,82,205,163,245,32,90,146,2,2,2,2,2,2,2,255,14,30,68,91,68,104,117,40,32,32,32,32,32,32,32,112,159,16,250,209,18,16, + 16,16,16,16,16,16,184,79,220,87,67,139,16,210,67,208,20,52,5,77,65,83,208,20,52,5,77,65,243,127,21,193,163,37,32,32,32,32,32,32, + 32,112,159,16,12,45,1,1,1,1,1,1,1,129,251,132,96,104,9,8,8,8,8,8,8,8,220,39,4,67,75,64,64,64,64,64,64,64,224,62, + 33,24,90,2,2,2,2,2,2,2,2,247,9,2,192,101,203,1,74,233,46,159,69,238,160,245,129,55,125,65,83,208,20,52,5,77,65,83,208,20, + 52,31,60,77,111,218,254,216,31,255,10,40,165,247,109,2,208,67,208,20,52,5,205,7,78,147,113,152,254,233,154,184,199,154,255,150,107,36,104,10, + 154,255,58,205,7,117,18,221,107,195,77,224,193,130,16,34,2,0,74,169,249,78,214,11,252,59,33,177,19,228,96,202,40,205,77,215,57,173,122,52, + 63,63,63,10,0,88,150,165,42,149,42,7,192,169,255,150,102,108,127,34,103,74,64,115,143,208,26,154,69,69,69,42,149,74,165,41,42,42,82,248, + 163,41,32,32,32,112,47,113,105,104,17,66,234,3,152,9,32,196,97,241,113,74,233,60,167,237,190,7,160,112,88,84,5,224,61,74,233,101,31,142, + 45,177,233,203,108,19,7,64,7,64,15,64,13,192,228,99,30,4,238,19,132,144,246,0,250,217,254,255,153,82,122,196,159,245,15,26,177,177,177,242, + 176,176,176,94,167,78,157,146,158,63,127,30,7,14,28,160,203,150,45,51,222,190,125,123,199,205,155,55,181,255,237,244,221,43,152,164,33,27,107,37, + 37,14,146,136,3,65,18,7,166,209,27,155,102,216,86,137,206,157,59,23,215,172,89,179,85,0,192,48,140,209,100,26,226,212,41,0,0,32,0,73, + 68,65,84,50,61,225,139,38,155,56,120,93,173,164,164,39,37,226,64,144,164,129,159,208,235,155,94,187,91,205,90,143,145,141,33,113,33,131,196,193, + 18,68,119,32,159,20,28,162,188,166,248,236,217,179,113,173,90,181,90,158,145,145,241,76,171,86,173,150,251,170,73,8,233,13,96,186,109,54,141,82, + 186,221,151,253,60,232,17,133,66,49,73,169,84,246,149,201,100,177,102,179,153,104,52,154,155,85,85,85,59,205,102,243,71,148,82,238,14,52,7,134, + 135,135,63,211,176,97,195,250,217,217,217,121,55,111,222,252,30,64,58,128,39,99,99,99,71,37,39,39,199,101,102,102,94,46,45,45,93,78,41,221, + 244,223,74,167,128,128,128,21,119,30,173,183,41,165,163,28,23,16,82,115,64,237,110,221,186,13,216,177,99,135,130,227,56,240,147,92,46,55,3,24, + 231,229,184,17,135,15,31,78,154,56,113,226,224,155,55,111,182,86,171,213,143,0,128,66,161,56,22,21,21,117,98,225,194,133,63,244,234,213,43,23, + 86,131,203,103,8,33,34,177,88,252,116,88,88,88,95,179,217,252,48,165,20,98,177,248,212,237,219,183,183,155,76,166,229,148,82,191,141,55,66,136, + 84,36,18,189,40,147,201,122,155,205,230,102,0,32,18,137,206,234,245,250,237,102,179,249,51,74,169,225,14,52,3,164,82,233,139,193,193,193,61,13, + 6,67,51,0,144,74,165,103,43,42,42,118,26,12,134,207,40,173,81,58,255,219,177,121,170,250,81,74,197,0,192,178,236,192,246,237,219,39,17,66, + 56,66,8,165,148,18,134,97,90,90,44,22,198,182,125,63,66,200,137,127,171,103,75,165,82,205,229,56,46,214,211,54,33,33,33,173,79,157,58,213, + 112,221,186,117,150,175,190,250,170,108,252,248,241,129,19,39,78,20,45,89,178,228,51,0,147,157,183,143,140,140,252,152,97,152,72,95,142,207,113,92, + 113,113,113,241,107,222,183,188,255,4,6,5,15,216,145,254,33,110,87,113,232,220,125,232,120,0,188,161,101,78,73,73,185,97,177,88,6,239,219,183, + 47,164,119,239,222,139,1,248,52,88,170,50,36,100,176,93,179,199,208,113,0,248,188,222,177,166,60,68,49,32,125,249,175,168,180,84,96,112,175,222, + 142,154,118,202,202,202,196,190,104,57,48,253,243,93,234,206,148,2,47,246,12,98,0,220,149,161,21,23,23,183,98,236,216,177,35,154,53,107,38,162, + 148,194,100,50,65,175,215,55,60,114,228,72,151,13,27,54,180,6,240,164,63,122,132,144,231,222,120,227,141,247,103,207,158,29,41,22,139,137,201,100, + 170,183,110,221,186,135,39,76,152,240,202,210,165,75,19,134,13,27,22,196,47,127,251,237,183,219,16,66,234,80,74,63,250,187,211,41,32,32,240,23, + 238,12,45,37,0,16,66,10,0,28,183,45,59,238,188,209,158,61,123,54,139,68,34,222,163,245,72,85,85,85,52,170,123,193,92,145,60,122,244,232, + 246,235,215,175,159,59,108,216,176,124,133,66,241,208,144,33,67,212,132,16,118,221,186,117,45,235,214,173,43,239,223,191,255,232,110,221,186,77,249,229, + 151,95,14,0,40,242,37,35,132,144,148,240,240,240,31,63,248,224,131,164,222,189,123,75,34,35,35,65,41,197,205,155,55,227,182,110,221,218,231,221, + 119,223,157,66,8,25,68,41,61,231,139,158,77,179,141,92,46,95,255,238,187,239,214,234,211,167,143,40,38,38,6,58,157,14,231,207,159,239,177,125, + 251,246,206,75,151,46,157,76,8,25,74,41,61,225,135,230,35,33,33,33,27,190,125,227,141,232,118,79,63,45,10,15,15,7,165,20,69,69,69,61, + 14,174,92,217,229,63,31,124,48,153,16,242,4,165,180,198,249,254,111,34,149,74,153,85,171,86,181,144,74,165,0,0,131,193,128,38,77,154,212,180, + 190,255,165,16,66,226,111,222,188,25,34,145,72,92,174,183,88,44,232,220,185,115,109,137,68,130,143,62,250,200,84,92,92,220,114,241,226,197,167,214, + 172,89,19,249,217,103,159,13,133,11,67,139,97,152,200,220,220,92,151,154,22,139,5,70,163,17,102,179,25,6,131,1,141,27,55,190,231,121,186,83, + 164,82,41,202,170,44,152,183,185,2,32,112,78,60,203,27,68,122,189,126,52,128,124,159,52,37,50,7,77,234,252,222,185,35,77,177,68,130,42,139, + 26,239,223,122,30,180,250,187,204,92,183,110,221,178,201,147,39,167,245,232,209,227,235,185,115,231,206,4,224,171,199,49,9,0,182,157,209,1,64,184, + 143,251,184,69,169,84,54,26,57,114,164,168,168,168,8,98,177,24,70,163,17,249,249,249,104,210,164,9,187,122,245,234,6,254,234,213,171,87,111,124, + 90,90,154,106,219,182,109,198,85,171,86,25,122,246,236,41,30,63,126,124,112,231,206,157,27,199,199,199,51,223,124,243,141,126,231,206,157,166,209,163, + 71,75,231,205,155,167,218,186,117,107,127,0,94,13,173,123,157,78,1,1,129,191,240,22,163,117,156,82,58,16,0,36,18,73,203,132,132,132,21,102, + 179,57,6,0,68,34,81,190,88,44,254,200,104,52,158,6,0,66,200,38,142,227,6,120,209,139,24,61,122,116,251,95,126,249,101,193,145,35,71,202, + 75,74,74,98,54,111,222,172,155,50,101,74,54,0,92,189,122,181,78,255,254,253,227,94,122,233,165,220,94,189,122,45,236,218,181,235,203,191,253,246, + 219,78,88,171,36,221,66,8,73,105,210,164,201,225,253,251,247,7,133,134,134,86,91,151,156,156,140,151,95,126,89,50,96,192,128,186,221,187,119,63, + 68,8,233,68,41,253,195,75,58,65,8,121,164,126,253,250,187,246,236,217,19,24,22,22,134,178,178,50,228,231,231,67,163,209,32,56,56,24,195,134, + 13,147,60,214,177,67,194,75,147,38,239,34,132,244,240,197,216,34,132,60,210,33,37,101,215,154,121,243,2,77,55,110,64,46,151,163,178,178,18,0, + 16,20,20,132,214,181,107,139,78,174,92,25,55,106,218,52,94,243,111,55,182,8,33,50,0,160,148,234,9,33,63,179,44,59,80,42,149,50,3,7, + 14,196,174,93,187,136,78,167,19,1,64,64,64,128,121,224,192,129,144,203,229,48,24,12,28,128,159,255,173,222,44,30,169,84,138,172,172,172,106,203, + 212,106,53,138,138,138,80,82,82,2,189,94,143,178,178,50,112,28,71,228,114,121,17,199,113,96,24,171,67,207,157,166,68,34,193,197,139,23,171,45, + 51,155,205,168,170,170,130,94,175,135,209,104,132,90,173,150,7,5,5,213,79,73,73,201,5,176,169,180,180,244,163,252,252,252,235,247,58,127,190,162, + 173,44,189,242,205,214,204,250,101,249,90,192,164,63,224,176,74,124,246,236,217,184,30,61,122,124,153,147,147,51,166,168,168,72,172,82,169,124,242,24, + 105,213,37,151,190,217,154,217,184,44,95,11,152,117,71,239,133,166,94,163,189,178,226,212,167,245,53,149,6,128,192,81,147,42,20,138,67,163,71,143, + 14,93,184,112,161,101,234,212,169,153,0,14,251,162,9,224,198,207,167,117,137,0,12,0,174,249,184,143,39,56,0,56,112,224,0,10,10,10,80,92, + 92,140,162,162,34,196,199,199,227,78,170,227,178,178,178,62,111,218,180,41,249,243,207,63,183,3,88,178,110,221,186,113,165,165,165,211,167,78,157,26, + 254,225,135,31,150,78,155,54,45,13,192,119,235,214,173,123,161,81,163,70,125,47,92,184,176,244,191,145,78,1,129,251,64,27,0,42,219,255,197,176, + 190,119,35,28,230,207,192,250,220,242,219,25,0,72,93,252,242,240,243,69,0,78,56,236,199,207,223,51,24,0,216,186,117,43,229,39,87,27,69,71, + 71,79,234,214,173,219,130,140,140,140,198,183,110,221,10,187,117,235,86,88,70,70,70,227,110,221,186,45,136,142,142,158,196,111,103,107,137,0,135,121, + 199,38,154,146,195,135,15,39,253,248,227,143,105,187,118,237,42,111,217,178,165,97,207,158,61,230,94,189,122,21,2,48,3,48,247,234,213,171,240,183, + 223,126,179,180,107,215,78,254,203,47,191,228,28,58,116,232,227,245,235,215,71,3,96,221,104,130,16,34,14,13,13,253,105,223,190,125,53,140,44,71, + 18,18,18,240,243,207,63,7,135,134,134,110,34,132,84,43,165,187,208,12,8,8,8,216,240,219,111,191,5,6,5,5,161,176,176,16,98,177,24,81, + 81,81,40,47,47,71,254,173,91,184,126,233,18,24,131,1,159,204,153,29,36,151,203,215,19,66,164,222,52,67,66,66,54,172,153,59,55,176,100,215, + 46,252,254,254,251,48,26,141,246,42,87,163,209,136,67,19,39,162,104,247,110,124,243,246,219,129,33,33,33,27,8,33,1,158,52,239,5,142,154,132, + 144,137,0,74,1,148,18,66,38,82,74,143,52,105,210,36,227,252,249,243,232,212,169,19,210,211,211,155,79,157,58,117,226,212,169,83,39,166,167,167, + 55,239,212,169,19,206,159,63,143,38,77,154,100,56,198,103,221,239,116,222,79,77,139,197,82,109,226,184,191,190,49,177,177,177,133,63,254,248,35,134, + 13,27,198,72,165,210,91,195,135,15,151,29,60,120,144,2,248,217,159,116,234,116,58,104,181,90,84,85,85,225,234,213,171,242,15,62,248,160,227,172, + 89,179,234,237,218,181,43,110,230,204,153,255,81,169,84,167,98,98,98,146,252,209,244,23,79,154,12,53,229,37,212,126,8,161,209,117,1,139,38,219, + 113,55,150,101,193,113,156,36,46,46,110,109,66,66,194,55,248,235,69,231,81,147,133,41,199,174,105,214,221,19,77,70,196,228,69,55,82,65,81,95, + 10,80,100,59,173,54,177,44,11,150,101,249,112,1,139,47,154,176,122,211,140,176,22,238,174,123,216,174,26,174,52,187,119,239,222,180,94,189,122,209, + 235,254,12,195,109,73,67,112,146,80,112,146,80,88,34,218,32,75,250,56,18,19,19,163,131,130,130,218,251,163,73,41,93,245,199,31,127,180,165,148, + 206,162,148,150,80,74,23,76,155,54,237,93,66,200,129,105,211,166,205,166,148,46,176,45,127,255,252,249,243,237,40,165,107,254,27,233,188,91,4,205, + 255,77,77,47,182,136,138,16,242,51,33,228,231,25,51,102,116,5,16,225,52,255,168,227,118,0,164,174,126,249,201,97,185,10,64,170,195,126,42,23, + 199,190,43,236,29,150,166,166,166,146,212,212,84,190,100,126,156,16,178,25,192,113,137,68,210,178,69,139,22,3,127,253,245,215,32,149,234,175,227,171, + 84,42,172,95,191,62,40,37,37,101,160,68,34,105,9,224,120,112,112,240,102,184,168,98,180,17,58,113,226,196,193,99,198,140,169,104,217,178,37,0, + 148,157,59,119,78,209,174,93,187,42,179,217,76,204,102,51,105,215,174,93,213,185,115,231,20,38,147,73,221,166,77,27,101,247,238,221,179,95,123,237, + 181,209,0,2,220,104,2,192,200,249,243,231,199,135,133,133,185,221,128,82,10,181,90,141,232,232,104,76,156,56,49,70,44,22,63,227,233,164,136,68, + 162,23,231,207,159,31,21,26,26,138,219,183,111,35,62,62,30,6,131,1,23,47,94,132,174,170,18,38,117,5,76,21,101,40,186,114,25,161,98,17, + 70,15,232,23,45,18,137,94,244,164,41,149,74,95,92,62,109,90,180,33,59,27,87,211,211,97,49,215,116,254,152,141,70,156,253,250,107,232,114,115, + 145,246,236,179,209,82,169,212,163,230,189,196,230,201,250,144,82,42,167,148,202,9,33,11,31,125,244,209,213,114,185,124,226,188,121,243,122,239,216,177, + 163,207,254,253,251,187,152,205,102,177,217,108,22,31,56,112,160,147,78,167,19,201,100,50,136,68,34,159,98,106,254,141,136,197,98,72,36,18,200,229, + 114,116,236,216,241,202,178,101,203,76,241,241,241,226,13,27,54,132,197,198,198,42,151,44,89,82,166,86,171,231,251,170,103,52,26,161,215,235,161,213, + 106,161,211,233,176,103,207,158,218,47,189,244,146,72,167,211,89,250,247,239,95,106,50,153,244,211,166,77,11,14,15,15,159,114,63,243,117,135,88,82, + 82,82,42,242,243,243,135,89,44,150,193,57,57,57,227,97,45,21,254,211,52,1,160,141,74,165,50,234,245,250,209,69,69,69,1,0,30,246,113,63, + 51,128,74,88,13,45,61,191,144,16,34,35,132,52,227,61,190,190,80,86,86,182,116,249,242,229,241,140,44,20,7,13,125,241,3,247,46,118,132,44, + 65,97,210,235,136,138,175,135,17,35,70,68,81,74,151,248,149,43,23,80,74,23,83,74,59,83,74,23,222,201,254,247,59,157,132,144,164,192,192,192, + 244,224,224,224,131,129,129,129,233,132,144,164,59,213,226,233,85,159,244,24,216,152,205,237,85,143,208,129,141,217,220,94,245,253,239,235,73,224,159,137, + 147,45,226,72,17,165,180,31,165,180,95,90,90,218,92,126,161,195,188,220,23,125,94,195,113,153,205,192,186,111,216,171,14,183,110,221,74,249,204,57, + 182,46,76,72,72,88,177,98,197,138,32,231,29,111,221,186,133,138,138,10,188,249,230,155,65,99,198,140,153,156,147,147,51,214,203,177,164,249,249,249, + 15,143,26,53,42,192,104,52,222,230,56,142,169,168,168,16,133,132,132,216,75,154,33,33,33,150,242,242,114,113,85,85,21,107,177,88,244,99,198,140, + 145,62,251,236,179,173,225,224,209,114,70,165,82,245,236,219,183,175,212,221,122,147,201,132,170,170,42,84,85,85,253,63,123,231,29,30,85,209,182,241, + 123,206,158,173,41,155,77,207,38,33,129,64,32,64,0,5,84,144,22,94,9,82,4,81,64,138,104,164,68,16,34,2,210,155,52,105,74,149,142,40, + 68,144,162,88,64,4,11,189,168,32,45,33,148,144,144,144,158,64,146,45,217,126,206,124,127,100,55,46,201,166,2,22,190,253,93,215,94,187,123,102, + 206,61,115,182,229,206,204,51,207,192,100,50,161,99,199,142,146,173,91,183,118,7,176,161,178,115,36,18,73,116,116,116,180,240,254,253,251,240,240,240, + 64,90,90,26,82,83,83,97,208,104,96,210,168,96,210,168,97,81,171,64,85,197,184,119,235,58,218,53,141,16,237,148,72,94,4,176,162,50,77,185, + 92,30,221,46,38,134,117,117,117,69,212,208,210,117,6,135,154,54,5,229,56,240,28,7,206,98,193,139,55,110,192,108,54,131,97,24,60,115,255,62, + 43,223,177,35,26,192,71,85,190,170,143,9,137,68,194,198,199,199,15,17,139,197,160,148,18,163,209,136,35,71,142,252,19,93,249,71,17,139,197,144, + 74,165,48,153,76,168,95,191,190,110,232,208,161,103,22,45,90,20,194,48,140,171,72,36,250,241,222,189,123,31,102,101,101,165,212,84,207,108,54,195, + 104,52,194,104,52,66,167,211,225,246,237,219,1,13,26,52,32,239,188,243,14,87,82,82,18,182,102,205,154,228,35,71,142,184,44,93,186,244,85,0, + 113,143,241,210,234,2,123,229,202,21,121,93,86,243,253,205,154,117,90,117,104,29,149,246,8,241,102,181,66,1,52,0,220,173,166,224,85,66,72,187, + 102,205,154,121,94,187,118,173,144,16,114,14,192,151,148,210,236,170,244,120,158,39,60,207,227,237,103,139,240,78,123,1,204,230,98,20,23,23,35,45, + 45,13,137,137,137,248,237,183,26,135,139,62,128,84,42,29,225,230,230,214,93,42,149,214,183,88,44,140,70,163,73,43,41,41,249,153,231,249,77,180, + 252,180,66,13,120,92,253,180,225,234,234,186,108,198,140,25,29,60,60,60,112,241,226,197,176,221,187,119,47,195,67,6,215,75,133,204,182,21,171,62, + 9,10,242,83,224,242,137,239,131,62,220,184,103,27,128,224,135,234,168,147,127,5,246,94,164,28,127,0,232,109,93,225,254,146,131,242,26,241,176,231, + 215,133,50,163,85,201,133,193,98,177,4,216,143,100,81,74,145,157,157,141,204,204,76,228,231,231,195,211,211,19,38,147,41,160,6,109,73,212,106,245, + 179,222,222,222,37,66,161,208,160,211,233,224,226,226,194,11,133,66,106,109,135,88,87,45,114,6,131,129,176,44,107,118,119,119,119,51,24,12,17,168, + 34,150,140,82,250,172,183,183,183,195,50,131,193,0,141,70,3,173,86,11,141,70,3,131,193,0,127,127,127,88,44,150,42,255,187,181,88,44,45,125, + 125,125,145,149,149,5,153,76,134,140,140,12,24,53,106,152,212,106,88,180,42,112,197,197,224,85,42,240,90,21,204,198,18,4,53,110,10,219,138,196, + 202,48,26,141,45,189,189,189,161,213,254,21,110,70,173,6,203,98,177,192,98,13,142,182,77,39,250,248,248,192,182,34,241,239,192,26,147,53,153,97, + 152,213,18,137,132,29,51,102,12,178,179,179,31,248,76,140,25,51,166,44,38,171,115,231,206,39,165,82,169,37,63,63,31,6,131,161,182,43,187,254, + 51,16,66,64,8,41,125,143,44,22,248,248,248,104,11,10,10,126,43,44,44,28,82,23,61,179,217,108,91,209,5,157,78,7,74,41,46,94,188,8, + 169,84,42,228,56,46,193,98,177,184,8,133,66,48,214,224,175,127,43,117,88,205,87,25,212,58,197,103,41,42,42,18,90,167,250,30,118,132,180,214, + 154,132,144,168,8,133,120,197,226,118,126,138,167,250,184,106,93,196,2,45,159,246,84,253,207,150,39,238,126,99,216,8,247,249,243,231,135,250,248,248, + 72,147,147,147,245,11,22,44,104,16,31,31,79,80,205,63,65,233,233,233,251,103,204,152,225,213,171,87,175,48,137,68,66,138,139,139,145,159,159,143, + 220,220,92,164,166,166,210,203,151,47,223,54,24,12,123,107,115,97,129,129,129,91,199,141,27,247,70,155,54,109,132,64,233,8,169,86,171,125,250,248, + 241,227,125,15,29,58,212,9,64,173,63,151,119,239,222,221,59,115,230,76,215,158,61,123,70,72,36,18,230,81,244,211,30,134,97,252,221,220,220,240, + 243,207,63,67,161,80,128,97,24,255,186,106,217,208,155,248,160,192,0,111,232,79,175,64,132,111,40,244,38,62,232,97,53,157,252,59,168,204,139,160, + 52,134,10,148,210,151,170,49,75,186,105,211,166,205,32,132,28,152,54,109,218,140,242,133,118,231,113,246,245,236,234,27,202,159,243,176,212,42,97,41, + 207,243,200,204,204,68,86,86,22,50,51,51,113,239,222,61,48,12,3,74,105,77,86,159,81,66,8,255,211,79,63,121,158,57,115,70,251,204,51,207, + 20,217,226,95,44,22,11,49,155,205,196,26,23,67,210,210,210,68,167,78,157,82,36,37,37,249,163,116,26,161,202,96,76,71,255,196,217,12,150,253, + 77,175,215,67,42,173,106,22,242,47,108,127,8,47,94,184,80,106,178,52,106,235,148,97,49,56,85,49,168,86,13,49,103,134,24,20,68,95,82,35, + 77,251,120,31,0,101,38,203,100,53,90,70,163,17,102,179,25,60,207,195,226,96,106,241,113,67,41,93,255,244,211,79,183,222,191,127,255,240,204,204, + 204,10,229,253,250,245,67,92,92,28,198,141,27,151,212,187,119,239,203,223,127,255,61,198,142,29,11,158,231,159,34,132,20,83,74,15,253,237,157,126, + 204,24,12,134,178,17,40,189,94,15,147,201,4,84,17,252,94,158,242,159,77,219,123,107,177,88,108,218,100,255,254,175,113,242,228,73,38,49,49,33, + 120,204,152,119,108,1,247,143,248,74,106,142,128,49,185,171,242,111,195,168,50,64,36,41,177,15,124,172,243,106,62,49,111,146,107,243,110,193,84,100, + 132,55,175,179,159,231,231,154,55,111,174,58,124,248,240,184,23,95,124,241,147,187,119,239,190,133,26,78,29,178,102,70,174,73,209,195,164,227,225,166, + 23,216,247,179,198,154,132,144,158,98,134,108,158,252,148,183,116,82,43,111,173,152,37,154,27,155,103,104,82,67,228,90,255,122,46,198,224,6,138,192, + 15,63,92,164,76,74,186,110,152,53,107,214,181,65,131,6,249,77,154,52,169,217,87,95,125,213,137,16,242,41,165,180,168,18,93,105,76,76,204,57, + 63,63,191,6,27,55,110,204,187,123,247,174,167,217,108,118,53,153,76,188,86,171,77,213,233,116,63,155,76,166,159,41,165,23,106,114,173,54,220,221, + 221,91,197,196,196,8,139,138,138,192,178,44,76,38,19,242,242,242,208,161,67,7,193,119,223,125,215,188,54,90,54,238,223,191,191,130,16,114,108,215, + 174,93,221,229,114,121,27,137,68,18,0,128,83,171,213,185,90,173,246,82,93,250,105,15,199,113,185,23,46,92,104,40,151,203,145,158,158,14,142,227, + 114,235,170,101,67,42,98,238,94,57,241,93,189,166,62,13,112,234,204,57,72,69,204,221,135,213,116,242,175,199,22,67,5,123,3,229,192,32,157,89, + 188,120,177,108,201,146,37,88,188,120,113,66,121,17,155,6,165,244,165,197,139,23,39,216,234,217,213,63,241,168,59,206,2,85,58,72,176,44,155,147, + 159,159,239,169,80,40,202,12,86,86,86,22,178,178,178,32,22,139,145,150,150,6,177,88,92,229,16,186,21,189,76,38,59,255,244,211,79,55,73,73, + 73,17,45,88,176,160,222,133,11,23,228,29,58,116,104,33,147,201,56,74,41,244,122,61,115,237,218,53,183,143,62,250,40,232,217,103,159,53,62,251, + 236,179,127,238,217,179,71,135,42,146,151,18,66,126,207,206,206,14,171,95,191,62,128,191,86,116,217,110,246,134,11,40,157,242,100,89,182,202,12,209, + 44,203,94,185,113,227,70,55,23,169,4,70,181,10,38,141,10,22,181,26,156,186,24,92,113,49,160,85,65,108,177,64,200,153,33,147,74,145,153,145, + 1,150,101,175,84,165,41,22,139,175,228,230,230,118,83,40,20,101,127,68,205,22,75,233,141,227,96,180,88,202,70,180,132,66,33,238,222,189,11,177, + 88,92,165,230,227,128,97,24,206,150,194,193,17,98,177,24,254,254,254,124,187,118,237,48,118,236,88,112,28,7,148,230,59,140,34,132,156,162,148,106, + 254,182,206,62,98,28,153,91,91,208,186,78,167,131,70,163,65,97,97,33,43,147,201,154,180,104,209,226,156,209,104,220,107,177,88,182,165,164,164,168, + 42,211,180,26,51,0,165,166,139,231,121,80,74,193,113,28,204,102,51,68,34,17,127,252,248,9,124,180,114,25,182,111,139,167,125,251,246,37,223,125, + 247,29,120,158,207,120,60,87,89,57,132,16,242,212,83,79,141,126,182,101,253,214,239,191,38,71,150,90,141,33,153,215,135,42,59,145,211,217,39,233, + 22,212,97,53,31,33,132,121,250,233,167,223,237,222,184,65,187,89,61,221,160,43,208,227,147,237,41,175,190,41,18,189,179,195,108,222,64,41,101,175, + 92,185,34,239,214,173,219,198,11,23,46,140,8,12,12,140,175,110,154,207,166,217,218,163,113,235,89,65,203,160,205,203,194,186,236,30,253,223,16,137, + 70,237,48,153,182,192,58,29,89,67,205,143,139,190,92,36,133,133,211,26,142,239,210,124,113,83,165,157,255,197,170,243,70,177,64,213,182,139,127,203, + 176,6,77,4,10,133,39,179,97,211,234,123,59,227,247,37,167,167,167,171,214,173,91,215,190,73,147,38,30,151,46,93,10,2,224,208,104,185,184,184, + 132,143,24,49,34,166,176,176,80,180,125,251,246,61,217,217,217,231,1,36,82,74,203,134,180,9,33,189,9,33,159,163,116,229,147,63,74,127,231,78, + 81,74,23,84,113,249,60,33,4,71,143,30,173,176,58,144,127,56,119,174,104,212,168,209,107,41,41,41,39,115,114,114,42,188,86,98,177,120,126,227, + 198,141,95,76,72,72,152,71,41,253,161,54,194,37,37,37,83,246,237,219,183,92,32,16,4,114,28,151,165,211,233,166,60,68,63,1,0,122,51,63, + 114,241,134,221,91,116,70,46,68,38,22,164,235,205,252,168,135,213,116,242,207,83,149,23,129,53,70,203,246,24,0,41,247,252,146,245,177,209,174,110, + 62,80,54,138,101,44,55,10,230,168,44,31,143,33,89,122,101,153,225,167,3,120,22,192,239,66,161,112,245,27,111,188,241,209,206,157,59,221,85,42, + 21,114,115,115,145,151,151,7,150,101,33,151,203,177,126,253,122,93,110,110,238,106,251,115,202,103,144,183,162,247,241,241,57,31,31,31,31,176,121,243, + 102,246,205,55,223,76,235,221,187,119,196,250,245,235,83,68,34,17,229,56,142,24,12,6,242,246,219,111,55,92,185,114,229,29,129,64,224,242,218,107, + 175,17,87,87,215,223,81,26,160,234,144,252,252,252,159,190,249,230,155,87,38,78,156,40,49,26,141,14,71,178,108,199,20,10,5,78,159,62,109,44, + 44,44,172,50,216,200,96,48,252,244,227,15,7,59,191,62,104,144,200,172,86,193,172,86,193,162,82,129,83,23,129,104,84,16,114,22,200,68,60,252, + 131,100,224,244,110,56,248,199,37,179,193,96,168,50,177,161,74,165,250,233,212,246,237,81,207,134,134,178,167,223,125,23,38,179,25,61,111,220,40,51, + 87,38,147,9,223,182,108,9,142,16,60,21,27,139,91,22,139,69,165,82,253,84,149,230,63,197,229,203,151,243,134,14,29,122,129,231,249,214,168,197, + 232,206,191,29,179,249,193,239,151,205,16,89,172,38,56,47,47,79,124,240,224,193,206,215,174,93,19,93,189,122,21,39,79,158,124,106,231,206,157,211, + 67,67,67,91,166,165,165,57,204,253,100,111,222,28,37,253,133,53,254,112,207,174,189,24,61,122,52,201,201,201,193,151,95,126,137,234,146,167,62,106, + 162,162,162,36,237,219,183,31,222,181,107,215,233,202,64,37,185,145,155,132,108,243,77,52,158,234,43,40,250,163,100,115,80,15,246,53,170,229,134,103, + 157,162,217,118,171,249,40,236,86,243,149,167,125,251,246,210,14,29,58,140,234,218,181,235,164,128,128,0,146,119,51,9,200,203,64,108,43,63,230,122, + 94,201,58,233,173,251,131,198,6,7,15,31,243,227,143,16,8,4,230,114,186,85,106,70,69,69,189,239,170,42,70,246,141,75,96,178,115,241,118,43, + 127,38,41,183,100,243,104,87,233,32,89,96,189,81,195,191,254,186,166,154,90,88,56,153,241,248,46,77,239,31,210,213,103,179,117,11,0,28,166,58, + 11,173,87,175,222,229,54,109,60,125,0,192,160,231,2,194,195,195,187,176,44,43,6,0,55,55,183,54,222,222,222,235,1,116,44,47,72,8,17,12, + 26,52,168,157,159,159,223,211,135,14,29,186,148,157,157,157,64,41,253,173,124,189,134,13,27,206,74,74,74,122,70,40,20,18,187,115,43,187,116,68, + 69,69,53,9,13,13,245,254,225,166,7,84,162,70,160,130,98,128,149,130,83,180,66,154,168,25,130,131,207,121,43,20,138,167,138,138,138,46,85,42, + 226,0,66,72,215,87,94,121,101,219,246,237,219,131,187,116,233,66,9,33,76,249,148,14,13,27,54,236,126,246,236,217,214,163,70,141,218,104,93,145, + 92,227,224,97,74,105,26,128,1,181,233,83,117,28,185,69,127,134,53,231,153,147,255,55,212,38,229,194,35,77,207,240,176,84,54,117,248,44,207,243, + 125,25,134,129,201,100,90,236,239,239,255,237,107,175,189,214,111,250,244,233,110,222,222,222,101,35,89,235,215,175,215,165,166,166,126,101,50,153,46,18, + 66,230,100,101,101,245,13,12,172,244,239,131,122,205,154,53,187,251,244,233,243,102,108,108,172,174,101,203,150,242,136,136,136,146,51,103,206,184,69,71, + 71,171,4,2,1,61,125,250,180,123,195,134,13,245,132,16,201,47,191,252,114,239,220,185,115,13,23,47,94,252,41,74,151,91,87,198,174,133,11,23, + 206,234,219,183,111,67,111,111,111,168,84,170,7,204,150,237,177,84,42,69,78,78,14,190,254,250,235,108,179,217,252,105,85,47,138,197,98,89,247,201, + 250,13,227,187,182,123,46,72,238,34,67,78,70,26,184,226,66,64,171,129,216,98,134,76,76,17,216,208,5,66,214,21,201,185,26,108,63,243,71,142, + 197,98,89,87,149,166,209,104,92,23,183,114,229,248,179,27,54,4,133,14,28,136,196,29,59,202,166,10,109,70,139,35,4,33,47,188,0,198,195,3, + 31,110,220,152,107,52,26,171,212,124,28,240,60,47,48,26,43,159,185,49,26,141,224,121,62,35,49,49,113,55,33,68,77,8,137,178,22,29,251,47, + 143,102,1,165,70,107,206,156,57,88,178,100,9,166,77,43,221,133,197,104,52,150,77,31,22,21,21,53,56,117,234,148,232,248,241,227,116,227,198,141, + 247,222,124,243,77,69,108,108,172,98,243,230,205,19,0,56,252,47,221,108,54,99,202,148,41,216,184,113,35,70,143,30,93,161,92,32,16,240,25,25, + 119,161,215,235,233,154,53,107,178,132,66,161,231,167,159,126,42,27,53,106,212,223,106,96,165,82,169,119,251,246,237,155,72,36,18,117,86,102,86,201, + 254,89,123,100,5,173,46,145,122,195,20,240,141,118,131,188,149,244,127,105,155,239,93,15,236,72,166,156,217,151,156,104,48,24,134,162,154,196,162,94, + 94,94,158,45,90,180,104,200,178,172,42,51,35,195,99,254,174,221,46,29,115,174,161,127,99,111,210,62,216,29,17,62,178,142,123,18,243,19,190,25, + 61,122,99,214,205,155,195,189,66,66,212,213,233,122,121,121,121,182,106,213,170,129,80,40,44,86,201,92,228,115,198,76,116,137,134,22,175,132,123,217, + 52,187,238,73,204,79,248,62,46,110,67,110,114,242,91,30,193,193,154,106,52,103,202,134,206,126,15,165,191,49,171,41,165,199,108,5,114,185,92,182, + 127,255,55,44,0,124,181,239,107,33,165,212,195,150,96,246,139,47,190,144,118,232,208,193,207,145,32,165,148,147,74,165,134,165,75,151,122,143,28,57, + 178,199,175,191,254,234,73,8,105,7,224,60,128,92,148,154,107,63,0,137,62,62,62,242,61,123,246,4,117,239,222,221,181,170,215,18,0,212,106,245, + 167,187,119,239,174,191,242,148,7,126,208,190,130,187,252,64,80,5,133,151,159,26,205,220,210,49,100,200,144,192,213,171,87,111,1,208,166,58,45,27, + 132,144,33,253,250,245,91,178,125,251,246,192,145,35,71,230,252,249,231,159,185,0,182,59,48,124,5,111,188,241,70,246,142,29,59,148,148,210,13,132, + 16,49,165,244,171,154,182,227,196,201,255,103,136,163,248,38,66,200,183,22,139,165,47,203,178,223,217,39,44,245,247,247,31,111,52,26,149,132,16,42, + 18,137,114,114,115,115,87,219,39,44,205,200,200,232,27,28,28,92,118,142,53,233,166,125,174,13,121,207,158,61,187,157,61,123,118,237,129,3,7,242, + 212,106,181,219,190,125,251,100,75,150,44,73,227,121,158,78,157,58,53,244,197,23,95,44,225,56,46,59,54,54,182,97,131,6,13,98,147,146,146,126, + 134,157,209,114,160,9,66,72,243,70,141,26,157,254,234,171,175,228,10,133,2,121,121,121,184,127,255,62,180,90,45,56,142,131,80,40,68,126,126,62, + 22,44,88,160,202,202,202,170,144,176,180,18,205,103,235,7,5,253,180,122,222,28,119,5,203,224,222,245,107,176,20,222,131,208,98,70,189,102,10,136, + 36,82,220,186,161,198,132,93,95,171,211,239,23,85,72,88,90,153,102,219,240,240,159,55,78,158,236,166,191,123,23,202,183,222,66,73,73,9,76,38, + 19,24,134,193,237,213,171,33,242,245,197,172,61,123,180,9,233,233,47,148,79,88,234,72,243,97,177,215,36,132,188,67,8,41,11,134,239,215,175,223, + 3,117,191,249,230,27,108,216,176,1,6,131,193,66,41,29,79,41,93,79,8,113,3,0,123,147,245,184,251,249,56,52,189,189,189,87,31,58,116,168, + 190,159,159,31,177,207,216,14,252,21,91,55,118,236,216,23,206,157,59,39,121,250,233,167,13,5,5,5,207,248,250,250,254,26,31,31,239,243,218,107, + 175,101,37,36,36,4,149,215,244,241,241,249,232,171,175,190,106,212,168,81,35,198,54,42,86,126,122,114,248,240,225,221,226,227,227,197,175,188,242,138, + 65,171,213,250,187,187,187,39,127,245,213,87,62,47,191,252,114,78,66,66,130,242,239,184,118,27,227,198,141,235,169,213,106,123,220,189,123,151,170,84, + 170,173,217,210,139,94,46,161,162,29,33,177,94,65,174,97,98,232,239,154,96,188,40,64,201,37,14,57,183,178,151,103,157,164,83,170,211,140,141,141, + 237,97,48,24,94,188,123,247,46,167,86,171,183,70,38,36,120,250,187,139,191,24,212,204,55,164,190,66,130,28,173,9,137,26,6,215,84,102,164,222, + 201,90,181,195,100,154,80,23,77,165,92,178,115,80,51,159,122,33,30,18,100,107,76,72,210,11,113,93,195,33,249,86,218,202,29,38,211,196,234,52, + 29,17,25,25,121,43,33,33,161,145,237,185,78,167,67,126,126,62,10,10,10,160,80,40,16,29,29,125,59,53,53,181,145,35,77,66,200,211,3,6, + 12,152,183,101,203,150,110,174,174,174,162,19,39,78,104,127,254,249,103,125,90,90,154,197,108,54,83,165,82,201,118,236,216,81,218,171,87,47,87,137, + 68,194,204,158,61,187,96,209,162,69,62,132,144,93,212,186,253,89,121,205,214,173,91,255,246,227,143,63,62,75,8,129,64,32,128,209,104,66,81,81, + 17,50,51,51,144,152,152,136,179,103,207,226,200,145,35,151,52,26,205,211,149,93,83,185,239,187,55,128,19,6,131,33,66,44,22,215,216,216,115,28, + 7,150,101,175,3,232,78,41,205,248,47,126,223,157,154,255,78,205,39,149,170,86,243,1,192,179,132,16,219,166,164,191,151,79,225,64,8,153,78,8, + 153,99,125,250,108,13,66,4,84,135,14,29,58,217,173,91,183,177,47,188,240,194,202,238,221,187,103,103,103,103,135,173,88,177,34,216,98,177,152,18, + 19,19,153,228,228,228,180,243,231,207,55,106,220,184,113,108,82,82,210,113,84,61,154,101,235,107,34,33,164,67,215,174,93,191,142,141,141,13,105,215, + 174,157,88,161,80,128,101,89,164,164,164,224,210,165,75,198,61,123,246,100,20,21,21,213,120,11,30,74,233,239,132,144,232,215,198,141,255,42,182,95, + 31,159,231,34,154,136,149,74,37,160,211,225,250,221,28,156,187,126,201,180,245,228,185,124,131,193,208,191,188,201,170,70,179,219,255,38,79,254,106,254, + 235,175,251,35,59,155,85,42,149,16,139,197,72,77,77,69,50,207,91,150,110,218,148,171,82,169,254,246,45,120,108,121,180,120,158,103,1,64,38,147, + 33,46,46,14,246,91,238,108,216,176,1,58,157,14,0,88,66,200,114,66,200,182,255,250,40,150,141,251,247,239,207,234,217,179,231,98,150,101,43,205, + 122,235,233,233,9,181,90,13,139,197,194,101,102,102,94,247,244,244,132,80,40,4,165,21,182,148,1,0,220,187,119,111,86,255,254,253,23,50,12,227, + 112,228,3,0,228,114,121,218,175,191,254,26,62,106,212,40,230,179,207,62,75,25,57,114,164,228,215,95,127,229,40,165,95,63,138,235,170,13,159,124, + 242,201,161,103,158,121,38,33,52,52,52,251,232,209,163,28,0,248,70,145,136,27,31,228,44,243,239,37,31,237,217,84,78,150,142,216,140,34,203,61, + 140,232,241,122,12,42,25,197,179,103,243,230,205,63,182,108,217,50,161,113,227,198,57,199,143,31,231,0,224,109,66,154,174,253,35,115,113,167,16,143, + 184,38,1,10,210,119,205,122,244,42,190,143,209,125,94,127,19,192,132,106,36,177,121,243,230,31,91,181,106,117,53,60,60,60,215,78,51,98,245,239, + 198,197,81,245,21,113,141,252,21,164,223,215,135,209,231,126,30,70,182,238,16,3,7,123,32,214,5,251,127,74,173,255,196,85,58,197,73,41,189,72, + 8,89,121,254,252,121,223,113,227,198,133,13,29,58,84,222,181,107,87,55,251,58,58,157,142,255,254,251,239,181,27,54,108,40,62,121,242,228,157,225, + 195,135,183,67,21,11,1,210,211,211,15,126,248,225,135,30,189,122,245,106,12,160,44,62,43,63,63,31,105,105,105,184,122,245,106,79,106,166,82,0, + 0,32,0,73,68,65,84,154,201,100,250,174,22,215,115,143,16,50,127,240,224,193,203,119,236,216,17,56,114,228,200,156,61,123,246,92,69,105,210,226, + 242,40,250,245,235,215,114,199,142,29,202,145,35,71,230,0,88,64,41,253,219,227,8,157,56,249,79,66,41,173,112,3,240,185,209,104,164,122,189,158, + 150,148,148,80,141,70,67,1,124,235,160,222,183,89,89,89,52,35,35,131,166,167,167,211,59,119,238,80,0,95,216,149,119,115,164,79,41,117,221,185, + 115,103,163,160,160,160,121,46,46,46,135,5,2,129,74,32,16,168,36,18,201,143,222,222,222,115,151,46,93,26,68,41,21,85,210,183,202,52,1,128, + 21,10,133,163,252,252,252,190,245,242,242,202,240,244,244,204,240,243,243,251,86,40,20,142,6,32,172,226,188,170,52,165,44,203,190,239,234,234,250,147, + 68,34,201,147,72,36,121,174,174,174,63,177,44,251,62,0,105,93,53,197,98,241,251,190,190,190,63,201,229,242,60,185,92,158,231,235,235,251,147,88, + 44,174,179,102,93,111,54,77,0,18,0,37,212,10,33,196,252,212,83,79,109,108,221,186,245,250,214,173,91,175,111,213,170,213,102,66,136,217,86,14, + 160,4,128,228,239,238,231,63,169,25,25,25,25,191,99,199,14,126,214,172,89,170,198,141,27,223,159,53,107,150,106,199,142,29,124,100,100,100,124,93, + 53,253,253,253,67,35,35,35,239,111,217,178,197,114,227,198,13,186,101,203,22,75,100,100,228,125,127,127,255,208,127,211,181,251,63,143,168,136,24,15, + 254,80,113,60,125,241,106,16,245,239,128,172,135,213,124,131,101,59,76,15,244,229,53,135,246,208,219,61,34,232,235,66,97,193,163,208,156,85,207,159, + 55,92,249,237,161,53,155,55,111,126,139,218,97,52,26,105,126,126,62,189,113,227,6,61,121,242,36,13,14,14,190,85,157,38,74,179,220,191,13,224, + 251,128,128,128,164,246,237,219,167,119,232,208,33,61,52,52,52,69,40,20,158,5,240,1,128,72,235,109,57,128,198,85,105,2,104,175,80,40,62,12, + 14,14,254,46,60,60,252,116,253,250,245,207,122,121,121,29,144,74,165,75,0,60,95,151,247,29,64,215,87,94,121,37,77,163,209,112,109,218,180,73, + 114,116,94,211,166,77,79,105,52,26,110,208,160,65,25,40,221,108,190,206,239,209,227,248,124,58,53,159,12,205,39,245,86,217,136,214,135,98,177,152, + 133,117,115,105,43,142,70,88,126,47,23,147,85,12,224,67,7,245,202,163,29,50,100,72,234,144,33,67,150,163,116,84,77,128,210,20,14,22,148,70, + 252,155,80,77,74,7,71,208,210,189,246,182,88,111,143,4,74,169,30,165,249,114,30,89,226,208,199,161,249,176,80,107,30,45,66,200,114,235,161,201, + 23,47,94,92,111,95,135,16,114,217,190,156,82,250,200,243,141,252,155,41,42,42,26,255,201,39,159,252,62,109,218,52,73,76,76,12,174,94,189,138, + 37,75,150,24,138,138,138,118,85,127,182,99,114,114,114,210,2,2,2,90,175,90,181,106,210,202,149,43,95,38,132,252,227,123,29,58,34,231,52,61, + 230,215,145,76,30,209,123,216,123,0,120,10,140,123,88,205,237,102,243,233,24,145,232,189,49,47,15,155,76,0,158,18,242,222,35,210,156,52,178,109, + 167,137,15,171,169,211,233,110,183,106,213,10,164,52,96,137,90,44,150,178,213,162,214,12,255,183,171,211,160,148,222,3,176,201,122,3,33,196,11,165, + 171,12,239,81,74,203,143,214,79,174,129,222,89,0,103,171,171,87,27,40,165,71,9,33,111,37,39,39,127,120,251,246,109,135,171,72,111,221,186,117, + 172,99,199,142,238,151,47,95,158,73,41,61,248,40,219,119,226,228,73,199,161,209,162,148,222,2,240,122,117,39,83,199,171,11,107,10,135,106,54,139, + 118,242,247,66,75,99,174,182,89,31,87,48,81,213,149,63,233,100,100,100,20,2,40,219,138,36,44,44,172,66,28,91,93,176,154,170,56,252,251,50, + 193,63,64,222,41,250,49,128,143,31,165,230,231,38,211,26,0,107,30,177,230,74,0,43,31,86,39,37,37,165,231,35,232,206,3,80,74,29,77,203, + 253,227,208,210,69,0,237,42,43,55,155,205,115,0,204,169,172,220,137,19,39,149,83,171,132,165,78,158,124,170,51,80,255,31,13,150,19,39,78,156, + 56,113,82,87,8,0,135,155,113,210,90,172,38,32,164,246,27,122,86,167,239,212,116,106,58,53,157,154,78,77,167,166,83,243,201,211,180,211,174,108, + 228,249,122,57,189,205,181,237,195,191,138,199,25,0,134,255,72,0,158,83,211,169,233,212,116,106,58,53,157,154,78,205,127,86,179,146,118,98,255,142, + 118,30,231,205,57,117,232,196,73,29,248,95,35,18,198,243,214,108,215,60,40,199,98,219,201,100,90,240,48,154,155,55,111,14,227,121,126,0,0,80, + 74,169,197,98,217,22,23,23,247,80,154,78,156,56,113,226,228,159,197,161,209,218,183,111,159,192,246,120,240,224,193,195,57,142,43,91,97,36,16,8, + 62,249,242,203,47,183,85,37,58,96,192,128,10,219,114,216,107,58,162,186,118,28,105,70,54,241,24,227,237,225,50,190,168,184,100,85,74,22,119,82, + 175,215,55,179,149,73,165,210,107,219,182,109,187,249,168,251,57,124,248,240,198,229,219,169,31,44,140,242,114,151,198,221,47,210,172,184,122,83,253,223, + 30,226,252,143,66,8,241,1,240,146,187,84,212,183,185,66,212,254,234,61,253,25,173,137,251,30,165,105,73,10,31,117,123,60,143,113,157,90,71,116, + 110,247,84,35,245,207,167,175,250,94,76,74,51,0,88,253,144,178,147,188,188,188,70,43,20,10,90,80,80,192,23,21,21,85,169,169,84,42,35,228, + 114,249,48,0,205,75,74,74,252,92,92,92,242,0,36,170,84,170,248,236,236,236,235,149,157,87,158,168,6,36,13,64,136,245,105,250,177,84,26,90, + 147,178,234,120,177,17,209,83,64,66,8,76,135,111,209,178,13,52,123,132,19,61,79,43,30,127,49,156,24,41,133,136,0,134,195,201,180,102,187,191, + 255,7,32,132,200,1,68,163,52,133,195,101,0,71,40,165,53,219,137,222,137,19,39,255,121,28,26,173,225,195,135,119,22,177,100,45,5,85,0,212, + 219,96,48,8,197,98,49,140,70,35,92,92,100,235,222,30,57,124,30,24,20,153,45,136,219,182,109,91,157,119,186,174,77,59,3,6,12,56,90,254, + 124,79,185,108,225,177,239,167,122,118,238,189,116,137,49,181,96,138,90,173,102,36,18,9,12,6,3,60,60,60,58,140,137,141,109,195,8,169,81,36, + 114,61,179,114,229,202,42,183,11,169,138,9,19,38,4,152,76,250,231,121,158,23,27,141,70,73,249,118,60,92,92,151,30,251,126,170,75,151,151,150, + 204,3,224,52,90,127,51,132,16,113,168,167,235,241,85,131,163,154,182,111,30,14,62,241,4,244,70,83,223,99,25,154,190,115,207,102,77,36,132,180, + 166,148,86,190,175,80,245,250,12,195,48,239,43,20,138,30,247,239,223,95,65,41,61,80,164,71,235,200,102,17,141,95,124,190,153,140,231,232,153,139, + 73,105,181,218,50,103,222,188,121,76,118,118,246,251,98,177,184,135,78,167,91,177,117,235,214,3,26,141,166,85,211,166,77,73,88,88,24,73,72,72, + 224,139,139,139,29,106,18,66,4,97,97,97,99,67,67,67,7,109,218,180,73,20,22,22,6,169,84,10,157,78,167,188,125,251,182,114,204,152,49,93, + 26,54,108,184,59,37,37,101,29,165,180,210,189,8,237,8,57,246,249,108,0,64,135,97,11,66,8,33,239,163,52,79,26,186,212,255,171,44,42,102, + 65,8,33,100,50,30,92,45,156,77,41,117,152,36,147,2,226,3,59,62,66,223,55,222,103,9,33,99,108,199,123,53,6,126,252,98,53,122,12,30, + 255,192,241,23,27,130,253,126,199,71,120,233,141,247,43,221,213,188,71,99,198,204,243,142,19,196,2,0,195,16,203,225,91,212,209,6,195,185,148,210, + 10,251,145,18,66,94,68,233,134,206,14,235,191,212,148,205,53,153,57,135,9,103,69,66,65,222,129,36,75,133,115,99,90,19,179,153,43,253,109,21, + 177,224,60,60,60,142,205,156,57,147,125,233,165,151,176,117,235,214,142,155,55,111,142,37,132,252,2,224,59,74,105,114,101,215,226,196,137,147,39,3, + 135,63,88,172,0,27,191,251,106,91,163,220,188,2,188,57,106,18,118,237,218,133,194,194,66,120,122,122,66,44,18,9,87,45,159,29,32,151,187,6, + 188,25,59,101,35,128,136,58,55,94,187,118,194,203,159,79,172,89,227,89,1,35,20,139,197,204,238,221,187,81,84,84,4,133,66,1,177,88,200,172, + 92,50,93,38,151,187,201,70,188,51,173,35,128,189,117,237,167,209,168,233,184,127,215,54,121,126,126,62,98,70,79,65,249,118,68,34,17,7,148,254, + 97,169,107,27,78,30,138,153,155,226,222,104,218,194,29,48,37,156,134,80,32,128,139,135,39,162,89,1,4,4,205,222,60,124,103,6,128,185,15,161, + 223,229,192,129,3,75,91,180,104,129,23,95,124,49,130,16,178,125,226,91,125,58,106,57,17,246,159,78,193,185,243,215,29,253,161,174,146,204,204,204, + 46,99,199,142,93,234,237,237,141,141,27,55,70,196,198,198,110,239,217,179,103,187,130,130,2,112,28,135,194,194,66,166,178,115,195,194,194,198,14,28, + 56,112,208,194,133,11,69,12,83,90,77,171,213,66,167,211,33,40,40,8,199,142,29,19,205,154,53,107,208,55,223,124,3,212,33,117,66,66,66,66, + 253,144,144,16,61,0,244,105,233,94,190,44,212,86,6,0,238,238,238,168,14,111,133,171,33,33,225,92,115,219,121,99,95,8,226,42,57,174,7,224, + 82,149,22,207,83,246,200,218,49,149,150,143,90,184,211,114,121,239,201,136,176,176,48,157,253,113,55,55,183,202,78,241,215,104,52,33,229,15,218,234, + 155,204,156,95,101,237,117,143,219,224,208,128,153,57,176,59,119,238,4,0,124,252,254,80,193,150,223,10,88,150,45,253,169,93,190,124,57,230,207,159, + 47,62,124,248,112,175,29,59,118,244,34,132,172,170,204,168,58,113,226,228,201,192,161,209,98,8,113,151,187,187,97,192,144,183,113,232,208,143,232,220, + 185,115,89,89,131,6,13,48,176,255,203,248,242,243,149,0,80,253,175,108,21,60,108,59,133,197,218,185,61,6,173,93,144,158,163,57,123,224,192,1, + 116,234,212,233,129,243,135,188,54,0,95,124,186,28,148,82,209,195,244,147,80,70,228,46,119,197,224,55,71,195,81,59,177,49,253,14,188,56,112,117, + 183,220,123,218,135,206,221,227,164,246,52,10,240,238,222,178,105,4,10,191,94,135,75,69,122,28,202,210,99,68,244,115,136,244,146,161,147,133,67,128, + 171,240,127,120,56,163,229,27,26,26,10,150,101,17,18,18,226,183,104,209,162,41,141,27,4,225,251,47,183,96,219,238,131,60,84,89,7,4,34,212, + 106,131,93,66,136,175,151,151,23,88,150,133,187,187,187,223,203,47,191,60,37,48,48,16,151,47,95,198,165,75,151,120,161,80,184,142,231,249,10,154, + 74,165,50,34,52,52,244,1,147,165,86,171,161,209,104,160,82,169,160,86,171,193,48,12,166,76,153,34,58,126,252,248,32,165,82,249,115,13,166,17, + 211,59,12,91,80,106,54,4,66,205,156,57,115,12,126,126,126,6,23,23,23,202,138,36,234,168,152,5,238,0,192,176,34,245,170,85,171,140,65,65, + 65,122,150,101,197,227,199,143,175,212,12,218,99,48,24,168,189,166,209,104,40,59,190,116,233,82,163,191,191,191,193,197,197,133,154,76,53,31,116,188, + 146,122,31,18,145,0,18,145,0,82,177,16,238,245,159,129,164,240,42,44,22,11,150,45,91,102,10,8,8,48,186,184,184,80,177,88,44,122,247,221, + 119,171,237,231,240,225,195,169,66,161,48,185,184,184,136,230,207,159,95,97,36,241,215,203,153,144,137,133,112,145,176,8,111,16,12,9,213,57,146,113, + 136,64,240,96,52,130,68,34,65,199,142,29,209,188,121,115,124,251,237,183,81,0,156,70,203,137,147,39,24,22,0,14,30,60,216,5,192,49,0,232, + 221,187,55,1,0,2,138,201,99,251,99,68,204,96,112,28,111,139,254,7,97,8,222,121,171,23,120,190,250,25,9,90,131,37,158,181,109,199,94,147, + 18,70,0,0,141,66,149,52,118,196,235,224,120,190,52,13,42,0,8,128,183,99,122,148,30,123,4,253,20,128,195,164,49,175,194,81,59,17,141,2, + 25,139,73,15,98,183,217,99,77,52,107,139,83,211,49,205,235,41,27,154,117,58,232,245,102,108,191,126,95,247,83,166,214,143,81,220,201,95,61,160, + 157,84,144,159,133,80,119,113,133,209,208,186,246,179,115,231,206,104,215,174,29,52,26,13,206,38,229,210,83,9,89,99,41,165,27,31,70,51,52,52, + 20,245,234,213,131,70,163,193,173,91,183,104,82,82,210,216,205,155,55,59,212,148,203,229,195,54,109,218,84,193,100,229,230,230,50,26,141,6,38,147, + 137,87,171,213,224,56,14,211,166,77,19,206,154,53,107,24,33,100,190,85,199,224,72,243,88,42,13,37,132,76,78,72,72,8,157,57,115,166,233,127, + 255,251,95,122,131,6,13,180,2,129,0,74,165,114,117,116,116,180,215,194,133,11,77,189,122,245,186,35,16,8,16,30,30,174,189,122,245,106,40,0, + 153,253,117,84,117,237,246,154,219,126,253,132,2,0,33,4,209,209,209,105,225,225,225,90,129,64,128,155,223,47,173,176,119,96,101,154,66,150,65,227, + 32,143,210,39,132,0,50,55,192,26,137,23,29,29,157,17,17,17,161,97,24,6,87,174,92,9,6,240,64,188,151,35,77,153,76,102,30,50,100,72, + 250,245,235,215,43,212,7,0,86,192,160,93,132,117,0,43,168,53,144,113,170,210,126,10,5,176,204,26,59,148,85,72,1,137,187,143,65,165,82,65, + 46,151,3,0,76,38,19,46,94,188,136,246,237,219,119,217,187,119,239,241,74,94,174,42,175,253,97,112,106,58,53,255,205,154,142,188,200,147,128,109, + 68,235,88,249,139,226,56,11,26,132,248,99,233,236,225,224,56,30,28,199,193,98,189,231,56,14,102,83,181,123,61,215,136,135,105,199,83,46,91,248, + 227,238,56,207,255,245,91,254,194,226,153,49,63,113,28,192,243,102,152,205,0,199,155,193,115,28,204,230,58,135,230,60,128,153,231,17,26,28,128,197, + 51,99,80,190,157,248,47,247,246,249,245,187,41,46,157,95,90,50,9,192,178,71,210,160,147,26,35,21,73,88,202,74,97,52,90,160,54,242,70,74, + 169,118,192,179,205,77,212,213,71,10,0,44,67,30,217,234,218,23,94,120,1,201,201,201,88,184,112,33,14,31,62,124,22,192,67,199,216,52,108,216, + 16,183,111,223,198,209,163,71,145,150,150,86,157,102,243,176,176,48,0,127,153,172,143,62,250,200,103,253,250,245,65,0,208,191,127,255,204,23,94,120, + 161,224,198,141,27,80,42,149,164,160,160,160,55,128,241,0,64,8,153,76,41,93,95,137,174,54,36,36,68,239,235,235,107,176,25,34,134,97,108,163, + 120,122,63,63,63,67,120,120,184,86,36,18,129,97,24,216,140,94,77,32,132,64,32,16,192,166,105,143,64,32,128,77,179,54,8,89,187,250,229,236, + 153,173,29,71,237,85,134,84,42,165,0,42,173,47,96,236,126,30,217,170,35,4,62,255,147,10,9,33,199,40,165,248,243,207,63,145,146,146,2,145, + 72,132,128,128,0,204,159,63,31,6,67,169,223,29,56,112,96,23,0,87,106,212,65,39,78,254,127,80,193,139,60,9,60,240,7,232,224,193,131,93, + 122,247,238,125,28,40,53,64,165,102,199,129,249,49,91,96,54,155,0,90,233,230,245,53,166,170,118,56,142,175,178,29,91,140,22,207,83,214,161,201, + 226,121,88,204,230,135,238,35,0,240,156,25,60,111,174,96,178,120,142,3,33,76,233,248,22,197,67,77,81,58,169,27,1,33,161,140,57,164,1,78, + 90,244,8,242,150,136,1,32,172,73,83,193,197,18,51,78,95,190,6,31,55,249,195,190,47,172,76,86,58,120,83,175,94,61,184,185,185,225,187,239, + 190,3,128,231,199,141,27,247,3,33,164,17,165,52,163,54,130,148,82,86,40,20,150,105,186,187,187,163,77,155,54,32,132,60,31,31,31,255,195,240, + 225,195,27,109,219,182,173,130,102,73,73,137,159,84,42,133,86,171,45,27,201,90,191,126,125,144,209,104,100,0,128,101,133,193,249,124,144,148,227,1, + 15,121,54,10,11,139,189,41,165,165,163,212,132,44,39,132,108,163,85,100,247,23,137,68,101,6,197,222,0,73,36,146,58,25,24,27,54,115,38,18, + 137,28,30,47,63,189,86,29,34,123,163,5,90,58,170,101,135,205,216,217,98,163,170,67,44,22,151,93,187,35,88,129,93,123,130,218,135,98,154,76, + 38,104,52,26,20,21,21,65,42,45,29,48,163,148,130,16,50,30,192,67,239,241,232,196,201,147,132,189,23,121,18,40,255,43,116,12,165,217,226,97, + 49,155,28,154,159,189,223,159,70,122,142,22,1,62,191,131,90,235,214,148,65,131,6,125,174,84,42,203,246,211,146,200,220,188,99,227,62,128,197,98, + 130,187,140,193,168,97,61,30,48,89,165,35,90,198,242,255,176,150,81,88,172,157,219,99,224,154,5,30,114,239,179,229,205,207,226,237,23,6,20,170, + 12,193,12,243,7,10,137,146,27,248,246,7,195,109,231,49,12,115,121,247,134,57,19,107,218,111,74,24,225,128,49,171,99,41,235,214,204,133,81,159, + 152,26,243,220,126,123,51,231,229,229,117,160,251,128,85,221,114,239,59,99,180,254,9,220,61,20,76,112,219,40,180,29,191,22,191,78,159,74,1,192, + 91,25,196,116,29,187,8,110,109,251,224,220,168,97,53,218,160,156,16,34,0,48,16,165,75,241,109,159,109,95,0,244,155,111,190,193,43,175,188,2, + 157,78,7,141,70,3,0,176,88,44,200,201,201,17,1,168,116,216,116,224,192,129,2,185,92,62,144,82,26,109,221,156,24,132,16,95,0,244,206,157, + 59,80,42,149,15,104,242,60,15,149,74,37,18,139,197,14,53,93,92,92,242,74,74,74,148,58,157,14,42,149,10,42,149,234,129,114,86,40,36,177, + 163,199,249,8,69,98,152,77,70,28,138,95,84,237,117,71,53,32,105,93,234,35,164,79,75,119,8,132,98,117,98,88,216,106,150,101,193,48,12,190, + 95,55,117,252,215,43,226,220,1,224,242,129,117,170,193,83,62,89,195,48,12,12,6,131,164,90,97,59,238,222,189,27,108,48,24,244,86,131,102,123, + 29,144,154,154,90,207,96,48,232,236,143,215,4,153,139,59,160,104,0,184,60,24,143,78,8,193,157,59,119,2,205,102,115,9,203,178,48,26,141,53, + 114,69,12,195,136,174,92,185,18,204,243,188,195,250,205,27,6,2,1,45,1,177,71,77,187,88,22,6,81,93,29,66,8,181,153,97,39,78,156,0, + 176,243,34,79,2,54,163,21,117,240,224,65,187,95,5,10,139,217,108,53,89,127,153,30,142,227,145,149,175,199,141,27,55,177,106,213,42,156,62,247, + 190,199,194,133,11,37,179,102,205,50,12,26,52,104,5,207,243,173,24,134,185,60,96,192,128,241,142,26,227,121,190,222,133,11,23,194,108,207,205,102, + 51,220,221,221,225,238,238,142,136,240,224,10,38,139,227,56,152,170,152,58,180,197,104,17,202,83,179,153,3,199,243,101,230,167,80,101,8,254,238,231, + 63,27,217,85,111,98,123,208,241,153,102,21,180,108,12,26,51,191,236,58,118,111,152,51,113,225,214,173,146,66,206,247,221,193,3,70,68,14,28,60, + 12,67,94,237,217,197,96,52,126,43,96,40,111,46,107,15,12,40,30,136,209,114,242,247,145,92,164,53,11,37,50,184,5,212,199,77,13,39,98,89, + 246,247,145,35,71,136,24,1,11,134,21,33,177,80,95,211,97,205,126,223,126,251,237,174,30,61,122,128,216,141,144,232,116,58,116,232,208,161,100,206, + 156,57,121,44,203,90,24,134,81,3,128,201,100,42,209,106,181,27,40,165,249,149,9,202,229,242,126,163,71,143,222,213,162,69,139,178,99,132,16,232, + 116,58,124,240,193,7,37,70,163,49,143,97,24,11,33,68,13,0,28,199,149,152,76,166,13,91,182,108,169,76,51,49,57,57,89,89,175,94,61,168, + 84,42,88,44,22,190,127,255,254,153,44,43,12,102,133,66,242,210,224,113,124,78,78,150,153,97,4,160,148,67,207,129,239,16,137,84,38,50,25,141, + 22,0,147,43,25,205,178,79,225,224,30,29,29,237,101,91,9,248,245,138,56,119,187,50,121,155,54,109,188,236,87,29,214,4,177,88,76,6,13,26, + 36,11,9,9,33,0,240,71,252,76,0,128,72,36,34,125,250,244,145,134,132,148,198,225,255,178,174,230,123,106,251,184,80,160,56,21,40,190,243,192, + 113,129,64,128,62,125,250,72,194,194,194,106,245,93,180,6,192,87,154,187,203,149,181,0,57,127,214,72,43,166,53,49,207,236,12,118,69,79,6,98, + 55,111,67,187,169,135,127,171,170,190,211,108,57,113,82,70,57,47,242,100,192,2,128,117,136,238,175,47,57,5,204,22,83,5,147,197,113,28,132,196, + 128,85,171,86,225,189,247,222,3,0,209,196,137,19,247,47,92,184,240,21,158,231,91,81,74,59,17,82,249,111,5,195,48,199,148,74,101,46,165,84, + 200,48,76,167,117,235,214,121,245,236,217,19,238,238,238,160,60,173,96,178,56,142,135,201,100,172,16,131,97,195,83,46,91,248,227,222,119,61,255,247, + 242,242,23,56,158,255,201,102,178,120,142,3,248,210,147,238,229,102,224,200,143,223,98,227,134,77,133,32,52,9,20,60,195,48,151,43,235,35,207,243, + 173,78,253,113,173,83,199,103,154,97,225,214,173,146,132,11,217,251,199,77,152,17,57,112,240,48,236,253,50,30,140,165,232,79,123,147,197,153,121,20, + 23,22,244,57,234,140,209,250,71,32,132,120,249,248,248,144,97,195,134,241,106,181,26,34,177,152,55,155,205,130,231,159,127,158,123,239,189,247,152,156, + 156,28,168,212,26,150,16,226,69,41,189,95,141,156,247,157,59,119,144,149,149,245,192,65,74,41,218,182,109,235,146,152,152,248,52,165,84,85,201,185, + 149,245,207,59,59,59,27,158,158,158,21,52,155,52,105,226,242,231,159,127,62,189,105,211,166,26,107,170,84,170,248,49,99,198,116,57,113,226,132,136, + 97,24,168,84,42,116,237,218,181,32,159,15,146,198,142,30,231,147,149,149,105,145,203,88,131,72,36,68,94,94,30,223,165,215,16,221,224,225,227,3, + 223,155,241,225,230,172,51,27,42,139,207,122,0,251,149,128,229,203,182,108,217,98,12,10,10,210,75,36,18,113,76,76,76,141,230,15,141,70,35,93, + 186,116,169,161,252,234,66,163,209,72,87,173,90,101,12,14,14,54,200,100,50,106,54,87,31,247,201,48,196,50,106,225,78,139,197,98,41,59,102,251, + 205,17,8,4,48,243,68,179,118,237,90,83,112,112,176,209,197,197,133,74,36,18,81,77,250,57,110,220,56,234,233,233,105,114,117,117,21,77,153,50, + 229,161,86,29,154,57,176,11,215,149,165,119,144,184,187,187,67,173,86,151,245,85,169,84,86,56,199,105,182,156,56,113,224,69,158,16,28,6,48,240, + 128,38,47,191,192,207,199,191,62,44,22,139,245,102,134,197,108,198,187,111,15,198,138,13,107,1,192,102,182,162,39,78,156,184,31,64,181,63,102,187, + 119,239,94,48,113,226,68,121,110,110,238,225,207,63,255,220,107,232,208,161,152,60,121,50,150,47,95,14,161,88,10,47,223,122,101,237,216,218,45,200, + 191,15,10,170,113,164,103,139,209,162,20,172,183,111,40,204,156,25,188,217,12,179,217,12,34,40,189,180,35,63,126,139,161,111,197,65,40,241,240,252, + 100,213,50,93,100,91,229,43,179,70,142,172,52,70,197,78,156,73,184,144,189,127,220,123,83,162,109,38,235,171,248,13,73,31,79,123,121,151,68,204, + 150,181,99,230,121,48,140,192,25,163,245,15,64,8,241,146,72,36,251,126,248,225,135,91,173,91,183,38,90,173,22,102,179,25,5,5,5,216,191,127, + 127,34,165,20,158,158,158,248,225,135,31,248,161,67,135,238,35,132,12,168,198,108,109,158,52,105,82,196,220,185,115,7,206,154,53,203,191,99,199,142, + 8,9,9,1,207,243,40,40,40,0,234,240,3,16,24,24,184,249,224,193,131,17,135,15,31,30,216,165,75,23,255,224,224,224,50,77,173,86,11,147, + 201,84,43,205,236,236,236,235,13,27,54,220,61,99,198,140,193,211,166,77,19,242,60,143,27,55,110,128,2,84,40,18,131,97,24,8,133,44,138,139, + 85,188,139,155,34,219,68,5,46,66,145,24,140,64,84,213,50,225,244,168,152,210,244,14,12,43,82,219,86,2,138,68,34,156,219,251,145,42,42,102, + 129,28,0,68,18,89,97,247,238,221,211,154,53,107,166,61,127,254,124,40,202,173,58,44,15,1,44,253,98,166,8,92,100,82,109,116,116,116,186,77, + 243,206,79,159,168,134,189,51,147,16,129,88,251,210,75,47,165,69,70,70,106,5,2,1,174,125,187,76,213,47,102,138,148,252,181,166,183,2,135,111, + 209,81,151,247,158,140,88,180,104,145,185,87,175,94,119,109,241,98,119,238,220,9,236,221,187,183,100,229,202,149,230,222,189,123,103,180,104,209,66,195, + 48,12,46,92,184,224,112,21,97,121,100,50,153,121,196,136,17,233,87,175,94,173,211,170,195,234,168,87,175,30,120,158,71,215,174,93,161,215,59,30, + 16,116,154,45,39,78,158,76,28,26,45,179,197,60,46,246,221,121,159,0,228,175,44,127,148,254,53,176,68,65,222,127,127,146,43,0,153,205,108,77, + 152,48,161,218,109,78,236,76,86,219,161,67,135,98,250,244,233,248,248,227,143,185,229,203,151,11,174,223,76,53,197,188,51,183,168,92,59,160,160,26, + 222,204,143,115,164,87,88,172,157,219,169,247,146,121,153,185,37,167,98,198,204,42,251,245,226,0,168,136,146,3,128,141,27,54,106,133,18,15,215,129, + 131,135,1,64,244,39,171,150,237,95,136,173,213,155,45,74,154,142,155,48,197,211,102,178,214,173,92,116,213,131,228,174,141,155,148,88,54,13,101,251, + 107,224,229,142,253,157,122,47,121,49,239,190,246,97,183,96,113,82,11,196,98,241,130,95,127,253,213,181,101,203,150,228,222,189,123,224,184,210,119,196, + 100,50,161,184,184,24,106,181,26,6,131,1,109,218,180,97,214,172,89,227,26,23,23,183,0,192,59,149,233,81,74,121,66,136,110,231,206,157,254,81, + 81,81,72,74,74,130,74,165,130,135,71,205,227,114,202,51,119,238,92,126,212,168,81,186,145,35,71,250,135,135,135,227,250,245,235,48,153,76,16,139, + 235,158,219,54,37,37,101,221,119,223,125,135,227,199,143,15,154,54,109,154,48,32,32,128,120,120,228,16,179,201,8,128,210,252,252,124,222,197,77,145, + 237,227,31,156,158,149,147,215,212,108,50,130,231,76,149,70,155,91,211,59,188,159,144,144,80,255,163,143,62,50,218,175,4,28,60,229,147,53,109,218, + 180,241,90,187,118,173,241,165,151,94,74,179,5,175,215,36,24,254,200,109,140,79,72,184,210,188,188,102,84,236,71,159,218,52,237,87,35,246,153,180, + 233,211,240,240,112,175,200,200,200,180,170,116,195,194,194,116,74,165,210,24,17,17,161,17,10,133,165,35,89,102,115,73,88,88,24,239,239,239,111,108, + 214,172,153,166,182,65,251,50,153,140,2,21,115,94,217,168,205,170,67,161,0,150,161,67,135,150,101,134,127,63,60,60,123,216,176,97,202,137,19,39, + 226,211,79,63,197,233,211,167,43,152,253,46,93,186,224,196,137,19,243,240,112,249,222,156,56,113,242,47,196,161,209,250,236,179,248,95,96,23,211,228, + 136,133,11,23,74,172,35,89,209,239,189,247,30,116,58,157,103,249,58,132,144,110,182,92,27,142,76,214,178,101,203,118,81,74,131,1,116,228,56,254, + 183,45,91,63,235,90,93,135,237,53,41,97,4,12,67,52,98,33,189,184,97,243,167,95,216,215,179,6,191,55,1,193,229,79,86,45,211,1,136,46, + 111,182,6,12,24,80,82,94,211,198,232,49,111,151,153,172,79,86,45,251,41,178,109,200,43,179,70,46,112,104,206,22,204,125,219,149,97,200,243,246, + 49,90,142,52,31,22,167,230,95,154,132,144,174,195,135,15,111,245,220,115,207,49,246,38,203,104,52,150,37,238,180,5,139,103,102,102,162,75,151,46, + 76,171,86,173,90,16,66,186,82,74,143,218,107,70,53,39,174,40,193,171,247,116,104,62,111,242,152,247,91,183,138,68,110,110,46,230,207,159,79,23, + 45,90,84,171,209,5,155,230,250,245,235,93,9,33,175,22,23,23,55,239,215,175,223,251,161,161,161,200,205,205,197,177,99,199,104,255,254,253,235,164, + 105,123,110,221,86,103,141,82,169,252,121,206,156,57,195,10,10,10,122,23,22,22,121,31,252,124,33,122,12,28,67,186,244,26,162,53,82,86,154,145, + 157,27,113,236,135,157,94,135,118,175,131,201,104,140,37,100,227,53,91,122,7,7,239,81,137,45,141,67,68,68,132,214,222,168,132,132,132,232,3,3, + 3,13,145,145,145,101,199,29,173,230,115,244,190,215,86,211,26,255,165,173,74,19,64,153,105,43,159,54,194,197,197,5,54,243,85,155,126,218,175,182, + 116,68,117,171,14,237,53,63,255,147,10,237,203,62,39,68,16,31,31,223,45,62,62,190,45,128,139,0,142,0,48,91,207,43,11,154,167,148,126,0, + 224,131,234,174,253,97,112,106,58,53,255,205,154,79,42,117,202,47,100,11,124,7,192,76,152,48,161,80,167,211,121,14,27,54,172,202,115,114,114,114, + 62,221,190,125,251,3,38,235,213,87,95,125,107,223,190,125,63,231,229,229,213,165,27,240,148,203,22,30,255,126,170,103,151,151,150,188,7,96,185,195, + 74,20,124,100,91,229,43,159,172,90,182,31,15,154,173,29,0,94,117,112,6,1,128,238,61,94,198,206,207,214,218,98,187,100,87,207,103,30,26,244, + 231,124,135,171,21,21,110,146,249,214,126,76,132,51,70,235,111,65,36,18,69,77,155,54,77,164,213,106,43,152,172,242,70,75,165,82,225,242,229,203, + 136,137,137,145,92,186,116,41,10,192,3,251,102,146,18,12,15,11,241,31,223,163,65,176,176,36,247,10,62,91,53,15,127,220,46,164,7,15,30,92, + 49,117,234,212,73,62,62,62,184,119,239,158,5,64,141,211,129,51,12,51,220,199,199,103,121,203,150,45,153,162,162,34,156,59,119,14,201,201,201,244, + 214,173,91,43,140,70,227,36,137,68,130,146,146,18,75,73,73,73,205,83,140,151,35,59,59,251,186,53,25,233,120,219,116,147,68,42,19,13,25,254, + 94,112,217,170,195,221,235,96,208,235,0,128,173,73,122,7,150,101,69,151,46,93,10,181,141,90,153,76,38,137,237,248,249,243,231,67,109,185,181,244, + 122,125,141,87,29,62,46,205,43,87,174,4,219,86,71,218,86,23,178,44,43,186,112,225,66,176,77,211,96,48,212,104,232,80,44,22,139,46,93,186, + 20,204,113,220,35,91,117,104,195,106,140,15,91,111,0,74,13,150,213,100,17,235,116,161,115,218,208,137,147,39,148,58,25,45,91,224,123,77,235,19, + 66,216,250,245,235,119,31,60,120,240,3,38,107,192,128,1,220,215,95,127,125,76,169,84,230,50,12,83,221,54,33,21,117,109,49,90,128,176,124,25, + 195,48,151,59,62,211,12,12,195,92,158,53,114,164,97,33,182,62,96,182,190,221,191,231,197,74,100,75,211,3,248,7,99,232,91,113,24,250,86,156, + 39,128,14,64,229,171,21,171,234,135,147,199,3,33,68,28,24,24,120,85,175,215,131,16,2,131,193,80,102,176,212,106,53,138,139,139,203,158,155,76, + 38,228,231,231,35,36,36,4,132,144,10,113,116,20,96,122,118,121,42,179,95,215,54,157,118,255,124,165,228,163,93,95,179,127,166,170,223,161,148,110, + 147,203,229,1,193,193,193,209,215,174,93,155,70,41,173,113,150,94,74,41,19,26,26,202,40,149,74,214,26,39,102,188,126,253,250,59,91,183,110,221, + 22,23,23,23,224,225,225,17,157,155,155,59,109,239,222,189,143,38,243,175,21,147,201,100,153,54,239,163,237,2,86,100,225,57,35,99,50,153,222,66, + 45,190,231,211,166,77,99,224,32,246,42,46,46,206,225,241,127,74,115,198,140,25,14,87,9,198,197,197,85,185,122,176,50,38,77,154,244,200,86,29, + 214,4,167,161,114,226,228,255,15,117,50,90,12,195,92,118,176,186,144,0,160,142,86,244,81,74,45,2,129,96,158,66,161,120,91,171,213,254,248,234, + 171,175,78,24,48,96,0,7,148,6,200,215,165,15,64,105,140,86,84,159,165,19,139,52,134,181,229,203,202,143,60,217,204,214,186,213,203,214,239,223, + 247,229,128,156,172,12,135,43,176,108,6,173,178,50,71,199,139,85,186,121,81,125,150,190,87,168,210,57,99,180,254,38,56,142,59,34,147,201,136,109, + 51,101,251,209,43,149,74,133,146,146,18,88,183,164,1,0,104,52,26,120,120,120,128,227,56,135,107,88,19,110,164,187,182,104,24,116,166,184,176,128, + 184,65,125,158,82,186,13,0,84,42,213,208,186,246,177,168,168,136,200,229,114,220,191,127,31,238,238,238,159,109,221,186,117,27,0,172,93,187,182,206, + 154,229,161,148,26,8,33,147,9,33,182,17,221,201,41,71,87,151,125,182,9,89,123,217,190,172,138,209,172,236,154,108,16,237,232,188,170,202,30,131, + 102,110,21,27,68,87,69,110,45,245,114,1,64,36,20,228,85,182,121,180,72,40,168,219,80,124,57,108,163,90,0,230,61,10,61,39,78,156,252,187, + 112,104,180,108,38,168,50,42,203,147,85,21,28,199,45,5,176,180,182,231,85,197,213,155,234,205,0,54,215,180,190,53,38,235,77,235,205,33,220,189, + 132,90,95,219,128,1,3,54,2,216,88,109,69,39,143,12,179,217,252,43,0,248,250,250,194,215,215,183,54,231,85,56,38,96,112,232,216,249,164,150, + 199,254,72,34,0,192,48,216,251,176,253,227,121,254,80,122,122,122,251,244,244,116,6,0,40,165,59,31,86,179,50,40,165,235,9,33,219,172,143,13, + 53,45,43,87,239,145,111,108,252,152,52,15,87,95,235,209,233,29,72,178,248,63,202,246,170,232,135,115,132,203,137,147,39,148,71,182,7,156,19,39, + 255,85,126,73,161,183,0,188,245,40,53,199,142,29,123,11,165,89,230,255,22,170,49,81,213,167,51,113,226,196,137,19,39,143,5,2,160,155,163,130, + 218,172,38,32,132,56,212,168,138,234,244,157,154,78,77,167,166,83,211,169,233,212,116,106,62,121,154,213,105,151,91,97,30,75,41,173,241,204,213,191, + 18,74,233,99,187,1,232,230,212,116,106,58,53,157,154,78,77,167,166,83,211,169,89,199,118,98,255,142,118,30,231,173,102,217,252,156,56,113,226,196, + 137,19,39,78,156,212,26,103,140,86,13,33,245,250,205,6,232,244,210,39,100,25,77,255,230,131,127,182,71,143,158,129,3,7,86,154,61,220,17,169, + 169,10,230,79,40,63,150,187,138,250,104,180,230,143,185,11,115,42,172,254,180,135,16,66,124,194,90,191,225,34,117,121,199,104,52,54,112,115,119,207, + 187,127,47,127,227,253,244,43,235,236,170,201,127,251,237,55,229,115,207,61,151,5,64,13,0,212,250,111,141,19,39,78,30,29,196,179,121,61,16,50, + 28,160,127,45,187,228,105,34,45,186,246,217,3,245,20,205,222,2,67,154,219,29,210,129,98,11,45,76,188,235,80,247,175,37,233,138,228,228,228,14, + 143,132,18,0,0,32,0,73,68,65,84,208,70,141,26,165,1,40,42,87,173,66,153,243,123,238,228,73,229,161,141,22,105,220,191,1,44,204,155,160, + 120,29,4,151,104,202,222,254,117,210,105,244,106,16,120,246,89,0,173,1,218,218,85,38,125,90,103,52,229,241,148,190,65,147,119,95,172,181,94,216, + 192,49,168,124,59,139,121,52,101,239,134,218,41,210,25,127,156,248,90,162,112,33,104,212,230,149,41,176,203,224,92,87,8,33,98,0,157,24,134,105, + 238,226,226,162,44,41,41,201,231,121,254,46,128,159,41,165,213,110,105,84,137,38,3,96,132,155,171,107,143,80,119,113,235,244,130,226,76,181,153,59, + 9,96,121,93,53,29,81,106,178,2,54,191,55,228,185,152,101,239,118,131,34,106,233,20,0,149,26,45,66,8,9,110,242,252,183,131,6,15,140,26, + 27,27,227,22,228,235,134,236,2,173,247,134,79,227,63,138,143,223,249,210,200,65,209,61,0,96,193,130,5,253,234,213,171,87,95,32,16,164,206,158, + 61,123,199,220,185,115,169,221,15,119,121,77,37,0,150,82,122,215,250,220,21,64,36,128,48,0,41,0,18,40,165,90,71,231,214,148,255,138,102,112, + 112,112,32,207,243,35,253,253,253,123,231,230,230,30,100,24,102,107,70,70,70,86,245,103,62,86,54,217,226,43,106,122,15,224,237,218,52,32,147,201, + 114,245,122,189,31,0,72,165,210,60,157,78,247,216,86,9,254,157,109,253,45,16,140,58,114,42,161,135,253,161,238,29,155,87,172,199,144,230,71,78, + 37,118,126,176,94,36,7,7,191,129,214,236,171,152,55,111,30,153,63,127,254,91,13,27,54,12,103,24,230,198,156,57,115,30,72,125,83,190,204,246, + 61,119,154,45,39,79,34,117,50,90,164,249,64,87,232,233,0,128,196,116,105,223,166,227,219,111,244,33,84,32,197,144,81,83,45,181,214,170,255,150, + 4,2,221,194,150,145,205,39,12,236,211,141,105,27,89,31,74,95,15,128,17,98,211,15,119,188,215,46,155,189,30,192,115,117,232,230,220,219,103,119, + 249,101,23,113,32,4,32,4,96,8,160,209,243,232,222,239,205,185,0,106,105,180,8,163,112,33,152,176,75,15,128,212,106,228,199,161,26,33,245,125, + 125,125,223,26,63,126,188,107,100,100,164,66,42,149,138,245,122,189,127,114,114,178,239,236,217,179,35,9,33,223,83,74,255,168,165,102,72,163,224,192, + 61,107,39,140,120,182,85,88,40,132,70,13,120,131,182,222,205,228,91,237,71,175,223,59,138,16,50,152,214,97,203,132,130,130,2,2,0,62,62,62, + 20,176,55,89,237,98,86,78,236,142,9,43,142,160,68,111,252,162,42,13,175,250,79,13,123,229,149,151,163,22,205,140,115,203,188,103,194,165,84,29, + 188,220,68,152,59,121,140,216,96,48,183,95,191,35,62,246,147,37,83,183,112,28,247,63,0,109,57,142,59,15,96,199,188,121,243,8,128,10,63,190, + 214,140,232,51,74,31,146,157,2,129,224,167,110,221,186,53,24,57,114,36,105,211,166,13,46,92,184,16,182,107,215,174,110,44,203,166,114,28,119,5, + 192,13,74,105,197,220,14,14,32,132,8,1,52,17,8,4,45,255,205,154,129,129,129,50,163,209,248,102,112,112,112,108,223,190,125,91,246,233,211,135, + 52,105,210,4,215,175,95,111,115,232,208,161,185,79,61,245,212,149,140,140,140,205,98,177,120,123,86,86,86,157,51,208,215,21,66,72,44,128,64,171, + 79,158,87,131,251,44,0,243,40,165,85,229,209,122,0,189,94,239,103,251,219,76,8,113,152,239,234,81,81,155,182,8,33,215,8,33,94,214,199,168, + 234,158,97,24,88,44,22,173,197,98,105,88,141,102,19,160,86,225,30,148,82,90,85,34,104,25,0,116,239,208,252,62,8,18,1,0,60,77,172,80, + 139,167,137,101,6,140,162,249,145,211,137,94,15,140,130,149,99,222,188,121,100,238,220,185,248,224,131,15,250,0,232,196,243,252,201,166,77,155,174,121, + 64,146,231,203,202,230,206,157,187,186,178,239,185,19,39,79,2,53,54,90,132,16,130,134,253,59,131,67,76,104,61,255,1,239,142,124,77,22,217,180, + 17,244,112,195,157,2,14,63,28,56,4,0,187,107,211,56,9,27,212,150,21,97,251,178,15,38,71,116,122,54,18,87,51,205,56,159,201,161,36,213, + 12,1,99,6,199,83,128,194,241,86,247,53,32,163,208,130,83,55,140,96,8,32,96,0,134,33,16,212,53,42,141,51,222,92,240,217,133,200,130,92, + 30,224,140,55,235,218,39,0,32,132,52,111,220,184,241,176,249,243,231,43,114,114,114,92,47,92,184,0,137,68,2,79,79,79,129,82,169,12,92,177, + 98,133,238,221,119,223,237,77,8,185,67,41,45,168,161,102,211,94,109,91,158,217,188,108,129,135,249,183,67,40,250,242,43,8,24,10,145,171,27,26, + 200,100,56,244,74,35,175,1,7,82,191,38,132,52,165,148,102,86,167,151,148,148,36,48,24,12,131,229,114,121,59,161,80,232,47,245,172,207,103,177, + 109,239,229,147,176,148,60,191,146,206,19,187,249,247,248,248,189,174,152,176,226,8,86,237,58,247,121,107,228,204,169,74,207,197,197,237,237,119,223,25, + 233,150,81,96,194,194,175,11,240,217,9,21,222,236,228,142,9,61,61,48,116,200,32,215,189,95,237,123,27,192,22,187,83,174,55,109,218,148,36,37, + 37,57,50,89,158,0,166,26,141,70,70,36,18,17,169,84,58,108,209,162,69,166,33,67,134,100,216,234,116,234,212,9,157,58,117,34,106,181,58,236, + 232,209,163,97,241,241,241,22,66,200,53,74,233,183,149,245,81,38,115,73,215,235,117,245,164,50,89,201,134,245,235,63,238,220,185,51,47,145,252,181, + 43,76,93,52,1,64,161,80,108,105,220,184,49,153,62,125,122,214,163,210,108,208,160,193,145,78,157,58,117,237,222,189,59,219,161,67,7,4,6,6, + 150,149,249,248,248,160,83,167,78,228,238,221,187,173,78,158,60,185,254,200,145,35,107,26,52,104,112,52,53,53,181,123,85,154,143,26,235,72,21,106, + 97,156,54,87,50,120,249,159,131,16,226,182,105,211,38,63,219,158,140,102,179,25,28,199,149,221,219,110,60,207,131,227,56,44,90,180,168,202,220,133, + 54,172,35,159,54,83,98,187,241,142,238,197,98,177,79,205,58,139,68,165,164,168,153,171,171,107,40,128,94,141,27,55,158,106,95,28,110,77,83,167, + 213,106,211,178,13,138,68,0,157,43,104,252,133,98,254,252,249,111,126,240,193,7,47,227,175,61,43,91,14,28,56,240,104,185,122,45,173,247,90,66, + 200,49,134,97,190,7,240,25,128,71,54,234,238,228,137,227,25,0,246,73,19,141,0,108,91,102,21,160,244,123,225,93,238,184,125,61,219,125,190,245, + 184,175,245,60,106,167,155,15,160,86,3,28,53,129,5,128,131,7,15,210,222,189,123,19,219,189,195,154,13,6,252,48,98,72,223,30,189,95,120,30, + 140,212,19,55,243,128,179,233,20,44,99,6,3,138,223,78,31,165,96,249,237,246,167,84,53,122,66,26,12,152,212,178,69,228,210,173,203,198,11,174, + 229,177,248,236,100,9,76,122,13,242,115,210,145,151,149,134,236,140,20,100,166,167,92,1,200,220,154,106,150,135,82,128,227,81,250,63,32,15,148,190, + 158,21,47,175,70,154,102,109,82,195,136,22,145,133,98,14,48,107,147,170,111,219,177,38,33,164,69,120,120,248,144,153,51,103,122,37,36,36,200,74, + 74,74,12,135,14,29,186,126,231,206,29,185,82,169,188,63,102,204,152,240,192,192,64,121,191,126,253,196,123,246,236,233,7,187,132,172,85,104,70,246, + 109,247,244,217,79,215,172,116,189,183,119,45,140,201,151,241,67,182,22,167,115,75,104,152,135,132,140,107,229,11,55,9,139,5,29,2,221,122,237,79, + 94,10,96,104,85,154,103,206,156,81,186,184,184,172,120,253,245,215,149,113,113,113,18,142,85,176,251,206,222,243,152,186,254,108,96,137,193,36,24,210, + 181,62,38,190,222,18,19,87,253,106,51,89,177,13,26,20,241,85,105,154,77,166,6,193,126,114,92,186,163,195,103,39,84,248,101,102,32,94,88,148, + 133,87,91,179,104,26,226,6,139,201,220,100,224,192,129,219,81,186,153,249,31,0,250,13,28,56,48,66,32,16,252,10,224,155,234,222,35,169,212,241, + 238,41,158,158,158,232,210,165,11,154,54,109,202,118,238,220,185,37,128,50,3,83,94,211,100,50,42,121,158,194,221,221,93,230,237,237,237,233,238,238, + 126,207,150,89,190,174,154,0,224,229,229,213,191,75,151,46,236,174,93,187,10,82,83,83,127,27,50,100,72,138,92,46,127,96,244,215,213,213,21,225, + 225,225,152,61,123,54,219,163,71,143,106,53,253,253,253,163,227,227,227,65,8,41,251,163,93,158,208,208,80,4,4,4,160,87,175,94,108,255,254,253, + 163,237,203,234,50,178,89,29,229,53,173,35,90,15,100,59,175,106,250,205,81,253,26,188,239,121,182,209,37,169,84,90,163,76,237,213,104,86,58,221, + 41,145,72,202,70,161,202,183,229,72,147,97,24,204,154,53,11,132,16,8,133,66,136,68,34,135,247,81,81,81,181,237,231,93,66,8,35,18,137,166, + 178,44,59,210,96,48,4,75,165,210,44,142,227,62,55,24,12,139,172,35,162,10,71,159,221,202,52,93,93,93,67,111,222,188,217,184,178,23,197,96, + 48,160,101,203,150,128,1,215,170,210,76,78,78,14,109,216,176,97,19,0,182,45,218,78,80,74,59,219,61,183,231,4,165,180,167,245,241,141,219,183, + 111,135,194,106,180,254,142,207,167,83,243,223,167,89,141,23,241,37,132,28,176,107,255,37,219,243,105,211,166,205,88,188,120,113,2,33,228,128,253,113, + 251,122,246,247,0,96,123,60,125,250,244,200,37,75,150,124,104,171,251,168,175,9,168,221,212,161,60,95,239,138,147,233,114,176,2,14,44,67,192,10, + 0,80,130,180,59,201,80,171,138,78,209,148,175,82,107,34,68,194,6,118,120,234,233,150,203,118,174,154,194,108,59,89,130,34,173,30,73,23,143,225, + 143,99,223,228,112,22,238,27,16,122,30,96,46,32,133,191,78,233,222,26,253,167,87,177,17,202,150,26,45,171,185,122,192,108,253,51,16,66,90,69, + 68,68,12,154,61,123,182,207,159,127,254,41,45,46,46,86,239,220,185,51,203,96,48,220,1,112,56,45,45,45,98,245,234,213,226,101,203,150,181,104, + 213,170,149,114,223,190,125,198,154,104,78,142,25,122,118,228,187,239,73,175,237,89,7,241,181,11,152,117,185,128,251,37,187,100,38,128,85,184,171,233, + 144,175,183,252,180,178,75,61,166,190,187,8,141,20,98,199,191,234,86,146,146,146,4,46,46,46,43,226,227,227,67,159,121,230,25,6,0,78,222,176, + 72,166,174,63,27,120,120,113,7,210,161,185,55,242,138,12,24,191,238,18,14,157,205,251,177,188,201,170,12,119,119,247,252,140,60,149,191,183,155,20, + 111,116,116,195,11,139,178,48,160,173,4,18,17,193,245,212,28,52,106,88,159,92,58,245,109,91,148,154,172,103,178,179,179,1,160,45,128,212,187,119, + 239,42,1,20,219,180,40,165,133,132,144,165,98,177,120,22,33,132,62,243,204,51,151,90,180,104,161,241,244,244,132,78,167,131,193,96,128,72,36,130, + 78,167,67,90,90,26,126,251,237,55,120,122,122,86,215,197,7,208,104,52,112,119,119,7,207,243,15,173,201,113,28,217,184,113,163,107,66,66,130,235, + 190,125,251,252,39,76,152,112,175,89,179,102,231,7,13,26,116,203,207,207,207,112,249,242,101,156,57,115,6,133,133,133,104,215,174,93,141,52,141,70, + 35,88,150,133,78,167,131,68,34,1,203,178,176,88,44,224,121,190,204,124,105,52,26,220,191,127,31,34,145,8,70,99,181,31,165,71,142,109,68,203, + 158,170,166,223,28,213,175,142,71,29,39,85,213,116,103,81,81,145,76,161,80,76,173,201,8,29,33,4,2,129,0,34,145,8,132,16,116,238,220,25, + 35,70,140,64,235,214,173,145,156,156,140,47,191,252,18,127,252,241,7,132,66,97,89,253,154,18,21,21,37,144,74,165,103,250,246,237,27,57,115,230, + 76,105,253,250,245,113,237,218,181,144,37,75,150,76,253,249,231,159,95,38,132,180,165,148,86,251,157,44,155,18,44,157,46,236,101,48,24,112,237,90, + 5,31,85,213,57,21,104,212,168,81,26,195,48,183,120,158,63,9,160,37,165,180,51,33,228,16,0,215,114,85,181,148,210,158,132,16,21,128,43,12, + 195,220,224,121,62,205,25,162,229,164,58,202,155,33,155,129,90,188,120,241,75,229,143,57,50,78,229,143,47,89,178,228,67,187,231,143,101,68,181,204, + 104,29,60,120,176,234,79,56,143,87,15,124,189,235,220,11,38,132,70,182,233,132,191,70,135,40,46,252,118,6,0,253,188,38,13,146,192,62,50,198, + 197,245,243,141,31,198,49,155,142,149,224,110,86,30,206,252,240,57,242,179,239,124,6,208,9,52,101,175,170,238,151,99,109,163,65,255,22,126,190,190, + 10,189,137,130,167,0,42,152,173,191,31,66,72,235,38,77,154,244,63,123,246,172,143,94,175,151,158,58,117,170,36,62,62,62,199,100,50,29,163,148, + 158,182,214,249,51,63,63,127,32,0,184,186,186,10,88,150,21,87,21,32,74,8,105,61,121,228,155,167,150,110,252,84,122,235,234,37,172,222,247,3, + 138,74,74,184,99,121,186,126,148,82,155,163,255,181,145,66,146,73,65,235,9,25,2,165,171,48,128,16,34,165,148,58,156,146,53,24,12,67,94,127, + 253,117,165,205,100,1,64,129,218,204,150,24,204,130,14,205,189,209,166,235,64,92,56,186,23,123,78,100,162,161,175,203,137,6,174,213,155,44,0,200, + 207,203,222,184,114,237,166,149,75,231,77,22,79,236,229,129,1,109,133,144,138,8,228,46,66,44,90,179,197,252,231,111,39,46,43,149,202,3,0,250, + 101,103,103,67,169,84,106,0,220,16,8,4,169,28,199,101,149,127,9,40,165,115,8,33,254,219,183,111,103,204,102,179,38,57,57,25,1,1,1,240, + 247,247,135,135,135,7,146,146,146,240,203,47,191,224,250,245,235,224,121,30,79,61,245,84,77,186,89,198,189,123,247,112,249,242,101,244,234,213,123,66, + 126,126,158,220,211,203,91,123,234,228,137,143,234,162,201,243,60,1,128,200,200,72,68,70,70,74,51,51,51,131,15,28,56,224,183,112,225,194,244,208, + 208,208,157,58,221,95,225,83,6,67,205,146,184,219,140,147,94,175,47,51,129,82,169,20,34,145,8,42,149,10,185,185,185,80,171,213,0,0,133,66, + 241,143,24,45,71,35,84,143,178,254,227,160,170,233,78,66,200,235,0,166,58,56,173,2,132,16,88,44,22,136,68,34,60,247,220,115,88,187,118,45, + 254,248,227,15,124,243,205,55,8,9,9,65,76,76,12,24,134,65,66,66,66,109,187,200,159,61,123,118,106,191,126,253,34,183,111,223,46,77,75,75, + 195,245,235,215,161,80,40,176,118,237,90,73,108,108,108,163,163,71,143,206,1,176,188,58,33,251,213,133,129,129,129,175,181,108,217,178,66,157,128,128, + 0,143,195,135,15,251,217,12,88,249,21,137,14,40,154,51,103,206,202,166,77,155,174,178,78,23,118,2,224,74,41,141,218,183,111,31,1,128,1,3, + 6,80,66,200,49,107,253,43,123,247,238,237,154,148,148,68,63,248,224,3,167,203,114,226,208,139,88,71,149,179,173,143,29,26,168,154,82,126,196,203, + 198,244,233,211,35,23,47,94,252,123,93,117,171,162,236,143,105,165,83,134,54,88,70,25,224,231,237,53,45,166,3,120,30,176,112,128,133,163,208,150, + 232,112,237,234,31,37,144,146,125,53,106,81,34,94,182,112,230,123,97,151,50,24,100,21,154,112,252,219,77,52,63,251,78,127,154,178,103,248,163,49, + 89,131,90,6,248,251,29,223,181,105,1,243,71,138,17,28,95,234,179,120,158,150,61,254,187,33,132,4,248,250,250,14,61,119,238,156,175,68,34,145, + 222,188,121,147,223,187,119,111,161,201,100,250,217,102,178,172,116,104,219,182,173,197,205,205,13,90,173,214,108,50,153,244,85,152,172,224,168,214,173,78, + 44,221,248,169,84,111,52,162,88,103,128,192,219,175,188,201,2,33,228,249,174,141,131,130,136,212,29,20,192,29,149,41,171,50,147,5,0,18,137,164, + 91,92,92,156,196,254,152,143,187,208,226,34,17,114,167,19,11,248,11,71,247,226,100,66,1,47,21,9,56,95,154,18,86,211,215,160,40,35,113,227, + 55,223,29,248,105,210,236,101,154,18,173,26,13,3,101,208,168,139,177,104,241,82,243,217,179,39,143,77,157,48,186,253,222,189,123,151,0,184,97,61, + 229,198,222,189,123,223,156,61,123,246,14,88,211,60,56,32,107,232,208,161,25,205,155,55,47,110,218,180,105,241,189,123,247,144,152,152,136,194,194,66, + 172,94,189,26,215,174,93,3,207,151,250,64,71,211,40,213,193,243,60,10,11,239,187,81,74,81,120,255,158,235,204,153,51,61,234,162,201,113,220,3, + 223,173,160,160,32,140,25,51,70,84,82,82,162,72,79,79,151,219,151,213,84,211,104,52,218,146,249,129,82,10,163,209,136,226,226,98,24,141,70,220, + 186,117,171,204,100,89,219,255,199,70,180,108,143,101,50,89,46,41,221,56,25,82,169,20,132,16,71,211,111,143,36,251,179,173,45,66,8,149,201,100, + 149,109,38,237,16,171,217,115,72,109,251,199,113,28,68,34,17,70,140,24,129,223,127,255,29,201,201,201,16,8,4,208,106,181,40,41,41,65,116,116, + 52,196,98,177,173,221,154,202,82,145,72,244,250,140,25,51,164,169,169,169,40,40,40,248,63,246,206,59,42,170,171,107,227,207,153,59,149,25,134,222, + 59,210,85,108,168,216,176,247,88,146,88,177,107,236,70,163,177,199,216,98,212,24,123,139,70,19,99,176,226,171,98,139,45,150,88,163,98,141,162,136, + 2,210,165,151,1,166,222,243,253,1,99,16,7,152,1,76,251,230,89,235,174,196,59,231,254,238,62,83,55,251,236,179,183,54,153,30,26,141,6,211, + 167,79,55,17,10,133,67,97,96,232,62,57,57,185,91,116,116,180,95,249,35,53,53,53,183,108,78,97,117,117,232,208,33,210,191,127,127,218,191,127, + 127,170,117,184,140,50,74,151,116,249,34,101,63,123,181,177,188,167,139,81,186,124,104,82,83,182,46,233,181,116,72,188,7,53,182,183,182,186,184,123, + 203,82,211,19,143,8,18,19,226,144,158,18,143,166,45,219,227,201,163,251,96,85,154,195,52,58,188,202,237,233,196,115,128,111,64,221,122,147,218,181, + 12,196,170,19,5,136,142,60,131,156,244,148,205,52,246,224,225,154,79,5,32,30,3,26,218,219,219,92,252,121,203,82,139,95,30,115,144,144,16,135, + 136,159,215,81,149,82,158,3,160,236,78,46,131,255,106,54,97,21,130,130,156,52,40,242,53,16,113,10,117,39,4,85,32,74,105,170,157,157,221,149, + 117,235,214,117,106,209,162,133,96,200,144,33,169,217,217,217,17,148,210,155,111,108,47,73,144,239,185,105,211,38,251,132,132,4,92,184,112,33,5,64, + 133,75,177,148,210,68,134,97,182,254,250,243,142,89,38,117,252,177,97,254,231,234,67,183,31,247,161,148,254,82,134,25,208,185,129,239,137,101,51,39, + 115,216,187,167,241,32,62,13,47,115,229,191,86,196,204,200,200,32,133,133,133,238,22,22,22,101,239,3,71,137,76,62,123,160,111,114,151,57,87,157, + 138,149,26,8,121,28,58,173,175,123,242,173,136,67,214,25,197,25,68,187,27,177,42,141,29,212,185,239,150,176,35,195,79,156,56,57,73,41,47,14, + 244,247,247,163,119,110,92,124,48,103,250,132,238,85,95,173,83,166,183,110,221,226,48,12,243,150,131,94,54,66,164,149,190,145,34,67,164,47,179,188, + 163,165,149,90,173,126,231,188,190,76,185,92,14,93,62,184,174,92,45,150,101,223,203,252,171,82,217,8,85,217,37,67,109,62,93,113,113,177,157,137, + 137,73,154,118,249,175,182,34,90,53,217,137,88,217,242,165,33,246,113,56,28,176,44,11,62,159,143,70,141,26,225,196,137,19,176,178,178,130,153,153, + 25,204,204,204,96,98,98,2,107,107,235,55,142,22,135,163,247,46,29,42,151,203,221,220,220,220,240,252,249,115,136,68,162,55,135,80,40,68,253,250, + 245,33,147,201,156,241,183,197,238,141,50,234,253,74,27,141,42,155,107,53,119,238,220,249,213,229,205,157,59,119,190,174,8,87,109,138,11,252,233,65, + 234,242,36,181,78,214,174,205,75,204,142,220,3,18,19,99,113,238,224,198,124,149,82,145,205,178,42,247,151,79,239,3,28,252,164,215,221,56,180,121, + 223,158,29,200,185,63,20,200,203,73,199,179,59,103,226,80,36,152,87,27,19,209,58,89,187,183,44,177,56,254,136,32,33,33,14,191,236,219,144,167, + 82,42,59,211,151,225,119,106,194,30,38,16,244,29,84,215,162,215,152,54,201,208,132,104,48,244,73,84,15,167,16,210,55,249,74,229,59,195,202,234, + 245,235,215,17,82,169,148,124,251,237,183,237,138,139,139,255,71,41,125,19,162,36,132,4,122,121,121,13,254,254,251,239,173,18,18,18,120,87,175,94, + 149,93,188,120,17,0,142,85,198,212,104,52,179,9,33,76,19,15,231,79,239,198,37,245,161,148,158,46,195,172,223,43,168,222,181,31,86,44,148,170, + 174,29,66,65,74,2,230,93,75,204,3,160,247,243,173,82,169,144,155,155,11,85,65,166,186,169,163,44,119,241,0,59,121,90,118,49,151,199,22,170, + 3,204,94,203,47,102,190,100,196,98,177,190,56,0,192,150,21,179,194,0,132,13,24,48,96,247,195,27,39,155,58,58,58,158,12,8,8,32,0,160, + 107,135,97,69,42,45,239,48,189,85,171,86,36,56,56,248,247,245,235,215,159,213,62,166,203,169,168,78,68,171,42,233,203,100,89,86,231,175,168,74, + 165,122,231,243,86,157,136,86,89,233,114,180,254,206,136,150,46,167,165,172,147,88,214,17,170,78,142,86,109,171,50,103,202,16,251,180,121,114,124,62, + 31,247,239,223,135,171,171,43,148,74,37,164,82,41,164,82,41,76,77,77,145,159,159,15,30,143,103,80,126,22,0,86,36,18,189,122,252,248,177,159, + 173,173,45,52,26,205,91,206,86,116,116,52,36,18,73,18,12,140,104,57,57,57,157,41,221,117,248,150,28,28,28,204,13,225,84,164,178,145,172,254, + 253,251,27,151,8,141,210,169,202,124,17,0,233,229,34,81,138,50,255,78,7,64,74,255,157,14,188,113,196,202,254,191,66,199,185,204,21,43,86,92, + 44,147,223,149,142,247,160,74,35,90,196,123,80,99,59,43,203,139,59,55,44,54,59,24,9,36,37,196,226,242,225,77,185,106,141,178,35,88,154,114, + 227,252,225,67,32,40,196,203,67,151,129,131,85,223,141,69,147,38,117,221,113,244,15,21,210,19,163,65,41,187,139,166,253,92,88,211,73,16,239,126, + 141,236,236,236,46,238,218,180,216,252,200,125,130,196,132,88,156,59,184,41,79,173,42,236,68,95,254,47,178,186,220,79,8,177,228,72,197,223,13,239, + 214,124,128,123,29,103,176,84,5,150,79,241,241,108,27,238,179,187,133,71,221,186,50,7,217,2,118,82,226,13,253,10,129,230,231,231,31,37,132,220, + 41,91,94,129,16,210,208,199,199,103,224,214,173,91,109,19,19,19,69,119,239,222,45,218,190,125,251,107,150,101,143,80,74,171,92,74,165,148,126,78, + 8,217,89,182,94,14,33,164,225,172,209,67,110,12,25,245,137,40,246,124,24,44,99,159,96,230,181,100,205,179,108,69,40,165,52,181,34,150,141,141, + 13,205,200,200,136,207,201,201,241,147,72,36,200,204,204,68,86,86,22,114,115,115,33,207,203,82,91,107,114,100,68,157,5,30,143,135,215,9,42,104, + 52,154,84,125,163,89,0,44,151,46,93,58,150,101,89,109,69,196,183,118,23,150,25,167,125,63,248,13,24,48,96,183,118,215,33,202,36,195,151,41, + 239,64,74,203,59,180,56,125,250,116,84,247,238,221,19,129,119,157,21,161,80,136,226,98,195,170,132,84,180,139,177,58,204,138,34,90,229,207,27,194, + 212,46,95,106,147,224,203,159,215,138,97,24,176,44,251,206,249,191,66,101,157,150,178,187,3,245,25,95,153,170,42,28,90,157,157,136,90,213,86,68, + 11,192,155,136,214,177,99,199,48,106,212,40,104,52,26,136,197,98,152,154,154,66,34,145,224,240,225,195,208,150,127,48,196,68,149,74,181,103,197,138, + 21,243,183,109,219,102,66,41,133,64,32,120,227,104,45,94,188,184,72,169,84,238,129,30,142,214,155,138,239,44,125,236,99,91,249,174,67,93,215,84, + 144,175,101,177,116,233,210,17,44,203,246,69,185,18,14,229,198,189,85,250,193,88,222,193,40,61,84,235,101,23,254,42,85,232,104,17,239,126,141,108, + 45,109,46,238,216,176,216,108,239,109,130,228,132,151,184,126,108,115,174,134,85,117,44,83,169,189,141,65,119,35,164,137,147,157,5,178,110,22,33,47, + 227,21,64,113,183,38,198,255,105,167,237,197,31,55,45,54,15,191,199,65,210,171,88,92,58,188,41,87,173,150,119,162,47,255,87,109,254,48,129,160, + 111,125,95,151,31,6,247,104,99,105,78,84,80,199,71,97,231,200,129,136,236,173,68,235,65,230,104,222,83,10,239,198,162,129,167,118,100,117,114,10, + 33,159,232,27,221,42,231,100,53,241,244,244,236,119,243,230,77,27,150,101,69,151,46,93,42,222,190,125,251,235,162,162,162,179,148,210,251,250,218,90, + 206,201,106,50,119,220,200,171,203,191,219,41,122,28,121,27,171,246,28,71,145,74,161,57,147,88,48,160,236,178,98,69,146,203,229,231,55,109,218,228, + 254,197,23,95,8,179,178,178,144,145,145,129,236,236,108,228,228,228,32,43,43,11,5,5,5,112,112,112,192,153,51,103,20,121,121,121,55,171,226,105, + 117,253,250,117,79,15,15,143,0,148,236,36,4,222,221,93,88,86,183,83,82,82,154,161,130,93,135,186,36,149,74,193,231,243,161,84,42,223,68,180, + 132,66,33,204,205,205,145,153,153,137,3,7,14,0,64,86,101,12,62,95,144,194,225,16,87,19,177,88,46,18,137,88,71,71,199,119,198,24,202,44, + 85,98,143,30,61,92,150,46,93,42,10,10,10,122,115,82,27,209,170,14,147,82,90,216,181,107,87,241,198,141,27,225,238,238,14,133,66,241,150,67, + 197,225,112,192,231,243,145,144,144,128,101,203,150,129,82,90,227,63,104,12,85,89,167,165,172,51,84,154,67,245,142,35,164,111,196,168,170,165,65,67, + 119,34,150,117,220,132,66,33,114,114,114,76,8,33,67,117,149,120,48,36,162,165,117,180,158,60,121,130,221,187,119,163,103,207,158,176,180,180,68,118, + 118,54,14,30,60,136,168,168,40,8,4,2,16,66,12,137,106,177,193,193,193,223,92,185,114,165,119,104,104,104,189,153,51,103,154,4,6,6,226,217, + 179,103,88,186,116,105,113,100,100,100,76,81,81,209,82,232,83,216,180,180,226,187,182,24,169,94,187,14,203,93,83,94,21,148,119,232,161,115,240,219, + 165,31,222,42,239,96,148,81,255,37,85,28,209,98,57,155,118,110,92,98,182,231,22,7,9,241,49,184,115,106,107,121,39,171,74,17,66,58,151,173, + 181,33,50,145,4,178,164,100,59,115,94,70,2,64,25,131,29,161,242,76,176,156,77,63,108,92,108,190,239,14,65,114,194,11,92,139,216,82,226,100, + 189,8,215,155,93,150,57,92,32,88,200,227,114,190,248,160,109,19,126,72,99,63,136,95,199,34,53,49,25,7,158,164,103,197,100,203,63,185,70,148, + 136,127,33,223,217,115,172,149,149,165,3,15,189,38,88,91,221,60,158,119,212,185,35,71,73,149,116,69,242,85,186,88,167,157,239,222,211,65,42,149, + 134,222,185,115,199,76,36,18,153,220,185,115,135,221,190,125,123,102,81,81,209,41,74,233,13,189,230,254,238,227,46,205,124,189,46,47,223,178,67,84, + 32,43,132,76,161,132,208,222,81,115,228,198,163,126,180,130,2,152,229,153,66,161,112,223,190,125,251,122,182,109,219,214,61,48,48,144,163,117,174,180, + 201,213,182,182,182,120,242,228,9,27,27,27,155,44,20,10,247,235,107,103,171,86,173,98,57,28,206,211,210,101,180,167,40,183,187,176,204,80,191,148, + 148,148,102,142,142,142,151,1,136,181,187,14,81,210,41,254,60,240,86,121,135,249,0,56,132,144,219,247,239,223,47,232,222,189,59,76,76,76,32,147, + 201,224,230,230,6,181,90,141,83,167,78,33,50,50,82,198,178,236,101,0,111,57,175,229,237,44,42,42,116,35,132,112,138,10,11,27,141,24,49,162, + 221,140,25,51,222,218,146,110,103,103,7,43,43,43,131,152,0,144,149,149,85,247,244,233,211,159,221,191,127,255,243,158,61,123,154,207,159,63,95,232, + 233,233,9,141,70,195,169,46,51,59,59,219,252,238,221,187,171,219,180,105,51,185,123,247,238,220,229,203,151,195,220,220,28,26,141,6,38,38,38,200, + 203,203,195,210,165,75,113,245,234,85,53,165,116,75,110,110,238,204,170,152,53,85,121,102,69,17,160,138,28,33,93,227,255,10,59,203,57,110,176,176, + 176,152,3,96,142,174,18,15,250,50,129,63,35,90,12,195,32,46,46,14,219,183,111,127,167,142,150,182,252,131,46,118,5,115,167,151,46,93,210,16, + 66,90,222,185,115,103,206,240,225,195,63,145,201,100,46,18,137,36,89,165,82,253,84,84,84,164,173,163,197,215,215,78,160,164,24,169,174,93,135,229, + 199,0,22,239,156,47,203,44,87,222,225,173,18,14,229,46,123,171,244,67,249,242,14,127,197,235,110,100,254,243,152,255,85,233,116,180,72,208,120,30, + 79,32,105,112,37,134,84,219,201,210,37,121,113,97,204,194,125,175,26,43,228,197,144,229,166,61,163,177,251,13,10,235,87,100,231,111,49,4,113,177, + 47,112,235,196,150,18,59,95,132,87,219,78,2,204,221,122,42,156,79,204,173,240,224,179,81,72,206,145,225,151,151,217,7,105,161,124,82,88,105,175, + 64,151,150,228,202,15,95,164,110,13,249,216,124,160,141,51,15,107,103,253,4,209,92,107,126,243,78,109,245,238,129,72,41,77,181,183,183,191,178,97, + 195,134,206,33,33,33,194,1,3,6,188,147,32,111,168,40,165,137,132,144,239,78,110,91,51,203,186,65,11,108,254,114,182,102,223,141,71,111,237,66, + 172,74,1,1,1,154,235,215,175,207,24,63,126,252,218,206,157,59,59,245,233,211,71,224,230,230,6,161,80,136,23,47,94,224,202,149,43,138,151,47, + 95,38,23,22,22,206,104,216,176,161,33,53,206,178,23,46,92,248,77,233,61,72,233,114,97,83,148,238,46,212,14,42,45,90,218,20,128,120,241,226, + 197,195,1,64,215,182,239,210,242,14,219,80,210,235,48,53,44,44,172,101,68,68,68,203,233,211,167,243,123,246,236,137,155,55,111,226,220,185,115,74, + 165,82,121,3,192,13,170,103,91,155,210,250,67,119,9,33,143,86,173,90,213,146,97,152,55,21,239,31,63,126,140,93,187,118,85,135,169,6,176,154, + 16,242,93,88,88,216,194,243,231,207,143,30,49,98,132,153,74,165,194,147,39,79,240,227,143,63,86,151,249,153,173,173,237,130,83,167,78,253,116,246, + 236,217,15,135,13,27,198,153,58,117,42,54,109,218,132,255,253,239,127,172,70,163,137,224,241,120,35,210,211,211,107,212,71,177,186,42,141,0,37,163, + 164,226,187,190,61,15,171,228,214,100,105,80,79,187,245,110,1,84,145,180,243,104,223,190,253,155,40,35,165,244,173,188,58,173,131,101,232,210,33,0, + 139,210,247,233,22,148,244,23,45,91,21,158,193,159,149,227,245,37,214,75,145,91,60,134,28,79,42,111,42,109,1,80,232,14,101,253,169,156,133,11, + 23,174,91,180,104,209,186,242,37,28,202,14,42,95,250,97,201,146,37,58,63,231,70,25,245,95,144,78,71,139,70,110,87,17,175,254,243,55,44,159, + 189,72,173,82,228,82,40,251,211,152,255,233,189,148,85,145,40,75,231,94,216,187,120,19,40,178,169,70,173,87,61,154,74,121,239,201,78,98,110,133, + 252,165,19,241,191,63,146,105,170,76,245,81,152,66,241,86,52,168,52,39,107,144,83,8,57,96,233,196,59,242,89,71,107,114,50,107,184,193,247,73, + 75,75,59,38,149,74,57,107,214,172,105,87,88,88,248,86,130,124,117,69,41,157,77,8,97,154,251,184,127,122,235,121,124,95,125,150,11,203,171,85, + 171,86,41,81,81,81,67,206,158,61,27,250,219,111,191,117,150,201,100,238,132,16,136,197,226,120,185,92,126,94,40,20,238,51,208,201,2,0,44,90, + 180,136,46,89,178,132,68,69,69,81,134,97,126,5,16,203,48,76,92,217,36,248,178,231,181,215,44,94,188,184,162,185,150,253,65,252,141,16,18,185, + 116,233,210,182,75,151,46,109,132,146,168,208,111,213,93,50,43,117,120,126,51,49,17,39,19,66,92,248,2,161,236,250,245,235,231,107,200,44,68,73, + 164,100,237,218,181,107,191,150,72,36,205,30,63,126,252,107,77,152,165,78,84,63,107,107,107,167,221,187,119,135,255,240,195,15,45,184,92,238,77,66, + 200,128,156,156,156,191,187,169,244,120,232,215,227,176,236,127,171,84,109,23,41,125,31,142,155,70,163,41,88,176,96,193,27,150,118,110,229,163,87,218, + 127,43,149,74,189,146,243,12,220,69,89,133,227,66,10,0,160,164,119,97,73,91,29,125,155,74,3,168,176,119,166,246,115,206,225,112,34,0,60,227, + 112,56,207,203,111,116,41,251,216,146,37,75,42,253,156,27,101,212,191,93,21,46,29,210,23,135,54,1,216,68,200,18,14,165,139,106,37,147,150,198, + 134,159,71,73,18,116,173,169,182,237,164,192,183,99,155,183,159,133,146,191,10,215,150,119,178,202,42,249,10,141,112,108,77,86,52,239,212,118,58,74, + 46,88,110,232,253,116,37,200,215,84,186,18,228,13,85,64,64,128,6,64,24,128,176,242,77,165,171,105,19,37,37,191,48,90,198,209,132,132,4,39, + 141,70,147,82,238,47,217,183,206,47,94,188,88,123,173,62,247,40,4,240,11,33,228,44,165,180,122,29,5,202,169,168,168,208,21,0,8,33,76,109, + 49,41,165,175,1,124,82,155,204,204,204,204,100,0,173,188,189,189,5,49,49,49,127,253,22,195,10,84,27,209,161,247,173,218,118,220,0,64,169,84, + 214,173,109,38,165,244,89,213,163,12,2,254,216,181,77,61,6,101,107,7,85,213,84,26,0,64,10,64,241,99,5,54,150,253,156,239,126,241,226,133, + 59,203,178,241,58,162,85,111,61,166,253,156,215,120,78,70,25,245,15,84,149,117,180,106,203,201,122,223,170,45,59,127,86,40,22,1,88,84,229,192, + 82,165,92,163,95,0,248,162,38,247,172,77,39,171,12,211,96,39,43,60,188,154,237,142,244,84,185,47,210,60,0,121,58,190,91,43,58,111,200,125, + 106,125,30,255,22,230,63,201,201,50,234,159,45,154,253,56,1,192,151,85,142,171,186,26,252,219,227,255,252,240,102,3,200,174,224,179,92,217,99,70, + 25,245,159,146,65,201,1,70,25,101,148,81,70,25,101,148,81,70,233,47,2,160,179,174,7,12,217,77,64,8,209,201,168,76,85,241,141,76,35,211, + 200,52,50,141,76,35,211,200,252,239,49,171,98,151,223,189,76,107,169,61,215,223,38,237,78,152,247,113,160,100,75,190,145,105,100,26,153,70,166,145, + 105,100,26,153,70,102,117,238,51,238,175,184,207,251,60,140,75,135,70,25,101,148,81,70,25,245,47,82,23,63,226,216,195,155,56,215,22,175,135,55, + 113,174,77,114,156,189,32,0,0,32,0,73,68,65,84,158,81,111,75,175,166,210,70,253,243,68,8,241,1,48,31,64,217,94,100,183,40,165,43,202, + 141,219,11,160,108,67,66,25,128,165,148,210,231,134,220,143,97,152,21,109,219,182,157,116,245,234,213,53,42,149,106,105,53,236,117,119,116,116,252,134, + 16,18,4,128,71,8,121,145,150,150,182,66,165,82,85,187,224,29,33,164,142,131,131,195,74,0,141,57,28,14,143,16,18,147,150,150,182,76,165,82, + 149,111,247,97,8,83,106,111,111,223,154,82,234,0,128,225,241,120,153,73,73,73,191,211,106,238,158,27,176,36,138,159,39,83,243,0,192,76,194,85, + 133,47,10,80,234,123,174,186,115,48,202,40,163,254,35,34,132,41,127,170,155,23,190,38,20,51,53,0,233,86,135,108,60,19,139,153,186,46,5,0, + 232,218,112,83,142,217,205,11,95,83,90,194,232,230,77,86,159,121,81,197,230,46,61,152,90,125,15,112,198,233,211,224,252,61,108,12,250,39,169,82, + 71,107,176,31,113,212,112,193,13,127,76,19,128,146,31,33,0,141,0,248,0,120,14,224,62,165,52,191,38,6,252,83,153,127,197,220,107,168,133,148, + 210,33,101,79,232,42,129,208,177,99,199,62,103,207,158,21,107,219,179,176,44,11,19,19,19,53,128,145,250,222,136,16,98,23,26,26,58,119,231,206, + 157,24,56,112,224,2,66,200,58,74,105,129,190,215,91,89,89,245,175,83,167,206,166,29,59,118,216,182,104,209,146,8,4,2,188,120,17,227,50,126, + 252,248,64,123,123,251,136,180,180,180,79,244,101,105,101,109,109,61,212,203,203,107,237,246,237,219,109,218,180,105,3,66,8,34,35,35,93,62,251,236, + 179,70,14,14,14,251,83,83,83,39,27,202,180,177,177,241,245,242,242,234,176,121,243,102,147,214,173,91,67,36,18,225,254,253,251,166,19,38,76,112, + 112,112,112,120,146,154,154,122,217,16,222,128,37,81,252,135,145,199,63,84,43,229,171,0,128,203,23,206,110,185,46,239,120,86,228,111,189,171,58,55, + 96,9,142,26,157,45,163,140,50,170,172,134,58,193,129,82,204,58,251,227,151,28,0,232,58,250,171,169,67,157,176,102,79,50,42,236,97,107,32,111, + 230,8,103,108,218,157,132,180,154,216,249,61,192,249,140,203,157,218,60,56,216,102,202,181,107,49,74,224,167,154,240,254,237,170,208,209,234,95,143,44, + 5,23,243,1,144,30,62,100,255,185,88,230,74,151,46,93,188,199,140,25,67,154,52,105,130,200,200,72,223,253,251,247,127,192,229,114,99,52,26,77, + 36,128,63,168,158,85,173,9,33,60,0,245,25,134,9,250,39,50,223,231,220,107,81,18,0,32,132,164,1,208,22,58,125,167,224,233,133,11,23,142, + 113,185,92,109,68,171,185,76,38,179,199,219,81,48,125,228,161,82,169,240,244,233,83,112,56,28,30,0,79,188,219,82,67,167,8,33,46,46,46,46, + 91,111,220,138,180,38,92,19,100,23,3,40,86,66,96,106,143,157,187,194,172,102,76,155,220,207,204,204,236,74,94,94,222,207,250,26,67,8,241,116, + 115,115,91,247,224,193,3,107,177,88,12,150,101,145,159,159,15,7,7,7,236,216,177,195,98,198,140,25,67,76,76,76,46,21,21,21,253,207,0,166, + 212,203,203,171,195,163,71,143,76,180,13,165,21,10,5,92,92,92,176,119,239,94,225,212,169,83,235,10,133,194,68,185,92,254,82,95,102,158,76,205, + 83,43,229,171,118,111,89,236,10,0,35,38,47,94,37,200,55,59,165,207,185,60,153,250,36,0,163,163,101,212,95,42,66,72,144,141,141,205,161,140, + 140,140,203,0,62,161,181,16,105,32,132,248,138,68,162,134,44,203,58,112,56,28,48,12,147,42,147,201,30,80,74,163,171,203,180,241,238,208,27,66, + 241,40,80,182,17,7,0,225,112,238,107,148,133,187,50,158,93,60,94,35,166,192,100,52,64,27,113,0,150,112,56,15,88,117,225,142,244,168,139,6, + 23,125,126,95,186,153,11,63,47,7,253,27,99,214,6,111,112,29,56,114,88,112,246,198,65,239,50,68,159,2,61,167,77,155,230,48,121,210,36,50, + 106,228,72,159,203,87,175,146,118,134,116,43,248,143,73,167,163,53,160,30,177,4,48,103,255,166,249,28,46,195,144,208,105,43,134,252,176,101,53,167, + 75,239,1,111,150,79,66,66,66,16,18,18,66,86,173,90,229,243,235,175,191,250,236,221,187,87,77,8,121,64,41,61,80,209,205,186,123,147,34,22, + 16,125,224,207,149,133,126,249,243,246,224,224,96,8,133,66,212,132,9,0,93,125,152,151,61,131,189,31,132,126,186,48,190,69,139,86,180,38,76,237, + 220,247,109,156,207,240,184,12,66,167,173,24,114,249,204,209,162,58,117,155,228,87,151,249,158,117,139,82,218,23,0,8,33,150,110,110,110,173,213,106, + 181,8,0,184,92,110,49,128,79,105,105,235,32,66,72,4,203,178,125,244,5,19,66,56,0,22,245,233,211,103,193,148,41,83,224,230,230,134,169,83, + 167,66,165,82,69,18,66,22,2,88,73,75,179,21,43,146,157,157,221,194,173,91,183,90,113,5,18,52,153,19,139,148,28,53,0,192,84,8,28,155, + 72,49,117,234,84,179,59,119,238,44,3,160,183,163,101,103,103,183,116,199,142,29,86,98,177,24,148,210,55,189,24,11,10,10,80,80,80,128,201,147, + 39,155,61,121,242,228,27,0,122,59,90,246,246,246,173,55,111,222,108,34,18,137,80,80,80,192,87,42,149,36,63,63,31,133,133,133,84,161,80,40, + 63,253,244,83,225,31,127,252,209,30,128,222,142,150,81,239,87,164,100,185,226,35,30,143,247,177,183,183,119,211,231,207,159,223,83,171,213,135,1,28, + 174,233,31,62,132,144,78,78,78,78,95,39,39,39,111,166,148,134,213,142,197,255,124,217,219,219,31,190,126,253,186,235,214,173,91,71,174,89,179,230, + 20,12,248,12,149,23,33,132,207,231,243,251,117,233,210,197,117,196,136,17,2,123,123,123,200,229,114,196,198,198,154,29,60,120,208,93,34,145,36,150, + 118,196,208,251,15,10,27,191,214,166,224,154,237,111,217,161,115,155,129,253,62,146,218,91,155,163,72,161,193,243,248,20,183,211,167,142,181,115,10,252, + 224,186,82,153,59,56,227,217,53,189,35,238,90,102,135,238,189,218,116,238,212,73,106,110,97,142,92,153,18,47,226,146,220,47,158,59,30,226,24,248, + 193,111,44,81,13,75,123,120,246,47,111,204,94,86,83,1,174,76,100,221,176,81,171,38,119,186,142,89,214,148,82,10,14,197,198,242,209,172,169,0, + 119,35,160,54,148,7,74,41,33,88,93,54,154,245,102,89,145,3,210,205,19,149,47,83,150,170,43,32,180,176,178,10,158,48,110,28,201,207,203,195, + 253,251,247,11,219,149,115,178,214,57,131,255,27,7,30,17,9,168,182,179,253,111,146,222,201,240,98,177,88,231,121,115,115,115,116,232,208,1,43,86, + 172,224,2,8,42,251,24,45,223,100,21,16,158,216,54,15,230,18,33,199,205,205,77,106,102,102,86,99,102,201,73,214,179,149,27,237,113,251,231,249, + 35,207,239,93,91,95,150,159,195,43,63,196,212,212,20,126,126,126,88,176,96,129,94,204,178,46,254,237,179,7,124,107,131,89,83,85,198,116,116,116, + 244,15,9,9,9,186,112,249,178,69,114,114,178,48,57,57,89,120,246,194,5,139,150,45,91,6,57,58,58,250,151,97,232,205,4,240,213,150,45,91, + 22,70,68,68,112,66,66,66,96,105,105,137,14,29,58,224,212,169,83,220,53,107,214,44,7,176,160,42,59,57,28,78,155,144,144,16,2,74,145,154, + 171,198,239,43,252,113,127,117,0,242,139,41,178,114,243,80,84,84,12,177,88,44,42,93,154,213,119,238,173,90,182,108,73,0,188,113,174,242,243,75, + 142,130,2,25,20,10,37,132,66,161,148,16,34,210,151,73,41,117,104,221,186,53,0,64,169,84,190,121,249,115,114,114,72,110,110,46,20,10,5,120, + 60,30,159,16,82,233,114,123,89,166,153,132,171,226,242,133,179,71,76,94,156,48,98,242,226,4,46,95,56,91,33,205,211,232,115,206,76,194,85,233, + 98,214,150,170,98,18,66,108,25,134,249,209,219,219,251,9,195,48,187,9,33,14,53,97,18,66,154,17,66,150,139,197,226,243,117,235,214,77,144,72, + 36,23,8,33,43,9,33,45,171,195,36,132,8,196,98,241,133,229,203,151,135,223,187,119,111,224,175,191,254,234,249,240,225,195,126,171,86,173,218,111, + 106,106,122,133,16,162,251,11,171,10,59,181,242,244,244,252,225,247,223,127,111,214,170,85,171,157,132,16,97,85,227,245,97,18,66,24,66,72,99,162, + 103,175,161,191,250,117,39,132,56,53,105,210,196,85,36,18,161,115,231,206,0,208,190,38,76,62,159,223,111,193,130,5,94,95,126,249,165,32,37,37, + 5,23,46,92,192,173,91,183,160,86,171,49,113,226,68,225,136,17,35,234,72,165,210,126,6,217,201,53,219,63,237,179,233,221,103,77,29,43,125,240, + 74,137,93,231,95,225,232,141,20,188,46,20,160,119,191,17,230,221,250,14,234,38,16,154,235,108,118,95,25,115,238,156,57,221,199,141,30,34,125,156, + 194,226,216,205,84,220,124,154,11,53,207,2,61,251,125,98,217,168,117,247,15,184,224,253,100,16,179,6,170,136,185,3,104,49,109,218,52,219,217,171, + 247,92,115,106,246,209,198,244,108,132,148,117,124,124,1,11,43,137,228,163,167,237,218,141,53,41,233,23,91,41,243,45,94,80,223,77,175,179,209,182, + 108,126,86,91,43,248,148,46,43,50,103,127,252,146,67,9,166,14,117,130,67,101,76,0,184,4,12,156,54,125,58,207,220,210,18,91,182,108,129,92, + 38,123,43,103,182,147,43,186,159,23,115,19,235,4,184,60,233,224,78,174,232,255,204,252,123,245,230,71,227,228,201,147,244,131,15,62,32,0,16,254, + 152,102,247,175,71,190,25,52,101,249,2,194,33,212,163,126,171,199,206,94,245,100,214,214,214,40,44,44,132,92,46,7,159,207,71,113,113,49,94,189, + 122,133,155,55,111,194,210,210,210,160,27,231,229,229,193,212,212,20,166,166,166,181,194,156,55,178,179,240,69,66,186,240,204,205,75,237,54,76,250,95, + 11,175,198,237,31,118,26,52,245,145,153,173,83,241,195,135,15,113,253,250,117,100,103,103,35,56,56,184,82,142,118,238,131,63,93,254,37,225,16,4, + 53,12,40,86,101,61,243,95,51,185,115,61,191,38,237,31,119,26,48,229,177,161,204,247,164,91,165,223,215,183,8,33,150,33,33,33,46,103,206,255, + 102,89,80,204,154,197,165,169,120,44,203,66,44,118,84,31,56,116,44,119,96,191,222,132,16,242,26,192,173,82,231,182,210,158,138,165,14,138,127,255, + 254,253,231,78,154,52,9,49,49,49,24,59,118,108,209,173,91,183,50,91,181,106,101,189,99,199,14,147,25,51,102,224,242,229,203,139,8,33,71,0, + 196,82,74,117,246,106,163,148,242,249,124,62,212,165,110,131,82,195,66,235,223,231,229,229,129,22,101,131,207,231,51,0,108,1,232,149,243,198,178,44, + 159,199,227,189,113,178,94,165,229,225,213,235,66,228,21,40,80,84,164,134,162,136,130,17,91,115,129,56,123,0,113,250,48,1,48,34,145,8,106,181, + 26,249,249,37,102,104,35,101,10,133,2,185,185,185,96,24,198,20,128,25,128,44,125,128,37,73,238,56,90,186,12,136,219,123,250,216,60,63,57,79, + 217,127,241,147,55,231,204,36,92,213,161,25,117,25,107,151,70,87,27,15,252,41,64,123,238,239,204,207,34,132,8,109,109,109,47,134,135,135,215,245, + 241,241,65,108,108,108,192,128,1,3,130,9,33,141,169,129,61,25,9,33,98,14,135,243,205,168,81,163,38,133,134,134,18,95,95,95,112,185,92,168, + 213,106,151,152,152,152,14,7,15,30,156,195,229,114,119,104,52,154,207,245,205,251,35,132,112,4,2,193,129,237,219,183,183,13,14,14,198,238,221,187, + 113,235,214,45,182,89,179,102,156,225,195,135,195,221,221,61,120,248,240,225,71,9,33,61,171,19,217,34,132,184,15,29,58,212,149,97,24,180,106,213, + 138,127,253,250,245,38,0,174,27,202,41,199,52,117,113,113,185,220,190,125,251,198,231,207,159,191,75,8,105,111,72,158,35,33,164,175,147,147,211,42, + 115,115,115,189,191,20,243,242,242,10,147,146,146,102,82,74,15,233,121,73,139,160,160,32,196,199,199,195,223,223,31,124,62,191,37,33,100,60,128,238, + 0,190,160,148,62,49,192,94,223,30,61,122,184,182,111,223,158,28,58,116,232,77,126,40,135,195,129,90,173,6,159,207,71,139,22,45,56,145,145,145, + 206,132,16,95,125,150,17,109,188,59,244,110,213,169,123,155,182,193,13,57,107,14,61,135,134,213,128,33,106,112,9,11,86,37,132,144,207,192,183,126, + 83,230,233,31,15,130,109,252,186,244,206,120,118,174,202,101,68,27,239,14,189,187,247,238,19,82,215,223,151,179,225,232,11,228,36,61,209,36,69,253, + 150,193,97,56,168,27,212,209,198,183,94,99,166,113,112,123,94,114,236,31,29,172,124,218,117,206,122,126,185,214,29,43,125,180,4,96,92,156,109,62, + 234,213,165,61,63,37,57,89,118,240,208,241,71,133,42,220,4,128,203,0,233,9,52,108,208,188,121,187,29,43,87,90,59,58,58,242,134,133,134,170, + 191,191,123,247,238,56,64,231,210,239,18,128,177,113,112,232,60,97,194,4,38,37,57,153,30,60,124,242,161,150,7,0,98,160,65,67,151,128,94,144, + 61,53,104,153,178,55,32,176,119,112,168,59,126,252,120,164,38,39,99,119,88,88,65,49,112,3,40,137,98,29,99,176,185,158,151,195,168,217,159,244, + 33,174,142,54,152,176,232,251,150,29,148,175,189,46,226,207,200,86,89,95,228,191,162,10,255,58,63,244,152,46,52,19,16,207,131,7,247,113,210,243, + 149,178,152,152,24,216,216,216,192,209,209,17,230,230,230,120,252,248,49,46,92,184,128,103,207,158,129,101,89,52,106,212,200,160,27,103,100,100,224,193, + 131,7,176,180,180,172,53,166,151,171,45,166,184,218,242,211,50,243,248,231,111,61,11,254,126,94,191,122,156,128,126,63,20,23,255,233,3,40,20,85, + 119,40,57,244,152,46,236,238,77,190,12,91,59,69,41,177,117,200,84,49,166,249,113,169,121,138,179,103,46,57,108,153,59,208,79,80,247,195,48,67, + 153,181,173,178,187,11,221,220,220,90,239,218,181,139,47,87,67,234,59,254,198,183,178,98,141,4,0,36,34,70,22,185,202,239,243,175,190,250,74,54, + 122,244,232,128,87,175,94,173,168,152,88,34,129,64,240,117,143,30,61,102,81,74,121,211,166,77,3,0,140,24,49,34,239,230,205,155,190,148,210,215, + 132,16,167,49,99,198,68,95,188,120,81,60,125,250,116,70,173,86,63,230,114,185,148,16,178,148,82,186,184,60,143,195,225,220,185,123,247,174,135,147, + 187,31,220,173,57,8,89,80,210,174,205,90,204,34,49,238,5,162,30,222,130,131,131,131,185,163,163,227,19,127,127,127,101,82,82,210,156,130,130,130, + 173,149,217,200,231,243,239,71,70,70,58,186,187,187,163,160,160,0,137,233,133,152,122,88,140,188,162,146,32,6,15,69,104,236,234,39,53,225,40,110, + 217,219,219,43,21,10,197,151,57,57,57,149,182,17,225,241,120,153,15,31,62,52,117,115,115,67,113,113,49,205,202,202,34,50,153,12,249,249,249,228, + 228,201,147,31,166,164,164,52,243,244,244,36,46,46,46,75,125,124,124,138,146,146,146,198,234,147,3,22,190,40,64,73,8,209,112,185,220,53,227,198, + 141,27,120,228,200,145,59,135,22,215,237,171,93,46,33,132,152,215,175,95,255,76,195,134,245,156,194,86,55,216,72,41,253,182,42,230,95,160,81,243, + 231,207,175,107,101,101,133,9,19,38,96,201,146,37,88,184,112,161,207,132,9,19,198,1,88,167,47,132,16,98,226,224,224,112,123,195,134,13,1,173, + 91,183,198,169,83,167,176,111,223,62,188,124,249,82,237,233,233,201,13,14,14,198,162,69,139,208,173,91,183,177,159,126,250,105,59,66,72,19,61,157, + 143,209,139,22,45,234,219,166,77,27,140,28,57,82,126,233,210,165,129,0,206,158,59,119,174,227,229,203,151,15,237,217,179,199,100,249,242,229,157,103, + 204,152,49,1,192,166,106,204,255,195,182,109,75,122,40,183,105,211,6,171,86,173,234,134,26,56,90,132,16,129,181,181,245,201,221,187,119,55,246,243, + 243,195,176,97,195,154,12,28,56,240,36,33,164,11,165,84,175,47,15,103,103,231,111,34,34,34,188,43,90,89,208,37,185,92,110,245,209,71,31,173, + 4,96,144,163,181,119,239,94,204,156,57,19,141,26,53,106,216,162,69,139,109,227,199,143,71,255,254,253,59,17,66,236,41,165,50,125,64,34,145,168, + 225,224,193,131,5,191,255,254,59,0,160,126,253,250,104,220,184,49,226,227,227,113,231,206,29,200,229,114,216,219,219,227,227,143,63,22,197,197,197,53, + 4,170,94,66,226,8,197,163,250,246,234,41,61,118,51,5,26,86,141,166,222,102,8,14,176,195,211,196,60,68,62,73,132,70,193,135,153,149,53,90, + 182,235,106,149,154,244,114,20,128,170,243,181,132,226,81,31,247,253,192,244,216,141,100,228,36,71,209,231,183,142,92,80,21,203,198,2,192,157,95,247, + 111,115,176,54,233,226,27,212,148,105,223,165,143,229,225,125,169,163,0,252,45,142,214,101,87,108,119,231,101,140,152,61,36,132,242,44,93,110,73,85, + 170,205,218,199,186,1,93,231,204,159,223,226,147,113,227,68,44,203,98,207,207,63,231,61,184,123,247,105,101,187,253,54,3,238,3,251,246,21,74,205, + 204,240,217,212,169,144,170,84,23,181,143,9,129,78,159,205,154,213,122,242,228,201,38,219,150,78,186,211,109,204,178,32,150,82,162,107,153,178,188,206, + 3,205,198,244,237,11,169,153,25,166,77,155,6,162,84,158,209,62,118,130,139,139,163,63,12,9,30,210,187,13,8,8,246,157,184,138,231,241,233,15, + 47,166,224,69,77,159,159,127,186,42,93,6,201,87,34,173,211,7,253,112,247,238,93,0,64,102,102,38,50,51,51,225,237,237,141,77,155,222,254,254, + 170,142,179,193,178,108,173,51,1,192,222,218,12,195,122,54,231,94,125,176,79,36,75,79,23,153,154,154,190,241,138,244,101,178,0,172,29,29,20,114, + 53,225,179,132,171,118,116,117,41,238,57,120,88,246,170,57,211,155,231,85,147,249,190,164,86,171,69,158,158,158,200,43,2,201,45,84,153,102,236,47, + 137,248,219,12,190,100,170,80,40,56,166,166,166,144,203,229,149,46,163,1,37,27,10,250,246,237,59,235,192,129,3,188,168,168,40,120,121,121,65,169, + 84,226,230,205,155,137,180,164,17,50,40,165,201,12,195,36,179,44,235,211,168,81,35,172,88,177,2,1,1,1,164,103,207,158,115,74,157,173,183,62, + 220,41,41,41,223,140,31,63,190,227,193,67,71,172,182,15,42,66,94,110,30,10,10,10,112,255,222,29,100,165,21,227,251,239,191,135,72,100,66,0, + 240,95,191,78,227,79,159,62,125,163,139,139,75,247,196,196,196,94,21,217,153,156,156,252,245,228,201,147,91,238,223,191,223,34,63,63,31,69,69,197, + 200,146,137,241,100,125,73,31,223,186,159,61,193,150,205,91,57,13,60,36,54,133,133,133,152,52,105,210,90,39,39,167,214,201,201,201,99,42,98,38, + 37,37,253,62,101,202,20,251,61,123,246,136,20,10,133,82,163,209,160,168,168,136,179,127,255,254,57,30,30,30,150,59,118,236,32,34,145,73,233,216, + 68,254,196,137,19,15,56,56,56,236,73,77,77,29,89,197,115,202,48,12,179,62,44,44,108,248,160,65,131,164,41,41,41,245,34,34,34,132,0,138, + 74,135,56,118,233,210,197,99,245,234,213,182,245,235,215,159,67,8,225,81,74,13,110,78,94,155,178,177,177,249,180,111,223,190,88,185,114,37,142,31, + 63,62,195,202,202,106,237,146,37,75,224,228,228,52,133,16,178,190,170,188,188,50,250,118,221,186,117,1,1,1,1,24,49,98,132,226,252,249,243,243, + 1,28,5,16,127,229,202,21,183,159,126,250,169,247,129,3,7,86,110,216,176,65,180,105,211,38,239,126,253,250,173,7,80,225,107,164,149,189,189,253, + 244,208,208,80,172,94,189,26,151,46,93,234,71,41,61,85,250,208,47,132,144,222,203,151,47,255,117,193,130,5,88,183,110,221,52,24,232,104,17,66, + 76,235,214,173,251,101,247,238,221,113,229,202,21,132,132,132,160,101,203,150,51,8,33,27,41,165,25,134,176,74,121,28,83,83,211,3,187,118,237,10, + 241,240,240,192,178,101,203,48,107,214,44,252,240,195,15,33,195,134,13,59,64,8,249,184,252,103,70,151,204,205,205,77,197,98,49,230,204,153,67,95, + 190,124,153,93,213,120,87,87,87,203,181,107,215,18,75,75,75,189,54,190,16,66,76,68,34,81,171,192,192,64,44,90,180,8,231,206,157,195,130,5, + 11,16,24,24,136,248,248,120,12,30,60,88,252,197,23,95,244,7,160,111,223,67,59,91,91,91,68,71,151,248,79,129,129,129,184,119,239,30,212,106, + 53,92,92,92,240,234,213,43,4,5,5,129,203,229,130,101,89,59,253,144,52,208,198,202,28,175,255,72,2,23,106,4,249,218,224,226,163,76,40,85, + 44,236,172,45,144,250,58,13,45,2,93,160,80,184,129,82,54,80,31,162,128,225,4,9,69,38,200,202,207,64,210,147,75,153,74,141,124,124,206,203, + 171,9,0,96,229,213,118,252,157,171,231,238,12,248,160,173,93,129,204,21,132,178,205,245,156,123,173,106,128,27,92,37,34,238,136,19,219,231,17,53, + 203,162,199,152,175,155,117,183,71,33,210,0,91,192,115,192,224,193,173,62,255,252,115,65,116,76,12,59,125,234,212,156,123,183,111,95,58,13,220,169, + 140,89,0,248,116,233,210,5,28,0,167,207,158,149,101,0,137,0,96,15,184,246,249,232,163,182,243,231,206,21,188,136,139,99,111,198,20,28,123,241, + 154,174,104,101,133,7,251,227,75,198,84,38,13,208,64,203,61,115,230,12,45,42,181,163,189,43,166,116,107,93,63,120,120,223,182,72,76,205,196,170, + 157,199,240,48,58,229,140,53,139,161,181,240,20,253,227,85,101,142,150,174,239,212,194,194,119,87,15,106,234,108,188,15,166,46,25,196,20,74,139,8, + 143,203,161,132,203,106,40,87,77,9,97,117,237,155,248,187,29,45,173,84,170,146,85,18,133,138,133,66,85,242,221,45,151,203,81,84,84,84,217,101, + 111,68,41,85,157,57,115,102,247,212,169,83,177,118,237,90,68,71,71,131,207,231,35,48,48,208,145,16,98,10,148,68,96,130,130,130,236,56,28,14, + 158,62,125,138,53,107,214,96,244,232,209,244,250,245,235,63,232,250,193,160,148,222,203,202,202,218,60,126,236,232,156,236,180,87,80,21,101,227,117,210, + 11,200,101,57,88,182,226,27,20,170,184,72,205,85,34,53,87,9,142,208,10,219,118,236,98,234,214,173,219,157,203,229,86,232,104,81,74,111,166,165, + 165,237,152,56,113,98,78,106,106,234,155,249,41,84,20,10,213,219,47,144,88,44,198,250,245,235,205,125,125,125,251,242,120,188,14,149,48,83,18,18, + 18,162,38,78,156,168,72,75,75,67,110,110,46,142,29,59,214,219,195,195,195,114,229,183,107,137,76,201,69,106,142,18,169,57,74,8,76,237,112,224, + 208,17,198,207,207,111,8,143,199,171,48,199,72,235,100,237,217,179,103,248,160,65,131,164,223,126,251,109,86,68,68,196,22,74,105,217,23,228,233,250, + 245,235,15,30,56,112,32,127,214,172,89,86,171,86,173,154,65,8,153,95,225,139,244,158,69,8,233,48,104,208,32,127,150,101,17,30,30,254,144,82, + 186,238,200,145,35,183,229,114,57,6,15,30,236,137,146,101,36,125,56,205,134,12,25,50,41,36,36,4,159,125,246,153,242,252,249,243,65,148,210,181, + 148,210,56,90,162,120,74,233,198,203,151,47,55,250,244,211,79,229,205,155,55,199,200,145,35,71,19,66,66,170,224,182,10,13,13,13,96,89,22,251, + 247,239,127,80,198,201,2,0,80,74,47,28,58,116,232,166,66,161,192,208,161,67,235,16,66,58,26,48,119,190,80,40,12,255,234,171,175,44,146,146, + 146,48,124,248,112,249,211,167,79,177,120,241,98,19,115,115,243,83,218,207,128,33,18,10,133,223,127,247,221,119,125,27,52,104,128,137,19,39,42,182, + 110,221,58,117,210,164,73,138,160,160,32,108,217,178,165,175,64,32,48,168,181,72,114,114,114,206,227,199,143,173,171,58,18,19,19,245,218,158,79,8, + 17,75,165,210,27,245,235,215,207,11,12,12,108,170,86,171,241,248,241,227,23,187,119,239,102,3,3,3,177,121,243,102,172,90,181,10,189,122,245,2, + 195,48,253,245,181,147,97,24,40,149,74,136,197,98,112,185,92,188,120,241,66,91,90,6,124,62,31,0,32,145,72,96,98,98,2,14,135,163,151,227, + 78,8,104,94,161,10,60,30,7,92,14,139,168,248,92,40,85,44,68,124,6,60,46,1,40,11,11,9,15,34,1,3,14,33,85,215,110,42,97,34, + 87,166,132,128,207,1,143,47,32,28,181,198,68,251,24,135,171,49,49,49,17,16,27,51,33,68,252,127,80,109,111,82,242,43,52,10,224,73,220,220, + 6,174,94,179,70,144,87,80,128,126,253,250,101,197,221,190,29,86,4,220,110,87,197,14,63,14,151,235,219,190,93,59,68,222,189,139,252,236,236,231, + 64,73,114,188,192,201,105,208,250,245,235,5,69,197,197,232,247,241,199,57,209,87,175,238,73,40,192,137,253,122,56,89,0,192,240,249,14,90,110,110, + 118,118,54,80,82,66,194,222,214,116,229,228,33,221,144,95,88,140,217,223,132,177,119,163,82,166,92,73,196,7,71,146,145,91,179,39,227,223,161,42, + 11,150,178,236,187,239,87,93,142,133,92,46,175,145,33,239,131,169,203,73,52,132,73,69,210,2,150,37,92,134,80,1,171,225,41,53,26,86,83,83, + 230,251,16,151,203,45,126,246,236,153,192,204,218,137,181,150,242,178,61,70,95,53,7,0,43,83,110,174,82,163,98,147,147,147,33,20,10,117,230,80, + 149,87,113,113,241,88,66,200,50,0,245,184,92,238,137,93,187,118,145,176,176,48,203,208,208,208,24,66,72,82,253,250,245,221,119,237,218,101,6,0, + 27,55,110,164,7,14,28,232,134,146,242,22,21,134,148,83,83,83,23,243,120,188,235,147,39,79,222,36,16,8,44,37,18,137,245,149,43,87,72,177, + 146,162,217,252,248,55,59,17,205,76,56,248,109,158,25,198,141,27,199,60,121,242,100,5,128,19,149,48,231,8,133,194,43,209,209,209,107,205,93,26, + 219,74,220,231,155,7,207,123,10,0,112,183,225,129,83,250,189,152,147,147,131,244,244,116,76,154,52,201,50,38,38,102,14,128,139,21,49,19,19,19, + 47,11,133,194,196,63,254,248,163,61,143,199,19,72,36,146,102,55,110,220,32,197,10,22,13,231,196,35,171,160,196,78,43,83,46,238,124,101,143,41, + 83,166,112,159,63,127,254,13,128,54,186,120,28,14,103,85,89,39,107,246,236,217,247,1,212,33,132,188,181,52,170,209,104,200,208,161,67,31,1,8, + 156,53,107,150,21,165,116,6,33,36,139,82,186,189,34,91,223,151,204,204,204,86,142,31,63,30,7,14,28,64,118,118,246,122,0,200,203,203,91,183, + 119,239,222,253,99,199,142,197,207,63,255,188,146,16,114,90,143,168,86,143,193,131,7,227,151,95,126,193,175,191,254,250,37,165,244,177,174,65,148,210, + 104,66,200,156,136,136,136,13,161,161,161,248,241,199,31,187,3,168,44,65,182,75,183,110,221,112,234,212,41,100,102,102,110,209,53,32,39,39,103,235, + 177,99,199,90,116,235,214,13,43,86,172,232,2,224,66,85,243,38,132,4,152,155,155,239,218,176,97,67,179,6,13,26,96,200,144,33,197,74,165,178, + 251,172,89,179,142,239,219,183,79,186,123,247,238,166,227,198,141,251,157,16,242,9,165,244,102,85,60,0,96,24,102,249,166,77,155,198,180,111,223,30, + 51,102,204,80,159,57,115,166,15,165,244,44,33,36,102,246,236,217,39,215,172,89,195,172,94,189,122,12,195,48,233,26,141,230,239,114,174,191,218,184, + 113,99,139,174,93,187,226,197,139,23,184,121,243,38,148,74,229,207,55,110,220,248,205,199,199,231,43,133,66,113,92,34,145,12,151,74,165,129,141,27, + 55,238,72,8,17,235,153,167,151,22,27,27,107,97,110,110,14,181,90,141,135,15,31,194,205,205,13,74,165,18,47,95,190,68,131,6,13,192,231,243, + 145,150,150,6,0,175,245,49,148,16,206,195,152,184,228,58,86,82,9,160,17,225,222,211,68,216,218,88,66,67,56,72,77,77,65,99,127,23,16,66, + 144,147,153,10,66,200,35,125,152,26,202,70,190,74,126,237,108,45,21,162,65,139,174,214,55,78,167,135,153,123,181,25,199,101,8,35,20,153,109,31, + 51,114,164,13,203,82,228,100,166,129,203,225,84,154,219,250,190,20,254,10,9,237,188,68,247,186,142,89,214,152,80,208,34,37,118,255,152,134,108,49, + 208,120,227,23,95,88,88,219,216,96,200,144,33,108,102,82,210,249,66,64,175,194,202,117,124,124,236,77,165,82,92,187,118,13,12,16,11,0,63,0, + 1,171,102,207,182,182,115,112,192,232,49,99,216,180,87,175,46,20,1,201,134,216,90,199,203,139,167,229,114,74,185,41,12,166,206,234,19,34,148,152, + 8,177,124,219,17,36,100,200,246,223,72,193,54,195,159,137,127,175,222,184,233,21,37,159,149,36,85,191,157,23,80,222,177,16,137,68,111,162,41,250, + 170,108,9,134,218,98,86,37,67,153,44,223,50,87,35,144,230,107,24,190,154,114,56,84,5,174,178,252,175,203,251,176,83,31,17,66,230,17,66,34, + 8,33,243,18,18,18,162,198,140,25,163,84,43,229,249,215,151,213,153,123,119,133,199,196,27,139,29,39,30,157,106,62,183,48,55,43,127,227,198,141, + 170,132,132,132,168,178,215,84,198,166,148,190,162,148,158,250,233,167,159,182,134,135,135,35,48,48,16,143,31,63,182,147,201,100,77,30,61,122,100,21, + 16,16,128,176,176,48,28,56,112,96,45,165,244,92,101,78,150,86,42,149,234,124,74,74,138,95,124,124,188,183,133,133,133,202,194,194,2,229,119,34, + 230,21,177,200,204,201,133,149,149,53,204,204,204,60,171,98,202,229,242,83,41,41,41,190,172,165,127,91,223,140,245,185,145,203,93,17,185,220,21,167, + 230,56,193,209,66,128,236,236,108,164,167,167,35,61,61,29,132,16,168,84,170,186,122,48,95,38,39,39,239,124,245,234,85,132,189,189,61,164,82,41, + 40,128,212,28,21,238,175,14,192,253,213,1,72,205,81,33,47,63,31,30,30,30,144,74,165,58,151,40,8,33,28,103,103,231,158,131,6,13,146,2, + 64,169,3,213,137,82,58,81,199,49,65,173,86,183,214,142,157,57,115,166,21,128,110,85,217,90,155,42,221,17,55,121,236,216,177,77,69,34,17,54, + 111,222,252,18,192,158,210,135,195,183,110,221,250,20,0,166,78,157,90,31,192,12,82,65,37,104,173,248,124,126,80,221,186,117,113,227,198,13,0,56, + 82,197,237,15,93,191,126,29,62,62,62,16,137,68,205,170,24,235,233,234,234,138,167,79,159,2,192,189,10,198,220,123,250,244,41,92,93,93,65,8, + 169,242,125,68,8,233,219,181,107,215,135,23,47,94,108,214,170,85,43,140,25,51,70,241,251,239,191,247,164,148,254,118,239,222,189,14,67,135,14,149, + 249,250,250,226,242,229,203,1,67,135,14,189,206,48,204,50,61,152,163,151,46,93,58,239,195,15,63,196,210,165,75,233,193,131,7,135,80,74,207,2, + 0,165,244,204,254,253,251,135,127,253,245,215,244,227,143,63,198,146,37,75,230,17,66,38,86,198,147,201,100,185,26,141,6,50,153,76,175,240,185,190, + 227,109,108,108,122,116,237,218,21,11,22,44,128,179,179,51,142,31,63,78,1,156,160,148,94,145,203,229,109,41,165,107,100,50,89,196,141,27,55,208, + 165,75,23,62,128,15,244,188,255,195,189,123,247,202,205,205,205,225,238,238,142,58,117,234,32,53,53,21,113,113,113,104,208,160,1,130,130,130,160,86, + 171,177,115,231,206,226,252,252,124,189,106,242,169,21,178,221,231,78,30,206,181,150,10,225,98,103,14,15,103,43,20,228,100,32,61,53,25,65,117,221, + 208,46,200,3,25,185,10,156,57,113,56,59,63,191,112,183,62,76,149,188,112,215,249,211,199,115,45,165,124,248,249,215,199,208,49,83,27,55,110,18, + 124,174,121,243,214,103,190,93,185,188,97,167,150,117,73,98,70,49,126,57,113,36,59,55,47,79,223,101,211,90,213,18,128,41,54,247,253,109,75,68, + 228,206,122,221,199,238,140,74,196,122,0,80,49,76,64,207,30,61,144,152,152,136,195,225,225,41,133,192,3,125,121,38,38,38,28,0,200,205,205,133, + 176,164,91,8,212,128,255,7,31,124,128,244,140,12,236,221,179,39,253,23,224,174,33,118,246,6,4,98,147,146,128,96,110,110,46,8,144,7,0,132, + 139,158,205,3,125,144,158,149,135,139,183,162,10,60,138,48,169,50,206,127,45,17,30,168,122,233,48,99,198,140,25,16,10,133,112,116,116,124,227,28, + 105,29,11,129,64,0,71,71,71,168,213,106,236,223,191,31,0,42,205,97,224,0,242,62,19,87,176,114,21,45,228,241,120,181,194,4,0,14,135,35, + 239,55,251,71,246,244,117,221,155,98,170,197,36,164,104,192,7,3,27,156,62,125,69,196,21,89,231,113,5,124,162,80,19,165,54,76,86,29,102,45, + 171,121,105,77,172,230,148,210,236,184,184,184,196,129,253,250,228,198,199,252,145,42,203,73,78,201,203,76,72,73,120,249,40,117,254,156,25,185,137,137, + 137,9,165,181,180,154,39,39,39,247,1,160,111,174,193,140,129,3,7,126,55,118,236,88,122,255,254,125,0,64,100,100,36,70,142,28,73,135,15,31, + 190,30,192,220,106,216,45,43,42,42,122,203,95,85,106,216,55,75,126,121,121,121,72,78,78,134,66,161,208,219,123,141,62,179,250,89,86,220,29,85, + 125,119,9,234,187,75,16,224,42,6,81,23,188,113,178,210,211,211,181,127,57,235,21,213,43,85,158,92,46,127,203,206,178,75,147,121,121,121,72,77, + 77,133,70,163,209,249,67,70,41,101,147,146,146,206,28,56,112,32,31,0,190,253,246,219,44,66,200,175,132,144,239,116,28,219,184,92,238,53,237,216, + 213,171,87,103,1,56,165,139,251,62,68,8,249,176,65,131,6,217,243,230,205,219,60,109,218,52,108,219,182,13,41,41,41,115,41,165,106,237,92,50, + 50,50,102,111,217,178,5,163,70,141,194,194,133,11,87,55,105,210,36,143,16,82,97,126,133,173,173,173,11,151,203,197,221,187,119,243,40,165,149,38, + 187,82,74,83,239,222,189,155,70,8,129,163,163,163,87,101,99,173,172,172,188,165,82,41,146,146,146,128,210,191,152,117,40,46,57,57,153,10,4,2, + 56,57,57,249,84,49,125,88,90,90,206,222,185,115,39,247,143,63,254,64,167,78,157,18,47,95,190,220,133,82,122,169,212,182,187,145,145,145,33,29, + 58,116,120,118,238,220,57,124,243,205,55,164,81,163,70,149,58,69,0,224,238,238,62,97,244,232,209,216,180,105,19,182,111,223,62,145,82,26,94,110, + 206,251,182,108,217,50,117,251,246,237,24,51,102,12,60,61,61,43,205,85,137,143,143,159,211,190,125,251,200,232,232,104,189,58,30,232,51,158,16,210, + 33,56,56,216,187,168,168,244,197,234,60,0,0,32,0,73,68,65,84,8,187,118,237,122,225,237,237,125,59,60,60,124,6,165,180,252,15,246,209,195, + 135,15,99,216,176,97,104,212,168,209,46,66,72,104,85,247,167,148,70,63,121,242,36,225,194,133,11,44,159,207,135,187,187,59,122,245,234,133,33,67, + 134,160,97,195,134,80,42,149,56,124,248,48,251,232,209,163,68,185,92,174,87,45,165,140,103,23,143,199,198,62,187,118,247,247,223,84,92,134,3,55, + 71,43,124,212,185,49,62,233,223,26,65,1,206,136,127,93,132,11,23,206,169,98,99,95,220,208,103,199,161,150,25,245,248,193,245,63,238,94,85,243, + 184,4,1,254,190,88,48,127,182,229,215,139,230,88,248,122,185,225,193,203,92,156,59,251,139,42,57,49,225,226,223,181,227,240,50,192,55,21,18,9, + 195,225,64,195,17,202,152,210,66,198,129,245,234,249,217,59,56,224,228,201,147,224,0,122,239,8,189,12,240,77,77,75,86,193,11,10,10,160,229,121, + 251,251,251,187,185,187,227,212,201,147,96,88,246,73,59,3,11,140,62,5,196,101,185,4,40,158,228,10,169,183,171,157,191,165,185,4,191,63,120,14, + 185,138,222,218,147,141,191,181,30,217,223,161,170,150,14,191,221,182,109,91,243,157,59,119,118,153,49,99,134,233,136,17,35,32,18,137,80,88,88,8, + 23,23,23,104,52,26,156,62,125,26,119,238,220,41,96,89,246,28,202,149,13,32,132,116,46,91,107,227,116,12,53,41,41,130,89,216,60,98,192,128, + 90,97,2,128,233,115,214,44,211,67,17,182,49,252,234,199,123,207,220,37,159,133,182,227,4,249,187,2,0,236,237,237,97,102,102,102,56,51,134,90, + 100,122,20,134,253,184,117,231,71,135,246,132,59,15,159,252,233,125,39,255,86,153,0,169,54,179,166,42,207,44,187,172,155,146,146,242,148,16,242,122, + 236,216,177,1,218,196,119,161,80,88,156,144,144,16,85,234,100,189,115,77,85,118,150,238,140,155,68,8,57,150,155,155,123,102,214,172,89,248,250,235, + 175,113,252,248,241,16,74,233,53,125,237,44,199,212,120,122,122,230,220,186,117,203,222,167,110,19,212,177,227,161,237,151,209,160,148,194,90,76,145,159, + 147,133,123,247,238,34,63,63,255,119,67,236,116,114,114,202,121,253,250,181,141,157,157,29,178,178,178,144,145,145,241,198,201,202,206,206,70,86,86,22, + 37,228,237,154,45,85,48,101,222,222,222,133,81,81,81,2,123,87,31,120,217,241,17,60,255,41,64,41,220,172,56,200,207,203,193,141,27,55,144,155, + 155,123,169,34,38,203,178,159,15,29,58,148,1,48,124,214,172,89,86,0,26,205,158,61,251,92,249,157,133,60,30,111,93,88,88,88,160,118,137,113, + 206,156,57,107,41,165,59,245,177,179,186,42,203,180,182,182,254,252,228,201,147,82,165,82,137,141,27,55,98,237,218,181,63,80,74,223,218,81,73,41, + 61,201,48,204,22,14,135,51,121,202,148,41,24,63,126,188,184,105,211,166,51,240,103,212,235,45,102,82,82,210,130,160,160,160,133,175,95,191,214,43, + 177,63,58,58,122,92,80,80,208,130,215,175,95,175,170,200,78,0,144,72,36,18,141,70,131,216,216,216,108,74,169,206,252,14,74,105,177,175,175,111, + 146,70,163,113,17,139,197,86,149,205,29,0,178,179,179,151,55,109,218,116,113,90,90,218,89,0,203,202,151,42,161,148,222,39,132,212,159,54,109,218, + 167,43,87,174,252,56,53,53,245,157,58,77,229,153,241,241,241,203,59,116,232,240,229,179,103,207,126,170,104,9,152,82,186,153,16,162,12,11,11,155, + 24,27,27,251,206,142,224,178,76,74,233,9,84,178,148,174,131,173,115,124,89,38,195,48,179,87,174,92,201,217,182,109,27,40,165,171,213,106,117,69, + 118,62,96,24,102,119,235,214,173,71,132,135,135,139,234,215,175,63,30,192,190,138,230,174,85,97,97,225,225,240,240,240,143,31,60,120,224,50,98,196, + 8,145,159,159,31,148,74,37,82,82,82,176,109,219,182,226,71,143,30,37,230,228,228,28,214,117,207,138,152,106,69,94,232,245,11,17,251,226,162,31, + 181,108,223,189,175,165,66,233,2,97,38,131,156,204,84,156,62,113,56,59,54,246,197,141,194,194,28,157,142,96,69,76,165,60,119,240,141,139,199,246, + 39,198,70,181,104,219,161,167,101,177,194,29,66,62,7,153,105,73,56,125,50,34,43,54,246,229,149,98,149,124,164,33,204,154,168,60,147,241,196,50, + 38,245,206,216,9,189,27,195,196,210,229,30,15,216,216,26,48,177,177,183,231,3,64,116,116,52,76,129,120,125,153,105,128,192,167,116,149,170,176,176, + 16,60,64,49,10,224,217,218,218,154,0,192,179,103,207,32,6,94,25,106,103,1,32,17,151,225,114,128,194,76,46,156,189,205,36,4,0,18,83,51, + 161,80,161,194,223,141,255,178,170,42,190,200,2,184,73,8,185,187,106,213,170,182,223,125,247,93,187,233,211,167,11,122,244,232,129,219,183,111,227,252, + 249,243,10,185,92,126,25,192,111,84,207,234,190,239,131,25,94,50,110,96,115,103,98,165,100,139,142,44,248,238,151,54,30,14,22,84,173,97,201,163, + 71,143,112,253,250,245,26,49,21,170,188,195,155,151,47,107,99,34,49,243,19,50,213,103,214,182,74,131,107,205,9,33,17,165,167,110,149,47,225,80, + 186,92,168,141,96,53,215,149,115,167,135,238,113,185,92,234,239,239,79,74,219,211,232,204,183,209,87,169,169,169,67,230,204,153,115,246,224,161,35,220, + 195,83,76,144,155,147,139,188,188,60,228,228,230,32,51,45,25,23,46,92,80,166,167,167,143,55,132,153,158,158,62,41,52,52,244,224,190,125,251,172, + 178,179,179,223,56,90,217,217,217,96,89,22,63,252,240,67,122,90,90,90,229,205,82,203,41,37,37,101,204,172,89,179,14,237,221,127,136,123,110,174, + 37,10,180,213,231,101,185,200,124,157,130,227,199,143,203,51,50,50,166,85,116,61,165,84,67,8,249,108,232,208,161,64,169,179,117,227,198,141,169,132, + 144,205,218,31,115,66,72,157,207,63,255,60,180,76,30,215,218,191,122,215,97,102,102,230,215,45,90,180,88,155,158,158,254,82,169,84,134,83,74,117, + 86,233,215,104,52,83,8,33,215,55,111,222,60,216,198,198,198,62,53,53,117,101,69,204,218,114,12,202,235,213,171,87,243,130,130,130,230,191,126,253, + 186,194,123,3,192,243,231,207,39,151,142,91,85,217,184,210,123,159,4,112,178,138,49,106,148,148,182,208,171,188,5,165,52,2,64,132,30,227,190,7, + 96,80,66,124,109,73,163,209,124,219,160,65,3,145,90,173,62,87,85,62,32,203,178,227,166,79,159,158,56,115,230,204,198,26,141,70,223,231,64,9, + 96,63,33,196,247,213,171,87,13,53,26,141,3,0,240,120,188,212,220,220,220,7,250,70,178,202,170,180,226,123,47,27,191,46,189,195,127,218,52,138, + 178,154,70,132,16,48,28,230,126,126,65,225,46,125,35,89,58,152,31,216,248,117,233,157,150,20,63,154,178,154,70,0,97,185,92,206,131,252,130,194, + 29,233,81,231,254,182,22,60,35,156,97,207,16,76,57,251,227,151,4,0,186,140,254,170,177,135,5,76,213,57,200,65,233,119,121,74,74,10,44,129, + 42,119,162,106,37,6,212,202,210,156,232,236,172,44,136,129,162,20,128,41,205,187,36,105,169,169,48,53,128,167,21,15,80,150,227,230,2,16,106,211, + 57,179,242,100,128,254,117,13,255,91,162,148,234,125,160,164,191,222,71,0,86,148,254,87,82,197,248,206,127,7,179,133,35,252,58,123,147,168,158,254, + 220,44,0,253,107,139,217,193,19,143,59,213,193,235,218,98,26,122,148,101,2,248,73,161,80,208,226,226,98,90,88,88,72,11,10,10,40,128,8,29, + 215,68,36,39,39,211,196,196,68,250,234,213,43,26,23,23,71,1,236,49,212,78,51,51,179,157,3,6,12,208,240,120,188,77,134,216,89,209,97,101, + 101,181,34,56,56,88,185,97,195,6,122,244,232,81,186,99,199,14,58,101,202,20,26,24,24,40,183,176,176,8,173,14,211,193,193,97,129,191,191,127, + 230,15,63,252,64,247,236,217,67,215,175,95,79,191,248,226,11,141,139,139,75,170,84,42,237,86,29,166,157,157,221,247,109,218,180,81,126,255,253,247, + 244,220,185,115,116,239,222,189,244,243,207,63,167,1,1,1,114,137,68,210,79,31,38,0,134,203,229,174,153,48,97,66,170,147,147,211,201,114,143,137, + 235,213,171,119,123,232,208,161,201,0,230,252,29,239,37,35,211,200,52,50,255,153,204,225,206,112,234,82,7,106,250,219,151,148,254,246,37,237,92,7, + 236,16,39,56,83,128,17,243,249,131,219,133,132,172,230,3,131,41,192,232,60,116,217,9,48,34,134,233,223,58,56,120,53,31,8,213,142,21,49,76, + 255,118,33,33,171,121,12,51,172,66,94,37,76,10,48,124,46,119,78,235,150,45,215,112,129,249,218,115,29,235,144,39,159,119,119,165,33,238,228,249, + 48,59,136,43,99,86,240,124,140,171,237,231,248,175,62,170,251,70,224,214,246,155,240,255,51,211,128,123,151,117,180,124,80,178,108,19,81,230,152,167, + 227,154,121,229,198,252,4,192,167,154,115,55,169,205,185,3,104,96,99,99,243,139,143,143,79,186,135,135,71,178,165,165,229,62,0,46,53,100,214,119, + 112,112,248,217,222,222,62,218,209,209,241,129,141,141,205,58,0,182,53,97,242,120,188,96,123,123,251,75,158,158,158,57,238,238,238,105,54,54,54,251, + 1,216,27,202,4,224,8,29,95,42,0,248,0,28,255,174,247,146,145,105,100,26,153,255,80,38,192,116,245,194,202,46,117,160,238,82,7,154,174,158, + 88,87,214,65,233,5,152,84,215,41,26,9,8,203,143,175,146,87,5,147,2,76,43,192,180,252,53,61,93,80,79,31,102,5,207,199,191,222,209,170, + 178,188,131,46,209,210,36,217,218,212,255,103,102,117,68,41,125,14,84,93,236,141,150,169,32,95,11,247,212,175,32,151,254,188,135,0,122,212,50,243, + 15,0,195,107,147,169,84,42,127,135,158,125,223,42,19,165,84,231,214,107,90,178,196,162,215,182,108,163,140,50,234,255,145,40,213,156,1,230,118,241, + 35,27,185,26,112,126,121,65,147,202,62,124,252,207,194,199,6,49,1,96,151,142,246,60,213,226,149,97,2,192,53,224,157,238,14,39,107,152,110,242, + 111,87,181,28,45,163,140,50,202,40,163,140,50,234,175,209,185,103,186,255,72,51,234,223,33,2,160,179,174,7,168,1,59,41,8,33,58,25,149,169, + 42,190,145,105,100,26,153,70,166,145,105,100,26,153,255,61,102,25,118,69,27,43,158,150,227,253,45,27,70,106,77,239,115,93,18,255,198,53,113,35, + 211,200,52,50,141,76,35,211,200,52,50,255,114,230,127,245,248,7,53,112,50,234,255,131,90,186,144,42,155,91,27,101,148,81,70,25,101,212,127,69, + 198,28,173,191,88,132,144,166,0,98,104,5,197,22,75,91,134,72,1,60,161,148,86,187,183,15,145,250,91,129,193,187,77,112,121,140,156,166,63,214, + 171,225,172,222,247,17,16,62,205,136,170,180,13,79,71,111,82,135,207,112,183,55,244,180,108,215,195,135,115,53,171,136,249,42,189,144,171,179,178,183, + 146,97,133,57,66,165,172,40,233,237,196,207,26,217,73,8,3,107,127,219,170,236,36,222,222,2,168,213,37,45,32,184,92,74,99,98,42,108,97,66, + 8,225,192,205,205,142,198,199,87,193,36,2,168,81,202,4,165,49,180,82,166,216,29,182,178,56,90,123,175,17,33,140,187,187,216,38,46,78,86,171, + 76,127,55,216,70,197,87,221,126,201,16,166,187,141,216,38,46,189,246,236,244,151,18,43,185,21,10,227,226,104,173,53,36,109,79,218,115,227,197,241, + 214,113,178,184,90,124,62,131,120,176,46,178,174,234,253,105,48,211,70,110,85,171,159,119,66,184,98,177,216,90,38,171,197,247,146,149,183,20,28,158, + 184,86,231,110,223,64,12,153,165,41,149,93,170,53,59,141,50,170,186,50,56,162,69,8,9,17,137,68,99,106,211,136,32,39,210,184,189,55,183,86, + 153,255,68,49,12,179,105,216,176,97,183,135,13,27,150,65,8,153,80,254,113,66,200,144,22,45,90,68,135,134,134,222,7,176,163,186,247,33,86,254, + 75,108,157,29,95,251,212,173,31,87,254,112,113,114,77,37,22,254,107,107,52,17,0,132,212,227,19,75,191,159,157,60,61,210,93,156,221,83,136,165, + 255,198,202,198,51,44,190,248,121,213,156,142,43,191,152,201,108,27,237,221,206,194,132,189,224,109,203,198,105,143,58,182,108,156,137,165,42,78,105,174, + 136,19,186,139,159,122,249,184,36,154,185,145,74,153,122,219,106,30,208,88,224,208,40,74,31,59,33,87,70,139,45,173,139,197,86,54,197,80,170,178, + 136,155,91,71,157,76,39,79,95,129,143,239,93,23,15,207,20,226,230,86,41,83,170,68,180,179,181,184,216,197,70,92,108,166,66,150,185,27,209,201, + 52,119,37,117,108,125,248,55,61,61,92,82,205,220,73,165,175,145,183,55,17,120,120,16,161,183,55,17,84,54,206,201,67,224,231,230,45,125,230,226, + 233,152,234,236,110,162,23,83,123,84,196,246,113,39,254,245,125,120,207,220,189,93,82,252,61,107,231,53,170,99,35,244,241,178,147,60,171,227,100,155, + 234,97,35,172,241,251,19,0,252,108,152,165,246,174,54,175,173,88,113,178,159,57,241,168,13,166,135,192,163,79,134,121,70,170,151,147,87,170,135,208, + 163,86,236,36,150,126,129,124,7,205,11,87,23,143,170,223,159,250,50,205,3,26,11,29,232,139,218,250,188,3,128,137,137,73,51,51,51,179,103,38, + 38,38,169,18,137,164,218,76,34,241,180,35,86,254,99,137,149,255,143,196,50,32,202,222,209,35,183,54,230,78,136,189,88,96,234,189,132,43,13,188, + 99,109,234,146,235,226,229,152,74,204,90,215,202,220,141,50,170,70,50,116,173,81,32,16,68,51,12,35,7,32,173,173,53,220,14,94,204,173,230,46, + 68,213,196,17,214,181,197,4,192,3,192,41,253,127,71,0,238,0,204,13,97,150,50,132,208,179,118,86,85,76,123,123,251,212,132,132,4,170,86,171, + 233,156,57,115,88,0,19,203,140,31,210,175,95,63,77,108,108,44,125,249,242,37,245,245,245,45,208,218,111,232,220,5,246,141,243,247,255,158,65,15, + 69,230,210,240,59,57,111,29,187,46,39,82,129,93,163,36,67,153,111,219,81,151,15,11,191,99,189,198,45,165,71,238,23,232,197,236,92,7,47,11, + 79,127,65,63,9,22,81,229,119,245,104,255,186,132,94,27,7,122,109,28,232,209,225,160,141,235,19,58,110,217,199,244,232,179,109,244,247,194,163,244, + 76,226,79,212,198,87,80,35,59,41,165,128,89,125,11,198,186,110,252,138,189,55,232,238,43,201,85,218,9,103,215,248,158,39,206,208,94,103,47,210, + 58,99,198,82,226,230,158,171,227,181,37,196,217,249,250,178,11,151,233,238,248,36,42,240,241,173,148,41,117,69,252,140,51,61,233,236,139,189,104,155, + 177,117,168,185,59,121,135,73,41,133,153,11,142,172,59,49,143,158,77,218,93,229,220,157,220,68,241,129,65,82,234,236,46,202,117,119,135,208,203,11, + 2,93,76,39,87,209,186,239,247,76,163,207,147,195,104,29,63,243,74,153,126,30,136,15,105,198,163,33,205,75,14,127,79,232,180,211,207,3,27,246, + 238,154,68,83,94,253,76,27,249,215,252,53,162,148,194,205,74,248,213,166,153,131,105,242,217,205,212,207,209,172,86,152,141,157,133,69,25,23,191,163, + 203,199,245,160,190,150,24,83,83,166,135,200,163,127,23,207,46,154,232,239,163,233,235,136,215,212,223,220,63,185,54,236,132,133,255,170,9,95,237,166, + 97,87,83,169,208,161,113,173,204,29,22,126,123,102,109,60,169,215,123,94,159,195,210,210,82,42,145,72,94,117,236,216,145,246,232,209,131,154,154,154, + 86,107,238,140,212,185,135,169,115,227,130,110,99,151,211,185,91,79,211,221,87,146,233,209,135,133,244,167,203,137,53,154,187,80,104,230,41,146,56,62, + 108,214,127,33,253,234,224,31,244,232,195,66,186,235,82,18,21,216,118,172,149,231,179,194,231,217,200,172,85,230,127,245,48,104,233,144,16,210,218,204, + 204,204,193,201,201,73,243,236,217,179,209,64,73,23,241,154,168,137,11,9,180,16,50,245,58,213,53,83,93,120,146,63,1,192,178,154,240,8,33,68, + 34,145,124,101,106,106,58,25,192,3,66,200,72,91,91,219,199,221,186,117,83,29,57,114,36,3,128,175,158,28,19,129,64,144,18,28,28,204,70,70, + 70,22,1,112,54,53,53,125,204,225,112,36,69,69,69,163,84,42,213,37,67,109,75,75,75,59,177,107,215,174,177,99,198,140,193,178,101,203,8,151, + 203,221,66,8,1,128,252,79,62,249,228,231,175,191,254,154,83,84,84,132,163,71,143,34,38,38,38,156,150,180,43,50,88,92,62,195,23,138,76,48, + 126,80,47,164,167,165,36,224,237,230,160,249,32,228,235,234,112,129,146,72,22,44,52,135,122,245,15,237,61,108,236,20,124,53,119,26,238,223,190,17, + 5,66,150,86,122,33,197,193,115,17,187,230,45,251,216,21,151,162,114,241,42,159,147,63,244,48,47,7,0,41,52,215,56,206,92,51,149,219,160,105, + 93,252,180,238,0,238,94,127,128,244,228,244,104,80,44,170,174,157,37,182,18,2,11,191,221,195,198,77,119,179,180,182,193,148,97,31,230,42,84,242, + 207,43,191,136,70,157,154,52,206,81,108,99,203,235,185,109,39,226,47,189,251,50,51,46,246,35,218,244,234,213,210,211,63,0,159,246,234,161,80,20, + 23,85,202,36,4,247,119,142,59,229,32,181,21,243,7,126,221,14,79,46,198,189,51,198,204,133,120,185,122,59,245,105,214,46,8,19,251,76,135,188, + 88,81,101,187,160,175,190,243,198,180,208,103,102,82,51,105,113,118,166,42,15,128,249,59,182,242,152,15,218,117,104,130,165,11,190,71,113,177,178,202, + 214,62,223,109,246,66,110,158,26,148,2,147,166,84,216,11,186,67,112,203,134,88,185,124,59,138,229,138,111,170,98,234,35,66,224,235,239,102,141,221, + 17,231,161,144,43,42,109,7,163,143,188,189,137,192,201,196,92,100,66,138,113,244,220,21,150,170,112,172,22,204,252,106,243,248,205,156,123,209,247,176, + 96,198,130,100,149,90,53,167,22,152,0,224,32,181,118,196,161,253,97,144,23,23,85,59,146,173,21,113,113,17,153,72,28,251,122,214,107,138,175,230, + 78,129,66,33,159,95,83,102,113,113,241,22,95,95,95,87,134,97,112,237,218,181,2,150,101,13,110,40,207,55,179,159,106,102,231,181,246,195,79,87, + 49,82,17,7,47,159,221,197,111,103,79,226,217,147,135,234,156,172,204,103,32,164,90,223,253,150,150,150,102,92,30,243,91,147,15,199,59,187,53,238, + 138,95,246,254,132,141,81,207,53,25,25,57,79,1,90,163,223,19,163,140,170,21,149,245,186,78,156,56,65,43,243,202,4,2,193,153,35,71,142,208, + 109,219,182,81,161,80,152,12,128,212,212,211,107,231,201,28,186,127,100,149,38,229,208,100,218,198,157,147,217,191,138,42,177,85,120,216,214,82,169,244, + 230,150,45,91,228,49,49,49,212,204,204,44,10,128,223,144,33,67,178,19,19,19,169,165,165,101,188,1,44,243,54,109,218,100,101,102,102,210,122,245, + 234,189,166,148,194,201,201,41,237,246,237,219,180,79,159,62,121,166,166,166,43,80,46,226,164,7,147,79,8,57,182,100,201,18,154,152,152,72,85,42, + 21,93,188,120,49,59,115,230,76,86,38,147,209,248,248,120,186,102,205,26,202,229,114,47,66,207,42,236,186,14,177,107,83,249,129,200,124,106,227,223, + 158,194,221,93,88,91,94,185,54,146,213,227,147,197,52,236,102,6,109,208,101,20,133,133,223,10,125,174,237,238,5,105,151,58,152,213,165,14,174,119, + 246,194,252,118,238,37,209,69,169,43,54,76,248,246,35,122,240,233,90,234,211,194,70,41,117,195,100,107,95,152,214,138,189,22,190,179,26,117,31,75, + 127,190,158,73,189,130,63,102,97,225,247,65,149,215,56,187,198,139,27,7,209,158,39,207,82,211,224,150,20,174,110,111,69,117,224,110,110,46,9,240, + 206,216,28,29,67,123,207,255,130,114,92,157,23,87,201,244,130,64,234,130,87,51,206,244,164,238,45,77,169,153,219,187,145,34,169,27,182,124,241,211, + 56,186,254,151,121,84,234,138,95,171,98,58,185,137,226,143,221,105,66,155,180,52,167,199,35,155,80,119,111,241,59,76,39,79,129,79,247,62,1,52, + 62,243,71,234,19,96,89,208,164,9,120,149,49,253,60,16,255,228,182,63,237,216,154,79,253,61,65,253,60,222,181,179,78,29,216,118,108,109,77,243, + 179,118,211,150,65,230,202,64,59,136,107,227,181,114,183,20,61,120,190,111,14,157,208,167,25,117,179,20,181,168,41,207,223,2,245,250,53,115,164,5, + 103,22,210,122,246,220,172,154,242,60,248,30,129,31,122,127,72,179,182,102,209,122,86,245,100,94,18,47,155,218,152,119,201,251,212,239,236,231,59,110, + 208,230,31,207,164,176,244,125,167,85,148,161,7,223,204,119,64,147,190,51,232,188,176,7,148,88,250,63,169,41,79,36,145,14,114,114,114,162,189,123, + 247,166,142,142,142,84,36,18,13,54,148,33,148,88,47,117,174,223,129,126,180,226,34,109,63,101,59,229,218,54,76,130,133,223,60,152,251,181,133,99, + 147,106,127,215,81,74,97,98,98,178,189,65,243,118,244,131,105,223,81,51,167,166,74,142,164,254,120,216,180,171,180,69,154,241,248,103,31,85,249,34, + 255,182,67,175,136,22,33,68,0,32,192,193,193,33,164,123,247,238,56,120,240,32,204,205,205,37,105,105,105,161,132,144,8,74,105,161,161,14,94,80, + 16,225,113,50,224,99,38,49,237,213,160,251,56,14,137,24,8,55,107,62,255,153,82,62,162,158,45,9,127,156,78,101,134,240,120,60,94,136,139,139, + 203,129,19,39,254,143,189,243,14,143,162,90,255,248,247,108,239,187,217,244,70,66,79,3,18,122,175,210,67,85,44,112,65,185,160,32,194,197,130,10, + 138,128,40,210,17,11,85,16,80,154,32,74,71,20,144,78,2,129,52,72,2,164,215,77,175,187,155,205,150,247,247,7,9,191,16,82,118,19,238,245, + 94,159,124,159,231,60,155,156,153,249,236,59,179,179,103,190,123,206,153,119,78,184,180,109,219,150,93,184,112,1,92,46,23,0,16,23,23,103,186,125, + 251,182,173,33,34,57,57,217,124,237,218,53,228,231,231,91,0,192,222,222,158,117,235,214,13,63,255,252,179,98,231,206,157,111,127,248,225,135,131,25, + 99,99,136,40,199,26,30,17,85,48,198,38,45,91,182,236,48,128,177,211,167,79,199,199,31,127,204,0,32,43,43,11,71,142,28,193,135,31,126,248, + 167,201,100,10,166,38,100,97,39,2,180,134,71,189,18,207,74,85,61,89,67,199,191,52,118,236,63,102,99,245,39,239,227,238,237,144,85,84,16,187, + 200,154,237,79,63,164,18,0,107,43,11,0,64,217,146,245,108,209,222,125,238,168,169,131,177,254,221,109,208,164,231,78,43,78,165,131,207,36,94,117, + 251,190,106,39,183,149,211,230,125,140,31,182,127,133,248,251,119,215,82,65,92,189,15,14,174,210,232,45,223,225,204,219,115,96,49,62,253,16,0,174, + 73,176,122,232,244,55,28,114,178,115,240,219,129,31,147,44,28,94,189,15,55,6,30,205,209,82,56,75,91,28,254,228,34,102,126,55,26,95,189,112, + 228,201,229,30,204,222,206,89,53,189,223,168,30,248,124,206,6,48,192,170,94,162,252,220,10,204,255,212,11,92,30,171,117,57,153,216,43,61,250,180, + 193,173,91,119,81,166,213,255,113,255,94,195,55,87,228,230,26,241,233,18,47,252,116,56,23,127,94,120,250,126,13,129,25,131,131,130,188,145,152,240, + 16,249,249,69,33,113,26,219,191,251,181,73,192,231,180,113,183,227,33,45,51,7,38,35,239,65,83,121,22,46,231,197,33,65,30,184,29,113,23,70, + 163,217,230,222,231,167,120,28,203,164,97,126,195,112,45,230,26,202,180,101,71,146,244,73,185,77,101,86,147,163,129,73,144,159,159,7,88,184,217,207, + 128,247,74,203,192,126,8,189,116,14,100,65,147,190,79,18,137,189,39,79,192,219,218,161,67,7,36,37,37,161,176,176,112,175,78,167,59,96,11,67, + 44,147,13,145,219,123,46,238,49,98,50,238,95,62,132,216,27,127,220,54,243,4,99,168,32,182,201,147,223,197,98,241,0,133,66,241,122,203,118,254, + 8,251,227,39,232,139,242,95,51,151,37,236,111,42,183,89,205,122,150,170,117,50,60,99,204,89,32,16,196,10,4,130,28,46,151,91,46,16,8,180, + 173,91,183,190,182,123,247,110,65,114,114,50,24,99,120,237,181,215,228,106,181,122,11,143,199,43,20,8,4,122,133,66,145,238,224,224,112,75,42,149, + 118,169,141,217,181,53,83,14,106,195,189,51,176,13,55,163,143,55,71,203,205,70,185,155,163,211,173,47,215,175,229,178,204,16,160,36,29,115,135,122, + 200,29,20,252,175,228,98,86,208,219,155,171,31,212,150,159,62,180,189,240,86,255,182,252,1,245,237,132,189,189,253,242,129,3,7,30,189,126,253,186, + 171,179,179,51,187,113,227,6,12,6,3,42,135,229,192,229,114,33,22,139,31,255,111,173,106,110,199,225,60,58,92,55,111,222,196,228,201,147,69,103, + 206,156,233,230,233,233,25,201,231,243,7,90,203,36,162,10,34,154,180,108,217,178,227,187,118,237,66,90,90,26,210,210,210,112,248,240,225,103,98,178, + 128,71,227,132,186,114,19,44,207,200,105,85,153,172,65,193,147,198,142,124,233,117,124,253,233,135,54,153,172,90,153,1,76,192,229,112,118,78,255,248, + 69,206,181,179,161,8,191,26,125,252,153,153,44,215,182,142,60,62,231,208,212,249,203,184,209,225,55,113,238,248,207,87,81,232,218,224,80,92,149,180, + 57,217,24,184,108,5,6,127,177,26,28,222,255,255,22,17,120,57,188,234,221,57,232,141,78,227,95,192,254,213,203,97,54,86,204,165,164,36,171,238, + 102,123,241,243,129,120,101,245,96,236,154,115,6,102,227,147,79,190,96,60,204,25,249,242,64,113,114,124,10,162,110,222,11,47,74,105,56,217,31,3, + 194,63,121,51,62,116,209,204,7,21,38,227,211,159,179,163,183,212,85,34,19,190,63,104,120,59,92,250,51,28,140,232,87,107,226,92,242,105,10,62, + 250,36,25,111,190,225,10,46,247,233,239,139,133,225,181,110,221,91,32,44,44,26,140,112,222,26,102,67,242,116,144,184,123,56,202,164,92,179,14,105, + 217,133,133,233,37,37,249,77,134,18,94,26,217,201,9,191,221,184,11,80,211,207,43,6,214,183,187,119,119,92,138,185,4,88,240,75,163,24,14,237, + 124,153,218,55,68,217,110,176,137,217,251,69,50,71,159,246,0,192,56,60,167,82,51,31,197,133,5,0,207,220,36,163,165,86,183,86,138,148,118,163, + 100,174,237,16,21,122,1,104,130,209,98,140,113,44,92,246,131,191,159,143,210,96,48,32,49,49,49,69,44,22,191,101,11,67,165,82,217,241,184,130, + 31,2,187,247,101,201,145,23,17,119,253,228,121,179,68,223,255,89,220,97,200,24,19,241,120,188,239,252,253,253,89,86,90,50,114,83,30,156,52,52, + 155,172,102,253,23,138,7,0,39,79,158,164,224,224,224,234,173,106,5,0,203,164,73,147,236,182,108,217,194,147,203,229,208,235,245,226,156,156,28,132, + 134,134,66,44,22,163,111,223,190,108,248,240,225,114,137,68,2,0,252,205,155,55,187,30,60,120,80,105,48,24,158,122,126,18,0,152,45,96,196,129, + 96,212,208,65,142,239,173,222,197,231,202,156,1,139,73,140,220,104,224,207,69,0,87,136,30,237,21,56,243,177,135,12,92,33,74,141,28,254,143,127, + 38,185,237,251,243,129,189,209,104,169,243,151,56,99,76,209,190,125,251,185,123,247,238,181,43,41,41,65,110,110,46,36,18,9,136,232,41,163,101,171, + 24,99,16,139,197,143,13,86,213,43,0,196,198,198,162,69,139,22,236,252,249,243,46,61,123,246,220,141,71,147,237,173,97,118,0,144,91,105,182,14, + 223,185,115,103,44,143,199,195,177,99,199,254,52,153,76,193,0,20,140,177,0,0,209,68,164,183,57,104,0,32,130,182,252,217,244,104,85,153,172,190, + 35,158,31,59,228,249,25,216,186,242,35,60,136,186,217,36,147,5,0,138,82,124,52,100,74,111,63,165,163,12,235,255,245,93,169,209,130,57,77,143, + 246,209,197,129,235,208,98,255,208,151,223,114,229,10,37,56,176,121,77,62,56,230,151,137,254,180,238,25,149,140,133,159,154,51,171,218,45,225,84,10, + 0,18,79,101,15,153,179,251,246,193,11,63,199,249,157,91,144,18,117,231,39,83,90,206,105,235,144,8,223,49,235,212,35,38,161,172,68,128,209,85, + 203,20,222,172,183,218,94,177,120,224,196,94,248,97,205,17,128,176,198,26,102,90,178,110,2,0,120,120,75,146,243,115,43,188,168,198,135,205,99,166, + 85,83,223,232,41,45,42,42,196,137,95,110,197,100,164,150,91,117,1,90,190,212,11,60,62,195,220,183,19,80,97,122,146,217,182,21,155,218,169,163, + 243,240,62,189,92,240,198,172,195,68,12,86,153,183,134,36,224,145,79,107,23,41,10,11,243,81,162,53,220,111,42,207,215,142,55,177,115,107,69,59, + 103,73,5,206,223,73,214,106,37,56,213,24,142,147,172,165,11,71,171,47,213,144,70,43,228,9,59,121,219,123,227,126,198,125,48,14,139,104,104,91, + 166,106,223,10,28,238,183,82,149,99,55,109,81,206,125,152,185,175,113,4,194,179,3,167,47,246,116,106,21,128,236,196,168,142,127,238,249,236,0,99, + 172,171,216,171,151,147,193,72,208,149,22,17,242,92,235,236,29,247,80,120,216,155,74,77,229,26,210,212,217,139,104,50,113,39,122,248,245,22,228,106, + 50,144,151,158,120,135,138,99,31,54,102,223,1,128,39,119,89,224,238,234,48,208,193,193,30,33,55,110,152,45,22,203,228,252,252,252,18,91,24,38, + 147,105,91,187,246,62,110,204,80,130,152,91,215,243,77,38,222,63,40,35,233,153,60,51,85,44,149,47,245,240,112,111,43,22,139,113,231,250,173,82, + 142,69,240,212,157,220,205,250,223,82,45,94,228,111,161,170,159,235,131,78,158,60,73,168,124,112,46,17,21,50,198,186,31,57,114,228,140,74,165,234, + 190,102,205,26,225,133,11,23,144,159,159,15,137,68,2,177,88,252,248,85,36,18,97,227,198,141,21,135,15,31,206,53,24,12,3,137,168,214,25,180, + 225,73,84,212,213,157,117,63,253,251,197,83,114,229,123,189,102,127,186,77,200,46,46,6,82,47,1,92,33,192,19,62,241,122,240,66,130,241,224,229, + 248,66,179,193,50,232,102,22,197,212,179,15,166,188,188,60,60,124,248,16,118,118,118,80,169,84,96,140,129,199,227,61,30,58,228,112,56,141,234,209, + 226,112,56,16,137,68,79,24,54,0,80,42,149,0,128,162,162,34,20,20,20,128,195,225,88,53,105,157,49,246,254,152,49,99,86,123,123,123,211,55, + 223,124,179,138,136,198,31,59,118,172,23,0,39,0,39,0,12,232,208,161,195,137,30,61,122,72,126,252,241,199,203,0,234,237,201,171,75,132,170,161, + 195,166,57,173,42,147,213,99,232,132,177,253,38,76,199,174,245,159,32,225,238,173,38,155,44,185,23,243,119,116,85,125,52,114,122,63,236,95,115,20, + 218,162,178,247,117,105,148,209,164,96,43,37,112,113,89,210,42,160,239,115,126,189,71,227,192,154,185,164,215,23,77,161,252,135,86,179,41,53,121,66, + 205,58,137,167,196,157,35,146,29,237,185,240,115,65,114,196,45,132,238,223,25,109,172,176,62,29,73,81,50,61,197,4,0,187,86,204,75,36,224,31, + 125,107,237,171,130,152,240,7,184,126,246,86,100,73,26,14,91,203,5,30,247,108,105,0,246,248,65,174,206,173,68,195,252,2,28,166,14,25,237,137, + 143,231,157,133,209,108,124,135,170,61,244,181,46,17,67,248,236,185,241,26,0,32,160,204,204,253,127,67,216,166,13,115,226,9,57,27,223,155,31,136, + 3,63,133,34,62,49,119,211,253,68,138,178,37,214,58,101,49,7,247,243,177,195,141,187,201,0,208,160,137,169,79,237,237,4,157,236,196,252,93,171, + 38,185,98,255,159,15,80,172,53,237,75,203,183,237,7,11,99,140,43,81,180,89,236,164,112,249,68,172,0,243,20,183,250,222,223,169,189,29,99,12, + 9,154,132,146,68,125,98,74,125,219,243,237,124,22,59,58,182,88,214,99,240,20,110,107,191,94,120,112,247,138,195,31,63,175,187,19,212,115,162,220, + 91,229,142,51,155,222,199,11,175,175,199,67,215,182,65,89,102,203,24,103,123,79,190,90,111,134,177,48,87,67,20,83,235,15,130,86,226,86,139,219, + 216,181,89,86,42,40,179,180,20,183,60,202,177,112,62,75,48,36,68,215,92,143,24,94,241,236,212,23,169,81,215,0,52,190,39,79,96,231,29,36, + 149,43,62,247,239,220,19,177,119,174,65,167,211,173,208,233,116,215,109,97,200,100,178,87,213,106,245,36,79,15,119,132,132,133,194,108,50,206,160,178, + 180,103,146,215,74,40,83,119,148,74,100,11,218,180,105,131,216,216,88,24,43,12,239,235,116,217,207,164,13,105,214,95,170,39,188,200,223,69,60,0, + 8,14,14,190,8,224,9,23,66,68,90,198,216,224,157,59,119,30,200,206,206,14,222,183,111,159,232,183,223,126,3,135,195,121,108,178,196,98,49,222, + 127,255,125,221,181,107,215,238,235,116,186,161,68,84,111,151,127,88,6,233,6,49,54,244,224,207,191,236,201,204,210,76,88,190,253,132,152,157,124,13, + 208,230,252,191,209,226,10,177,100,95,68,249,165,187,153,137,21,101,166,193,33,217,84,111,87,58,17,233,196,98,241,248,73,147,38,29,216,176,97,131, + 75,255,254,253,57,140,49,112,185,220,39,12,146,72,36,122,162,71,202,26,85,245,104,85,113,170,94,171,140,214,239,191,255,110,252,240,195,15,179,243, + 242,242,38,91,137,28,247,229,151,95,50,47,47,47,22,24,24,248,209,140,25,51,56,68,180,168,146,61,184,95,191,126,167,191,251,238,59,161,64,32, + 64,124,124,124,63,198,152,3,17,229,217,20,52,42,231,104,149,155,96,105,130,207,170,50,89,157,7,143,31,219,35,248,85,28,248,106,25,146,99,194, + 154,108,178,24,99,28,133,39,118,76,124,103,8,63,246,118,60,194,254,136,190,84,156,138,103,242,28,43,177,187,221,63,21,246,222,159,244,121,225,125, + 156,251,105,3,114,210,238,127,65,249,201,103,155,194,148,120,74,122,112,132,194,95,218,205,89,232,98,32,66,232,215,159,21,112,152,105,28,105,242,154, + 52,55,201,190,45,83,128,112,98,234,226,241,142,92,62,7,219,62,217,151,203,24,141,183,198,16,85,87,85,207,86,149,28,91,240,198,182,241,83,30, + 158,251,129,47,59,122,40,26,247,99,115,79,102,37,151,255,110,13,43,46,161,118,67,216,162,45,107,205,24,126,124,245,69,79,53,160,195,158,125,17, + 105,124,9,154,116,30,84,169,141,11,115,146,138,37,83,135,249,43,177,252,215,68,128,225,167,198,178,124,237,196,175,185,72,69,91,54,78,240,22,229, + 230,24,241,229,153,140,36,19,89,62,176,149,195,183,107,183,185,139,239,224,55,102,13,125,7,142,22,62,14,158,253,114,166,216,12,164,23,166,67,111, + 208,71,54,180,189,136,104,202,187,47,175,132,47,170,22,0,0,32,0,73,68,65,84,226,230,21,100,224,226,158,229,152,246,194,50,8,251,100,201,251, + 119,127,30,71,206,124,133,226,140,248,50,73,114,138,172,163,155,63,10,83,98,223,14,112,108,7,105,74,26,248,102,83,88,61,216,41,59,38,237,224, + 218,73,236,184,87,18,175,76,90,121,113,245,152,150,146,150,211,147,116,73,143,205,148,131,162,189,143,196,222,101,176,218,179,29,66,126,221,76,0,175, + 81,199,146,169,124,90,242,25,231,80,215,193,227,249,5,5,233,200,200,204,8,209,235,116,159,217,194,16,139,197,45,133,66,225,183,1,1,1,72,76, + 74,70,113,73,233,119,134,210,252,103,113,231,39,24,99,28,145,212,254,187,128,206,125,120,133,133,89,208,104,52,151,116,58,237,255,246,179,240,154,5, + 160,118,47,242,119,80,189,206,131,136,76,6,131,225,197,83,167,78,105,210,211,211,225,234,234,250,68,143,150,193,96,192,185,115,231,132,90,173,182,79, + 67,38,171,74,127,18,153,46,37,152,166,92,189,126,45,161,32,49,12,112,12,120,162,55,171,130,248,56,123,59,149,111,40,52,246,106,200,100,85,73, + 175,215,95,214,104,52,157,222,121,231,157,208,13,27,54,148,41,20,10,40,20,138,39,230,86,53,182,71,171,182,57,90,18,137,4,203,151,47,47,250, + 240,195,15,111,228,229,229,117,34,162,16,43,145,167,215,172,89,131,204,204,76,76,155,54,13,187,118,237,90,200,24,91,201,24,27,60,106,212,168,211, + 63,253,244,147,80,36,18,225,218,181,107,8,13,13,189,212,24,147,5,52,189,71,171,202,100,117,24,48,118,108,231,17,255,192,175,91,62,123,38,38, + 11,0,148,45,240,126,199,33,109,123,122,4,56,225,208,250,223,12,100,198,235,84,25,104,99,31,207,195,24,227,202,60,100,27,28,60,219,239,28,248, + 218,183,156,132,168,139,136,9,249,245,162,41,63,165,73,233,33,164,94,130,55,164,78,234,43,157,151,45,115,19,184,185,226,206,154,133,102,179,190,116, + 146,62,185,232,233,252,12,214,199,202,20,45,216,107,28,14,239,254,248,121,67,59,180,14,106,129,77,31,252,80,161,215,151,143,43,76,162,228,198,114, + 85,222,172,165,115,43,193,222,224,87,220,143,125,252,69,43,65,88,104,6,14,236,142,201,224,112,57,54,205,169,169,17,43,215,181,61,123,79,166,228, + 223,93,48,223,171,215,11,99,20,88,251,77,20,244,6,243,27,119,239,218,118,179,74,109,242,117,21,123,115,120,188,99,139,70,57,219,231,22,20,226, + 92,84,86,82,114,94,249,101,91,24,131,24,227,249,42,149,147,125,149,138,176,222,206,246,187,14,142,238,44,210,150,240,48,255,96,122,137,217,128,23, + 18,10,168,184,33,6,99,93,249,76,237,187,130,235,16,16,199,212,190,215,21,50,167,25,255,24,243,1,14,252,241,13,182,156,89,137,249,195,63,198, + 115,62,195,241,32,231,1,136,81,131,70,75,104,177,44,92,183,241,229,184,221,63,188,123,46,229,97,232,225,171,167,54,227,37,223,49,72,8,57,137, + 184,232,243,33,34,139,121,173,33,49,22,125,156,58,66,68,150,129,61,28,124,97,78,75,132,208,98,185,85,23,147,44,180,112,232,246,161,15,167,236, + 155,2,1,87,128,253,175,236,21,117,112,233,112,192,91,228,189,134,49,198,13,96,1,2,130,229,199,46,163,102,112,115,19,34,81,146,155,126,133,10, + 238,166,218,114,44,1,128,217,251,245,20,138,248,55,123,61,63,183,141,216,190,5,162,111,94,41,35,19,155,66,68,214,13,189,227,209,121,195,225,112, + 126,244,243,243,147,233,245,122,36,37,37,63,52,72,249,239,216,26,75,93,226,41,221,62,112,243,237,222,221,206,201,5,113,113,113,6,147,201,244,184, + 13,105,86,179,254,27,101,205,93,135,60,179,217,236,234,233,233,137,204,204,76,72,36,146,199,102,203,193,193,1,106,181,186,60,47,47,207,11,64,156, + 181,111,202,24,99,125,188,56,45,237,60,253,129,135,187,1,174,232,177,217,18,8,133,112,86,203,116,153,150,210,54,0,238,88,203,36,162,60,198,88, + 159,125,251,246,125,118,237,218,181,55,119,236,216,161,110,170,209,98,140,61,49,116,88,92,92,76,90,173,22,131,6,13,202,75,77,77,253,170,168,168, + 104,133,141,95,240,149,219,183,111,247,224,112,56,111,46,90,180,8,83,166,76,1,135,195,89,120,234,212,169,15,118,238,220,201,41,42,42,194,149,43, + 87,48,123,246,236,123,122,189,254,197,6,227,171,227,49,59,2,137,148,53,118,142,22,83,180,119,128,29,103,167,79,159,224,177,1,67,38,227,244,142, + 21,200,124,16,222,36,147,165,240,96,246,92,14,183,31,152,121,138,87,160,235,11,163,230,245,198,233,109,87,80,170,209,110,84,151,137,140,157,91,240, + 251,187,72,240,81,80,43,245,144,49,62,156,63,76,21,244,206,153,68,170,119,174,142,194,131,217,115,184,232,76,12,3,100,45,56,163,219,244,232,18, + 216,121,204,60,68,159,59,130,187,231,246,68,8,136,247,114,133,141,189,67,10,15,102,207,24,186,17,227,12,97,12,207,121,118,241,9,12,154,251,42, + 50,238,166,32,118,203,242,66,179,214,240,138,62,181,236,130,173,76,14,15,94,100,65,59,48,180,87,122,97,108,199,65,109,59,143,154,213,15,12,92, + 108,95,120,16,121,89,133,255,44,73,166,27,182,48,185,124,120,146,5,109,65,104,199,19,242,198,122,251,170,187,79,156,209,10,110,206,124,108,248,226, + 33,162,111,21,167,112,25,119,144,38,89,103,213,197,86,225,203,236,133,128,55,8,62,4,142,47,64,62,142,237,88,231,110,253,221,91,254,115,122,75, + 148,100,22,225,141,15,226,205,105,169,250,165,201,241,244,155,53,76,95,15,102,79,2,56,112,8,118,102,130,29,7,176,179,0,118,204,194,81,91,136, + 245,105,231,33,28,244,246,72,15,65,39,39,17,102,124,31,111,49,19,155,73,13,228,142,243,85,40,236,185,196,233,100,38,78,15,198,208,131,39,183, + 235,61,204,222,201,113,106,107,47,180,117,16,226,199,187,73,216,26,147,120,207,98,49,79,136,41,174,176,110,126,146,157,246,203,54,221,134,189,213,115, + 232,52,112,242,242,80,154,122,31,25,57,137,184,22,245,219,53,1,89,244,49,29,94,120,110,128,119,47,236,185,185,13,28,226,52,104,180,242,74,30, + 30,3,30,229,237,98,108,16,239,90,248,209,132,107,17,199,130,24,99,177,82,158,105,185,217,204,2,243,210,99,49,181,205,72,108,182,16,70,56,4, + 97,107,220,38,8,201,92,167,209,74,50,36,29,3,112,172,149,160,85,167,249,199,230,31,248,87,191,127,249,238,152,180,3,107,47,174,125,255,200,221, + 163,47,151,112,205,130,241,189,95,117,238,228,210,13,159,237,156,109,4,113,231,91,179,235,143,218,16,234,8,198,233,6,162,110,42,71,215,49,67,167, + 47,18,150,20,23,227,210,222,37,134,10,131,126,74,185,190,168,214,71,101,213,37,137,68,178,200,205,205,173,143,189,189,61,66,66,66,204,100,193,20, + 210,212,61,175,204,234,56,57,150,32,46,12,147,61,219,118,158,222,113,232,203,136,61,245,13,202,203,203,151,150,151,151,55,122,30,90,179,154,245,159, + 144,53,70,43,104,224,192,129,70,179,217,44,76,75,75,195,134,13,27,180,69,69,69,230,117,235,214,41,6,12,24,128,94,189,122,89,78,156,56,209, + 3,181,24,45,198,216,80,162,167,239,160,234,236,10,159,86,173,91,50,14,79,0,77,86,58,214,28,189,175,75,201,41,179,44,156,220,75,214,205,207, + 27,129,237,220,248,154,188,251,61,81,139,209,170,139,9,0,149,166,103,177,88,44,254,125,216,176,97,91,184,92,238,31,0,242,35,34,34,116,221,187, + 119,79,179,88,44,181,154,193,58,152,134,204,204,76,214,175,95,191,156,226,226,226,114,0,40,40,40,72,111,221,186,117,73,118,118,246,171,68,245,95, + 24,107,99,18,17,49,198,222,218,186,117,43,0,188,185,112,225,66,188,242,202,43,152,50,101,10,39,39,39,7,23,47,94,196,236,217,179,239,105,181, + 218,65,68,244,212,237,227,213,153,204,206,103,177,204,217,117,153,80,162,224,214,92,143,199,23,193,100,182,60,202,82,154,204,171,215,110,213,100,202,157, + 61,150,121,6,244,228,250,15,124,1,23,127,92,141,172,135,182,155,172,234,76,165,55,91,108,239,45,95,230,228,109,199,245,10,116,70,167,17,109,113, + 253,64,36,98,78,220,67,23,49,255,67,38,177,124,200,44,22,236,89,179,8,66,145,20,69,119,118,143,124,99,231,131,18,0,47,215,197,148,87,50, + 157,189,237,184,158,29,157,224,210,174,61,4,146,214,56,191,109,35,226,67,195,127,209,155,229,211,40,187,225,134,189,182,56,157,91,171,185,222,65,46, + 112,9,106,3,142,220,5,215,127,56,131,187,191,94,15,55,115,56,19,245,169,250,228,198,48,85,46,114,174,189,167,28,142,158,118,240,240,117,129,131, + 171,10,87,14,132,35,244,215,168,76,99,185,249,221,226,84,170,119,136,167,54,166,189,167,146,235,238,231,0,119,95,7,120,182,150,67,72,21,72,8, + 201,196,206,229,119,81,86,108,252,137,199,53,207,215,36,86,212,217,35,92,157,233,224,195,22,187,184,169,150,169,221,148,92,7,119,21,236,61,148,176, + 119,87,193,211,93,12,181,192,140,159,247,133,227,207,83,73,119,200,104,121,35,51,158,234,204,147,82,157,233,211,138,45,118,247,22,44,115,176,231,115, + 149,74,46,84,74,30,148,74,30,236,164,92,56,136,249,104,229,32,132,183,74,136,219,145,90,60,191,53,217,156,85,96,122,63,94,83,241,148,137,173, + 206,244,147,218,45,246,18,41,151,181,19,171,184,190,18,21,124,37,42,248,72,84,168,176,152,113,36,61,30,111,71,36,27,242,42,180,59,133,98,221, + 7,119,235,73,59,241,196,57,175,246,253,200,161,133,239,155,157,71,207,64,216,233,93,232,232,211,23,221,187,140,198,245,223,247,128,129,237,5,168,236, + 82,220,31,207,13,112,235,138,7,57,15,0,134,90,231,165,213,213,46,85,222,132,241,196,247,199,133,185,220,140,77,189,83,209,66,232,32,216,56,106, + 53,220,121,42,220,76,184,92,162,214,74,175,54,196,76,172,72,140,108,203,218,246,220,112,105,195,129,184,236,184,81,139,135,44,198,155,189,223,244,228, + 48,46,42,24,225,221,163,95,160,180,56,119,17,21,198,214,58,215,173,230,247,221,173,165,247,178,22,45,91,115,219,251,119,132,123,43,95,200,157,189, + 113,235,250,21,92,250,254,211,28,179,161,100,108,69,73,110,104,93,199,177,54,166,84,42,93,172,80,40,62,245,245,245,69,92,92,28,116,58,221,50, + 173,86,91,167,129,180,134,89,21,103,171,214,109,185,45,125,59,66,214,166,31,174,31,92,131,212,196,152,27,122,173,118,125,99,152,207,74,205,204,103, + 203,252,187,170,65,163,197,225,112,250,74,36,18,193,186,117,235,140,43,86,172,168,176,88,44,159,24,141,198,204,41,83,166,108,26,51,102,140,40,32, + 32,64,126,225,194,133,254,0,246,88,251,166,92,46,250,121,200,45,236,247,239,151,152,63,91,119,197,64,140,54,26,12,150,232,247,54,95,248,182,103, + 7,47,73,107,79,39,177,76,38,28,2,96,115,99,118,74,175,215,95,6,224,95,173,202,219,86,70,229,29,127,142,213,235,52,26,77,215,198,196,83, + 131,251,132,217,250,224,131,15,192,24,195,213,171,87,235,53,89,79,137,177,41,131,94,93,194,21,201,159,74,6,14,0,40,203,215,192,160,43,45,3, + 226,173,238,242,7,135,59,101,240,140,101,92,14,151,143,171,251,214,32,43,62,162,233,115,178,128,41,47,127,49,152,75,22,66,122,76,30,14,47,249, + 19,45,178,178,240,195,16,64,200,173,0,0,124,115,29,144,10,128,249,75,63,195,230,87,91,131,199,169,253,89,128,143,195,4,166,188,242,197,96,174, + 197,66,72,139,206,65,196,169,27,72,186,115,204,84,146,87,190,66,151,97,250,148,72,107,115,95,94,85,156,22,11,33,37,60,27,161,223,95,69,114, + 68,174,65,87,108,216,169,229,152,223,163,70,60,148,184,138,201,225,49,20,164,151,162,32,163,20,145,127,220,71,244,133,36,157,174,176,124,181,204,132, + 117,185,25,182,165,242,168,98,130,8,233,177,121,136,187,156,138,243,219,242,144,155,80,84,97,54,211,25,6,238,183,69,41,166,115,54,49,25,155,50, + 109,197,24,46,135,203,65,94,122,33,242,210,138,112,255,70,50,174,165,21,33,39,41,183,84,87,164,95,150,243,0,95,217,50,127,140,203,48,229,139, + 229,222,92,161,144,161,184,196,140,146,18,51,74,74,76,40,41,53,35,37,207,128,219,247,180,184,122,179,12,185,5,166,80,128,51,255,97,102,69,131, + 23,116,14,99,83,54,181,233,203,37,0,49,218,66,220,40,205,193,14,205,125,220,211,21,102,151,83,197,102,19,44,91,30,150,106,109,203,111,197,56, + 83,251,77,126,159,147,20,126,1,113,161,103,111,106,226,35,187,112,251,79,225,222,185,119,222,100,98,236,103,158,88,82,126,253,225,159,186,156,110,255, + 148,196,100,198,232,13,122,195,93,155,248,181,72,67,26,109,75,113,203,47,222,59,249,222,178,249,125,230,227,179,243,159,161,180,188,244,203,36,74,178, + 106,56,246,33,61,44,97,140,141,57,19,119,230,163,63,19,254,124,183,167,119,111,59,51,227,224,108,202,181,236,50,139,105,109,121,201,125,171,204,7, + 227,112,167,124,182,113,27,151,44,22,60,136,189,139,123,183,174,224,110,244,183,72,137,139,184,105,178,152,94,164,98,77,189,147,254,107,19,17,77,9, + 10,10,226,228,228,228,32,35,35,227,154,78,167,91,105,43,163,174,56,45,102,51,110,134,134,226,236,182,133,200,188,119,237,112,121,153,100,58,81,137, + 245,237,91,179,154,245,23,137,53,52,242,165,84,42,127,47,45,45,125,78,44,22,255,160,211,233,22,84,205,27,98,140,201,164,82,233,103,6,131,97, + 158,84,42,77,40,42,42,122,234,209,54,117,57,222,129,109,248,71,116,6,211,4,137,136,119,170,76,103,122,43,44,131,82,1,160,147,11,147,202,165, + 252,207,76,70,243,191,132,2,126,206,165,248,114,55,107,153,77,209,95,193,100,143,198,35,55,61,247,220,115,111,58,56,56,224,196,137,19,13,154,172, + 26,191,242,198,129,177,85,0,234,154,215,84,2,96,37,21,196,214,155,92,176,14,166,25,132,109,84,24,251,77,3,187,217,32,83,209,130,141,99,12, + 171,56,196,228,124,19,71,193,183,112,244,2,19,247,137,187,192,28,197,70,213,71,163,157,149,189,218,200,17,153,170,197,250,83,233,95,158,77,160,119, + 235,99,130,97,21,1,58,0,87,24,195,37,152,112,185,36,221,186,121,130,245,197,9,64,199,8,23,0,252,81,76,184,66,105,54,223,177,86,27,211, + 194,24,30,128,240,192,66,136,35,1,78,149,198,91,151,228,182,62,38,128,120,70,120,104,97,136,230,0,199,139,82,168,176,49,76,7,31,54,14,96, + 171,64,48,131,33,14,96,177,140,89,98,153,9,177,82,19,98,147,172,52,153,79,244,104,181,124,28,39,135,1,69,4,20,85,189,18,161,8,64,146, + 145,131,211,9,9,84,239,208,102,117,166,191,212,110,28,24,91,69,128,142,24,110,113,136,66,25,227,132,222,43,43,136,107,104,200,177,46,230,227,115, + 158,232,26,76,230,69,224,241,251,242,97,89,192,55,155,191,215,150,60,220,9,0,30,210,214,163,121,22,243,219,0,118,39,235,147,247,53,196,180,86, + 173,68,173,230,17,163,201,4,58,153,82,158,178,178,230,62,88,195,236,202,186,242,243,68,69,253,12,60,102,209,148,121,92,109,40,141,73,29,223,119, + 29,192,66,65,8,129,5,55,168,56,198,166,161,184,26,61,90,227,136,104,21,128,91,140,177,15,181,90,109,163,242,101,213,22,39,35,179,142,131,138, + 27,48,151,255,102,42,209,88,149,124,184,46,230,179,82,51,179,185,71,203,42,53,148,58,30,64,23,0,157,234,89,238,195,227,241,134,215,177,172,214, + 135,78,246,242,66,80,55,79,244,175,139,217,213,13,237,187,183,224,78,178,133,217,148,242,87,50,1,116,194,163,97,178,90,31,10,252,223,18,231,191, + 147,89,215,227,121,254,219,226,108,102,54,51,155,153,205,204,102,230,191,143,249,119,45,13,14,29,18,213,61,39,163,114,121,28,108,152,8,15,0,215, + 147,41,188,190,229,183,50,232,62,128,38,39,46,252,95,16,17,69,2,104,112,130,237,223,89,181,61,158,167,89,205,106,86,179,154,213,172,191,131,108, + 75,44,213,172,102,53,171,89,205,106,86,179,154,213,44,171,197,0,12,173,109,1,217,48,246,202,24,171,149,81,159,26,226,55,51,155,153,205,204,102, + 102,51,179,153,217,204,252,251,49,27,98,219,226,63,254,39,244,239,28,151,196,255,200,184,112,51,179,153,217,204,108,102,54,51,155,153,205,204,191,150, + 249,119,45,214,228,209,106,86,179,154,213,8,29,62,124,248,169,28,103,182,104,210,164,73,214,165,83,56,204,184,40,240,109,5,34,119,112,133,153,200, + 140,140,199,82,235,239,194,171,147,169,9,240,134,196,232,2,147,56,7,154,136,132,38,51,155,213,172,102,253,109,213,114,208,116,81,245,255,147,75,5, + 102,10,219,102,252,171,226,249,111,82,179,209,106,86,179,254,205,58,177,238,181,32,99,133,233,7,87,207,150,97,222,109,3,106,77,36,249,219,245,216, + 128,203,145,241,65,224,240,95,219,181,107,151,109,185,154,114,252,124,192,195,74,112,224,6,170,120,8,167,128,149,64,237,137,53,109,98,10,44,159,195, + 204,241,4,85,196,193,217,119,21,128,38,231,144,106,214,127,159,236,20,188,177,237,218,120,109,76,77,211,72,219,181,119,51,69,69,37,189,89,88,98, + 58,254,87,199,213,172,255,13,49,198,152,71,255,127,237,229,240,212,35,24,145,144,193,34,34,130,209,93,108,46,119,233,53,103,146,230,198,102,155,242, + 250,253,29,245,31,159,12,47,16,8,52,140,49,139,68,34,57,194,24,123,42,79,86,179,154,245,172,196,24,115,171,60,207,44,2,129,64,99,227,182, + 114,62,159,191,68,38,147,93,16,139,197,217,98,177,56,91,46,151,95,224,243,249,75,24,99,79,61,246,168,46,157,88,247,90,144,163,157,242,204,206, + 95,47,183,105,235,229,252,162,135,189,48,248,95,51,95,246,169,94,76,60,233,40,177,107,219,41,9,137,41,126,110,110,110,231,166,79,159,30,96,117, + 160,63,118,146,130,99,30,101,48,90,60,206,68,22,58,107,203,205,62,224,152,70,227,123,31,171,99,172,149,201,99,195,245,21,22,175,189,161,90,151, + 50,131,201,31,132,166,49,43,197,24,179,19,10,133,103,24,99,142,13,175,221,172,255,132,186,117,235,176,229,210,197,29,45,191,92,255,150,211,193,31, + 23,184,181,110,237,178,188,41,188,0,198,186,117,231,243,23,248,51,54,132,217,250,220,179,102,253,207,73,222,125,154,218,66,52,102,216,216,105,234,225, + 19,255,41,29,54,113,38,119,248,243,51,69,93,251,12,87,113,200,208,168,164,227,127,55,253,199,141,150,209,104,116,206,205,205,101,123,246,236,25,167, + 82,169,30,242,249,252,69,140,49,193,127,58,142,191,74,10,133,226,154,74,165,210,216,217,217,105,84,42,213,237,134,234,255,142,98,140,249,56,59,59, + 39,59,56,56,60,145,22,196,57,232,249,62,237,251,189,186,212,177,195,132,129,77,228,11,248,124,254,34,149,74,245,112,207,158,61,227,210,211,211,153, + 209,104,116,182,97,251,1,106,181,250,94,72,72,200,39,185,185,185,3,83,111,236,116,202,10,217,230,148,252,231,250,65,183,78,125,243,137,157,157,234, + 46,99,108,64,67,156,227,171,95,235,228,104,167,60,179,234,199,63,149,148,114,137,255,207,121,139,248,73,247,35,122,29,251,245,215,54,85,235,124,185, + 231,100,203,27,241,165,253,246,31,248,137,79,128,224,226,197,139,66,165,82,249,199,244,233,211,253,235,65,255,191,244,22,23,112,184,131,163,51,181,210, + 204,98,163,75,88,146,86,1,112,7,193,128,198,255,136,41,178,184,0,52,36,60,77,39,187,150,239,228,114,57,190,92,9,14,103,48,244,204,181,209, + 204,74,113,56,156,55,45,22,203,48,129,64,240,118,83,89,205,122,54,146,74,164,98,16,65,46,19,3,32,112,154,104,141,132,28,78,223,107,227,198, + 125,254,97,96,224,60,63,96,108,109,102,139,61,210,191,252,253,253,79,51,198,94,105,218,59,62,193,92,227,231,231,151,206,24,179,234,89,143,53,182, + 175,181,93,10,10,234,213,167,223,160,145,75,59,116,235,53,240,89,49,255,78,42,9,221,147,207,96,254,215,111,71,190,79,56,121,224,219,194,63,126, + 222,140,27,191,253,128,236,132,16,116,247,208,181,101,140,77,249,171,99,252,171,101,181,209,122,177,53,235,59,165,13,187,248,114,107,86,242,74,27,86, + 58,173,13,187,50,169,117,253,143,74,169,75,14,14,14,24,48,96,0,55,61,61,93,242,222,123,239,45,21,139,197,137,140,177,17,141,97,73,165,210, + 91,50,153,44,149,207,231,63,17,139,76,38,187,37,151,203,83,249,124,254,115,213,235,149,74,229,53,149,74,165,81,42,149,181,154,25,133,66,113,75, + 165,82,105,20,10,197,19,207,231,226,243,249,207,41,20,138,52,165,82,89,179,126,136,82,169,76,173,89,95,151,248,124,190,103,106,106,170,115,90,90, + 154,179,80,40,116,169,94,159,146,146,226,156,154,154,250,68,189,45,226,243,249,67,228,114,121,170,76,38,123,42,70,185,92,158,90,115,159,234,82,181, + 99,87,215,49,109,212,231,14,60,106,120,134,15,31,126,37,51,51,211,203,206,206,206,174,250,50,123,149,221,136,31,118,110,122,119,252,232,225,111,58, + 7,76,236,212,72,254,8,177,88,156,248,222,123,239,45,77,79,79,151,244,238,221,155,203,225,88,255,123,130,49,54,116,252,248,241,71,53,26,141,71, + 80,80,16,215,100,50,33,250,216,18,72,35,222,134,56,113,43,90,72,114,120,15,127,95,229,57,124,80,183,163,13,221,141,83,97,44,159,255,209,202, + 77,2,83,90,40,95,123,101,61,116,55,54,113,94,13,238,139,179,231,206,62,222,183,111,246,159,237,252,195,143,123,121,89,89,89,44,35,35,3,90, + 173,86,254,213,87,95,149,233,245,250,5,13,6,123,56,64,0,102,25,96,33,114,186,151,174,119,10,30,247,34,239,78,170,206,201,104,54,219,3,220, + 65,216,221,82,212,32,163,54,38,207,216,223,66,228,114,46,137,239,52,248,165,121,220,243,73,60,39,163,217,236,0,14,6,54,138,89,41,198,24,159, + 203,229,190,187,126,253,122,14,128,185,140,49,97,99,89,255,139,234,233,193,60,158,107,199,11,237,234,206,250,62,43,38,99,172,131,76,38,187,197,24, + 243,105,42,107,199,174,211,244,210,148,181,201,15,30,106,62,107,10,199,96,177,196,30,72,72,248,109,106,219,182,99,62,12,12,156,94,211,108,85,254, + 189,104,213,170,85,211,162,163,163,157,90,183,110,61,139,49,214,164,31,253,149,204,45,171,86,173,122,63,58,58,218,189,85,171,86,159,218,194,172,175, + 93,82,57,57,140,216,177,227,187,119,71,141,24,253,102,64,143,126,86,183,75,245,49,255,110,74,191,188,105,119,218,229,175,218,100,92,219,170,78,186, + 180,101,112,202,149,109,247,135,250,114,48,107,198,52,168,213,234,119,158,209,219,8,1,12,6,16,12,224,57,0,61,42,255,238,94,89,130,241,40,139, + 66,245,215,238,149,219,86,45,239,89,7,35,184,150,237,186,87,171,175,254,127,205,191,27,22,17,225,196,137,19,84,253,181,102,121,185,21,150,205,235, + 227,161,189,119,124,31,149,166,38,80,65,204,29,186,179,253,11,154,215,221,73,59,165,53,86,219,120,167,2,17,17,93,189,122,149,162,163,163,169,180, + 180,148,238,223,191,79,61,123,246,212,73,165,210,115,0,90,217,194,83,40,20,154,115,231,206,209,240,225,195,139,228,114,249,58,0,28,34,130,82,169, + 212,92,189,122,149,134,15,31,94,164,80,40,54,2,224,18,17,94,120,225,133,108,34,34,39,39,167,140,218,120,227,199,143,47,32,34,82,169,84,154, + 202,120,185,10,133,98,227,91,111,189,85,122,243,230,77,82,171,213,85,245,28,165,82,185,110,238,220,185,165,97,97,97,143,235,27,42,246,246,246,169, + 102,179,153,142,31,63,78,206,206,206,143,99,80,171,213,169,102,179,153,142,30,61,90,103,108,245,28,83,142,92,46,95,59,117,234,212,146,164,164,36, + 114,112,112,208,84,171,95,247,234,171,175,150,164,164,164,144,163,163,163,85,49,58,56,56,104,174,93,187,70,207,63,255,124,113,245,99,234,224,224,160, + 185,126,253,122,85,253,218,170,250,250,138,187,187,251,44,103,103,231,12,103,103,231,12,59,59,187,21,110,110,110,89,57,57,57,68,68,212,166,77,155, + 108,34,130,83,224,196,62,237,250,78,91,234,220,97,220,59,91,15,93,15,185,20,149,151,19,56,236,205,181,170,192,241,79,101,136,175,231,24,180,146, + 74,165,231,6,14,28,168,75,77,77,165,178,178,50,138,136,136,160,171,87,175,210,131,7,15,168,242,188,107,136,161,144,203,229,233,229,229,229,150,242, + 242,114,75,78,78,142,57,59,59,219,28,179,206,141,232,123,254,227,82,120,116,44,101,93,90,105,81,202,165,105,0,20,117,241,94,233,38,243,159,51, + 64,157,85,18,246,99,113,209,79,83,169,240,240,63,13,139,134,171,245,103,55,204,56,75,49,135,183,83,204,225,237,171,222,153,124,225,249,137,227,203, + 179,53,89,166,216,216,88,10,9,9,201,80,171,213,185,18,137,164,115,131,251,189,41,192,147,182,249,30,184,187,196,43,230,210,170,145,70,74,58,79, + 251,166,59,25,47,190,227,241,144,182,248,253,76,219,252,91,216,114,30,61,102,110,241,223,23,241,177,87,236,55,159,254,203,152,156,156,76,11,94,29, + 105,58,59,207,35,158,182,250,29,106,20,243,255,143,239,228,137,19,39,150,166,164,164,80,64,64,64,25,151,203,157,209,88,214,255,90,233,225,14,143, + 161,62,194,244,136,189,11,44,99,59,72,243,186,184,161,111,83,153,0,58,56,59,59,231,238,222,189,155,20,10,69,54,0,159,198,112,198,7,247,41, + 208,21,157,163,224,17,129,5,13,188,223,187,29,59,118,12,3,240,124,3,235,49,63,96,220,158,192,192,163,150,73,147,204,123,2,3,143,250,1,227, + 240,40,157,16,3,240,209,154,53,107,194,140,70,99,216,174,93,187,194,198,141,27,23,6,224,253,38,28,7,6,96,219,234,213,171,201,104,52,210,174, + 93,187,104,220,184,113,4,224,235,186,182,177,166,93,10,12,236,217,167,239,192,17,75,59,116,238,249,206,161,95,79,133,68,198,36,228,12,27,249,252, + 218,192,192,129,181,182,75,214,48,255,27,139,82,169,108,29,24,24,184,199,223,223,63,57,40,40,168,220,223,223,191,220,215,215,55,41,48,48,112,143, + 82,169,108,221,200,207,100,228,144,33,67,232,226,197,139,212,167,79,159,28,107,183,107,192,139,244,88,184,112,225,34,0,180,112,225,194,69,68,20,92, + 217,174,7,87,255,187,230,43,17,13,173,254,127,109,140,170,82,27,179,182,247,168,241,119,195,199,163,106,167,78,156,56,49,240,196,137,19,23,107,174, + 240,98,107,244,153,215,199,67,167,203,201,164,168,47,222,166,11,131,61,233,234,32,87,138,123,119,34,101,238,221,72,115,58,171,181,147,90,99,176,13, + 31,0,17,17,133,133,133,81,88,88,24,221,190,125,155,18,19,19,169,168,168,136,14,30,60,104,118,112,112,208,137,68,162,85,0,36,86,158,36,26, + 34,162,242,242,114,90,177,98,133,94,161,80,220,6,224,82,105,148,168,176,176,144,86,173,90,165,87,169,84,17,0,220,29,29,29,83,19,18,18,200, + 197,197,165,86,51,163,86,171,53,177,177,177,164,86,171,53,0,60,212,106,117,212,177,99,199,42,136,136,210,210,210,200,222,222,94,3,192,197,193,193, + 225,206,137,19,39,42,136,136,50,50,50,200,222,222,222,106,163,165,211,233,232,236,217,179,79,196,80,85,127,250,244,233,39,12,152,21,199,211,69,165, + 82,133,29,60,120,208,96,54,155,41,42,42,138,84,42,149,6,128,139,157,157,221,237,67,135,14,25,204,102,51,197,196,196,88,109,6,91,182,108,153, + 77,68,100,50,153,104,235,214,173,229,85,199,180,170,222,96,48,208,230,205,155,203,149,74,101,24,0,151,250,88,142,142,142,25,6,131,129,10,11,11, + 169,103,207,158,165,87,175,94,165,226,226,98,34,34,170,228,193,119,224,140,207,66,238,151,22,255,243,131,77,63,181,234,49,229,139,223,66,211,211,118, + 252,122,43,204,177,195,248,145,86,236,191,68,36,18,173,114,115,115,211,95,190,124,217,92,81,81,65,41,41,41,116,251,246,237,199,231,88,100,100,164, + 85,70,139,199,227,45,9,9,9,169,48,155,205,150,220,220,92,115,118,118,182,57,59,59,219,84,211,104,209,247,124,202,61,253,58,157,220,62,223,32, + 16,8,150,212,197,59,116,232,16,247,149,110,50,255,89,189,100,89,49,155,198,22,46,26,174,214,159,169,52,89,74,165,130,170,204,214,138,249,147,47, + 12,26,208,175,252,204,201,19,121,149,38,171,235,161,67,135,184,245,198,123,8,92,218,230,59,158,182,249,134,237,158,234,152,91,114,123,63,209,239,243, + 41,254,179,214,180,100,164,162,196,178,205,55,140,182,249,77,162,101,3,121,214,158,75,116,8,92,218,238,63,150,182,249,134,173,126,209,59,239,78,216, + 77,186,120,241,34,109,222,184,134,230,13,245,40,179,108,243,13,163,45,254,207,219,196,172,86,68,34,209,253,43,87,174,208,165,75,151,232,211,79,63, + 37,169,84,154,210,24,206,147,49,251,11,104,139,143,55,109,106,63,136,118,182,119,163,63,27,23,219,191,179,244,112,135,199,48,31,97,90,238,157,95, + 137,242,31,80,214,186,0,26,233,203,111,146,217,170,52,89,57,73,73,73,148,149,149,69,27,54,108,32,165,82,217,40,179,53,62,184,79,129,174,240, + 143,122,141,22,128,101,95,126,249,37,25,141,70,106,215,174,221,125,43,226,123,202,108,249,2,227,1,44,94,187,118,237,99,147,181,105,211,166,176,200, + 200,200,48,47,47,175,83,141,60,14,12,192,246,181,107,215,62,54,89,155,54,109,162,200,200,72,242,246,246,78,173,107,59,107,218,165,129,195,130,63, + 139,139,79,43,254,224,163,229,63,245,232,51,244,139,208,59,247,210,126,57,241,123,88,135,160,158,181,182,75,214,48,159,65,225,17,145,176,178,240,137, + 168,202,188,242,0,240,171,58,20,172,41,147,38,77,18,247,235,215,47,100,202,148,41,101,123,246,236,161,164,164,36,138,142,142,166,117,235,214,209,178, + 101,203,232,251,239,191,167,151,94,122,169,172,103,207,158,33,147,38,77,18,219,240,153,4,120,122,122,22,29,62,124,152,246,239,223,79,34,145,104,191, + 181,219,214,231,69,168,14,51,85,151,193,170,185,172,30,35,86,175,97,107,232,253,172,217,175,234,93,171,127,6,7,7,15,68,13,241,8,203,223,120, + 239,51,113,226,238,13,208,28,252,22,220,66,13,248,37,121,40,191,114,18,198,43,199,48,173,119,111,137,132,177,207,107,110,215,144,132,66,33,132,66, + 33,4,2,1,180,90,45,50,50,50,208,175,95,63,206,237,219,183,197,179,102,205,154,47,145,72,82,24,99,19,26,226,84,245,72,95,187,118,13,175, + 191,254,186,232,199,31,127,12,114,114,114,10,55,155,205,66,0,136,137,137,193,203,47,191,44,218,191,127,127,71,119,119,247,219,21,21,21,82,145,72, + 4,46,183,246,59,239,25,99,16,10,133,48,26,141,162,246,237,219,71,132,135,135,119,24,51,102,12,63,57,57,25,9,9,9,48,26,141,66,31,31, + 159,200,219,183,111,7,5,7,7,243,83,83,83,145,156,156,12,102,229,156,79,198,24,12,6,3,68,34,17,170,15,105,49,198,80,94,94,14,161,80, + 104,53,139,207,231,15,241,243,243,139,12,15,15,239,50,126,252,120,193,205,155,55,145,150,150,6,179,217,44,244,247,247,143,12,15,15,239,60,110,220, + 56,65,68,68,4,52,26,13,172,29,66,171,90,47,60,60,28,255,248,199,63,132,103,206,156,233,236,230,230,22,97,50,153,132,0,16,25,25,137,151, + 95,126,89,248,219,111,191,117,105,209,162,69,68,3,67,137,92,0,48,26,141,152,53,107,150,76,169,84,34,53,53,21,22,139,5,102,243,163,236,5, + 121,5,121,145,225,145,81,49,211,38,191,56,80,87,81,94,126,61,244,214,189,54,45,189,61,25,163,150,245,197,201,24,155,32,147,201,82,214,173,91, + 247,78,82,82,146,200,207,207,143,19,31,31,143,146,146,18,8,4,130,199,231,152,181,251,45,20,10,7,5,4,4,240,244,122,61,44,22,11,0,16, + 135,83,251,140,21,113,225,21,248,187,152,248,18,137,100,80,125,204,9,239,127,31,87,98,194,115,159,126,247,219,195,50,142,122,215,205,152,212,227,203, + 55,108,143,44,46,46,129,178,231,140,153,203,55,108,143,52,105,115,143,24,10,82,247,61,255,252,196,212,242,242,242,145,187,119,239,174,247,17,85,0, + 128,226,0,7,88,48,44,57,199,32,18,217,121,42,228,110,62,64,202,37,180,118,18,129,203,225,138,111,38,104,101,0,13,131,87,174,131,85,59,255, + 152,105,25,150,144,109,16,25,237,59,202,221,61,189,144,151,151,135,22,109,252,160,23,58,9,175,61,40,147,131,217,200,172,20,99,172,127,251,246,237, + 93,219,181,107,135,220,220,92,116,233,210,5,106,181,90,205,24,27,102,43,235,177,118,183,20,161,24,125,193,216,122,112,57,159,194,200,91,137,7,57, + 93,176,189,43,191,209,204,103,172,158,30,204,67,41,23,222,216,127,224,160,135,131,151,63,112,242,159,112,177,19,97,231,155,93,236,157,84,162,163,141, + 25,70,100,140,117,112,113,113,57,31,18,18,226,40,22,139,113,251,246,109,4,4,4,96,195,134,13,78,106,181,250,146,237,195,136,143,126,208,83,221, + 239,183,236,203,47,191,92,58,119,238,92,236,221,187,23,237,218,181,107,199,24,155,91,47,145,136,98,128,227,171,35,34,118,253,248,240,225,137,169,109, + 219,142,153,210,190,253,23,179,95,121,229,181,127,253,235,95,88,179,102,13,142,30,61,138,190,125,251,226,141,55,222,48,166,164,164,236,177,45,230,199, + 195,133,219,215,173,91,247,250,252,249,243,107,50,43,146,147,147,87,215,179,121,131,237,82,65,110,65,100,100,84,84,204,228,201,175,12,172,48,149,151, + 135,94,15,185,215,170,101,75,79,70,117,182,75,13,50,155,32,6,64,12,64,90,89,100,0,164,251,247,239,87,141,31,63,94,89,89,39,1,32,97, + 140,53,56,188,239,231,231,231,154,158,158,158,246,246,219,111,247,216,187,119,175,84,38,147,161,184,184,24,59,119,238,196,130,5,143,102,45,24,141,70, + 108,223,190,93,250,250,235,175,247,72,76,76,76,243,246,246,110,112,142,38,99,76,36,151,203,15,173,89,179,70,201,231,243,177,100,201,146,130,242,242, + 242,15,42,151,45,81,42,149,33,140,177,225,13,96,106,245,34,213,222,227,68,245,255,137,104,76,205,186,154,203,136,104,76,125,12,91,84,223,251,213, + 165,234,87,160,65,39,79,158,188,248,20,20,8,116,109,229,139,162,223,15,65,194,99,144,112,43,11,143,129,19,31,137,22,98,62,140,68,29,108,13, + 182,234,34,88,85,248,124,62,180,90,45,204,102,51,22,130,41,222,144,0,0,32,0,73,68,65,84,45,90,36,58,123,246,172,3,135,195,249,185,33, + 78,117,195,20,23,23,7,127,127,127,118,252,248,113,151,185,115,231,74,170,222,167,168,168,8,237,218,181,99,167,79,159,118,254,248,227,143,229,245,153, + 25,198,24,4,2,1,230,207,159,47,9,13,13,181,119,119,119,71,124,124,60,242,243,243,33,151,203,49,127,254,124,73,72,72,136,147,187,187,59,146, + 146,146,80,84,84,4,185,92,110,179,209,18,8,4,79,108,195,24,67,69,69,133,77,198,64,165,82,237,11,11,11,115,82,169,84,136,136,136,128,201, + 100,130,74,165,194,188,121,243,36,97,97,97,78,118,118,118,136,137,137,1,17,65,169,84,218,20,35,0,88,44,22,196,196,196,160,101,203,150,184,116, + 233,146,243,236,217,179,197,85,245,15,30,60,128,167,167,39,46,93,186,228,44,147,201,246,213,197,178,88,44,200,204,204,68,116,116,52,226,227,227,145, + 147,147,131,220,220,92,148,148,148,192,100,50,1,0,164,37,197,39,247,255,116,60,92,34,145,72,3,124,218,123,69,70,221,205,150,72,36,82,111,47, + 47,31,198,62,173,243,96,112,56,156,159,147,147,147,29,166,79,159,46,200,202,202,66,65,65,1,120,60,222,83,231,150,80,104,221,84,32,147,201,228, + 47,22,139,89,69,69,69,85,87,50,132,66,33,222,217,167,69,192,18,60,81,94,217,152,13,50,27,97,48,24,26,156,180,62,225,253,239,227,158,255, + 104,111,175,126,211,191,152,231,59,236,245,173,190,195,94,223,10,0,41,41,41,108,253,161,208,111,124,135,189,190,245,237,79,214,190,177,251,199,125,221, + 172,50,89,140,49,48,67,123,48,214,229,70,124,153,125,255,49,147,5,72,56,3,88,140,0,135,135,65,129,158,188,163,145,101,46,32,4,162,28,126, + 128,21,31,60,99,12,168,104,7,176,110,103,239,155,28,250,78,124,83,144,158,158,14,129,64,0,145,72,132,46,67,94,224,237,15,55,186,130,33,8, + 21,240,181,138,89,77,18,137,228,147,165,75,151,202,170,51,103,204,152,33,83,169,84,75,109,225,60,214,238,150,34,148,73,123,195,76,111,71,167,235, + 188,87,156,204,242,139,207,214,249,129,240,30,96,236,220,84,179,197,24,27,36,22,139,19,24,99,253,26,203,232,233,193,60,148,10,225,245,3,7,14, + 122,216,183,120,100,178,96,210,3,124,9,92,157,236,176,243,157,193,246,78,118,18,155,204,86,165,201,58,119,227,198,13,71,177,88,140,176,176,48,8, + 4,2,136,197,98,116,234,212,9,219,182,109,115,178,183,183,183,217,108,17,8,181,57,173,42,147,245,214,91,111,97,239,222,189,40,47,47,199,138,21, + 43,224,237,237,61,185,65,102,165,217,90,21,17,177,251,139,168,168,7,139,58,118,244,157,32,147,217,191,245,143,127,168,62,254,248,227,19,199,142,29, + 219,21,28,28,156,27,26,26,250,37,17,29,178,37,222,74,147,245,221,250,245,235,103,86,25,183,143,63,254,120,215,177,99,199,86,6,7,7,103,134, + 134,134,190,75,68,155,234,218,222,154,118,169,164,80,112,242,208,161,67,225,98,169,68,234,211,222,215,43,234,94,84,182,88,42,145,122,121,183,242,97, + 159,62,221,46,89,195,108,140,156,157,157,135,222,184,113,35,0,128,0,128,8,149,70,43,42,42,202,174,184,184,216,78,46,151,219,185,185,185,41,42, + 235,37,19,39,78,180,227,243,249,253,235,99,234,245,250,35,139,22,45,178,159,56,113,34,0,160,180,180,20,215,175,95,199,142,29,59,32,147,201,158, + 88,119,244,232,209,120,243,205,55,237,77,38,211,17,43,194,125,117,214,172,89,190,46,46,46,88,184,112,97,121,124,124,252,96,34,74,103,140,169,134, + 14,29,186,44,58,58,186,71,143,30,61,142,51,198,186,214,195,168,213,139,84,169,166,105,170,171,174,177,235,91,35,91,183,127,124,178,4,7,7,95, + 4,80,235,157,84,21,249,26,136,96,134,132,203,32,229,86,51,91,176,128,87,148,109,99,147,251,72,181,93,12,133,66,33,184,92,46,12,6,3,242, + 242,242,172,226,84,153,2,165,82,9,185,92,14,157,78,7,147,201,4,177,88,12,0,80,169,84,80,42,149,224,243,249,224,243,249,16,139,197,79,245, + 38,85,23,135,195,129,64,32,128,76,38,67,102,102,38,146,147,147,97,177,88,32,151,203,33,147,201,32,20,10,145,145,145,129,140,140,12,16,17,100, + 50,25,100,50,153,213,230,8,0,204,102,115,173,23,127,163,209,104,83,143,150,201,100,194,189,123,247,144,146,146,2,177,88,252,120,95,69,34,17,30, + 60,120,128,172,172,44,72,165,82,40,149,74,168,84,42,171,185,85,251,162,80,40,32,145,72,80,80,80,0,173,86,251,248,152,42,149,74,200,100,50, + 20,21,21,33,59,59,187,222,125,55,155,205,200,200,200,64,78,78,14,82,83,83,145,155,155,251,184,1,170,236,53,106,146,138,139,139,145,151,151,247, + 184,39,178,174,98,141,44,22,11,74,74,74,112,227,198,13,102,177,88,80,88,88,104,201,201,202,50,207,201,16,226,232,178,45,116,240,204,29,253,254, + 83,97,186,35,231,162,117,155,142,68,234,196,61,63,109,124,235,137,71,231,102,74,74,10,155,57,115,166,109,73,253,54,119,80,193,200,31,158,91,106, + 20,229,84,8,84,46,29,134,2,9,167,1,14,15,16,171,209,171,99,107,36,23,152,101,177,26,131,24,12,35,176,201,71,109,21,211,204,31,150,83, + 98,20,37,85,56,41,253,3,187,66,163,209,64,36,18,65,36,18,161,91,223,161,72,200,51,75,239,166,235,164,32,12,183,138,89,41,198,88,27,185, + 92,222,187,95,191,126,172,58,115,244,232,209,96,140,117,98,140,249,217,180,255,223,180,21,162,66,218,11,124,122,251,110,166,214,253,104,148,222,103,236, + 132,23,236,55,254,145,237,23,147,169,111,5,139,105,1,168,162,107,99,205,22,99,108,160,66,161,56,241,205,55,223,180,18,139,197,167,25,99,245,94, + 180,234,146,92,194,221,250,201,91,147,61,212,85,38,203,168,5,120,18,128,47,1,120,18,184,58,59,226,243,215,135,217,75,197,124,107,46,96,0,0, + 137,68,178,127,211,166,77,78,53,77,86,85,233,210,165,11,150,44,89,226,100,111,111,95,231,143,159,234,178,151,11,253,139,139,75,248,32,160,76,171, + 21,218,203,133,143,127,56,84,55,89,107,214,172,193,241,227,199,209,171,87,47,204,156,57,179,36,57,57,121,101,125,92,198,216,48,165,82,185,103,240, + 224,193,55,210,100,178,57,169,129,129,252,115,42,85,209,115,69,69,42,239,168,40,163,47,16,9,96,115,106,106,234,72,107,77,22,99,236,37,165,82, + 25,58,100,200,144,10,153,76,166,89,181,106,213,140,185,115,231,98,205,154,53,88,188,120,241,46,0,51,137,232,163,212,212,84,247,250,76,22,240,239, + 105,151,254,93,109,157,197,98,73,61,116,232,80,143,138,138,10,79,60,26,30,20,21,22,22,42,243,243,243,21,21,21,21,50,139,197,34,179,179,179, + 147,3,144,78,155,54,141,23,29,29,29,96,50,153,210,235,99,38,39,39,79,91,180,104,145,38,55,55,23,0,208,169,83,39,228,228,228,96,193,130, + 5,143,123,180,58,119,238,12,34,66,126,126,62,86,175,94,157,149,145,145,49,205,138,112,219,182,111,223,30,81,81,81,136,139,139,251,3,128,153,49, + 166,0,80,114,251,246,237,152,188,188,60,236,219,183,79,224,225,225,113,172,174,20,47,245,121,145,70,234,100,99,54,170,234,185,170,173,71,204,86,113, + 0,32,56,56,152,85,127,173,46,46,67,68,202,173,75,176,239,208,245,137,222,44,41,151,65,162,84,33,33,53,25,2,176,104,91,223,184,174,11,98, + 65,65,1,230,204,153,163,155,50,101,74,158,197,98,121,161,193,29,168,188,200,171,84,42,168,84,42,220,189,123,151,158,127,254,121,205,134,13,27,116, + 85,245,74,165,18,113,113,113,52,124,248,240,236,165,75,151,150,214,103,180,170,122,180,86,173,90,165,27,52,104,80,78,116,116,52,85,153,41,185,92, + 142,117,235,214,233,6,15,30,172,185,121,243,38,85,213,217,210,163,197,225,112,30,27,173,234,219,112,56,28,88,44,22,155,140,86,89,89,217,148,224, + 224,96,77,76,76,12,85,237,167,74,165,194,134,13,27,116,195,134,13,211,68,71,71,83,85,157,82,169,180,218,12,86,189,191,66,161,128,82,169,196, + 221,187,119,105,248,240,225,154,175,191,254,90,95,189,254,222,189,123,52,110,220,56,77,73,73,73,157,183,239,90,44,22,84,13,231,153,76,38,232,245, + 122,228,230,230,34,53,53,245,113,119,186,78,166,28,57,249,165,177,65,58,157,78,123,55,238,126,74,167,142,1,206,58,157,78,155,156,146,18,71,180, + 180,206,22,202,98,177,188,208,161,67,135,188,57,115,230,232,10,10,10,154,108,180,132,66,97,12,143,199,163,254,253,251,147,193,96,160,212,212,84,99, + 110,65,129,201,239,139,47,40,250,157,119,152,228,214,45,145,92,46,103,149,76,78,124,124,188,69,34,145,196,88,5,175,67,141,50,91,28,139,43,24, + 245,187,124,191,212,110,216,216,151,133,44,43,20,168,40,5,68,106,64,164,6,79,230,128,81,253,59,115,119,223,40,118,5,89,250,64,32,242,108,144, + 201,39,23,192,210,255,247,56,189,186,223,164,121,194,252,252,124,112,185,220,199,166,72,42,147,225,185,9,211,56,223,135,150,187,2,212,23,140,219,48, + 179,82,66,161,240,131,79,62,249,68,80,80,80,0,14,135,243,255,76,169,20,179,103,207,22,41,149,202,197,86,239,251,225,0,1,248,162,94,176,208, + 219,177,89,58,247,99,17,58,159,247,86,238,148,116,232,220,3,179,6,57,75,86,158,202,14,8,79,215,182,2,204,239,194,100,232,102,171,217,98,140, + 245,87,40,20,39,111,221,186,37,29,61,122,52,214,173,91,39,147,72,36,167,173,73,231,81,83,101,165,230,185,203,191,254,65,19,241,229,8,160,162, + 236,145,193,170,86,178,75,45,88,178,243,124,145,209,72,13,246,14,85,73,167,211,189,58,115,230,204,188,35,71,142,60,101,178,196,98,49,18,19,19, + 177,98,197,138,252,252,252,252,215,26,98,217,203,133,254,193,99,7,133,237,222,245,133,12,32,124,187,113,158,100,208,144,128,168,94,61,123,232,21,10, + 69,226,234,213,171,151,206,153,51,167,202,200,124,250,235,175,191,206,29,55,110,92,196,173,91,183,166,18,81,157,67,39,140,177,97,115,231,206,253,34, + 35,35,195,255,252,249,243,188,172,172,44,245,7,43,86,20,29,200,203,203,95,25,21,21,247,81,199,142,237,22,6,6,190,86,87,234,135,58,152,47, + 189,245,214,91,7,211,211,211,187,159,63,127,158,159,153,153,233,52,105,210,36,172,92,185,178,186,201,178,218,205,88,211,46,201,212,134,145,47,190,248, + 98,144,94,171,211,198,221,143,77,233,232,223,209,89,175,213,105,83,146,19,227,104,233,211,237,146,53,204,198,40,47,47,239,193,190,125,251,238,207,157, + 59,183,107,90,90,154,63,0,135,146,146,18,89,73,73,137,200,96,48,72,212,106,181,186,115,231,206,142,111,188,241,134,252,246,237,219,1,233,233,233, + 37,0,146,234,99,18,81,124,70,70,198,200,209,163,71,231,23,20,20,160,99,199,142,24,55,110,28,220,220,220,224,230,230,134,113,227,198,33,32,32, + 0,133,133,133,120,229,149,87,114,51,51,51,71,18,81,188,21,225,62,204,202,202,66,159,62,125,176,124,249,242,49,47,190,248,98,116,255,254,253,139, + 59,118,236,88,218,162,69,139,54,95,125,245,21,60,60,60,112,232,208,33,55,145,72,244,83,205,141,235,243,34,0,114,42,13,143,161,198,107,78,3, + 203,172,221,182,214,191,173,88,175,65,53,120,229,173,0,150,236,57,180,91,47,244,106,7,149,111,16,164,98,49,36,66,33,36,106,7,148,91,44,216, + 145,152,165,45,35,178,190,161,172,84,205,11,33,99,12,223,126,251,173,169,119,239,222,250,243,231,207,127,163,211,233,188,136,232,215,134,56,213,77,193, + 215,95,127,173,157,63,127,126,120,118,118,118,144,88,44,54,84,213,127,243,205,55,218,105,211,166,69,165,165,165,117,145,74,165,218,186,230,103,85,241, + 42,135,54,202,179,179,179,123,204,152,49,35,102,243,230,205,101,82,169,20,50,153,12,34,145,200,144,157,157,29,52,103,206,156,240,181,107,215,106,37, + 18,9,100,50,153,77,195,114,68,244,148,161,170,94,111,173,140,70,227,249,236,236,236,160,249,243,231,223,249,234,171,175,202,170,12,80,245,24,215,175, + 95,175,149,203,229,54,245,104,85,173,39,147,201,176,113,227,70,237,188,121,243,194,179,179,179,131,68,34,145,161,90,125,217,220,185,115,239,100,103,103, + 7,25,141,198,243,117,177,204,102,179,185,184,184,24,60,30,15,81,81,81,229,2,129,0,28,14,7,15,30,60,120,220,248,216,219,219,7,4,117,234, + 232,247,195,254,67,23,37,2,145,168,119,143,110,254,241,73,201,105,68,172,161,198,226,87,157,78,231,117,254,252,249,111,122,247,238,173,255,246,219,111, + 77,117,245,108,89,163,242,242,242,139,183,111,223,54,138,197,98,150,153,153,105,226,114,185,48,155,205,84,222,163,71,121,167,175,190,162,187,11,23,50, + 165,76,198,19,8,4,144,74,165,236,204,153,51,6,173,86,123,209,42,120,61,178,217,108,113,32,5,131,228,126,118,185,66,204,49,49,196,253,250,200, + 100,137,237,0,177,26,16,171,225,225,225,137,208,68,173,2,28,8,97,182,34,135,24,145,12,12,210,40,13,20,124,161,132,101,101,101,61,54,68,85, + 165,85,59,127,220,78,46,149,131,145,8,92,216,146,130,100,140,131,131,3,47,51,51,243,41,102,64,64,0,215,104,52,90,159,218,37,195,236,6,88, + 230,198,101,235,221,127,9,215,250,188,179,242,123,137,196,92,8,220,250,26,29,218,184,227,157,73,157,133,31,31,205,233,112,51,73,219,6,60,154,13, + 75,169,147,181,104,198,88,63,133,66,113,250,230,205,155,82,133,66,129,248,248,120,244,232,209,3,219,183,111,151,74,165,210,83,140,177,122,231,227,213, + 212,141,44,74,46,45,49,247,254,224,80,74,86,68,166,233,9,147,149,83,70,152,185,250,88,97,65,177,254,133,235,41,117,127,127,106,138,136,238,20, + 22,22,14,95,188,120,113,94,78,78,206,19,38,43,57,57,25,147,39,79,206,207,201,201,25,68,68,13,254,248,101,60,44,88,241,249,219,162,208,208, + 40,140,12,126,219,116,251,206,3,44,124,127,60,199,217,73,37,138,136,136,104,249,194,11,47,84,25,153,79,137,104,25,17,109,74,78,78,14,34,162, + 122,179,198,43,20,138,41,43,87,174,196,177,99,199,208,165,75,23,221,145,35,71,192,229,114,113,248,247,223,147,246,221,191,191,168,106,206,86,109,169, + 31,234,97,190,187,114,229,74,28,63,126,28,93,186,116,41,251,229,151,95,192,225,112,176,118,237,218,92,216,104,178,0,235,218,37,59,59,117,64,167, + 142,29,253,246,239,63,112,81,192,19,137,122,244,238,233,159,152,148,148,70,172,246,118,201,26,102,99,68,68,148,155,155,123,245,187,239,190,187,62,100, + 200,16,217,212,169,83,157,143,30,61,234,160,213,106,221,5,2,129,139,193,96,16,222,189,123,151,119,248,240,97,183,123,247,238,37,234,116,186,80,170, + 156,149,94,159,10,11,11,35,238,221,187,55,34,48,48,240,222,134,13,27,210,92,92,92,44,175,191,254,58,94,127,253,117,184,184,184,88,54,110,220, + 152,214,167,79,159,232,216,216,216,145,101,101,101,145,86,134,187,235,139,47,190,184,186,127,255,126,140,29,59,22,171,87,175,198,129,3,7,112,225,194, + 5,201,229,203,151,133,219,183,111,135,64,32,64,175,94,189,48,98,196,136,129,204,134,228,207,0,110,226,81,239,212,31,53,94,111,54,176,204,218,109, + 235,250,187,161,245,26,150,53,51,230,255,209,6,203,102,119,84,104,175,77,237,69,89,111,244,35,205,203,254,116,101,160,61,205,104,203,202,94,109,100, + 122,7,157,78,247,184,28,57,114,132,92,93,93,203,20,10,133,205,233,29,92,93,93,53,197,197,197,212,189,123,247,124,39,39,167,199,169,8,220,220, + 220,52,101,101,101,212,171,87,175,124,103,103,231,199,233,29,60,61,61,83,137,136,188,189,189,107,189,179,207,213,213,85,99,50,153,200,213,213,181,42, + 69,2,223,222,222,126,75,207,158,61,243,53,26,13,185,185,185,61,78,157,224,228,228,180,174,71,143,30,79,212,91,17,111,106,90,90,26,165,165,165, + 81,139,22,45,50,170,215,39,39,39,83,114,114,50,121,122,122,218,156,222,193,201,201,105,109,205,88,26,27,163,151,151,151,70,167,211,81,159,62,125, + 158,56,166,94,94,94,26,189,94,95,85,111,85,122,7,137,68,50,75,44,22,103,136,197,226,12,145,72,180,162,101,203,150,217,63,253,244,19,109,220, + 184,145,20,10,197,163,244,14,1,227,122,183,235,243,218,71,78,1,227,223,107,74,122,7,133,66,113,206,213,213,181,236,200,145,35,79,156,95,58,157, + 206,234,244,14,18,137,36,173,180,180,212,162,209,104,140,87,175,94,213,222,186,117,75,27,21,21,165,77,76,76,212,229,101,103,87,104,52,26,93,81, + 81,81,121,120,120,120,185,84,90,127,122,135,67,135,14,113,235,42,85,223,131,234,42,44,44,36,133,66,97,169,90,167,206,88,183,251,180,163,45,126, + 199,30,46,111,117,119,254,0,169,62,242,243,32,162,159,39,18,157,154,73,116,254,3,10,221,246,6,245,105,37,50,95,93,208,34,142,182,250,254,98, + 85,74,134,237,157,218,209,22,191,83,247,63,109,117,247,213,254,238,250,29,155,55,82,72,72,8,69,69,69,81,124,124,60,157,250,245,39,234,211,70, + 250,136,185,197,239,152,45,105,30,0,244,21,137,68,165,27,54,108,160,27,55,110,60,102,30,59,118,140,164,82,169,22,176,242,174,101,128,209,166,128, + 137,166,205,190,87,22,15,147,151,230,157,248,128,40,114,55,209,246,14,68,187,122,18,253,20,76,116,252,53,186,177,113,18,245,109,37,48,210,86,223, + 203,180,51,96,152,181,113,242,249,252,226,35,71,142,80,70,70,6,93,186,116,137,110,221,186,69,49,49,49,148,146,146,66,39,79,158,36,62,159,175, + 7,96,243,93,141,61,93,224,61,180,189,32,51,124,85,95,162,163,147,41,103,223,63,104,76,71,69,126,175,22,188,33,182,178,170,29,211,206,14,14, + 14,185,39,79,158,164,196,196,68,186,120,241,34,57,59,59,231,2,232,96,45,163,95,111,255,56,50,132,211,128,190,254,21,74,165,252,198,128,190,237, + 41,253,225,215,212,163,107,75,227,230,205,155,41,43,43,139,164,82,105,162,173,177,13,30,60,56,132,136,194,186,116,233,114,25,192,128,160,160,160,203, + 9,9,9,97,221,187,119,191,129,122,82,63,52,192,172,32,34,234,218,181,107,9,128,113,129,129,129,37,9,9,9,212,189,123,119,67,99,142,159,53, + 237,82,64,96,175,222,125,6,13,255,40,160,75,239,247,172,73,239,96,13,179,169,5,143,38,220,123,0,8,192,163,28,78,221,42,255,118,135,13,119, + 28,214,194,156,202,231,243,119,216,217,217,253,105,103,103,247,39,159,207,223,1,96,106,99,152,120,212,129,51,11,192,89,39,39,167,7,129,129,129,186, + 17,35,70,208,168,81,163,232,173,183,222,34,139,197,66,17,17,17,228,39,145,232,183,1,9,219,129,179,219,172,204,50,240,191,90,172,94,113,82,43, + 244,157,222,134,93,156,210,26,37,147,91,163,244,159,109,217,149,23,90,161,222,134,2,181,60,221,187,234,2,99,177,88,40,46,46,142,6,15,30,92, + 38,147,201,210,1,140,176,242,67,124,130,233,232,232,120,203,217,217,57,149,199,123,178,209,170,86,255,92,245,122,103,103,231,107,110,110,110,26,39,39, + 167,219,181,49,29,29,29,111,185,185,185,105,28,29,29,111,85,223,142,203,229,142,118,116,116,76,175,89,207,227,241,134,56,59,59,167,214,172,175,109, + 223,137,30,25,170,140,140,12,202,201,201,33,47,47,175,39,140,86,90,90,26,101,101,101,61,97,192,172,97,54,20,75,93,245,117,49,173,56,166,54, + 127,238,213,150,249,120,120,120,100,175,95,191,158,228,114,249,19,141,143,239,128,127,126,18,114,191,180,120,230,135,91,126,114,242,159,208,201,150,125,175, + 182,222,8,153,76,150,62,120,240,224,178,184,184,56,178,88,44,100,177,88,106,53,90,117,156,159,35,187,117,235,150,151,155,155,107,46,41,41,49,165, + 166,166,150,39,36,36,232,62,255,252,243,138,156,156,28,125,105,105,169,33,34,34,162,220,205,205,45,7,192,83,183,121,87,103,218,98,180,70,143,30, + 77,106,181,250,83,198,88,73,77,163,245,84,156,135,252,5,180,205,191,47,109,245,63,25,179,212,251,222,107,61,101,229,97,235,71,19,157,255,128,110, + 108,153,73,189,91,9,31,25,162,109,126,167,233,123,159,1,244,117,27,97,131,251,126,200,95,64,59,218,246,167,109,126,167,239,46,241,190,55,177,171, + 147,97,255,238,109,244,224,193,3,58,118,120,31,245,106,93,105,178,182,250,159,165,45,254,131,173,98,62,185,172,175,72,36,42,221,185,115,39,61,120, + 240,128,126,249,229,23,171,76,214,19,76,128,209,150,128,9,166,205,190,87,22,13,149,23,206,236,41,46,159,220,89,104,24,223,65,80,49,188,157,192, + 212,199,155,103,14,114,227,88,252,157,64,195,125,37,229,180,213,247,50,109,245,127,170,93,169,43,78,161,80,152,130,106,57,117,106,22,145,72,148,83, + 151,209,106,232,252,236,233,2,239,161,62,162,204,115,203,135,208,216,64,69,158,53,38,171,33,38,128,206,142,142,142,185,187,118,237,34,23,23,151,28, + 107,76,86,117,166,189,74,176,43,45,241,12,29,218,247,25,245,239,237,67,187,183,205,165,155,87,150,145,189,138,191,183,119,239,222,153,185,185,185,212, + 175,95,191,82,91,227,84,40,20,123,74,75,75,195,118,239,222,29,214,169,83,167,203,27,55,110,12,187,122,245,106,152,68,34,217,83,185,254,83,102, + 203,191,70,251,95,11,51,180,164,164,132,118,239,222,77,157,58,117,42,217,184,113,35,93,189,122,149,36,18,73,104,67,241,89,121,126,214,217,46,245, + 27,50,250,147,251,9,25,197,31,44,254,236,39,255,238,125,173,110,151,234,99,54,229,115,111,76,249,171,153,0,228,246,18,201,189,240,240,112,42,40, + 40,160,46,173,91,83,20,159,79,121,2,1,93,224,114,43,182,2,171,158,117,124,255,77,229,223,11,175,195,104,233,245,122,90,176,96,129,65,44,22, + 107,5,2,193,34,0,130,255,149,19,166,169,76,71,71,199,107,46,46,46,26,23,23,151,39,204,94,245,122,71,71,199,219,127,117,156,255,78,38,0, + 31,129,64,144,204,231,243,227,170,215,59,5,140,235,221,182,239,171,139,93,58,140,27,213,148,56,1,8,4,2,193,34,177,88,172,93,176,96,129,161, + 180,180,212,106,163,85,89,63,76,42,149,166,239,217,179,71,119,255,254,125,99,126,126,190,41,36,36,196,120,235,214,45,195,178,101,203,74,164,82,105, + 58,128,90,123,74,108,53,90,74,165,146,136,136,6,12,24,64,29,59,118,148,186,187,187,219,55,104,180,136,64,95,183,17,86,153,173,200,197,222,49, + 99,59,74,43,182,191,59,156,122,183,172,97,178,118,121,139,172,254,140,190,110,35,172,50,91,119,62,246,138,25,236,35,55,173,92,252,14,245,106,45, + 121,210,100,217,194,124,114,121,95,169,84,90,178,116,233,82,171,123,178,158,98,238,240,245,162,45,126,123,31,153,168,134,138,255,14,250,214,215,235,191, + 225,156,39,122,100,182,158,243,17,69,91,219,147,101,13,19,64,103,181,90,125,207,26,147,85,147,169,150,9,252,167,77,30,174,79,122,112,148,74,243, + 78,81,228,205,141,244,226,196,110,20,216,169,99,238,230,205,155,41,54,54,150,100,50,217,5,91,227,4,48,108,246,236,217,97,73,73,73,97,241,241, + 241,97,87,175,94,13,155,48,97,66,88,245,239,76,117,179,85,241,252,243,229,157,57,156,119,26,96,190,52,123,246,108,74,76,76,164,248,248,120,186, + 122,245,42,77,152,48,129,0,188,244,172,62,163,186,218,165,128,192,94,189,251,14,28,182,184,67,96,15,155,219,165,186,152,77,253,220,255,29,231,231, + 191,147,9,64,58,106,212,40,139,217,108,166,81,35,71,210,2,198,138,190,103,44,247,123,198,114,183,2,233,223,0,45,159,117,124,255,77,133,135,255, + 176,42,31,208,235,36,151,203,79,234,245,250,121,68,148,249,159,142,225,175,84,78,78,78,31,91,234,255,142,34,162,56,0,222,53,235,179,163,143,94, + 7,112,253,25,240,43,0,172,100,140,237,217,182,109,219,55,235,214,173,155,32,22,139,173,154,180,88,185,253,239,140,177,14,179,102,205,122,71,44,22, + 15,214,106,181,62,0,32,147,201,226,202,203,203,47,232,116,186,47,137,168,176,169,113,114,254,143,189,243,14,143,162,234,254,248,247,206,108,239,105,155, + 30,66,32,144,132,208,123,145,34,210,65,186,116,69,16,68,20,1,69,69,197,74,21,81,81,176,33,136,130,72,147,222,69,64,84,122,135,64,8,1, + 18,82,72,79,54,219,119,167,220,223,31,73,48,134,148,13,182,247,253,189,251,121,158,125,118,103,118,230,187,231,206,236,206,158,57,247,222,115,24,198, + 252,214,91,111,53,55,24,12,183,50,50,50,16,26,26,106,89,185,114,165,103,131,183,167,37,187,176,44,250,12,228,242,69,77,194,212,179,223,232,71, + 201,194,253,199,34,23,15,13,188,211,49,90,115,27,82,241,61,16,231,41,140,79,113,122,108,80,137,230,41,168,184,69,205,35,212,179,23,12,2,121, + 111,239,55,145,239,15,246,191,211,177,190,246,14,40,222,131,194,118,188,86,154,229,160,148,254,70,8,233,251,193,7,31,124,107,179,217,38,81,74,15, + 215,90,68,199,100,193,202,189,9,142,109,2,138,170,7,223,81,106,3,131,203,200,103,106,85,76,252,239,228,68,22,77,5,80,235,84,56,213,65,41, + 61,15,192,179,186,152,21,40,176,184,174,250,105,229,173,246,236,61,50,43,58,58,226,17,135,147,9,27,51,118,2,38,61,211,210,63,52,52,20,243, + 231,207,167,86,171,245,253,7,176,233,71,66,8,214,174,93,59,166,81,163,70,13,18,18,18,110,216,237,246,117,148,210,31,203,109,67,9,33,59,223, + 187,120,209,186,60,33,225,55,151,40,254,86,131,230,198,82,205,23,26,53,106,212,44,33,33,225,162,221,110,255,144,82,122,223,128,234,7,165,170,235, + 210,149,11,199,31,248,186,84,149,230,255,26,148,82,27,203,178,203,98,99,99,7,223,184,113,99,238,30,74,191,250,183,109,250,39,33,165,222,230,223, + 35,78,72,15,74,233,65,175,166,87,243,191,89,179,108,176,46,245,224,199,226,169,230,156,57,115,234,204,159,63,191,152,82,106,34,132,80,74,105,217, + 132,136,202,10,240,86,173,185,44,90,14,185,188,53,168,56,13,4,245,64,73,58,100,226,210,154,156,172,26,53,85,164,45,120,201,12,16,68,128,34, + 11,148,249,168,38,39,235,31,61,71,132,16,188,141,170,7,81,191,141,123,183,210,30,107,254,9,254,63,104,18,66,250,104,181,218,217,205,154,53,107, + 113,225,194,133,51,86,171,245,125,74,233,190,255,52,59,189,154,255,127,53,255,191,242,143,71,180,188,120,249,111,195,19,7,171,182,204,155,55,239,206, + 188,121,37,5,21,94,127,253,245,72,131,193,144,170,215,235,171,203,100,93,57,211,146,93,216,28,127,26,121,236,44,48,168,7,240,169,176,242,89,152, + 150,226,122,96,227,74,52,79,34,143,76,7,139,24,200,249,100,88,92,89,152,242,39,52,255,106,74,206,73,213,231,229,193,210,160,254,79,83,234,84, + 213,232,88,121,241,226,165,118,120,29,45,47,94,254,101,230,205,155,119,7,64,228,252,249,243,115,30,72,96,120,130,27,64,122,233,227,175,225,239,208, + 244,226,197,139,151,255,65,8,128,30,149,189,81,155,144,32,33,164,82,141,234,168,73,223,171,233,213,244,106,122,53,189,154,94,77,175,230,255,63,205, + 10,218,125,43,121,43,177,18,205,21,181,181,227,63,134,191,115,164,61,254,31,206,158,240,106,254,117,154,40,201,223,82,109,254,156,255,4,59,189,154, + 94,77,175,166,87,211,171,249,247,107,86,243,89,147,255,169,207,250,59,30,222,174,67,47,255,24,132,144,120,0,61,1,28,1,208,78,213,93,181,80, + 112,80,74,8,25,8,192,1,96,24,128,211,148,82,143,107,191,121,241,226,197,139,23,47,255,201,252,171,142,150,58,32,38,4,18,166,25,17,105,28, + 0,80,134,92,3,47,94,180,229,93,255,211,41,31,116,97,177,126,20,242,77,4,174,199,204,25,137,5,127,86,175,105,172,97,104,80,128,110,108,86, + 190,233,219,203,215,204,219,107,179,175,143,79,93,131,210,207,119,184,211,205,53,145,203,100,119,220,69,197,43,10,10,146,205,127,214,166,191,19,117,64, + 76,8,97,208,77,163,211,181,82,40,213,109,213,58,223,134,34,5,10,178,51,82,92,28,255,171,224,178,157,165,34,142,212,116,174,8,33,101,101,158, + 122,105,94,159,186,87,59,118,40,10,103,47,112,50,220,9,52,220,25,172,40,202,229,145,26,149,246,245,59,175,197,212,123,126,122,123,172,248,242,68, + 89,56,249,8,0,145,150,222,206,252,91,180,110,230,55,33,196,104,24,150,146,150,247,229,229,235,230,29,255,166,45,255,36,186,208,198,19,24,137,252, + 13,66,185,96,48,178,12,222,229,124,205,146,117,197,163,226,191,0,80,39,174,227,49,66,152,186,148,138,169,119,174,29,235,112,111,125,124,167,3,162, + 32,198,17,194,220,76,187,246,91,183,154,182,247,132,152,104,205,216,48,163,97,145,205,234,186,112,226,82,222,159,42,254,234,197,139,23,47,127,53,85, + 58,90,117,27,119,62,173,84,170,162,0,64,164,20,34,5,172,197,69,103,239,38,159,238,13,0,198,168,86,251,165,74,125,43,145,150,188,47,136,0, + 239,118,220,54,165,156,104,227,201,7,107,3,99,135,244,232,213,99,232,128,1,253,99,155,54,105,26,13,0,151,46,95,74,222,181,107,119,162,54,48, + 118,139,37,39,113,235,159,105,24,133,114,110,235,214,45,30,58,115,230,220,187,0,158,253,51,90,0,224,239,175,157,118,224,135,89,93,30,25,186,68, + 3,160,86,142,150,210,207,119,248,160,71,251,180,120,233,249,41,204,83,179,22,68,157,254,237,200,98,93,104,147,34,42,114,7,172,217,35,127,169,174, + 112,114,109,32,161,173,84,42,193,62,154,128,78,65,73,175,240,74,149,72,191,207,203,187,110,169,141,142,33,180,113,143,176,200,168,45,35,39,204,84, + 170,13,65,18,176,50,0,4,153,41,87,113,104,253,66,223,25,239,172,106,249,219,197,84,254,167,31,62,117,104,66,27,15,181,102,94,169,106,186,248, + 72,149,190,235,39,12,81,40,173,166,253,251,52,163,7,195,193,88,193,69,232,20,228,7,87,122,242,15,150,112,235,69,23,224,164,249,221,31,9,170, + 167,215,93,65,72,112,58,0,76,232,173,82,253,224,160,37,209,46,74,233,47,213,182,187,110,93,133,218,46,31,6,130,241,0,92,132,146,175,173,185, + 234,157,148,158,253,67,237,64,77,80,220,35,115,23,124,244,194,204,9,189,42,27,19,112,31,209,209,68,222,180,65,131,201,63,172,126,182,237,67,3, + 22,184,72,221,186,71,239,189,153,154,106,167,37,249,186,254,117,84,65,141,218,234,52,218,209,96,153,1,162,8,158,119,187,183,186,157,214,239,173,57, + 215,47,63,136,158,62,188,217,59,237,58,61,60,107,232,152,73,170,140,34,130,243,87,146,235,93,254,241,203,175,244,17,205,3,138,211,46,124,234,137, + 134,76,46,175,179,107,215,174,224,94,189,122,5,25,34,90,148,228,28,35,128,65,167,209,31,60,120,128,244,233,211,39,52,160,94,235,34,74,1,42, + 138,48,24,244,250,61,187,119,145,62,125,122,123,86,249,188,28,140,128,23,55,172,122,38,244,163,207,14,248,197,69,171,218,93,75,182,159,172,173,134, + 23,47,94,188,252,93,84,233,104,41,149,170,168,19,71,118,249,109,253,53,13,0,208,163,101,48,94,155,183,172,23,33,36,17,0,6,62,245,118,204, + 187,175,62,143,99,87,114,64,41,69,139,6,254,232,59,232,49,143,162,15,170,224,248,54,35,71,140,24,51,107,214,139,3,111,220,184,145,242,253,247, + 223,255,2,0,157,59,119,110,176,96,193,130,17,75,124,253,20,170,224,248,12,123,86,130,103,5,27,43,234,135,69,135,197,55,108,54,118,195,215,203, + 152,110,189,135,141,86,133,69,47,180,103,36,103,120,178,175,209,104,156,46,149,74,13,64,73,53,246,50,234,71,176,193,0,192,11,162,206,47,44,206, + 204,202,148,130,66,33,75,48,91,44,223,154,210,19,86,86,167,233,228,184,198,51,158,121,146,57,127,51,31,81,141,59,179,75,23,190,14,81,224,124, + 103,190,58,111,248,153,147,27,0,188,245,243,131,180,179,12,189,49,190,190,192,8,83,13,18,201,240,94,125,122,186,102,191,248,108,184,72,69,44,254, + 120,197,107,7,246,31,120,75,19,20,179,87,36,116,133,61,43,201,163,227,233,231,239,247,221,244,57,31,105,173,174,223,211,20,149,58,89,248,234,219, + 77,184,144,38,34,46,54,78,18,60,125,177,246,203,121,147,191,65,73,157,173,251,80,105,31,250,176,126,199,35,1,46,139,128,155,199,35,187,103,119, + 26,156,133,122,193,193,184,148,114,4,156,48,205,58,50,119,44,128,76,0,107,186,119,59,178,45,62,158,233,122,233,146,184,119,156,90,61,120,77,189, + 122,10,183,217,12,255,212,212,229,0,154,84,166,175,13,142,143,163,84,156,236,43,215,141,155,252,236,120,223,193,131,6,80,139,205,77,214,109,220,218, + 119,203,150,77,191,170,131,98,150,216,33,63,68,179,47,217,52,129,13,155,190,50,251,213,29,125,122,116,246,56,138,155,155,43,143,112,213,21,253,0, + 128,231,161,85,59,228,69,40,75,221,20,20,235,6,170,73,152,89,5,36,168,169,218,71,70,199,107,180,134,233,162,40,238,206,72,252,237,133,218,106, + 148,167,81,251,126,109,131,67,66,247,247,24,62,73,111,172,19,71,76,86,43,146,46,159,157,117,254,199,239,39,249,214,139,111,94,120,43,33,173,54, + 122,190,190,245,244,50,95,227,140,137,83,102,170,22,204,157,3,187,185,16,114,181,15,186,140,124,69,183,231,203,23,230,17,66,190,160,148,214,88,33, + 215,225,112,20,244,238,221,39,196,24,20,74,150,173,252,200,96,113,240,176,58,121,204,125,101,18,6,13,26,4,181,70,75,190,253,126,171,193,225,18, + 224,228,4,76,127,246,41,244,233,211,143,114,28,95,101,98,89,66,136,194,96,48,236,82,42,149,18,160,44,195,3,160,83,48,245,40,5,68,17,82, + 170,138,219,219,176,197,195,229,28,96,10,155,205,238,206,116,231,54,160,41,15,150,104,213,139,23,47,94,254,12,213,254,233,104,85,18,36,222,202,2, + 0,248,168,128,105,79,63,129,252,188,220,24,23,47,98,194,19,227,112,238,218,93,36,222,206,5,165,20,49,225,106,0,213,36,16,44,7,11,177,245, + 132,137,19,186,238,63,112,224,212,27,115,222,88,67,72,73,214,221,47,87,124,213,225,205,183,222,156,52,238,137,113,61,55,111,222,124,5,158,86,198, + 174,216,40,162,91,246,254,162,249,242,244,60,135,99,250,172,217,226,139,176,196,247,2,0,0,32,0,73,68,65,84,47,76,95,138,146,241,63,53,34, + 149,74,13,233,233,233,90,134,249,227,141,245,123,243,103,31,237,57,116,73,82,202,157,162,243,251,119,236,104,19,31,31,143,244,140,172,78,139,63,254, + 162,121,72,116,155,39,205,197,246,161,214,220,132,74,179,80,43,164,210,43,239,44,254,188,133,232,211,128,121,109,82,63,52,142,14,69,70,78,17,186, + 244,30,40,57,123,250,116,47,0,63,63,72,59,59,118,236,216,57,171,208,241,154,66,171,168,63,101,210,68,50,229,169,177,33,156,40,97,114,77,78, + 48,12,193,135,239,205,143,144,45,121,151,126,183,113,231,208,79,63,255,170,151,38,40,182,128,130,190,101,203,190,94,67,23,24,245,11,15,212,35,49, + 173,164,119,179,162,147,101,117,240,0,0,25,43,128,128,250,87,165,226,118,38,39,229,37,29,13,182,155,210,33,138,166,43,40,178,118,199,217,228,0, + 0,185,154,192,216,119,130,131,2,199,90,157,46,135,165,168,80,176,228,92,239,78,8,145,0,192,121,226,190,116,44,53,53,238,178,221,14,11,144,80, + 153,182,38,40,246,195,110,157,219,207,124,121,230,179,104,210,36,158,58,92,64,86,161,131,168,101,34,158,158,50,197,57,122,244,232,134,217,217,89,227, + 237,197,182,28,101,72,92,246,216,209,227,126,30,51,106,164,242,66,170,221,18,19,174,172,241,216,106,181,218,184,110,221,122,78,234,212,62,254,122,207, + 225,75,46,231,230,185,246,204,95,125,184,123,199,88,31,100,230,20,99,204,160,135,101,53,138,84,32,32,32,70,27,168,215,159,28,48,112,104,125,65, + 160,210,29,219,54,252,233,238,99,153,76,182,250,165,215,222,52,72,124,234,224,110,161,29,60,8,26,183,238,196,74,165,172,239,217,253,27,151,3,120, + 180,54,122,188,66,209,164,211,67,15,211,204,66,55,4,151,13,187,182,111,198,224,161,143,65,165,214,65,231,19,40,242,238,184,24,0,87,107,210,201, + 184,126,162,169,62,172,153,245,179,175,55,169,191,57,120,7,82,150,192,229,180,65,89,191,63,218,7,231,96,220,228,23,177,239,76,54,228,82,6,22, + 171,21,234,168,94,200,62,179,198,94,112,231,92,165,78,117,41,202,102,205,154,201,15,31,62,172,44,205,33,11,0,88,191,110,69,222,227,207,45,97, + 40,228,217,167,142,157,169,39,149,253,241,212,12,27,51,41,223,246,211,121,5,0,175,163,229,197,139,151,127,28,9,0,236,222,189,155,246,239,223,255, + 62,39,73,16,40,18,111,151,12,193,97,89,22,253,31,106,128,165,139,223,129,221,197,227,194,45,19,182,30,75,131,203,90,4,74,41,242,26,7,222, + 39,78,43,76,241,252,96,145,186,37,171,144,142,236,213,165,65,93,63,95,95,223,164,43,107,172,111,190,144,221,72,66,221,103,231,189,215,224,150,204, + 79,210,113,211,166,141,241,143,14,24,32,215,106,117,47,107,194,91,132,75,173,244,197,162,162,11,166,170,52,43,162,14,106,52,112,200,224,193,221,131, + 131,131,196,49,11,78,94,91,246,92,203,58,13,27,52,236,164,14,138,25,88,149,131,81,94,83,20,69,48,12,131,236,236,108,8,130,0,167,211,9, + 142,227,144,150,150,146,45,82,26,46,64,100,66,66,194,33,145,200,17,85,55,18,159,47,93,168,94,187,97,71,219,87,222,152,187,157,16,210,190,108, + 76,81,121,77,71,65,225,230,61,251,14,24,41,14,133,190,54,169,31,155,83,104,193,161,211,55,112,174,118,193,134,202,218,62,183,91,167,182,170,194, + 194,252,8,185,140,149,158,78,204,133,200,42,1,16,16,2,220,45,112,64,45,151,144,62,253,250,27,198,142,26,106,56,114,236,98,240,132,39,159,252, + 12,192,142,106,52,225,116,114,194,67,113,26,182,121,125,3,46,38,23,226,212,222,227,152,62,231,35,156,185,229,132,217,98,3,17,156,96,169,19,121, + 169,55,193,11,194,125,81,204,50,77,158,203,30,149,117,171,235,84,0,22,0,95,150,70,66,178,213,129,177,111,189,253,198,43,115,90,117,232,142,148, + 108,43,190,253,250,203,207,180,193,49,249,148,210,205,0,64,8,233,223,137,227,38,163,36,218,181,170,50,59,117,58,237,232,93,155,190,134,217,206,35, + 45,215,65,210,243,236,176,56,120,240,34,117,168,21,178,155,62,58,223,92,93,144,214,98,21,82,235,119,237,212,117,243,171,175,204,210,38,101,58,201, + 133,155,38,58,180,157,111,149,109,7,0,189,94,223,166,95,191,126,99,151,44,89,210,244,253,69,47,93,87,202,36,17,12,35,42,19,210,173,184,145, + 39,194,94,88,117,53,159,202,52,9,33,140,42,48,166,175,70,175,255,240,153,103,103,214,29,58,108,164,228,171,21,159,185,24,150,109,165,49,198,7, + 149,119,208,141,198,120,13,175,144,78,87,107,212,61,1,178,55,253,218,175,239,85,247,157,47,50,21,235,66,35,27,2,84,132,148,17,161,150,1,121, + 38,17,190,145,77,224,114,126,93,101,105,150,42,53,5,65,20,68,17,78,183,8,137,84,142,1,253,251,65,99,8,130,132,33,16,120,14,2,195,84, + 233,28,222,167,73,0,135,91,0,67,0,134,33,200,204,72,71,221,58,17,128,251,46,28,110,1,82,9,3,169,132,193,245,228,20,52,141,171,135,236, + 179,247,7,196,43,106,26,12,6,136,162,136,188,188,60,112,28,7,183,219,93,242,91,229,56,222,234,16,36,31,124,246,45,95,182,109,124,163,198,76, + 215,78,173,24,185,92,65,170,211,252,43,240,106,122,53,189,154,127,158,170,124,145,255,118,170,141,104,37,167,21,32,241,86,22,198,13,104,141,240,176, + 16,156,186,94,8,147,149,67,145,213,141,34,171,27,162,68,135,172,226,34,20,23,100,35,41,53,175,186,60,205,0,0,86,33,29,57,99,134,105,150, + 101,94,195,187,71,246,78,67,152,49,41,254,149,87,138,122,46,93,106,112,249,70,232,26,61,247,204,211,189,119,238,218,67,92,78,23,234,215,139,84, + 118,234,218,243,201,47,86,172,8,70,229,121,54,238,67,31,30,239,171,80,169,86,206,123,251,101,197,162,141,73,183,173,46,88,183,28,207,190,249,226, + 236,55,125,166,76,24,253,185,62,60,254,215,226,244,132,66,79,180,202,46,226,46,151,11,60,207,35,35,237,234,192,159,182,190,212,164,203,192,197,126, + 10,165,18,20,128,217,206,35,207,228,196,195,143,244,100,91,109,223,219,248,152,203,53,17,192,125,221,136,69,69,41,38,93,104,51,221,238,237,235,216, + 141,63,158,135,94,163,194,241,139,55,112,234,231,189,60,21,185,3,101,219,233,66,27,198,0,202,253,32,68,113,111,103,34,166,155,211,47,181,174,204, + 70,137,68,226,152,252,212,120,87,82,82,210,119,39,78,93,140,250,237,240,158,214,97,245,155,42,27,182,234,69,124,2,194,192,16,224,124,158,9,23, + 111,22,33,219,228,196,7,147,155,178,96,72,141,93,103,34,240,194,200,137,47,125,252,249,199,239,177,113,117,180,88,183,98,17,204,86,23,242,138,172, + 200,204,33,184,118,211,132,51,151,18,177,119,219,58,94,20,153,23,171,210,161,148,102,3,120,179,226,250,240,176,224,73,189,122,15,192,192,209,147,161, + 84,170,209,119,196,51,56,243,235,254,199,1,108,46,221,47,5,192,171,213,217,200,176,12,4,145,34,45,207,129,188,98,23,204,118,14,185,38,23,242, + 205,124,122,190,217,100,85,40,100,249,18,56,15,31,90,183,232,133,245,107,214,4,166,23,112,236,233,27,38,92,187,99,169,246,91,106,48,24,30,30, + 54,108,216,144,55,222,120,163,65,82,82,226,141,188,204,196,78,59,214,205,136,107,223,111,129,116,239,186,21,160,12,11,81,224,193,176,50,104,130,98, + 75,181,8,103,205,190,86,105,132,203,191,110,203,241,193,209,109,223,235,241,72,15,205,136,145,227,84,117,234,54,128,205,5,60,49,126,178,60,32,192, + 216,123,197,231,75,147,2,162,90,175,20,76,133,239,242,74,73,176,74,167,63,48,240,209,17,65,84,20,101,63,238,221,42,2,168,54,91,60,21,41, + 146,179,29,112,186,221,112,186,220,40,180,58,145,93,104,69,161,229,193,130,55,148,64,110,177,186,160,144,49,24,247,220,7,56,184,114,34,250,77,89, + 138,27,153,217,112,216,76,18,123,230,21,143,19,152,18,0,14,151,0,169,132,128,129,136,236,236,92,12,30,215,7,215,143,158,128,211,45,64,38,97, + 192,128,226,198,237,12,204,156,48,0,63,174,169,89,83,20,69,80,74,225,118,187,225,118,187,193,113,28,246,236,216,24,180,254,203,167,84,31,44,223, + 167,90,181,252,237,119,139,221,62,201,34,68,85,76,76,163,133,173,91,173,53,242,226,191,58,159,194,139,23,47,255,227,84,249,167,235,112,216,111,15, + 27,57,14,33,129,193,218,65,221,198,203,206,38,23,33,247,110,42,110,92,191,12,155,131,131,204,183,30,160,12,70,221,168,72,92,76,220,238,254,228, + 253,221,22,145,119,222,174,74,111,208,160,208,240,16,163,134,121,127,113,157,19,215,19,11,91,173,155,179,26,99,198,104,3,222,95,92,231,68,202,77, + 13,163,86,210,142,79,62,49,154,48,132,226,149,87,102,97,208,128,62,152,240,228,227,228,219,111,191,105,239,105,99,68,72,151,191,250,250,59,242,236, + 34,222,117,234,186,197,169,214,168,84,191,37,89,172,141,163,234,168,250,13,29,159,185,123,211,202,143,0,60,225,137,150,203,229,186,119,33,119,187,221, + 0,32,0,0,195,148,60,231,155,93,200,41,114,34,187,200,9,94,16,49,116,228,19,170,211,103,46,60,129,74,28,173,82,235,68,142,231,176,229,199, + 115,200,56,189,89,36,12,107,42,27,12,15,148,56,89,193,193,117,142,14,24,250,184,81,174,84,3,0,204,86,39,190,253,98,113,149,54,82,74,29, + 132,16,149,191,191,191,116,64,191,71,210,157,206,78,119,126,254,245,132,226,167,13,31,116,35,126,241,190,133,250,46,172,155,167,144,73,89,72,24,6, + 102,59,15,212,232,14,3,89,73,199,63,13,110,216,129,76,156,58,107,233,204,151,94,99,103,126,242,11,92,14,27,156,118,43,138,77,133,80,73,56, + 92,57,182,131,167,2,55,211,146,121,206,163,193,209,229,177,219,221,238,66,155,3,26,141,6,18,185,6,249,133,38,220,95,225,175,122,8,32,114,60, + 133,217,206,149,62,120,20,88,249,187,151,83,76,126,33,129,218,76,41,193,197,31,62,153,254,196,230,205,155,227,138,157,68,118,236,106,33,174,166,21, + 11,199,247,172,200,195,235,149,155,236,227,227,51,104,220,184,113,61,158,127,254,249,136,228,228,228,27,119,239,102,114,96,72,73,132,132,130,217,184,226, + 29,132,250,169,144,109,226,48,114,234,60,172,93,246,10,156,46,55,134,244,236,112,95,33,104,66,8,9,172,215,230,147,142,29,58,78,124,99,206,91, + 74,72,181,200,43,22,176,251,68,10,66,252,125,32,145,48,136,111,211,155,93,218,188,171,110,207,174,245,207,237,217,186,238,73,41,40,51,121,230,2, + 93,124,211,182,100,246,212,65,102,179,217,244,124,37,186,140,33,188,233,170,25,19,95,127,122,241,151,111,54,14,10,170,67,45,54,7,92,2,69,177, + 205,133,98,171,11,46,78,128,195,102,3,5,163,210,27,227,235,15,233,55,43,99,251,161,15,63,51,165,95,153,88,227,44,78,2,127,95,95,31,214, + 234,224,161,41,13,4,17,2,176,44,129,84,166,20,149,193,177,145,142,172,196,84,79,207,147,147,19,32,101,25,100,221,205,68,120,104,0,34,131,245, + 184,14,2,151,91,132,84,194,224,230,237,52,68,133,25,209,60,186,202,30,232,63,80,222,209,114,185,92,224,56,14,12,195,208,82,59,169,94,234,56, + 158,145,150,117,200,199,167,185,129,23,196,133,54,39,15,158,255,75,230,154,120,241,226,197,203,3,81,165,163,149,114,229,151,54,0,16,219,166,119,190, + 86,41,241,147,48,4,217,233,201,248,118,201,116,136,34,69,191,73,239,67,23,21,12,149,140,133,211,146,111,201,191,113,164,218,43,37,33,92,207,79, + 191,204,136,154,250,76,125,253,186,117,22,41,0,172,91,103,145,62,51,37,66,255,217,151,183,163,218,61,212,10,84,16,48,96,208,48,140,28,53,18, + 41,89,54,252,112,244,14,172,118,151,71,245,213,212,198,70,205,3,67,195,250,204,24,223,71,35,97,9,105,24,105,96,211,114,57,158,101,165,194,206, + 211,166,204,161,67,71,5,28,218,179,177,187,218,216,168,185,45,247,234,133,154,244,156,78,231,31,186,14,253,2,234,237,233,57,108,73,250,221,44,243, + 238,172,66,71,59,43,199,35,187,200,137,156,34,39,138,172,110,4,235,124,193,115,174,166,85,233,81,74,215,12,30,54,238,113,0,12,97,248,213,230, + 204,171,215,203,222,43,115,178,250,12,26,99,60,122,54,25,55,206,236,45,164,34,95,50,99,142,136,85,70,16,40,165,118,134,97,20,10,197,189,0, + 24,211,173,115,7,119,108,131,232,253,223,109,61,56,142,211,116,134,92,202,66,194,16,176,18,2,139,135,142,22,0,100,37,29,95,30,220,176,3,62, + 254,100,233,7,29,123,142,145,253,124,238,54,236,28,208,161,101,12,182,109,248,202,73,41,247,146,37,243,220,114,79,180,202,32,132,176,106,99,204,202, + 136,200,136,240,91,183,82,49,227,229,55,144,153,111,71,246,237,43,8,52,134,246,212,4,197,45,181,229,36,206,244,36,165,131,40,136,212,201,9,176, + 216,248,50,71,203,233,224,200,45,163,65,173,213,170,20,23,191,126,103,228,83,27,214,173,139,144,200,212,210,131,231,242,145,144,106,118,30,217,176,208, + 101,203,186,50,174,50,61,163,209,56,98,252,248,241,29,199,143,31,31,120,237,218,181,219,38,147,137,115,56,156,176,58,228,219,123,14,95,114,51,55, + 159,219,115,38,197,221,237,151,155,50,100,155,92,16,5,17,155,78,23,195,237,180,86,106,159,177,126,219,125,79,62,57,161,219,136,17,99,100,151,111, + 21,195,206,149,68,118,4,206,129,179,87,11,16,28,24,4,0,96,25,6,45,59,15,151,53,110,211,71,198,241,2,228,106,61,174,39,223,130,205,97, + 203,182,102,39,94,169,168,171,54,54,28,213,181,223,0,89,76,191,14,35,21,223,168,223,234,57,114,122,80,78,118,22,114,11,173,112,242,34,172,54, + 23,138,205,22,0,20,62,141,250,250,230,95,220,182,169,247,244,94,159,229,51,215,181,63,239,230,134,0,168,50,71,153,54,36,174,115,96,72,248,151, + 15,117,235,161,73,206,119,34,225,199,119,144,125,215,142,111,151,191,132,206,195,95,66,215,71,39,232,15,109,253,252,130,79,88,211,25,69,25,151,190, + 173,233,28,161,212,161,146,73,24,164,103,164,99,104,175,54,200,53,185,0,74,225,18,74,34,90,87,18,111,99,100,191,86,40,178,122,54,129,179,44, + 1,96,217,239,210,237,118,163,203,195,253,114,70,63,189,210,183,160,200,124,245,218,237,226,95,203,182,21,68,10,187,83,128,240,239,102,8,241,226,197, + 203,255,56,247,28,173,221,187,119,83,0,168,172,127,52,35,187,0,254,90,9,140,161,81,24,59,253,3,172,249,232,5,8,2,7,74,1,94,240,236, + 110,145,82,233,143,207,62,19,21,87,55,138,53,142,29,163,182,127,183,206,166,26,59,70,109,111,210,212,223,244,236,51,81,183,205,142,58,157,120,65, + 192,111,87,114,112,249,182,9,151,83,138,161,85,121,158,230,139,149,203,158,89,188,104,161,76,194,18,114,37,213,98,73,207,231,45,172,84,234,86,171, + 228,212,69,37,206,148,60,154,255,200,224,39,237,59,215,126,60,17,192,115,85,233,148,205,52,44,187,136,151,61,83,74,41,1,68,145,8,66,122,158, + 3,22,55,135,236,194,223,29,45,194,87,237,193,232,66,27,198,24,244,126,251,88,150,85,80,10,112,110,126,132,46,180,97,111,115,102,210,245,242,78, + 214,137,43,153,72,62,127,48,91,112,219,198,89,179,175,253,84,243,49,165,14,177,252,212,200,82,36,18,34,16,6,84,38,101,137,132,101,192,50,4, + 44,3,88,28,156,135,110,86,9,89,73,199,151,71,198,63,52,231,192,250,143,2,39,244,111,132,13,71,75,124,62,135,57,183,216,146,94,59,39,11, + 0,84,65,13,122,62,241,248,147,227,95,152,49,21,119,114,28,72,202,176,64,46,147,163,109,251,78,104,214,186,189,236,235,175,87,77,79,56,186,101, + 19,80,50,57,162,58,168,40,138,54,167,128,98,59,7,179,141,135,205,77,111,58,56,241,150,86,167,144,238,89,245,142,126,241,162,247,162,66,195,194, + 201,254,115,249,184,146,82,88,252,227,154,215,69,123,126,74,31,123,246,213,83,149,233,137,162,200,21,20,20,96,231,206,157,174,203,151,47,195,102,179, + 65,42,149,194,229,118,135,41,101,18,21,195,240,202,237,191,157,131,84,225,3,131,79,3,80,80,184,171,185,7,16,120,161,201,192,129,131,100,7,78, + 165,225,139,111,214,97,204,160,30,32,170,80,68,26,213,56,117,241,58,120,162,6,67,8,24,166,228,33,147,176,144,74,100,144,9,46,220,76,74,0, + 5,61,86,169,48,97,90,119,238,217,79,220,242,213,138,130,208,58,209,50,159,128,64,201,227,189,26,194,233,226,112,39,199,140,66,171,11,44,75,80, + 96,118,97,197,86,78,198,42,181,225,87,142,31,187,214,177,103,175,174,71,246,108,111,141,74,28,45,66,8,209,132,54,125,189,126,131,70,175,140,159, + 250,154,230,90,22,133,143,90,139,194,156,52,236,222,187,15,35,71,142,66,168,175,1,218,38,109,73,253,6,49,134,45,95,47,90,22,16,213,170,83, + 222,237,179,147,106,58,79,46,94,132,205,106,134,192,11,104,19,31,129,243,55,75,134,91,114,28,69,177,217,2,139,205,129,206,45,163,112,43,211,86, + 147,212,61,68,81,4,199,113,247,110,134,56,129,7,40,37,44,88,161,124,202,13,78,160,176,57,5,8,30,94,163,188,120,241,242,239,83,157,47,242, + 223,10,3,148,52,168,236,81,113,3,74,129,164,212,60,200,37,34,194,235,70,131,150,251,167,166,0,248,251,199,66,87,202,246,237,153,233,245,27,88, + 197,151,95,190,211,161,73,83,255,139,207,76,137,184,214,164,169,255,197,151,95,190,211,161,126,3,171,200,241,82,129,150,230,235,42,203,205,85,187,92, + 149,76,219,230,241,245,216,119,214,37,221,153,250,217,245,68,153,76,198,133,7,168,73,100,144,154,173,99,84,201,157,28,227,140,105,220,210,5,134,180, + 172,78,165,204,111,113,185,92,127,120,228,231,38,15,60,240,195,172,65,97,65,190,227,51,114,237,184,147,99,67,90,174,13,119,114,109,176,57,121,92, + 186,122,19,96,101,149,230,45,210,235,252,246,127,255,221,154,58,205,27,213,15,140,143,169,27,184,242,155,53,117,148,74,159,253,186,208,134,49,117,162, + 98,207,158,60,184,209,120,226,74,38,82,19,207,100,241,206,226,239,61,113,178,128,146,136,22,207,243,162,211,233,132,195,225,32,22,139,69,234,118,187, + 137,40,138,96,0,72,88,6,18,134,64,194,18,48,132,148,206,22,172,253,237,189,197,206,99,231,201,44,236,218,186,30,191,254,180,171,182,187,223,131, + 80,118,216,163,3,250,34,49,205,138,11,183,76,200,41,114,33,41,195,138,205,191,102,224,151,75,5,136,110,218,13,34,161,195,61,209,162,148,82,139, + 157,135,213,193,195,226,20,179,109,46,114,147,227,200,205,179,135,214,59,102,78,28,48,168,119,151,230,100,247,177,91,56,151,152,97,223,251,197,116,105, + 117,78,22,0,228,231,231,111,221,177,99,199,190,211,167,79,103,55,110,220,88,27,26,26,42,213,106,213,172,94,197,119,221,177,110,70,111,127,63,229, + 224,240,208,22,80,233,227,113,215,84,18,89,225,169,8,187,195,81,169,30,47,8,82,151,155,135,147,163,104,221,188,41,168,76,139,59,89,185,72,72, + 78,135,201,84,140,236,220,124,228,20,20,34,175,176,24,69,197,54,20,154,29,40,182,184,224,112,243,48,155,11,225,182,217,110,86,122,12,65,85,10, + 133,76,121,243,230,53,81,174,84,193,205,11,216,114,42,7,219,78,231,224,194,29,43,174,102,88,177,253,84,6,54,31,75,5,199,243,96,37,114,225, + 242,153,19,162,74,169,146,83,16,85,101,154,170,224,70,79,117,234,210,227,181,241,207,207,213,156,73,225,81,207,104,128,45,105,11,40,117,97,232,208, + 225,176,89,139,145,114,234,123,132,26,244,240,245,13,192,51,175,188,175,173,19,213,112,164,95,157,166,211,171,59,71,4,0,199,83,164,222,73,71,219, + 102,209,40,178,184,193,50,37,19,53,56,158,226,202,245,219,232,210,186,33,236,78,1,44,91,178,190,38,202,174,9,101,17,45,167,211,137,35,7,119, + 6,125,191,98,146,254,145,46,13,218,197,69,171,218,149,109,43,240,20,54,39,143,74,230,107,120,241,226,229,63,144,234,124,145,255,102,60,10,25,69, + 134,7,225,228,229,219,104,26,87,15,6,189,14,215,146,211,193,50,82,48,165,23,76,79,161,110,110,195,135,31,26,144,122,91,195,124,246,249,237,168, + 103,159,137,186,253,225,135,134,227,212,205,109,0,48,142,210,146,11,105,89,130,212,218,220,136,82,145,139,8,242,83,179,103,110,90,243,25,134,117,250, + 27,148,162,191,65,193,248,235,228,82,153,148,21,121,202,184,195,3,163,28,84,20,155,123,162,87,190,235,80,16,4,16,194,8,0,32,138,162,38,45, + 223,14,147,131,69,118,145,19,133,102,55,26,134,105,112,240,208,102,155,192,217,215,85,166,197,74,101,134,232,168,112,188,54,247,67,216,157,2,146,50, + 44,144,41,20,193,65,193,141,47,140,155,58,91,241,252,138,100,76,236,238,143,23,126,73,206,176,101,43,103,123,218,102,81,20,121,139,197,66,178,178, + 178,52,46,151,75,42,149,74,221,114,185,92,40,177,23,144,72,8,24,194,128,33,0,8,96,182,11,64,173,98,90,37,168,149,18,60,218,62,24,14, + 247,104,216,157,60,142,253,84,251,10,57,132,116,147,68,53,49,14,174,27,89,7,7,206,229,194,238,20,96,115,242,40,182,241,224,69,138,236,34,7, + 162,67,125,32,87,24,30,35,132,188,80,83,247,161,211,229,190,248,219,201,115,82,141,127,148,191,91,16,239,236,248,118,113,93,153,96,234,26,236,167, + 213,142,29,245,58,155,148,97,69,86,250,205,220,221,95,189,231,227,182,22,141,183,103,39,86,233,100,149,81,92,92,188,79,167,211,89,10,10,10,250, + 245,234,213,75,95,80,144,47,228,218,74,206,59,165,96,126,90,55,23,132,149,2,148,194,118,251,16,54,189,177,173,172,117,92,69,45,194,48,191,109, + 220,240,125,191,199,70,140,144,230,23,6,224,240,233,100,72,37,12,146,44,121,224,33,129,212,108,134,90,37,135,193,79,139,0,31,41,212,74,57,68, + 202,128,227,1,173,86,15,86,46,191,127,26,47,0,10,114,237,234,249,179,77,166,190,53,87,249,234,248,113,76,253,204,44,80,137,20,148,176,40,182, + 57,81,108,115,194,226,224,224,176,217,192,89,76,224,172,5,206,199,167,205,10,217,183,125,147,21,148,94,171,76,83,34,85,77,238,220,107,168,242,203, + 165,115,65,220,38,156,118,217,208,171,123,47,76,153,189,26,119,10,44,168,31,164,71,226,175,223,225,163,183,31,7,35,85,64,173,243,193,144,209,147, + 52,203,23,189,250,56,128,143,171,60,160,4,176,217,156,200,204,202,198,180,209,15,33,179,208,5,153,132,160,228,43,40,226,74,210,29,76,121,125,4, + 204,118,30,50,9,3,79,178,195,84,28,12,239,118,187,193,48,44,45,59,71,102,151,111,127,109,80,92,164,40,23,85,188,80,242,29,19,188,131,225, + 189,120,241,242,47,226,145,163,165,85,43,65,89,37,126,57,155,140,216,248,102,248,102,199,41,52,104,218,30,119,205,60,40,24,143,255,186,95,156,109, + 59,7,224,220,160,65,161,225,67,134,132,245,164,84,250,227,103,95,152,210,1,224,243,245,93,75,46,191,34,69,73,182,232,18,135,203,99,136,36,245, + 246,221,226,186,81,193,26,36,164,187,157,26,133,140,241,213,200,89,163,65,46,147,73,36,16,40,113,222,189,155,236,36,64,138,39,114,21,187,14,213, + 218,144,61,143,12,126,63,55,229,142,233,76,195,2,91,115,147,91,14,74,129,134,97,26,92,62,177,91,200,206,184,145,100,207,78,252,162,50,45,81, + 4,235,230,69,92,184,105,66,145,149,67,145,197,141,78,15,63,42,235,212,99,32,126,185,156,7,145,231,176,248,171,221,102,129,114,35,41,77,184,239, + 79,187,42,68,81,164,119,239,222,37,12,195,200,117,58,93,49,0,158,227,56,112,28,7,128,128,101,24,16,2,72,37,4,193,62,10,20,22,91,249, + 218,187,89,128,201,202,97,199,137,44,236,220,242,61,84,42,213,131,72,64,109,204,233,54,114,212,116,159,204,2,39,44,118,14,54,23,15,155,171,228, + 79,80,20,41,220,60,133,201,198,33,164,89,159,16,206,81,220,30,53,116,31,74,92,220,152,153,207,79,105,209,163,255,40,195,221,60,203,208,232,122, + 145,195,95,156,62,85,241,195,47,105,152,243,222,74,26,209,176,77,222,154,207,23,186,221,214,226,150,149,141,117,170,10,179,217,252,155,76,38,179,20, + 22,22,14,27,62,124,184,58,245,150,230,104,207,225,75,174,228,229,186,246,196,142,235,221,141,145,200,192,187,29,56,119,99,55,172,217,137,85,122,6, + 69,169,103,7,235,66,155,45,58,115,246,236,243,147,166,60,171,236,222,162,57,110,164,23,227,212,85,57,108,110,160,67,227,80,24,125,213,200,45,52, + 227,210,153,67,252,177,131,155,236,62,126,1,204,216,169,115,53,81,245,26,64,194,74,187,85,166,43,145,75,190,221,181,97,221,143,109,31,234,246,190, + 221,110,123,243,242,225,245,111,20,182,28,88,135,18,6,2,97,224,112,113,40,42,44,134,211,225,128,249,250,254,12,129,115,76,43,54,219,83,246,255, + 176,57,94,37,226,190,193,245,0,32,101,80,87,165,214,129,119,89,177,115,203,38,12,25,58,12,62,241,143,225,114,90,62,148,114,22,169,121,38,52, + 232,52,14,135,126,57,138,31,126,216,132,81,99,30,71,112,112,24,220,156,43,178,166,227,153,120,43,13,245,34,130,161,80,200,193,11,110,200,164,12, + 24,66,144,124,59,3,117,67,253,17,224,163,65,122,158,3,50,169,231,9,225,203,28,173,178,155,160,150,109,186,228,140,154,252,149,111,190,89,180,5, + 181,120,226,197,16,182,68,203,16,84,95,106,115,241,224,188,17,45,47,94,188,252,139,120,228,104,9,34,69,128,191,31,56,42,193,237,108,19,172,36, + 16,14,27,133,32,16,8,148,162,170,192,19,33,164,71,101,185,54,182,111,207,76,71,105,126,164,223,249,61,146,117,239,185,146,59,209,170,52,9,21, + 14,238,216,123,228,177,129,157,187,251,94,187,155,149,46,147,50,18,137,140,149,202,36,12,145,73,24,151,94,37,97,55,127,185,94,78,9,142,212,164, + 233,112,56,208,163,71,143,63,108,147,120,229,120,96,65,78,146,139,18,81,52,202,205,8,48,24,113,43,229,14,126,218,187,197,150,157,113,35,81,112, + 58,6,149,143,194,252,65,147,82,177,192,228,132,195,45,160,208,82,146,26,131,55,118,192,182,99,153,80,202,88,100,95,216,108,207,205,74,159,238,200, + 78,170,114,214,102,101,118,82,74,119,174,94,189,90,214,182,109,91,166,77,155,54,129,110,183,155,225,56,206,237,116,58,65,24,134,50,44,136,65,37, + 131,94,205,210,139,191,238,72,73,60,190,77,66,65,151,122,114,60,203,163,87,75,48,176,93,48,156,238,209,200,51,57,113,250,200,182,234,54,175,84, + 147,16,58,236,225,174,157,145,124,215,10,155,75,128,221,201,195,238,20,74,186,136,197,146,115,158,91,236,70,64,100,11,164,156,92,63,28,21,28,173, + 138,154,165,101,133,142,170,3,226,130,181,126,129,95,61,255,249,90,197,142,147,185,56,156,96,69,238,225,13,69,132,95,157,226,176,21,79,170,206,201, + 170,170,237,110,183,251,146,66,161,176,174,94,189,250,137,184,6,254,186,146,49,90,162,178,168,32,31,166,140,155,144,200,21,149,201,221,167,105,206,188, + 56,91,19,24,119,232,149,151,95,156,166,85,43,59,63,212,185,155,116,228,208,145,42,70,170,193,153,179,167,185,185,239,45,117,56,157,206,98,74,133, + 181,110,187,107,153,211,105,235,178,124,238,211,43,218,182,239,202,56,236,150,56,125,120,188,111,113,122,66,97,121,77,211,157,203,69,36,180,85,151,113, + 157,163,237,227,178,175,37,6,199,118,158,91,87,46,135,175,49,0,185,249,69,112,10,128,198,207,31,238,130,124,136,156,221,110,203,78,220,5,0,79, + 21,59,187,208,188,235,246,202,236,116,243,226,214,148,91,215,159,82,168,180,100,192,160,225,96,101,42,164,228,22,66,41,103,96,43,202,134,54,36,12, + 69,54,11,52,122,127,12,29,62,2,90,157,15,18,19,206,82,153,84,118,182,166,227,153,120,35,21,143,15,108,143,252,98,55,164,18,6,50,73,137, + 243,127,46,225,22,134,247,108,14,179,131,187,183,222,147,115,84,84,84,4,153,76,246,135,223,167,195,150,139,171,23,14,74,117,26,181,109,234,140,41, + 127,168,82,192,9,20,197,102,219,31,46,36,158,124,231,107,139,87,211,171,233,213,244,82,21,30,56,90,20,245,67,52,104,16,166,129,195,29,8,135, + 75,128,213,33,160,216,230,70,177,141,195,237,44,27,46,255,5,165,118,75,162,88,37,157,7,148,2,32,37,14,158,167,247,162,114,183,107,238,7,139, + 23,140,88,223,178,133,235,249,254,33,17,23,111,187,50,9,97,236,12,43,225,252,116,18,233,181,107,23,115,143,31,221,211,69,201,11,143,87,167,195, + 243,188,41,44,44,12,192,31,75,240,52,138,86,13,250,109,247,43,245,186,14,92,108,252,104,254,44,27,195,202,68,34,145,93,22,56,251,247,246,236, + 196,207,171,235,234,98,100,202,171,39,207,39,180,247,241,139,192,141,12,43,172,14,30,110,94,132,175,86,134,244,75,251,221,183,175,157,217,104,206,184, + 240,141,135,77,189,199,233,211,167,143,182,107,215,238,194,209,163,71,31,61,115,230,76,247,14,29,58,8,209,209,209,62,44,203,218,41,145,192,160,146, + 33,35,241,88,198,254,35,223,242,188,224,62,64,68,246,29,107,206,181,156,218,126,78,94,177,11,123,207,228,96,247,214,13,96,165,181,174,58,3,0, + 144,43,228,254,118,135,27,117,3,253,144,91,232,68,182,75,128,221,37,148,68,180,40,133,86,37,129,90,206,34,211,228,2,64,140,53,233,145,160,166, + 106,173,92,254,188,82,239,63,109,224,132,215,253,14,94,42,194,169,164,98,80,129,3,231,180,217,138,239,156,106,87,147,70,117,56,157,206,91,74,37, + 249,90,198,40,14,237,88,55,35,170,67,223,5,204,229,237,115,241,123,247,214,253,221,133,149,97,205,185,118,16,192,65,66,8,179,61,63,183,239,201, + 227,191,172,25,253,196,20,93,242,229,115,172,217,92,52,199,146,121,101,89,185,205,55,170,194,162,143,253,180,127,91,35,2,168,205,119,19,43,205,249, + 70,51,207,222,115,152,36,18,105,186,185,32,59,152,72,100,80,233,180,224,89,25,204,119,115,193,153,238,130,48,210,132,202,246,185,79,143,179,127,178, + 245,219,79,70,52,235,53,73,71,53,117,32,58,242,113,253,196,86,87,202,229,35,46,42,10,38,153,92,169,111,219,165,191,166,239,200,231,216,64,99, + 0,110,38,158,163,223,124,177,196,228,182,22,77,173,74,51,178,113,231,131,6,131,65,101,187,125,16,117,35,6,225,110,190,11,82,9,131,13,43,22, + 160,32,63,27,54,247,13,180,124,97,16,172,142,146,217,152,31,188,247,14,52,90,181,42,162,81,167,19,105,87,127,171,42,165,139,227,234,213,171,46, + 163,209,88,218,157,91,242,147,11,208,241,49,199,246,207,86,127,176,124,95,253,105,79,246,45,116,83,245,31,207,141,192,185,205,6,147,55,43,188,23, + 47,94,254,21,106,116,180,28,14,199,237,135,122,60,10,81,164,16,40,32,10,165,145,39,241,247,232,147,192,57,170,141,196,120,130,40,10,167,150,175, + 88,213,175,101,219,174,108,124,29,45,138,243,179,112,226,183,195,60,68,90,227,12,52,160,36,194,161,14,110,56,108,196,240,33,155,158,152,48,165,168, + 203,195,15,107,2,3,131,157,233,25,233,182,175,215,126,199,237,223,179,189,139,8,126,84,94,94,82,181,5,150,139,138,138,42,29,115,242,200,67,17, + 157,0,212,99,37,196,101,203,185,174,169,77,219,242,50,210,134,46,152,251,118,202,152,73,51,229,245,195,162,145,99,98,113,59,61,11,215,142,110,119, + 102,92,63,189,181,56,253,220,196,218,232,149,231,228,201,147,102,0,223,181,105,211,230,167,195,135,15,63,121,234,212,169,214,49,49,49,34,231,178,59, + 127,252,106,90,134,219,105,78,96,121,188,106,203,75,188,241,32,250,162,40,164,30,61,126,222,239,177,46,173,37,254,186,137,88,181,97,15,7,42,166, + 214,86,199,230,114,189,56,122,212,72,210,189,103,191,193,131,30,27,7,165,66,139,211,215,139,160,146,179,136,240,87,34,191,168,16,103,14,172,71,94, + 242,111,219,4,130,215,107,210,211,201,100,215,194,91,12,9,108,208,226,97,121,186,157,69,234,173,66,184,45,119,81,120,113,93,1,5,249,236,65,218, + 90,145,122,245,112,87,169,148,220,5,16,197,48,112,89,179,175,63,240,0,77,74,169,8,96,183,198,24,31,247,225,162,55,7,105,116,250,38,42,165, + 230,124,197,237,74,107,114,122,84,151,19,0,44,102,211,212,228,223,54,30,12,136,237,164,135,50,152,113,185,92,176,23,220,22,204,169,103,138,221,14, + 211,75,30,105,100,95,75,208,4,197,118,250,101,203,210,149,84,224,26,73,164,178,12,129,115,125,203,185,92,223,218,242,174,223,213,27,227,235,255,122, + 96,227,211,39,126,218,50,156,231,221,126,50,185,252,162,211,108,153,104,206,75,190,85,165,168,72,27,237,59,176,155,244,31,48,144,78,25,251,104,137, + 147,71,0,173,70,165,218,191,255,0,233,211,119,0,29,212,175,231,61,231,79,163,85,171,246,237,221,71,250,246,237,27,85,149,36,165,212,9,160,71, + 197,245,113,81,154,83,132,160,13,203,50,110,35,147,254,216,213,91,166,67,158,180,219,139,23,47,94,254,9,72,237,102,246,213,82,188,22,161,69,63, + 191,104,157,204,207,119,30,195,74,59,57,92,174,48,10,89,154,192,187,126,182,8,120,179,252,221,120,77,154,1,1,49,90,135,68,242,58,24,166,43, + 68,33,146,0,41,148,224,136,146,19,22,150,118,55,61,144,157,77,99,12,195,2,141,186,113,57,121,230,53,151,18,77,53,142,6,175,168,169,13,170, + 111,148,40,253,222,103,24,182,151,32,136,82,81,224,110,8,110,199,123,246,220,196,29,158,228,141,242,212,206,54,109,218,52,146,72,36,79,229,22,187, + 12,119,243,237,43,236,57,137,39,254,140,166,209,24,175,145,250,232,126,18,65,34,69,145,130,23,196,84,214,106,125,36,55,55,161,242,4,82,53,104, + 170,2,99,219,75,101,210,37,15,117,127,180,67,243,206,143,82,23,47,33,135,247,111,65,210,201,29,199,4,65,120,169,42,123,43,106,234,235,180,57, + 199,74,101,129,84,4,35,82,145,128,138,14,128,185,37,186,204,11,44,89,9,247,117,15,63,72,219,1,160,121,188,239,104,163,159,118,200,221,172,226, + 47,175,220,48,213,248,93,254,55,66,244,134,192,232,122,68,161,31,67,88,201,40,10,254,55,40,179,0,0,32,0,73,68,65,84,234,22,92,206,181, + 60,177,111,168,174,144,250,223,109,103,120,108,135,51,74,165,50,196,102,179,155,50,147,78,220,43,5,20,22,211,254,146,74,165,242,183,217,108,197,153, + 73,39,227,202,214,71,196,118,56,173,80,42,67,43,174,247,196,206,152,104,205,216,16,163,97,161,197,230,188,118,246,82,193,128,242,41,30,106,178,243, + 175,194,171,233,213,244,106,254,125,16,66,38,83,74,87,0,104,3,192,8,32,23,37,181,144,203,47,163,244,53,42,89,206,67,73,119,132,63,0,23, + 128,242,93,51,101,203,85,173,47,219,63,1,64,163,82,77,1,192,41,0,30,85,154,185,151,0,240,239,120,0,232,225,213,244,106,86,246,80,5,54, + 28,232,95,183,197,37,67,120,147,75,170,192,134,3,255,83,237,244,106,122,53,189,154,94,77,175,230,63,163,89,205,103,77,46,125,221,191,196,109,161, + 253,41,165,61,42,44,247,71,201,212,188,251,150,103,207,158,253,106,249,109,203,214,151,95,174,106,125,185,253,251,205,158,61,251,85,0,180,67,135,14, + 223,83,74,27,120,106,191,231,25,65,189,120,249,11,41,45,240,253,23,140,238,243,226,197,139,23,47,255,75,16,66,118,81,74,7,16,66,118,85,92, + 87,241,117,217,118,11,23,46,28,80,94,163,236,253,138,84,92,95,126,255,69,139,22,45,40,247,190,199,89,150,37,132,144,251,198,60,148,138,123,28, + 18,172,74,163,186,247,106,210,247,106,122,53,189,154,94,77,175,166,87,211,171,249,255,79,243,65,246,47,237,62,188,91,250,254,128,202,156,173,218,80, + 222,25,171,110,61,33,100,215,236,217,179,95,67,73,100,235,181,178,229,133,11,23,218,1,100,122,244,97,127,115,184,239,191,34,92,233,213,244,106,122, + 53,189,154,94,77,175,166,87,243,223,213,172,230,179,42,235,58,236,79,43,116,251,85,181,174,170,103,74,105,155,170,52,60,89,239,169,253,222,174,67, + 47,94,188,120,241,242,63,71,64,64,140,22,184,151,147,175,70,52,198,248,32,0,176,230,38,100,255,157,118,121,241,152,221,0,250,151,45,208,114,209, + 45,90,121,68,170,50,78,151,215,40,219,190,162,70,197,247,74,245,60,78,25,243,64,142,22,33,68,202,72,228,51,148,42,237,120,194,64,111,41,202, + 11,123,16,157,255,15,16,66,72,76,93,205,115,17,17,198,135,211,51,178,191,189,118,211,182,221,211,125,53,129,177,171,117,122,195,195,22,179,105,137, + 149,85,175,170,46,215,81,77,104,131,234,27,137,220,119,43,17,157,11,138,211,47,239,125,80,157,202,32,132,40,226,227,227,91,0,64,66,66,194,121, + 90,50,205,254,79,161,9,138,29,237,171,247,121,218,45,186,4,155,213,246,185,37,235,250,230,63,111,233,239,232,66,27,250,67,162,251,2,2,255,48, + 40,88,176,146,11,196,233,120,170,56,55,161,210,26,130,101,212,25,180,48,110,226,136,254,115,86,109,220,61,239,206,246,87,239,43,89,227,215,119,153, + 110,218,227,189,94,249,116,253,246,69,121,59,94,246,232,2,237,229,143,212,121,104,140,15,47,9,102,51,143,44,201,175,205,126,225,177,29,174,72,165, + 82,163,219,237,206,201,184,126,162,137,39,251,68,196,117,60,199,178,76,168,192,139,233,105,137,199,90,63,152,197,255,91,168,2,235,119,0,207,191,70, + 1,2,34,249,192,145,127,243,240,159,209,11,13,13,85,25,12,134,46,122,189,62,66,173,86,43,11,11,11,237,133,133,133,119,82,83,83,15,81,74, + 249,191,202,238,218,160,9,138,125,149,72,201,91,165,175,223,177,102,39,46,172,110,123,109,80,220,60,194,208,87,75,95,47,180,100,95,155,243,79,216, + 89,29,36,58,90,174,177,74,38,129,146,25,32,196,135,66,248,202,38,177,189,67,211,211,43,47,192,90,9,126,126,126,189,36,18,201,189,26,168,60, + 207,219,11,10,10,14,252,61,22,255,37,228,150,58,64,185,149,45,151,115,142,42,91,38,165,203,174,42,52,92,21,156,43,87,133,245,174,10,122,23, + 60,53,186,214,142,22,33,132,149,42,212,191,142,153,240,108,147,69,111,207,86,46,93,181,13,74,173,111,130,195,82,24,95,91,173,127,2,99,253,118, + 103,88,134,13,47,191,78,16,133,244,220,155,39,255,146,139,110,108,93,213,196,215,95,30,247,194,232,17,61,34,123,12,152,78,0,120,236,104,129,160, + 249,198,31,182,70,28,61,114,248,147,85,171,86,188,171,14,140,251,80,170,144,44,55,221,185,92,84,27,27,12,129,209,245,228,90,227,209,135,6,61, + 27,124,246,224,119,223,104,140,241,61,173,185,9,23,107,219,150,251,204,35,196,24,29,29,221,38,38,38,198,127,218,180,105,50,0,248,232,163,143,26, + 52,104,208,32,63,57,57,249,52,165,52,183,38,141,202,208,4,198,141,251,120,201,187,107,250,246,237,135,204,60,43,22,127,248,105,55,109,112,204,99, + 127,149,179,229,235,91,79,47,209,251,94,154,254,242,187,129,125,186,181,97,45,14,30,251,142,158,239,252,221,167,239,158,210,27,227,219,86,231,108,137, + 54,211,156,32,45,237,35,218,76,0,48,186,226,251,97,90,174,135,81,37,244,9,81,72,206,3,168,49,205,135,111,212,67,251,165,10,69,36,195,148, + 212,156,100,24,2,150,144,146,58,161,110,123,106,250,213,163,189,255,84,99,255,34,244,145,237,178,192,74,252,25,242,187,125,132,41,125,166,180,248,238, + 245,95,252,255,236,103,16,66,12,77,26,248,52,238,223,233,161,175,127,190,85,160,169,211,117,230,110,66,153,207,82,143,126,224,209,5,75,169,84,250, + 238,220,185,211,216,167,79,31,67,80,147,193,63,123,178,143,86,174,140,223,181,107,135,172,79,31,207,15,179,38,48,182,39,24,102,45,1,164,162,72, + 63,98,69,186,209,146,127,61,153,150,246,97,120,138,58,40,110,34,3,234,241,117,70,4,57,99,203,190,182,170,230,45,43,71,170,52,60,34,149,201, + 102,212,139,105,218,50,35,229,198,25,171,197,252,33,231,40,250,185,214,66,28,255,210,193,95,206,246,149,72,165,164,207,35,237,88,0,127,202,209,10, + 10,10,26,188,108,217,178,250,29,58,116,0,0,240,60,175,223,180,105,83,240,220,185,115,53,240,224,55,84,25,132,144,48,163,209,88,71,46,151,135, + 1,128,203,229,202,200,205,205,189,67,41,173,49,7,157,54,56,58,128,64,242,238,47,71,143,74,0,160,115,231,46,243,34,59,79,243,101,101,218,74, + 111,116,57,151,89,3,96,230,137,147,199,9,0,180,111,215,97,182,198,24,191,252,223,138,108,17,66,136,42,48,102,190,159,92,243,194,128,49,99,229, + 253,123,118,129,90,165,194,222,125,7,94,89,189,106,197,112,125,120,124,235,226,244,4,143,210,14,72,36,18,213,169,83,167,162,25,134,97,121,158,119, + 180,111,223,254,206,159,177,45,44,182,227,49,2,38,194,205,187,190,202,189,121,102,62,165,84,168,96,59,107,136,104,249,58,88,201,36,81,20,211,138, + 83,79,119,172,229,71,156,174,97,249,65,248,43,52,170,165,214,142,22,35,145,207,24,253,228,212,38,51,95,124,77,57,125,233,33,236,254,116,118,222, + 127,170,147,5,0,44,195,134,31,56,176,63,80,165,96,1,0,22,187,128,190,30,92,116,125,162,218,29,97,8,137,45,203,80,41,240,110,165,68,42, + 119,16,0,32,37,9,57,2,66,235,30,10,9,241,83,143,30,209,35,114,237,250,31,211,239,164,231,255,92,91,251,8,43,67,251,46,189,208,163,103, + 111,195,169,147,199,222,93,241,197,231,175,106,130,99,63,23,57,241,67,123,126,82,141,3,237,212,33,49,173,52,134,160,125,67,159,158,235,239,96,252, + 240,230,252,143,3,142,238,93,247,115,215,254,227,196,212,212,52,7,37,36,161,176,224,238,12,203,221,27,137,30,217,67,8,171,213,106,235,107,181,218, + 230,125,251,246,85,206,154,53,75,218,173,219,239,101,247,38,79,158,44,59,114,228,72,200,146,37,75,250,133,134,134,58,44,22,203,5,139,197,114,179, + 226,15,170,58,130,131,141,207,13,27,242,40,186,15,125,22,130,72,48,121,234,76,236,223,187,101,10,128,191,196,209,226,212,250,185,147,158,158,101,108, + 223,166,5,251,238,186,68,168,228,18,244,110,29,75,158,156,54,199,103,213,39,239,174,4,208,181,226,62,117,6,45,140,19,109,166,57,77,2,92,163, + 6,118,168,135,29,223,187,70,133,247,120,5,140,218,112,47,178,21,221,247,121,157,175,74,181,44,212,135,13,84,8,185,203,162,251,62,127,48,121,239, + 39,230,234,108,145,42,20,145,235,191,95,215,208,87,43,3,203,18,72,24,6,44,75,224,116,11,24,254,216,168,191,162,185,32,132,176,170,192,134,253, + 24,224,73,0,16,129,213,246,156,164,61,181,57,39,132,149,249,239,218,177,85,18,104,80,128,101,9,88,6,96,25,130,148,108,59,38,78,124,210,240, + 39,237,51,246,237,20,216,230,200,242,174,189,219,55,241,107,182,225,56,49,180,239,59,210,63,207,161,30,191,126,251,225,81,117,186,188,112,146,82,241, + 253,180,95,150,86,123,39,237,116,58,179,123,247,233,171,39,18,141,250,224,182,111,186,72,24,2,55,79,33,136,37,143,223,253,32,2,134,33,160,34, + 197,164,73,19,209,187,79,95,155,200,139,233,30,27,204,48,107,247,29,252,205,232,228,68,44,89,182,234,93,171,41,247,221,91,215,252,83,212,65,49, + 51,75,103,203,122,38,3,218,58,237,230,229,167,215,237,58,129,38,241,141,238,217,25,27,174,193,186,221,39,16,23,27,119,175,214,103,76,132,22,109, + 90,183,1,238,43,77,230,25,82,165,254,205,174,253,31,127,103,192,99,19,16,104,52,130,161,220,128,131,187,215,13,144,170,12,47,113,118,211,146,90, + 137,81,225,222,255,2,21,197,63,61,188,36,52,52,212,216,166,77,155,123,203,60,207,35,42,42,10,25,25,25,177,181,213,34,132,168,67,66,66,250, + 127,249,229,151,129,253,250,245,147,6,7,7,3,0,178,178,178,194,246,237,219,215,50,52,52,52,231,238,221,187,187,41,165,85,206,8,19,56,70,198, + 72,192,42,149,106,0,0,5,97,102,61,247,120,179,160,144,208,74,35,245,185,185,89,242,151,159,61,76,36,18,89,233,246,96,40,21,171,76,94,236, + 231,231,215,67,42,149,170,42,123,207,205,234,219,83,169,225,41,134,101,40,8,0,158,203,45,72,61,219,168,178,109,43,67,31,16,215,79,27,20,187, + 126,230,43,111,105,135,15,236,9,94,4,126,61,126,14,145,117,125,48,113,252,88,132,70,212,141,154,251,214,236,207,0,140,244,84,147,101,89,73,78, + 78,78,138,175,175,111,176,167,251,84,169,197,144,122,63,238,223,27,120,240,167,67,179,63,88,250,201,51,161,49,157,57,145,210,123,117,140,235,52,233, + 46,237,57,96,132,62,48,186,189,242,147,183,158,146,254,217,207,251,111,161,214,63,34,185,74,55,226,141,151,167,41,231,126,119,2,187,63,157,146,103, + 53,229,222,43,151,162,53,248,158,179,152,10,91,62,136,33,186,192,216,14,132,149,60,77,88,86,67,24,34,23,5,49,141,119,185,230,217,242,174,223, + 125,16,189,242,8,34,240,195,111,181,171,60,67,40,26,172,221,184,45,48,200,71,1,135,139,199,200,209,227,176,118,237,26,93,128,94,14,135,139,199, + 251,31,124,96,182,164,236,14,76,73,43,204,232,241,232,11,7,110,222,206,185,124,231,174,99,99,109,109,115,186,5,20,219,120,216,156,12,26,54,110, + 131,247,63,140,83,222,73,189,245,194,55,171,87,62,175,9,138,91,35,178,204,59,246,204,132,180,202,246,213,132,52,237,109,240,13,253,126,200,211,243, + 125,146,114,36,160,112,35,89,175,196,136,241,207,235,235,7,171,160,81,178,62,183,82,51,66,102,189,244,210,175,134,192,232,182,166,156,106,50,121,151, + 82,183,110,221,161,3,6,12,80,191,248,226,139,210,136,136,8,172,94,183,41,178,115,239,199,30,205,188,155,29,65,41,69,80,96,96,218,164,39,31, + 219,185,103,207,158,212,180,180,52,233,226,197,139,219,109,221,186,53,30,181,184,51,21,40,133,195,41,64,16,74,254,120,114,107,89,29,133,16,66,194, + 194,194,20,25,25,25,206,178,40,3,33,228,222,133,79,27,214,162,247,35,93,219,73,190,220,123,27,22,135,0,141,82,138,219,217,54,180,110,209,148, + 124,37,240,205,43,211,156,56,162,255,156,32,45,237,51,176,67,61,4,250,170,241,245,242,249,216,113,252,86,159,108,11,65,192,192,197,79,135,40,36, + 61,141,106,217,178,110,173,163,131,187,183,138,196,233,214,209,193,71,207,38,94,111,58,226,195,105,25,22,233,193,130,189,211,42,117,184,88,134,129,159, + 78,142,149,251,82,160,86,74,160,81,74,160,81,148,60,51,204,3,39,154,7,0,168,66,227,35,88,81,152,168,15,141,159,56,106,196,99,161,99,70, + 61,70,193,50,216,244,195,206,65,223,125,183,246,174,54,56,118,165,192,176,171,170,250,254,148,135,48,64,160,65,142,151,86,94,134,94,37,133,78,45, + 133,94,45,69,247,102,70,176,158,215,123,254,163,38,33,190,83,6,213,239,119,113,77,143,135,99,235,104,27,94,72,54,37,76,156,119,102,233,145,162, + 135,103,44,255,40,222,223,82,228,146,188,57,107,146,36,61,51,243,225,77,59,127,238,30,218,118,98,34,239,182,190,150,115,97,99,165,81,225,180,107, + 199,90,134,119,120,76,233,182,112,151,46,36,166,71,23,58,21,184,146,82,12,141,82,2,109,217,177,85,74,160,81,74,161,85,74,144,153,126,27,5, + 86,246,215,12,127,230,97,122,228,88,173,186,168,28,110,1,231,111,89,80,55,182,5,66,66,66,225,234,55,182,238,201,67,63,108,215,132,52,90,104, + 189,123,181,170,241,30,247,177,110,215,9,204,158,249,244,89,2,156,3,0,10,180,124,115,209,167,173,222,157,253,236,31,214,205,122,231,147,86,181,177, + 175,60,82,165,126,206,195,67,158,125,167,75,207,193,48,23,100,227,216,129,141,232,61,96,24,198,78,152,14,31,159,128,247,165,74,195,5,206,113,127, + 182,124,93,72,163,135,154,54,105,244,93,88,104,104,132,88,90,111,148,82,224,161,174,221,241,242,140,73,16,41,69,243,150,109,187,247,27,53,141,82, + 90,226,16,230,229,231,89,19,175,37,244,176,103,95,59,233,169,125,14,135,131,203,205,205,197,249,243,231,113,253,250,117,92,185,114,5,249,249,249,48, + 24,12,181,234,122,39,132,232,155,53,107,54,230,208,161,67,74,95,95,223,123,235,93,46,23,116,58,29,198,140,25,35,237,213,171,87,88,255,254,253, + 159,32,132,172,163,148,22,87,166,99,207,79,202,212,7,199,125,209,181,91,215,103,0,64,165,15,185,181,108,245,206,106,11,207,171,12,161,145,29,59, + 118,138,6,165,32,160,31,91,243,18,179,170,218,86,34,145,104,78,156,56,81,159,101,217,123,255,175,162,40,226,179,175,55,196,253,248,203,165,161,139, + 222,95,162,212,107,20,200,53,185,240,212,216,33,30,255,7,171,131,98,251,107,117,154,157,175,188,62,135,12,233,223,3,223,238,60,131,117,171,63,231, + 51,110,95,226,30,238,63,65,217,178,109,71,116,111,219,26,205,90,180,27,161,14,141,91,108,203,188,118,95,229,137,26,248,75,178,151,55,12,215,66, + 55,176,183,114,202,227,3,149,46,78,64,145,149,131,211,93,82,110,205,100,229,144,112,199,140,0,253,131,149,114,251,111,69,178,123,247,110,218,191,127, + 255,123,87,252,138,203,21,81,200,164,161,26,131,17,148,94,69,185,255,54,4,133,132,231,127,254,197,87,126,6,95,255,84,83,97,126,36,224,217,20, + 79,85,104,124,132,132,176,31,118,237,214,165,215,51,83,167,34,182,126,184,76,16,4,122,249,250,45,238,155,85,95,143,55,68,52,93,90,156,126,121, + 14,45,41,97,226,145,102,121,4,81,72,175,24,193,18,68,225,15,119,183,149,105,18,2,248,104,100,248,98,207,45,80,10,16,80,232,213,82,172,63, + 146,142,91,103,183,20,15,104,94,108,29,179,232,237,238,15,247,123,254,80,66,178,99,99,78,142,99,63,165,52,171,58,205,202,112,184,69,56,221,2, + 56,158,199,230,157,59,209,167,123,59,116,236,216,14,93,58,119,148,156,57,123,113,194,212,103,38,69,160,180,236,72,121,77,85,112,195,54,122,159,240, + 141,67,159,89,172,187,148,206,67,194,2,245,130,85,240,211,201,224,226,9,82,114,75,146,99,83,248,96,218,172,119,252,102,191,240,204,30,66,226,155, + 80,154,240,135,172,217,21,237,180,217,108,242,113,227,198,73,57,142,115,143,121,106,122,175,172,172,220,65,159,125,252,158,34,48,48,8,54,7,143,179, + 87,110,52,122,247,221,119,234,237,220,119,100,219,219,47,77,217,222,167,79,31,195,134,13,27,196,234,52,43,146,155,157,183,252,235,239,54,175,249,104, + 201,2,36,166,22,98,213,151,159,130,10,252,23,213,237,83,94,147,82,74,95,123,237,53,213,182,109,219,194,53,26,77,177,205,102,43,223,133,201,48, + 12,145,100,23,216,16,160,147,67,38,97,16,228,171,68,160,65,1,41,11,48,132,8,149,105,174,218,184,123,158,104,51,97,199,247,174,81,95,47,159, + 143,9,207,189,142,203,121,242,125,140,218,48,239,217,81,67,103,27,85,66,159,80,31,38,176,123,171,186,208,40,101,120,245,249,113,104,123,54,37,48, + 163,72,124,61,215,206,182,0,74,202,6,85,108,59,195,16,72,88,2,157,90,138,125,223,189,159,99,53,229,154,202,186,228,92,78,71,106,117,109,174, + 238,120,106,130,98,103,183,106,209,108,254,51,147,39,50,157,58,180,165,12,35,69,158,217,69,40,5,102,76,155,130,103,167,76,10,78,203,204,121,243, + 211,79,191,152,163,13,108,52,215,146,115,245,237,234,52,25,82,18,5,210,42,37,208,170,74,28,23,173,82,2,135,75,0,33,96,125,35,91,153,72, + 73,36,55,51,63,165,242,59,240,138,154,126,117,26,255,244,227,45,93,92,225,198,194,227,183,51,175,204,59,123,49,251,20,165,180,160,78,215,23,158, + 112,243,20,22,7,143,219,217,54,240,110,74,38,244,141,68,212,112,18,187,224,235,115,107,8,33,250,50,7,186,162,102,250,241,77,142,128,166,67,71, + 126,244,201,151,167,151,204,127,157,205,51,185,32,82,10,165,156,133,74,46,41,125,176,176,91,77,248,244,243,175,178,120,144,161,244,200,17,190,58,59, + 239,67,164,99,135,244,235,178,158,0,114,194,200,210,67,35,235,70,62,242,232,120,229,35,3,199,65,224,93,179,53,65,113,135,173,217,215,126,242,68, + 179,73,124,35,16,224,156,37,59,113,10,0,104,131,98,191,136,139,141,107,85,113,93,131,6,177,247,57,90,213,217,41,83,233,159,243,245,51,190,30, + 219,184,69,96,116,211,174,68,239,31,134,91,73,231,177,254,243,55,215,138,14,215,59,63,237,222,56,127,233,170,173,35,30,233,51,4,95,127,246,222, + 171,0,14,85,212,164,162,56,246,155,149,43,34,164,114,5,56,94,4,39,208,146,103,94,64,65,65,33,56,94,132,82,173,3,47,18,112,130,8,142, + 23,225,116,241,154,41,227,250,79,5,112,207,209,42,175,25,222,168,219,126,153,66,17,73,81,82,187,150,82,10,150,119,49,33,33,33,235,0,64,161, + 80,64,161,80,64,20,69,156,77,204,125,206,24,215,227,25,148,58,120,130,219,149,90,120,251,215,222,85,181,61,56,56,248,209,138,78,150,195,225,128, + 197,98,193,47,199,79,27,86,174,217,220,231,118,106,122,125,145,26,156,186,192,250,189,1,60,90,213,241,44,206,186,54,53,162,195,100,230,197,103,159, + 104,240,201,55,187,78,37,237,155,251,106,85,199,26,0,234,245,152,237,122,241,233,97,173,23,125,188,42,169,224,215,207,103,214,116,142,36,18,137,52, + 55,55,55,181,108,121,217,87,223,183,62,151,152,49,120,233,71,75,149,103,111,154,113,233,118,38,158,232,81,167,228,14,167,2,149,105,106,131,163,3, + 140,129,33,155,6,15,28,66,134,63,218,19,43,119,156,199,138,207,150,23,100,101,36,70,106,24,210,63,249,218,153,245,62,225,241,136,206,49,35,174, + 89,59,92,56,127,170,37,128,243,213,105,86,66,173,28,173,234,52,15,95,204,131,197,193,195,233,226,193,137,20,197,54,14,57,69,46,20,219,220,176, + 216,121,60,209,179,78,165,251,213,214,31,249,111,65,2,252,222,152,221,187,119,87,123,160,9,33,245,213,122,127,133,94,37,69,189,168,58,120,242,181, + 175,3,244,126,65,57,74,185,132,221,187,119,159,95,190,75,11,134,97,171,44,205,82,17,93,96,76,71,149,74,189,251,131,15,62,192,168,71,59,171, + 238,228,113,150,139,119,236,217,86,23,248,64,99,140,124,222,130,69,218,69,139,223,127,118,215,14,177,8,192,251,149,105,248,68,181,57,195,146,114,99, + 176,8,1,21,133,244,130,219,167,90,3,192,159,25,139,101,117,240,96,75,199,214,16,2,216,156,2,88,150,228,20,37,110,76,24,51,119,94,247,181, + 235,127,204,164,140,143,217,106,189,173,166,148,122,222,53,81,14,135,75,128,147,19,112,229,194,89,116,105,31,143,142,173,227,96,115,8,176,57,121,68, + 69,199,2,64,64,101,251,73,88,230,22,21,56,7,165,130,110,64,27,35,2,125,228,8,241,85,64,33,147,128,19,0,187,75,132,195,37,32,37,199, + 14,179,93,133,166,93,31,171,231,31,114,198,233,31,217,102,91,126,234,233,161,213,217,36,8,2,190,89,183,185,65,102,102,246,160,61,219,190,83,228, + 22,115,184,152,98,69,78,145,19,96,141,120,107,193,114,197,43,51,39,15,254,230,251,31,82,31,233,220,46,181,182,109,182,230,92,91,219,180,99,255, + 47,6,12,24,172,186,114,114,15,146,206,255,52,223,146,237,249,248,44,66,8,179,105,211,38,126,242,228,201,230,5,11,22,68,236,216,177,35,42,55, + 55,247,60,0,206,199,199,39,46,166,65,228,133,3,251,246,134,245,31,252,152,52,61,207,14,131,90,134,200,64,53,142,255,178,159,147,203,165,149,142, + 55,41,237,30,28,29,222,227,21,236,56,126,171,207,149,124,229,145,73,19,159,72,61,112,52,49,127,217,154,3,239,133,105,185,243,74,49,119,217,153, + 214,209,193,179,167,141,195,194,79,214,226,231,179,137,57,86,38,100,254,93,39,255,227,219,35,95,174,212,86,150,65,137,163,165,146,194,90,156,107,186, + 113,118,111,76,109,143,87,21,60,113,96,219,90,166,192,204,33,45,207,65,50,11,204,16,68,10,31,181,12,188,72,81,84,144,71,190,91,187,6,167, + 79,31,103,192,50,79,1,120,187,58,49,134,148,116,21,106,149,210,146,136,144,170,228,153,19,68,196,54,136,198,138,101,31,234,3,2,131,240,80,151, + 135,61,54,80,231,31,217,124,253,234,101,56,114,236,92,183,159,151,46,111,163,13,53,126,162,15,143,95,98,136,234,233,112,186,5,152,138,10,33,119, + 165,161,109,88,46,252,212,2,82,138,67,112,57,43,73,91,211,88,168,188,75,91,206,27,155,12,153,179,121,231,161,133,189,123,118,195,229,148,98,168, + 228,18,40,229,44,148,114,22,82,34,224,195,207,191,224,10,77,230,1,121,151,183,229,121,108,112,41,165,133,192,239,141,73,211,6,213,55,174,253,100, + 206,183,147,94,94,220,187,207,144,241,228,242,233,195,175,1,248,169,106,133,223,17,196,251,155,82,217,58,177,146,117,85,161,210,27,63,126,97,206,251, + 207,247,26,240,24,88,86,2,158,227,176,121,195,90,172,94,254,214,53,151,37,127,60,165,84,36,196,111,242,198,181,159,63,246,242,155,31,146,38,205, + 219,86,90,96,93,100,201,151,143,79,124,122,100,80,80,144,238,247,136,22,69,76,108,60,250,13,28,134,253,219,183,34,225,202,69,136,180,196,97,18, + 69,138,162,194,252,44,158,115,125,83,149,109,114,165,50,242,235,213,107,26,50,12,129,155,19,225,226,69,204,156,250,164,107,202,140,215,30,234,215,171, + 235,21,57,139,226,148,59,119,125,142,159,187,218,84,148,106,35,38,206,250,80,230,112,10,48,217,56,236,89,85,181,175,163,242,139,236,208,188,227,224, + 137,83,222,88,161,80,176,140,187,113,76,196,173,174,237,27,167,213,9,13,48,191,187,104,121,219,95,79,158,235,55,98,204,68,229,19,113,173,72,168, + 191,74,247,228,152,33,205,52,254,117,30,183,230,223,89,83,149,166,84,237,91,84,39,170,193,189,46,70,117,112,236,22,66,81,175,252,54,148,224,150, + 45,43,113,40,0,132,132,214,113,72,21,250,106,135,10,252,97,223,210,239,241,39,95,125,223,250,194,245,204,73,31,125,180,84,125,246,166,25,231,111, + 154,160,144,49,112,115,34,136,167,46,132,200,78,83,200,21,202,231,166,60,137,179,55,138,176,253,135,45,112,219,138,158,82,17,97,53,37,164,111,160, + 159,14,197,102,179,152,154,109,97,124,252,252,1,160,177,167,118,222,251,8,177,228,126,217,16,24,93,79,144,40,250,73,229,154,14,132,208,198,132,194, + 23,160,25,249,165,255,169,213,182,185,220,107,107,246,117,44,94,240,38,62,94,185,21,153,249,14,24,132,52,108,95,53,15,47,46,92,7,187,179,234, + 81,13,158,250,35,255,77,72,0,160,172,81,213,53,142,16,18,99,12,137,60,182,125,219,22,223,66,139,27,74,25,139,58,81,13,240,246,178,237,198, + 190,173,3,144,231,54,224,251,21,75,10,28,54,243,6,79,62,88,21,20,215,78,167,211,237,217,242,195,86,212,175,19,40,251,238,151,130,219,231,110, + 217,239,133,122,139,115,83,229,81,122,155,100,232,144,33,234,159,14,29,158,129,42,28,45,150,176,225,95,173,249,33,80,167,146,130,16,192,108,231,49, + 233,241,97,15,112,40,42,64,69,118,194,248,199,65,74,157,172,226,252,44,188,246,242,51,14,13,151,148,112,39,229,78,70,143,71,95,252,169,216,66, + 28,35,199,77,61,157,112,125,161,103,245,142,42,193,233,18,240,127,236,157,119,120,84,69,219,198,239,217,158,45,233,61,1,130,64,10,4,66,151,222, + 139,72,164,72,17,16,5,21,65,44,216,16,80,80,186,32,210,81,144,34,32,32,29,105,65,8,29,164,19,122,73,2,41,132,244,190,37,219,119,207, + 124,127,236,6,3,236,38,27,124,121,63,245,157,223,117,157,43,123,78,102,239,157,179,57,187,185,207,51,207,60,99,48,113,72,73,185,143,79,71,244, + 128,144,207,3,159,207,217,146,165,45,206,47,70,117,86,98,177,123,112,204,160,141,11,62,92,29,18,24,224,171,144,75,169,66,38,33,13,235,71,136, + 90,183,110,43,126,33,170,177,232,244,29,29,50,10,116,72,205,86,66,18,216,84,48,180,235,203,216,184,120,124,103,66,8,175,60,66,232,140,195,39, + 206,247,89,179,98,145,36,175,212,132,187,25,26,228,150,232,145,83,98,64,110,177,30,10,169,16,29,251,142,150,196,237,89,217,167,91,135,86,75,159, + 229,188,83,83,211,226,210,179,114,6,55,110,246,34,54,254,178,174,131,183,119,29,143,146,146,84,135,161,126,7,208,89,179,102,137,231,206,157,43,88, + 182,108,153,170,117,235,214,65,95,126,249,229,75,249,249,249,23,107,215,174,29,117,104,215,250,99,77,59,246,107,9,206,228,223,161,83,23,145,132,19, + 32,126,255,126,211,182,173,155,138,116,58,245,123,149,9,243,100,158,179,242,52,4,254,161,161,183,20,98,107,15,1,175,52,169,248,247,143,54,0,216, + 85,239,229,113,71,142,95,78,76,106,145,144,30,112,44,225,94,126,177,214,20,121,255,247,207,42,253,226,229,19,2,1,159,7,119,169,0,60,251,183, + 170,123,104,147,123,32,196,31,176,93,91,4,196,254,19,32,4,217,197,15,174,184,144,179,65,40,71,129,196,204,50,104,244,182,208,124,13,63,25,10, + 242,50,177,124,233,122,92,185,124,9,61,95,238,139,31,87,111,194,187,111,14,174,114,22,18,143,103,143,104,85,136,102,41,164,2,0,4,165,101,102, + 236,252,227,33,234,213,225,185,254,143,1,128,187,66,6,165,90,7,158,200,29,247,19,14,200,126,63,126,225,203,41,51,23,125,81,146,115,61,227,222, + 141,211,136,242,83,162,78,168,9,183,114,61,112,185,232,5,68,133,215,5,79,228,90,94,106,225,173,152,121,123,120,59,95,105,209,52,186,77,88,128, + 23,116,70,171,61,170,197,199,186,181,27,144,158,150,249,78,225,173,221,87,92,239,173,115,52,121,41,5,110,129,17,31,220,184,112,52,245,213,215,63, + 64,112,104,45,135,195,207,142,112,100,160,28,29,115,100,190,28,33,150,123,127,57,254,155,5,227,122,198,14,194,249,211,71,113,245,214,125,180,106,213, + 2,47,247,31,10,181,170,184,254,246,13,139,123,0,56,36,144,88,198,189,216,182,43,225,172,86,36,223,189,121,223,145,150,125,104,201,163,226,49,153, + 127,131,38,10,79,159,171,6,147,21,89,89,153,56,115,246,68,179,234,14,65,73,68,124,196,95,201,135,201,204,193,100,225,208,177,83,15,163,136,103, + 232,48,123,209,218,214,57,217,57,60,185,135,31,231,19,218,64,20,44,49,25,174,165,40,69,38,51,135,186,33,242,74,53,253,67,194,191,29,63,254, + 211,6,124,145,20,234,50,131,49,39,59,43,104,213,230,227,154,59,119,111,132,214,8,240,244,248,110,241,74,145,74,79,144,175,52,160,88,173,34,175, + 143,153,16,178,230,135,57,195,1,56,53,90,79,66,40,234,196,197,159,174,239,237,46,34,26,189,133,43,82,153,172,175,247,119,253,198,194,17,118,147, + 53,122,209,194,197,178,43,41,106,92,75,81,194,77,196,135,88,196,131,209,204,193,149,143,19,33,132,231,95,187,217,39,19,191,24,15,14,60,92,184, + 145,138,156,135,247,169,187,66,190,59,234,197,247,192,23,73,48,168,87,27,132,6,251,240,142,159,191,139,64,79,47,16,160,115,213,202,143,163,209,106, + 249,102,113,208,91,193,161,181,219,13,24,250,150,103,88,173,80,18,224,231,11,11,21,96,244,155,3,93,254,228,219,140,57,48,119,230,151,48,24,140, + 240,247,18,131,82,96,237,210,105,48,26,141,8,241,149,64,89,102,118,250,124,87,252,200,63,141,71,227,195,149,133,231,136,88,28,229,23,28,118,46, + 254,208,65,207,221,215,56,156,255,237,50,98,91,5,67,36,224,65,230,25,130,107,105,74,196,237,90,81,186,103,203,202,44,131,193,224,208,16,85,68, + 22,20,209,194,93,238,113,232,151,141,91,57,63,95,95,222,242,248,130,148,34,181,229,209,144,86,210,133,189,220,229,67,171,130,41,200,65,55,55,183, + 112,163,209,232,93,153,30,71,129,181,241,15,236,73,188,255,153,40,35,225,243,173,155,54,109,132,175,135,24,6,51,135,73,95,124,172,27,209,83,81, + 250,250,107,67,187,118,233,61,238,152,80,30,113,180,109,179,8,218,180,105,211,82,62,159,95,181,30,33,130,128,128,128,105,60,30,111,152,88,44,118, + 55,26,141,106,49,68,178,50,189,17,122,19,160,213,234,33,20,217,204,162,144,79,160,211,27,161,213,25,43,213,84,231,220,248,3,192,99,17,18,82, + 175,158,248,215,237,123,62,30,244,218,144,41,161,77,250,43,210,114,148,16,17,19,90,54,8,198,241,131,191,209,204,244,164,79,171,50,89,0,144,95, + 80,92,211,223,63,16,87,82,53,200,42,210,33,215,110,178,114,74,12,80,235,212,104,28,22,130,82,165,178,102,149,39,238,236,253,0,126,59,116,232, + 208,224,222,253,134,96,220,23,211,219,255,188,98,254,117,69,80,228,219,154,220,164,42,23,132,166,148,82,66,72,241,196,137,19,235,173,94,189,154,55, + 124,248,112,93,76,76,140,219,27,111,188,209,126,195,134,13,110,50,153,155,238,218,233,189,83,70,125,52,169,223,170,37,179,154,148,148,148,16,139,217, + 252,187,169,164,100,146,186,10,51,151,177,231,203,187,36,122,250,200,30,29,252,247,250,200,120,13,37,212,56,148,68,79,223,74,111,79,53,221,255,125, + 169,58,230,181,133,31,101,151,114,147,245,188,128,217,85,153,44,0,224,241,9,140,102,14,238,82,33,120,60,251,48,1,229,130,215,109,253,93,230,239, + 41,134,144,207,131,128,79,160,210,154,81,168,50,225,131,183,250,185,248,14,82,206,98,165,208,25,45,208,218,239,14,213,170,66,124,249,197,103,120,185, + 207,171,24,245,222,103,40,209,1,151,83,213,48,153,205,85,126,40,120,132,7,173,193,130,183,123,134,161,88,99,66,153,206,2,163,133,131,76,44,128, + 80,192,131,220,77,0,15,153,16,160,84,68,8,25,13,0,66,161,80,111,50,153,54,58,237,33,165,120,161,102,32,116,102,30,94,28,50,31,221,219, + 68,226,214,31,59,5,39,207,223,168,243,201,23,147,241,241,187,125,176,227,110,61,248,4,132,65,33,151,194,76,121,0,92,43,29,66,233,84,46,184, + 254,128,97,63,173,94,151,56,227,155,137,110,165,101,4,18,17,31,199,142,30,193,185,11,151,151,20,220,218,237,180,95,207,130,144,242,2,61,60,60, + 224,38,230,195,104,50,84,254,193,172,128,149,163,160,64,51,69,96,212,79,128,45,31,203,202,193,193,177,170,255,159,8,165,158,147,198,77,156,245,109, + 207,216,65,136,223,191,3,219,118,108,181,182,125,121,20,127,211,186,159,208,190,123,95,180,239,57,4,191,255,182,225,51,161,212,51,122,244,199,95,207, + 236,216,181,55,226,227,118,32,47,55,115,129,171,253,229,11,201,184,174,61,250,64,111,180,162,67,183,87,112,112,223,111,31,193,62,201,194,85,158,52, + 227,28,120,150,207,62,29,39,204,87,26,133,133,74,35,30,22,234,144,158,91,134,221,91,126,118,249,159,40,129,177,101,199,198,53,132,163,231,29,123, + 88,179,70,176,65,104,208,73,147,238,167,212,31,245,214,8,97,157,240,250,188,124,165,1,5,74,3,10,149,6,104,244,22,132,215,136,224,153,45,164, + 77,117,250,13,0,126,158,98,225,143,251,82,225,33,23,162,109,253,103,159,104,203,113,220,159,38,107,145,205,100,93,79,85,66,34,226,67,34,226,65, + 34,226,195,98,165,46,221,184,72,3,234,143,12,173,81,67,209,179,75,59,92,190,175,68,78,102,38,122,245,234,78,210,74,197,216,56,115,48,138,148, + 90,204,88,125,18,95,140,138,69,191,174,77,144,155,95,8,62,159,31,81,157,190,30,136,63,81,43,254,212,149,137,31,140,159,170,120,173,79,23,254, + 213,20,37,114,138,13,184,159,164,174,94,228,13,128,197,202,129,130,98,253,214,253,144,138,5,40,80,154,64,41,197,172,101,219,224,46,21,34,167,196, + 54,220,95,25,255,134,225,194,138,84,153,136,39,22,43,234,251,249,134,156,143,63,120,192,253,183,107,86,28,191,86,132,65,29,106,64,83,156,129,239, + 191,120,173,152,128,26,121,124,126,169,65,167,221,165,211,149,205,166,148,154,42,211,147,5,71,53,147,75,61,142,252,184,234,23,139,95,64,0,54,158, + 46,206,44,41,179,60,178,183,86,171,153,92,62,180,170,142,133,51,247,210,229,38,87,121,123,203,81,136,230,172,216,3,128,130,227,56,80,142,131,208, + 77,33,247,175,215,38,15,0,172,28,117,19,240,136,237,142,222,126,181,80,206,146,89,144,82,121,24,148,0,240,144,9,177,245,100,22,0,228,241,213, + 9,119,94,127,205,54,92,168,55,186,169,26,214,171,71,91,182,108,89,42,149,58,156,92,242,184,22,33,252,192,192,192,139,83,166,76,169,63,106,212, + 40,137,88,44,134,197,98,241,89,185,106,21,183,106,246,187,24,240,209,143,16,137,37,208,233,77,16,96,176,138,251,0,0,32,0,73,68,65,84,10, + 5,40,81,106,80,170,210,66,173,117,238,250,157,65,239,223,55,2,152,23,18,213,225,213,151,20,141,95,20,243,68,104,30,21,140,227,135,118,211,243, + 7,215,190,171,205,75,252,197,37,29,74,161,209,155,145,93,164,71,86,145,30,185,37,122,228,22,27,144,91,162,7,33,4,122,227,95,43,127,83,150, + 159,184,125,227,47,107,250,26,76,24,218,177,231,171,248,108,234,143,97,27,127,154,123,68,26,88,191,157,43,137,182,148,82,43,33,36,253,173,183,222, + 106,178,121,243,102,126,163,70,141,116,119,238,220,145,1,224,0,152,20,10,153,244,231,31,230,28,122,241,197,23,183,100,37,221,61,6,160,196,149,233, + 249,181,59,191,37,169,239,81,60,186,150,188,237,75,117,131,100,168,37,87,191,84,95,113,237,251,128,110,159,124,155,127,116,113,126,142,193,114,184,64, + 199,111,154,165,17,186,148,131,103,54,232,31,12,24,52,4,124,194,131,73,175,125,0,0,32,182,196,243,105,155,238,66,225,38,132,187,84,0,133,84, + 136,246,209,62,46,221,225,150,191,5,102,43,7,173,193,10,157,193,2,189,209,2,191,154,222,88,189,113,59,50,242,117,216,115,169,16,137,15,212,136, + 168,33,7,165,85,127,77,114,86,115,89,159,129,195,221,249,60,2,62,143,240,162,235,71,162,88,99,130,72,192,131,200,77,10,185,68,0,15,169,16, + 34,145,16,249,249,249,48,24,12,168,85,171,150,91,165,29,228,40,220,21,82,68,212,9,129,201,108,193,129,83,183,49,251,211,1,232,209,177,5,136, + 80,129,187,134,102,112,247,113,7,199,227,193,100,225,96,52,89,1,240,156,70,223,106,213,170,213,85,46,151,203,181,90,173,250,193,131,7,39,114,238, + 238,202,8,104,216,127,244,193,248,99,27,95,121,185,7,174,92,191,133,29,191,237,61,93,232,171,28,95,254,156,70,141,26,181,246,243,243,83,20,21, + 21,169,110,220,184,113,209,245,183,247,79,8,33,68,30,88,255,147,54,237,59,67,83,154,143,188,135,105,46,47,249,209,32,204,29,95,207,249,177,121, + 84,100,84,115,43,181,25,175,232,90,238,248,124,234,210,230,245,34,34,155,151,79,8,105,80,75,81,169,142,80,238,209,243,205,209,159,207,233,59,104, + 36,142,197,239,197,194,217,95,108,84,184,251,55,240,241,242,104,218,168,117,79,156,62,178,23,110,238,65,240,246,13,106,63,252,237,15,187,15,26,62, + 6,231,78,31,193,146,185,95,109,176,26,212,191,186,210,87,69,96,93,255,166,45,59,190,238,238,19,136,82,165,26,238,222,1,104,208,184,229,235,138, + 192,186,19,53,121,41,207,84,202,5,176,13,73,26,76,20,37,106,19,50,10,108,38,43,45,79,11,142,171,70,78,144,149,35,10,55,129,192,199,124, + 175,214,141,35,199,104,88,205,64,50,111,230,23,124,19,220,80,80,106,51,89,5,42,35,10,148,70,104,244,102,248,200,5,224,172,206,103,6,58,163, + 68,99,130,187,76,8,79,153,200,229,40,163,35,86,172,219,26,117,45,41,187,255,194,133,139,101,87,83,43,152,44,161,45,154,37,17,241,97,229,56, + 192,133,79,60,143,71,103,76,249,106,2,116,38,14,249,165,70,136,37,98,132,134,214,131,168,196,140,55,191,217,1,33,159,143,33,177,173,1,216,34, + 220,23,238,170,96,181,184,126,238,101,58,29,127,213,166,184,79,182,111,219,226,169,183,10,176,242,247,116,104,13,22,184,137,248,144,136,248,144,138,248, + 143,229,99,87,133,197,106,203,185,203,40,52,67,171,215,67,165,51,131,2,184,120,79,3,157,209,2,101,153,25,173,235,87,26,59,249,215,33,120,210, + 57,86,220,23,43,124,26,120,250,250,159,63,248,251,126,197,111,215,56,156,184,110,51,89,102,93,33,22,76,28,150,169,42,45,236,66,41,173,180,0, + 100,69,228,254,209,141,165,50,217,177,239,22,175,52,5,4,134,114,187,206,151,230,43,181,214,199,220,132,213,96,224,81,142,138,92,49,89,0,192,227, + 17,211,212,143,94,5,71,41,166,45,222,142,111,199,15,129,66,58,92,70,8,145,149,233,45,248,116,250,26,44,248,250,29,119,153,68,0,66,108,57, + 81,111,14,125,213,165,254,150,233,45,184,127,97,179,70,157,186,255,78,197,225,194,86,237,95,190,220,170,85,171,82,111,111,111,72,165,210,63,35,21, + 78,8,12,12,252,122,234,212,169,81,239,189,247,158,164,252,152,64,32,192,7,239,191,207,179,90,41,126,255,125,45,252,107,55,195,222,195,231,209,171, + 107,75,104,180,122,20,151,170,193,161,234,72,153,51,212,165,133,199,114,211,111,188,216,174,75,31,156,56,180,155,158,255,253,231,119,171,83,163,199,219, + 199,251,97,194,141,251,13,8,241,177,69,180,236,38,203,104,230,16,22,40,195,195,244,251,240,242,244,172,114,54,91,57,178,128,250,253,8,143,190,71, + 64,215,106,114,147,182,219,77,207,48,121,80,253,235,183,110,94,157,253,202,235,227,4,61,7,189,207,255,105,206,135,95,225,137,36,214,74,48,37,38, + 38,222,126,231,157,119,218,158,59,119,206,10,64,75,8,49,243,249,124,153,209,104,20,117,233,210,69,121,247,238,221,147,0,170,28,218,237,240,246,14, + 63,34,81,191,92,47,162,229,176,48,119,117,143,46,29,218,160,77,195,154,120,216,161,13,0,140,123,160,81,68,181,31,251,243,214,58,254,53,14,252, + 180,110,223,183,239,14,233,254,105,72,159,233,11,179,247,77,173,180,200,108,198,237,19,14,106,137,148,15,39,10,161,144,10,224,46,21,194,221,77,8, + 179,197,181,59,92,59,212,108,225,108,17,45,163,5,26,157,5,199,174,230,33,87,105,68,169,218,4,157,201,10,10,106,187,27,117,225,219,60,63,249, + 15,175,242,199,222,97,205,149,171,150,205,247,216,249,71,230,163,25,125,158,50,49,220,101,182,217,216,167,78,157,130,175,111,213,119,251,28,199,97,199, + 193,139,88,184,254,24,14,174,157,0,55,17,31,141,251,77,199,200,254,173,192,81,14,247,19,111,229,69,68,55,9,228,241,164,224,17,2,131,153,3, + 64,157,190,159,70,163,209,55,35,35,67,21,30,30,30,20,26,26,58,136,207,231,83,9,96,216,189,165,88,123,116,255,175,178,50,157,193,42,179,40, + 215,134,231,232,98,35,34,34,64,8,161,126,126,126,162,99,199,142,105,98,98,98,252,157,233,86,6,33,132,39,13,136,92,50,106,236,39,131,234,213, + 173,139,237,191,174,5,165,100,167,171,207,223,180,239,28,102,126,249,248,12,195,207,167,46,109,190,96,250,184,199,142,141,253,114,97,165,179,14,165,18, + 197,248,1,195,70,227,242,197,179,248,126,250,231,91,12,154,226,145,102,139,121,112,113,78,234,150,58,209,173,64,77,106,196,111,155,143,33,111,188,43, + 233,249,202,32,156,59,125,4,223,126,53,118,147,182,52,255,45,87,235,127,113,84,248,94,151,151,250,11,117,6,19,150,206,251,6,99,198,207,70,235, + 174,125,132,55,175,158,127,15,192,12,87,207,217,96,178,162,75,140,159,205,60,155,57,236,77,229,11,28,93,129,2,62,225,53,173,235,5,157,209,2, + 85,21,55,149,2,145,48,183,84,169,170,253,195,183,159,240,203,244,22,20,40,141,200,87,26,80,88,250,167,193,42,84,26,80,160,52,66,40,32,72, + 74,121,0,158,80,80,237,252,188,18,141,25,47,70,122,3,32,16,60,227,232,136,89,224,209,234,224,201,107,3,22,46,92,228,118,45,77,141,235,169, + 42,123,36,139,15,137,144,7,177,253,177,149,179,229,70,86,134,123,112,68,251,122,47,68,132,180,121,177,9,238,102,216,210,159,3,131,130,161,85,231, + 163,67,179,122,136,237,220,24,94,30,238,184,243,64,137,111,55,223,196,189,123,41,224,155,93,205,192,176,177,116,229,150,94,163,62,248,220,139,39,20, + 99,195,161,52,91,63,249,86,220,61,191,79,159,125,255,70,153,70,85,68,65,173,46,230,32,19,106,177,218,46,183,111,167,77,194,150,245,203,113,40, + 33,255,81,242,214,31,59,23,224,147,47,103,161,80,101,4,28,36,223,87,230,71,254,201,56,141,104,201,189,3,26,121,186,123,158,253,253,247,125,242, + 221,215,233,35,147,101,210,22,210,217,227,250,100,170,74,11,122,86,203,100,5,68,54,146,200,229,39,167,204,90,98,8,12,173,109,57,112,85,85,164, + 214,91,159,10,139,136,100,114,171,220,211,95,239,21,214,108,161,80,103,252,166,160,224,118,165,201,245,4,182,59,166,253,23,114,65,169,237,22,105,219, + 169,44,216,239,204,97,229,108,195,42,135,175,230,67,96,207,67,113,5,66,128,21,43,151,171,98,99,148,101,175,127,59,237,209,112,97,235,38,182,72, + 150,135,135,7,188,188,188,160,80,40,80,213,208,33,33,228,205,81,163,70,61,117,247,159,159,159,143,238,221,186,96,217,242,213,104,210,109,4,14,159, + 57,4,147,153,67,227,232,186,168,29,226,141,135,121,46,231,93,62,134,34,168,254,7,47,118,125,245,171,246,93,251,224,216,193,93,244,252,193,117,163, + 171,91,8,49,182,123,219,125,51,103,78,171,51,101,246,15,18,119,55,1,238,104,140,224,17,130,176,64,25,124,229,60,156,216,189,65,63,164,79,219, + 125,174,234,213,172,25,186,113,193,178,85,242,5,115,167,119,113,15,141,58,166,206,74,44,6,128,178,220,187,243,100,65,245,111,215,56,27,127,160,73, + 167,87,17,24,82,183,135,171,154,246,33,68,109,74,74,74,234,148,41,83,162,230,206,157,75,249,124,62,7,64,178,120,241,98,109,114,114,242,85,0, + 133,229,109,43,211,234,214,163,225,167,10,177,181,181,143,140,215,176,110,144,12,109,26,218,70,69,135,196,182,71,205,90,181,144,146,171,109,90,172,229, + 132,26,35,191,238,143,43,175,95,122,193,143,255,174,69,103,188,141,234,20,168,181,67,240,103,130,124,121,52,203,93,42,4,7,84,231,206,145,154,45, + 182,25,171,58,131,21,58,163,5,101,70,43,180,70,43,56,106,251,76,16,66,96,178,112,229,47,233,122,255,8,224,225,227,135,186,47,16,120,200,108, + 125,243,176,151,123,32,0,124,125,125,17,16,16,80,117,7,41,133,209,100,251,136,27,205,220,163,97,125,163,201,2,74,41,146,146,18,39,164,167,166, + 246,11,143,8,239,24,221,184,137,143,76,194,3,0,167,70,75,171,213,90,221,221,221,3,124,124,124,120,89,89,89,143,204,115,120,211,46,150,223,118, + 237,196,128,1,175,106,238,92,188,246,168,142,139,78,167,35,237,218,181,243,168,89,179,38,207,96,48,84,235,191,15,33,132,200,253,35,251,215,172,223, + 118,246,155,111,141,137,236,210,189,23,142,31,141,199,158,93,155,127,41,203,79,116,185,114,118,84,84,253,167,102,29,214,139,136,124,106,214,97,237,58, + 17,149,26,173,232,198,45,91,81,34,192,161,253,219,168,158,103,26,107,75,120,39,219,182,174,248,122,198,176,247,190,172,215,187,239,48,188,249,198,72, + 8,4,124,156,56,188,15,11,166,127,22,167,81,230,143,112,37,77,0,0,72,116,180,40,188,86,237,143,107,213,107,132,132,243,167,113,63,233,230,173, + 107,151,206,53,12,143,105,13,255,144,176,143,73,116,244,92,122,251,118,165,163,21,0,96,212,235,31,140,28,241,6,42,206,58,108,211,44,202,247,177, + 11,208,190,163,85,231,155,126,158,255,105,114,249,172,67,206,100,124,224,76,87,89,82,176,227,196,153,11,227,251,197,246,226,21,170,140,182,8,150,210, + 104,223,12,40,44,127,172,50,32,34,68,129,196,91,9,156,94,89,232,178,33,182,119,75,63,114,240,75,183,129,63,147,255,9,224,114,149,245,114,168, + 208,99,244,188,239,23,186,93,75,213,224,122,154,202,54,84,40,228,219,12,150,144,247,200,116,217,102,179,87,161,197,241,215,205,152,62,25,70,19,69, + 137,198,4,66,0,119,79,31,168,4,82,220,205,177,64,157,86,130,7,57,105,200,72,79,67,89,65,42,132,124,10,15,137,9,174,214,68,178,82,113, + 176,214,72,99,6,197,118,20,236,58,155,3,153,68,0,131,58,15,191,111,157,95,96,208,168,102,235,180,154,93,174,212,115,44,135,71,72,129,74,163, + 15,148,8,249,216,190,254,7,12,30,57,214,126,34,182,31,19,38,207,4,120,4,197,37,106,16,66,158,57,74,250,79,195,169,209,226,56,250,123,252, + 193,125,242,63,210,37,184,152,152,99,55,89,5,220,172,143,98,51,213,202,226,151,40,165,73,213,122,37,30,239,165,33,111,143,191,85,55,50,218,112, + 252,166,38,173,180,204,236,52,207,161,205,160,41,183,46,199,45,235,173,52,167,188,175,8,105,104,229,44,150,121,218,252,196,233,14,251,73,33,158,190, + 100,251,163,97,195,137,115,55,216,30,91,173,176,82,14,148,3,62,252,122,5,44,156,21,156,213,10,206,74,97,182,82,89,85,221,13,8,169,189,171, + 228,238,182,250,175,207,120,122,184,208,203,203,11,190,190,190,240,245,245,133,135,135,71,149,70,75,40,20,42,4,130,199,223,234,7,15,30,32,61,61, + 29,30,30,30,160,156,25,70,51,208,168,117,79,220,184,127,19,71,254,184,10,202,89,33,87,84,62,156,224,8,69,80,253,247,91,118,238,247,67,215, + 190,239,224,240,174,149,244,210,169,125,99,180,121,137,107,92,125,190,213,106,37,102,179,25,177,61,59,63,184,114,235,222,193,201,227,223,235,213,246,149, + 49,146,54,81,161,208,27,173,200,76,191,143,19,187,215,233,35,235,4,31,234,214,161,213,3,179,217,12,171,213,90,229,63,114,189,209,84,200,23,74, + 229,67,135,190,46,188,116,241,226,78,69,64,228,118,43,225,93,35,148,198,16,130,129,141,27,55,128,201,204,65,171,85,85,123,98,129,90,173,78,93, + 187,118,109,157,17,35,70,200,162,163,163,133,247,239,223,199,130,5,11,138,212,106,117,149,117,195,202,137,63,149,184,88,64,74,146,197,156,105,88,152, + 187,186,71,70,251,54,24,250,74,123,108,137,251,3,39,78,159,195,3,141,226,170,198,34,216,253,240,65,182,161,161,143,106,103,223,54,181,249,219,215, + 151,236,12,232,242,229,107,148,74,226,11,78,76,117,121,182,173,109,210,134,25,30,50,91,189,167,242,200,22,159,16,151,29,17,1,82,79,159,75,104, + 212,34,34,26,87,82,149,200,47,53,64,103,176,128,227,40,56,80,248,186,139,225,38,226,33,35,61,21,28,53,165,185,218,55,27,180,160,83,199,78, + 2,128,128,16,42,16,10,4,160,176,213,87,148,74,165,154,128,128,0,151,34,90,38,139,5,3,122,181,66,235,150,141,209,111,140,173,102,230,209,95, + 38,193,91,33,196,150,141,107,144,113,114,209,198,186,109,199,198,223,188,113,107,224,173,43,103,95,127,185,185,180,105,144,32,91,228,76,79,163,209,236, + 36,132,136,69,34,81,175,142,29,59,250,236,220,185,179,212,207,207,143,19,139,68,5,125,251,188,194,9,69,162,226,242,182,103,206,156,17,142,25,51, + 198,189,164,164,36,35,47,47,239,28,165,180,210,144,137,60,160,126,119,240,176,25,132,184,41,164,178,7,109,186,15,13,105,217,186,149,103,255,1,131, + 33,17,75,112,56,254,32,150,46,154,187,77,147,115,231,109,151,223,70,252,231,102,29,102,102,164,165,106,117,134,152,70,45,58,147,211,241,187,199,17, + 226,191,136,47,241,152,223,125,192,216,122,169,217,26,44,157,51,1,222,158,114,164,221,191,171,75,190,115,99,133,89,175,154,224,170,201,2,0,89,145, + 117,96,155,55,122,121,27,76,86,156,58,22,167,231,44,92,175,115,39,15,220,175,17,217,210,173,81,203,110,222,133,123,214,12,0,176,165,42,157,204, + 59,79,71,112,107,69,189,152,118,244,216,17,207,192,176,134,124,2,2,147,65,143,130,148,75,22,109,222,93,149,50,243,134,75,179,112,139,30,226,235, + 47,167,126,247,126,203,22,45,228,20,110,143,69,176,202,13,86,161,202,8,63,119,49,116,170,2,36,95,58,168,215,22,240,43,173,119,102,49,150,201, + 10,243,243,30,21,116,210,228,37,182,174,172,125,97,126,158,216,98,44,171,242,127,7,143,199,135,135,92,140,27,105,89,143,18,223,37,66,91,110,150, + 88,200,127,148,167,5,60,157,207,246,36,18,137,228,133,102,141,27,225,65,158,22,70,163,9,58,173,30,154,50,61,10,10,85,200,204,206,67,126,110, + 30,116,101,42,72,132,20,17,238,185,176,130,135,180,140,60,80,194,185,52,129,193,76,132,81,45,91,119,144,220,76,183,229,98,185,9,41,246,109,158, + 91,164,81,229,119,80,103,39,37,187,162,81,17,139,213,122,228,250,237,228,134,53,130,95,32,87,239,43,177,113,245,50,24,237,145,77,179,217,138,155, + 25,101,200,41,214,34,35,229,14,229,172,214,106,149,106,250,39,227,212,104,17,10,65,227,70,13,208,115,120,127,44,95,190,2,41,169,233,220,236,113, + 189,51,52,234,210,151,93,53,89,132,144,238,229,181,54,202,114,239,206,123,123,121,90,230,222,43,197,60,157,177,242,245,173,220,252,195,208,225,237,5, + 135,116,234,98,177,213,160,21,236,219,248,246,102,71,154,0,192,35,48,206,254,124,8,20,82,1,8,33,40,31,46,252,113,230,104,200,36,182,177,101, + 157,193,130,225,159,46,196,198,133,159,129,2,24,54,248,143,199,170,6,87,212,172,176,118,97,141,7,233,249,89,221,251,124,126,84,111,146,24,94,121, + 117,196,229,22,45,90,148,74,165,82,72,165,82,120,120,120,192,219,219,27,94,94,94,112,68,69,77,179,217,172,49,26,141,190,98,177,24,28,199,33, + 45,45,13,105,105,105,80,42,149,40,40,40,64,153,70,101,185,120,116,187,160,81,155,222,8,169,27,131,176,136,38,16,242,9,4,2,30,78,236,93, + 237,80,211,17,138,160,250,239,183,236,212,247,199,110,253,70,225,240,174,85,244,210,169,125,239,105,243,18,87,59,107,239,72,147,227,184,107,3,6,12, + 136,25,51,102,140,104,234,248,49,135,226,226,79,36,109,223,191,170,79,73,73,105,77,74,41,188,60,61,31,14,233,211,118,95,151,118,45,31,28,61, + 122,148,219,188,121,179,129,16,114,163,50,77,0,40,204,207,255,229,232,145,99,211,58,116,234,140,53,235,55,119,186,117,251,78,167,251,247,147,81,51, + 172,46,94,168,19,1,45,241,198,177,147,167,161,41,205,119,152,67,230,236,220,237,81,45,82,82,82,114,118,200,144,33,61,255,248,227,15,222,144,33, + 67,180,133,133,133,103,96,191,143,114,22,205,170,168,121,118,69,255,2,0,191,212,238,252,214,182,44,83,233,199,0,230,214,10,171,133,19,167,207,225, + 220,31,23,86,20,202,106,77,127,123,248,91,163,107,247,229,143,234,219,166,54,63,192,91,134,95,87,45,224,239,61,151,190,48,189,200,186,6,192,204, + 202,250,249,36,69,106,19,218,53,240,129,217,74,193,81,219,23,174,187,155,208,225,23,175,35,77,129,81,242,246,123,99,198,220,111,212,184,233,39,195, + 223,122,79,212,180,110,77,92,188,87,10,16,2,159,32,57,114,114,114,112,106,199,42,75,73,214,221,21,124,62,247,212,176,79,101,253,44,78,191,18, + 94,161,221,232,194,194,66,156,56,113,2,229,6,203,223,223,223,161,209,122,82,179,40,47,251,204,204,239,87,182,123,247,205,87,241,74,231,134,56,121, + 233,62,140,246,122,77,229,83,201,83,207,253,36,254,120,72,93,227,251,3,34,85,58,179,56,253,235,52,229,169,138,179,98,159,212,164,148,26,9,33, + 123,19,19,19,219,55,105,210,164,246,129,3,7,138,111,93,56,52,174,98,63,62,255,252,115,197,242,229,203,101,148,210,51,6,131,225,169,168,187,195, + 115,231,225,215,132,203,151,125,77,102,14,167,47,92,107,208,173,93,83,112,20,184,116,233,18,214,252,188,70,127,227,250,213,249,101,121,65,51,156,153, + 23,103,239,167,171,166,202,81,187,138,154,57,89,233,243,15,199,237,216,216,178,83,31,188,254,225,140,25,39,226,54,79,107,222,225,21,94,131,150,61, + 145,112,238,24,142,28,56,248,157,73,83,60,173,170,117,72,157,245,83,34,149,125,20,221,188,19,50,30,164,35,45,249,230,47,186,162,228,108,69,80, + 253,95,178,51,31,188,87,167,97,59,252,113,104,203,56,56,49,90,85,93,243,53,253,165,171,14,236,223,59,52,51,243,167,160,50,157,94,66,41,213, + 75,196,130,92,5,207,249,12,245,167,255,238,183,77,114,159,23,6,12,30,254,94,220,210,165,139,132,129,94,50,228,150,232,161,210,153,160,214,154,192, + 35,4,225,33,114,104,213,197,56,185,227,123,179,81,83,50,132,210,123,38,103,154,138,192,250,179,0,250,225,231,99,143,67,236,89,51,164,78,183,175, + 42,141,214,169,179,175,247,249,124,236,190,40,74,105,55,69,96,125,117,249,90,135,142,206,157,16,219,231,251,245,46,53,97,178,216,234,143,89,56,192, + 202,113,246,40,31,64,31,141,231,63,253,129,175,168,233,225,229,129,149,219,79,161,176,88,3,173,193,4,157,222,8,131,209,2,139,197,4,41,223,136, + 6,190,37,16,121,170,80,108,16,227,230,221,98,20,100,221,43,161,132,124,173,205,75,90,94,217,251,89,142,72,234,21,21,28,18,196,203,81,25,33, + 21,243,113,245,228,1,147,217,104,152,239,138,201,114,164,89,90,84,188,240,147,241,95,12,91,183,118,125,80,76,29,15,100,22,234,144,89,160,135,90, + 111,187,207,177,88,57,24,52,133,184,126,108,125,174,85,175,94,88,213,107,252,91,112,106,180,44,38,189,122,231,193,139,190,147,166,125,207,191,119,63, + 197,60,235,227,216,76,157,70,213,187,218,145,172,10,172,125,255,133,42,239,136,30,199,94,210,100,70,122,165,173,158,26,46,164,28,56,74,177,239,66, + 238,163,225,66,206,158,121,121,229,126,229,203,8,86,92,187,176,115,239,113,135,175,39,170,55,233,116,121,158,119,239,205,47,1,0,62,159,255,104,43, + 207,205,210,235,245,149,206,66,162,148,110,88,189,122,245,196,247,222,123,79,242,240,225,67,220,191,127,31,165,165,165,112,115,115,195,193,131,7,205,224, + 44,243,175,255,241,91,90,98,66,252,55,81,45,122,214,136,105,211,27,50,153,28,130,106,44,173,38,15,140,26,218,178,115,191,31,186,245,127,23,71, + 126,91,77,47,157,220,59,86,155,159,184,202,101,1,59,37,37,37,183,8,33,201,243,231,207,111,186,102,205,154,58,227,199,143,79,217,240,195,180,165, + 0,80,84,100,91,3,248,202,149,43,116,236,216,177,6,189,94,159,90,82,82,146,80,213,4,8,0,208,21,200,190,93,243,227,220,70,15,179,114,94, + 173,219,232,69,248,215,121,17,65,225,173,80,162,54,225,226,189,108,164,220,57,138,59,167,119,28,208,42,44,211,170,219,231,38,77,154,212,228,241,120, + 47,104,52,154,160,232,232,232,38,114,185,252,74,147,38,77,154,9,4,130,204,203,151,47,87,126,241,60,65,250,137,117,134,218,157,223,90,242,64,237, + 222,37,37,87,219,236,129,218,253,138,86,226,249,89,254,209,197,134,192,158,243,23,82,107,201,173,237,235,75,118,254,186,106,1,127,248,232,207,173,55, + 149,222,31,11,164,226,195,115,70,198,184,252,26,132,240,114,222,31,209,239,207,242,14,246,72,150,253,177,75,97,250,210,210,107,74,0,19,165,33,13, + 127,184,249,241,152,153,141,91,182,123,163,227,203,67,120,22,145,2,135,126,251,137,166,94,63,182,93,64,173,147,181,46,172,6,80,21,70,163,177,74, + 147,229,8,229,67,121,231,237,155,127,30,185,243,183,93,115,250,247,237,231,251,227,215,175,225,251,149,187,33,151,74,64,57,14,67,186,214,26,116,103, + 243,75,125,106,6,186,133,238,60,158,121,234,195,69,55,39,106,181,166,164,170,34,49,118,227,124,218,221,221,189,160,125,251,246,173,37,18,9,41,44, + 44,20,4,4,4,88,60,61,61,141,57,57,57,90,131,193,176,147,82,234,114,148,17,0,76,102,14,105,121,122,236,217,181,19,215,46,28,197,157,59, + 137,234,59,183,239,44,35,2,186,72,147,155,84,92,181,194,211,112,14,103,29,58,62,86,25,86,131,250,215,13,43,102,117,213,234,13,35,155,180,141, + 69,237,6,237,120,38,179,21,55,46,29,199,241,29,139,190,55,170,139,38,61,75,255,202,9,169,81,39,130,242,197,56,123,34,14,148,227,86,0,0, + 229,184,21,87,254,56,240,94,171,222,163,224,19,80,187,9,33,132,184,154,239,85,17,145,128,87,246,251,206,117,191,165,165,165,225,238,221,187,184,119, + 239,30,138,139,139,241,235,175,105,213,250,251,148,21,167,29,86,248,214,125,105,224,107,175,239,27,52,244,77,183,58,17,49,188,168,26,222,240,85,8, + 144,120,47,29,73,151,175,115,137,23,15,232,77,170,252,254,218,226,52,167,198,79,238,31,29,72,120,116,82,249,218,133,109,218,180,139,250,98,246,156, + 214,190,254,1,14,191,199,139,10,242,197,19,62,220,27,117,238,252,89,151,214,58,228,172,214,162,209,35,135,112,124,219,66,161,120,20,167,38,0,104, + 121,20,203,118,156,114,150,74,35,248,102,179,5,141,130,76,208,202,141,32,60,1,252,253,195,144,158,241,16,233,153,42,164,103,23,225,218,221,68,100, + 100,164,154,168,133,187,67,249,88,81,213,141,245,83,240,4,117,124,125,124,144,90,172,129,155,88,128,244,164,203,134,50,149,114,83,181,52,42,160,45, + 76,202,145,7,70,245,28,50,100,232,193,174,47,245,245,108,217,182,187,204,207,195,11,34,1,69,114,90,54,18,206,28,44,75,185,118,74,101,54,106, + 122,253,39,86,125,249,167,224,212,104,153,12,101,125,134,245,235,180,139,207,23,136,57,206,98,48,25,13,3,255,138,201,122,94,80,106,205,28,57,204, + 150,220,94,126,111,96,225,168,116,216,224,67,186,138,247,10,102,43,149,13,27,124,70,11,0,148,115,158,216,23,28,236,19,91,190,118,225,131,7,69, + 151,138,139,13,199,159,181,24,105,57,121,121,121,51,103,207,158,253,138,86,171,173,223,185,115,103,137,135,135,7,138,138,138,16,31,31,111,222,191,127, + 255,237,252,252,252,111,40,205,179,16,210,252,151,235,250,223,70,36,94,142,255,166,126,139,151,106,196,180,237,237,242,107,136,36,210,119,187,246,125,135, + 28,217,189,154,94,60,177,251,125,109,126,210,202,103,237,175,221,56,93,32,132,220,156,60,121,114,203,192,192,192,192,111,190,249,198,77,165,82,9,127, + 252,241,71,125,97,97,97,174,74,165,58,71,169,243,196,229,167,53,19,204,0,6,40,2,35,187,208,157,171,123,120,249,133,246,244,244,175,81,175,180, + 32,43,85,89,144,29,15,224,136,189,80,100,181,104,214,172,89,93,30,143,55,4,64,35,185,92,30,174,80,40,36,148,210,250,132,144,91,28,199,93, + 143,142,142,222,15,160,90,127,191,244,19,235,12,29,223,255,121,115,177,150,19,25,121,162,205,233,39,214,25,0,32,47,126,188,22,192,158,192,46,147, + 6,236,61,151,190,244,86,137,231,184,252,227,223,186,188,246,93,57,165,15,175,134,87,221,202,53,116,217,183,50,1,140,148,7,70,45,184,113,229,220, + 84,66,33,180,194,50,75,155,151,124,249,63,161,47,20,10,245,161,161,161,14,103,23,74,36,146,74,243,87,40,61,97,1,176,134,144,206,235,119,109, + 91,63,114,247,222,61,115,58,118,235,239,235,86,163,6,94,8,32,88,63,169,249,184,163,87,10,46,246,253,226,212,242,148,108,253,117,74,105,181,242, + 97,212,106,117,18,33,164,68,163,209,244,163,148,62,36,132,212,44,41,41,185,106,54,155,111,84,219,16,112,120,189,77,155,23,127,37,132,8,168,133, + 155,119,78,200,223,172,207,185,147,249,44,198,162,34,49,47,120,224,211,111,150,52,175,23,30,217,188,124,173,195,134,181,221,49,102,226,130,230,181,235, + 68,52,255,115,253,195,202,211,4,236,145,219,183,119,253,60,239,212,149,243,199,191,242,11,174,93,59,55,51,229,206,195,123,87,103,90,116,202,103,90, + 152,185,34,105,247,110,45,90,51,127,226,248,156,172,212,53,101,249,73,55,1,160,44,63,233,166,44,48,242,235,194,220,204,241,69,249,41,243,159,245, + 189,40,43,43,203,222,180,105,147,87,187,118,237,120,129,129,129,40,40,40,192,241,227,199,57,142,227,170,92,0,250,73,52,69,41,199,9,169,231,243, + 203,202,31,230,137,228,238,189,45,22,75,8,165,128,64,32,200,49,106,85,7,213,60,249,23,180,56,173,138,235,146,35,0,120,229,107,23,114,28,71, + 230,45,93,159,46,116,115,119,184,62,162,89,175,150,113,28,231,242,90,135,37,15,46,215,171,238,121,57,213,42,42,220,241,230,216,73,175,2,212,10, + 10,43,33,196,66,41,44,32,84,3,142,156,230,19,44,215,84,99,57,164,39,33,4,30,148,8,224,46,21,128,128,64,163,44,166,213,201,201,114,68, + 89,94,226,45,66,58,135,253,110,220,54,226,216,225,3,131,173,86,235,11,246,43,39,205,160,43,219,174,201,241,254,133,210,75,127,109,218,250,63,12, + 242,23,191,71,42,23,119,113,24,229,239,164,89,191,174,172,95,141,208,192,17,105,233,249,23,83,30,106,127,161,21,150,213,249,43,253,180,151,120,248, + 154,16,242,134,88,44,86,24,141,198,50,74,233,134,188,188,188,153,244,169,21,206,155,11,165,1,186,17,98,55,217,20,147,190,236,108,89,94,226,235, + 142,52,43,34,15,136,234,233,38,151,79,212,235,202,54,148,229,38,174,127,214,126,58,105,227,41,145,72,154,41,20,10,97,97,97,225,5,74,169,242, + 175,106,86,151,202,52,155,54,109,90,139,199,227,189,192,113,92,32,0,79,0,5,0,10,5,2,65,214,229,203,151,211,93,25,58,124,146,14,111,239, + 240,235,214,163,225,167,241,167,18,23,219,135,21,31,81,99,240,34,183,55,122,119,249,252,151,93,123,158,154,117,248,79,188,230,255,91,154,132,116,22, + 40,130,11,71,242,196,158,179,186,69,233,181,133,217,89,99,79,223,40,184,64,41,117,58,235,195,149,126,138,197,226,225,38,147,73,42,18,137,116,70, + 163,177,202,187,241,255,214,185,203,2,235,191,195,3,117,121,101,10,14,228,114,197,73,43,255,158,191,59,225,199,196,196,116,16,137,68,181,172,86,171, + 204,104,52,106,117,58,93,90,122,122,250,217,39,191,251,254,91,253,84,4,70,46,18,137,36,31,3,128,201,100,88,162,201,75,250,180,178,231,58,107, + 255,79,255,27,249,215,105,153,44,224,11,253,97,47,204,205,89,44,5,185,41,23,93,170,193,245,60,250,89,201,107,141,166,148,86,123,132,230,111,3, + 181,47,187,240,60,54,0,221,153,38,211,100,154,76,211,65,91,222,63,161,159,76,243,223,171,233,22,220,160,166,91,112,131,154,174,62,223,81,251,127, + 234,185,255,93,53,43,121,173,209,255,173,215,122,30,155,203,43,135,51,24,12,198,127,10,90,141,25,113,12,198,243,64,151,125,219,229,58,128,207,210, + 158,193,40,135,0,232,238,232,23,180,26,33,65,66,136,67,141,202,168,74,159,105,50,77,166,201,52,153,38,211,100,154,255,62,205,39,180,95,118,240, + 171,68,7,154,108,232,240,191,21,90,100,154,76,147,105,50,77,166,201,52,153,230,191,79,243,223,186,85,190,118,12,131,193,96,48,24,12,6,227,153, + 97,70,139,193,96,48,24,12,6,227,57,193,140,22,131,193,96,48,24,12,198,115,130,25,45,6,131,193,96,48,24,140,231,4,51,90,12,6,131,193, + 96,48,24,207,9,66,41,69,92,92,28,141,141,141,37,0,30,123,204,96,48,24,12,6,131,241,223,224,223,234,69,30,69,180,226,226,226,158,223,90, + 60,12,6,131,193,96,48,24,85,240,111,244,34,143,140,86,108,108,44,249,55,158,32,131,193,96,48,24,140,127,6,255,70,47,242,88,142,214,191,37, + 76,199,96,48,24,12,6,227,159,201,191,205,139,176,100,120,6,131,193,96,48,24,140,231,4,177,151,210,103,48,24,12,6,131,193,96,252,135,97,17, + 45,6,131,193,96,48,24,140,231,4,51,90,12,6,131,193,96,48,24,207,137,231,106,180,8,33,221,153,38,211,100,154,76,147,105,50,77,166,201,52, + 255,151,32,132,140,46,127,204,34,90,12,6,131,193,96,48,24,14,32,132,72,8,33,146,138,251,174,60,143,82,186,170,252,177,224,121,116,140,193,96, + 48,24,12,6,227,159,10,33,68,66,41,53,0,208,3,48,18,66,60,43,236,59,44,63,81,49,138,197,140,22,131,193,96,48,24,12,134,115,148,0, + 36,0,64,41,149,16,66,12,132,16,79,103,141,9,33,163,43,154,171,138,251,204,104,49,24,12,6,131,193,96,84,128,82,90,62,68,104,44,223,39, + 132,24,202,247,171,3,51,90,12,6,131,193,96,48,24,14,176,27,172,114,211,85,62,124,232,168,221,42,103,67,135,4,128,195,153,3,148,210,35,174, + 118,228,89,102,31,84,165,207,52,153,38,211,100,154,76,147,105,50,205,127,159,102,85,218,213,241,31,207,27,187,201,82,86,56,228,212,108,57,133,82, + 250,220,54,0,221,153,38,211,100,154,76,147,105,50,77,166,201,52,255,137,155,205,38,57,223,175,112,124,180,51,13,86,222,129,193,96,48,24,12,6, + 195,49,198,242,18,15,246,232,86,165,57,90,21,135,15,203,97,57,90,12,6,131,193,96,48,24,14,160,127,38,193,63,218,119,214,182,220,100,149,255, + 164,108,214,33,131,193,96,48,24,12,134,115,8,33,60,216,243,178,202,163,90,212,65,142,22,173,144,252,254,36,204,104,49,24,12,6,131,193,96,56, + 166,27,128,125,132,144,126,0,246,216,143,61,21,213,114,52,100,200,34,90,12,6,131,193,96,48,24,149,19,15,192,13,182,138,240,110,206,26,149,155, + 170,39,11,151,2,0,177,103,203,35,46,46,142,198,198,198,58,44,43,207,96,48,24,12,6,131,241,188,249,187,121,145,138,249,89,229,56,203,211,114, + 100,178,0,251,162,210,229,39,22,23,23,71,255,243,221,100,48,24,12,6,131,193,168,156,191,169,23,145,194,150,163,37,1,224,9,64,238,168,81,197, + 68,248,242,173,252,119,108,232,144,193,96,48,24,12,6,195,49,79,230,104,205,7,48,229,201,70,44,25,158,193,96,48,24,12,6,163,250,60,153,163, + 165,135,3,163,85,89,50,60,203,209,98,48,24,12,6,131,241,183,224,239,230,69,170,147,163,229,84,163,220,104,49,24,12,6,131,193,96,48,254,164, + 194,130,210,143,112,84,71,171,50,216,208,33,131,193,96,48,24,12,134,99,148,0,196,120,124,233,157,106,69,180,216,90,135,12,6,131,193,96,48,24, + 14,176,15,19,26,97,159,121,88,89,105,7,103,26,207,213,104,17,66,186,51,77,166,201,52,153,38,211,100,154,76,147,105,254,131,241,132,45,178,85, + 41,21,75,59,176,242,14,12,6,131,193,96,48,24,85,96,207,209,210,3,112,43,207,215,114,150,163,229,172,196,3,51,90,12,6,131,193,96,48,24, + 142,81,194,54,116,88,49,162,229,40,65,158,213,209,98,48,24,12,6,131,193,168,14,148,82,137,163,153,135,79,194,22,149,102,48,24,12,6,131,193, + 168,38,132,144,151,96,171,8,95,113,230,161,211,136,150,163,245,14,153,209,98,48,24,12,6,131,193,112,204,65,252,89,17,222,211,89,163,138,17,173, + 242,199,143,204,23,0,135,51,7,40,165,71,92,237,197,179,204,62,168,74,159,105,50,77,166,201,52,153,38,211,100,154,255,62,205,170,180,171,227,63, + 158,55,132,144,86,0,78,86,60,86,221,202,240,160,148,62,183,13,64,119,166,201,52,153,38,211,100,154,76,147,105,62,187,0,203,0,0,32,0,73, + 68,65,84,50,205,127,243,6,96,180,253,103,48,128,209,229,251,148,82,86,176,148,193,96,48,24,12,6,227,63,1,165,52,135,254,39,115,180,8,33, + 97,94,94,94,191,186,185,185,81,189,94,79,74,75,75,95,167,148,62,120,6,157,104,0,115,0,20,1,152,74,41,125,248,23,251,213,14,192,135,246, + 221,31,40,165,103,254,138,30,131,193,96,48,24,140,255,61,158,156,113,72,157,175,115,24,247,196,204,195,184,242,7,207,28,209,34,132,132,249,250,250, + 238,57,126,252,120,86,118,118,118,221,19,39,78,228,250,250,250,238,33,132,132,85,83,167,233,160,65,131,46,152,205,230,216,146,146,146,145,66,161,112, + 206,51,244,165,29,33,228,160,221,96,193,221,221,253,43,74,233,107,28,199,189,166,80,40,190,114,212,134,193,96,48,24,12,6,163,10,148,21,55,251, + 44,196,167,40,143,100,85,216,114,202,127,247,76,70,139,16,18,230,237,237,189,39,62,62,62,185,113,227,198,189,1,100,198,196,196,180,61,120,240,224, + 21,47,47,175,95,171,161,211,116,208,160,65,167,127,249,229,23,217,165,75,151,176,115,231,78,152,205,102,93,53,251,210,238,195,15,63,60,106,54,155, + 95,26,48,96,192,17,66,200,152,14,29,58,52,3,0,141,70,3,127,127,255,24,66,200,152,55,223,124,243,72,113,113,113,207,224,224,224,120,102,182, + 24,12,6,131,193,96,84,5,181,175,111,72,109,9,240,158,176,205,66,124,138,39,151,223,249,75,75,240,16,66,194,60,61,61,247,236,221,187,55,185, + 73,147,38,189,41,165,23,8,33,87,1,104,155,55,111,94,211,205,205,141,186,168,243,200,100,93,187,118,13,169,169,169,152,53,107,150,26,192,162,106, + 118,105,242,194,133,11,197,2,129,0,155,54,109,18,44,91,182,236,167,128,128,0,24,12,6,232,245,122,236,223,191,223,239,228,201,147,43,70,141,26, + 69,82,82,82,48,117,234,84,193,152,49,99,38,3,232,85,221,115,103,48,24,12,6,131,241,63,139,18,64,107,71,191,120,50,47,171,34,132,82,138, + 184,184,184,114,115,212,57,54,54,246,164,211,198,182,156,172,61,91,182,108,73,238,209,163,71,31,163,209,120,214,106,181,94,149,201,100,90,0,1,55, + 110,220,240,234,220,185,115,205,146,146,146,182,149,245,212,145,201,154,50,101,138,250,225,195,135,157,41,165,87,171,62,215,199,180,218,13,26,52,232,200, + 134,13,27,4,34,145,72,80,92,92,140,51,103,206,32,51,51,19,86,171,21,254,254,254,168,87,175,30,132,66,33,138,138,138,44,239,191,255,190,41, + 37,37,165,39,203,219,98,48,24,12,6,227,239,131,171,94,228,191,9,33,68,82,49,47,235,201,253,10,199,131,1,196,194,150,155,21,11,252,105,190, + 30,13,29,198,198,198,18,0,39,42,121,177,48,111,111,239,189,59,119,238,204,238,214,173,91,239,251,99,134,74,116,58,157,74,163,209,104,13,6,67, + 141,91,183,110,5,119,239,222,189,126,105,105,233,235,149,104,180,35,132,236,5,112,126,241,226,197,78,77,150,189,221,6,251,86,233,48,31,165,244,204, + 142,29,59,62,185,123,247,46,191,168,168,8,219,183,111,231,46,94,188,104,252,249,231,159,13,191,254,250,171,225,225,195,135,230,228,228,100,170,209,104, + 112,248,240,97,126,74,74,202,103,204,100,49,24,12,6,131,241,247,163,42,47,242,255,128,30,120,44,41,94,239,164,93,172,221,88,197,150,231,105,149, + 255,226,145,209,178,59,201,206,21,159,69,8,169,225,238,238,190,210,203,203,235,84,205,154,53,227,14,30,60,168,236,208,166,117,167,228,177,175,203,238, + 159,59,131,237,225,65,175,202,229,242,246,119,239,222,13,237,210,165,75,237,194,194,194,126,206,102,29,18,66,218,125,244,209,71,167,84,42,85,31,149, + 74,37,90,179,102,13,142,28,57,226,208,100,217,219,189,161,82,169,222,24,58,116,232,41,103,102,139,16,210,206,195,195,227,247,151,95,126,121,70,76, + 76,12,57,125,250,52,30,62,124,104,254,238,187,239,214,223,188,121,51,248,202,149,43,193,95,125,245,213,90,30,143,199,185,187,187,163,105,211,166,150, + 26,53,106,124,227,238,238,206,146,226,25,12,6,131,193,248,155,225,200,139,252,127,99,55,89,250,170,214,60,44,207,203,122,50,71,235,209,208,161,221, + 69,62,66,42,149,14,140,137,137,153,186,97,195,6,190,159,159,31,213,235,245,5,62,238,138,134,247,62,121,199,39,229,220,89,100,229,21,160,119,66, + 242,175,69,69,69,161,47,189,244,146,87,73,73,73,63,74,105,122,37,29,216,160,82,169,222,88,178,100,9,114,115,115,209,191,127,127,244,232,209,195, + 4,160,117,197,225,194,138,237,242,243,243,209,167,79,31,244,236,217,115,35,165,244,77,7,154,91,57,142,123,141,16,2,173,86,139,85,171,86,97,221, + 186,117,134,91,183,110,5,83,74,75,237,109,188,58,119,238,156,187,115,231,78,241,177,99,199,224,231,231,7,131,193,128,94,189,122,109,163,148,14,113, + 245,141,102,48,24,12,6,131,241,252,112,228,69,254,191,33,132,60,53,76,72,171,89,25,222,97,50,60,33,164,70,179,102,205,190,57,113,226,68,80, + 217,229,115,197,234,143,134,186,115,197,5,94,183,35,154,120,167,93,189,130,204,188,2,116,61,122,97,91,94,94,222,11,177,177,177,178,146,146,146,254, + 149,153,172,114,56,142,67,110,110,46,242,242,242,160,84,42,1,32,254,201,156,44,190,208,45,10,0,242,243,243,145,147,147,3,149,74,85,165,102,97, + 97,33,140,70,35,56,142,131,72,36,114,216,78,34,145,64,173,86,163,184,184,24,122,189,179,200,31,131,193,96,48,24,12,198,35,60,129,63,235,103, + 57,139,106,85,136,96,197,85,44,237,0,216,141,214,147,14,82,161,80,76,89,189,122,181,81,123,229,124,177,220,98,12,231,213,12,195,195,228,68,220, + 204,56,132,66,43,225,186,199,159,221,106,176,88,234,245,238,221,91,82,90,90,218,159,82,154,230,66,103,87,141,30,61,122,248,59,239,188,67,212,106, + 53,22,44,152,143,58,66,60,168,216,64,30,88,255,147,150,239,200,154,143,25,59,26,111,141,120,27,42,149,10,11,22,44,176,2,112,150,205,255,131, + 151,151,151,187,175,175,111,204,174,93,187,252,252,252,252,132,3,7,14,228,95,185,114,101,14,33,228,75,123,155,57,227,199,143,231,219,77,155,121,238, + 220,185,133,106,181,250,6,128,31,92,232,51,131,193,96,48,24,140,255,2,127,183,104,150,29,61,0,35,33,196,211,110,182,244,176,173,19,253,24,229, + 57,89,246,97,195,199,143,217,215,230,121,12,47,47,175,83,201,201,201,18,227,200,216,154,210,224,144,192,252,11,231,240,176,84,141,44,35,135,2,185, + 103,238,251,215,147,11,163,162,162,120,121,121,121,253,40,165,169,174,246,150,16,210,78,70,176,40,38,80,218,124,114,167,80,20,20,233,176,230,143,172, + 145,103,244,244,23,121,80,212,136,142,159,168,215,55,25,170,197,241,57,66,92,250,89,155,96,53,235,19,1,172,170,42,121,157,16,50,102,233,210,165, + 43,26,53,106,68,138,139,139,169,209,104,180,174,90,181,202,10,0,95,124,241,5,191,115,231,206,130,173,91,183,34,62,62,158,110,219,182,109,44,165, + 116,165,171,125,102,48,24,12,6,131,241,191,9,33,132,82,74,137,125,8,209,19,128,158,82,250,148,209,170,44,162,229,176,96,41,165,20,70,163,177, + 148,211,168,105,193,241,195,200,86,170,81,200,19,162,238,199,19,81,38,145,67,36,18,249,232,245,250,146,234,152,44,187,238,153,50,142,182,32,74,221, + 167,165,37,70,244,137,241,71,131,96,249,4,0,8,110,104,158,208,100,168,22,55,118,202,112,115,183,223,167,22,147,174,5,165,244,77,23,76,86,187, + 225,195,135,47,30,51,102,12,17,8,4,144,203,229,36,58,58,90,176,127,255,126,113,92,92,156,184,110,221,186,130,205,155,55,163,160,160,0,17,17, + 17,214,218,181,107,47,100,137,240,12,6,131,193,96,48,92,192,8,60,202,203,82,150,239,63,137,163,138,240,229,56,52,90,28,199,37,157,57,115,70, + 175,238,18,123,59,215,204,33,207,196,161,198,187,227,16,247,227,143,104,61,126,98,246,197,139,23,77,28,199,37,85,213,59,66,72,119,135,191,208,227, + 231,164,98,163,158,184,185,131,199,231,139,1,128,39,164,98,0,200,185,38,212,187,89,185,159,171,161,57,121,209,162,69,226,155,55,111,162,176,176,208, + 18,23,23,71,19,18,18,204,123,246,236,193,134,13,27,176,123,247,110,115,124,124,60,45,43,43,179,4,6,6,10,6,15,30,44,4,48,217,165,126, + 254,5,152,38,211,100,154,76,147,105,50,77,166,249,143,71,90,33,47,203,211,190,61,5,33,36,216,62,108,24,252,228,239,28,38,195,107,52,154,89, + 19,38,76,216,251,235,134,245,231,77,101,6,174,244,96,92,163,251,91,182,160,253,55,51,30,118,29,54,188,118,100,100,100,129,70,163,153,85,157,158, + 206,232,20,241,134,222,96,238,75,57,107,171,158,109,107,123,15,234,16,229,86,98,177,32,49,75,181,15,0,114,110,136,246,149,229,137,63,109,55,218, + 234,118,81,104,205,107,58,40,178,132,71,8,120,60,254,25,158,144,191,243,194,198,27,187,156,72,207,110,216,176,97,135,241,227,199,11,126,252,241,71, + 75,122,122,250,103,53,106,212,152,186,102,205,154,160,162,162,34,204,159,63,191,176,168,168,104,70,88,88,216,194,193,131,7,211,85,171,86,153,1,204, + 174,78,223,25,12,6,131,193,96,252,79,210,13,192,62,66,72,63,0,123,236,199,28,37,196,199,82,74,87,217,135,16,31,203,43,119,104,180,40,165, + 153,82,169,244,219,129,175,13,253,114,242,228,201,169,125,127,63,121,77,38,147,249,95,188,120,81,18,25,25,89,80,84,84,52,157,82,154,89,157,158, + 126,62,118,136,128,154,141,124,88,205,65,212,98,230,149,20,149,96,213,238,51,106,43,176,24,0,44,148,191,248,236,18,239,183,95,30,47,244,24,50, + 91,44,21,64,36,21,16,137,73,192,19,9,44,58,190,208,153,46,165,244,12,33,164,231,248,241,227,39,3,152,77,41,61,227,238,238,222,79,167,211, + 5,233,116,58,104,52,154,27,148,210,149,132,144,59,243,230,205,123,212,166,58,125,103,48,24,12,6,131,241,63,73,60,0,55,216,146,224,221,42,107, + 88,177,142,22,240,103,50,188,211,181,14,117,58,221,78,66,200,197,175,191,254,122,202,55,223,124,19,8,91,2,216,85,141,70,51,171,186,38,11,0, + 126,92,119,224,129,206,96,184,199,81,122,197,96,52,72,18,110,63,136,163,28,183,252,15,29,205,2,0,93,246,237,135,210,208,152,232,251,127,88,222, + 175,219,202,210,91,44,178,138,248,124,83,41,143,199,187,39,16,11,50,222,251,201,185,182,221,56,61,90,187,80,163,209,204,238,223,191,127,121,93,136, + 31,28,181,97,48,24,12,6,131,193,168,2,35,254,204,205,82,218,143,61,21,209,170,108,173,195,74,23,149,182,27,170,49,127,161,131,143,152,112,40, + 225,4,170,40,171,175,203,186,145,5,224,43,251,246,204,216,77,21,139,90,49,24,12,6,131,193,248,43,72,1,84,44,208,105,114,214,176,98,53,120, + 135,75,240,48,24,12,6,131,193,96,48,30,163,27,108,145,172,242,173,155,163,70,132,144,209,21,102,30,174,170,104,186,8,0,135,51,7,40,165,71, + 92,237,197,179,204,62,168,74,159,105,50,77,166,201,52,153,38,211,100,154,255,62,205,170,180,171,227,63,158,55,132,16,138,199,115,179,156,214,209,170, + 24,197,122,108,159,82,250,220,54,0,221,153,38,211,100,154,76,147,105,50,77,166,201,52,255,137,27,0,195,147,91,37,109,71,151,111,21,143,87,154, + 163,197,96,48,24,12,6,131,241,63,140,195,186,89,142,160,78,18,226,93,206,209,34,132,248,11,133,194,175,100,50,217,114,153,76,182,82,40,20,206, + 39,132,120,187,250,252,114,20,10,197,184,224,224,224,187,193,193,193,153,97,97,97,7,60,60,228,159,212,115,35,29,9,33,78,75,56,84,163,143,60, + 66,72,20,33,228,19,153,76,118,71,42,149,166,19,66,54,18,66,62,33,132,248,253,21,237,89,161,100,224,173,79,250,239,158,21,74,6,62,241,154, + 177,65,65,65,167,9,33,61,255,90,239,255,100,152,156,116,31,172,32,25,131,21,36,99,152,252,217,139,194,121,120,120,188,17,18,18,114,206,207,207, + 47,43,36,36,228,140,84,42,29,84,157,231,19,66,2,130,130,130,190,175,85,171,86,82,104,104,232,98,71,133,216,254,78,116,116,35,29,218,184,145, + 130,182,18,162,110,47,33,203,219,74,72,143,158,132,200,158,69,139,16,210,158,16,178,195,211,211,243,170,80,40,220,79,8,25,96,191,190,6,8,133, + 194,253,158,158,158,87,9,33,59,8,33,237,159,65,155,71,8,249,158,16,146,69,8,249,214,190,255,81,173,90,181,212,77,154,52,73,111,210,164,201, + 186,136,136,136,55,93,213,147,203,229,61,106,213,170,181,51,44,44,44,189,109,219,182,197,53,106,212,72,172,89,179,230,122,55,55,183,206,174,245,103, + 48,63,32,172,241,171,126,181,155,44,10,9,111,57,195,195,191,110,221,234,158,19,131,193,96,252,75,41,207,205,210,87,120,252,20,21,115,178,158,218, + 119,33,108,214,7,192,28,0,203,174,95,191,158,64,41,77,160,148,38,92,191,126,61,1,192,114,0,115,225,36,132,248,228,113,95,95,223,233,179,102, + 205,210,231,228,228,208,130,130,2,154,148,148,68,23,77,153,200,189,228,35,160,117,253,189,181,193,193,193,247,195,106,212,216,210,80,193,155,8,160,94, + 117,194,149,0,188,165,82,233,133,41,83,166,104,78,159,62,173,49,26,141,26,142,227,52,217,217,217,154,35,71,142,104,218,181,107,167,1,240,41,0, + 254,179,132,64,103,132,224,36,253,249,107,58,35,4,39,43,30,175,95,191,254,109,142,227,232,192,129,3,13,0,66,255,74,88,53,20,112,107,232,1, + 175,65,10,228,89,214,207,164,244,199,241,116,144,28,25,207,162,25,16,16,176,103,220,184,113,170,172,172,44,106,48,24,104,70,70,6,29,51,102,140, + 50,32,32,96,147,139,239,167,111,76,76,76,222,185,115,231,184,210,210,82,122,226,196,9,174,81,163,70,121,0,130,93,184,102,186,63,209,151,85,33, + 33,33,7,170,179,5,4,4,172,169,238,223,168,149,4,25,166,132,227,148,94,138,167,123,7,182,161,139,90,212,160,3,124,196,165,237,197,248,168,19, + 32,168,198,181,52,184,83,167,78,101,55,110,220,176,22,21,21,209,219,183,111,115,239,190,251,174,30,192,173,119,223,125,87,127,251,246,109,174,168,168, + 136,222,184,113,195,218,169,83,167,50,0,163,92,237,39,108,55,55,107,167,77,155,70,41,165,116,214,172,89,180,113,227,198,180,107,215,174,84,163,209, + 80,74,105,58,165,116,157,197,98,25,233,138,166,167,167,231,27,227,198,141,211,104,181,90,90,14,199,113,180,180,180,148,46,91,182,172,44,40,40,232, + 0,0,191,202,206,221,205,63,178,77,171,46,253,150,93,191,115,111,229,79,95,77,88,233,30,24,177,194,59,40,114,137,119,80,228,0,63,191,6,114, + 87,175,185,103,185,230,153,38,211,100,154,76,243,239,190,193,86,206,193,233,144,161,189,205,104,103,251,149,14,29,18,66,134,77,156,56,241,179,161,67, + 135,162,113,227,198,5,31,125,244,145,181,78,157,58,124,0,72,77,77,213,0,120,225,242,229,203,190,59,118,236,232,70,8,241,163,148,110,174,68,203, + 187,109,219,182,227,222,121,231,29,73,167,78,157,96,50,153,112,238,220,57,124,50,115,46,105,123,239,24,212,119,18,164,225,203,127,175,155,88,172,173, + 187,243,195,161,67,188,20,238,179,66,130,131,85,102,139,101,101,97,97,225,20,106,239,185,19,237,87,27,52,104,176,126,235,214,173,68,36,18,97,235, + 214,173,152,62,125,58,138,138,138,80,183,110,93,116,236,216,17,199,143,31,199,134,13,27,102,124,254,249,231,111,19,66,26,83,74,173,149,157,187,171, + 220,187,119,239,216,205,155,55,27,204,153,51,71,188,115,231,206,143,1,124,225,164,143,158,94,94,94,173,9,33,145,148,210,164,210,210,210,243,148,82, + 101,36,33,10,169,39,188,219,213,174,43,91,49,172,187,249,65,161,202,227,244,197,4,49,45,83,1,39,119,60,83,159,188,188,188,222,24,57,114,100, + 151,185,115,231,42,172,86,43,204,102,51,124,125,125,241,253,247,223,123,104,52,154,87,164,82,233,171,58,157,238,183,202,52,252,252,252,62,94,186,116, + 169,111,237,218,181,201,205,155,55,161,211,233,200,152,49,99,252,103,204,152,49,30,192,103,213,233,15,143,199,11,91,187,118,173,183,175,175,47,204,102, + 51,154,53,107,86,126,33,34,62,62,30,38,147,9,102,179,25,253,251,247,7,96,51,255,13,26,52,168,246,140,88,10,16,170,211,0,9,135,209,177, + 69,12,58,212,244,194,176,166,101,158,187,174,165,45,221,118,59,179,59,33,164,111,101,215,81,57,66,161,240,253,117,235,214,73,87,173,90,101,222,191, + 127,191,190,101,203,150,226,229,203,151,75,86,173,90,21,109,52,26,241,254,251,239,27,46,93,186,100,124,229,149,87,220,214,174,93,43,13,15,15,127, + 13,192,26,23,187,249,237,180,105,211,222,154,58,117,42,78,157,58,133,201,147,39,99,242,100,219,138,80,101,101,101,232,214,173,27,138,139,139,161,86, + 171,205,169,169,149,47,37,234,238,238,222,239,131,15,62,88,62,103,206,28,121,197,227,132,16,200,229,114,140,24,49,66,214,187,119,239,94,93,187,118, + 189,78,8,137,161,148,22,57,210,241,244,80,180,24,249,250,107,162,64,93,9,26,27,243,113,107,235,15,60,121,157,72,201,207,75,150,118,95,176,121, + 127,48,128,101,46,158,27,131,193,96,252,171,176,47,191,163,7,224,86,190,20,15,165,212,224,160,105,220,19,81,173,184,71,143,42,115,171,19,38,76, + 72,160,148,38,76,158,60,57,1,182,200,150,8,128,194,190,9,0,12,157,52,105,82,2,165,52,97,226,196,137,9,0,250,56,115,188,0,250,108,223, + 190,221,180,120,241,98,26,24,24,72,131,130,130,232,146,37,75,40,199,113,52,119,255,38,122,180,1,232,157,175,70,80,74,41,77,154,253,33,61,218, + 0,52,101,197,12,58,124,248,112,173,76,38,27,230,204,69,3,240,105,222,188,185,90,167,211,105,214,175,95,175,145,201,100,151,0,68,3,16,194,54, + 171,82,1,224,205,232,232,104,213,205,155,55,53,155,55,111,214,0,152,238,138,51,7,80,15,64,23,185,92,62,96,82,168,48,153,254,252,53,157,20, + 136,27,0,26,1,240,183,183,9,153,56,113,34,165,148,210,154,53,107,158,114,114,238,158,49,49,49,19,147,147,147,167,154,205,230,169,87,174,92,153, + 26,25,25,249,101,223,58,193,109,118,15,235,209,76,57,99,108,51,186,224,179,152,249,47,191,216,125,203,144,206,195,222,122,193,239,244,219,1,110,218, + 215,60,249,234,161,178,199,116,92,186,131,8,13,13,189,144,145,145,65,181,90,45,85,171,213,84,173,86,211,172,172,44,154,154,154,74,79,159,62,77, + 131,131,131,143,86,165,25,20,20,116,59,35,35,131,174,88,180,136,14,108,84,159,118,244,114,167,157,188,221,105,11,133,91,89,3,160,69,21,206,190, + 251,19,90,135,175,94,189,154,0,32,1,64,66,81,81,81,66,81,81,81,66,73,73,201,163,99,0,18,148,74,101,130,82,169,76,48,26,141,9,117, + 235,214,61,232,202,223,168,226,214,206,13,237,90,185,161,184,141,4,186,62,161,126,217,99,235,248,89,207,15,107,67,75,62,232,74,23,55,11,165,237, + 197,248,200,197,191,123,31,177,88,124,2,192,120,0,124,0,35,122,245,234,165,165,148,210,94,189,122,105,1,140,176,31,255,68,32,16,28,1,208,203, + 149,126,2,224,133,135,135,151,81,106,139,100,1,56,27,30,30,94,214,184,113,99,218,184,113,99,90,179,102,77,53,128,17,85,189,159,229,91,189,122, + 245,146,116,58,29,165,148,82,131,193,64,75,75,75,105,118,118,54,77,73,73,161,183,110,221,162,151,46,93,162,233,233,233,116,219,182,109,86,47,47, + 175,56,103,154,110,254,145,109,90,117,234,179,44,110,194,135,43,239,253,186,114,165,193,66,87,234,213,218,149,105,187,183,172,172,85,43,250,71,47,175, + 23,60,92,185,238,92,189,62,171,179,49,77,166,201,52,255,119,52,255,142,27,170,145,12,239,84,163,252,193,254,253,251,233,19,226,223,93,190,124,57, + 97,210,164,73,9,120,34,36,246,68,187,209,147,39,79,46,31,74,156,227,172,93,104,104,232,154,164,164,36,58,98,196,8,26,21,21,69,163,162,162, + 232,200,145,35,169,82,169,164,154,123,55,233,209,6,160,151,94,107,65,41,165,84,125,231,10,61,218,0,52,97,120,91,122,237,218,53,90,163,70,141, + 248,74,94,127,223,153,51,103,10,54,109,218,148,11,96,163,221,96,181,6,176,68,42,149,174,133,109,184,176,54,0,239,136,136,136,98,173,86,171,25, + 56,112,160,6,64,173,74,52,59,69,69,69,221,95,179,102,13,205,207,207,167,197,197,197,116,94,187,72,74,127,254,154,206,106,81,155,91,177,98,133, + 97,252,248,241,101,62,62,62,251,1,132,12,28,56,208,66,41,165,29,59,118,204,115,164,231,229,229,213,43,57,57,121,170,94,175,159,90,90,90,58, + 181,184,184,120,234,222,221,187,167,190,212,40,114,132,114,198,216,102,187,135,245,104,246,114,168,247,128,133,61,91,190,151,245,229,168,129,147,219,70,223, + 209,207,253,248,248,224,58,129,223,63,203,133,225,239,239,159,99,48,24,40,128,167,182,251,247,239,83,95,95,223,140,170,52,124,124,124,38,127,50,116, + 136,245,213,218,161,244,254,226,41,212,124,120,51,53,31,88,79,239,125,247,25,237,27,228,167,106,45,226,77,114,181,63,65,65,65,135,47,92,184,240, + 152,209,42,41,41,113,104,180,84,42,85,130,209,104,76,8,15,15,63,248,44,231,94,113,107,45,70,221,78,82,254,165,43,35,58,208,130,177,93,105, + 47,79,97,250,95,248,176,13,133,173,224,238,240,106,62,143,7,96,110,185,161,250,238,187,239,40,165,148,134,135,135,151,1,224,253,133,254,120,214,175, + 95,63,117,212,168,81,150,6,13,26,228,183,107,215,174,244,226,197,139,244,228,201,147,244,192,129,3,116,199,142,29,244,230,205,155,52,43,43,139,38, + 37,37,209,216,216,216,82,0,157,28,107,13,226,123,6,215,127,75,30,16,185,242,202,134,213,43,245,122,211,202,140,131,123,87,94,154,240,246,202,26, + 33,17,46,27,45,182,177,141,109,108,251,171,219,147,94,228,239,176,193,54,116,248,104,171,238,243,121,0,16,23,23,71,99,99,99,73,92,92,28,5, + 108,195,92,0,220,90,180,104,81,48,119,238,220,5,212,86,124,139,52,22,144,193,221,100,194,107,221,100,194,107,141,5,100,48,33,132,80,74,87,205, + 158,61,123,102,227,198,141,115,96,91,229,58,8,14,160,148,118,240,245,245,69,70,70,6,60,61,61,225,233,233,137,140,140,12,80,74,97,161,128,153, + 2,6,147,9,58,157,14,122,142,66,199,1,42,141,6,65,65,65,48,153,76,14,147,115,9,33,77,94,123,237,181,186,49,49,49,5,19,38,76,200, + 6,48,10,192,218,119,222,121,231,240,217,179,103,99,52,26,77,241,173,91,183,244,141,26,53,234,5,32,40,57,57,249,141,101,203,150,97,196,136,17, + 0,208,201,137,102,163,216,216,216,3,55,111,222,172,59,124,248,112,156,56,113,2,243,230,205,67,97,97,161,205,218,26,12,212,106,181,154,218,182,109, + 107,90,188,120,241,139,29,59,118,188,80,97,56,245,158,19,205,200,176,176,48,24,12,6,20,20,20,224,230,205,155,112,247,244,196,245,236,194,192,206, + 11,87,20,125,181,251,176,112,232,139,49,62,159,246,104,103,248,54,254,68,68,116,72,96,160,209,100,14,74,202,201,203,118,164,87,21,34,145,40,163, + 176,176,16,70,163,17,58,157,14,42,149,10,69,69,69,40,44,44,68,118,118,54,68,34,209,253,170,52,60,138,139,79,165,158,57,73,182,253,244,29, + 234,90,138,33,216,185,4,130,61,203,81,207,88,128,149,83,198,184,27,125,253,167,121,122,120,148,120,123,123,175,34,132,132,87,165,215,172,89,51,20, + 21,21,161,168,168,8,190,190,190,240,246,246,134,183,183,55,74,75,75,161,84,42,161,82,169,16,17,17,129,38,77,154,96,195,134,13,207,114,218,79, + 113,206,64,83,44,176,142,61,156,152,13,145,92,142,58,222,138,176,23,221,137,143,179,246,132,144,174,34,145,104,187,175,175,111,60,33,228,3,66,136, + 156,16,242,129,175,175,111,188,80,40,236,15,96,22,165,116,83,53,187,241,237,180,105,211,38,38,39,39,203,174,93,187,134,9,19,38,96,250,244,233, + 184,119,239,222,15,148,82,206,254,186,239,251,249,249,237,231,243,249,171,9,33,189,9,33,189,66,66,66,28,22,197,171,64,255,241,227,199,235,155,55, + 111,158,116,231,206,157,254,103,206,156,105,241,217,103,159,41,31,60,120,128,164,164,36,4,7,7,163,102,205,154,208,104,52,40,41,41,65,255,254,253, + 61,61,60,60,134,57,18,162,116,187,85,8,96,205,151,239,81,57,172,72,253,121,1,178,143,239,193,214,248,179,212,68,73,82,73,73,170,10,0,252, + 253,163,229,161,33,225,23,106,134,68,228,149,111,1,65,145,57,242,128,134,1,213,124,79,24,12,6,227,41,158,244,34,127,7,8,33,47,193,133,100, + 248,202,112,152,163,37,147,201,166,157,58,117,170,205,168,81,163,74,174,95,191,190,13,0,98,248,24,212,191,109,211,181,159,141,126,93,198,233,52,152, + 179,114,203,90,92,79,6,128,237,0,246,183,104,209,226,139,21,43,86,4,183,105,211,230,67,0,147,29,200,218,50,214,189,189,161,215,235,65,8,129, + 155,155,27,56,142,131,86,171,71,153,21,176,234,141,80,42,149,208,217,247,57,131,9,101,101,101,143,158,235,128,206,163,70,141,42,88,182,108,153,53, + 39,39,231,39,0,141,70,140,24,209,111,233,210,165,88,176,96,129,126,230,91,111,248,122,22,102,142,140,230,243,57,179,16,91,18,205,152,124,234,212, + 41,140,30,61,26,132,144,33,0,126,121,82,80,42,149,46,223,178,101,139,244,214,173,91,232,219,183,239,173,204,204,204,153,0,174,78,15,198,90,0, + 29,44,69,185,183,62,252,240,195,117,205,155,55,31,59,116,232,80,185,86,171,13,232,219,183,47,50,50,50,144,149,149,117,214,81,39,41,165,73,87, + 174,92,105,17,20,20,68,82,82,82,144,152,152,40,221,179,103,79,67,43,143,231,149,105,117,119,27,223,46,162,116,120,235,166,250,77,231,174,138,78, + 39,166,122,125,214,189,189,247,213,135,57,114,51,65,149,134,200,17,106,181,122,201,204,153,51,27,124,251,237,183,138,226,226,98,228,231,231,131,82,10, + 55,55,55,204,155,55,79,83,92,92,188,180,42,141,16,55,193,231,223,127,246,14,17,220,62,11,92,59,249,232,184,225,110,2,214,249,136,241,227,206, + 223,196,145,81,81,226,75,151,46,141,26,61,122,244,16,66,72,11,74,105,178,51,61,251,93,1,120,188,199,83,175,8,33,224,241,120,106,74,169,86, + 46,151,155,21,10,5,120,60,158,144,58,30,3,175,54,60,11,76,224,243,1,177,20,60,161,243,148,68,66,200,224,33,67,134,252,176,104,209,34,137, + 68,34,33,27,55,110,108,49,113,226,196,79,191,251,238,59,239,55,222,120,67,104,48,24,232,167,159,126,218,137,16,50,158,82,234,178,19,12,15,15, + 255,112,234,212,169,152,55,111,30,182,108,217,2,157,78,167,189,119,239,222,26,0,83,8,33,31,133,135,135,15,254,240,195,15,221,150,44,89,130,188, + 188,188,160,221,187,119,7,88,173,214,43,227,198,141,187,90,133,116,251,158,61,123,98,236,216,177,0,144,67,41,125,16,25,25,105,201,206,206,70,211, + 166,77,241,226,139,47,34,55,55,23,26,141,6,165,165,165,8,11,11,3,199,113,109,156,137,113,132,90,45,20,200,59,123,24,239,254,126,215,92,100, + 129,21,32,167,249,22,126,60,96,51,89,30,30,226,243,51,99,219,70,53,240,149,243,1,128,114,28,62,223,122,188,232,162,210,224,5,32,223,213,247, + 132,193,96,48,254,65,28,196,159,139,74,59,45,245,240,228,172,67,160,138,69,165,221,220,220,188,155,53,107,134,58,117,234,120,95,191,126,93,0,192, + 228,43,22,124,249,233,168,161,50,69,194,65,168,245,6,12,233,208,80,150,144,152,250,37,108,70,75,16,22,22,38,105,214,172,25,220,221,221,107,56, + 233,199,137,220,220,220,240,102,205,154,225,206,157,59,0,128,232,232,104,152,76,38,40,213,106,155,177,50,115,80,42,149,208,20,228,65,107,5,68,238, + 190,72,79,79,7,159,207,119,150,21,28,92,175,94,189,130,213,171,87,91,1,156,2,48,103,250,244,233,152,52,105,18,150,45,91,182,101,128,28,115, + 183,28,57,224,139,43,199,208,127,210,162,161,137,102,250,197,195,135,15,225,229,229,5,185,92,30,225,72,176,99,199,142,205,229,114,57,214,175,95,79, + 51,51,51,219,81,74,213,0,48,51,148,80,0,144,242,160,164,148,46,33,132,252,114,247,238,221,29,31,127,252,113,72,235,214,173,241,238,187,239,2, + 192,126,71,154,165,165,165,231,223,252,63,246,206,59,44,170,107,107,227,239,158,62,48,3,51,244,46,42,130,136,138,138,189,97,193,26,123,239,70,163, + 38,70,175,137,38,246,4,196,168,49,26,99,202,53,137,137,37,106,52,138,98,215,168,216,43,22,20,165,35,69,80,122,153,206,244,217,223,31,48,92, + 84,202,144,228,126,55,101,126,207,115,30,152,57,251,188,179,246,153,115,102,214,236,189,246,90,51,102,180,93,185,114,37,175,188,188,92,112,252,248,241, + 177,235,215,175,103,119,234,212,169,244,113,124,252,208,185,179,103,233,112,254,250,225,159,110,223,191,236,110,47,24,211,204,217,17,199,226,18,57,70,38, + 238,214,209,239,106,186,113,88,115,248,44,50,223,72,77,238,76,194,200,87,25,232,119,50,157,97,167,155,155,219,24,141,70,51,120,206,156,57,66,59, + 59,59,100,102,102,98,223,190,125,138,184,184,184,35,26,141,230,100,67,186,70,19,237,232,211,180,9,112,238,74,245,115,58,19,197,93,45,7,195,223, + 121,15,94,222,62,208,104,52,104,219,182,45,137,140,140,20,188,255,254,251,75,81,57,162,88,39,175,58,89,0,12,132,144,18,74,169,68,161,80,40, + 109,108,108,52,28,14,7,101,101,101,60,250,7,44,86,32,132,48,122,241,240,65,143,182,254,0,207,6,207,74,21,121,119,229,180,172,182,182,118,118, + 118,111,109,219,182,141,255,221,119,223,233,82,82,82,76,187,118,237,226,253,235,95,255,114,213,233,116,152,61,123,182,38,48,48,144,177,109,219,54,254, + 153,51,103,198,2,104,244,144,155,94,175,71,124,124,252,103,148,210,21,85,182,125,176,102,205,154,201,17,17,17,0,128,67,135,14,161,176,176,16,227, + 198,141,131,167,167,39,34,34,34,16,25,25,89,87,191,108,219,181,107,23,226,228,228,132,171,87,175,230,81,74,159,17,66,58,118,236,216,209,110,212, + 168,81,104,213,170,21,148,74,37,116,58,93,181,163,229,229,229,5,177,88,236,84,151,125,58,208,51,139,55,127,239,97,164,112,7,112,182,44,63,229, + 188,121,159,217,201,90,55,162,115,160,219,139,36,230,188,99,249,101,121,122,166,1,0,180,38,98,50,153,56,146,198,158,15,43,86,172,88,249,139,208, + 13,141,40,42,253,106,134,120,160,202,209,50,15,213,13,27,54,236,165,180,242,175,126,49,26,203,139,32,81,170,144,45,85,33,167,220,244,210,62,147, + 233,229,199,175,146,151,151,119,242,246,237,219,111,133,132,132,176,242,242,42,103,196,66,66,66,160,82,169,144,247,40,22,74,19,32,104,17,12,165,82, + 137,242,164,135,16,182,235,14,167,97,211,240,197,55,223,104,74,75,75,191,175,77,147,203,229,178,189,189,189,139,51,51,51,13,0,202,68,34,209,160, + 38,77,154,224,202,149,43,0,240,51,5,54,35,238,50,112,53,26,180,114,72,69,232,235,235,139,162,162,34,40,20,138,43,181,105,222,190,125,59,77, + 175,215,183,29,57,114,36,217,179,103,207,33,66,72,56,128,199,171,220,193,124,148,91,8,165,17,124,66,200,64,7,7,135,247,35,34,34,194,22,46, + 92,136,19,39,78,224,252,249,243,58,84,198,130,221,126,85,147,82,42,37,132,108,255,240,195,15,187,49,24,140,119,46,92,184,96,8,8,8,144,233, + 116,58,99,203,192,64,70,120,228,90,206,130,119,230,137,75,85,72,28,220,210,163,7,33,64,226,139,162,103,105,242,218,87,137,153,233,195,99,157,154, + 212,187,93,232,91,147,70,8,5,45,90,67,249,36,214,125,123,212,153,47,250,218,176,134,23,86,24,70,137,68,162,241,87,174,92,89,160,213,106,155, + 243,120,188,167,18,137,228,75,185,92,222,160,147,197,98,177,134,5,251,120,59,72,202,202,192,175,26,137,146,233,77,40,209,24,144,44,14,192,148,42, + 39,171,184,184,24,5,5,5,112,119,119,39,70,163,113,68,125,154,231,207,159,199,240,225,195,1,0,18,137,4,132,16,16,66,74,2,3,3,11,121, + 60,94,41,135,195,145,109,222,188,89,173,86,171,193,98,177,248,70,163,145,217,144,157,245,209,85,64,92,67,109,200,183,111,143,236,55,160,125,235,86, + 244,218,189,71,164,92,165,222,93,87,123,185,92,254,111,127,127,127,86,89,89,217,73,0,201,122,189,126,255,161,67,135,248,211,167,79,87,71,69,69, + 77,5,224,183,101,203,150,241,10,133,162,206,10,237,181,145,158,158,254,239,245,235,215,47,95,189,122,53,246,238,221,187,16,192,10,0,240,247,247,31, + 21,17,17,129,205,155,55,99,239,222,189,166,228,228,228,51,38,147,41,125,201,146,37,237,220,220,220,74,242,243,243,211,235,114,180,0,116,26,50,100, + 136,230,198,141,27,92,185,92,126,157,16,242,254,252,249,243,231,116,237,218,85,62,105,210,36,65,89,89,153,196,214,214,150,187,99,199,14,7,22,139, + 5,165,82,9,66,8,228,114,185,182,54,49,23,151,214,2,71,30,206,16,6,241,165,20,48,152,76,147,60,125,2,223,207,203,77,249,165,166,147,229, + 254,34,137,185,243,81,78,89,150,158,187,171,40,47,109,89,99,206,131,21,43,86,172,52,68,93,190,200,255,18,74,105,44,106,113,172,94,229,165,218, + 134,85,255,191,54,162,85,179,131,42,149,170,48,39,39,167,213,139,23,47,12,0,12,0,80,170,53,124,186,126,71,244,206,177,221,252,5,249,122,61, + 142,221,75,80,149,106,13,159,86,29,110,120,241,226,133,252,217,179,103,118,21,21,21,138,58,236,184,245,237,183,223,86,92,190,124,217,46,35,35,3, + 70,163,17,29,59,118,68,106,106,42,202,147,227,33,104,213,17,130,62,195,145,240,224,30,226,206,199,32,75,161,53,164,124,180,94,170,80,42,35,180, + 90,237,177,218,4,217,108,118,89,101,95,42,71,63,100,50,217,99,133,66,209,219,205,205,13,137,137,137,2,165,17,139,198,175,252,226,107,74,169,145, + 83,185,82,108,241,164,73,147,112,255,254,125,0,184,95,155,166,76,38,91,56,119,238,220,203,63,253,244,19,43,35,35,99,240,206,22,236,177,68,0, + 0,32,0,73,68,65,84,157,59,7,167,164,164,80,82,150,99,188,161,98,195,111,230,162,206,223,249,6,158,31,62,124,56,60,60,60,176,99,199,14, + 124,249,229,151,250,119,223,125,55,237,203,47,191,236,12,96,127,109,186,148,82,41,128,95,157,157,157,23,180,105,211,70,174,84,42,81,90,90,138,188, + 188,60,56,58,57,49,12,96,244,112,17,139,247,159,44,144,11,88,191,222,65,236,243,252,122,71,179,186,115,88,51,38,247,237,16,250,175,213,43,133, + 184,113,12,100,110,4,232,206,79,240,222,155,227,237,212,154,253,125,58,177,88,211,165,6,195,62,0,141,202,17,65,8,25,210,187,119,239,95,214,175, + 95,111,179,106,211,122,108,105,229,5,67,105,41,138,53,70,148,104,12,144,149,39,35,49,49,1,78,78,206,200,202,202,130,90,173,70,82,82,18,101, + 50,153,245,58,112,122,189,190,230,107,128,193,96,200,1,72,120,60,94,41,155,205,46,100,177,88,101,25,25,25,74,181,90,13,6,131,33,48,26,141, + 54,22,216,234,237,236,236,188,4,192,88,0,39,228,37,37,95,133,176,33,6,11,125,155,187,58,13,253,232,237,233,206,77,60,93,37,25,105,79,245, + 223,159,187,89,162,214,224,211,186,180,40,165,167,80,99,68,146,16,242,94,84,84,212,28,0,187,104,101,221,173,24,0,223,53,100,83,45,124,116,228, + 200,145,229,171,87,175,134,141,141,77,117,242,84,27,27,27,62,0,28,56,112,0,137,137,137,93,205,241,90,0,126,177,64,211,47,56,56,56,35,58, + 58,154,11,192,115,254,252,249,221,191,254,250,107,188,249,230,155,69,9,9,9,93,41,165,153,132,16,191,119,222,121,231,238,222,189,123,29,76,38,19, + 202,203,203,161,213,106,107,29,25,182,181,49,253,240,113,79,159,142,207,74,203,152,79,95,20,98,222,184,145,88,126,252,193,119,118,158,45,31,54,21, + 243,207,157,57,246,147,111,206,174,173,184,159,252,180,226,172,194,62,171,180,48,109,229,111,56,15,86,172,88,177,210,32,127,70,103,203,18,94,29,197, + 170,201,75,83,135,230,142,169,213,234,127,251,250,250,138,0,248,0,24,14,224,196,99,35,14,35,37,27,241,89,207,87,2,149,142,215,99,99,245,151, + 248,196,187,119,239,106,155,54,109,250,8,192,39,117,24,33,115,118,118,94,183,100,201,146,13,235,214,173,99,177,88,44,92,190,124,25,183,207,157,54, + 37,93,143,37,217,21,198,10,217,189,15,95,176,168,241,142,91,69,217,147,135,42,28,161,148,62,175,175,99,74,165,50,39,61,61,157,219,166,77,27, + 227,195,135,15,157,41,165,71,207,156,57,211,123,217,178,101,184,114,229,202,254,11,106,227,20,74,77,135,8,33,44,0,83,70,140,24,241,254,248,241, + 227,209,190,125,123,29,234,152,254,161,148,222,32,132,76,201,205,205,221,190,116,233,82,241,210,165,75,193,96,48,72,205,115,85,82,82,130,71,143,30, + 97,210,164,73,210,155,55,111,46,10,11,11,155,221,171,87,47,156,61,123,214,179,62,123,1,128,16,114,43,41,41,105,140,72,36,34,233,233,233,144, + 201,100,184,113,227,6,219,215,215,183,199,161,67,135,120,205,155,55,71,194,147,39,56,51,101,202,48,66,136,47,165,244,89,109,58,54,108,178,96,230, + 132,17,66,205,141,147,64,220,53,0,128,66,38,71,69,86,60,198,119,241,183,191,146,148,61,31,149,171,48,27,133,163,163,227,123,91,182,108,17,4, + 4,4,224,131,245,155,176,100,245,50,188,227,234,11,217,139,28,148,24,1,174,173,45,214,125,180,26,35,38,76,130,171,171,43,158,60,121,66,119,236, + 216,161,148,74,165,155,235,211,53,59,90,76,38,19,132,16,0,80,74,165,82,5,151,203,149,178,88,172,82,163,209,88,120,234,155,175,58,50,74,11, + 103,17,66,152,54,38,198,169,170,197,22,181,198,231,137,9,241,109,225,231,247,228,199,29,59,4,93,187,118,37,247,238,221,91,48,127,222,220,57,99, + 131,155,157,25,61,32,20,238,30,238,26,147,78,43,57,115,226,148,254,187,168,51,87,181,196,180,244,1,165,21,150,158,7,74,233,47,168,225,244,16, + 66,38,3,152,0,32,154,82,250,51,33,100,38,128,209,0,142,212,21,32,79,8,97,0,248,97,220,184,202,98,2,21,21,21,42,243,243,237,218,181, + 171,249,90,245,15,7,191,130,173,173,173,29,159,207,127,122,246,236,89,155,73,147,38,57,108,216,176,225,197,155,111,190,233,181,127,255,254,127,3,200, + 34,132,4,2,104,161,84,42,141,12,6,3,129,129,129,216,182,109,155,194,104,52,238,170,77,207,134,24,155,245,25,62,130,105,163,146,192,80,161,128, + 42,55,11,77,213,133,2,185,141,40,110,205,232,30,182,249,155,22,163,160,195,96,236,97,167,203,148,164,124,252,31,49,173,107,197,138,21,43,117,241, + 103,118,178,8,33,188,218,98,136,107,155,50,52,83,107,140,22,165,52,151,16,82,18,31,31,223,225,240,225,195,31,19,66,60,40,165,223,161,50,30, + 43,234,85,241,21,43,86,204,27,59,118,44,58,117,234,244,152,82,90,88,151,129,37,37,37,155,217,108,118,55,91,91,219,209,71,143,30,85,82,74, + 99,202,75,75,207,186,115,141,143,114,43,240,168,177,95,56,0,178,31,60,120,224,208,169,83,39,195,158,61,123,124,1,236,93,186,116,233,218,251,247, + 239,219,93,187,118,173,207,138,21,43,242,93,92,92,42,130,131,131,109,102,204,152,129,69,139,22,97,249,242,229,72,73,73,153,69,235,249,210,165,148, + 30,38,132,156,190,114,229,202,108,46,151,219,223,207,207,175,217,104,63,183,32,187,38,77,89,73,231,78,42,247,164,23,239,1,144,140,202,47,98,165, + 88,44,158,41,22,139,13,114,185,188,214,248,159,87,206,193,222,25,51,102,132,173,90,181,202,142,195,225,144,248,248,120,122,228,200,17,135,91,183,110, + 241,124,124,124,136,92,46,135,111,211,166,216,252,249,231,252,153,51,103,126,0,224,95,181,233,232,77,212,219,206,187,41,200,156,143,171,159,179,91,82, + 233,235,228,174,158,6,157,137,250,52,226,60,86,163,213,106,59,53,109,218,20,42,149,10,54,54,54,24,49,115,14,62,217,186,25,51,219,180,1,67, + 111,132,49,191,0,210,135,247,85,159,60,124,148,162,2,241,97,50,153,39,36,18,201,231,148,210,90,87,92,154,25,57,114,36,164,82,41,8,33,104, + 221,186,53,4,2,129,158,195,225,104,55,110,220,168,201,202,202,82,157,250,230,171,142,97,254,158,17,239,109,223,196,55,150,23,99,195,230,111,230,255, + 250,40,45,22,175,92,111,102,4,78,142,159,252,248,227,143,130,208,208,80,2,0,221,187,119,39,235,54,124,202,59,184,227,123,191,183,60,125,238,223, + 143,189,173,63,126,38,70,125,47,41,109,219,77,53,14,214,229,176,153,233,104,71,156,4,12,70,164,64,36,30,173,144,73,142,234,77,166,240,219,50, + 90,14,0,132,144,137,1,1,1,159,164,166,166,218,4,5,5,181,33,132,12,110,213,170,85,215,164,164,36,155,160,160,160,214,132,16,54,165,180,182, + 105,201,13,107,214,172,153,181,122,245,234,234,149,134,85,206,215,71,227,199,87,86,67,170,168,168,80,3,64,7,33,113,182,103,49,54,216,59,185,140, + 150,149,22,31,147,25,76,171,30,42,104,201,171,130,77,185,164,101,136,200,118,212,238,165,243,219,53,51,86,60,26,54,104,192,221,105,211,166,225,204, + 153,51,217,0,154,56,57,57,93,27,48,96,128,195,144,33,67,80,82,82,34,18,8,4,216,182,109,155,234,244,233,211,95,105,181,218,90,29,66,22, + 192,49,26,77,144,63,186,14,229,179,76,24,12,70,116,119,36,204,229,195,250,219,234,83,227,161,145,203,113,50,250,180,182,168,176,116,153,58,63,53, + 167,190,243,104,197,138,21,43,127,55,170,126,243,155,157,63,53,33,132,95,151,179,85,243,113,181,227,85,79,222,136,17,203,151,47,127,64,41,53,231, + 210,154,94,75,155,145,171,87,175,126,64,41,125,176,108,217,178,7,120,61,153,232,107,9,205,0,172,217,182,109,27,229,241,120,63,254,198,124,22,53, + 19,120,186,143,30,61,186,155,76,38,235,236,230,230,214,25,149,142,163,143,179,179,115,198,254,253,251,21,21,21,21,10,74,169,194,96,48,40,238,223, + 191,175,232,219,183,175,2,149,1,219,164,33,59,95,221,86,185,227,198,189,143,222,162,171,220,113,227,149,99,167,237,218,181,235,108,102,102,230,73,123, + 123,251,101,150,104,2,240,113,113,113,9,119,116,116,60,231,236,236,188,202,209,209,49,95,167,211,209,242,242,114,154,154,154,74,175,92,185,66,111,223, + 190,77,29,29,29,159,215,101,103,152,13,235,78,249,166,5,212,180,107,61,213,126,189,146,2,160,146,173,43,104,201,183,145,244,222,220,193,180,47,159, + 121,171,177,231,147,82,10,177,88,252,195,209,163,71,77,233,233,233,244,212,169,83,244,244,233,211,116,209,162,69,180,165,167,135,166,27,151,81,216,155, + 199,58,247,91,18,150,106,52,154,7,50,153,236,129,66,161,120,16,20,20,244,160,75,151,46,209,221,186,117,251,34,42,42,234,189,13,27,54,140,10, + 179,227,165,170,98,162,40,93,58,148,210,5,189,232,211,57,125,105,127,27,214,163,58,53,221,220,158,107,52,26,74,41,165,74,165,146,94,187,118,141, + 94,186,116,137,186,59,59,203,66,109,152,243,122,242,208,167,167,61,196,150,218,217,79,196,216,125,231,219,79,141,21,103,247,210,3,51,135,26,250,138, + 25,219,106,180,59,72,41,205,31,55,110,92,22,165,52,255,200,145,35,185,148,210,252,177,99,199,102,81,74,243,1,252,82,155,230,43,201,73,119,161, + 50,167,214,130,53,107,214,60,160,148,62,88,179,102,205,3,160,50,137,106,31,17,227,167,216,237,155,77,154,211,63,209,168,217,195,140,125,68,140,159, + 106,181,83,204,58,25,183,107,43,213,158,251,153,30,93,52,213,216,203,221,254,106,64,64,192,230,247,222,123,47,250,246,237,219,143,141,70,99,98,70, + 70,70,226,55,223,124,147,216,173,91,183,155,78,78,78,241,92,46,247,221,250,250,222,169,153,255,165,91,159,175,162,169,75,70,211,187,131,155,208,91, + 253,189,233,181,80,79,122,177,135,27,189,60,176,37,221,60,188,191,209,199,167,85,84,99,175,165,63,98,179,106,90,53,173,154,255,28,205,191,194,6, + 160,43,106,73,90,138,122,242,141,214,185,222,157,82,122,146,16,34,160,148,46,25,63,126,60,54,110,220,56,177,109,219,182,147,189,188,188,92,0,32, + 47,47,79,5,64,54,126,252,120,132,135,135,99,211,166,77,95,208,202,88,150,255,55,40,165,5,132,16,239,133,11,23,22,109,216,176,193,52,123,246, + 236,86,148,210,39,132,144,150,83,167,78,93,192,98,177,198,251,250,250,6,231,231,231,23,87,84,84,252,12,96,59,173,252,98,108,52,60,6,140,157, + 154,122,224,28,3,213,211,38,132,144,161,225,225,225,147,198,142,29,171,219,186,117,171,65,38,147,157,176,208,238,92,0,107,205,143,157,156,156,220,31, + 61,122,244,174,171,171,43,35,35,35,3,26,141,6,233,233,233,38,0,199,235,210,80,24,232,87,223,29,185,16,184,100,218,112,123,85,242,67,112,152, + 76,232,217,92,20,220,57,135,93,215,146,101,74,29,26,76,225,80,27,18,137,228,243,69,139,22,77,93,182,108,25,223,215,215,151,220,186,117,11,135, + 14,29,210,20,21,21,13,161,148,94,253,45,154,64,229,98,9,46,151,11,0,88,177,98,5,24,12,6,187,168,168,136,75,8,225,17,66,108,9,33, + 76,125,102,34,76,178,114,20,150,75,144,91,88,255,66,54,163,201,116,40,54,54,118,113,135,14,29,24,247,238,221,67,113,113,49,210,211,211,169,145, + 210,95,174,170,12,141,10,88,7,0,91,71,167,209,237,29,120,12,238,238,112,132,106,25,204,239,77,24,7,96,65,213,238,93,132,16,14,128,210,160, + 160,160,126,85,35,89,21,201,201,201,103,9,33,94,0,126,170,77,211,198,198,166,4,64,201,145,35,71,0,96,46,165,212,68,8,233,24,17,17,145, + 127,237,218,53,172,89,179,166,16,192,54,0,16,58,56,141,12,22,113,8,119,207,26,116,215,128,241,181,137,214,186,184,64,232,234,214,191,141,128,1, + 246,206,143,209,217,61,144,193,53,232,218,70,70,70,94,83,40,20,154,131,7,15,106,103,205,154,197,76,75,75,187,11,224,58,42,167,53,13,13,245, + 189,88,135,95,46,198,165,244,155,209,173,37,144,149,1,163,65,9,202,99,131,99,43,66,138,209,150,126,247,164,36,57,215,192,127,179,113,103,212,138, + 21,43,86,254,126,208,58,130,227,169,165,49,90,181,28,120,128,16,82,178,105,211,166,254,0,236,163,162,162,58,181,108,217,18,0,144,154,154,106,27, + 24,24,152,210,174,93,187,36,0,119,40,165,13,174,102,171,194,252,193,223,216,105,194,186,72,88,182,108,25,217,187,119,175,1,168,116,130,170,190,92, + 190,2,240,85,125,113,62,191,151,128,128,128,129,31,127,252,177,118,231,206,157,198,79,62,249,228,4,173,39,143,84,125,148,149,149,109,153,62,125,250, + 212,136,136,8,145,157,157,29,137,143,143,55,237,218,181,75,86,86,86,182,165,174,99,98,181,134,131,125,120,172,177,18,101,212,192,137,33,77,237,146, + 22,14,67,106,236,117,252,124,53,81,158,86,86,113,254,158,193,112,232,183,216,66,41,77,39,132,180,15,15,15,95,161,211,233,198,178,217,236,187,50, + 153,44,146,82,90,107,142,48,75,208,235,245,133,205,155,55,127,245,117,244,38,147,137,82,74,217,6,131,65,224,168,51,157,142,248,114,231,59,179,2, + 69,188,146,18,9,246,164,201,52,53,22,91,188,70,113,113,241,23,115,230,204,121,51,34,34,194,193,222,222,158,36,36,36,208,131,7,15,42,138,75, + 75,55,254,22,27,85,229,101,231,79,29,142,26,223,75,107,32,251,178,228,148,197,36,103,107,216,122,1,192,5,0,32,132,76,35,132,140,3,112,140, + 82,250,90,30,182,151,52,85,170,243,0,184,227,198,141,67,124,124,252,68,0,7,0,252,178,118,237,218,110,225,225,225,136,140,140,68,68,68,196,64, + 0,231,228,229,165,167,163,127,249,121,74,95,189,158,177,47,91,110,98,50,200,153,90,53,75,10,47,156,189,16,51,178,179,189,39,249,225,220,117,147, + 202,68,31,206,156,57,179,92,171,213,158,3,240,53,128,120,74,105,173,171,11,235,34,231,69,250,174,67,183,176,86,64,13,238,253,218,247,6,87,169, + 128,180,180,20,103,159,73,141,63,103,20,165,169,148,154,158,180,60,211,226,248,54,43,86,172,88,249,187,64,8,233,131,202,170,32,125,41,165,87,95, + 153,70,172,217,174,206,60,90,141,25,46,115,119,116,116,220,213,188,121,243,40,95,95,223,40,161,80,248,5,0,159,198,14,45,2,240,91,191,126,189, + 76,36,18,181,255,141,195,118,181,105,186,2,240,2,224,244,71,105,190,186,173,245,192,194,180,101,19,31,173,245,192,194,26,199,117,105,213,170,213,167, + 0,222,248,45,154,175,180,247,117,116,116,252,198,209,209,241,185,163,163,227,55,0,124,45,209,236,196,100,78,237,199,103,222,234,193,101,20,244,227,51, + 111,117,102,50,167,52,242,117,255,20,67,202,0,72,48,19,19,250,219,176,30,245,183,97,61,10,102,98,2,106,76,241,214,241,190,123,59,59,59,111, + 117,116,116,204,115,118,118,174,245,156,89,106,103,123,27,120,244,23,51,143,245,176,35,202,254,34,230,145,78,182,112,251,189,125,7,16,178,102,205,154, + 55,41,165,111,122,122,122,142,55,247,19,64,112,120,120,248,112,74,233,112,15,15,143,48,74,41,186,216,194,181,175,152,185,191,167,61,145,244,21,51, + 247,119,177,133,107,93,118,246,19,51,15,245,180,39,146,80,123,198,254,38,60,52,253,35,222,35,4,5,113,220,220,252,195,155,121,250,103,55,243,244, + 151,250,120,248,167,216,185,6,188,15,47,47,254,95,237,90,178,106,90,53,173,154,127,77,205,63,227,86,233,38,189,254,183,81,26,255,101,3,255,18, + 111,174,85,211,170,105,213,180,106,90,53,173,154,86,205,255,173,230,159,113,171,233,88,161,170,102,112,29,237,230,213,216,60,106,238,171,119,234,208,138, + 21,43,86,172,88,177,98,229,159,10,173,49,77,72,107,153,50,172,177,175,58,70,139,16,50,143,16,82,253,28,1,48,160,142,131,44,14,108,39,132, + 212,170,81,31,13,233,91,53,173,154,86,77,171,166,85,211,170,105,213,252,251,105,54,164,221,24,255,227,191,13,33,228,181,24,239,186,28,174,26,113, + 90,167,105,205,133,119,255,229,33,183,191,196,112,165,85,211,170,105,213,180,106,90,53,173,154,86,205,255,173,230,159,117,67,35,227,178,80,53,133,104, + 126,108,157,58,180,98,197,138,21,43,86,172,88,169,3,90,207,148,161,153,87,86,29,190,52,162,85,171,163,197,238,186,190,208,96,48,184,2,0,139, + 197,42,210,223,253,200,163,190,23,96,3,97,6,224,199,42,193,185,250,202,229,240,175,106,94,48,24,12,14,85,154,229,250,187,31,13,174,87,179,203, + 186,115,47,181,143,93,61,176,150,158,49,217,93,214,229,189,98,107,131,101,112,170,169,165,148,200,127,195,206,191,138,230,63,25,78,183,245,133,122,125, + 229,117,196,102,179,138,116,177,245,95,71,156,174,235,242,94,106,127,103,181,91,125,154,182,54,188,210,22,94,46,95,212,167,153,145,87,178,68,169,82, + 59,213,167,217,216,123,211,199,195,35,204,88,117,111,50,129,185,185,121,121,255,63,247,166,133,16,66,58,1,248,8,128,125,141,167,227,41,165,239,255, + 86,77,43,86,172,88,249,163,168,145,222,193,76,95,90,75,78,73,218,216,60,90,6,131,193,245,193,209,8,40,53,64,216,140,117,174,126,163,183,191, + 86,40,217,160,46,231,74,18,14,6,51,245,50,7,23,150,206,62,47,47,143,84,25,245,35,128,38,181,104,58,60,56,26,1,149,22,8,157,28,233, + 208,4,176,47,230,112,62,176,17,8,250,85,84,84,180,1,0,27,27,155,132,10,165,242,178,139,78,183,229,213,246,117,117,160,166,173,253,167,175,115, + 109,53,122,251,34,163,201,196,125,113,239,251,80,117,73,26,139,109,208,108,91,5,156,141,0,44,170,207,246,210,235,78,88,233,196,6,250,115,249,252, + 246,98,7,135,222,38,74,131,76,38,19,49,26,12,137,50,169,244,186,201,96,120,100,208,42,157,30,156,248,212,84,159,157,175,246,101,2,192,58,10, + 140,23,8,133,253,152,108,118,15,0,48,234,245,183,148,10,197,229,49,192,97,75,250,110,233,249,249,173,237,255,105,232,245,6,215,204,115,17,208,232, + 129,144,113,159,186,182,155,186,103,63,0,104,139,30,185,41,210,78,116,5,0,65,139,225,177,60,247,144,66,0,96,61,203,119,77,61,181,26,26,61, + 16,52,60,210,181,33,205,89,225,135,156,150,205,27,203,3,128,243,71,254,221,242,82,244,119,67,1,160,255,216,249,103,7,141,91,152,10,0,155,126, + 136,118,250,229,211,137,245,106,90,118,111,74,57,210,180,83,254,90,89,190,216,71,192,114,79,75,75,99,0,128,167,167,167,69,247,166,55,32,202,7, + 22,48,152,204,222,45,252,253,67,0,208,140,167,79,227,140,6,195,13,15,96,219,31,124,45,45,162,244,229,228,172,85,181,48,173,252,77,32,132,244, + 118,23,8,6,217,113,56,97,84,169,132,194,100,186,88,96,48,156,167,148,94,255,61,154,66,119,193,32,174,29,39,76,166,151,128,170,232,69,67,17, + 126,175,102,168,189,189,251,64,30,79,56,160,162,130,97,210,235,101,23,53,154,130,11,191,71,211,202,223,130,43,148,82,66,8,89,67,41,93,83,21, + 179,213,168,15,169,58,167,14,149,26,224,106,58,208,167,91,59,204,155,250,134,176,230,190,195,219,35,155,164,221,59,222,106,231,158,45,140,118,237,218, + 33,51,51,211,162,23,83,105,129,43,105,0,36,73,118,229,2,193,211,173,155,55,219,15,28,56,144,229,233,233,9,66,8,10,10,10,186,197,196,196, + 116,90,188,120,241,59,144,36,149,171,180,144,95,177,32,5,168,217,214,54,45,155,226,163,133,19,69,0,176,106,198,182,78,247,82,10,29,159,62,125, + 26,182,124,249,242,82,230,229,203,223,57,3,187,11,129,92,75,236,220,123,50,150,47,202,63,224,55,109,225,194,35,254,254,254,66,95,95,95,98,103, + 103,7,38,147,137,242,242,242,38,9,9,9,67,99,99,99,149,49,87,127,228,222,191,59,50,163,136,223,85,109,81,223,43,242,248,231,237,236,18,166, + 143,25,227,61,113,226,68,126,139,22,45,0,0,79,159,62,13,56,124,248,240,228,35,71,142,132,163,34,207,160,210,66,221,80,223,171,53,1,240,129, + 30,98,87,215,105,76,54,187,141,193,96,240,2,0,22,139,245,194,168,215,39,72,138,138,126,126,181,189,149,215,209,232,129,164,124,96,64,239,16,76, + 31,59,64,0,0,203,39,173,239,246,44,43,157,163,213,106,209,50,48,168,231,39,159,126,113,14,12,6,246,69,199,84,183,183,68,51,62,41,19,17, + 159,108,69,222,227,195,221,140,210,244,126,114,153,148,9,0,246,34,209,216,195,7,15,92,246,12,30,127,39,189,68,103,145,102,125,247,230,175,7,191, + 241,120,254,228,114,235,111,207,239,98,55,105,210,4,143,31,63,182,168,239,213,215,134,52,197,206,228,225,145,184,101,233,82,247,208,208,80,8,133,66, + 176,88,44,24,12,134,1,55,110,220,24,16,17,17,49,31,210,20,165,165,247,166,5,108,33,132,244,155,53,111,145,199,27,163,198,99,236,144,158,127, + 136,168,149,255,61,132,16,55,127,71,199,83,91,22,45,106,57,180,127,127,129,151,175,47,76,69,69,200,77,77,237,124,234,198,141,69,1,124,126,106, + 186,70,51,156,214,83,31,183,54,77,103,127,199,83,75,182,44,106,217,127,104,127,65,83,47,95,228,168,179,145,250,44,185,243,205,179,119,22,113,154, + 177,82,245,217,198,70,107,186,185,249,159,90,190,252,139,150,3,7,14,19,248,248,120,162,168,200,132,180,180,103,93,46,95,62,249,158,157,93,64,170, + 66,145,222,40,77,43,127,43,250,154,3,226,9,33,17,0,250,54,86,160,86,71,139,197,98,21,13,156,185,193,181,119,215,182,184,247,40,85,154,157, + 147,175,48,239,43,75,56,220,114,84,79,175,214,215,174,93,133,70,163,193,173,91,183,240,232,209,35,100,101,101,225,237,183,223,214,176,128,185,117,104, + 150,135,78,142,116,128,52,77,24,192,77,105,22,147,156,204,84,171,213,184,118,237,26,202,203,203,193,229,114,225,237,237,141,65,131,6,177,146,147,147, + 29,195,6,14,17,133,14,153,146,9,81,128,130,197,98,149,215,217,1,22,171,40,108,198,58,215,214,1,77,241,52,59,79,250,209,167,59,21,38,19, + 101,101,100,61,211,93,189,122,21,33,33,33,184,112,225,130,83,89,89,217,199,219,182,109,251,136,253,217,183,95,233,181,165,31,214,163,87,30,58,57, + 210,193,169,40,202,247,210,175,199,56,9,9,9,156,239,191,255,30,165,165,165,224,114,185,16,139,197,112,119,119,71,203,150,45,201,170,85,171,132,195, + 135,39,224,95,115,199,251,234,252,230,164,212,101,103,117,223,21,207,108,157,101,231,91,68,159,62,205,232,213,171,215,75,30,113,243,230,205,49,120,240, + 96,254,180,105,211,90,76,156,60,213,20,58,108,214,83,8,125,85,13,106,42,115,109,156,84,183,61,7,76,158,124,34,50,50,82,236,238,238,14,129, + 64,0,0,144,74,165,222,217,217,217,221,194,195,195,199,197,198,31,100,133,14,207,205,131,192,167,162,190,243,249,79,133,205,102,21,153,71,145,236,4, + 54,229,185,207,11,149,0,160,213,106,161,213,106,161,209,104,240,238,252,183,153,115,199,117,241,247,237,189,232,97,214,139,194,178,160,152,59,142,230,99, + 27,210,100,169,178,36,146,156,139,115,35,150,46,117,119,115,251,207,140,224,190,189,123,153,101,101,101,3,34,34,34,90,83,219,190,146,160,225,145,226, + 250,52,235,187,55,37,169,167,155,125,178,112,112,251,237,159,158,130,209,104,196,237,219,183,113,237,218,53,124,241,197,23,244,236,217,179,82,123,129,160, + 129,123,51,197,174,151,71,129,223,103,159,29,33,60,30,15,199,143,31,71,114,114,50,24,12,6,218,181,107,135,233,211,167,99,192,128,1,238,243,230, + 189,77,67,135,76,202,128,40,80,254,123,174,165,170,2,219,139,86,70,124,230,49,99,206,2,108,250,100,149,213,209,250,155,64,8,105,218,210,199,231, + 230,165,221,187,61,60,236,236,128,248,120,32,33,1,250,243,231,209,210,199,7,173,250,247,23,76,234,222,61,100,208,167,159,198,17,66,122,82,74,179, + 45,209,108,210,210,231,230,222,75,187,61,68,30,118,72,70,60,46,33,1,123,36,219,225,235,221,28,125,222,31,40,232,58,182,99,200,166,81,95,55, + 70,179,89,211,166,45,111,236,223,31,227,225,224,224,137,204,76,224,238,93,138,139,23,77,240,240,8,196,232,209,173,4,125,250,76,10,249,248,227,65, + 113,132,144,174,148,210,231,127,204,25,178,242,87,161,106,154,208,162,24,45,74,233,15,132,16,15,0,195,170,142,173,76,239,64,41,197,233,211,167,205, + 203,23,251,14,27,54,236,42,8,97,248,141,222,190,255,211,85,115,133,43,55,252,168,200,56,246,246,84,0,16,1,77,154,119,232,144,126,233,210,37, + 86,122,122,58,246,236,217,163,10,8,8,184,215,188,121,243,178,193,3,7,202,154,248,250,74,95,228,231,47,3,165,175,151,215,33,132,209,20,176,43, + 177,181,77,79,78,78,118,78,76,76,196,253,251,247,225,231,231,7,7,7,7,176,217,108,232,245,122,200,100,50,4,6,6,130,199,227,161,99,199,142, + 37,78,74,165,127,54,32,175,67,147,9,0,129,163,191,95,188,110,229,91,194,143,63,221,37,77,62,246,246,215,142,64,128,111,135,14,9,43,87,174, + 100,104,52,26,152,76,38,4,7,7,195,211,211,19,238,222,77,75,244,26,165,123,213,25,124,125,58,177,242,195,31,222,94,94,133,9,9,9,206,193, + 193,193,40,42,42,130,88,44,134,72,36,130,88,44,174,222,154,53,107,134,37,75,150,192,195,195,163,168,66,173,246,168,210,172,181,239,29,1,94,154, + 64,144,114,245,234,85,159,144,144,144,90,223,40,181,90,13,149,74,133,184,184,56,140,27,55,46,55,64,169,12,124,0,104,234,210,180,5,58,180,8, + 14,62,123,241,226,69,103,123,123,123,20,20,20,64,38,147,129,197,98,193,214,214,22,206,206,206,224,243,249,0,128,180,180,52,12,27,54,172,36,63, + 35,99,168,10,120,88,171,230,63,153,170,107,233,85,124,221,220,6,233,8,57,242,205,55,223,240,187,118,237,138,139,23,47,98,246,155,111,110,48,2, + 225,47,53,172,253,90,98,2,0,15,8,235,220,171,215,217,207,62,251,140,193,227,241,16,21,21,133,248,248,120,16,66,208,185,115,103,204,153,51,7, + 0,240,246,219,111,155,46,157,61,59,84,3,92,172,71,179,214,123,83,12,120,247,26,62,60,37,58,58,154,159,155,155,139,209,163,71,191,72,78,72, + 88,201,7,226,59,2,25,87,0,93,149,102,173,215,146,55,32,50,121,120,36,30,57,114,196,189,160,160,0,31,124,240,65,201,243,103,207,150,11,42, + 107,38,66,9,244,246,109,222,252,179,125,251,246,57,251,251,251,35,36,36,164,192,152,147,211,250,57,32,253,45,215,82,149,147,181,99,101,196,103,179, + 102,204,89,128,189,59,182,225,211,200,229,185,148,82,31,66,72,12,165,212,26,67,248,23,133,16,66,188,4,130,39,177,71,143,182,246,84,169,128,187, + 119,129,202,149,88,208,159,60,105,110,4,198,128,1,200,114,118,166,253,34,35,147,94,232,245,109,105,213,114,173,186,52,237,189,4,79,142,199,30,109, + 173,245,84,33,30,119,65,81,217,252,251,103,149,161,143,4,4,67,108,71,195,53,207,155,174,27,178,37,201,80,72,27,210,100,136,68,30,9,103,207, + 62,104,101,50,185,33,37,133,154,205,196,217,179,38,179,153,232,214,141,192,198,38,155,46,93,218,47,65,173,126,222,174,62,77,43,191,143,215,124,145, + 63,1,141,41,193,67,95,201,165,101,126,204,48,63,57,108,216,48,130,151,3,190,94,163,130,201,220,176,105,211,38,150,90,173,198,206,157,59,229,19, + 198,141,139,234,211,187,119,70,51,95,95,9,97,48,26,252,176,45,230,241,222,219,180,105,147,88,171,213,226,254,253,251,232,212,169,19,220,221,221,33, + 20,10,33,20,10,225,234,234,138,192,192,64,20,21,21,193,206,206,14,203,150,45,19,21,243,120,239,53,164,107,50,81,22,0,24,77,38,46,7,152, + 231,215,185,243,253,240,240,112,134,147,147,19,28,29,29,33,20,10,145,156,156,12,173,86,11,91,27,91,139,86,90,50,24,12,134,80,40,196,165,75, + 151,176,104,209,34,244,232,209,3,98,177,24,118,118,118,104,211,166,13,6,13,26,132,185,115,231,34,35,35,3,196,130,160,146,68,22,107,193,220,185, + 115,93,235,115,178,36,18,9,138,139,139,225,237,237,141,241,227,199,187,38,178,88,11,106,109,12,192,9,112,247,14,8,56,113,247,238,93,103,129,64, + 128,125,251,246,225,216,177,99,248,245,215,95,113,230,204,25,156,58,117,10,199,143,31,71,113,113,49,0,32,32,32,0,135,14,29,114,22,186,186,158, + 114,2,220,45,57,7,86,128,103,133,133,231,219,20,20,56,79,155,58,245,186,66,161,192,180,105,211,176,97,227,198,85,108,96,177,37,199,7,2,34, + 71,15,143,221,159,125,246,25,163,160,160,0,99,198,140,41,217,178,113,227,91,113,231,206,181,120,240,235,175,45,54,68,70,190,213,167,79,159,146,231, + 207,159,99,239,222,189,12,183,38,77,118,7,2,162,198,218,41,7,22,125,249,229,151,124,181,90,141,129,3,7,102,152,18,18,2,13,192,1,5,144, + 92,237,100,213,67,62,176,96,217,178,101,238,60,30,15,31,124,240,65,137,234,217,179,182,6,96,143,20,200,150,2,217,6,96,143,60,51,179,237,140, + 25,51,74,120,60,30,182,110,221,234,158,255,159,162,219,22,65,8,233,68,8,57,65,8,185,10,32,111,214,188,69,179,66,186,116,55,59,89,187,1, + 76,32,132,252,12,160,206,17,103,43,127,9,38,172,26,53,202,219,195,198,166,16,177,177,101,168,205,47,161,20,234,115,231,202,248,64,246,196,206,157, + 189,0,76,104,72,115,218,138,169,222,14,238,162,194,120,196,150,153,157,172,151,36,65,113,86,118,172,76,224,32,204,238,53,181,187,37,154,147,38,77, + 250,216,211,214,214,173,48,41,137,150,213,97,38,174,92,209,148,41,149,188,172,14,29,38,248,0,24,223,128,166,149,223,137,37,190,200,255,51,87,170, + 28,171,134,108,58,93,149,168,116,94,213,10,196,211,230,29,213,142,86,149,39,89,239,220,163,131,147,83,167,182,109,219,226,214,173,91,8,14,14,190, + 43,22,139,13,28,30,15,28,30,15,212,212,240,143,90,27,129,32,108,192,128,1,172,59,119,238,192,207,207,15,54,54,54,224,114,185,224,112,56,213, + 27,159,207,135,135,135,7,100,50,25,194,194,194,216,54,2,65,88,131,194,0,158,165,61,17,22,223,249,108,206,143,63,237,254,246,208,161,131,54,77, + 154,52,129,157,157,29,156,156,156,224,236,236,140,166,77,155,86,78,1,233,169,204,18,61,163,209,104,100,50,153,240,243,243,195,134,13,27,176,123,247, + 110,92,185,114,5,39,78,156,192,146,37,75,208,185,115,103,60,121,242,4,177,177,177,176,228,23,142,157,72,244,198,196,137,19,185,181,237,211,104,52, + 144,74,165,144,74,165,144,72,36,200,207,207,71,247,238,221,185,118,34,209,27,117,233,105,248,252,113,123,247,238,117,229,114,185,48,153,76,144,203,229, + 200,201,201,65,108,108,172,250,216,177,99,138,211,167,79,171,174,95,191,174,190,117,235,22,5,0,153,76,6,66,8,134,15,31,238,84,193,229,78,180, + 228,28,88,169,228,60,160,9,210,106,71,116,237,210,37,46,35,35,3,239,189,247,30,198,77,154,244,153,45,208,190,161,99,51,94,113,96,232,179,103, + 193,58,96,79,49,144,93,12,100,235,128,61,134,204,204,224,154,14,76,70,35,29,24,0,176,19,137,58,123,120,120,224,226,197,139,200,201,202,90,158, + 8,52,170,8,52,131,201,236,21,26,26,138,19,39,78,224,249,179,103,203,139,129,226,87,219,20,3,197,217,25,25,203,119,239,222,141,65,131,6,129, + 201,98,245,106,164,153,139,40,165,35,40,165,161,148,82,183,93,219,191,194,153,227,135,205,78,214,28,74,233,93,74,233,116,74,233,147,70,234,90,249, + 19,33,98,50,223,24,214,189,187,189,113,251,118,55,253,185,115,28,42,149,222,1,33,6,243,126,10,24,158,74,36,119,98,211,211,57,185,7,14,52, + 27,212,162,133,200,22,168,243,179,14,0,56,34,246,27,161,195,122,218,159,213,29,117,123,170,74,227,232,140,218,59,64,13,77,66,12,164,132,125,71, + 243,76,207,57,254,226,80,179,86,131,90,136,24,182,245,107,178,217,162,193,189,122,13,183,143,138,50,185,93,188,104,226,200,229,52,22,64,181,166,201, + 68,13,169,169,79,239,156,59,119,135,243,203,47,47,154,251,249,13,20,1,194,122,87,228,90,249,253,88,226,139,252,47,168,10,136,175,243,187,158,82, + 154,79,41,253,161,198,86,29,109,219,168,17,45,87,87,87,47,161,80,136,188,188,60,4,181,106,85,196,227,241,192,101,179,193,231,214,234,63,188,134, + 74,165,10,246,244,244,132,84,42,133,179,179,243,75,14,86,77,135,203,206,206,14,12,6,3,77,154,52,129,74,165,10,110,80,183,240,137,235,193,175, + 231,191,123,251,234,217,230,99,198,140,133,131,131,35,124,124,188,225,234,234,10,27,27,27,248,248,248,160,69,139,22,116,203,150,45,176,117,109,119,215, + 18,91,107,58,79,44,22,11,70,163,17,133,133,133,72,73,73,65,124,124,60,110,223,190,141,135,15,31,66,46,151,195,146,145,100,85,69,69,123,22, + 235,245,193,52,141,70,3,137,68,2,137,68,82,237,104,21,23,23,35,59,59,27,10,165,178,67,93,122,14,78,78,99,219,182,109,203,4,0,27,27, + 27,116,232,208,1,219,183,111,55,156,60,118,108,82,235,219,183,29,125,206,157,19,255,248,253,247,147,198,143,31,111,188,115,231,14,100,50,25,146,146, + 146,224,226,226,194,226,242,249,86,71,171,145,60,0,148,206,114,249,144,30,61,122,100,74,165,82,108,222,188,153,193,182,179,251,33,18,168,117,202,177, + 26,38,179,167,217,129,201,123,246,108,197,179,90,28,152,103,64,113,78,70,198,10,179,3,67,88,172,70,7,42,117,235,214,173,173,201,100,194,227,199, + 143,33,6,98,27,123,124,11,127,255,16,243,200,175,121,186,176,54,4,192,245,184,184,56,216,216,216,32,168,117,235,142,141,124,153,45,132,144,252,217, + 111,191,135,232,95,111,2,0,118,255,240,117,33,42,157,44,235,84,246,223,4,54,208,203,213,215,23,52,59,27,208,233,132,134,235,215,187,25,111,222, + 44,2,144,86,76,105,218,173,236,236,162,188,194,194,110,148,82,161,54,63,31,158,206,206,96,3,245,58,237,12,54,163,151,143,155,15,10,76,47,96, + 132,65,152,173,201,232,246,66,157,93,196,164,172,52,27,165,93,26,205,36,69,21,210,138,110,148,82,97,145,54,31,206,158,206,0,187,1,77,6,21, + 31,142,147,0,0,32,0,73,68,65,84,167,135,143,143,43,242,242,40,244,122,8,111,222,164,93,99,99,105,17,165,36,77,42,45,78,139,137,185,89, + 148,154,250,162,27,165,84,248,252,185,6,142,142,158,0,26,253,227,194,74,35,249,179,141,104,209,87,74,240,212,149,83,171,230,104,86,141,81,45,0, + 53,28,45,11,95,16,0,192,102,179,193,229,241,192,229,114,43,29,36,30,207,98,13,66,8,248,124,126,181,99,85,211,193,170,249,191,173,173,173,69, + 14,12,0,148,167,255,218,123,206,91,179,185,60,30,15,90,173,6,148,82,240,120,124,136,197,98,248,249,249,65,38,147,161,71,207,62,154,92,9,231, + 148,83,208,232,248,198,244,217,140,193,96,128,82,169,68,121,121,57,202,202,202,32,147,201,80,81,81,97,241,82,116,147,201,196,204,205,205,197,129,3, + 7,80,90,90,10,160,50,208,218,236,92,153,255,102,102,102,98,223,190,125,200,202,202,2,26,241,254,244,238,221,27,167,78,157,98,246,13,11,219,113, + 193,215,55,239,130,175,111,94,223,176,176,29,39,78,156,96,122,121,121,33,59,59,27,247,239,223,71,121,121,185,69,201,215,172,188,206,83,160,92,85, + 86,54,123,213,170,85,84,40,20,98,243,231,159,183,95,15,76,169,239,152,154,14,140,168,30,7,70,244,251,28,24,80,74,97,50,153,96,52,90,148, + 197,228,53,8,33,132,205,102,55,54,181,130,197,141,107,6,190,47,251,120,3,206,28,63,108,222,149,102,117,178,254,94,24,1,38,209,235,81,115,202, + 208,32,151,35,249,248,113,156,42,40,64,69,205,207,117,74,1,157,14,166,6,126,176,80,35,101,26,97,4,106,76,25,170,141,106,92,76,60,135,138, + 251,6,152,180,53,218,130,66,15,29,168,169,129,31,65,160,12,131,129,188,52,179,41,147,25,241,227,143,41,120,244,232,36,76,166,255,12,10,87,153, + 9,128,54,234,59,211,202,63,7,243,72,214,171,255,3,85,171,14,171,60,200,234,191,117,81,88,88,248,66,169,84,54,247,245,245,197,243,231,207,93, + 155,52,105,242,140,203,102,131,195,229,130,48,26,190,254,108,109,109,31,231,229,229,245,244,242,242,130,193,96,168,118,170,216,108,118,245,198,225,112,0, + 84,142,210,60,124,248,16,182,182,182,143,161,174,55,115,2,140,218,242,166,29,59,118,172,30,25,170,12,86,23,129,199,227,99,245,234,213,166,173,91, + 182,108,107,210,63,82,250,230,226,85,116,213,250,29,13,218,217,24,44,253,98,178,181,181,125,236,227,227,211,93,36,18,33,58,58,26,217,217,217,40, + 47,47,135,74,165,130,70,163,129,74,165,130,86,171,5,159,207,71,235,214,173,97,111,111,143,152,152,152,199,208,104,106,213,43,47,45,141,126,252,248, + 113,247,46,93,186,84,127,152,244,235,215,143,244,235,215,207,217,252,88,165,82,161,164,164,4,119,239,222,69,76,76,12,8,33,72,75,75,51,106,42, + 42,126,249,189,253,254,167,162,6,110,49,119,239,222,245,206,59,239,188,213,179,103,79,24,129,161,0,246,213,213,254,191,237,192,152,185,125,251,246,19, + 163,209,216,179,101,203,150,144,0,93,1,28,111,204,241,79,211,211,227,12,6,67,88,251,246,237,17,29,21,213,27,64,173,43,182,148,64,239,144,144, + 16,84,84,84,32,41,49,241,129,37,218,181,5,190,239,254,225,235,220,93,219,191,242,129,5,241,99,86,254,90,24,129,219,133,105,105,19,221,189,188, + 64,37,18,69,161,193,144,148,94,84,212,145,154,76,158,42,153,12,169,132,24,236,249,252,88,47,141,38,200,198,217,89,152,147,155,11,35,112,187,62, + 77,147,129,222,206,40,120,58,209,201,213,13,114,42,87,148,23,151,39,165,102,165,116,52,81,147,167,172,66,6,146,69,12,124,1,63,214,232,166,9, + 114,228,56,11,115,115,114,65,140,13,104,154,116,119,51,50,10,125,93,93,221,32,147,81,69,105,105,65,82,74,74,122,71,163,145,122,202,100,42,16, + 146,106,224,243,237,99,53,26,175,32,87,87,91,225,139,23,185,0,244,141,30,45,182,98,57,150,250,34,255,159,88,154,176,180,170,237,75,1,241,102, + 26,229,157,75,203,203,31,196,197,197,161,99,199,142,120,250,244,105,23,106,50,177,56,92,46,184,28,14,24,22,124,145,84,40,149,23,47,94,188,104, + 232,208,161,3,20,10,5,88,44,214,75,163,89,92,46,23,108,54,187,122,213,220,209,163,71,117,21,74,229,197,134,116,77,70,147,145,193,96,84,127, + 153,73,36,18,168,84,21,216,176,97,3,190,217,178,101,170,17,88,204,22,184,52,42,102,229,143,70,173,82,93,58,115,230,140,190,121,243,230,152,53, + 107,22,22,47,94,140,197,139,23,227,157,119,222,193,172,89,179,48,125,250,116,140,25,51,6,93,187,118,133,139,139,11,82,82,82,244,106,149,234,82, + 93,122,60,181,250,200,204,153,51,139,204,14,154,82,169,132,92,46,135,84,42,69,113,113,49,110,222,188,137,189,123,247,98,203,150,45,56,122,244,40, + 52,26,13,116,58,29,30,62,124,88,46,208,235,163,254,63,251,254,119,131,13,68,223,184,113,3,142,142,142,240,244,246,238,83,95,219,42,7,6,237, + 219,183,135,20,232,93,87,59,233,111,112,96,106,162,148,203,239,101,102,102,162,111,223,190,240,240,246,254,172,53,96,211,152,227,141,6,195,245,27,55, + 110,96,198,140,25,240,109,222,252,51,23,192,229,213,54,46,128,75,179,22,45,62,155,53,107,22,206,159,63,15,163,193,80,231,8,221,43,129,239,217, + 214,192,247,127,14,50,163,49,230,220,221,187,229,134,161,67,115,238,20,21,233,210,138,139,187,82,147,233,63,113,19,148,178,100,106,117,215,68,64,199, + 236,219,55,229,114,102,102,169,10,168,183,136,176,94,174,143,185,121,238,118,121,8,237,150,115,239,193,61,93,114,102,82,87,19,253,143,38,5,101,85, + 40,213,93,117,25,208,117,99,247,77,73,187,156,89,106,82,53,160,169,151,93,186,117,235,92,89,151,46,134,156,216,216,219,186,196,196,180,174,70,35, + 253,143,38,5,75,173,150,117,165,52,81,215,171,23,35,37,43,235,114,41,80,247,103,178,149,191,31,102,39,203,60,101,104,14,138,175,122,254,213,182, + 243,204,127,127,215,212,161,141,209,184,242,195,15,63,212,51,24,12,140,29,59,214,238,248,137,19,227,31,62,122,228,87,84,84,36,54,26,141,13,106, + 185,104,52,95,125,248,225,135,18,173,86,139,192,192,64,148,149,149,193,104,52,130,197,98,129,197,98,129,16,2,6,131,1,161,80,136,184,184,56,236, + 218,181,75,230,162,209,124,213,144,174,209,104,124,188,111,223,62,48,153,76,202,231,243,65,8,1,139,197,194,214,173,91,139,190,1,162,1,128,201,96, + 104,1,128,193,248,79,0,101,3,52,56,111,105,14,68,183,164,173,131,70,243,229,166,77,155,228,73,73,73,80,42,149,213,163,111,10,133,2,50,153, + 172,250,49,33,4,74,165,18,39,78,156,144,59,104,52,95,214,165,87,10,20,60,79,75,27,217,165,75,151,210,204,204,76,72,165,82,60,126,252,24, + 49,49,49,56,116,232,16,206,159,63,143,244,244,116,24,12,6,120,121,121,129,82,138,99,199,142,73,13,114,249,208,82,160,192,194,115,240,143,164,169, + 187,123,152,155,171,107,142,139,179,243,243,166,238,238,175,45,198,16,1,169,169,169,169,48,24,12,240,243,243,115,172,47,78,139,26,12,55,204,14,140, + 79,243,230,27,125,107,113,96,124,1,23,223,22,45,54,154,29,24,106,48,220,104,172,205,118,192,215,75,151,46,173,224,112,56,56,120,240,160,159,222, + 223,63,153,5,76,17,2,173,250,2,156,134,142,247,0,182,125,252,241,199,5,132,16,252,252,243,207,206,162,22,45,158,176,128,153,34,160,169,8,104, + 202,2,102,138,90,180,120,114,240,224,65,103,131,193,128,197,139,23,23,120,0,219,234,145,172,25,248,238,99,13,124,255,71,177,119,249,177,99,229,241, + 105,105,62,246,131,7,59,214,58,219,65,8,188,186,119,119,76,45,46,110,185,253,201,19,41,128,189,13,105,238,90,185,175,252,209,147,135,62,161,162, + 48,71,6,121,93,147,128,160,179,123,119,199,194,244,226,150,247,183,91,166,185,119,239,135,210,184,184,39,62,253,251,219,59,50,24,175,15,22,16,2, + 244,232,225,229,88,92,156,218,242,201,147,237,229,168,103,244,218,202,223,18,115,86,248,62,64,165,227,85,215,10,196,87,2,225,95,154,58,36,181,197, + 65,177,187,174,47,4,168,107,159,110,237,112,239,81,138,212,217,193,254,156,121,95,89,194,225,150,253,131,237,219,125,251,237,183,96,179,217,200,205,205, + 69,98,98,34,236,237,237,49,117,234,84,77,133,92,62,210,92,235,144,16,50,128,82,26,83,165,89,89,79,77,154,38,108,193,138,111,254,235,153,83, + 76,145,72,4,133,66,1,6,131,1,62,159,15,91,91,91,216,216,216,224,254,253,251,24,54,98,148,177,216,54,180,58,97,169,185,158,90,77,77,115, + 158,162,174,128,109,28,240,129,171,167,231,135,31,125,244,145,205,224,193,131,193,225,112,224,221,52,160,192,111,200,230,175,25,12,98,120,94,42,91,221, + 162,169,167,40,49,45,27,0,169,172,137,88,149,167,168,54,59,155,104,175,250,29,221,179,197,190,67,135,202,120,116,137,68,130,194,194,66,20,21,21, + 65,34,145,64,169,84,2,0,78,157,58,133,51,215,146,101,21,222,227,51,234,178,243,63,125,79,177,243,212,197,54,219,191,111,15,211,197,197,5,133, + 133,133,40,46,46,134,68,34,65,69,69,5,140,70,35,202,202,202,176,115,247,30,99,169,48,52,203,156,16,178,94,77,101,174,141,163,226,166,87,72, + 107,95,250,214,91,111,217,217,219,219,195,100,50,161,188,188,28,57,57,57,200,204,204,196,181,107,215,148,69,18,45,148,206,3,159,155,19,150,214,122, + 62,255,32,254,146,154,53,242,104,121,122,120,228,61,123,246,204,213,104,52,194,203,203,203,32,41,43,219,200,5,206,219,1,249,0,104,9,240,209,151, + 95,127,61,123,212,168,81,232,220,185,115,110,65,97,97,179,218,174,37,16,194,12,4,68,42,111,239,132,187,119,239,186,231,228,228,96,198,140,25,37, + 207,158,62,93,97,142,215,146,2,189,125,91,180,216,120,240,224,65,231,230,205,155,35,56,56,184,128,159,147,211,38,165,50,63,85,109,215,103,157,247, + 166,36,245,116,179,249,99,218,118,126,247,221,119,97,48,24,112,237,218,53,196,198,198,226,217,179,103,184,121,243,166,196,94,32,152,100,174,117,88,215, + 245,57,52,64,233,247,243,207,251,8,135,195,193,238,221,187,17,23,23,7,0,8,9,9,193,172,89,179,96,48,24,48,109,218,116,122,58,197,38,163, + 190,235,147,16,210,22,192,231,168,116,242,58,83,74,249,132,144,60,0,62,141,137,201,250,75,94,75,86,77,16,66,218,121,139,197,167,15,207,158,237, + 33,98,50,137,228,214,45,104,243,242,144,32,149,194,214,213,21,78,109,219,66,170,215,211,15,99,98,242,138,85,170,225,148,210,120,75,52,29,189,197, + 167,231,31,158,237,193,17,49,201,61,201,45,20,104,243,80,250,84,10,23,190,43,130,156,218,66,39,209,211,147,139,99,242,148,133,22,107,182,23,139, + 125,78,206,158,125,208,147,201,116,32,183,110,73,144,151,167,133,84,154,0,55,55,91,4,7,59,67,173,46,167,151,46,45,123,161,82,21,13,161,148, + 38,53,164,249,123,249,39,107,254,217,48,231,204,170,235,111,45,237,171,71,177,94,139,209,122,149,154,245,212,214,125,7,209,203,101,62,230,230,29,222, + 30,201,234,213,59,180,85,228,154,8,70,151,46,93,224,227,227,131,144,144,16,228,228,228,240,196,98,113,67,245,212,20,161,67,166,100,182,107,215,78, + 188,98,197,10,209,160,65,131,216,62,62,62,160,148,34,46,46,14,209,209,209,186,29,59,118,200,84,110,35,36,15,46,31,80,88,82,79,45,22,80, + 1,88,235,157,151,247,195,130,249,243,35,58,116,236,248,214,154,53,107,24,66,91,27,246,134,213,115,248,0,176,238,223,135,68,163,198,79,197,151,254, + 64,159,41,181,215,145,171,105,103,206,243,185,207,222,24,19,230,255,193,194,217,198,137,19,39,10,236,237,237,225,227,227,3,7,7,7,100,100,100,224, + 249,243,231,244,228,201,147,138,219,15,83,217,199,206,223,123,198,23,121,88,82,151,80,30,58,120,66,214,27,111,188,225,48,115,230,76,187,78,157,58, + 177,121,60,30,120,60,30,10,11,11,145,158,158,174,59,121,242,164,66,229,58,180,252,193,229,131,114,11,107,29,86,132,78,142,76,191,126,97,205,226, + 132,199,143,167,155,128,246,58,157,206,203,104,52,18,6,131,145,111,50,153,30,235,228,242,93,154,144,53,91,173,181,14,45,195,104,52,114,140,70,35, + 36,18,9,46,92,184,192,122,250,244,233,71,143,30,61,250,40,47,47,15,122,189,30,227,198,141,67,72,72,8,46,95,190,140,226,194,194,147,245,105, + 165,0,82,222,243,231,179,230,206,157,123,118,223,190,125,140,71,143,30,57,239,222,189,123,103,109,14,204,244,233,211,77,133,57,57,179,52,128,180,46, + 189,6,238,205,146,95,15,126,243,104,244,216,241,173,215,132,127,196,238,209,163,7,156,157,157,209,187,119,111,232,116,58,113,80,80,80,67,247,166,60, + 116,200,164,140,246,237,219,11,182,110,221,234,62,123,246,108,44,92,184,16,0,80,81,81,129,243,231,207,99,241,226,197,5,57,172,174,202,134,174,207, + 170,145,42,179,3,118,21,64,40,128,12,107,224,251,63,3,74,105,60,33,100,240,176,173,91,163,231,245,232,225,212,43,32,192,193,187,103,79,180,80, + 40,144,155,151,135,99,169,169,229,209,9,9,165,114,96,44,165,52,177,49,154,159,13,219,26,29,58,175,135,83,203,94,1,14,157,189,123,66,102,84, + 224,69,78,30,18,143,164,150,199,69,37,148,82,121,163,52,31,17,66,134,108,221,58,34,186,71,143,121,78,1,1,125,29,122,245,242,132,92,238,143, + 188,188,92,36,38,30,45,75,74,138,46,3,228,99,95,117,178,172,252,163,48,151,225,169,51,237,68,125,9,75,27,172,117,120,61,246,9,106,150,249, + 168,196,35,209,208,100,230,211,183,63,220,24,204,212,203,28,216,68,109,159,150,154,74,26,170,121,88,93,79,77,20,160,112,202,252,165,203,134,117,235, + 222,251,242,203,47,195,204,41,28,108,109,109,31,87,40,149,23,93,52,154,175,84,162,128,139,141,173,205,247,28,40,4,48,223,225,193,131,175,135,143, + 26,183,137,239,232,199,94,181,126,135,154,201,96,104,211,243,138,241,165,63,32,176,96,129,164,74,11,36,72,60,12,133,78,227,83,62,94,186,244,131, + 117,107,215,118,17,10,133,125,116,6,67,128,201,100,2,76,166,52,149,82,121,149,234,116,119,53,33,225,91,248,34,15,106,113,93,66,113,144,220,49, + 235,112,151,159,118,237,90,20,21,21,245,90,223,157,52,154,175,85,226,160,24,75,250,94,179,141,26,184,133,162,162,91,117,181,37,176,214,58,180,20, + 150,201,52,207,193,193,97,111,88,88,24,127,192,128,1,24,54,108,24,122,244,232,1,147,201,4,74,41,228,114,57,14,29,58,132,77,155,54,165,53, + 3,214,54,164,167,1,46,242,206,156,25,218,190,125,251,221,245,57,48,85,78,86,131,49,137,245,223,155,188,52,131,104,100,246,228,5,27,252,181,178, + 124,177,147,173,193,61,225,201,99,134,229,247,102,160,220,24,119,168,235,184,49,99,22,48,89,172,222,85,43,32,105,82,98,226,3,115,81,105,132,204, + 186,208,200,107,201,156,187,206,26,248,254,15,130,82,154,72,8,9,218,112,227,198,84,219,91,183,6,178,40,237,105,160,20,70,224,166,6,184,0,96, + 63,165,212,210,80,142,151,52,47,110,184,49,245,138,237,173,129,148,69,123,82,3,5,49,225,166,73,253,251,52,111,220,216,48,237,214,173,175,6,82, + 202,238,70,169,209,4,24,238,0,234,11,0,14,52,86,211,202,223,134,190,53,70,175,8,80,57,202,133,70,230,249,170,179,214,161,121,212,135,197,98, + 21,153,203,124,212,5,27,8,171,26,201,66,131,181,14,171,254,207,6,228,208,104,62,129,70,243,73,117,163,26,171,11,217,175,180,111,76,167,202,129, + 20,24,52,195,81,148,8,156,152,95,169,215,101,221,242,154,125,170,235,216,151,237,228,148,169,129,235,80,40,174,67,161,216,92,107,223,89,156,178,134, + 236,124,181,239,57,128,236,247,246,253,85,205,58,79,198,111,108,255,79,230,69,73,201,49,0,66,239,83,167,220,126,61,117,106,226,7,75,150,140,243, + 240,244,108,225,236,236,236,96,103,103,199,184,115,231,78,166,65,173,254,186,3,240,83,213,104,106,131,104,128,139,129,57,57,109,38,140,25,179,128,176, + 88,189,106,58,48,212,96,184,233,7,108,171,111,36,203,76,99,239,77,31,158,71,88,213,72,22,152,22,222,155,207,43,237,88,15,131,97,61,226,95, + 207,134,242,27,238,205,117,132,16,57,128,90,239,33,43,127,95,170,28,148,61,85,219,159,93,243,167,170,205,138,21,0,149,117,14,9,33,213,69,165, + 171,168,117,213,33,173,172,115,88,235,212,33,40,165,255,181,13,192,0,171,166,85,243,239,162,137,202,160,119,251,63,187,157,86,77,171,166,85,211,170, + 249,87,212,252,187,110,214,228,107,86,172,88,8,165,212,72,169,101,37,156,172,88,177,98,197,202,63,151,154,163,91,4,192,128,218,26,209,70,172,38, + 32,132,212,170,81,31,13,233,91,53,173,154,86,77,171,166,85,211,170,105,213,252,251,105,54,164,221,24,255,227,207,74,205,96,248,90,211,59,252,129, + 47,244,151,88,82,106,213,180,106,90,53,173,154,86,77,171,166,85,243,127,171,249,87,166,230,8,150,25,179,163,101,157,58,180,98,197,138,21,0,145, + 145,132,81,153,162,50,146,1,28,102,2,19,152,149,143,127,59,19,38,144,90,147,217,46,154,230,104,247,123,116,173,88,177,242,231,130,214,147,176,180, + 206,244,14,86,254,251,16,66,154,184,187,187,111,7,64,10,10,10,230,81,74,115,254,215,54,89,121,29,39,39,167,48,131,193,0,169,84,218,96,234, + 133,191,34,109,252,201,24,202,64,80,245,19,20,57,137,105,180,214,172,218,173,3,200,12,144,255,228,226,34,38,36,37,164,211,163,150,190,22,33,132, + 49,116,128,207,54,0,56,27,147,187,128,254,23,242,106,17,66,90,186,184,184,156,99,177,88,44,163,209,56,191,176,176,240,84,93,109,39,76,152,192, + 4,0,54,189,188,210,217,177,213,138,247,223,33,108,149,102,151,68,83,161,148,50,217,204,44,30,219,253,6,152,94,103,203,21,221,107,205,203,20,21, + 21,85,103,21,239,182,1,100,104,171,214,173,71,116,12,182,201,248,252,171,46,95,246,241,115,102,103,230,62,20,126,246,189,116,187,189,99,211,17,51, + 39,57,157,98,217,146,233,59,119,150,40,234,210,248,171,179,129,16,87,19,139,213,134,201,229,122,83,189,222,141,0,70,6,155,93,168,85,169,158,171, + 129,248,79,41,149,52,86,243,83,66,28,117,64,48,155,199,243,49,26,12,110,4,160,76,22,171,80,175,209,228,114,128,248,21,255,0,77,14,143,231, + 109,52,24,220,0,224,207,104,231,63,17,66,136,7,128,97,53,159,163,13,229,209,178,179,179,187,207,96,48,188,73,141,31,116,140,170,82,10,230,231, + 106,238,35,132,192,104,52,62,47,43,43,235,212,8,195,236,1,76,4,96,94,162,190,31,192,161,223,26,112,76,8,177,231,112,56,31,10,4,130,254, + 21,21,21,109,0,192,198,198,38,65,169,84,94,210,233,116,159,255,22,93,66,8,11,192,4,161,80,216,143,193,96,244,163,149,245,142,46,43,20,138, + 75,0,162,232,111,200,175,66,8,177,113,117,117,93,223,170,85,171,41,43,87,174,44,117,114,114,10,92,188,120,241,61,23,23,151,3,37,37,37,171, + 41,165,255,211,186,140,102,8,33,45,220,221,221,247,179,217,108,102,110,110,110,63,0,240,241,241,185,172,213,106,141,69,69,69,83,41,165,79,27,169, + 39,0,208,77,40,20,118,18,10,133,161,70,163,49,200,100,50,193,100,50,37,41,20,138,107,58,157,238,62,128,59,148,82,229,127,163,63,191,5,66, + 136,157,171,171,235,62,66,8,8,33,1,148,82,249,255,218,166,63,26,202,64,80,98,66,114,160,249,113,235,54,173,234,110,76,208,164,150,182,22,59, + 90,253,251,120,140,24,57,114,32,3,0,180,250,179,35,208,200,226,215,13,65,8,105,57,118,236,216,91,251,246,237,115,208,104,52,152,55,111,222,126, + 145,72,180,77,42,149,174,172,239,56,123,161,195,226,205,91,207,219,86,214,191,134,171,201,100,116,125,241,226,105,64,226,147,91,67,18,18,110,111,168, + 72,190,116,199,68,216,111,235,208,59,217,18,59,90,183,32,195,71,77,24,51,108,237,218,53,152,50,105,74,211,132,4,181,141,151,125,6,183,172,66, + 224,239,228,226,58,114,237,186,195,228,198,245,99,35,247,237,142,188,244,214,91,206,253,255,110,206,86,36,33,12,38,139,213,199,53,36,164,203,164,99, + 199,136,173,187,59,147,193,98,49,0,192,164,211,53,145,61,123,230,181,239,141,55,186,126,66,200,229,112,224,30,181,32,134,133,16,66,214,177,88,221, + 28,90,181,10,157,116,236,24,132,62,62,44,22,143,199,0,0,131,70,227,163,200,205,245,56,56,114,100,215,72,66,174,68,80,106,81,241,103,171,230, + 31,171,249,15,103,24,173,74,241,64,95,41,44,93,167,163,197,96,48,188,95,188,120,225,42,16,8,0,84,166,129,48,26,141,48,26,141,168,250,114, + 4,165,180,250,175,193,96,64,171,86,245,124,64,87,65,42,63,201,250,3,120,179,111,223,190,227,63,255,252,115,118,112,112,176,185,100,72,239,85,171, + 86,253,155,16,114,4,149,249,76,46,90,250,139,151,16,50,88,32,16,252,188,121,243,102,251,129,3,7,178,60,61,61,65,8,65,65,65,65,183,152, + 152,152,78,139,23,47,158,79,8,153,70,41,61,215,176,90,181,102,91,59,59,187,195,99,198,140,241,238,211,167,15,63,40,40,8,38,147,9,15,31, + 62,156,125,255,254,253,201,71,142,28,137,32,132,140,167,22,214,107,35,132,16,161,80,56,211,203,203,107,125,120,120,184,227,180,105,211,184,79,158,60, + 41,247,243,243,35,55,110,220,112,57,116,232,208,252,141,27,55,78,176,179,179,91,173,80,40,246,88,242,225,99,111,111,127,159,193,96,120,3,13,59, + 194,0,44,118,134,9,33,29,154,53,107,118,232,250,245,235,205,178,179,179,141,163,71,143,222,11,0,151,46,93,10,214,235,245,100,208,160,65,103,9, + 33,19,41,165,15,45,236,123,59,71,71,199,227,83,166,76,113,108,209,162,133,109,179,102,205,136,64,32,0,147,201,132,84,42,245,76,72,72,24,112, + 231,206,157,138,152,152,152,50,66,200,72,250,74,249,140,6,180,123,184,186,186,78,103,179,217,109,13,6,131,23,0,176,88,172,23,122,189,254,73,81, + 81,209,62,74,105,157,137,92,27,194,205,205,237,155,245,235,215,59,23,21,21,209,141,27,55,126,3,96,230,111,213,250,179,179,255,64,20,238,223,139, + 5,0,142,185,198,68,205,253,132,16,18,20,0,206,251,239,47,65,167,206,93,49,117,202,132,6,53,135,13,240,217,204,230,114,156,212,106,245,45,169, + 74,19,229,230,36,158,56,101,242,240,52,0,56,251,235,149,137,93,187,58,94,22,217,242,38,240,249,252,30,122,173,174,244,116,76,238,82,75,237,37, + 132,180,244,242,242,58,231,224,224,96,91,86,86,86,80,92,92,252,221,216,177,99,215,253,244,211,79,14,153,153,153,200,205,205,197,123,239,189,39,124, + 254,252,249,2,30,143,119,91,163,209,212,57,178,37,151,151,125,181,106,197,168,112,145,200,153,41,176,181,135,157,200,17,126,45,218,163,91,143,17,24, + 58,236,45,164,167,197,117,251,105,247,218,184,23,47,98,62,21,58,54,95,39,145,52,171,243,115,169,77,32,233,99,118,178,194,195,215,32,53,57,89, + 158,157,197,248,215,233,99,44,219,161,97,173,120,6,109,65,246,141,235,199,154,245,234,61,26,0,58,237,219,29,121,105,209,52,199,176,175,127,46,251, + 91,56,241,19,8,97,182,99,179,223,26,249,211,79,226,160,73,147,56,146,132,4,109,234,129,3,154,130,152,24,35,95,44,54,121,188,241,6,211,45, + 44,140,183,40,45,141,115,109,253,250,208,245,235,214,53,7,112,160,62,77,66,8,89,203,102,207,28,188,117,171,107,200,252,249,28,69,86,150,46,227, + 251,239,85,133,215,174,25,89,60,30,245,25,50,132,184,244,235,199,159,159,148,196,185,185,113,99,232,6,46,215,111,149,86,251,179,85,243,255,79,211, + 10,78,147,26,133,165,1,11,70,180,8,33,16,8,4,56,120,240,32,216,108,54,88,44,22,216,108,118,157,255,55,105,242,90,101,143,218,52,199,186, + 187,187,255,123,219,182,109,110,131,7,15,6,159,207,175,222,199,100,50,49,112,224,64,12,24,48,128,157,151,151,55,249,224,193,131,147,55,108,216,80, + 72,8,89,72,41,141,110,64,183,95,96,96,96,244,249,243,231,109,212,106,53,174,93,187,134,242,242,114,112,185,92,120,123,123,99,208,160,65,172,228, + 228,100,199,129,3,7,70,19,66,134,83,74,47,91,96,107,39,23,23,151,171,71,142,28,225,183,107,215,142,164,167,167,35,36,36,4,0,32,149,74, + 49,122,244,104,254,180,105,211,90,76,154,52,233,14,169,44,52,121,191,1,189,142,238,238,238,123,198,140,25,227,185,97,195,6,123,59,59,59,100,103, + 103,231,187,187,187,7,152,207,247,228,201,147,185,35,70,140,240,216,180,105,211,87,135,15,31,94,74,8,153,73,41,125,80,159,174,217,33,182,181,181, + 69,97,97,33,246,239,223,143,5,11,22,128,201,100,162,168,168,8,135,14,29,194,191,254,245,47,179,67,99,145,51,44,16,8,6,180,111,223,126,231, + 165,75,151,188,197,98,49,60,61,61,25,31,127,252,113,91,63,63,63,155,166,77,155,50,243,243,243,17,29,29,237,55,125,250,244,227,124,62,127,182, + 90,173,110,112,74,205,205,205,109,215,233,211,167,155,36,36,36,224,251,239,191,71,89,89,25,184,92,46,196,98,49,220,221,221,17,16,16,64,86,172, + 88,97,59,98,196,8,219,133,11,23,238,2,208,161,33,77,66,72,123,87,87,215,237,147,39,79,246,139,140,140,20,187,187,187,195,252,195,64,42,149, + 122,103,103,103,119,11,15,15,31,239,230,230,150,89,84,84,244,54,165,244,81,131,157,127,89,191,67,88,88,216,240,209,163,71,51,243,243,243,177,111, + 223,190,225,132,144,14,150,58,151,127,53,238,223,139,197,188,119,223,83,120,250,248,112,206,159,219,57,86,34,105,125,79,108,83,89,144,90,82,1,93, + 255,62,204,206,131,6,191,197,121,99,216,104,197,15,223,126,37,180,196,209,98,115,57,78,251,127,254,34,231,250,141,251,109,47,196,196,14,25,59,114, + 36,229,112,196,126,0,176,116,241,251,236,232,19,39,118,15,28,208,53,175,119,175,78,57,83,167,45,105,248,67,164,10,66,72,203,150,45,91,94,137, + 139,139,115,227,241,120,40,43,43,115,250,225,135,31,190,232,213,171,23,35,35,35,3,201,201,201,200,202,202,130,84,42,197,192,129,3,133,15,30,60, + 248,14,64,157,142,150,142,209,127,189,103,83,253,215,78,54,130,102,58,163,204,149,234,243,91,95,56,125,161,221,47,251,42,66,220,60,90,5,188,57, + 43,2,107,215,29,97,31,216,255,89,248,197,152,95,0,70,179,186,43,2,80,244,88,181,122,37,100,114,13,166,77,153,139,233,83,230,58,81,104,61, + 168,81,45,208,86,148,139,237,56,73,167,182,237,248,98,12,0,239,26,206,214,197,191,139,179,213,154,197,234,51,250,192,1,81,224,168,81,220,216,133, + 11,21,170,236,108,85,203,17,35,202,125,195,195,181,76,163,17,146,204,76,206,211,136,8,129,67,239,222,252,208,149,43,29,52,197,197,94,145,132,116, + 136,168,231,190,90,203,98,117,29,254,239,127,187,180,157,51,135,247,40,50,82,89,114,237,90,133,255,27,111,148,135,188,243,142,6,0,228,89,89,156, + 212,136,8,91,151,208,80,155,238,31,126,232,96,212,106,221,63,33,164,203,199,148,222,109,172,102,147,137,19,141,225,187,119,119,190,182,100,73,95,162, + 215,51,135,116,239,254,112,227,190,125,47,126,143,230,31,105,103,222,213,171,154,50,63,63,132,140,30,93,218,196,213,85,243,71,246,253,247,216,249,79, + 135,82,154,15,224,135,218,246,17,74,41,78,159,62,221,7,149,213,168,35,135,13,27,182,6,0,196,98,113,161,68,34,113,141,142,142,110,208,201,98, + 179,217,240,240,240,64,64,64,64,81,97,97,161,91,93,134,16,66,114,77,38,147,55,165,180,122,244,165,46,52,26,13,210,210,210,208,174,93,187,231, + 148,82,159,122,52,237,108,109,109,51,146,147,147,157,19,19,19,113,255,254,125,248,249,249,193,193,193,1,108,54,27,122,189,30,50,153,12,129,129,129, + 224,241,120,232,216,177,99,137,82,169,244,171,111,10,136,16,194,19,8,4,105,87,175,94,245,9,9,9,193,221,187,119,225,227,227,3,119,119,119,0, + 64,86,86,22,110,220,184,129,55,222,120,3,113,113,113,24,55,110,92,174,82,169,12,160,148,106,234,210,116,114,114,202,191,116,233,210,243,224,224,96, + 181,82,169,100,20,22,22,178,175,93,187,102,144,203,229,66,169,84,202,150,72,36,108,153,76,198,82,42,149,108,6,131,193,169,168,168,96,95,188,120, + 145,169,213,106,237,235,59,79,230,247,233,196,137,19,8,14,14,70,116,116,52,62,248,224,3,220,188,121,19,62,62,62,136,138,138,194,135,31,126,136, + 148,148,20,56,59,59,163,117,235,214,245,190,71,0,224,239,239,159,254,248,241,227,22,28,14,199,92,215,209,92,47,15,197,197,197,120,250,244,41,94, + 188,120,1,127,127,127,76,153,50,229,233,243,231,207,253,235,211,3,0,111,111,239,226,132,132,4,231,118,237,218,161,176,176,16,98,177,24,34,145,8, + 98,177,184,250,127,63,63,63,44,89,178,4,238,238,238,69,21,21,21,245,218,72,8,233,16,28,28,124,238,226,197,139,206,246,246,246,40,40,40,128, + 76,38,3,139,197,130,173,173,45,156,157,157,171,29,249,180,180,52,12,27,54,172,36,35,35,99,112,35,70,224,24,110,110,110,201,241,241,241,1,148, + 82,228,228,228,32,37,37,5,239,190,251,110,154,90,173,110,245,223,136,45,250,95,81,35,238,138,51,115,214,60,206,152,81,61,180,73,9,167,8,207, + 148,130,14,109,237,165,0,240,240,137,76,164,97,4,34,168,205,112,122,244,248,45,238,158,159,126,96,195,4,55,16,164,36,166,210,79,234,210,30,220, + 223,115,206,251,239,207,110,219,183,87,31,134,92,169,116,253,238,187,173,29,51,50,146,92,1,192,207,47,168,104,254,252,197,15,236,4,130,162,43,55, + 174,154,190,252,114,215,147,115,151,242,118,52,100,47,33,196,47,32,32,224,246,201,147,39,157,93,92,92,32,18,137,160,84,42,161,211,233,144,152,152, + 168,62,120,240,160,222,222,222,222,174,160,160,0,18,137,4,132,16,156,56,113,34,135,82,234,251,170,150,57,70,11,0,222,29,26,196,110,221,63,192, + 129,195,51,216,216,176,83,61,64,140,60,66,133,110,103,207,61,108,119,246,194,221,169,99,198,126,224,210,187,207,24,132,127,52,94,159,151,151,19,162, + 67,239,228,218,98,180,130,2,72,255,209,227,198,76,88,187,118,13,214,132,71,226,212,137,99,82,161,128,161,177,23,179,69,161,255,199,222,121,199,55, + 85,189,127,252,115,178,87,247,222,5,10,180,133,182,172,178,65,70,217,101,137,128,40,42,200,20,17,5,17,65,16,4,7,202,144,37,50,101,131,200, + 198,50,203,22,65,100,211,22,218,50,58,73,155,238,36,109,246,205,61,191,63,218,212,82,211,54,69,253,126,229,251,203,251,245,202,171,201,205,185,159, + 156,115,115,155,251,220,231,60,231,121,58,116,214,205,120,119,72,86,105,169,60,112,209,146,189,175,197,14,153,17,208,165,235,80,92,254,229,48,118,110, + 93,120,131,72,232,11,61,141,184,144,16,111,255,232,232,177,227,174,95,23,92,155,50,165,84,204,231,23,68,77,152,96,181,122,64,78,124,188,76,208, + 176,161,147,115,207,158,110,43,26,53,162,218,130,130,239,23,88,249,93,94,72,136,171,75,72,200,164,105,169,169,130,59,159,125,86,202,200,229,197,209, + 211,167,23,88,211,204,142,143,151,9,253,252,156,92,7,15,118,91,21,28,76,77,121,121,27,172,197,24,89,211,60,227,224,224,242,227,137,19,49,148, + 207,239,54,235,227,143,37,3,7,14,132,74,165,194,129,3,7,176,97,253,122,189,175,175,239,61,191,132,132,91,145,42,213,60,91,53,163,167,79,47, + 48,155,205,100,196,204,153,189,19,211,210,122,230,230,229,53,0,0,95,55,183,172,232,144,144,27,91,226,226,146,215,52,108,200,218,218,207,77,39,79, + 122,239,79,79,31,239,230,230,38,81,228,229,241,68,66,97,97,135,230,205,247,125,63,119,238,5,230,238,93,129,56,32,192,201,121,224,192,122,143,61, + 122,250,244,130,34,181,154,55,237,139,47,58,103,40,20,13,74,245,250,38,37,106,181,143,217,100,226,56,73,165,133,141,194,194,242,180,151,46,229,52, + 210,104,222,223,68,105,141,149,85,254,42,214,108,145,255,5,44,30,173,11,177,177,177,127,90,93,67,41,181,201,155,197,231,243,159,153,166,170,5,1, + 33,4,55,111,222,132,187,187,59,124,124,124,32,18,61,91,124,48,63,63,31,191,254,250,43,238,223,191,143,150,45,91,2,40,191,163,174,9,145,72, + 244,193,146,37,75,92,12,6,3,110,220,184,129,232,232,104,136,68,34,8,4,130,103,140,192,188,188,60,68,68,68,96,214,172,89,206,95,125,245,213, + 7,168,165,70,29,143,199,155,58,97,194,4,47,139,7,43,43,43,11,109,218,180,169,124,223,211,211,19,183,111,223,70,116,116,52,2,2,2,48,124, + 248,112,175,157,59,119,78,5,176,172,38,77,161,80,200,137,138,138,106,11,0,50,153,12,28,14,39,197,201,201,201,211,219,219,91,230,228,228,244,167, + 49,110,221,186,181,132,195,225,152,106,27,59,80,62,93,152,155,155,139,200,200,72,40,149,229,21,92,202,202,202,208,164,73,19,168,84,229,33,105,122, + 189,30,126,126,126,208,106,107,15,253,106,217,178,229,103,225,225,225,125,186,119,239,46,226,243,249,184,115,231,14,90,183,110,141,189,123,247,34,40,40, + 8,82,169,20,169,169,169,136,138,138,194,197,139,23,225,233,233,137,136,136,8,81,155,54,109,126,41,42,42,58,159,158,158,254,89,45,253,228,56,56, + 56,224,226,197,139,216,178,101,11,210,210,210,32,151,203,225,232,232,136,86,173,90,161,121,243,230,232,212,169,19,82,83,83,65,234,56,153,8,33,62, + 77,155,54,141,251,253,247,223,61,40,165,216,185,115,39,74,75,75,97,48,24,192,225,112,32,22,139,225,234,234,138,158,61,123,194,211,211,19,77,155, + 54,197,79,63,253,228,209,191,127,255,227,21,30,169,220,186,142,171,171,171,235,251,11,22,44,8,244,242,242,66,122,122,58,148,74,37,188,189,189,209, + 189,123,119,255,51,103,206,188,15,96,69,93,26,47,10,150,192,119,66,8,57,125,234,135,97,77,27,21,71,181,12,147,6,30,140,243,14,220,27,151, + 23,1,0,164,219,124,119,0,0,32,0,73,68,65,84,145,205,188,19,135,13,148,102,221,73,140,203,58,125,234,240,141,251,41,56,104,203,212,182,82, + 163,223,23,127,230,90,191,214,45,219,176,75,190,153,25,251,238,148,241,34,47,239,113,80,100,30,198,153,115,55,131,102,126,56,193,115,217,242,77,39, + 226,207,92,227,40,53,250,121,182,244,55,52,52,104,205,182,181,157,60,84,249,251,144,122,95,8,137,99,20,26,55,14,133,82,169,132,88,44,22,191, + 246,218,107,230,57,115,230,104,156,156,156,164,132,16,156,63,127,62,15,64,223,186,116,117,94,174,212,108,52,49,84,200,101,41,113,212,18,115,145,48, + 33,233,9,250,244,234,161,232,210,62,242,171,57,139,150,127,210,52,180,181,231,219,227,23,242,191,248,236,245,245,32,232,106,77,231,126,42,61,215,188, + 49,145,0,136,93,244,249,103,120,252,56,213,117,226,152,146,133,60,145,196,47,60,184,179,227,250,45,231,251,53,105,210,176,193,140,169,195,143,125,251, + 221,183,177,168,226,217,218,182,117,193,17,66,72,140,45,199,246,223,8,95,40,140,26,113,240,32,41,185,119,207,160,121,252,88,211,254,219,111,139,13, + 90,45,185,179,97,131,187,226,230,77,39,137,163,163,169,65,175,94,37,141,95,126,89,237,219,187,119,89,246,209,163,28,167,118,237,68,189,191,248,130, + 127,112,210,164,102,0,126,179,34,219,226,141,184,56,148,102,102,154,138,126,249,69,23,243,221,119,5,129,125,251,174,48,24,141,30,150,159,10,14,33, + 32,150,208,9,150,37,188,89,179,56,148,199,131,201,213,117,204,108,32,180,46,205,15,115,114,134,189,62,126,124,236,145,147,39,209,176,97,195,202,235, + 153,139,139,11,102,206,156,137,233,211,167,139,110,223,190,221,110,255,254,253,237,150,45,93,234,61,27,24,102,75,63,79,255,246,155,235,228,69,139,230, + 182,140,142,14,218,177,123,183,168,113,227,198,0,128,71,143,30,53,253,230,235,175,131,35,163,162,20,95,125,240,193,182,196,57,115,34,0,252,82,155, + 102,238,165,75,134,253,233,233,227,207,157,63,239,18,25,25,9,0,72,78,78,246,90,181,106,213,132,136,225,195,71,47,122,231,157,121,3,117,186,18, + 167,252,124,209,192,53,107,120,63,142,24,81,167,166,165,159,0,208,253,237,183,63,232,218,163,71,243,97,227,199,187,5,5,5,17,7,7,7,24,141, + 70,200,229,114,215,196,196,196,198,113,106,181,234,208,111,191,237,220,84,81,44,254,31,194,170,45,242,162,99,49,180,186,31,59,118,140,2,232,30,27, + 27,123,17,40,191,128,155,205,102,155,140,44,30,143,135,138,96,97,155,62,148,82,138,130,130,2,20,20,20,84,78,29,229,229,229,225,220,185,115,72, + 77,77,5,159,207,135,64,32,128,209,88,119,13,90,153,76,214,171,87,175,94,188,223,126,251,13,33,33,33,144,72,36,149,253,178,60,4,2,1,124, + 125,125,161,82,169,16,19,19,195,95,189,122,117,47,212,98,104,57,59,59,15,24,57,114,164,208,242,186,180,180,20,92,110,249,141,175,94,175,71,105, + 105,41,138,138,138,80,82,82,2,157,78,135,142,29,59,10,227,226,226,6,160,22,67,171,42,26,141,166,52,47,47,207,165,107,215,174,174,219,182,109, + 75,238,216,177,99,88,213,247,47,92,184,160,211,233,116,124,14,135,99,83,29,189,93,187,118,85,30,251,167,79,159,98,253,250,245,149,239,165,166,166, + 98,245,234,213,149,165,0,106,251,142,194,195,195,251,239,220,185,51,122,199,142,29,197,92,46,23,201,201,201,216,189,123,55,40,165,240,244,244,132,70, + 163,129,66,161,192,249,243,231,193,48,12,28,28,28,224,239,239,47,158,58,117,106,151,133,11,23,242,1,124,86,147,182,217,108,54,115,185,92,4,7, + 7,99,254,252,249,208,233,116,16,8,202,237,75,149,74,133,146,146,18,220,186,117,11,233,233,233,168,235,34,35,22,139,135,239,216,177,195,75,40,20, + 66,171,213,66,173,86,35,43,43,11,25,25,25,186,188,188,60,198,209,209,145,19,28,28,204,17,137,68,162,161,67,135,18,139,193,57,112,224,64,247, + 157,59,119,190,138,58,140,36,66,136,103,179,102,205,62,153,48,97,66,229,220,54,165,20,185,185,185,24,54,108,152,244,202,149,43,115,8,33,187,41, + 165,249,181,233,188,104,80,74,105,73,73,243,235,55,206,36,71,29,140,243,14,204,200,54,119,158,249,209,114,30,0,108,220,176,184,243,193,184,167,191, + 134,55,84,100,237,63,20,122,221,197,37,169,214,239,136,16,194,233,217,205,119,144,183,187,203,200,97,131,7,211,117,235,86,180,121,119,202,120,81,112, + 232,76,0,128,63,223,11,49,204,231,68,163,125,36,94,183,110,69,155,97,131,95,185,149,150,150,190,33,166,187,223,79,231,46,230,252,92,155,199,208, + 203,93,236,47,21,151,193,63,164,57,194,154,201,112,251,206,3,28,216,119,21,97,205,218,193,96,48,128,97,24,217,160,65,131,52,123,247,238,213,165, + 164,164,168,181,90,109,55,74,105,74,93,227,207,206,78,98,195,124,58,24,5,18,17,163,86,10,52,179,231,237,31,209,166,125,159,104,87,95,127,190, + 167,140,253,185,127,239,118,187,183,108,158,63,125,222,130,221,104,219,174,79,199,251,201,191,52,7,112,207,154,86,210,35,26,23,217,148,48,143,31,62, + 140,205,72,79,207,14,245,246,49,60,42,161,166,247,103,111,234,221,181,219,240,22,141,155,189,36,188,159,116,145,204,159,245,234,158,69,75,190,125,13, + 21,198,214,217,248,61,221,198,140,185,42,4,80,163,119,252,223,12,225,114,3,165,62,62,220,196,109,219,244,141,99,99,75,0,224,206,134,13,238,202, + 135,15,37,237,102,204,120,74,76,38,242,52,62,222,73,238,225,193,248,117,233,162,117,14,11,211,235,211,210,52,222,45,90,56,10,197,98,127,107,154, + 2,145,40,192,33,56,152,151,182,109,155,54,100,208,160,98,0,48,24,141,30,105,233,233,206,82,169,20,148,82,152,76,166,103,98,136,45,113,195,145, + 97,97,86,61,227,213,53,211,62,253,180,197,172,89,179,144,155,155,11,134,97,192,231,243,159,105,175,209,104,80,86,86,134,49,99,198,96,205,210,165, + 29,108,209,52,155,205,100,242,162,69,115,63,158,59,183,241,164,73,147,56,85,127,123,221,220,220,176,255,192,1,225,218,181,107,3,62,89,179,102,204, + 235,34,209,227,186,52,11,154,52,129,155,66,33,177,24,89,0,16,22,22,134,245,235,215,139,198,141,27,39,28,52,104,208,242,219,45,91,174,90,209, + 165,203,67,247,208,80,39,161,72,20,96,235,241,4,0,181,78,23,185,98,213,42,215,107,215,174,65,161,80,32,55,183,252,126,148,16,130,182,109,219, + 146,55,222,120,195,185,81,96,96,59,107,154,127,35,127,178,69,94,20,172,5,193,91,224,1,64,197,128,72,197,0,43,207,6,179,217,252,140,193,82, + 151,161,245,60,148,148,148,160,164,164,4,155,55,111,134,64,32,168,188,248,2,128,193,96,168,115,127,141,70,19,229,231,231,7,165,82,137,208,208,208, + 103,60,89,2,129,0,60,30,15,2,129,0,34,145,8,122,189,30,65,65,65,208,104,52,81,181,105,106,181,218,86,110,110,110,0,202,47,176,122,125, + 249,111,158,94,175,175,236,175,193,96,64,113,113,49,74,75,75,161,86,171,81,86,86,214,218,150,241,178,44,139,132,132,132,71,97,97,97,173,184,92, + 46,28,28,28,100,101,101,101,149,177,69,69,69,69,216,190,125,123,217,155,111,190,233,113,244,232,209,58,13,45,66,8,222,123,239,61,136,68,34,104, + 52,26,172,91,183,14,211,166,77,131,64,32,128,90,173,198,250,245,235,49,99,198,12,240,120,60,24,12,6,172,90,181,170,70,173,164,164,164,180,223, + 126,251,173,117,155,54,109,92,15,29,58,148,223,187,119,111,207,190,125,251,66,34,145,64,171,213,194,100,50,161,67,135,14,8,15,15,71,94,94,30, + 78,156,56,81,208,180,105,83,143,107,215,174,177,185,185,185,25,181,245,179,170,241,196,227,241,96,54,155,161,80,40,80,82,82,130,252,252,124,200,229, + 114,100,103,103,131,199,227,161,174,155,121,119,119,247,87,34,35,35,185,0,32,145,72,208,170,85,43,204,157,59,151,209,106,181,35,1,156,168,104,214, + 127,211,166,77,135,46,95,190,204,243,243,243,195,131,7,15,224,233,233,201,19,139,197,117,26,90,62,62,62,91,127,254,249,103,55,139,113,109,57,206, + 26,77,249,215,49,108,216,48,183,29,59,118,108,5,48,160,214,142,190,128,184,72,32,104,21,233,164,220,27,151,23,49,243,163,229,188,240,200,242,155, + 215,137,147,192,91,182,244,195,136,209,67,156,142,185,72,84,181,122,153,1,160,127,175,192,181,131,7,247,230,188,54,106,96,170,64,224,18,178,97,227, + 66,47,47,239,113,127,52,224,56,193,221,195,9,33,193,66,178,255,216,125,175,217,115,62,215,239,218,241,237,227,61,63,198,245,19,242,227,251,0,120, + 167,38,237,148,71,37,71,53,122,113,51,85,225,93,226,230,221,25,173,90,134,195,203,179,8,155,182,254,132,134,141,218,66,175,215,195,201,201,73,106, + 54,155,141,92,46,119,151,45,70,22,0,156,61,91,194,70,68,148,24,184,106,150,121,119,218,178,151,123,247,31,220,188,103,207,94,236,233,248,211,198, + 206,173,141,57,253,251,182,82,156,140,95,155,154,35,127,210,52,34,170,11,146,18,207,247,3,72,2,96,253,132,77,72,165,39,27,55,38,231,247,238, + 157,200,106,217,91,146,47,190,188,215,63,54,246,173,200,151,186,190,196,198,159,57,103,16,162,224,190,83,151,78,79,223,29,223,255,208,15,187,86,245, + 57,121,98,107,19,165,42,35,110,235,214,154,67,16,94,0,60,56,60,30,167,240,242,101,115,227,57,115,244,0,144,119,243,166,99,219,143,62,146,251, + 180,104,161,7,0,142,72,68,213,247,238,137,209,165,139,86,224,233,201,48,197,197,90,89,84,148,3,88,214,199,154,160,153,97,188,121,34,17,39,255, + 252,121,38,106,220,56,61,80,254,255,40,149,74,113,228,200,17,8,133,194,202,135,64,32,168,124,238,237,237,109,89,124,101,147,38,0,228,228,228,32, + 55,55,23,206,206,206,240,244,244,68,110,110,46,174,92,185,130,148,148,20,240,249,124,244,235,215,15,156,26,98,155,171,107,142,152,57,179,119,179,168, + 168,160,234,70,22,0,24,141,70,20,21,21,97,200,144,33,156,19,39,78,248,156,204,204,28,252,41,240,167,96,243,170,154,173,99,99,11,21,251,247, + 91,253,236,54,109,218,144,95,127,253,85,212,175,111,223,233,31,126,249,229,218,53,59,118,100,153,25,198,230,227,9,148,207,58,16,66,16,24,24,136, + 162,162,34,148,150,150,207,96,59,56,56,192,213,213,21,38,147,9,44,165,124,107,154,127,23,53,217,34,47,10,213,147,150,62,19,12,95,49,40,0, + 232,94,101,7,176,44,107,147,145,197,231,243,235,140,185,170,11,107,23,87,91,12,45,75,95,197,98,113,229,63,90,85,3,203,210,79,14,135,131,170, + 23,206,218,96,89,150,171,86,171,113,224,192,1,116,235,214,173,114,90,74,169,84,162,164,164,4,74,165,18,58,157,14,105,105,105,56,123,246,44,154, + 52,105,2,216,152,252,245,241,227,199,55,26,54,108,24,109,233,75,143,30,61,2,182,109,219,38,31,48,96,128,31,165,20,243,230,205,43,232,208,161, + 131,135,173,125,5,202,23,18,92,185,114,5,77,154,52,1,165,20,2,129,0,201,201,201,240,242,242,2,203,178,224,241,120,200,207,207,135,163,99,237, + 57,18,19,18,18,198,190,253,246,219,114,103,103,231,22,133,133,133,57,34,145,168,235,165,75,151,2,141,70,35,156,156,156,224,228,228,132,227,199,143, + 195,197,197,5,31,124,240,65,166,86,171,189,34,147,201,188,181,90,237,221,220,220,92,155,166,125,44,48,12,131,178,178,50,20,23,23,163,168,168,8, + 42,149,10,58,157,174,206,62,90,163,107,215,174,136,139,139,227,46,94,188,248,135,199,143,203,111,12,67,66,66,240,193,7,31,112,253,253,253,145,150, + 150,134,27,55,110,192,104,52,130,82,90,235,63,47,159,207,239,241,225,135,31,118,9,10,10,34,70,163,17,44,203,66,175,215,195,242,60,51,51,19, + 205,154,53,227,4,7,7,119,36,132,244,176,101,97,133,157,114,20,153,135,225,207,247,2,56,78,160,218,195,40,44,120,190,178,145,121,121,121,95,206, + 250,244,215,113,107,150,24,189,179,115,128,176,200,161,104,218,60,6,99,223,48,99,241,210,3,8,12,10,69,70,70,6,122,244,232,33,144,203,229,111, + 3,152,105,171,118,124,252,111,230,211,199,79,12,31,241,234,91,209,189,122,13,96,78,157,58,142,132,187,167,18,223,126,245,149,60,202,150,18,55,23, + 201,173,228,7,215,155,182,104,213,29,6,198,220,21,248,108,9,128,26,239,12,30,61,162,134,133,11,23,114,142,29,222,250,198,107,163,199,180,140,137, + 233,99,58,21,255,51,110,92,141,191,179,124,201,132,139,139,87,253,212,163,119,191,97,17,158,222,87,142,71,134,234,199,7,186,59,215,43,101,202,191, + 13,66,8,5,0,129,84,202,162,226,55,76,230,232,200,112,249,252,202,99,36,16,10,89,137,139,11,3,148,223,116,177,18,9,107,54,153,204,117,93, + 85,121,98,113,165,38,135,16,80,74,159,49,178,170,27,90,28,14,167,78,7,64,85,77,11,148,210,202,27,234,13,27,54,64,36,18,65,40,20,130, + 207,231,215,25,126,81,85,51,49,45,173,231,246,93,187,68,214,140,172,194,194,66,20,22,22,162,180,180,20,163,70,141,18,44,188,126,189,77,13,114, + 149,154,65,190,190,122,153,68,162,72,74,74,242,107,222,188,249,51,253,85,169,84,144,72,36,216,181,123,183,96,96,108,236,148,152,227,199,151,3,168, + 53,255,149,181,177,19,66,224,229,229,5,87,87,87,16,66,192,48,12,114,115,115,145,152,152,136,235,215,175,131,75,72,189,211,25,213,7,107,182,200, + 139,68,93,30,45,171,103,99,125,12,45,46,151,251,220,94,173,154,176,101,234,80,42,149,222,203,201,201,233,236,239,239,15,134,97,42,13,173,234,83, + 135,64,185,247,227,246,237,219,144,74,165,86,221,253,85,53,41,165,29,219,181,107,135,131,7,15,226,252,249,243,120,242,228,9,52,26,13,244,122,61, + 180,90,45,18,19,19,193,178,44,34,35,35,33,147,201,234,212,4,128,178,178,178,28,62,159,31,38,145,72,42,183,249,250,250,162,176,176,144,53,153, + 76,216,190,125,187,202,199,199,71,38,145,72,108,54,92,9,33,200,203,203,67,64,64,64,101,140,150,90,173,134,151,151,151,197,176,128,94,175,135,163, + 163,99,157,83,135,148,82,29,128,15,171,104,183,29,49,98,196,158,189,123,247,54,58,115,230,12,174,93,187,6,79,79,79,124,245,213,87,79,210,211, + 211,95,163,148,94,183,169,147,245,192,150,115,168,176,176,240,192,189,123,247,58,182,107,215,174,242,87,162,71,143,30,164,71,143,30,30,150,215,26,141, + 6,249,249,249,248,253,247,223,113,230,204,25,16,66,144,154,154,106,214,106,181,53,46,35,39,132,8,130,131,131,183,205,157,59,215,129,97,152,202,115, + 91,34,145,64,44,22,67,32,16,128,203,229,34,61,61,29,67,134,12,113,254,238,187,239,182,18,66,26,83,74,235,62,81,95,16,74,180,48,222,78, + 80,57,71,54,243,78,220,184,97,113,231,137,147,96,153,58,100,34,155,121,37,222,78,80,56,71,123,193,232,34,172,93,231,196,153,172,119,13,166,19, + 131,78,156,188,48,242,163,233,31,240,67,66,154,229,157,57,119,51,40,134,249,156,184,123,56,161,176,64,133,244,76,5,30,103,24,104,72,72,179,188, + 27,191,223,19,45,93,177,178,105,153,70,247,211,185,139,57,63,215,166,77,41,213,17,66,134,46,95,45,186,248,214,219,109,133,18,169,31,138,10,238, + 33,40,200,19,67,6,182,192,150,29,87,224,236,236,6,111,111,111,112,56,28,153,173,99,47,40,40,32,7,126,252,101,220,155,99,38,116,232,219,39, + 150,57,121,234,24,239,252,233,163,87,182,110,252,228,16,229,150,73,9,85,75,26,52,244,185,251,232,225,237,215,122,246,26,5,137,192,177,9,16,110, + 245,132,173,92,96,64,145,201,225,64,252,230,152,137,157,250,246,29,204,156,58,117,24,167,142,239,248,109,193,130,6,199,159,60,221,45,184,122,61,91, + 60,116,248,59,197,113,39,238,27,94,25,212,48,197,79,214,234,95,145,67,239,121,161,148,230,179,12,227,27,208,167,15,81,63,121,34,144,184,186,234, + 26,244,234,85,146,23,31,239,40,224,243,85,92,0,218,71,143,132,206,173,91,235,0,128,49,26,9,215,199,135,155,115,247,46,37,28,142,194,154,38, + 151,199,83,48,122,125,96,64,223,190,92,77,70,6,223,193,219,155,1,0,147,201,84,167,161,5,192,234,20,116,117,77,91,199,167,209,104,192,2,86, + 141,141,234,154,185,121,121,13,42,110,194,43,49,153,76,149,70,86,97,97,33,74,74,74,32,147,201,144,175,215,91,157,226,172,174,217,167,125,251,237, + 11,63,251,108,230,254,3,7,4,192,31,70,150,229,193,231,243,241,205,146,37,130,105,31,125,244,206,20,30,239,253,250,28,79,160,252,166,157,203,229, + 130,199,227,33,35,35,3,153,153,153,200,200,200,64,70,70,6,36,18,9,104,13,199,243,239,226,69,142,207,170,201,200,2,234,72,239,80,159,96,120, + 91,13,3,179,185,198,68,202,127,194,22,67,171,172,172,236,76,124,124,124,251,151,95,126,153,247,219,111,191,193,199,199,167,210,208,178,252,181,76,71, + 73,165,82,28,58,116,200,88,86,86,86,107,125,38,141,70,115,246,248,241,227,209,243,231,207,231,143,29,59,22,73,73,73,152,52,105,18,74,74,74, + 160,82,169,80,88,88,8,141,70,131,246,237,219,67,44,22,227,238,221,187,38,141,70,83,107,138,3,74,41,205,203,203,43,245,244,244,244,173,254,222, + 240,225,195,189,191,255,254,123,205,131,7,15,76,157,59,119,118,2,108,51,56,44,252,248,227,143,149,30,193,148,148,20,124,255,253,247,149,49,89,55, + 111,222,196,178,101,203,42,115,159,213,7,74,233,245,136,136,8,198,100,50,161,73,147,38,240,247,247,135,78,167,195,202,149,43,153,127,194,200,178,21, + 157,78,183,255,173,183,222,250,248,214,173,91,190,60,30,175,220,165,93,49,62,163,209,136,135,15,31,34,49,49,17,15,30,60,64,81,81,81,229,141, + 192,237,219,183,139,77,38,211,79,53,233,122,122,122,206,219,178,101,139,143,84,42,125,230,124,182,120,67,45,94,210,252,252,124,184,184,184,32,38,38, + 198,235,236,217,179,243,0,204,255,79,140,251,159,134,16,66,122,118,227,182,157,246,238,80,12,27,40,205,58,24,247,244,215,101,75,63,172,8,134,247, + 74,28,54,208,63,235,78,178,11,134,191,124,184,237,185,139,36,187,182,88,186,138,24,171,35,237,219,187,157,63,120,244,232,214,57,179,166,223,156,249, + 225,4,79,141,246,145,56,36,88,72,0,224,113,134,129,222,77,98,117,203,150,79,191,185,120,201,119,28,69,97,201,164,107,215,106,78,111,80,213,120, + 137,8,133,56,36,188,155,188,105,104,151,134,191,253,186,11,14,82,45,194,194,219,162,111,159,142,56,119,225,22,20,249,58,228,228,228,64,175,215,215, + 154,46,225,193,221,67,111,80,66,131,8,37,153,132,67,197,111,188,53,190,107,108,236,96,26,23,119,148,57,124,104,215,229,159,118,174,222,207,17,240, + 121,90,131,179,129,16,157,18,156,132,164,210,178,242,27,26,190,72,80,179,251,181,34,177,107,243,136,112,159,55,222,154,228,60,160,255,16,122,252,248, + 97,246,167,189,219,207,255,180,57,106,23,203,81,9,210,82,53,34,101,137,73,73,137,208,165,84,197,106,20,143,27,235,252,98,135,191,208,70,187,217, + 104,204,46,149,203,189,188,250,246,21,167,45,93,42,241,142,142,214,53,124,249,101,181,226,242,101,73,241,141,27,18,169,171,43,227,220,186,181,78,226, + 231,87,126,113,55,155,33,112,117,229,63,185,112,129,99,212,233,158,90,211,52,234,245,217,165,89,89,190,110,221,186,137,30,126,246,153,212,187,125,123, + 29,169,136,33,174,205,208,226,114,185,0,135,99,245,71,175,186,166,173,227,211,106,181,96,1,171,139,148,234,210,100,24,230,25,35,203,98,104,85,96, + 83,63,55,46,88,240,91,80,223,190,69,23,46,92,240,238,222,189,59,81,171,213,80,171,213,207,24,91,126,126,126,164,121,100,164,244,199,243,231,67, + 172,253,48,89,59,158,182,140,157,195,225,252,227,134,214,139,76,245,105,67,192,134,60,90,192,31,30,45,91,12,45,27,61,90,38,147,201,4,47,47, + 47,20,20,20,212,120,225,231,112,56,144,72,36,150,57,226,90,87,222,233,245,250,149,31,125,244,209,212,1,3,6,120,132,133,133,33,63,63,31,222, + 222,222,16,139,197,149,177,99,22,189,155,55,111,98,203,150,45,42,189,94,191,178,14,205,21,75,150,44,121,119,216,176,97,110,62,62,62,112,117,117, + 197,221,187,119,225,234,234,10,149,74,133,228,228,100,56,58,58,130,16,130,178,178,50,28,61,122,84,173,215,235,107,141,251,209,104,52,244,210,165,75, + 70,71,71,199,187,249,249,249,220,162,162,34,94,113,113,49,79,165,82,241,149,74,37,255,228,201,147,30,206,206,206,154,115,231,206,229,7,5,5,113, + 159,60,121,194,53,153,76,117,90,175,132,16,188,255,254,251,16,8,4,208,235,245,88,185,114,37,102,206,156,89,25,147,181,100,201,18,204,157,59,183, + 210,112,222,180,105,83,93,146,207,64,41,133,209,104,132,201,100,130,201,100,178,201,248,253,43,216,98,176,83,74,115,9,33,3,219,181,107,119,122,223, + 190,125,238,21,57,201,160,80,40,160,80,40,144,159,159,143,210,210,82,48,12,3,127,127,127,40,20,10,28,62,124,88,169,86,171,251,214,182,226,144, + 203,229,190,213,181,107,87,94,245,62,88,238,242,44,198,187,72,36,130,92,46,71,143,30,61,132,23,46,92,120,11,47,184,161,101,49,96,154,53,133, + 160,79,223,113,130,102,17,157,12,119,18,227,178,194,27,42,178,70,15,113,58,6,0,183,19,20,206,119,146,93,208,44,98,32,237,211,215,53,90,145, + 187,49,170,121,40,49,214,86,174,7,0,156,165,162,17,189,123,181,151,59,202,100,156,101,203,55,157,88,183,110,69,155,253,199,254,72,239,176,108,121, + 121,122,135,222,189,218,179,15,238,63,24,1,160,230,244,14,213,140,151,129,3,7,221,218,178,109,11,30,36,158,243,251,248,253,22,194,34,133,9,18, + 135,64,180,109,229,131,141,219,238,225,206,157,59,185,6,131,161,71,109,99,167,132,6,37,38,37,132,70,69,52,247,121,227,173,137,78,3,7,14,65, + 92,220,17,236,220,190,249,210,43,163,134,253,240,180,88,197,245,226,75,5,82,202,10,185,2,103,158,64,36,201,51,24,202,215,64,240,249,98,39,96, + 4,91,203,204,33,38,79,28,237,220,179,215,16,28,59,126,4,59,183,111,188,248,105,196,240,205,13,91,55,35,29,218,44,159,220,160,81,112,3,141, + 70,161,4,17,26,117,58,214,113,233,214,244,111,31,207,125,235,241,173,132,17,203,95,212,85,135,58,134,185,183,119,200,144,214,19,110,221,18,57,183, + 104,33,81,92,190,172,243,238,210,69,235,221,165,139,22,192,51,222,58,179,82,201,17,6,4,8,85,121,121,194,155,91,182,136,181,192,253,26,100,239, + 238,28,48,160,221,180,71,143,4,158,93,186,72,228,231,207,75,73,121,37,146,90,13,45,30,143,7,90,243,84,215,51,154,100,199,14,14,128,90,23, + 97,9,4,2,104,52,26,152,128,154,126,4,159,209,244,61,117,42,235,209,163,71,77,221,220,220,158,49,178,138,138,138,42,159,235,116,58,104,52,26, + 72,36,146,68,91,52,21,151,46,233,190,126,255,253,249,175,141,26,181,250,204,217,179,98,119,119,119,40,149,202,103,12,45,131,193,128,158,49,49,130, + 37,183,110,189,1,96,129,45,199,211,187,71,143,58,227,129,185,92,46,216,127,120,234,240,69,166,54,143,86,141,87,53,139,209,100,235,170,67,107,23, + 72,66,72,175,106,155,230,70,71,71,235,82,82,82,16,20,20,84,105,172,84,253,76,39,39,39,184,184,184,224,230,205,155,248,242,203,47,181,0,230, + 214,166,73,41,85,107,52,154,87,123,247,238,173,229,241,120,8,15,15,175,204,159,197,178,44,132,66,33,100,50,25,110,221,186,133,65,131,6,105,52, + 26,205,171,213,115,104,89,209,84,106,52,154,215,251,246,237,171,73,76,76,68,215,174,93,113,231,206,29,148,150,150,162,180,180,20,105,105,105,136,136, + 136,176,4,159,107,53,26,205,235,148,82,101,109,154,106,181,122,208,204,153,51,185,123,246,236,105,232,239,239,31,209,182,109,219,176,152,152,152,198,47, + 191,252,114,240,128,1,3,124,155,54,109,170,235,219,183,175,103,255,254,253,61,53,26,13,255,215,95,127,205,49,153,76,253,235,56,158,0,202,141,147, + 148,148,148,202,169,66,30,143,135,130,130,130,202,204,253,150,31,37,107,134,112,77,154,22,88,150,173,52,176,44,6,87,93,215,128,26,52,235,188,112, + 8,133,66,139,199,243,79,109,173,124,71,183,239,223,191,223,187,91,183,110,183,199,141,27,167,206,205,205,133,163,163,35,66,66,66,16,26,26,10,15, + 15,15,24,141,70,28,58,116,168,236,240,225,195,247,148,74,101,143,234,57,180,170,107,114,56,156,52,107,63,178,22,111,150,197,208,18,139,197,240,247, + 247,183,28,219,52,27,198,254,151,248,199,53,43,12,152,152,158,125,27,13,136,29,234,124,232,200,21,225,234,181,135,239,69,247,194,38,247,6,170,163, + 238,13,84,71,163,123,97,211,234,181,135,239,29,58,114,69,56,32,118,168,115,76,207,190,141,146,18,31,132,61,83,247,208,74,63,197,98,113,167,174, + 93,162,139,47,92,190,200,46,94,242,29,167,103,143,87,110,109,254,225,208,161,205,63,28,58,212,179,199,43,183,22,47,249,142,115,225,242,69,182,107, + 151,232,98,177,88,220,201,150,177,79,158,56,218,57,118,192,16,196,197,29,98,246,255,248,253,146,189,7,82,187,141,159,122,73,145,146,114,135,230,101, + 159,2,159,147,129,164,164,36,165,193,96,232,97,45,16,222,154,230,164,9,163,171,26,89,191,184,251,116,221,116,255,62,204,241,241,63,155,206,158,189, + 165,253,229,118,158,242,70,82,65,145,60,191,232,137,74,85,104,96,89,51,204,102,51,119,225,194,242,128,221,154,190,163,206,157,187,227,220,153,221,216, + 190,109,131,146,101,161,27,190,111,159,121,196,136,207,104,80,80,80,131,93,123,118,147,254,131,135,184,80,128,29,52,108,136,203,158,125,123,72,163,38, + 141,26,132,132,148,167,180,121,17,207,165,47,41,205,43,72,74,250,237,238,230,205,58,159,177,99,221,121,174,174,78,57,241,241,50,173,92,206,51,27, + 141,196,108,52,18,115,89,25,199,80,80,192,229,122,123,11,225,228,228,240,211,232,209,14,102,157,238,212,55,148,150,90,211,92,64,105,177,42,35,227, + 226,205,239,190,211,123,191,250,170,155,208,219,219,9,102,51,177,252,190,215,244,224,241,120,207,120,96,106,211,244,247,240,120,122,244,232,81,132,134,134, + 194,223,223,255,153,120,94,75,66,110,119,119,119,28,56,112,0,20,184,97,139,102,235,134,13,111,126,243,245,215,6,150,101,81,92,92,252,39,111,86, + 113,113,49,88,150,197,241,99,199,12,170,210,210,237,182,142,189,7,151,91,250,218,75,47,45,142,141,141,53,62,122,244,8,44,203,162,170,103,43,47, + 47,15,14,14,14,208,233,245,129,132,16,169,45,154,121,39,79,202,106,88,211,81,73,117,143,214,63,113,46,253,175,82,171,71,139,97,24,4,6,6, + 62,83,210,133,195,225,60,243,168,207,138,67,74,233,14,66,200,169,190,125,251,206,239,208,161,195,228,249,243,231,115,195,194,194,160,84,42,225,234,234, + 10,47,47,47,36,39,39,227,232,209,163,230,130,130,130,245,0,22,217,178,132,158,82,122,158,16,50,176,69,139,22,123,103,207,158,237,220,167,79,31, + 126,96,96,32,40,165,184,117,235,22,14,30,60,104,220,188,121,179,170,194,200,178,41,120,153,82,122,154,16,242,202,128,1,3,118,189,245,214,91,142, + 102,179,153,159,150,150,6,189,94,15,147,201,132,204,204,76,227,207,63,255,92,170,209,104,70,83,74,79,219,160,119,147,16,210,60,62,62,254,173,95, + 127,253,245,203,113,227,198,185,199,196,196,8,24,134,193,229,203,151,243,91,183,110,237,149,151,151,103,60,112,224,64,161,78,167,155,107,54,155,109,42, + 193,67,8,129,74,165,130,135,135,7,244,122,61,88,150,133,193,96,128,131,131,67,101,217,36,74,169,205,11,1,170,195,48,12,215,104,52,98,212,168, + 81,96,89,22,43,87,174,4,195,48,245,22,115,118,118,190,113,251,246,237,129,173,90,149,39,124,231,114,185,149,231,144,72,36,130,135,135,7,220,221, + 221,17,23,23,7,62,159,95,107,150,125,11,21,153,222,91,19,66,58,221,187,119,239,77,0,173,140,70,163,191,217,108,38,28,14,39,135,82,122,87, + 165,82,253,96,107,9,158,188,188,188,47,199,140,25,211,122,247,238,221,14,60,222,31,255,26,60,30,15,34,145,8,94,94,94,112,118,118,6,165,20, + 6,131,1,243,230,205,83,149,149,149,125,89,223,99,241,111,37,186,109,123,108,252,126,149,195,217,115,167,242,239,167,226,96,213,20,14,46,66,224,220, + 69,146,173,200,221,24,37,207,202,114,136,110,219,222,38,77,147,193,88,248,250,232,25,65,21,37,120,230,165,165,165,111,216,181,227,219,199,0,176,116, + 197,202,166,138,194,146,73,15,238,63,24,177,97,195,143,157,76,6,99,161,45,154,127,24,47,187,148,160,208,81,74,175,17,66,26,14,122,245,228,220, + 38,141,156,6,231,21,106,159,150,149,105,222,163,148,90,93,50,111,141,46,157,187,225,220,233,61,216,185,125,151,138,178,92,157,135,135,7,5,128,251, + 247,61,232,253,251,37,244,143,184,98,151,50,62,189,179,104,198,123,49,51,148,170,162,21,43,214,214,158,184,182,69,203,14,104,209,178,3,166,190,247, + 137,115,243,136,240,32,0,216,183,143,154,35,155,146,159,231,207,255,108,240,162,69,159,65,165,214,195,82,174,39,57,33,233,216,163,71,212,182,85,64, + 255,82,204,12,243,203,137,169,83,27,48,106,181,123,155,169,83,61,205,133,133,98,99,86,86,89,89,70,134,86,224,236,204,10,188,189,249,194,224,96, + 190,170,160,64,120,240,245,215,101,5,15,31,102,125,74,105,173,49,174,243,25,230,26,102,204,104,170,41,42,242,236,242,241,199,30,188,143,62,226,212, + 22,12,95,245,255,215,22,205,235,119,239,30,155,52,126,252,211,5,243,231,247,93,191,97,131,36,42,42,10,185,185,185,8,15,15,135,191,191,63,226, + 227,227,113,224,167,159,202,74,212,234,185,0,214,217,162,185,227,248,241,228,176,136,136,130,13,27,54,248,197,198,198,146,178,178,50,40,149,74,40,149, + 74,232,245,122,84,36,132,166,41,169,169,247,77,38,211,122,91,52,187,124,252,177,135,57,63,95,188,168,125,251,108,1,203,126,243,202,176,97,51,23, + 125,254,185,168,81,163,70,68,175,215,87,122,181,140,70,35,28,28,28,140,6,131,193,29,192,159,188,85,214,52,69,155,55,51,249,249,249,240,244,244, + 172,76,215,84,53,47,161,90,173,6,173,98,12,219,177,29,82,211,181,220,205,205,237,6,143,199,11,0,106,175,157,87,117,155,201,100,202,206,207,207, + 143,174,210,166,23,165,212,106,60,20,33,36,4,192,87,61,123,246,124,229,195,15,63,36,23,46,92,192,225,195,135,233,227,199,143,247,3,152,91,211, + 143,100,29,154,142,34,145,232,3,153,76,214,203,146,194,65,42,149,222,43,43,43,59,163,215,235,87,214,148,13,190,14,77,39,145,72,244,190,76,38, + 235,173,86,171,91,1,128,163,163,227,237,178,178,178,120,189,94,191,138,214,80,168,186,14,77,137,179,179,243,151,30,30,30,175,127,244,209,71,238,151, + 46,93,202,57,119,238,156,160,164,164,100,183,193,96,168,177,168,180,53,77,119,119,247,27,92,46,55,224,159,248,142,0,160,101,203,150,113,131,6,13, + 138,29,61,122,52,76,38,19,214,173,91,135,248,248,248,99,169,169,169,3,107,218,199,154,38,33,196,35,32,32,224,194,228,201,147,131,71,141,26,37, + 117,117,117,5,143,199,67,89,89,25,30,62,124,136,91,183,110,209,35,71,142,148,222,188,121,51,91,163,209,116,167,148,22,212,165,249,87,177,166,201, + 231,243,187,5,6,6,254,184,96,193,2,199,222,189,123,75,220,221,221,193,229,114,97,50,153,144,147,147,131,132,132,4,156,58,117,170,108,255,254,253, + 101,133,133,133,163,40,165,23,255,27,253,252,59,53,155,135,146,79,171,21,138,174,49,219,123,109,109,109,233,103,76,119,191,33,35,94,233,223,15,0, + 246,29,56,113,242,236,5,121,173,69,165,107,235,103,93,125,181,69,179,89,83,238,130,196,164,132,103,18,90,70,52,143,76,105,22,53,236,11,91,180, + 44,153,225,171,143,189,74,182,253,63,168,54,205,106,41,60,253,201,220,57,248,234,203,197,56,178,239,208,177,164,71,180,178,76,208,139,120,46,85,217, + 70,22,241,120,29,29,252,253,187,14,92,181,202,232,22,26,74,165,238,238,148,49,24,204,249,247,239,179,89,23,46,144,43,171,86,73,76,26,77,252, + 167,86,74,99,213,164,249,5,143,215,65,234,235,251,210,74,150,157,115,39,33,193,161,234,13,155,197,243,92,245,166,210,207,207,47,79,46,151,123,219, + 162,57,112,205,26,163,70,38,19,205,249,230,155,110,165,58,93,183,69,139,22,241,174,95,191,142,239,191,251,142,209,101,103,239,202,7,222,183,54,27, + 82,155,102,240,251,239,139,103,125,255,253,216,144,38,77,188,222,124,243,77,62,159,207,71,89,89,25,178,178,178,112,250,212,41,67,210,253,251,73,42, + 149,106,48,165,84,110,171,230,192,53,107,140,46,33,33,144,122,122,210,179,231,207,59,79,250,224,131,201,13,26,54,116,238,219,175,31,223,201,201,9, + 197,197,197,72,75,75,195,161,67,135,242,74,75,75,253,40,165,102,91,52,119,253,250,107,139,227,23,47,14,255,226,139,47,132,145,145,145,112,118,118, + 134,90,173,70,66,66,2,46,94,188,168,95,191,126,189,82,169,84,78,102,24,230,104,77,253,252,255,76,149,24,173,99,180,188,28,207,31,239,253,147, + 161,0,182,124,17,132,144,104,0,159,86,188,252,156,214,93,51,240,133,253,241,177,210,38,200,205,205,109,163,78,167,163,90,173,118,18,165,52,243,223, + 214,79,66,8,47,58,58,250,251,188,188,188,78,148,82,56,59,59,95,73,76,76,156,66,41,173,113,174,190,38,77,66,8,23,64,39,7,7,135,246, + 142,142,142,221,244,122,125,179,138,233,183,251,101,101,101,23,141,70,227,53,0,87,40,165,127,90,49,241,159,28,123,69,63,123,251,249,249,141,103,89, + 182,9,33,196,197,108,54,195,100,50,149,176,44,251,80,169,84,110,6,16,255,223,238,231,223,165,25,209,132,188,76,57,104,86,249,102,45,113,87,213, + 13,8,194,226,126,226,67,122,200,214,126,18,66,56,253,123,5,174,5,202,87,38,210,58,74,25,61,99,104,217,96,188,216,194,51,154,77,120,99,40, + 161,207,104,18,74,50,195,215,14,138,250,0,0,32,0,73,68,65,84,91,188,188,211,22,173,154,12,45,91,137,8,35,221,64,209,137,165,184,118,63, + 149,158,171,169,159,127,23,255,105,205,133,132,184,115,128,102,92,145,40,128,101,24,31,112,185,44,225,112,114,24,157,46,27,64,194,130,231,184,249,93, + 76,136,219,119,174,174,87,56,60,158,15,0,78,133,247,133,101,9,49,83,66,152,170,211,91,85,111,44,235,210,52,2,81,124,145,40,208,204,48,222, + 185,128,195,113,179,185,141,142,210,210,0,224,211,91,148,38,63,79,63,141,64,20,87,36,10,58,78,233,144,124,153,172,69,158,86,235,9,128,58,200, + 100,247,85,101,101,219,117,58,221,218,234,51,23,182,104,10,68,162,0,51,195,120,3,0,135,199,203,219,171,215,7,102,59,57,189,169,211,235,131,29, + 28,28,76,6,131,65,165,211,233,70,155,76,166,179,245,25,251,67,134,105,254,43,135,211,213,40,147,185,27,9,145,25,24,198,104,48,26,179,116,58, + 221,61,0,223,82,74,43,211,143,216,13,45,235,84,49,184,254,136,219,178,172,78,251,39,30,0,122,217,53,237,154,118,77,187,166,93,211,174,105,215, + 252,231,53,1,72,1,4,1,224,254,155,251,249,191,248,0,48,177,226,225,91,253,189,186,39,178,237,216,177,99,199,142,29,59,255,122,40,165,26,88, + 137,201,178,243,207,67,107,89,117,72,0,88,93,57,64,235,225,18,124,158,213,7,117,233,219,53,237,154,118,77,187,166,93,211,174,105,215,252,223,211, + 172,75,187,62,246,199,191,5,82,75,30,173,127,218,149,246,66,184,43,237,154,118,77,187,166,93,211,174,105,215,180,107,254,119,53,255,23,30,0,38, + 86,223,246,215,10,20,254,15,67,8,241,38,132,88,45,139,240,87,218,218,121,241,176,127,191,118,236,216,177,99,167,46,8,33,19,169,149,41,196,255, + 120,140,150,229,130,69,41,181,90,215,170,190,237,254,238,125,43,246,95,76,8,102,85,60,95,66,41,157,243,119,180,181,225,115,253,60,60,60,134,121, + 121,121,181,45,44,44,188,166,80,40,246,83,74,243,234,177,127,83,169,84,58,133,16,18,9,0,148,210,4,141,70,243,61,165,52,245,121,251,84,69, + 155,0,152,40,18,137,70,186,186,186,54,41,42,42,122,104,48,24,246,1,216,64,43,204,248,122,234,133,1,24,133,242,233,235,131,148,210,187,182,238, + 235,29,57,244,39,10,52,5,192,97,9,59,156,67,57,251,1,176,4,72,85,36,28,30,89,223,190,212,209,207,191,237,251,253,155,250,211,140,16,172, + 35,132,52,99,89,186,138,82,186,168,142,246,45,8,193,26,66,72,88,69,251,122,165,66,176,99,199,142,29,59,117,99,153,58,180,182,234,176,94,134, + 150,191,191,255,43,148,210,73,0,40,33,100,227,211,167,79,15,212,179,35,54,93,180,254,202,197,173,218,190,43,40,165,51,235,217,71,111,66,48,139, + 101,41,7,0,56,28,242,177,183,183,183,148,203,229,254,41,192,208,108,54,75,9,193,84,150,165,164,162,237,44,66,200,170,231,53,14,223,120,227,141, + 21,171,86,173,18,75,165,82,100,100,100,244,153,60,121,114,103,66,200,12,90,45,39,135,53,36,18,201,107,237,218,119,154,241,205,210,229,14,222,94, + 94,50,198,204,26,211,210,211,101,243,230,204,108,47,145,72,86,213,86,76,185,90,63,8,128,137,60,30,111,164,88,44,110,172,211,233,30,49,12,179, + 159,203,229,246,253,242,203,47,35,7,12,24,32,86,169,84,66,134,97,154,236,220,185,115,198,150,45,91,250,19,66,134,208,90,150,233,19,66,252,1, + 128,82,90,181,150,217,240,140,140,140,104,129,64,64,66,66,66,56,0,238,214,209,190,18,10,52,77,188,188,47,10,0,34,186,140,72,73,188,188,15, + 21,207,109,25,162,205,88,59,23,196,98,241,122,157,78,151,105,121,191,162,159,207,101,208,63,95,159,176,118,221,218,53,157,219,69,183,32,99,39,188, + 183,144,16,114,145,82,250,11,33,132,15,96,56,0,1,128,219,148,210,132,138,62,111,219,188,113,125,100,203,168,112,242,250,91,147,22,17,66,206,81, + 74,175,254,167,250,107,199,142,29,59,255,31,176,230,201,178,80,95,143,214,187,169,169,169,14,0,16,26,26,58,5,128,205,134,150,181,139,86,76,76, + 76,107,137,68,242,76,22,100,173,86,43,36,4,49,207,99,188,88,62,195,96,208,115,248,124,33,56,28,50,163,69,139,22,13,10,10,10,46,113,56, + 156,93,217,217,217,197,245,26,109,185,38,54,109,218,20,234,235,235,251,167,108,205,57,57,57,194,33,67,6,215,75,111,44,33,34,189,72,212,94,64, + 136,175,153,97,92,0,128,199,227,21,135,57,59,71,127,245,197,23,82,66,8,91,88,88,8,173,86,139,233,211,167,75,146,146,146,134,2,88,91,71, + 31,67,59,116,236,60,253,212,169,147,205,84,69,197,186,77,43,54,222,210,242,248,101,141,154,55,19,126,191,113,187,203,196,177,163,223,35,132,220,166, + 86,202,145,84,211,225,0,56,244,193,7,31,68,12,28,56,80,168,86,171,197,90,173,182,193,174,93,187,230,69,71,71,59,180,106,213,74,248,227,143, + 63,18,165,82,9,74,169,52,60,60,156,142,28,57,82,183,119,239,222,169,0,86,215,160,89,105,248,114,185,220,149,97,97,97,11,42,198,44,168,210, + 134,223,188,121,115,25,0,36,39,39,47,36,4,31,84,108,183,106,100,19,32,53,162,203,8,128,160,73,226,229,125,226,136,174,35,116,160,120,72,128, + 84,0,240,247,247,95,4,84,201,11,245,44,247,159,62,125,250,92,181,9,7,14,28,68,0,236,247,243,243,59,144,151,151,215,144,16,76,168,173,159, + 214,240,241,241,9,246,244,244,92,195,178,172,49,49,49,113,152,101,123,116,116,116,39,71,71,199,24,181,90,125,233,198,141,27,23,107,218,159,67,72, + 211,118,209,45,73,139,54,157,224,236,236,12,169,84,250,46,128,95,0,140,154,53,107,214,180,208,208,80,44,93,186,212,8,160,99,197,13,66,120,187, + 182,173,72,120,68,27,56,58,58,2,64,35,0,118,67,203,142,29,59,118,254,70,8,33,190,0,98,171,110,123,46,143,22,0,33,0,92,186,116,9, + 0,68,207,211,151,42,157,194,251,239,191,15,95,95,223,103,26,228,228,228,224,194,5,155,170,228,216,244,25,159,127,254,185,67,73,73,73,175,31,126, + 248,225,37,127,127,255,101,79,159,62,253,173,182,157,41,165,10,66,200,18,14,135,124,76,8,129,72,36,78,153,60,121,242,173,138,183,27,252,252,243, + 207,210,65,131,6,105,0,164,3,128,72,36,246,231,114,57,161,229,65,111,88,82,155,65,56,130,144,16,161,80,216,115,210,154,53,76,155,65,131,120, + 50,79,79,2,0,233,15,30,184,47,89,186,180,115,241,227,199,66,173,187,123,97,97,89,153,54,37,37,5,34,145,136,112,185,220,54,117,13,88,38, + 147,77,251,226,171,37,50,85,81,137,86,175,42,53,112,205,38,189,163,68,98,206,205,85,20,56,72,165,154,57,159,46,20,188,51,225,205,105,0,166, + 212,33,53,117,198,140,25,205,218,181,107,231,255,211,79,63,17,165,82,9,30,143,231,208,170,85,43,68,71,71,155,207,157,59,71,26,54,108,136,200, + 200,72,92,190,124,25,87,174,92,33,173,91,183,150,30,60,120,240,13,88,49,180,170,27,215,92,46,103,122,120,120,120,43,153,76,102,8,13,13,197, + 132,9,19,64,41,69,175,94,189,34,29,28,28,14,148,149,149,9,147,147,31,188,84,151,145,109,153,30,244,138,28,122,23,64,20,40,30,230,37,28, + 110,81,165,73,179,228,228,228,14,197,197,197,149,193,136,150,2,230,47,189,244,82,93,135,179,18,203,185,48,120,240,160,143,1,66,98,98,98,74,166, + 78,157,202,121,240,224,193,235,47,191,60,52,50,53,245,33,106,235,103,117,124,124,124,130,251,245,235,183,123,243,230,205,109,187,116,233,114,161,234,123, + 174,174,174,125,215,173,91,55,109,219,182,109,225,237,218,181,43,249,253,247,223,173,150,36,49,179,244,251,177,19,166,46,114,118,118,70,70,122,154,121, + 220,184,113,77,253,253,253,95,1,32,138,140,140,68,251,246,237,177,97,195,6,1,0,8,4,130,25,61,122,244,44,122,99,204,36,111,71,71,71,164, + 166,38,43,1,28,179,249,0,216,177,99,199,142,29,91,137,165,148,110,180,22,167,197,3,128,99,199,142,85,198,216,196,198,198,214,88,184,144,82,170, + 184,115,231,78,160,70,163,177,105,186,132,86,89,162,73,41,85,112,185,220,239,57,28,50,133,16,130,200,200,168,39,43,87,174,180,86,211,203,16,25, + 25,245,132,203,229,52,162,148,130,16,206,58,150,53,43,172,105,90,235,31,33,100,137,80,40,154,5,0,62,62,190,143,79,156,56,97,24,62,124,56, + 150,46,93,42,152,61,123,246,204,224,224,224,169,25,25,25,185,53,245,179,226,245,28,111,111,111,233,166,77,155,66,39,79,158,124,75,46,151,207,1, + 0,63,63,191,197,0,154,3,72,175,178,13,235,215,239,125,58,97,194,132,20,133,66,49,167,38,205,87,8,105,28,28,30,222,115,209,165,75,148,163, + 215,147,130,95,126,81,229,43,20,166,71,249,249,210,109,55,110,12,156,183,120,49,63,48,40,8,23,142,30,245,40,208,104,242,149,122,189,78,161,80, + 80,134,97,174,212,164,89,133,8,47,79,79,233,134,111,215,93,119,228,115,89,111,127,127,194,115,115,225,115,164,206,66,14,143,167,107,20,220,68,0, + 32,162,134,99,86,169,41,16,8,222,232,211,167,143,116,239,222,189,36,50,50,18,46,46,46,248,229,151,95,112,251,246,109,152,76,38,78,113,113,49, + 218,182,109,139,111,190,249,6,65,65,65,40,41,41,65,102,102,166,135,80,40,244,172,229,120,62,115,62,205,154,53,11,190,190,190,96,24,6,69,69, + 69,96,24,6,14,14,14,0,128,236,236,108,28,61,106,189,34,75,109,223,123,13,237,209,177,99,71,53,33,228,126,181,183,238,87,105,83,167,166,191, + 191,255,143,121,121,249,253,123,246,236,137,226,226,98,211,103,159,125,134,22,45,90,32,44,44,204,106,251,170,154,173,91,183,126,217,108,54,79,0,0, + 163,209,24,231,235,235,59,120,249,242,229,193,28,14,167,242,6,199,226,201,82,42,149,197,9,9,9,201,175,189,246,90,247,219,183,111,103,181,108,217, + 50,243,206,157,59,202,234,154,148,210,207,249,124,254,111,206,206,206,95,238,222,189,91,216,162,69,11,38,47,47,111,214,229,203,151,115,151,45,91,70, + 101,50,25,201,201,201,209,54,106,212,104,103,108,108,108,216,180,105,211,228,203,151,47,87,239,217,179,231,154,86,171,157,78,41,45,177,117,236,245,197, + 174,105,215,180,107,218,53,255,10,182,218,34,255,82,142,85,143,211,122,198,163,21,27,27,75,142,29,59,70,109,24,88,97,64,64,64,160,68,34,1, + 0,155,10,192,86,197,108,54,79,245,240,240,200,155,51,103,78,151,208,208,80,195,212,169,83,19,210,210,210,230,86,109,211,176,97,195,47,191,251,238, + 59,164,164,164,164,47,94,188,248,114,65,65,65,189,130,119,41,165,179,9,33,43,1,32,39,39,167,224,232,209,163,45,46,93,186,52,101,197,138,21, + 158,239,190,251,174,96,218,180,105,163,1,44,173,75,135,203,229,106,172,77,23,90,195,215,215,215,96,45,134,203,194,32,66,36,78,66,97,143,69,151, + 46,81,67,122,186,102,203,242,229,142,27,126,255,125,129,137,82,111,47,47,47,116,237,220,185,84,204,229,22,228,229,230,178,94,141,27,115,211,78,156, + 240,208,10,133,242,189,123,247,42,11,11,11,15,215,245,249,132,16,149,153,101,141,142,254,129,204,240,151,251,68,92,191,118,251,129,163,167,7,39,186, + 117,100,84,82,74,250,77,106,54,155,8,33,86,107,50,86,197,217,217,57,180,176,176,16,42,149,10,158,158,158,88,185,114,37,124,124,124,160,209,104, + 112,245,234,85,26,16,16,64,46,93,186,132,128,128,0,228,231,231,195,96,48,64,173,86,231,233,245,122,171,181,25,41,165,10,30,143,183,149,195,33, + 99,9,33,104,212,40,36,99,237,218,181,6,150,101,209,172,89,51,188,252,242,203,56,120,240,32,18,19,19,45,158,39,67,112,112,131,12,14,135,4, + 151,239,94,187,135,176,54,44,165,125,158,62,125,58,172,238,214,127,134,16,194,241,243,243,27,221,180,105,211,41,175,189,246,154,73,40,20,162,172,172, + 12,26,141,6,137,137,137,166,254,253,7,148,12,30,60,200,57,46,46,174,198,126,154,76,166,9,183,110,221,234,162,211,233,138,135,15,31,238,186,104, + 209,34,46,143,199,51,2,128,217,92,94,189,199,226,201,218,186,117,235,169,111,191,253,246,252,234,213,171,253,222,121,231,157,238,159,126,250,233,121,0, + 39,173,245,205,100,50,157,13,8,8,184,253,213,87,95,237,218,180,105,147,231,242,229,203,57,102,179,217,143,101,89,152,205,102,176,44,43,49,155,205, + 97,148,82,228,231,231,227,202,149,43,215,181,90,237,216,218,226,232,236,216,177,99,231,191,77,61,108,145,127,29,21,177,212,86,227,180,254,227,171,14, + 185,92,238,134,211,167,79,183,122,233,165,151,120,49,49,49,145,1,1,1,145,217,217,217,9,0,16,16,16,16,217,175,95,191,72,47,47,47,172,90, + 181,74,195,229,114,55,60,207,103,84,187,232,221,242,245,245,93,118,240,224,193,37,147,38,77,130,143,143,79,243,191,101,32,245,192,73,36,106,61,110, + 229,74,134,111,50,113,214,44,91,230,180,252,252,249,37,63,237,219,199,235,216,177,35,161,148,226,222,221,187,146,111,86,175,150,142,26,58,52,61,249, + 241,99,230,200,169,83,38,197,211,167,69,79,243,243,231,83,74,139,234,210,55,153,76,87,83,31,166,250,119,233,209,201,239,151,223,19,111,15,27,58, + 160,39,159,199,33,15,211,159,222,240,245,241,112,190,112,62,94,103,50,153,234,140,203,41,43,43,75,99,24,198,141,82,234,121,225,194,5,120,122,122, + 162,184,184,24,38,147,9,6,131,193,160,209,104,196,133,133,133,208,233,116,208,235,245,112,114,114,194,189,123,247,20,12,195,156,171,73,147,97,152,113, + 98,177,248,115,62,159,47,20,8,4,242,27,55,110,64,165,82,53,112,113,113,89,202,48,12,228,114,57,46,93,186,244,145,147,147,83,58,0,136,197, + 98,8,133,34,119,189,94,207,212,20,12,111,11,207,177,16,178,18,95,95,223,160,70,141,26,45,250,248,227,89,205,90,182,108,133,252,252,124,176,44, + 11,153,76,6,141,70,3,39,39,39,116,234,212,41,109,225,194,133,57,148,98,98,45,198,32,23,0,207,100,50,9,6,15,30,236,44,149,74,75,51, + 51,51,139,194,195,195,3,45,134,86,113,113,241,189,123,247,238,61,24,53,106,84,183,51,103,206,220,191,118,237,218,253,174,93,187,182,228,112,56,13, + 106,235,99,118,118,118,113,64,64,192,180,233,211,167,175,27,60,120,176,11,33,4,60,30,15,157,58,117,66,118,118,54,146,147,147,193,48,12,142,28, + 57,82,92,92,92,188,192,110,100,217,177,99,199,206,63,71,149,24,173,63,21,149,254,143,27,90,10,133,34,63,32,32,224,228,205,155,55,7,142,28, + 57,18,23,46,92,24,3,96,6,0,136,68,162,49,35,71,142,196,205,155,55,241,224,193,131,147,10,133,34,255,239,248,76,161,80,168,51,24,202,157, + 83,98,177,88,92,207,221,27,84,76,25,2,64,131,90,182,213,8,135,199,243,141,234,215,143,87,124,251,182,106,211,181,107,159,239,218,181,139,215,165, + 75,23,98,50,26,97,102,89,132,132,132,144,152,94,189,100,91,119,237,114,51,151,149,93,250,226,227,143,127,217,56,110,92,105,10,165,233,182,116,80, + 175,215,175,126,111,202,196,222,103,207,95,242,11,15,15,113,63,25,127,254,150,187,155,179,52,180,105,83,89,81,113,177,121,238,236,89,60,189,94,191, + 166,46,29,173,86,123,232,204,153,51,67,3,3,3,61,19,18,18,96,48,24,96,54,155,17,19,19,3,74,169,8,0,203,227,241,240,224,193,3,24, + 141,198,188,212,212,84,249,195,135,15,69,0,190,174,77,87,167,211,101,84,125,29,24,24,216,59,54,54,22,12,195,160,95,191,126,56,114,228,72,239, + 164,164,164,229,85,154,148,217,50,238,218,168,240,144,53,243,247,247,63,88,177,201,166,32,248,128,128,128,200,166,77,155,174,255,250,235,175,5,1,1, + 1,160,148,194,213,213,5,26,141,6,5,5,133,136,136,136,64,64,64,0,190,254,250,107,0,216,83,155,199,141,101,89,40,20,138,226,71,143,30,229, + 60,121,242,196,53,52,52,20,132,16,148,149,149,105,45,134,150,76,38,59,118,224,192,129,30,95,125,245,85,68,120,120,120,80,98,98,98,94,191,126, + 253,164,65,65,65,161,11,23,46,228,44,88,176,160,70,3,41,59,59,251,113,243,230,205,7,44,90,180,168,133,217,108,22,122,120,120,204,111,215,174, + 157,203,141,27,55,176,106,213,170,205,148,210,20,55,55,183,171,28,14,199,199,215,215,247,101,46,151,123,241,121,22,132,216,177,99,199,142,157,58,169, + 140,209,66,53,207,150,205,134,86,243,230,205,101,74,165,242,205,6,13,26,8,1,64,34,145,52,111,220,184,241,204,71,143,30,89,173,190,94,27,26, + 141,230,167,93,187,118,245,249,246,219,111,5,3,6,12,104,28,16,16,208,14,0,134,13,27,214,216,209,209,17,187,118,237,50,106,52,154,159,234,171, + 91,19,38,147,233,165,182,109,219,162,168,168,8,233,233,233,9,245,217,247,231,159,127,150,162,60,46,171,214,109,181,193,24,12,174,46,254,254,156,167, + 231,207,27,139,84,42,223,151,186,117,35,38,163,17,28,14,7,133,133,133,200,204,204,132,179,139,11,121,144,154,234,176,121,214,172,159,27,180,108,41, + 52,27,12,238,182,234,83,74,203,8,33,99,222,155,250,238,161,221,187,247,120,148,148,168,30,139,37,18,131,72,200,247,158,54,245,93,115,81,81,209, + 91,148,210,82,27,164,190,222,189,123,119,191,126,253,250,221,13,10,10,242,202,207,207,247,41,41,41,49,23,21,21,113,81,30,107,69,0,224,252,249, + 243,80,169,84,140,217,108,190,4,96,17,165,212,166,41,86,0,104,208,160,129,115,251,246,237,187,123,122,122,66,169,84,194,221,221,29,173,90,181,234, + 222,160,65,131,31,210,211,211,149,182,234,216,66,124,124,188,35,165,180,3,165,20,253,250,245,179,105,31,179,217,252,118,108,108,172,128,16,2,173,86, + 3,177,88,2,153,204,1,142,142,78,8,13,13,131,92,46,71,223,190,125,13,143,30,61,250,62,39,39,167,214,115,148,101,89,228,228,228,232,10,10, + 10,144,153,153,201,47,40,40,0,0,20,23,23,107,45,193,249,127,149,164,164,36,99,64,64,192,99,169,84,250,205,196,137,19,93,24,134,65,227,198, + 141,225,235,235,219,53,47,47,239,74,73,73,201,248,14,29,58,188,213,165,75,23,238,182,109,219,134,0,120,243,111,249,96,59,118,236,216,177,243,12, + 181,198,104,1,181,7,158,249,250,250,118,117,115,115,155,167,213,106,133,150,41,25,66,136,208,211,211,243,136,159,159,223,98,185,92,94,175,160,184,226, + 226,98,149,175,175,239,145,171,87,175,142,24,54,108,24,226,227,227,223,2,128,97,195,134,225,234,213,171,120,242,228,201,145,226,226,226,58,99,138,108, + 33,32,32,160,127,247,238,221,135,181,109,219,22,113,113,113,48,155,205,87,234,222,235,15,170,174,48,132,149,85,135,150,109,54,137,113,185,32,132,128, + 97,24,0,64,65,126,62,82,146,147,81,84,92,12,189,78,135,50,141,198,28,218,176,161,86,105,48,240,9,80,175,185,47,74,105,134,131,131,67,166, + 70,83,230,229,230,225,170,149,137,197,40,81,41,5,55,174,255,166,166,148,62,178,81,195,64,8,233,118,226,196,137,249,92,46,119,164,131,131,3,166, + 76,153,194,237,222,189,59,4,2,1,244,122,61,74,74,74,176,107,215,174,124,134,97,26,1,0,33,196,65,38,147,109,231,114,185,217,42,149,106,94, + 93,159,97,48,24,6,12,28,56,144,103,48,24,240,197,23,95,96,193,130,5,232,215,175,31,239,250,245,235,3,0,236,174,207,152,107,131,101,89,244, + 238,221,187,106,48,124,245,160,120,171,240,249,252,200,38,77,154,32,63,63,31,249,249,249,240,244,244,132,159,159,31,124,124,124,176,124,249,114,186,106, + 213,170,147,70,163,241,251,252,252,252,58,99,199,204,102,51,30,61,122,164,213,235,245,92,14,135,35,49,153,76,2,149,74,101,204,206,206,214,90,206, + 1,181,90,221,111,218,180,105,45,53,26,141,230,193,131,7,153,99,198,140,233,168,209,104,52,153,153,153,41,7,15,30,172,211,26,243,243,243,11,244, + 243,243,219,56,127,254,124,247,192,192,64,200,229,114,4,7,7,99,217,178,101,77,246,236,217,179,181,121,243,230,104,213,170,21,180,90,45,120,60,158, + 204,150,99,96,199,142,29,59,255,45,94,196,248,44,224,47,228,209,10,10,10,114,49,155,205,31,13,26,52,168,247,208,161,67,209,183,111,223,103,222, + 223,189,123,183,227,129,3,7,22,7,6,6,246,51,26,141,95,215,103,170,143,101,217,67,187,119,239,30,208,177,99,71,105,143,30,61,66,0,64,36, + 18,25,118,239,222,173,97,89,246,144,173,58,22,170,39,143,244,247,247,111,193,227,241,134,13,28,56,176,197,216,177,99,145,152,152,136,93,187,118,61, + 12,13,13,189,92,79,233,244,58,86,29,90,182,213,8,87,40,44,44,201,205,117,113,8,10,226,187,58,58,230,196,197,197,5,246,234,213,139,100,101, + 101,161,184,184,24,58,157,14,215,175,95,103,121,64,6,207,213,149,100,92,189,74,184,66,97,189,23,27,4,250,186,54,253,116,246,228,6,58,157,46, + 66,169,84,50,124,62,159,31,224,227,146,85,31,13,74,169,94,38,147,69,3,224,177,44,171,113,115,115,147,158,62,125,26,66,161,16,132,16,68,69, + 69,65,44,22,11,100,50,89,38,0,248,248,248,8,55,108,216,224,60,122,244,232,95,234,210,110,211,166,13,191,97,195,134,131,67,67,67,113,245,234, + 85,36,36,36,100,92,189,122,53,184,117,235,214,8,10,10,26,220,166,77,155,125,55,111,222,52,213,119,220,53,140,227,185,130,225,205,102,51,75,8, + 1,135,195,1,203,178,200,207,207,71,163,70,141,176,118,237,90,172,92,185,242,11,185,92,126,180,30,90,230,210,210,82,142,131,131,131,52,35,35,67, + 37,147,201,28,117,58,157,38,53,53,85,103,241,104,185,185,185,53,143,138,138,10,223,186,117,235,41,129,64,32,106,223,190,125,179,244,244,244,108,150, + 101,109,154,54,22,137,68,147,151,45,91,230,238,228,228,132,221,187,119,99,207,158,61,41,29,58,116,8,157,48,97,2,198,142,29,11,134,97,112,243, + 230,77,108,221,186,53,167,176,176,240,191,154,213,222,142,29,59,118,254,87,169,173,168,116,141,134,86,80,80,208,8,129,64,240,225,171,175,190,202,13, + 11,11,131,66,161,128,147,147,147,169,34,3,53,92,92,92,76,18,137,4,147,39,79,70,203,150,45,187,206,154,53,171,179,191,191,255,218,167,79,159, + 110,183,165,83,10,133,66,227,235,235,187,127,202,148,41,95,223,190,125,171,17,0,252,254,251,239,79,228,114,249,108,133,66,81,227,10,190,26,6,104, + 73,138,73,36,18,201,181,166,77,155,166,245,239,223,223,105,232,208,161,240,244,244,196,205,155,55,241,205,55,223,164,26,12,134,249,23,46,92,96,234, + 163,253,119,192,232,245,185,55,14,31,118,236,254,250,235,78,239,199,198,46,123,119,202,148,111,63,253,244,83,94,88,88,24,209,104,52,184,118,237,26, + 61,112,224,128,105,235,231,159,175,132,76,198,191,122,224,128,208,96,48,100,212,231,51,2,2,2,186,13,232,215,45,108,217,183,171,161,211,150,226,218, + 149,99,40,46,206,199,134,141,7,195,2,2,2,186,101,103,103,95,180,85,139,16,18,26,31,31,239,69,41,133,80,40,196,162,69,139,224,231,231,7, + 39,39,39,168,213,106,204,152,49,195,249,131,15,62,112,6,128,196,196,196,202,244,12,117,33,151,203,59,77,158,60,217,145,97,24,156,60,121,210,64, + 8,153,119,230,204,153,31,162,162,162,132,93,187,118,117,220,177,99,71,103,0,23,234,20,178,129,231,13,134,167,148,62,60,125,250,116,219,145,35,71, + 82,62,159,79,74,74,74,224,226,226,130,181,107,215,150,229,228,228,212,43,7,21,165,116,211,210,165,75,39,0,0,203,178,113,203,150,45,27,62,103, + 206,156,38,89,89,89,101,149,94,205,130,130,115,227,199,143,55,171,213,106,195,188,121,243,134,139,68,34,225,186,117,235,46,80,74,107,205,247,102,65, + 42,149,134,56,57,57,33,62,62,30,59,119,238,220,152,147,147,179,49,40,40,168,117,114,114,242,220,30,61,122,4,102,101,101,177,215,175,95,223,225, + 226,226,178,81,46,151,27,235,125,64,236,216,177,99,199,78,157,212,148,67,11,168,197,208,50,155,205,147,79,157,58,197,101,89,22,27,55,110,196,141, + 27,55,168,84,42,157,39,149,74,191,147,72,36,102,173,86,59,105,194,132,9,163,23,44,88,192,233,218,181,43,174,94,189,202,105,212,168,209,91,0, + 42,13,45,66,72,175,218,114,109,40,149,202,235,10,69,110,163,42,9,42,27,137,68,226,235,181,13,166,186,166,149,164,152,237,23,45,90,84,230,235, + 235,107,72,72,72,192,250,245,235,217,27,55,110,156,23,10,133,27,228,114,185,222,22,205,191,131,170,154,66,134,185,185,115,230,204,102,109,134,12,97, + 199,127,248,97,169,64,34,153,182,108,245,234,89,37,106,181,31,8,161,238,206,206,25,27,23,45,90,220,111,240,224,210,196,139,23,197,183,227,227,249, + 158,38,211,157,250,244,51,59,59,251,98,211,198,65,216,182,233,91,24,141,122,228,60,205,0,0,20,20,42,81,155,145,101,77,147,97,24,229,43,175, + 188,34,0,32,121,227,141,55,132,121,121,121,104,220,184,49,0,64,165,82,225,216,177,99,8,15,15,7,0,220,187,119,175,242,121,93,253,148,201,100, + 131,59,119,238,140,140,140,12,36,38,38,158,149,203,229,133,126,126,126,103,179,178,178,6,180,109,219,22,135,14,29,26,132,26,12,173,250,126,71,182, + 24,90,214,52,37,18,201,236,131,7,15,190,125,229,202,149,145,51,103,206,228,199,196,196,0,0,212,106,181,134,82,106,174,143,230,147,39,79,14,1, + 168,244,206,250,248,248,156,88,180,104,209,150,113,227,198,53,180,244,239,206,157,59,87,1,92,237,221,187,247,167,81,81,81,97,91,183,110,61,85,80, + 80,176,203,146,67,171,166,126,86,133,97,24,24,12,6,16,66,146,0,32,51,51,243,86,155,54,109,70,238,217,179,199,67,34,145,232,228,114,121,137, + 45,99,255,171,216,53,237,154,118,77,187,230,255,103,106,77,88,90,195,14,12,203,178,184,112,225,2,14,30,60,104,54,26,141,19,229,114,121,213,108, + 213,171,253,252,252,226,95,121,229,149,237,201,201,201,220,164,164,36,216,114,33,170,138,78,167,51,17,242,231,109,245,209,176,198,182,109,219,144,155,155, + 107,204,202,202,58,195,48,204,161,191,184,122,241,47,175,58,220,74,169,254,117,66,206,44,232,210,165,247,252,248,120,209,248,79,62,209,143,25,59,246, + 35,179,193,96,226,10,4,172,80,38,227,152,69,34,126,226,197,139,226,85,239,188,227,166,213,235,79,238,172,71,128,57,80,233,209,194,152,241,211,161, + 173,226,209,186,122,61,5,245,245,104,233,116,186,8,0,144,72,36,153,0,124,222,124,243,77,176,44,11,173,86,11,181,90,13,185,92,174,28,59,118, + 172,25,0,100,50,25,111,216,176,97,78,182,232,134,132,132,248,241,249,124,156,60,121,18,124,62,255,24,0,240,249,252,99,241,241,241,3,70,141,26, + 5,127,127,255,16,66,8,161,117,88,73,149,69,165,9,154,0,0,8,154,120,69,14,189,91,165,168,244,253,214,173,91,3,54,198,101,85,165,98,113, + 199,74,15,15,143,125,179,102,205,154,210,190,125,251,62,11,22,44,32,40,79,213,240,151,200,205,205,205,240,241,241,121,251,243,207,63,95,3,224,25, + 239,82,133,103,139,170,213,234,219,55,110,220,176,154,21,190,38,204,102,115,101,94,46,11,21,83,176,117,214,200,180,99,199,142,29,59,127,15,245,246, + 104,17,66,54,118,235,214,109,34,0,46,33,100,253,211,167,79,255,244,227,47,151,203,83,252,253,253,151,54,108,216,176,178,208,116,125,58,85,145,201, + 253,27,14,135,204,42,127,93,255,4,149,244,143,146,57,179,0,16,14,135,187,253,214,173,91,159,100,102,102,230,215,215,240,179,198,223,177,234,16,0, + 118,83,154,54,138,144,83,31,70,70,246,234,247,206,59,104,209,175,159,147,95,112,176,89,107,52,178,247,46,95,38,87,246,239,23,220,142,143,231,107, + 245,250,147,7,41,205,172,111,63,179,179,179,47,54,14,9,56,61,124,216,128,62,33,13,253,0,0,143,211,228,40,40,82,158,174,143,145,85,21,157, + 78,55,100,237,218,181,71,5,2,1,143,86,41,101,99,52,26,139,44,198,24,33,196,111,227,198,141,63,114,56,156,140,186,244,146,146,146,142,204,159, + 63,127,88,122,122,250,233,204,204,204,116,0,200,200,200,72,247,243,243,219,158,147,147,51,44,35,35,227,64,93,70,22,240,167,162,210,72,188,188,79, + 12,32,202,82,84,250,121,107,25,86,165,160,160,32,7,192,60,95,95,223,221,125,250,244,153,0,224,185,115,122,85,37,55,55,55,3,192,192,234,219, + 45,158,173,231,144,100,42,146,148,130,16,242,252,201,195,236,216,177,99,231,223,79,91,0,150,74,36,22,7,138,103,181,231,6,84,148,11,172,192,242, + 58,31,192,245,42,26,85,183,215,181,47,0,20,0,184,91,177,237,79,84,95,113,8,216,16,163,245,244,233,211,3,176,161,104,180,173,237,106,130,82, + 58,135,16,178,170,226,249,115,101,1,175,170,193,48,204,115,105,84,135,195,225,164,13,26,52,168,94,237,235,106,243,35,165,25,211,8,217,17,183,102, + 77,171,147,235,215,251,155,25,198,157,0,148,43,20,22,26,12,134,116,79,147,233,78,125,61,89,85,121,244,56,187,47,0,132,134,134,210,212,212,84, + 80,74,255,210,234,13,74,233,29,0,129,117,180,145,3,232,106,139,94,118,118,246,30,0,123,170,111,151,203,229,63,2,248,209,214,126,85,22,149,6, + 56,44,97,135,71,116,25,177,31,0,107,41,42,253,119,146,147,147,147,140,138,60,111,255,70,138,138,138,206,237,217,179,167,73,66,66,130,210,108,54, + 63,254,111,247,199,142,29,59,118,254,33,218,2,240,36,132,196,1,0,165,116,32,0,16,66,226,170,63,183,180,177,180,171,218,198,162,81,125,123,109, + 251,2,192,236,217,179,63,89,188,120,177,20,128,213,98,204,207,189,234,240,63,197,243,26,88,127,183,70,85,178,179,179,55,253,157,122,22,86,151,27, + 82,54,5,58,63,47,41,41,41,47,228,242,88,91,177,20,149,174,66,228,127,165,35,255,2,114,114,114,182,30,58,116,232,10,128,194,220,220,220,122, + 175,84,181,99,199,142,157,23,4,79,107,134,145,181,134,86,140,171,26,177,214,206,218,107,66,72,220,226,197,139,107,213,179,230,205,2,254,37,134,150, + 29,59,118,158,143,138,210,58,41,255,237,126,216,177,99,199,206,139,72,117,47,22,240,103,227,139,16,18,55,123,246,236,79,80,195,180,97,69,155,103, + 226,179,170,190,38,0,122,213,240,225,54,175,38,32,132,88,213,168,141,186,244,237,154,118,77,187,166,93,211,174,105,215,180,107,254,239,105,214,165,93, + 195,254,177,53,77,245,213,54,141,88,253,121,93,251,218,208,214,106,154,159,218,12,45,75,77,184,127,228,1,160,151,93,211,174,105,215,180,107,218,53, + 237,154,118,77,187,230,95,124,180,165,148,198,162,188,106,10,165,148,198,82,74,251,205,158,61,123,142,101,219,236,217,179,231,80,74,99,44,237,42,218, + 84,238,99,217,86,253,111,245,109,117,180,173,237,152,76,180,60,170,110,183,79,29,218,177,99,199,142,29,59,118,254,237,92,7,208,150,254,225,109,202, + 7,112,111,241,226,197,197,85,98,167,242,1,220,1,208,178,162,93,62,240,167,152,43,67,197,107,131,149,54,6,91,218,214,4,173,33,32,222,110,104, + 213,64,43,95,238,231,65,1,94,209,64,133,215,175,162,100,10,91,110,181,130,86,152,175,96,89,80,74,33,207,43,185,121,87,65,63,125,222,207,11, + 243,39,110,94,98,241,74,150,210,46,21,155,46,42,11,245,211,19,148,244,79,201,38,107,162,153,15,105,38,230,224,35,150,162,5,0,112,8,238,234, + 88,44,189,159,75,235,157,79,170,58,132,16,18,225,137,137,66,137,244,85,103,23,215,38,197,197,5,169,70,157,126,95,82,62,54,84,30,139,122,208, + 216,141,116,96,41,62,1,192,225,115,176,60,165,144,90,93,201,97,199,142,29,59,118,236,84,96,45,161,249,239,54,182,251,71,169,109,234,176,94,134, + 86,132,23,121,7,4,159,1,160,160,88,152,152,71,215,213,107,127,63,210,75,204,229,110,6,192,213,25,205,31,82,22,151,172,118,152,131,151,196,2, + 238,114,0,172,206,108,30,151,40,183,61,94,44,50,128,244,227,177,156,157,44,165,124,51,75,183,131,34,206,65,128,95,175,102,83,93,125,250,26,20, + 224,21,125,248,247,156,62,231,215,189,143,246,45,26,131,154,25,128,53,65,218,245,35,156,93,241,38,218,55,11,2,101,77,0,203,192,161,255,50,244, + 143,116,126,238,28,70,97,254,196,45,216,195,43,97,211,166,205,62,126,33,205,9,203,24,145,252,251,233,209,31,204,154,223,51,210,153,68,218,98,108, + 181,244,35,227,27,55,10,251,104,250,103,223,114,253,252,2,101,102,70,207,228,62,185,223,122,245,146,249,7,90,250,145,229,119,228,116,179,45,125,33, + 132,144,230,158,152,196,19,9,71,72,196,178,38,26,141,250,161,217,104,218,23,233,199,235,183,116,217,202,86,221,123,15,112,48,171,115,57,38,22,205, + 127,218,251,99,240,154,181,223,15,32,132,12,166,229,65,217,54,195,82,204,74,217,49,113,0,159,199,37,205,222,222,196,69,13,75,102,235,162,185,55, + 121,141,208,186,211,75,80,130,95,146,20,244,79,169,37,108,161,153,55,249,129,80,132,130,96,63,161,248,49,49,143,230,61,143,142,29,59,118,254,189, + 16,66,182,1,88,65,41,173,87,194,224,58,52,91,0,72,163,148,170,255,46,77,59,47,30,245,243,104,17,124,145,248,40,203,21,102,35,34,66,67, + 62,7,80,47,67,75,204,229,110,191,158,170,240,1,99,196,166,47,167,236,53,152,0,198,100,132,153,49,193,204,152,192,48,70,152,77,38,80,147,30, + 243,183,156,7,12,106,68,71,54,221,14,192,215,214,207,224,83,206,206,155,151,79,187,17,131,18,123,214,45,126,47,43,191,244,189,51,119,229,5,17, + 222,100,78,82,30,182,214,199,32,56,191,254,125,236,58,116,44,123,213,15,101,15,88,74,225,230,36,9,27,61,48,49,112,199,145,243,89,43,183,235, + 30,0,128,179,76,24,246,214,221,212,160,250,28,135,234,120,137,197,43,55,124,191,198,199,215,93,66,152,43,95,131,49,155,17,24,28,203,157,51,117, + 180,239,23,43,54,175,0,48,166,182,253,195,189,73,243,208,198,205,62,220,126,236,74,144,70,157,103,56,189,235,147,71,84,15,147,143,127,51,254,231, + 139,191,229,206,253,248,253,25,225,222,228,180,173,209,230,0,0,32,0,73,68,65,84,218,3,5,77,170,77,135,252,31,123,231,29,30,69,245,189,241, + 247,206,204,182,108,202,166,55,66,66,2,36,132,16,8,189,247,38,4,190,244,174,136,32,69,81,192,2,72,199,66,81,105,74,145,34,82,148,46,136, + 132,26,149,222,36,212,96,8,132,154,222,235,102,235,204,220,223,31,41,134,144,182,1,177,252,230,243,60,251,108,102,118,231,157,59,187,155,157,119,207, + 61,231,12,33,76,125,87,252,180,120,201,151,141,186,244,234,99,35,230,165,178,122,109,94,192,198,205,155,22,4,54,106,161,110,31,236,37,79,217,51, + 145,232,114,51,96,98,84,202,46,13,186,217,233,94,29,110,222,184,229,251,201,0,190,178,228,152,133,18,211,214,162,88,253,174,235,132,162,253,181,139, + 191,77,16,18,126,7,21,204,128,96,42,190,135,96,6,21,11,238,91,78,220,12,148,209,195,171,42,48,20,61,194,207,254,238,145,156,148,216,124,197, + 151,139,62,10,114,37,71,32,96,251,31,25,56,101,169,193,12,118,35,190,53,221,29,247,240,130,168,59,118,43,179,216,32,190,217,132,116,182,178,177, + 237,173,207,203,61,177,225,42,61,94,157,113,74,72,72,84,31,134,97,250,16,66,58,18,66,94,161,148,222,121,17,154,28,199,185,2,112,36,132,92, + 166,148,106,171,171,67,8,249,16,192,184,194,197,77,148,210,47,158,119,108,132,16,47,0,238,133,139,73,148,210,184,231,213,252,127,78,88,169,11,75, + 23,39,205,91,58,117,168,2,21,129,189,253,1,192,202,210,81,80,64,5,194,2,102,45,250,245,234,14,103,87,119,192,156,15,152,242,1,179,14,48, + 107,1,179,14,105,137,143,1,147,22,184,127,4,60,165,74,75,247,3,67,54,16,189,7,93,155,120,195,69,163,194,148,126,65,206,27,142,70,111,218, + 116,252,78,55,0,195,170,52,86,74,209,178,97,93,172,218,164,141,58,24,145,210,19,0,66,27,59,31,109,25,228,83,115,229,86,125,84,216,141,140, + 87,0,160,87,176,230,72,139,122,30,222,34,170,223,148,91,164,180,189,103,173,186,68,184,182,30,98,78,28,114,114,116,136,123,184,13,14,53,154,50, + 130,136,142,149,109,111,197,98,230,187,115,150,202,242,115,146,141,130,41,85,112,102,50,57,78,41,18,36,156,50,104,197,44,97,234,155,175,10,31,204, + 91,52,19,192,168,138,116,130,92,49,121,217,178,149,13,219,54,11,116,77,218,55,133,228,101,38,131,103,213,202,126,173,219,194,222,63,72,76,62,185, + 140,40,106,119,131,189,83,109,196,159,255,1,143,46,254,72,218,53,25,168,252,110,135,252,85,148,99,180,252,93,72,187,158,29,90,236,170,237,237,233, + 65,169,8,81,164,160,162,128,55,6,247,192,71,187,239,67,16,4,12,234,217,174,235,210,9,93,168,40,138,160,84,68,108,82,122,254,175,151,162,186, + 198,100,208,75,149,29,59,37,56,19,210,170,115,187,27,17,23,3,205,209,63,163,217,168,197,81,4,56,91,252,56,208,238,234,177,239,2,129,205,149, + 73,149,9,33,132,212,119,133,240,232,232,18,120,119,24,207,174,223,113,212,37,59,53,126,244,190,109,107,7,175,91,191,254,123,0,19,171,170,21,236, + 70,124,95,233,217,253,151,197,27,246,215,122,189,123,224,131,146,143,217,105,28,250,46,249,241,198,91,7,214,205,13,30,31,66,50,55,92,167,87,170, + 53,96,9,9,137,106,161,82,169,204,27,55,110,180,30,61,122,244,145,194,235,248,61,119,3,96,133,66,33,126,251,237,183,236,168,81,163,154,23,154, + 173,124,75,53,188,188,188,58,0,248,188,40,67,131,16,242,185,175,175,239,60,0,16,197,103,126,231,101,11,130,48,42,46,46,174,204,217,162,34,250, + 244,233,227,9,192,183,132,166,47,33,196,183,172,231,218,219,219,11,109,218,180,121,116,232,208,161,4,75,199,254,255,9,74,105,34,128,23,146,163,21, + 245,100,207,148,38,134,196,60,0,136,170,194,142,159,154,242,211,155,133,37,91,22,188,182,164,65,45,71,228,106,141,56,126,229,17,4,193,12,129,231, + 11,35,91,60,4,222,140,158,33,206,104,163,159,136,175,14,221,1,47,136,139,43,210,44,141,137,138,35,26,119,27,186,91,20,169,66,41,99,178,3, + 106,58,185,190,63,40,132,153,210,175,1,116,38,126,104,144,27,249,245,118,50,125,170,25,105,185,154,34,255,236,49,149,181,78,40,99,93,21,203,91, + 3,221,72,203,225,125,186,219,81,67,54,204,105,247,145,155,111,198,253,116,51,146,244,89,80,146,167,47,85,87,158,166,72,209,168,134,135,135,245,185, + 93,51,30,58,113,57,156,43,199,203,20,148,151,9,34,101,145,117,219,224,20,216,157,43,202,219,170,104,156,86,106,219,215,58,244,8,213,60,249,97, + 60,177,10,232,9,215,38,53,241,240,244,22,164,92,57,132,188,188,28,162,204,206,130,155,83,29,244,26,53,12,95,12,107,142,220,156,92,176,137,49, + 26,133,76,105,95,158,38,21,48,106,217,210,207,60,56,150,41,120,61,139,110,130,25,58,131,1,16,120,168,56,17,132,22,61,102,134,96,54,169,27, + 13,156,241,22,128,75,101,105,150,228,118,50,221,209,192,149,180,135,104,14,164,102,29,8,112,54,50,133,22,155,159,32,55,50,162,105,207,49,237,41, + 193,153,138,142,189,60,130,157,208,167,153,175,141,181,117,78,20,226,246,190,131,24,168,168,91,219,113,24,241,198,100,245,134,13,27,250,18,66,38,149, + 204,81,43,169,249,74,67,135,225,10,153,108,22,0,100,229,229,111,169,235,227,54,110,246,135,83,106,49,114,117,177,126,81,36,43,63,47,215,124,235, + 196,214,187,93,58,117,104,124,237,244,241,55,222,10,38,247,215,222,42,152,50,174,234,103,201,18,36,77,73,243,101,104,106,52,26,191,90,181,106,205, + 51,155,205,29,228,114,185,155,201,100,130,40,138,73,10,133,226,204,163,71,143,62,206,206,206,126,80,214,118,127,199,177,219,216,216,144,222,189,123,59, + 174,92,185,146,159,58,117,234,9,66,72,103,74,233,227,231,209,180,179,179,67,175,94,189,228,171,87,175,166,147,39,79,110,65,8,185,68,41,213,89, + 162,41,147,201,182,159,61,123,22,187,119,239,6,0,68,71,71,195,223,223,223,186,172,109,31,62,124,104,221,169,83,167,237,40,117,69,143,210,154,55, + 111,222,244,251,249,231,159,177,119,239,94,0,192,157,59,119,16,16,16,80,230,120,206,158,61,203,142,28,57,210,15,192,83,70,235,175,120,143,254,205, + 84,154,163,21,22,22,70,67,67,67,73,233,191,203,224,190,183,131,162,9,244,2,0,88,236,246,111,39,209,165,33,30,178,87,126,217,187,166,131,74, + 206,96,254,198,247,99,83,51,114,91,113,4,34,0,240,20,140,131,141,226,194,226,209,33,222,153,121,122,28,188,28,127,58,50,217,178,16,105,100,2, + 61,1,160,248,196,31,236,68,2,70,127,113,98,231,206,153,175,52,154,214,175,17,126,58,255,104,26,128,74,187,190,83,81,4,21,249,226,228,119,0, + 128,40,2,34,143,18,231,85,136,160,5,235,68,203,34,90,157,8,225,50,93,209,203,81,173,88,61,97,194,155,118,230,212,187,200,48,202,17,155,169, + 71,146,78,134,60,206,21,241,81,55,5,134,224,68,101,90,132,32,7,130,222,222,81,97,195,4,119,127,171,70,206,177,89,153,10,202,179,118,253,63, + 181,79,251,101,249,35,94,151,170,37,4,149,94,172,91,163,177,247,215,167,63,98,179,51,211,96,239,222,0,175,12,237,131,133,161,65,200,205,209,34, + 245,124,24,173,235,97,71,30,159,249,30,179,123,213,71,122,114,34,12,102,128,104,13,25,122,163,62,175,60,77,202,96,253,212,15,166,143,240,241,112, + 177,46,42,42,160,162,128,144,250,181,209,189,67,75,156,56,123,14,191,223,140,134,88,88,84,64,69,17,113,41,153,201,122,147,176,197,162,23,84,224, + 65,205,207,166,225,21,230,101,89,60,101,216,208,141,168,5,96,110,171,186,182,99,103,246,241,177,181,86,18,232,205,2,244,70,51,114,207,173,134,83, + 173,134,80,171,84,164,9,116,28,80,246,107,171,224,200,172,253,191,92,14,18,19,34,240,197,188,169,243,71,244,235,108,99,45,22,164,219,81,190,192, + 156,219,217,59,244,253,236,187,35,19,126,220,188,252,220,230,175,62,187,58,103,193,167,142,67,70,142,104,243,205,170,229,29,0,252,100,233,184,37,36, + 254,9,12,25,50,68,149,156,156,124,50,52,52,52,168,123,247,238,234,246,237,219,67,171,213,226,248,241,227,208,106,181,62,53,107,214,244,57,126,252, + 248,192,86,173,90,221,246,242,242,234,180,103,207,30,75,114,104,57,252,121,145,119,17,0,79,8,65,225,58,2,64,164,213,188,206,45,195,48,232,220, + 185,179,235,218,181,107,83,223,126,251,237,112,66,72,71,90,112,153,177,231,162,67,135,14,138,117,235,214,25,39,77,154,212,130,16,114,145,82,106,168, + 234,182,121,121,121,242,26,53,106,192,197,197,5,130,32,64,171,213,226,192,129,3,200,206,206,134,40,138,176,178,178,194,167,203,54,34,234,234,73,92, + 186,116,9,217,217,217,242,202,52,227,226,226,72,72,72,8,180,218,130,217,76,189,94,143,240,240,112,24,12,6,240,60,15,142,227,48,253,147,21,136, + 190,114,18,215,174,93,67,92,92,220,75,185,218,136,5,94,228,95,197,75,175,58,20,4,254,163,13,91,119,94,248,104,226,48,76,30,222,173,230,199, + 107,126,236,118,59,149,110,5,128,32,23,50,250,213,206,117,189,237,213,50,44,252,225,10,64,233,71,207,187,191,91,233,52,186,129,59,153,182,255,210, + 227,147,179,134,53,65,109,15,59,255,58,117,136,34,38,166,10,215,20,20,121,56,216,40,235,133,54,118,62,10,81,132,189,173,50,16,2,15,123,27, + 101,189,94,193,154,35,0,96,175,150,7,150,21,249,42,143,230,222,242,241,106,37,55,222,186,169,135,247,235,125,187,91,245,238,59,208,202,70,198,35, + 253,210,113,228,200,188,96,118,244,129,193,156,129,184,7,49,194,47,23,255,136,79,203,53,188,95,233,48,41,78,199,63,184,227,226,215,168,187,67,218, + 161,217,41,126,99,126,240,101,32,50,185,223,15,72,182,118,109,97,117,249,222,131,60,145,62,27,209,41,77,78,118,246,35,179,0,15,157,192,217,198, + 252,246,29,102,246,106,136,204,140,20,232,77,60,178,117,188,201,221,94,165,52,60,184,5,131,137,135,209,44,66,102,95,3,199,47,220,76,19,205,230, + 35,229,105,198,164,209,107,0,108,74,174,171,227,66,66,102,216,89,93,131,89,135,199,113,9,216,26,118,161,73,225,243,170,13,21,249,130,233,231,66, + 138,146,228,171,147,4,95,223,141,180,176,82,201,191,254,124,218,200,160,214,1,142,74,49,238,2,136,104,130,181,192,65,167,16,160,169,89,27,162,49, + 151,230,235,245,89,145,64,185,111,62,11,202,17,153,10,12,39,195,43,141,221,108,60,172,204,16,238,133,129,169,55,16,16,11,188,89,118,78,230,213, + 63,206,255,124,191,71,135,214,33,167,143,236,123,112,237,210,249,152,22,45,155,215,23,41,234,84,247,181,144,144,248,59,9,12,12,116,215,104,52,145, + 31,124,240,129,227,128,1,3,176,127,255,126,228,228,228,96,203,150,45,88,185,114,37,22,44,88,0,179,217,140,13,27,54,168,247,237,219,215,98,237, + 218,181,113,62,62,62,13,30,63,126,156,84,137,52,1,160,4,32,67,193,185,139,0,16,15,31,62,140,222,189,123,227,240,225,195,98,225,58,129,16, + 98,182,196,204,20,193,48,12,20,10,5,66,67,67,93,100,50,25,198,143,31,255,27,33,164,61,165,213,47,128,97,89,22,114,185,28,125,250,244,81, + 40,149,74,140,25,51,166,21,33,228,2,173,226,117,109,121,158,103,227,226,226,144,157,157,141,238,125,251,98,197,226,197,232,220,185,51,186,119,239,14, + 74,41,194,195,195,209,173,109,48,134,253,175,19,254,248,227,15,240,60,95,165,243,122,82,82,18,146,147,147,241,74,223,190,216,184,118,45,90,182,108, + 137,122,245,234,129,231,121,156,60,121,18,131,123,182,133,170,127,55,68,71,75,23,158,168,34,47,44,71,235,185,185,149,66,47,6,185,144,67,195,123, + 182,232,211,183,93,16,54,238,250,229,179,160,32,178,19,0,156,108,149,159,190,214,185,54,110,63,201,196,47,215,18,14,221,78,165,47,228,154,128,162, + 0,103,39,59,53,192,42,160,51,137,188,221,125,84,154,192,44,82,10,117,135,25,120,181,239,237,154,45,131,106,214,44,170,58,180,233,189,28,163,111, + 222,243,110,94,207,221,27,130,25,16,204,176,27,246,3,240,73,153,145,220,167,104,231,167,60,49,227,253,105,109,122,245,31,106,165,80,107,32,228,196, + 194,156,116,19,233,119,79,67,171,246,71,210,227,251,216,125,236,82,246,221,184,244,28,134,193,241,228,108,195,135,49,25,180,220,104,81,17,122,51,22, + 207,155,253,126,232,238,157,187,108,149,181,219,145,152,213,189,179,21,28,175,116,241,107,202,228,171,156,233,162,45,187,236,180,70,44,169,76,39,95,155, + 243,99,248,241,163,195,234,250,181,179,125,248,123,24,116,122,3,12,102,160,65,139,78,16,4,170,32,12,17,237,88,150,164,164,103,130,152,133,228,51, + 215,31,38,158,189,126,159,53,216,86,174,93,18,142,176,239,246,237,212,24,48,235,240,191,14,13,177,226,251,95,222,1,48,198,18,141,103,16,11,34, + 90,20,104,215,192,149,124,3,160,221,149,3,43,3,155,245,159,10,88,16,209,10,118,33,189,130,235,120,126,183,226,211,25,142,78,94,254,44,17,205, + 160,238,141,128,156,56,74,226,46,64,83,163,21,4,207,54,216,240,213,151,121,162,72,119,86,212,218,130,10,60,132,7,191,130,191,241,29,242,243,114, + 32,228,167,3,32,96,51,239,67,20,10,140,150,96,141,189,135,119,111,235,254,193,251,83,124,125,189,125,28,163,239,68,101,118,106,223,92,229,238,230, + 18,184,144,16,102,190,133,201,246,18,18,127,55,122,189,254,199,165,75,151,58,246,233,83,208,142,40,47,47,15,23,46,92,192,166,77,155,96,109,253, + 244,247,100,239,222,189,65,41,117,156,63,127,254,143,0,90,151,167,217,170,85,171,190,107,214,172,73,104,220,184,241,125,20,152,45,57,0,230,214,173, + 91,76,108,108,44,113,112,112,160,158,158,158,230,132,132,4,17,128,240,198,27,111,176,54,54,54,117,243,242,242,78,89,50,118,66,8,20,10,5,20, + 10,5,134,14,29,234,194,178,44,25,55,110,220,201,66,179,85,237,107,137,42,20,10,200,229,114,12,30,60,88,65,8,33,227,198,141,43,50,91,166, + 202,182,21,4,129,59,124,248,48,174,92,185,130,5,141,27,99,90,141,26,112,116,116,196,201,147,39,65,41,133,181,181,53,50,50,50,176,115,231,78, + 116,233,210,5,60,207,87,26,209,2,128,189,123,247,34,34,34,2,159,52,107,134,105,26,13,108,108,108,16,30,94,48,27,168,84,42,241,248,241,99, + 132,135,135,163,83,167,78,213,61,236,255,87,188,144,28,173,78,132,112,196,13,238,38,163,14,148,167,0,129,103,80,16,145,223,190,93,249,7,165,52, + 12,131,217,95,109,61,20,186,124,106,95,50,190,95,19,207,143,191,251,109,18,0,140,29,20,80,67,173,228,176,234,167,219,148,97,48,219,82,221,178, + 8,10,34,114,134,193,164,238,45,235,33,33,203,136,152,132,172,95,111,83,90,233,52,26,0,252,178,252,85,108,59,120,50,118,229,54,125,20,165,20, + 246,54,202,122,163,111,196,120,127,119,56,226,201,178,221,250,40,42,82,216,171,101,129,99,254,104,91,105,213,97,115,111,249,248,143,102,124,216,182,223, + 152,15,84,124,212,30,24,99,142,65,52,233,144,99,146,35,139,117,71,220,147,39,88,180,225,80,108,142,214,56,236,86,138,101,6,51,58,141,230,5, + 185,144,1,139,22,206,58,177,248,211,249,54,249,247,79,230,177,132,215,177,62,29,185,79,23,44,39,185,6,227,208,152,140,202,203,139,13,182,88,178, + 116,217,87,161,111,142,26,24,21,224,223,209,73,72,120,224,164,207,201,73,249,225,104,132,59,10,126,41,18,0,136,137,75,71,106,182,150,23,120,243, + 41,91,25,62,142,172,74,116,176,144,218,110,196,101,64,251,70,35,93,108,229,208,229,101,193,213,86,134,158,45,235,140,172,237,70,102,220,79,166,21, + 54,131,171,16,209,12,106,214,225,226,146,46,129,84,48,7,66,48,195,116,99,187,197,50,148,96,218,228,14,54,118,14,198,135,12,180,214,128,149,51, + 136,157,15,160,241,37,178,250,67,145,112,63,146,127,103,228,168,244,7,143,226,190,117,182,66,197,211,218,212,12,33,233,26,132,252,116,228,107,181,16, + 242,51,10,126,130,167,220,126,58,255,79,20,0,67,14,64,121,128,146,130,226,144,231,40,174,144,144,248,59,121,252,248,241,107,31,125,244,209,217,150, + 45,91,186,57,59,59,163,97,195,134,56,120,240,32,62,248,224,131,226,231,52,110,220,24,148,82,100,100,100,96,233,210,165,73,9,9,9,175,85,164, + 25,21,21,117,103,219,182,109,237,131,130,130,76,114,185,60,11,128,50,43,43,75,149,145,145,65,244,122,61,68,81,20,53,26,141,144,144,144,96,30, + 54,108,152,225,252,249,243,117,180,90,237,19,75,198,77,8,41,142,104,41,20,10,204,157,59,55,41,60,60,60,135,101,89,119,0,95,3,24,94,157, + 215,131,101,217,98,205,217,179,103,27,127,253,245,87,51,203,178,10,0,65,0,44,138,228,243,60,143,102,205,154,225,216,233,171,56,252,203,121,228,36, + 220,193,164,55,95,67,195,134,13,113,236,216,177,234,12,15,0,16,18,18,130,163,225,103,113,246,202,117,60,142,190,129,119,38,189,137,6,13,26,224, + 232,209,163,213,214,252,255,6,33,196,3,64,104,201,117,165,251,104,117,10,11,11,43,250,102,127,198,190,214,119,33,33,158,117,21,219,231,247,170,83, + 95,214,125,62,136,204,10,123,252,143,182,157,189,104,117,84,67,55,50,234,102,114,229,213,97,37,185,149,76,35,27,184,146,29,215,255,8,28,249,191, + 150,53,177,241,160,122,46,0,12,109,239,135,203,119,83,113,41,58,101,71,100,10,141,180,248,72,75,209,208,141,168,65,177,99,233,187,253,58,249,120, + 185,99,211,254,179,32,4,63,86,101,91,74,41,109,25,228,131,149,219,74,87,24,186,123,47,219,173,143,58,118,43,167,23,0,244,168,111,125,164,121, + 29,7,239,202,154,118,90,41,184,9,189,6,190,170,226,163,15,2,143,194,65,120,3,116,38,17,137,105,185,200,215,212,196,201,11,215,117,217,122,227, + 212,72,11,77,86,17,183,83,233,253,198,30,228,137,86,171,243,80,187,212,209,115,68,164,121,122,17,151,111,63,202,142,76,172,90,169,114,76,12,53, + 182,246,34,237,191,217,186,123,158,76,174,24,202,18,16,87,141,181,203,55,43,62,129,173,173,13,68,99,30,160,77,197,128,183,23,165,222,140,55,249, + 1,64,128,51,177,233,80,91,190,149,99,72,220,175,247,140,115,42,219,7,49,99,226,168,158,141,101,162,81,139,119,151,238,194,250,25,253,240,106,215, + 250,178,176,115,209,19,1,124,92,157,99,7,10,162,71,212,172,67,235,89,167,163,8,112,150,2,237,174,236,254,52,16,184,90,101,141,166,132,200,56, + 15,82,191,145,183,181,92,140,59,7,49,238,28,101,107,182,5,241,238,64,136,123,51,250,245,231,11,180,27,55,110,58,46,50,88,88,89,171,12,0, + 16,69,1,124,236,37,80,222,12,29,231,0,176,10,8,121,137,224,19,175,22,244,96,3,192,230,97,64,247,208,198,65,186,236,84,253,195,199,241,25, + 255,235,209,182,158,46,55,67,159,148,156,22,181,81,138,102,73,252,11,161,148,222,183,183,183,127,165,119,239,222,191,28,59,118,204,49,56,56,24,0, + 112,229,74,65,33,109,179,102,205,16,16,16,128,228,228,100,12,31,62,60,45,49,49,241,149,202,42,252,114,115,115,239,239,221,187,215,53,47,47,175, + 201,220,185,115,147,125,124,124,114,244,122,61,201,202,202,18,121,158,135,131,131,131,162,113,227,198,104,211,166,77,222,249,243,231,125,99,99,99,115,0, + 60,180,100,220,122,189,30,89,89,89,250,208,208,208,148,149,43,87,250,36,38,38,218,71,69,69,253,104,54,155,191,5,80,173,169,195,252,252,124,100, + 101,101,9,189,123,247,54,174,90,181,202,42,41,41,73,22,21,21,149,100,50,153,98,81,193,5,138,75,83,242,244,114,253,250,117,156,186,26,7,206, + 168,131,34,53,1,23,247,239,69,223,9,111,129,231,171,158,194,82,154,235,215,175,227,64,248,69,88,43,57,220,185,19,137,189,123,247,98,210,164,73, + 207,165,89,77,42,244,34,255,112,66,41,165,27,74,39,197,3,133,70,43,52,52,244,20,10,163,21,37,169,83,135,40,148,121,152,223,179,89,141,233, + 67,219,213,97,205,57,9,16,5,17,172,12,112,117,182,195,246,237,59,252,118,236,218,117,33,164,134,236,43,145,231,103,223,76,182,168,116,117,254,242, + 93,103,135,110,127,191,19,55,169,87,160,35,0,200,57,6,171,14,70,242,0,230,87,255,88,129,214,94,68,149,103,198,120,119,39,205,220,143,198,133, + 58,118,106,22,128,83,151,110,225,171,189,23,78,43,82,176,173,170,58,84,52,163,180,127,42,171,234,16,98,229,121,151,130,64,221,229,214,14,48,61, + 250,13,48,233,161,55,152,16,155,46,32,54,67,15,78,45,199,149,232,56,157,83,18,14,85,42,84,14,132,16,210,174,182,202,115,238,103,203,188,244, + 186,60,62,39,51,141,151,43,46,202,212,86,202,196,202,183,254,147,11,113,84,223,209,79,222,148,66,100,229,10,154,63,243,189,215,173,227,34,143,193, + 159,77,0,161,20,86,245,67,97,107,197,202,219,251,202,159,0,128,175,187,70,177,116,225,7,154,169,51,22,86,154,3,22,68,136,188,97,115,247,169, + 193,62,14,56,29,17,133,211,55,31,71,158,190,114,167,65,231,134,158,8,240,178,159,18,68,200,146,219,85,8,165,151,9,229,1,179,190,184,234,48, + 200,141,140,104,62,116,78,153,213,134,229,225,11,136,209,2,5,97,89,128,48,5,21,144,177,231,192,217,215,166,59,118,31,200,223,180,105,219,39,183, + 83,171,94,156,33,240,60,111,50,27,193,216,250,32,226,193,85,125,139,54,157,84,214,148,194,252,228,66,113,142,150,141,90,21,82,223,91,83,123,247, + 177,223,206,202,100,156,178,113,128,87,157,216,39,143,19,25,130,152,106,188,10,18,18,255,8,178,178,178,110,168,213,234,158,141,26,53,218,242,238,187, + 239,218,142,26,53,202,243,205,55,223,100,0,32,57,57,89,92,185,114,101,194,215,95,127,157,157,150,150,54,198,100,50,85,218,32,148,82,74,9,33, + 231,55,111,222,156,122,234,212,169,6,173,90,181,82,53,107,214,76,112,112,112,224,148,74,165,96,52,26,245,209,209,209,226,253,251,247,61,179,178,178, + 238,2,136,177,244,138,21,90,173,22,126,126,126,15,141,70,227,185,25,51,102,188,254,195,15,63,40,15,29,58,52,220,108,54,207,168,172,82,176,60, + 242,243,243,81,171,86,45,157,40,138,153,51,103,206,244,218,182,109,27,115,248,240,97,15,147,201,116,167,58,9,251,28,199,33,51,51,19,249,73,145, + 80,197,221,69,35,107,6,65,14,54,176,179,179,123,46,83,148,157,157,13,104,227,113,246,236,117,128,231,161,209,104,160,209,104,94,186,209,42,207,139, + 252,75,40,206,209,42,186,175,180,51,124,3,87,50,201,65,129,149,19,66,235,200,125,189,189,96,136,187,130,235,177,121,152,221,170,197,109,86,105,171, + 159,240,90,191,102,3,7,215,66,167,54,205,137,175,135,102,202,146,229,235,222,110,224,70,62,136,76,166,171,170,50,162,200,20,250,160,190,43,217,244, + 219,141,184,137,94,106,29,68,145,226,183,155,137,184,249,40,115,211,31,41,180,204,146,223,114,199,234,73,186,113,96,118,81,74,85,26,107,235,220,198, + 33,129,206,221,90,135,48,175,116,108,6,57,11,156,189,124,29,211,150,255,120,81,20,105,104,68,21,167,13,11,42,12,159,254,63,40,168,48,52,63, + 85,97,72,41,165,5,85,135,21,7,31,88,150,36,229,63,254,221,93,230,228,15,93,204,111,120,148,41,226,113,74,46,114,56,119,24,226,227,1,42, + 62,57,73,105,181,63,213,206,206,206,174,126,65,1,117,86,111,221,11,83,126,54,30,156,220,130,188,204,68,124,250,205,193,58,94,94,94,29,227,226, + 226,78,85,85,139,16,18,240,235,161,29,174,160,0,43,83,226,224,234,221,176,119,182,130,139,181,28,162,46,21,19,166,142,210,244,234,62,74,3,0, + 143,239,92,131,143,186,106,223,65,38,39,12,28,218,185,158,61,204,58,108,61,122,77,207,0,175,108,59,30,25,211,57,208,94,53,180,157,143,195,199, + 9,89,131,80,205,166,162,69,17,173,34,170,83,109,184,135,82,161,190,11,137,217,117,62,197,122,112,247,166,106,57,71,8,205,139,7,181,114,198,186, + 173,123,242,20,230,178,231,223,203,195,104,162,139,94,251,42,98,22,0,100,27,176,37,97,245,254,9,75,103,140,173,163,74,185,8,8,5,159,23,173, + 78,127,120,246,202,31,121,189,222,160,24,55,168,67,39,57,49,41,246,132,157,61,207,154,202,190,106,130,132,196,191,133,252,252,252,8,66,72,195,15, + 63,252,112,196,172,89,179,58,88,91,91,251,1,128,86,171,125,96,54,155,79,3,216,97,137,217,40,52,78,247,8,33,15,30,62,124,232,254,195,15, + 63,104,240,103,63,71,29,128,108,20,52,222,172,86,197,33,207,243,57,60,207,47,167,148,110,246,241,241,233,242,248,241,227,218,131,7,15,102,182,108, + 217,242,46,96,89,30,106,9,77,158,231,249,135,148,210,56,31,31,31,167,216,216,88,245,128,1,3,200,119,223,125,87,11,85,172,220,103,24,70,32, + 132,128,16,2,165,82,137,51,103,206,96,72,104,119,252,17,150,133,96,123,27,180,24,51,1,187,78,156,0,203,178,32,132,128,101,89,139,206,35,28, + 199,225,236,217,179,120,117,248,96,40,57,64,163,209,224,195,15,63,196,79,63,253,4,142,147,174,210,87,85,170,151,163,69,240,241,137,45,139,228,16, + 204,248,121,203,151,56,116,43,207,120,39,21,179,235,165,98,229,94,228,138,169,203,183,77,60,113,246,214,23,111,12,235,163,238,210,185,59,186,116,234, + 204,53,104,222,113,46,128,98,163,85,216,244,173,220,94,27,130,136,79,54,28,141,154,176,235,100,52,129,41,23,195,122,52,167,130,136,79,42,58,152, + 178,52,53,86,54,187,206,94,184,224,0,83,30,30,93,251,85,85,203,175,14,32,152,112,239,222,93,124,189,117,191,120,242,242,157,237,70,30,239,198, + 100,148,221,153,183,220,113,138,60,52,214,138,122,189,130,53,71,68,80,216,171,229,129,84,20,96,175,150,5,246,168,111,125,132,82,74,109,173,100,129, + 84,120,214,187,149,214,212,25,249,245,91,55,111,90,54,118,236,88,235,180,184,36,36,228,220,66,158,162,6,204,234,154,136,185,118,90,151,111,224,43, + 61,137,87,244,122,166,165,165,165,68,92,202,192,174,111,22,195,108,52,32,37,174,192,171,38,164,229,192,206,185,198,5,75,52,77,188,152,221,127,212, + 120,185,194,10,86,163,7,245,81,68,167,26,208,220,203,22,0,64,243,82,241,71,248,89,116,210,158,2,0,220,143,101,224,19,226,89,165,113,218,170, + 228,239,246,106,90,3,15,158,36,226,76,100,252,214,251,233,52,161,182,19,217,26,147,144,53,177,95,43,111,172,248,233,246,59,40,199,28,149,167,25, + 228,70,70,0,104,87,144,12,175,3,5,218,5,185,145,17,85,169,52,44,75,147,147,99,228,178,35,143,231,236,249,61,173,223,244,145,237,237,218,180, + 233,173,0,111,68,174,206,96,190,157,73,115,44,209,60,241,128,238,4,176,179,232,177,96,55,114,96,250,226,13,199,22,189,213,167,78,97,57,58,54, + 94,161,167,0,156,154,214,94,249,69,160,143,166,246,190,19,17,167,51,50,181,155,55,220,250,243,178,75,149,253,31,85,7,73,83,210,124,25,154,133, + 166,103,123,225,237,69,106,198,23,222,94,136,102,33,254,69,81,48,147,201,52,121,206,156,57,135,246,237,219,103,191,115,231,206,247,9,33,223,80,74, + 179,45,213,164,148,158,44,250,219,104,52,222,158,61,123,118,243,253,251,247,203,118,236,216,225,75,8,121,66,203,248,225,95,90,83,20,197,132,102,205, + 154,57,246,237,219,23,130,32,224,238,221,187,120,28,27,139,110,19,223,129,189,189,61,78,223,184,129,59,119,238,96,222,188,121,48,155,205,56,112,224, + 192,51,29,222,75,107,114,28,103,170,83,167,142,188,127,255,254,224,121,30,247,239,223,71,124,124,60,166,77,155,6,141,70,131,136,136,136,98,205,180, + 180,52,112,28,247,204,76,195,95,241,89,250,175,82,145,93,21,32,152,145,125,98,62,86,157,129,201,100,70,96,100,10,45,57,231,189,174,145,19,249, + 249,198,173,168,7,17,231,186,40,144,114,179,96,27,11,136,78,163,137,205,107,114,185,48,229,218,225,254,17,60,76,206,205,139,78,163,22,77,117,1, + 0,21,5,2,83,62,144,120,5,231,79,159,194,201,139,215,241,251,205,40,225,124,68,244,46,70,196,39,183,211,232,93,139,53,41,133,77,232,10,188, + 126,243,158,119,243,0,55,111,8,60,168,104,134,102,216,14,140,185,221,198,187,121,109,123,239,130,72,150,25,14,227,126,5,150,169,42,212,251,253,137, + 105,67,59,63,229,160,220,172,244,86,93,59,182,182,214,212,239,133,180,123,209,184,123,253,172,46,226,86,204,249,223,159,152,44,138,150,148,166,70,141, + 26,29,186,118,172,135,97,19,62,130,41,63,27,247,79,110,70,94,70,18,206,92,176,65,84,78,78,107,0,167,170,170,117,254,177,185,1,0,180,245, + 149,63,177,37,6,247,177,253,251,66,69,244,16,13,57,32,249,105,136,137,55,102,15,250,38,86,0,0,181,146,112,214,52,219,174,42,186,65,62,78, + 254,106,214,140,109,39,34,33,138,5,151,111,18,69,172,219,246,107,204,196,79,94,109,130,32,111,135,16,66,8,177,36,228,79,40,218,255,190,107,97, + 160,254,151,185,128,104,194,217,41,142,129,237,87,101,180,71,53,35,99,55,227,105,60,128,137,245,61,201,250,41,171,142,206,109,118,226,118,187,247,199, + 245,179,3,125,254,10,221,91,201,244,97,176,27,233,57,110,193,183,123,204,2,158,10,3,106,243,140,135,231,174,62,42,106,13,166,203,27,165,174,240, + 18,18,47,157,146,223,59,137,137,137,199,253,252,252,226,15,28,56,224,163,84,42,25,189,94,223,14,168,126,106,7,0,36,37,37,165,213,174,93,91, + 191,111,223,62,43,181,90,77,140,70,163,3,170,144,251,149,151,151,55,97,204,152,49,235,101,50,153,75,225,56,33,8,2,247,197,23,95,200,4,65, + 96,25,134,17,88,150,53,31,62,124,152,23,4,33,85,175,215,79,168,76,147,231,249,152,183,222,122,171,78,101,21,138,59,119,238,4,199,113,38,158, + 231,165,84,134,231,160,252,147,7,197,194,182,175,206,159,15,128,128,98,65,41,147,5,0,184,145,78,19,26,184,146,105,13,154,119,156,95,180,141,165, + 3,208,11,194,224,230,13,3,118,2,128,129,10,175,90,186,61,0,228,24,116,67,27,55,111,189,75,164,148,227,41,221,196,136,216,167,231,241,71,85, + 42,237,202,35,33,37,43,162,232,66,209,34,232,159,211,133,133,109,28,40,165,180,120,186,240,75,21,210,178,13,149,86,143,156,125,96,232,222,220,91, + 62,254,248,185,107,19,4,129,186,179,44,73,210,25,249,245,207,107,178,0,32,46,46,238,84,144,43,57,126,35,196,173,135,115,97,227,241,180,124,32, + 45,31,199,227,82,114,79,85,71,51,75,107,238,55,247,171,159,14,42,100,44,7,74,11,26,138,82,10,189,73,200,40,50,99,141,156,136,231,135,7, + 248,157,44,75,30,87,166,119,233,78,226,138,97,75,194,63,136,124,148,185,233,97,38,189,5,0,15,51,233,173,186,78,100,110,76,82,238,7,183,30, + 103,126,105,105,94,5,37,56,211,124,216,252,103,214,89,162,81,22,127,36,208,235,0,6,52,112,37,221,135,189,255,245,251,132,224,133,92,126,226,86, + 50,125,8,160,105,233,245,27,175,23,68,182,94,196,62,36,36,36,158,31,43,43,171,137,51,103,206,92,145,155,155,59,135,82,250,92,38,171,8,91, + 91,219,200,57,115,230,4,102,103,103,223,173,106,111,46,74,233,37,0,13,95,196,254,75,104,166,3,168,118,187,10,137,103,41,213,67,11,192,159,57, + 90,197,39,207,191,226,6,160,155,164,249,242,53,253,253,253,41,10,127,160,253,147,199,41,105,74,154,146,166,164,41,105,74,154,255,165,27,128,241,165, + 215,73,153,110,255,65,162,163,163,255,173,85,27,18,18,18,18,18,18,255,58,74,70,180,170,92,117,40,33,33,33,33,33,33,33,33,81,57,180,84, + 239,172,146,16,0,221,202,217,168,202,213,4,132,144,50,53,42,25,84,133,250,146,166,164,41,105,74,154,146,166,164,41,105,254,247,52,43,211,182,196, + 127,252,83,40,221,168,244,169,229,191,120,174,242,95,49,47,44,105,74,154,146,166,164,41,105,74,154,146,230,223,171,249,111,190,161,84,110,86,201,101, + 105,234,80,66,66,66,66,66,66,66,226,249,8,43,85,121,24,86,244,135,100,180,36,36,36,36,36,36,36,36,158,3,90,173,206,240,18,18,18,18, + 18,18,18,18,18,149,82,81,31,45,201,104,73,72,72,72,72,72,72,72,60,7,180,130,170,67,201,104,73,72,72,72,72,72,72,72,60,7,21,69, + 180,72,97,118,188,132,132,132,132,132,132,132,132,196,115,80,186,205,3,0,48,0,16,22,22,70,75,222,75,72,72,72,72,72,72,72,188,76,254,205, + 94,132,16,50,190,40,170,85,242,111,64,154,58,148,144,144,144,144,144,144,144,120,46,164,28,45,9,9,9,9,9,9,9,137,191,136,210,61,180,10, + 219,61,0,248,211,104,117,42,12,213,117,122,169,35,147,144,144,144,144,144,144,144,40,224,95,235,69,104,169,203,239,16,66,158,77,134,15,11,11,163, + 161,161,161,228,111,26,163,132,132,132,132,132,132,196,255,115,254,205,94,164,68,84,235,169,136,150,84,117,40,33,33,33,33,33,33,33,241,130,40,50, + 92,82,195,82,9,9,9,9,9,9,9,137,23,64,69,57,90,204,95,188,227,110,146,166,164,41,105,74,154,146,166,164,41,105,74,154,255,101,40,165, + 27,74,220,18,75,62,246,151,26,45,9,9,9,9,9,9,9,137,255,207,72,70,75,66,66,66,66,66,66,66,226,47,66,50,90,18,18,18,18,18, + 18,18,18,47,144,146,57,91,146,209,146,144,144,144,144,144,144,144,120,177,132,21,153,45,169,234,80,66,66,66,66,66,66,66,226,5,82,152,16,95, + 208,176,20,64,153,149,3,148,210,240,170,10,86,167,250,160,50,125,73,83,210,148,52,37,77,73,83,210,148,52,255,123,154,149,105,91,226,63,254,41, + 16,66,198,151,238,14,95,188,76,41,253,203,110,0,186,73,154,146,166,164,41,105,74,154,146,166,164,41,105,254,151,111,0,198,151,117,79,41,125,241, + 57,90,77,9,177,122,209,154,18,127,63,132,16,55,66,136,219,223,61,14,9,137,255,42,132,16,23,34,87,79,248,187,199,33,33,33,81,61,138,114, + 178,74,53,47,125,177,57,90,65,132,140,27,23,236,242,175,84,6,41,0,0,32,0,73,68,65,84,77,67,66,236,110,82,154,95,209,115,93,93,93, + 215,171,213,234,81,249,249,249,90,66,136,88,180,190,208,9,150,188,46,208,253,148,148,148,246,149,237,91,169,84,174,116,115,115,27,151,151,151,151,79, + 8,161,132,16,16,82,112,185,164,210,247,130,32,196,165,165,165,53,179,244,248,254,73,16,128,117,118,115,187,44,99,217,26,150,110,43,136,226,195,228, + 164,164,214,85,222,23,33,139,9,193,244,194,191,63,167,148,126,100,233,62,255,241,16,194,86,229,105,193,128,109,52,48,76,96,152,119,100,192,26,131, + 40,126,3,0,160,84,168,238,174,141,151,73,29,66,17,66,8,52,148,34,155,18,92,87,180,160,49,213,213,123,30,8,33,3,101,50,89,63,59,59, + 59,155,244,244,244,83,0,118,2,24,238,228,228,212,49,39,39,39,207,108,54,255,68,41,253,177,58,218,141,3,200,12,43,133,236,13,157,209,188,244, + 90,52,221,220,212,159,56,129,96,137,66,193,181,215,25,248,207,175,223,165,155,44,28,43,65,65,250,3,0,80,90,248,229,97,9,123,171,248,190,3, + 192,1,7,135,0,165,139,221,47,50,5,251,48,43,57,111,212,224,148,148,216,193,207,241,190,151,132,16,210,26,214,94,63,181,12,125,7,0,214,191, + 8,205,234,224,226,226,242,58,195,48,159,81,74,33,8,194,236,244,244,244,45,47,66,151,16,50,27,128,125,225,98,22,165,244,179,231,212,123,12,192, + 187,112,241,9,165,212,231,121,244,254,63,67,8,89,183,127,255,254,137,157,59,119,198,138,21,43,176,110,221,186,71,169,169,169,75,0,108,165,148,26, + 95,182,206,191,21,90,98,218,176,52,47,204,104,53,32,164,247,235,61,91,174,159,60,180,55,153,250,250,156,10,77,150,139,139,203,183,175,188,242,202, + 171,91,183,110,149,69,71,71,91,249,250,250,130,97,152,98,35,84,242,251,178,86,173,90,98,121,58,69,176,44,187,106,192,128,1,99,246,238,221,171, + 142,136,136,80,215,175,95,191,88,79,20,69,148,254,254,245,245,245,173,80,79,163,209,92,97,89,214,11,120,214,164,149,247,183,32,8,113,233,233,233, + 149,154,55,66,72,79,0,51,43,123,30,128,37,148,210,99,21,61,65,198,178,53,18,18,18,92,171,160,245,20,53,107,214,52,85,245,185,5,145,44, + 76,23,69,202,0,0,195,144,25,42,149,234,27,189,94,255,164,232,113,0,160,148,38,91,50,134,26,53,106,12,162,148,78,0,64,9,33,27,226,227, + 227,247,89,178,189,157,157,221,21,133,66,225,197,113,92,241,155,81,242,125,41,189,44,8,2,53,153,76,113,25,25,25,22,27,236,83,0,121,5,232, + 192,179,236,84,39,103,231,246,17,199,143,91,7,7,7,51,44,203,126,4,224,27,75,245,74,98,188,76,234,8,102,12,209,153,149,125,148,62,11,2, + 12,143,23,68,91,201,12,135,140,151,201,158,151,109,182,8,33,163,71,143,30,61,117,233,210,165,206,10,133,130,217,189,123,119,192,180,105,211,6,174, + 88,177,194,121,232,208,161,182,70,163,81,156,49,99,70,16,33,196,149,82,186,214,18,237,22,245,72,171,192,58,30,243,62,24,219,5,111,205,223,57, + 185,73,61,146,102,173,150,175,27,208,181,142,125,72,29,7,76,255,234,252,187,0,170,108,180,8,33,132,227,184,214,158,158,158,254,122,189,158,7,0, + 87,87,215,226,127,116,150,45,240,79,70,163,209,152,145,145,177,199,146,177,150,197,7,42,85,203,150,246,54,39,230,143,24,109,149,147,153,225,182,42, + 236,224,141,189,112,109,52,24,120,244,188,218,132,144,169,170,154,237,63,91,244,233,66,149,206,200,243,207,171,247,60,48,12,243,89,124,124,188,7,165, + 20,30,30,30,159,1,216,242,130,164,237,139,190,135,9,33,246,149,60,183,42,120,151,208,243,174,228,185,149,66,8,81,113,12,243,150,66,38,235,33, + 8,66,67,0,96,89,246,166,209,108,62,193,139,226,26,74,169,254,121,247,241,15,102,250,196,137,19,187,207,154,53,203,119,250,244,233,152,62,125,122, + 173,141,27,55,174,95,180,104,209,12,66,72,35,74,105,222,75,214,249,87,82,81,142,214,11,49,90,65,132,52,235,26,82,119,223,148,215,135,65,220, + 187,146,224,245,57,229,62,215,197,197,229,219,214,205,154,189,177,117,235,86,0,192,168,126,253,208,163,69,11,216,218,88,67,161,40,24,14,161,4,114, + 153,28,253,167,189,87,233,190,9,33,159,15,28,56,112,228,222,189,123,109,0,96,221,186,117,24,56,112,32,28,29,29,161,86,171,33,151,203,33,147, + 201,158,186,175,12,150,101,189,226,227,227,93,85,42,21,128,2,227,39,138,226,83,183,18,243,178,224,121,30,254,254,254,149,234,22,50,51,59,59,187, + 131,86,171,173,112,190,215,207,207,15,0,42,52,90,69,124,246,233,39,16,121,45,56,14,224,121,192,96,98,32,150,241,219,222,211,211,19,111,189,245, + 214,51,198,211,18,250,244,233,75,0,236,245,244,244,220,151,146,146,226,75,8,222,4,170,21,233,122,251,238,221,187,54,0,16,16,16,240,22,0,139, + 140,22,199,113,94,55,110,220,112,85,42,149,229,70,46,75,152,96,152,76,38,52,105,210,196,162,147,152,27,224,157,193,48,111,54,110,218,116,252,188, + 126,253,172,174,92,185,162,100,24,6,60,207,227,139,47,190,224,41,165,246,65,128,221,109,32,167,60,13,66,200,44,0,175,163,32,74,187,137,82,250, + 197,83,143,83,132,232,204,202,62,247,243,250,183,104,89,107,6,110,71,222,108,81,219,230,0,108,57,67,12,128,151,106,180,236,236,236,250,173,88,177, + 194,101,211,166,77,57,119,238,220,49,125,249,229,151,117,7,13,26,228,11,192,252,222,123,239,197,212,171,87,79,190,98,197,10,151,31,127,252,177,11, + 0,139,140,22,207,224,147,209,131,123,64,103,98,96,48,241,46,30,46,182,219,63,26,215,73,6,106,196,134,61,17,48,155,197,205,85,213,42,140,100, + 181,30,60,120,112,237,29,59,118,112,81,81,81,92,96,96,32,68,81,132,32,8,48,155,205,0,0,81,20,81,183,110,93,75,134,89,38,111,0,1, + 206,110,142,39,90,247,238,101,229,161,82,194,49,51,21,99,229,156,237,22,181,225,123,0,109,170,171,75,8,177,1,167,218,90,167,243,148,110,139,166, + 191,106,21,159,170,197,147,52,94,70,134,236,101,233,158,193,47,36,82,102,41,148,82,112,28,135,216,216,88,184,186,186,90,57,58,58,38,2,88,144, + 145,145,81,238,175,245,127,59,132,144,22,10,142,219,183,109,243,42,247,150,109,218,176,110,30,174,136,190,251,4,28,17,186,221,248,61,162,211,27,147, + 222,159,66,8,25,68,41,189,252,119,143,245,69,227,209,246,237,1,30,237,222,89,71,168,136,133,171,15,230,46,254,124,165,122,226,155,163,217,105,211, + 166,161,102,205,154,190,3,6,12,248,28,192,164,74,117,90,189,61,192,189,205,228,117,160,20,243,191,62,152,187,232,243,149,234,73,213,208,249,175,242, + 220,70,43,136,144,218,13,106,186,30,95,60,125,146,140,30,249,142,201,79,79,65,121,86,198,213,213,117,125,175,94,189,70,109,217,178,165,120,93,235, + 224,96,12,232,210,14,174,78,26,168,173,21,5,167,35,145,224,250,157,135,85,50,4,53,107,214,156,184,111,223,62,155,162,101,79,79,79,200,229,242, + 226,91,73,147,85,116,43,29,249,40,11,149,74,133,240,240,112,112,28,7,150,101,193,113,92,241,173,228,50,203,178,112,115,179,40,117,105,137,70,163, + 105,148,155,155,107,151,149,149,5,111,111,239,28,0,55,74,60,222,40,53,53,213,206,18,65,145,215,98,218,216,250,144,25,47,194,40,107,1,29,215, + 22,231,127,255,3,135,142,157,66,124,66,18,218,181,106,140,215,70,12,198,137,19,39,32,8,150,125,127,83,74,147,9,33,159,255,239,127,125,103,0, + 132,116,237,218,53,107,242,228,201,76,84,84,212,200,1,3,250,7,223,189,123,15,0,192,48,100,58,33,100,149,5,145,45,5,0,156,62,125,26,0, + 148,22,13,170,16,165,82,137,11,23,46,160,104,154,152,97,24,48,12,3,150,101,241,243,61,103,104,141,12,242,147,111,225,157,62,222,240,243,243,3, + 195,84,158,146,216,9,80,157,7,6,16,153,108,154,135,167,167,111,199,218,181,213,225,225,225,44,0,248,248,248,208,196,196,196,172,3,7,14,228,114, + 192,58,31,74,183,86,100,178,188,189,189,219,50,12,243,89,209,107,78,8,249,220,215,215,119,94,209,227,162,40,98,68,119,71,217,148,41,83,229,45, + 59,21,252,56,105,217,119,7,114,238,47,174,79,50,102,105,170,243,154,60,15,57,57,57,187,234,214,173,203,166,167,167,159,7,240,216,222,222,126,222, + 204,153,51,125,23,44,88,240,240,187,239,190,91,12,192,115,233,210,165,157,180,90,237,110,75,116,67,2,73,239,182,77,131,91,213,242,169,137,95,78, + 95,134,74,33,179,127,255,205,62,176,181,229,240,233,234,48,241,94,92,198,228,235,209,116,107,85,180,10,77,86,139,193,131,7,251,238,216,177,67,1, + 0,55,110,220,64,82,82,18,92,92,92,96,101,101,5,153,76,6,150,101,33,147,201,44,126,13,74,243,6,16,160,169,233,116,233,192,129,159,172,28, + 29,237,177,250,189,41,24,157,154,2,123,91,27,152,243,180,21,135,198,43,62,142,250,176,114,15,235,255,230,66,215,113,253,91,168,126,143,74,70,74, + 46,69,154,78,142,86,53,106,216,1,200,124,238,193,91,62,166,128,65,131,6,169,4,65,128,86,171,197,201,147,39,53,86,86,86,26,47,47,175,249, + 40,44,83,175,10,86,86,86,201,122,189,222,21,0,84,42,85,138,78,167,115,3,144,163,84,42,139,190,167,243,10,247,87,165,233,196,114,166,9,159, + 148,136,100,61,177,224,48,75,107,55,111,209,188,81,248,143,123,127,176,201,206,77,130,189,67,10,24,100,99,195,134,53,176,178,178,195,252,249,179,184, + 135,221,186,212,232,217,123,80,56,33,164,219,127,206,108,81,178,161,91,223,81,142,86,106,91,0,128,200,155,177,101,227,20,48,12,131,121,243,230,161, + 65,131,6,227,9,33,115,40,165,25,21,203,96,67,195,14,67,29,21,170,130,183,88,20,204,248,102,231,7,5,58,31,77,192,240,190,126,227,175,127, + 79,142,54,168,141,92,0,160,20,58,25,131,39,104,65,83,138,52,194,194,194,58,134,134,134,158,42,111,249,95,64,113,223,172,162,229,162,63,184,176, + 176,48,26,26,26,90,236,60,74,47,87,68,99,66,156,221,52,234,240,117,11,166,216,112,23,195,88,221,147,123,72,208,11,197,255,57,180,84,137,166, + 90,173,30,181,101,203,150,167,124,152,183,155,43,228,114,25,100,114,2,251,246,125,0,0,89,103,14,129,144,178,77,86,105,77,173,86,171,191,118,237, + 154,205,166,77,155,224,234,234,10,95,95,95,168,213,106,168,84,170,167,204,85,73,195,85,218,104,149,214,44,122,156,227,56,48,12,131,19,39,78,128, + 231,121,12,30,60,248,25,147,197,113,92,153,198,173,180,102,137,245,199,8,33,55,40,165,29,10,79,192,55,40,165,29,75,236,187,167,139,139,203,76, + 0,75,170,170,201,178,20,172,254,60,68,175,149,224,98,167,192,40,11,193,111,103,35,176,101,253,10,0,128,111,96,115,12,25,208,167,56,26,87,21, + 205,146,212,168,81,99,103,74,74,106,175,46,93,186,32,51,51,211,188,96,193,2,52,106,212,8,245,234,213,43,243,249,85,209,164,148,38,223,184,113, + 163,166,78,167,171,210,180,99,89,154,132,16,108,223,190,29,122,253,179,81,125,135,142,139,240,193,64,31,140,121,103,43,62,191,179,27,107,215,174,173, + 240,216,213,64,35,189,166,238,42,5,203,55,90,58,123,178,242,213,87,95,101,199,140,25,131,39,79,158,96,236,216,177,250,19,39,78,24,147,18,19, + 127,82,136,226,106,211,211,198,184,92,77,165,82,185,237,216,177,99,216,189,187,192,151,68,71,71,195,223,223,223,186,228,243,197,140,61,200,125,188,26, + 151,126,142,66,203,190,59,112,233,231,17,16,178,194,100,205,252,145,93,209,177,63,47,101,105,82,74,119,3,40,54,81,132,16,171,229,203,151,247,7, + 112,176,240,49,0,88,110,137,38,0,48,20,99,70,14,233,15,78,110,139,200,232,56,116,109,223,4,30,110,174,184,122,43,6,247,227,51,146,25,130, + 49,29,27,43,151,228,234,140,115,174,69,211,111,43,209,36,94,94,94,1,123,246,236,41,254,30,41,50,85,69,6,171,104,185,200,120,87,117,156,165, + 121,3,8,176,245,178,185,244,201,154,182,214,151,110,126,15,127,159,222,112,232,221,7,155,78,156,192,221,91,145,122,99,62,223,213,82,77,0,32,132, + 140,148,185,55,91,191,96,225,103,170,122,181,156,152,223,174,198,33,203,192,66,199,171,160,39,214,208,61,58,86,27,104,245,251,203,122,223,11,199,20, + 48,112,224,192,243,63,252,240,131,125,108,108,44,78,159,62,13,95,95,95,228,231,231,87,250,131,183,180,166,94,175,119,45,49,173,87,148,218,240,153, + 209,104,44,122,51,138,254,17,203,157,78,44,165,249,204,52,97,117,114,178,202,248,158,87,168,228,242,61,7,126,220,105,115,59,234,52,26,135,180,130, + 141,38,8,162,144,132,244,140,60,100,222,75,192,167,159,126,142,249,11,102,227,224,254,189,54,245,234,135,236,35,132,212,45,57,141,248,50,223,163,191, + 68,147,208,241,225,63,127,191,142,80,17,186,228,40,165,76,251,64,61,106,196,32,118,216,176,97,56,120,240,32,34,35,35,215,149,103,178,74,106,18, + 138,241,183,78,239,94,7,74,161,75,137,82,202,117,15,212,163,71,14,97,95,27,222,3,23,127,93,133,30,141,31,220,242,116,197,128,204,194,201,67, + 142,69,186,82,133,115,86,151,201,197,18,102,235,36,0,82,194,96,157,196,159,57,152,255,120,104,137,190,89,165,41,142,104,89,98,176,0,32,128,16, + 27,181,66,126,105,203,252,183,61,213,79,34,57,195,173,11,72,48,136,244,155,71,188,120,137,16,171,8,74,117,165,183,201,207,207,215,198,196,196,88, + 189,62,96,0,218,4,7,195,195,201,9,117,189,188,96,165,84,64,33,255,243,215,167,37,175,44,33,132,214,171,87,15,125,251,246,133,76,38,131,90, + 173,134,141,141,13,20,10,69,153,209,172,170,254,202,165,148,130,101,89,220,186,117,11,143,31,63,134,189,189,61,206,157,59,135,174,93,187,62,19,213, + 42,28,135,5,163,254,115,58,178,140,245,199,80,197,41,195,34,4,129,32,143,134,64,245,104,50,242,73,19,24,12,60,12,6,3,190,61,107,194,229, + 24,45,76,38,35,12,6,67,185,251,44,15,66,8,227,233,233,57,202,223,223,255,173,17,35,70,152,21,10,5,180,90,45,242,243,243,17,25,25,105, + 238,213,171,119,214,255,254,215,87,115,232,208,33,74,41,62,183,48,79,43,189,70,141,26,53,11,167,103,211,45,57,222,18,227,43,54,49,165,121,125, + 249,109,112,108,193,123,178,110,221,58,8,130,0,74,105,185,111,146,158,144,95,22,44,90,166,89,186,114,51,52,142,110,56,117,234,148,112,244,232,209, + 92,2,68,223,141,140,92,254,63,224,240,30,160,202,185,109,0,144,153,153,105,229,235,235,11,47,47,47,136,162,8,179,217,92,28,125,73,79,79,135, + 78,167,131,163,117,22,234,56,121,129,207,61,137,196,91,11,225,97,19,133,173,199,140,230,166,1,184,110,201,190,254,10,40,165,223,1,248,238,185,133, + 8,106,184,123,214,4,67,205,136,75,78,199,144,126,61,192,202,109,16,243,56,13,205,131,107,123,140,25,220,214,131,3,143,183,23,238,120,11,192,183, + 149,201,229,229,229,9,81,81,81,184,113,163,192,239,218,217,217,193,218,218,250,169,255,113,134,97,158,43,162,85,100,178,22,173,235,106,205,200,180,200, + 17,194,177,105,123,4,26,7,246,197,55,23,47,235,133,228,140,110,95,234,245,209,150,104,18,66,228,96,21,95,123,182,24,51,242,235,79,223,81,103, + 230,232,113,242,106,60,114,140,28,242,69,21,140,140,29,226,174,124,175,255,227,216,178,28,96,118,181,199,94,85,60,60,60,38,136,162,56,159,82,154, + 53,112,224,64,183,29,59,118,56,196,199,199,35,34,34,2,243,230,205,75,21,4,129,167,148,18,74,233,194,231,221,23,165,84,196,159,6,235,133,65, + 8,145,169,85,120,199,217,142,244,227,24,59,95,62,39,239,97,154,145,254,148,207,139,95,83,74,205,21,109,203,48,204,184,189,187,214,121,58,187,136, + 232,228,210,5,137,201,38,44,122,111,52,210,211,115,241,237,198,197,0,20,48,241,44,58,116,26,4,87,215,26,24,255,230,120,247,117,235,191,121,27, + 192,151,47,250,56,254,46,18,207,173,217,79,8,9,119,113,113,137,124,123,252,120,23,95,223,87,161,82,169,176,115,231,78,236,88,189,90,88,9,12, + 89,79,200,111,19,40,221,95,161,206,197,63,117,166,76,156,232,82,191,254,68,40,149,74,252,122,244,59,232,147,182,231,134,182,129,41,95,143,208,90, + 125,169,227,163,159,73,134,76,134,123,0,32,83,33,81,6,164,148,146,251,87,25,172,34,74,87,26,2,127,38,200,87,123,234,144,202,20,55,55,78, + 29,238,227,6,3,49,158,253,25,241,6,81,88,122,215,196,94,205,166,31,220,46,195,100,1,0,195,48,162,183,183,55,186,52,107,134,1,237,219,131, + 227,56,168,20,114,216,170,172,64,133,130,72,86,209,212,97,5,231,196,210,7,7,0,112,114,114,130,92,46,47,54,88,85,141,102,149,167,41,138,34, + 56,142,195,141,27,55,208,174,93,59,212,172,89,19,187,119,239,70,207,158,61,159,153,74,180,212,100,1,5,70,171,228,52,94,137,36,249,74,147,224, + 75,163,55,18,164,25,67,64,72,48,120,30,16,40,96,208,235,65,41,64,41,96,54,25,161,215,235,139,247,89,149,41,89,15,15,15,111,63,63,191, + 143,103,204,152,94,63,36,164,49,82,83,83,33,138,34,172,173,173,145,159,159,15,59,59,59,180,105,211,230,225,194,133,11,19,41,197,120,75,147,225, + 159,151,162,215,252,248,241,227,79,77,27,22,221,180,137,113,24,243,238,247,80,112,5,83,75,69,57,60,21,192,116,238,208,22,231,175,70,243,99,63, + 92,105,144,165,71,44,113,23,197,45,113,64,181,143,139,82,138,180,180,52,36,39,39,163,95,255,254,216,241,195,15,120,244,232,17,130,130,130,208,185, + 115,103,184,186,186,226,209,163,71,184,124,198,0,67,102,6,50,140,17,80,219,182,196,129,83,49,134,185,107,141,127,75,213,33,0,16,66,250,1,24, + 109,103,103,231,151,159,159,159,200,243,252,30,0,123,0,12,225,56,110,136,90,173,246,200,201,201,121,128,130,106,162,159,42,211,83,41,84,78,74,149, + 29,68,222,0,150,229,224,227,227,11,42,24,145,145,173,195,248,87,251,226,242,181,63,112,240,248,69,222,96,22,191,170,194,240,40,203,178,52,32,32, + 0,41,41,41,144,201,100,176,178,178,130,141,141,13,14,31,62,140,193,131,7,23,155,172,234,26,173,55,128,0,59,111,155,139,159,173,41,48,89,73, + 9,137,72,142,147,193,213,217,29,171,190,94,161,205,124,148,212,114,51,96,145,201,2,0,40,29,79,119,25,49,183,209,172,113,221,148,215,239,165,224, + 94,92,46,114,77,50,228,11,42,152,57,13,98,207,111,209,69,157,88,217,153,82,122,183,90,3,183,16,81,20,23,198,199,199,187,114,28,231,206,243, + 60,98,99,99,113,229,202,21,76,158,60,57,57,61,61,189,19,165,212,242,99,68,193,116,97,81,36,75,165,82,165,0,229,78,39,102,149,136,100,101, + 85,32,89,230,52,33,33,164,182,175,151,237,137,141,43,166,121,55,111,217,134,81,115,118,153,121,247,146,218,157,61,125,170,205,228,21,223,190,77,8, + 233,65,41,189,95,158,168,82,38,235,213,170,109,91,14,52,25,156,162,29,62,95,58,12,169,105,57,200,204,200,133,92,110,13,163,153,133,32,18,180, + 105,215,30,223,109,221,133,6,111,142,101,21,50,89,119,252,135,140,86,33,139,191,254,250,107,239,122,245,234,97,203,150,45,248,109,219,54,188,150,157, + 141,83,12,195,154,101,50,231,195,102,243,6,0,21,26,173,146,58,13,26,52,192,230,205,155,177,125,251,246,39,163,186,166,236,155,54,10,174,38,19, + 94,137,184,3,199,90,125,129,136,59,112,108,90,15,117,121,14,247,8,193,83,237,160,194,194,194,58,150,188,255,55,81,100,170,74,39,197,3,5,70, + 171,83,88,88,24,45,121,95,153,160,218,53,96,226,246,97,93,124,130,235,120,19,243,238,85,136,213,242,198,57,119,76,138,187,121,116,218,109,74,87, + 150,183,29,195,48,148,101,89,216,90,89,193,197,222,190,32,204,207,48,128,8,136,102,128,8,5,6,128,138,4,150,20,77,139,162,8,133,66,81,102, + 226,187,165,185,89,37,53,115,115,115,241,240,225,67,140,31,63,30,106,181,26,0,144,148,148,4,31,31,31,112,28,135,248,248,120,252,250,235,175,240, + 243,243,131,82,169,180,200,109,149,136,46,53,34,132,156,2,208,40,49,49,209,206,195,195,3,176,52,162,37,82,228,27,8,140,70,1,119,239,222,69, + 66,66,2,30,62,184,135,230,218,28,80,176,160,148,90,20,209,242,242,242,10,246,247,247,255,102,201,146,37,114,47,47,47,80,74,225,224,96,143,252, + 252,124,164,165,165,163,65,131,6,240,242,242,194,146,37,75,0,96,199,203,54,89,37,41,170,46,45,121,207,48,12,222,253,159,55,50,50,108,192,178, + 127,86,159,86,146,163,37,7,128,78,61,6,114,39,142,30,182,230,129,143,147,88,246,227,202,126,137,80,74,205,130,40,170,203,123,60,54,54,22,50, + 153,12,123,247,236,65,70,114,50,66,66,66,208,162,69,11,220,187,119,15,87,175,94,133,147,147,19,92,188,90,227,212,3,19,110,39,232,160,209,104, + 16,19,199,252,45,137,208,0,64,8,121,179,91,183,110,243,150,47,95,238,234,238,238,46,75,77,77,173,183,102,205,154,144,53,107,214,76,121,251,237, + 183,221,222,126,251,109,7,23,23,23,46,41,41,41,224,189,247,222,107,74,8,241,163,148,46,171,72,211,214,206,214,145,149,91,131,16,14,142,246,14, + 224,20,214,16,121,14,188,8,104,236,93,112,246,242,94,68,68,230,78,72,207,69,165,213,129,148,82,234,228,228,4,134,97,224,228,228,244,212,255,247, + 185,115,231,160,211,233,48,110,220,184,226,105,68,75,41,50,89,139,214,116,181,33,133,38,43,41,150,3,99,172,141,159,247,95,200,202,124,148,212,174, + 58,38,139,16,162,118,116,245,240,24,218,163,161,242,215,136,199,72,204,52,34,199,40,131,129,90,129,151,57,32,254,252,6,221,157,95,215,116,126,153, + 57,64,69,69,61,15,30,60,64,126,126,62,206,156,57,131,133,11,23,166,150,54,89,110,110,110,111,218,217,217,45,200,203,203,251,60,49,49,113,85, + 101,186,133,38,234,41,202,154,78,172,106,139,135,178,166,9,9,33,178,154,30,170,99,87,207,124,239,163,161,215,9,30,143,7,238,230,68,218,94,114, + 237,208,187,121,40,211,100,237,39,181,90,76,248,232,24,33,164,94,121,145,45,81,16,154,88,219,216,2,72,65,196,149,147,197,38,43,61,35,27,6, + 19,11,131,145,64,111,98,208,165,219,43,88,253,205,118,196,167,100,160,168,34,241,191,2,33,196,49,56,56,120,226,144,33,67,240,241,199,31,35,124, + 249,114,227,36,66,114,56,128,134,9,2,68,74,9,83,133,36,246,210,58,95,126,249,229,126,0,195,151,76,70,235,204,60,188,238,217,151,58,214,234, + 91,240,220,193,51,40,0,56,166,134,63,125,202,12,13,13,37,69,51,107,150,206,176,253,83,40,203,100,1,0,23,26,26,122,42,44,44,12,37,239, + 43,18,178,115,15,236,253,209,135,147,151,54,239,217,158,36,190,223,29,25,57,122,126,214,109,147,34,78,87,177,201,42,201,135,107,214,224,106,116,193, + 255,177,151,171,43,166,143,28,9,202,3,231,34,111,99,87,120,56,134,117,235,6,235,194,138,191,42,28,24,68,81,44,51,138,85,50,154,101,105,212, + 41,43,43,11,123,246,236,65,139,22,45,160,86,171,193,113,28,26,53,106,132,63,254,248,3,181,107,215,6,33,4,7,14,28,192,128,1,3,112,255, + 254,125,180,110,221,218,166,114,213,63,41,50,61,183,111,223,182,163,148,118,40,138,126,84,23,131,193,128,168,168,40,244,237,219,23,14,14,14,168,81, + 99,7,194,143,125,15,117,240,107,32,4,22,25,45,65,16,222,8,13,13,149,19,66,160,211,229,67,165,178,130,181,181,13,108,109,237,16,16,80,15, + 9,9,9,232,217,179,167,49,38,38,102,109,98,98,162,69,137,209,0,16,20,20,100,157,157,157,253,90,173,90,181,20,0,96,101,101,21,84,167,78, + 157,15,98,98,98,114,45,209,41,105,176,8,33,96,89,182,216,104,113,12,3,15,119,215,226,229,194,252,180,114,63,4,132,144,156,248,116,131,18,0, + 188,189,189,177,122,253,65,38,52,52,20,83,166,76,129,217,108,198,218,181,5,69,118,35,70,140,128,201,100,194,190,125,5,69,146,28,199,85,24,54, + 185,114,229,10,34,34,34,96,54,155,145,157,157,141,35,71,142,224,212,233,211,216,121,224,23,60,122,112,15,141,234,249,96,236,216,55,32,147,201,176, + 117,235,86,180,107,215,206,146,151,224,133,35,147,201,70,109,220,184,209,99,203,150,45,89,7,14,28,208,182,106,213,74,185,98,197,10,151,213,171,87, + 187,152,76,38,76,153,50,37,229,226,197,139,134,254,253,251,91,111,216,176,193,163,78,157,58,221,1,60,99,180,8,33,214,0,134,1,120,181,85,67, + 13,151,145,163,3,229,141,136,121,240,16,89,185,70,136,130,9,143,158,36,32,87,39,32,37,35,23,77,90,245,248,250,228,201,147,179,9,33,179,40, + 165,135,42,27,103,100,100,36,46,94,188,136,71,143,30,225,193,131,7,197,235,175,93,187,134,149,43,87,98,234,212,169,112,112,112,176,232,216,203,55, + 89,117,240,243,254,139,89,201,119,19,170,107,178,124,90,180,104,17,254,197,23,95,120,188,253,225,39,176,15,30,14,59,123,103,24,96,3,40,29,105, + 236,217,53,250,187,39,191,121,169,38,11,0,40,165,243,61,60,60,230,123,120,120,168,142,31,63,174,169,85,171,22,120,158,55,150,142,100,117,234,212, + 105,206,198,141,27,61,106,215,174,61,25,64,165,70,235,101,192,48,120,243,243,117,19,157,109,21,79,18,112,119,89,97,47,65,22,200,207,1,78,254, + 0,174,237,220,135,147,251,207,112,152,185,229,227,55,81,65,133,108,204,253,88,172,91,183,26,211,166,190,142,239,190,253,28,162,200,193,96,102,225,237, + 219,10,6,147,8,194,112,8,105,210,12,191,157,60,3,25,3,236,217,178,238,37,29,225,203,129,82,154,65,8,89,123,224,192,129,119,166,76,153,2, + 81,20,21,11,214,173,211,165,166,166,46,134,5,253,175,202,208,25,176,110,221,186,232,153,171,83,247,79,27,5,246,209,207,36,35,226,14,28,7,207, + 160,216,187,148,160,105,61,100,168,203,62,197,159,46,117,255,175,129,148,209,172,244,169,169,195,34,231,88,145,131,108,26,80,251,19,141,163,195,27,45, + 26,5,56,79,159,50,137,187,159,164,199,190,90,35,243,126,221,246,149,117,18,175,252,250,30,213,85,201,100,21,177,235,215,95,139,255,254,98,199,142, + 50,31,75,28,60,184,74,90,162,40,150,27,197,178,52,146,5,0,106,181,218,190,123,247,238,232,218,181,43,6,13,26,84,156,147,213,184,113,99,236, + 220,185,19,3,7,14,196,181,107,215,224,225,225,129,192,192,64,4,6,6,226,240,225,195,22,237,163,104,26,47,56,56,184,168,234,176,81,92,92,156, + 69,213,134,37,49,24,12,72,79,79,135,163,163,35,20,10,5,90,182,108,129,119,222,109,9,103,143,205,8,174,95,15,90,173,182,184,252,189,50,100, + 50,89,112,221,186,117,145,154,154,138,212,212,84,184,184,184,192,211,211,19,238,238,238,88,182,108,25,93,181,106,213,81,147,201,180,54,53,53,213,226, + 72,150,135,135,71,123,71,71,199,57,58,157,78,81,226,23,174,194,197,197,229,39,79,79,207,197,9,9,9,150,36,21,195,100,50,129,16,130,176,7, + 158,208,26,9,114,226,34,48,229,127,62,79,25,47,153,76,86,149,132,94,237,240,225,195,93,107,214,244,66,108,76,36,246,238,165,88,190,124,121,81, + 85,36,162,11,127,24,20,45,119,238,220,25,190,190,190,160,22,244,202,16,69,17,55,110,220,192,142,159,78,193,195,167,62,158,220,141,194,213,195,63, + 163,150,139,35,26,52,105,6,179,217,252,92,173,55,94,4,102,179,121,147,191,191,63,53,26,141,167,0,172,190,121,243,230,235,137,137,137,83,183,109, + 219,230,62,122,244,232,164,131,7,15,174,4,176,229,230,205,155,19,63,253,244,211,174,60,207,151,89,45,200,178,236,119,239,189,247,94,167,33,67,134, + 16,142,152,141,71,142,108,229,4,222,76,230,124,188,73,8,63,125,138,17,120,51,25,57,250,61,241,224,137,155,204,148,247,190,16,154,182,13,197,173, + 91,183,220,251,244,233,243,41,128,10,141,86,81,164,170,188,8,229,131,7,15,176,105,211,38,204,156,89,149,118,117,5,140,5,106,219,249,216,92,92, + 180,166,155,13,225,242,10,77,22,251,34,76,86,171,193,131,7,255,60,103,206,28,39,142,227,240,254,164,145,152,255,197,183,112,108,57,69,116,246,242, + 37,143,78,174,208,221,59,189,169,203,223,81,205,150,150,150,182,30,192,122,71,71,199,100,107,107,107,228,230,230,62,243,249,35,132,168,234,213,171,167, + 82,40,20,232,209,163,135,163,135,135,71,52,195,48,171,226,227,227,203,117,28,101,77,19,150,53,157,248,60,85,135,14,46,232,211,178,125,19,219,59, + 154,143,109,85,156,254,90,173,104,149,29,1,144,109,112,123,112,254,241,176,28,146,162,108,220,172,115,83,216,113,214,125,80,142,209,98,88,246,106,118, + 102,86,175,156,92,35,206,158,187,133,225,195,234,194,96,34,16,69,6,121,90,3,192,202,192,0,24,49,114,52,40,225,144,145,156,0,150,101,111,86, + 237,213,253,87,241,209,196,137,19,123,205,154,53,203,175,176,255,149,79,97,255,171,233,132,144,134,180,146,230,227,21,232,212,250,121,231,220,247,127,58, + 243,77,118,104,27,221,221,166,5,181,83,142,77,235,33,67,38,195,61,142,69,58,165,120,42,205,40,52,52,180,99,201,251,127,19,101,69,178,138,168, + 82,142,150,127,109,175,87,58,54,111,246,238,236,89,179,109,255,56,127,18,51,63,89,77,253,155,117,207,93,127,230,170,49,207,218,183,87,110,234,221, + 115,85,29,11,0,244,236,60,16,141,130,90,60,243,96,187,206,5,189,36,207,254,118,5,201,169,241,85,18,44,50,81,229,229,100,85,165,164,191,52, + 58,157,46,235,214,173,91,174,113,113,113,79,37,190,251,250,250,130,16,130,75,151,46,225,226,197,139,24,62,124,56,56,142,131,76,38,195,169,83,167, + 44,138,198,148,136,46,221,160,148,118,36,132,244,244,242,242,42,179,218,176,42,90,58,157,14,217,217,217,56,118,236,24,234,214,173,139,69,139,22,193, + 211,195,13,179,103,191,15,81,20,145,147,147,3,65,16,170,26,209,18,139,162,69,162,40,34,53,53,21,126,126,126,88,179,102,13,86,174,92,249,105, + 66,66,194,65,75,199,232,237,237,109,47,8,194,135,125,251,246,237,222,191,127,127,244,236,217,243,169,199,127,248,225,7,219,125,251,246,45,174,89,179, + 230,43,38,147,105,73,114,114,114,106,85,116,55,111,46,104,191,164,110,53,31,51,135,212,194,171,111,109,197,178,101,63,66,169,252,179,99,4,203,178, + 248,248,227,143,43,52,49,34,165,254,242,180,243,9,239,207,248,210,117,241,226,112,132,135,167,128,97,24,120,120,120,128,97,24,60,124,248,16,12,195, + 192,199,199,7,12,195,32,62,62,190,40,39,48,19,101,84,61,150,5,195,48,208,235,245,136,125,242,8,113,49,209,176,201,73,130,139,157,26,153,145, + 55,208,104,236,155,197,253,159,254,78,40,165,219,1,108,47,177,234,75,66,136,81,163,209,12,2,176,159,82,90,20,209,248,180,240,86,38,173,90,181, + 106,60,107,214,44,89,81,187,13,47,159,207,120,147,201,36,2,64,80,72,135,98,183,223,165,55,112,239,222,61,44,91,182,12,90,173,22,242,170,52, + 186,67,129,105,45,170,48,44,9,203,178,240,243,243,195,164,73,150,181,236,113,242,241,250,250,82,196,41,225,122,204,55,186,155,119,142,88,21,152,172, + 186,207,107,178,234,190,254,250,235,135,62,250,232,35,199,156,156,28,220,189,123,23,89,89,89,120,109,64,71,126,205,250,169,230,84,247,134,52,254,230, + 225,191,197,100,149,132,82,58,223,203,203,107,190,40,138,148,82,58,183,196,248,149,222,222,222,103,142,31,63,238,196,243,60,190,250,234,43,251,164,164, + 36,251,14,29,58,204,4,80,174,209,42,107,154,176,172,233,68,148,168,58,84,42,149,142,21,12,241,153,170,67,65,64,128,157,173,61,50,17,7,131, + 179,185,113,150,19,159,113,34,241,205,107,158,143,155,4,89,11,102,63,38,199,136,26,106,123,136,148,6,148,39,106,48,155,143,92,139,184,218,195,187, + 102,93,246,224,161,211,232,55,96,8,12,6,6,122,51,1,97,101,32,172,28,13,27,53,65,96,131,70,160,0,174,92,62,207,27,205,230,19,21,140, + 243,95,135,103,187,119,135,123,182,123,103,21,168,72,203,232,163,229,55,96,192,128,197,0,222,173,76,199,173,245,187,195,221,219,20,232,148,236,163,245, + 222,59,19,17,121,89,166,57,29,177,84,222,179,21,194,82,195,9,212,170,63,171,14,101,76,245,91,115,252,211,120,174,134,165,222,222,222,246,174,54, + 234,205,111,143,125,195,246,241,245,11,72,186,125,9,231,78,71,103,238,218,247,99,134,54,61,101,172,5,38,171,120,154,207,217,163,22,252,202,48,90, + 86,182,46,0,0,191,160,22,224,158,88,214,70,168,172,104,86,117,76,86,17,69,230,170,116,226,251,132,9,19,176,113,227,70,180,109,219,22,254,254, + 254,197,95,246,150,70,205,74,71,151,170,83,109,88,146,220,220,92,248,248,248,96,195,134,13,184,121,243,38,108,109,109,49,124,248,112,228,230,230,22, + 27,172,170,38,195,83,74,239,29,63,126,188,249,208,161,67,169,76,38,35,89,89,89,176,183,183,199,154,53,107,180,137,137,137,97,21,110,92,6,222, + 222,222,67,228,114,249,251,195,134,13,99,235,213,171,135,228,228,100,216,217,217,153,9,33,50,0,176,183,183,55,91,89,89,97,226,196,137,8,9,9, + 105,63,125,250,244,182,53,106,212,88,19,31,31,95,110,111,165,162,233,194,157,59,119,2,0,198,174,138,130,209,88,96,84,214,174,93,139,194,92,183, + 98,98,98,98,128,42,84,178,216,216,216,192,223,223,191,204,247,190,125,251,246,184,114,229,74,193,212,36,199,193,213,213,21,231,206,157,171,82,37,21, + 45,108,4,121,235,214,45,212,247,117,198,205,240,227,112,86,203,16,226,233,14,175,246,29,17,29,29,253,183,69,179,10,123,83,77,2,208,21,5,159, + 193,111,1,76,40,177,188,134,82,250,181,37,154,60,207,83,134,97,72,108,108,172,73,173,86,19,71,71,71,78,169,84,194,96,48,20,27,174,123,247, + 238,225,208,161,67,136,139,139,131,163,163,35,163,209,104,96,50,153,170,146,227,204,28,0,0,32,0,73,68,65,84,212,63,42,32,32,0,238,238,238, + 79,37,190,143,29,59,22,141,27,55,198,212,169,83,45,74,132,127,29,8,222,248,217,146,90,74,134,213,212,119,126,5,15,162,30,234,137,1,170,159, + 15,60,151,201,226,66,66,66,126,154,57,115,166,227,141,27,55,48,111,222,60,188,246,218,107,0,96,62,114,228,72,108,102,106,124,155,204,212,120,80, + 74,75,87,92,189,116,50,51,51,215,163,196,101,127,92,92,92,198,176,44,59,91,163,209,104,78,157,58,101,239,226,226,66,182,110,221,106,158,59,119, + 110,22,203,178,153,132,144,21,127,227,112,1,0,148,226,118,90,118,140,143,204,193,83,188,174,167,231,167,198,206,12,204,148,213,117,33,13,130,49,32, + 229,143,179,99,248,152,54,201,137,73,12,133,120,187,60,13,81,20,55,205,156,245,241,135,209,81,87,189,85,118,42,76,152,56,11,97,71,127,3,97, + 100,56,115,254,18,140,38,1,105,25,217,24,54,98,20,188,60,156,113,251,226,177,84,94,20,215,188,204,227,252,171,161,84,92,221,163,223,24,7,165, + 85,65,154,169,40,10,216,254,237,251,96,152,85,152,55,111,30,130,131,131,223,34,132,44,44,175,197,67,17,132,136,171,27,118,28,225,32,87,22,232, + 80,81,192,134,61,51,11,251,104,77,195,154,245,251,26,54,240,125,176,160,162,62,90,255,21,202,75,134,47,147,90,181,106,41,173,101,24,239,104,37, + 159,254,246,200,254,46,41,49,145,136,251,227,42,0,192,108,210,153,18,163,111,87,218,10,189,176,193,91,201,169,32,90,209,212,149,94,95,249,47,250, + 210,154,69,39,220,210,209,44,75,76,86,89,154,0,158,57,209,178,44,139,154,53,107,98,241,226,197,149,246,209,42,227,216,139,214,247,196,255,177,119, + 221,97,81,156,123,247,188,219,41,75,47,75,87,80,65,177,247,168,24,123,47,137,88,19,141,61,118,197,174,81,99,137,53,106,236,198,168,49,246,222, + 98,69,99,87,236,34,160,8,42,189,215,165,44,219,103,230,253,254,160,92,68,22,22,82,238,189,223,245,60,207,62,192,148,179,191,153,93,102,206,252, + 42,208,24,64,233,100,248,30,198,84,26,26,226,116,112,112,64,86,86,97,135,132,142,29,59,162,99,199,127,213,51,232,116,186,18,47,150,133,133,197, + 71,30,173,242,56,77,77,77,23,156,57,115,102,76,80,80,208,144,57,115,230,8,187,116,41,108,23,148,159,159,175,164,70,204,118,43,203,201,178,236, + 196,192,192,64,62,199,113,216,189,123,55,158,61,123,70,205,204,204,22,155,153,153,109,55,53,53,101,85,42,213,132,241,227,199,15,95,182,108,25,175, + 125,251,246,120,248,240,33,207,203,203,107,36,128,3,134,56,139,241,248,241,99,240,120,60,48,217,241,152,188,224,56,204,77,5,120,243,230,13,178,179, + 179,63,106,98,106,204,249,44,237,41,41,126,181,111,223,190,36,12,217,186,117,107,240,249,124,4,7,7,151,27,134,45,195,73,237,236,236,74,190,31, + 34,145,8,183,110,221,194,15,63,252,0,15,91,107,200,195,67,225,212,177,51,186,141,25,143,97,195,134,129,207,231,195,214,214,22,248,112,214,167,193, + 99,255,51,40,195,57,166,77,155,54,227,126,254,249,231,90,211,166,77,171,121,239,222,189,78,237,219,183,247,222,190,125,187,215,212,169,83,107,222,187, + 119,207,4,70,228,230,148,230,124,250,244,233,169,237,219,183,79,28,53,106,148,136,227,56,54,46,46,78,15,128,56,57,57,241,159,62,125,202,253,254, + 251,239,80,169,84,112,115,115,227,185,186,186,146,235,215,175,115,225,225,225,143,41,165,223,25,115,236,44,203,126,208,198,65,40,20,162,71,143,30,24, + 49,98,68,165,255,251,101,57,107,214,243,89,221,229,243,186,238,153,201,193,72,73,122,15,46,215,81,119,241,220,239,154,170,136,172,178,156,18,137,100, + 254,182,109,219,106,133,134,134,98,233,210,165,24,58,116,40,120,60,158,246,196,137,19,113,33,33,33,109,40,165,149,10,202,127,224,115,55,132,21,111, + 223,190,117,213,104,52,16,139,197,216,185,115,167,110,205,154,53,175,51,51,51,253,104,57,21,229,101,57,171,89,117,152,93,1,231,71,85,135,185,89, + 184,116,238,252,211,150,210,1,123,49,57,57,163,36,177,145,18,98,123,70,86,223,207,172,85,163,36,222,229,165,188,124,86,121,201,0,39,40,165,90, + 66,200,224,1,254,95,221,56,118,236,168,116,201,210,165,120,240,56,20,89,57,10,112,148,15,142,16,44,90,180,4,78,246,182,200,75,126,171,212,232, + 116,3,104,153,81,60,255,198,207,232,47,225,36,132,55,245,250,239,7,182,240,8,184,130,180,8,9,63,255,189,217,136,97,3,4,131,7,15,198,153, + 51,103,16,22,22,182,203,144,200,42,205,73,41,111,106,232,157,227,91,8,192,169,50,34,36,2,69,180,217,200,175,7,8,134,13,27,134,179,23,131, + 112,236,66,244,207,71,127,167,23,254,202,99,250,79,68,121,121,90,64,5,66,203,66,128,48,191,250,181,92,219,55,107,96,34,96,85,72,12,127,143, + 236,2,53,174,191,138,203,225,81,94,181,123,235,20,94,32,69,136,143,255,184,130,57,39,167,48,59,46,63,191,106,99,165,120,60,222,7,222,172,63, + 227,201,42,109,167,76,38,43,185,73,22,11,186,226,27,119,113,14,80,53,90,59,44,136,143,143,183,140,143,143,7,165,20,143,31,63,182,108,221,186, + 245,2,252,9,111,214,236,217,179,75,188,86,101,127,150,183,172,50,20,37,165,111,182,183,183,63,57,111,222,188,201,173,91,183,238,190,116,233,82,2, + 160,234,101,92,0,40,165,12,199,113,184,125,251,54,206,156,57,195,234,116,186,111,147,147,147,75,231,58,108,117,113,113,185,238,239,239,127,32,34,34, + 130,255,250,245,107,24,35,232,84,42,21,188,189,189,193,48,12,214,77,118,71,126,126,35,48,12,3,150,101,97,110,110,254,193,156,75,99,62,39,30, + 143,7,150,101,63,18,90,143,31,63,6,159,207,135,159,159,31,94,188,120,81,226,209,170,204,3,165,211,233,226,101,50,153,108,197,138,21,37,118,101, + 100,100,224,218,181,107,248,172,77,91,212,255,118,2,146,147,147,177,105,211,38,184,184,184,96,245,234,213,200,206,206,6,195,48,255,180,59,189,87,207, + 158,61,173,246,239,223,159,118,228,200,17,159,141,27,55,154,205,158,61,219,109,227,198,141,137,29,59,118,180,184,119,239,94,91,84,49,9,154,101,217, + 133,132,144,171,171,87,175,94,48,125,250,244,214,163,70,141,18,10,133,66,46,41,41,137,57,122,244,40,241,246,246,230,137,68,34,18,24,24,200,61, + 121,242,228,17,195,48,235,40,165,247,140,229,47,157,127,87,92,97,56,114,228,200,42,31,120,128,163,100,164,5,47,195,111,251,206,53,188,186,158,110, + 186,131,71,175,37,220,123,248,54,138,175,97,2,246,1,6,91,3,84,4,66,136,221,164,73,147,230,5,7,7,11,239,222,189,139,177,99,199,34,37, + 37,37,251,200,145,35,225,81,81,81,125,41,165,85,74,51,248,167,193,231,243,79,248,250,250,142,158,58,117,170,105,143,30,61,36,203,150,45,203,205, + 207,207,47,87,100,149,135,127,162,234,16,192,175,11,231,92,12,152,213,104,116,173,113,78,53,241,71,65,58,228,2,62,207,210,154,135,102,53,248,200, + 207,124,231,112,225,198,254,24,84,210,151,141,82,250,148,16,210,181,65,163,166,167,215,173,94,231,184,120,254,60,225,233,139,87,64,25,29,30,223,185, + 3,169,136,165,225,207,255,72,211,232,180,95,254,187,67,188,127,7,146,239,111,61,70,8,57,111,107,107,251,114,204,168,81,222,190,190,95,193,204,204, + 12,167,78,157,194,161,173,91,217,205,192,144,95,8,121,49,161,176,167,158,65,164,61,44,225,9,30,63,102,140,79,179,102,227,96,102,102,134,147,39, + 79,226,192,230,205,70,243,252,55,163,122,57,90,60,146,255,232,109,156,226,241,219,56,5,56,74,57,74,53,60,30,18,10,116,186,213,145,81,137,213, + 18,5,197,161,195,149,171,166,86,103,119,131,156,197,226,167,186,37,221,101,193,178,108,98,233,25,105,165,111,210,134,126,215,235,245,137,70,210,175,245, + 240,248,104,6,106,149,243,178,138,81,28,14,52,86,100,25,219,71,11,0,50,51,51,83,0,44,118,118,118,62,210,189,123,247,241,0,140,75,156,43, + 3,66,200,238,14,29,58,124,11,128,79,8,217,149,148,148,244,81,66,105,114,114,114,164,171,171,235,122,79,79,207,146,65,211,21,113,114,28,23,221, + 168,81,163,146,6,162,101,133,84,121,127,115,28,87,233,103,148,147,147,131,86,173,90,125,52,211,146,82,138,184,184,184,98,143,19,128,194,115,95,145, + 128,83,40,20,19,166,77,155,246,139,80,40,244,0,64,138,69,46,203,178,252,109,219,182,153,176,44,203,7,64,120,60,30,35,20,10,213,103,206,156, + 97,24,134,137,215,104,52,19,42,179,243,47,198,137,37,75,150,80,0,138,23,47,94,52,222,190,125,187,215,215,95,127,29,121,239,222,189,71,0,28, + 1,28,175,14,105,145,112,186,71,8,105,191,115,231,206,133,19,38,76,104,53,108,216,48,65,199,142,29,113,233,210,37,246,246,237,219,143,85,42,213, + 218,170,8,44,0,32,132,228,186,187,187,3,64,165,255,239,44,203,86,152,200,107,87,67,178,125,248,36,23,147,221,107,175,41,50,147,181,65,122,133, + 246,187,253,64,88,85,236,41,139,26,53,106,236,16,8,4,230,33,33,33,240,242,242,202,62,122,244,168,226,229,203,151,147,41,165,87,255,12,239,63, + 133,212,212,212,57,132,144,37,155,54,109,74,110,210,164,137,68,36,18,105,141,21,89,255,20,40,165,12,33,164,247,79,221,6,157,239,176,104,154,103, + 183,78,126,102,238,53,29,93,195,223,167,225,221,195,75,5,47,47,172,138,165,26,249,23,148,210,74,231,155,82,74,159,16,66,234,204,158,55,187,120, + 168,116,227,46,215,207,209,255,161,161,210,43,215,175,95,239,237,235,235,139,83,167,78,225,250,225,195,24,154,153,137,91,124,62,159,39,18,217,93,208, + 233,54,192,184,198,197,43,55,110,220,232,211,176,97,67,156,56,113,2,129,7,14,96,72,245,120,12,161,37,0,135,162,223,51,1,68,0,104,14,192, + 20,128,6,133,163,157,236,75,109,159,85,180,174,120,253,93,0,127,91,34,108,181,114,180,66,223,198,52,255,171,13,81,169,84,217,222,222,222,85,234, + 34,168,215,235,43,140,225,50,12,147,88,171,86,45,0,198,119,103,175,76,20,101,101,101,181,48,214,190,170,226,207,230,98,149,6,203,113,177,206,206, + 206,92,17,111,121,239,85,238,50,10,196,84,229,125,82,82,82,34,0,84,62,225,219,0,146,146,146,78,195,136,161,209,198,110,7,0,217,217,217,213, + 30,230,107,8,132,210,164,101,203,150,253,235,111,35,4,54,40,53,40,62,41,165,161,0,90,255,165,70,254,13,160,148,158,4,112,146,16,194,187,119, + 239,222,184,134,13,27,246,0,112,3,192,46,90,216,209,251,207,242,151,8,174,221,187,119,7,80,74,145,151,151,183,185,170,2,171,24,105,105,105,85, + 206,19,52,132,236,52,237,205,163,187,18,59,171,114,116,1,123,20,90,163,230,45,86,4,66,72,179,230,205,155,15,136,143,143,215,134,133,133,61,139, + 139,139,219,8,224,178,49,30,218,255,36,80,74,213,142,142,142,191,141,24,49,226,51,0,251,255,44,95,121,225,196,63,11,74,105,12,33,164,201,173, + 217,63,140,185,101,109,209,7,172,160,46,180,188,11,208,102,93,2,176,175,42,231,188,72,72,109,68,57,173,74,254,63,131,20,246,191,10,24,61,122, + 52,150,44,89,130,192,13,27,116,147,8,201,21,2,244,106,225,131,38,143,0,243,141,229,25,57,114,36,150,44,89,130,203,235,214,85,139,167,18,56, + 16,66,46,2,192,130,5,11,190,91,179,102,141,205,194,133,11,27,175,93,187,118,117,209,223,175,138,215,3,0,165,180,239,194,133,11,27,148,90,159, + 15,224,233,159,180,161,122,40,253,196,254,87,191,0,116,253,196,249,137,243,19,231,39,206,255,37,78,30,143,55,27,64,211,255,116,59,63,113,126,226, + 252,79,227,172,228,213,167,80,178,24,254,105,232,247,82,203,254,54,251,0,56,3,248,182,212,203,185,120,93,181,71,240,124,194,39,124,194,39,124,194, + 199,96,89,246,127,202,43,242,9,159,240,239,68,105,47,86,117,214,255,85,160,21,12,149,38,0,186,26,216,169,42,141,35,203,229,168,196,168,10,249, + 63,113,126,226,252,196,249,137,243,19,231,39,206,79,156,255,255,56,43,227,54,176,127,31,66,200,69,74,105,95,67,63,139,56,63,250,189,212,178,191, + 44,237,160,156,99,49,56,84,250,111,117,245,225,191,196,93,249,137,243,19,231,39,206,79,156,159,56,63,113,126,226,252,247,114,86,242,234,131,194,214, + 55,116,193,130,5,11,233,127,88,232,176,162,87,5,161,195,83,252,164,36,88,138,197,102,34,0,208,106,149,58,87,87,228,1,131,254,171,146,58,63, + 225,223,15,66,136,12,0,168,17,195,167,171,178,237,39,124,194,39,124,194,39,252,207,32,131,22,121,170,0,100,0,32,69,127,107,139,126,102,0,133, + 73,240,101,126,255,96,253,63,5,35,170,14,79,241,51,51,205,236,5,2,185,15,203,170,235,1,128,64,192,123,147,153,105,19,105,111,127,42,179,58, + 98,203,65,38,123,46,228,243,93,141,217,86,207,178,73,153,105,105,31,180,142,167,192,127,189,192,51,86,68,252,25,177,241,79,8,21,7,7,7,153, + 76,38,235,111,105,105,217,38,39,39,231,73,70,70,198,89,67,115,15,9,33,107,8,193,188,162,223,127,164,148,46,52,196,91,149,109,203,217,215,219, + 204,204,108,50,33,164,33,0,80,74,195,148,74,229,78,74,233,199,13,219,254,159,131,16,98,10,224,75,129,64,48,210,222,222,190,85,106,106,234,50, + 74,105,181,186,121,19,66,4,0,102,91,91,91,15,181,182,182,174,149,157,157,29,149,151,151,119,2,192,70,74,105,165,165,210,203,103,184,180,233,216, + 163,227,226,219,129,183,87,46,221,146,252,240,163,245,115,92,236,186,119,107,183,228,246,133,160,21,11,183,39,85,216,125,186,28,219,120,0,138,155,230, + 113,40,124,106,253,75,219,235,147,194,233,5,253,0,116,4,112,27,192,5,99,142,219,0,215,103,0,190,67,161,205,27,41,165,183,254,50,67,255,6, + 16,66,204,101,50,217,58,0,253,4,2,193,235,164,164,164,111,41,165,198,182,177,249,187,108,18,160,176,204,191,33,10,219,112,60,165,70,180,112,48, + 6,246,246,246,125,5,2,193,228,162,214,46,59,51,51,51,255,145,220,158,234,64,34,145,108,118,114,114,26,167,82,169,148,132,16,90,186,223,35,195, + 48,137,25,25,25,127,91,229,252,191,17,255,158,138,193,191,0,229,10,173,164,36,88,10,4,114,159,244,212,208,161,201,41,33,67,0,192,197,185,241, + 9,71,167,70,199,147,146,196,186,150,221,252,165,66,51,193,78,62,95,216,84,173,213,216,11,5,194,76,29,163,15,230,105,233,228,148,55,103,202,109, + 182,40,228,243,93,99,35,111,57,50,186,108,8,77,92,32,52,253,168,151,84,9,92,92,92,170,117,48,182,182,181,45,116,18,147,0,161,144,223,141, + 163,76,67,202,1,60,34,12,99,88,253,13,145,70,243,83,118,246,251,106,55,10,172,103,79,156,40,48,12,4,221,64,113,157,0,199,222,100,210,84, + 99,247,55,86,68,252,73,177,81,122,223,77,148,210,57,198,238,107,44,220,220,220,108,6,14,28,184,249,135,31,126,48,149,74,165,36,62,62,190,199, + 252,249,243,63,119,115,115,155,149,152,152,152,92,198,30,25,33,152,199,113,148,7,0,60,30,153,47,147,201,204,248,124,254,71,189,141,88,150,53,35, + 4,83,57,142,146,162,109,231,17,66,182,24,35,24,77,77,77,191,106,213,186,237,172,117,235,55,74,101,142,142,230,12,203,233,98,98,99,205,23,47, + 156,211,218,212,212,116,139,74,165,58,90,25,71,89,16,66,8,159,207,31,42,145,72,250,2,240,45,90,28,174,209,104,46,178,44,123,220,216,27,186, + 147,147,211,93,62,159,95,179,42,239,205,178,108,124,106,106,170,95,229,91,126,12,66,200,96,15,15,143,125,29,58,116,48,107,213,170,21,196,98,49, + 150,44,89,50,27,64,133,66,171,88,80,153,153,153,13,53,55,55,175,165,80,40,222,171,84,170,211,98,177,184,235,150,45,91,220,219,181,107,103,145, + 150,150,70,248,124,190,236,242,229,203,223,108,222,188,185,7,33,164,75,101,55,185,220,247,116,177,164,159,111,251,220,247,183,22,3,232,85,118,61,163, + 54,25,73,249,238,125,85,244,69,2,170,80,90,79,8,225,9,133,194,45,78,78,78,163,213,106,181,26,133,189,215,168,76,38,43,94,15,0,208,106, + 181,114,185,92,94,215,88,222,82,252,117,1,140,181,182,182,30,61,119,238,92,155,94,189,122,225,240,225,195,83,246,236,217,35,39,132,252,6,224,87, + 74,105,68,21,105,231,165,166,166,246,22,10,133,196,221,221,157,15,192,104,161,69,8,241,1,176,8,133,55,155,157,148,82,150,16,210,9,40,252,127, + 7,240,99,177,112,227,243,249,59,235,214,173,219,63,60,60,252,103,74,169,193,121,148,149,193,201,201,233,151,29,59,118,12,249,226,139,47,248,25,25, + 25,174,77,154,52,57,2,160,125,117,249,74,29,203,24,137,68,50,179,113,227,198,245,35,34,34,34,243,242,242,54,162,240,124,26,252,159,34,132,184, + 1,232,106,109,109,221,101,209,162,69,210,190,125,251,98,247,238,221,189,247,236,217,163,32,132,220,0,240,199,159,21,129,2,129,96,114,98,98,162,61, + 165,20,206,206,206,147,81,201,112,115,3,118,126,7,96,20,10,67,92,123,41,165,235,255,140,77,229,129,207,231,111,25,58,116,232,232,35,71,142,152, + 197,198,198,154,185,186,186,150,52,207,38,132,84,251,254,249,9,127,14,229,229,104,21,163,92,161,37,22,155,137,88,86,93,47,57,37,100,200,231,29, + 182,89,1,192,221,59,211,134,56,58,53,8,19,139,205,34,37,150,38,103,252,251,117,109,58,168,111,7,226,230,236,136,196,148,116,217,175,199,2,123, + 94,12,188,117,6,133,13,196,202,5,163,203,134,169,238,15,68,220,223,10,251,142,201,216,126,57,17,15,95,198,64,153,155,137,154,78,166,88,31,208, + 29,78,54,102,213,58,72,169,204,167,19,207,196,236,248,215,95,141,176,234,255,165,175,176,134,147,19,40,149,32,242,189,162,237,149,107,183,90,158,62, + 121,116,178,84,230,51,84,145,22,105,244,197,173,185,11,49,45,208,225,75,1,159,124,211,190,117,131,46,95,245,110,207,171,239,91,7,175,95,133,119, + 63,127,243,241,250,250,50,222,13,134,165,7,205,69,56,247,60,217,112,67,191,242,4,71,183,110,221,218,75,36,18,93,233,237,52,26,141,136,16,124, + 86,29,177,81,252,30,90,173,134,39,20,138,193,227,145,89,141,27,55,246,205,204,204,188,69,8,217,151,148,84,53,111,193,116,66,196,114,129,160,57, + 79,34,113,102,181,90,59,0,32,98,177,220,205,198,166,209,162,239,190,147,242,249,124,46,43,43,11,74,165,146,140,31,63,222,228,253,251,247,254,0, + 182,86,98,35,246,236,217,227,227,236,236,172,45,187,46,37,37,69,252,197,23,253,171,98,98,49,167,207,103,109,218,205,12,12,188,234,155,151,45,87, + 239,217,180,251,133,222,196,84,237,89,207,71,180,115,247,1,203,111,71,15,159,70,8,9,166,148,26,61,175,142,16,226,97,106,106,122,102,195,134,13, + 13,59,117,234,36,116,116,116,68,90,90,26,194,195,195,27,222,188,121,243,203,3,7,14,204,38,132,248,83,74,141,233,224,238,125,227,224,62,71,115, + 91,59,176,122,61,92,26,55,43,206,111,192,187,155,215,192,232,116,224,244,122,248,246,253,18,64,97,206,164,175,175,111,181,186,238,18,66,92,26,52, + 104,112,104,245,234,213,34,141,70,131,199,143,31,227,214,173,91,92,74,74,74,133,13,113,9,33,2,66,200,181,165,75,151,186,249,249,249,89,100,102, + 102,130,101,89,251,115,231,206,77,110,218,180,169,165,187,187,187,248,224,193,131,80,40,20,96,24,198,182,86,173,90,182,95,125,245,149,246,224,193,131, + 179,1,172,43,143,115,249,12,151,54,121,239,233,226,84,82,171,103,221,230,35,145,74,174,246,156,213,203,249,138,101,109,82,226,217,234,85,187,182,69, + 173,122,230,243,165,150,141,108,243,146,254,152,223,171,118,237,61,87,222,87,254,48,68,8,225,241,120,188,45,254,254,254,95,31,59,118,204,44,60,60, + 220,204,215,215,23,28,199,149,116,224,47,110,56,235,237,93,233,164,176,242,248,215,78,156,56,113,254,144,33,67,208,184,113,227,146,166,168,223,127,255, + 61,230,207,159,111,115,247,238,221,217,71,143,30,157,77,8,89,71,41,93,80,5,234,210,215,219,170,126,198,203,163,163,163,7,159,57,115,102,248,188, + 121,243,188,1,76,5,176,36,43,43,171,3,0,216,217,217,137,1,220,34,132,140,153,59,119,238,164,5,11,22,160,119,239,222,75,8,33,171,170,227, + 229,35,132,240,237,237,237,123,127,241,197,23,124,189,94,15,115,115,115,232,245,250,218,85,229,41,195,73,0,236,152,48,97,194,164,137,19,39,194,198, + 198,6,122,189,222,231,216,177,99,123,150,44,89,210,134,16,50,182,60,91,9,33,35,39,77,154,52,112,196,136,17,104,209,162,5,4,130,194,211,184, + 97,195,6,172,88,177,66,122,237,218,181,47,15,30,60,248,37,33,228,52,165,180,218,189,208,56,142,131,64,32,64,66,66,2,28,29,29,37,182,182, + 182,129,132,144,221,89,89,89,103,141,217,223,214,214,246,51,66,200,170,226,198,196,132,144,31,61,61,61,191,47,251,30,165,65,41,133,64,32,72,203, + 207,207,31,154,153,153,249,162,178,247,32,132,252,56,116,232,208,175,143,28,57,34,5,128,245,235,215,99,230,204,153,144,201,100,144,74,165,198,30,234, + 39,252,13,160,213,234,12,95,1,148,74,101,179,133,211,191,1,143,87,248,212,88,199,203,3,107,190,251,150,156,191,24,216,172,162,253,132,38,46,136, + 184,191,21,18,247,0,104,244,12,30,189,140,198,245,245,61,0,0,62,189,22,65,163,235,82,108,176,173,216,212,244,71,45,203,62,128,147,211,99,196, + 197,85,24,91,149,202,124,58,57,56,201,46,238,218,181,206,180,97,237,186,208,49,122,36,165,39,129,16,9,220,92,45,48,102,100,47,97,135,14,46, + 246,203,151,255,114,201,220,193,103,64,65,70,100,165,13,67,235,58,144,253,237,155,121,15,249,170,143,159,164,81,195,6,16,73,76,75,214,53,111,209, + 2,205,91,180,224,45,80,228,119,123,242,244,121,183,83,215,30,105,234,58,144,19,17,25,116,84,5,148,37,93,46,9,33,152,49,99,6,138,159,190, + 139,145,150,150,134,155,55,111,148,187,143,145,248,224,61,86,173,90,101,33,151,203,123,237,221,187,183,179,179,179,243,170,148,148,148,251,198,144,124,67, + 72,77,72,36,93,70,111,220,200,53,237,223,159,111,237,228,196,227,88,150,36,71,69,217,109,218,186,181,99,246,187,119,166,5,182,182,217,114,149,74, + 25,25,25,9,19,19,19,34,16,8,90,150,229,161,148,166,17,66,126,228,241,200,124,66,8,36,18,147,200,137,19,39,22,95,76,106,94,184,112,193, + 172,95,191,126,74,0,177,0,32,145,152,184,242,249,60,159,194,4,66,252,104,140,192,52,55,55,159,190,114,245,143,230,121,217,57,42,93,65,129,222, + 209,82,74,32,149,242,243,243,20,121,201,169,25,234,69,203,86,8,38,140,25,49,29,192,100,163,78,32,33,30,77,154,52,121,114,230,204,25,71,59, + 59,59,228,228,228,32,43,43,11,79,158,60,1,165,20,254,254,254,146,182,173,91,53,251,110,209,226,135,132,144,54,198,136,45,115,91,123,172,247,107, + 10,0,248,62,54,171,248,125,176,123,112,223,146,109,86,36,230,2,0,76,76,76,254,204,8,169,54,93,186,116,17,1,192,216,177,99,243,242,243,243, + 215,0,56,66,43,104,170,90,132,217,139,23,47,118,245,242,242,170,113,228,200,17,40,20,10,0,112,244,242,242,130,143,143,15,123,251,246,109,248,248, + 248,192,194,194,2,119,239,222,197,195,135,15,209,162,69,11,11,145,72,52,4,6,132,86,199,30,29,23,75,250,249,182,175,219,124,36,164,150,206,216, + 115,244,56,34,158,31,104,175,209,133,47,94,51,213,117,132,138,74,70,185,121,91,44,168,217,162,131,93,157,6,253,81,163,249,11,123,53,123,47,122, + 201,148,90,107,5,38,234,3,75,55,36,103,149,199,91,20,46,92,239,239,239,63,248,216,177,99,214,0,16,26,26,138,180,180,52,56,56,56,192,196, + 196,4,66,161,176,100,62,105,53,49,106,231,206,157,37,162,141,97,24,80,90,56,5,192,204,204,12,159,127,254,57,154,54,109,138,179,103,207,142,2, + 240,145,208,34,132,248,181,110,221,250,112,141,26,53,220,75,47,239,211,167,15,134,13,27,6,0,232,208,161,67,151,65,131,6,209,98,65,152,146,146, + 162,120,250,244,105,55,74,233,227,242,12,226,241,120,170,164,164,36,204,157,59,23,49,49,49,83,8,33,113,0,76,196,98,113,241,38,98,66,136,79, + 131,6,13,182,204,156,57,19,239,223,191,199,235,215,175,159,84,55,148,74,41,101,61,61,61,223,233,245,250,22,12,195,64,165,82,97,192,128,1,38, + 182,182,182,105,124,62,255,77,102,102,230,112,90,88,206,110,20,8,33,38,0,54,78,156,56,113,210,188,121,243,112,227,198,13,156,63,127,30,35,70, + 140,64,64,64,0,164,82,233,232,128,128,128,135,0,246,150,179,123,151,157,59,119,130,101,217,143,254,55,76,76,76,224,231,231,135,250,245,235,227,252, + 249,243,93,80,106,62,106,85,64,8,169,225,239,239,47,230,56,14,5,5,5,184,125,251,182,212,212,212,84,234,230,230,54,30,128,81,66,203,218,218, + 250,192,241,227,199,113,226,196,9,0,64,100,100,36,188,189,189,205,43,219,47,44,44,172,86,255,254,253,143,1,168,83,217,182,53,106,212,152,120,236, + 216,177,18,69,229,226,226,2,137,68,130,82,223,131,79,248,15,68,185,87,34,173,86,169,19,8,120,111,92,156,27,159,184,123,103,90,73,232,16,224, + 189,209,106,149,58,0,96,57,138,60,37,3,83,9,15,177,169,249,120,21,149,249,17,15,45,83,162,41,52,245,128,164,85,44,40,165,208,234,88,104, + 114,83,177,230,146,18,225,137,106,104,11,228,208,234,10,211,176,236,237,237,5,129,129,87,102,254,241,199,205,73,191,253,246,27,63,209,202,234,53,114, + 115,155,149,199,105,107,91,219,66,96,110,122,226,231,93,75,76,41,63,10,145,241,5,168,227,214,10,246,214,238,72,205,44,192,131,215,151,241,230,237, + 69,120,57,215,64,192,244,158,38,43,87,31,57,110,99,227,229,33,151,71,231,25,178,179,8,35,127,185,26,9,38,59,10,108,214,123,176,249,201,31, + 109,32,117,240,64,243,78,174,112,112,175,45,25,21,176,98,36,10,93,198,31,113,82,74,211,248,124,254,207,60,30,153,68,8,65,227,198,77,18,55, + 110,220,168,251,136,16,208,53,110,220,36,145,207,231,185,21,94,216,121,59,57,142,77,43,143,179,156,115,157,70,8,249,81,44,150,204,3,0,39,39, + 231,132,75,151,46,233,6,15,30,140,13,27,54,136,231,207,159,191,200,205,205,109,108,217,240,94,89,78,127,66,60,92,107,215,238,190,234,193,3,42, + 212,235,73,246,147,39,121,57,41,41,76,106,126,190,248,228,155,55,189,199,205,153,35,118,119,119,199,253,139,23,237,50,10,10,104,142,70,163,202,201, + 201,161,12,195,60,41,143,147,82,186,80,38,147,153,237,217,179,199,103,226,196,137,47,146,147,147,23,2,128,139,139,203,26,0,245,1,196,150,90,134, + 93,187,142,39,141,31,63,62,50,45,45,237,131,144,105,5,199,222,192,209,193,193,236,232,47,7,67,108,45,76,121,246,110,206,60,161,149,149,144,145, + 152,137,40,133,218,203,171,182,25,128,6,6,206,217,7,156,132,16,98,106,106,122,230,247,223,127,119,20,10,133,96,89,22,14,14,14,136,137,137,65, + 78,78,14,242,243,243,17,21,254,26,158,238,238,88,190,96,190,243,212,249,11,206,16,66,90,148,190,153,149,103,39,171,255,240,163,46,118,241,151,69, + 233,60,11,35,143,189,44,98,226,227,227,33,149,74,209,176,97,67,233,131,7,15,238,25,18,89,165,57,77,76,76,134,180,107,215,206,226,200,145,35, + 104,209,162,5,172,172,172,112,251,246,109,132,134,134,66,167,211,241,20,10,5,164,82,41,214,174,93,11,15,15,15,228,231,231,35,54,54,214,78,40, + 20,218,27,226,188,29,120,123,101,238,251,91,139,83,201,213,158,123,142,30,199,248,175,134,194,137,70,221,179,170,77,86,118,239,215,238,123,202,119,239, + 107,110,209,216,198,187,97,63,136,196,82,76,157,183,2,145,97,23,108,148,249,33,83,8,155,224,14,96,70,89,206,34,143,8,207,221,221,125,220,201, + 147,39,45,138,151,243,249,252,146,153,135,165,135,192,27,26,248,110,204,249,36,132,32,38,38,6,142,142,142,144,74,165,37,3,196,195,195,195,241,232, + 209,35,20,79,163,48,192,57,252,143,63,254,112,55,55,55,47,187,13,50,51,51,193,48,12,204,204,204,192,178,44,116,58,29,244,122,61,212,106,181, + 180,126,253,250,147,1,60,46,143,147,227,184,89,67,134,12,105,247,248,241,227,90,91,183,110,133,86,171,93,159,154,154,138,129,3,7,130,227,56,116, + 233,210,229,51,74,105,196,162,69,139,0,0,51,103,206,212,23,20,20,76,172,206,177,23,29,127,253,65,131,6,213,186,113,227,6,218,183,111,15,141, + 70,131,13,27,54,88,238,218,181,203,242,224,193,131,14,243,230,205,219,7,160,71,69,156,69,159,215,122,39,39,167,73,95,125,245,149,105,209,12,83, + 28,56,112,0,203,151,47,63,6,96,209,149,43,87,150,158,63,127,126,228,184,113,227,176,124,249,242,0,20,9,173,242,56,163,163,163,225,224,224,0, + 75,75,75,0,128,78,167,67,112,112,48,174,95,191,142,122,245,234,85,122,76,21,216,89,195,223,223,127,223,209,163,71,45,18,18,18,112,247,238,93, + 120,122,122,66,169,84,86,58,27,182,52,103,94,94,158,212,203,203,11,30,30,30,37,227,206,94,191,126,109,112,68,218,254,211,55,193,228,197,97,228, + 55,223,32,43,43,75,90,30,103,89,168,84,42,117,124,124,188,116,221,186,117,112,118,118,70,141,26,53,96,98,98,2,66,8,244,122,61,168,1,93, + 109,204,231,222,177,35,17,100,38,217,124,97,101,109,51,133,82,42,200,205,149,255,162,67,206,169,247,239,233,71,17,8,99,57,63,161,16,2,0,184, + 116,233,18,237,211,167,15,41,254,233,234,138,188,204,76,155,72,71,167,70,199,29,157,26,20,205,253,226,189,225,243,109,34,101,50,101,30,0,232,24, + 138,160,55,57,8,121,151,138,208,119,169,48,151,24,231,124,209,232,152,194,250,76,74,161,86,252,235,161,85,167,148,67,163,43,76,247,208,106,148,200, + 205,120,77,6,15,232,102,50,105,210,4,56,59,187,58,24,160,131,78,98,18,48,117,102,111,107,91,107,33,46,62,184,138,207,234,13,128,137,68,136, + 172,92,53,64,128,183,81,215,1,206,2,97,145,241,104,221,192,12,61,186,251,74,207,158,138,152,3,96,137,49,246,50,137,79,32,242,238,5,33,171, + 135,62,51,2,92,78,28,96,238,4,21,145,34,43,37,14,111,238,157,46,140,198,87,2,150,101,167,56,56,56,228,44,90,180,168,99,157,58,117,116, + 147,39,79,126,25,27,27,251,193,88,155,154,53,107,254,180,115,231,78,188,123,247,46,105,213,170,85,183,51,50,50,22,27,99,99,49,40,165,11,8, + 33,155,1,32,37,37,37,243,220,185,115,205,239,220,185,19,176,121,243,102,217,180,105,211,196,211,166,77,27,3,224,7,67,251,79,39,68,108,46,145, + 116,93,117,247,46,101,18,19,53,135,182,109,19,239,8,10,90,164,227,56,23,123,71,71,210,182,117,235,2,51,30,47,51,43,45,141,113,168,85,139, + 31,115,253,186,29,53,53,77,190,114,229,74,158,66,161,48,56,58,135,207,231,43,203,11,23,150,7,103,103,103,109,121,57,92,134,64,8,201,227,40, + 213,217,120,121,162,123,151,182,117,222,69,68,69,73,172,172,249,222,222,53,235,190,126,19,251,152,99,24,13,33,36,175,114,38,128,207,231,15,221,188, + 121,115,35,75,75,75,112,28,7,43,43,43,100,100,100,64,171,213,34,47,47,15,218,252,92,232,114,115,17,26,31,131,118,29,58,98,112,207,238,190, + 7,207,253,62,20,192,177,138,120,93,26,55,43,241,100,173,168,105,87,178,124,121,66,78,137,232,90,215,204,27,34,169,20,221,102,85,37,18,245,33, + 40,165,47,196,98,241,101,127,127,255,222,115,230,204,225,165,164,164,92,37,132,180,163,148,190,174,104,63,169,84,90,59,51,51,19,10,133,2,86,86, + 86,216,188,121,51,100,50,25,148,74,37,158,62,125,74,221,220,220,200,237,219,183,225,230,230,134,172,172,44,232,116,58,168,84,170,84,173,86,107,48, + 92,94,20,30,236,53,171,151,243,149,136,231,7,218,187,146,232,167,67,102,119,120,23,17,250,38,254,218,245,7,63,48,106,147,132,156,196,63,230,123, + 181,124,97,63,101,238,114,108,95,191,20,17,143,239,102,203,60,242,118,152,18,205,254,214,221,12,219,91,80,80,160,14,15,15,183,8,9,9,1,33, + 4,86,86,86,48,51,51,43,87,108,85,21,69,30,179,226,247,65,65,65,1,68,34,17,236,236,236,176,119,239,222,146,27,175,167,167,103,69,52,191, + 116,235,214,109,168,135,135,135,69,233,133,45,91,182,196,132,9,19,240,243,207,63,35,40,40,232,131,121,154,169,169,169,41,122,189,126,191,33,66,74, + 105,14,33,164,231,128,1,3,158,223,187,119,207,114,239,222,189,96,24,166,220,215,158,61,123,240,232,209,163,37,148,210,55,85,62,1,133,231,160,222, + 192,129,3,239,30,62,124,216,58,35,35,3,197,223,141,130,130,2,176,44,139,186,117,235,18,134,97,42,204,123,35,132,240,248,124,254,185,109,219,182, + 245,27,63,126,60,4,2,1,180,90,45,182,109,219,134,249,243,231,167,1,24,69,41,213,17,66,22,237,223,191,127,100,255,254,253,209,164,73,19,223, + 138,56,21,10,5,20,10,5,132,66,33,156,156,156,176,114,229,74,104,181,133,151,21,31,31,159,226,247,229,3,248,197,199,199,167,95,100,100,228,6, + 74,233,143,229,113,57,59,59,15,160,148,126,203,178,108,190,191,191,191,221,209,163,71,45,146,146,146,240,252,249,115,44,89,178,68,206,113,28,203,113, + 28,81,169,84,209,50,153,236,185,68,34,49,85,42,149,217,89,89,89,171,169,225,153,149,68,46,151,35,61,61,29,189,251,244,193,169,147,39,193,48, + 12,244,122,253,71,47,134,97,112,253,226,73,36,68,135,163,109,155,54,128,145,209,11,66,8,17,10,133,24,59,118,44,4,2,1,76,77,77,161,86, + 171,161,215,23,214,103,20,9,173,42,133,165,189,189,45,236,4,16,141,247,241,249,60,96,240,140,190,14,206,46,174,176,182,148,32,60,252,117,187,155, + 55,174,111,171,95,215,97,23,167,213,239,122,19,147,243,183,15,187,47,171,69,254,238,209,73,55,113,0,0,32,0,73,68,65,84,247,251,59,97,68, + 213,225,32,214,222,254,84,102,82,146,88,39,22,155,69,2,133,94,174,66,145,53,136,5,142,130,209,233,139,46,20,180,232,101,164,208,210,179,120,23, + 17,134,123,215,126,135,189,50,9,153,209,77,1,81,35,104,85,185,80,107,11,159,252,57,142,197,203,231,55,144,151,155,141,134,45,250,2,60,222,35, + 67,124,86,118,164,111,219,230,141,249,239,226,195,208,210,103,16,106,185,181,71,92,74,30,114,20,26,200,243,212,104,218,112,1,50,228,42,228,41,213, + 120,253,238,32,92,93,106,241,136,32,170,11,140,20,90,154,215,103,160,121,115,30,162,26,237,32,174,219,31,252,26,126,136,15,185,133,151,87,54,33, + 241,213,125,80,142,133,179,79,171,202,137,0,16,66,182,93,189,122,181,85,187,118,237,4,93,187,118,109,226,226,226,210,36,57,57,249,37,0,184,184, + 184,52,233,221,187,119,19,7,7,7,108,217,178,69,69,8,217,102,20,105,25,148,9,183,61,145,201,100,171,206,156,57,179,109,194,132,9,112,116,116, + 108,84,209,190,25,66,97,147,81,171,87,83,33,159,79,143,109,223,46,90,126,245,234,198,223,246,239,23,117,238,212,137,80,74,17,28,28,108,182,110, + 251,118,179,175,191,248,34,54,46,61,157,185,19,20,164,75,73,76,204,79,47,40,88,158,156,156,108,116,97,192,95,9,189,94,255,48,38,58,202,173, + 89,171,166,14,47,94,71,191,238,209,165,109,27,30,143,199,123,19,21,247,208,193,193,210,236,198,181,63,116,122,189,254,163,106,183,242,32,145,72,250, + 118,238,220,89,32,151,203,225,226,226,130,140,140,12,36,37,37,21,122,28,114,229,208,229,230,66,151,159,11,78,145,143,232,167,79,208,180,150,151,228, + 100,97,178,124,133,66,171,248,41,179,172,119,165,180,103,75,108,97,1,177,84,10,82,197,176,33,33,228,11,107,107,235,249,57,57,57,151,41,165,43, + 117,58,221,212,249,243,231,183,220,186,117,171,253,170,85,171,44,191,253,246,219,147,132,144,166,148,82,141,33,14,133,66,241,158,97,24,59,0,178,27, + 55,110,192,209,209,17,185,185,185,197,158,22,173,82,169,52,201,202,202,130,70,163,129,86,171,133,165,165,37,158,61,123,150,205,48,204,133,202,236,179, + 172,77,86,106,116,225,139,237,124,205,147,117,140,77,135,244,108,78,190,116,67,242,10,0,27,123,213,174,189,71,199,221,141,126,27,118,193,38,230,233, + 237,236,228,183,5,181,246,92,138,50,152,163,69,41,165,132,16,142,16,66,235,214,173,139,204,204,76,240,249,124,152,153,153,65,42,149,226,202,149,43, + 24,52,104,80,149,133,22,33,196,196,220,220,124,53,143,199,27,106,101,101,229,192,178,44,22,44,88,128,126,253,250,65,44,22,67,167,211,149,120,52, + 139,189,84,21,121,58,40,165,193,0,44,203,188,71,39,123,123,251,155,26,141,6,81,81,81,56,119,238,92,71,74,233,29,163,12,252,23,111,20,33, + 164,167,159,159,223,129,230,205,155,215,166,148,162,81,163,70,24,54,108,24,14,30,60,136,224,224,96,228,229,229,113,215,175,95,255,13,192,134,170,112, + 19,66,72,209,249,173,59,112,224,192,251,71,142,28,177,201,202,202,130,74,165,66,65,65,1,78,158,60,137,118,237,218,193,222,222,30,135,15,31,102, + 40,165,6,63,251,162,28,186,189,187,118,237,234,55,110,220,56,236,216,177,3,199,142,29,67,255,254,253,49,116,232,80,100,100,100,200,214,175,95,63, + 146,16,178,23,192,210,97,195,134,65,161,80,224,233,211,167,225,198,216,170,215,235,145,147,147,131,156,156,28,152,154,154,22,159,27,160,80,172,28,220, + 180,105,211,87,1,1,1,168,85,171,214,210,162,162,160,143,170,68,57,142,155,152,148,148,100,35,16,8,236,24,134,65,66,66,2,158,61,123,134,41, + 83,166,100,103,103,103,79,160,148,198,17,66,22,141,29,59,118,229,172,89,179,74,190,75,179,102,205,186,72,8,233,105,200,155,147,144,144,0,177,88, + 140,227,199,142,65,93,36,76,139,206,73,137,237,197,194,104,212,215,254,32,100,32,82,83,43,191,116,214,173,107,211,64,204,151,204,16,137,132,118,114, + 185,188,228,218,161,213,106,161,209,104,62,240,100,137,68,66,187,86,205,106,92,82,41,243,191,123,21,41,55,56,32,189,126,29,235,198,102,230,86,1, + 125,122,14,30,222,189,231,151,124,70,175,71,96,224,5,252,250,235,78,116,242,243,65,173,58,141,48,109,250,12,43,141,150,89,112,253,250,213,249,109, + 91,121,93,205,207,203,89,88,17,231,39,148,15,1,0,148,175,32,7,177,174,174,144,3,0,33,196,222,198,198,102,59,203,178,157,128,241,16,74,157, + 240,250,217,99,100,203,133,208,168,88,112,180,80,108,25,3,141,70,139,187,129,231,177,121,211,70,100,101,101,193,239,243,142,80,8,220,225,225,238,1, + 181,170,208,145,65,41,160,211,234,225,32,171,129,23,47,94,234,243,10,10,238,24,226,19,153,232,124,61,100,62,208,232,218,192,68,44,70,110,190,22, + 242,34,145,117,248,212,16,104,148,42,48,90,29,24,173,30,14,30,3,81,79,214,25,28,123,161,220,80,146,65,112,44,116,49,119,161,139,185,11,211, + 54,211,241,251,154,175,62,88,109,236,220,221,244,244,244,116,23,23,151,11,193,193,193,3,134,12,25,130,91,183,110,125,11,96,18,0,152,152,152,124, + 59,100,200,16,4,7,7,227,213,171,87,23,210,211,211,255,146,193,171,98,177,88,165,209,20,222,99,205,204,204,76,42,217,214,181,165,191,63,47,247, + 197,139,188,77,15,30,44,221,179,119,175,168,107,151,46,68,207,48,224,88,22,117,188,189,73,247,238,221,205,15,158,56,97,199,215,235,31,205,157,58, + 245,198,207,35,70,228,63,86,40,140,77,52,175,89,20,50,4,128,154,21,44,51,26,26,141,102,235,196,9,227,186,221,186,125,199,189,102,13,87,139, + 107,55,238,190,20,75,68,188,90,158,181,248,57,57,57,130,101,75,23,154,106,52,26,99,69,171,175,189,189,61,82,83,83,241,238,221,59,104,52,26, + 232,245,122,112,202,2,104,229,114,104,243,114,65,84,5,144,176,44,212,153,105,168,89,203,11,248,87,69,98,133,40,47,92,88,58,84,104,98,105,9, + 145,185,20,60,161,176,220,112,151,1,206,230,173,90,181,58,113,250,244,105,209,152,49,99,90,19,66,182,23,221,32,186,44,89,178,228,201,246,237,219, + 37,19,38,76,168,187,97,195,134,145,0,126,49,196,163,86,171,79,92,186,116,233,235,26,53,106,200,66,67,67,161,86,171,193,113,28,122,245,234,5, + 0,37,223,153,136,136,8,149,90,173,78,15,11,11,203,139,139,139,211,193,136,42,193,165,91,146,31,206,26,236,230,47,115,114,125,100,98,90,211,147, + 42,94,12,152,53,216,109,253,79,39,19,213,87,222,191,207,95,50,165,214,218,130,252,144,41,214,110,138,29,87,46,24,22,89,165,64,73,81,57,187, + 157,157,29,4,2,1,132,66,33,68,34,17,30,60,120,128,130,130,2,20,123,80,12,133,14,203,156,67,19,11,11,139,87,203,151,47,119,155,48,97, + 130,200,196,196,4,114,185,28,135,15,31,198,216,177,99,241,235,175,191,150,155,255,82,89,72,169,44,248,124,126,192,136,17,35,160,213,106,49,108,216, + 48,236,217,179,39,0,192,157,42,145,0,160,148,62,34,132,120,191,124,249,210,18,64,255,161,67,135,238,31,56,112,32,238,220,185,131,11,23,46,116, + 4,16,9,64,5,96,13,41,28,226,188,166,162,66,16,82,216,194,97,167,131,131,67,255,6,13,26,188,28,56,112,96,195,35,71,142,88,167,167,167, + 23,23,63,32,38,38,6,251,246,237,75,217,187,119,111,30,203,178,118,60,30,239,82,78,78,142,161,170,105,2,96,239,166,77,155,70,23,133,3,113, + 250,244,105,186,113,227,70,178,100,201,18,200,229,114,116,234,212,9,187,118,237,154,161,80,40,154,108,220,184,113,252,224,193,131,177,98,197,10,20,20, + 20,24,172,140,173,44,213,76,175,215,19,0,109,55,109,218,84,35,32,32,0,167,79,159,70,243,230,205,77,163,163,163,127,6,48,174,236,246,197,158, + 196,232,232,104,40,149,74,220,191,127,31,75,151,46,149,151,18,89,51,38,77,154,180,114,198,140,25,88,189,122,53,13,13,13,77,31,56,112,160,108, + 247,238,221,252,58,117,234,204,0,80,174,208,186,126,253,58,194,195,195,49,101,202,20,116,239,222,29,90,173,22,251,246,237,195,209,163,71,193,178,44, + 38,79,158,140,97,195,134,65,40,20,226,248,241,227,216,180,105,19,234,215,175,95,225,177,213,243,182,91,219,170,101,135,249,206,174,117,112,248,200,81, + 100,103,103,151,156,147,226,243,66,41,69,126,126,62,82,83,83,97,101,105,129,245,27,86,246,158,252,237,104,119,20,182,193,248,8,190,181,109,55,12, + 26,54,110,246,176,175,71,35,244,229,115,28,220,255,11,194,66,131,75,248,24,189,14,145,225,207,16,25,254,12,50,167,26,232,222,181,35,249,234,171, + 175,122,141,248,122,168,3,128,191,173,117,196,127,179,55,171,210,170,195,138,220,117,69,34,235,213,241,227,199,237,252,252,252,248,12,195,224,106,96,32, + 166,76,250,6,35,71,44,128,14,54,96,180,34,112,162,10,239,225,37,80,169,148,160,160,40,40,40,64,80,80,16,40,199,224,224,238,141,160,148,43, + 17,90,0,133,86,167,131,171,71,93,236,220,179,138,129,80,248,196,16,95,94,22,159,213,51,20,73,233,241,136,79,9,131,149,133,7,4,66,15,100, + 229,40,33,224,57,65,175,142,0,91,228,86,85,22,36,66,165,251,115,159,31,155,251,177,247,148,86,225,162,171,82,169,14,29,58,116,168,247,79,63, + 253,36,238,211,167,143,143,139,139,75,91,0,24,52,104,144,143,165,165,37,14,29,58,164,85,169,84,135,254,148,145,165,160,215,235,59,183,106,213,10, + 114,185,28,49,49,49,47,43,218,150,213,106,237,164,142,142,252,244,91,183,244,25,114,185,123,231,206,157,137,158,97,192,35,4,217,185,185,136,139,141, + 133,181,181,53,121,21,17,33,221,54,109,218,89,159,134,13,5,197,21,137,198,224,194,133,11,102,40,204,203,170,112,89,85,64,41,45,32,132,140,154, + 54,109,218,217,67,135,14,91,165,166,165,189,149,136,37,140,84,106,234,60,98,248,80,65,78,78,206,215,148,82,133,177,124,114,185,28,209,209,209,48, + 53,53,133,72,40,4,167,82,130,45,80,64,157,157,5,190,78,3,49,203,194,214,84,2,55,39,71,120,56,216,87,78,136,194,234,194,226,196,247,210, + 225,194,245,173,124,33,54,151,66,108,33,197,228,139,183,1,0,34,145,8,88,98,48,186,91,2,66,136,189,171,171,235,239,71,142,28,17,101,100,100, + 32,56,56,248,37,165,52,151,16,98,1,128,11,15,15,255,35,44,44,172,111,81,213,93,101,213,98,27,207,156,57,211,205,207,207,143,241,244,244,52, + 79,79,79,119,151,203,229,92,74,74,202,7,46,161,107,215,174,73,242,243,243,11,56,142,59,139,194,62,80,149,246,47,154,53,216,205,36,232,5,166, + 119,232,81,179,145,165,125,99,100,51,47,26,61,122,153,50,125,214,96,183,173,63,157,76,84,155,18,205,126,194,38,184,11,76,212,70,37,49,83,74, + 169,189,189,61,194,195,195,17,20,20,132,184,184,56,68,71,71,151,8,170,144,144,16,108,218,180,9,179,102,205,130,149,149,85,165,124,230,230,230,171, + 151,45,91,230,22,16,16,32,42,94,198,231,243,49,117,234,84,228,230,230,98,207,158,61,152,58,117,106,121,118,24,99,46,0,128,16,226,213,173,91, + 183,62,206,206,206,200,202,202,130,147,147,19,252,252,252,250,17,66,60,41,165,49,70,19,125,136,201,61,122,244,88,185,124,249,114,232,245,122,140,29, + 59,22,111,223,190,61,241,246,237,219,205,30,30,30,211,231,205,155,39,147,201,100,24,50,100,136,57,0,127,67,36,182,182,182,107,126,249,229,151,175, + 251,244,233,195,211,233,116,159,223,188,121,19,177,177,177,208,106,181,96,24,6,239,223,191,199,212,169,83,83,178,178,178,58,80,74,223,27,97,215,152, + 69,139,22,141,158,62,125,58,214,173,91,135,101,203,150,253,102,101,101,213,176,105,211,166,205,150,45,91,134,185,115,231,162,70,141,26,176,179,179,171, + 183,100,201,18,223,89,179,102,97,235,214,173,88,186,116,233,111,0,246,85,231,68,112,28,71,214,174,93,219,100,211,166,77,206,197,34,139,199,227,225, + 248,241,227,120,241,226,69,63,3,251,236,114,114,114,250,214,217,217,89,124,253,250,117,105,141,26,53,192,48,140,190,72,100,109,243,240,240,152,242,254, + 253,123,244,233,211,7,81,81,81,135,40,165,35,59,116,232,80,48,107,214,44,51,83,83,83,131,95,44,134,97,48,113,226,68,56,57,57,225,238,189, + 251,224,243,8,154,55,111,142,71,143,30,161,78,157,58,248,252,243,207,241,226,197,11,232,117,58,248,248,248,160,123,247,238,72,72,72,168,240,248,248, + 60,50,106,245,138,185,120,250,34,2,103,206,136,240,244,233,83,200,100,50,72,36,18,80,74,161,209,104,144,145,145,1,189,78,131,70,13,188,112,96, + 239,90,164,167,103,0,60,98,48,229,134,240,200,240,209,223,12,192,189,251,129,248,249,231,95,160,80,20,148,187,157,88,108,130,58,62,190,112,117,113, + 68,66,98,2,8,15,198,93,244,170,137,255,230,208,225,159,170,58,180,182,182,222,124,236,216,49,187,78,157,58,241,11,10,10,192,113,28,218,251,249, + 97,122,64,0,46,28,57,2,239,214,195,64,180,82,48,102,198,85,61,168,85,74,212,111,214,22,131,135,12,69,124,92,28,122,244,29,8,181,90,89, + 242,132,81,104,48,160,213,234,96,239,232,142,107,215,174,241,49,118,172,193,28,19,86,39,14,137,124,175,110,151,163,122,129,160,167,7,161,211,232,208, + 168,209,18,232,56,59,56,186,125,11,189,254,28,242,50,110,2,0,44,237,58,33,49,62,30,60,190,232,149,81,198,150,3,174,224,227,2,200,170,92, + 116,115,114,114,114,93,92,92,78,5,5,5,13,247,247,247,199,181,107,215,198,3,128,191,191,63,130,130,130,16,29,29,125,42,39,39,39,183,186,246, + 149,134,139,139,75,255,78,157,58,13,107,217,178,37,46,94,188,8,74,233,61,99,246,227,11,133,148,199,227,129,227,56,16,0,89,57,57,120,251,246, + 45,178,50,51,161,215,235,81,160,80,112,190,62,62,10,202,113,22,149,146,149,66,233,10,67,148,83,117,88,188,172,42,156,0,64,41,141,147,74,165, + 241,249,10,133,131,165,141,109,190,137,88,204,230,230,228,230,190,126,21,170,53,242,230,80,140,240,176,176,176,134,201,201,201,136,143,139,3,163,84,128, + 175,209,130,167,81,162,75,219,207,96,10,10,19,112,16,114,122,8,249,66,228,23,86,231,85,26,238,40,22,250,192,191,60,91,132,144,194,112,161,185, + 57,196,82,139,146,117,69,199,83,169,161,18,137,228,200,201,147,39,157,93,93,93,177,98,197,10,184,185,185,213,107,212,168,145,178,125,251,246,166,50, + 153,12,245,235,215,71,219,182,109,113,229,202,21,0,168,240,28,80,74,25,66,72,247,123,247,238,205,126,240,224,193,96,115,115,115,50,109,218,52,65, + 175,94,189,32,145,72,160,84,42,33,151,203,113,244,232,209,76,150,101,155,21,217,106,103,110,110,190,143,16,18,163,80,40,2,202,114,30,220,212,216, + 37,61,155,27,43,115,114,29,208,161,71,205,70,157,123,116,133,151,119,103,116,238,17,15,0,107,109,5,177,195,214,47,110,120,214,222,221,118,223,181, + 171,215,151,250,117,232,188,104,193,4,155,149,107,127,145,87,154,79,71,8,1,199,113,31,244,14,42,141,232,232,104,236,222,189,27,11,23,86,222,130, + 142,199,227,13,157,48,97,130,168,244,178,226,144,113,223,190,125,225,239,239,255,129,208,178,183,183,135,147,147,19,98,99,99,1,160,220,202,200,114,48, + 125,204,152,49,68,165,82,97,220,184,113,216,179,103,15,134,13,27,70,238,220,185,51,29,192,71,231,206,8,155,215,207,155,55,111,246,212,169,83,145, + 157,157,141,203,151,47,163,87,175,94,56,126,252,184,195,229,203,151,87,119,234,212,9,124,62,31,23,47,94,4,195,48,21,246,250,18,137,68,253,251, + 244,233,195,75,72,72,128,72,36,66,139,22,45,144,152,152,8,165,82,137,164,164,36,204,152,49,35,53,43,43,171,163,177,255,71,34,145,40,96,250, + 244,233,56,118,236,24,22,44,88,176,31,192,184,220,220,220,193,15,30,60,56,246,197,23,95,32,41,41,9,103,207,158,197,210,165,75,201,200,145,35, + 177,99,199,14,204,152,49,227,55,0,227,42,168,144,204,79,79,79,183,170,93,187,54,210,210,210,160,80,40,112,246,236,89,199,43,87,174,120,186,186, + 186,90,70,71,71,179,63,252,240,131,56,32,32,0,155,55,111,70,112,112,48,14,30,60,136,206,157,59,51,81,81,81,229,122,201,138,90,54,156,181, + 181,181,189,110,110,110,142,252,252,252,226,202,210,57,11,22,44,152,186,102,77,161,147,61,57,57,25,163,70,141,26,65,8,225,150,47,95,110,38,18, + 137,160,86,171,203,87,37,0,88,150,69,141,26,53,176,251,204,45,68,88,91,34,82,157,129,0,239,218,240,241,241,65,231,206,157,17,120,243,49,242, + 130,94,64,244,248,58,236,219,127,134,250,237,218,21,127,151,12,130,99,57,0,28,60,221,165,8,188,176,23,207,95,70,225,249,203,48,136,37,133,73, + 240,42,149,18,205,26,213,65,235,22,173,144,156,146,132,67,7,247,194,214,222,181,194,235,8,165,20,34,1,11,95,31,39,28,57,248,11,46,94,190, + 129,131,135,142,150,228,188,9,4,66,52,109,214,26,45,90,248,33,42,250,61,246,238,253,25,14,142,238,6,249,62,1,32,132,56,3,232,3,224,82, + 217,138,220,146,208,97,233,159,165,193,113,92,103,63,63,63,190,66,161,128,90,173,70,106,106,42,98,99,99,97,109,99,141,168,228,24,116,52,211,33, + 149,203,67,248,203,87,44,225,11,131,43,51,166,79,135,166,64,135,166,152,50,102,152,193,109,40,40,204,45,237,11,67,55,12,243,14,91,183,26,124, + 114,102,88,253,31,129,215,111,182,26,51,178,191,240,218,205,61,208,107,57,168,244,86,40,80,107,81,160,19,130,103,213,11,200,188,3,190,64,130,207, + 154,212,193,217,51,87,116,148,209,223,48,196,87,22,2,89,67,48,105,255,10,73,115,5,31,70,244,76,44,108,141,14,29,22,131,101,217,227,135,15, + 31,254,178,77,155,54,102,157,58,117,170,13,0,18,137,68,119,248,240,97,37,203,178,199,171,68,134,143,187,193,59,59,59,55,19,137,68,195,250,247, + 239,223,108,244,232,209,120,253,250,53,14,29,58,20,89,167,78,157,10,123,136,241,197,226,44,69,122,186,181,212,211,83,96,99,97,145,124,229,242,229, + 26,93,187,117,35,241,241,241,200,202,202,130,90,173,70,240,203,151,84,200,231,39,18,75,75,94,196,139,23,60,190,88,108,236,205,6,248,176,194,176, + 188,170,195,226,101,85,134,187,179,77,237,165,11,39,122,169,213,234,134,121,121,121,140,64,40,20,186,57,89,199,85,133,67,163,209,92,252,227,143,63, + 190,236,214,181,171,228,109,72,48,244,185,185,208,230,202,33,226,88,216,54,109,2,158,78,3,162,213,195,181,62,133,58,199,28,119,30,191,209,107,52, + 154,74,155,26,22,11,45,94,25,97,32,150,74,33,177,176,132,68,42,45,43,24,42,124,146,35,132,152,245,239,223,191,203,103,159,125,6,74,41,118, + 239,222,13,157,78,39,214,233,116,208,106,181,208,233,116,200,203,203,195,193,131,7,177,115,231,206,7,0,126,171,204,70,74,41,99,102,102,246,5,33, + 196,81,32,16,40,29,28,28,204,143,31,63,94,210,110,162,105,211,166,176,176,176,16,73,165,210,68,0,240,242,242,18,254,250,235,175,214,253,250,245, + 187,91,30,95,221,70,245,230,122,49,54,29,76,76,107,122,90,218,55,134,151,119,103,0,64,183,190,99,224,85,199,3,121,153,33,158,106,85,236,0, + 145,64,110,243,106,107,210,107,211,62,13,71,23,164,223,126,139,242,203,251,203,179,23,60,30,175,220,112,108,173,90,181,48,101,202,148,74,57,8,33, + 60,43,43,43,135,226,60,31,0,200,202,202,66,74,74,10,194,195,195,81,183,110,93,100,103,103,195,213,213,21,90,173,22,45,91,182,132,74,165,194, + 166,77,155,112,255,254,253,7,40,170,140,172,228,61,76,189,189,189,71,53,107,214,12,151,47,95,198,211,167,79,147,2,3,3,93,253,252,252,224,233, + 233,57,154,16,242,29,165,134,123,240,149,195,103,254,249,231,159,79,155,58,117,42,194,194,194,48,113,226,196,172,132,132,132,179,39,78,156,24,183,116, + 233,82,94,143,30,61,144,146,146,130,245,235,215,179,247,239,223,223,0,96,69,69,124,148,210,55,9,9,9,110,106,181,26,217,217,217,96,24,6,74, + 165,18,87,174,92,193,193,131,7,211,138,68,214,59,99,237,107,210,164,73,125,30,143,135,99,199,142,1,192,98,74,41,71,8,57,59,96,192,128,164, + 31,126,248,193,117,225,194,133,24,63,126,60,116,58,29,214,173,91,135,133,11,23,94,66,161,200,170,232,34,250,147,147,147,211,183,19,39,78,172,55, + 107,214,44,4,5,5,57,62,123,246,172,69,112,112,48,220,221,221,145,149,149,37,176,179,179,195,230,205,155,49,115,230,204,211,0,50,31,62,124,56, + 52,58,58,122,13,173,164,97,40,33,100,151,171,171,235,183,148,82,170,84,42,99,23,44,88,176,126,213,170,85,152,57,115,38,94,189,122,133,220,220, + 92,88,88,88,144,121,243,230,141,90,188,120,49,198,142,29,75,11,10,10,118,86,196,249,230,205,27,132,199,196,33,215,195,30,5,38,192,57,181,26, + 83,27,52,64,72,72,8,30,191,136,134,123,106,60,204,242,229,48,187,115,7,158,147,38,97,255,254,253,149,158,87,74,89,40,229,97,96,53,54,104, + 218,168,46,154,54,172,137,192,155,207,1,0,93,6,250,65,89,144,143,253,251,119,227,221,187,183,16,8,133,176,182,117,170,148,147,227,56,104,243,222, + 32,71,151,130,174,157,90,160,87,143,142,248,237,192,113,48,122,29,198,141,249,26,242,156,28,28,56,176,23,81,209,239,33,16,10,97,103,255,247,55, + 66,173,72,139,252,23,160,15,165,116,119,81,8,241,3,239,150,81,217,162,122,125,97,226,123,82,82,18,158,61,123,134,152,152,24,152,153,153,65,197, + 176,220,207,127,220,231,8,17,37,114,148,62,160,76,73,151,226,143,57,88,54,169,84,199,90,43,27,27,27,177,70,163,2,195,232,75,221,85,8,64, + 0,145,0,112,118,241,66,66,124,2,85,171,213,183,43,178,77,164,81,111,62,127,246,228,212,182,237,252,236,123,117,89,142,179,231,190,135,60,47,15, + 106,157,16,5,106,29,148,106,192,218,214,7,45,27,53,65,114,114,22,66,158,222,81,8,52,74,99,18,69,223,110,91,52,198,123,204,148,185,48,173, + 209,14,154,240,179,224,20,105,37,30,45,19,169,13,108,61,124,145,83,160,193,201,27,207,1,192,232,81,47,105,105,105,74,23,23,151,195,83,167,78, + 93,247,252,249,51,55,0,120,254,252,121,98,74,74,202,252,180,180,52,163,43,238,128,15,186,193,19,51,51,179,231,117,234,212,73,238,211,167,143,213, + 128,1,3,96,111,111,143,224,224,96,172,89,179,230,141,78,167,155,123,251,246,237,10,67,61,90,173,54,233,249,185,115,150,29,191,249,198,122,110,191, + 126,235,167,78,157,186,121,197,138,21,66,111,111,111,162,215,233,16,26,26,74,143,28,62,172,223,185,112,225,38,177,185,185,224,201,249,243,66,70,163, + 169,172,71,211,223,14,55,55,183,14,189,123,118,240,221,240,211,86,168,85,10,60,14,186,4,185,60,3,191,236,62,227,235,230,230,214,33,49,49,241, + 142,49,60,44,203,30,223,183,111,223,236,214,205,154,53,243,114,119,71,104,92,12,196,28,11,17,163,7,79,167,1,159,81,195,173,17,192,227,73,145, + 146,154,139,85,199,78,133,25,35,140,235,245,238,143,21,137,185,32,132,96,99,155,134,16,91,72,33,50,151,98,242,239,55,75,132,194,197,21,11,33, + 150,74,81,187,117,229,13,225,41,165,74,11,11,139,103,161,161,161,45,27,54,108,136,217,179,103,35,54,54,22,28,199,33,45,45,77,157,146,146,146, + 148,145,145,17,139,194,254,63,123,42,185,137,149,128,199,227,185,222,185,115,167,36,220,112,227,198,13,184,184,184,192,202,202,10,121,121,121,152,48,97, + 130,245,247,223,23,246,95,124,246,236,25,74,11,148,178,8,125,30,190,33,39,159,202,169,226,197,128,108,230,69,163,206,61,18,208,173,239,104,92,191, + 248,27,110,6,254,1,91,65,108,12,204,243,175,100,198,100,230,37,22,120,239,242,109,62,142,159,82,16,184,107,250,23,54,124,103,103,238,228,130,157, + 185,57,21,217,234,237,237,13,153,76,86,146,163,37,16,8,48,118,236,88,52,105,210,4,1,1,1,133,33,216,202,207,35,103,105,105,153,161,86,171, + 101,38,38,38,72,77,77,197,251,247,239,17,21,21,85,210,58,128,227,56,253,156,57,115,132,211,166,77,195,207,63,255,140,219,183,111,63,0,176,156, + 82,106,236,195,218,215,67,134,12,177,208,106,181,56,122,244,40,3,160,239,201,147,39,159,181,108,217,82,208,179,103,79,139,29,59,118,124,13,96,143, + 145,92,0,96,110,105,105,41,210,233,116,216,177,99,7,18,18,18,58,80,74,195,9,33,187,134,12,25,178,179,97,195,134,117,194,194,194,222,42,20, + 138,201,148,210,144,202,200,210,210,210,198,180,104,209,226,36,199,113,53,186,118,237,106,254,211,79,63,89,70,68,68,192,205,205,13,28,199,133,209,42, + 142,176,122,251,246,109,120,74,74,138,111,199,142,29,113,229,202,149,181,132,144,213,0,214,77,154,52,201,53,46,46,14,205,154,53,131,173,173,45,34, + 34,34,242,83,82,82,118,2,248,174,2,79,22,0,128,82,26,13,96,62,33,164,241,174,93,187,134,217,218,218,126,22,28,28,140,123,247,238,97,195, + 134,13,248,254,251,239,209,190,125,123,204,158,61,59,19,192,176,162,144,182,81,125,243,138,61,91,0,208,162,69,139,228,53,107,214,96,220,184,113,244, + 215,95,127,221,114,248,240,225,128,175,191,254,26,64,225,61,112,212,168,81,244,208,161,67,163,42,42,4,224,243,249,136,136,136,128,169,38,21,161,145, + 73,144,180,108,137,207,108,109,145,26,30,142,144,144,16,56,217,218,32,242,250,19,52,229,17,8,235,213,67,94,94,30,242,242,42,117,226,234,117,58, + 45,44,109,189,160,200,137,71,70,66,16,204,44,156,208,163,115,19,40,85,90,92,56,127,26,33,161,47,193,227,241,32,115,114,135,181,141,61,34,35, + 223,2,64,69,213,198,122,157,78,7,11,155,154,80,228,38,64,155,254,28,166,82,71,140,254,102,0,148,42,29,206,156,61,141,176,176,16,240,249,124, + 56,57,187,195,202,186,144,147,208,10,57,255,231,81,156,167,85,252,179,146,170,195,127,129,207,231,223,186,122,245,234,160,214,173,91,11,222,189,123,135, + 119,239,10,31,110,228,114,57,67,192,158,74,11,57,247,149,161,125,9,33,93,139,171,51,74,207,46,148,90,88,36,69,188,9,151,201,179,211,240,242, + 197,125,188,139,12,69,76,84,56,116,58,53,248,60,30,120,124,30,106,122,53,192,253,7,65,90,53,195,4,25,226,4,128,236,236,247,249,82,153,207, + 208,149,43,190,187,56,115,238,50,211,193,131,118,34,36,226,53,20,140,19,40,5,156,236,204,209,180,214,60,36,37,103,224,216,111,59,148,156,78,55, + 188,116,15,173,242,56,1,64,150,137,250,59,119,255,54,118,207,193,35,203,230,78,155,32,251,194,127,56,196,217,175,161,79,126,14,175,150,189,64,36, + 214,184,124,237,38,238,60,123,157,198,177,116,153,44,11,191,86,198,89,26,57,57,57,15,83,83,83,220,74,117,129,119,147,72,76,42,172,142,43,203, + 73,202,116,156,231,243,121,205,87,174,92,169,151,201,100,186,176,176,48,252,252,243,207,220,243,231,207,175,241,120,188,109,201,201,201,234,202,56,29,244, + 250,151,71,22,44,168,223,202,223,159,126,53,109,154,18,18,201,244,245,27,55,46,200,144,203,93,40,199,193,193,214,54,113,253,194,133,107,6,13,25, + 34,127,117,255,190,105,208,185,115,166,98,134,121,94,153,157,127,5,42,226,76,76,76,188,227,93,219,3,251,247,252,4,157,78,131,148,164,56,0,64, + 102,86,46,42,18,89,101,57,139,170,174,252,23,127,255,253,163,197,51,3,156,62,239,210,21,241,47,95,64,151,157,9,62,195,64,72,4,80,166,155, + 35,45,45,31,243,15,157,72,87,40,149,254,101,111,18,134,236,44,246,88,73,44,45,32,50,151,66,44,181,248,192,139,101,98,105,9,177,185,20,2, + 177,184,60,47,205,71,156,10,133,98,224,160,65,131,66,158,60,121,98,51,110,220,56,180,109,219,246,133,74,165,234,68,41,53,106,204,84,121,156,28, + 199,37,125,254,249,231,60,66,136,116,248,240,225,146,140,140,140,146,206,234,10,133,2,87,174,92,65,221,186,133,85,253,175,94,189,66,131,6,13,12, + 114,142,155,23,154,4,96,197,172,193,110,235,31,189,76,153,14,96,173,87,29,119,220,12,252,3,247,110,6,45,248,172,33,183,181,247,240,150,63,152, + 117,26,50,215,183,249,56,190,212,210,25,7,206,156,230,135,63,223,187,74,169,12,173,13,96,142,33,59,9,33,160,148,126,212,202,161,123,247,238,248, + 230,155,111,42,109,248,90,134,243,196,158,61,123,38,77,156,56,81,148,146,146,130,55,111,222,160,160,160,0,38,38,38,8,12,12,100,0,236,56,124, + 248,112,224,225,195,135,123,162,48,36,80,174,192,50,244,185,155,155,155,79,237,209,163,7,222,188,121,131,167,79,159,158,166,148,134,16,66,78,191,123, + 247,110,104,251,246,237,241,219,111,191,77,133,1,161,101,136,147,227,184,210,61,147,178,1,128,82,250,18,192,103,21,30,120,57,156,69,33,142,118,0, + 96,103,103,151,32,147,201,44,95,190,124,9,15,15,15,232,116,58,163,202,169,75,115,230,230,230,254,180,109,219,182,95,199,140,25,131,31,126,248,97, + 248,137,19,39,134,247,238,221,27,125,250,244,193,190,125,251,16,18,18,178,150,26,49,86,172,188,99,47,18,142,33,245,235,215,159,226,238,238,142,13, + 27,54,32,52,52,116,205,138,21,43,22,134,132,132,160,110,221,186,146,215,175,95,27,124,152,172,236,186,100,105,105,105,169,215,235,113,238,220,185,199, + 148,210,153,132,16,199,205,155,55,15,51,55,55,135,92,46,87,133,133,133,125,77,41,61,111,136,147,82,74,93,92,92,16,24,24,136,128,128,0,180, + 77,74,130,125,141,26,232,215,164,9,58,206,154,5,134,97,176,106,213,42,52,241,174,13,169,74,133,118,195,135,99,252,132,9,168,83,167,14,158,60, + 121,66,203,227,4,0,74,200,162,113,227,167,239,26,63,238,107,147,22,205,155,66,153,151,8,149,34,13,202,252,84,108,219,115,13,132,240,224,224,224, + 12,71,39,55,196,197,197,227,193,165,203,218,2,165,106,179,88,207,173,173,152,115,90,33,103,179,66,78,101,65,58,84,138,244,18,78,71,71,151,34, + 206,56,220,15,186,172,86,21,20,252,164,165,228,71,67,156,255,235,248,83,57,90,114,185,124,198,132,9,19,58,205,159,63,223,142,97,24,190,173,173, + 45,226,226,226,152,83,167,78,101,43,20,138,74,93,231,229,190,169,80,24,226,237,83,183,211,23,95,124,193,244,239,223,79,52,98,76,79,129,131,163, + 35,114,115,178,16,249,38,24,17,175,159,195,187,110,19,44,93,177,9,176,182,174,116,144,164,34,45,242,150,84,230,211,119,249,226,57,199,219,117,232, + 110,89,183,65,19,81,211,218,86,208,233,25,36,38,38,226,252,185,151,186,176,103,247,242,56,70,59,180,32,195,184,17,60,183,11,159,138,126,105,36, + 35,135,87,175,223,54,123,199,47,251,231,206,159,62,206,188,189,95,55,132,254,241,27,78,95,60,94,160,214,104,215,139,248,216,24,154,73,171,228,133, + 2,0,181,90,173,43,91,16,165,86,171,203,107,98,90,37,236,219,183,15,105,105,105,218,216,216,216,171,12,195,156,48,52,236,185,60,108,165,84,235, + 79,200,31,139,253,252,122,46,14,12,52,25,53,111,158,118,248,136,17,115,160,209,232,32,22,83,129,185,57,15,18,137,240,213,253,251,166,91,38,77, + 178,37,90,237,245,223,42,104,27,80,14,254,242,170,67,160,196,163,133,81,227,102,66,85,202,163,245,240,105,36,170,226,209,2,0,74,105,60,33,228, + 179,233,139,22,159,25,218,163,139,111,195,26,53,37,14,158,158,48,119,114,66,86,70,6,238,63,125,163,95,113,252,76,88,145,200,50,170,175,12,199, + 113,37,30,150,46,51,230,131,240,249,64,145,24,40,174,28,242,108,217,22,68,32,0,75,57,104,52,154,74,147,180,40,165,137,132,144,129,195,135,15, + 191,113,241,226,69,94,143,30,61,154,158,61,123,182,106,49,236,50,80,42,149,159,1,128,169,169,105,140,181,181,181,235,152,49,99,160,215,235,161,84, + 42,145,155,155,139,196,196,196,156,49,99,198,232,138,182,17,15,26,52,200,178,98,70,224,167,147,137,234,89,131,221,182,218,10,98,135,229,101,134,120, + 218,10,98,99,62,107,200,109,253,233,100,162,122,249,76,235,149,242,216,59,145,137,5,129,187,14,156,57,205,31,57,96,32,235,38,125,187,192,196,145, + 158,234,92,110,10,243,191,64,8,249,168,57,233,168,81,163,170,124,204,249,249,249,11,151,44,89,210,71,46,151,187,245,236,217,83,228,235,235,139,71, + 143,30,225,226,197,139,204,195,135,15,19,10,10,10,190,163,148,170,1,92,171,50,57,0,31,31,31,79,129,64,80,28,74,219,94,180,120,251,217,179, + 103,135,142,27,55,14,53,107,214,172,79,8,145,208,42,252,31,81,74,75,162,12,127,37,8,33,81,91,182,108,113,117,114,114,34,87,175,94,213,243, + 249,252,74,219,119,148,99,219,62,66,72,107,189,94,63,254,219,111,191,69,135,14,29,192,48,12,14,29,58,132,189,123,247,26,37,178,42,67,100,100, + 228,243,132,132,132,207,231,204,153,131,13,27,54,44,156,51,103,14,18,18,18,16,25,25,89,105,234,74,69,200,203,203,83,197,199,199,155,181,105,211, + 166,133,135,135,71,216,168,81,163,26,140,27,55,14,107,215,174,165,119,238,220,25,68,41,189,82,209,254,58,157,46,190,78,157,58,178,206,157,59,99, + 223,190,125,112,117,117,133,60,52,20,147,118,239,198,160,65,131,208,161,67,7,156,63,127,30,166,166,166,112,112,112,192,196,201,147,97,103,103,7,31, + 31,31,4,5,5,25,188,150,188,121,155,117,176,81,45,89,224,138,149,63,125,95,187,150,231,196,177,163,135,240,125,188,27,160,32,55,17,118,246,50, + 184,185,123,33,35,61,19,87,175,94,97,51,51,115,246,177,60,178,252,237,219,172,143,59,108,87,129,211,213,205,11,233,233,233,184,124,249,50,155,35, + 207,219,13,61,111,197,235,88,185,209,247,146,255,69,144,162,190,89,165,114,181,74,196,23,49,38,241,182,168,242,112,75,97,123,135,66,47,151,92,46, + 159,65,41,253,184,29,252,135,251,149,40,94,82,182,137,218,224,193,34,92,186,212,24,122,253,103,214,231,203,144,98,0,0,32,0,73,68,65,84,22, + 22,93,40,199,181,108,210,164,137,116,200,144,33,156,159,95,91,177,165,165,37,169,95,191,97,94,110,78,142,45,0,80,128,45,203,89,22,197,67,165, + 5,124,97,87,150,213,53,42,180,181,242,161,210,198,40,243,90,50,226,32,224,176,148,71,200,104,142,210,223,24,30,150,71,165,81,131,163,129,140,225, + 44,21,246,43,30,57,83,225,69,200,192,211,125,73,232,144,199,227,31,116,118,118,254,46,49,49,49,157,82,202,86,196,85,17,103,241,8,158,190,1, + 1,250,230,221,187,51,182,238,238,28,165,148,141,121,254,156,60,60,127,94,248,240,252,121,19,189,70,115,235,36,165,81,198,112,186,184,184,172,185,112, + 225,130,209,185,87,253,250,245,123,93,156,183,85,145,157,165,81,187,150,91,96,45,79,215,238,181,60,11,195,211,81,49,201,136,138,73,186,246,62,42, + 177,135,161,125,42,226,36,228,95,67,165,73,81,11,7,106,196,80,233,178,156,246,246,246,207,4,2,129,91,133,7,92,6,44,203,38,103,100,100,148, + 140,179,170,196,206,175,60,61,61,215,198,197,197,157,97,89,118,166,177,239,81,9,167,183,169,169,233,101,30,143,247,65,133,11,199,113,73,197,98,140, + 16,98,103,102,102,246,65,50,124,69,156,235,23,55,252,190,77,251,246,3,30,222,187,119,118,238,202,176,15,242,134,166,15,176,29,243,213,148,25,63, + 30,221,177,101,222,214,179,217,31,84,158,149,235,109,150,201,110,3,240,46,90,95,225,113,22,157,203,15,202,209,203,241,12,155,88,88,88,172,1,48, + 148,227,56,123,66,72,38,165,244,88,41,145,85,41,12,29,59,159,207,95,91,175,94,189,25,17,17,17,71,25,134,25,91,106,251,13,181,107,215,158, + 18,27,27,187,93,175,215,207,53,150,147,16,98,217,190,125,123,249,150,45,91,120,51,103,206,196,157,59,119,108,41,165,114,99,108,172,200,206,162,117, + 78,54,54,54,191,178,44,235,75,41,189,144,159,159,191,144,82,106,48,241,219,16,39,41,252,80,134,186,186,186,206,245,246,246,246,126,251,246,109,72, + 82,82,210,250,178,222,160,63,97,103,159,47,191,252,242,194,230,205,155,137,187,187,59,18,18,18,16,16,16,64,207,157,59,215,143,82,122,169,58,156, + 69,235,23,77,154,52,105,229,136,17,35,0,20,10,218,53,107,214,208,75,151,46,141,162,148,30,172,140,147,16,210,72,42,149,254,34,20,10,61,0, + 16,142,227,8,203,178,124,62,159,207,208,82,109,24,138,214,241,9,33,44,165,148,99,24,38,94,163,209,76,160,148,134,86,102,103,253,90,14,181,40, + 159,93,213,164,161,239,160,111,134,15,32,15,159,190,197,163,135,65,72,76,78,62,203,241,120,223,69,70,102,150,27,234,173,10,103,208,211,72,60,10, + 10,162,41,201,41,39,65,249,139,95,71,101,24,117,157,255,95,7,41,213,160,180,236,223,70,9,173,63,241,198,134,133,86,121,112,113,113,65,86,86, + 107,19,129,192,79,34,145,116,226,241,249,183,178,51,50,2,0,227,132,214,95,97,103,101,168,93,155,136,13,141,36,168,14,103,217,68,246,234,112,86, + 133,195,88,78,67,67,165,57,141,38,217,142,97,158,109,165,134,207,65,89,78,55,55,183,241,28,199,85,216,74,187,52,120,60,94,76,98,98,226,7, + 225,20,99,207,167,143,143,15,125,251,246,45,40,165,149,38,83,254,187,191,75,255,75,156,7,55,53,118,169,219,168,222,220,208,231,225,27,138,194,138, + 37,88,62,221,214,194,175,115,199,37,247,111,222,254,97,233,214,236,15,30,134,254,105,59,9,33,60,90,213,234,150,106,114,18,82,216,36,180,170,156, + 34,145,104,87,171,86,173,198,63,122,244,232,87,134,97,12,246,238,169,170,157,213,197,191,131,147,16,210,135,207,231,207,241,241,241,105,26,25,25,25, + 204,178,236,134,138,68,150,177,118,18,66,190,243,244,244,156,44,18,137,36,10,133,66,158,156,156,188,132,82,122,226,207,112,86,21,198,112,214,247,182, + 107,65,105,73,211,237,85,225,239,178,12,182,64,170,50,39,229,88,142,242,87,70,68,85,60,228,250,147,208,250,16,165,61,89,69,40,169,62,172,246, + 212,213,170,162,88,40,85,136,228,228,4,0,9,0,78,254,237,6,85,19,198,136,172,170,160,58,226,232,239,224,40,139,34,33,21,84,233,134,70,160, + 172,104,250,59,17,25,25,249,223,88,173,242,255,30,223,204,12,73,6,16,208,162,211,199,235,138,196,213,220,78,253,255,105,171,62,70,117,68,86,117, + 57,43,18,89,21,65,167,211,77,36,132,204,162,85,168,86,252,255,134,34,81,85,161,176,170,38,239,106,224,255,216,59,239,176,40,174,238,143,127,239, + 204,246,93,144,38,32,168,96,69,138,29,27,86,176,43,26,53,106,162,70,212,152,104,172,24,91,80,147,104,76,20,162,137,189,39,49,138,111,52,118, + 163,24,163,130,193,222,11,22,4,11,2,2,34,210,219,246,185,191,63,150,197,5,118,151,69,125,127,111,219,207,243,204,179,59,237,59,103,102,182,156, + 57,247,220,115,177,252,93,235,190,107,238,39,102,95,7,80,77,3,251,191,94,243,127,137,50,167,202,104,158,86,205,198,251,176,98,197,138,21,43,255, + 114,254,151,157,44,43,86,254,211,32,0,122,27,91,81,147,144,32,33,196,168,134,57,44,8,225,90,53,173,154,86,77,171,166,85,211,170,105,213,252, + 47,211,252,95,227,255,45,71,203,170,105,213,180,106,90,53,173,154,86,77,171,166,85,243,191,17,82,117,172,195,255,255,28,45,43,255,187,172,127,159, + 212,5,128,25,7,169,69,197,77,107,186,189,21,43,86,172,88,177,242,175,132,86,170,163,69,12,42,196,255,203,29,45,66,136,59,116,133,246,154,0, + 120,8,224,92,77,186,43,27,209,171,13,224,3,66,200,72,0,160,148,238,3,176,151,86,83,138,66,143,68,34,201,148,203,229,46,0,32,22,139,95, + 202,229,114,195,177,12,136,193,4,0,84,63,153,75,108,109,212,168,81,166,66,161,112,177,224,240,249,148,210,59,12,195,196,217,216,216,196,60,124,248, + 176,218,225,93,12,233,217,179,231,120,150,101,151,1,128,86,171,93,20,19,19,179,163,38,251,215,4,66,72,199,250,238,117,126,85,169,85,154,204,172, + 156,175,76,117,221,222,52,152,132,243,8,230,149,189,95,57,245,168,249,18,22,53,221,222,140,125,237,248,124,254,116,87,87,215,1,207,159,63,191,14, + 96,62,165,180,218,170,198,30,30,30,33,60,30,239,35,173,86,219,152,101,217,39,26,141,230,31,41,41,41,70,187,118,91,177,98,197,138,21,43,213, + 81,35,71,203,167,54,169,67,129,81,32,232,3,138,83,4,216,19,255,138,190,176,116,255,96,31,162,86,107,116,199,20,48,208,254,249,152,217,22,28, + 28,92,111,198,140,25,232,220,185,51,46,95,190,28,176,125,251,246,143,89,150,189,195,113,220,25,0,151,169,153,50,2,122,8,33,50,0,67,0,140, + 25,48,96,64,239,101,203,150,177,205,155,55,71,105,105,41,254,254,251,239,174,43,87,174,92,67,8,57,13,224,55,0,71,168,153,218,48,114,185,220, + 69,239,51,17,66,92,134,15,31,126,205,160,86,15,33,132,128,97,24,80,74,47,1,184,196,113,220,165,125,251,246,165,250,16,210,113,114,67,193,254, + 208,167,202,42,53,147,20,10,133,203,225,21,203,193,19,137,160,40,44,64,192,132,215,17,198,83,95,207,3,225,52,96,65,115,131,190,91,115,7,64, + 92,122,122,250,157,30,61,122,36,89,120,89,203,97,89,118,217,137,19,39,220,40,165,232,215,175,223,50,0,59,106,170,97,9,132,16,81,167,118,173, + 207,28,61,176,91,92,148,147,137,254,67,62,252,7,33,100,60,165,244,128,225,118,155,6,18,87,194,195,188,41,203,127,99,1,96,211,194,49,243,215, + 244,35,235,102,253,69,95,16,66,130,128,242,33,155,86,80,74,207,108,26,72,92,193,226,139,41,203,127,35,0,176,121,225,152,121,155,6,146,181,83, + 143,215,172,87,37,33,100,234,248,241,227,215,45,91,182,140,117,115,115,67,90,90,90,127,63,63,191,102,132,16,63,115,73,196,13,27,54,252,61,176, + 207,144,198,195,63,24,45,169,237,228,128,180,140,44,187,189,187,183,79,110,216,176,225,128,164,164,164,15,107,118,149,172,88,177,98,197,202,255,10,198, + 154,14,245,111,170,117,180,252,221,137,164,88,133,161,60,150,132,116,235,216,188,215,232,129,221,24,63,223,166,184,127,239,65,223,35,49,87,86,250,185, + 50,209,26,45,141,148,9,112,248,70,186,249,158,48,106,13,120,39,15,255,6,0,152,250,241,24,246,234,213,171,77,253,253,253,203,11,2,246,234,213, + 11,189,122,245,34,155,54,109,106,125,242,228,201,214,63,255,252,179,138,16,242,171,185,250,40,132,144,233,77,154,52,89,185,110,221,58,81,143,30,61, + 32,18,137,202,215,217,216,216,96,240,224,193,24,60,120,48,155,158,158,222,239,232,209,163,253,86,172,88,161,36,132,204,165,148,110,48,165,105,200,215, + 95,127,237,111,100,241,9,66,200,99,141,70,115,179,85,171,86,169,222,132,52,253,108,96,231,83,83,187,120,201,76,233,240,132,66,236,28,175,251,175, + 54,116,180,146,98,254,132,77,45,219,108,169,173,237,29,0,113,0,238,80,74,227,30,63,126,252,192,151,144,214,157,28,152,95,127,206,209,182,178,196, + 86,64,55,214,86,106,106,42,236,236,236,36,129,129,129,25,132,144,37,103,206,156,49,57,52,192,27,210,113,201,188,169,130,220,103,119,240,34,254,18, + 102,143,236,42,157,181,254,143,111,1,28,48,183,19,33,12,179,226,34,23,54,75,55,24,239,87,217,217,217,61,0,192,201,201,73,8,224,204,234,43, + 24,248,121,151,106,42,80,154,213,39,2,150,101,55,238,220,185,243,147,144,144,16,221,208,17,231,207,195,198,198,6,75,151,46,109,48,103,206,156,112, + 152,24,8,216,195,195,35,36,176,207,208,70,107,127,248,214,183,48,39,95,177,117,227,222,107,117,91,120,179,159,77,159,99,187,65,173,172,227,225,225, + 17,98,141,108,89,177,98,197,138,21,99,84,110,58,52,196,172,163,229,237,76,118,116,107,235,245,193,232,224,174,162,150,45,154,67,32,122,61,136,172, + 127,187,118,240,111,215,142,9,43,42,236,115,245,218,141,62,251,79,94,86,120,59,147,189,15,179,232,120,75,13,211,15,74,187,108,136,107,207,226,188, + 151,98,0,144,217,187,200,23,30,126,17,211,165,75,23,212,171,87,79,16,29,29,61,17,230,235,165,44,124,248,240,161,136,101,205,215,67,117,119,119, + 199,136,17,35,224,237,237,45,12,12,12,92,136,215,195,97,84,64,44,22,191,36,132,184,0,128,163,163,163,118,201,146,37,183,105,25,0,192,113,220, + 37,150,101,47,113,28,119,229,200,145,35,207,155,19,226,50,200,223,251,220,212,177,35,164,116,255,26,147,78,130,220,196,192,161,82,27,89,150,68,38, + 187,35,146,138,227,0,220,1,16,87,183,110,221,7,205,9,169,215,201,187,225,201,77,159,143,177,53,123,98,101,248,251,251,55,11,10,10,18,107,181, + 90,20,23,23,99,243,230,205,118,18,137,196,110,192,128,1,139,97,80,219,195,143,144,150,195,221,217,73,75,210,52,211,44,209,53,132,16,98,223,45, + 160,221,179,245,17,139,107,181,235,212,13,137,103,118,33,39,167,16,249,121,69,224,56,174,202,8,195,83,143,211,204,77,131,201,202,77,11,198,124,65, + 24,134,180,30,54,31,239,213,201,159,73,8,185,7,128,47,20,150,23,30,231,17,66,220,91,180,104,177,178,105,223,110,216,188,104,44,40,199,81,0, + 43,45,141,102,17,66,92,108,109,109,143,156,60,121,178,99,251,246,237,113,249,242,101,60,125,250,20,83,167,78,85,78,155,54,77,48,110,220,56,50, + 123,246,236,25,132,144,253,148,210,11,149,247,231,241,120,31,13,121,255,67,97,81,94,129,92,165,84,41,157,156,236,168,188,88,94,152,157,91,80,250, + 193,168,79,84,113,55,46,127,4,160,138,163,245,54,215,211,138,21,43,86,172,88,76,123,0,206,0,178,0,92,171,52,143,178,247,48,50,255,10,186, + 116,31,39,3,173,87,208,165,253,56,67,87,227,243,42,128,55,78,89,2,140,70,180,94,59,95,148,82,28,59,118,140,26,190,234,167,102,181,117,185, + 71,234,236,199,84,145,240,39,45,185,246,83,149,169,244,222,1,154,113,117,47,189,242,219,215,180,108,123,152,154,6,122,67,61,166,21,232,148,246,160, + 161,129,246,242,171,87,175,70,115,28,119,44,172,27,40,189,255,27,165,247,127,163,159,7,128,238,223,191,255,68,120,120,248,177,200,200,200,99,0,142, + 153,211,4,144,89,120,237,34,189,226,2,106,138,135,15,31,210,45,91,182,208,5,11,22,208,95,126,249,133,2,200,52,167,217,175,95,191,216,187,119, + 239,210,113,227,198,221,6,32,53,181,157,47,32,251,168,65,157,120,197,239,107,84,202,144,150,52,183,187,216,232,249,187,185,185,85,176,39,194,171,14, + 221,208,193,139,238,232,227,255,130,82,122,130,82,26,65,41,253,144,82,234,77,41,69,91,160,214,16,55,167,71,242,189,107,75,149,147,58,153,189,166, + 148,82,180,109,219,182,217,220,185,115,115,148,74,37,77,74,74,162,91,183,110,165,167,78,157,162,135,15,31,166,93,187,118,77,55,176,215,245,99,111, + 207,76,229,207,223,40,170,211,52,54,241,89,118,195,181,83,251,233,163,115,251,232,213,61,225,244,31,95,142,166,51,134,116,84,213,146,136,228,0,122, + 154,218,111,90,23,52,245,110,224,156,144,156,156,76,85,42,21,157,48,97,2,237,215,175,31,237,219,183,47,237,221,187,55,237,213,171,23,237,217,179, + 39,141,137,137,161,233,233,233,180,119,55,255,226,65,190,104,103,169,93,0,90,120,122,122,190,72,74,74,162,42,149,138,70,71,71,211,93,187,118,209, + 232,232,104,26,22,22,70,1,236,152,50,101,74,105,110,110,46,237,215,175,223,115,148,245,182,53,156,60,61,61,31,220,77,72,77,93,181,124,219,153, + 29,27,118,159,57,120,224,228,153,35,167,174,71,29,57,121,125,223,149,219,143,143,120,122,122,62,48,114,255,223,234,122,90,39,235,100,157,172,147,117, + 122,61,153,242,69,202,166,96,157,203,66,131,41,165,189,43,205,7,227,117,190,116,133,249,176,176,176,5,134,243,250,109,194,194,194,22,0,160,1,1, + 1,187,41,165,77,223,213,57,0,152,84,121,153,69,57,90,154,231,87,33,240,26,0,190,86,13,245,171,135,224,242,146,1,89,29,148,18,27,100,103, + 36,35,254,220,1,157,249,213,16,21,79,249,132,144,232,7,15,30,32,62,62,30,169,169,169,144,74,165,85,182,59,127,254,60,36,18,9,220,220,220, + 44,49,15,84,89,113,60,214,59,254,158,176,9,232,129,87,163,63,67,116,116,52,94,190,124,9,129,64,0,161,80,8,141,198,228,224,238,229,48,12, + 67,128,242,202,205,70,171,58,7,18,194,171,231,104,115,116,211,226,208,134,204,165,99,252,210,148,71,72,151,107,97,111,129,189,18,27,25,164,50,105, + 134,68,34,45,111,46,44,123,77,244,39,132,47,179,17,31,253,245,187,217,117,216,155,209,226,210,71,119,32,48,162,209,167,79,159,201,0,22,83,74, + 243,2,3,3,93,151,45,91,230,144,150,150,134,251,247,239,99,239,222,189,89,26,221,137,18,74,233,55,0,16,64,136,216,195,217,254,175,13,95,135, + 218,226,204,239,66,76,252,218,2,75,43,98,231,59,56,106,248,184,41,211,214,133,14,70,113,97,41,126,59,117,19,39,110,60,126,15,192,121,106,38, + 239,109,195,121,250,136,16,210,235,253,247,223,191,117,246,236,217,218,63,255,252,51,52,26,141,209,233,231,159,127,198,233,115,55,102,82,74,175,91,98, + 19,33,196,189,97,195,134,167,175,92,185,226,44,149,74,113,234,212,41,228,229,229,149,71,178,198,143,31,79,242,242,242,70,109,222,188,121,248,179,103, + 207,126,56,119,238,92,54,116,195,65,85,248,32,176,44,251,88,163,81,249,184,251,122,177,35,7,119,235,86,148,125,7,54,78,173,112,249,214,227,99, + 249,121,57,165,44,203,62,54,220,254,93,92,79,43,86,172,88,177,82,51,8,33,199,40,165,131,8,33,199,42,47,171,252,94,191,93,120,120,120,249, + 188,126,159,136,136,136,229,6,243,37,239,200,182,10,227,29,234,209,59,90,129,81,81,81,20,64,160,177,157,21,247,15,66,17,127,4,2,207,46,16, + 122,191,7,214,179,43,82,238,156,193,237,63,87,227,249,189,243,160,156,22,110,205,58,88,106,139,220,199,199,7,114,185,46,53,75,161,80,64,32,115, + 144,207,158,52,70,12,0,28,79,92,238,53,149,121,135,213,98,219,37,8,29,50,41,174,186,234,90,238,58,100,234,246,251,110,194,4,8,4,2,8, + 4,130,242,193,103,45,113,180,72,217,198,28,199,1,70,92,72,66,8,105,39,226,255,182,103,241,244,14,162,103,113,66,197,221,75,72,87,112,244,104, + 166,54,202,146,145,147,165,50,105,154,68,42,141,147,216,200,12,29,173,199,0,64,249,252,200,93,223,76,111,37,203,124,34,147,95,139,70,134,156,83, + 213,50,46,243,205,159,127,254,233,194,227,241,234,104,181,90,164,164,164,224,222,189,123,88,187,118,109,102,97,97,97,224,141,27,55,18,12,236,101,218, + 75,132,123,35,151,134,54,226,221,137,21,43,30,223,53,234,188,153,195,185,229,176,126,239,5,182,142,154,60,118,17,134,14,236,139,113,129,126,52,41, + 61,71,14,224,20,181,96,0,107,74,105,26,33,164,79,247,238,221,255,209,166,77,27,95,74,41,90,182,108,137,81,163,70,33,50,50,18,183,110,221, + 66,97,97,161,234,228,201,147,107,40,165,219,171,211,43,59,47,169,131,131,195,137,152,152,24,103,169,84,138,147,39,79,162,180,180,20,110,110,110,152, + 54,109,154,48,34,34,98,103,65,65,193,200,240,240,112,113,82,82,210,134,191,254,250,171,1,0,134,82,90,229,67,160,84,42,183,253,22,185,99,221, + 180,233,51,234,198,92,190,31,173,40,46,180,171,239,145,90,88,219,209,198,102,245,138,111,234,43,149,202,201,6,199,53,184,158,127,191,209,245,180,98, + 197,138,21,43,85,48,235,139,0,175,157,167,202,206,150,37,24,56,97,165,97,97,97,11,9,33,199,194,194,194,22,134,135,135,151,2,72,127,27,195, + 245,77,135,134,77,136,122,167,139,7,0,193,193,193,177,81,81,81,8,14,14,142,53,169,194,105,161,74,58,11,85,210,89,72,2,102,226,143,240,209, + 21,86,191,205,16,97,131,151,158,138,81,40,20,188,29,59,118,148,231,109,1,128,86,91,253,240,136,53,197,18,71,11,101,67,19,149,57,90,85,140, + 104,40,178,137,221,246,249,200,78,78,218,18,190,242,252,81,164,41,56,205,15,143,84,37,215,242,232,138,133,38,4,15,207,154,140,212,115,167,33,181, + 177,73,253,228,108,156,97,20,235,14,128,167,0,208,80,92,43,122,239,236,209,93,235,8,32,80,70,237,67,186,130,83,108,121,166,222,190,214,136,158, + 62,36,249,244,233,83,148,148,148,224,226,197,139,56,112,224,64,86,101,39,171,204,222,191,127,153,255,81,199,90,133,47,4,202,107,167,145,174,224,20, + 205,44,184,8,206,173,134,117,17,48,228,36,97,88,201,192,110,126,152,245,233,48,172,254,229,15,141,210,165,219,160,117,71,142,143,44,82,168,22,89, + 226,100,25,216,124,7,128,31,33,68,4,32,104,212,168,81,199,135,15,31,142,216,216,88,28,61,122,212,11,64,6,0,16,66,150,2,112,133,174,55, + 162,169,145,227,25,129,64,176,231,244,233,211,205,221,221,221,113,250,244,105,148,150,150,98,202,148,41,202,233,211,167,11,198,143,31,79,242,243,243,203, + 35,89,23,47,94,204,134,9,39,11,0,158,63,127,254,103,131,6,13,186,116,239,222,125,104,35,47,239,90,79,10,11,94,218,72,197,146,115,177,103, + 4,55,174,93,218,240,252,249,243,242,65,91,43,94,207,104,139,175,167,21,43,86,172,88,49,141,69,190,8,42,70,166,106,130,193,126,252,240,240,240, + 123,225,225,225,21,34,94,111,131,177,72,150,158,55,170,163,165,205,79,169,122,16,206,114,71,203,88,164,202,193,193,65,35,145,72,42,56,90,156,133, + 154,57,135,118,227,201,212,49,229,145,44,125,100,11,253,199,87,217,182,38,17,45,170,75,154,174,96,132,204,213,123,244,158,177,125,186,248,53,170,203, + 168,247,174,197,243,18,141,124,241,67,149,60,190,144,190,119,223,72,146,117,185,166,70,13,177,76,146,44,177,145,85,118,178,158,1,128,77,157,102,195, + 119,142,14,10,108,237,221,132,209,252,190,10,105,37,234,162,176,7,42,213,147,98,122,208,152,30,165,116,113,223,190,125,23,59,57,57,137,215,173,91, + 103,231,233,233,9,141,70,163,172,236,100,201,92,189,71,255,62,190,127,151,102,117,28,24,245,254,245,72,45,213,150,172,125,162,222,185,165,154,107,224, + 220,106,88,151,218,118,54,127,109,89,62,85,34,21,241,33,151,203,17,177,105,63,78,94,184,59,40,43,238,208,95,0,254,170,70,194,28,159,12,26, + 52,104,245,210,165,75,161,86,171,49,113,226,68,60,126,252,248,228,195,135,15,215,122,120,120,204,157,63,127,190,123,157,58,117,240,193,7,31,8,0, + 140,55,161,241,253,111,191,253,54,168,117,235,214,136,141,141,69,94,94,30,220,220,220,48,125,250,116,97,120,120,248,206,130,130,130,145,203,151,47,23, + 63,125,250,212,108,36,203,16,141,70,243,237,214,213,83,231,180,239,212,149,121,244,40,65,147,210,161,7,115,230,244,209,179,14,14,14,59,245,219,200, + 92,189,71,255,62,97,64,141,175,167,21,43,86,172,88,121,103,68,1,8,214,207,24,70,183,12,157,48,125,196,202,112,190,242,246,101,235,43,230,31, + 189,1,250,102,67,66,136,155,222,182,10,17,45,0,8,14,14,182,184,91,61,87,156,85,101,153,37,205,124,193,62,68,61,185,61,120,11,123,48,16, + 200,28,228,131,151,158,138,49,181,173,76,38,179,56,162,197,41,228,102,215,27,212,193,178,200,209,98,89,150,0,56,193,113,220,37,24,56,90,246,117, + 188,123,124,249,69,232,154,174,195,251,51,153,159,6,32,175,72,161,152,127,95,195,61,47,49,239,100,1,0,180,234,36,169,204,38,78,44,171,144,151, + 149,2,0,18,215,166,29,194,62,159,177,169,231,232,193,36,107,74,87,228,230,149,42,230,222,211,144,180,82,58,242,62,165,103,140,201,69,71,71,111, + 5,176,53,48,48,48,83,38,147,161,168,168,168,202,61,208,219,219,101,120,127,38,243,147,142,200,41,86,41,230,223,211,32,189,148,219,99,206,84,231, + 86,195,186,56,219,219,254,181,101,217,84,105,250,243,103,16,8,4,176,177,177,193,169,243,113,200,186,123,248,109,28,44,176,44,187,100,225,194,133,139, + 167,77,155,134,236,236,108,28,61,122,20,3,7,14,196,238,221,187,61,143,31,63,190,58,40,40,8,44,203,226,216,177,99,80,171,213,137,198,52,8, + 33,195,38,77,154,52,119,248,240,225,184,122,245,42,50,50,50,42,68,178,242,242,242,70,109,218,180,105,120,82,82,82,181,145,172,74,116,104,216,164, + 173,96,193,87,63,66,81,242,146,151,149,118,57,54,250,20,115,41,39,39,71,10,32,255,77,175,167,21,43,86,172,88,177,12,51,190,72,86,153,19, + 149,101,108,222,192,193,50,54,79,42,69,193,148,149,214,223,126,87,246,83,221,176,59,219,12,155,16,45,138,104,241,92,91,64,147,121,183,124,158,43, + 126,89,97,189,216,214,209,162,166,67,181,6,188,45,219,203,235,104,137,179,179,179,197,181,107,215,150,27,58,8,82,169,20,238,238,238,200,205,205,197, + 182,109,219,0,160,186,164,104,77,173,225,99,209,97,244,68,92,171,39,4,85,171,202,35,91,91,38,76,40,223,136,16,2,129,64,160,207,13,171,238, + 79,247,10,33,228,25,199,113,151,40,165,212,191,89,227,111,197,50,217,132,118,173,154,212,158,53,245,19,126,210,75,5,98,186,46,200,219,255,253,23, + 54,169,212,102,90,50,205,51,239,100,1,79,134,108,222,85,57,146,245,188,109,179,198,139,196,82,241,167,157,90,52,171,19,54,123,42,63,41,83,65, + 98,58,204,47,56,176,98,190,244,41,108,231,166,210,92,163,78,86,37,22,15,28,56,112,49,165,148,114,28,247,21,0,24,218,59,123,250,167,252,39, + 47,228,136,238,186,40,247,192,247,95,216,166,194,188,189,206,173,134,117,113,117,168,245,215,150,229,211,164,25,105,201,16,137,68,176,181,181,69,106,102, + 62,248,60,214,108,157,180,234,32,132,136,122,244,232,241,197,212,169,83,17,23,23,135,41,83,166,100,164,164,164,28,252,253,247,223,167,124,253,245,215, + 188,126,253,250,33,35,35,3,43,87,174,84,159,63,127,126,57,128,149,198,116,120,60,222,39,223,126,251,45,77,79,79,39,79,159,62,133,155,155,27, + 102,204,152,33,92,190,124,121,121,78,86,77,34,89,122,158,63,127,30,235,213,196,3,239,253,185,6,26,181,34,54,47,59,229,108,252,147,220,88,71, + 161,112,78,87,255,86,111,116,61,173,88,177,98,197,202,59,225,90,53,243,255,106,162,42,149,120,176,184,96,105,226,250,69,31,123,125,60,109,30,36, + 158,93,160,120,112,8,92,81,102,121,68,75,108,227,0,71,15,95,228,21,43,176,47,250,6,0,24,141,64,152,162,176,176,16,254,254,254,216,56,190, + 89,79,121,97,182,88,2,64,33,170,37,63,44,236,22,115,252,248,241,18,142,227,246,0,56,94,141,204,146,230,205,155,111,248,241,199,31,133,190,163, + 63,70,209,229,115,21,86,50,12,3,137,68,2,145,72,132,59,119,238,32,38,38,70,9,96,137,57,65,66,200,21,141,70,115,123,223,190,125,169,94, + 141,235,245,15,108,223,97,230,194,5,97,182,247,207,157,196,87,203,55,112,77,219,245,203,143,216,125,184,48,223,198,163,87,73,122,252,45,11,78,245, + 54,42,58,89,233,190,141,60,122,6,180,109,51,239,171,175,22,213,186,119,238,20,190,94,177,133,122,181,238,157,191,226,192,145,130,87,210,6,125,75, + 51,31,92,53,47,169,227,239,191,255,222,10,96,171,126,222,171,113,189,254,61,218,183,155,185,104,193,66,219,251,231,78,34,108,233,90,174,89,251,254, + 185,17,187,15,20,23,216,122,244,54,103,175,139,223,251,157,235,187,57,254,181,254,187,207,164,47,210,82,32,18,137,96,99,99,131,148,140,60,44,94, + 179,183,88,197,113,253,45,177,201,12,34,91,91,91,145,74,165,194,198,141,27,145,146,146,18,64,41,77,33,132,108,249,240,195,15,215,181,108,217,210, + 231,222,189,123,137,69,69,69,211,40,165,241,166,68,236,237,237,3,156,157,157,201,165,75,151,240,217,103,159,41,103,204,152,33,24,55,110,28,201,205, + 205,125,211,72,22,0,160,94,189,122,61,134,4,119,70,151,62,83,98,149,242,188,179,73,241,59,99,25,122,65,220,182,77,139,55,186,158,86,172,88, + 177,98,229,127,3,125,36,203,212,74,147,83,15,128,215,204,9,147,155,215,21,188,136,252,126,6,45,124,114,145,150,94,221,74,11,14,125,74,163,86, + 142,163,199,215,207,162,83,130,155,83,31,23,242,162,153,19,38,247,0,120,149,234,73,244,54,156,31,232,13,117,159,38,160,125,154,128,6,55,131,26, + 192,194,182,109,219,30,158,222,1,229,117,180,166,119,0,5,240,25,0,27,19,53,42,122,27,89,230,6,96,155,191,191,191,230,204,153,51,244,225,200, + 222,244,166,79,109,58,109,218,52,250,245,215,95,211,49,99,198,80,103,103,103,77,217,69,112,171,78,243,189,247,222,171,71,41,69,253,250,245,237,219, + 249,54,125,113,39,250,40,61,27,185,142,254,50,253,125,218,177,165,239,171,58,62,221,111,75,220,188,219,84,83,75,163,92,179,78,157,58,11,40,165, + 253,41,165,110,148,82,120,121,57,217,180,245,105,154,126,251,244,81,122,110,215,6,250,203,244,247,105,167,86,126,217,245,124,131,226,197,46,62,29,44, + 209,52,54,233,236,245,122,17,23,125,236,181,189,45,124,94,185,54,237,124,203,148,189,134,154,141,58,124,112,228,121,122,38,189,114,229,10,61,126,252, + 56,61,119,238,28,141,252,253,8,245,104,63,178,168,118,203,161,93,204,29,219,18,59,1,216,5,7,7,211,196,196,68,58,96,192,0,10,192,238,77, + 52,1,28,78,74,74,162,119,239,222,165,11,23,46,164,0,118,76,157,58,181,52,63,63,159,246,238,221,59,5,186,206,12,188,55,177,179,113,195,186, + 17,195,6,119,91,50,253,179,225,61,222,246,122,190,171,201,170,105,213,180,106,90,53,255,23,52,255,91,39,179,17,173,191,117,209,128,173,45,93,201, + 63,150,175,92,63,103,227,214,29,243,190,152,249,137,172,91,215,62,136,59,253,43,14,28,251,189,88,174,80,174,20,176,248,49,238,21,173,182,14,69, + 84,60,229,87,94,70,8,145,58,54,65,121,13,166,71,185,0,165,180,70,185,197,84,231,73,78,34,132,252,24,20,20,180,236,211,46,29,222,159,222, + 185,39,212,106,53,34,35,35,145,156,156,124,16,192,34,74,169,69,17,183,184,184,184,87,205,155,54,8,117,148,8,230,77,27,51,204,57,235,241,125, + 60,127,112,19,0,160,80,148,170,51,18,98,91,215,196,62,137,68,114,197,217,217,249,161,179,179,115,174,86,81,52,73,204,171,245,213,148,81,67,92, + 178,147,226,145,122,79,215,50,170,144,151,168,82,19,98,124,106,162,171,167,65,131,6,34,25,31,147,117,246,14,117,126,249,248,222,107,123,149,114,245, + 139,196,7,109,44,209,41,81,40,151,127,179,58,178,239,119,243,38,136,106,213,170,133,27,119,31,225,171,85,187,139,75,149,234,254,89,119,14,189,147, + 230,49,74,41,212,106,181,197,29,29,76,240,69,235,214,173,189,151,45,91,230,53,126,252,120,188,109,36,203,144,199,79,159,135,5,6,6,250,61,122, + 120,35,200,81,34,248,199,219,92,79,43,86,172,88,177,98,197,162,28,173,184,76,90,2,96,105,99,87,178,101,193,178,213,139,25,178,102,2,71,233, + 175,26,6,223,60,121,69,171,102,198,215,0,74,105,73,176,15,209,244,29,58,134,7,0,124,94,181,249,83,230,180,18,1,12,39,132,180,255,233,194, + 213,47,203,22,127,71,41,173,81,91,174,45,15,119,187,250,53,174,219,173,109,115,49,171,45,197,243,7,143,145,83,44,199,169,123,201,121,12,101,126, + 173,169,93,79,158,60,249,27,0,90,52,109,240,160,155,95,19,143,238,254,205,165,124,162,196,243,251,55,144,95,170,196,201,123,201,249,32,228,141,19, + 170,13,237,229,189,133,189,47,238,28,190,230,220,106,88,111,66,200,233,133,211,71,139,22,175,218,243,78,157,44,0,37,105,105,105,217,37,37,37,78, + 233,233,233,74,188,97,145,56,74,233,35,66,72,203,89,179,102,45,157,59,119,238,188,239,191,255,94,240,38,57,89,166,200,77,75,62,212,189,249,219, + 95,79,43,86,172,88,177,242,191,65,229,98,165,134,243,53,42,239,240,36,147,102,1,152,214,164,9,153,253,248,49,85,190,43,3,141,69,186,222,134, + 50,199,106,240,27,11,48,164,240,114,98,114,209,149,196,228,34,112,148,114,148,42,24,6,169,197,42,213,242,132,39,207,223,188,215,29,33,218,107,143, + 82,74,175,63,78,149,83,142,163,28,165,74,66,240,66,173,230,150,223,125,242,236,200,191,131,189,89,119,14,93,168,227,247,126,183,11,87,238,206,46, + 46,86,109,200,186,127,232,226,27,219,85,9,74,169,154,16,242,81,64,64,192,199,90,173,118,11,165,84,253,22,90,74,0,95,16,66,14,198,197,197, + 237,189,120,241,98,6,222,129,147,5,224,159,119,255,173,88,177,98,197,202,127,53,198,170,195,191,81,29,173,119,233,100,253,59,18,151,152,228,255,207, + 208,189,155,152,212,226,159,161,251,174,237,125,113,255,224,117,0,163,222,165,166,30,74,233,73,0,39,223,161,222,53,66,72,67,0,236,59,113,178,240, + 207,187,255,86,172,88,177,98,229,191,23,99,213,225,129,55,116,180,172,88,249,119,130,234,50,51,223,137,147,101,197,138,21,43,86,172,212,148,202,81, + 44,67,8,128,222,38,118,58,109,233,1,8,33,70,53,170,49,202,172,190,85,211,170,105,213,180,106,90,53,173,154,86,205,255,62,205,255,70,42,71, + 177,0,3,231,235,159,217,165,17,255,33,93,74,173,154,86,77,171,166,85,211,170,105,213,180,106,254,107,53,255,27,38,0,147,42,47,179,54,29,90, + 177,98,197,138,21,43,86,172,188,5,134,17,45,253,123,250,38,189,14,203,4,154,150,9,60,122,87,6,26,57,198,116,55,55,183,73,173,90,181,242, + 21,8,4,76,97,97,225,55,49,49,49,75,42,111,215,189,57,255,58,203,160,158,193,158,0,97,1,134,129,150,226,249,217,219,37,237,254,89,54,90, + 121,123,8,33,158,146,90,206,127,16,134,21,106,53,42,104,213,42,0,175,135,99,226,56,77,178,70,41,239,103,106,127,183,54,239,123,104,180,220,247, + 0,221,8,48,83,1,110,19,1,111,10,133,102,51,1,251,25,88,186,2,90,50,159,199,103,23,164,223,216,151,250,255,113,78,255,108,246,239,223,207, + 190,205,254,35,70,140,48,58,128,104,221,186,117,143,73,165,210,38,166,246,43,46,46,206,72,79,79,15,122,155,99,255,187,67,8,233,14,96,61,128, + 230,149,86,197,3,8,165,148,70,191,237,49,2,9,225,185,2,147,5,192,124,0,80,1,43,50,129,173,127,191,163,142,28,239,2,23,23,151,179,60, + 30,207,171,184,184,184,184,160,160,160,113,173,90,181,158,200,100,50,153,70,163,73,124,249,242,101,119,179,59,19,98,209,231,179,5,96,155,0,124,168, + 101,152,25,124,96,163,130,227,116,181,19,41,173,118,128,91,66,200,167,0,22,3,200,0,48,133,82,122,179,38,235,173,88,249,103,64,205,228,104,85, + 235,104,17,66,154,1,232,81,54,117,111,223,190,189,107,113,113,49,8,33,153,0,206,2,136,5,16,75,41,77,120,23,198,178,44,251,195,218,181,107, + 231,204,152,49,163,124,48,232,59,119,238,24,223,150,65,189,51,199,162,93,174,221,121,136,246,189,71,64,231,104,49,64,201,11,4,245,110,255,70,199, + 39,132,216,58,56,56,124,67,8,25,201,48,76,181,63,26,28,199,105,41,165,251,114,115,115,23,83,74,11,107,114,44,27,153,88,173,209,106,141,30, + 131,199,178,218,162,98,185,201,178,23,78,78,78,23,25,134,105,100,56,96,118,153,253,70,223,27,206,107,52,154,231,89,89,89,213,58,161,132,16,49, + 195,19,132,18,34,232,3,134,107,6,16,16,48,9,156,86,121,138,211,168,214,82,74,205,143,230,109,94,219,211,173,126,227,115,159,47,138,168,119,247, + 65,60,22,78,31,131,239,215,239,192,130,208,143,177,118,219,110,132,78,26,13,63,191,202,255,119,21,225,32,88,190,104,230,200,222,225,27,247,118,93, + 48,109,164,40,124,227,190,110,11,167,127,40,92,190,97,111,183,133,211,63,16,133,111,216,219,117,193,204,145,146,229,155,246,115,0,198,190,137,157,31, + 53,171,91,12,141,70,100,116,37,143,167,248,71,66,154,236,77,116,223,150,144,144,144,0,150,112,235,250,117,244,62,211,209,207,227,153,177,109,178,51, + 82,26,60,123,250,48,72,192,48,51,7,135,69,94,50,167,39,18,137,26,197,199,199,123,113,28,7,173,86,11,141,253,173,187,182,0,0,32,0,73, + 68,65,84,70,83,254,170,84,42,209,189,123,247,119,18,253,38,132,12,6,240,13,116,249,161,225,148,210,189,111,161,101,195,227,241,62,23,10,133,61, + 52,26,141,47,0,240,249,252,7,10,133,34,86,163,209,172,166,148,22,213,80,114,77,90,90,154,159,141,141,13,84,42,85,249,0,244,44,203,250,120, + 120,120,108,4,224,245,166,182,234,113,5,38,119,238,218,117,237,184,57,115,216,210,179,103,177,118,251,246,53,40,40,0,128,141,213,237,43,18,137,254, + 98,24,198,179,38,199,227,56,46,89,161,80,152,124,88,49,6,143,199,243,74,79,79,119,113,119,119,7,0,200,100,50,153,225,252,155,18,11,144,254, + 64,119,13,203,206,114,170,93,187,219,141,147,39,101,45,90,180,96,88,150,93,0,192,162,34,213,132,144,58,13,26,52,216,114,226,196,9,38,41,41, + 201,125,200,144,33,127,248,251,251,111,131,238,9,141,42,20,10,89,131,6,13,230,159,56,113,130,60,123,246,204,173,127,255,254,155,1,188,217,159,129, + 21,43,53,192,88,89,7,61,38,127,60,9,33,199,1,244,104,223,190,189,100,212,168,81,232,209,163,7,188,188,188,32,22,139,1,0,217,217,217,174, + 183,110,221,250,224,236,217,179,31,28,61,122,20,132,144,82,0,231,41,165,70,191,212,189,7,119,155,33,182,17,173,3,128,172,231,217,25,207,159,190, + 92,151,145,145,177,146,26,140,70,77,8,105,60,110,220,184,217,51,103,206,196,177,99,199,176,123,247,110,40,20,10,20,22,22,34,38,38,198,184,161, + 197,47,145,27,19,1,200,158,1,41,127,3,82,23,64,230,106,225,165,169,138,131,131,195,55,161,161,161,179,252,252,252,64,169,174,138,185,90,173,134, + 70,163,129,90,173,70,110,110,46,102,207,158,13,64,151,223,198,113,28,254,252,243,207,25,147,38,77,2,128,207,141,105,6,180,243,184,206,16,166,158, + 62,86,67,181,218,231,151,110,166,182,211,104,181,172,92,174,50,58,82,185,88,44,48,235,228,241,249,252,122,247,255,248,195,133,17,10,65,181,90,128, + 227,64,57,14,128,193,68,117,203,168,150,3,85,107,193,105,56,104,74,21,232,48,117,106,181,215,129,16,210,153,47,148,236,254,232,211,57,117,58,118, + 234,196,111,80,223,29,26,45,135,199,73,207,235,220,184,126,185,203,190,157,27,167,16,66,70,83,74,223,168,206,150,80,90,235,228,134,205,63,213,187, + 118,235,46,162,207,156,197,233,152,88,0,192,95,103,116,114,12,195,84,103,159,131,75,243,129,45,67,39,14,21,69,108,216,195,15,157,56,140,253,126, + 195,239,252,153,31,15,97,35,214,237,22,204,252,120,8,27,177,126,183,96,230,196,161,108,248,218,95,90,17,66,28,40,165,185,166,244,76,221,35,104, + 52,162,127,60,201,100,1,32,107,203,22,168,95,190,132,251,226,197,0,128,143,26,187,26,119,192,140,224,236,236,124,157,207,231,215,171,110,59,181,90, + 93,173,19,28,18,18,210,185,101,203,150,135,162,162,142,218,140,120,127,120,179,250,13,26,157,30,217,47,32,211,112,155,203,151,46,185,158,206,124,212, + 251,151,3,49,76,248,156,144,195,71,194,67,134,13,89,16,105,242,94,113,28,199,40,20,10,36,38,38,234,243,12,42,83,109,164,193,24,132,16,6, + 192,90,39,39,167,142,217,217,217,31,1,88,88,80,80,208,138,101,89,56,58,58,46,36,132,60,182,179,179,251,57,63,63,255,34,116,81,35,139,134, + 12,32,132,116,175,85,171,86,228,161,67,135,28,218,182,109,203,100,101,101,161,81,163,70,200,201,201,233,112,246,236,89,255,137,19,39,78,36,132,132, + 80,74,207,214,192,92,111,169,84,74,199,141,27,71,180,218,215,167,251,203,47,191,160,95,11,77,147,207,250,203,74,228,74,154,31,157,104,247,153,64, + 32,56,255,236,217,179,252,26,93,12,0,2,96,254,184,57,115,88,155,103,207,96,115,251,54,62,42,40,224,125,175,139,110,85,235,104,49,12,227,25, + 185,231,87,47,161,80,88,254,187,100,106,210,106,181,80,41,85,136,248,206,232,184,236,22,33,149,74,165,238,238,238,153,82,169,84,250,198,34,0,92, + 1,143,28,134,249,180,141,191,255,164,175,135,12,145,92,191,126,93,196,48,12,52,26,13,86,174,92,169,161,148,218,251,1,181,238,3,5,22,200,57, + 9,133,66,198,203,75,231,243,218,217,217,185,69,70,70,46,210,175,76,76,76,36,11,23,46,36,101,235,9,116,195,179,89,177,242,255,66,229,132,120, + 75,154,14,7,20,20,20,64,171,213,194,214,214,22,44,91,241,127,223,201,201,9,125,250,244,65,247,238,221,49,106,212,40,220,191,127,95,50,106,212, + 168,62,166,196,198,204,25,132,250,94,58,7,72,173,230,220,46,68,221,138,248,229,219,253,206,0,230,24,108,54,113,242,228,201,36,59,59,27,35,71, + 142,60,171,80,40,222,163,148,154,252,242,105,57,60,15,26,53,6,28,37,146,213,87,182,17,165,188,148,50,12,83,170,111,58,52,115,110,38,33,132, + 140,116,119,119,199,158,61,123,160,84,86,45,23,86,171,86,45,220,187,119,175,124,158,101,89,116,234,212,137,37,132,140,132,9,71,139,16,166,222,133, + 107,207,92,244,243,131,250,52,23,4,180,243,204,116,118,178,165,0,200,162,69,186,223,9,253,31,220,55,223,124,99,137,157,96,248,124,100,197,198,150, + 47,99,120,12,24,1,1,225,3,12,79,215,138,10,10,80,45,192,105,0,78,13,136,221,234,91,162,221,161,174,135,215,177,229,171,54,217,43,212,20, + 123,142,68,35,41,233,41,88,134,65,227,38,94,232,27,216,141,239,223,62,160,254,138,37,115,142,18,66,6,80,74,45,26,0,187,2,28,21,55,241, + 168,141,159,127,185,1,103,7,27,140,28,58,16,18,177,8,223,175,255,21,223,45,152,14,175,198,158,216,186,102,153,201,221,237,236,236,150,250,122,53, + 241,220,180,51,10,190,62,62,236,166,200,40,248,250,149,189,54,247,101,55,69,70,193,175,185,31,187,41,50,10,173,154,123,55,184,158,113,101,41,128, + 233,166,207,185,210,61,234,171,187,71,94,60,65,185,35,252,108,202,20,0,40,119,180,106,2,159,207,175,151,158,158,238,82,221,118,213,69,13,66,66, + 66,2,218,180,105,115,56,38,38,198,54,47,47,143,183,111,255,126,237,192,1,3,122,19,224,244,136,50,103,235,202,165,75,174,167,79,158,232,189,112, + 211,49,161,50,225,24,249,106,249,26,201,151,179,62,57,120,52,34,100,216,136,17,35,206,27,211,85,40,20,73,109,218,180,161,101,239,235,138,68,34, + 129,225,122,66,136,187,151,151,87,149,168,181,5,77,138,107,47,93,186,52,221,207,207,15,62,62,62,23,59,118,236,88,75,38,147,225,196,137,19,240, + 245,245,109,94,171,86,173,43,251,246,237,227,127,241,197,23,173,183,111,223,14,0,51,204,95,33,93,47,168,160,160,160,61,199,142,29,19,11,4,2, + 148,150,150,226,222,189,123,176,183,183,135,80,40,196,144,33,67,216,46,93,186,56,5,6,6,30,40,123,24,176,184,7,148,92,46,167,11,23,46,132, + 84,42,133,84,42,133,76,38,131,76,38,131,141,24,100,75,168,135,100,230,182,60,201,231,139,183,68,68,110,90,114,198,195,195,227,235,148,148,148,60, + 75,181,245,148,158,61,11,155,219,183,1,131,239,174,165,216,73,29,17,22,22,102,118,27,30,143,7,129,64,128,206,157,59,87,171,231,228,228,116,144, + 199,227,85,120,50,165,148,138,195,194,194,180,9,9,9,50,134,97,100,28,199,33,44,44,76,171,209,104,196,174,174,174,23,57,142,203,204,202,202,122, + 223,156,110,32,32,190,8,12,35,124,254,231,110,238,238,13,123,52,110,44,61,125,250,52,11,0,158,158,158,52,35,35,35,239,240,225,195,133,60,96, + 179,39,165,59,45,116,178,64,41,189,39,22,139,79,122,123,123,247,85,171,213,104,220,184,113,198,166,77,155,210,0,16,74,41,1,64,180,90,173,175, + 183,183,183,88,169,84,82,232,162,167,86,254,59,240,7,96,248,89,85,2,16,150,189,207,134,46,170,89,187,210,114,0,120,5,221,131,162,171,137,249, + 108,0,247,1,120,3,112,41,91,119,13,64,78,77,13,52,27,209,138,138,138,42,127,132,13,14,14,46,255,99,177,181,181,197,181,107,215,64,8,129, + 173,173,45,106,213,170,5,59,59,59,20,20,20,224,254,253,251,136,143,143,199,179,103,207,64,8,65,227,198,141,1,221,19,132,225,65,203,127,224,126, + 251,241,24,196,54,34,16,2,180,237,217,10,173,186,183,64,251,171,79,66,221,221,221,183,165,167,167,39,18,66,120,45,90,180,152,216,169,83,39,172, + 90,181,10,10,133,98,149,49,39,203,80,243,236,61,117,59,0,112,119,119,159,187,235,196,99,233,216,254,77,74,210,211,211,127,120,131,139,83,225,135, + 248,213,171,87,22,143,197,199,113,28,114,115,171,6,74,12,53,43,71,8,86,175,221,96,95,152,159,137,111,191,223,5,181,90,141,57,115,230,128,227, + 184,242,41,47,207,248,111,119,101,59,169,182,82,144,129,209,77,132,1,8,15,240,248,80,231,87,164,236,217,0,66,1,162,5,80,233,188,42,107,18, + 66,196,172,64,242,251,146,239,215,217,223,140,127,142,35,209,55,161,42,72,67,198,237,67,0,128,198,157,71,99,175,130,69,199,86,77,48,107,209,10, + 135,47,103,133,252,78,8,241,49,108,70,180,228,143,141,82,45,190,93,186,20,219,214,173,194,138,85,235,80,144,159,7,62,191,54,0,64,163,209,66, + 91,233,220,170,156,59,165,253,195,66,39,144,239,55,31,68,7,63,55,28,56,113,21,93,219,120,226,208,201,235,232,238,223,16,71,78,223,68,207,142, + 77,112,60,246,46,102,77,30,77,70,255,181,189,191,185,235,89,249,30,173,89,179,193,190,176,32,19,199,150,237,196,203,141,27,145,60,125,58,58,148, + 109,115,149,16,8,234,213,3,4,168,66,117,231,254,224,193,3,40,20,138,42,203,69,34,17,124,125,125,141,238,99,168,169,84,42,191,140,138,138,18, + 231,229,229,241,50,50,50,32,147,201,216,53,171,127,148,79,155,52,190,245,136,126,1,39,0,224,208,145,67,173,191,217,176,151,167,124,112,136,148,156, + 255,17,130,198,189,197,161,99,122,229,205,249,241,247,47,1,244,53,102,103,70,70,198,0,253,251,198,141,27,199,39,36,36,120,235,155,154,203,154,16, + 5,26,141,198,75,223,156,168,209,104,160,80,40,208,187,119,239,242,39,48,99,231,238,224,224,208,201,215,215,23,55,111,222,196,186,117,235,28,131,130, + 130,240,232,209,35,16,66,176,124,249,114,226,231,231,199,127,245,234,21,250,245,235,135,131,7,15,86,241,12,140,124,62,109,101,50,217,246,163,71,143, + 138,25,134,65,97,97,33,56,142,67,215,174,93,193,48,12,238,222,189,139,69,139,22,225,224,193,131,56,124,248,176,196,223,223,127,59,33,196,215,176, + 89,223,204,61,162,114,185,156,138,68,34,136,68,34,136,197,98,136,197,98,8,133,66,20,201,129,73,171,147,21,172,184,54,215,188,77,215,38,19,102, + 46,103,126,248,234,227,24,0,71,170,209,172,128,10,88,177,246,215,95,215,125,148,159,207,0,192,207,132,112,42,74,87,24,53,198,136,102,161,60,15, + 158,77,234,225,192,158,195,24,62,106,104,149,125,120,60,30,248,124,1,4,124,62,108,29,171,6,162,42,107,10,4,2,215,248,248,120,39,62,159,15, + 74,169,46,18,166,82,101,126,249,229,151,206,193,193,193,182,127,254,249,39,19,28,28,204,57,56,56,20,95,189,122,245,165,70,163,113,234,214,173,155, + 73,77,41,208,74,110,215,116,173,152,79,91,125,191,96,138,104,236,216,177,236,132,9,19,144,146,146,130,137,19,39,202,79,157,58,165,124,145,145,113, + 68,200,113,27,84,128,241,156,16,19,231,174,71,46,151,247,235,221,187,247,237,176,176,48,159,157,59,119,238,159,48,97,194,214,74,215,96,119,215,174, + 93,125,23,47,94,188,138,82,250,147,37,154,111,138,85,243,221,98,202,23,41,195,149,16,114,204,224,248,131,244,243,97,97,97,11,195,195,195,239,17, + 66,142,25,46,215,111,7,0,250,101,149,231,203,246,117,92,176,96,65,139,136,136,136,229,1,1,1,123,46,94,188,248,20,53,116,180,170,205,209,210, + 159,144,225,73,86,18,64,65,65,1,10,10,10,144,154,154,138,45,91,182,148,125,161,249,224,241,120,224,241,120,229,249,12,166,56,125,244,220,122,0, + 235,253,253,253,249,113,151,246,253,57,127,219,204,94,237,122,183,101,111,68,199,141,0,240,29,128,1,227,198,141,171,13,0,59,119,238,124,5,224,207, + 154,156,228,187,130,82,186,47,49,49,113,150,155,155,91,121,142,138,97,243,161,70,163,129,88,44,134,62,151,69,46,151,99,203,150,45,26,74,233,62, + 51,154,72,184,23,131,196,123,103,116,251,113,28,56,237,235,253,151,44,89,98,216,53,20,83,202,34,39,213,193,25,187,230,180,210,107,165,229,85,156, + 179,74,48,140,96,230,136,144,233,110,28,225,225,143,152,91,224,243,249,224,12,162,153,124,86,247,180,124,239,81,58,220,93,155,227,189,209,147,235,28, + 138,220,48,19,192,247,22,25,109,128,79,235,0,132,206,154,133,159,182,109,195,162,197,75,203,189,116,141,86,11,77,181,118,50,76,239,46,45,160,41, + 74,7,203,178,232,217,161,9,88,150,69,159,128,102,96,89,22,253,186,248,128,199,227,161,127,87,63,52,109,218,20,60,30,207,108,91,164,238,30,69, + 35,241,222,223,6,78,175,238,158,168,50,50,170,108,175,206,200,0,245,112,170,209,249,82,74,49,113,226,196,188,212,212,84,85,229,117,245,235,215,23, + 156,61,123,214,222,68,179,93,57,66,161,240,187,129,3,7,30,62,124,248,48,149,74,165,18,149,178,68,241,241,196,79,217,111,167,12,187,173,223,102, + 216,144,97,183,127,152,63,161,247,220,133,139,33,104,20,200,211,82,228,173,248,249,8,95,200,23,126,103,137,157,250,102,196,135,15,31,154,106,70,52, + 60,39,163,77,223,122,114,115,115,199,249,250,250,158,93,191,126,189,35,33,4,231,206,157,3,203,178,229,211,147,39,79,192,48,12,230,207,159,175,42, + 40,40,248,164,58,219,120,60,222,172,3,7,14,216,9,133,66,20,22,22,150,127,111,88,150,69,124,124,60,126,248,225,7,140,27,55,14,41,41,41, + 112,119,119,199,156,57,115,108,34,34,34,102,1,88,106,193,169,223,81,42,149,237,164,82,41,196,98,49,244,14,23,0,156,188,199,191,91,82,82,210, + 178,118,237,218,117,156,99,143,253,209,57,232,189,214,78,206,110,1,40,115,180,44,229,49,176,237,169,70,243,229,128,67,135,92,46,28,58,196,93,250, + 227,143,231,226,162,162,173,213,239,89,134,154,69,242,227,231,240,247,247,199,141,27,55,224,239,255,122,16,3,129,64,0,161,80,8,129,64,0,129,64, + 128,218,246,22,165,80,80,134,97,112,225,194,5,104,181,90,40,149,74,40,149,74,248,249,249,229,156,57,115,198,6,0,158,60,121,66,199,142,29,155, + 119,229,202,21,180,105,99,126,60,117,57,33,209,75,150,255,104,247,227,134,72,216,57,186,34,54,54,86,123,226,196,137,66,2,36,36,222,187,183,234, + 61,224,248,62,160,202,231,223,20,132,16,190,179,179,243,113,30,143,87,225,203,38,145,72,154,44,89,178,132,159,145,145,49,250,252,249,243,125,1,192, + 209,209,49,118,235,214,173,235,0,160,105,211,166,84,36,18,213,52,71,207,202,191,152,234,124,17,224,181,163,100,56,79,8,57,22,30,30,62,168,242, + 50,67,167,202,216,123,195,125,35,34,34,150,27,104,151,190,203,243,42,111,58,140,138,138,162,70,60,72,139,169,206,209,210,115,227,198,13,117,221,186, + 117,127,74,188,245,172,87,147,86,141,33,145,137,250,18,66,214,139,68,162,217,33,33,33,184,124,249,50,238,222,189,251,11,125,203,94,56,45,91,182, + 252,75,36,18,121,26,91,167,80,40,146,227,226,226,140,230,146,229,230,230,46,46,203,57,51,153,12,111,152,47,102,152,12,111,202,22,202,81,168,85, + 106,20,151,148,190,254,19,47,115,180,138,139,139,241,225,135,31,86,136,104,189,124,249,178,218,243,35,132,224,135,35,71,112,106,223,62,12,108,221,26, + 7,175,94,69,68,200,24,248,120,214,5,213,18,80,2,164,236,222,128,236,130,34,252,22,125,1,57,133,37,248,168,91,55,120,213,170,109,94,151,47, + 232,211,161,83,128,224,244,197,251,224,243,121,96,192,129,170,75,224,238,27,8,150,97,96,231,218,16,2,62,31,124,62,15,79,82,95,193,183,69,123, + 225,49,161,184,15,222,192,209,242,240,108,4,78,171,197,184,113,227,176,103,207,30,56,213,241,132,93,253,22,248,110,213,54,12,236,221,205,236,190,250, + 104,139,222,209,103,89,182,202,171,254,189,37,209,73,202,81,168,42,223,35,142,130,2,168,183,108,25,234,45,91,134,171,101,199,244,43,46,70,105,105, + 41,208,209,124,178,126,5,125,74,161,84,42,145,154,154,170,202,200,200,168,242,15,88,167,78,157,76,165,82,89,173,99,19,25,25,121,41,36,36,100, + 88,96,96,224,193,117,107,86,43,166,79,159,46,94,58,101,80,244,8,131,28,173,142,1,1,153,20,56,253,221,162,185,189,63,30,220,182,120,117,228, + 73,77,94,41,134,15,89,96,62,33,94,143,66,161,72,106,213,170,149,121,67,202,40,41,41,121,97,106,157,62,241,189,109,219,182,181,130,130,130,112, + 246,236,89,12,31,62,92,161,82,169,18,1,32,56,56,184,217,111,191,253,38,188,127,255,62,156,157,157,249,201,201,201,219,9,33,102,19,228,133,66, + 97,96,251,246,237,25,133,66,81,197,201,138,136,136,192,232,209,163,209,172,89,51,112,28,135,162,162,34,4,5,5,241,215,173,91,23,8,203,28,173, + 80,31,31,159,31,160,235,117,104,248,91,248,0,192,60,0,120,245,234,213,139,65,195,199,221,235,214,251,253,118,13,154,182,168,54,255,199,213,213,117, + 1,195,48,31,112,28,199,22,20,20,164,42,9,105,234,215,160,129,107,151,161,67,145,207,231,179,107,163,163,153,204,162,34,27,0,22,53,65,150,170, + 139,224,217,68,151,234,55,124,212,80,220,184,113,3,35,70,15,131,64,32,0,143,199,215,125,55,5,186,136,150,125,109,91,75,36,161,86,235,134,28, + 213,63,84,170,84,42,168,84,42,232,83,179,164,82,105,249,58,133,66,1,66,136,185,207,6,19,212,189,11,46,222,76,208,76,156,183,86,193,207,190, + 30,81,135,227,118,60,7,50,205,236,99,14,105,35,151,218,237,86,132,78,183,99,249,2,240,196,98,52,8,212,213,207,84,20,22,32,225,143,131,206, + 0,117,206,127,145,129,217,191,31,22,0,88,247,134,199,177,242,111,66,117,190,136,161,163,244,182,16,66,142,133,133,133,45,4,64,195,194,194,22,234, + 231,195,195,195,75,1,164,189,139,99,0,6,77,135,111,227,100,1,168,210,212,83,153,158,61,123,206,176,181,181,93,7,0,237,218,181,67,234,229,52, + 164,94,78,131,175,119,243,46,109,91,183,203,31,61,122,52,156,156,156,48,119,238,92,10,224,151,154,30,255,73,194,61,27,0,212,221,221,125,46,0, + 184,187,187,183,190,122,245,170,243,181,107,215,208,190,253,235,78,39,42,149,10,93,187,118,53,169,83,214,196,240,57,76,228,91,189,9,148,114,80,169, + 84,40,41,41,133,82,169,130,70,205,65,163,209,192,191,185,45,34,183,133,233,150,105,244,209,51,93,212,172,94,29,91,248,183,172,163,102,24,82,122, + 237,118,70,45,99,186,74,165,18,119,146,147,113,251,153,174,211,217,123,225,70,91,32,202,137,140,62,11,63,63,191,234,172,109,82,207,189,14,210,79, + 221,209,253,120,151,166,226,218,249,189,176,181,181,1,0,52,239,241,17,4,2,157,163,85,92,170,66,109,239,250,32,148,154,44,11,32,115,116,251,139, + 39,16,123,82,45,7,74,57,80,78,11,74,57,136,108,157,164,211,63,155,0,142,211,162,67,135,14,32,44,11,173,90,129,145,131,251,32,55,191,16, + 78,246,70,79,185,10,2,129,0,61,122,244,144,152,90,255,232,209,163,82,160,106,15,204,42,103,77,57,157,163,85,92,10,133,66,1,149,82,3,149, + 90,3,174,145,0,223,126,57,6,26,149,6,37,163,2,116,203,102,13,131,74,169,70,138,148,97,90,251,57,171,25,144,210,155,247,95,154,53,152,82, + 10,189,115,96,10,99,57,129,198,136,140,140,188,24,18,18,50,108,232,144,193,235,123,183,111,118,54,233,73,98,114,196,134,196,202,155,61,84,9,28, + 158,45,218,124,162,59,159,97,102,88,234,100,1,21,155,17,223,146,133,133,133,133,173,108,108,108,144,144,144,0,150,101,65,8,121,68,41,109,5,0, + 147,39,79,126,204,227,241,26,179,44,139,141,27,55,18,30,143,215,50,32,32,96,33,0,147,142,150,70,163,241,181,181,181,173,16,205,18,8,4,8, + 11,11,195,216,177,99,203,157,44,129,64,128,29,59,118,160,93,187,118,80,42,149,198,219,100,43,65,117,131,209,155,247,240,1,112,28,71,0,128,114, + 213,120,197,58,123,199,103,127,240,65,83,196,198,162,75,227,198,126,254,254,254,80,169,94,7,116,26,53,106,84,191,176,176,240,5,33,228,31,0,54, + 81,74,111,153,213,147,83,36,63,214,165,159,222,184,113,3,29,58,116,40,143,96,25,70,179,4,2,1,36,2,155,234,204,3,240,218,209,226,56,221, + 239,82,97,97,33,19,27,27,91,219,199,199,135,0,128,143,143,15,185,117,235,150,163,84,42,125,213,164,73,147,234,30,128,5,0,16,216,247,125,222, + 169,19,199,101,26,96,233,11,150,93,90,93,151,85,74,169,90,203,113,70,147,238,29,237,236,193,169,213,56,25,177,20,246,245,61,209,184,151,238,25, + 89,89,88,128,75,91,215,193,198,209,9,173,134,127,104,209,185,90,249,247,198,18,95,228,93,57,89,122,45,125,68,43,60,60,252,94,120,120,120,149, + 232,88,77,48,76,134,55,108,74,172,16,209,2,140,182,139,90,132,254,203,106,138,85,171,86,161,101,203,150,38,215,83,74,177,110,221,58,236,218,181, + 107,21,165,244,73,77,143,63,168,87,219,230,88,125,232,94,227,102,205,9,0,44,157,53,152,41,46,46,198,133,11,23,96,103,103,135,71,143,44,43, + 251,69,8,177,181,179,179,251,134,97,152,145,108,229,30,0,70,208,106,181,90,142,227,246,229,231,231,155,44,239,64,41,160,82,107,80,92,34,135,82, + 169,196,172,249,27,170,181,35,28,32,42,101,33,175,71,247,0,163,78,4,33,4,29,90,244,192,180,177,178,42,127,222,172,174,148,24,218,116,208,141, + 97,125,243,202,93,80,10,104,181,64,109,23,71,252,178,231,71,115,135,38,26,45,87,246,116,172,69,145,66,11,223,78,131,240,252,65,44,0,93,4, + 73,40,208,53,25,11,248,124,112,148,232,170,62,152,64,32,148,120,230,102,60,241,218,118,44,14,147,6,181,196,254,211,119,48,162,119,43,156,185,114, + 31,65,29,253,112,47,241,25,154,123,53,192,198,237,251,64,41,10,55,175,254,174,60,66,194,113,154,100,147,70,26,68,180,46,95,190,92,90,57,138, + 101,248,90,93,148,8,208,125,254,244,17,173,82,185,2,115,23,108,170,118,31,232,239,81,183,78,38,29,61,67,204,69,172,44,113,196,12,137,140,140, + 188,4,160,173,185,109,26,225,95,223,175,93,171,213,34,42,42,170,252,126,84,134,16,82,33,2,89,29,28,199,33,57,57,25,119,239,222,69,64,64, + 0,242,243,243,193,103,24,204,137,139,131,95,72,8,148,2,1,56,142,131,80,40,196,228,201,147,45,190,158,53,162,172,185,148,82,173,89,113,66,200, + 143,131,6,13,106,154,80,92,140,123,241,241,232,189,100,9,0,32,42,42,170,124,27,165,82,137,217,179,103,11,239,223,191,63,241,250,245,235,19,9, + 33,171,40,165,115,76,72,66,69,229,229,57,90,31,124,52,28,77,125,27,97,215,246,221,229,235,103,207,15,5,159,47,0,159,207,135,189,189,189,69, + 103,163,86,171,203,157,214,146,146,18,230,248,241,227,245,250,244,233,35,8,13,13,37,0,176,107,215,46,102,253,250,245,178,83,167,78,9,234,214,173, + 91,181,29,189,226,57,23,164,101,43,68,0,224,225,225,129,13,91,255,96,130,131,131,17,26,26,10,181,90,141,77,155,116,223,171,209,163,71,67,165, + 82,225,192,129,3,0,0,30,143,103,178,148,13,5,133,90,33,71,97,230,11,240,37,82,112,28,7,66,8,168,86,11,85,97,1,52,18,49,192,113, + 96,24,198,126,237,218,181,147,147,147,147,93,123,245,234,37,40,40,40,152,66,8,57,105,173,163,245,159,69,117,190,136,177,92,171,178,168,148,41,178, + 12,243,182,76,57,106,134,57,91,0,170,38,210,86,67,229,242,14,134,243,21,114,180,140,193,178,108,181,209,42,125,87,93,115,204,158,61,27,182,182, + 198,67,217,74,165,146,198,197,197,221,207,200,200,216,70,41,173,222,11,49,194,177,232,155,247,190,249,124,88,33,202,218,86,237,237,237,95,245,236,217, + 179,8,128,106,239,222,138,15,200,10,133,34,217,148,142,157,157,221,55,63,255,252,243,204,161,67,135,50,149,75,12,24,54,239,233,39,181,90,141,189, + 123,247,206,252,226,139,47,0,19,81,48,253,159,120,73,113,41,74,203,18,161,31,223,221,111,217,137,153,249,163,176,113,112,71,189,198,90,147,127,38, + 140,64,151,214,80,199,179,117,249,50,91,91,49,180,102,52,9,97,158,60,75,73,175,91,191,142,35,30,167,102,193,181,65,75,228,166,189,190,14,60, + 30,11,126,89,211,161,125,45,25,178,94,190,4,195,176,102,29,227,239,126,187,137,43,119,159,225,192,233,91,80,201,139,177,122,231,9,168,20,69,80, + 201,139,161,146,235,94,151,127,241,41,8,193,11,149,188,168,153,57,173,202,240,120,60,116,236,216,209,164,163,147,150,150,102,97,68,139,150,71,180,74, + 229,53,188,71,22,160,111,58,172,110,253,155,58,6,33,33,33,157,29,29,29,183,228,228,228,124,22,25,105,186,140,131,49,220,220,220,254,180,177,177, + 105,104,233,246,53,40,94,186,220,222,222,254,27,31,31,31,223,213,171,87,243,89,150,69,175,94,189,154,125,250,233,167,201,0,208,178,101,75,119,64, + 247,27,51,117,234,84,122,249,242,229,187,0,194,205,9,10,133,194,120,59,59,187,118,61,123,246,68,126,126,62,82,83,83,33,147,201,224,247,227,143, + 136,155,58,21,173,183,108,1,211,179,39,8,33,16,10,133,136,139,139,131,68,34,137,55,165,71,8,233,8,96,5,128,46,120,221,92,72,1,92,0, + 48,159,82,122,165,242,62,250,31,6,45,199,85,119,179,198,204,157,59,23,121,124,62,16,28,12,193,147,39,80,169,84,8,8,8,64,187,118,186,10, + 30,1,1,1,224,241,120,104,213,170,21,220,221,221,177,113,227,198,49,168,216,19,187,2,138,34,53,146,31,63,71,64,64,64,121,228,42,56,56,184, + 60,162,197,231,243,203,35,91,196,120,137,190,202,231,79,13,31,146,181,90,45,225,241,120,188,207,63,255,156,12,31,62,156,42,149,74,78,40,20,50, + 7,14,28,32,103,206,156,225,21,23,23,87,23,109,40,30,53,106,148,75,253,250,245,144,250,248,30,246,239,167,88,181,106,21,206,158,213,85,217,72, + 72,208,117,92,213,207,7,5,5,161,97,195,134,160,102,62,248,114,134,167,109,53,114,12,234,6,116,67,81,230,11,108,238,21,0,129,128,15,251,186, + 245,240,241,241,88,240,4,2,8,164,50,56,239,61,98,63,110,220,184,169,147,39,79,22,156,63,127,30,73,73,73,117,7,12,24,96,173,163,245,31, + 68,53,129,158,172,74,78,146,210,96,62,11,186,158,167,131,202,222,195,224,253,53,0,237,43,109,171,95,175,172,244,170,95,95,158,243,250,46,48,23, + 209,77,188,116,233,146,151,191,191,63,82,82,82,170,244,132,211,255,113,201,100,50,72,36,18,92,188,120,17,0,170,180,95,232,137,137,137,89,15,93, + 213,101,0,128,187,187,123,64,208,7,129,23,59,244,111,143,223,194,119,231,103,100,100,180,162,101,53,116,8,33,196,221,221,125,44,95,200,251,176,113, + 11,143,30,224,184,21,167,255,56,191,196,220,137,52,110,214,188,8,64,169,65,175,195,26,247,62,4,0,134,97,70,14,29,58,148,185,127,255,62,62, + 252,240,67,236,218,181,203,228,182,99,199,142,197,158,61,123,48,116,232,80,102,193,130,5,38,203,59,84,140,150,88,214,60,100,9,9,137,183,17,185, + 251,39,147,57,72,46,46,206,0,128,151,47,179,202,151,181,107,103,190,176,51,167,81,158,186,121,253,106,64,231,238,189,4,169,153,121,224,52,10,200, + 11,95,149,175,47,201,203,4,213,200,33,144,58,162,78,109,59,220,184,116,82,169,82,202,79,153,211,156,57,180,57,166,14,246,5,40,135,97,115,126, + 193,177,13,51,202,159,160,187,14,15,69,244,222,181,22,231,248,85,134,207,231,35,46,46,174,212,84,52,139,101,217,106,107,114,1,250,168,163,26,37, + 37,165,40,41,125,227,58,172,85,32,132,56,187,186,186,110,118,116,116,20,27,115,164,8,33,206,206,206,206,155,157,156,156,196,150,54,29,86,38,36, + 36,164,243,164,73,147,162,126,248,225,7,217,220,185,115,163,66,66,66,130,107,226,108,137,68,162,134,137,137,137,229,197,74,205,189,42,149,74,4,5, + 5,89,84,188,148,82,122,148,16,242,212,205,205,237,130,159,159,159,221,227,199,143,177,123,247,110,1,159,207,247,208,255,126,20,22,22,130,101,89,188, + 124,249,82,13,224,227,234,154,206,20,10,69,108,108,108,108,155,193,131,7,179,241,241,241,96,89,86,103,87,64,0,90,111,217,130,187,159,127,142,30, + 207,158,65,174,82,65,44,22,227,175,191,254,82,149,148,148,196,154,210,147,72,36,219,146,146,146,154,139,197,98,168,84,42,112,186,200,8,225,241,120, + 93,237,237,237,215,161,210,159,180,139,139,139,203,228,217,223,123,107,53,26,109,70,202,227,44,19,178,229,100,103,103,227,232,209,163,232,212,169,19,122, + 244,232,129,180,180,52,60,121,242,4,193,193,193,229,219,220,190,125,27,55,111,222,68,147,38,38,91,224,203,225,88,53,154,248,52,132,128,47,0,95, + 192,215,189,242,249,101,147,238,189,126,153,190,230,97,53,80,181,90,173,43,23,195,48,32,132,64,34,209,61,183,176,44,203,213,171,87,47,35,39,39, + 199,13,0,43,145,72,160,213,106,205,62,180,112,148,122,9,94,93,76,159,243,197,15,46,225,225,167,113,250,244,75,48,12,3,55,55,55,48,12,131, + 164,164,36,48,12,3,79,79,79,48,12,131,180,180,52,189,147,152,11,185,241,239,157,22,128,196,222,1,78,66,17,8,33,40,76,75,129,80,32,128, + 88,34,134,99,195,198,229,15,250,175,94,189,146,71,68,68,36,240,249,252,54,250,58,91,176,214,209,250,111,226,218,191,104,95,139,160,148,110,171,182, + 233,208,8,3,59,119,238,188,101,244,232,209,189,214,172,89,3,27,27,27,100,100,100,148,255,33,10,133,66,212,175,95,31,57,57,57,216,186,117,43, + 158,63,127,30,3,96,178,165,70,101,100,100,92,126,116,43,49,59,104,68,103,167,230,157,189,237,83,19,159,119,2,112,177,204,201,250,101,244,236,129, + 19,130,222,239,0,129,144,143,212,71,38,243,109,223,57,44,203,178,132,16,124,248,161,101,109,254,163,70,141,66,108,108,44,204,53,51,114,250,136,86, + 137,28,197,165,53,142,72,154,100,218,204,177,152,54,115,108,185,51,97,73,211,11,0,184,187,255,110,114,29,167,81,173,57,246,251,214,73,109,59,4, + 120,182,107,222,16,87,174,223,194,111,91,94,7,25,182,175,95,138,239,183,199,160,190,171,3,84,138,98,252,185,255,167,23,42,69,201,26,115,199,171, + 46,72,195,16,2,11,235,84,190,222,167,204,121,226,243,249,104,209,162,133,201,136,86,78,78,78,105,117,209,44,160,236,30,41,213,40,42,46,69,105, + 201,187,113,180,8,33,173,187,118,237,122,106,223,190,125,78,46,46,46,72,79,79,175,224,104,17,66,90,119,233,210,229,212,190,125,251,156,92,93,93, + 145,154,154,106,113,89,17,61,6,78,150,77,102,102,38,22,47,94,44,77,79,79,63,26,18,18,50,216,82,103,139,97,24,40,20,10,60,120,240,192, + 210,195,90,92,188,212,206,206,110,199,158,61,123,236,94,189,122,5,150,101,241,224,193,131,10,189,14,245,211,47,191,252,34,24,54,108,216,207,0,204, + 118,107,211,104,52,171,198,142,29,59,49,45,45,205,193,197,197,5,25,25,25,16,10,133,160,148,130,4,5,161,219,211,167,80,105,181,144,72,36,72, + 72,72,192,182,109,219,138,21,10,197,42,99,90,132,16,161,84,42,245,18,8,4,248,232,163,143,42,172,219,185,115,39,222,107,199,182,155,212,71,84, + 164,129,88,145,41,25,240,39,203,178,100,242,220,21,205,58,118,15,110,241,240,238,149,199,89,153,207,47,84,115,250,106,165,82,9,31,31,31,92,187, + 118,13,167,79,159,70,207,158,61,209,163,71,15,220,185,115,7,39,79,158,196,205,155,55,65,8,129,147,147,147,62,253,194,108,14,134,178,88,131,151, + 105,217,85,162,87,149,231,5,2,1,20,66,203,58,247,197,199,199,227,218,181,107,229,165,101,88,150,213,132,132,132,128,82,74,147,146,146,96,107,107, + 75,199,143,31,175,229,241,120,154,180,52,203,242,131,109,108,108,224,229,229,85,225,193,71,63,117,235,214,13,215,175,95,7,195,48,224,241,120,112,113, + 113,193,133,11,23,204,126,240,41,165,229,206,160,80,32,128,64,168,115,52,13,191,219,10,133,34,229,244,233,211,109,197,98,241,95,222,222,222,125,149, + 74,37,7,107,29,45,43,255,143,152,42,241,96,210,209,162,148,62,5,208,155,16,50,230,240,225,195,171,214,173,91,231,60,104,208,32,228,230,230,194, + 211,211,19,110,110,110,56,118,236,24,142,31,63,254,74,171,213,206,161,148,86,9,253,16,66,122,155,170,181,65,41,165,238,238,238,251,20,69,69,83, + 253,123,248,34,102,239,185,112,55,55,183,201,117,235,214,157,53,126,225,144,9,129,67,219,35,225,102,18,46,159,140,67,102,202,43,140,239,54,223,172, + 102,229,100,120,123,123,251,137,82,169,84,8,35,93,137,43,247,58,52,212,212,106,181,90,165,82,137,223,127,255,221,34,103,107,247,238,221,144,203,229, + 208,86,106,95,53,212,164,28,37,60,190,8,238,245,125,160,82,21,131,227,222,44,122,99,168,169,255,209,121,44,20,194,229,213,43,92,185,82,165,133, + 195,40,134,79,210,149,53,1,128,82,42,39,132,124,180,118,217,220,99,211,195,86,216,247,236,220,6,95,255,184,19,42,213,118,48,44,3,137,72,0, + 255,14,93,192,66,129,205,17,243,242,74,10,114,63,162,149,134,226,169,162,105,174,133,133,2,90,142,195,233,179,230,107,158,26,187,239,90,173,22,60, + 30,15,143,30,61,42,53,214,219,144,101,117,205,156,250,39,117,115,154,148,227,8,95,32,70,125,79,63,40,21,69,239,228,30,185,184,184,204,59,116, + 232,144,147,190,84,194,157,59,119,64,8,41,247,102,244,235,75,75,75,113,247,238,93,253,80,83,85,188,29,115,223,35,71,71,199,45,63,252,240,131, + 44,51,51,19,89,89,89,144,72,36,204,151,95,126,41,138,137,137,217,12,160,133,37,118,202,229,242,103,166,242,39,229,114,121,93,98,51,59,186,0, + 0,32,0,73,68,65,84,177,88,204,175,180,175,187,151,151,87,66,229,38,68,99,118,230,231,231,95,249,226,139,47,252,251,247,239,143,121,243,230,229, + 56,56,56,216,110,222,188,153,199,178,44,153,62,125,186,246,229,203,151,69,63,253,244,147,221,225,195,135,145,151,151,87,197,49,52,242,249,44,36,132, + 76,234,220,185,243,206,19,39,78,72,189,188,188,80,80,80,0,74,41,118,236,216,129,233,211,167,67,44,22,35,33,33,1,239,189,247,94,73,73,73, + 201,164,202,185,147,6,154,132,16,66,57,142,195,87,95,125,85,94,156,84,95,172,212,86,66,176,109,118,35,89,232,79,249,178,49,95,255,20,2,0, + 90,141,70,251,240,238,149,199,59,54,124,125,70,32,16,156,53,101,103,25,139,66,67,67,55,7,7,7,75,108,108,108,144,147,147,131,11,23,46,224, + 210,165,75,184,124,249,50,148,74,37,156,156,156,224,224,224,128,140,140,12,196,199,199,151,2,88,100,78,83,40,227,163,177,183,190,231,239,235,104,86, + 249,188,128,15,62,239,117,207,195,234,174,39,0,116,239,222,29,29,59,118,4,160,235,69,157,156,156,156,161,80,40,136,129,211,159,6,232,28,114,15, + 15,15,205,174,93,187,104,117,154,28,199,85,113,166,187,117,235,86,254,80,216,177,99,71,176,44,139,91,183,110,25,77,77,49,212,20,105,213,236,229, + 159,54,226,230,238,157,176,175,91,15,19,162,254,6,195,48,144,231,188,194,225,241,195,32,181,179,67,253,46,175,91,178,229,114,121,63,66,72,115,0, + 217,148,210,23,198,52,223,21,86,205,119,95,75,235,63,149,202,57,90,134,84,219,4,64,41,253,141,16,242,231,167,159,126,26,209,186,117,235,79,87, + 175,94,77,4,2,1,150,44,89,66,211,211,211,127,5,48,143,154,25,218,164,26,237,95,255,62,120,113,202,184,176,161,100,246,154,241,93,175,71,223, + 141,111,217,217,11,45,59,123,225,122,204,125,108,88,184,123,151,86,173,253,42,35,35,35,165,26,41,69,239,46,222,149,147,225,157,98,207,68,59,213, + 180,215,33,199,113,251,118,239,222,61,243,253,247,223,103,174,94,189,90,37,39,139,150,13,187,195,113,28,78,157,58,5,149,74,133,95,127,253,149,227, + 56,206,116,29,45,208,35,107,215,68,140,251,53,242,136,80,40,32,184,116,246,0,242,115,205,71,233,4,2,62,126,217,113,80,37,16,240,31,26,91, + 175,82,169,82,163,163,163,93,251,105,181,124,134,97,170,56,80,166,216,183,111,159,154,227,184,100,115,219,80,74,47,18,194,31,252,221,188,143,119,7, + 127,240,169,107,231,206,93,249,181,93,92,65,8,193,203,204,151,72,184,123,85,253,231,129,159,51,139,75,10,45,26,130,231,227,31,254,46,207,201,2, + 128,65,211,215,149,231,103,1,192,224,241,95,32,168,83,115,16,75,66,79,101,104,181,90,78,163,209,64,38,147,65,163,209,24,45,241,96,103,103,39, + 145,203,229,165,84,87,136,209,252,19,51,240,206,239,145,86,171,245,205,205,205,69,113,113,49,46,93,186,68,151,45,91,150,149,149,149,85,158,180,169, + 86,171,125,115,114,114,80,84,84,132,139,23,47,210,136,136,136,172,236,236,108,115,73,157,85,200,201,201,249,108,238,220,185,81,139,23,47,150,74,36, + 18,70,173,86,107,66,67,67,75,21,10,133,101,197,216,0,164,167,167,87,41,230,170,167,73,147,38,137,137,137,137,77,181,90,173,225,24,136,2,185, + 92,238,213,185,115,103,75,154,16,67,183,111,223,142,131,7,15,118,40,40,40,24,155,156,156,188,19,64,7,30,143,135,91,183,110,61,144,203,229,163, + 223,127,255,253,29,185,185,185,87,0,132,90,98,47,165,244,4,33,228,35,95,95,223,237,223,124,243,141,77,143,30,61,120,238,238,238,104,223,190,61, + 18,18,18,16,21,21,165,222,180,105,83,113,73,73,201,199,148,82,115,205,218,20,0,209,104,52,16,10,133,229,147,72,36,130,64,32,64,97,41,197, + 39,63,62,41,213,64,82,186,106,201,164,40,10,144,23,169,79,94,189,124,145,122,133,16,114,54,61,61,221,232,16,60,77,154,52,17,202,229,242,54, + 110,110,110,60,66,200,26,149,74,53,97,198,140,25,117,150,47,95,14,111,111,111,188,122,245,10,50,153,12,94,94,94,200,202,202,194,213,171,87,181, + 37,37,37,91,0,44,165,148,154,109,142,204,203,42,64,61,87,143,10,145,79,74,41,168,6,80,107,181,208,170,40,148,68,13,62,95,13,129,192,72, + 69,221,74,232,29,205,92,55,55,112,119,239,226,242,229,203,160,148,154,140,170,249,248,248,84,171,201,48,12,180,90,109,21,71,235,202,149,43,96,89, + 22,93,187,118,197,205,155,55,203,35,90,213,229,37,242,0,200,115,179,81,148,241,28,98,169,4,142,13,27,235,154,16,249,60,40,178,50,193,106,84, + 80,23,84,76,109,161,148,222,51,174,102,197,202,63,15,242,6,67,240,24,110,156,7,96,50,33,100,103,96,96,224,49,74,41,31,64,48,165,244,220, + 219,24,149,145,145,113,195,221,221,125,129,107,61,135,136,1,99,187,194,187,141,39,180,26,45,46,28,191,133,95,151,31,222,147,150,154,54,158,90,208, + 166,196,113,220,153,46,237,188,25,24,212,234,118,119,119,231,222,164,215,97,126,126,254,226,57,115,230,96,222,188,121,53,238,117,104,106,155,59,15,94, + 78,110,237,235,92,111,240,128,110,253,64,24,170,84,154,110,62,36,4,229,149,75,5,2,254,195,171,183,211,91,25,219,46,43,43,171,223,132,9,19, + 78,241,120,60,139,147,152,1,221,32,179,153,153,153,189,170,219,142,82,245,5,66,136,215,209,61,91,63,63,113,112,123,63,142,211,54,33,0,88,158, + 224,177,90,165,250,75,81,90,176,186,114,36,203,20,43,39,7,32,116,237,73,108,156,55,24,51,34,246,226,231,175,62,193,130,31,119,99,197,188,80, + 44,91,247,15,124,29,250,17,70,140,153,192,81,194,24,29,30,198,24,44,203,158,216,186,117,235,184,79,62,249,164,188,211,130,190,121,65,63,169,213, + 234,82,142,227,176,101,203,22,14,192,9,115,122,21,239,17,161,230,242,165,44,189,71,5,5,5,31,7,4,4,236,0,32,162,148,62,202,205,205,253, + 140,82,90,62,52,84,81,81,209,199,157,59,119,222,65,41,21,17,66,170,172,183,132,178,82,15,193,233,233,233,71,191,252,242,75,81,104,104,104,233, + 181,107,215,134,212,52,33,222,12,172,153,102,197,106,155,16,203,190,191,229,195,234,16,66,150,119,232,208,193,112,80,233,7,0,170,29,224,220,136,238, + 41,66,72,243,175,190,250,234,115,177,88,28,84,82,82,210,12,0,100,50,89,130,66,161,56,83,90,90,186,186,236,119,203,156,134,82,42,149,38,104, + 52,154,22,206,206,206,186,30,181,101,206,22,0,252,113,93,123,157,82,77,141,19,169,143,31,63,222,192,193,193,161,47,33,100,4,165,212,167,176,176, + 80,241,229,151,95,94,58,120,240,96,158,167,167,231,128,224,224,96,226,232,232,136,107,215,174,209,236,236,236,3,0,22,90,210,211,154,227,184,228,149, + 43,107,54,118,97,117,15,85,42,149,234,197,241,227,199,107,247,127,249,146,199,113,28,6,15,30,92,190,206,152,3,244,240,225,67,40,20,138,106,139, + 57,230,229,229,161,67,135,14,21,30,80,245,83,114,114,50,28,29,29,43,28,199,220,51,150,74,165,164,98,169,12,1,19,38,65,98,239,160,75,244, + 39,4,146,90,118,104,210,179,175,46,141,128,123,163,161,56,173,88,121,167,152,138,104,145,127,74,247,103,189,184,133,161,69,119,119,247,15,197,50,209, + 52,207,102,110,173,210,159,188,188,95,152,95,178,43,35,35,99,43,165,180,202,183,199,82,205,154,20,44,253,79,9,171,254,39,106,190,174,163,165,5, + 165,90,80,142,130,82,14,28,167,213,13,120,77,57,80,173,150,16,130,243,138,146,124,147,149,193,43,219,73,8,113,168,93,187,246,82,74,105,127,150, + 101,25,195,31,106,195,247,101,145,172,19,89,89,89,95,87,142,188,254,39,94,207,253,251,247,27,117,254,67,66,66,58,139,68,162,205,10,133,98,138, + 57,39,107,196,136,17,218,154,216,233,238,238,126,70,38,147,25,77,40,46,46,46,78,73,79,79,239,107,204,206,119,133,165,154,250,104,168,185,222,107, + 198,52,223,164,215,97,117,154,13,26,52,16,169,84,170,182,0,154,1,176,7,144,163,86,171,79,100,101,101,101,18,66,218,1,248,170,108,183,111,41, + 165,215,45,209,124,87,24,249,30,73,106,215,174,189,157,97,152,106,7,60,7,0,141,70,163,204,201,201,25,103,248,64,80,65,147,16,86,44,16,92, + 5,195,212,53,88,143,234,222,131,210,180,226,210,255,99,239,188,227,162,56,183,62,254,123,102,123,163,45,125,105,10,136,130,98,33,54,236,189,247,40, + 198,216,99,98,114,53,106,212,68,52,26,107,212,196,94,146,168,177,27,187,24,21,187,162,38,209,88,177,160,216,104,130,128,176,212,5,182,239,206,243, + 254,65,9,34,101,49,201,123,239,205,221,239,231,179,238,204,236,204,111,206,204,226,238,217,243,156,231,28,77,75,148,124,230,151,106,18,66,36,182,82, + 105,90,203,160,6,148,207,231,131,50,12,213,113,249,44,33,4,12,165,16,153,13,12,64,160,214,106,241,32,241,197,35,165,82,89,101,29,180,255,198, + 255,239,255,107,154,255,84,44,138,104,253,221,164,165,165,29,0,80,117,134,246,91,80,85,229,119,43,255,191,20,229,164,255,45,239,67,137,211,84,101, + 147,232,127,42,165,142,82,37,219,127,5,96,81,97,206,218,96,97,25,135,127,59,150,56,88,85,28,119,3,22,20,41,173,13,73,73,73,58,0,215, + 74,30,21,207,119,27,64,255,55,14,250,55,65,41,213,0,248,235,170,125,82,106,214,22,55,255,253,139,228,168,154,16,162,56,127,243,118,149,117,182, + 202,241,151,182,77,177,98,229,175,226,63,194,209,178,98,197,138,21,43,86,42,131,82,170,254,119,219,96,197,202,159,129,0,232,86,217,11,181,9,9, + 18,66,42,213,168,142,154,244,173,154,86,77,171,166,85,211,170,105,213,180,106,254,243,52,255,137,84,55,235,240,63,34,71,203,170,105,213,180,106,90, + 53,173,154,86,77,171,230,255,182,230,127,51,21,103,28,2,181,156,117,104,197,138,21,43,86,172,88,177,98,165,106,170,138,104,213,220,155,164,4,153, + 91,80,144,115,157,166,59,229,94,77,238,203,189,154,220,119,174,211,116,167,204,45,232,47,79,190,253,111,128,16,34,38,132,188,207,227,241,206,187,187, + 187,171,8,33,149,182,222,249,111,135,16,98,75,8,25,74,8,89,68,8,25,76,8,145,252,149,250,157,8,225,190,71,200,164,49,132,36,143,33,36, + 249,61,66,38,117,34,228,31,231,252,47,156,170,8,253,245,204,200,211,11,167,42,66,43,125,125,166,194,241,198,249,176,117,203,38,123,200,43,123,189, + 182,16,66,108,92,93,93,183,184,185,185,37,185,186,186,190,112,117,117,221,78,8,177,251,43,180,173,88,177,98,197,202,155,84,229,100,1,37,17,173, + 147,39,79,118,4,112,25,64,167,190,125,251,94,169,184,147,220,167,241,132,160,192,6,159,47,89,240,37,113,118,114,16,27,141,102,67,202,203,244,134, + 243,151,44,59,44,247,105,188,58,231,197,131,173,181,53,138,16,66,56,28,206,112,161,80,216,15,127,204,150,138,213,233,116,145,102,179,249,128,165,179, + 136,220,220,220,126,225,112,56,117,106,115,110,179,217,156,252,234,213,171,170,171,150,86,3,33,100,152,183,183,247,246,142,29,59,74,90,182,108,9,129, + 64,128,121,243,230,205,0,176,198,82,13,185,220,223,198,32,20,77,227,10,4,221,169,81,31,76,65,1,70,24,195,154,116,23,249,58,221,234,156,156, + 184,130,154,85,0,66,200,28,0,99,81,60,29,125,43,165,180,118,69,118,42,48,54,132,24,141,230,226,191,9,62,23,102,59,59,187,203,95,126,249, + 37,183,95,191,126,216,186,117,107,187,45,91,182,124,68,8,185,8,224,56,165,52,238,207,156,11,0,92,129,137,109,218,181,91,55,102,198,12,142,230, + 151,95,176,110,251,246,181,80,169,0,224,187,218,232,16,66,8,159,143,161,78,78,188,126,148,34,132,0,132,0,119,149,217,236,41,131,193,124,192,146, + 90,108,213,104,191,143,215,167,227,239,173,173,70,126,28,157,43,236,31,212,62,63,238,210,92,0,189,43,190,110,210,138,198,80,142,87,63,13,141,78, + 1,176,234,109,109,45,177,87,226,236,236,124,255,216,177,99,158,45,91,182,228,2,192,237,219,183,71,247,235,215,175,11,33,36,152,82,170,250,51,250, + 127,194,46,17,151,97,38,9,120,188,238,102,179,185,49,0,112,56,156,7,122,163,241,188,137,101,191,179,180,38,155,21,43,86,254,185,212,228,139,252, + 39,83,49,71,171,252,122,105,244,224,114,223,190,125,201,201,147,39,41,254,168,37,3,0,144,185,6,54,108,212,40,104,198,153,163,187,188,242,115,242, + 180,27,86,237,142,46,228,240,139,234,7,5,8,54,172,89,97,63,105,234,244,105,50,215,192,27,133,25,143,31,213,194,32,111,177,88,28,177,114,229, + 202,224,206,157,59,243,92,92,92,144,145,145,129,216,216,216,224,168,168,168,65,187,118,237,154,65,8,25,66,41,173,169,34,60,0,4,92,220,189,221, + 69,42,119,132,217,104,132,162,73,72,89,161,189,231,81,231,96,50,24,192,26,141,8,234,55,8,64,113,113,188,160,160,32,203,154,2,190,105,183,162, + 81,163,70,123,150,46,93,202,215,233,116,184,113,227,6,46,93,186,196,166,167,167,47,183,84,67,230,90,191,51,35,150,30,24,62,242,67,187,129,253, + 124,121,222,174,206,0,36,120,146,104,106,115,250,92,84,139,163,7,118,252,75,230,90,127,120,97,198,211,75,213,233,200,229,242,214,132,144,175,75,43, + 68,19,66,190,173,91,183,238,87,229,247,169,216,55,143,82,10,46,151,155,81,80,80,48,60,43,43,43,186,162,166,209,12,238,222,189,197,126,196,220, + 73,239,115,126,251,237,55,105,195,134,13,117,0,176,98,197,10,44,90,180,72,112,246,236,217,62,187,119,239,238,67,8,89,75,41,61,110,233,117,87, + 6,31,248,98,204,140,25,28,89,82,18,100,247,238,97,164,74,197,253,6,248,2,181,112,180,8,33,190,110,110,188,195,51,166,143,11,242,243,111,205, + 231,243,157,138,155,120,235,179,234,39,39,71,15,93,254,205,150,112,66,200,187,148,82,139,42,214,146,226,136,218,66,0,34,0,115,1,204,83,42,149, + 1,102,179,25,110,110,110,243,8,33,63,3,88,226,236,236,76,149,74,229,44,74,105,149,189,122,22,78,85,132,170,226,232,220,87,196,175,87,131,119, + 198,224,21,57,211,107,122,111,247,211,182,254,100,201,252,117,105,191,3,64,111,127,127,27,191,64,233,44,153,109,99,185,42,245,194,172,222,254,254,63, + 158,142,179,204,209,174,96,55,1,0,133,66,177,98,247,238,221,94,173,90,181,42,251,27,111,214,172,25,103,197,138,21,30,159,125,246,217,90,0,227, + 44,212,171,239,236,236,124,214,108,54,235,178,179,179,235,151,110,119,105,58,164,141,163,141,180,171,50,183,224,151,172,135,63,95,177,80,171,165,136,207, + 63,114,124,207,58,247,102,173,66,25,153,147,11,180,169,105,40,52,26,186,93,186,122,189,211,71,147,190,152,90,242,30,85,223,135,201,138,21,43,255, + 116,170,244,69,254,155,41,27,166,41,185,176,55,16,10,5,225,243,191,156,69,242,178,243,52,186,130,66,189,73,171,213,48,60,86,123,63,54,33,147, + 225,114,242,166,79,153,98,51,107,206,151,225,0,70,86,118,124,69,8,33,222,77,155,54,189,25,17,17,225,34,151,203,145,159,159,143,236,236,108,220, + 188,121,19,148,82,12,25,50,68,216,170,69,139,144,185,243,230,253,78,8,9,181,196,217,146,202,157,176,162,93,113,47,218,175,146,178,75,207,131,45, + 195,250,149,237,179,232,101,113,183,12,145,72,84,214,144,248,45,8,237,218,181,43,31,0,62,248,224,3,85,65,65,193,50,0,123,41,165,22,117,90, + 149,185,214,239,236,228,174,136,252,97,211,10,113,99,255,0,24,140,38,188,120,149,6,46,207,30,158,158,124,140,27,217,157,215,161,141,220,233,235,197, + 91,78,74,157,235,15,46,82,62,61,91,149,150,189,189,253,174,3,7,14,224,224,193,131,0,128,167,79,159,34,32,32,64,90,147,13,49,49,49,126, + 3,6,12,216,15,160,94,77,251,86,44,140,47,20,10,209,182,109,91,52,108,216,16,199,142,29,235,4,224,79,57,90,0,160,249,229,23,200,238,221, + 3,174,92,169,245,177,132,16,223,119,222,241,185,126,234,228,30,167,147,167,98,177,106,213,118,196,197,21,7,218,252,252,252,240,254,136,97,188,7,15, + 174,53,26,58,244,253,107,132,144,118,148,210,167,22,200,46,252,241,199,31,231,212,173,91,23,67,135,14,29,214,168,81,35,55,91,91,91,108,222,188, + 25,238,238,238,126,122,189,254,249,177,99,199,20,175,94,189,194,148,41,83,0,96,70,85,66,157,122,118,154,43,236,31,212,190,193,59,99,32,179,117, + 199,143,251,14,224,201,157,93,237,117,134,216,185,203,38,123,140,210,80,225,88,207,0,155,240,58,205,59,58,214,107,52,0,62,239,68,59,105,205,191, + 38,204,155,228,183,156,43,210,238,154,191,50,45,251,141,107,30,118,152,19,172,122,44,143,57,143,108,74,231,179,37,14,86,217,7,146,153,98,64,135, + 14,29,202,222,184,164,164,36,232,116,58,4,5,5,49,122,189,222,162,154,88,132,144,250,61,122,244,248,237,212,169,83,142,245,235,215,127,173,37,140, + 155,163,125,207,43,17,107,167,124,189,238,167,64,151,134,131,243,50,31,29,125,80,131,86,203,182,173,223,185,112,58,98,143,140,20,166,64,96,159,5, + 176,217,136,223,191,13,68,34,199,240,79,166,115,59,119,237,226,209,189,247,187,23,8,33,93,41,165,183,44,177,209,138,21,43,255,76,170,242,69,254, + 11,56,89,33,33,254,100,233,66,153,163,85,206,139,124,13,150,178,77,220,92,28,197,107,87,238,188,197,49,232,245,18,123,91,131,157,173,29,133,141, + 45,199,96,52,20,122,7,212,229,179,148,173,180,5,73,197,25,9,132,16,34,22,139,35,142,31,63,238,194,227,241,192,178,44,156,157,157,145,152,152, + 136,188,188,60,20,20,20,32,46,54,22,117,189,189,176,32,124,150,251,148,89,225,17,132,144,230,229,135,17,43,155,229,96,54,190,222,55,154,148,180, + 96,169,72,233,182,138,175,213,98,230,68,98,114,114,50,100,50,25,130,131,131,101,87,175,94,253,181,42,39,171,162,166,92,238,111,195,149,137,15,126, + 255,195,60,177,193,24,131,71,241,57,104,80,183,61,92,29,189,145,150,163,199,245,155,199,17,115,127,47,252,61,188,49,249,147,46,162,229,43,14,31, + 112,112,240,245,206,205,77,80,85,166,169,82,169,100,190,190,190,240,246,46,238,123,102,54,155,241,232,209,35,152,205,230,178,245,242,207,59,143,68,193, + 164,122,129,49,163,71,35,59,59,91,86,153,38,143,3,211,244,143,222,231,138,121,128,64,42,215,23,22,22,150,69,7,13,6,3,238,222,189,139,94, + 189,122,181,236,219,183,111,10,128,42,191,96,45,189,159,6,224,219,117,59,118,172,31,153,159,207,0,192,86,66,88,3,165,223,90,162,73,8,33,46, + 46,188,35,103,78,239,118,226,48,143,33,183,251,6,55,111,190,128,193,80,108,111,118,118,38,62,157,164,2,159,103,131,99,199,126,114,12,10,106,119, + 164,100,232,140,173,74,179,4,209,233,211,167,241,233,167,159,226,209,163,71,138,210,30,109,98,177,24,43,87,174,228,4,5,5,41,164,82,41,206,156, + 57,131,140,140,140,55,254,200,202,107,94,62,123,121,73,126,220,165,185,175,200,153,94,63,238,59,128,15,71,12,135,27,141,255,213,206,159,44,233,209, + 191,237,87,148,227,213,79,106,211,196,33,32,184,63,248,2,25,38,127,177,8,79,99,78,56,168,11,238,79,34,230,20,47,148,244,254,43,175,73,15, + 13,53,175,223,119,237,157,243,222,183,124,20,239,76,188,1,224,62,202,28,45,63,46,97,204,118,37,199,224,249,243,231,136,139,139,3,151,203,133,70, + 163,129,201,100,170,212,78,15,15,143,137,38,147,233,43,0,48,24,12,59,221,221,221,199,239,217,179,199,177,188,163,93,26,201,202,201,83,229,94,187, + 245,240,201,244,137,67,59,253,114,61,38,197,190,233,160,228,188,123,63,231,87,241,30,137,196,2,193,145,51,71,127,146,25,19,162,32,13,234,4,158, + 44,0,102,99,42,212,185,69,40,136,75,135,238,135,141,104,54,233,51,156,248,249,176,172,81,227,230,135,8,33,1,148,210,178,254,71,127,199,172,38, + 171,166,85,211,170,249,159,169,9,84,237,139,160,184,16,174,107,201,114,54,138,83,102,156,0,100,161,184,29,152,43,0,61,0,65,185,99,42,174,151, + 223,183,226,122,249,229,236,146,101,151,146,231,91,0,114,170,179,155,82,154,14,224,237,154,74,19,194,168,76,44,43,20,56,59,235,198,135,117,11,62, + 119,225,246,93,169,163,29,183,71,231,119,58,222,124,16,247,59,3,198,72,8,99,81,222,7,135,195,25,190,118,237,218,198,182,182,182,96,89,22,118, + 118,118,80,42,149,208,235,245,200,207,207,135,174,64,5,67,129,10,247,82,146,208,182,99,39,188,219,171,71,208,79,63,31,31,14,96,127,117,186,138, + 38,33,101,145,172,69,117,28,203,182,47,76,201,43,115,186,190,9,9,0,95,38,67,247,233,225,150,152,90,41,148,210,104,129,64,112,122,200,144,33, + 189,103,206,156,201,164,167,167,159,33,132,180,165,148,214,56,108,106,16,138,166,253,107,90,63,7,7,25,197,161,243,199,209,33,100,4,36,2,14,178, + 85,6,16,2,196,62,140,0,33,114,220,127,154,142,246,205,108,209,163,103,144,236,231,195,177,51,241,71,126,80,69,72,110,110,46,50,51,51,97,52, + 26,97,52,26,49,116,216,48,236,222,181,11,69,69,69,208,104,52,208,235,245,48,155,205,96,24,6,231,35,15,33,37,33,22,109,66,67,129,42,66, + 178,59,163,41,143,16,114,253,201,147,39,136,141,141,197,203,151,47,33,18,137,224,230,230,134,69,139,22,65,167,211,65,175,215,243,46,95,190,236,141, + 226,246,34,127,138,56,96,75,130,201,52,183,247,209,163,46,87,143,30,101,127,63,126,252,165,168,176,112,179,37,199,242,249,24,186,226,219,79,26,72, + 165,82,188,76,94,139,192,64,62,102,124,230,136,101,223,100,1,0,166,124,234,137,22,205,157,160,202,59,12,39,151,57,88,191,126,170,255,216,177,171, + 71,3,216,89,131,244,220,227,199,143,191,27,16,16,224,17,29,29,77,4,2,1,196,98,49,196,98,49,68,34,17,50,51,51,145,152,152,72,87,172, + 88,145,138,226,161,197,42,41,25,30,236,61,189,183,251,233,39,119,118,181,247,224,36,220,123,119,114,187,164,251,215,163,11,206,157,191,186,216,164,21, + 165,228,189,188,48,203,183,69,180,211,164,207,23,98,227,138,249,120,114,227,151,28,87,111,213,119,98,162,219,217,170,251,155,154,157,58,45,228,78,154, + 23,102,154,56,246,93,251,19,174,215,38,158,226,18,229,171,172,59,43,145,24,173,17,214,11,25,85,223,143,209,71,69,69,137,59,116,232,0,173,182, + 56,237,137,195,225,96,207,158,61,172,201,100,170,116,56,218,96,48,124,149,154,154,234,174,209,104,208,171,87,175,41,43,87,174,148,150,246,251,51,155, + 139,11,209,151,70,178,150,172,217,125,118,218,87,223,93,58,187,255,27,197,146,240,241,157,70,78,254,250,18,170,232,35,201,101,152,73,39,142,110,119, + 19,57,24,33,150,247,128,54,67,131,39,91,62,132,90,165,69,139,37,11,1,8,160,55,50,216,220,127,40,120,142,10,204,159,48,94,241,229,230,31, + 63,1,176,182,134,247,200,138,21,43,255,123,184,18,66,34,1,32,60,60,124,206,178,101,203,30,18,66,34,41,165,253,0,160,116,185,116,31,0,168, + 108,189,116,223,138,235,21,151,103,207,158,221,104,249,242,229,75,67,67,67,247,95,187,118,45,1,53,56,90,213,229,104,49,64,177,7,89,254,185,60, + 44,203,254,242,60,62,73,221,179,123,107,143,19,151,31,220,30,55,174,111,215,176,1,237,123,36,164,100,62,246,247,113,115,138,121,120,207,150,101,217, + 95,44,185,75,66,161,176,95,151,46,93,184,185,185,185,144,72,36,80,42,149,72,77,77,133,193,96,128,54,63,15,186,252,60,104,243,114,97,200,207, + 69,220,237,155,104,226,239,39,44,73,150,175,150,210,168,75,197,72,85,249,200,150,192,198,6,66,27,27,144,90,14,27,18,66,6,58,56,56,92,39, + 132,204,5,0,131,193,48,105,214,172,89,89,44,203,226,235,175,191,182,149,201,100,135,8,33,194,154,116,108,156,57,253,66,155,5,51,143,19,239,163, + 93,211,49,168,239,219,7,137,25,26,100,21,24,144,153,103,64,139,14,27,80,167,233,66,120,53,91,134,216,23,57,80,120,4,48,224,10,171,109,254, + 156,146,146,242,218,250,254,125,251,160,86,171,225,239,239,143,17,35,70,96,214,172,89,24,49,98,4,20,10,5,70,134,13,192,252,249,243,241,234,213, + 171,154,76,213,213,175,95,95,231,227,227,163,243,241,241,209,25,12,6,20,22,22,34,47,175,184,63,47,143,199,163,145,145,145,2,137,68,18,74,8, + 121,183,38,177,242,184,186,186,206,118,119,119,191,239,234,234,250,80,36,18,157,186,75,200,99,93,157,58,174,109,7,13,34,13,195,194,56,201,18,9, + 185,2,200,106,20,2,224,36,231,245,237,220,165,183,32,47,119,59,128,226,32,213,248,113,206,248,237,74,35,92,253,181,57,62,157,228,15,194,136,64, + 24,1,212,69,81,104,213,50,148,111,111,79,170,253,91,42,73,124,191,219,182,109,91,197,228,201,147,137,80,40,196,148,41,83,12,19,38,76,120,54, + 98,196,136,103,23,47,94,52,251,248,248,192,203,203,139,120,121,121,185,3,184,91,114,76,181,216,250,147,37,58,67,236,175,246,1,210,4,51,156,218, + 20,26,133,67,231,175,76,203,94,252,93,252,170,196,39,106,191,39,55,126,201,126,22,115,130,77,188,117,57,43,237,89,129,223,226,239,226,87,205,222, + 152,90,233,127,234,43,87,192,70,68,94,49,168,139,212,220,65,253,59,171,39,126,48,188,190,92,214,104,15,60,122,52,173,227,237,57,114,254,210,245, + 134,9,159,76,51,108,221,182,157,22,20,20,64,165,82,97,253,250,245,166,19,39,78,164,154,205,230,105,85,152,200,1,0,163,209,136,137,19,39,74, + 109,109,109,145,146,146,82,22,17,5,128,116,101,246,131,171,183,98,30,79,255,120,88,199,34,157,78,119,246,242,237,216,134,1,62,158,132,208,42,39, + 162,8,120,188,238,205,91,181,226,80,154,7,194,245,70,220,174,21,80,189,202,129,42,51,7,28,158,20,38,8,97,100,5,176,111,210,18,79,111,69, + 195,195,217,149,43,228,241,172,173,179,172,88,249,31,165,58,95,164,20,74,105,191,229,203,151,47,173,238,245,114,207,250,10,235,101,142,84,69,39,172, + 252,50,0,44,95,190,124,41,165,180,223,181,107,215,246,161,22,237,157,42,171,167,85,163,215,193,209,234,151,205,156,53,23,118,182,98,187,86,33,1, + 110,63,159,185,124,231,151,107,183,99,235,120,58,57,83,163,222,225,219,213,27,61,137,90,99,105,50,120,144,147,147,19,12,6,3,158,63,127,142,151, + 47,95,194,96,48,192,84,84,4,93,94,30,180,185,185,48,23,21,128,111,54,67,163,204,132,163,68,4,88,216,191,173,178,225,194,242,67,133,34,91, + 91,8,109,108,193,240,120,149,14,43,86,161,249,78,203,150,45,15,198,196,196,180,234,214,173,219,98,66,136,29,165,244,69,106,106,106,215,121,243,230, + 233,92,93,93,49,113,226,196,6,0,198,212,164,37,20,232,131,124,220,26,160,190,223,24,212,241,234,130,188,34,35,148,42,35,50,243,12,216,188,33, + 20,71,182,182,196,111,71,218,35,230,108,119,228,25,221,32,83,12,4,53,235,27,85,167,121,254,252,121,44,90,180,8,139,23,47,198,215,95,127,141, + 197,139,23,35,53,53,21,193,193,193,72,78,78,198,233,211,167,145,158,158,14,39,39,39,220,188,121,19,107,214,172,193,111,191,253,86,227,117,87,55, + 225,147,203,229,18,127,127,127,18,17,17,33,145,72,36,107,9,169,222,121,41,143,201,100,26,155,62,104,80,227,12,185,188,97,72,72,72,239,41,83, + 166,248,181,109,219,182,236,117,95,95,95,111,177,88,252,138,16,178,149,16,210,172,58,45,22,8,113,118,14,134,94,247,24,0,64,8,15,132,136,208, + 165,123,44,218,182,191,13,131,145,15,134,8,193,48,34,152,76,217,112,112,80,128,82,18,92,131,137,243,148,74,101,192,133,11,23,152,196,196,68,136, + 68,34,0,72,90,176,96,193,198,85,171,86,61,114,116,116,52,71,70,70,226,231,159,127,70,191,126,253,56,19,38,76,8,240,242,242,218,84,211,117, + 207,95,151,246,251,222,213,167,223,227,25,29,154,137,196,117,234,162,72,54,112,82,39,103,41,0,156,142,139,43,112,241,86,45,47,42,184,159,108,239, + 89,248,77,77,137,240,148,206,103,239,60,123,124,125,239,209,51,249,153,25,185,188,144,198,141,52,203,22,125,206,175,83,183,222,183,243,103,125,236,150, + 170,18,229,117,159,114,250,113,196,153,155,133,163,198,125,104,250,224,163,201,218,211,103,206,31,101,89,182,113,85,51,14,89,150,69,122,122,58,30,62, + 124,136,248,248,120,40,149,74,100,101,101,161,160,160,160,108,184,81,82,160,58,185,113,199,137,123,82,177,88,210,170,113,128,247,141,232,71,153,82,177, + 88,18,80,215,187,62,33,11,43,253,28,49,155,205,141,69,18,49,0,130,188,152,95,80,152,91,136,194,188,66,20,228,20,66,103,224,64,171,99,160, + 209,51,240,233,216,3,133,69,90,20,102,231,131,53,155,155,214,116,63,173,88,177,242,191,11,33,36,50,60,60,124,142,133,187,91,60,188,89,209,241, + 10,15,15,159,67,8,137,156,61,123,118,35,88,144,211,92,98,219,71,229,159,75,169,177,188,67,86,214,211,66,91,231,134,67,62,251,226,171,211,251, + 182,125,231,172,215,107,146,157,28,100,102,27,137,208,97,194,196,175,81,80,152,59,184,208,194,114,4,0,144,155,155,139,132,132,4,136,197,98,240,121, + 60,152,53,26,152,53,69,208,228,102,131,49,232,192,55,155,33,151,136,225,163,112,67,29,87,55,139,52,159,71,157,43,75,124,47,63,92,184,162,101, + 16,4,82,25,4,54,50,252,43,242,50,0,128,207,231,3,243,22,215,168,73,8,113,242,240,240,56,190,119,239,94,190,82,169,196,221,187,119,239,81, + 74,243,9,33,54,0,216,216,216,216,11,49,49,49,253,2,2,2,0,192,191,38,61,85,22,99,54,154,40,82,94,37,33,241,101,52,228,118,190,224, + 73,234,35,51,207,0,161,216,23,70,221,31,163,143,90,213,11,104,12,150,77,140,212,235,245,48,153,76,48,153,76,208,235,245,248,232,163,143,112,245, + 218,53,236,255,249,34,18,226,158,162,65,93,55,140,30,61,10,45,91,182,196,181,107,111,244,184,125,141,177,33,196,248,101,7,112,87,247,102,32,144, + 57,234,90,207,58,123,163,138,123,131,58,117,234,48,231,207,159,119,238,222,189,251,38,66,136,158,82,122,190,58,109,66,200,170,126,253,250,213,123,90, + 84,132,135,143,31,163,219,130,5,0,128,147,39,203,242,5,161,215,235,49,125,250,116,193,163,71,143,62,184,125,251,246,7,132,144,213,148,210,202,147, + 205,41,112,242,228,239,248,248,227,71,80,42,139,243,181,15,236,251,195,47,77,76,48,160,87,223,226,17,45,123,123,123,172,94,93,147,143,85,140,217, + 108,198,150,45,91,202,134,11,1,128,203,229,182,157,62,125,250,144,202,246,175,87,175,30,191,38,205,233,195,60,69,119,95,136,39,217,213,171,211,200, + 214,169,9,178,141,209,193,209,169,233,159,78,31,230,185,118,245,161,151,90,49,209,237,36,230,20,47,174,72,187,203,18,27,227,78,175,215,219,215,25, + 183,235,149,82,245,229,228,15,223,119,180,181,119,41,218,186,113,153,3,195,97,232,241,219,134,188,70,126,142,246,3,91,175,43,252,248,179,121,209,122, + 83,202,100,164,28,127,90,93,137,11,179,217,140,180,180,52,40,149,74,36,39,39,35,43,171,120,248,53,43,43,235,141,153,171,181,129,16,2,77,114, + 50,94,28,221,138,58,163,70,161,197,226,69,48,179,92,104,212,102,172,110,211,21,185,249,26,232,88,2,197,59,109,240,225,169,95,193,80,51,176,185, + 86,149,61,172,88,177,242,15,194,146,242,14,165,14,209,178,101,203,44,254,145,111,41,229,157,173,101,203,150,61,92,182,108,153,197,231,170,177,142,22, + 106,152,82,169,82,62,138,119,244,105,146,86,164,41,148,184,184,58,233,101,34,33,155,175,42,226,68,63,184,103,40,76,127,254,164,22,215,17,27,19, + 19,19,156,150,150,134,228,23,47,96,210,20,129,209,233,65,181,106,116,107,215,6,34,0,34,134,128,207,26,192,229,8,80,80,168,2,128,216,154,68, + 205,70,99,217,114,169,147,69,8,129,192,198,6,2,169,20,2,153,77,217,107,64,245,17,155,82,132,66,225,222,67,135,14,185,123,120,120,96,209,162, + 69,240,244,244,12,108,220,184,177,186,125,251,246,98,87,87,87,52,108,216,16,109,218,180,193,233,211,167,1,160,198,154,82,70,147,232,254,147,36,180, + 205,202,185,134,95,47,255,0,189,70,135,144,142,63,192,192,173,3,231,70,11,193,62,223,3,245,171,99,0,0,137,91,127,188,76,78,2,225,8,30, + 86,167,89,254,58,74,151,239,221,187,135,125,199,174,192,221,39,8,201,207,30,227,241,165,11,184,234,236,8,159,160,134,101,195,64,85,218,104,6,119, + 201,119,101,229,29,132,57,57,57,66,185,92,174,3,138,239,157,187,187,59,56,28,14,24,134,129,64,32,128,159,159,31,239,234,213,171,78,237,218,181, + 219,69,8,121,143,82,122,165,26,249,247,103,206,156,137,60,30,15,232,219,23,252,248,120,24,12,6,132,134,134,162,121,243,230,0,128,208,208,80,112, + 185,92,52,105,210,4,10,133,2,223,125,247,221,251,168,98,86,31,67,112,215,100,202,14,244,243,243,43,115,180,118,237,86,34,250,118,119,16,8,176, + 126,227,31,213,28,188,189,189,241,42,61,30,132,208,152,106,111,0,176,216,205,205,109,158,187,187,187,223,170,85,171,56,34,145,8,159,124,242,137,111, + 97,97,97,29,0,88,190,124,57,102,207,158,13,0,152,63,127,62,22,44,88,0,157,78,87,101,195,219,221,107,154,40,50,115,216,15,92,221,60,6, + 119,118,170,211,184,75,207,110,240,13,232,130,46,61,147,1,96,169,156,155,20,182,98,110,240,81,39,47,249,246,115,103,206,207,111,215,177,203,151,225, + 19,29,150,44,223,156,91,99,206,99,254,139,157,5,79,4,195,215,108,216,180,123,205,87,179,167,138,146,149,250,220,212,92,90,40,19,114,101,254,174, + 68,246,233,23,139,19,210,210,226,103,32,229,76,141,51,45,89,150,69,124,124,124,89,78,159,86,171,69,81,81,17,82,82,82,202,254,102,52,82,219, + 94,147,199,245,111,90,164,209,168,111,60,120,150,60,119,202,200,208,34,141,70,253,44,49,249,41,165,235,42,245,198,24,134,121,160,46,80,119,83,192, + 215,133,179,0,0,32,0,73,68,65,84,231,105,161,188,251,4,158,93,125,96,52,17,232,77,102,40,179,11,160,51,1,102,134,135,70,97,163,97,38, + 92,100,165,165,130,225,112,238,213,100,175,21,43,86,254,177,212,88,222,129,16,18,25,26,26,186,31,248,35,234,84,186,12,64,7,160,186,84,30,101, + 121,103,170,116,56,177,170,243,84,208,173,150,74,134,12,79,150,36,200,215,92,222,161,68,128,52,109,236,163,88,49,255,125,79,214,100,106,144,153,149, + 97,226,114,133,60,47,59,77,122,77,39,47,143,78,167,139,188,112,225,194,160,238,221,187,11,159,61,184,7,125,126,62,244,249,121,224,177,38,200,197, + 205,193,24,116,32,122,61,60,2,89,104,11,196,184,114,53,198,168,211,233,34,107,210,45,117,180,24,14,231,245,188,44,153,12,66,27,91,8,101,178, + 138,67,139,213,142,29,18,66,36,3,6,12,232,218,186,117,107,80,74,177,101,203,22,24,12,6,129,193,96,128,94,175,135,193,96,128,74,165,194,238, + 221,187,241,253,247,223,95,5,176,163,38,27,89,147,254,194,217,243,81,45,199,143,236,199,59,21,185,26,38,189,25,26,226,137,162,34,35,10,245,18, + 152,29,71,1,25,39,193,225,138,16,218,196,23,199,14,71,24,96,210,93,172,73,23,120,221,225,210,235,245,72,73,78,194,203,184,167,144,169,94,193, + 217,86,2,117,252,83,132,140,30,243,86,209,9,47,47,47,176,44,139,206,157,59,67,171,213,194,104,52,150,57,90,2,129,0,129,129,129,188,155,55, + 111,202,91,180,104,177,191,164,246,217,239,85,105,101,103,103,227,196,137,19,104,221,186,53,58,118,236,136,212,212,84,196,199,199,163,111,223,190,101,251, + 220,187,119,15,209,209,209,240,247,175,62,72,152,149,99,60,245,50,229,238,176,129,3,7,242,175,95,191,14,74,41,2,2,108,97,107,35,5,97,132, + 8,10,114,1,80,252,27,160,83,167,78,80,169,226,77,185,185,244,84,117,154,148,210,189,132,144,159,245,122,253,243,14,29,58,40,226,226,226,240,217, + 103,159,113,15,28,56,0,0,8,15,15,71,120,248,235,147,41,52,154,170,135,238,27,52,14,252,220,215,228,208,81,36,174,83,215,214,169,9,124,3, + 186,0,0,186,247,27,15,223,122,222,80,101,221,175,171,213,36,13,230,115,115,29,238,175,79,125,36,238,27,60,78,155,121,249,25,0,75,10,0,83, + 205,179,3,25,201,188,81,7,127,62,126,122,98,159,126,3,120,70,179,201,20,236,195,179,63,116,244,100,102,234,139,228,117,72,62,83,234,88,86,251, + 203,194,108,54,155,85,42,21,164,82,41,98,98,98,116,125,251,246,21,50,12,131,231,207,159,151,57,90,46,78,242,134,109,91,4,7,46,89,179,251, + 172,84,40,20,246,236,212,60,232,209,179,23,47,41,37,73,85,233,234,141,198,243,15,238,222,235,236,172,168,199,137,191,124,29,142,237,251,64,167,99, + 160,209,179,208,153,0,19,135,15,247,102,173,96,239,31,4,10,224,214,245,171,70,157,209,88,101,73,19,43,86,172,252,243,169,198,23,81,150,115,140, + 114,0,36,45,91,182,44,171,92,180,73,9,224,30,128,166,37,251,41,43,28,167,68,241,236,193,22,229,116,148,64,153,195,85,126,89,95,97,159,26, + 127,0,86,140,104,149,56,94,175,247,58,172,102,74,37,156,156,156,92,66,66,154,251,255,184,237,32,40,165,120,18,189,18,185,153,143,49,111,233,239, + 254,158,158,158,29,95,190,124,121,165,38,35,0,192,108,54,31,216,190,125,251,140,86,239,132,132,212,245,244,196,189,164,68,240,169,25,124,179,25,140, + 65,7,174,89,15,207,70,102,48,140,12,105,105,249,88,190,247,96,140,217,108,62,80,147,110,96,159,1,88,244,50,31,132,16,172,10,13,134,192,70, + 6,190,84,134,127,29,143,42,115,174,34,23,205,134,64,38,131,127,171,154,11,194,83,74,213,54,54,54,183,31,60,120,208,34,56,56,24,51,102,204, + 64,82,82,18,88,150,69,70,70,134,54,61,61,61,85,169,84,38,1,56,10,224,71,75,42,143,243,117,218,181,145,71,118,77,14,109,215,209,105,224, + 224,239,241,243,225,25,200,203,87,65,109,18,163,72,107,66,145,142,3,185,99,99,180,108,210,4,105,169,153,120,120,253,108,33,87,167,94,89,243,93, + 253,3,66,8,162,163,163,225,167,176,193,211,95,175,192,73,194,67,83,133,27,20,109,219,149,213,151,170,14,30,7,166,247,223,127,191,172,50,124,143, + 30,61,18,71,141,26,229,62,125,250,116,108,219,182,13,87,175,94,205,145,201,100,122,134,97,184,92,46,23,2,129,0,3,6,12,200,141,138,138,98, + 88,150,149,162,56,250,84,149,163,101,212,235,245,8,12,12,196,173,91,183,112,225,194,5,116,233,210,5,29,59,118,196,253,251,247,113,238,220,57,68, + 71,71,131,16,2,71,71,71,24,139,157,103,99,21,90,48,24,112,232,155,111,183,207,89,179,230,251,70,35,71,142,196,145,35,251,49,126,92,3,16, + 70,8,66,132,24,208,191,1,22,45,190,133,86,173,58,193,201,137,135,53,171,143,37,104,52,230,221,22,220,198,37,231,206,157,83,104,181,90,228,229, + 229,81,153,76,70,178,179,139,103,180,86,22,209,82,171,213,162,170,132,30,220,137,93,153,87,64,115,105,97,244,224,28,83,116,227,46,61,83,208,189, + 223,56,156,143,220,129,168,179,23,32,231,38,37,66,90,112,58,43,49,75,149,94,20,176,41,232,157,9,156,151,69,103,55,77,25,232,192,113,119,103, + 15,133,127,159,159,87,149,54,165,148,18,66,72,206,163,61,199,143,82,12,104,19,218,170,94,176,183,187,32,55,43,147,30,62,118,58,198,144,120,228, + 4,74,28,172,154,186,44,80,74,23,133,135,135,127,85,178,188,115,238,220,185,19,150,47,95,238,252,234,213,171,178,28,173,204,172,156,168,54,125,63, + 53,103,231,229,235,183,175,249,98,168,88,36,20,204,93,190,253,178,145,131,235,85,233,154,88,246,187,176,207,230,77,125,246,36,218,163,142,88,128,99, + 95,204,199,189,115,151,96,100,248,248,248,194,13,232,12,102,228,101,101,227,226,7,147,32,115,117,192,247,151,143,100,176,44,251,67,117,182,90,177,98, + 229,159,77,53,190,72,101,53,246,50,44,216,175,166,245,191,156,18,39,171,44,47,198,162,41,120,89,89,89,153,191,252,114,3,151,35,151,224,74,228, + 18,60,140,190,135,180,84,61,82,51,180,176,181,181,173,50,130,65,8,233,86,126,157,82,74,213,106,245,144,185,243,190,122,37,18,75,208,161,107,87, + 184,57,187,64,194,231,129,99,98,193,33,60,20,102,217,227,233,125,53,102,109,223,147,89,168,86,15,169,248,37,81,81,179,220,118,16,66,32,180,181, + 129,64,102,3,161,141,237,107,195,136,34,91,91,136,108,108,193,21,8,42,75,154,127,67,179,176,176,240,221,161,67,135,230,230,231,231,99,194,132,9, + 184,114,229,74,244,217,179,103,109,239,221,187,39,206,204,204,172,71,41,237,65,41,221,92,149,147,85,81,51,39,39,174,128,154,116,195,151,125,53,77, + 163,53,57,98,216,152,253,144,50,41,48,153,89,80,0,10,185,0,109,187,45,134,82,223,6,7,54,125,173,102,13,218,145,229,107,104,85,212,164,148, + 82,87,87,87,84,120,29,23,46,92,192,176,161,239,162,231,224,65,112,174,235,7,151,110,125,208,115,194,199,216,180,105,19,24,134,129,147,147,19,80, + 46,194,81,94,115,103,52,229,237,189,79,201,222,251,148,236,184,67,185,0,70,239,217,179,231,155,166,77,155,94,186,122,245,234,74,0,195,141,70,163, + 254,206,157,59,169,10,133,162,232,167,159,126,66,199,142,29,237,221,221,221,143,152,76,38,25,165,116,72,53,239,209,151,83,167,78,213,60,123,246,12, + 82,169,20,38,147,9,87,175,94,197,247,223,127,143,85,171,86,33,58,58,26,142,142,142,240,247,247,135,78,167,195,173,91,183,52,0,190,172,234,126, + 82,74,89,165,210,244,238,250,245,203,179,251,245,107,143,237,219,55,194,205,173,13,120,92,55,112,121,206,144,202,2,177,245,199,111,208,187,119,8,142, + 31,59,152,147,149,109,122,183,98,21,247,42,236,212,222,184,113,3,155,54,109,194,208,161,67,83,135,13,27,102,206,207,47,46,118,27,30,30,14,74, + 41,40,165,88,80,146,99,166,211,233,94,11,83,151,215,156,240,197,131,212,207,151,196,44,202,120,149,218,250,202,165,223,223,143,58,123,1,9,207,162, + 16,117,246,2,126,141,186,22,158,241,42,181,117,72,203,250,252,33,19,38,127,190,43,226,8,71,102,235,142,93,17,71,56,35,62,157,246,117,243,158, + 93,170,188,246,242,183,1,0,45,204,204,152,189,116,229,134,66,147,65,203,172,88,247,93,154,70,153,254,37,74,167,98,86,17,205,42,175,169,86,171, + 55,107,52,26,133,70,163,81,104,181,218,47,147,146,146,58,204,152,49,67,105,54,155,203,162,165,153,15,143,253,30,251,235,142,165,46,78,14,226,54, + 45,26,53,88,189,249,240,229,228,148,140,159,74,107,104,85,241,30,105,11,53,218,119,7,13,25,85,148,151,171,67,232,180,112,176,34,25,116,102,192, + 72,57,48,17,46,30,44,89,13,177,220,6,123,19,239,168,243,141,134,119,203,215,208,170,225,218,223,26,171,166,85,211,170,249,159,169,249,79,129,82, + 186,165,116,216,16,40,137,104,213,52,165,210,195,195,163,195,192,1,221,208,169,223,92,80,74,241,248,206,183,200,85,62,129,135,155,16,241,201,170,80, + 0,87,106,97,64,50,33,164,245,212,47,231,70,12,235,209,53,40,184,110,93,97,157,58,62,144,186,184,32,43,75,137,223,174,63,50,126,189,239,80, + 76,137,147,101,73,11,30,176,44,91,156,228,14,160,235,212,89,32,28,14,80,82,198,161,244,139,177,110,139,54,32,92,46,204,148,133,78,167,171,49, + 73,139,82,250,146,16,242,238,200,145,35,47,70,70,70,50,61,123,246,108,118,244,232,209,183,207,12,6,80,152,241,244,146,204,181,126,191,175,103,79, + 60,208,186,203,32,219,128,70,205,249,205,235,112,96,48,18,164,165,190,64,100,196,77,195,163,27,103,85,212,164,29,94,164,172,190,5,143,193,96,72, + 174,87,175,158,235,166,77,155,202,146,225,205,102,51,178,178,178,240,251,239,191,163,113,139,86,8,26,247,1,148,74,37,214,175,95,15,111,111,111,244, + 239,223,31,57,57,57,48,153,76,22,221,87,74,169,25,192,217,146,7,0,128,97,24,210,174,93,59,51,203,178,147,230,207,159,255,221,147,39,79,164, + 107,214,172,25,78,8,249,138,82,250,70,237,8,127,127,127,129,86,171,109,230,238,238,206,37,132,172,213,235,245,227,102,207,158,237,182,116,233,82,52, + 104,208,0,89,89,89,144,74,165,8,8,8,128,82,169,196,205,155,55,205,106,181,122,19,128,69,148,82,101,69,189,10,246,61,39,132,180,158,50,229, + 95,17,223,44,159,24,160,213,117,18,200,229,237,64,169,9,74,101,18,10,84,87,13,139,23,237,136,203,200,52,14,161,148,62,179,228,154,1,204,159, + 60,121,50,80,210,130,39,62,62,254,110,80,80,80,0,80,121,68,203,18,86,31,122,169,5,176,111,197,103,109,62,83,101,221,15,144,115,147,18,91, + 7,179,235,87,31,122,169,93,248,153,253,146,220,164,43,79,95,22,157,221,180,43,226,8,103,204,224,119,205,158,178,103,225,34,23,122,184,75,255,234, + 117,41,165,180,89,179,102,94,132,228,248,102,102,63,185,61,126,194,196,48,59,190,230,84,83,207,108,127,198,59,68,20,29,29,157,88,83,52,171,10, + 221,167,132,144,14,179,103,207,62,75,41,125,45,55,33,51,43,39,42,180,223,100,154,151,151,127,55,243,209,177,106,171,194,151,104,221,36,132,116,13, + 110,28,114,228,155,165,203,93,59,77,157,193,125,122,233,50,96,54,226,197,149,203,48,11,245,236,234,107,231,51,242,13,134,193,212,90,21,222,138,149, + 255,105,44,41,239,240,159,10,33,196,29,64,95,20,71,178,250,2,136,166,148,70,3,22,20,44,5,128,151,47,95,94,241,247,243,60,247,244,105,135, + 30,222,158,206,0,128,248,196,52,164,102,232,206,89,58,108,88,158,18,103,171,249,158,19,167,134,11,133,194,126,164,164,132,3,125,139,166,210,38,147, + 233,101,221,186,117,171,120,117,106,165,91,205,102,115,101,225,198,202,236,188,76,8,25,229,239,239,191,252,197,139,23,17,148,210,34,75,142,171,142,194, + 140,167,151,228,114,127,191,107,23,142,76,187,126,57,178,27,53,233,27,3,0,225,10,106,213,84,186,176,176,112,226,39,159,124,178,153,199,227,121,163, + 36,231,172,52,7,203,108,54,115,12,6,131,200,108,54,115,0,16,134,97,76,60,30,79,27,17,17,97,50,153,76,201,58,157,110,226,219,218,79,41, + 61,65,41,253,129,82,122,211,201,201,41,236,248,241,227,61,123,245,234,37,58,113,226,196,12,0,51,43,238,127,234,212,169,58,14,14,14,61,8,33, + 67,41,165,129,5,5,5,186,185,115,231,254,30,17,17,145,239,227,227,211,171,111,223,190,68,46,151,227,214,173,91,52,59,59,251,48,128,47,41,165, + 241,181,176,39,158,16,210,116,226,199,63,188,39,151,111,238,75,41,154,130,130,16,6,15,242,243,217,83,106,181,249,167,18,135,209,82,61,19,94,143, + 164,45,142,137,137,217,1,128,87,89,142,86,173,144,20,30,215,106,146,222,37,50,245,209,213,235,94,106,1,96,254,154,188,124,0,91,167,12,150,179, + 177,119,182,126,235,97,251,236,139,117,71,115,182,91,34,23,18,18,226,199,48,204,112,0,193,46,194,188,122,206,130,124,51,33,180,51,33,140,19,128, + 251,13,27,54,140,4,240,242,109,76,165,197,237,138,124,42,110,207,124,120,236,119,84,61,60,92,149,214,77,66,72,189,207,102,78,159,36,224,241,186, + 195,108,110,178,248,231,67,212,218,84,218,138,21,43,255,32,250,82,74,183,148,22,42,45,25,62,180,220,209,2,128,184,248,151,61,1,160,126,253,250, + 244,217,179,103,160,148,254,41,143,179,196,145,218,143,26,170,190,215,68,86,86,86,243,63,115,124,77,80,74,247,1,216,247,87,106,150,56,82,139,74, + 30,111,5,165,244,1,128,86,127,153,81,150,159,119,108,233,114,118,118,246,172,113,227,198,245,176,177,177,249,53,47,47,111,99,101,251,247,232,209,227, + 133,193,96,184,128,226,47,124,123,0,57,70,163,241,140,94,175,207,32,132,52,95,189,122,117,105,229,251,197,148,210,219,111,105,19,11,96,111,201,227, + 47,133,82,186,87,161,80,76,119,116,116,244,215,106,181,2,173,86,203,47,255,27,64,44,22,87,27,117,43,143,189,13,217,201,231,230,58,218,219,144, + 55,28,41,185,7,142,104,138,98,26,200,61,112,196,82,189,232,232,232,248,102,205,154,237,97,24,166,46,165,212,21,160,118,148,66,73,41,205,226,114, + 185,169,143,30,61,178,168,7,231,255,7,37,142,212,202,146,135,21,43,86,172,252,227,168,182,142,86,109,120,250,244,233,127,93,72,207,202,223,3,165, + 244,17,33,68,158,155,91,117,57,130,164,164,36,29,128,107,37,143,138,199,223,6,80,195,0,217,191,159,180,180,180,144,191,66,103,194,23,15,82,1, + 76,107,94,73,107,231,249,235,115,10,0,124,222,121,64,237,52,239,222,189,155,12,192,162,161,96,43,86,172,88,177,242,247,96,73,29,45,43,86,222, + 138,170,170,141,91,177,98,197,138,21,43,255,43,84,87,71,139,0,168,116,230,0,173,69,103,238,183,153,125,80,147,190,85,211,170,105,213,180,106,90, + 53,173,154,86,205,127,158,230,255,2,164,124,147,233,210,89,121,127,199,3,64,55,171,166,85,211,170,105,213,180,106,90,53,173,154,86,205,255,165,7, + 128,143,74,151,173,67,135,86,172,88,249,159,229,240,225,195,22,53,21,125,239,139,173,253,100,50,135,121,133,170,252,229,251,87,142,63,90,186,125,232, + 208,161,22,207,104,181,98,197,202,63,151,202,134,14,75,23,170,116,180,252,252,188,26,50,102,182,45,165,12,135,50,212,72,84,154,3,113,57,57,175, + 149,29,240,246,246,182,231,49,232,79,40,149,18,194,154,89,14,115,53,62,62,229,81,85,154,149,24,38,112,112,112,152,204,231,243,187,233,245,122,79, + 134,97,94,234,116,186,11,106,181,122,35,173,80,184,240,223,73,131,6,13,70,92,190,124,217,190,93,187,118,58,177,88,108,210,104,52,220,51,103,206, + 8,123,247,238,157,247,252,249,243,183,154,145,232,225,225,209,229,240,225,195,190,49,49,49,198,85,171,86,233,135,15,31,206,15,13,13,229,79,152,48, + 33,33,53,53,53,170,54,90,132,144,134,132,144,221,132,16,14,203,178,163,105,241,140,196,191,28,66,8,195,48,204,68,66,200,96,74,169,31,33,36, + 158,82,122,148,101,217,42,11,183,214,160,247,46,128,62,12,195,132,0,0,203,178,209,0,78,81,74,45,158,121,247,255,169,41,145,72,154,1,128,90, + 173,190,251,87,105,18,66,154,1,0,165,244,173,52,9,33,227,196,98,241,135,0,160,209,104,126,164,148,214,216,14,234,13,54,7,209,144,133,143,1, + 0,209,243,3,1,0,181,90,159,24,107,249,4,153,205,65,180,50,189,90,105,84,128,16,210,103,228,200,145,75,127,250,233,167,249,148,210,99,111,171, + 83,29,110,110,94,27,87,173,219,162,152,54,249,131,229,40,238,8,81,45,141,8,233,46,224,112,6,232,205,230,95,31,1,135,0,112,229,114,249,8, + 129,64,208,65,175,215,187,115,185,220,116,189,94,255,75,126,126,254,62,74,105,149,29,16,44,230,49,113,48,168,225,70,216,63,250,188,81,6,58,190, + 4,175,16,72,115,255,180,254,159,132,16,194,160,184,222,142,17,192,54,250,22,229,60,56,28,206,52,133,66,49,88,165,82,169,57,28,14,45,150,37, + 197,255,160,184,198,31,203,178,153,217,217,217,163,107,210,146,249,144,6,2,41,217,109,54,66,99,210,209,79,10,147,233,99,27,111,210,134,2,163,41, + 80,151,225,48,206,44,203,166,3,136,98,76,56,81,144,74,159,215,164,249,239,128,16,226,131,226,251,90,167,100,19,15,128,43,128,251,0,166,81,74, + 11,255,61,150,253,239,65,107,74,134,47,87,238,190,83,223,190,125,175,248,249,121,53,28,58,104,200,210,143,39,126,66,56,28,6,49,15,31,114,223, + 31,61,174,135,92,46,247,144,233,116,65,32,132,85,139,68,49,70,163,33,245,208,190,159,108,2,27,52,48,155,205,44,54,109,254,161,183,159,159,215, + 28,75,156,45,66,72,125,55,55,183,221,225,225,225,110,3,6,12,224,184,185,185,33,41,41,201,126,255,254,253,13,54,108,216,16,70,8,25,77,139, + 107,249,212,10,66,72,123,55,57,211,195,70,76,186,162,192,140,2,35,46,190,210,224,28,165,244,215,218,106,149,162,86,171,63,77,75,75,107,213,162, + 69,11,186,109,219,54,50,118,236,88,250,244,233,83,162,209,104,118,226,45,75,63,72,165,210,239,154,52,105,18,48,118,236,216,248,184,184,184,62,7, + 15,30,60,53,102,204,24,63,169,84,250,12,64,253,90,202,237,200,206,206,110,170,209,104,224,233,233,185,13,192,59,111,99,83,117,16,66,8,135,195, + 57,234,225,225,65,191,253,246,219,99,77,155,54,117,205,201,201,49,125,254,249,231,221,174,95,191,222,155,16,50,192,82,103,139,16,226,64,8,217,236, + 230,230,230,180,124,249,242,231,205,155,55,191,47,20,10,5,207,158,61,147,76,159,62,253,51,134,97,194,40,165,19,41,181,252,11,162,84,211,195,195, + 195,105,233,210,165,73,33,33,33,49,124,62,159,255,236,217,51,233,172,89,179,166,189,173,38,195,48,155,66,67,67,29,230,207,159,31,219,160,65,131, + 107,28,14,71,240,242,229,75,102,193,130,5,147,57,28,206,48,150,101,63,126,27,59,93,93,93,29,22,44,88,16,27,26,26,122,157,207,231,243,159, + 60,121,194,132,135,135,79,174,141,157,142,142,142,157,29,29,29,183,188,122,245,138,11,0,238,238,238,45,253,253,253,55,148,239,105,89,18,194,134,209, + 104,44,208,106,181,35,179,179,179,43,45,132,59,118,246,250,254,0,176,193,80,186,94,252,92,211,58,176,233,132,37,215,29,226,78,40,0,140,152,177, + 114,80,241,115,241,246,85,69,0,151,203,101,119,187,19,26,157,110,121,201,24,66,200,192,46,93,186,44,136,138,138,250,161,83,167,78,179,246,236,217, + 227,146,146,146,242,13,33,196,235,189,247,222,27,123,241,226,197,101,74,165,242,176,165,122,53,33,224,11,133,132,33,16,139,36,182,150,236,207,99,152, + 126,215,6,14,252,240,199,39,79,66,54,60,126,236,91,228,238,222,106,202,148,41,174,67,134,12,97,188,188,188,240,252,249,115,199,61,123,246,4,253, + 248,227,143,131,9,33,83,41,165,47,222,218,184,199,196,161,40,15,141,117,122,132,80,10,251,210,205,132,32,79,104,64,180,244,49,121,240,31,224,108, + 125,181,99,199,142,249,207,159,63,199,178,101,203,0,160,210,114,48,85,65,8,153,62,120,240,224,190,17,17,17,226,67,135,14,137,91,180,104,1,55, + 55,55,0,197,245,3,75,135,104,124,125,125,45,210,163,44,86,173,61,53,254,157,152,156,211,248,110,200,171,101,18,47,98,106,63,40,96,112,191,177, + 33,176,115,150,64,36,227,34,47,91,21,252,36,58,165,231,165,131,207,191,145,249,144,229,69,201,248,138,214,162,38,223,255,7,142,142,142,219,18,18, + 18,58,75,165,210,215,182,199,199,199,55,11,8,8,200,71,113,91,52,139,33,132,248,56,59,59,239,101,89,86,151,157,157,253,1,0,216,216,216,252, + 36,149,74,29,210,211,211,231,252,93,63,100,74,169,232,139,252,157,231,250,171,33,132,132,80,74,163,203,23,46,165,21,155,74,151,239,152,205,152,217, + 182,31,79,252,132,12,31,241,222,171,231,241,9,44,151,39,24,113,230,236,89,73,195,134,13,25,221,198,141,48,41,149,48,126,246,89,155,11,23,46, + 24,135,141,24,165,225,113,200,14,63,223,186,146,3,251,246,187,69,28,57,220,22,64,181,142,22,33,68,224,230,230,182,251,242,229,203,30,190,190,190, + 200,203,203,67,82,82,18,138,138,138,16,22,22,198,107,219,182,173,199,208,161,67,119,19,66,218,89,26,217,34,132,184,214,243,228,70,174,250,42,172, + 126,239,30,109,165,30,94,254,160,175,180,72,137,123,220,34,242,242,245,41,1,246,204,211,231,249,180,31,165,212,162,98,165,229,201,202,202,250,98,252, + 248,241,71,58,119,238,236,44,20,10,161,80,40,72,120,120,120,102,90,90,218,194,218,106,149,179,23,34,145,8,12,195,152,1,148,61,87,108,15,100, + 33,158,14,14,14,112,112,112,0,0,143,183,181,169,228,252,140,189,189,253,70,27,27,155,161,42,149,74,195,48,12,37,132,80,169,84,42,118,112,112, + 184,23,251,248,169,66,167,211,213,91,185,246,199,117,93,218,55,181,61,127,254,60,134,12,25,66,207,157,59,55,17,128,69,125,234,8,33,155,7,15, + 30,172,158,55,111,158,246,121,124,146,71,236,211,120,34,21,9,88,39,39,39,222,205,155,55,185,107,214,172,17,45,88,176,96,51,128,161,181,176,123, + 243,123,239,189,103,152,57,115,102,250,147,231,9,46,15,98,159,83,153,136,103,114,114,114,228,92,191,126,157,125,27,77,134,97,54,125,241,197,23,170, + 137,19,39,230,102,231,228,187,229,170,10,169,144,199,49,186,185,185,113,143,29,59,166,219,187,119,47,243,225,135,31,110,2,48,204,82,77,0,155,6, + 12,24,80,16,30,30,158,247,44,62,209,237,193,163,167,144,8,121,70,87,87,23,206,173,91,183,12,43,87,174,100,150,44,89,98,145,157,82,169,116, + 215,193,131,7,185,199,142,21,127,246,253,254,251,239,140,159,159,159,164,252,62,26,173,14,12,1,178,178,178,36,161,161,161,187,0,120,86,212,9,89, + 248,24,99,103,3,159,126,250,105,173,154,196,3,64,136,251,20,68,215,80,254,150,221,20,68,71,204,88,57,136,203,229,178,31,126,248,225,27,221,3, + 180,90,45,1,48,32,164,22,206,86,159,62,125,190,60,121,242,164,255,158,61,123,86,239,221,187,87,15,0,34,145,200,105,255,254,253,203,194,194,194, + 16,22,22,54,15,192,95,230,104,153,169,217,0,0,66,145,80,248,248,241,99,18,24,24,88,109,65,101,3,203,222,254,241,201,147,230,255,10,12,108, + 145,195,178,245,248,189,123,23,78,159,62,61,75,165,82,33,41,41,9,6,131,1,99,199,142,229,116,234,212,73,17,22,22,182,158,16,242,46,165,212, + 80,147,29,28,14,103,165,135,135,199,71,249,249,249,133,165,81,157,160,186,54,220,14,205,76,194,38,245,140,2,62,199,196,239,255,25,75,206,109,36, + 69,129,190,248,13,0,248,106,40,249,192,159,118,180,236,188,136,175,153,135,37,206,158,226,46,202,23,154,69,133,47,104,149,206,18,33,228,93,169,84, + 58,168,168,168,232,112,201,151,115,253,126,253,250,225,250,245,235,0,208,22,192,70,66,72,23,134,97,222,103,89,118,43,173,166,25,61,33,100,202,192, + 129,3,187,71,68,68,216,0,192,225,195,135,97,52,26,225,231,231,7,62,159,15,129,64,0,30,143,87,214,29,196,66,220,157,157,157,224,100,199,131, + 131,92,218,123,214,247,3,185,222,13,109,145,105,126,136,28,154,7,19,213,129,239,40,69,131,158,246,8,233,209,133,57,177,41,102,206,137,239,98,155, + 147,58,164,63,77,122,189,91,194,191,19,134,97,132,247,239,223,135,66,161,120,109,59,135,195,1,128,14,111,33,57,47,62,62,62,244,206,157,59,232, + 220,185,243,188,198,141,27,247,186,114,229,138,91,118,118,54,58,119,238,188,30,192,223,234,104,1,175,251,34,127,247,185,254,98,66,80,92,160,180,172, + 112,41,74,154,74,151,245,58,44,185,176,78,0,64,41,195,225,112,24,36,196,39,25,59,119,238,58,38,57,57,89,214,170,85,43,134,199,227,161,40, + 42,10,218,91,183,32,147,201,48,120,240,96,222,47,191,252,98,107,43,179,157,144,152,144,88,192,225,48,160,148,169,49,231,193,193,193,97,242,156,57, + 115,220,2,2,2,96,50,153,202,42,154,155,76,38,164,164,164,64,38,147,97,244,232,209,46,18,137,100,178,37,87,71,8,169,83,223,207,37,250,242, + 169,205,239,76,255,184,143,180,190,228,60,164,41,83,33,59,252,47,4,165,157,65,248,160,86,210,115,223,205,11,241,87,200,163,9,33,117,106,86,124, + 29,173,86,251,91,76,76,204,132,43,87,174,176,0,112,233,210,37,26,27,27,59,241,207,252,10,101,89,22,233,233,233,96,89,150,83,178,94,250,252, + 182,146,127,26,66,8,99,107,107,187,169,87,175,94,239,189,120,241,66,124,250,244,105,199,228,228,100,167,196,196,68,231,250,245,235,115,151,45,91,118, + 82,171,51,112,140,102,170,55,153,141,5,233,15,31,198,231,102,100,68,111,223,190,93,67,8,25,108,225,57,222,117,119,119,119,156,61,123,54,8,79, + 210,50,176,97,227,0,14,79,108,199,240,4,118,26,141,214,156,144,144,144,50,123,246,236,186,77,155,54,85,148,12,175,89,164,169,80,40,156,102,206, + 156,9,174,208,166,89,147,166,33,254,2,161,212,230,216,241,72,223,86,173,90,117,138,143,143,79,11,15,15,119,111,209,162,69,173,52,91,180,104,225, + 240,225,135,31,154,68,18,219,208,186,126,190,13,59,182,107,211,189,85,171,86,125,184,92,174,73,169,84,190,24,61,122,180,123,255,254,253,93,107,163, + 233,226,226,226,16,30,30,110,242,242,241,235,217,179,123,143,214,124,177,141,29,87,32,181,87,171,181,230,39,79,158,188,152,59,119,174,123,179,102,205, + 92,44,209,84,171,213,60,39,39,39,4,7,7,163,161,159,31,242,243,243,17,17,17,129,29,59,118,96,235,214,173,216,183,111,31,154,183,235,1,27, + 27,27,164,165,165,65,165,82,241,44,177,179,20,163,209,248,167,63,232,216,77,65,116,131,254,163,1,159,124,242,73,218,135,31,126,248,74,44,22,179, + 21,31,114,185,220,60,114,228,200,140,209,179,214,14,40,29,90,172,10,66,200,192,174,93,187,222,63,117,234,84,220,158,61,123,208,176,97,67,244,236, + 217,83,0,0,147,39,79,22,132,133,133,225,224,193,131,56,124,248,240,163,250,245,235,95,37,132,12,180,196,206,209,163,71,183,27,54,108,216,175,195, + 134,13,187,59,124,248,240,45,19,39,78,124,237,155,43,61,237,229,109,189,94,143,166,33,45,36,139,183,221,24,89,147,94,44,176,103,203,227,199,59, + 150,63,124,248,98,94,195,134,246,62,137,137,242,157,43,87,58,149,54,233,54,26,141,72,73,73,129,131,131,3,70,142,28,233,36,20,10,107,28,238, + 34,132,172,25,56,112,224,184,228,228,100,217,143,63,254,232,126,247,238,93,69,122,122,186,251,197,11,103,157,63,159,49,217,198,78,38,16,164,41,139, + 29,213,196,52,72,31,39,160,29,165,176,47,63,156,248,54,16,5,17,75,188,200,6,255,118,246,79,103,30,108,54,60,60,50,196,201,193,93,56,187, + 202,253,9,105,242,237,183,223,30,58,113,226,196,136,118,237,218,29,33,132,136,43,217,71,212,188,121,243,136,131,7,15,142,107,223,190,253,111,132,144, + 224,170,244,60,61,61,7,255,252,243,207,142,165,235,78,78,78,16,137,68,111,56,89,124,62,31,12,99,81,251,222,215,248,122,255,8,174,60,72,135, + 152,220,83,56,248,237,125,124,219,251,9,187,180,77,162,110,227,232,199,56,119,240,62,50,113,31,125,254,229,143,17,115,155,118,147,152,177,164,214,39, + 248,27,81,42,149,239,119,232,208,225,80,159,62,125,116,119,238,220,129,82,169,132,135,71,217,111,237,90,255,112,2,32,151,72,36,240,242,242,66,64, + 64,192,136,95,126,249,197,205,104,52,34,49,49,17,153,153,153,209,127,161,233,85,82,222,23,249,47,227,36,169,208,76,186,148,178,191,202,146,222,66, + 151,1,128,18,82,116,63,38,134,199,17,8,70,253,180,119,175,144,207,231,227,197,139,23,120,244,232,17,212,23,47,66,115,237,26,50,50,50,80,88, + 88,8,87,87,87,108,222,182,77,170,55,211,241,79,158,62,229,80,230,143,124,3,90,197,20,79,161,80,216,109,200,144,33,85,58,100,105,105,105,232, + 211,167,15,143,195,225,188,49,173,180,162,38,33,132,40,156,201,137,139,71,22,187,187,11,30,1,207,167,3,5,209,0,213,1,38,61,144,250,0,56, + 185,16,62,133,143,201,217,197,99,220,60,36,220,19,165,99,250,53,217,89,238,28,126,129,129,129,91,71,141,26,197,0,64,151,46,93,72,96,96,224, + 22,66,136,95,85,199,212,164,169,86,171,175,223,190,125,27,97,97,97,142,254,254,254,23,194,194,194,28,31,61,122,4,181,90,125,253,109,53,75,112, + 108,212,168,81,182,88,44,222,71,8,169,241,3,182,188,166,189,189,253,198,62,125,250,12,221,187,119,47,31,0,46,95,190,140,19,39,78,224,225,195, + 135,120,246,236,25,27,18,18,226,188,118,235,161,77,27,127,216,181,102,80,219,166,138,78,45,67,130,100,133,185,133,174,174,174,109,41,165,126,149,105, + 86,66,159,133,11,23,62,138,141,123,97,199,225,241,185,60,46,87,104,107,43,117,117,176,145,122,202,37,34,15,33,67,100,106,181,250,213,190,125,251, + 88,0,125,44,213,92,188,120,113,66,236,243,23,246,12,135,199,229,243,248,252,196,196,56,183,93,59,183,249,0,0,31,148,175,82,169,50,118,236,216, + 97,168,141,230,252,249,243,99,114,242,10,29,184,92,46,143,207,225,10,242,243,243,249,249,249,249,124,169,88,236,44,17,10,5,58,157,46,117,221,186, + 117,154,218,104,46,92,184,240,209,147,184,100,57,67,8,135,16,134,107,107,35,117,116,180,147,56,59,203,196,78,18,46,71,160,82,169,82,119,239,222, + 109,145,166,193,96,224,103,100,100,32,54,54,22,94,45,90,224,252,249,243,240,246,246,70,88,88,24,222,123,239,61,136,197,98,116,9,109,140,217,179, + 103,35,46,46,14,6,131,65,88,153,102,89,158,84,5,100,50,89,100,231,206,157,123,87,115,61,175,29,91,209,206,16,119,66,55,232,63,26,80,222, + 193,42,255,186,92,46,223,48,96,192,128,142,37,203,230,202,162,93,21,53,251,244,233,243,229,197,139,23,253,119,239,222,61,96,244,232,209,191,237,222, + 189,27,173,91,183,70,108,108,44,234,214,173,139,157,59,119,226,189,247,222,251,109,253,250,245,3,238,220,185,211,212,215,215,119,78,77,154,195,135,15, + 159,212,172,89,179,168,87,175,94,133,230,228,228,4,71,68,68,140,31,60,120,112,194,136,17,35,186,150,238,99,54,26,247,158,60,126,4,125,7,12, + 65,131,70,193,155,198,206,217,211,184,58,77,74,41,125,8,108,217,145,158,174,220,171,213,170,195,120,60,137,228,198,13,249,225,31,126,112,42,29,206, + 5,128,212,212,84,244,239,223,159,199,231,243,219,87,103,39,33,228,219,65,131,6,133,69,68,68,56,0,197,81,157,107,215,174,225,193,131,7,72,74, + 74,66,94,94,30,186,78,44,196,39,203,138,181,63,89,70,209,99,50,149,86,167,105,9,18,31,226,230,104,203,189,58,126,93,131,201,31,109,106,200, + 149,201,121,248,105,214,51,100,37,234,202,162,133,21,236,36,161,161,161,123,134,13,27,70,244,122,61,244,122,189,158,82,170,169,76,91,161,80,136,154, + 54,109,138,137,19,39,50,182,182,182,235,171,178,179,168,168,72,119,234,212,41,140,30,61,26,83,167,78,69,189,122,245,224,224,224,0,30,143,135,93, + 123,14,56,189,55,254,227,250,239,180,235,208,180,225,59,173,155,20,232,56,45,248,18,249,135,21,63,227,171,187,246,66,151,59,136,73,252,29,27,6, + 188,100,111,238,84,23,126,254,254,138,199,79,174,100,60,156,51,108,75,12,253,189,77,214,158,105,201,200,48,198,162,125,152,15,124,155,57,124,38,243, + 38,129,53,105,254,25,106,171,217,184,113,227,118,55,111,222,20,118,232,208,1,47,94,188,0,143,87,246,123,170,236,255,219,219,216,185,112,225,66,161, + 86,171,197,189,123,247,48,102,204,152,84,131,193,240,217,159,177,211,82,202,251,34,255,77,80,74,211,105,185,102,210,229,115,182,42,70,180,22,2,128, + 145,197,137,81,99,198,171,35,35,35,37,2,129,0,47,94,188,64,122,122,58,118,237,216,97,238,226,226,82,208,211,195,67,181,107,199,14,170,215,235, + 65,41,69,96,96,32,134,14,29,42,126,55,108,68,38,81,105,14,212,100,16,33,196,189,116,124,125,252,248,241,111,188,254,249,231,159,195,214,214,22, + 132,16,55,11,174,111,216,148,133,131,60,29,124,237,51,232,171,93,57,224,136,0,174,13,192,181,5,68,118,128,208,6,16,72,160,187,19,149,195,208, + 158,73,67,218,127,224,129,218,13,245,64,161,80,204,59,118,236,152,243,157,59,119,168,74,165,66,122,122,58,93,186,116,169,179,66,161,152,87,243,209, + 149,147,150,150,182,56,60,60,60,35,40,40,200,246,228,201,147,94,65,65,65,182,225,225,225,25,105,105,105,139,223,86,19,0,248,124,62,231,225,195, + 135,242,37,75,150,188,7,224,118,112,112,112,182,167,167,231,237,146,164,201,106,177,177,177,41,115,178,128,226,232,26,151,203,5,143,199,131,66,161,208, + 231,228,228,152,219,191,227,39,14,180,99,140,10,33,95,44,23,139,60,109,108,237,90,101,103,103,223,39,132,88,212,159,144,16,210,172,101,203,150,60, + 51,229,177,69,56,31,4,0,0,32,0,73,68,65,84,159,140,233,170,152,60,174,179,203,247,75,62,244,94,183,248,35,143,111,23,76,8,92,58,103, + 76,39,134,101,181,117,235,214,117,43,77,104,175,9,134,97,66,154,55,111,206,101,193,195,163,39,137,25,73,41,47,11,150,47,154,231,98,50,153,8, + 0,52,108,22,210,211,217,217,185,67,96,96,96,115,75,107,194,136,197,226,102,13,26,52,224,50,28,30,9,109,221,194,65,38,19,187,150,190,102,107, + 111,223,166,77,187,118,61,24,74,243,221,221,221,93,196,98,113,179,90,92,59,151,5,31,77,155,53,225,57,59,217,203,122,118,110,91,47,180,77,104, + 253,198,173,90,135,246,31,60,164,7,49,153,84,126,126,126,46,165,73,242,213,161,211,233,68,123,247,238,197,146,37,75,208,196,199,7,30,30,30,112, + 113,113,193,181,107,215,112,243,230,77,56,56,56,32,51,51,19,43,87,174,196,209,163,71,97,48,24,108,44,177,179,20,74,169,205,253,251,247,255,213, + 187,119,239,174,53,239,93,57,38,147,137,169,232,96,149,82,84,84,212,32,42,42,106,250,208,161,67,67,1,64,44,22,179,165,73,242,85,113,234,212, + 169,61,165,145,172,105,211,166,181,91,187,118,237,111,143,31,63,134,76,38,195,205,155,55,49,126,252,248,223,214,175,95,223,238,227,143,63,198,142,29, + 59,144,144,144,176,173,58,189,225,195,135,47,152,48,97,194,186,43,87,174,48,174,174,174,112,112,112,192,160,65,131,176,109,219,54,174,201,100,218,62, + 108,216,176,187,195,134,13,187,107,78,57,247,229,161,173,75,175,197,220,191,139,73,83,102,10,244,38,99,141,77,47,41,165,84,35,147,21,152,58,116, + 200,57,104,52,170,135,243,249,18,187,187,119,229,39,182,111,47,115,182,102,207,158,13,59,59,59,160,56,129,185,74,60,61,61,63,58,122,244,104,217, + 231,161,163,163,35,4,2,1,248,124,62,120,60,30,56,28,14,46,108,146,226,135,217,197,254,197,15,179,9,206,109,36,127,170,55,171,212,147,4,59, + 184,10,238,254,107,103,163,166,193,93,29,113,109,255,43,44,237,123,231,229,205,131,202,233,218,76,172,170,226,176,119,62,255,252,243,134,153,153,153,184, + 117,235,22,110,221,186,85,105,4,136,82,170,61,113,226,196,55,5,5,5,240,245,245,197,192,129,3,59,16,66,90,84,182,47,33,4,205,155,55,71, + 255,254,253,209,185,115,103,52,105,210,4,122,131,137,55,108,212,71,13,30,37,42,61,150,174,248,90,18,21,21,193,252,246,219,21,206,238,35,231,236, + 90,119,238,177,142,111,227,126,157,72,156,220,45,185,78,181,57,27,205,220,123,99,203,197,41,204,134,203,99,100,187,78,108,240,179,177,177,33,209,183, + 238,26,119,125,119,48,57,88,58,48,243,250,254,108,168,201,43,116,29,231,203,176,181,72,63,248,187,17,137,68,107,175,92,185,226,102,48,24,16,19, + 19,131,169,83,167,254,217,158,161,101,1,16,47,47,47,92,190,124,25,35,71,142,212,102,100,100,212,170,191,233,159,161,188,47,242,79,129,11,188,217, + 41,59,57,57,57,79,46,151,123,52,104,208,128,209,235,245,197,67,18,135,15,155,183,110,223,126,82,171,213,78,1,192,223,248,253,247,155,60,60,61, + 59,143,26,61,154,24,141,70,244,237,219,87,16,25,25,233,24,151,145,81,99,67,228,138,191,54,198,142,29,139,181,107,215,2,0,62,253,244,83,0, + 197,161,245,202,126,149,84,68,102,135,62,61,251,53,183,77,145,110,176,53,180,49,22,214,137,179,185,46,45,20,55,7,35,224,66,196,1,107,48,154, + 158,101,14,190,29,247,44,168,161,56,39,187,110,183,70,29,177,245,252,238,62,0,14,90,122,147,36,18,73,75,133,66,129,219,183,111,231,52,111,222, + 60,143,82,106,183,120,241,98,39,137,68,210,210,82,141,138,80,74,19,9,33,29,166,77,155,54,153,97,152,110,44,203,94,200,200,200,216,72,41,77, + 180,228,120,66,200,39,0,230,163,92,30,138,94,175,7,195,48,160,148,98,248,240,225,152,61,123,118,195,7,15,30,32,42,42,74,222,173,91,183,235, + 132,144,60,0,31,80,74,43,141,154,169,84,42,205,205,155,55,197,81,81,81,96,89,22,114,185,28,182,182,182,16,10,133,24,52,104,144,44,60,60, + 188,235,217,179,103,51,85,117,188,57,162,244,212,34,161,76,102,3,55,143,246,31,143,120,255,49,165,180,198,153,88,165,136,68,34,129,152,107,210,194, + 160,97,190,93,180,158,145,240,249,68,196,231,66,200,170,241,229,55,95,51,124,106,230,162,150,227,243,124,62,159,111,35,132,158,35,224,24,37,4,244, + 237,82,221,94,135,195,225,8,68,124,232,64,241,198,112,22,33,0,143,97,24,134,97,248,0,76,150,106,10,133,66,190,141,144,234,8,232,27,154,12, + 0,49,135,112,8,33,2,20,207,206,122,131,16,119,66,203,69,145,202,114,69,88,150,69,251,246,237,113,50,234,54,14,159,184,128,172,23,247,49,119, + 214,52,180,104,209,2,145,145,145,213,218,84,154,163,85,17,177,88,108,62,127,254,188,83,183,110,221,166,15,28,56,208,112,236,216,177,55,38,148,132, + 44,124,92,105,142,22,187,41,136,142,158,181,118,64,101,81,170,82,4,2,1,115,248,240,97,225,144,33,67,230,68,125,230,227,250,197,193,100,84,151, + 163,69,8,25,216,190,125,251,73,123,247,238,213,245,234,213,75,56,124,248,112,4,7,7,183,27,55,110,28,0,160,91,183,110,88,187,118,109,187,113, + 227,198,225,192,129,3,56,122,244,168,182,83,167,78,179,8,33,169,148,210,83,149,105,178,44,219,127,243,230,205,175,109,51,24,12,48,153,76,48,26, + 141,238,38,147,201,189,228,179,8,235,214,173,207,58,119,54,18,179,230,44,132,139,179,155,69,206,53,135,195,33,99,103,206,204,218,185,114,37,86,30, + 56,128,153,117,235,74,118,63,122,132,115,90,45,14,70,69,101,149,156,167,198,220,204,162,162,34,205,169,83,167,108,15,30,60,8,123,123,123,212,171, + 87,15,114,185,28,60,30,15,12,71,12,14,223,1,13,26,181,4,112,19,0,80,87,129,162,64,95,252,70,8,242,40,131,90,231,20,137,124,72,29, + 87,31,209,149,73,59,130,237,109,93,248,56,179,49,25,103,55,164,28,213,102,97,53,76,120,82,205,100,141,230,190,190,190,200,204,204,196,169,83,167, + 138,128,42,29,50,176,44,251,205,247,223,127,255,249,156,57,115,132,129,129,129,0,208,12,192,173,202,246,149,74,165,240,240,240,40,115,44,135,143,249, + 216,111,226,244,137,226,193,61,186,128,203,117,66,94,145,17,217,5,70,200,157,100,152,53,125,152,232,98,115,143,22,155,215,255,116,156,16,210,130,210, + 55,255,175,17,130,91,55,238,255,214,88,20,8,16,6,72,97,46,129,128,160,144,24,65,56,28,106,54,155,145,156,156,12,74,41,70,14,30,159,242, + 209,210,8,151,118,35,85,240,106,160,0,161,232,136,255,16,71,192,209,209,177,89,118,118,54,18,19,19,49,102,204,152,212,172,172,172,243,69,69,69, + 227,211,210,210,0,32,231,45,36,203,156,249,102,205,154,161,101,203,150,8,11,11,19,169,213,234,97,126,126,126,30,0,218,252,85,182,87,70,69,95, + 228,159,66,149,229,29,132,70,99,3,221,166,77,40,186,112,1,130,115,231,112,80,161,40,212,106,181,51,40,165,41,0,64,8,153,182,99,231,206,171, + 3,126,255,221,86,255,248,49,252,30,60,0,207,222,222,162,15,159,242,108,223,190,29,42,149,10,249,249,249,0,128,13,27,54,64,165,82,161,52,151, + 161,198,11,224,163,157,155,75,93,188,194,51,176,92,70,150,212,64,221,90,166,181,73,243,72,118,45,202,103,60,240,248,69,43,169,38,91,223,154,112, + 244,208,102,169,225,209,182,30,184,224,182,171,141,141,165,227,254,92,46,55,231,233,211,167,253,235,215,175,127,2,128,211,219,228,3,148,135,82,250,28, + 192,148,183,57,150,195,225,204,79,72,72,112,217,182,109,219,228,197,139,23,83,224,15,71,171,116,153,203,229,130,82,10,59,59,59,240,120,60,215,107, + 215,174,185,182,106,213,234,59,20,127,160,189,1,195,48,52,56,56,24,9,9,9,224,114,185,176,179,179,3,107,50,96,225,244,143,97,230,8,185,95, + 124,241,69,179,33,67,134,196,108,219,182,205,104,27,218,182,77,118,118,246,195,73,35,71,197,28,59,118,76,207,178,236,230,202,52,43,185,230,187,207, + 158,61,227,120,42,92,57,212,164,102,165,124,64,116,127,29,21,200,220,32,226,114,40,159,48,16,138,196,118,137,47,95,102,179,44,27,107,137,38,203, + 178,209,9,9,9,98,87,23,71,174,90,163,47,20,243,168,96,195,178,175,211,71,255,107,178,194,104,50,17,109,244,205,203,194,6,65,226,164,12,165, + 180,110,221,186,22,105,106,52,154,187,169,169,169,28,87,87,87,238,249,139,23,46,217,203,164,206,182,246,246,173,1,192,80,144,127,147,209,233,148,28, + 30,215,85,153,157,157,163,209,104,18,44,189,246,184,184,56,174,187,187,11,103,219,246,157,151,92,37,66,23,27,1,215,86,72,8,145,112,136,138,111, + 98,179,68,18,137,75,226,203,151,57,148,210,42,35,132,203,243,70,13,6,0,134,89,120,160,156,54,238,223,191,143,211,191,197,66,74,245,32,218,124, + 156,219,241,35,70,126,49,231,173,243,254,132,66,33,252,253,253,57,7,14,28,176,15,11,11,11,31,62,124,184,241,192,129,3,85,14,109,87,164,186, + 104,22,54,7,221,145,72,36,133,173,91,183,118,216,189,123,119,86,175,225,195,83,140,70,188,95,157,222,200,145,35,23,238,217,179,167,44,1,37,54, + 54,22,93,186,116,1,0,44,88,176,0,189,122,245,66,171,86,173,16,27,27,139,128,128,0,92,188,120,81,196,225,112,68,163,70,141,90,10,160,82, + 71,171,60,91,182,108,193,248,241,227,43,75,172,142,3,160,37,14,129,133,179,151,239,114,202,201,206,66,166,242,213,221,154,239,64,49,132,16,140,157, + 57,51,107,179,94,143,189,55,110,96,180,84,42,217,249,252,57,250,182,106,133,198,93,186,100,89,242,89,87,26,213,209,106,181,224,241,120,176,181,181, + 133,163,163,35,248,124,62,56,60,5,184,130,166,96,248,124,132,180,111,138,149,51,164,234,49,189,177,158,16,228,9,5,136,230,75,80,169,179,75,8, + 33,82,111,12,162,20,42,117,10,46,253,31,123,215,25,30,69,217,69,207,59,179,125,55,187,217,244,10,73,8,36,132,4,8,32,32,189,11,82,68, + 144,242,97,161,40,2,34,32,8,72,9,69,122,81,65,164,11,8,168,168,84,41,82,164,133,142,16,138,161,132,208,66,58,41,155,182,155,108,157,121, + 191,31,201,198,16,82,54,1,84,190,111,207,243,204,179,153,118,230,206,102,103,230,206,125,239,61,215,234,144,168,253,137,163,131,74,120,228,131,85,33, + 106,149,187,8,7,87,60,194,145,85,137,59,245,169,136,0,112,175,162,234,98,137,68,210,64,173,86,35,33,33,1,241,241,241,55,43,74,240,167,148, + 230,183,104,209,226,190,68,34,9,117,115,115,3,128,50,75,6,9,33,132,231,249,226,60,172,173,63,110,119,109,212,54,80,218,165,117,24,182,236,157, + 135,143,6,124,3,33,75,192,113,38,124,181,188,39,44,122,45,6,244,30,78,218,117,174,19,126,116,159,241,3,0,223,150,230,228,4,152,183,244,63, + 231,212,18,7,166,1,120,162,118,117,117,87,136,68,34,184,168,188,140,211,70,140,79,161,148,22,95,55,66,86,100,102,242,156,11,50,83,181,50,181, + 176,0,160,76,149,243,124,95,20,18,19,19,199,182,109,219,118,65,94,94,94,150,78,167,123,7,0,106,213,170,229,199,48,140,4,64,185,163,35,21, + 200,66,136,254,252,243,79,40,149,74,36,37,253,213,147,62,33,33,1,60,207,255,107,138,0,254,141,168,168,234,144,1,128,3,7,14,180,59,112,224, + 0,61,112,224,64,59,235,78,60,165,188,69,163,1,53,20,126,183,66,161,144,2,40,89,209,36,87,171,213,68,232,235,11,34,41,76,253,160,192,115, + 43,125,53,155,109,147,150,225,57,176,32,166,39,130,14,58,41,193,124,215,78,24,43,158,129,84,177,250,175,141,41,5,44,20,28,120,155,68,10,75, + 128,106,52,26,88,44,22,167,218,181,107,31,176,88,44,78,133,116,79,191,41,253,93,224,56,238,62,203,178,248,248,227,143,129,162,232,143,209,104,68, + 106,106,42,12,6,3,140,70,35,30,60,120,128,156,156,28,24,141,70,220,184,113,3,181,106,213,2,203,178,229,134,211,9,33,148,82,138,26,53,106, + 192,223,223,31,44,161,216,176,100,54,166,127,50,18,255,169,197,99,211,202,175,208,190,125,251,122,1,1,1,45,4,2,1,231,233,233,41,218,181,107, + 215,94,142,227,222,172,130,142,214,111,83,167,78,245,15,11,11,115,87,171,148,102,137,152,133,216,172,163,18,67,38,21,228,103,160,70,13,63,11,100, + 242,160,247,222,123,143,131,13,15,71,43,231,167,159,126,234,21,18,18,226,232,164,86,234,196,66,54,173,77,227,70,137,211,63,26,25,7,0,98,55, + 119,61,164,242,208,193,131,7,91,170,194,57,99,198,140,90,110,110,110,106,6,52,143,51,153,82,212,142,142,70,181,163,163,137,49,24,51,137,80,88, + 0,145,248,149,49,99,198,144,170,112,78,154,52,41,32,52,52,84,173,86,41,180,2,33,155,34,226,249,20,41,248,84,161,209,148,37,117,115,205,135, + 220,161,241,123,239,189,87,46,167,53,154,53,101,202,148,132,146,203,89,150,133,70,163,129,62,53,26,162,164,219,8,119,16,162,169,155,19,36,18,73, + 105,181,226,114,57,75,131,16,2,134,97,224,239,239,47,220,191,127,191,250,240,225,195,179,6,15,30,220,196,150,125,95,153,83,193,16,224,186,122,81, + 24,113,139,112,28,199,49,12,131,144,144,16,215,189,123,247,10,132,66,225,182,242,134,143,0,224,135,31,126,152,214,161,67,135,180,174,93,187,26,15, + 28,56,0,66,8,142,31,63,142,164,164,36,116,235,214,13,148,82,107,85,27,174,94,189,138,206,157,59,27,219,180,105,147,244,195,15,63,204,42,223, + 152,191,48,108,216,48,152,205,102,104,181,90,104,52,26,236,223,191,31,225,225,225,84,46,151,247,101,107,188,54,191,255,7,211,90,214,111,216,8,171, + 86,124,97,20,11,132,139,108,225,180,130,16,130,193,159,126,154,145,211,184,177,102,171,78,151,63,68,165,146,215,78,72,112,190,124,248,176,171,201,84, + 105,177,33,128,191,162,58,190,190,190,197,78,150,72,36,130,64,236,6,86,209,0,98,151,174,144,123,246,197,137,43,18,131,163,2,187,149,14,56,164, + 80,163,92,105,7,121,13,204,111,57,208,107,87,171,255,120,29,147,215,196,70,66,8,67,8,97,168,128,236,26,250,85,112,109,55,127,25,206,111,79, + 197,145,85,137,123,244,169,152,13,224,110,101,215,185,201,100,210,115,28,7,134,97,32,16,8,74,230,136,158,221,179,103,15,46,95,190,12,0,197,178, + 61,121,121,121,28,203,178,144,74,165,0,224,80,30,47,199,113,16,10,133,16,10,133,56,121,225,148,203,127,222,234,73,206,93,251,29,173,26,189,141, + 76,173,9,143,115,76,200,206,7,194,154,70,160,65,151,221,184,254,64,139,70,13,235,179,172,88,49,184,44,190,130,7,52,65,251,136,246,203,184,193, + 213,49,38,202,14,158,255,245,214,205,83,59,174,223,248,105,245,190,187,45,155,182,213,1,128,78,167,131,86,171,165,132,16,58,126,248,180,251,91,135, + 101,113,43,222,185,206,11,12,210,123,21,125,7,207,19,132,16,63,119,119,247,115,174,174,174,199,9,33,126,132,16,63,149,74,117,214,219,219,251,54, + 33,164,55,165,244,215,228,228,228,16,173,86,219,138,82,250,136,82,250,40,35,35,163,99,90,90,90,203,138,138,181,92,92,92,54,230,230,230,126,194, + 113,220,27,69,211,235,28,199,53,138,141,141,13,109,212,168,209,205,192,192,192,171,129,129,129,7,3,3,3,247,6,6,6,238,237,208,161,195,114,171, + 220,195,139,68,89,190,200,75,4,107,170,75,143,162,252,172,30,214,21,214,144,204,201,210,9,104,22,137,228,134,101,244,104,168,247,238,133,48,54,22, + 67,7,15,86,201,229,242,21,132,144,38,132,144,86,14,14,14,171,102,207,158,173,116,93,184,16,222,167,78,33,110,255,126,152,133,194,50,195,190,149, + 161,160,160,0,2,65,97,112,205,104,52,66,161,80,128,227,56,0,79,15,217,148,6,103,193,249,164,199,183,33,134,63,120,80,237,161,220,182,23,7, + 221,143,112,223,159,91,43,232,174,78,20,52,199,237,85,247,21,126,173,47,234,136,64,43,86,75,17,31,159,0,14,124,149,198,155,245,122,125,78,86, + 86,22,26,53,106,228,114,249,242,229,218,225,225,225,206,177,177,177,208,235,245,127,84,231,124,173,32,132,180,240,241,241,217,238,235,235,251,208,199,199, + 103,59,33,164,69,21,118,223,120,250,244,105,176,44,139,217,179,103,35,47,47,15,38,147,9,153,153,153,136,143,143,135,209,104,68,98,98,34,98,98, + 98,96,52,26,17,23,23,7,131,161,242,23,18,158,231,161,82,169,160,47,208,98,205,252,233,152,57,117,34,114,238,70,33,49,249,49,212,142,10,140, + 29,59,150,117,114,114,226,57,142,243,183,88,44,157,57,142,91,107,171,195,89,36,90,120,166,70,141,26,245,151,44,89,18,58,125,254,90,145,74,160, + 165,18,165,148,23,43,37,84,92,239,85,12,139,88,33,250,122,217,151,119,206,159,63,159,100,139,120,167,149,179,113,227,198,193,73,73,73,225,33,33, + 33,117,93,253,2,36,18,47,159,236,201,17,51,238,82,131,254,34,241,169,217,102,237,218,181,209,103,207,158,77,174,10,167,66,161,168,183,101,203,150, + 250,30,30,30,245,133,50,153,52,233,209,163,95,51,146,147,126,101,213,78,82,70,165,126,125,247,238,221,81,59,119,238,76,173,10,103,80,80,80,200, + 252,249,243,195,26,52,104,16,230,89,171,182,68,230,83,35,83,234,235,151,41,107,16,46,129,175,127,183,85,171,86,93,61,127,254,188,77,156,44,203, + 90,24,134,129,80,40,132,92,46,199,161,67,135,48,250,131,65,168,225,227,130,186,33,33,232,244,209,39,216,185,115,103,113,14,15,203,178,229,62,209, + 55,47,28,187,175,177,23,137,194,186,122,81,88,87,47,170,177,23,137,162,188,197,129,97,24,136,197,98,4,5,5,9,15,29,58,232,114,230,200,158, + 181,231,39,251,71,53,246,34,81,141,189,72,84,101,54,150,5,107,30,150,213,145,19,139,197,8,15,15,247,58,116,232,144,64,40,20,238,36,132,52, + 44,107,63,74,233,111,39,79,158,92,60,100,200,16,113,247,238,221,113,241,226,69,12,27,54,236,204,174,93,187,0,0,23,47,94,196,248,241,227,207, + 28,59,118,12,35,71,142,68,199,142,29,197,103,206,156,89,101,139,246,143,197,98,193,166,77,155,96,177,88,224,224,224,0,103,103,103,244,236,217,19, + 209,209,209,35,191,251,238,187,219,172,80,248,118,143,55,222,194,129,189,187,16,115,35,122,228,230,5,239,86,89,20,152,97,24,116,31,60,56,35,35, + 44,76,179,57,55,55,255,125,39,39,121,72,106,170,243,137,237,219,93,43,219,151,16,66,56,142,43,118,174,172,78,135,117,18,136,221,32,80,212,135, + 64,217,20,215,239,138,204,194,102,244,138,232,21,122,171,34,253,44,161,152,25,214,119,122,45,244,157,94,11,189,39,7,12,149,215,196,6,69,77,140, + 234,62,206,191,67,96,83,71,228,166,153,176,255,171,184,71,250,76,44,4,16,99,203,117,206,243,252,205,164,164,36,136,197,98,212,172,89,51,152,16, + 98,205,11,220,56,124,248,240,49,115,230,204,153,0,96,78,209,57,57,116,232,208,33,76,171,213,34,54,54,22,0,46,151,199,75,41,45,174,50,212, + 228,198,73,2,188,27,160,97,189,17,112,114,110,136,100,141,17,201,26,35,54,172,121,19,81,167,231,225,242,145,247,16,159,154,10,153,103,95,112,22, + 67,185,213,140,86,152,205,102,239,107,215,174,145,211,167,79,19,158,231,97,54,155,105,94,110,46,189,114,230,12,10,34,35,137,74,165,34,173,155,181, + 213,110,158,119,224,143,221,43,207,92,54,229,87,249,69,253,89,48,227,254,253,251,45,182,111,223,222,1,192,140,6,13,26,156,143,143,143,111,121,234, + 212,169,186,190,190,190,43,42,221,187,28,88,101,33,226,226,226,158,152,138,100,33,140,148,210,198,148,210,238,148,210,222,69,211,248,103,210,122,179,29, + 79,249,34,47,17,42,175,58,44,33,20,134,218,206,206,74,179,217,148,248,251,239,191,155,24,134,129,92,46,199,144,97,195,152,53,171,87,183,25,212, + 162,197,241,15,187,116,57,120,252,216,177,198,205,155,55,7,165,20,12,195,224,231,159,127,46,208,235,11,50,107,214,172,169,46,125,144,210,40,153,123, + 69,41,69,110,110,110,177,163,149,147,147,3,15,15,15,155,135,14,117,185,56,122,236,80,84,22,229,62,138,239,126,119,153,105,81,234,155,205,179,121, + 78,144,195,153,145,83,64,145,167,135,224,34,227,220,124,72,80,31,211,131,206,205,99,34,111,159,203,212,115,250,42,85,75,164,165,165,77,31,54,108, + 88,166,151,151,23,81,169,84,240,241,241,97,62,251,236,179,140,132,132,132,57,85,225,41,9,87,87,215,255,116,232,208,97,95,100,100,100,191,200,200, + 72,255,13,27,54,244,235,208,161,195,62,87,87,215,255,216,72,241,203,180,105,211,116,98,177,24,175,190,250,42,242,242,242,80,84,229,83,225,84,17, + 172,195,142,34,145,8,235,150,204,194,204,169,19,145,121,235,60,174,159,249,29,39,83,9,34,230,127,9,145,72,84,45,173,175,32,119,69,131,6,222, + 202,91,227,135,13,76,158,58,101,138,242,234,213,171,194,49,227,198,211,184,20,13,196,221,191,96,209,110,58,115,77,231,134,30,175,119,194,236,25,19, + 27,80,74,43,81,103,2,66,221,21,13,234,123,43,111,78,252,112,208,253,113,227,198,201,22,45,90,164,111,209,162,69,193,227,199,143,101,10,39,231, + 16,129,163,186,126,92,74,170,67,139,22,45,30,124,244,209,71,217,85,229,140,136,136,144,31,62,124,88,208,191,127,127,75,86,86,150,131,80,38,107, + 68,36,210,102,233,89,89,142,253,250,247,191,219,175,95,191,124,158,231,71,86,133,115,230,204,153,242,152,152,24,65,139,22,45,204,169,169,169,74,133, + 139,107,56,171,118,110,250,48,229,177,170,89,243,230,247,198,140,25,163,171,200,206,146,201,226,74,165,50,169,85,171,86,248,234,171,175,240,245,215,95, + 163,91,183,110,136,190,17,141,30,99,38,32,116,212,120,236,61,119,1,73,73,73,152,59,119,46,194,195,195,33,18,137,98,202,36,29,113,139,92,73, + 161,228,74,10,37,24,113,139,88,231,121,74,114,172,142,144,88,44,70,227,198,77,176,231,200,25,83,231,85,233,143,175,166,226,149,226,237,203,192,229, + 153,101,71,186,26,123,145,168,146,121,88,132,144,98,254,150,45,91,122,30,63,126,92,40,20,10,247,17,66,234,149,181,127,191,126,253,70,91,37,28, + 222,127,255,253,51,43,86,172,104,253,254,251,133,47,218,175,190,250,42,230,205,155,215,58,34,34,226,204,252,249,243,209,169,83,39,4,6,6,86,90, + 248,194,113,28,44,22,11,6,13,26,4,139,197,130,244,244,116,220,185,115,7,235,215,175,7,165,84,10,0,94,222,190,175,136,197,98,92,187,114,41, + 127,198,251,205,127,168,140,179,196,249,21,159,43,207,243,208,106,181,232,55,106,84,70,98,157,58,154,181,25,25,249,31,56,57,201,3,30,61,114,86, + 26,141,62,21,229,164,18,66,192,243,124,177,99,101,117,184,74,79,69,15,74,155,96,202,231,127,59,245,125,50,0,160,237,187,222,232,61,57,96,168, + 87,144,252,155,54,239,20,6,189,119,206,187,79,243,146,185,69,48,227,102,21,34,214,23,47,94,188,8,181,90,141,254,253,251,75,24,134,89,8,20, + 38,191,83,74,87,82,74,151,89,185,36,18,201,23,239,189,247,30,147,157,157,141,235,215,175,3,192,177,178,8,173,121,167,214,115,215,106,8,56,94, + 140,243,87,15,225,72,228,14,220,79,76,199,163,52,61,32,112,132,94,151,8,83,65,18,244,89,81,200,53,200,203,162,123,10,34,145,40,189,65,131, + 6,180,105,211,194,116,174,123,247,238,89,226,30,61,178,92,90,190,156,254,57,98,4,81,222,185,35,146,201,100,164,86,173,90,144,74,165,188,84,42, + 205,180,241,187,120,30,120,33,114,11,47,64,22,226,185,161,164,47,242,50,161,162,170,195,178,4,75,65,85,178,129,59,86,173,113,236,63,232,93,93, + 120,120,184,147,143,143,15,8,33,120,179,79,31,210,33,50,82,41,244,246,134,75,147,38,197,195,17,71,127,255,29,135,14,29,210,29,216,179,219,103, + 216,7,31,244,2,176,165,60,99,8,33,130,218,181,107,23,31,55,37,37,5,18,137,164,56,39,34,55,55,23,110,110,110,72,73,73,41,119,168,163, + 20,182,78,157,114,97,74,90,243,233,181,154,43,133,228,144,238,49,56,74,33,36,28,80,64,97,230,0,131,153,226,149,0,214,249,72,129,197,105,255, + 197,93,15,0,108,173,202,23,168,215,235,79,16,66,70,240,60,191,3,0,19,25,25,201,223,188,121,115,180,173,137,235,101,65,46,151,79,62,116,232, + 144,115,68,68,68,214,254,253,251,115,122,246,236,233,184,114,229,74,231,110,221,186,77,6,240,83,101,251,83,74,11,8,33,91,18,18,18,70,55,109, + 218,20,26,141,6,38,147,9,81,81,81,8,10,10,194,229,203,151,17,28,28,140,75,151,46,161,110,221,186,224,56,14,122,189,30,60,207,151,59,188, + 107,189,153,107,50,210,129,204,120,36,95,252,13,49,215,47,227,120,50,193,202,159,246,161,166,127,173,106,233,212,212,245,80,132,249,184,187,28,89,244, + 249,76,247,184,19,63,99,215,166,149,252,201,131,7,67,197,74,140,104,55,232,147,183,140,102,248,1,16,183,108,222,20,221,157,98,56,185,63,82,143, + 221,168,88,201,186,174,135,34,204,219,205,229,240,210,69,115,149,247,14,126,135,95,214,125,69,119,126,191,45,92,15,52,15,11,11,235,206,48,140,26, + 128,190,40,207,203,166,214,54,101,113,30,221,183,175,177,30,104,254,235,175,191,118,151,203,229,158,0,204,249,249,249,247,159,133,243,216,254,253,141,173, + 118,18,66,220,1,152,40,165,247,108,229,180,98,192,128,1,243,198,143,31,63,133,227,56,55,235,50,179,217,204,126,241,197,23,2,158,231,89,74,169, + 137,97,24,211,225,195,135,57,139,197,146,172,215,235,71,217,202,109,69,209,16,16,196,98,49,186,116,233,146,117,225,194,5,134,227,56,7,0,227,129, + 138,115,170,0,160,160,160,224,137,60,173,210,67,141,37,29,185,17,35,70,100,30,62,124,88,72,8,81,161,48,137,186,107,105,190,200,200,200,185,111, + 191,253,246,212,159,126,250,233,206,138,21,43,222,24,57,114,36,126,254,249,103,212,169,83,7,215,174,93,195,244,233,211,1,160,117,68,68,196,222,141, + 27,55,6,198,197,197,125,81,153,141,102,179,25,22,139,5,219,182,109,195,155,111,190,9,55,55,55,120,123,123,131,16,114,226,131,15,62,88,13,0, + 44,97,69,0,96,208,27,12,33,33,77,109,142,224,6,6,6,22,223,235,82,83,83,139,43,5,95,123,251,237,140,13,139,22,225,135,130,2,124,224, + 228,36,79,244,245,245,218,123,239,222,135,132,144,245,229,69,142,172,81,157,202,156,44,91,35,204,5,41,152,182,103,193,67,79,0,221,218,190,235,141, + 182,239,122,163,105,111,119,194,176,4,127,30,201,68,244,81,205,78,115,46,78,208,42,180,203,161,148,222,116,113,113,217,219,174,93,187,55,234,213,171, + 135,225,195,135,127,36,18,137,68,102,179,121,156,85,230,129,16,226,200,48,204,156,77,155,54,125,232,236,236,140,211,167,79,227,212,169,83,39,40,165, + 241,229,124,143,0,80,172,153,85,179,70,176,62,38,78,43,127,156,120,22,103,78,239,65,157,240,79,32,243,236,5,231,144,249,48,221,254,26,198,204, + 35,112,169,217,11,137,113,247,192,10,36,209,54,216,124,35,49,49,49,48,48,48,144,60,124,248,208,2,128,114,28,71,77,109,218,152,67,23,45,18, + 70,127,244,17,105,25,19,195,82,66,248,75,151,46,1,128,77,121,158,207,27,86,185,133,232,232,232,50,229,22,170,138,6,13,26,180,62,117,234,148, + 68,175,215,227,228,201,147,104,214,172,184,182,235,159,19,115,196,147,190,200,203,4,242,116,175,195,98,103,171,204,167,38,225,137,176,110,112,48,39,98, + 240,221,155,189,122,229,95,189,122,181,248,173,79,255,199,31,208,29,58,4,142,227,64,41,197,169,200,72,188,247,238,187,90,33,75,54,4,4,248,83, + 66,255,210,110,41,171,148,94,36,18,245,239,223,191,127,241,205,39,33,33,1,10,133,2,98,177,24,60,207,195,98,177,128,101,89,56,58,58,194,98, + 177,60,21,130,41,205,73,41,53,115,26,93,191,141,61,222,73,241,214,154,232,135,106,127,248,137,100,197,23,167,167,138,224,141,112,33,92,5,105,244, + 216,23,93,146,121,67,102,63,90,170,183,88,101,37,255,132,144,224,134,13,27,174,238,211,167,15,3,0,157,59,119,102,26,54,108,248,13,33,164,220, + 86,57,149,113,74,165,82,137,72,36,194,190,125,251,52,119,238,220,233,182,111,223,62,141,72,36,130,84,42,45,87,251,170,12,206,245,75,150,44,129, + 92,46,135,197,98,129,209,104,44,206,207,42,249,105,50,153,224,234,234,138,3,7,14,128,227,184,3,149,112,162,134,159,63,136,91,109,108,222,123,12, + 167,50,68,85,118,178,74,114,214,241,114,168,235,233,234,242,251,210,5,115,221,178,238,70,33,49,49,145,30,62,116,224,124,1,165,73,217,185,116,70, + 150,150,214,205,55,80,105,179,64,196,255,190,238,51,26,209,22,102,144,178,170,252,254,226,12,243,114,168,235,227,230,114,248,171,47,22,41,179,99,47, + 35,37,53,21,191,29,216,119,181,128,210,36,74,233,78,74,233,80,142,227,234,115,28,87,159,82,58,180,60,231,165,170,156,58,157,174,129,78,167,107, + 240,60,57,121,158,111,192,243,188,205,156,37,29,149,101,203,150,221,78,73,73,121,47,45,45,173,171,117,202,202,202,234,172,213,106,219,231,231,231,183, + 41,88,230,239,168,211,233,220,243,242,242,188,10,10,10,94,161,148,70,149,197,89,30,116,58,29,189,116,233,82,188,151,151,87,254,206,157,59,209,174, + 93,59,71,15,15,143,173,22,139,69,65,41,125,202,201,42,201,201,140,188,69,126,252,114,226,158,117,235,214,149,155,19,104,48,24,144,150,150,102,8, + 15,15,207,60,112,224,0,252,252,252,20,5,5,5,63,155,76,38,47,0,189,203,178,51,61,61,125,199,182,109,219,26,213,170,85,43,112,232,208,161, + 88,187,118,45,86,172,88,97,0,128,141,27,55,26,74,68,178,106,60,124,248,176,105,89,195,134,79,216,201,48,91,95,123,237,53,122,234,212,41,188, + 249,230,155,197,66,162,223,126,251,45,44,22,75,110,167,78,157,120,0,40,208,231,231,82,158,194,104,42,123,252,189,172,239,83,44,22,191,94,82,47, + 208,42,198,44,22,139,65,41,69,221,214,173,51,178,195,195,53,155,114,114,242,103,55,104,160,250,48,36,100,104,61,224,221,178,56,9,33,79,68,117, + 74,79,182,70,178,74,114,82,74,211,10,146,49,124,207,130,135,135,172,145,45,169,131,0,250,60,11,118,47,122,152,174,79,199,183,0,202,116,126,42, + 58,119,141,70,51,102,209,162,69,6,39,39,39,188,245,214,91,152,63,127,254,7,173,91,183,206,241,240,240,184,16,20,20,244,231,192,129,3,83,162, + 162,162,198,116,236,216,17,177,177,177,248,242,203,47,179,179,178,178,222,169,136,147,16,82,28,201,235,221,163,179,102,205,55,95,241,157,218,143,134,92, + 166,132,89,88,3,26,173,25,89,58,10,163,164,57,196,34,9,186,182,8,195,133,195,155,243,57,163,110,75,121,156,86,104,181,218,157,67,134,12,201, + 21,137,68,48,26,141,84,40,20,66,82,152,119,204,11,187,117,51,181,188,121,211,194,81,202,19,66,48,105,210,36,93,86,86,214,79,149,113,62,11, + 74,113,62,23,185,133,210,118,62,15,89,136,23,113,238,47,51,138,162,89,79,76,214,117,79,200,59,88,63,9,225,57,142,227,17,80,43,64,25,247, + 48,126,229,128,1,253,223,239,222,189,135,188,71,143,30,210,176,219,133,67,23,251,246,237,195,174,93,187,242,143,28,57,146,43,17,178,27,107,212,172, + 225,193,113,60,8,41,63,98,2,0,74,165,114,220,180,105,211,100,57,57,57,88,177,98,5,223,168,81,35,70,161,80,192,100,50,97,227,198,141,230, + 176,176,48,33,195,48,200,201,201,1,195,48,101,15,117,60,125,130,215,9,33,93,87,119,232,187,171,233,199,195,92,66,59,180,116,106,95,195,7,230, + 38,20,201,9,15,113,231,216,145,172,27,135,151,103,66,255,184,47,165,212,230,166,215,86,120,123,123,207,218,181,107,151,251,212,169,83,169,94,175,39, + 241,241,241,116,193,130,5,238,195,135,15,159,5,192,214,161,190,210,32,233,233,233,32,132,240,0,138,63,81,5,89,3,74,105,52,33,228,215,62,125, + 250,244,238,212,169,19,110,223,190,93,60,68,88,210,209,178,86,31,46,92,184,48,27,64,185,138,206,86,8,133,66,172,216,178,3,217,89,25,240,240, + 240,134,84,38,171,86,36,11,0,196,12,51,123,241,220,153,238,25,183,46,144,232,243,199,249,237,215,31,167,89,56,90,182,226,127,94,50,5,0,166, + 178,220,60,134,157,189,100,225,92,71,235,176,230,79,87,82,114,9,71,199,84,203,192,151,141,243,111,132,94,175,23,182,109,219,22,148,210,143,35,34, + 34,190,249,243,207,63,21,171,87,175,30,74,8,153,71,41,205,168,108,127,2,128,231,249,226,223,115,233,97,195,252,252,124,174,78,157,58,169,102,179, + 121,115,68,68,196,212,168,168,40,201,202,149,43,223,6,48,155,210,138,219,156,60,120,240,96,65,147,38,77,38,198,198,198,110,15,13,13,29,9,160, + 166,193,96,200,142,136,136,88,186,113,227,198,247,109,137,100,1,192,207,63,255,188,124,216,176,97,135,122,245,234,245,25,207,243,197,185,97,132,144,7, + 238,238,238,197,67,184,233,143,83,167,140,120,127,208,20,173,54,203,102,157,59,7,7,135,15,35,34,34,164,58,157,14,171,86,173,226,195,194,194,24, + 235,75,209,247,223,127,111,9,14,14,22,244,31,61,58,99,89,106,42,230,157,62,173,155,82,191,126,163,77,119,238,188,130,50,34,238,214,23,199,178, + 34,89,214,180,139,234,128,82,154,76,8,25,190,103,193,195,111,1,116,107,57,192,19,191,46,121,136,172,56,227,82,88,112,175,162,170,193,10,56,19, + 9,33,93,31,63,126,252,235,204,153,51,29,95,121,229,21,212,175,95,95,232,224,224,208,92,169,84,66,42,149,34,59,59,27,71,143,30,197,218,181, + 107,141,55,110,220,232,67,41,45,87,6,132,227,184,180,224,224,194,119,90,66,8,37,132,100,230,26,136,227,47,123,154,59,12,27,177,147,156,185,116, + 22,73,38,30,6,51,143,128,90,141,209,190,219,50,236,253,237,26,151,28,119,243,166,185,32,107,131,13,246,222,147,203,229,187,231,206,157,59,224,179, + 207,62,147,101,100,100,112,49,10,152,205,0,0,32,0,73,68,65,84,6,131,129,223,177,99,7,59,116,232,80,142,10,4,188,72,32,192,184,113,227, + 10,178,179,179,247,20,85,139,255,93,120,33,114,11,47,64,22,226,185,160,180,47,242,191,130,50,175,80,158,101,206,174,93,183,230,245,159,183,253,228, + 201,178,140,231,189,251,247,47,189,209,183,95,210,239,191,255,238,44,114,116,108,6,128,55,142,28,121,222,100,40,208,236,255,245,87,191,128,0,255,240, + 162,166,210,148,103,153,179,21,29,80,171,213,234,78,159,62,157,63,117,234,84,146,144,144,240,163,135,135,199,192,131,7,15,58,244,237,219,183,224,246, + 237,219,59,61,61,61,123,119,232,208,65,57,113,226,68,131,86,171,181,185,241,40,165,244,38,33,164,222,31,51,191,120,251,143,37,107,186,64,192,182, + 130,65,8,240,230,179,48,229,253,14,224,71,74,169,205,122,71,37,161,80,40,194,61,60,60,112,245,234,213,172,230,205,155,27,245,122,189,104,254,252, + 249,46,10,133,34,188,58,124,69,246,82,173,86,11,158,231,5,0,72,209,39,248,170,215,226,255,231,141,55,222,248,245,151,95,126,121,173,71,143,30, + 8,12,12,132,217,108,70,112,112,48,140,70,35,130,130,130,96,48,24,240,249,231,159,35,39,39,103,2,173,160,89,49,33,4,22,139,165,56,217,214, + 199,215,175,80,167,231,25,100,44,20,66,38,48,102,255,38,164,101,102,240,191,92,123,252,56,223,196,117,141,77,211,221,40,189,93,62,7,93,135,161, + 99,147,0,192,192,163,194,142,243,10,49,2,99,246,175,199,227,180,12,252,124,37,37,91,103,226,187,197,148,193,89,37,59,95,18,206,198,159,223,70, + 63,27,5,65,202,211,184,178,21,148,210,125,0,190,164,148,94,117,117,117,29,124,244,232,209,182,29,59,118,148,30,62,124,120,12,128,153,149,237,127, + 37,133,18,126,109,61,138,117,155,10,109,41,165,145,197,113,92,20,199,113,27,40,165,59,253,252,252,94,59,118,236,88,139,247,222,123,79,182,101,203, + 150,137,0,42,20,4,45,138,84,253,10,0,132,144,132,65,131,6,77,121,248,240,225,92,90,168,151,101,147,212,136,21,155,54,109,138,5,240,180,114, + 114,9,252,244,197,176,221,0,108,214,138,3,128,188,188,60,125,84,84,148,126,226,196,137,36,33,33,225,160,167,167,231,107,135,14,29,146,247,237,219, + 215,16,29,29,125,204,219,219,187,109,231,206,157,29,126,187,120,49,41,255,222,189,253,251,31,62,244,53,243,124,185,162,103,132,144,231,234,100,89,97, + 117,182,118,207,123,184,248,215,197,15,59,243,6,236,52,102,225,60,128,196,103,224,60,69,8,9,125,247,221,119,127,233,217,179,103,203,208,208,80,212, + 172,89,19,119,238,220,65,122,122,58,174,95,191,142,125,251,246,237,211,235,245,149,54,212,206,204,204,124,170,61,17,145,185,120,111,94,53,123,223,165, + 51,205,130,219,246,24,34,171,239,205,195,104,162,72,120,116,15,159,207,216,152,159,242,232,206,77,147,197,212,199,230,97,212,130,130,245,95,127,253,181, + 112,255,254,253,61,86,174,92,169,244,243,243,99,69,34,17,3,128,94,190,124,153,142,29,59,86,151,145,145,113,32,55,55,119,125,165,100,207,23,167, + 238,223,191,223,152,101,217,231,42,183,80,93,89,8,59,170,7,82,222,239,48,48,176,70,40,195,241,173,40,101,88,74,136,206,204,99,95,124,124,124, + 118,201,109,106,59,59,43,169,74,54,144,240,68,72,8,207,241,44,115,246,254,253,132,226,136,17,33,164,51,125,186,101,78,160,74,165,90,33,151,203, + 35,146,147,147,175,170,213,234,222,132,144,185,148,210,25,217,217,217,191,42,149,202,222,0,230,251,249,249,45,143,142,142,126,74,255,164,44,206,103,69, + 101,156,117,235,214,29,116,229,202,21,199,198,141,27,231,196,196,196,108,171,91,183,238,160,253,251,247,59,246,236,217,51,39,38,38,102,91,117,56,107, + 214,172,217,105,215,174,93,174,167,78,157,50,175,95,191,222,50,100,200,16,65,221,186,117,133,99,199,142,189,159,144,144,80,102,245,77,121,156,164,176, + 213,206,6,161,80,216,137,97,24,194,243,124,241,63,213,154,71,199,113,220,94,0,35,75,223,120,74,114,186,186,186,158,17,8,4,62,69,203,81,242, + 179,36,204,102,115,82,122,122,122,185,90,100,37,57,235,121,41,91,43,69,100,161,222,76,169,133,167,35,110,166,106,43,150,254,182,145,211,65,196,46, + 52,152,121,222,194,243,35,255,159,56,75,10,150,90,19,227,43,154,47,79,0,180,170,215,17,33,164,49,195,48,127,168,84,170,99,217,217,217,195,41, + 165,79,61,132,159,229,218,36,132,52,84,40,20,127,72,36,146,244,252,252,252,190,5,5,5,151,158,149,179,130,99,253,45,156,132,144,64,165,82,57, + 87,173,86,47,125,244,232,209,85,181,90,221,139,82,250,9,207,243,203,243,242,242,246,41,149,202,94,148,210,9,254,254,254,155,163,163,163,55,87,196, + 233,226,226,114,217,122,109,2,160,214,235,210,122,61,151,188,174,205,102,115,98,86,86,214,171,182,218,89,98,157,59,128,0,20,10,240,222,165,148,230, + 86,247,220,75,173,175,5,160,19,10,245,251,178,1,60,0,112,153,82,122,189,186,156,69,219,16,161,204,121,36,43,150,191,109,173,46,100,89,113,52, + 103,202,223,98,46,200,218,80,209,189,174,2,206,186,206,206,206,239,88,44,150,16,74,169,51,128,44,177,88,124,59,35,35,227,123,74,233,83,35,44, + 47,250,183,68,8,113,0,176,28,64,67,0,143,241,151,144,113,28,128,175,43,115,82,255,46,59,237,40,204,209,42,57,92,248,196,58,27,29,254,234, + 30,248,165,248,231,218,57,237,156,118,78,155,246,81,85,244,240,125,86,59,9,33,33,0,98,41,165,92,137,101,255,138,115,183,115,254,255,113,18,66, + 24,90,73,181,229,191,193,206,255,37,206,151,25,21,37,195,63,123,220,217,14,59,236,248,191,128,173,17,142,103,224,175,86,196,207,14,59,94,4,42, + 115,178,236,176,163,52,202,141,104,1,40,179,114,160,138,158,127,149,171,15,108,8,225,218,57,237,156,118,78,59,167,157,211,206,105,231,252,31,227,252, + 127,131,125,232,208,206,105,231,180,115,218,57,237,156,118,78,59,231,63,206,249,50,195,62,116,104,135,29,118,216,97,135,29,118,216,241,130,96,117,170, + 202,74,138,183,59,90,85,4,41,236,89,247,17,128,126,0,106,3,184,7,96,7,128,213,213,25,211,39,133,42,216,83,0,180,66,97,247,250,7,0, + 78,3,88,68,41,173,80,230,224,255,25,110,110,110,211,132,66,161,26,40,108,109,98,253,44,249,55,199,113,217,57,57,57,11,94,196,241,157,157,157, + 149,26,141,38,175,42,182,150,180,173,228,167,217,108,126,97,118,218,241,239,4,33,36,216,217,217,249,7,141,70,243,14,165,244,78,229,123,216,97,199, + 203,3,119,119,247,145,38,147,41,66,36,18,205,79,75,75,91,243,79,219,243,119,161,188,202,195,98,71,235,192,129,3,145,0,208,163,71,143,118,0, + 224,228,228,116,142,97,152,90,85,57,8,207,243,15,178,178,178,202,21,80,115,114,114,58,199,178,236,83,156,102,179,89,41,16,8,202,124,104,89,44, + 150,196,156,156,156,87,170,98,199,139,2,41,172,169,222,239,228,228,164,159,59,119,238,234,246,237,219,215,72,78,78,182,76,158,60,185,237,181,107,215, + 122,16,66,94,175,138,179,69,8,105,65,8,217,220,168,81,163,221,131,7,15,254,165,121,243,230,226,204,204,76,229,142,29,59,124,182,108,217,18,69, + 8,121,135,82,90,110,163,213,255,103,8,133,66,117,98,98,162,18,40,148,176,40,114,172,96,54,155,97,54,155,161,211,233,16,30,94,109,153,179,114, + 225,235,235,219,142,231,249,181,126,126,126,129,222,222,222,119,120,158,31,154,154,154,90,225,255,168,180,173,22,139,5,148,210,98,59,67,67,67,159,187, + 157,255,171,32,132,188,230,236,236,252,65,205,154,53,95,201,207,207,23,197,198,198,94,7,48,131,82,90,237,190,111,229,28,199,5,192,124,71,71,199, + 215,67,67,67,189,238,221,187,167,73,75,75,187,8,96,18,165,52,246,25,185,131,219,181,107,119,102,213,170,85,46,163,70,141,58,67,8,105,109,119, + 182,236,248,167,80,179,102,77,181,78,167,219,0,160,177,80,40,244,148,74,165,144,201,100,169,18,137,228,170,76,38,123,255,204,153,51,217,149,146,148, + 2,199,113,51,227,226,226,60,95,125,245,213,37,245,235,215,255,60,35,35,67,111,50,153,142,101,101,101,77,168,172,168,166,180,47,242,178,192,58,116, + 88,114,8,241,137,161,195,162,190,66,237,75,238,36,16,8,124,31,61,122,228,46,149,74,193,243,124,241,195,172,244,100,93,110,52,26,81,191,126,253, + 10,85,132,133,66,97,141,132,132,4,119,177,88,92,188,204,104,52,194,199,199,135,79,76,76,116,47,106,123,80,12,131,193,0,95,95,223,127,83,207, + 163,143,156,157,157,115,226,227,19,194,245,6,211,156,225,99,166,78,123,167,95,23,167,115,231,206,241,175,191,254,186,33,50,50,242,35,0,54,137,172, + 18,66,28,9,33,91,38,79,158,252,185,84,174,114,57,126,238,166,97,203,142,3,73,141,130,3,200,132,9,19,216,177,99,199,158,106,220,184,241,15, + 132,144,38,85,137,108,57,59,59,31,146,72,36,254,0,96,48,24,226,53,26,205,107,213,60,215,151,2,153,153,153,40,40,40,120,106,10,13,13,181, + 181,87,166,205,240,245,245,149,138,68,162,221,223,124,243,141,250,234,149,43,88,179,118,109,61,134,97,150,161,48,26,89,41,210,210,210,158,178,51,36, + 164,236,230,203,118,60,13,66,136,75,199,142,29,119,44,95,190,220,129,231,121,24,12,6,196,196,196,120,174,95,191,190,11,33,164,19,165,52,242,57, + 29,71,30,28,28,124,127,230,204,153,170,134,13,27,194,108,54,67,175,215,187,70,71,71,247,252,246,219,111,187,21,93,147,127,86,151,223,217,217,249, + 135,111,191,253,214,69,46,151,99,239,222,189,46,157,58,117,58,77,8,105,83,93,103,139,16,194,184,184,184,140,5,208,145,231,121,49,128,139,89,89, + 89,243,104,53,84,221,29,29,29,47,57,57,57,249,201,100,50,66,139,52,248,172,19,207,243,148,231,121,232,245,122,98,48,24,174,104,52,154,167,122, + 81,218,241,114,193,213,213,245,131,188,188,188,85,18,137,68,228,228,228,4,185,92,14,129,64,0,129,64,80,83,34,145,212,148,72,36,221,59,118,236, + 56,250,248,241,227,21,42,236,183,108,236,57,20,12,153,195,18,134,5,128,122,117,92,84,142,142,142,152,51,103,142,162,119,239,222,10,0,56,115,230, + 204,224,33,67,134,116,34,132,212,47,207,217,42,203,23,121,89,80,94,197,33,240,100,83,233,200,146,43,172,205,94,47,92,184,0,91,196,202,173,45, + 18,42,130,85,97,252,218,181,107,197,203,172,15,26,177,88,140,179,103,159,20,149,111,209,162,69,153,130,153,47,18,253,195,8,5,128,237,31,23,218, + 213,127,101,97,197,249,246,143,67,208,166,182,12,253,198,206,30,152,175,55,53,5,160,203,206,202,202,186,180,107,87,114,163,224,96,209,15,63,252,208, + 204,199,199,167,31,108,116,180,0,76,105,210,164,201,78,86,230,232,58,120,200,208,193,239,11,24,211,123,35,38,206,79,72,201,208,125,248,225,135,187, + 246,238,221,59,120,241,226,197,183,38,77,154,52,5,192,116,91,237,151,74,165,254,49,49,49,65,28,199,33,52,52,244,95,215,198,128,16,210,200,193, + 193,225,123,173,86,251,46,165,244,170,117,153,82,169,252,62,47,47,175,120,153,173,176,70,176,202,154,158,23,252,253,253,37,0,36,148,210,198,163,70, + 141,146,221,136,142,198,154,181,107,173,171,155,86,182,191,245,250,49,26,141,120,235,173,183,222,229,56,78,96,117,2,13,6,131,49,39,39,71,95,162, + 178,39,157,82,218,165,50,78,66,72,45,133,66,177,20,64,227,130,130,2,31,0,80,40,20,73,60,207,239,214,233,116,211,105,81,3,223,170,130,16, + 82,3,64,24,80,110,43,40,186,112,225,194,216,41,83,166,220,255,7,56,187,186,187,187,43,238,223,191,143,213,171,87,91,156,156,156,204,189,123,247, + 150,142,27,55,142,61,127,254,124,111,0,145,182,218,84,9,58,79,156,56,81,85,191,126,125,108,220,184,209,18,21,21,149,234,239,239,239,250,250,235, + 175,75,70,143,30,45,24,50,100,72,111,0,213,118,180,52,26,205,188,137,19,39,110,217,182,109,155,242,193,131,7,88,185,114,165,235,192,129,3,35, + 9,33,237,108,117,182,72,161,72,241,88,0,29,88,150,109,51,100,200,16,203,152,49,99,132,12,195,152,151,45,91,230,182,113,227,198,129,174,174,174, + 141,51,50,50,108,122,73,35,132,12,119,116,116,252,15,203,178,1,177,177,177,206,214,190,179,214,201,108,54,23,71,140,141,70,35,94,125,245,213,218, + 213,61,255,127,19,88,150,53,241,60,47,4,32,165,148,26,42,155,255,135,205,125,174,112,113,113,25,149,149,149,181,218,211,211,19,30,30,30,79,61, + 107,13,6,3,164,82,169,200,211,211,243,219,55,223,124,83,184,103,207,158,114,135,0,9,75,102,238,253,105,174,143,179,147,18,0,176,124,237,225,124, + 0,216,179,103,15,146,147,147,225,228,228,132,250,245,235,179,115,231,206,245,154,48,97,194,87,0,222,47,143,171,180,47,242,178,160,244,176,97,201,249, + 10,115,180,40,165,197,125,242,108,65,233,86,45,165,43,18,40,165,196,104,52,162,116,68,11,0,44,22,11,132,66,225,19,251,115,28,7,66,8,45, + 197,81,89,41,234,16,133,66,17,174,211,233,190,161,148,218,244,48,40,201,185,253,227,16,108,145,76,30,100,237,68,218,125,98,225,231,22,0,231,30, + 190,191,114,85,187,118,62,99,103,172,152,93,144,153,156,49,237,221,94,254,65,158,46,50,69,118,90,142,115,221,186,93,81,168,168,108,147,157,0,218, + 14,30,60,120,235,145,11,113,68,42,21,137,4,44,43,108,221,32,216,165,134,35,235,168,4,28,19,238,199,158,27,58,116,104,131,73,147,38,181,169, + 2,39,0,64,161,80,224,251,239,191,183,230,147,217,124,238,207,11,229,113,18,66,26,5,5,5,157,136,136,136,80,141,25,51,230,24,33,164,19,0, + 4,7,7,159,152,55,111,158,106,248,240,225,199,138,34,19,79,57,91,165,57,173,209,84,171,83,53,100,200,144,119,45,22,75,241,239,185,12,7,6, + 40,229,196,216,122,238,38,147,233,24,128,87,197,98,177,57,33,62,30,187,118,63,209,137,229,184,45,231,110,181,149,227,56,193,149,43,87,132,37,126, + 235,66,0,10,0,174,148,82,48,12,243,212,3,188,52,39,33,36,68,46,151,159,219,183,111,159,234,149,87,94,33,98,177,24,22,139,5,209,209,209, + 53,22,47,94,60,226,232,209,163,175,19,66,66,105,169,230,233,182,216,9,32,236,244,233,211,186,192,192,192,50,123,150,230,230,230,10,130,131,131,219, + 1,120,234,218,122,209,156,148,210,31,8,33,15,183,111,223,254,133,197,98,121,11,128,73,171,213,166,127,242,201,39,164,118,237,218,54,71,87,42,251, + 191,171,84,170,94,29,59,118,196,182,109,219,240,229,151,95,246,163,148,254,74,8,241,203,206,206,142,27,61,122,52,234,212,169,211,15,192,231,85,225, + 180,130,16,18,220,182,109,219,111,231,204,153,163,60,112,224,0,130,130,130,144,151,151,135,79,63,253,212,125,214,172,89,39,9,33,237,173,206,86,5, + 215,81,168,68,34,217,188,109,219,54,135,192,192,192,64,145,72,196,4,6,6,66,163,209,64,175,215,75,230,207,159,223,64,38,147,93,251,250,235,175, + 55,3,232,91,153,157,132,144,79,150,46,93,186,108,220,184,113,112,115,115,51,177,44,139,115,231,206,149,123,14,190,190,190,32,132,20,55,59,174,232, + 220,5,2,193,99,0,46,0,118,113,28,55,131,218,216,39,176,60,206,34,62,119,235,60,203,178,144,72,36,16,139,197,16,139,197,24,49,98,132,54, + 34,34,66,105,43,39,249,203,187,8,39,132,252,193,178,108,133,243,165,83,67,254,206,251,167,21,132,16,95,66,200,114,0,29,0,48,12,195,68,186, + 186,186,142,75,77,77,125,100,43,167,183,183,183,139,86,171,253,218,203,203,11,30,30,30,64,33,17,124,124,124,96,54,155,241,248,241,99,80,74,145, + 157,157,13,185,92,14,111,111,239,175,71,140,24,177,99,221,186,117,153,101,114,242,88,252,198,192,136,153,44,203,50,0,192,10,20,14,159,76,5,252, + 253,253,209,186,117,107,232,245,122,228,228,228,32,44,44,76,64,8,25,204,48,140,138,82,186,134,82,250,196,253,243,127,1,21,37,195,127,94,122,92, + 148,20,117,139,23,137,68,54,57,90,69,219,87,22,65,97,204,102,51,68,34,81,241,2,179,217,12,66,8,56,142,123,98,57,80,232,104,85,3,206, + 163,71,143,230,191,253,246,219,145,132,144,181,182,58,91,165,49,120,240,224,167,154,156,78,152,48,33,49,45,45,141,190,213,53,92,113,251,96,114,74, + 109,39,7,153,155,82,25,32,117,114,86,103,102,102,158,7,160,174,194,33,234,52,105,210,68,182,101,215,233,196,225,227,23,206,125,37,208,69,213,208, + 215,213,201,211,81,38,118,96,136,78,106,49,39,58,59,59,7,85,213,110,235,125,67,46,151,131,97,152,127,85,68,203,193,193,225,251,136,136,8,85, + 151,46,93,176,121,243,102,245,144,33,67,142,121,120,120,48,81,81,81,42,158,231,49,103,206,28,245,140,25,51,190,7,80,207,22,62,158,231,97,50, + 153,96,50,153,138,29,152,18,191,161,98,7,198,186,45,203,178,213,138,66,24,12,134,111,188,189,189,91,180,105,211,70,92,228,100,233,0,176,0,226, + 1,124,98,11,135,53,42,0,20,54,237,142,143,143,135,80,40,44,238,89,39,20,10,33,149,74,109,178,71,34,145,76,252,249,231,159,85,205,154,53, + 35,153,153,153,224,121,190,248,38,185,122,245,106,105,191,126,253,124,162,162,162,166,161,148,51,96,35,72,121,14,17,0,168,84,42,11,128,170,54,191, + 44,147,211,98,177,144,86,173,90,77,202,200,200,104,80,80,80,48,223,22,34,74,233,121,0,45,172,243,117,234,212,121,4,192,223,221,221,189,78,21, + 109,42,23,190,190,190,205,100,50,25,46,95,190,12,0,71,139,142,251,168,78,157,58,9,0,106,184,187,187,219,52,222,75,8,9,14,9,9,249,221, + 221,221,93,102,189,135,246,239,223,95,184,126,253,122,101,82,82,18,76,38,19,166,76,153,130,158,61,123,194,213,213,21,19,38,76,240,88,178,100,201, + 15,0,154,84,192,41,21,139,197,91,239,222,189,27,228,229,229,37,187,112,225,2,26,54,108,136,140,140,12,164,166,166,66,171,213,34,53,53,21,239, + 191,255,190,251,87,95,125,229,109,131,141,159,44,89,178,100,217,132,9,19,176,108,217,50,176,44,107,160,148,138,74,190,12,151,179,159,45,95,1,240, + 151,83,212,71,32,16,244,84,40,20,199,229,114,249,244,180,180,180,104,91,9,74,193,197,250,135,64,32,128,84,42,133,68,34,129,68,34,129,66,161, + 128,187,187,187,162,154,188,47,5,8,33,62,132,144,155,34,145,72,34,151,203,69,12,195,64,34,145,116,117,118,118,190,241,218,107,175,213,63,114,228, + 72,156,45,60,122,189,126,171,68,34,17,186,187,23,254,123,130,130,130,208,176,97,67,232,116,58,62,39,39,7,106,181,154,121,244,232,17,10,10,10, + 144,146,146,2,63,63,63,33,195,48,91,1,188,94,22,223,217,168,148,181,0,138,195,252,110,110,110,143,1,200,172,243,82,169,20,62,62,62,72,74, + 74,130,82,169,100,103,205,154,213,247,151,95,126,233,67,8,25,76,41,253,190,4,213,83,190,200,203,132,178,242,180,128,34,71,171,71,143,30,179,15, + 28,56,208,174,244,78,148,82,8,133,194,231,150,235,98,117,168,84,42,85,241,178,162,168,21,120,158,47,47,162,85,229,227,72,165,82,217,168,81,163, + 242,214,172,89,83,101,103,171,255,202,219,197,81,172,210,8,13,13,61,55,109,218,180,222,39,78,156,72,122,37,48,64,160,72,126,164,149,170,212,106, + 248,214,236,49,228,205,190,215,81,88,125,104,43,238,230,229,229,201,106,251,202,141,12,163,39,53,37,2,165,151,66,36,241,116,114,242,17,25,13,105, + 42,39,39,177,193,96,200,6,80,110,19,104,0,240,244,244,60,44,147,201,252,172,243,30,30,30,142,148,82,200,229,114,120,121,121,57,4,4,4,20, + 15,69,232,245,250,71,169,169,169,149,190,249,59,57,57,29,150,72,36,126,12,195,128,16,2,150,101,193,48,12,24,134,41,254,155,101,89,16,66,144, + 159,159,255,232,225,195,135,54,69,19,180,90,237,187,99,198,140,57,182,101,203,22,117,131,6,13,176,119,239,94,181,179,179,51,120,158,71,84,84,20, + 102,206,156,153,157,147,147,243,174,45,92,0,158,72,126,183,190,20,196,196,196,20,59,46,37,39,165,178,204,151,220,74,65,8,9,105,211,166,205,242, + 1,3,6,144,133,11,23,82,20,14,127,73,1,4,164,164,164,36,82,27,47,14,74,41,76,166,191,82,102,4,2,1,132,66,161,53,31,162,74,205, + 129,89,150,237,218,164,73,19,146,147,147,99,117,32,33,16,8,192,178,44,88,150,197,170,85,171,100,205,154,53,139,144,74,165,147,68,34,81,174,217, + 108,254,73,175,215,207,167,148,86,57,169,245,69,162,77,155,54,227,19,18,18,122,250,249,249,237,171,46,7,165,212,8,60,17,153,120,102,88,35,193, + 69,81,211,252,18,199,178,14,199,218,116,44,87,87,215,31,126,251,237,55,95,63,63,63,152,205,102,88,44,22,104,181,90,68,70,70,194,96,48,192, + 98,177,32,40,40,8,51,103,206,212,143,27,55,78,186,110,221,186,52,173,86,251,78,37,180,227,118,236,216,161,240,242,242,146,21,20,20,224,254,253, + 251,104,210,164,9,242,242,242,160,211,233,144,159,159,15,147,201,132,220,220,92,53,199,113,198,74,206,115,240,168,81,163,150,141,28,57,18,155,55,111, + 198,134,13,27,52,110,110,110,142,221,186,117,43,254,173,90,44,22,188,253,246,219,104,214,172,89,241,126,69,247,130,42,61,20,4,2,129,64,34,145, + 8,164,82,105,55,137,68,210,33,56,56,248,130,68,34,153,118,253,250,245,75,85,225,1,176,11,133,78,155,64,38,147,65,42,149,66,42,149,66,44, + 22,163,85,171,86,92,126,126,254,181,74,25,74,160,244,245,91,217,252,63,13,66,200,114,145,72,36,113,118,118,46,126,163,228,121,94,228,224,224,0, + 119,119,247,149,0,186,219,194,67,41,109,228,236,236,92,124,127,15,15,15,71,66,66,194,238,156,156,156,247,210,210,210,192,48,204,86,134,97,250,20, + 241,35,43,43,11,53,106,212,104,84,30,95,171,38,94,35,65,104,113,68,43,180,142,147,67,201,245,42,149,10,42,149,10,15,31,62,132,78,167,163, + 177,177,177,100,212,168,81,196,104,52,126,71,8,57,79,41,125,0,148,239,139,188,12,168,86,142,150,53,162,101,235,3,128,16,242,212,208,97,105,152, + 205,102,135,176,176,176,178,18,190,72,89,142,22,165,244,169,161,67,91,33,20,10,149,213,117,182,74,99,223,206,109,30,139,103,78,153,233,236,29,80, + 123,210,164,25,130,94,189,122,93,216,178,101,11,231,92,175,123,167,227,135,191,247,248,250,211,201,7,127,251,237,55,0,88,93,5,218,51,251,247,239, + 247,156,48,118,52,102,78,28,119,72,21,228,42,118,32,206,10,169,65,151,238,0,90,32,169,19,210,115,215,190,125,41,0,162,42,34,145,203,229,126, + 55,111,222,12,42,89,72,96,52,26,33,151,203,113,252,248,113,55,153,76,230,6,0,5,5,5,168,95,191,190,77,134,73,36,18,191,59,119,238,4, + 41,149,74,228,231,231,195,96,48,192,108,54,131,231,121,16,66,32,20,10,33,22,139,161,80,40,170,84,217,71,41,189,74,8,233,52,120,240,224,99, + 251,246,237,83,215,174,93,27,44,203,34,54,54,22,125,251,246,205,206,206,206,46,115,216,176,60,88,163,68,37,243,177,4,2,1,126,8,12,196,240, + 228,228,98,7,102,185,163,35,102,218,144,103,88,26,132,144,144,46,93,186,156,248,241,199,31,221,79,156,56,129,215,94,123,141,28,58,116,136,7,64, + 147,147,147,19,108,229,177,230,187,88,29,66,171,157,165,39,91,97,177,88,148,98,177,24,122,189,30,66,161,176,216,193,178,78,181,106,213,130,70,163, + 17,228,230,230,10,146,147,147,229,243,230,205,27,115,242,228,73,47,0,131,170,250,29,60,79,172,89,179,198,111,248,240,225,241,2,129,128,118,235,214, + 237,221,71,143,30,189,233,229,229,117,236,196,137,19,95,2,168,60,201,179,20,220,220,220,46,187,184,184,248,30,60,120,208,204,48,12,223,164,73,147, + 172,146,69,59,28,199,81,163,209,136,228,228,100,90,80,80,224,82,57,99,33,167,187,187,187,207,242,229,203,77,249,249,249,79,112,42,20,10,209,47, + 191,252,98,202,203,203,227,100,50,89,102,101,156,25,25,25,239,12,30,60,248,244,177,99,199,92,89,150,197,163,71,143,144,153,153,9,181,90,141,173, + 91,183,194,207,207,15,59,118,236,208,104,52,154,15,150,46,93,26,161,213,106,109,145,122,104,219,188,121,115,191,236,236,108,168,213,106,232,116,58,92, + 190,124,25,161,161,161,72,78,78,6,195,48,80,171,213,88,189,122,117,62,33,68,83,9,215,232,89,179,102,193,104,52,162,87,175,94,232,213,171,151, + 115,233,13,76,38,19,222,123,239,61,180,105,83,156,193,0,66,72,149,94,128,5,2,1,74,56,69,172,68,34,145,137,197,226,246,82,169,244,228,142, + 29,59,146,251,245,235,103,115,52,146,227,184,25,2,129,160,103,145,211,6,153,76,6,137,68,2,165,82,137,246,237,219,211,7,15,30,76,176,217,176, + 66,62,17,33,164,17,138,156,231,202,230,255,5,104,39,147,201,68,165,23,230,231,231,139,188,188,188,218,148,181,67,89,16,8,4,46,50,89,97,192, + 201,207,207,15,57,57,57,156,209,104,28,184,117,235,86,51,0,52,105,210,100,32,199,113,122,139,197,194,138,197,98,232,116,58,184,187,187,151,255,123, + 103,240,217,222,159,230,121,150,206,209,242,242,242,66,227,198,141,97,48,24,144,146,146,130,200,200,72,51,199,113,63,174,89,179,134,119,115,115,27,246, + 214,91,111,177,81,81,81,31,3,24,111,165,250,95,201,209,42,9,107,213,97,59,0,39,1,180,47,125,146,165,157,159,10,14,82,233,208,161,88,44, + 206,142,143,143,87,148,124,168,88,44,22,120,123,123,243,148,82,82,150,163,85,153,243,86,17,132,66,161,114,234,212,169,217,107,214,172,121,7,192,108, + 91,246,217,254,113,8,182,148,152,223,183,115,155,199,218,197,115,86,126,179,100,158,243,189,131,223,97,195,138,47,56,142,67,84,131,6,13,218,104,181, + 90,129,163,194,140,140,108,28,68,161,142,150,77,78,97,209,27,243,166,63,254,248,35,170,123,247,238,103,55,253,188,203,57,249,254,253,243,146,220,140, + 20,85,157,32,129,200,199,175,79,158,94,47,26,56,112,160,27,128,183,42,226,98,89,22,217,217,217,72,77,125,114,164,83,46,151,35,38,38,230,169, + 109,109,1,195,48,224,56,14,59,119,238,132,92,46,135,66,161,120,98,178,58,89,213,13,34,120,120,120,48,78,78,78,79,68,97,170,202,101,205,209, + 50,26,141,48,26,141,48,153,76,28,0,161,64,32,192,251,137,137,197,81,158,170,56,48,37,65,8,169,215,179,103,207,19,91,183,110,117,187,124,249, + 50,226,226,226,176,119,239,222,123,132,144,113,2,129,224,237,170,242,149,72,210,231,114,115,115,133,185,185,185,197,209,65,161,80,88,28,49,180,5,28, + 199,137,4,2,65,241,219,168,117,42,249,125,178,44,11,15,15,15,120,122,122,98,237,218,181,162,128,128,128,158,85,254,18,158,35,150,44,89,82,103, + 249,242,229,27,183,108,217,114,240,157,119,222,249,37,58,58,122,168,163,163,227,159,199,143,31,159,39,145,72,170,219,83,206,227,246,237,219,114,179,217, + 98,173,140,19,91,157,90,107,180,147,227,57,52,111,214,172,194,168,112,105,206,27,55,110,40,74,112,74,202,225,212,87,70,68,41,189,67,8,105,211, + 185,115,231,115,191,255,254,187,147,159,159,31,146,146,146,144,148,148,132,58,117,234,96,193,130,5,186,220,220,220,86,69,206,213,175,54,218,231,237,228, + 228,36,140,143,143,135,197,98,65,163,70,141,176,122,245,106,12,28,56,16,245,235,215,71,110,110,46,110,222,188,137,205,155,55,59,137,68,162,10,239, + 29,0,214,206,153,51,231,149,207,63,255,28,203,151,47,199,206,157,59,179,8,33,42,79,79,79,214,42,65,2,0,67,134,12,121,34,175,214,214,251, + 136,117,91,107,212,201,234,108,73,36,18,72,165,82,198,193,193,65,22,22,22,86,165,164,122,74,233,93,133,66,113,92,42,149,118,147,74,165,172,149, + 187,101,203,150,188,94,175,191,59,117,234,212,51,85,225,43,226,188,90,149,249,127,18,214,156,180,210,16,139,197,240,244,244,180,153,71,34,145,16,235, + 189,209,98,177,32,39,39,135,243,242,242,42,30,222,191,114,229,10,231,239,239,207,177,44,203,138,197,98,16,66,32,151,203,203,189,73,83,142,206,233, + 53,112,70,113,213,33,17,40,84,159,76,45,116,212,175,92,185,2,147,201,132,200,200,72,243,210,165,75,147,179,179,179,63,1,32,56,124,248,240,224, + 201,147,39,179,238,238,238,197,121,180,21,249,34,47,3,74,15,25,150,78,134,63,217,163,71,15,82,84,90,73,138,118,0,96,187,163,85,244,144,168, + 244,105,73,8,65,74,74,74,241,188,187,187,123,149,143,101,43,92,92,92,116,45,90,180,80,102,100,100,216,122,19,123,2,86,39,107,209,188,217,206, + 153,183,206,35,49,57,5,154,52,115,212,153,63,31,238,6,80,152,17,189,174,222,73,140,184,181,202,86,206,122,110,242,240,6,222,202,221,93,186,247, + 172,49,224,195,241,204,71,31,125,212,122,240,224,193,57,239,188,243,206,88,7,7,135,96,147,201,148,181,235,192,129,184,1,3,6,4,112,28,55,184, + 188,50,88,43,10,10,10,30,181,111,255,87,53,172,187,187,187,234,232,209,163,30,113,113,113,24,61,122,116,122,82,82,82,118,201,109,109,177,209,100, + 50,61,10,15,15,47,119,184,208,58,164,8,0,121,121,121,54,113,2,133,201,240,193,193,193,39,162,162,162,84,148,82,220,185,115,7,44,203,162,78, + 157,58,248,237,183,223,212,221,187,119,47,55,25,190,44,232,245,122,248,249,249,65,175,215,67,167,211,229,3,144,108,13,8,0,0,124,156,153,137,203, + 75,151,226,194,194,133,214,99,219,106,38,196,98,113,216,91,111,189,117,108,211,166,77,110,177,177,177,136,139,139,195,87,95,125,117,47,51,51,179,53, + 165,52,13,192,161,42,156,115,160,167,167,103,183,238,221,187,123,3,128,78,167,35,127,252,241,7,164,82,105,241,181,176,111,223,62,36,37,37,129,16, + 2,39,39,39,95,66,72,0,165,244,97,121,156,148,82,242,240,225,67,44,90,180,8,60,207,99,242,228,201,8,10,10,42,118,176,30,61,122,132,121, + 243,230,129,227,56,204,154,53,11,117,234,212,129,217,108,150,18,66,4,148,82,75,121,188,47,18,19,38,76,184,183,123,247,238,131,9,9,9,175,47, + 94,188,184,29,33,132,159,52,105,210,34,149,74,85,173,68,76,43,180,186,2,196,222,143,135,133,227,96,177,88,144,152,24,15,119,119,119,24,141,133, + 67,117,142,42,229,83,185,159,127,51,103,190,217,108,214,245,233,211,71,189,115,231,78,82,167,78,29,60,120,240,0,66,161,16,132,144,124,91,171,12, + 75,32,73,163,209,4,177,44,43,186,123,247,46,252,253,253,209,188,121,115,204,159,63,31,25,25,25,176,88,44,112,119,119,231,205,102,243,21,163,209, + 120,170,34,34,74,233,38,66,136,146,227,184,101,243,230,205,67,102,102,166,211,238,221,187,181,215,175,95,119,72,79,79,47,119,191,162,251,128,77,47, + 149,214,252,169,18,14,22,148,74,37,90,180,104,65,187,116,233,194,39,39,39,199,219,82,177,94,18,114,185,124,186,68,34,233,32,145,72,100,214,104, + 86,167,78,157,248,248,248,248,114,146,62,254,94,188,200,74,70,47,47,175,72,165,82,217,51,43,43,235,137,31,96,171,86,173,76,30,30,30,167,109, + 229,113,112,112,200,98,89,214,5,0,146,146,146,160,80,40,68,247,239,223,95,72,8,153,2,0,1,1,1,11,53,26,141,40,160,232,126,234,233,233, + 9,163,209,88,238,11,203,185,43,169,223,1,248,206,58,239,226,226,146,146,147,147,35,251,226,139,47,180,11,23,46,44,224,56,206,0,224,120,118,118, + 118,177,142,150,191,191,127,142,80,40,116,86,171,213,62,37,168,158,242,69,94,38,84,24,209,2,138,245,43,138,97,13,15,219,122,67,177,229,109,220, + 154,163,85,50,202,96,77,120,47,235,88,69,15,245,106,13,29,22,57,89,210,93,187,118,109,93,188,120,241,69,91,247,43,153,163,181,238,203,185,139, + 173,78,214,245,51,191,227,215,219,57,25,147,23,46,91,94,29,123,0,32,212,77,209,208,211,195,245,228,210,133,115,85,247,14,126,135,95,214,125,69, + 175,95,186,212,236,210,165,75,239,141,30,61,186,38,10,127,88,26,0,215,0,12,160,148,230,84,198,153,152,152,248,68,126,84,80,80,208,29,145,72, + 228,33,151,203,145,148,148,164,189,115,231,78,149,135,100,210,211,211,95,136,62,142,163,163,227,247,243,230,205,83,1,64,84,84,20,250,246,237,155,13, + 0,191,253,246,155,58,48,48,16,235,215,175,87,15,31,62,220,166,100,120,179,217,156,93,175,94,225,102,60,207,35,39,39,135,7,128,15,83,82,176, + 222,203,11,2,129,0,23,22,46,196,116,179,25,243,171,232,192,123,123,123,239,220,176,97,131,91,70,70,6,226,226,226,48,123,246,236,187,233,233,233, + 173,41,165,229,63,125,202,0,33,164,126,72,72,200,209,227,199,143,187,41,149,74,104,181,90,104,181,90,12,25,50,4,3,7,14,132,193,96,192,246, + 237,219,177,119,239,94,168,84,42,104,181,90,232,116,58,167,30,61,122,156,35,132,180,45,175,66,139,82,74,187,118,237,138,211,167,79,131,101,89,52, + 107,214,12,153,153,197,197,64,240,240,240,40,107,29,139,194,235,253,31,113,180,4,2,1,141,140,140,92,220,174,93,59,36,36,36,188,222,164,73,147, + 111,134,14,29,154,244,172,188,14,10,25,66,234,248,193,104,52,194,96,48,160,103,215,246,184,125,251,54,52,154,44,228,231,231,195,217,197,177,202,82, + 31,207,139,147,16,82,163,107,215,174,39,126,252,241,71,151,205,155,55,27,219,183,111,47,254,230,155,111,136,74,165,66,90,90,90,117,79,57,242,204, + 153,51,126,157,59,119,174,123,235,214,45,68,70,70,194,104,52,162,113,227,198,136,141,141,69,139,22,45,160,213,106,47,94,186,116,105,175,45,100,148, + 210,229,69,47,33,203,102,205,154,133,61,123,246,136,9,33,176,33,25,222,166,40,164,88,44,46,174,10,84,42,149,104,217,178,37,223,169,83,39,222, + 104,52,38,198,199,199,127,54,104,208,160,170,228,181,2,0,210,210,210,162,131,131,131,47,20,13,63,50,45,90,180,160,70,163,49,113,248,240,225,54, + 191,0,189,72,60,107,37,99,69,240,244,160,62,97,127,0,0,32,0,73,68,65,84,244,252,196,213,213,181,115,173,90,181,240,248,241,99,81,81,110, + 154,169,105,211,166,38,79,79,207,143,109,229,145,72,36,183,68,34,81,91,107,164,54,62,62,30,148,210,201,245,235,215,31,151,151,151,135,204,204,76, + 177,74,165,42,126,169,174,91,183,46,12,6,195,45,91,249,89,150,157,227,239,239,31,33,18,137,230,167,167,167,63,37,11,65,8,17,135,135,135,171, + 68,34,17,76,38,211,19,206,102,105,95,228,101,129,173,57,90,164,44,103,171,42,17,45,91,162,6,214,4,251,146,243,86,167,174,244,177,170,59,52, + 229,232,232,104,176,58,89,243,230,205,179,217,201,42,137,29,63,126,239,229,200,231,215,72,190,248,27,98,174,95,198,238,155,217,25,147,23,46,27,219, + 235,173,65,143,75,110,215,127,229,109,108,31,81,57,95,176,187,162,190,143,135,203,201,175,150,46,82,101,222,58,143,148,212,84,252,118,241,82,148,145, + 210,155,0,38,87,199,198,178,96,13,235,203,229,114,176,44,251,175,250,193,230,228,228,188,59,124,248,240,99,243,230,205,83,207,152,49,35,59,43,43, + 171,19,0,116,239,222,253,216,250,245,235,213,211,166,77,203,205,206,206,182,41,25,62,43,43,235,137,150,53,69,50,14,174,214,243,23,8,4,104,21, + 17,81,101,39,75,44,22,215,111,214,172,153,3,207,243,120,248,240,33,29,63,126,252,189,212,212,212,42,59,89,0,224,233,233,57,241,248,241,227,110, + 155,54,109,202,221,178,101,75,38,207,243,194,240,240,112,223,87,94,121,133,108,221,186,21,0,48,96,192,0,76,158,60,25,55,110,220,128,66,161,64, + 235,214,173,185,217,179,103,187,127,242,201,39,31,163,80,39,233,41,112,28,39,10,8,8,56,6,160,227,173,91,183,0,224,28,165,180,88,52,181,162, + 117,54,128,207,203,203,19,42,149,202,50,61,9,81,225,219,80,85,135,250,138,57,207,158,61,187,232,203,47,191,220,253,233,167,159,22,59,145,213,228, + 4,240,116,244,105,208,219,239,128,163,4,143,53,121,208,235,13,208,25,184,42,23,243,60,15,78,66,136,188,75,151,46,135,127,250,233,39,207,243,231, + 207,131,227,56,62,54,54,246,97,159,62,125,84,147,38,77,114,121,134,34,163,21,131,6,13,234,119,246,236,89,77,221,186,117,157,47,94,188,136,180, + 180,52,88,44,22,116,236,216,17,98,177,56,126,225,194,133,34,0,43,108,37,44,114,182,52,63,254,248,227,48,149,74,21,74,8,113,201,31,57,18, + 78,223,125,135,149,43,159,150,5,252,240,195,15,193,48,140,77,14,187,53,205,160,85,171,86,92,251,246,237,169,94,175,191,27,31,31,63,241,89,157, + 34,137,68,50,77,42,149,158,116,112,112,144,117,233,210,133,143,143,143,255,236,89,248,94,22,92,188,120,49,105,244,232,209,161,42,149,106,121,155,54, + 109,58,184,184,184,48,78,78,78,145,62,62,62,227,26,54,108,248,200,86,30,161,80,56,84,161,80,220,179,88,44,108,209,11,30,0,192,98,177,136, + 25,134,65,64,64,64,241,179,164,89,179,102,240,244,244,228,110,223,190,61,212,86,254,180,180,180,39,170,16,203,192,136,86,173,90,9,12,6,3,226, + 226,226,158,24,238,45,203,23,121,25,80,122,216,16,40,225,124,81,74,177,127,255,126,90,242,147,82,10,31,31,159,4,179,217,76,111,2,244,218,181, + 107,244,195,15,63,172,112,210,235,245,212,221,221,61,197,186,127,209,77,164,115,201,121,31,31,159,4,131,193,240,196,126,6,131,129,122,120,120,112,5, + 5,5,79,113,22,20,20,80,95,95,223,164,138,56,75,79,0,134,92,189,122,117,205,244,233,211,155,87,180,93,185,156,107,67,232,230,205,155,255,67, + 41,109,215,38,212,239,207,254,225,30,180,85,144,123,242,222,29,63,14,164,148,182,43,61,245,11,5,173,140,51,196,67,81,175,83,88,205,172,63,15, + 255,68,143,127,57,134,126,217,59,136,54,241,85,102,135,184,202,194,109,181,209,150,115,167,148,34,44,44,236,14,207,243,212,104,52,210,176,176,176,216, + 231,193,89,213,169,34,78,0,141,28,29,29,111,1,104,84,114,153,90,173,126,98,89,85,237,4,112,157,82,74,53,26,13,213,106,181,212,96,48,80, + 142,227,104,73,20,109,83,33,103,64,64,64,236,241,227,199,249,160,160,160,132,26,53,106,156,69,145,190,85,117,206,221,203,203,235,225,253,251,247,105, + 237,218,181,19,138,184,63,209,233,116,180,52,116,58,29,237,208,161,3,141,141,141,165,254,254,254,250,216,216,88,234,229,229,21,83,145,157,0,106,249, + 248,248,28,115,117,117,141,4,16,100,235,186,202,190,207,237,219,183,7,82,74,63,160,148,126,88,206,244,1,165,52,228,159,230,164,148,194,213,213,53, + 145,82,74,11,10,244,52,59,59,135,166,166,62,166,121,121,121,52,47,47,143,222,186,117,155,94,186,116,153,70,223,184,65,125,125,125,51,255,110,78, + 23,23,151,117,169,169,169,218,115,231,206,229,175,93,187,54,223,211,211,243,22,0,63,0,193,78,78,78,169,99,198,140,161,14,14,14,143,108,253,45, + 149,90,30,42,20,10,175,46,94,188,248,143,253,251,247,63,222,187,119,175,113,227,198,141,137,163,71,143,62,37,16,8,174,2,8,173,42,167,117,170, + 81,163,198,173,212,212,84,106,177,88,168,217,108,166,38,147,137,154,76,38,106,52,26,169,209,104,164,6,131,129,30,57,114,196,226,233,233,121,210,22, + 206,185,115,231,230,173,95,191,158,95,182,108,217,229,5,11,22,180,174,232,216,85,177,147,82,138,95,126,249,37,54,38,38,134,30,59,118,236,193,243, + 226,172,234,84,22,39,195,48,38,0,20,192,171,40,212,185,170,112,254,159,178,179,83,167,78,179,6,14,28,72,187,117,235,70,27,55,110,252,212,212, + 164,73,19,58,106,212,40,186,127,255,126,186,116,233,210,89,207,106,39,10,3,59,193,0,22,116,234,212,201,124,250,244,105,58,96,192,0,10,160,171, + 117,155,178,124,145,151,109,2,240,97,233,101,86,121,7,82,242,19,0,76,38,83,194,157,59,119,188,234,90,44,44,0,172,90,245,100,26,82,17,97, + 49,78,159,62,109,33,132,220,67,5,48,153,76,9,199,143,31,247,88,185,114,101,113,152,33,33,33,1,22,139,133,79,78,78,102,190,249,230,155,39, + 182,63,121,242,164,197,98,177,196,87,196,89,26,148,210,205,0,54,63,143,62,119,167,110,196,141,59,252,219,30,215,87,155,183,201,86,57,59,151,249, + 6,103,85,144,175,8,68,192,204,95,178,112,174,218,58,4,249,243,149,212,108,189,129,235,112,43,61,255,250,51,27,89,10,90,173,54,206,122,238,58, + 157,174,74,223,221,223,1,90,152,127,85,175,178,101,213,1,207,243,112,116,116,4,80,245,202,168,18,182,196,126,240,193,7,25,113,113,113,111,82,74, + 51,158,197,30,74,233,217,232,232,104,255,33,67,134,40,131,130,130,238,19,66,132,239,191,255,190,201,211,211,83,116,230,204,25,51,0,210,174,93,59, + 65,106,106,42,77,74,74,210,188,241,198,27,121,195,135,15,119,185,118,237,154,152,231,249,10,69,11,105,97,57,116,167,170,174,171,12,253,250,245,187, + 143,50,132,67,159,5,47,130,211,10,173,174,0,247,30,38,130,167,20,28,199,129,43,138,66,89,171,60,249,156,124,88,44,85,27,45,125,86,78,161, + 80,216,122,249,242,229,221,25,134,97,46,92,184,96,88,178,100,73,66,122,122,122,111,74,105,60,0,16,66,218,111,222,188,249,7,27,164,28,202,4, + 165,244,38,33,164,197,103,159,125,54,22,64,107,0,53,81,168,233,118,6,192,10,250,12,10,230,9,9,9,221,26,52,104,176,135,16,226,88,222,54, + 12,195,164,164,166,166,246,45,111,125,73,148,39,30,250,60,208,191,127,255,32,192,182,174,36,127,39,94,150,74,198,163,71,143,126,254,230,155,111,10, + 252,252,252,166,249,249,249,49,89,89,89,208,106,181,96,24,6,158,158,158,8,11,11,131,167,167,39,127,235,214,173,5,159,125,246,89,165,154,124,161, + 161,161,129,102,179,185,54,195,48,129,0,2,41,165,129,132,144,64,0,206,0,208,172,89,51,149,191,191,191,224,213,87,95,69,243,230,205,113,242,228, + 73,236,216,177,227,59,74,233,97,43,71,89,190,200,63,13,66,72,59,20,22,211,205,70,81,162,62,45,167,221,87,121,149,135,229,150,100,165,167,167, + 119,237,216,177,227,239,44,203,6,216,98,12,165,52,238,241,227,199,101,138,153,149,228,28,58,116,232,19,156,28,199,25,50,51,51,63,106,217,178,229, + 106,150,101,159,40,167,224,121,254,81,90,90,218,223,218,171,175,180,142,86,215,238,111,62,211,195,22,0,28,68,76,237,152,253,235,241,56,45,3,63, + 95,73,205,202,51,114,237,239,164,235,170,43,216,87,33,226,226,226,186,189,8,222,151,0,233,54,8,146,86,58,252,247,240,225,195,94,207,201,30,164, + 166,166,126,17,17,17,241,218,130,5,11,220,14,30,60,168,2,10,95,80,250,246,237,155,22,29,29,221,6,128,68,175,215,31,93,176,96,129,219,156, + 57,115,92,80,36,198,216,163,71,143,199,143,31,63,182,181,149,211,255,45,196,98,241,233,90,1,126,109,128,191,94,252,74,188,85,22,127,242,60,255, + 184,28,138,23,194,201,178,236,167,205,155,55,103,63,253,244,211,199,7,15,30,180,54,210,45,169,199,117,7,21,136,146,218,130,34,103,106,73,209,244, + 220,64,41,77,0,208,248,121,114,254,63,130,190,36,149,140,123,246,236,153,49,112,224,192,205,206,206,206,223,7,6,6,214,245,240,240,80,201,100,50, + 24,12,134,60,163,209,24,115,231,206,157,119,34,34,34,30,216,194,181,121,243,102,22,128,136,231,121,41,195,48,10,0,42,66,136,19,138,28,45,66, + 8,76,38,19,226,226,226,48,125,250,116,238,216,177,99,75,1,204,170,130,185,77,1,184,225,175,251,184,27,0,35,0,113,209,178,170,106,178,217,138, + 147,148,82,66,8,161,214,79,148,225,36,151,37,86,74,43,107,193,67,41,213,161,132,2,243,243,64,37,156,126,207,243,88,207,130,193,134,37,219,176, + 110,201,19,125,14,1,148,63,95,73,142,86,78,129,101,244,138,195,55,190,48,88,40,111,178,240,195,238,164,233,110,190,32,211,255,111,65,109,232,15, + 248,119,131,82,26,77,8,105,57,122,244,232,25,114,185,188,25,0,228,231,231,95,72,78,78,158,75,139,170,10,43,91,111,71,249,72,76,76,172,178, + 204,198,223,193,105,52,26,199,181,108,217,242,107,142,227,190,52,155,205,85,150,27,176,195,142,191,19,63,255,252,243,3,20,61,151,251,247,239,207,2, + 192,246,237,219,171,92,13,60,100,200,16,142,22,54,50,215,163,176,123,70,46,10,5,183,9,0,232,116,186,172,228,228,228,91,28,199,221,2,240,3, + 173,122,197,173,27,33,100,63,165,180,39,0,88,255,46,185,236,5,161,61,33,36,178,232,179,220,166,215,101,69,178,172,168,158,200,208,255,48,182,223, + 248,75,11,172,180,3,85,217,124,121,136,73,213,70,226,25,223,96,237,120,57,65,11,133,114,7,87,119,189,29,47,31,138,134,8,123,255,211,118,216, + 97,71,85,81,29,7,203,138,155,55,111,190,176,20,129,127,18,69,195,132,237,138,102,43,28,210,44,43,154,5,84,189,103,153,29,118,216,97,135,29, + 118,216,97,199,255,5,8,33,237,8,33,180,196,212,174,156,237,62,164,148,174,183,78,37,157,46,2,160,115,89,59,209,42,116,37,47,42,173,175,18, + 42,227,183,115,218,57,237,156,118,78,59,167,157,211,206,249,191,199,89,77,244,168,100,232,240,192,11,56,38,74,228,102,205,166,148,206,182,206,151,177, + 221,19,137,240,79,204,191,224,50,199,191,85,58,192,206,105,231,180,115,218,57,237,156,118,78,59,231,203,201,89,201,212,97,202,148,41,83,81,40,141, + 65,167,76,153,50,149,82,218,163,208,141,161,61,94,212,113,81,56,108,72,75,76,237,42,216,246,67,235,84,114,185,61,71,203,14,59,236,176,195,14, + 59,236,248,183,227,220,194,133,11,243,23,46,92,104,77,124,79,7,64,104,97,52,171,202,130,210,182,130,22,230,104,217,36,55,65,43,107,193,243,119, + 131,16,226,205,8,68,239,10,69,146,14,160,124,24,0,128,97,111,112,70,253,9,139,197,244,61,165,52,185,186,220,245,8,169,87,71,45,219,107,224, + 56,81,66,158,177,223,45,74,255,168,14,79,127,66,90,73,196,226,35,18,181,90,86,214,122,67,118,118,129,193,104,124,109,59,165,103,171,107,171,29, + 118,216,97,135,29,118,252,157,32,132,40,156,156,156,142,49,12,227,87,98,25,202,250,27,0,56,142,75,209,104,52,175,209,10,180,5,95,4,103,41, + 24,1,84,235,89,254,60,81,157,161,67,1,240,68,111,161,191,165,99,182,64,36,29,174,118,245,156,255,159,161,227,92,130,130,235,146,26,53,124,0, + 10,196,39,36,122,220,187,27,219,233,151,45,43,38,136,164,210,233,38,189,254,219,170,114,135,18,162,240,115,144,156,249,118,202,219,106,1,44,24,52, + 239,199,67,161,132,212,184,89,40,45,97,51,250,19,210,74,237,226,114,120,225,209,163,50,167,134,13,159,88,71,41,45,236,175,119,253,186,108,218,107, + 175,29,238,79,72,87,187,179,245,191,7,66,136,167,74,165,250,68,40,20,182,55,153,76,126,98,177,56,129,227,184,200,172,172,172,229,148,210,103,238, + 211,103,199,191,27,33,94,14,109,234,6,250,253,152,156,250,248,74,174,222,248,126,76,82,158,230,159,182,201,142,231,7,165,82,121,153,97,24,95,224, + 47,39,192,218,179,215,58,95,250,147,231,249,7,153,153,153,45,203,227,36,132,4,58,59,59,175,6,208,180,50,193,228,162,161,166,75,26,141,230,35, + 90,88,125,92,22,159,210,201,201,233,115,66,72,127,134,97,216,202,206,137,231,121,142,82,186,61,43,43,107,22,165,52,175,188,237,156,156,156,142,222, + 190,125,187,169,187,187,123,165,145,26,139,197,130,248,248,120,183,102,205,154,157,2,80,174,66,247,243,224,252,187,125,145,234,160,44,39,171,50,148,213, + 235,240,133,42,178,138,101,202,189,173,59,246,236,48,106,236,167,138,171,209,49,56,114,242,60,114,117,6,176,12,3,181,82,142,224,224,218,100,217,250, + 157,174,223,173,93,246,165,204,65,221,163,64,155,253,70,85,248,21,114,193,244,201,125,154,41,92,156,57,128,231,48,177,123,184,98,218,254,43,211,1, + 76,181,149,163,216,201,58,118,76,158,246,248,49,230,120,123,67,96,177,64,202,48,144,18,2,41,195,64,33,149,162,219,198,141,152,123,240,160,124,198, + 235,175,219,157,173,255,49,40,149,202,161,193,193,193,75,54,108,216,224,82,171,86,45,40,20,10,104,52,26,215,59,119,238,52,26,63,126,252,96,71, + 71,199,136,156,156,156,117,255,180,157,118,188,56,240,60,222,221,52,255,35,159,148,71,119,125,70,44,216,22,28,226,42,111,127,59,35,63,245,159,182, + 235,121,194,197,197,165,147,171,171,235,26,216,88,129,78,41,229,50,50,50,222,211,104,52,149,246,144,37,132,52,114,112,112,248,94,171,213,190,75,75, + 9,116,18,66,26,57,254,183,189,239,14,143,162,218,223,127,207,204,206,214,108,54,155,178,9,9,1,34,72,8,23,41,134,162,136,20,133,32,245,75, + 199,2,161,36,38,20,191,94,192,43,92,21,185,33,128,21,47,168,8,38,134,162,161,8,6,148,72,53,40,130,23,126,84,81,64,8,69,122,72,207, + 110,178,201,102,251,249,254,145,157,205,18,178,45,217,112,241,247,228,125,158,121,118,118,231,204,187,103,102,206,156,121,231,243,249,156,207,9,8,200,212, + 104,52,247,109,115,5,169,84,90,80,93,93,29,234,170,140,72,36,42,212,235,245,97,238,184,24,134,137,188,115,231,78,168,76,38,131,197,98,129,213, + 106,133,213,106,181,191,72,219,132,16,128,26,81,100,177,88,208,177,99,71,163,43,78,127,127,255,207,10,11,11,7,241,243,4,242,251,58,195,157,59, + 119,6,117,234,212,233,51,0,245,38,230,14,12,12,92,252,234,171,175,206,233,220,185,51,0,216,235,201,127,22,23,23,99,246,236,217,246,255,176,90, + 173,248,225,135,31,94,157,54,109,26,0,204,117,113,236,109,66,67,67,73,114,178,235,28,69,41,41,41,72,73,73,193,39,159,124,66,56,142,83,186, + 42,235,43,206,7,165,69,60,133,67,48,124,127,184,206,12,191,171,206,124,135,246,224,252,7,234,58,20,8,37,211,159,236,55,116,192,236,57,243,253, + 54,127,251,35,114,255,248,13,23,126,217,114,79,153,30,131,167,33,191,184,2,211,102,254,67,78,88,193,0,161,68,54,221,88,93,181,206,19,254,78, + 132,132,117,10,146,253,239,147,189,30,227,238,72,115,209,34,80,138,167,187,183,231,90,237,251,253,127,59,17,242,241,121,74,221,102,136,174,43,178,50, + 94,122,9,125,77,38,132,178,44,88,66,192,2,96,8,65,181,94,143,19,147,39,163,215,87,95,225,95,217,217,178,197,35,71,122,37,182,228,114,249, + 175,132,144,64,173,86,59,156,214,76,44,253,208,131,16,210,73,46,151,239,162,148,150,105,181,218,199,255,219,245,225,65,8,9,7,80,68,41,53,215, + 249,93,8,64,73,41,45,244,134,79,34,145,188,252,226,139,47,174,88,181,106,149,172,160,160,0,121,121,121,176,88,44,144,72,36,136,142,142,38,57, + 57,57,193,243,231,207,95,174,80,40,196,229,229,229,31,123,81,79,1,199,113,233,65,65,65,67,195,194,194,252,10,11,11,171,212,106,245,15,122,189, + 254,101,218,192,105,83,8,33,12,199,113,147,162,162,162,70,71,68,68,132,221,185,115,167,248,246,237,219,59,245,122,253,122,74,105,131,38,106,182,241, + 134,3,232,10,91,182,122,0,119,163,162,162,206,93,187,118,205,171,115,233,134,51,47,42,42,234,188,183,156,132,16,63,0,91,1,68,184,41,154,7, + 96,34,245,210,154,205,131,161,214,221,75,87,102,36,164,78,125,154,172,155,59,40,122,198,39,57,71,59,69,72,251,157,207,211,221,106,8,223,195,8, + 66,72,240,180,105,211,90,38,36,36,136,221,151,6,150,45,91,86,177,113,227,70,167,211,243,56,240,62,30,29,29,253,211,230,205,155,21,207,62,251, + 236,1,66,200,64,94,80,17,66,30,239,208,161,195,79,203,150,45,83,36,38,38,222,179,205,29,244,122,189,202,104,52,130,115,50,89,124,101,101,37, + 252,253,253,85,158,112,1,128,84,42,197,150,45,91,192,113,28,56,142,67,89,89,25,34,35,35,237,223,133,66,161,125,189,117,235,214,110,249,44,22, + 75,47,150,101,161,213,106,237,211,55,89,44,22,168,213,106,80,74,33,22,139,237,83,58,57,108,239,229,140,143,16,50,33,34,34,2,155,55,111,134, + 193,96,184,111,187,66,161,192,217,179,181,147,140,176,44,139,39,158,120,130,33,132,76,128,11,161,101,75,188,137,164,164,36,176,44,11,150,101,193,48, + 140,125,157,95,44,22,11,82,82,82,64,41,117,59,165,89,83,112,62,100,56,72,93,100,134,167,148,222,5,240,224,99,180,168,195,16,79,66,72,132, + 191,50,244,189,89,127,255,135,124,215,161,223,113,243,214,205,251,68,22,0,156,220,191,30,131,94,252,39,78,95,8,199,164,233,175,200,127,63,113,232, + 61,66,200,126,62,102,139,186,24,54,26,224,47,252,240,159,19,159,150,104,77,121,168,8,4,90,182,19,129,189,94,137,249,35,186,138,255,190,243,215, + 15,0,196,187,171,167,88,36,218,255,110,78,142,148,23,89,125,244,122,136,0,152,1,8,5,2,48,132,192,96,54,67,103,177,32,220,106,197,149,105, + 211,240,232,250,245,88,184,99,135,236,173,184,184,253,0,100,238,234,9,0,66,161,48,60,43,43,43,116,238,220,185,7,9,33,67,40,165,167,92,158, + 76,15,56,27,2,79,57,9,33,221,187,117,235,182,111,209,162,69,65,238,58,101,79,57,165,82,233,56,150,101,87,91,44,150,89,58,157,46,203,91, + 78,66,8,3,32,53,33,33,97,250,225,195,135,175,16,66,6,209,154,204,196,32,132,8,30,125,244,209,156,190,125,251,182,35,132,124,1,32,181,174, + 240,112,194,217,178,109,219,182,203,86,173,90,37,187,116,233,18,180,90,45,56,142,195,164,73,147,144,149,149,5,157,78,7,177,88,140,247,223,127,223, + 239,216,177,99,111,17,66,118,82,74,111,184,59,118,66,136,48,32,32,224,226,234,213,171,85,163,70,141,98,170,171,171,97,181,90,253,182,110,221,58, + 42,37,37,229,105,66,72,7,103,98,203,5,39,19,30,30,190,238,139,47,190,232,240,236,179,207,10,116,58,29,172,86,107,248,174,93,187,18,223,124, + 243,205,1,132,144,41,148,210,122,19,16,186,186,70,132,144,199,101,50,89,167,89,179,102,21,141,26,53,234,14,0,156,56,113,130,249,237,183,223,250, + 44,89,178,228,198,219,111,191,125,186,1,156,221,253,253,253,99,146,147,147,139,71,140,24,145,39,20,10,173,255,249,207,127,4,185,185,185,79,191,243, + 206,59,87,223,124,243,205,122,231,253,116,194,185,245,200,145,35,253,35,35,35,173,182,78,143,218,254,131,50,12,67,109,159,184,120,241,226,35,253,251, + 247,223,4,224,127,220,113,118,108,33,159,245,220,51,79,126,40,21,11,165,86,179,9,22,179,17,67,251,117,1,75,44,56,118,254,38,122,183,149,97, + 253,236,158,109,146,211,142,159,237,28,236,255,196,217,146,138,92,119,156,141,197,131,226,204,206,206,54,230,230,230,86,213,87,190,46,206,158,61,123,159, + 194,169,143,83,46,151,103,110,218,180,73,17,30,30,142,117,235,214,41,167,79,159,126,128,16,50,16,0,58,116,232,240,211,169,83,167,20,0,176,100, + 201,18,229,194,133,11,51,113,255,252,167,245,30,187,66,161,56,144,145,145,49,112,234,212,169,196,96,48,192,113,81,42,149,184,126,253,58,100,50,217, + 1,79,142,157,16,2,139,197,98,23,82,63,252,240,3,214,172,89,131,45,91,182,216,197,150,64,32,176,111,231,247,113,199,9,192,46,162,142,29,59, + 134,140,140,12,132,134,134,34,36,36,4,42,149,10,189,122,245,130,159,159,159,93,108,185,227,44,46,46,134,213,234,217,59,19,165,20,26,141,198,237, + 177,243,168,43,130,234,19,70,142,214,185,166,230,124,88,193,139,200,134,194,46,180,108,166,186,122,83,203,251,2,140,64,56,105,194,212,87,131,111,23, + 150,227,78,129,6,44,83,107,169,142,29,52,21,2,150,193,241,125,53,134,43,134,101,161,169,212,67,173,53,98,252,212,57,65,95,172,88,52,9,192, + 251,174,248,187,16,18,221,59,34,104,76,167,78,173,153,63,196,23,16,59,244,23,88,172,0,61,60,18,143,151,133,178,29,247,139,198,116,33,100,217, + 239,148,94,114,197,35,86,42,165,129,93,187,34,53,34,2,253,76,38,8,41,69,92,65,1,126,155,51,7,250,172,44,48,0,132,227,198,225,153,149, + 43,113,40,34,2,45,116,58,168,231,205,131,106,239,94,8,21,138,122,131,230,235,3,33,4,3,6,12,64,78,78,78,240,144,33,67,246,113,28,55, + 214,100,50,29,242,116,127,71,40,149,202,147,2,129,32,210,93,57,179,217,124,91,173,86,247,240,150,159,227,184,126,125,250,244,217,177,125,251,246,64, + 163,209,232,147,183,16,177,88,60,100,204,152,49,25,107,214,172,81,36,38,38,102,136,197,226,42,189,94,191,215,211,253,109,34,107,105,90,90,218,140, + 164,164,36,101,98,98,34,189,114,229,138,18,0,111,29,81,245,237,219,247,209,140,140,140,22,61,123,246,124,53,57,57,89,72,8,89,232,206,202,35, + 151,203,103,102,100,100,132,20,23,23,219,69,22,199,113,184,125,251,54,164,82,41,24,134,1,195,48,224,56,14,239,189,247,94,240,204,153,51,231,0, + 152,227,193,241,166,175,94,189,90,53,120,240,96,230,218,181,107,96,24,6,18,137,4,47,189,244,18,163,211,233,2,83,83,83,55,0,120,222,211,227, + 7,0,142,227,38,165,167,167,119,232,211,167,143,224,194,133,11,232,221,187,55,142,31,63,142,113,227,198,113,21,21,21,143,204,159,63,63,1,78,222, + 176,156,129,16,18,46,147,201,58,255,244,211,79,183,90,181,106,101,239,92,30,121,228,17,203,240,225,195,75,47,92,184,16,115,244,232,209,146,222,189, + 123,123,60,97,57,33,164,165,76,38,235,184,123,247,238,187,169,169,169,3,211,210,210,70,1,64,175,94,189,118,46,89,178,228,199,210,210,210,199,14, + 31,62,92,218,183,111,223,219,30,82,70,132,135,135,91,102,207,158,45,119,85,104,237,218,181,106,0,173,9,33,109,105,205,68,219,78,17,19,213,226, + 173,15,230,76,144,194,98,4,53,233,0,99,21,96,212,194,106,168,2,17,74,1,147,14,42,113,41,182,206,140,81,44,216,124,245,143,191,169,20,195, + 255,40,42,247,184,189,62,172,48,155,205,251,46,95,190,220,239,242,229,203,30,239,227,238,92,2,128,86,171,157,60,112,224,192,3,235,214,173,83,118, + 238,220,25,153,153,153,202,248,248,248,3,161,161,161,12,47,178,78,158,60,137,69,139,22,169,53,26,205,100,79,255,91,163,209,252,51,37,37,229,240, + 164,73,147,100,142,191,51,12,3,165,82,137,97,195,134,85,87,86,86,254,211,83,62,139,197,2,129,64,128,219,183,111,99,237,218,181,120,231,157,119, + 16,29,29,13,147,201,100,191,247,121,177,101,235,247,60,234,252,204,102,51,78,156,56,129,204,175,190,194,194,183,222,130,191,127,205,220,218,70,163,17, + 165,101,101,144,72,36,118,49,230,10,148,210,109,151,47,95,158,19,25,25,121,143,203,144,255,4,0,185,92,14,171,213,10,179,217,140,234,234,106,172, + 88,177,194,76,41,221,230,138,151,239,195,89,150,197,156,57,115,160,215,215,190,227,117,181,197,36,71,69,69,161,91,183,110,246,239,12,195,184,20,27, + 142,156,95,60,213,25,58,135,210,49,41,203,1,0,145,145,145,136,137,137,65,120,120,184,83,206,166,214,34,222,162,110,76,86,131,99,180,30,196,76, + 217,156,80,242,76,187,246,29,200,205,187,165,16,8,4,240,11,8,193,83,163,231,130,101,25,200,149,33,32,22,157,189,44,203,176,16,176,2,148,86, + 232,16,213,182,61,35,150,72,159,129,27,161,165,8,224,86,191,254,252,83,146,18,243,109,72,91,75,96,225,31,167,17,34,48,193,21,120,109,72,180, + 52,105,231,239,171,1,60,235,73,125,89,179,25,161,44,11,35,165,248,109,206,28,196,166,167,131,127,141,143,77,79,199,233,164,36,4,113,28,196,12, + 3,106,50,221,231,211,119,7,190,81,222,186,117,11,89,89,89,65,19,38,76,216,33,22,139,39,121,35,54,28,184,66,142,29,59,22,218,182,109,91, + 167,101,254,252,243,79,244,232,209,195,107,247,148,88,44,30,18,23,23,183,57,43,43,43,224,252,249,243,8,13,13,109,180,208,146,72,36,253,226,226, + 226,54,127,249,229,151,138,162,162,34,164,167,167,43,70,142,28,185,73,34,145,140,174,174,174,118,43,54,235,138,172,244,244,116,245,218,181,107,191,112, + 116,17,82,74,239,18,66,214,245,236,217,115,86,82,82,146,18,192,140,228,228,100,184,19,91,98,177,120,64,187,118,237,80,90,90,106,239,104,197,226, + 26,3,158,159,159,31,2,2,2,32,20,10,161,215,235,17,27,27,75,68,34,209,211,158,28,179,191,191,255,160,49,99,198,48,191,252,242,11,242,243, + 243,161,84,42,33,151,203,97,177,88,144,152,152,200,174,88,177,194,235,142,165,85,171,86,163,6,14,28,40,56,119,238,28,174,93,187,6,189,94,143, + 220,220,92,40,20,10,196,199,199,11,63,248,224,131,145,240,82,104,1,232,156,148,148,84,224,40,178,120,248,249,249,145,14,29,58,148,6,7,7,119, + 7,224,177,208,2,208,249,149,87,94,41,124,247,221,119,251,229,228,228,44,224,127,204,201,201,153,15,0,31,127,252,241,97,149,74,213,29,128,167,66, + 11,148,82,235,11,47,188,112,67,36,18,129,227,56,136,68,162,123,22,161,80,8,134,97,252,109,197,221,190,62,255,113,45,255,253,196,249,203,151,251, + 73,88,238,239,163,187,160,181,82,8,72,131,32,236,183,0,68,217,166,230,63,75,255,4,246,47,192,71,99,74,153,164,141,213,223,62,26,20,164,186, + 82,90,90,111,192,49,33,196,229,11,157,139,227,138,246,166,60,33,164,39,128,127,163,102,68,214,91,148,82,183,177,83,142,16,10,133,173,21,10,69, + 54,223,198,221,193,108,54,179,37,37,37,243,80,227,186,117,10,74,233,175,132,144,129,211,167,79,63,144,153,153,169,236,210,165,11,190,255,254,123,165, + 82,89,19,146,115,242,228,73,140,29,59,86,93,86,86,230,177,219,144,231,13,12,12,60,179,101,203,150,167,38,76,152,96,239,136,252,253,253,113,254, + 252,121,92,188,120,241,180,167,124,12,195,192,106,181,130,227,56,44,95,190,28,70,163,17,27,55,110,196,55,223,124,3,134,97,64,8,1,33,4,10, + 133,2,159,124,242,137,87,253,158,197,98,193,134,13,27,176,96,254,124,187,200,2,0,161,80,136,22,97,97,8,14,9,193,213,171,87,221,10,173,178, + 178,178,127,101,103,103,195,85,48,124,118,118,182,125,221,49,24,222,147,122,178,44,11,189,94,143,184,184,218,169,98,95,121,229,21,251,122,105,105,41, + 88,150,229,207,133,71,39,128,101,89,232,40,48,90,82,251,219,176,215,94,179,175,23,23,23,59,229,124,16,90,164,177,112,49,234,48,150,82,122,218, + 22,34,49,28,192,46,155,59,241,193,197,104,81,106,237,24,217,50,2,103,174,156,133,128,101,33,10,8,65,64,80,24,172,102,3,52,133,215,112,112, + 251,103,0,128,180,13,219,192,48,12,4,2,22,122,131,5,209,173,35,96,181,90,157,142,116,0,128,78,132,60,53,182,67,248,19,173,218,40,201,185, + 192,107,232,16,26,124,111,129,199,197,136,206,147,147,222,114,105,175,78,132,60,117,158,210,35,238,234,43,102,24,48,132,64,38,20,66,159,149,133,211, + 168,17,88,0,112,58,41,9,204,183,223,194,95,44,6,75,8,4,54,19,116,67,80,94,94,14,66,8,50,51,51,3,227,227,227,55,73,165,210,36, + 119,110,180,186,80,171,213,195,251,244,233,243,227,134,13,27,84,45,90,180,184,111,123,126,126,62,166,78,157,90,164,86,171,135,123,195,43,149,74,199, + 141,25,51,38,99,253,250,245,138,203,151,47,67,171,213,66,165,242,56,252,161,94,16,66,186,15,24,48,96,71,86,86,86,64,126,126,62,52,26,13, + 244,122,61,50,51,51,149,195,134,13,203,242,208,141,250,182,163,200,74,78,78,254,29,64,40,33,100,117,221,191,179,109,235,226,32,182,52,0,62,112, + 70,108,54,155,219,248,249,249,161,176,176,16,83,167,78,197,165,75,181,207,203,136,136,154,144,160,168,168,40,92,189,122,21,42,149,10,132,16,151,129, + 185,60,84,42,149,220,96,48,32,33,33,1,183,110,213,134,248,68,68,68,224,246,237,219,32,132,200,92,236,94,47,194,194,194,194,116,58,29,250,246, + 237,139,234,234,106,0,192,196,137,19,193,113,28,10,11,11,193,113,92,136,183,156,0,66,134,15,31,238,52,181,138,66,161,48,6,6,6,254,205,217, + 118,39,8,30,57,114,228,157,244,244,244,251,6,182,28,63,126,252,127,130,130,130,114,130,130,130,58,120,201,105,117,20,85,66,161,240,30,161,197,113, + 28,24,134,241,56,70,237,82,97,229,42,1,185,219,237,221,217,131,167,182,14,13,0,213,22,64,248,236,191,112,166,72,138,229,43,118,3,0,254,241, + 82,15,116,29,180,20,134,245,131,49,167,55,43,154,124,91,255,58,128,183,235,227,59,118,204,43,189,211,24,124,8,128,31,5,183,6,64,55,111,118, + 54,155,205,146,62,125,250,72,63,252,240,195,32,79,202,127,253,245,215,72,73,73,113,25,20,205,131,23,91,241,241,241,7,190,255,254,123,101,187,118, + 237,32,16,8,144,155,155,219,32,145,197,67,173,86,47,88,188,120,241,254,177,99,199,250,1,53,47,173,82,169,20,243,230,205,211,105,181,218,5,238, + 246,119,132,213,106,133,64,32,176,191,36,75,36,18,196,198,198,218,69,22,33,4,85,85,85,16,8,4,252,136,68,143,132,128,90,173,70,120,139,22, + 240,247,247,71,251,232,104,92,182,245,35,252,186,88,44,6,33,4,102,179,217,37,143,109,228,224,92,184,136,183,106,32,40,0,183,46,188,136,136,8, + 88,173,86,94,100,186,179,36,120,196,25,18,18,2,173,86,235,41,231,67,7,23,22,173,88,0,167,1,12,167,181,83,240,220,147,222,161,63,108,209, + 244,77,53,164,146,128,18,43,165,16,176,53,254,90,129,128,5,203,50,40,45,186,139,149,255,154,1,0,72,219,240,13,118,29,190,128,200,118,143,213, + 250,113,9,1,168,235,198,173,10,16,166,207,28,251,164,180,128,220,133,50,66,6,137,164,142,126,12,20,130,68,49,152,61,32,82,118,34,187,58,29, + 117,226,1,234,131,132,97,106,130,223,9,169,119,56,14,99,219,198,18,82,147,253,213,67,31,58,15,94,200,75,165,82,24,141,70,176,44,139,79,63, + 253,84,57,104,208,160,213,0,188,18,90,148,210,243,132,144,97,137,137,137,123,182,109,219,22,18,18,82,251,124,45,46,46,70,98,98,98,113,65,65, + 193,48,111,131,238,57,142,91,189,102,205,26,197,245,235,215,81,85,85,5,169,84,106,239,124,26,2,66,72,167,94,189,122,237,219,187,119,111,160,70, + 163,129,209,104,132,84,42,5,165,20,44,203,226,235,175,191,14,30,49,98,196,110,66,200,179,174,234,42,149,74,71,219,132,19,146,146,146,148,73,73, + 73,253,81,59,233,167,83,36,37,37,41,231,206,157,59,18,46,132,22,199,113,183,74,75,75,91,72,165,82,108,223,190,29,114,185,28,50,153,12,17, + 17,17,40,45,45,133,76,38,3,165,20,38,147,137,239,44,74,60,57,246,162,162,34,173,217,108,14,216,179,103,15,74,74,106,119,105,221,186,53,212, + 106,53,172,86,171,71,49,50,142,200,203,203,43,32,132,180,58,115,230,12,174,95,191,142,33,67,134,224,219,111,191,69,143,30,53,222,97,131,193,208, + 144,36,126,22,150,101,157,118,126,182,55,208,64,95,114,162,230,225,229,21,167,213,106,181,242,34,203,241,211,81,124,185,249,207,218,63,39,132,249,91, + 152,124,237,187,51,7,78,29,252,88,8,116,69,215,32,241,15,1,81,70,97,249,138,221,56,247,103,205,245,90,190,233,36,54,167,14,3,164,65,136, + 9,40,70,11,127,193,24,56,17,90,189,122,245,242,202,50,213,8,56,6,166,187,126,106,59,193,145,35,71,4,211,167,79,119,59,80,8,0,10,10, + 10,60,14,143,224,17,26,26,202,40,149,74,8,4,2,159,196,231,80,74,143,42,149,202,220,239,190,251,174,251,240,225,195,33,18,137,144,155,155,139, + 83,167,78,93,160,148,30,245,134,139,183,104,45,94,188,24,51,102,204,64,88,88,24,22,44,88,0,129,64,96,95,8,33,118,11,151,55,8,13,115, + 61,240,145,143,209,114,5,66,136,127,64,64,192,98,134,97,38,176,30,156,56,139,197,98,177,90,173,219,52,26,141,203,244,14,124,204,145,39,215,194, + 241,28,184,169,107,163,57,31,132,22,241,22,117,71,27,58,179,104,161,118,212,225,125,83,1,241,138,228,96,83,15,169,36,12,123,241,246,157,188,136, + 224,64,57,170,141,26,219,13,199,128,101,24,116,125,172,231,169,106,13,0,0,15,223,73,68,65,84,230,101,118,215,225,11,136,108,91,43,178,228,82, + 49,10,242,239,66,32,96,46,58,227,237,34,32,99,147,122,180,139,10,12,230,240,135,202,128,191,133,57,121,137,239,238,143,200,75,26,60,23,44,105, + 211,69,64,198,254,110,166,219,157,113,82,74,237,66,203,104,54,67,56,110,156,221,93,8,212,88,182,126,5,80,153,157,13,133,72,4,0,94,91,180, + 28,133,22,80,99,217,74,72,72,40,53,153,76,179,188,34,170,173,243,41,137,68,50,126,242,228,201,89,217,217,217,193,1,1,1,208,104,52,152,60, + 121,114,73,73,73,201,120,79,130,237,235,194,100,50,205,234,209,163,199,231,107,215,174,13,82,40,20,0,208,160,14,135,71,80,80,208,174,181,107,215, + 6,233,245,122,152,205,102,251,177,243,80,169,84,216,188,121,179,106,228,200,145,187,0,180,113,198,163,211,233,190,75,79,79,111,85,199,162,149,139,251, + 223,142,8,128,14,105,105,105,93,248,178,58,157,110,135,171,58,26,12,134,159,47,92,184,208,179,75,151,46,68,167,211,193,104,52,34,56,184,198,66, + 202,178,44,202,203,203,237,49,27,167,78,157,130,201,100,250,197,147,99,175,168,168,56,176,97,195,134,49,73,73,73,76,139,22,45,236,86,24,161,80, + 136,185,115,231,90,42,43,43,15,122,194,227,136,188,188,188,93,91,183,110,125,57,62,62,158,11,10,10,130,88,44,70,215,174,93,17,17,17,129,215, + 95,127,221,160,209,104,246,120,203,9,224,230,217,179,103,37,209,209,209,245,54,104,169,84,170,0,224,209,67,217,1,183,78,156,56,33,122,242,201,39, + 119,238,217,179,231,49,199,13,189,122,245,218,41,151,203,3,0,220,245,146,147,214,21,87,142,214,44,145,72,4,129,64,224,246,237,135,23,89,239,205, + 120,102,106,220,99,129,216,121,224,24,134,197,112,128,65,228,124,39,139,9,68,232,135,176,0,139,211,184,200,7,229,58,68,77,124,224,191,1,248,1, + 240,202,154,3,0,129,129,129,103,42,42,42,186,158,56,113,194,155,221,60,202,39,198,143,46,228,99,178,114,115,115,193,178,44,218,183,111,143,61,123, + 246,40,135,14,29,234,213,136,67,71,104,52,154,5,169,169,169,59,135,13,27,230,39,145,72,240,214,91,111,233,42,42,42,188,58,126,98,123,73,230, + 56,14,49,49,49,152,59,119,46,222,127,255,125,204,154,53,11,209,209,209,246,50,252,200,67,111,44,90,66,161,16,97,97,97,48,153,76,118,107,22, + 0,92,190,116,9,2,129,0,86,171,21,6,131,193,173,69,43,32,32,96,113,70,70,198,171,163,71,143,102,234,138,18,62,29,133,227,98,50,153,176, + 117,235,214,87,23,44,88,0,120,96,5,99,89,22,93,187,118,189,199,93,184,106,213,42,251,122,108,108,44,226,226,226,188,18,199,44,203,34,38,101, + 249,61,238,194,221,170,218,211,214,42,62,9,209,239,124,234,140,179,201,181,72,3,224,114,180,33,143,186,163,14,29,147,151,214,13,134,111,50,152,13, + 213,63,254,121,229,210,51,49,157,123,50,249,197,218,123,70,36,196,14,24,15,66,8,90,182,125,12,172,64,0,150,101,32,96,89,40,21,18,92,56, + 115,198,170,215,233,126,172,143,115,0,33,130,22,114,209,170,151,158,235,42,201,19,21,66,21,238,7,33,87,211,24,233,159,227,239,45,44,21,0,157, + 253,49,237,78,176,244,199,130,234,85,3,8,217,121,176,78,58,0,30,86,171,21,114,177,24,213,122,61,116,102,51,6,172,92,105,119,23,50,132,224, + 87,0,93,86,174,196,145,172,172,26,161,37,22,123,60,42,132,135,163,208,42,46,46,198,148,41,83,74,238,222,189,27,223,144,24,45,30,213,213,213, + 135,100,50,89,252,248,241,227,51,183,111,223,30,52,126,252,248,210,252,252,252,120,79,226,158,234,131,78,167,203,18,139,197,85,83,166,76,249,106,211, + 166,77,193,33,33,33,246,55,145,134,128,16,82,60,112,224,64,183,193,32,132,16,119,153,130,83,147,147,147,133,0,102,216,44,91,93,146,147,147,143, + 80,74,23,214,225,73,73,75,75,155,232,32,200,62,7,176,210,21,113,121,121,249,154,185,115,231,78,63,116,232,80,136,68,34,177,119,180,237,219,183, + 183,89,98,107,68,22,165,20,175,189,246,90,113,97,97,161,71,233,29,244,122,125,114,106,106,106,191,234,234,234,192,41,83,166,176,18,137,4,5,5, + 5,88,177,98,133,101,253,250,245,234,202,202,202,169,158,240,56,194,100,50,109,88,180,104,209,0,173,86,219,54,49,49,81,168,209,104,160,211,233,240, + 250,235,175,27,214,173,91,119,91,167,211,121,157,240,183,119,239,222,87,110,220,184,241,116,85,85,85,153,76,118,175,55,147,227,56,226,231,231,215,19, + 192,87,222,112,198,198,198,94,189,121,243,230,147,75,151,46,253,217,100,50,113,199,143,31,183,7,195,127,250,233,167,7,37,18,201,64,120,31,180,111, + 21,139,197,247,88,176,234,174,11,4,2,183,125,90,199,22,178,165,239,189,220,111,106,220,223,2,240,221,129,147,72,221,241,231,197,232,169,170,152,71, + 3,139,96,45,186,128,127,188,212,3,203,55,157,4,80,227,58,180,22,158,3,45,187,10,234,223,10,215,74,139,157,186,88,31,148,235,144,82,122,16, + 94,186,11,29,81,90,90,26,42,151,203,127,13,10,10,186,63,119,64,61,48,24,12,156,78,167,251,20,192,98,87,229,234,138,172,83,167,78,97,204, + 152,49,106,0,216,179,103,143,178,123,247,238,200,201,201,81,198,197,197,53,72,108,81,74,127,10,8,8,184,113,240,224,193,78,173,90,181,194,209,163, + 71,175,81,74,127,242,134,195,198,99,15,120,127,241,197,23,49,104,208,32,180,110,221,250,158,209,134,252,186,55,98,195,108,54,163,115,231,206,208,27, + 12,16,10,133,118,215,164,64,32,128,42,52,20,87,174,92,241,200,162,197,48,204,132,209,163,71,51,231,207,159,199,243,207,63,143,204,204,76,167,101, + 39,79,158,140,45,91,182,96,244,232,209,204,27,111,188,225,50,189,3,31,132,238,201,49,241,207,105,119,253,190,175,56,155,90,139,52,20,14,98,171, + 94,144,123,115,104,241,251,212,186,14,129,123,146,132,53,9,204,102,99,230,183,27,63,155,251,228,234,167,85,225,161,1,40,213,232,236,98,235,244,193, + 111,0,0,99,147,151,65,96,179,116,41,228,18,72,133,44,178,190,252,184,216,104,172,174,183,117,85,112,204,140,55,158,106,31,32,242,51,161,188,5, + 197,99,170,90,11,9,105,91,195,121,143,224,122,60,16,33,231,202,240,210,163,114,197,199,231,213,51,0,172,170,67,9,189,90,173,83,159,57,35,29, + 146,145,129,227,241,241,104,105,177,224,231,136,8,4,113,28,2,196,98,48,132,64,247,253,247,56,178,125,59,194,196,98,192,223,31,230,37,75,160,191, + 112,1,166,138,10,93,93,62,119,208,104,52,152,56,113,98,113,113,113,241,120,189,94,223,32,65,228,136,170,170,170,189,114,185,124,70,239,222,189,87, + 155,76,166,89,85,85,85,141,26,25,165,215,235,247,74,36,146,113,19,39,78,252,102,199,142,29,33,124,48,107,67,80,92,92,236,245,136,199,250,64, + 41,181,18,66,22,218,18,227,205,72,74,74,82,158,56,113,98,58,33,100,53,31,124,72,8,9,77,72,72,120,185,142,200,114,59,234,144,82,122,83, + 46,151,47,153,55,111,222,178,143,62,250,72,206,7,190,255,246,219,111,48,155,205,224,56,14,22,139,5,9,9,9,218,146,146,146,229,212,73,70,231, + 122,120,245,132,144,246,75,151,46,93,187,114,229,202,65,44,203,250,89,44,150,202,170,170,170,159,171,171,171,167,54,36,143,150,237,60,76,121,251,237, + 183,167,172,88,177,98,52,195,48,161,102,179,185,184,162,162,34,91,167,211,173,171,155,87,204,19,28,57,114,164,104,245,234,213,127,22,21,21,117,140, + 140,140,212,200,229,114,131,193,96,96,165,82,169,194,207,207,47,22,192,81,0,127,120,195,121,234,212,169,252,207,63,255,252,186,94,175,143,249,252,243, + 207,15,43,20,138,3,132,16,34,20,10,3,165,82,233,51,0,126,6,224,249,176,55,0,12,195,88,197,98,241,125,46,67,71,139,150,39,49,90,109, + 85,178,105,131,218,11,240,221,143,39,145,250,221,205,13,22,74,183,111,63,93,246,253,130,62,128,113,219,75,232,58,254,171,26,119,33,0,107,225,57, + 24,183,77,6,145,133,224,240,29,14,26,157,241,62,23,1,143,7,232,58,108,20,68,34,17,211,177,99,71,211,198,141,27,221,38,248,4,128,95,126, + 249,5,11,22,44,112,57,218,19,0,2,2,2,50,151,45,91,166,32,132,216,69,86,89,89,217,64,0,24,58,116,232,129,156,156,28,101,155,54,109, + 144,150,150,166,124,249,229,151,239,75,239,224,9,202,203,203,231,77,154,52,105,47,0,88,173,214,121,222,238,239,104,209,226,5,85,235,214,173,237,223, + 29,23,135,24,45,143,96,177,88,32,20,10,33,16,8,16,30,17,97,255,47,74,41,174,92,185,130,210,210,82,143,132,22,203,178,44,33,4,207,63, + 239,217,128,228,23,94,120,1,63,255,252,51,60,113,51,218,248,17,21,21,229,182,140,13,30,233,3,150,101,17,25,233,122,16,188,43,206,166,214,34, + 222,194,209,77,232,106,196,33,117,50,207,33,240,64,131,225,105,158,80,34,91,248,101,198,167,31,37,204,124,77,126,238,106,1,52,90,61,88,182,182, + 241,242,65,240,10,63,9,90,181,8,192,166,47,254,93,81,81,174,126,155,58,153,247,176,181,191,48,121,96,207,71,197,194,240,74,196,116,153,8,86, + 82,43,2,104,254,216,250,43,210,103,63,134,222,172,148,124,123,179,50,25,245,9,45,131,97,240,91,207,61,183,47,117,247,110,89,175,13,27,112,53, + 33,1,17,58,29,196,54,87,34,67,8,228,66,33,228,66,97,141,200,90,177,2,58,179,25,43,227,227,171,244,6,195,115,158,158,15,66,8,74,74, + 74,48,106,212,168,162,188,188,188,97,13,113,237,57,131,86,171,205,130,151,113,94,174,80,93,93,125,136,16,50,116,212,168,81,187,247,238,221,171,242, + 69,122,135,198,194,65,108,25,79,156,56,241,242,225,195,135,175,226,222,137,69,213,135,15,31,190,154,152,152,72,214,174,93,187,14,192,34,79,19,120, + 106,181,218,79,149,74,37,250,245,235,183,232,221,119,223,13,238,209,163,7,66,67,67,81,81,81,129,83,167,78,97,206,156,57,165,229,229,229,239,150, + 149,149,125,228,101,157,141,0,60,30,202,238,33,167,21,192,122,219,226,19,204,154,53,235,183,171,87,175,150,168,84,170,39,132,66,97,23,212,196,1, + 229,3,88,7,47,5,17,143,25,51,102,156,185,122,245,106,113,203,150,45,159,180,113,42,1,220,1,144,209,0,206,188,147,39,79,70,246,236,217,147, + 225,56,142,178,44,11,142,227,168,64,32,160,182,184,26,10,0,217,217,217,98,184,113,115,93,45,212,45,157,252,239,255,188,241,71,126,245,246,11,5, + 85,115,1,208,109,231,100,251,187,170,216,193,131,59,220,134,62,253,105,16,69,77,162,74,170,189,11,226,23,134,219,214,150,72,217,121,49,223,12,226, + 52,214,239,175,132,115,231,206,249,141,24,49,194,163,164,177,85,85,85,66,163,209,104,114,87,78,163,209,76,78,76,76,60,176,108,217,50,229,194,133, + 11,239,9,124,39,132,12,140,139,139,59,144,150,150,166,124,243,205,55,203,213,106,117,131,238,9,91,30,167,70,61,195,40,165,72,77,77,69,90,90, + 26,220,101,52,183,141,238,115,217,249,241,150,43,94,68,25,141,70,156,59,119,206,158,179,139,119,23,242,169,29,204,102,179,203,209,234,22,139,197,98, + 48,24,240,245,215,95,123,36,182,54,111,222,140,234,234,106,88,220,40,56,199,84,12,221,186,117,67,105,105,169,125,176,79,108,108,172,189,156,209,232, + 50,17,190,83,206,152,152,24,20,23,23,131,143,23,110,21,95,107,236,49,87,54,40,127,240,67,15,87,22,45,226,77,74,2,95,64,226,23,176,183, + 199,83,131,250,196,191,60,199,79,171,183,224,250,245,27,40,42,188,11,134,48,8,111,25,137,54,109,162,32,21,49,200,76,255,168,242,244,145,3,255, + 169,40,47,29,226,140,107,132,82,116,100,197,184,62,79,182,107,231,79,96,54,1,22,19,96,54,1,86,219,39,255,155,245,222,54,119,254,188,154,190, + 241,107,233,255,251,94,109,168,119,206,170,9,132,244,81,6,5,237,75,201,206,150,89,141,70,148,204,155,7,153,217,12,137,237,173,4,0,32,22,195, + 188,100,73,141,200,154,60,185,74,163,86,123,53,5,143,74,165,58,73,8,9,41,42,42,250,75,101,134,87,169,84,187,40,165,197,69,69,69,62,177, + 78,249,2,182,145,127,106,62,89,169,195,239,2,0,42,222,202,213,0,222,40,149,74,245,6,195,48,189,41,165,193,12,195,148,89,173,214,163,133,133, + 133,239,83,74,175,248,162,238,205,240,30,164,54,51,252,35,110,138,22,2,248,59,128,10,74,233,117,79,249,187,41,149,1,122,145,105,199,255,60,38, + 30,48,33,54,0,109,91,248,131,19,74,144,87,110,70,206,31,229,200,56,152,127,75,103,178,140,200,45,172,60,235,158,237,225,6,33,132,180,105,211, + 198,69,64,218,253,184,113,227,134,217,19,107,41,113,49,205,14,33,228,113,165,82,153,169,86,171,189,154,130,199,151,8,14,14,62,182,111,223,190,30, + 109,219,182,101,28,3,222,249,92,121,188,123,75,32,168,209,114,135,14,29,50,63,255,252,243,71,243,243,243,251,57,227,84,40,20,251,127,255,253,247, + 56,141,70,115,159,160,114,204,20,207,127,175,172,172,196,204,153,51,127,40,47,47,175,119,10,30,165,82,185,226,163,143,62,122,117,236,216,177,12,159, + 142,194,113,161,182,233,130,248,197,104,52,226,171,175,190,178,126,252,241,199,159,168,213,106,167,174,195,136,136,136,91,121,121,121,145,124,170,5,103,139, + 35,162,162,162,238,94,191,126,221,233,108,12,77,193,249,87,4,169,51,185,52,240,95,16,90,0,32,148,201,102,251,203,3,255,53,118,210,43,193,81, + 237,162,73,88,120,75,16,48,40,200,191,131,27,127,94,162,59,54,126,86,82,89,94,186,184,170,74,251,153,43,158,78,132,180,123,68,33,220,38,178, + 160,3,248,227,168,51,63,85,93,80,0,70,142,201,189,94,97,154,112,222,133,219,135,23,91,11,119,236,144,137,58,116,184,47,81,156,213,106,133,254, + 194,5,172,140,143,247,90,100,53,163,25,205,104,60,8,33,109,225,62,71,150,9,192,109,111,221,168,132,16,18,19,234,55,145,2,19,24,88,59,51, + 132,136,204,20,185,160,216,47,19,84,173,62,149,71,189,14,19,104,198,195,5,66,136,95,80,80,208,1,150,101,219,216,190,223,19,51,196,175,243,159, + 86,171,245,122,65,65,193,64,74,169,211,17,194,132,144,118,254,254,254,159,89,44,150,94,174,226,121,128,26,55,20,203,178,199,43,42,42,102,59,11, + 65,104,170,81,135,33,33,33,87,110,220,184,209,142,31,69,237,248,172,172,111,100,249,229,203,151,209,191,127,255,27,119,239,222,117,234,103,108,10,206, + 135,17,46,242,104,61,60,22,45,30,132,144,8,161,88,62,69,36,149,60,107,53,153,99,64,0,1,199,93,52,84,235,126,212,235,180,95,58,115,23, + 62,72,76,32,164,143,88,36,218,47,84,40,164,245,157,39,83,69,133,78,111,48,12,110,22,89,205,104,70,51,154,209,140,191,10,8,33,29,130,130, + 130,246,113,28,39,182,125,119,220,118,95,121,179,217,92,93,84,84,52,132,82,154,123,223,198,38,228,252,255,6,188,242,108,138,5,192,160,102,206,102, + 206,102,206,102,206,102,206,102,206,102,206,102,206,191,242,130,26,135,24,5,208,223,201,246,36,103,251,62,176,96,248,102,52,163,25,205,104,70,51,154, + 209,140,191,34,168,205,93,232,42,159,86,93,247,33,173,155,222,193,83,236,218,181,139,250,122,62,34,135,161,156,62,203,6,219,84,156,77,120,236,62, + 155,231,201,33,187,238,226,225,195,135,167,248,136,179,41,235,233,203,107,228,83,78,254,154,251,146,215,177,29,249,170,77,57,212,211,103,237,190,169,57, + 125,216,142,234,214,179,209,109,180,158,235,222,232,123,233,1,213,211,151,215,200,39,156,117,219,143,47,120,235,107,147,141,109,83,245,212,179,209,237,254, + 65,113,250,162,29,57,169,103,163,218,168,139,107,239,179,103,211,131,130,67,204,157,211,121,105,169,147,20,15,94,9,173,166,202,109,225,248,208,129,143, + 178,193,54,5,39,15,95,11,174,38,152,72,243,160,175,57,235,156,79,95,33,197,214,161,255,12,15,166,208,241,16,62,203,44,92,231,88,125,194,235, + 200,233,171,115,89,95,167,232,203,122,54,5,167,227,111,62,234,200,1,248,230,94,170,239,186,251,146,211,87,247,82,157,253,125,114,47,53,69,155,175, + 167,253,52,154,183,46,167,47,238,165,186,156,190,104,247,15,130,147,255,189,49,247,82,125,156,190,104,247,206,174,125,99,121,255,27,160,46,114,104,217, + 182,59,205,163,229,121,6,54,52,237,204,218,182,11,225,84,41,54,148,179,41,45,80,190,228,180,41,253,135,158,19,190,189,70,41,54,206,20,31,114, + 14,240,213,53,106,138,246,238,200,233,43,254,186,60,190,184,78,245,113,54,182,190,78,234,217,40,212,199,217,216,118,255,160,56,225,219,107,228,147,123, + 169,14,167,207,238,165,186,199,187,107,215,174,20,95,114,250,210,58,138,123,235,217,232,235,84,31,167,143,44,80,117,235,217,40,212,199,233,139,103,72, + 83,241,254,149,240,127,22,93,33,203,89,128,128,45,0,0,0,0,73,69,78,68,174,66,96,130,0,0}; +const char* blendish_resources::blender_icons16_png = (const char*) temp1; + +static const unsigned char temp2[] = {0,1,0,0,0,19,1,0,0,4,0,48,70,70,84,77,102,9,29,176,0,0,1,60,0,0,0,28,71,68,69,70,144,48,138,184,0,0,1,88, + 0,0,2,148,71,80,79,83,63,137,191,2,0,0,3,236,0,0,157,8,71,83,85,66,151,65,114,65,0,0,160,244,0,0,21,114,79,83,47,50, + 89,45,118,45,0,0,182,104,0,0,0,86,99,109,97,112,228,111,14,235,0,0,182,192,0,0,22,6,99,118,116,32,0,105,29,57,0,0,204,200, + 0,0,1,254,102,112,103,109,113,52,118,106,0,0,206,200,0,0,0,171,103,97,115,112,0,7,0,7,0,0,207,116,0,0,0,12,103,108,121,102, + 214,36,202,71,0,0,207,128,0,8,83,136,104,101,97,100,0,250,81,111,0,9,35,8,0,0,0,54,104,104,101,97,12,184,30,45,0,9,35,64, + 0,0,0,36,104,109,116,120,218,186,166,211,0,9,35,100,0,0,95,112,107,101,114,110,4,246,0,37,0,9,130,212,0,0,63,252,108,111,99,97, + 92,176,35,188,0,9,194,208,0,0,95,116,109,97,120,112,28,73,6,113,0,10,34,68,0,0,0,32,110,97,109,101,31,108,77,160,0,10,34,100, + 0,0,61,8,112,111,115,116,187,194,210,49,0,10,95,108,0,0,235,201,112,114,101,112,59,7,241,0,0,11,75,56,0,0,5,104,0,0,0,1, + 0,0,0,0,201,137,111,49,0,0,0,0,206,63,215,63,0,0,0,0,206,63,215,63,0,1,0,0,0,14,0,0,2,40,2,48,0,0,0,2, + 0,89,0,3,2,176,0,1,2,177,2,197,0,3,2,198,2,198,0,1,2,199,2,202,0,3,2,203,2,204,0,1,2,205,2,209,0,3,2,210, + 2,211,0,1,2,212,2,228,0,3,2,229,2,233,0,1,2,234,2,243,0,3,2,244,2,244,0,1,2,245,2,245,0,3,2,246,2,246,0,1, + 2,247,2,255,0,3,3,0,3,0,0,1,3,1,3,4,0,3,3,5,3,5,0,1,3,6,3,6,0,3,3,7,3,7,0,1,3,8,3,9, + 0,3,3,10,3,10,0,1,3,11,3,12,0,3,3,13,4,22,0,1,4,23,4,27,0,3,4,28,5,12,0,1,5,13,5,13,0,2,5,14, + 5,15,0,1,5,16,5,24,0,3,5,25,5,26,0,1,5,27,5,29,0,3,5,30,5,30,0,1,5,31,5,31,0,3,5,32,5,36,0,1, + 5,37,5,37,0,3,5,38,5,74,0,1,5,75,5,75,0,3,5,76,5,78,0,1,5,79,5,83,0,2,5,84,5,114,0,1,5,115,5,127, + 0,3,5,128,5,143,0,1,5,144,5,144,0,3,5,145,6,14,0,1,6,15,6,23,0,3,6,24,6,58,0,1,6,59,6,59,0,3,6,60, + 6,61,0,1,6,62,6,69,0,3,6,70,6,76,0,1,6,77,6,82,0,3,6,83,8,242,0,1,8,243,8,248,0,3,8,249,11,25,0,1, + 11,26,11,26,0,2,11,27,11,36,0,1,11,37,11,39,0,2,11,40,11,122,0,1,11,123,11,123,0,2,11,124,11,139,0,1,11,140,11,146, + 0,3,11,147,11,147,0,2,11,148,11,151,0,1,11,152,11,153,0,2,11,154,11,177,0,1,11,178,11,179,0,2,11,180,11,204,0,1,11,205, + 11,205,0,2,11,206,19,164,0,1,19,165,19,177,0,2,19,178,19,178,0,3,19,179,19,179,0,2,19,180,19,221,0,1,19,222,19,222,0,2, + 19,223,20,81,0,1,20,82,20,82,0,3,20,83,20,83,0,1,20,84,20,84,0,3,20,85,20,87,0,2,20,88,20,88,0,1,20,89,20,99, + 0,2,20,100,20,216,0,1,20,217,20,224,0,2,20,225,22,184,0,1,22,185,22,195,0,3,22,196,23,23,0,1,23,24,23,31,0,3,23,32, + 23,121,0,1,23,122,23,122,0,3,23,123,23,219,0,1,0,4,0,0,0,2,0,0,0,2,0,16,2,177,2,198,0,1,2,199,2,202,0,2, + 2,205,2,215,0,2,2,216,2,216,0,3,2,217,2,217,0,4,2,218,2,228,0,2,2,234,2,237,0,2,2,238,2,245,0,1,2,246,2,246, + 0,2,2,247,2,247,0,1,2,248,2,250,0,2,2,251,2,253,0,1,2,254,2,255,0,2,3,1,3,2,0,1,3,3,3,3,0,2,3,4, + 3,4,0,1,0,1,0,0,0,10,1,220,2,92,0,20,68,70,76,84,0,122,97,114,97,98,0,134,97,114,109,110,0,168,98,114,97,105,0,180, + 99,97,110,115,0,192,99,104,101,114,0,204,99,121,114,108,0,216,103,101,111,114,0,244,103,114,101,107,1,0,104,97,110,105,1,16,104,101,98,114, + 1,28,107,97,110,97,1,42,108,97,111,32,1,54,108,97,116,110,1,70,109,97,116,104,1,134,110,107,111,32,1,146,111,103,97,109,1,160,114,117, + 110,114,1,172,116,102,110,103,1,184,116,104,97,105,1,198,0,4,0,0,0,0,255,255,0,1,0,0,0,22,0,3,75,85,82,32,0,22,83,78, + 68,32,0,22,85,82,68,32,0,22,0,0,255,255,0,3,0,0,0,2,0,6,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,0,0, + 255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,1,0,0,0,16,0,2,77,75,68,32,0,16, + 83,82,66,32,0,16,0,0,255,255,0,3,0,0,0,3,0,7,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,3, + 0,0,0,3,0,7,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,2,0,0,0,2,0,4,0,0,0,0,255,255, + 0,1,0,0,0,4,0,0,0,0,255,255,0,3,0,0,0,4,0,8,0,52,0,8,73,83,77,32,0,52,75,83,77,32,0,52,76,83,77,32, + 0,52,77,79,76,32,0,52,78,83,77,32,0,52,82,79,77,32,0,52,83,75,83,32,0,52,83,83,77,32,0,52,0,0,255,255,0,3,0,1, + 0,3,0,7,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,2,0,0,0,2,0,4,0,0,0,0,255,255,0,1, + 0,0,0,4,0,0,0,0,255,255,0,1,0,0,0,4,0,0,0,0,255,255,0,2,0,0,0,5,0,4,0,0,0,0,255,255,0,1,0,0, + 0,9,107,101,114,110,0,56,107,101,114,110,0,62,109,97,114,107,0,70,109,97,114,107,0,84,109,97,114,107,0,92,109,97,114,107,0,100,109,107, + 109,107,0,106,109,107,109,107,0,114,109,107,109,107,0,120,0,0,0,1,0,15,0,0,0,2,0,14,0,15,0,0,0,5,0,5,0,6,0,7, + 0,8,0,9,0,0,0,2,0,12,0,13,0,0,0,2,0,10,0,11,0,0,0,1,0,13,0,0,0,2,0,0,0,1,0,0,0,1,0,4, + 0,0,0,2,0,2,0,3,0,16,0,34,0,42,0,50,0,58,0,66,0,76,0,84,0,92,0,100,0,108,0,116,0,124,0,132,0,140,0,158, + 0,166,0,6,0,1,0,1,0,140,0,6,0,1,0,1,0,222,0,6,0,0,0,1,2,166,0,6,0,0,0,1,2,216,0,6,0,4,0,2, + 3,102,6,70,0,5,0,1,0,1,10,252,0,4,0,1,0,1,12,102,0,4,0,1,0,1,32,204,0,5,0,1,0,1,33,202,0,4,0,1, + 0,1,35,136,0,4,0,0,0,1,55,202,0,4,0,0,0,1,56,242,0,5,0,0,0,1,58,162,0,4,0,4,0,6,60,84,65,254,66,126, + 70,28,87,126,112,158,0,2,0,0,0,1,113,220,0,2,0,0,0,1,153,138,0,1,0,48,0,38,0,1,0,58,0,12,0,3,0,8,0,14, + 0,20,0,1,2,0,254,12,0,1,2,0,254,212,0,1,2,0,253,243,0,1,0,3,5,117,5,120,5,125,0,1,0,3,5,117,5,120,5,125, + 0,3,0,0,0,14,0,0,0,20,0,0,0,26,0,1,2,0,0,0,0,1,2,0,0,0,0,1,2,0,0,0,0,1,0,218,0,174,0,1, + 1,6,0,12,0,20,0,42,0,48,0,54,0,60,0,66,0,72,0,78,0,84,0,90,0,96,0,102,0,108,0,114,0,120,0,126,0,132,0,138, + 0,144,0,150,0,156,0,1,2,0,7,58,0,1,2,0,6,164,0,1,2,0,7,58,0,1,2,0,5,220,0,1,2,0,7,58,0,1,2,0, + 7,8,0,1,2,0,7,58,0,1,2,0,5,220,0,1,2,0,6,164,0,1,2,0,7,58,0,1,1,254,6,114,0,1,2,0,7,58,0,1, + 2,0,8,252,0,1,2,0,9,196,0,1,2,0,8,252,0,1,2,0,8,52,0,1,2,0,9,196,0,1,2,0,8,52,0,1,2,0,7,208, + 0,1,2,0,9,96,0,1,0,20,5,75,5,115,5,116,5,118,5,119,5,121,5,122,5,123,5,124,5,126,5,127,5,144,23,24,23,25,23,26, + 23,27,23,28,23,29,23,30,23,31,0,1,0,20,5,75,5,115,5,116,5,118,5,119,5,121,5,122,5,123,5,124,5,126,5,127,5,144,23,24, + 23,25,23,26,23,27,23,28,23,29,23,30,23,31,0,20,0,0,0,82,0,0,0,88,0,0,0,94,0,0,0,100,0,0,0,106,0,0,0,112, + 0,0,0,118,0,0,0,124,0,0,0,130,0,0,0,136,0,0,0,142,0,0,0,148,0,0,0,154,0,0,0,160,0,0,0,166,0,0,0,172, + 0,0,0,178,0,0,0,184,0,0,0,190,0,0,0,196,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176, + 0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0, + 4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1, + 2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,0,28,0,22,0,1,0,36,0,12,0,1,0,4,0,1,253,108,253,224,0,1, + 0,1,6,69,0,1,0,2,6,66,6,67,0,2,0,0,0,10,0,0,0,16,0,1,253,168,0,0,0,1,253,168,0,0,0,1,0,78,0,62, + 0,1,0,88,0,12,0,6,0,14,0,20,0,26,0,32,0,38,0,44,0,1,253,132,6,246,0,1,253,108,7,119,0,1,253,108,7,119,0,1, + 253,108,7,119,0,1,253,102,7,110,0,1,253,132,6,246,0,1,0,6,6,59,6,62,6,63,6,64,6,65,6,68,0,2,0,1,6,77,6,82, + 0,0,0,6,0,0,0,26,0,0,0,32,0,0,0,38,0,0,0,44,0,0,0,50,0,0,0,56,0,1,253,108,4,96,0,1,253,108,4,126, + 0,1,253,108,4,126,0,1,253,108,4,96,0,1,253,108,4,126,0,1,253,108,4,96,0,1,1,90,1,38,0,1,1,148,0,12,0,35,0,72, + 0,78,0,84,0,90,0,96,0,102,0,108,0,114,0,120,0,126,0,132,0,138,0,144,0,150,0,156,0,162,0,168,0,174,0,180,0,186,0,192, + 0,198,0,204,0,210,0,216,0,222,0,228,0,234,0,240,0,246,0,252,1,2,1,8,1,14,1,20,0,1,254,0,253,222,0,1,254,0,253,222, + 0,1,254,0,254,21,0,1,254,0,254,21,0,1,254,0,253,218,0,1,254,0,254,21,0,1,254,0,254,21,0,1,254,0,254,21,0,1,254,0, + 254,137,0,1,254,0,254,137,0,1,254,0,254,137,0,1,254,0,253,218,0,1,254,0,254,20,0,1,254,0,254,116,0,1,254,0,254,116,0,1, + 254,0,254,21,0,1,254,0,254,31,0,1,254,0,254,59,0,1,254,0,254,24,0,1,254,0,254,21,0,1,254,0,254,56,0,1,254,0,254,56, + 0,1,254,0,254,56,0,1,254,0,254,191,0,1,254,0,253,218,0,1,254,0,254,31,0,1,254,2,254,19,0,1,254,0,254,11,0,1,254,0, + 254,14,0,1,254,0,254,14,0,1,254,0,254,14,0,1,254,0,254,14,0,1,254,0,254,14,0,1,254,0,254,19,0,1,254,0,253,218,0,2, + 0,8,2,199,2,202,0,0,2,205,2,209,0,4,2,212,2,226,0,9,2,234,2,237,0,24,2,248,2,250,0,28,2,254,2,255,0,31,3,3, + 3,3,0,33,3,6,3,6,0,34,0,2,0,9,2,199,2,202,0,0,2,205,2,209,0,4,2,212,2,215,0,9,2,218,2,226,0,13,2,234, + 2,237,0,22,2,248,2,250,0,26,2,254,2,255,0,29,3,3,3,3,0,31,3,6,3,6,0,32,0,33,0,0,0,134,0,0,0,140,0,0, + 0,146,0,0,0,152,0,0,0,158,0,0,0,164,0,0,0,170,0,0,0,176,0,0,0,182,0,0,0,188,0,0,0,194,0,0,0,200,0,0, + 0,206,0,0,0,212,0,0,0,218,0,0,0,224,0,0,0,230,0,0,0,236,0,0,0,242,0,0,0,248,0,0,0,254,0,0,1,4,0,0, + 1,10,0,0,1,16,0,0,1,22,0,0,1,28,0,0,1,34,0,0,1,40,0,0,1,46,0,0,1,52,0,0,1,58,0,0,1,64,0,0, + 1,70,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1, + 254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0, + 0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0, + 0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,2,0,0,0,1,254,0,0,0,0,1, + 254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0,0,1,254,0,0,0, + 0,1,2,66,1,222,0,1,2,142,0,12,0,58,0,118,0,124,0,130,0,136,0,142,0,148,0,154,0,160,0,166,0,172,0,178,0,184,0,190, + 0,196,0,202,0,208,0,214,0,220,0,226,0,232,0,238,0,244,0,250,1,0,1,6,1,12,1,18,1,24,1,30,1,36,1,42,1,48,1,54, + 1,60,1,66,1,72,1,78,1,84,1,90,1,96,1,102,1,108,1,114,1,120,1,126,1,132,1,138,1,144,1,150,1,156,1,162,1,168,1,174, + 1,180,1,186,1,192,1,198,1,204,0,1,254,0,6,104,0,1,254,0,6,104,0,1,254,0,6,104,0,1,254,0,6,61,0,1,254,0,6,20, + 0,1,254,0,6,20,0,1,254,0,6,68,0,1,254,0,6,20,0,1,254,0,6,20,0,1,254,0,6,197,0,1,254,0,7,4,0,1,254,0, + 6,104,0,1,254,0,6,104,0,1,254,0,6,168,0,1,254,0,6,168,0,1,254,0,6,104,0,1,254,0,7,86,0,1,254,0,6,68,0,1, + 254,0,6,147,0,1,254,0,6,20,0,1,254,0,6,104,0,1,254,0,6,104,0,1,254,0,6,61,0,1,254,0,7,208,0,1,254,0,6,68, + 0,1,254,0,6,68,0,1,254,0,7,4,0,1,254,0,7,4,0,1,254,0,7,4,0,1,254,0,6,218,0,1,254,0,7,4,0,1,0,0, + 7,110,0,1,0,0,7,110,0,1,0,0,7,110,0,1,0,0,7,110,0,1,254,0,6,20,0,1,254,0,6,20,0,1,254,0,6,20,0,1, + 254,0,6,20,0,1,254,0,6,104,0,1,254,0,6,104,0,1,254,0,6,20,0,1,254,0,6,20,0,1,254,0,6,20,0,1,254,0,6,20, + 0,1,254,0,6,20,0,1,254,0,6,20,0,1,254,0,6,20,0,1,254,0,5,248,0,1,254,0,5,248,0,1,254,0,5,248,0,1,254,0, + 5,248,0,1,254,0,5,248,0,1,254,0,5,248,0,1,254,0,5,219,0,1,254,0,5,248,0,1,254,0,5,248,0,1,254,0,6,30,0,2, + 0,16,2,177,2,194,0,0,2,238,2,238,0,18,2,240,2,243,0,19,2,245,2,245,0,23,2,247,2,247,0,24,2,251,2,253,0,25,3,1, + 3,2,0,28,3,4,3,4,0,30,3,8,3,9,0,31,3,11,3,12,0,33,8,243,8,248,0,35,11,140,11,146,0,41,22,185,22,185,0,48, + 22,187,22,187,0,49,22,189,22,195,0,50,23,122,23,122,0,57,0,2,0,12,2,177,2,194,0,0,2,238,2,238,0,18,2,240,2,243,0,19, + 2,245,2,245,0,23,2,247,2,247,0,24,2,251,2,253,0,25,3,1,3,2,0,28,3,4,3,4,0,30,8,243,8,248,0,31,11,140,11,146, + 0,37,22,185,22,195,0,44,23,122,23,122,0,55,0,56,0,0,0,226,0,0,0,232,0,0,0,238,0,0,0,244,0,0,0,250,0,0,1,0, + 0,0,1,6,0,0,1,12,0,0,1,18,0,0,1,24,0,0,1,30,0,0,1,36,0,0,1,42,0,0,1,48,0,0,1,54,0,0,1,60, + 0,0,1,66,0,0,1,72,0,0,1,78,0,0,1,84,0,0,1,90,0,0,1,96,0,0,1,102,0,0,1,108,0,0,1,114,0,0,1,120, + 0,0,1,126,0,0,1,132,0,0,1,138,0,0,1,144,0,0,1,150,0,0,1,156,0,0,1,162,0,0,1,168,0,0,1,174,0,0,1,180, + 0,0,1,186,0,0,1,192,0,0,1,198,0,0,1,204,0,0,1,210,0,0,1,216,0,0,1,222,0,0,1,228,0,0,1,234,0,0,1,240, + 0,0,1,246,0,0,1,252,0,0,2,2,0,0,2,8,0,0,2,14,0,0,2,20,0,0,2,26,0,0,2,32,0,0,2,38,0,0,2,44, + 0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,176,0,1,254,0,5,2,0,1,254,0,5,2,0,1,254,0, + 5,2,0,1,254,0,5,2,0,1,254,0,5,2,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1, + 254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,5,2,0,1,254,0,5,2,0,1,254,0,5,2,0,1,254,0,5,2, + 0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,176,0,1,254,0,5,2,0,1,254,0,5,2,0,1,254,0,5,2,0,1,254,0, + 4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,5,2,0,1,254,0,4,123,0,1,254,0,5,2,0,1,254,0,5,2,0,1, + 254,0,5,2,0,1,254,0,5,2,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,5,2,0,1,254,0,5,2,0,1,254,0,5,2, + 0,1,254,0,5,2,0,1,254,0,5,2,0,1,254,0,5,2,0,1,254,0,5,2,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0, + 4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1, + 254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,0,184,0,174,0,1,0,218,0,12,0,8,0,18,0,36,0,54,0,72,0,90, + 0,108,0,126,0,144,0,2,0,6,0,12,0,1,3,99,255,156,0,1,0,200,255,106,0,2,0,6,0,12,0,1,3,99,255,156,0,1,0,200, + 255,106,0,2,0,6,0,12,0,1,3,99,255,156,0,1,0,200,255,106,0,2,0,6,0,12,0,1,3,99,255,156,0,1,0,200,255,106,0,2, + 0,6,0,12,0,1,3,99,255,156,0,1,0,200,253,218,0,2,0,6,0,12,0,1,3,99,255,156,0,1,0,200,253,218,0,2,0,6,0,12, + 0,1,3,99,255,156,0,1,0,200,255,106,0,2,0,6,0,12,0,1,3,99,255,156,0,1,0,200,255,106,0,2,0,1,20,217,20,224,0,0, + 0,1,0,15,5,16,5,17,5,18,5,19,5,20,5,21,5,22,5,23,5,24,5,27,5,29,5,37,5,117,5,120,5,125,0,15,0,0,0,62, + 0,0,0,68,0,0,0,74,0,0,0,80,0,0,0,86,0,0,0,92,0,0,0,98,0,0,0,104,0,0,0,110,0,0,0,116,0,0,0,122, + 0,0,0,128,0,0,0,134,0,0,0,140,0,0,0,146,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0, + 0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143, + 0,0,0,1,2,143,0,0,0,1,2,0,0,0,0,1,2,0,0,0,0,1,2,0,0,0,0,1,19,168,19,86,0,1,19,204,0,12,2,105, + 4,212,4,218,4,224,4,230,4,236,4,242,4,248,4,254,5,4,5,10,5,16,5,22,5,28,5,34,5,40,5,46,5,52,5,58,5,64,5,70, + 5,76,5,82,5,88,5,94,5,100,5,106,5,112,5,118,5,124,5,130,5,136,5,142,5,148,5,154,5,160,5,166,5,172,5,178,5,184,5,190, + 5,196,5,202,5,208,5,214,5,220,5,226,5,232,5,238,5,244,5,250,6,0,6,6,6,12,6,18,6,24,6,30,6,36,6,42,6,48,6,54, + 6,60,6,66,6,72,6,78,6,84,6,90,6,96,6,102,6,108,6,114,6,120,6,126,6,132,6,138,6,144,6,150,6,156,6,162,6,168,6,174, + 6,180,6,186,6,192,6,198,6,204,6,210,6,216,6,222,6,228,6,234,6,240,6,246,6,252,7,2,7,8,7,14,7,20,7,26,7,32,7,38, + 7,44,7,50,7,56,7,62,7,68,7,74,7,80,7,86,7,92,7,98,7,104,7,110,7,116,7,122,7,128,7,134,7,140,7,146,7,152,7,158, + 7,164,7,170,7,176,7,182,7,188,7,194,7,200,7,206,7,212,7,218,7,224,7,230,7,236,7,242,7,248,7,254,8,4,8,10,8,16,8,22, + 8,28,8,34,8,40,8,46,8,52,8,58,8,64,8,70,8,76,8,82,8,88,8,94,8,100,8,106,8,112,8,118,8,124,8,130,8,136,8,142, + 8,148,8,154,8,160,8,166,8,172,8,178,8,184,8,190,8,196,8,202,8,208,8,214,8,220,8,226,8,232,8,238,8,244,8,250,9,0,9,6, + 9,12,9,18,9,24,9,30,9,36,9,42,9,48,9,54,9,60,9,66,9,72,9,78,9,84,9,90,9,96,9,102,9,108,9,114,9,120,9,126, + 9,132,9,138,9,144,9,150,9,156,9,162,9,168,9,174,9,180,9,186,9,192,9,198,9,204,9,210,9,216,9,222,9,228,9,234,9,240,9,246, + 9,252,10,2,10,8,10,14,10,20,10,26,10,32,10,38,10,44,10,50,10,56,10,62,10,68,10,74,10,80,10,86,10,92,10,98,10,104,10,110, + 10,116,10,122,10,128,10,134,10,140,10,146,10,152,10,158,10,164,10,170,10,176,10,182,10,188,10,194,10,200,10,206,10,212,10,218,10,224,10,230, + 10,236,10,242,10,248,10,254,11,4,11,10,11,16,11,22,11,28,11,34,11,40,11,46,11,52,11,58,11,64,11,70,11,76,11,82,11,88,11,94, + 11,100,11,106,11,112,11,118,11,124,11,130,11,136,11,142,11,148,11,154,11,160,11,166,11,172,11,178,11,184,11,190,11,196,11,202,11,208,11,214, + 11,220,11,226,11,232,11,238,11,244,11,250,12,0,12,6,12,12,12,18,12,24,12,30,12,36,12,42,12,48,12,54,12,60,12,66,12,72,12,78, + 12,84,12,90,12,96,12,102,12,108,12,114,12,120,12,126,12,132,12,138,12,144,12,150,12,156,12,162,12,168,12,174,12,180,12,186,12,192,12,198, + 12,204,12,210,12,216,12,222,12,228,12,234,12,240,12,246,12,252,13,2,13,8,13,14,13,20,13,26,13,32,13,38,13,44,13,50,13,56,13,62, + 13,68,13,74,13,80,13,86,13,92,13,98,13,104,13,110,13,116,13,122,13,128,13,134,13,140,13,146,13,152,13,158,13,164,13,170,13,176,13,182, + 13,188,13,194,13,200,13,206,13,212,13,218,13,224,13,230,13,236,13,242,13,248,13,254,14,4,14,10,14,16,14,22,14,28,14,34,14,40,14,46, + 14,52,14,58,14,64,14,70,14,76,14,82,14,88,14,94,14,100,14,106,14,112,14,118,14,124,14,130,14,136,14,142,14,148,14,154,14,160,14,166, + 14,172,14,178,14,184,14,190,14,196,14,202,14,208,14,214,14,220,14,226,14,232,14,238,14,244,14,250,15,0,15,6,15,12,15,18,15,24,15,30, + 15,36,15,42,15,48,15,54,15,60,15,66,15,72,15,78,15,84,15,90,15,96,15,102,15,108,15,114,15,120,15,126,15,132,15,138,15,144,15,150, + 15,156,15,162,15,168,15,174,15,180,15,186,15,192,15,198,15,204,15,210,15,216,15,222,15,228,15,234,15,240,15,246,15,252,16,2,16,8,16,14, + 16,20,16,26,16,32,16,38,16,44,16,50,16,56,16,62,16,68,16,74,16,80,16,86,16,92,16,98,16,104,16,110,16,116,16,122,16,128,16,134, + 16,140,16,146,16,152,16,158,16,164,16,170,16,176,16,182,16,188,16,194,16,200,16,206,16,212,16,218,16,224,16,230,16,236,16,242,16,248,16,254, + 17,4,17,10,17,16,17,22,17,28,17,34,17,40,17,46,17,52,17,58,17,64,17,70,17,76,17,82,17,88,17,94,17,100,17,106,17,112,17,118, + 17,124,17,130,17,136,17,142,17,148,17,154,17,160,17,166,17,172,17,178,17,184,17,190,17,196,17,202,17,208,17,214,17,220,17,226,17,232,17,238, + 17,244,17,250,18,0,18,6,18,12,18,18,18,24,18,30,18,36,18,42,18,48,18,54,18,60,18,66,18,72,18,78,18,84,18,90,18,96,18,102, + 18,108,18,114,18,120,18,126,18,132,18,138,18,144,18,150,18,156,18,162,18,168,18,174,18,180,18,186,18,192,18,198,18,204,18,210,18,216,18,222, + 18,228,18,234,18,240,18,246,18,252,19,2,19,8,19,14,19,20,19,26,19,32,19,38,19,44,19,50,19,56,19,62,19,68,0,1,2,222,0,0, + 0,1,2,85,0,0,0,1,1,219,0,0,0,1,2,248,0,0,0,1,2,171,0,0,0,1,1,15,0,0,0,1,1,44,0,0,0,1,2,171, + 0,0,0,1,2,193,0,0,0,1,0,229,0,0,0,1,1,163,0,0,0,1,2,33,0,0,0,1,1,236,0,0,0,1,2,184,0,0,0,1, + 2,254,0,0,0,1,0,56,0,0,0,1,1,169,0,0,0,1,3,16,0,0,0,1,3,124,255,250,0,1,2,154,0,0,0,1,2,81,0,0, + 0,1,0,254,0,0,0,1,2,39,0,0,0,1,2,196,0,0,0,1,2,2,0,0,0,1,3,14,0,0,0,1,2,110,0,0,0,1,1,226, + 0,0,0,1,1,226,0,0,0,1,1,226,0,0,0,1,1,29,255,156,0,1,1,29,255,156,0,1,1,244,254,12,0,1,1,29,253,218,0,1, + 2,188,254,112,0,1,1,29,255,156,0,1,3,132,254,112,0,1,1,244,255,106,0,1,3,132,255,106,0,1,3,132,255,106,0,1,3,44,253,118, + 0,1,3,44,253,168,0,1,3,44,253,118,0,1,1,194,255,106,0,1,1,194,255,106,0,1,1,244,254,12,0,1,1,244,254,12,0,1,2,88, + 253,168,0,1,2,88,253,168,0,1,2,88,253,168,0,1,2,88,253,68,0,1,2,91,255,106,0,1,2,91,255,106,0,1,2,215,253,168,0,1, + 2,215,253,168,0,1,1,44,255,156,0,1,3,32,255,56,0,1,2,188,253,218,0,1,3,32,255,56,0,1,2,188,254,62,0,1,0,240,253,168, + 0,1,2,238,254,62,0,1,1,244,255,106,0,1,1,244,254,12,0,1,2,188,254,112,0,1,2,188,253,218,0,1,3,132,255,106,0,1,2,188, + 253,218,0,1,3,132,255,106,0,1,3,132,255,106,0,1,3,132,253,168,0,1,3,132,254,94,0,1,3,132,255,106,0,1,3,132,253,168,0,1, + 3,132,255,106,0,1,3,132,253,168,0,1,3,44,253,168,0,1,3,44,253,168,0,1,3,44,253,168,0,1,3,44,253,168,0,1,3,44,253,168, + 0,1,3,44,253,168,0,1,3,44,253,168,0,1,1,194,255,106,0,1,1,244,254,94,0,1,1,244,254,112,0,1,1,244,254,112,0,1,1,194, + 255,106,0,1,1,243,254,162,0,1,1,194,255,106,0,1,1,194,255,106,0,1,1,194,255,106,0,1,1,244,254,12,0,1,1,244,254,12,0,1, + 1,244,254,12,0,1,1,244,254,12,0,1,1,244,254,12,0,1,1,244,254,12,0,1,1,244,254,12,0,1,1,244,254,12,0,1,1,244,254,12, + 0,1,2,88,253,168,0,1,2,88,253,168,0,1,2,88,253,168,0,1,2,88,253,168,0,1,2,88,253,168,0,1,2,91,255,106,0,1,2,215, + 253,168,0,1,3,32,255,56,0,1,3,182,254,112,0,1,3,182,254,112,0,1,3,32,255,56,0,1,3,182,253,118,0,1,3,32,255,56,0,1, + 2,188,253,218,0,1,2,188,253,218,0,1,3,32,255,106,0,1,3,32,255,106,0,1,3,32,255,106,0,1,3,32,255,56,0,1,3,32,255,56, + 0,1,3,32,253,118,0,1,3,32,255,106,0,1,3,32,255,106,0,1,3,32,255,106,0,1,3,32,254,112,0,1,3,32,253,68,0,1,3,32, + 255,106,0,1,2,188,254,62,0,1,2,188,254,62,0,1,2,188,254,62,0,1,2,238,252,174,0,1,3,7,253,68,0,1,2,238,254,62,0,1, + 2,238,254,62,0,1,3,7,253,18,0,1,2,238,254,62,0,1,3,32,255,106,0,1,3,44,253,168,0,1,1,244,254,12,0,1,2,188,254,112, + 0,1,2,188,254,112,0,1,1,244,255,106,0,1,1,22,0,0,0,1,2,73,0,0,0,1,1,171,0,0,0,1,2,94,0,0,0,1,2,157, + 0,0,0,1,2,157,0,0,0,1,2,96,0,0,0,1,2,157,0,0,0,1,3,146,0,0,0,1,1,22,0,0,0,1,2,107,0,0,0,1, + 2,47,0,0,0,1,3,5,0,0,0,1,1,169,0,0,0,1,3,213,0,0,0,1,1,221,0,0,0,1,3,35,0,0,0,1,2,157,0,0, + 0,1,2,128,0,0,0,1,3,2,0,0,0,1,3,26,0,0,0,1,3,101,0,0,0,1,1,221,0,0,0,1,2,128,0,0,0,1,2,89, + 0,0,0,1,3,26,0,0,0,1,3,26,0,0,0,1,2,27,0,0,0,1,2,89,0,0,0,1,2,89,0,0,0,1,3,132,253,168,0,1, + 3,132,253,168,0,1,1,43,253,218,0,1,1,43,253,218,0,1,3,132,253,168,0,1,3,132,253,168,0,1,1,43,253,218,0,1,1,43,253,218, + 0,1,3,132,253,168,0,1,3,132,253,168,0,1,1,43,253,218,0,1,1,43,253,218,0,1,3,132,255,106,0,1,3,132,255,106,0,1,1,43, + 255,156,0,1,1,43,255,156,0,1,3,132,255,106,0,1,3,132,255,106,0,1,1,43,255,156,0,1,1,43,255,156,0,1,3,132,255,106,0,1, + 3,132,255,106,0,1,1,43,255,156,0,1,1,43,255,156,0,1,3,32,255,56,0,1,3,32,255,56,0,1,1,244,255,106,0,1,2,6,255,106, + 0,1,3,32,255,56,0,1,3,32,255,56,0,1,1,244,255,106,0,1,2,6,255,106,0,1,3,44,253,168,0,1,3,44,253,168,0,1,2,88, + 254,12,0,1,2,88,254,12,0,1,3,44,253,168,0,1,3,44,253,168,0,1,2,88,255,6,0,1,2,88,255,6,0,1,3,44,253,168,0,1, + 3,44,253,168,0,1,2,88,254,12,0,1,2,88,254,12,0,1,3,44,253,168,0,1,3,44,253,168,0,1,2,88,254,12,0,1,2,88,254,12, + 0,1,1,243,254,162,0,1,1,243,254,162,0,1,1,194,255,106,0,1,1,194,255,106,0,1,1,194,255,106,0,1,1,194,255,106,0,1,1,194, + 255,106,0,1,1,194,255,106,0,1,1,244,254,12,0,1,1,244,254,12,0,1,1,244,254,12,0,1,1,244,254,12,0,1,3,32,255,106,0,1, + 3,32,255,106,0,1,1,44,255,106,0,1,1,44,255,106,0,1,3,32,255,106,0,1,3,32,255,106,0,1,1,44,255,106,0,1,1,44,255,106, + 0,1,3,32,253,68,0,1,3,32,253,68,0,1,1,144,253,118,0,1,1,144,253,118,0,1,3,32,255,106,0,1,3,32,255,106,0,1,1,44, + 255,106,0,1,1,44,255,106,0,1,2,238,254,62,0,1,2,238,253,168,0,1,2,238,254,62,0,1,2,238,253,168,0,1,1,43,255,156,0,1, + 1,43,255,156,0,1,3,32,255,106,0,1,3,82,253,168,0,1,1,194,255,106,0,1,1,244,253,168,0,1,3,32,255,56,0,1,3,32,255,56, + 0,1,1,44,255,106,0,1,1,44,255,106,0,1,1,244,254,12,0,1,1,244,254,12,0,1,1,43,255,156,0,1,1,43,255,156,0,1,2,188, + 254,112,0,1,2,188,254,112,0,1,1,43,254,162,0,1,1,43,254,162,0,1,1,44,255,156,0,1,1,44,255,156,0,1,1,44,255,156,0,1, + 0,197,255,156,0,1,1,44,254,12,0,1,1,44,255,156,0,1,1,44,255,156,0,1,1,44,255,156,0,1,1,44,255,156,0,1,1,44,254,212, + 0,1,1,44,254,212,0,1,1,44,255,156,0,1,1,44,255,156,0,1,1,44,255,156,0,1,1,44,255,156,0,1,1,244,0,50,0,1,1,29, + 255,156,0,1,1,29,255,156,0,1,1,29,255,156,0,1,1,29,255,156,0,1,1,244,254,12,0,1,1,244,254,12,0,1,1,29,253,168,0,1, + 1,29,253,168,0,1,2,188,254,112,0,1,2,188,254,112,0,1,1,43,255,156,0,1,1,43,255,156,0,1,1,29,255,156,0,1,1,29,255,156, + 0,1,3,132,254,112,0,1,3,132,254,112,0,1,1,43,254,162,0,1,1,43,254,162,0,1,1,244,255,106,0,1,1,244,255,106,0,1,3,132, + 255,106,0,1,3,132,255,106,0,1,1,43,255,156,0,1,1,43,255,156,0,1,3,132,255,106,0,1,3,132,255,106,0,1,1,43,255,156,0,1, + 1,43,255,156,0,1,3,44,253,168,0,1,3,44,253,168,0,1,2,88,254,162,0,1,2,88,254,162,0,1,3,44,253,168,0,1,3,44,253,168, + 0,1,2,88,255,156,0,1,2,88,255,156,0,1,3,44,253,168,0,1,3,44,253,168,0,1,2,88,255,156,0,1,2,88,255,156,0,1,1,194, + 255,106,0,1,1,194,255,106,0,1,1,194,255,106,0,1,1,194,255,106,0,1,1,244,254,12,0,1,1,244,254,12,0,1,1,244,254,12,0,1, + 1,244,254,12,0,1,2,88,253,168,0,1,2,88,253,168,0,1,2,138,255,106,0,1,2,138,255,106,0,1,2,88,253,168,0,1,2,88,253,168, + 0,1,2,138,255,106,0,1,2,138,255,106,0,1,2,88,253,168,0,1,2,88,253,168,0,1,2,38,255,106,0,1,2,38,255,106,0,1,2,88, + 253,168,0,1,2,88,253,168,0,1,2,38,255,106,0,1,2,38,255,106,0,1,2,91,255,106,0,1,2,91,255,106,0,1,1,83,255,106,0,1, + 1,83,255,106,0,1,2,91,255,106,0,1,2,91,255,106,0,1,1,83,255,106,0,1,1,83,255,106,0,1,2,138,253,168,0,1,2,215,253,168, + 0,1,2,88,255,156,0,1,1,238,255,156,0,1,2,138,253,168,0,1,2,215,253,168,0,1,2,88,255,156,0,1,1,238,255,156,0,1,3,32, + 255,56,0,1,3,32,255,56,0,1,1,244,255,106,0,1,2,6,255,106,0,1,2,188,253,218,0,1,2,188,253,168,0,1,1,244,255,106,0,1, + 2,6,255,106,0,1,3,32,255,56,0,1,3,32,255,56,0,1,1,44,255,106,0,1,1,44,255,106,0,1,2,188,254,62,0,1,2,188,254,62, + 0,1,1,83,255,156,0,1,1,83,255,156,0,1,0,240,253,168,0,1,0,240,253,168,0,1,2,38,255,106,0,1,2,38,255,106,0,1,2,238, + 254,62,0,1,2,238,253,168,0,1,1,43,255,156,0,1,1,43,255,156,0,1,1,244,255,106,0,1,1,244,255,106,0,1,1,194,255,106,0,1, + 1,244,253,168,0,1,1,244,254,12,0,1,1,244,254,12,0,1,2,188,254,112,0,1,2,188,254,112,0,1,2,188,253,218,0,1,2,188,253,218, + 0,1,1,43,254,162,0,1,1,43,254,162,0,1,3,132,255,106,0,1,1,43,255,156,0,1,1,43,255,156,0,1,3,32,255,56,0,1,1,244, + 255,106,0,1,2,6,255,106,0,1,2,188,253,153,0,1,1,244,255,106,0,1,2,6,255,106,0,1,1,43,255,156,0,1,1,43,255,156,0,1, + 3,132,254,94,0,1,1,43,254,194,0,1,1,43,254,194,0,1,3,132,255,106,0,1,1,43,255,156,0,1,1,43,255,156,0,1,3,44,253,168, + 0,1,2,88,255,156,0,1,2,88,255,156,0,1,3,44,253,168,0,1,2,88,255,156,0,1,2,88,255,156,0,1,3,44,253,168,0,1,2,88, + 255,156,0,1,2,88,255,156,0,1,3,44,253,168,0,1,2,88,254,12,0,1,2,88,254,12,0,1,1,244,254,12,0,1,1,244,254,12,0,1, + 2,188,254,62,0,1,1,83,255,156,0,1,1,83,255,156,0,1,2,188,254,112,0,1,1,43,254,162,0,1,1,43,254,162,0,1,1,244,254,12, + 0,1,1,244,255,106,0,1,1,29,0,0,0,1,1,29,0,0,0,1,1,29,0,0,0,1,2,73,0,0,0,1,2,73,0,0,0,1,2,73, + 0,0,0,1,1,171,0,0,0,1,1,171,0,0,0,1,1,171,0,0,0,1,2,94,0,0,0,1,2,94,0,0,0,1,2,94,0,0,0,1, + 2,157,0,0,0,1,2,157,0,0,0,1,2,157,0,0,0,1,2,157,0,0,0,1,2,157,0,0,0,1,2,157,0,0,0,1,2,96,0,0, + 0,1,2,96,0,0,0,1,2,96,0,0,0,1,2,157,0,0,0,1,2,157,0,0,0,1,2,157,0,0,0,1,3,146,0,0,0,1,3,146, + 0,0,0,1,3,146,0,0,0,1,1,22,0,0,0,1,1,22,0,0,0,1,1,22,0,0,0,1,2,107,0,0,0,1,2,107,0,0,0,1, + 2,107,0,0,0,1,2,47,0,0,0,1,2,47,0,0,0,1,2,47,0,0,0,1,3,5,0,0,0,1,3,5,0,0,0,1,3,5,0,0, + 0,1,1,169,0,0,0,1,1,169,0,0,0,1,1,169,0,0,0,1,3,213,0,0,0,1,3,213,0,0,0,1,3,213,0,0,0,1,1,221, + 0,0,0,1,1,221,0,0,0,1,1,221,0,0,0,1,3,35,0,0,0,1,3,35,0,0,0,1,3,35,0,0,0,1,2,157,0,0,0,1, + 2,157,0,0,0,1,2,157,0,0,0,1,2,128,0,0,0,1,2,128,0,0,0,1,2,128,0,0,0,1,3,2,0,0,0,1,3,2,0,0, + 0,1,3,2,0,0,0,1,3,26,0,0,0,1,3,26,0,0,0,1,3,26,0,0,0,1,3,101,0,0,0,1,3,101,0,0,0,1,3,101, + 0,0,0,1,1,221,0,0,0,1,1,221,0,0,0,1,1,221,0,0,0,1,2,128,0,0,0,1,2,128,0,0,0,1,2,128,0,0,0,1, + 2,89,0,0,0,1,2,89,0,0,0,1,2,89,0,0,0,1,3,26,0,0,0,1,3,26,0,0,0,1,3,26,0,0,0,1,3,26,0,0, + 0,1,3,26,0,0,0,1,3,26,0,0,0,1,2,27,0,0,0,1,2,27,0,0,0,1,2,27,0,0,0,1,2,89,0,0,0,1,2,89, + 0,0,0,1,2,89,0,0,0,1,2,89,0,0,0,1,2,89,0,0,0,1,2,89,0,0,0,1,1,244,254,94,0,1,1,244,254,112,0,1, + 1,244,254,112,0,1,1,194,255,106,0,1,1,194,255,106,0,1,1,244,254,12,0,1,1,244,254,12,0,1,1,244,254,12,0,1,1,244,254,12, + 0,1,1,244,254,12,0,1,2,88,253,168,0,1,3,232,254,112,0,1,3,232,254,112,0,1,2,88,253,168,0,1,3,232,253,218,0,1,3,232, + 253,218,0,1,2,88,253,168,0,1,3,232,253,218,0,1,3,232,253,218,0,1,2,88,253,168,0,1,3,32,254,112,0,1,3,32,254,112,0,1, + 2,88,253,168,0,1,2,38,255,106,0,1,2,38,255,106,0,1,2,91,255,106,0,1,1,83,255,106,0,1,1,83,255,106,0,1,2,215,253,168, + 0,1,2,88,255,156,0,1,1,238,255,156,0,1,3,182,254,112,0,1,1,243,254,162,0,1,1,243,254,162,0,1,3,182,254,112,0,1,1,243, + 254,162,0,1,1,243,254,162,0,1,3,182,253,118,0,1,1,244,253,168,0,1,1,244,253,168,0,1,2,188,253,153,0,1,1,244,255,106,0,1, + 2,6,255,106,0,1,2,188,253,153,0,1,1,244,255,106,0,1,2,6,255,106,0,1,3,32,255,106,0,1,1,164,255,106,0,1,1,164,255,106, + 0,1,3,32,255,106,0,1,1,44,255,106,0,1,1,44,255,106,0,1,3,32,255,56,0,1,1,44,255,106,0,1,1,44,255,106,0,1,3,32, + 253,118,0,1,1,144,253,168,0,1,1,144,253,168,0,1,3,32,255,106,0,1,1,44,255,106,0,1,1,44,255,106,0,1,3,32,254,112,0,1, + 1,144,254,162,0,1,1,144,254,162,0,1,3,32,255,106,0,1,1,44,255,106,0,1,1,44,255,106,0,1,2,188,254,62,0,1,1,83,255,156, + 0,1,1,83,255,156,0,1,2,188,254,62,0,1,1,83,255,156,0,1,1,83,255,156,0,1,2,238,252,174,0,1,1,43,253,218,0,1,1,73, + 253,218,0,1,3,7,252,149,0,1,1,43,254,162,0,1,1,43,254,162,0,1,3,7,252,99,0,1,1,43,254,194,0,1,1,43,254,194,0,1, + 2,238,253,168,0,1,1,43,255,156,0,1,1,43,255,156,0,2,0,13,5,38,5,67,0,0,5,79,5,114,0,30,5,142,5,143,0,66,5,146, + 5,220,0,68,5,241,6,14,0,143,19,223,20,64,0,173,20,85,20,216,1,15,22,202,22,212,1,147,22,214,22,231,1,158,23,3,23,11,1,176, + 23,13,23,13,1,185,23,32,23,121,1,186,23,135,23,219,2,20,0,1,0,16,5,16,5,17,5,18,5,19,5,20,5,21,5,22,5,23,5,24, + 5,27,5,29,5,37,5,117,5,120,5,125,6,22,0,16,0,0,0,66,0,0,0,72,0,0,0,78,0,0,0,84,0,0,0,90,0,0,0,96, + 0,0,0,102,0,0,0,108,0,0,0,114,0,0,0,120,0,0,0,126,0,0,0,132,0,0,0,138,0,0,0,144,0,0,0,150,0,0,0,156, + 0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143, + 0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,143,0,0,0,1,2,0,0,0,0,1, + 2,0,0,0,0,1,2,0,0,0,0,1,2,0,255,255,0,1,0,244,0,198,0,1,0,250,0,12,0,23,0,48,0,54,0,60,0,66,0,72, + 0,78,0,84,0,90,0,96,0,102,0,108,0,114,0,120,0,126,0,132,0,138,0,144,0,150,0,156,0,162,0,168,0,174,0,180,0,1,2,99, + 0,140,0,1,1,209,2,48,0,1,0,242,2,48,0,1,1,172,2,48,0,1,2,153,2,48,0,1,0,56,3,27,0,1,0,20,2,48,0,1, + 2,181,2,48,0,1,0,6,3,27,0,1,1,127,2,48,0,1,1,113,2,61,0,1,1,105,2,48,0,1,2,213,2,48,0,1,0,232,2,48, + 0,1,2,171,2,48,0,1,2,216,1,49,0,1,3,20,2,48,0,1,1,18,1,205,0,1,2,102,2,48,0,1,1,228,2,48,0,1,3,106, + 2,61,0,1,2,198,2,48,0,1,0,80,3,27,0,2,0,7,5,38,5,44,0,0,5,46,5,50,0,7,5,52,5,52,0,12,5,54,5,55, + 0,13,5,57,5,58,0,15,5,60,5,64,0,17,19,177,19,177,0,22,0,1,0,1,5,28,0,1,0,0,0,6,0,1,2,153,2,48,0,1, + 0,184,0,174,0,1,0,232,0,12,0,8,0,18,0,36,0,54,0,72,0,90,0,108,0,126,0,144,0,2,0,6,0,12,0,1,3,99,6,114, + 0,1,0,150,7,8,0,2,0,6,0,12,0,1,3,99,6,114,0,1,0,150,7,8,0,2,0,6,0,12,0,1,3,99,6,114,0,1,0,150, + 7,228,0,2,0,6,0,12,0,1,3,99,6,114,0,1,0,150,7,228,0,2,0,6,0,12,0,1,3,99,6,114,0,1,0,150,5,220,0,2, + 0,6,0,12,0,1,3,99,6,114,0,1,0,150,5,220,0,2,0,6,0,12,0,1,3,99,6,114,0,1,0,150,5,220,0,2,0,6,0,12, + 0,1,3,99,6,114,0,1,0,150,5,220,0,2,0,1,20,217,20,224,0,0,0,1,0,22,5,31,5,75,5,115,5,116,5,118,5,119,5,121, + 5,122,5,123,5,124,5,126,5,127,5,144,19,178,23,24,23,25,23,26,23,27,23,28,23,29,23,30,23,31,0,22,0,0,0,90,0,0,0,96, + 0,0,0,102,0,0,0,108,0,0,0,114,0,0,0,120,0,0,0,126,0,0,0,132,0,0,0,138,0,0,0,144,0,0,0,150,0,0,0,156, + 0,0,0,162,0,0,0,168,0,0,0,174,0,0,0,180,0,0,0,186,0,0,0,192,0,0,0,198,0,0,0,204,0,0,0,210,0,0,0,216, + 0,1,2,143,4,96,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0, + 4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1, + 2,143,4,96,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176, + 0,1,2,0,4,176,0,1,2,0,4,176,0,1,18,220,18,126,0,1,19,28,0,12,2,78,4,158,4,164,4,170,4,176,4,182,4,188,4,194, + 4,200,4,206,4,212,4,218,4,224,4,230,4,236,4,242,4,248,4,254,5,4,5,10,5,16,5,22,5,28,5,34,5,40,5,46,5,52,5,58, + 5,64,5,70,5,76,5,82,5,88,5,94,5,100,5,106,5,112,5,118,5,124,5,130,5,136,5,142,5,148,5,154,5,160,5,166,5,172,5,178, + 5,184,5,190,5,196,5,202,5,208,5,214,5,220,5,226,5,232,5,238,5,244,5,250,6,0,6,6,6,12,6,18,6,24,6,30,6,36,6,42, + 6,48,6,54,6,60,6,66,6,72,6,78,6,84,6,90,6,96,6,102,6,108,6,114,6,120,6,126,6,132,6,138,6,144,6,150,6,156,6,162, + 6,168,6,174,6,180,6,186,6,192,6,198,6,204,6,210,6,216,6,222,6,228,6,234,6,240,6,246,6,252,7,2,7,8,7,14,7,20,7,26, + 7,32,7,38,7,44,7,50,7,56,7,62,7,68,7,74,7,80,7,86,7,92,7,98,7,104,7,110,7,116,7,122,7,128,7,134,7,140,7,146, + 7,152,7,158,7,164,7,170,7,176,7,182,7,188,7,194,7,200,7,206,7,212,7,218,7,224,7,230,7,236,7,242,7,248,7,254,8,4,8,10, + 8,16,8,22,8,28,8,34,8,40,8,46,8,52,8,58,8,64,8,70,8,76,8,82,8,88,8,94,8,100,8,106,8,112,8,118,8,124,8,130, + 8,136,8,142,8,148,8,154,8,160,8,166,8,172,8,178,8,184,8,190,8,196,8,202,8,208,8,214,8,220,8,226,8,232,8,238,8,244,8,250, + 9,0,9,6,9,12,9,18,9,24,9,30,9,36,9,42,9,48,9,54,9,60,9,66,9,72,9,78,9,84,9,90,9,96,9,102,9,108,9,114, + 9,120,9,126,9,132,9,138,9,144,9,150,9,156,9,162,9,168,9,174,9,180,9,186,9,192,9,198,9,204,9,210,9,216,9,222,9,228,9,234, + 9,240,9,246,9,252,10,2,10,8,10,14,10,20,10,26,10,32,10,38,10,44,10,50,10,56,10,62,10,68,10,74,10,80,10,86,10,92,10,98, + 10,104,10,110,10,116,10,122,10,128,10,134,10,140,10,146,10,152,10,158,10,164,10,170,10,176,10,182,10,188,10,194,10,200,10,206,10,212,10,218, + 10,224,10,230,10,236,10,242,10,248,10,254,11,4,11,10,11,16,11,22,11,28,11,34,11,40,11,46,11,52,11,58,11,64,11,70,11,76,11,82, + 11,88,11,94,11,100,11,106,11,112,11,118,11,124,11,130,11,136,11,142,11,148,11,154,11,160,11,166,11,172,11,178,11,184,11,190,11,196,11,202, + 11,208,11,214,11,220,11,226,11,232,11,238,11,244,11,250,12,0,12,6,12,12,12,18,12,24,12,30,12,36,12,42,12,48,12,54,12,60,12,66, + 12,72,12,78,12,84,12,90,12,96,12,102,12,108,12,114,12,120,12,126,12,132,12,138,12,144,12,150,12,156,12,162,12,168,12,174,12,180,12,186, + 12,192,12,198,12,204,12,210,12,216,12,222,12,228,12,234,12,240,12,246,12,252,13,2,13,8,13,14,13,20,13,26,13,32,13,38,13,44,13,50, + 13,56,13,62,13,68,13,74,13,80,13,86,13,92,13,98,13,104,13,110,13,116,13,122,13,128,13,134,13,140,13,146,13,152,13,158,13,164,13,170, + 13,176,13,182,13,188,13,194,13,200,13,206,13,212,13,218,13,224,13,230,13,236,13,242,13,248,13,254,14,4,14,10,14,16,14,22,14,28,14,34, + 14,40,14,46,14,52,14,58,14,64,14,70,14,76,14,82,14,88,14,94,14,100,14,106,14,112,14,118,14,124,14,130,14,136,14,142,14,148,14,154, + 14,160,14,166,14,172,14,178,14,184,14,190,14,196,14,202,14,208,14,214,14,220,14,226,14,232,14,238,14,244,14,250,15,0,15,6,15,12,15,18, + 15,24,15,30,15,36,15,42,15,48,15,54,15,60,15,66,15,72,15,78,15,84,15,90,15,96,15,102,15,108,15,114,15,120,15,126,15,132,15,138, + 15,144,15,150,15,156,15,162,15,168,15,174,15,180,15,186,15,192,15,198,15,204,15,210,15,216,15,222,15,228,15,234,15,240,15,246,15,252,16,2, + 16,8,16,14,16,20,16,26,16,32,16,38,16,44,16,50,16,56,16,62,16,68,16,74,16,80,16,86,16,92,16,98,16,104,16,110,16,116,16,122, + 16,128,16,134,16,140,16,146,16,152,16,158,16,164,16,170,16,176,16,182,16,188,16,194,16,200,16,206,16,212,16,218,16,224,16,230,16,236,16,242, + 16,248,16,254,17,4,17,10,17,16,17,22,17,28,17,34,17,40,17,46,17,52,17,58,17,64,17,70,17,76,17,82,17,88,17,94,17,100,17,106, + 17,112,17,118,17,124,17,130,17,136,17,142,17,148,17,154,17,160,17,166,17,172,17,178,17,184,17,190,17,196,17,202,17,208,17,214,17,220,17,226, + 17,232,17,238,17,244,17,250,18,0,18,6,18,12,18,18,18,24,18,30,18,36,18,42,18,48,18,54,18,60,18,66,18,72,18,78,18,84,18,90, + 18,96,18,102,18,108,0,1,2,82,4,96,0,1,2,25,4,96,0,1,2,83,4,96,0,1,1,29,7,158,0,1,1,29,8,52,0,1,1,194, + 4,226,0,1,1,29,6,114,0,1,1,244,5,20,0,1,1,29,6,114,0,1,3,132,3,232,0,1,1,194,4,76,0,1,3,132,3,82,0,1, + 3,132,4,76,0,1,2,138,3,232,0,1,2,138,3,232,0,1,2,138,4,226,0,1,1,144,3,232,0,1,1,144,4,226,0,1,2,188,2,238, + 0,1,2,188,3,232,0,1,2,88,3,32,0,1,2,88,3,32,0,1,2,88,3,32,0,1,2,88,3,32,0,1,2,91,6,114,0,1,2,91, + 6,114,0,1,1,194,4,126,0,1,1,194,5,120,0,1,1,44,4,176,0,1,2,188,4,76,0,1,1,244,4,76,0,1,2,188,5,220,0,1, + 2,138,5,20,0,1,2,138,3,182,0,1,2,138,3,232,0,1,1,194,3,82,0,1,1,244,2,238,0,1,1,244,2,238,0,1,1,244,2,238, + 0,1,3,132,3,232,0,1,1,244,4,76,0,1,3,132,4,226,0,1,3,132,4,76,0,1,3,132,3,232,0,1,3,132,3,82,0,1,3,132, + 3,232,0,1,3,132,3,232,0,1,3,132,4,76,0,1,3,132,3,232,0,1,2,138,6,14,0,1,2,138,5,220,0,1,2,138,3,232,0,1, + 2,138,3,232,0,1,2,138,5,220,0,1,2,138,3,232,0,1,2,138,3,232,0,1,1,194,6,64,0,1,1,144,3,232,0,1,1,144,3,232, + 0,1,1,194,6,64,0,1,1,194,4,226,0,1,1,144,3,232,0,1,1,194,5,220,0,1,1,194,5,170,0,1,1,194,5,220,0,1,2,188, + 5,120,0,1,2,188,4,176,0,1,2,188,2,238,0,1,2,188,2,238,0,1,2,188,2,238,0,1,2,188,2,238,0,1,2,188,3,232,0,1, + 2,188,4,226,0,1,2,188,4,226,0,1,2,88,3,32,0,1,2,88,3,32,0,1,2,88,3,32,0,1,2,88,3,32,0,1,2,88,3,32, + 0,1,2,91,6,114,0,1,1,244,6,114,0,1,2,188,4,76,0,1,2,188,4,76,0,1,2,188,4,76,0,1,2,188,4,76,0,1,2,188, + 4,76,0,1,2,188,4,76,0,1,1,244,4,76,0,1,1,244,4,76,0,1,1,244,5,120,0,1,1,244,5,120,0,1,1,244,5,120,0,1, + 3,57,6,14,0,1,3,57,7,8,0,1,2,188,5,220,0,1,1,244,5,120,0,1,1,244,5,120,0,1,1,244,5,120,0,1,1,244,5,120, + 0,1,1,244,5,120,0,1,1,244,5,120,0,1,4,188,8,52,0,1,4,188,8,52,0,1,4,188,8,102,0,1,2,138,5,20,0,1,2,138, + 3,232,0,1,2,138,2,238,0,1,2,188,5,95,0,1,2,138,3,232,0,1,2,188,4,226,0,1,3,82,4,76,0,1,2,138,4,226,0,1, + 1,244,4,226,0,1,1,244,2,238,0,1,1,244,4,226,0,1,1,194,3,82,0,1,1,22,5,240,0,1,2,73,5,240,0,1,1,171,5,240, + 0,1,2,94,5,240,0,1,2,157,5,240,0,1,2,157,5,240,0,1,2,96,5,240,0,1,2,157,5,240,0,1,1,224,5,240,0,1,2,19, + 5,240,0,1,1,110,5,240,0,1,1,22,5,240,0,1,2,167,5,240,0,1,1,169,5,240,0,1,3,203,5,240,0,1,1,221,5,240,0,1, + 3,35,5,240,0,1,2,157,5,242,0,1,2,128,5,242,0,1,3,2,5,240,0,1,3,26,5,240,0,1,2,148,5,240,0,1,1,221,5,240, + 0,1,2,128,5,242,0,1,2,89,5,240,0,1,3,26,5,240,0,1,3,26,5,240,0,1,2,27,5,240,0,1,2,89,5,240,0,1,2,89, + 5,240,0,1,3,132,3,232,0,1,3,132,3,232,0,1,1,43,3,232,0,1,1,43,3,232,0,1,3,132,3,232,0,1,3,132,3,232,0,1, + 1,43,3,232,0,1,1,43,3,232,0,1,3,132,3,232,0,1,3,132,3,232,0,1,1,43,3,232,0,1,1,43,3,232,0,1,3,132,4,76, + 0,1,3,132,4,76,0,1,1,43,5,20,0,1,1,43,5,20,0,1,3,132,4,76,0,1,3,132,4,76,0,1,1,43,5,20,0,1,1,43, + 5,20,0,1,3,132,4,226,0,1,3,132,4,226,0,1,1,43,5,170,0,1,1,43,5,170,0,1,2,188,4,76,0,1,2,188,4,76,0,1, + 1,244,6,64,0,1,2,6,5,170,0,1,2,188,4,76,0,1,2,188,4,76,0,1,1,244,6,64,0,1,2,6,5,170,0,1,2,138,3,232, + 0,1,2,138,3,232,0,1,2,88,3,232,0,1,2,88,3,232,0,1,2,138,3,232,0,1,2,138,3,232,0,1,2,88,3,232,0,1,2,88, + 3,232,0,1,2,138,3,232,0,1,2,138,3,232,0,1,2,88,3,232,0,1,2,88,3,232,0,1,2,138,3,232,0,1,2,138,3,232,0,1, + 2,88,3,232,0,1,2,88,3,232,0,1,1,144,3,232,0,1,1,144,3,232,0,1,1,194,4,226,0,1,1,194,4,226,0,1,1,194,5,220, + 0,1,1,194,5,220,0,1,1,194,6,64,0,1,1,194,6,64,0,1,2,188,4,226,0,1,2,188,4,226,0,1,2,188,5,120,0,1,2,188, + 5,120,0,1,1,244,5,120,0,1,1,244,5,120,0,1,0,250,6,14,0,1,0,250,6,14,0,1,1,244,5,120,0,1,1,244,5,120,0,1, + 0,250,6,164,0,1,0,250,6,164,0,1,1,244,5,120,0,1,1,244,5,120,0,1,0,250,6,164,0,1,0,250,6,164,0,1,1,244,5,120, + 0,1,1,244,5,120,0,1,1,19,7,108,0,1,1,19,7,108,0,1,2,138,2,238,0,1,2,138,2,138,0,1,2,188,5,95,0,1,2,188, + 4,101,0,1,1,43,5,170,0,1,1,43,5,170,0,1,3,82,4,76,0,1,3,82,3,32,0,1,1,244,4,76,0,1,1,244,3,32,0,1, + 3,57,7,8,0,1,3,57,7,8,0,1,1,19,7,158,0,1,1,19,7,158,0,1,1,244,4,226,0,1,1,244,4,226,0,1,1,43,3,232, + 0,1,1,43,3,232,0,1,1,244,2,238,0,1,2,88,2,86,0,1,1,43,3,232,0,1,1,43,3,232,0,1,1,44,6,164,0,1,1,44, + 6,164,0,1,1,44,7,58,0,1,0,197,4,176,0,1,1,44,4,176,0,1,1,44,5,220,0,1,1,44,5,220,0,1,1,44,7,58,0,1, + 1,44,7,58,0,1,1,44,4,176,0,1,1,44,4,176,0,1,1,44,7,8,0,1,1,44,7,8,0,1,1,44,7,58,0,1,1,44,7,58, + 0,1,1,194,4,76,0,1,1,29,7,208,0,1,1,29,7,208,0,1,1,29,8,152,0,1,1,29,8,152,0,1,1,194,4,226,0,1,1,194, + 4,226,0,1,1,29,6,114,0,1,1,29,6,114,0,1,1,244,5,20,0,1,2,88,4,26,0,1,1,43,5,70,0,1,1,43,5,70,0,1, + 1,29,6,114,0,1,1,29,6,114,0,1,3,132,3,232,0,1,3,132,3,232,0,1,1,43,3,232,0,1,1,43,3,232,0,1,1,194,4,76, + 0,1,2,38,4,76,0,1,3,132,3,82,0,1,3,132,3,82,0,1,1,43,4,26,0,1,1,43,4,26,0,1,3,132,4,76,0,1,3,132, + 4,76,0,1,1,43,5,20,0,1,1,43,5,20,0,1,2,138,3,232,0,1,2,138,3,232,0,1,2,88,3,232,0,1,2,88,3,232,0,1, + 2,138,3,232,0,1,2,138,3,232,0,1,2,88,3,232,0,1,2,88,3,232,0,1,2,138,4,226,0,1,2,138,4,226,0,1,2,88,4,126, + 0,1,2,88,4,126,0,1,1,144,3,232,0,1,1,144,3,232,0,1,1,144,4,226,0,1,1,144,4,226,0,1,2,188,2,238,0,1,2,188, + 2,238,0,1,2,188,3,232,0,1,2,188,3,232,0,1,2,88,3,32,0,1,2,88,3,32,0,1,2,138,3,132,0,1,2,138,3,132,0,1, + 2,88,3,32,0,1,2,88,3,32,0,1,3,82,4,226,0,1,3,82,4,226,0,1,2,88,3,32,0,1,2,88,3,32,0,1,2,38,3,32, + 0,1,2,38,3,32,0,1,2,88,3,32,0,1,2,88,3,32,0,1,2,38,3,232,0,1,2,38,3,232,0,1,2,91,6,114,0,1,2,91, + 6,114,0,1,1,83,6,114,0,1,1,83,6,114,0,1,2,91,6,114,0,1,2,91,6,114,0,1,1,83,6,114,0,1,1,83,6,114,0,1, + 1,194,4,126,0,1,1,244,3,232,0,1,1,194,4,126,0,1,1,238,3,232,0,1,1,194,5,120,0,1,1,244,4,126,0,1,1,194,5,120, + 0,1,1,238,4,126,0,1,2,188,4,76,0,1,2,188,4,76,0,1,1,244,5,70,0,1,2,6,4,176,0,1,1,244,4,76,0,1,1,244, + 3,82,0,1,1,244,5,70,0,1,2,6,4,176,0,1,2,188,5,220,0,1,2,188,5,220,0,1,0,250,6,14,0,1,0,250,6,14,0,1, + 2,138,5,20,0,1,2,138,5,20,0,1,1,83,6,114,0,1,1,83,6,114,0,1,2,138,3,182,0,1,2,138,3,82,0,1,2,38,3,82, + 0,1,2,38,3,82,0,1,2,138,3,232,0,1,2,138,2,238,0,1,1,43,4,26,0,1,1,43,4,26,0,1,1,194,3,82,0,1,2,38, + 3,82,0,1,1,244,4,76,0,1,1,244,3,32,0,1,1,244,2,238,0,1,1,244,2,238,0,1,1,244,2,238,0,1,2,88,2,86,0,1, + 1,244,2,238,0,1,2,88,2,238,0,1,1,43,3,232,0,1,1,43,3,232,0,1,3,132,3,232,0,1,1,43,3,232,0,1,1,43,3,232, + 0,1,2,188,4,76,0,1,1,244,4,76,0,1,2,6,3,182,0,1,1,244,3,82,0,1,1,244,4,76,0,1,2,6,3,182,0,1,1,43, + 4,26,0,1,1,43,4,26,0,1,3,132,3,82,0,1,1,43,4,26,0,1,1,43,4,26,0,1,3,132,3,232,0,1,1,43,5,20,0,1, + 1,43,5,20,0,1,2,138,6,14,0,1,2,88,5,170,0,1,2,88,5,170,0,1,2,138,5,220,0,1,2,88,5,120,0,1,2,88,5,120, + 0,1,2,138,5,220,0,1,2,88,5,120,0,1,2,88,5,120,0,1,2,138,4,226,0,1,2,88,4,126,0,1,2,88,4,126,0,1,2,188, + 2,238,0,1,2,188,2,238,0,1,4,188,8,52,0,1,1,83,8,52,0,1,1,83,8,52,0,1,2,188,3,182,0,1,1,43,4,176,0,1, + 1,43,4,176,0,1,2,188,4,176,0,1,2,38,3,82,0,1,1,29,5,240,0,1,1,29,5,240,0,1,1,29,5,240,0,1,2,73,5,240, + 0,1,2,73,5,240,0,1,2,73,5,240,0,1,1,171,5,240,0,1,1,171,5,240,0,1,1,171,5,240,0,1,2,94,5,240,0,1,2,94, + 5,240,0,1,2,94,5,240,0,1,2,157,5,240,0,1,2,157,5,240,0,1,2,157,5,240,0,1,2,157,5,240,0,1,2,157,5,240,0,1, + 2,157,5,240,0,1,2,96,5,240,0,1,2,96,5,240,0,1,2,96,5,240,0,1,2,157,5,240,0,1,2,157,5,240,0,1,2,157,5,240, + 0,1,1,224,5,240,0,1,1,224,5,240,0,1,1,224,5,240,0,1,2,19,5,240,0,1,2,19,5,240,0,1,2,19,5,240,0,1,1,110, + 5,240,0,1,1,110,5,240,0,1,1,110,5,240,0,1,1,22,5,240,0,1,1,22,5,240,0,1,1,22,5,240,0,1,2,167,5,240,0,1, + 2,167,5,240,0,1,2,167,5,240,0,1,1,169,5,240,0,1,1,169,5,240,0,1,1,169,5,240,0,1,3,203,5,240,0,1,3,203,5,240, + 0,1,3,203,5,240,0,1,1,221,5,240,0,1,1,221,5,240,0,1,1,221,5,240,0,1,3,35,5,240,0,1,3,35,5,240,0,1,3,35, + 5,240,0,1,2,157,5,242,0,1,2,157,5,242,0,1,2,157,5,242,0,1,2,128,5,242,0,1,2,128,5,242,0,1,2,128,5,242,0,1, + 3,2,5,240,0,1,3,2,5,240,0,1,3,2,5,240,0,1,3,26,5,240,0,1,3,26,5,240,0,1,3,26,5,240,0,1,2,148,5,240, + 0,1,2,148,5,240,0,1,2,148,5,240,0,1,1,221,5,240,0,1,1,221,5,240,0,1,1,221,5,240,0,1,2,128,5,242,0,1,2,128, + 5,242,0,1,2,128,5,242,0,1,2,89,5,240,0,1,2,89,5,240,0,1,2,89,5,240,0,1,3,26,5,240,0,1,3,26,5,240,0,1, + 3,26,5,240,0,1,3,26,5,240,0,1,3,26,5,240,0,1,3,26,5,240,0,1,2,27,5,240,0,1,2,27,5,240,0,1,2,27,5,240, + 0,1,2,89,5,240,0,1,2,89,5,240,0,1,2,89,5,240,0,1,2,89,5,240,0,1,2,89,5,240,0,1,2,89,5,240,0,1,1,144, + 3,232,0,1,1,144,3,232,0,1,1,194,6,64,0,1,1,194,5,170,0,1,1,194,5,220,0,1,2,188,2,238,0,1,2,188,2,238,0,1, + 2,188,2,238,0,1,2,188,3,232,0,1,2,188,4,226,0,1,2,88,3,32,0,1,3,82,4,26,0,1,3,82,4,26,0,1,2,88,3,32, + 0,1,2,138,3,132,0,1,2,138,3,132,0,1,2,88,3,32,0,1,3,82,4,226,0,1,3,82,4,226,0,1,2,88,3,32,0,1,2,38, + 3,32,0,1,2,38,3,32,0,1,2,88,3,32,0,1,2,88,4,226,0,1,2,88,4,226,0,1,2,91,6,114,0,1,1,83,6,114,0,1, + 1,83,6,114,0,1,1,244,5,120,0,1,1,244,6,114,0,1,1,238,5,120,0,1,2,188,4,76,0,1,1,244,4,76,0,1,2,6,3,182, + 0,1,2,188,4,76,0,1,1,244,5,70,0,1,2,6,4,176,0,1,2,188,4,76,0,1,1,244,4,76,0,1,2,6,3,182,0,1,1,244, + 3,82,0,1,1,244,5,70,0,1,2,6,4,176,0,1,1,244,3,82,0,1,1,244,6,64,0,1,2,6,5,170,0,1,1,244,5,120,0,1, + 0,120,5,120,0,1,0,120,5,120,0,1,1,244,5,120,0,1,0,250,6,14,0,1,0,250,6,14,0,1,3,57,6,14,0,1,1,19,6,164, + 0,1,1,19,6,164,0,1,2,188,5,220,0,1,0,250,6,14,0,1,0,250,6,14,0,1,1,244,5,120,0,1,0,250,6,164,0,1,0,250, + 6,164,0,1,1,244,5,120,0,1,0,250,6,164,0,1,0,250,6,164,0,1,1,244,5,120,0,1,1,19,8,102,0,1,1,19,8,102,0,1, + 4,188,8,52,0,1,1,83,8,52,0,1,1,83,8,52,0,1,4,188,8,102,0,1,1,83,8,102,0,1,1,83,8,102,0,1,2,138,5,20, + 0,1,1,83,6,114,0,1,1,83,6,114,0,1,2,138,2,238,0,1,1,43,4,26,0,1,1,43,4,26,0,1,2,138,2,238,0,1,1,43, + 4,26,0,1,1,43,4,26,0,1,2,188,3,232,0,1,1,43,5,20,0,1,1,43,5,20,0,2,0,15,5,39,5,39,0,0,5,49,5,49, + 0,1,5,58,5,58,0,2,5,79,5,114,0,3,5,142,5,143,0,39,5,146,5,220,0,41,5,241,6,14,0,116,19,223,20,64,0,146,20,85, + 20,216,0,244,22,202,22,212,1,120,22,214,22,231,1,131,23,3,23,11,1,149,23,13,23,13,1,158,23,32,23,121,1,159,23,135,23,219,1,249, + 0,1,0,30,5,31,5,75,5,115,5,116,5,118,5,119,5,121,5,122,5,123,5,124,5,126,5,127,5,144,6,15,6,16,6,17,6,18,6,19, + 6,20,6,21,6,23,19,178,23,24,23,25,23,26,23,27,23,28,23,29,23,30,23,31,0,30,0,0,0,122,0,0,0,128,0,0,0,134,0,0, + 0,140,0,0,0,146,0,0,0,152,0,0,0,158,0,0,0,164,0,0,0,170,0,0,0,176,0,0,0,182,0,0,0,188,0,0,0,194,0,0, + 0,200,0,0,0,206,0,0,0,212,0,0,0,218,0,0,0,224,0,0,0,230,0,0,0,236,0,0,0,242,0,0,0,248,0,0,0,254,0,0, + 1,4,0,0,1,10,0,0,1,16,0,0,1,22,0,0,1,28,0,0,1,34,0,0,1,40,0,1,2,143,4,96,0,1,2,0,4,176,0,1, + 2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176, + 0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,123,0,1,2,0,4,123,0,1,2,0, + 4,123,0,1,2,0,4,123,0,1,2,0,4,123,0,1,2,0,4,123,0,1,2,0,4,123,0,1,2,0,4,123,0,1,2,143,4,96,0,1, + 2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176,0,1,2,0,4,176, + 0,1,2,0,4,176,0,1,1,6,0,246,0,1,1,16,0,12,0,29,0,60,0,66,0,72,0,78,0,84,0,90,0,96,0,102,0,108,0,114, + 0,120,0,126,0,132,0,138,0,144,0,150,0,156,0,162,0,168,0,174,0,180,0,186,0,192,0,198,0,204,0,210,0,216,0,222,0,228,0,1, + 5,93,0,0,0,1,5,120,0,0,0,1,5,129,0,0,0,1,3,220,254,29,0,1,5,6,0,0,0,1,5,120,255,64,0,1,5,128,0,0, + 0,1,5,91,0,0,0,1,5,34,0,0,0,1,5,41,255,64,0,1,5,62,0,0,0,1,5,69,0,0,0,1,5,0,0,0,0,1,5,0, + 0,0,0,1,5,246,0,0,0,1,6,34,0,0,0,1,5,126,0,0,0,1,5,126,0,0,0,1,5,157,0,0,0,1,5,128,0,0,0,1, + 5,120,0,0,0,1,5,50,0,0,0,1,5,15,0,0,0,1,5,160,0,0,0,1,6,141,0,0,0,1,5,16,0,0,0,1,5,120,0,0, + 0,1,8,58,0,0,0,1,8,58,0,0,0,2,0,2,6,30,6,56,0,0,6,93,6,94,0,27,0,1,0,3,6,66,6,67,6,69,0,3, + 0,0,0,14,0,0,0,20,0,0,0,26,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,1,34,1,6,0,1,1,62, + 0,12,0,31,0,64,0,70,0,76,0,82,0,88,0,94,0,100,0,106,0,112,0,118,0,124,0,130,0,136,0,142,0,148,0,154,0,160,0,166, + 0,172,0,178,0,184,0,190,0,196,0,202,0,208,0,214,0,220,0,226,0,232,0,238,0,244,0,1,5,93,4,107,0,1,5,120,4,121,0,1, + 5,129,4,121,0,1,3,220,4,121,0,1,5,6,4,154,0,1,5,120,4,121,0,1,5,128,4,122,0,1,5,91,4,102,0,1,5,34,4,119, + 0,1,5,41,4,104,0,1,5,62,4,121,0,1,5,69,4,121,0,1,5,0,4,96,0,1,5,0,5,80,0,1,5,246,4,91,0,1,6,34, + 5,25,0,1,5,126,4,91,0,1,5,126,5,116,0,1,5,157,4,96,0,1,5,128,4,122,0,1,5,120,4,121,0,1,5,50,4,123,0,1, + 5,15,4,96,0,1,5,160,4,148,0,1,6,141,4,136,0,1,5,16,4,117,0,1,5,120,4,144,0,1,0,0,4,74,0,1,0,0,4,74, + 0,1,8,58,4,136,0,1,8,58,4,136,0,2,0,4,6,30,6,56,0,0,6,76,6,76,0,27,6,91,6,91,0,28,6,93,6,94,0,29, + 0,1,0,12,6,59,6,62,6,63,6,64,6,65,6,68,6,77,6,78,6,79,6,80,6,81,6,82,0,12,0,0,0,50,0,0,0,56,0,0, + 0,62,0,0,0,68,0,0,0,74,0,0,0,80,0,0,0,86,0,0,0,92,0,0,0,98,0,0,0,104,0,0,0,110,0,0,0,116,0,1, + 0,0,4,116,0,1,0,0,4,98,0,1,0,0,4,98,0,1,0,0,4,98,0,1,0,0,4,98,0,1,0,0,4,116,0,1,0,0,4,96, + 0,1,0,0,4,126,0,1,0,0,4,126,0,1,0,0,4,96,0,1,0,0,4,126,0,1,0,0,4,96,0,1,0,32,0,26,0,1,0,90, + 0,12,0,1,0,4,0,1,0,4,0,1,2,166,254,82,0,1,0,1,0,169,0,2,0,9,2,199,2,202,0,0,2,205,2,209,0,4,2,212, + 2,215,0,9,2,218,2,228,0,13,2,234,2,237,0,24,2,248,2,250,0,28,2,254,2,255,0,31,3,3,3,3,0,33,3,6,3,6,0,34, + 0,35,0,0,0,142,0,0,0,148,0,0,0,154,0,0,0,160,0,0,0,166,0,0,0,172,0,0,0,178,0,0,0,184,0,0,0,190,0,0, + 0,196,0,0,0,202,0,0,0,208,0,0,0,214,0,0,0,220,0,0,0,226,0,0,0,232,0,0,0,238,0,0,0,244,0,0,0,250,0,0, + 1,0,0,0,1,6,0,0,1,12,0,0,1,18,0,0,1,24,0,0,1,30,0,0,1,36,0,0,1,42,0,0,1,48,0,0,1,54,0,0, + 1,60,0,0,1,66,0,0,1,72,0,0,1,78,0,0,1,84,0,0,1,90,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,0,0, + 0,1,254,0,0,0,0,1,254,0,255,254,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0, + 255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1, + 254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255, + 0,1,254,0,255,255,0,1,254,0,255,254,0,1,254,0,255,255,0,1,254,2,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0, + 255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,5,140,4,182,0,1, + 5,148,0,12,0,149,1,44,1,50,1,56,1,62,1,68,1,74,1,80,1,86,1,92,1,98,1,104,1,110,1,116,1,122,1,128,1,134,1,140, + 1,146,1,152,1,158,1,164,1,170,1,176,1,182,1,188,1,194,1,200,1,206,1,212,1,218,1,224,1,230,1,236,1,242,1,248,1,254,2,4, + 2,10,2,16,2,22,2,28,2,34,2,40,2,46,2,52,2,58,2,64,2,70,2,76,2,82,2,88,2,94,2,100,2,106,2,112,2,118,2,124, + 2,130,2,136,2,142,2,148,2,154,2,160,2,166,2,172,2,178,2,184,2,190,2,196,2,202,2,208,2,214,2,220,2,226,2,232,2,238,2,244, + 2,250,3,0,3,6,3,12,3,18,3,24,3,30,3,36,3,42,3,48,3,54,3,60,3,66,3,72,3,78,3,84,3,90,3,96,3,102,3,108, + 3,114,3,120,3,126,3,132,3,138,3,144,3,150,3,156,3,162,3,168,3,174,3,180,3,186,3,192,3,198,3,204,3,210,3,216,3,222,3,228, + 3,234,3,240,3,246,3,252,4,2,4,8,4,14,4,20,4,26,4,32,4,38,4,44,4,50,4,56,4,62,4,68,4,74,4,80,4,86,4,92, + 4,98,4,104,4,110,4,116,4,122,4,128,4,134,4,140,4,146,4,152,4,158,4,164,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0, + 5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1, + 0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240, + 0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0, + 5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1, + 0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240, + 0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0, + 5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1, + 0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240, + 0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0, + 5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1, + 0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240, + 0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0, + 5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1, + 0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240, + 0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0, + 5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1, + 0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240, + 0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0, + 5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1, + 0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240, + 0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0, + 5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,1,0,0,5,240,0,2, + 0,35,0,36,0,61,0,0,0,68,0,93,0,26,0,154,0,154,0,52,0,186,0,186,0,53,0,198,0,199,0,54,0,208,0,209,0,56,0,243, + 0,243,0,58,1,40,1,41,0,59,1,65,1,65,0,61,1,72,1,72,0,62,1,81,1,82,0,63,1,89,1,89,0,65,1,97,1,97,0,66, + 1,121,1,123,0,67,2,18,2,18,0,70,2,22,2,22,0,71,2,27,2,27,0,72,2,29,2,29,0,73,2,42,2,42,0,74,2,55,2,55, + 0,75,2,84,2,84,0,76,8,204,8,204,0,77,9,3,9,12,0,78,17,225,17,227,0,88,17,230,17,231,0,91,17,237,17,237,0,93,17,241, + 17,242,0,94,18,254,19,1,0,96,19,7,19,17,0,100,19,20,19,29,0,111,19,31,19,35,0,121,19,40,19,43,0,126,19,50,19,62,0,130, + 19,64,19,68,0,143,22,234,22,234,0,148,0,1,0,2,20,82,20,84,0,2,0,0,0,10,0,0,0,16,0,1,0,0,5,240,0,1,0,0, + 5,240,0,1,0,98,0,78,0,1,0,106,0,12,0,8,0,18,0,24,0,30,0,36,0,42,0,48,0,54,0,60,0,1,2,74,6,20,0,1, + 2,236,7,109,0,1,2,150,6,20,0,1,1,31,6,20,0,1,2,115,6,20,0,1,2,125,6,20,0,1,2,236,7,80,0,1,3,254,7,137, + 0,1,0,8,0,195,0,208,0,213,0,237,1,15,1,45,9,3,9,4,0,1,0,2,2,177,2,178,0,2,0,0,0,10,0,0,0,16,0,1, + 254,0,4,123,0,1,254,0,4,123,0,1,3,140,2,214,0,1,3,146,0,12,0,89,0,180,0,186,0,192,0,198,0,204,0,210,0,216,0,222, + 0,228,0,234,0,240,0,246,0,252,1,2,1,8,1,14,1,20,1,26,1,32,1,38,1,44,1,50,1,56,1,62,1,68,1,74,1,80,1,86, + 1,92,1,98,1,104,1,110,1,116,1,122,1,128,1,134,1,140,1,146,1,152,1,158,1,164,1,170,1,176,1,182,1,188,1,194,1,200,1,206, + 1,212,1,218,1,224,1,230,1,236,1,242,1,248,1,254,2,4,2,10,2,16,2,22,2,28,2,34,2,40,2,46,2,52,2,58,2,64,2,70, + 2,76,2,82,2,88,2,94,2,100,2,106,2,112,2,118,2,124,2,130,2,136,2,142,2,148,2,154,2,160,2,166,2,172,2,178,2,184,2,190, + 2,196,0,1,4,255,0,0,0,1,3,76,0,0,0,1,2,45,0,0,0,1,2,158,0,0,0,1,1,46,0,0,0,1,1,47,0,0,0,1, + 1,43,0,0,0,1,1,43,0,0,0,1,3,39,0,0,0,1,2,162,0,0,0,1,2,238,0,0,0,1,2,190,0,0,0,1,3,209,0,0, + 0,1,2,166,0,0,0,1,2,102,0,0,0,1,2,150,0,0,0,1,1,22,0,0,0,1,1,31,0,0,0,1,1,22,0,0,0,1,1,22, + 0,0,0,1,2,115,0,0,0,1,2,46,0,0,0,1,2,125,0,0,0,1,2,23,0,0,0,1,1,47,0,0,0,1,1,47,0,0,0,1, + 1,47,0,0,0,1,1,47,0,0,0,1,3,39,0,0,0,1,1,31,0,0,0,1,1,31,0,0,0,1,1,31,0,0,0,1,1,31,0,0, + 0,1,2,115,0,0,0,1,3,209,0,0,0,1,4,255,254,128,0,1,3,209,254,128,0,1,2,150,0,0,0,1,1,47,0,0,0,1,1,31, + 0,0,0,1,1,47,0,0,0,1,1,31,0,0,0,1,1,47,0,0,0,1,1,31,0,0,0,1,1,47,0,0,0,1,1,31,0,0,0,1, + 2,115,0,0,0,1,2,125,0,0,0,1,2,92,0,0,0,1,3,39,0,0,0,1,2,196,0,0,0,1,1,47,0,0,0,1,3,39,0,0, + 0,1,2,190,0,0,0,1,2,150,0,0,0,1,2,136,254,82,0,1,1,47,0,0,0,1,1,31,0,0,0,1,1,47,0,0,0,1,1,31, + 0,0,0,1,1,47,0,0,0,1,1,31,0,0,0,1,2,135,0,0,0,1,1,194,0,0,0,1,2,82,0,0,0,1,2,74,0,0,0,1, + 1,30,0,0,0,1,2,115,0,0,0,1,2,23,254,82,0,1,1,47,0,0,0,1,1,31,0,0,0,1,1,47,0,0,0,1,1,31,0,0, + 0,1,3,39,0,0,0,1,2,115,0,0,0,1,6,123,0,0,0,1,5,121,0,0,0,1,6,53,0,0,0,1,5,68,0,0,0,1,3,59, + 0,0,0,1,2,205,0,0,0,1,1,43,0,0,0,1,1,22,0,0,0,1,2,162,0,0,0,1,2,46,0,0,0,1,1,146,0,0,0,1, + 1,47,0,0,0,1,1,30,0,0,0,1,2,125,254,82,0,1,0,89,0,36,0,38,0,39,0,40,0,43,0,44,0,48,0,49,0,50,0,54, + 0,56,0,61,0,68,0,70,0,71,0,72,0,75,0,76,0,80,0,81,0,82,0,86,0,88,0,93,0,142,0,143,0,144,0,145,0,154,0,174, + 0,175,0,176,0,177,0,186,0,195,0,198,0,199,0,213,0,234,0,235,0,236,0,237,0,238,0,239,0,242,0,243,1,15,1,45,1,72,1,81, + 1,82,1,89,1,97,1,121,1,122,1,123,1,145,1,146,1,202,1,203,1,204,1,205,2,18,2,22,2,27,2,29,2,42,2,55,2,84,9,39, + 9,40,9,193,9,194,17,225,17,237,19,8,19,9,19,10,19,11,19,26,19,27,19,56,19,57,19,60,19,61,19,62,19,67,22,234,23,134,0,1, + 0,1,2,216,0,1,0,0,0,6,0,1,254,23,0,0,0,1,15,200,13,150,0,1,16,2,0,12,1,177,3,100,3,106,3,112,3,118,3,124, + 3,130,3,136,3,142,3,148,3,154,3,160,3,166,3,172,3,178,3,184,3,190,3,196,3,202,3,208,3,214,3,220,3,226,3,232,3,238,3,244, + 3,250,4,0,4,6,4,12,4,18,4,24,4,30,4,36,4,42,4,48,4,54,4,60,4,66,4,72,4,78,4,84,4,90,4,96,4,102,4,108, + 4,114,4,120,4,126,4,132,4,138,4,144,4,150,4,156,4,162,4,168,4,174,4,180,4,186,4,192,4,198,4,204,4,210,4,216,4,222,4,228, + 4,234,4,240,4,246,4,252,5,2,5,8,5,14,5,20,5,26,5,32,5,38,5,44,5,50,5,56,5,62,5,68,5,74,5,80,5,86,5,92, + 5,98,5,104,5,110,5,116,5,122,5,128,5,134,5,140,5,146,5,152,5,158,5,164,5,170,5,176,5,182,5,188,5,194,5,200,5,206,5,212, + 5,218,5,224,5,230,5,236,5,242,5,248,5,254,6,4,6,10,6,16,6,22,6,28,6,34,6,40,6,46,6,52,6,58,6,64,6,70,6,76, + 6,82,6,88,6,94,6,100,6,106,6,112,6,118,6,124,6,130,6,136,6,142,6,148,6,154,6,160,6,166,6,172,6,178,6,184,6,190,6,196, + 6,202,6,208,6,214,6,220,6,226,6,232,6,238,6,244,6,250,7,0,7,6,7,12,7,18,7,24,7,30,7,36,7,42,7,48,7,54,7,60, + 7,66,7,72,7,78,7,84,7,90,7,96,7,102,7,108,7,114,7,120,7,126,7,132,7,138,7,144,7,150,7,156,7,162,7,168,7,174,7,180, + 7,186,7,192,7,198,7,204,7,210,7,216,7,222,7,228,7,234,7,240,7,246,7,252,8,2,8,8,8,14,8,20,8,26,8,32,8,38,8,44, + 8,50,8,56,8,62,8,68,8,74,8,80,8,86,8,92,8,98,8,104,8,110,8,116,8,122,8,128,8,134,8,140,8,146,8,152,8,158,8,164, + 8,170,8,176,8,182,8,188,8,194,8,200,8,206,8,212,8,218,8,224,8,230,8,236,8,242,8,248,8,254,9,4,9,10,9,16,9,22,9,28, + 9,34,9,40,9,46,9,52,9,58,9,64,9,70,9,76,9,82,9,88,9,94,9,100,9,106,9,112,9,118,9,124,9,130,9,136,9,142,9,148, + 9,154,9,160,9,166,9,172,9,178,9,184,9,190,9,196,9,202,9,208,9,214,9,220,9,226,9,232,9,238,9,244,9,250,10,0,10,6,10,12, + 10,18,10,24,10,30,10,36,10,42,10,48,10,54,10,60,10,66,10,72,10,78,10,84,10,90,10,96,10,102,10,108,10,114,10,120,10,126,10,132, + 10,138,10,144,10,150,10,156,10,162,10,168,10,174,10,180,10,186,10,192,10,198,10,204,10,210,10,216,10,222,10,228,10,234,10,240,10,246,10,252, + 11,2,11,8,11,14,11,20,11,26,11,32,11,38,11,44,11,50,11,56,11,62,11,68,11,74,11,80,11,86,11,92,11,98,11,104,11,110,11,116, + 11,122,11,128,11,134,11,140,11,146,11,152,11,158,11,164,11,170,11,176,11,182,11,188,11,194,11,200,11,206,11,212,11,218,11,224,11,230,11,236, + 11,242,11,248,11,254,12,4,12,10,12,16,12,22,12,28,12,34,12,40,12,46,12,52,12,58,12,64,12,70,12,76,12,82,12,88,12,94,12,100, + 12,106,12,112,12,118,12,124,12,130,12,136,12,142,12,148,12,154,12,160,12,166,12,172,12,178,12,184,12,190,12,196,12,202,12,208,12,214,12,220, + 12,226,12,232,12,238,12,244,12,250,13,0,13,6,13,12,13,18,13,24,13,30,13,36,13,42,13,48,13,54,13,60,13,66,13,72,13,78,13,84, + 13,90,13,96,13,102,13,108,13,114,13,120,13,126,13,132,0,1,2,139,0,0,0,1,2,139,0,0,0,1,2,139,0,0,0,1,2,139,0,0, + 0,1,2,139,0,0,0,1,2,139,0,0,0,1,2,139,0,0,0,1,2,139,0,0,0,1,2,139,0,0,0,1,2,139,0,0,0,1,2,188, + 0,0,0,1,2,188,0,0,0,1,3,76,0,0,0,1,2,236,0,0,0,1,2,158,0,0,0,1,2,158,0,0,0,1,3,92,0,0,0,1, + 3,2,0,0,0,1,1,47,0,0,0,1,1,46,254,82,0,1,2,158,0,0,0,1,2,153,0,0,0,1,3,115,0,0,0,1,2,245,0,0, + 0,1,3,39,0,0,0,1,2,158,0,0,0,1,3,39,0,0,0,1,2,125,0,0,0,1,2,147,0,0,0,1,2,115,0,0,0,1,2,238, + 0,0,0,1,2,188,0,0,0,1,3,245,0,0,0,1,2,205,0,0,0,1,2,114,0,0,0,1,2,190,0,0,0,1,2,74,0,0,0,1, + 2,183,0,0,0,1,2,164,0,0,0,1,2,102,0,0,0,1,2,150,0,0,0,1,1,59,0,0,0,1,2,166,254,82,0,1,2,166,0,0, + 0,1,1,31,0,0,0,1,1,31,254,82,0,1,2,166,0,0,0,1,1,22,0,0,0,1,3,233,0,0,0,1,2,166,0,0,0,1,2,115, + 0,0,0,1,2,166,254,82,0,1,2,136,254,82,0,1,2,23,0,0,0,1,2,37,0,0,0,1,1,244,0,0,0,1,2,125,0,0,0,1, + 2,94,0,0,0,1,3,71,0,0,0,1,2,98,0,0,0,1,2,96,254,82,0,1,2,23,0,0,0,1,1,47,0,0,0,1,1,47,0,0, + 0,1,1,47,0,0,0,1,1,47,0,0,0,1,3,39,0,0,0,1,3,227,0,0,0,1,1,31,0,0,0,1,1,31,0,0,0,1,1,31, + 0,0,0,1,1,31,0,0,0,1,2,125,0,0,0,1,2,115,0,0,0,1,2,74,0,0,0,1,4,255,254,128,0,1,3,209,254,128,0,1, + 2,236,0,0,0,1,2,102,0,0,0,1,2,150,0,0,0,1,2,208,0,0,0,1,1,47,0,0,0,1,1,31,0,0,0,1,1,47,0,0, + 0,1,1,31,0,0,0,1,1,47,0,0,0,1,1,31,0,0,0,1,1,47,0,0,0,1,1,31,0,0,0,1,2,166,0,0,0,1,2,137, + 254,82,0,1,2,115,0,0,0,1,2,115,0,0,0,1,1,244,0,0,0,1,2,125,0,0,0,1,1,59,0,0,0,1,2,183,0,0,0,1, + 2,92,0,0,0,1,2,102,0,0,0,1,3,39,0,0,0,1,2,196,0,0,0,1,1,55,254,82,0,1,1,47,0,0,0,1,3,39,0,0, + 0,1,1,22,254,122,0,1,2,96,254,82,0,1,2,190,0,0,0,1,2,150,0,0,0,1,2,136,254,82,0,1,1,47,0,0,0,1,1,31, + 0,0,0,1,1,47,0,0,0,1,1,31,0,0,0,1,1,47,0,0,0,1,1,31,0,0,0,1,1,15,0,0,0,1,2,166,0,0,0,1, + 1,244,0,0,0,1,2,188,0,0,0,1,2,238,0,0,0,1,2,188,0,0,0,1,2,158,0,0,0,1,2,148,0,0,0,1,1,46,254,82, + 0,1,1,31,254,82,0,1,3,39,0,0,0,1,2,125,0,0,0,1,2,23,0,0,0,1,2,114,0,0,0,1,2,96,254,82,0,1,2,135, + 0,0,0,1,2,84,0,0,0,1,2,214,0,0,0,1,2,141,0,0,0,1,1,194,0,0,0,1,2,166,0,0,0,1,2,84,254,82,0,1, + 2,84,0,0,0,1,2,99,0,0,0,1,2,82,0,0,0,1,2,82,0,0,0,1,2,74,0,0,0,1,2,64,0,0,0,1,2,64,0,0, + 0,1,2,238,0,0,0,1,1,31,254,82,0,1,2,106,254,82,0,1,2,106,254,82,0,1,2,166,0,0,0,1,2,98,254,82,0,1,2,98, + 0,0,0,1,2,125,254,82,0,1,2,166,0,0,0,1,2,166,254,82,0,1,1,30,0,0,0,1,1,7,0,0,0,1,1,128,0,0,0,1, + 1,153,0,0,0,1,1,254,0,0,0,1,1,22,254,82,0,1,2,238,254,82,0,1,3,233,0,0,0,1,3,233,254,82,0,1,3,233,254,82, + 0,1,2,137,254,82,0,1,2,137,254,82,0,1,2,137,0,0,0,1,2,115,0,0,0,1,4,141,0,0,0,1,2,233,0,0,0,1,2,166, + 254,82,0,1,2,53,0,0,0,1,2,53,0,0,0,1,2,53,254,82,0,1,1,28,254,82,0,1,2,97,254,82,0,1,1,131,0,0,0,1, + 2,116,0,0,0,1,2,59,0,0,0,1,2,81,0,0,0,1,2,39,254,82,0,1,1,22,254,82,0,1,1,22,254,82,0,1,1,241,254,82, + 0,1,1,22,254,82,0,1,2,14,254,82,0,1,1,244,254,82,0,1,2,125,0,0,0,1,2,125,0,0,0,1,2,94,0,0,0,1,3,71, + 0,0,0,1,2,94,0,0,0,1,2,100,0,0,0,1,2,23,254,82,0,1,2,23,0,0,0,1,2,23,254,82,0,1,2,23,254,82,0,1, + 1,176,0,0,0,1,2,58,0,0,0,1,1,176,0,0,0,1,2,58,254,82,0,1,3,39,0,0,0,1,2,97,0,0,0,1,2,72,0,0, + 0,1,2,166,0,0,0,1,2,163,255,246,0,1,1,31,254,82,0,1,2,171,254,82,0,1,2,95,0,0,0,1,2,136,254,82,0,1,1,176, + 0,0,0,1,2,58,0,0,0,1,3,254,0,0,0,1,3,254,254,82,0,1,3,254,0,0,0,1,3,71,254,82,0,1,4,142,0,0,0,1, + 3,32,254,82,0,1,1,22,0,0,0,1,2,126,254,82,0,1,2,74,0,0,0,1,2,125,0,0,0,1,3,39,0,0,0,1,1,47,0,0, + 0,1,1,31,0,0,0,1,1,31,0,0,0,1,3,39,0,0,0,1,2,125,0,0,0,1,2,158,0,0,0,1,2,166,0,0,0,1,3,2, + 0,0,0,1,3,39,0,0,0,1,2,125,0,0,0,1,2,94,0,0,0,1,2,26,0,0,0,1,2,84,0,0,0,1,2,166,0,0,0,1, + 2,84,0,0,0,1,2,84,0,0,0,1,2,25,0,0,0,1,2,64,0,0,0,1,2,166,0,0,0,1,2,88,0,0,0,1,3,5,0,0, + 0,1,2,130,0,0,0,1,2,125,0,0,0,1,1,177,0,0,0,1,2,189,0,0,0,1,2,189,0,0,0,1,2,189,0,0,0,1,2,22, + 0,0,0,1,2,144,0,0,0,1,2,144,0,0,0,1,2,84,0,0,0,1,2,103,0,0,0,1,2,94,0,0,0,1,3,71,0,0,0,1, + 2,23,0,0,0,1,1,254,0,0,0,1,2,88,0,0,0,1,2,94,0,0,0,1,2,166,254,82,0,1,2,236,0,0,0,1,2,102,0,0, + 0,1,2,236,254,137,0,1,2,102,254,137,0,1,2,236,254,191,0,1,2,102,254,191,0,1,2,236,254,116,0,1,2,102,254,116,0,1,2,236, + 254,21,0,1,2,102,254,21,0,1,1,47,0,0,0,1,1,31,0,0,0,1,1,47,0,0,0,1,1,31,0,0,0,1,3,147,0,0,0,1, + 1,232,0,0,0,1,3,76,0,0,0,1,4,66,0,0,0,1,3,82,254,82,0,1,3,102,0,0,0,1,2,14,0,0,0,1,1,214,0,0, + 0,1,2,222,0,0,0,1,3,44,0,0,0,1,3,52,0,0,0,1,3,36,254,82,0,1,3,14,0,0,0,1,3,39,0,0,0,1,3,132, + 0,0,0,1,3,152,0,0,0,1,3,95,0,0,0,1,2,250,0,0,0,1,2,122,254,82,0,1,3,102,0,0,0,1,3,52,0,0,0,1, + 1,247,0,0,0,1,2,198,0,0,0,1,3,142,0,0,0,1,4,76,0,0,0,1,3,22,0,0,0,1,2,198,0,0,0,1,1,243,0,8, + 0,1,2,157,0,7,0,1,1,125,0,0,0,1,2,247,0,0,0,1,3,96,254,82,0,1,2,252,0,0,0,1,3,101,0,0,0,1,2,183, + 0,0,0,1,2,153,0,0,0,1,2,153,0,0,0,1,2,158,0,0,0,1,2,84,0,0,0,1,1,244,0,0,0,1,3,2,0,0,0,1, + 2,166,0,0,0,1,2,158,0,0,0,1,2,166,0,0,0,1,2,190,0,0,0,1,2,23,0,0,0,1,3,39,0,0,0,1,3,115,254,82, + 0,1,2,188,0,0,0,1,2,195,255,228,0,1,2,94,0,0,0,1,3,245,0,0,0,1,3,71,0,0,0,1,2,94,0,0,0,1,3,2, + 0,0,0,1,2,163,0,0,0,1,2,53,0,0,0,1,2,115,0,0,0,1,1,212,0,0,0,1,2,147,254,82,0,1,2,190,254,82,0,1, + 1,47,0,0,0,1,3,2,254,82,0,1,2,137,254,82,0,1,3,119,254,82,0,1,2,158,254,82,0,1,2,74,254,86,0,1,2,25,0,0, + 0,1,5,0,0,0,0,1,3,209,0,0,0,1,4,49,0,0,0,1,3,215,0,0,0,1,4,197,0,0,0,1,3,209,0,0,0,1,3,252, + 0,0,0,1,3,118,0,0,0,1,3,252,0,0,0,1,3,118,255,246,0,1,3,252,0,0,0,1,3,118,254,82,0,1,2,158,0,0,0,1, + 2,174,0,0,0,1,3,149,0,0,0,1,1,146,0,0,0,1,2,203,0,0,0,1,1,174,0,0,0,1,3,59,0,0,0,1,2,205,0,0, + 0,1,5,110,0,0,0,1,4,19,0,0,0,1,2,158,0,0,0,1,2,166,254,82,0,1,3,170,0,0,0,1,3,196,254,82,0,1,3,39, + 0,0,0,1,2,136,254,82,0,1,1,219,0,0,0,1,1,31,254,82,0,1,3,13,254,82,0,1,2,166,254,82,0,1,1,247,254,82,0,1, + 2,245,0,0,0,1,2,166,0,0,0,1,3,92,0,0,0,1,2,166,254,82,0,1,2,158,0,0,0,1,2,166,0,0,0,1,2,245,0,0, + 0,1,2,166,0,0,0,1,2,125,0,0,0,1,2,23,0,0,0,1,2,147,0,0,0,1,2,37,0,0,0,1,3,102,0,0,0,1,3,169, + 0,0,0,1,2,76,0,0,0,1,2,53,0,0,0,1,3,115,0,0,0,1,1,47,0,0,0,1,4,204,0,0,0,1,2,245,0,0,0,1, + 2,238,0,0,0,1,3,60,0,0,0,1,3,7,0,0,0,1,3,7,0,0,0,1,3,92,0,0,0,1,1,146,0,0,0,1,1,145,254,82, + 0,1,3,2,0,0,0,1,2,244,0,0,0,1,4,25,0,0,0,1,3,38,0,0,0,1,2,129,0,0,0,1,2,213,0,0,0,1,3,82, + 0,0,0,1,2,228,0,0,0,1,4,120,0,0,0,1,3,57,0,0,0,1,2,212,0,0,0,1,2,180,0,0,0,1,2,92,0,0,0,1, + 2,139,0,0,0,1,2,139,0,0,0,1,2,119,0,0,0,1,2,139,0,0,0,1,2,139,0,0,0,1,2,139,0,0,0,1,2,139,0,0, + 0,1,2,139,0,0,0,1,2,139,0,0,0,1,2,139,0,0,0,1,1,30,0,0,0,1,1,31,254,82,0,1,1,138,0,1,0,1,1,22, + 0,0,0,1,1,199,0,0,0,1,2,125,254,82,0,2,0,93,0,19,0,28,0,0,0,36,0,61,0,10,0,68,0,93,0,36,0,142,0,145, + 0,62,0,154,0,154,0,66,0,168,0,168,0,67,0,174,0,178,0,68,0,186,0,186,0,73,0,195,0,195,0,74,0,198,0,199,0,75,0,208, + 0,209,0,77,0,213,0,213,0,79,0,233,0,239,0,80,0,242,0,243,0,87,0,250,0,250,0,89,1,13,1,13,0,90,1,15,1,15,0,91, + 1,40,1,41,0,92,1,45,1,45,0,94,1,65,1,65,0,95,1,69,1,69,0,96,1,72,1,72,0,97,1,78,1,78,0,98,1,81,1,82, + 0,99,1,84,1,84,0,101,1,89,1,89,0,102,1,97,1,97,0,103,1,108,1,108,0,104,1,118,1,118,0,105,1,121,1,123,0,106,1,145, + 1,146,0,109,1,202,1,205,0,111,1,246,1,248,0,115,2,5,2,12,0,118,2,14,2,74,0,126,2,76,2,103,0,187,2,105,2,107,0,215, + 2,109,2,109,0,218,3,70,3,70,0,219,3,73,3,73,0,220,3,76,3,76,0,221,3,136,3,136,0,222,3,154,3,154,0,223,3,234,3,235, + 0,224,4,6,4,7,0,226,4,34,4,34,0,228,4,51,4,51,0,229,4,54,4,54,0,230,4,124,4,125,0,231,8,99,8,100,0,233,8,102, + 8,107,0,235,8,110,8,118,0,241,8,122,8,126,0,250,8,130,8,135,0,255,8,204,8,204,1,5,9,3,9,12,1,6,9,39,9,40,1,16, + 9,193,9,194,1,18,9,243,9,244,1,20,11,149,11,149,1,22,11,157,11,160,1,23,11,162,11,164,1,27,11,167,11,167,1,30,11,170,11,175, + 1,31,11,182,11,182,1,37,11,186,11,186,1,38,11,190,11,191,1,39,11,193,11,195,1,41,11,197,11,197,1,44,11,199,11,203,1,45,11,206, + 11,209,1,50,13,198,13,198,1,54,17,212,17,212,1,55,17,214,17,215,1,56,17,217,17,234,1,58,17,236,17,238,1,76,17,241,17,242,1,79, + 18,56,18,56,1,81,18,254,19,1,1,82,19,3,19,4,1,86,19,6,19,17,1,88,19,20,19,35,1,100,19,40,19,43,1,116,19,49,19,68, + 1,120,21,97,21,115,1,140,21,139,21,139,1,159,21,141,21,141,1,160,21,194,21,203,1,161,22,234,22,235,1,171,23,2,23,2,1,173,23,12, + 23,12,1,174,23,22,23,22,1,175,23,134,23,134,1,176,0,2,0,9,2,199,2,202,0,0,2,205,2,209,0,4,2,212,2,215,0,9,2,218, + 2,228,0,13,2,234,2,237,0,24,2,248,2,250,0,28,2,254,2,255,0,31,3,3,3,3,0,33,3,6,3,6,0,34,0,35,0,0,0,142, + 0,0,0,148,0,0,0,154,0,0,0,160,0,0,0,166,0,0,0,172,0,0,0,178,0,0,0,184,0,0,0,190,0,0,0,196,0,0,0,202, + 0,0,0,208,0,0,0,214,0,0,0,220,0,0,0,226,0,0,0,232,0,0,0,238,0,0,0,244,0,0,0,250,0,0,1,0,0,0,1,6, + 0,0,1,12,0,0,1,18,0,0,1,24,0,0,1,30,0,0,1,36,0,0,1,42,0,0,1,48,0,0,1,54,0,0,1,60,0,0,1,66, + 0,0,1,72,0,0,1,78,0,0,1,84,0,0,1,90,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,0,0,0,1,254,0,0,0, + 0,1,254,0,255,254,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0, + 255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1, + 254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255, + 0,1,254,0,255,254,0,1,254,0,255,255,0,1,254,2,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0, + 255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,254,0,255,255,0,1,22,56,19,106,0,1,22,132,0,12,2,103, + 4,208,4,214,4,220,4,226,4,232,4,238,4,244,4,250,5,0,5,6,5,12,5,18,5,24,5,30,5,36,5,42,5,48,5,54,5,60,5,66, + 5,72,5,78,5,84,5,90,5,96,5,102,5,108,5,114,5,120,5,126,5,132,5,138,5,144,5,150,5,156,5,162,5,168,5,176,5,182,5,190, + 5,196,5,204,5,210,5,216,5,222,5,228,5,234,5,240,5,246,5,252,6,2,6,10,6,16,6,22,6,28,6,34,6,40,6,48,6,54,6,60, + 6,66,6,72,6,78,6,84,6,90,6,96,6,102,6,110,6,116,6,122,6,130,6,136,6,142,6,148,6,156,6,162,6,168,6,174,6,180,6,186, + 6,192,6,198,6,204,6,210,6,216,6,222,6,228,6,234,6,240,6,246,6,252,7,2,7,8,7,14,7,20,7,26,7,32,7,38,7,44,7,50, + 7,56,7,62,7,68,7,74,7,80,7,86,7,92,7,98,7,104,7,110,7,116,7,122,7,128,7,134,7,140,7,146,7,152,7,158,7,164,7,170, + 7,176,7,182,7,188,7,194,7,200,7,206,7,212,7,218,7,224,7,230,7,236,7,242,7,248,7,254,8,4,8,10,8,16,8,22,8,30,8,36, + 8,42,8,48,8,54,8,60,8,66,8,74,8,80,8,86,8,92,8,98,8,104,8,110,8,116,8,122,8,128,8,134,8,140,8,146,8,152,8,158, + 8,164,8,170,8,176,8,182,8,188,8,194,8,200,8,206,8,212,8,218,8,224,8,232,8,238,8,244,8,250,9,0,9,6,9,12,9,18,9,24, + 9,30,9,36,9,42,9,48,9,54,9,60,9,66,9,72,9,78,9,84,9,90,9,96,9,102,9,108,9,114,9,120,9,126,9,132,9,138,9,144, + 9,150,9,156,9,162,9,168,9,174,9,180,9,186,9,192,9,198,9,204,9,210,9,216,9,222,9,228,9,234,9,240,9,246,9,252,10,2,10,8, + 10,14,10,20,10,26,10,32,10,38,10,44,10,50,10,58,10,64,10,70,10,76,10,82,10,88,10,94,10,100,10,106,10,112,10,118,10,124,10,130, + 10,136,10,142,10,148,10,154,10,160,10,166,10,172,10,178,10,184,10,190,10,196,10,202,10,208,10,214,10,220,10,226,10,232,10,238,10,244,10,250, + 11,0,11,6,11,12,11,18,11,24,11,30,11,36,11,42,11,48,11,54,11,60,11,66,11,72,11,78,11,84,11,90,11,96,11,102,11,108,11,114, + 11,120,11,126,11,132,11,138,11,144,11,150,11,156,11,162,11,168,11,174,11,180,11,186,11,192,11,198,11,204,11,210,11,216,11,222,11,228,11,234, + 11,240,11,246,11,252,12,2,12,8,12,14,12,20,12,26,12,32,12,38,12,44,12,50,12,56,12,62,12,68,12,74,12,80,12,86,12,92,12,98, + 12,104,12,110,12,116,12,122,12,128,12,134,12,140,12,146,12,152,12,158,12,164,12,170,12,176,12,182,12,188,12,194,12,200,12,206,12,212,12,218, + 12,224,12,230,12,236,12,242,12,248,12,254,13,4,13,10,13,16,13,22,13,28,13,34,13,40,13,46,13,52,13,58,13,64,13,70,13,76,13,82, + 13,88,13,94,13,100,13,106,13,112,13,118,13,124,13,130,13,136,13,142,13,148,13,154,13,160,13,166,13,172,13,178,13,184,13,190,13,196,13,202, + 13,208,13,214,13,220,13,226,13,232,13,238,13,244,13,250,14,0,14,6,14,12,14,18,14,24,14,30,14,36,14,42,14,48,14,54,14,60,14,66, + 14,72,14,78,14,84,14,90,14,96,14,102,14,108,14,114,14,120,14,126,14,132,14,138,14,144,14,150,14,156,14,162,14,168,14,174,14,180,14,186, + 14,192,14,198,14,204,14,210,14,216,14,222,14,228,14,234,14,240,14,246,14,252,15,2,15,10,15,16,15,22,15,28,15,34,15,40,15,46,15,52, + 15,58,15,64,15,70,15,78,15,84,15,90,15,96,15,102,15,108,15,114,15,120,15,126,15,132,15,138,15,144,15,150,15,156,15,162,15,168,15,174, + 15,180,15,186,15,192,15,198,15,204,15,210,15,216,15,222,15,228,15,234,15,240,15,246,15,252,16,2,16,8,16,14,16,20,16,26,16,32,16,38, + 16,44,16,50,16,56,16,62,16,68,16,74,16,80,16,86,16,92,16,98,16,104,16,110,16,116,16,122,16,128,16,134,16,140,16,146,16,152,16,158, + 16,164,16,170,16,176,16,182,16,188,16,194,16,200,16,206,16,212,16,218,16,224,16,230,16,236,16,242,16,248,16,254,17,4,17,10,17,18,17,24, + 17,30,17,36,17,42,17,48,17,54,17,60,17,66,17,72,17,78,17,84,17,90,17,96,17,102,17,108,17,114,17,120,17,126,17,132,17,138,17,146, + 17,152,17,158,17,164,17,170,17,176,17,182,17,188,17,194,17,200,17,206,17,212,17,220,17,226,17,232,17,238,17,244,17,250,18,0,18,6,18,12, + 18,18,18,24,18,30,18,36,18,42,18,48,18,54,18,60,18,66,18,72,18,78,18,84,18,90,18,96,18,102,18,108,18,114,18,120,18,126,18,132, + 18,138,18,144,18,150,18,156,18,162,18,168,18,174,18,180,18,186,18,192,18,198,18,204,18,210,18,216,18,222,18,228,18,234,18,240,18,246,18,252, + 19,2,19,8,19,14,19,20,19,26,19,32,19,38,19,44,19,50,19,56,19,62,19,68,19,74,19,80,19,86,0,1,2,139,5,240,0,1,2,139, + 5,240,0,1,2,139,5,240,0,1,2,139,5,240,0,1,2,139,5,240,0,1,2,139,5,240,0,1,2,139,5,240,0,1,2,139,5,240,0,1, + 2,139,5,240,0,1,2,139,5,240,0,1,2,188,5,240,0,1,2,188,5,240,0,1,3,76,5,240,0,1,2,236,5,240,0,1,2,158,5,240, + 0,1,2,158,5,240,0,1,3,92,5,240,0,1,3,2,5,240,0,1,1,47,5,240,0,1,1,46,5,240,0,1,2,158,5,240,0,1,1,42, + 5,240,0,1,3,115,5,240,0,1,2,245,5,240,0,1,3,39,5,240,0,1,2,158,5,240,0,1,3,39,5,240,0,1,2,125,5,240,0,1, + 2,147,5,240,0,1,2,115,5,240,0,1,2,238,5,240,0,1,2,188,5,240,0,1,3,245,5,240,0,1,2,205,5,240,0,1,2,114,5,240, + 0,1,2,190,5,240,0,2,2,74,4,123,0,35,0,1,1,22,5,240,0,2,2,164,4,123,0,23,0,1,3,254,5,240,0,2,2,150,4,123, + 0,18,0,1,1,224,5,240,0,1,2,106,4,123,0,1,1,22,5,240,0,1,1,31,6,47,0,1,1,31,6,47,0,1,1,22,5,240,0,1, + 1,22,5,240,0,1,3,233,4,123,0,1,2,137,4,123,0,2,2,115,4,123,0,12,0,1,2,166,4,123,0,1,2,111,4,123,0,1,2,23, + 4,123,0,1,2,39,4,123,0,1,1,26,5,240,0,2,2,125,4,123,0,20,0,1,2,94,4,123,0,1,3,71,4,123,0,1,2,98,4,123, + 0,1,2,96,4,123,0,1,2,23,4,123,0,1,3,39,5,240,0,1,3,227,4,123,0,1,2,166,4,123,0,1,2,125,5,240,0,2,2,115, + 4,123,0,26,0,1,1,22,5,240,0,1,2,188,5,240,0,2,2,74,4,123,0,35,0,1,3,254,5,240,0,1,3,170,5,240,0,1,1,81, + 5,240,0,2,1,29,4,123,0,4,0,1,2,166,4,123,0,1,2,137,4,123,0,1,4,20,4,123,0,1,2,115,5,240,0,1,1,26,5,240, + 0,1,2,125,4,123,0,1,1,224,5,240,0,1,1,22,5,240,0,1,1,22,5,240,0,1,2,92,5,240,0,1,3,76,5,240,0,1,3,254, + 5,240,0,1,2,88,5,240,0,1,3,39,5,240,0,1,2,196,5,240,0,1,2,158,5,240,0,1,1,59,5,240,0,1,3,92,5,240,0,1, + 2,191,5,240,0,1,1,47,5,240,0,1,1,47,5,240,0,1,1,23,5,240,0,1,1,22,5,240,0,1,2,130,5,240,0,1,2,245,5,240, + 0,1,3,39,5,240,0,1,3,2,5,240,0,1,2,192,5,240,0,1,2,39,4,123,0,1,1,22,5,240,0,1,1,26,5,240,0,1,2,115, + 5,240,0,1,1,26,5,240,0,1,2,115,5,240,0,1,2,167,5,240,0,1,2,114,5,240,0,1,2,96,4,123,0,1,2,190,5,240,0,1, + 2,23,4,123,0,1,2,190,5,240,0,1,2,150,5,240,0,1,2,136,4,123,0,1,3,39,5,240,0,1,1,15,5,240,0,1,2,137,4,123, + 0,1,1,26,5,240,0,1,1,31,4,123,0,1,2,188,5,240,0,1,2,238,5,240,0,1,2,188,5,240,0,1,2,158,5,240,0,1,2,141, + 4,123,0,1,1,46,5,240,0,1,1,31,6,47,0,1,3,39,5,240,0,1,2,125,5,240,0,1,2,23,4,123,0,1,2,114,5,240,0,1, + 2,96,4,123,0,1,2,135,4,123,0,1,2,84,4,123,0,1,2,214,4,123,0,1,1,22,5,240,0,2,1,206,4,123,0,3,0,1,2,166, + 4,123,0,1,3,254,5,240,0,1,3,254,5,240,0,1,2,99,4,123,0,1,2,82,4,123,0,1,2,82,4,123,0,2,2,74,4,124,0,8, + 0,1,2,64,4,123,0,1,2,64,4,123,0,1,2,238,4,123,0,1,1,31,4,123,0,1,2,106,5,240,0,1,2,106,4,123,0,1,2,166, + 4,123,0,1,2,98,4,123,0,1,2,98,4,123,0,1,2,125,4,123,0,1,1,22,5,240,0,1,1,22,5,240,0,1,1,30,6,47,0,1, + 1,7,4,123,0,1,1,128,4,123,0,1,1,153,5,240,0,1,1,254,5,240,0,1,1,22,5,240,0,1,1,22,5,240,0,1,3,233,4,123, + 0,1,3,233,4,123,0,1,3,233,4,123,0,1,2,137,4,123,0,1,2,137,4,123,0,1,2,137,4,123,0,2,2,115,4,123,0,14,0,1, + 4,141,4,123,0,1,2,233,4,123,0,1,2,166,5,240,0,1,2,51,4,123,0,1,2,51,5,240,0,1,2,51,4,123,0,1,2,94,4,123, + 0,1,2,97,4,123,0,1,2,112,4,123,0,1,1,130,4,123,0,1,2,59,4,123,0,1,2,81,4,123,0,1,2,39,4,123,0,1,1,22, + 5,240,0,1,1,22,5,240,0,1,1,241,4,123,0,1,1,22,5,240,0,1,2,14,4,123,0,1,1,26,5,240,0,1,2,125,4,123,0,1, + 2,125,4,123,0,1,2,94,4,123,0,1,3,71,4,123,0,1,2,94,5,240,0,1,2,100,4,123,0,1,2,23,4,123,0,1,2,23,4,123, + 0,1,2,23,4,123,0,1,2,23,4,123,0,1,1,176,5,240,0,1,2,58,5,240,0,1,1,176,5,240,0,1,2,58,5,240,0,1,3,39, + 5,240,0,1,2,97,4,123,0,1,2,72,4,123,0,1,2,166,5,240,0,1,2,163,4,123,0,1,1,31,6,47,0,1,2,171,4,123,0,1, + 1,31,4,123,0,1,2,106,5,240,0,1,1,176,5,240,0,1,2,58,5,240,0,1,3,254,5,240,0,1,3,254,5,240,0,1,3,254,5,240, + 0,1,3,71,5,240,0,1,4,142,4,123,0,1,3,32,5,240,0,1,1,22,5,240,0,1,2,74,4,123,0,1,2,126,5,240,0,1,2,94, + 4,123,0,1,2,125,5,240,0,2,2,74,4,124,0,8,0,1,2,69,5,240,0,1,2,137,4,123,0,1,2,125,5,240,0,1,1,16,4,123, + 0,1,2,163,4,123,0,1,2,130,5,240,0,1,2,135,4,123,0,1,2,22,4,123,0,1,2,69,5,240,0,1,2,125,4,123,0,1,2,112, + 4,123,0,1,2,166,4,123,0,1,2,116,4,123,0,1,2,125,4,123,0,1,2,106,4,123,0,1,2,26,4,123,0,1,2,170,4,123,0,1, + 2,98,4,123,0,1,2,164,4,123,0,1,3,94,4,123,0,1,2,126,5,240,0,1,2,126,5,240,0,1,2,160,5,240,0,1,2,238,4,123, + 0,1,2,125,4,123,0,1,2,116,4,123,0,1,3,94,4,123,0,1,2,239,4,123,0,1,2,166,4,123,0,1,2,166,4,123,0,1,1,31, + 6,47,0,1,3,39,5,240,0,1,2,166,4,123,0,1,1,242,4,123,0,1,1,22,5,240,0,1,2,166,4,123,0,1,3,72,5,240,0,1, + 2,147,5,240,0,1,1,47,5,240,0,1,4,213,5,240,0,1,4,114,5,240,0,1,3,2,5,240,0,1,2,188,5,240,0,1,2,188,5,240, + 0,1,2,188,5,240,0,1,2,153,5,240,0,1,3,116,5,240,0,1,2,158,5,240,0,1,4,79,5,240,0,1,2,115,5,240,0,1,2,245, + 5,240,0,1,2,238,5,240,0,1,3,125,5,240,0,1,3,115,5,240,0,1,3,2,5,240,0,1,3,39,5,240,0,1,3,2,5,240,0,1, + 2,158,5,240,0,1,3,76,5,240,0,1,2,115,5,240,0,1,2,111,5,240,0,1,3,113,5,240,0,1,2,205,5,240,0,1,3,2,5,240, + 0,1,2,178,5,240,0,1,4,71,5,240,0,1,4,71,5,240,0,1,2,89,5,240,0,1,3,135,5,240,0,1,2,188,5,240,0,1,2,78, + 5,240,0,1,3,115,5,240,0,1,2,224,5,240,0,1,2,84,4,123,0,1,2,155,5,240,0,1,2,97,4,123,0,1,2,69,4,123,0,1, + 2,246,4,123,0,1,2,141,4,123,0,1,3,155,4,123,0,1,2,64,4,123,0,1,2,130,4,123,0,1,2,116,4,123,0,1,2,248,4,123, + 0,1,3,5,4,123,0,1,2,130,4,123,0,1,2,125,4,123,0,1,2,157,4,123,0,1,2,166,4,123,0,1,2,166,4,123,0,1,2,84, + 4,123,0,1,2,96,4,123,0,1,3,107,5,240,0,1,2,98,4,123,0,1,2,157,4,123,0,1,2,75,4,123,0,1,3,169,4,123,0,1, + 3,169,4,123,0,1,2,6,4,123,0,1,3,29,4,123,0,1,1,22,4,123,0,1,1,178,4,123,0,1,2,246,4,123,0,1,2,116,4,123, + 0,1,2,166,4,123,0,1,2,39,4,123,0,1,1,31,6,47,0,1,1,31,6,47,0,1,1,31,6,47,0,1,3,250,4,123,0,1,3,243, + 4,123,0,1,1,52,5,240,0,1,2,157,4,123,0,1,3,188,5,240,0,1,3,94,4,123,0,1,1,243,5,240,0,1,3,99,4,123,0,1, + 3,115,5,240,0,1,2,246,4,123,0,1,3,132,5,240,0,1,3,34,4,123,0,1,4,79,5,240,0,1,3,150,4,123,0,1,3,44,5,240, + 0,1,2,115,4,123,0,1,4,79,5,240,0,1,3,150,4,123,0,1,3,20,5,240,0,1,3,37,5,250,0,1,3,39,5,240,0,1,2,125, + 4,123,0,1,3,31,5,240,0,1,2,149,4,123,0,1,2,158,5,240,0,1,2,166,4,123,0,1,4,79,5,240,0,1,3,155,4,123,0,1, + 2,238,5,240,0,1,2,116,4,123,0,1,2,238,5,240,0,1,2,116,4,123,0,1,2,238,5,240,0,1,1,22,5,240,0,1,4,26,5,240, + 0,1,3,101,4,123,0,1,3,2,5,240,0,1,2,115,5,240,0,1,2,75,4,123,0,1,2,163,4,123,0,1,2,137,4,123,0,1,3,5, + 4,123,0,1,3,39,5,240,0,1,2,125,4,123,0,1,2,69,4,123,0,1,2,205,5,240,0,1,2,98,4,123,0,1,2,248,4,123,0,1, + 2,238,5,240,0,1,2,116,4,123,0,1,2,248,4,123,0,1,2,130,4,123,0,1,2,94,4,123,0,1,2,26,4,123,0,1,4,20,4,123, + 0,1,2,84,4,123,0,1,2,166,4,123,0,1,2,84,4,131,0,1,2,84,4,123,0,1,2,25,4,123,0,1,2,64,4,123,0,1,2,166, + 4,123,0,1,1,24,4,123,0,1,3,5,4,123,0,1,2,130,4,123,0,1,2,125,4,123,0,1,1,177,4,123,0,1,2,189,4,123,0,1, + 2,189,4,123,0,1,2,189,4,123,0,1,4,20,4,123,0,1,2,22,4,123,0,1,2,144,4,123,0,1,2,144,4,123,0,1,2,84,4,123, + 0,1,2,103,4,123,0,1,2,98,4,123,0,1,2,94,4,123,0,1,3,71,4,123,0,1,2,23,4,123,0,1,1,254,4,123,0,1,1,24, + 4,123,0,1,2,94,4,123,0,1,2,248,4,123,0,1,2,166,4,123,0,1,2,236,5,240,0,1,3,254,5,240,0,1,2,236,5,240,0,1, + 3,254,5,240,0,1,2,236,5,240,0,1,3,254,5,240,0,1,2,236,5,240,0,1,3,254,5,240,0,1,3,147,5,240,0,1,1,232,5,240, + 0,2,3,76,5,240,0,22,0,1,4,66,5,240,0,1,3,82,5,240,0,1,3,102,5,240,0,1,1,198,5,240,0,1,1,214,5,240,0,1, + 2,222,5,240,0,1,3,44,5,240,0,1,3,52,5,226,0,1,3,36,4,123,0,1,3,14,5,240,0,2,3,39,5,240,0,12,0,1,3,132, + 5,240,0,1,3,152,5,240,0,1,3,95,5,226,0,1,2,250,5,226,0,1,2,122,5,240,0,1,3,102,5,240,0,1,3,52,5,240,0,1, + 2,202,4,68,0,1,2,198,5,240,0,1,3,142,5,240,0,1,4,76,5,240,0,1,3,22,5,240,0,1,2,198,5,240,0,1,1,243,5,231, + 0,1,2,157,5,231,0,1,1,125,6,49,0,1,2,247,4,123,0,1,3,96,4,123,0,1,2,252,5,240,0,1,3,101,5,240,0,1,1,22, + 5,240,0,1,1,42,5,240,0,1,1,22,5,240,0,1,1,42,5,240,0,1,2,158,5,240,0,1,2,125,5,240,0,1,2,84,4,123,0,1, + 1,26,5,240,0,1,3,2,5,240,0,1,1,22,5,240,0,1,2,158,5,240,0,1,1,22,5,240,0,1,2,190,5,240,0,1,2,23,4,123, + 0,1,3,39,5,240,0,1,3,115,5,240,0,1,2,188,5,240,0,1,2,195,5,211,0,1,2,94,4,123,0,1,3,245,5,240,0,1,3,71, + 4,123,0,1,2,94,4,123,0,1,3,2,5,240,0,1,2,163,4,123,0,1,2,170,4,123,0,1,2,51,5,240,0,1,2,115,4,123,0,1, + 1,212,4,123,0,1,2,147,5,240,0,1,2,190,5,240,0,1,2,136,5,240,0,1,2,158,5,240,0,1,1,47,5,240,0,1,4,179,5,240, + 0,1,4,12,4,123,0,1,5,48,5,240,0,1,3,198,4,123,0,1,2,153,5,240,0,1,2,246,4,123,0,1,4,213,5,240,0,1,4,24, + 4,123,0,1,2,153,5,240,0,1,3,5,4,123,0,1,3,39,5,240,0,1,3,108,5,240,0,1,2,218,4,123,0,1,5,110,5,240,0,1, + 4,19,4,123,0,1,2,84,4,123,0,1,2,84,4,123,0,1,3,2,5,240,0,1,1,22,5,240,0,1,3,119,5,240,0,1,2,158,5,240, + 0,2,2,74,4,123,0,8,0,1,2,25,4,123,0,1,5,0,5,240,0,1,3,209,4,123,0,1,4,49,5,240,0,1,3,215,4,123,0,1, + 4,197,5,240,0,1,3,209,4,123,0,1,3,252,5,240,0,1,3,118,4,123,0,1,3,252,5,240,0,1,3,118,4,113,0,1,3,252,5,240, + 0,1,3,118,4,123,0,1,2,158,5,240,0,1,1,30,5,240,0,1,1,42,5,240,0,1,1,146,5,240,0,1,1,92,5,240,0,1,1,174, + 5,240,0,1,3,59,5,240,0,2,2,205,4,123,0,0,0,1,5,110,5,240,0,1,4,19,4,123,0,1,2,158,5,240,0,1,2,166,4,123, + 0,1,3,170,5,240,0,1,3,196,4,123,0,1,3,39,5,240,0,1,2,111,4,123,0,1,1,22,5,240,0,1,1,22,5,240,0,1,1,219, + 5,240,0,2,1,29,4,123,0,0,0,1,2,240,5,240,0,1,2,137,4,123,0,1,2,178,5,240,0,1,1,247,5,240,0,1,2,245,5,240, + 0,1,2,137,4,123,0,1,3,92,5,240,0,1,2,106,4,123,0,1,2,158,5,240,0,1,1,22,5,240,0,1,2,245,5,240,0,1,2,137, + 4,123,0,1,2,125,5,240,0,1,2,23,4,123,0,1,2,147,5,240,0,1,2,39,4,123,0,1,3,102,5,240,0,1,3,169,4,123,0,1, + 2,76,5,240,0,1,2,53,5,240,0,1,3,115,5,240,0,1,1,47,7,136,0,1,4,204,5,240,0,1,2,245,5,240,0,1,2,238,5,240, + 0,1,3,60,6,4,0,1,3,7,5,240,0,1,3,7,5,240,0,1,3,92,5,240,0,1,1,146,5,240,0,1,1,145,5,240,0,1,3,2, + 5,240,0,1,2,244,5,240,0,1,4,25,5,240,0,1,3,38,5,240,0,1,2,129,5,240,0,1,2,213,5,240,0,1,3,82,5,240,0,1, + 2,228,5,240,0,1,4,120,5,247,0,1,3,57,5,247,0,1,2,212,5,247,0,1,2,180,4,123,0,1,2,92,4,123,0,1,2,139,5,240, + 0,1,2,139,5,240,0,1,2,119,5,240,0,1,2,139,5,240,0,1,2,139,5,240,0,1,2,139,5,240,0,1,2,139,5,240,0,1,2,139, + 5,240,0,1,2,139,5,240,0,1,2,139,5,240,0,1,2,245,5,240,0,1,1,30,4,123,0,1,1,31,4,123,0,1,2,234,5,240,0,1, + 1,22,5,240,0,1,1,31,4,123,0,1,1,31,4,123,0,1,1,31,4,123,0,1,1,199,5,240,0,2,2,125,4,123,0,0,0,2,0,119, + 0,19,0,28,0,0,0,36,0,61,0,10,0,68,0,93,0,36,0,154,0,154,0,62,0,168,0,169,0,63,0,178,0,178,0,65,0,186,0,186, + 0,66,0,192,0,192,0,67,0,198,0,199,0,68,0,209,0,209,0,70,0,232,0,233,0,71,0,243,0,243,0,73,0,250,0,250,0,74,1,13, + 1,13,0,75,1,21,1,21,0,76,1,40,1,41,0,77,1,53,1,53,0,79,1,65,1,66,0,80,1,69,1,69,0,82,1,72,1,73,0,83, + 1,78,1,78,0,85,1,80,1,86,0,86,1,88,1,89,0,93,1,91,1,93,0,95,1,95,1,95,0,98,1,97,1,97,0,99,1,102,1,102, + 0,100,1,105,1,106,0,101,1,108,1,112,0,103,1,116,1,123,0,108,1,172,1,172,0,116,1,246,1,249,0,117,2,5,2,12,0,121,2,14, + 2,74,0,129,2,76,2,103,0,190,2,105,2,107,0,218,2,109,2,109,0,221,3,69,3,93,0,222,3,100,3,101,0,247,3,105,3,105,0,249, + 3,107,3,107,0,250,3,109,3,109,0,251,3,111,3,111,0,252,3,119,3,119,0,253,3,132,3,138,0,254,3,140,3,140,1,5,3,144,3,144, + 1,6,3,152,3,154,1,7,3,157,3,158,1,10,3,163,3,172,1,12,3,174,3,204,1,22,3,206,3,227,1,53,3,232,3,239,1,75,3,243, + 4,1,1,83,4,4,4,9,1,98,4,34,4,35,1,104,4,42,4,43,1,106,4,46,4,54,1,108,4,64,4,64,1,117,4,77,4,77,1,118, + 4,88,4,88,1,119,4,94,4,94,1,120,4,98,4,98,1,121,4,124,4,125,1,122,4,139,4,139,1,124,4,146,4,147,1,125,4,167,4,167, + 1,127,4,178,4,179,1,128,4,181,4,181,1,130,4,183,4,183,1,131,8,99,8,107,1,132,8,110,8,119,1,141,8,122,8,126,1,151,8,129, + 8,135,1,156,8,139,8,139,1,163,8,204,8,204,1,164,9,5,9,12,1,165,9,243,9,244,1,173,11,149,11,149,1,175,11,157,11,160,1,176, + 11,162,11,164,1,180,11,167,11,167,1,183,11,170,11,175,1,184,11,182,11,182,1,190,11,186,11,186,1,191,11,190,11,191,1,192,11,193,11,195, + 1,194,11,197,11,197,1,197,11,199,11,203,1,198,11,206,11,209,1,203,13,198,13,198,1,207,17,212,17,238,1,208,17,241,17,242,1,235,18,30, + 18,30,1,237,18,50,18,50,1,238,18,56,18,56,1,239,18,205,18,208,1,240,18,211,18,217,1,244,18,219,18,222,1,251,18,225,18,225,1,255, + 18,227,18,227,2,0,18,254,19,1,2,1,19,3,19,4,2,5,19,6,19,17,2,7,19,20,19,35,2,19,19,37,19,37,2,35,19,39,19,43, + 2,36,19,48,19,68,2,41,21,97,21,115,2,62,21,139,21,139,2,81,21,141,21,141,2,82,21,194,21,203,2,83,22,233,22,235,2,93,23,2, + 23,2,2,96,23,12,23,12,2,97,23,16,23,16,2,98,23,19,23,20,2,99,23,22,23,22,2,101,23,134,23,134,2,102,0,2,0,12,2,177, + 2,197,0,0,2,238,2,243,0,21,2,245,2,245,0,27,2,247,2,247,0,28,2,251,2,253,0,29,3,1,3,2,0,32,3,4,3,4,0,34, + 4,23,4,27,0,35,8,243,8,248,0,40,11,140,11,146,0,46,22,185,22,195,0,53,23,122,23,122,0,64,0,65,0,0,1,6,0,0,1,14, + 0,0,1,22,0,0,1,30,0,0,1,36,0,0,1,42,0,0,1,48,0,0,1,54,0,0,1,62,0,0,1,70,0,0,1,76,0,0,1,82, + 0,0,1,88,0,0,1,96,0,0,1,102,0,0,1,108,0,0,1,114,0,0,1,120,0,0,1,126,0,0,1,132,0,0,1,138,0,0,1,144, + 0,0,1,150,0,0,1,156,0,0,1,162,0,0,1,168,0,0,1,174,0,0,1,180,0,0,1,186,0,0,1,192,0,0,1,198,0,0,1,204, + 0,0,1,210,0,0,1,216,0,0,1,222,0,0,1,228,0,0,1,234,0,0,1,240,0,0,1,246,0,0,1,252,0,0,2,2,0,0,2,8, + 0,0,2,14,0,0,2,20,0,0,2,26,0,0,2,32,0,0,2,38,0,0,2,44,0,0,2,50,0,0,2,56,0,0,2,62,0,0,2,70, + 0,0,2,78,0,0,2,84,0,0,2,90,0,0,2,96,0,0,2,102,0,0,2,108,0,0,2,114,0,0,2,120,0,0,2,126,0,0,2,132, + 0,0,2,138,0,0,2,144,0,0,2,150,0,2,254,0,4,123,0,4,0,2,254,0,4,123,0,4,0,2,254,0,4,123,0,7,0,1,254,0, + 4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,2,254,0,4,123,0,4,0,2,254,0,4,123,0,8,0,1,254,0, + 4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,2,254,0,4,123,0,7,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123, + 0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,138,3,111,0,1,254,0,4,114,0,1,254,0,4,114,0,1,254,0,4,123,0,1,254,138, + 4,114,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1, + 254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,253,142,4,123, + 0,1,254,127,4,123,0,1,254,65,4,123,0,1,254,23,4,123,0,1,252,234,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0, + 4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1, + 254,0,4,123,0,2,254,0,4,123,0,12,0,2,254,0,4,123,0,16,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1, + 254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123, + 0,1,254,0,4,123,0,1,254,0,4,123,0,1,254,0,4,123,0,1,1,62,0,254,0,1,1,68,0,12,0,30,0,62,0,68,0,74,0,80, + 0,86,0,92,0,98,0,104,0,110,0,116,0,122,0,128,0,134,0,140,0,146,0,152,0,158,0,164,0,170,0,176,0,182,0,188,0,194,0,200, + 0,206,0,212,0,218,0,224,0,230,0,236,0,1,4,216,0,0,0,1,3,192,0,0,0,1,1,88,0,0,0,1,3,40,0,0,0,1,2,238, + 0,0,0,1,2,156,0,0,0,1,2,190,255,254,0,1,3,179,0,0,0,1,3,108,0,0,0,1,1,62,0,0,0,1,2,116,0,0,0,1, + 4,27,0,0,0,1,0,250,254,86,0,1,2,23,0,0,0,1,3,40,0,0,0,1,2,116,0,0,0,1,1,62,0,0,0,1,2,92,0,0, + 0,1,1,88,0,0,0,1,3,40,0,0,0,1,2,190,0,0,0,1,2,150,0,0,0,1,2,136,254,82,0,1,2,135,0,0,0,1,1,194, + 0,0,0,1,1,68,0,0,0,1,2,116,0,0,0,1,2,23,254,82,0,1,5,60,0,0,0,1,1,68,0,0,0,1,0,30,0,36,0,40, + 0,44,0,50,0,56,0,60,0,61,0,68,0,72,0,76,0,82,0,88,0,92,0,93,0,154,0,186,0,243,1,72,1,89,1,97,1,121,1,122, + 1,123,2,18,2,22,2,42,2,55,2,84,17,225,22,234,0,1,0,1,2,217,0,1,0,0,0,6,0,1,253,244,0,0,0,2,38,240,0,4, + 0,0,33,48,35,32,0,53,0,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,211,255,183,0,0,0,0,0,0,0,75,0,114,0,57,0,75,0,0,255,68, + 0,0,255,136,255,173,255,154,255,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,0,0,0, + 255,201,0,0,0,0,255,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,255,211,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,211,255,220,255,220,0,57,0,0,255,220,0,0,0,0,255,220,0,0,255,220,255,220,0,0,255,97, + 0,0,255,125,255,144,0,0,255,97,0,0,0,0,255,220,255,220,255,220,255,183,0,0,0,0,0,0,0,0,255,220,0,0,0,0,255,220,0,0, + 255,136,255,173,0,0,255,117,255,183,0,0,0,0,255,220,0,0,255,220,0,0,255,220,0,0,0,57,0,0,255,220,255,220,255,220,255,220,255,220, + 255,220,255,220,255,220,0,0,0,0,255,220,255,220,255,97,0,0,0,0,255,144,255,173,255,97,255,117,255,220,255,220,255,97,0,0,255,97,255,117, + 255,173,255,144,254,248,255,3,0,47,0,0,0,0,0,0,0,0,0,0,0,0,255,220,0,0,0,0,255,220,0,0,255,220,0,0,255,220,0,0, + 0,0,255,193,255,183,0,0,255,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,193,255,220,0,0,255,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,220,0,0,0,0,0,0, + 0,0,0,0,255,220,255,220,0,0,0,0,255,220,0,0,0,0,0,0,255,183,0,0,255,144,0,0,255,220,0,0,0,0,0,0,0,0,0,0, + 0,0,255,183,255,144,255,144,255,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,255,220,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,255,220,0,0,0,0,0,0,0,0,0,0,255,220,0,0, + 0,0,0,0,0,0,0,38,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,255,220,0,0,0,0,255,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,220,255,220,0,0,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,255,144,0,0,0,0,0,0,0,0,0,0,255,144,0,0, + 0,0,0,0,255,211,255,201,255,68,0,0,0,0,254,183,255,97,255,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,220,255,220, + 0,0,0,0,0,0,0,0,0,0,0,0,255,68,0,0,0,0,255,144,0,0,0,0,255,107,0,0,0,0,255,183,255,107,0,0,0,0,255,144, + 0,0,0,0,0,0,255,68,0,0,0,0,0,0,0,0,255,68,255,144,0,0,255,183,255,144,255,68,255,68,0,0,0,0,0,0,0,0,0,0, + 0,0,255,144,0,0,0,0,255,107,255,183,0,0,255,220,255,220,255,144,0,0,0,0,0,0,255,68,0,0,255,183,255,220,255,183,0,0,255,68, + 0,0,0,0,255,211,0,0,254,136,0,0,0,0,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,183, + 0,0,0,0,0,0,0,0,255,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,220,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,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,211,255,211,255,201,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,183,255,193,255,183,0,0,255,183,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,0,0,0,0,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,220,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,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,183,255,193,255,144,0,0,255,41,0,0,0,0,255,220,0,0,255,144,0,0,0,0,0,0,0,0,255,144,0,0,0,0,255,97, + 255,201,0,0,255,183,0,0,255,183,0,0,255,220,0,0,0,0,255,154,0,0,0,0,0,0,0,0,0,0,255,154,0,0,0,0,0,0,255,154, + 0,0,0,0,0,0,255,107,255,125,0,0,0,0,255,144,255,220,255,154,0,0,255,154,255,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,193,255,193,0,0,0,0,255,220,0,0,0,0,0,47,0,0,0,0,0,0,0,0,0,0,0,0,255,183,0,0,0,0,254,230, + 255,154,255,31,255,68,0,0,254,240,0,0,0,0,0,0,0,0,255,220,0,0,0,0,0,0,0,0,0,0,255,220,0,0,0,0,0,0,255,220, + 0,0,0,0,0,0,255,68,0,0,0,0,0,0,0,0,0,0,255,220,0,0,255,220,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,254,97,253,230,0,0,0,0,0,57,255,173,255,220,255,220,0,0,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,125,255,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,211,255,220,255,68,0,0,255,211,254,193,0,0,255,125,0,0,0,0,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,211,0,0,255,164,0,0,0,0,255,183,0,0,0,0,255,211,0,0,255,220,255,183,255,220,255,220,0,0,255,220, + 0,0,0,0,0,0,0,0,255,220,0,0,0,0,0,0,255,164,255,183,0,0,255,183,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,0,38,0,38,254,183,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,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,211,255,220,255,125,0,0,255,173,255,183,255,193,255,173,0,0,255,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,107, + 0,0,255,144,255,173,0,0,255,125,0,0,255,211,0,0,0,0,255,164,0,0,0,0,0,0,0,0,0,0,255,164,0,0,0,0,0,0,255,164, + 0,0,0,0,0,0,255,144,255,144,255,220,0,0,255,154,255,211,255,164,0,0,255,164,255,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,107,255,125,255,220,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,68,255,13,255,31,255,97,0,0,255,136,0,0,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,254,173,254,164,0,0,254,164,0,0,0,0,255,193,0,0,0,0,254,164,254,211,254,173,0,0,254,201, + 0,0,254,173,0,0,254,193,255,68,255,144,0,0,255,136,255,17,254,224,0,0,254,244,254,231,0,0,0,0,254,164,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,211,254,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,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,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,136,254,248,255,89,255,125,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,255,97,0,0,0,0,255,97,0,0,0,0,255,211,0,0,0,0,255,97,0,0,0,0,0,0,255,117, + 0,0,0,0,0,0,255,201,255,78,255,144,0,0,0,0,255,97,255,97,0,0,255,97,255,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,254,230,0,0,255,173,255,21,255,136,255,144,0,0,0,0,0,0,0,0,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,125,0,0,0,0,255,136,0,0,0,0,255,211,0,0,0,0,255,136,255,164,0,0,0,0,255,183, + 0,0,0,0,0,0,255,220,255,144,255,220,0,0,0,0,255,125,255,136,0,0,255,136,255,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,220,0,0,254,248,0,0,255,154,0,0,0,0,0,0,0,0,255,107,0,0,0,0,0,0,0,0,255,125,0,0,0,0,255,220, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,164,0,0,0,0,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,144,0,0,0,0,255,107,0,0,255,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,97,255,173,255,211,0,0,255,13,254,97,254,240,255,97,0,0,255,144,0,0,0,0,0,0,0,0,255,144,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,254,230,0,0,0,0,254,240,0,0,0,0,255,183,0,0,0,0,254,240,0,0,0,0,0,0,255,21, + 0,0,0,0,0,0,0,0,255,31,255,107,0,0,255,144,254,230,254,240,0,0,254,240,255,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,144,255,220,254,248,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,220,255,220,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,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,144,255,107,255,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,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,220,0,0, + 0,0,255,220,0,0,255,220,255,183,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,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,65,0,0,255,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,220,0,0,0,0,255,183,0,0,0,0,0,0,0,0,0,0,255,183,0,0,0,0,0,0,255,193, + 0,0,0,0,0,0,255,183,0,0,0,0,0,0,0,0,255,220,255,183,0,0,255,183,255,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,107,255,144,255,164,0,0,0,38,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,0,0,0,0,0,0, + 0,0,0,0,255,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,107,255,183,255,125,0,0,255,125,255,68,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,255,211,255,220,255,211,0,0,255,220,0,0,0,0,255,220,255,211,255,220,0,0,0,0,0,0, + 0,0,0,0,255,201,0,0,255,183,0,0,0,0,0,0,0,0,255,211,0,0,255,211,0,0,0,0,0,0,255,211,0,0,0,0,0,0,0,72, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,86,254,201,0,0,255,201,255,97,255,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,220,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,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,220,254,240,0,0,0,0,255,68,255,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,220,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,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,220,0,0,255,193,0,0,0,0,0,0,0,0,0,0,255,193,0,0,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,193,0,0,255,193,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,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,220,254,220,255,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,220,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,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,254,211,0,0,0,0,0,0,0,0,0,0,255,220,255,220,255,220,0,0,255,220,255,220,0,0,0,0,0,0,255,144, + 0,0,255,144,255,220,0,0,255,107,0,0,0,0,0,0,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,220,255,220,0,0,255,220,0,0,0,0,0,151,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,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,255,183,255,183,255,220,255,220,0,0,0,0,255,220,255,220,0,0,0,0,255,68, + 0,0,255,78,255,144,255,144,255,31,0,0,0,0,0,0,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,220,255,220,0,0,255,220,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,0,0,0,0,0,0,0,0,0,0,0,0,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,211,255,220,255,220,0,57,0,0,255,220,0,0,0,0,255,220,0,0,255,220,255,220,0,0,255,97, + 0,0,255,125,255,144,0,0,255,97,0,0,0,0,255,220,255,220,255,220,255,183,0,0,0,0,0,0,0,0,255,220,0,0,0,0,255,220,0,0, + 255,136,255,173,0,0,255,117,255,183,0,0,0,0,255,220,0,0,255,220,0,0,255,220,0,0,0,57,0,0,255,220,255,220,0,0,255,220,255,220, + 0,0,255,220,255,220,0,0,0,0,255,220,255,220,255,97,0,0,0,0,255,144,255,173,255,97,255,117,0,0,0,0,0,0,255,220,0,0,0,0, + 0,0,0,0,254,248,255,3,0,47,0,0,255,211,255,220,255,220,0,57,0,0,255,220,0,0,0,0,255,220,0,0,255,220,255,220,0,0,255,97, + 0,0,255,125,255,144,0,0,255,97,0,0,0,0,255,220,255,220,255,220,255,183,0,0,0,0,0,0,0,0,255,220,0,0,0,0,255,220,0,0, + 255,136,255,173,0,0,255,117,255,183,0,0,0,0,255,220,0,0,255,220,0,0,255,220,0,0,0,57,0,0,255,220,255,220,0,0,255,220,255,220, + 0,0,255,220,255,220,0,0,0,0,255,220,255,220,255,97,0,0,0,0,255,144,255,173,255,97,255,117,0,0,0,0,0,0,255,220,0,0,0,0, + 0,0,255,144,254,248,255,3,0,47,0,0,255,211,255,220,255,220,0,57,0,0,255,220,0,0,0,0,255,220,0,0,255,220,255,220,0,0,255,97, + 0,0,255,125,255,144,0,0,255,97,0,0,0,0,255,220,255,220,255,220,255,183,0,0,0,0,0,0,0,0,255,220,0,0,0,0,255,220,0,0, + 255,136,255,173,0,0,255,117,255,183,0,0,0,0,255,220,0,0,255,220,0,0,255,220,0,0,0,57,0,0,255,220,255,220,0,0,255,220,255,220, + 0,0,255,220,255,220,0,0,0,0,255,220,255,220,255,97,0,0,0,0,255,144,255,173,255,97,255,117,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,144,254,248,255,3,0,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,173,255,164,255,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,255,220,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,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,38,0,0,0,0,0,0,255,107,255,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,220,0,0,255,68,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,144,255,144,255,173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,164,255,144,255,183,0,0,255,211,255,220,255,220,0,57,0,0,255,220,0,0,0,0,255,220,0,0,255,220,255,220,0,0,255,97, + 0,0,255,125,255,144,0,0,255,97,0,0,0,0,255,220,255,220,255,220,255,183,0,0,0,0,0,0,0,0,255,220,0,0,0,0,255,220,0,0, + 255,136,255,173,0,0,255,117,255,183,0,0,0,0,0,0,0,0,255,220,0,0,255,220,0,0,0,57,0,0,0,0,255,220,0,0,255,220,255,220, + 255,220,255,220,0,0,0,0,0,0,255,220,255,220,255,97,0,0,0,0,255,144,255,173,255,97,255,117,0,0,0,0,0,0,255,220,0,0,0,0, + 0,0,255,144,254,248,255,2,0,47,0,0,255,211,255,220,255,220,0,57,0,0,255,220,0,0,0,0,255,220,0,0,255,220,255,220,0,0,255,97, + 0,0,255,125,255,144,0,0,255,97,0,0,0,0,255,220,255,220,255,220,255,183,0,0,0,0,0,0,0,0,255,220,0,0,0,0,255,220,0,0, + 255,136,255,173,0,0,0,0,255,183,0,0,0,0,0,0,0,0,255,220,0,0,255,220,0,0,0,57,0,0,0,0,255,220,0,0,255,220,255,220, + 255,220,255,220,0,0,0,0,0,0,255,220,0,0,255,97,0,0,0,0,255,144,255,173,255,97,0,0,0,0,0,0,0,0,255,220,0,0,0,0, + 0,0,255,144,254,248,255,2,0,47,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,255,220,0,0,0,0,255,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,220,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,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,211,255,201,255,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,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,63,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,125,255,68,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,255,211,255,220,255,211,0,0,255,220,0,0,0,0,255,220,255,211,255,220,0,0,0,0,0,0, + 0,0,0,0,255,201,0,0,255,183,0,0,0,0,0,0,0,0,255,211,0,0,255,211,0,0,0,0,0,0,255,211,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, + 0,0,0,0,0,0,0,86,254,201,0,0,255,68,255,13,255,31,255,97,0,0,255,136,0,0,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,254,173,254,164,0,0,254,164,0,0,0,0,255,193,0,0,0,0,254,164,254,211,254,173,0,0,254,201, + 0,0,254,173,0,0,254,193,255,68,255,144,0,0,255,136,254,173,254,164,0,0,254,164,254,201,0,0,0,0,254,164,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,211,254,248,0,0,0,0,0,0,0,0,255,211,255,183,0,0,0,0,0,0,0,75,0,114,0,57,0,75,0,0,255,68, + 0,0,255,136,255,173,255,154,255,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,0,0,0, + 255,201,0,0,0,0,255,220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,248,255,193,255,183,255,193,255,193,255,183,255,193,255,183,255,183,0,0,0,0, + 0,0,0,0,0,0,255,136,0,0,255,220,0,0,0,0,0,0,0,0,255,183,0,0,0,0,0,0,255,144,255,107,255,144,0,0,0,0,0,0, + 255,183,255,183,0,0,255,183,0,0,0,0,254,125,255,183,0,0,0,0,255,183,255,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,255,183,255,144,255,183,255,183,255,183,0,47,255,144,255,144,0,0,254,230, + 0,0,254,136,255,3,255,183,254,136,0,0,0,0,0,0,0,0,0,0,255,220,0,0,0,0,0,0,255,183,255,183,255,183,0,0,0,0,0,0, + 255,21,255,60,0,0,255,144,0,0,0,0,0,38,255,144,0,0,0,0,255,183,255,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,82,0,16,0,16,0,1,0,36,0,36,0,2,0,37,0,37,0,3,0,38,0,38,0,4,0,39, + 0,39,0,5,0,41,0,41,0,6,0,42,0,42,0,7,0,43,0,43,0,8,0,45,0,45,0,9,0,46,0,46,0,10,0,47,0,47,0,11, + 0,50,0,50,0,12,0,51,0,51,0,13,0,52,0,52,0,14,0,53,0,53,0,15,0,54,0,54,0,16,0,55,0,55,0,17,0,56,0,56, + 0,18,0,57,0,57,0,19,0,58,0,58,0,20,0,59,0,59,0,21,0,60,0,60,0,22,0,61,0,61,0,23,0,72,0,72,0,24,0,73, + 0,73,0,25,0,78,0,78,0,26,0,81,0,81,0,27,0,82,0,82,0,28,0,85,0,85,0,29,0,89,0,89,0,30,0,90,0,90,0,31, + 0,91,0,91,0,32,0,92,0,92,0,33,0,109,0,109,0,34,0,125,0,125,0,35,0,130,0,130,0,36,0,131,0,132,0,37,0,133,0,133, + 0,38,0,134,0,134,0,37,0,136,0,136,0,39,0,137,0,137,0,40,0,146,0,146,0,5,0,148,0,152,0,12,0,155,0,158,0,18,0,159, + 0,159,0,22,0,160,0,160,0,41,0,161,0,161,0,42,0,170,0,173,0,24,0,178,0,178,0,43,0,179,0,179,0,27,0,180,0,184,0,28, + 0,191,0,191,0,33,0,193,0,193,0,33,0,194,0,194,0,44,0,196,0,196,0,44,0,198,0,198,0,45,0,200,0,200,0,40,0,206,0,206, + 0,40,0,208,0,208,0,5,0,210,0,210,0,46,0,221,0,221,0,24,0,224,0,224,0,7,0,251,0,251,0,11,0,255,0,255,0,11,1,2, + 1,2,0,47,1,10,1,10,0,27,1,22,1,22,0,15,1,23,1,23,0,29,1,26,1,26,0,15,1,27,1,27,0,48,1,32,1,32,0,16, + 1,34,1,34,0,16,1,38,1,38,0,49,1,48,1,48,0,18,1,58,1,58,0,22,1,63,1,63,0,23,10,238,10,238,0,50,10,250,10,250, + 0,51,10,252,10,252,0,52,18,252,18,252,0,17,19,20,19,20,0,10,19,21,19,21,0,26,0,2,0,162,0,16,0,16,0,1,0,17,0,17, + 0,2,0,29,0,29,0,3,0,36,0,36,0,4,0,37,0,37,0,5,0,38,0,38,0,6,0,39,0,39,0,7,0,41,0,41,0,8,0,42, + 0,42,0,9,0,43,0,43,0,8,0,45,0,45,0,10,0,46,0,47,0,8,0,50,0,50,0,11,0,51,0,51,0,8,0,52,0,52,0,12, + 0,53,0,53,0,8,0,54,0,54,0,13,0,55,0,55,0,14,0,56,0,56,0,15,0,57,0,57,0,16,0,58,0,58,0,17,0,59,0,59, + 0,18,0,60,0,60,0,19,0,61,0,61,0,20,0,68,0,68,0,21,0,70,0,70,0,22,0,71,0,71,0,23,0,72,0,72,0,24,0,73, + 0,73,0,25,0,74,0,75,0,26,0,76,0,76,0,27,0,79,0,79,0,28,0,80,0,80,0,26,0,81,0,81,0,29,0,82,0,82,0,30, + 0,84,0,84,0,23,0,85,0,85,0,31,0,86,0,86,0,32,0,87,0,87,0,33,0,88,0,88,0,34,0,89,0,89,0,35,0,90,0,90, + 0,36,0,91,0,91,0,37,0,92,0,92,0,38,0,109,0,109,0,39,0,125,0,125,0,40,0,130,0,134,0,4,0,136,0,136,0,41,0,137, + 0,137,0,42,0,148,0,152,0,11,0,155,0,158,0,15,0,159,0,159,0,19,0,160,0,161,0,8,0,162,0,162,0,43,0,163,0,163,0,21, + 0,164,0,167,0,43,0,169,0,169,0,22,0,170,0,170,0,44,0,171,0,171,0,24,0,172,0,173,0,44,0,178,0,178,0,45,0,179,0,179, + 0,29,0,180,0,180,0,46,0,181,0,181,0,30,0,182,0,184,0,46,0,187,0,187,0,47,0,188,0,188,0,34,0,189,0,190,0,47,0,191, + 0,191,0,38,0,193,0,193,0,38,0,194,0,194,0,48,0,195,0,195,0,49,0,196,0,196,0,48,0,197,0,197,0,49,0,198,0,198,0,48, + 0,199,0,199,0,49,0,200,0,200,0,6,0,201,0,201,0,50,0,202,0,202,0,51,0,203,0,203,0,52,0,204,0,204,0,51,0,205,0,205, + 0,53,0,206,0,206,0,6,0,207,0,207,0,50,0,208,0,208,0,7,0,209,0,209,0,54,0,211,0,211,0,55,0,213,0,213,0,56,0,215, + 0,215,0,56,0,217,0,217,0,56,0,219,0,219,0,56,0,221,0,221,0,24,0,222,0,222,0,51,0,224,0,224,0,57,0,225,0,225,0,26, + 0,226,0,226,0,51,0,228,0,228,0,58,0,241,0,241,0,59,0,245,0,245,0,59,0,251,0,251,0,8,0,255,0,255,0,8,1,10,1,10, + 0,29,1,14,1,14,0,51,1,15,1,15,0,60,1,16,1,16,0,51,1,17,1,17,0,60,1,18,1,18,0,61,1,19,1,19,0,60,1,22, + 1,22,0,8,1,23,1,23,0,31,1,25,1,25,0,59,1,26,1,26,0,8,1,27,1,27,0,31,1,28,1,28,0,13,1,30,1,30,0,13, + 1,32,1,32,0,13,1,33,1,33,0,32,1,34,1,34,0,13,1,35,1,35,0,32,1,36,1,36,0,62,1,37,1,37,0,53,1,38,1,38, + 0,14,1,39,1,39,0,33,1,40,1,40,0,63,1,43,1,43,0,64,1,45,1,45,0,64,1,47,1,47,0,64,1,48,1,48,0,15,1,49, + 1,49,0,34,1,51,1,51,0,64,1,53,1,53,0,64,1,54,1,54,0,65,1,55,1,55,0,66,1,56,1,56,0,67,1,57,1,57,0,68, + 1,58,1,58,0,19,1,63,1,63,0,20,1,136,1,136,0,52,1,172,1,172,0,69,1,173,1,173,0,70,1,174,1,174,0,69,1,175,1,175, + 0,70,1,218,1,218,0,13,1,220,1,220,0,71,1,221,1,221,0,52,1,240,1,240,0,51,1,241,1,241,0,72,1,243,1,243,0,52,1,244, + 1,244,0,73,1,245,1,245,0,74,9,121,9,121,0,65,9,122,9,122,0,75,9,123,9,123,0,76,9,124,9,124,0,66,9,125,9,125,0,65, + 9,126,9,126,0,66,9,235,9,235,0,67,9,236,9,236,0,68,10,250,10,250,0,77,10,251,10,251,0,78,10,252,10,252,0,79,19,20,19,20, + 0,8,0,1,0,97,0,16,0,36,0,37,0,38,0,39,0,41,0,42,0,43,0,45,0,46,0,47,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,72,0,73,0,78,0,81,0,82,0,85,0,89,0,90,0,91,0,92,0,109,0,125,0,130,0,131, + 0,132,0,133,0,134,0,136,0,137,0,146,0,148,0,149,0,150,0,151,0,152,0,155,0,156,0,157,0,158,0,159,0,160,0,161,0,170,0,171, + 0,172,0,173,0,178,0,179,0,180,0,181,0,182,0,183,0,184,0,191,0,193,0,194,0,196,0,198,0,200,0,206,0,208,0,210,0,221,0,224, + 0,251,0,255,1,2,1,10,1,22,1,23,1,26,1,27,1,32,1,34,1,38,1,48,1,58,1,63,10,238,10,250,10,252,18,252,19,20,19,21, + 0,2,0,96,0,4,0,0,0,36,0,88,0,5,0,2,0,0,0,0,0,0,255,216,0,0,255,177,0,0,255,163,0,0,255,156,0,1,19,70, + 0,23,0,1,0,2,0,3,0,4,0,1,0,0,0,1,0,2,0,3,0,2,0,1,0,0,0,1,0,2,0,3,0,2,0,1,0,0,0,1, + 0,4,0,3,0,2,0,1,0,1,19,94,0,1,0,1,0,2,0,4,19,70,19,74,0,0,19,76,19,80,0,5,19,82,19,86,0,10,19,88, + 19,92,0,15,0,1,0,0,0,10,2,26,3,124,0,20,68,70,76,84,0,122,97,114,97,98,0,136,97,114,109,110,0,194,98,114,97,105,0,208, + 99,97,110,115,0,220,99,104,101,114,0,232,99,121,114,108,0,244,103,101,111,114,1,22,103,114,101,107,1,34,104,97,110,105,1,50,104,101,98,114, + 1,62,107,97,110,97,1,80,108,97,111,32,1,92,108,97,116,110,1,104,109,97,116,104,1,194,110,107,111,32,1,206,111,103,97,109,1,224,114,117, + 110,114,1,236,116,102,110,103,1,248,116,104,97,105,2,4,0,4,0,0,0,0,0,0,0,2,0,4,0,8,0,22,0,3,75,85,82,32,0,22, + 83,78,68,32,0,40,85,82,68,32,0,40,0,0,255,255,0,6,0,5,0,11,0,15,0,17,0,21,0,23,0,0,255,255,0,6,0,5,0,11, + 0,15,0,17,0,21,0,24,0,4,0,0,0,0,255,255,0,2,0,4,0,9,0,4,0,0,0,0,255,255,0,1,0,4,0,4,0,0,0,0, + 255,255,0,1,0,4,0,4,0,0,0,0,255,255,0,1,0,4,0,16,0,2,77,75,68,32,0,24,83,82,66,32,0,24,0,0,255,255,0,1, + 0,6,0,0,255,255,0,2,0,6,0,19,0,4,0,0,0,0,255,255,0,1,0,4,0,4,0,0,0,0,255,255,0,3,0,1,0,6,0,25, + 0,4,0,0,0,0,255,255,0,1,0,4,0,4,0,0,0,0,255,255,0,4,0,2,0,7,0,13,0,26,0,4,0,0,0,0,255,255,0,1, + 0,4,0,4,0,0,0,0,255,255,0,1,0,4,0,52,0,8,73,83,77,32,0,70,75,83,77,32,0,70,76,83,77,32,0,70,77,79,76,32, + 0,52,78,83,77,32,0,70,82,79,77,32,0,52,83,75,83,32,0,70,83,83,77,32,0,70,0,0,255,255,0,6,0,3,0,6,0,10,0,14, + 0,18,0,27,0,0,255,255,0,7,0,3,0,6,0,10,0,14,0,18,0,20,0,27,0,4,0,0,0,0,255,255,0,1,0,4,0,4,0,0, + 0,0,0,0,0,4,0,5,0,12,0,16,0,22,0,4,0,0,0,0,255,255,0,1,0,4,0,4,0,0,0,0,255,255,0,1,0,4,0,4, + 0,0,0,0,255,255,0,1,0,4,0,4,0,0,0,0,255,255,0,1,0,4,0,28,32,82,81,68,0,170,97,97,108,116,0,176,97,97,108,116, + 0,182,97,97,108,116,0,188,99,99,109,112,0,194,99,99,109,112,0,200,99,99,109,112,0,208,99,99,109,112,0,216,100,108,105,103,0,226,100,108, + 105,103,0,232,100,108,105,103,0,238,102,105,110,97,0,244,102,105,110,97,0,250,104,108,105,103,1,0,104,108,105,103,1,6,105,110,105,116,1,12, + 105,110,105,116,1,18,108,105,103,97,1,24,108,105,103,97,1,32,108,111,99,108,1,38,108,111,99,108,1,44,109,101,100,105,1,50,109,101,100,105, + 1,56,114,108,105,103,1,62,114,108,105,103,1,72,115,97,108,116,1,80,115,97,108,116,1,86,115,97,108,116,1,92,0,0,0,1,0,0,0,0, + 0,1,0,25,0,0,0,1,0,23,0,0,0,1,0,28,0,0,0,1,0,3,0,0,0,2,0,1,0,3,0,0,0,2,0,2,0,3,0,0, + 0,3,0,1,0,3,0,4,0,0,0,1,0,22,0,0,0,1,0,19,0,0,0,1,0,20,0,0,0,1,0,8,0,0,0,1,0,7,0,0, + 0,1,0,38,0,0,0,1,0,21,0,0,0,1,0,12,0,0,0,1,0,11,0,0,0,2,0,16,0,18,0,0,0,1,0,17,0,0,0,1, + 0,5,0,0,0,1,0,6,0,0,0,1,0,10,0,0,0,1,0,9,0,0,0,3,0,13,0,14,0,15,0,0,0,2,0,14,0,15,0,0, + 0,1,0,26,0,0,0,1,0,24,0,0,0,1,0,27,0,39,0,80,0,88,0,96,0,104,0,130,0,138,0,146,0,154,0,162,0,170,0,178, + 0,186,0,194,0,202,0,210,0,218,0,226,0,234,0,242,0,250,1,2,1,10,1,18,1,26,1,34,1,42,1,50,1,58,1,66,1,74,1,82, + 1,90,1,98,1,106,1,114,1,122,1,130,1,138,1,146,0,6,0,9,0,1,1,74,0,6,0,1,0,1,1,190,0,6,0,0,0,1,2,6, + 0,6,0,0,0,10,5,122,5,210,6,42,6,130,6,218,7,50,7,116,7,188,8,4,8,76,0,4,0,1,0,1,8,116,0,1,0,0,0,1, + 8,146,0,1,0,0,0,1,8,150,0,1,0,9,0,1,8,154,0,1,0,9,0,1,8,222,0,1,0,9,0,1,9,216,0,1,0,9,0,1, + 10,28,0,1,0,9,0,1,10,252,0,1,0,9,0,1,11,64,0,4,0,1,0,1,12,32,0,4,0,1,0,1,12,84,0,4,0,9,0,1, + 12,218,0,4,0,9,0,1,12,248,0,4,0,0,0,1,13,54,0,4,0,1,0,1,13,106,0,4,0,0,0,1,14,34,0,4,0,0,0,1, + 14,102,0,4,0,0,0,1,14,118,0,4,0,0,0,1,14,134,0,1,0,1,0,1,15,26,0,1,0,1,0,1,15,30,0,1,0,0,0,1, + 15,34,0,1,0,0,0,1,15,64,0,1,0,0,0,1,15,94,0,3,0,0,0,1,15,116,0,1,0,0,0,1,15,166,0,1,0,0,0,1, + 15,216,0,1,0,0,0,1,16,14,0,1,0,0,0,1,16,22,0,1,0,0,0,1,16,30,0,1,0,0,0,1,16,38,0,1,0,0,0,1, + 16,46,0,1,0,0,0,1,16,54,0,1,0,1,0,1,16,72,0,4,0,1,0,1,16,76,0,2,0,16,0,44,0,44,0,44,0,2,0,0, + 0,72,0,2,0,4,5,241,6,14,0,0,6,28,6,28,0,30,10,235,10,235,0,31,23,32,23,121,0,32,0,2,0,4,5,241,6,14,0,1, + 6,28,6,28,0,1,10,235,10,235,0,1,23,32,23,121,0,1,0,3,0,8,0,24,0,38,0,1,0,1,0,1,0,1,0,1,0,1,0,0, + 0,9,0,1,0,1,0,1,0,0,0,1,0,0,0,7,0,0,0,1,0,1,0,1,0,1,0,0,0,11,0,2,0,18,0,24,0,32,0,32, + 0,3,0,0,0,66,0,0,0,1,0,1,5,56,0,1,0,0,0,1,0,0,0,2,0,5,5,16,5,24,0,2,5,27,5,27,0,2,5,29, + 5,29,0,2,5,37,5,37,0,2,5,56,5,56,0,1,0,1,0,4,0,0,0,1,0,1,0,2,0,0,0,2,0,22,0,140,0,140,0,140, + 0,5,0,0,3,12,3,68,0,0,0,0,0,1,0,57,0,76,0,77,0,241,2,11,2,42,2,95,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,238,2,239,2,240,2,241,2,242, + 2,243,2,244,2,245,2,247,2,251,2,252,2,253,3,1,3,2,3,4,3,135,3,234,3,236,4,23,4,24,4,25,4,26,9,38,9,196,11,140, + 11,141,11,142,11,143,11,218,11,219,0,2,0,106,0,36,0,61,0,3,0,69,0,69,0,3,0,71,0,71,0,3,0,73,0,73,0,3,0,75, + 0,75,0,3,0,76,0,77,0,1,0,78,0,79,0,3,0,87,0,87,0,3,0,130,0,152,0,3,0,154,0,161,0,3,0,194,0,194,0,3, + 0,196,0,196,0,3,0,198,0,198,0,3,0,200,0,200,0,3,0,202,0,202,0,3,0,204,0,204,0,3,0,206,0,206,0,3,0,208,0,208, + 0,3,0,210,0,210,0,3,0,212,0,212,0,3,0,214,0,214,0,3,0,216,0,216,0,3,0,218,0,218,0,3,0,220,0,220,0,3,0,222, + 0,222,0,3,0,224,0,224,0,3,0,226,0,226,0,3,0,228,0,228,0,3,0,230,0,234,0,3,0,236,0,236,0,3,0,238,0,238,0,3, + 0,240,0,240,0,3,0,241,0,241,0,1,0,242,0,242,0,3,0,244,0,244,0,3,0,246,0,246,0,3,0,248,0,248,0,3,0,251,1,5, + 0,3,1,7,1,7,0,3,1,9,1,9,0,3,1,12,1,12,0,3,1,14,1,14,0,3,1,16,1,16,0,3,1,18,1,18,0,3,1,20, + 1,20,0,3,1,22,1,22,0,3,1,24,1,24,0,3,1,26,1,26,0,3,1,28,1,28,0,3,1,30,1,30,0,3,1,32,1,32,0,3, + 1,34,1,34,0,3,1,36,1,36,0,3,1,38,1,38,0,3,1,40,1,40,0,3,1,42,1,42,0,3,1,44,1,44,0,3,1,46,1,46, + 0,3,1,48,1,48,0,3,1,50,1,50,0,3,1,52,1,52,0,3,1,54,1,54,0,3,1,56,1,56,0,3,1,58,1,59,0,3,1,61, + 1,61,0,3,1,63,1,63,0,3,1,65,1,65,0,3,1,72,1,72,0,3,1,82,1,82,0,3,1,84,1,84,0,3,1,86,1,86,0,3, + 1,121,1,122,0,3,1,143,1,143,0,3,1,145,1,147,0,3,1,149,1,149,0,3,1,164,1,164,0,3,1,172,1,172,0,3,1,174,1,174, + 0,3,1,218,1,218,0,3,1,220,1,220,0,3,1,240,1,240,0,3,1,244,1,244,0,3,2,11,2,11,0,1,2,42,2,42,0,1,2,95, + 2,95,0,1,2,177,2,197,0,2,2,199,2,202,0,4,2,205,2,228,0,4,2,234,2,237,0,4,2,238,2,245,0,2,2,246,2,246,0,4, + 2,247,2,247,0,2,2,248,2,250,0,4,2,251,2,253,0,2,2,254,2,255,0,4,3,1,3,2,0,2,3,3,3,3,0,4,3,4,3,4, + 0,2,3,135,3,135,0,1,3,234,3,234,0,1,3,236,3,236,0,1,4,23,4,26,0,2,9,38,9,38,0,1,9,196,9,196,0,1,11,140, + 11,143,0,2,11,218,11,219,0,1,0,3,0,8,0,22,0,38,0,0,0,1,0,1,0,2,0,1,0,0,0,30,0,0,0,1,0,2,0,4, + 0,2,0,1,0,0,0,30,0,0,0,1,0,3,0,4,0,4,0,2,0,1,0,0,0,30,0,3,0,8,0,22,0,38,0,1,0,3,0,1, + 0,0,0,1,0,0,0,29,0,2,0,4,0,3,0,1,0,0,0,1,0,0,0,29,0,3,0,4,0,4,0,3,0,1,0,0,0,1,0,0, + 0,29,0,2,0,18,0,28,0,36,0,36,0,3,0,0,0,52,0,70,0,2,0,1,2,167,2,171,0,0,0,1,0,0,0,1,0,0,0,2, + 0,2,2,167,2,167,0,1,2,168,2,171,0,2,0,1,0,4,0,0,0,1,0,1,0,1,0,1,0,0,0,31,0,1,0,4,0,0,0,1, + 0,1,0,1,0,1,0,0,0,31,0,2,0,18,0,28,0,36,0,36,0,3,0,0,0,52,0,70,0,2,0,1,2,167,2,171,0,0,0,1, + 0,0,0,1,0,0,0,1,2,167,0,5,0,2,0,1,0,2,0,2,0,2,0,1,0,4,0,0,0,1,0,1,0,1,0,1,0,0,0,32, + 0,1,0,4,0,0,0,1,0,1,0,1,0,1,0,0,0,32,0,2,0,18,0,28,0,36,0,36,0,3,0,0,0,52,0,70,0,2,0,1, + 2,167,2,171,0,0,0,1,0,0,0,1,0,0,0,1,2,167,0,5,0,2,0,2,0,1,0,2,0,2,0,1,0,4,0,0,0,1,0,1, + 0,1,0,1,0,0,0,33,0,1,0,4,0,0,0,1,0,1,0,1,0,1,0,0,0,33,0,2,0,18,0,28,0,36,0,36,0,3,0,0, + 0,52,0,70,0,2,0,1,2,167,2,171,0,0,0,1,0,0,0,1,0,0,0,1,2,167,0,5,0,2,0,2,0,2,0,1,0,2,0,1, + 0,4,0,0,0,1,0,1,0,1,0,1,0,0,0,34,0,1,0,4,0,0,0,1,0,1,0,1,0,1,0,0,0,34,0,2,0,18,0,28, + 0,36,0,36,0,3,0,0,0,52,0,70,0,2,0,1,2,167,2,171,0,0,0,1,0,0,0,1,0,0,0,2,0,2,2,167,2,170,0,2, + 2,171,2,171,0,1,0,1,0,4,0,0,0,1,0,1,0,1,0,1,0,0,0,35,0,1,0,4,0,0,0,1,0,1,0,1,0,1,0,0, + 0,35,0,2,0,18,0,24,0,24,0,40,0,3,0,0,0,48,0,0,0,1,0,1,2,167,0,2,0,2,2,167,2,167,0,1,19,70,19,73, + 0,2,0,1,0,0,0,1,0,0,0,1,0,4,0,1,0,2,0,1,0,0,0,1,0,0,0,36,0,2,0,18,0,24,0,24,0,46,0,3, + 0,0,0,54,0,0,0,1,0,1,2,168,0,2,0,3,2,168,2,168,0,1,19,74,19,74,0,2,19,76,19,78,0,2,0,1,0,0,0,1, + 0,0,0,1,0,4,0,1,0,2,0,1,0,0,0,1,0,0,0,36,0,2,0,18,0,24,0,24,0,46,0,3,0,0,0,54,0,0,0,1, + 0,1,2,169,0,2,0,3,2,169,2,169,0,1,19,79,19,80,0,2,19,82,19,83,0,2,0,1,0,0,0,1,0,0,0,1,0,4,0,1, + 0,2,0,1,0,0,0,1,0,0,0,36,0,2,0,18,0,24,0,24,0,46,0,3,0,0,0,54,0,0,0,1,0,1,2,170,0,2,0,3, + 2,170,2,170,0,1,19,84,19,86,0,2,19,88,19,88,0,2,0,1,0,0,0,1,0,0,0,1,0,4,0,1,0,2,0,1,0,0,0,1, + 0,0,0,36,0,2,0,18,0,24,0,24,0,40,0,3,0,0,0,48,0,0,0,1,0,1,2,171,0,2,0,2,2,171,2,171,0,1,19,89, + 19,92,0,2,0,1,0,0,0,1,0,0,0,1,0,4,0,1,0,2,0,1,0,0,0,1,0,0,0,36,0,1,0,30,0,2,0,10,0,20, + 0,1,0,4,19,177,0,2,5,20,0,1,0,4,19,179,0,2,5,23,0,1,0,2,5,47,5,67,0,1,0,6,15,223,0,1,0,1,3,197, + 0,1,0,6,21,221,0,1,0,1,1,12,0,2,0,66,0,30,23,32,23,35,23,38,23,41,23,44,23,47,23,50,23,53,23,56,23,59,23,62, + 23,65,23,68,23,71,23,74,23,77,23,80,23,83,23,86,23,89,23,92,23,95,23,98,23,101,23,104,23,107,23,110,23,113,23,116,23,119,0,2, + 0,1,5,241,6,14,0,0,0,2,0,230,0,112,20,102,20,104,20,106,20,108,20,110,20,114,20,116,20,120,20,122,20,126,20,130,20,134,20,138, + 20,142,20,144,20,146,20,148,20,150,20,154,20,158,20,162,20,166,20,170,20,174,20,178,20,182,20,186,20,190,20,194,20,198,20,202,20,206,20,210, + 20,212,20,214,22,202,22,208,19,244,19,236,19,224,22,214,22,217,19,228,19,240,19,232,22,220,22,223,20,4,20,0,22,226,20,8,20,12,20,22, + 23,135,23,136,23,137,20,18,20,16,20,20,23,138,23,139,20,26,23,11,23,140,23,141,23,3,23,142,23,143,20,24,23,144,23,145,23,148,23,151, + 23,154,23,157,23,160,23,163,22,205,23,166,23,169,19,248,23,172,19,252,23,175,23,178,20,28,23,181,23,184,23,187,20,54,23,190,20,32,23,193, + 20,40,23,196,20,36,23,199,23,5,23,202,23,205,23,208,23,211,20,44,20,46,23,214,23,217,20,50,22,229,20,58,20,62,23,8,23,13,0,2, + 0,4,5,79,5,103,0,0,5,105,5,114,0,25,5,142,5,143,0,35,5,146,5,220,0,37,0,2,0,66,0,30,23,33,23,36,23,39,23,42, + 23,45,23,48,23,51,23,54,23,57,23,60,23,63,23,66,23,69,23,72,23,75,23,78,23,81,23,84,23,87,23,90,23,93,23,96,23,99,23,102, + 23,105,23,108,23,111,23,114,23,117,23,120,0,2,0,1,5,241,6,14,0,0,0,2,0,168,0,81,20,112,20,118,20,124,20,128,20,132,20,136, + 20,140,20,152,20,156,20,160,20,164,20,168,20,172,20,176,20,180,20,184,20,188,20,192,20,196,20,200,20,204,20,208,20,60,20,216,22,204,22,210, + 19,246,19,238,19,226,22,216,22,219,19,230,19,242,19,234,22,222,22,225,20,6,20,2,22,228,20,10,20,14,23,147,23,150,23,153,23,156,23,159, + 23,162,23,165,22,207,23,168,23,171,19,250,23,174,19,254,23,177,23,180,20,30,23,183,23,186,23,189,20,56,23,192,20,34,23,195,20,42,23,198, + 20,38,23,201,23,7,23,204,23,207,23,210,23,213,22,212,20,48,23,216,23,219,20,52,22,231,20,64,23,10,0,2,0,10,5,83,5,83,0,0, + 5,85,5,85,0,1,5,87,5,91,0,2,5,96,5,103,0,7,5,105,5,111,0,15,5,113,5,114,0,22,5,142,5,143,0,24,5,146,5,160, + 0,26,5,179,5,216,0,41,5,218,5,219,0,79,0,2,0,66,0,30,23,34,23,37,23,40,23,43,23,46,23,49,23,52,23,55,23,58,23,61, + 23,64,23,67,23,70,23,73,23,76,23,79,23,82,23,85,23,88,23,91,23,94,23,97,23,100,23,103,23,106,23,109,23,112,23,115,23,118,23,121, + 0,2,0,1,5,241,6,14,0,0,0,2,0,168,0,81,20,111,20,117,20,123,20,127,20,131,20,135,20,139,20,151,20,155,20,159,20,163,20,167, + 20,171,20,175,20,179,20,183,20,187,20,191,20,195,20,199,20,203,20,207,20,59,20,215,22,203,22,209,19,245,19,237,19,225,22,215,22,218,19,229, + 19,241,19,233,22,221,22,224,20,5,20,1,22,227,20,9,20,13,23,146,23,149,23,152,23,155,23,158,23,161,23,164,22,206,23,167,23,170,19,249, + 23,173,19,253,23,176,23,179,20,29,23,182,23,185,23,188,20,55,23,191,20,33,23,194,20,41,23,197,20,37,23,200,23,6,23,203,23,206,23,209, + 23,212,22,211,20,47,23,215,23,218,20,51,22,230,20,63,23,9,0,2,0,10,5,83,5,83,0,0,5,85,5,85,0,1,5,87,5,91,0,2, + 5,96,5,103,0,7,5,105,5,111,0,15,5,113,5,114,0,22,5,142,5,143,0,24,5,146,5,160,0,26,5,179,5,216,0,41,5,218,5,219, + 0,79,0,1,0,50,0,3,0,12,0,22,0,32,0,1,0,4,23,26,0,2,5,121,0,1,0,4,23,29,0,2,5,121,0,2,0,6,0,12, + 23,29,0,2,5,120,23,26,0,2,5,117,0,1,0,3,5,117,5,120,5,121,0,1,0,126,0,6,0,18,0,28,0,38,0,56,0,74,0,108, + 0,1,0,4,23,24,0,2,5,121,0,1,0,4,23,25,0,2,5,121,0,2,0,6,0,12,23,30,0,2,5,124,23,27,0,2,5,121,0,2, + 0,6,0,12,23,31,0,2,5,124,23,28,0,2,5,121,0,4,0,10,0,16,0,22,0,28,23,28,0,2,5,119,23,27,0,2,5,118,23,25, + 0,2,5,116,23,24,0,2,5,115,0,2,0,6,0,12,23,31,0,2,5,119,23,30,0,2,5,118,0,1,0,6,5,115,5,116,5,118,5,119, + 5,121,5,124,0,1,0,30,0,2,0,10,0,20,0,1,0,4,20,223,0,2,20,114,0,1,0,4,20,224,0,2,20,114,0,1,0,2,20,195, + 20,196,0,1,0,62,0,2,0,10,0,36,0,3,0,8,0,14,0,20,20,221,0,2,20,108,20,219,0,2,20,104,20,217,0,2,20,102,0,3, + 0,8,0,14,0,20,20,222,0,2,20,108,20,220,0,2,20,104,20,218,0,2,20,102,0,1,0,2,20,195,20,196,0,1,0,54,0,1,0,8, + 0,5,0,12,0,20,0,28,0,34,0,40,19,169,0,3,0,73,0,79,19,168,0,3,0,73,0,76,19,167,0,2,0,79,19,166,0,2,0,76, + 19,165,0,2,0,73,0,1,0,1,0,73,0,1,0,178,0,5,0,16,0,82,0,108,0,158,0,168,0,8,0,18,0,24,0,30,0,36,0,42, + 0,48,0,54,0,60,20,98,0,2,5,122,20,96,0,2,5,121,20,94,0,2,5,120,20,92,0,2,5,119,20,90,0,2,5,118,20,89,0,2, + 5,117,20,87,0,2,5,116,20,85,0,2,5,115,0,3,0,8,0,14,0,20,5,82,0,2,5,125,5,80,0,2,5,124,5,79,0,2,5,123, + 0,6,0,14,0,20,0,26,0,32,0,38,0,44,20,99,0,2,5,122,20,97,0,2,5,121,20,95,0,2,5,120,20,93,0,2,5,119,20,91, + 0,2,5,118,20,86,0,2,5,115,0,1,0,4,5,81,0,2,5,124,0,1,0,4,5,83,0,2,5,124,0,1,0,5,0,3,5,84,5,104, + 5,112,5,114,0,1,0,66,0,3,0,12,0,22,0,56,0,1,0,4,5,13,0,2,5,8,0,4,0,10,0,16,0,22,0,28,19,176,0,2, + 4,243,19,174,0,2,4,241,19,173,0,2,4,235,19,172,0,2,4,252,0,1,0,4,19,175,0,2,4,252,0,1,0,3,4,235,4,250,5,4, + 0,1,0,18,0,1,0,8,0,1,0,4,19,171,0,2,0,87,0,1,0,1,0,86,0,1,0,18,0,1,0,8,0,1,0,4,19,170,0,2, + 0,87,0,1,0,1,1,65,0,1,0,136,0,8,0,22,0,40,0,58,0,70,0,80,0,90,0,102,0,114,0,2,0,6,0,12,11,39,0,2, + 0,34,11,26,0,2,0,4,0,2,0,6,0,12,11,38,0,2,0,4,11,37,0,2,0,34,0,1,0,4,11,205,0,3,0,36,0,59,0,1, + 0,4,11,123,0,2,0,86,0,1,0,4,11,178,0,2,0,48,0,1,0,4,11,179,0,3,0,40,0,47,0,1,0,4,11,147,0,3,0,18, + 0,70,0,2,0,6,0,14,11,153,0,3,0,18,0,88,11,152,0,3,0,18,0,82,0,1,0,8,0,4,0,34,0,41,0,53,0,54,0,55, + 0,68,0,70,0,1,0,6,14,147,0,1,0,1,5,31,0,1,0,6,14,147,0,1,0,1,5,31,0,2,0,20,0,7,3,103,3,102,3,104, + 3,100,3,101,3,106,3,105,0,1,0,7,3,35,3,57,3,63,3,70,3,76,3,84,3,90,0,2,0,20,0,7,3,103,3,102,3,104,3,100, + 3,101,3,106,3,105,0,1,0,7,3,35,3,57,3,63,3,70,3,76,3,84,3,90,0,2,0,16,0,5,23,22,23,2,2,19,23,12,22,233, + 0,1,0,5,0,44,0,45,0,68,0,79,1,12,0,1,0,42,0,6,0,18,0,22,0,26,0,30,0,34,0,38,0,1,23,22,0,1,23,2, + 0,1,2,19,0,1,23,12,0,1,23,134,0,1,22,233,0,1,0,6,0,44,0,45,0,68,0,79,0,92,1,12,0,2,0,30,0,12,22,188, + 22,186,22,189,22,187,22,192,22,193,22,185,23,122,22,194,22,190,22,195,22,191,0,1,0,12,2,177,2,178,2,179,2,180,2,183,2,184,2,185, + 2,187,2,188,2,189,2,192,2,194,0,2,0,32,0,13,0,243,1,249,23,16,2,33,22,234,22,235,1,249,0,243,1,249,23,19,23,20,23,17, + 23,18,0,1,0,13,0,76,0,77,0,241,2,11,2,42,2,95,3,135,3,234,3,236,9,38,9,196,11,218,11,219,0,1,0,6,16,158,0,2, + 0,1,2,167,2,171,0,0,0,1,0,6,16,163,0,2,0,1,2,167,2,171,0,0,0,1,0,6,16,168,0,2,0,1,2,167,2,171,0,0, + 0,1,0,6,16,173,0,2,0,1,2,167,2,171,0,0,0,1,0,6,16,178,0,2,0,1,2,167,2,171,0,0,0,2,0,16,0,5,19,94, + 19,94,19,94,19,94,19,94,0,2,0,1,2,167,2,171,0,0,0,1,0,6,14,124,0,1,0,1,5,56,0,1,0,18,0,1,0,8,0,1, + 0,4,19,222,0,2,5,50,0,1,0,1,5,38,0,0,0,1,4,14,1,144,0,5,0,0,5,51,5,153,0,0,1,30,5,51,5,153,0,0, + 3,215,0,102,2,18,0,0,2,11,6,3,3,8,4,2,2,4,231,0,110,255,210,0,253,255,10,36,96,41,4,0,32,12,80,102,69,100,0,64, + 0,32,255,255,6,20,254,20,1,154,7,109,1,227,96,0,1,255,223,255,0,0,0,0,0,0,0,5,0,0,0,3,0,0,0,44,0,0,0,4, + 0,0,7,188,0,1,0,0,0,0,19,252,0,3,0,1,0,0,0,44,0,3,0,10,0,0,7,188,0,4,7,144,0,0,1,224,1,0,0,7, + 0,224,0,0,0,126,2,233,2,238,2,243,2,247,3,79,3,83,3,88,3,90,3,98,3,119,3,126,3,138,3,140,3,161,5,37,5,86,5,95, + 5,135,5,138,5,195,5,199,5,234,5,244,6,7,6,10,6,12,6,21,6,27,6,31,6,58,6,85,6,87,6,90,6,112,6,116,6,191,6,198, + 6,204,6,206,6,213,6,249,7,231,7,245,7,250,14,63,14,130,14,132,14,136,14,138,14,141,14,151,14,159,14,163,14,165,14,167,14,171,14,185, + 14,189,14,196,14,198,14,205,14,217,14,221,16,197,16,252,20,7,20,27,20,53,20,74,20,82,20,189,20,234,21,7,21,62,21,80,21,106,21,133, + 21,150,21,175,21,222,21,225,22,71,22,118,22,156,29,20,29,35,29,46,29,91,29,106,29,120,29,123,29,125,29,133,29,191,29,201,30,251,31,21, + 31,29,31,69,31,77,31,87,31,89,31,91,31,93,31,125,31,180,31,196,31,211,31,219,31,239,31,244,31,254,32,100,32,113,32,142,32,156,32,181, + 32,186,32,209,32,215,32,220,32,225,33,9,33,73,33,75,33,78,33,133,33,137,35,17,35,25,35,33,35,40,35,44,35,117,35,122,35,125,35,135, + 35,148,35,174,35,207,35,227,35,229,35,232,36,35,36,105,38,156,38,184,38,195,38,226,39,4,39,9,39,39,39,75,39,77,39,82,39,86,39,94, + 39,148,39,175,39,190,39,198,39,224,39,235,40,255,41,7,41,11,41,65,41,132,41,213,41,235,41,251,42,2,42,28,42,47,42,107,42,160,42,186, + 42,250,43,26,43,36,43,84,44,119,44,127,45,37,45,101,45,111,46,24,46,30,46,37,46,46,77,255,164,255,166,71,166,77,166,81,166,87,166,110, + 166,141,166,149,167,22,167,31,167,43,167,65,167,75,167,83,167,87,167,103,167,131,167,142,167,145,167,170,167,255,239,25,240,3,244,38,244,65,246,197, + 251,6,251,23,251,54,251,60,251,62,251,65,251,68,251,79,251,163,251,173,251,214,251,218,251,233,251,255,254,15,254,35,254,116,254,252,254,255,255,253, + 255,255,0,0,0,0,0,32,0,160,2,236,2,243,2,247,3,0,3,81,3,87,3,90,3,92,3,112,3,122,3,132,3,140,3,142,3,163,5,49, + 5,89,5,97,5,137,5,176,5,198,5,208,5,240,6,6,6,9,6,12,6,21,6,27,6,31,6,33,6,64,6,87,6,90,6,96,6,116,6,121, + 6,198,6,204,6,206,6,213,6,240,7,192,7,235,7,248,14,63,14,129,14,132,14,135,14,138,14,141,14,148,14,153,14,161,14,165,14,167,14,170, + 14,173,14,187,14,192,14,198,14,200,14,208,14,220,16,160,16,208,20,1,20,9,20,29,20,55,20,76,20,84,20,192,20,236,21,16,21,64,21,82, + 21,116,21,138,21,160,21,222,21,225,22,70,22,110,22,128,29,0,29,22,29,38,29,48,29,93,29,119,29,123,29,125,29,133,29,155,29,196,30,0, + 31,0,31,24,31,32,31,72,31,80,31,89,31,91,31,93,31,95,31,128,31,182,31,198,31,214,31,221,31,242,31,246,32,0,32,106,32,116,32,144, + 32,160,32,184,32,208,32,214,32,219,32,225,33,0,33,11,33,75,33,78,33,80,33,137,33,144,35,24,35,28,35,36,35,43,35,115,35,122,35,125, + 35,135,35,148,35,155,35,206,35,227,35,229,35,232,36,34,36,96,37,0,38,160,38,192,38,226,39,1,39,6,39,12,39,41,39,77,39,79,39,86, + 39,88,39,97,39,152,39,177,39,197,39,224,39,230,39,240,41,6,41,10,41,64,41,131,41,206,41,235,41,250,42,0,42,12,42,47,42,106,42,125, + 42,174,42,249,43,0,43,31,43,83,44,96,44,121,45,0,45,48,45,111,46,24,46,30,46,34,46,46,77,192,164,208,166,68,166,76,166,80,166,84, + 166,98,166,138,166,148,167,8,167,27,167,34,167,48,167,70,167,78,167,86,167,100,167,128,167,137,167,144,167,160,167,250,239,0,240,0,244,0,244,40, + 246,197,251,0,251,19,251,29,251,56,251,62,251,64,251,67,251,70,251,82,251,170,251,211,251,217,251,232,251,252,254,0,254,32,254,112,254,118,254,255, + 255,249,255,255,0,0,255,227,255,194,255,192,255,188,255,185,255,177,255,176,255,173,255,172,255,171,255,158,255,156,255,151,255,150,255,149,255,148,255,137, + 255,135,255,134,255,133,255,96,255,94,255,86,255,81,255,64,255,63,255,62,255,54,255,49,255,46,255,45,255,40,255,39,255,37,255,32,255,29,255,25, + 255,19,255,14,255,13,255,7,254,237,254,39,254,36,254,34,247,222,247,157,247,156,247,154,247,153,247,151,247,145,247,144,247,143,247,142,247,141,247,139, + 247,138,247,137,247,135,247,134,247,133,247,131,247,129,245,191,245,181,242,177,242,176,242,175,242,174,242,173,242,172,242,170,242,169,242,161,242,160,242,159, + 242,150,242,146,242,137,242,91,242,89,241,245,241,207,241,198,235,99,235,98,235,96,235,95,235,94,235,82,235,80,235,79,235,72,235,51,235,47,234,249, + 234,245,234,243,234,241,234,239,234,237,234,236,234,235,234,234,234,233,234,231,234,230,234,229,234,227,234,226,234,224,234,223,234,222,234,217,234,215,234,214, + 234,211,234,209,234,188,234,184,234,181,234,177,234,147,234,146,234,145,234,143,234,142,234,139,234,133,234,127,234,125,234,123,234,121,234,51,234,47,234,45, + 234,36,234,24,234,18,233,243,233,224,233,223,233,221,233,164,233,104,232,210,232,207,232,200,232,170,232,140,232,139,232,137,232,136,232,135,232,134,232,131, + 232,130,232,128,232,125,232,124,232,118,232,93,232,88,232,84,232,78,232,76,232,24,231,215,231,142,231,121,231,107,231,103,231,94,231,76,231,18,231,1, + 230,244,230,182,230,177,230,173,230,127,229,116,229,115,228,243,228,233,228,224,228,56,228,51,228,48,228,40,196,151,109,199,108,131,108,127,108,125,108,123, + 108,113,108,86,108,80,107,222,107,218,107,216,107,212,107,208,107,206,107,204,107,192,107,168,107,163,107,162,107,148,107,69,36,69,35,95,31,99,31,98, + 28,223,24,165,24,153,24,148,24,147,24,146,24,145,24,144,24,143,24,141,24,135,24,98,24,96,24,83,24,65,22,65,22,49,21,229,21,228,21,226, + 20,233,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,12,0,0,0,0,12,64,0,0,0,0,0,0,1,4,0,0,0,32,0,0,0,126,0,0,0,3,0,0,0,160,0,0,2,233, + 0,0,0,98,0,0,2,236,0,0,2,238,0,0,2,172,0,0,2,243,0,0,2,243,0,0,2,175,0,0,2,247,0,0,2,247,0,0,2,176, + 0,0,3,0,0,0,3,79,0,0,2,177,0,0,3,81,0,0,3,83,0,0,3,1,0,0,3,87,0,0,3,88,0,0,3,4,0,0,3,90, + 0,0,3,90,0,0,3,6,0,0,3,92,0,0,3,98,0,0,3,7,0,0,3,112,0,0,3,119,0,0,3,14,0,0,3,122,0,0,3,126, + 0,0,3,22,0,0,3,132,0,0,3,138,0,0,3,27,0,0,3,140,0,0,3,140,0,0,3,34,0,0,3,142,0,0,3,161,0,0,3,35, + 0,0,3,163,0,0,5,37,0,0,3,55,0,0,5,49,0,0,5,86,0,0,4,186,0,0,5,89,0,0,5,95,0,0,4,224,0,0,5,97, + 0,0,5,135,0,0,4,231,0,0,5,137,0,0,5,138,0,0,5,14,0,0,5,176,0,0,5,195,0,0,5,16,0,0,5,198,0,0,5,199, + 0,0,5,36,0,0,5,208,0,0,5,234,0,0,5,38,0,0,5,240,0,0,5,244,0,0,5,65,0,0,6,6,0,0,6,7,0,0,5,70, + 0,0,6,9,0,0,6,10,0,0,5,72,0,0,6,12,0,0,6,12,0,0,5,74,0,0,6,21,0,0,6,21,0,0,5,75,0,0,6,27, + 0,0,6,27,0,0,5,76,0,0,6,31,0,0,6,31,0,0,5,77,0,0,6,33,0,0,6,58,0,0,5,78,0,0,6,64,0,0,6,85, + 0,0,5,104,0,0,6,87,0,0,6,87,0,0,5,126,0,0,6,90,0,0,6,90,0,0,5,127,0,0,6,96,0,0,6,112,0,0,5,128, + 0,0,6,116,0,0,6,116,0,0,5,145,0,0,6,121,0,0,6,191,0,0,5,146,0,0,6,198,0,0,6,198,0,0,5,217,0,0,6,204, + 0,0,6,204,0,0,5,218,0,0,6,206,0,0,6,206,0,0,5,219,0,0,6,213,0,0,6,213,0,0,5,220,0,0,6,240,0,0,6,249, + 0,0,5,221,0,0,7,192,0,0,7,231,0,0,5,231,0,0,7,235,0,0,7,245,0,0,6,15,0,0,7,248,0,0,7,250,0,0,6,26, + 0,0,14,63,0,0,14,63,0,0,6,29,0,0,14,129,0,0,14,130,0,0,6,30,0,0,14,132,0,0,14,132,0,0,6,32,0,0,14,135, + 0,0,14,136,0,0,6,33,0,0,14,138,0,0,14,138,0,0,6,35,0,0,14,141,0,0,14,141,0,0,6,36,0,0,14,148,0,0,14,151, + 0,0,6,37,0,0,14,153,0,0,14,159,0,0,6,41,0,0,14,161,0,0,14,163,0,0,6,48,0,0,14,165,0,0,14,165,0,0,6,51, + 0,0,14,167,0,0,14,167,0,0,6,52,0,0,14,170,0,0,14,171,0,0,6,53,0,0,14,173,0,0,14,185,0,0,6,55,0,0,14,187, + 0,0,14,189,0,0,6,68,0,0,14,192,0,0,14,196,0,0,6,71,0,0,14,198,0,0,14,198,0,0,6,76,0,0,14,200,0,0,14,205, + 0,0,6,77,0,0,14,208,0,0,14,217,0,0,6,83,0,0,14,220,0,0,14,221,0,0,6,93,0,0,16,160,0,0,16,197,0,0,6,95, + 0,0,16,208,0,0,16,252,0,0,6,133,0,0,20,1,0,0,20,7,0,0,6,178,0,0,20,9,0,0,20,27,0,0,6,185,0,0,20,29, + 0,0,20,53,0,0,6,204,0,0,20,55,0,0,20,74,0,0,6,229,0,0,20,76,0,0,20,82,0,0,6,249,0,0,20,84,0,0,20,189, + 0,0,7,0,0,0,20,192,0,0,20,234,0,0,7,106,0,0,20,236,0,0,21,7,0,0,7,149,0,0,21,16,0,0,21,62,0,0,7,177, + 0,0,21,64,0,0,21,80,0,0,7,224,0,0,21,82,0,0,21,106,0,0,7,241,0,0,21,116,0,0,21,133,0,0,8,10,0,0,21,138, + 0,0,21,150,0,0,8,28,0,0,21,160,0,0,21,175,0,0,8,41,0,0,21,222,0,0,21,222,0,0,8,57,0,0,21,225,0,0,21,225, + 0,0,8,58,0,0,22,70,0,0,22,71,0,0,8,59,0,0,22,110,0,0,22,118,0,0,8,61,0,0,22,128,0,0,22,156,0,0,8,70, + 0,0,29,0,0,0,29,20,0,0,8,99,0,0,29,22,0,0,29,35,0,0,8,120,0,0,29,38,0,0,29,46,0,0,8,134,0,0,29,48, + 0,0,29,91,0,0,8,143,0,0,29,93,0,0,29,106,0,0,8,187,0,0,29,119,0,0,29,120,0,0,8,201,0,0,29,123,0,0,29,123, + 0,0,8,203,0,0,29,125,0,0,29,125,0,0,8,204,0,0,29,133,0,0,29,133,0,0,8,205,0,0,29,155,0,0,29,191,0,0,8,206, + 0,0,29,196,0,0,29,201,0,0,8,243,0,0,30,0,0,0,30,251,0,0,8,249,0,0,31,0,0,0,31,21,0,0,9,245,0,0,31,24, + 0,0,31,29,0,0,10,11,0,0,31,32,0,0,31,69,0,0,10,17,0,0,31,72,0,0,31,77,0,0,10,55,0,0,31,80,0,0,31,87, + 0,0,10,61,0,0,31,89,0,0,31,89,0,0,10,69,0,0,31,91,0,0,31,91,0,0,10,70,0,0,31,93,0,0,31,93,0,0,10,71, + 0,0,31,95,0,0,31,125,0,0,10,72,0,0,31,128,0,0,31,180,0,0,10,103,0,0,31,182,0,0,31,196,0,0,10,156,0,0,31,198, + 0,0,31,211,0,0,10,171,0,0,31,214,0,0,31,219,0,0,10,185,0,0,31,221,0,0,31,239,0,0,10,191,0,0,31,242,0,0,31,244, + 0,0,10,210,0,0,31,246,0,0,31,254,0,0,10,213,0,0,32,0,0,0,32,100,0,0,10,222,0,0,32,106,0,0,32,113,0,0,11,67, + 0,0,32,116,0,0,32,142,0,0,11,75,0,0,32,144,0,0,32,156,0,0,11,102,0,0,32,160,0,0,32,181,0,0,11,115,0,0,32,184, + 0,0,32,186,0,0,11,137,0,0,32,208,0,0,32,209,0,0,11,140,0,0,32,214,0,0,32,215,0,0,11,142,0,0,32,219,0,0,32,220, + 0,0,11,144,0,0,32,225,0,0,32,225,0,0,11,146,0,0,33,0,0,0,33,9,0,0,11,147,0,0,33,11,0,0,33,73,0,0,11,157, + 0,0,33,75,0,0,33,75,0,0,11,220,0,0,33,78,0,0,33,78,0,0,11,221,0,0,33,80,0,0,33,133,0,0,11,222,0,0,33,137, + 0,0,33,137,0,0,12,20,0,0,33,144,0,0,35,17,0,0,12,21,0,0,35,24,0,0,35,25,0,0,13,151,0,0,35,28,0,0,35,33, + 0,0,13,153,0,0,35,36,0,0,35,40,0,0,13,159,0,0,35,43,0,0,35,44,0,0,13,164,0,0,35,115,0,0,35,117,0,0,13,166, + 0,0,35,122,0,0,35,122,0,0,13,169,0,0,35,125,0,0,35,125,0,0,13,170,0,0,35,135,0,0,35,135,0,0,13,171,0,0,35,148, + 0,0,35,148,0,0,13,172,0,0,35,155,0,0,35,174,0,0,13,173,0,0,35,206,0,0,35,207,0,0,13,193,0,0,35,227,0,0,35,227, + 0,0,13,195,0,0,35,229,0,0,35,229,0,0,13,196,0,0,35,232,0,0,35,232,0,0,13,197,0,0,36,34,0,0,36,35,0,0,13,198, + 0,0,36,96,0,0,36,105,0,0,13,200,0,0,37,0,0,0,38,156,0,0,13,210,0,0,38,160,0,0,38,184,0,0,15,111,0,0,38,192, + 0,0,38,195,0,0,15,136,0,0,38,226,0,0,38,226,0,0,15,140,0,0,39,1,0,0,39,4,0,0,15,141,0,0,39,6,0,0,39,9, + 0,0,15,145,0,0,39,12,0,0,39,39,0,0,15,149,0,0,39,41,0,0,39,75,0,0,15,177,0,0,39,77,0,0,39,77,0,0,15,212, + 0,0,39,79,0,0,39,82,0,0,15,213,0,0,39,86,0,0,39,86,0,0,15,217,0,0,39,88,0,0,39,94,0,0,15,218,0,0,39,97, + 0,0,39,148,0,0,15,225,0,0,39,152,0,0,39,175,0,0,16,21,0,0,39,177,0,0,39,190,0,0,16,45,0,0,39,197,0,0,39,198, + 0,0,16,59,0,0,39,224,0,0,39,224,0,0,16,61,0,0,39,230,0,0,39,235,0,0,16,62,0,0,39,240,0,0,40,255,0,0,16,68, + 0,0,41,6,0,0,41,7,0,0,17,84,0,0,41,10,0,0,41,11,0,0,17,86,0,0,41,64,0,0,41,65,0,0,17,88,0,0,41,131, + 0,0,41,132,0,0,17,90,0,0,41,206,0,0,41,213,0,0,17,92,0,0,41,235,0,0,41,235,0,0,17,100,0,0,41,250,0,0,41,251, + 0,0,17,101,0,0,42,0,0,0,42,2,0,0,17,103,0,0,42,12,0,0,42,28,0,0,17,106,0,0,42,47,0,0,42,47,0,0,17,123, + 0,0,42,106,0,0,42,107,0,0,17,124,0,0,42,125,0,0,42,160,0,0,17,126,0,0,42,174,0,0,42,186,0,0,17,162,0,0,42,249, + 0,0,42,250,0,0,17,175,0,0,43,0,0,0,43,26,0,0,17,177,0,0,43,31,0,0,43,36,0,0,17,204,0,0,43,83,0,0,43,84, + 0,0,17,210,0,0,44,96,0,0,44,119,0,0,17,212,0,0,44,121,0,0,44,127,0,0,17,236,0,0,45,0,0,0,45,37,0,0,17,243, + 0,0,45,48,0,0,45,101,0,0,18,25,0,0,45,111,0,0,45,111,0,0,18,79,0,0,46,24,0,0,46,24,0,0,18,80,0,0,46,30, + 0,0,46,30,0,0,18,81,0,0,46,34,0,0,46,37,0,0,18,82,0,0,46,46,0,0,46,46,0,0,18,86,0,0,77,192,0,0,77,255, + 0,0,18,87,0,0,164,208,0,0,164,255,0,0,18,151,0,0,166,68,0,0,166,71,0,0,18,199,0,0,166,76,0,0,166,77,0,0,18,203, + 0,0,166,80,0,0,166,81,0,0,18,205,0,0,166,84,0,0,166,87,0,0,18,207,0,0,166,98,0,0,166,110,0,0,18,211,0,0,166,138, + 0,0,166,141,0,0,18,224,0,0,166,148,0,0,166,149,0,0,18,228,0,0,167,8,0,0,167,22,0,0,18,230,0,0,167,27,0,0,167,31, + 0,0,18,245,0,0,167,34,0,0,167,43,0,0,18,250,0,0,167,48,0,0,167,65,0,0,19,4,0,0,167,70,0,0,167,75,0,0,19,22, + 0,0,167,78,0,0,167,83,0,0,19,28,0,0,167,86,0,0,167,87,0,0,19,34,0,0,167,100,0,0,167,103,0,0,19,36,0,0,167,128, + 0,0,167,131,0,0,19,40,0,0,167,137,0,0,167,142,0,0,19,44,0,0,167,144,0,0,167,145,0,0,19,50,0,0,167,160,0,0,167,170, + 0,0,19,52,0,0,167,250,0,0,167,255,0,0,19,63,0,0,239,0,0,0,239,25,0,0,19,69,0,0,240,0,0,0,240,3,0,0,19,95, + 0,0,244,0,0,0,244,38,0,0,19,99,0,0,244,40,0,0,244,65,0,0,19,138,0,0,246,197,0,0,246,197,0,0,19,164,0,0,251,0, + 0,0,251,6,0,0,19,165,0,0,251,19,0,0,251,23,0,0,19,172,0,0,251,29,0,0,251,54,0,0,19,177,0,0,251,56,0,0,251,60, + 0,0,19,203,0,0,251,62,0,0,251,62,0,0,19,208,0,0,251,64,0,0,251,65,0,0,19,209,0,0,251,67,0,0,251,68,0,0,19,211, + 0,0,251,70,0,0,251,79,0,0,19,213,0,0,251,82,0,0,251,163,0,0,19,223,0,0,251,170,0,0,251,173,0,0,20,49,0,0,251,211, + 0,0,251,214,0,0,20,53,0,0,251,217,0,0,251,218,0,0,20,57,0,0,251,232,0,0,251,233,0,0,20,59,0,0,251,252,0,0,251,255, + 0,0,20,61,0,0,254,0,0,0,254,15,0,0,20,65,0,0,254,32,0,0,254,35,0,0,20,81,0,0,254,112,0,0,254,116,0,0,20,85, + 0,0,254,118,0,0,254,252,0,0,20,90,0,0,254,255,0,0,254,255,0,0,20,225,0,0,255,249,0,0,255,253,0,0,20,226,0,1,3,0, + 0,1,3,30,0,0,20,231,0,1,3,32,0,1,3,35,0,0,21,6,0,1,211,0,0,1,211,86,0,0,21,10,0,1,213,56,0,1,213,57, + 0,0,21,97,0,1,213,59,0,1,213,62,0,0,21,99,0,1,213,64,0,1,213,68,0,0,21,103,0,1,213,70,0,1,213,70,0,0,21,108, + 0,1,213,74,0,1,213,80,0,0,21,109,0,1,213,82,0,1,213,107,0,0,21,116,0,1,213,160,0,1,213,211,0,0,21,142,0,1,215,216, + 0,1,215,235,0,0,21,194,0,1,240,48,0,1,240,147,0,0,21,214,0,1,240,160,0,1,240,174,0,0,22,58,0,1,240,177,0,1,240,190, + 0,0,22,73,0,1,240,193,0,1,240,207,0,0,22,87,0,1,240,209,0,1,240,223,0,0,22,102,0,1,244,45,0,1,244,46,0,0,22,117, + 0,1,244,49,0,1,244,49,0,0,22,119,0,1,244,53,0,1,244,53,0,0,22,120,0,1,246,0,0,1,246,35,0,0,22,121,0,1,246,37, + 0,1,246,43,0,0,22,157,0,1,246,45,0,1,246,64,0,0,22,164,0,6,2,10,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,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,0,0,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,0,0,0,134,0,135,0,137,0,139,0,147,0,152,0,158,0,163,0,162,0,164,0,166,0,165,0,167,0,169,0,171,0,170,0,172, + 0,173,0,175,0,174,0,176,0,177,0,179,0,181,0,180,0,182,0,184,0,183,0,188,0,187,0,189,0,190,10,254,0,114,0,100,0,101,0,105, + 11,0,0,120,0,161,0,112,0,107,11,180,0,118,0,106,12,229,0,136,0,154,12,163,0,115,12,233,12,234,0,103,0,119,12,135,12,150,12,148, + 3,84,12,176,0,108,0,124,3,61,0,168,0,186,0,129,0,99,0,110,12,159,1,84,12,205,12,139,0,109,0,125,11,4,0,98,0,130,0,133, + 0,151,1,20,1,21,10,241,10,242,10,250,10,251,10,246,10,247,0,185,14,156,0,193,1,58,11,34,11,127,11,23,11,24,19,166,19,167,10,255, + 0,121,10,248,10,252,11,14,0,132,0,140,0,131,0,141,0,138,0,143,0,144,0,145,0,142,0,149,0,150,0,0,0,148,0,156,0,157,0,155, + 0,243,2,136,2,158,0,113,2,154,2,155,2,156,0,122,2,159,2,157,2,137,0,0,1,53,0,184,0,203,0,203,0,193,0,170,0,156,1,166, + 0,184,0,102,0,0,0,113,0,203,0,160,2,178,0,133,0,117,0,184,0,195,1,203,1,137,2,45,0,203,0,166,0,240,0,211,0,170,0,135, + 0,203,3,170,4,0,1,74,0,51,0,203,0,0,0,217,5,2,0,244,1,84,0,180,0,156,1,57,1,20,1,57,7,6,4,0,4,78,4,180, + 4,82,4,184,4,231,4,205,0,55,4,115,4,205,4,96,4,115,1,51,3,162,5,86,5,166,5,86,5,57,3,197,2,18,0,201,0,31,0,184, + 1,223,0,115,0,186,3,233,3,51,3,188,4,68,4,14,0,223,3,205,3,170,0,229,3,170,4,4,0,0,0,203,0,143,0,164,0,123,0,184, + 0,20,1,111,0,127,2,123,2,82,0,143,0,199,5,205,0,154,0,154,0,111,0,203,0,205,1,158,1,211,0,240,0,186,1,131,0,213,0,152, + 3,4,2,72,0,158,1,213,0,193,0,203,0,246,0,131,3,84,2,127,0,0,3,51,2,102,0,211,0,199,0,164,0,205,0,143,0,154,0,115, + 4,0,5,213,1,10,0,254,2,43,0,164,0,180,0,156,0,0,0,98,0,156,0,0,0,29,3,45,5,213,5,213,5,213,5,240,0,127,0,123, + 0,84,0,164,6,184,6,20,7,35,1,211,0,184,0,203,0,166,1,195,1,236,6,147,0,160,0,211,3,92,3,113,3,219,1,133,4,35,4,168, + 4,72,0,143,1,57,1,20,1,57,3,96,0,143,5,213,1,154,6,20,7,35,6,102,1,121,4,96,4,96,4,96,4,123,0,156,0,0,2,119, + 4,96,1,170,0,233,4,96,7,98,0,123,0,197,0,127,2,123,0,0,0,180,2,82,5,205,0,102,0,188,0,102,0,119,6,16,0,205,1,59, + 1,133,3,137,0,143,0,123,0,0,0,29,0,205,7,74,4,47,0,156,0,156,0,0,7,125,0,111,0,0,0,111,3,53,0,106,0,111,0,123, + 0,174,0,178,0,45,3,150,0,143,2,123,0,246,0,131,3,84,6,55,5,246,0,143,0,156,4,225,2,102,0,143,1,141,2,246,0,205,3,68, + 0,41,0,102,4,238,0,115,0,0,20,0,0,150,0,0,183,7,6,5,4,3,2,1,0,44,32,16,176,2,37,73,100,176,64,81,88,32,200,89, + 33,45,44,176,2,37,73,100,176,64,81,88,32,200,89,33,45,44,32,16,7,32,176,0,80,176,13,121,32,184,255,255,80,88,4,27,5,89,176,5, + 28,176,3,37,8,176,4,37,35,225,32,176,0,80,176,13,121,32,184,255,255,80,88,4,27,5,89,176,5,28,176,3,37,8,225,45,44,75,80,88, + 32,176,253,69,68,89,33,45,44,176,2,37,69,96,68,45,44,75,83,88,176,2,37,176,2,37,69,68,89,33,33,45,44,69,68,45,44,176,2,37, + 176,2,37,73,176,5,37,176,5,37,73,96,176,32,99,104,32,138,16,138,35,58,138,16,101,58,45,0,0,0,0,2,0,8,0,2,255,255,0,3, + 0,2,0,102,254,150,4,102,5,164,0,3,0,7,0,26,64,12,4,251,0,6,251,1,8,5,127,2,4,0,47,196,212,236,49,0,16,212,236,212, + 236,48,19,17,33,17,37,33,17,33,102,4,0,252,115,3,27,252,229,254,150,7,14,248,242,114,6,41,0,2,1,53,0,0,2,0,5,213,0,3, + 0,9,0,53,64,15,7,0,131,4,129,2,8,7,5,1,3,4,0,0,10,16,252,75,176,11,84,88,185,0,0,255,192,56,89,60,236,50,57,57, + 49,0,47,228,252,204,48,1,182,0,11,32,11,80,11,3,93,37,51,21,35,17,51,17,3,35,3,1,53,203,203,203,20,162,21,254,254,5,213,253, + 113,254,155,1,101,0,0,0,0,2,0,197,3,170,2,233,5,213,0,3,0,7,0,66,64,15,5,1,132,4,0,129,8,4,5,6,0,5,2,4, + 8,16,252,75,176,18,84,75,176,19,84,91,88,185,0,2,255,192,56,89,252,220,236,49,0,16,244,60,236,50,48,1,64,15,48,9,64,9,80,9, + 96,9,112,9,160,9,191,9,7,93,1,17,35,17,33,17,35,17,1,111,170,2,36,170,5,213,253,213,2,43,253,213,2,43,0,0,0,2,0,158, + 0,0,6,23,5,190,0,3,0,31,0,96,64,49,27,11,0,135,7,4,29,9,5,25,13,2,135,23,19,15,21,17,31,30,28,27,26,23,22,21, + 20,19,18,17,16,14,13,12,9,8,7,6,5,4,3,2,1,0,26,10,24,6,32,16,252,204,23,57,49,0,47,60,212,60,60,252,60,60,212,60, + 60,196,50,236,50,50,48,64,17,11,1,11,2,11,12,11,13,20,4,26,17,26,18,20,31,8,1,93,1,33,3,33,11,1,33,19,51,3,33,21, + 33,3,33,21,33,3,35,19,33,3,35,19,33,53,33,19,33,53,33,19,4,23,254,221,84,1,37,68,104,1,36,105,160,103,1,56,254,161,82,1, + 62,254,155,104,160,103,254,219,103,161,104,254,197,1,96,84,254,190,1,105,102,3,133,254,178,3,135,254,97,1,159,254,97,154,254,178,153,254,98,1, + 158,254,98,1,158,153,1,78,154,1,159,0,0,3,0,170,254,211,4,109,6,20,0,33,0,40,0,47,0,189,64,85,34,2,10,11,10,39,1,38, + 40,2,11,11,10,29,1,30,28,2,47,41,47,27,2,41,41,47,66,19,17,16,34,10,27,41,4,23,6,9,42,33,5,2,23,134,22,6,134,5, + 17,35,26,138,22,137,16,0,42,138,5,137,2,45,8,22,10,30,7,41,26,18,3,0,9,34,16,9,3,1,7,38,8,13,5,6,48,16,252,75, + 176,9,84,88,185,0,5,255,192,56,89,75,176,12,84,75,176,16,84,91,75,176,15,84,91,88,185,0,5,0,64,56,89,60,236,244,23,60,252,23, + 60,244,228,236,49,0,47,228,236,196,212,228,236,50,196,16,238,16,238,17,18,57,17,57,17,18,23,57,17,18,57,48,75,83,88,7,16,4,237,7, + 16,14,237,17,23,57,7,16,14,237,17,23,57,7,16,4,237,89,34,1,35,3,46,1,39,53,30,1,23,17,46,1,53,52,54,55,53,51,21,30, + 1,23,21,46,1,39,17,30,1,21,20,6,7,3,17,14,1,21,20,22,23,17,62,1,53,52,38,2,180,100,1,105,210,106,102,209,111,221,201,218, + 204,100,93,174,83,83,175,92,227,214,227,214,100,116,122,113,225,127,129,123,254,211,1,45,2,45,45,180,64,65,1,1,200,36,172,150,163,188,14,235, + 232,4,31,27,175,42,46,4,254,85,35,180,156,169,195,15,3,0,1,154,13,106,88,86,96,213,254,79,17,110,90,88,104,0,0,0,0,5,0,113, + 255,227,7,41,5,240,0,11,0,23,0,35,0,39,0,51,0,137,64,54,36,15,37,38,37,38,15,39,36,39,66,0,146,12,30,146,46,141,24,146, + 36,6,146,12,141,38,18,140,40,36,145,52,39,33,27,37,9,3,13,21,14,9,13,15,33,13,43,14,27,13,15,49,11,52,16,252,75,176,9,84, + 75,176,11,84,91,75,176,12,84,91,75,176,20,84,91,75,176,14,84,91,75,176,13,84,91,88,185,0,49,255,192,56,89,196,236,244,236,16,238,246, + 238,17,57,17,18,57,49,0,16,228,50,244,60,228,236,16,238,246,238,16,238,48,75,83,88,7,16,5,237,7,16,5,237,89,34,1,34,6,21,20, + 22,51,50,54,53,52,38,39,50,22,21,20,6,35,34,38,53,52,54,1,34,6,21,20,22,51,50,54,53,52,38,37,51,1,35,19,50,22,21,20, + 6,35,34,38,53,52,54,5,209,87,99,99,87,85,99,99,85,158,186,187,157,160,186,187,252,151,86,99,98,87,87,99,100,3,49,160,252,90,160,31, + 158,188,187,159,159,185,186,2,145,148,132,130,149,149,130,131,149,127,220,187,187,219,219,187,188,219,2,97,149,130,132,148,148,132,129,150,127,249,243,6, + 13,219,187,189,218,219,188,186,220,0,0,0,0,2,0,129,255,227,5,254,5,240,0,9,0,48,1,205,64,150,13,1,14,12,134,17,18,17,11,134, + 10,11,18,18,17,9,134,0,9,21,22,21,7,1,6,8,134,22,22,21,2,1,3,1,134,29,30,29,0,134,9,0,30,30,29,32,31,2,33,30, + 17,10,19,10,23,22,21,3,24,20,17,19,10,7,8,2,6,9,17,19,19,10,2,1,2,3,0,17,10,19,10,23,22,2,24,21,17,19,10,20, + 17,19,19,10,66,18,11,9,3,6,0,10,30,3,40,21,14,6,40,39,6,149,24,43,149,39,148,36,145,24,140,14,19,10,46,11,14,9,0,46, + 18,21,39,14,30,3,46,18,39,33,14,17,15,19,33,3,18,27,16,49,16,252,236,196,212,212,236,16,198,238,17,57,17,18,57,57,17,57,57,17, + 57,17,57,49,0,47,198,228,246,230,238,16,238,16,198,17,18,57,17,23,57,17,23,57,48,75,83,88,7,16,5,237,7,5,237,17,23,57,7,16, + 5,237,17,23,57,7,16,5,237,17,23,57,7,5,237,17,23,57,7,16,5,237,17,23,57,7,16,8,237,7,16,14,237,17,23,57,7,16,14,237, + 17,23,57,7,16,8,237,7,16,8,237,7,16,14,237,17,23,57,89,34,178,15,50,1,1,93,64,178,7,11,5,34,9,41,28,0,28,1,31,2, + 23,11,42,0,42,1,38,18,58,0,52,18,68,11,94,0,89,1,90,10,85,18,90,26,90,31,89,48,103,30,123,0,155,0,154,1,153,2,151,8, + 149,11,147,21,149,22,149,34,153,45,31,9,11,9,12,8,17,12,39,12,40,24,2,27,9,25,11,25,12,25,17,28,20,28,21,22,29,31,50,39, + 0,39,1,41,9,35,18,42,19,42,20,40,21,47,50,59,9,52,18,57,19,63,50,74,9,76,20,75,21,70,25,79,50,86,1,90,9,89,12,85, + 18,89,19,92,31,95,50,106,12,105,17,96,50,117,1,121,12,122,17,147,0,147,1,151,2,149,5,156,7,156,8,159,8,154,9,155,11,154,12,144, + 50,160,50,176,50,57,93,0,93,1,14,1,21,20,22,51,50,54,55,9,1,62,1,55,51,6,2,7,1,35,39,14,1,35,34,0,53,52,54,55, + 46,1,53,52,54,51,50,22,23,21,46,1,35,34,6,21,20,22,1,242,91,85,212,160,95,166,73,254,123,1,252,59,66,6,186,12,104,93,1,23, + 252,143,104,228,131,241,254,206,134,134,48,50,222,184,83,165,85,87,158,68,105,131,59,3,35,81,161,88,146,194,63,64,2,143,253,248,89,203,114,132, + 254,254,126,254,227,147,89,87,1,19,215,128,225,99,63,125,60,162,197,36,36,182,47,49,111,88,51,103,0,1,0,197,3,170,1,111,5,213,0,3, + 0,55,64,10,1,132,0,129,4,0,5,2,4,4,16,252,75,176,18,84,75,176,19,84,91,88,185,0,2,255,192,56,89,236,49,0,16,244,236,48, + 1,64,13,64,5,80,5,96,5,112,5,144,5,160,5,6,93,1,17,35,17,1,111,170,5,213,253,213,2,43,0,0,0,1,0,176,254,242,2,123, + 6,18,0,13,0,55,64,15,6,152,0,151,14,13,7,0,3,18,6,0,19,10,14,16,220,75,176,19,84,88,185,0,10,255,192,56,89,75,176,15, + 84,88,185,0,10,0,64,56,89,228,50,236,17,57,57,49,0,16,252,236,48,1,6,2,21,20,18,23,35,38,2,53,52,18,55,2,123,134,130,131, + 133,160,150,149,148,151,6,18,230,254,62,231,231,254,59,229,235,1,198,224,223,1,196,236,0,1,0,164,254,242,2,111,6,18,0,13,0,31,64,15, + 7,152,0,151,14,7,1,0,11,18,4,19,8,0,14,16,220,60,244,236,17,57,57,49,0,16,252,236,48,19,51,22,18,21,20,2,7,35,54,18, + 53,52,2,164,160,150,149,149,150,160,133,131,131,6,18,236,254,60,223,224,254,58,235,229,1,197,231,231,1,194,0,0,0,1,0,61,2,74,3,195, + 5,240,0,17,0,78,64,44,16,13,11,0,4,12,9,7,4,2,4,8,3,153,5,17,12,153,10,1,14,145,18,8,12,10,3,9,6,17,3,1, + 3,2,0,20,15,4,11,9,20,13,6,18,16,212,60,228,50,220,60,228,50,23,57,17,18,23,57,49,0,16,244,212,60,236,50,196,236,50,23,57, + 18,23,57,48,1,13,1,7,37,17,35,17,5,39,45,1,55,5,17,51,17,37,3,195,254,153,1,103,58,254,176,114,254,176,58,1,103,254,153,58, + 1,80,114,1,80,4,223,194,195,98,203,254,135,1,121,203,98,195,194,99,203,1,121,254,135,203,0,0,0,1,0,217,0,0,5,219,5,4,0,11, + 0,35,64,17,0,9,1,156,7,3,5,2,21,4,0,23,10,6,21,8,12,16,220,252,60,252,60,236,49,0,47,212,60,252,60,196,48,1,17,33, + 21,33,17,35,17,33,53,33,17,3,174,2,45,253,211,168,253,211,2,45,5,4,253,211,170,253,211,2,45,170,2,45,0,1,0,158,255,18,1,195, + 0,254,0,5,0,25,64,12,3,158,0,131,6,3,4,1,25,0,24,6,16,252,236,212,204,49,0,16,252,236,48,55,51,21,3,35,19,240,211,164, + 129,82,254,172,254,192,1,64,0,1,0,100,1,223,2,127,2,131,0,3,0,17,182,0,156,2,4,1,0,4,16,220,204,49,0,16,212,236,48,19, + 33,21,33,100,2,27,253,229,2,131,164,0,0,1,0,219,0,0,1,174,0,254,0,3,0,17,183,0,131,2,1,25,0,24,4,16,252,236,49,0, + 47,236,48,55,51,21,35,219,211,211,254,254,0,1,0,0,255,66,2,178,5,213,0,3,0,45,64,20,0,26,1,2,1,2,26,3,0,3,66,2, + 159,0,129,4,2,0,1,3,47,196,57,57,49,0,16,244,236,48,75,83,88,7,16,5,237,7,16,5,237,89,34,1,51,1,35,2,8,170,253,248, + 170,5,213,249,109,0,0,0,0,2,0,135,255,227,4,143,5,240,0,11,0,23,0,35,64,19,6,160,18,0,160,12,145,18,140,24,9,28,15,30, + 3,28,21,27,24,16,252,236,244,236,49,0,16,228,244,236,16,238,48,1,34,2,17,16,18,51,50,18,17,16,2,39,50,0,17,16,0,35,34,0, + 17,16,0,2,139,156,157,157,156,157,157,157,157,251,1,9,254,247,251,251,254,247,1,9,5,80,254,205,254,204,254,205,254,205,1,51,1,51,1,52, + 1,51,160,254,115,254,134,254,135,254,115,1,141,1,121,1,122,1,141,0,0,1,0,225,0,0,4,90,5,213,0,10,0,64,64,21,66,3,160,4, + 2,160,5,129,7,0,160,9,8,31,6,28,3,0,31,1,11,16,212,75,176,15,84,88,185,0,1,0,64,56,89,236,196,252,236,49,0,47,236,50, + 244,236,212,236,48,75,83,88,89,34,1,180,15,3,15,4,2,93,55,33,17,5,53,37,51,17,33,21,33,254,1,74,254,153,1,101,202,1,74,252, + 164,170,4,115,72,184,72,250,213,170,0,0,0,1,0,150,0,0,4,74,5,240,0,28,0,158,64,39,25,26,27,3,24,28,17,5,4,0,17,5, + 5,4,66,16,161,17,148,13,160,20,145,4,0,160,2,0,16,10,2,1,10,28,23,16,3,6,29,16,252,75,176,21,84,75,176,22,84,91,75,176, + 20,84,91,88,185,0,3,255,192,56,89,196,212,236,192,192,17,18,57,49,0,47,236,50,244,236,244,236,48,75,83,88,7,16,5,237,7,5,237,1, + 176,28,16,17,23,57,89,34,1,64,50,85,4,86,5,86,7,122,4,122,5,118,27,135,25,7,4,0,4,25,4,26,4,27,5,28,116,0,118,6, + 117,26,115,27,116,28,130,0,134,25,130,26,130,27,130,28,168,0,168,27,17,93,0,93,37,33,21,33,53,54,0,55,62,1,53,52,38,35,34,6, + 7,53,62,1,51,50,4,21,20,6,7,6,0,1,137,2,193,252,76,115,1,141,51,97,77,167,134,95,211,120,122,212,88,232,1,20,69,91,25,254, + 244,170,170,170,119,1,145,58,109,151,73,119,150,66,67,204,49,50,232,194,92,165,112,29,254,235,0,0,0,1,0,156,255,227,4,115,5,240,0,40, + 0,112,64,46,0,21,19,10,134,9,31,134,32,19,160,21,13,160,9,147,6,28,160,32,147,35,145,6,140,21,163,41,22,28,19,0,3,20,25,28, + 38,32,16,28,3,20,31,9,6,41,16,252,75,176,22,84,75,176,20,84,91,88,185,0,9,255,192,56,89,196,196,212,236,244,236,17,23,57,57,49, + 0,16,236,228,244,228,236,16,230,238,16,238,16,238,16,238,17,18,57,48,1,64,9,100,30,97,31,97,32,100,33,4,0,93,1,30,1,21,20,4, + 33,34,38,39,53,30,1,51,50,54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,7,53,62,1,51,50,4,21,20,6,3,63,145,163,254, + 208,254,232,94,199,106,84,200,109,190,199,185,165,174,182,149,158,163,152,83,190,114,115,201,89,230,1,12,142,3,37,31,196,144,221,242,37,37,195,49, + 50,150,143,132,149,166,119,112,115,123,36,38,180,32,32,209,178,124,171,0,0,2,0,100,0,0,4,164,5,213,0,2,0,13,0,129,64,29,1,13, + 3,13,0,3,3,13,66,0,3,11,7,160,5,1,3,129,9,1,12,10,0,28,6,8,4,12,14,16,220,75,176,11,84,75,176,13,84,91,88,185, + 0,12,255,192,56,89,212,60,196,236,50,17,57,49,0,47,228,212,60,236,50,18,57,48,75,83,88,7,16,4,201,7,16,5,201,89,34,1,64,42, + 11,0,42,0,72,0,89,0,105,0,119,0,138,0,7,22,1,43,0,38,1,43,3,54,1,78,1,79,12,79,13,86,1,102,1,117,1,122,3,133, + 1,13,93,0,93,9,1,33,3,51,17,51,21,35,17,35,17,33,53,3,6,254,2,1,254,53,254,213,213,201,253,94,5,37,252,227,3,205,252,51, + 168,254,160,1,96,195,0,0,0,1,0,158,255,227,4,100,5,213,0,29,0,94,64,35,4,26,7,17,134,16,29,26,160,7,20,160,16,137,13,2, + 160,0,129,13,140,7,164,30,23,28,1,10,3,28,0,10,16,6,30,16,252,1,75,176,22,84,75,176,20,84,91,88,185,0,16,255,192,56,89,75, + 176,15,84,88,185,0,16,0,64,56,89,196,212,236,16,196,238,49,0,16,228,228,244,236,16,230,238,16,254,196,16,238,17,18,57,48,19,33,21,33, + 17,62,1,51,50,0,21,20,0,33,34,38,39,53,30,1,51,50,54,53,52,38,35,34,6,7,221,3,25,253,160,44,88,44,250,1,36,254,212,254, + 239,94,195,104,90,192,107,173,202,202,173,81,161,84,5,213,170,254,146,15,15,254,238,234,241,254,245,32,32,203,49,48,182,156,156,182,36,38,0,0, + 0,2,0,143,255,227,4,150,5,240,0,11,0,36,0,88,64,36,19,6,0,13,134,12,0,160,22,6,160,28,22,165,16,160,12,137,34,145,28,140, + 37,12,34,9,28,25,30,19,28,3,33,31,27,37,16,252,236,236,244,236,228,49,0,16,228,244,228,252,228,16,238,16,238,16,238,17,18,57,48,64, + 20,203,0,203,1,205,2,205,3,205,4,203,5,203,6,7,164,30,178,30,2,93,1,93,1,34,6,21,20,22,51,50,54,53,52,38,1,21,46,1, + 35,34,2,3,62,1,51,50,0,21,20,0,35,32,0,17,16,0,33,50,22,2,164,136,159,159,136,136,159,159,1,9,76,155,76,200,211,15,59,178, + 107,225,1,5,254,240,226,254,253,254,238,1,80,1,27,76,155,3,59,186,162,161,187,187,161,162,186,2,121,184,36,38,254,242,254,239,87,93,254,239, + 235,230,254,234,1,141,1,121,1,98,1,165,30,0,0,0,0,1,0,168,0,0,4,104,5,213,0,6,0,99,64,24,5,17,2,3,2,3,17,4, + 5,4,66,5,160,0,129,3,5,3,1,4,1,0,6,7,16,252,204,196,17,57,57,49,0,47,244,236,48,75,83,88,7,16,5,237,7,16,5,237, + 89,34,1,75,176,22,84,88,189,0,7,0,64,0,1,0,7,0,7,255,192,56,17,55,56,89,64,18,88,2,1,6,3,26,5,57,5,72,5,103, + 3,176,0,176,6,7,93,0,93,19,33,21,1,35,1,33,168,3,192,253,226,211,1,254,253,51,5,213,86,250,129,5,43,0,0,0,0,3,0,139, + 255,227,4,139,5,240,0,11,0,35,0,47,0,67,64,37,24,12,0,160,39,6,160,30,45,160,18,145,30,140,39,163,48,24,12,36,42,28,21,36, + 28,15,9,28,21,27,30,3,28,15,33,27,48,16,252,196,236,244,196,236,16,238,16,238,17,57,57,49,0,16,236,228,244,236,16,238,16,238,57,57, + 48,1,34,6,21,20,22,51,50,54,53,52,38,37,46,1,53,52,36,51,50,22,21,20,6,7,30,1,21,20,4,35,34,36,53,52,54,19,20,22, + 51,50,54,53,52,38,35,34,6,2,139,144,165,165,144,144,166,165,254,165,130,145,0,255,222,223,254,145,129,146,163,254,247,247,247,254,247,164,72,145, + 131,130,147,147,130,131,145,2,197,154,135,135,154,155,134,135,154,86,32,178,128,179,208,208,179,128,178,32,34,198,143,217,232,232,217,143,198,1,97,116, + 130,130,116,116,130,130,0,0,0,2,0,129,255,227,4,135,5,240,0,24,0,36,0,88,64,35,7,31,25,1,134,0,25,160,10,165,4,160,0,137, + 22,31,160,16,145,22,140,37,7,28,28,33,19,30,0,34,34,28,13,27,37,16,252,236,228,244,236,236,49,0,16,228,244,236,16,230,254,245,238,16, + 238,17,18,57,48,64,22,196,25,194,26,192,27,192,28,192,29,194,30,196,31,7,170,18,188,18,233,18,3,93,1,93,55,53,30,1,51,50,18,19, + 14,1,35,34,0,53,52,0,51,32,0,17,16,0,33,34,38,1,50,54,53,52,38,35,34,6,21,20,22,225,76,156,75,200,211,15,58,178,108,224, + 254,251,1,16,226,1,3,1,17,254,177,254,229,76,156,1,62,136,159,159,136,136,159,159,31,184,36,38,1,13,1,18,86,92,1,15,235,230,1,22, + 254,115,254,134,254,159,254,91,30,2,151,186,162,161,187,187,161,162,186,0,0,2,0,240,0,0,1,195,4,35,0,3,0,7,0,28,64,14,6,131, + 4,166,0,131,2,5,1,3,4,0,24,8,16,252,60,236,50,49,0,47,236,244,236,48,55,51,21,35,17,51,21,35,240,211,211,211,211,254,254,4, + 35,254,0,0,0,2,0,158,255,18,1,195,4,35,0,3,0,9,0,37,64,19,2,131,0,7,158,4,131,0,166,10,7,8,5,1,25,4,0,24, + 10,16,252,60,236,50,212,204,49,0,16,228,252,236,16,238,48,19,51,21,35,17,51,21,3,35,19,240,211,211,211,164,129,82,4,35,254,253,217,172, + 254,192,1,64,0,1,0,217,0,94,5,219,4,166,0,6,0,77,64,42,2,156,3,4,3,1,156,0,1,4,4,3,1,156,2,1,5,6,5,0, + 156,6,5,66,5,4,2,1,0,5,3,168,6,167,7,1,2,0,36,4,35,7,16,252,236,50,57,49,0,16,244,236,23,57,48,75,83,88,7,4, + 237,7,16,8,237,7,16,8,237,7,16,4,237,89,34,9,2,21,1,53,1,5,219,251,248,4,8,250,254,5,2,3,240,254,145,254,147,182,1,209, + 166,1,209,0,0,2,0,217,1,96,5,219,3,162,0,3,0,7,0,28,64,13,0,156,2,6,156,4,8,5,1,4,0,35,8,16,252,60,196,50, + 49,0,16,212,236,212,236,48,19,33,21,33,21,33,21,33,217,5,2,250,254,5,2,250,254,3,162,168,240,170,0,0,0,1,0,217,0,94,5,219, + 4,166,0,6,0,79,64,43,6,156,0,6,3,4,3,5,156,4,4,3,0,156,1,2,1,6,156,5,6,2,2,1,66,6,5,3,2,0,5,4, + 168,1,167,7,6,2,36,4,0,35,7,16,252,60,236,57,49,0,16,244,236,23,57,48,75,83,88,7,16,8,237,7,16,4,237,7,16,4,237,7, + 16,8,237,89,34,19,53,1,21,1,53,1,217,5,2,250,254,4,6,3,240,182,254,47,166,254,47,182,1,109,0,0,0,2,0,147,0,0,3,176, + 5,240,0,3,0,36,0,101,64,43,36,30,9,6,4,10,29,19,4,0,20,134,19,136,16,149,23,145,0,131,2,29,26,13,9,5,4,10,30,1, + 13,28,26,4,28,5,1,3,0,38,26,19,37,16,220,75,176,12,84,88,185,0,19,255,192,56,89,196,252,236,212,236,16,238,17,57,57,17,18,57, + 17,18,57,49,0,47,238,246,254,244,238,16,205,17,57,57,23,57,48,1,182,121,9,122,10,122,32,3,93,37,51,21,35,19,35,53,52,54,63,1, + 62,1,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,6,15,1,14,1,7,14,1,21,1,135,203,203,197,191,56,90,90,57,51,131,108,79, + 179,97,94,193,103,184,223,72,90,88,47,39,8,6,6,254,254,1,145,154,101,130,86,89,53,94,49,89,110,70,67,188,57,56,194,159,76,137,86,86, + 47,53,25,21,60,52,0,0,0,2,0,135,254,156,7,113,5,162,0,11,0,76,0,149,64,50,24,12,3,9,169,25,21,27,3,169,76,15,52,51, + 15,172,48,169,55,21,172,36,169,55,67,77,51,52,30,26,0,40,18,6,24,12,40,26,43,30,40,73,18,43,42,40,73,44,61,77,16,220,236,252, + 236,16,254,253,254,60,198,16,238,17,18,57,57,49,0,16,212,196,252,236,16,254,237,212,198,16,197,238,50,16,196,238,17,57,57,48,0,75,176,9, + 84,75,176,12,84,91,75,176,16,84,91,75,176,19,84,91,75,176,20,84,91,88,189,0,77,255,192,0,1,0,77,0,77,0,64,56,17,55,56,89, + 64,9,15,78,31,78,47,78,63,78,4,1,93,1,20,22,51,50,54,53,52,38,35,34,6,1,14,1,35,34,38,53,52,54,51,50,22,23,53,51, + 17,62,1,53,52,38,39,38,36,35,34,6,7,6,2,21,20,18,23,22,4,51,50,54,55,23,6,4,35,34,36,39,38,2,53,52,18,55,54,36, + 51,50,4,23,30,1,21,16,0,5,2,250,142,124,123,141,144,122,121,143,2,33,60,155,103,172,215,216,171,103,156,59,143,146,165,63,64,104,254,213, + 176,123,226,96,157,177,115,109,105,1,20,157,129,249,104,90,125,254,217,152,185,254,184,128,128,134,136,126,129,1,82,189,212,1,107,123,75,79,254,194, + 254,232,2,25,143,163,164,142,140,165,164,254,72,77,73,249,200,200,250,75,76,131,253,32,22,223,177,107,188,80,131,139,65,64,102,254,181,193,159,254, + 234,106,104,109,87,81,111,97,103,131,125,125,1,73,189,182,1,74,125,127,135,174,160,98,230,123,254,249,254,208,6,0,0,2,0,16,0,0,5,104, + 5,213,0,2,0,10,0,194,64,65,0,17,1,0,4,5,4,2,17,5,5,4,1,17,10,3,10,0,17,2,0,3,3,10,7,17,5,4,6,17, + 5,5,4,9,17,3,10,8,17,10,3,10,66,0,3,7,149,1,3,129,9,5,9,8,7,6,4,3,2,1,0,9,5,10,11,16,212,196,23,57, + 49,0,47,60,228,212,236,18,57,48,75,83,88,7,16,5,237,7,5,237,7,16,5,237,7,5,237,7,16,8,237,7,16,5,237,7,16,5,237,7, + 16,8,237,89,34,178,32,12,1,1,93,64,66,15,1,15,2,15,7,15,8,15,0,88,0,118,0,112,0,140,0,9,7,1,8,2,6,3,9,4, + 22,1,25,2,86,1,88,2,80,12,103,1,104,2,120,1,118,2,124,3,114,4,119,7,120,8,135,1,136,2,128,12,152,2,153,3,150,4,23,93, + 0,93,9,1,33,1,51,1,35,3,33,3,35,2,188,254,238,2,37,254,123,229,2,57,210,136,253,95,136,213,5,14,253,25,3,174,250,43,1,127, + 254,129,0,0,0,3,0,201,0,0,4,236,5,213,0,8,0,17,0,32,0,67,64,35,25,0,149,10,9,149,18,129,1,149,10,173,31,17,11,8, + 2,19,25,31,5,0,14,28,22,5,25,28,46,9,0,28,18,4,33,16,252,236,50,252,236,212,236,17,23,57,57,57,49,0,47,236,236,244,236,16, + 238,57,48,178,15,34,1,1,93,1,17,33,50,54,53,52,38,35,1,17,33,50,54,53,52,38,35,37,33,50,22,21,20,6,7,30,1,21,20,4, + 35,33,1,147,1,68,163,157,157,163,254,188,1,43,148,145,145,148,254,11,2,4,231,250,128,124,149,165,254,240,251,253,232,2,201,253,221,135,139,140, + 133,2,102,254,62,111,114,113,112,166,192,177,137,162,20,32,203,152,200,218,0,1,0,115,255,227,5,39,5,240,0,25,0,54,64,26,13,161,14,174, + 10,149,17,1,161,0,174,4,149,23,145,17,140,26,7,25,13,0,48,20,16,26,16,252,236,50,236,49,0,16,228,244,236,244,236,16,238,246,238,48, + 180,15,27,31,27,2,1,93,1,21,46,1,35,32,0,17,16,0,33,50,54,55,21,14,1,35,32,0,17,16,0,33,50,22,5,39,102,231,130,255, + 0,254,240,1,16,1,0,130,231,102,106,237,132,254,173,254,122,1,134,1,83,134,237,5,98,213,95,94,254,199,254,216,254,217,254,199,94,95,211,72, + 72,1,159,1,103,1,104,1,159,71,0,0,0,2,0,201,0,0,5,176,5,213,0,8,0,17,0,46,64,21,0,149,9,129,1,149,16,8,2,16, + 10,0,5,25,13,50,0,28,9,4,18,16,252,236,244,236,17,57,57,57,57,49,0,47,236,244,236,48,178,96,19,1,1,93,1,17,51,32,0,17, + 16,0,33,37,33,32,0,17,16,0,41,1,1,147,244,1,53,1,31,254,225,254,203,254,66,1,159,1,178,1,150,254,104,254,80,254,97,5,47,251, + 119,1,24,1,46,1,44,1,23,166,254,151,254,128,254,126,254,150,0,0,0,1,0,201,0,0,4,139,5,213,0,11,0,46,64,21,6,149,4,2, + 149,0,129,8,149,4,173,10,5,1,9,7,3,28,0,4,12,16,252,236,50,212,196,196,49,0,47,236,236,244,236,16,238,48,178,31,13,1,1,93, + 19,33,21,33,17,33,21,33,17,33,21,33,201,3,176,253,26,2,199,253,57,2,248,252,62,5,213,170,254,70,170,253,227,170,0,0,0,1,0,201, + 0,0,4,35,5,213,0,9,0,41,64,18,6,149,4,2,149,0,129,4,173,8,5,1,7,3,28,0,4,10,16,252,236,50,212,196,49,0,47,236, + 244,236,16,238,48,178,15,11,1,1,93,19,33,21,33,17,33,21,33,17,35,201,3,90,253,112,2,80,253,176,202,5,213,170,254,72,170,253,55,0, + 0,1,0,115,255,227,5,139,5,240,0,29,0,57,64,32,0,5,27,1,149,3,27,149,8,18,161,17,174,21,149,14,145,8,140,30,2,0,28,17, + 52,4,51,24,25,11,16,30,16,252,236,252,228,252,196,49,0,16,228,244,236,244,236,16,254,212,238,17,57,57,48,37,17,33,53,33,17,6,4,35, + 32,0,17,16,0,33,50,4,23,21,46,1,35,32,0,17,16,0,33,50,54,4,195,254,182,2,18,117,254,230,160,254,162,254,117,1,139,1,94,146, + 1,7,111,112,252,139,254,238,254,237,1,19,1,18,107,168,213,1,145,166,253,127,83,85,1,153,1,109,1,110,1,153,72,70,215,95,96,254,206,254, + 209,254,210,254,206,37,0,0,0,1,0,201,0,0,5,59,5,213,0,11,0,44,64,20,8,149,2,173,4,0,129,10,6,7,3,28,5,56,9,1, + 28,0,4,12,16,252,236,50,252,236,50,49,0,47,60,228,50,252,236,48,178,80,13,1,1,93,19,51,17,33,17,51,17,35,17,33,17,35,201,202, + 2,222,202,202,253,34,202,5,213,253,156,2,100,250,43,2,199,253,57,0,0,1,0,201,0,0,1,147,5,213,0,3,0,46,183,0,175,2,1,28, + 0,4,4,16,252,75,176,16,84,88,185,0,0,0,64,56,89,236,49,0,47,236,48,1,64,13,48,5,64,5,80,5,96,5,143,5,159,5,6,93, + 19,51,17,35,201,202,202,5,213,250,43,0,0,1,255,150,254,102,1,147,5,213,0,11,0,66,64,19,11,2,0,7,149,5,176,0,129,12,5,8, + 6,57,1,28,0,4,12,16,252,75,176,16,84,88,185,0,0,0,64,56,89,236,228,57,57,49,0,16,228,252,236,17,57,57,48,1,64,13,48,13, + 64,13,80,13,96,13,143,13,159,13,6,93,19,51,17,16,6,43,1,53,51,50,54,53,201,202,205,227,77,63,134,110,5,213,250,147,254,242,244,170, + 150,194,0,0,0,1,0,201,0,0,5,106,5,213,0,10,0,239,64,40,8,17,5,6,5,7,17,6,6,5,3,17,4,5,4,2,17,5,5,4, + 66,8,5,2,3,3,0,175,9,6,5,1,4,6,8,1,28,0,4,11,16,252,236,50,212,196,17,57,49,0,47,60,236,50,23,57,48,75,83,88, + 7,16,4,237,7,16,5,237,7,16,5,237,7,16,4,237,89,34,178,8,3,1,1,93,64,146,20,2,1,4,2,9,8,22,2,40,5,40,8,55, + 2,54,5,52,8,71,2,70,5,67,8,85,2,103,2,118,2,119,5,131,2,136,5,143,8,148,2,155,8,231,2,21,6,3,9,5,9,6,27,3, + 25,7,5,10,3,10,7,24,3,40,5,43,6,42,7,54,4,54,5,54,6,53,7,48,12,65,3,64,4,69,5,64,6,64,7,64,12,98,3,96, + 4,104,5,103,7,119,5,112,12,139,3,139,5,142,6,143,7,143,12,154,3,157,6,157,7,182,3,181,7,197,3,197,7,215,3,214,7,232,3,233, + 4,232,5,234,6,247,3,248,5,249,6,44,93,113,0,93,113,19,51,17,1,33,9,1,33,1,17,35,201,202,2,158,1,4,253,27,3,26,254,246, + 253,51,202,5,213,253,137,2,119,253,72,252,227,2,207,253,49,0,0,0,0,1,0,201,0,0,4,106,5,213,0,5,0,37,64,12,2,149,0,129, + 4,1,28,3,58,0,4,6,16,252,236,236,49,0,47,228,236,48,64,9,48,7,80,7,128,3,128,4,4,1,93,19,51,17,33,21,33,201,202,2, + 215,252,95,5,213,250,213,170,0,1,0,201,0,0,6,31,5,213,0,12,0,191,64,52,3,17,7,8,7,2,17,1,2,8,8,7,2,17,3,2, + 9,10,9,1,17,10,10,9,66,10,7,2,3,8,3,0,175,8,11,5,9,8,3,2,1,5,10,6,28,4,62,10,28,0,4,13,16,252,236,252, + 236,17,23,57,49,0,47,60,196,236,50,17,23,57,48,75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,89,34,178,112,14,1, + 1,93,64,86,3,7,15,8,15,9,2,10,21,2,20,7,19,10,38,2,38,7,32,7,38,10,32,10,52,7,53,10,105,2,124,2,123,7,121,10, + 128,2,130,7,130,10,144,2,22,4,1,11,3,19,1,27,3,35,1,44,3,39,8,40,9,52,1,60,3,86,8,89,9,101,8,106,9,118,8,121, + 9,129,1,141,3,149,1,155,3,20,93,0,93,19,33,9,1,33,17,35,17,1,35,1,17,35,201,1,45,1,125,1,127,1,45,197,254,127,203,254, + 127,196,5,213,252,8,3,248,250,43,5,31,252,0,4,0,250,225,0,0,0,1,0,201,0,0,5,51,5,213,0,9,0,121,64,30,7,17,1,2, + 1,2,17,6,7,6,66,7,2,3,0,175,8,5,6,1,7,2,28,4,54,7,28,0,4,10,16,252,236,252,236,17,57,57,49,0,47,60,236,50, + 57,57,48,75,83,88,7,16,4,237,7,16,4,237,89,34,178,31,11,1,1,93,64,48,54,2,56,7,72,2,71,7,105,2,102,7,128,2,7,6, + 1,9,6,21,1,26,6,70,1,73,6,87,1,88,6,101,1,105,6,121,6,133,1,138,6,149,1,154,6,159,11,16,93,0,93,19,33,1,17,51, + 17,33,1,17,35,201,1,16,2,150,196,254,240,253,106,196,5,213,251,31,4,225,250,43,4,225,251,31,0,2,0,115,255,227,5,217,5,240,0,11, + 0,23,0,35,64,19,6,149,18,0,149,12,145,18,140,24,9,25,15,51,3,25,21,16,24,16,252,236,252,236,49,0,16,228,244,236,16,238,48,1, + 34,0,17,16,0,51,50,0,17,16,0,39,32,0,17,16,0,33,32,0,17,16,0,3,39,220,254,253,1,3,220,220,1,1,254,255,220,1,58,1, + 120,254,136,254,198,254,197,254,135,1,121,5,76,254,184,254,229,254,230,254,184,1,72,1,26,1,27,1,72,164,254,91,254,158,254,159,254,91,1,164, + 1,98,1,98,1,165,0,0,0,2,0,201,0,0,4,141,5,213,0,8,0,19,0,58,64,24,1,149,16,0,149,9,129,18,16,10,8,2,4,0, + 5,25,13,63,17,0,28,9,4,20,16,252,236,50,252,236,17,23,57,49,0,47,244,236,212,236,48,64,11,15,21,31,21,63,21,95,21,175,21,5, + 1,93,1,17,51,50,54,53,52,38,35,37,33,50,4,21,20,4,43,1,17,35,1,147,254,141,154,154,141,254,56,1,200,251,1,1,254,255,251,254, + 202,5,47,253,207,146,135,134,146,166,227,219,221,226,253,168,0,2,0,115,254,248,5,217,5,240,0,11,0,29,0,82,64,42,17,16,2,15,1,12, + 13,12,14,1,13,13,12,66,15,30,12,6,149,18,0,149,24,145,18,140,13,30,13,27,15,12,3,9,25,27,51,3,25,21,16,30,16,252,236,252, + 236,17,57,57,17,57,49,0,16,196,228,244,236,16,238,57,18,57,48,75,83,88,7,16,5,237,7,16,5,237,23,57,89,34,1,34,0,17,16,0, + 51,50,0,17,16,0,19,1,35,39,14,1,35,32,0,17,16,0,33,32,0,17,16,2,3,39,220,254,253,1,3,220,220,1,1,254,255,63,1,10, + 244,221,33,35,16,254,197,254,135,1,121,1,59,1,58,1,120,209,5,76,254,184,254,229,254,230,254,184,1,72,1,26,1,27,1,72,250,207,254,221, + 239,2,2,1,165,1,97,1,98,1,165,254,91,254,158,254,252,254,142,0,0,2,0,201,0,0,5,84,5,213,0,19,0,28,0,177,64,53,9,8, + 7,3,10,6,17,3,4,3,5,17,4,4,3,66,6,4,0,21,3,4,21,149,9,20,149,13,129,11,4,5,6,3,17,9,0,28,22,14,5,10, + 25,25,4,17,63,20,10,28,12,4,29,16,252,236,50,252,196,236,17,23,57,17,57,57,57,49,0,47,60,244,236,212,236,18,57,18,57,18,57,48, + 75,83,88,7,16,5,237,7,16,5,237,17,23,57,89,34,178,64,30,1,1,93,64,66,122,19,1,5,0,5,1,5,2,6,3,7,4,21,0,21, + 1,20,2,22,3,23,4,37,0,37,1,37,2,38,3,39,6,38,7,38,8,38,9,32,30,54,1,54,2,70,1,70,2,104,5,117,4,117,5,119, + 19,136,6,136,7,152,6,152,7,31,93,0,93,1,30,1,23,19,35,3,46,1,43,1,17,35,17,33,32,22,21,20,6,1,17,51,50,54,53,52, + 38,35,3,141,65,123,62,205,217,191,74,139,120,220,202,1,200,1,0,252,131,253,137,254,146,149,149,146,2,188,22,144,126,254,104,1,127,150,98,253, + 137,5,213,214,216,141,186,2,79,253,238,135,131,131,133,0,0,1,0,135,255,227,4,162,5,240,0,39,0,126,64,60,13,12,2,14,11,2,30,31, + 30,8,9,2,7,10,2,31,31,30,66,10,11,30,31,4,21,1,0,21,161,20,148,24,149,17,4,149,0,148,37,145,17,140,40,30,10,11,31,27, + 7,0,34,27,25,14,45,7,25,20,34,40,16,220,196,236,252,236,228,17,18,57,57,57,57,49,0,16,228,244,228,236,16,238,246,238,16,198,17,23, + 57,48,75,83,88,7,16,14,237,17,23,57,7,16,14,237,17,23,57,89,34,178,15,41,1,1,93,182,31,41,47,41,79,41,3,93,1,21,46,1, + 35,34,6,21,20,22,31,1,30,1,21,20,4,33,34,38,39,53,30,1,51,50,54,53,52,38,47,1,46,1,53,52,36,51,50,22,4,72,115,204, + 95,165,179,119,166,122,226,215,254,221,254,231,106,239,128,123,236,114,173,188,135,154,123,226,202,1,23,245,105,218,5,164,197,55,54,128,118,99,101,31, + 25,43,217,182,217,224,48,47,208,69,70,136,126,110,124,31,24,45,192,171,198,228,38,0,0,1,255,250,0,0,4,233,5,213,0,7,0,74,64,14, + 6,2,149,0,129,4,1,64,3,28,0,64,5,8,16,212,228,252,228,49,0,47,244,236,50,48,1,75,176,10,84,88,189,0,8,0,64,0,1,0, + 8,0,8,255,192,56,17,55,56,89,64,19,0,9,31,0,16,1,16,2,31,7,16,9,64,9,112,9,159,9,9,93,3,33,21,33,17,35,17,33, + 6,4,239,253,238,203,253,238,5,213,170,250,213,5,43,0,0,1,0,178,255,227,5,41,5,213,0,17,0,64,64,22,8,2,17,11,0,5,149,14, + 140,9,0,129,18,8,28,10,56,1,28,0,65,18,16,252,75,176,16,84,88,185,0,0,255,192,56,89,236,252,236,49,0,16,228,50,244,236,17,57, + 57,57,57,48,1,182,31,19,143,19,159,19,3,93,19,51,17,20,22,51,50,54,53,17,51,17,16,0,33,32,0,17,178,203,174,195,194,174,203,254, + 223,254,230,254,229,254,223,5,213,252,117,240,211,211,240,3,139,252,92,254,220,254,214,1,42,1,36,0,0,1,0,16,0,0,5,104,5,213,0,6, + 0,183,64,39,4,17,5,6,5,3,17,2,3,6,6,5,3,17,4,3,0,1,0,2,17,1,1,0,66,3,4,1,175,0,6,4,3,2,0,5, + 5,1,7,16,212,196,23,57,49,0,47,236,50,57,48,75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,89,34,178,80,8,1, + 1,93,64,98,0,3,42,3,71,4,71,5,90,3,125,3,131,3,7,6,0,7,2,8,4,9,6,21,1,20,2,26,4,26,5,42,0,38,1,38, + 2,41,4,41,5,37,6,32,8,56,0,51,1,51,2,60,4,60,5,55,6,72,0,69,1,69,2,73,4,73,5,71,6,89,0,86,6,102,2,105, + 4,105,5,122,0,118,1,118,2,121,4,121,5,117,6,128,8,152,0,151,6,41,93,0,93,33,1,51,9,1,51,1,2,74,253,198,211,1,217,1, + 218,210,253,199,5,213,251,23,4,233,250,43,0,1,0,68,0,0,7,166,5,213,0,12,1,123,64,73,5,26,6,5,9,10,9,4,26,10,9,3, + 26,10,11,10,2,26,1,2,11,11,10,6,17,7,8,7,5,17,4,5,8,8,7,2,17,3,2,12,0,12,1,17,0,0,12,66,10,5,2,3, + 6,3,0,175,11,8,12,11,10,9,8,6,5,4,3,2,1,11,7,0,13,16,212,204,23,57,49,0,47,60,236,50,50,23,57,48,75,83,88,7, + 16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,7,16,8,237,7,16,5,237,7,5,237,7,16,8,237,89,34,178,0,14,1,1,93,64,242, + 6,2,6,5,2,10,0,10,0,10,18,10,40,5,36,10,32,10,62,2,62,5,52,10,48,10,76,2,77,5,66,10,64,10,89,2,106,2,107,5, + 103,10,96,10,123,2,127,2,124,5,127,5,128,10,150,2,149,5,29,7,0,9,2,8,3,0,4,6,5,0,5,0,6,1,7,4,8,0,8,7, + 9,0,9,4,10,10,12,0,14,26,3,21,4,21,8,25,12,16,14,32,4,33,5,32,6,32,7,32,8,35,9,36,10,37,11,32,14,32,14,60, + 2,58,3,53,4,51,5,48,8,54,9,57,11,63,12,48,14,70,0,70,1,74,2,64,4,69,5,64,5,66,6,66,7,66,8,64,8,64,9,68, + 10,77,12,64,14,64,14,88,2,86,8,89,12,80,14,102,2,103,3,97,4,98,5,96,6,96,7,96,8,100,9,100,10,100,11,119,0,118,1,123, + 2,120,3,119,4,116,5,121,6,121,7,119,8,112,8,120,12,127,12,127,14,134,2,135,3,136,4,137,5,133,9,138,11,143,14,151,4,159,14,175, + 14,91,93,0,93,19,51,9,1,51,9,1,51,1,35,9,1,35,68,204,1,58,1,57,227,1,58,1,57,205,254,137,254,254,197,254,194,254,5,213, + 251,18,4,238,251,18,4,238,250,43,5,16,250,240,0,0,0,1,0,61,0,0,5,59,5,213,0,11,0,102,64,6,13,4,6,0,10,12,16,212, + 196,220,196,196,49,180,128,0,127,10,2,93,0,64,5,3,0,175,9,6,47,60,236,50,48,75,176,66,80,88,64,20,7,17,6,6,5,9,17,10, + 11,10,3,17,4,5,4,1,17,0,11,0,5,7,16,236,7,16,236,7,16,236,7,16,236,64,20,11,10,3,7,0,8,9,4,7,0,5,9,4, + 6,1,2,10,3,6,1,15,15,15,15,89,19,51,9,1,51,9,1,35,9,1,35,1,129,217,1,115,1,117,217,254,32,2,0,217,254,92,254,89, + 218,2,21,5,213,253,213,2,43,253,51,252,248,2,123,253,133,3,29,0,0,1,255,252,0,0,4,231,5,213,0,8,0,148,64,40,3,17,4,5, + 4,2,17,1,2,5,5,4,2,17,3,2,8,0,8,1,17,0,0,8,66,2,3,0,175,6,2,7,4,64,5,28,0,64,7,9,16,212,228,252, + 228,18,57,49,0,47,236,50,57,48,75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,89,34,178,0,10,1,1,93,64,60,5, + 2,20,2,53,2,48,2,48,5,48,8,70,2,64,2,64,5,64,8,81,2,81,5,81,8,101,2,132,2,147,2,16,22,1,26,3,31,10,38,1, + 41,3,55,1,56,3,64,10,103,1,104,3,120,3,112,10,159,10,13,93,0,93,3,51,9,1,51,1,17,35,17,4,217,1,158,1,155,217,253,240, + 203,5,213,253,154,2,102,252,242,253,57,2,199,0,0,0,0,1,0,92,0,0,5,31,5,213,0,9,0,144,64,27,3,17,7,8,7,8,17,2, + 3,2,66,8,149,0,129,3,149,5,8,3,0,1,66,4,0,6,10,16,220,75,176,9,84,75,176,10,84,91,88,185,0,6,255,192,56,89,196,212, + 228,17,57,57,49,0,47,236,244,236,48,75,83,88,7,16,5,237,7,16,5,237,89,34,1,64,64,5,2,10,7,24,7,41,2,38,7,56,7,72, + 2,71,7,72,8,9,5,3,11,8,0,11,22,3,26,8,16,11,47,11,53,3,57,8,63,11,71,3,74,8,79,11,85,3,89,8,102,3,105,8, + 111,11,119,3,120,8,127,11,159,11,22,93,0,93,19,33,21,1,33,21,33,53,1,33,115,4,149,252,80,3,199,251,61,3,176,252,103,5,213,154, + 251,111,170,154,4,145,0,0,0,1,0,176,254,242,2,88,6,20,0,7,0,59,64,15,4,169,6,178,2,169,0,177,8,5,1,3,67,0,8,16, + 220,75,176,12,84,88,185,0,0,0,64,56,89,75,176,18,84,75,176,19,84,91,88,185,0,0,255,192,56,89,252,204,50,49,0,16,252,236,244,236, + 48,19,33,21,35,17,51,21,33,176,1,168,240,240,254,88,6,20,143,249,252,143,0,0,0,1,0,0,255,66,2,178,5,213,0,3,0,45,64,20, + 2,26,1,1,0,0,26,3,3,2,66,1,159,0,129,4,2,0,1,3,47,196,57,57,49,0,16,244,236,48,75,83,88,7,16,5,237,7,16,5, + 237,89,34,19,1,35,1,170,2,8,170,253,248,5,213,249,109,6,147,0,0,1,0,199,254,242,2,111,6,20,0,7,0,48,64,16,3,169,1,178, + 5,169,0,177,8,0,67,4,6,2,4,8,16,252,75,176,15,84,75,176,16,84,91,88,185,0,2,0,64,56,89,60,220,236,49,0,16,252,236,244, + 236,48,1,17,33,53,51,17,35,53,2,111,254,88,239,239,6,20,248,222,143,6,4,143,0,1,0,217,3,168,5,219,5,213,0,6,0,24,64,10, + 3,4,1,0,129,7,3,1,5,7,16,220,204,57,49,0,16,244,204,50,57,48,9,1,35,9,1,35,1,3,188,2,31,201,254,72,254,72,201,2, + 31,5,213,253,211,1,139,254,117,2,45,0,0,1,255,236,254,29,4,20,254,172,0,3,0,15,181,0,169,1,0,2,4,16,196,196,49,0,212,236, + 48,1,21,33,53,4,20,251,216,254,172,143,143,0,0,0,0,1,0,170,4,240,2,137,6,102,0,3,0,49,64,9,1,180,0,179,4,3,68,1, + 4,16,220,236,49,0,16,244,236,48,0,75,176,9,84,75,176,14,84,91,88,189,0,4,255,192,0,1,0,4,0,4,0,64,56,17,55,56,89,9, + 1,35,1,1,111,1,26,153,254,186,6,102,254,138,1,118,0,2,0,123,255,227,4,45,4,123,0,10,0,37,0,188,64,39,25,31,11,23,9,14, + 0,169,23,6,185,14,17,32,134,31,186,28,185,35,184,17,140,23,12,0,23,3,24,13,9,8,11,31,3,8,20,69,38,16,252,236,204,212,236,50, + 50,17,57,57,49,0,47,196,228,244,252,244,236,16,198,238,16,238,17,57,17,57,18,57,48,64,110,48,29,48,30,48,31,48,32,48,33,48,34,63, + 39,64,29,64,30,64,31,64,32,64,33,64,34,80,29,80,30,80,31,80,32,80,33,80,34,80,39,112,39,133,29,135,30,135,31,135,32,135,33,133, + 34,144,39,160,39,240,39,30,48,30,48,31,48,32,48,33,64,30,64,31,64,32,64,33,80,30,80,31,80,32,80,33,96,30,96,31,96,32,96,33, + 112,30,112,31,112,32,112,33,128,30,128,31,128,32,128,33,24,93,1,93,1,34,6,21,20,22,51,50,54,61,1,55,17,35,53,14,1,35,34,38, + 53,52,54,51,33,53,52,38,35,34,6,7,53,62,1,51,50,22,2,190,223,172,129,111,153,185,184,184,63,188,136,172,203,253,251,1,2,167,151,96, + 182,84,101,190,90,243,240,2,51,102,123,98,115,217,180,41,76,253,129,170,102,97,193,162,189,192,18,127,139,46,46,170,39,39,252,0,0,2,0,186, + 255,227,4,164,6,20,0,11,0,28,0,56,64,25,3,185,12,15,9,185,24,21,140,15,184,27,151,25,0,18,18,71,24,12,6,8,26,70,29,16, + 252,236,50,50,244,236,49,0,47,236,228,244,196,236,16,198,238,48,182,96,30,128,30,160,30,3,1,93,1,52,38,35,34,6,21,20,22,51,50,54, + 1,62,1,51,50,0,17,16,2,35,34,38,39,21,35,17,51,3,229,167,146,146,167,167,146,146,167,253,142,58,177,123,204,0,255,255,204,123,177,58, + 185,185,2,47,203,231,231,203,203,231,231,2,82,100,97,254,188,254,248,254,248,254,188,97,100,168,6,20,0,1,0,113,255,227,3,231,4,123,0,25, + 0,63,64,27,0,134,1,136,4,14,134,13,136,10,185,17,4,185,23,184,17,140,26,7,18,13,0,72,20,69,26,16,252,228,50,236,49,0,16,228, + 244,236,16,254,244,238,16,245,238,48,64,11,15,27,16,27,128,27,144,27,160,27,5,1,93,1,21,46,1,35,34,6,21,20,22,51,50,54,55,21, + 14,1,35,34,0,17,16,0,33,50,22,3,231,78,157,80,179,198,198,179,80,157,78,77,165,93,253,254,214,1,45,1,6,85,162,4,53,172,43,43, + 227,205,205,227,43,43,170,36,36,1,62,1,14,1,18,1,58,35,0,0,0,2,0,113,255,227,4,90,6,20,0,16,0,28,0,56,64,25,26,185, + 0,14,20,185,5,8,140,14,184,1,151,3,23,4,0,8,2,71,17,18,11,69,29,16,252,236,244,236,50,50,49,0,47,236,228,244,196,236,16,196, + 238,48,182,96,30,128,30,160,30,3,1,93,1,17,51,17,35,53,14,1,35,34,2,17,16,0,51,50,22,1,20,22,51,50,54,53,52,38,35,34, + 6,3,162,184,184,58,177,124,203,255,0,255,203,124,177,253,199,167,146,146,168,168,146,146,167,3,182,2,94,249,236,168,100,97,1,68,1,8,1,8, + 1,68,97,254,21,203,231,231,203,203,231,231,0,2,0,113,255,227,4,127,4,123,0,20,0,27,0,112,64,36,0,21,1,9,134,8,136,5,21,169, + 1,5,185,12,1,187,24,185,18,184,12,140,28,27,21,2,8,21,8,0,75,2,18,15,69,28,16,252,236,244,236,196,17,18,57,49,0,16,228,244, + 236,228,16,238,16,238,16,244,238,17,18,57,48,64,41,63,29,112,29,160,29,208,29,240,29,5,63,0,63,1,63,2,63,21,63,27,5,44,7,47, + 8,47,9,44,10,111,0,111,1,111,2,111,21,111,27,9,93,113,1,93,1,21,33,30,1,51,50,54,55,21,14,1,35,32,0,17,16,0,51,50, + 0,7,46,1,35,34,6,7,4,127,252,178,12,205,183,106,199,98,99,208,107,254,244,254,199,1,41,252,226,1,7,184,2,165,136,154,185,14,2,94, + 90,190,199,52,52,174,42,44,1,56,1,10,1,19,1,67,254,221,196,151,180,174,158,0,0,1,0,47,0,0,2,248,6,20,0,19,0,89,64,28, + 5,16,1,12,8,169,6,1,135,0,151,14,6,188,10,2,19,7,0,7,9,5,8,13,15,11,76,20,16,252,75,176,10,84,88,185,0,11,0,64, + 56,89,75,176,14,84,88,185,0,11,255,192,56,89,60,196,252,60,196,196,18,57,57,49,0,47,228,50,252,236,16,238,50,18,57,57,48,1,182,64, + 21,80,21,160,21,3,93,1,21,35,34,6,29,1,33,21,33,17,35,17,35,53,51,53,52,54,51,2,248,176,99,77,1,47,254,209,185,176,176,174, + 189,6,20,153,80,104,99,143,252,47,3,209,143,78,187,171,0,2,0,113,254,86,4,90,4,123,0,11,0,40,0,74,64,35,25,12,29,9,18,134, + 19,22,185,15,3,185,38,35,184,39,188,9,185,15,189,26,29,38,25,0,8,12,71,6,18,18,32,69,41,16,252,196,236,244,236,50,50,49,0,47, + 196,228,236,228,244,196,236,16,254,213,238,17,18,57,57,48,182,96,42,128,42,160,42,3,1,93,1,52,38,35,34,6,21,20,22,51,50,54,23,16, + 2,33,34,38,39,53,30,1,51,50,54,61,1,14,1,35,34,2,17,16,18,51,50,22,23,53,51,3,162,165,149,148,165,165,148,149,165,184,254,254, + 250,97,172,81,81,158,82,181,180,57,178,124,206,252,252,206,124,178,57,184,2,61,200,220,220,200,199,220,220,235,254,226,254,233,29,30,179,44,42,189, + 191,91,99,98,1,58,1,3,1,4,1,58,98,99,170,0,0,1,0,186,0,0,4,100,6,20,0,19,0,52,64,25,3,9,0,3,14,1,6,135, + 14,17,184,12,151,10,1,2,8,0,78,13,9,8,11,70,20,16,252,236,50,244,236,49,0,47,60,236,244,196,236,17,18,23,57,48,178,96,21,1, + 1,93,1,17,35,17,52,38,35,34,6,21,17,35,17,51,17,62,1,51,50,22,4,100,184,124,124,149,172,185,185,66,179,117,193,198,2,164,253,92, + 2,158,159,158,190,164,253,135,6,20,253,158,101,100,239,0,0,2,0,193,0,0,1,121,6,20,0,3,0,7,0,43,64,14,6,190,4,177,0,188, + 2,5,1,8,4,0,70,8,16,252,60,236,50,49,0,47,228,252,236,48,64,11,16,9,64,9,80,9,96,9,112,9,5,1,93,19,51,17,35,17, + 51,21,35,193,184,184,184,184,4,96,251,160,6,20,233,0,0,2,255,219,254,86,1,121,6,20,0,11,0,15,0,68,64,28,11,2,7,0,14,190, + 12,7,135,5,189,0,188,12,177,16,8,16,5,6,79,13,1,8,12,0,70,16,16,252,60,236,50,228,57,18,57,49,0,16,236,228,244,236,16,238, + 17,18,57,57,48,64,11,16,17,64,17,80,17,96,17,112,17,5,1,93,19,51,17,20,6,43,1,53,51,50,54,53,17,51,21,35,193,184,163,181, + 70,49,105,76,184,184,4,96,251,140,214,192,156,97,153,6,40,233,0,0,0,1,0,186,0,0,4,156,6,20,0,10,0,188,64,41,8,17,5,6, + 5,7,17,6,6,5,3,17,4,5,4,2,17,5,5,4,66,8,5,2,3,3,188,0,151,9,6,5,1,4,6,8,1,8,0,70,11,16,252,236, + 50,212,196,17,57,49,0,47,60,236,228,23,57,48,75,83,88,7,16,4,237,7,16,5,237,7,16,5,237,7,16,4,237,89,34,178,16,12,1,1, + 93,64,95,4,2,10,8,22,2,39,2,41,5,43,8,86,2,102,2,103,8,115,2,119,5,130,2,137,5,142,8,147,2,150,5,151,8,163,2,18, + 9,5,9,6,2,11,3,10,7,40,3,39,4,40,5,43,6,43,7,64,12,104,3,96,12,137,3,133,4,137,5,141,6,143,7,154,3,151,7,170, + 3,167,5,182,7,197,7,214,7,247,3,240,3,247,4,240,4,26,93,113,0,93,19,51,17,1,51,9,1,35,1,17,35,186,185,2,37,235,253,174, + 2,107,240,253,199,185,6,20,252,105,1,227,253,244,253,172,2,35,253,221,0,1,0,193,0,0,1,121,6,20,0,3,0,34,183,0,151,2,1,8, + 0,70,4,16,252,236,49,0,47,236,48,64,13,16,5,64,5,80,5,96,5,112,5,240,5,6,1,93,19,51,17,35,193,184,184,6,20,249,236,0, + 0,1,0,186,0,0,7,29,4,123,0,34,0,90,64,38,6,18,9,24,15,0,6,29,7,21,12,135,29,32,3,184,27,188,25,16,7,0,17,15, + 8,8,6,80,17,8,15,80,28,24,8,26,70,35,16,252,236,50,252,252,252,236,17,18,57,49,0,47,60,60,228,244,60,196,236,50,17,18,23,57, + 48,64,19,48,36,80,36,112,36,144,36,160,36,160,36,191,36,223,36,255,36,9,1,93,1,62,1,51,50,22,21,17,35,17,52,38,35,34,6,21, + 17,35,17,52,38,35,34,6,21,17,35,17,51,21,62,1,51,50,22,4,41,69,192,130,175,190,185,114,117,143,166,185,114,119,141,166,185,185,63,176, + 121,122,171,3,137,124,118,245,226,253,92,2,158,161,156,190,164,253,135,2,158,162,155,191,163,253,135,4,96,174,103,98,124,0,0,0,0,1,0,186, + 0,0,4,100,4,123,0,19,0,54,64,25,3,9,0,3,14,1,6,135,14,17,184,12,188,10,1,2,8,0,78,13,9,8,11,70,20,16,252,236, + 50,244,236,49,0,47,60,228,244,196,236,17,18,23,57,48,180,96,21,207,21,2,1,93,1,17,35,17,52,38,35,34,6,21,17,35,17,51,21,62, + 1,51,50,22,4,100,184,124,124,149,172,185,185,66,179,117,193,198,2,164,253,92,2,158,159,158,190,164,253,135,4,96,174,101,100,239,0,2,0,113, + 255,227,4,117,4,123,0,11,0,23,0,74,64,19,6,185,18,0,185,12,184,18,140,24,9,18,15,81,3,18,21,69,24,16,252,236,244,236,49,0, + 16,228,244,236,16,238,48,64,35,63,25,123,0,123,6,127,7,127,8,127,9,127,10,127,11,123,12,127,13,127,14,127,15,127,16,127,17,123,18,160, + 25,240,25,17,1,93,1,34,6,21,20,22,51,50,54,53,52,38,39,50,0,17,16,0,35,34,0,17,16,0,2,115,148,172,171,149,147,172,172,147, + 240,1,18,254,238,240,241,254,239,1,17,3,223,231,201,201,231,232,200,199,233,156,254,200,254,236,254,237,254,199,1,57,1,19,1,20,1,56,0,0, + 0,2,0,186,254,86,4,164,4,123,0,16,0,28,0,62,64,27,26,185,0,14,20,185,5,8,184,14,140,1,189,3,188,29,17,18,11,71,23,4, + 0,8,2,70,29,16,252,236,50,50,244,236,49,0,16,228,228,228,244,196,236,16,196,238,48,64,9,96,30,128,30,160,30,224,30,4,1,93,37,17, + 35,17,51,21,62,1,51,50,0,17,16,2,35,34,38,1,52,38,35,34,6,21,20,22,51,50,54,1,115,185,185,58,177,123,204,0,255,255,204,123, + 177,2,56,167,146,146,167,167,146,146,167,168,253,174,6,10,170,100,97,254,188,254,248,254,248,254,188,97,1,235,203,231,231,203,203,231,231,0,0,0, + 0,2,0,113,254,86,4,90,4,123,0,11,0,28,0,62,64,27,3,185,12,15,9,185,24,21,184,15,140,27,189,25,188,29,24,12,6,8,26,71, + 0,18,18,69,29,16,252,236,244,236,50,50,49,0,16,228,228,228,244,196,236,16,198,238,48,64,9,96,30,128,30,160,30,224,30,4,1,93,1,20, + 22,51,50,54,53,52,38,35,34,6,1,14,1,35,34,2,17,16,0,51,50,22,23,53,51,17,35,1,47,167,146,146,168,168,146,146,167,2,115,58, + 177,124,203,255,0,255,203,124,177,58,184,184,2,47,203,231,231,203,203,231,231,253,174,100,97,1,68,1,8,1,8,1,68,97,100,170,249,246,0,0, + 0,1,0,186,0,0,3,74,4,123,0,17,0,48,64,20,6,11,7,0,17,11,3,135,14,184,9,188,7,10,6,8,0,8,70,18,16,252,196,236, + 50,49,0,47,228,244,236,196,212,204,17,18,57,48,180,80,19,159,19,2,1,93,1,46,1,35,34,6,21,17,35,17,51,21,62,1,51,50,22,23, + 3,74,31,73,44,156,167,185,185,58,186,133,19,46,28,3,180,18,17,203,190,253,178,4,96,174,102,99,5,5,0,0,0,1,0,111,255,227,3,199, + 4,123,0,39,0,231,64,60,13,12,2,14,11,83,31,30,8,9,2,7,10,83,31,31,30,66,10,11,30,31,4,21,0,134,1,137,4,20,134,21, + 137,24,185,17,4,185,37,184,17,140,40,30,10,11,31,27,7,0,82,27,8,14,7,8,20,34,69,40,16,252,196,236,212,236,228,17,18,57,57,57, + 57,49,0,16,228,244,236,16,254,245,238,16,245,238,18,23,57,48,75,83,88,7,16,14,237,17,23,57,7,14,237,17,23,57,89,34,178,0,39,1, + 1,93,64,109,28,10,28,11,28,12,46,9,44,10,44,11,44,12,59,9,59,10,59,11,59,12,11,32,0,32,1,36,2,40,10,40,11,42,19,47, + 20,47,21,42,22,40,30,40,31,41,32,41,33,36,39,134,10,134,11,134,12,134,13,18,0,0,0,1,2,2,6,10,6,11,3,12,3,13,3,14, + 3,15,3,16,3,25,3,26,3,27,3,28,4,29,9,39,47,41,63,41,95,41,127,41,128,41,144,41,160,41,240,41,24,93,0,93,113,1,21,46, + 1,35,34,6,21,20,22,31,1,30,1,21,20,6,35,34,38,39,53,30,1,51,50,54,53,52,38,47,1,46,1,53,52,54,51,50,22,3,139,78, + 168,90,137,137,98,148,63,196,165,247,216,90,195,108,102,198,97,130,140,101,171,64,171,152,224,206,102,180,4,63,174,40,40,84,84,64,73,33,14,42, + 153,137,156,182,35,35,190,53,53,89,81,75,80,37,15,36,149,130,158,172,30,0,0,0,0,1,0,55,0,0,2,242,5,158,0,19,0,56,64,25, + 14,5,8,15,3,169,0,17,1,188,8,135,10,11,8,9,2,4,0,8,16,18,14,70,20,16,252,60,196,252,60,196,50,57,57,49,0,47,236,244, + 60,196,236,50,17,57,57,48,178,175,21,1,1,93,1,17,33,21,33,17,20,22,59,1,21,35,34,38,53,17,35,53,51,17,1,119,1,123,254,133, + 75,115,189,189,213,162,135,135,5,158,254,194,143,253,160,137,78,154,159,210,2,96,143,1,62,0,0,0,0,2,0,174,255,227,4,88,4,123,0,19, + 0,20,0,59,64,28,3,9,0,3,14,1,6,135,14,17,140,10,1,188,20,184,12,13,9,8,20,11,78,2,8,0,70,21,16,252,236,244,57,236, + 50,49,0,47,228,228,50,244,196,236,17,18,23,57,48,180,111,21,192,21,2,1,93,19,17,51,17,20,22,51,50,54,53,17,51,17,35,53,14,1, + 35,34,38,1,174,184,124,124,149,173,184,184,67,177,117,193,200,1,207,1,186,2,166,253,97,159,159,190,164,2,123,251,160,172,102,99,240,3,168,0, + 0,1,0,61,0,0,4,127,4,96,0,6,0,251,64,39,3,17,4,5,4,2,17,1,2,5,5,4,2,17,3,2,6,0,6,1,17,0,0,6, + 66,2,3,0,191,5,6,5,3,2,1,5,4,0,7,16,212,75,176,10,84,88,185,0,0,0,64,56,89,75,176,20,84,75,176,21,84,91,88,185, + 0,0,255,192,56,89,196,23,57,49,0,47,236,50,57,48,75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,89,34,1,64,142, + 72,2,106,2,123,2,127,2,134,2,128,2,145,2,164,2,8,6,0,6,1,9,3,9,4,21,0,21,1,26,3,26,4,38,0,38,1,41,3,41, + 4,32,8,53,0,53,1,58,3,58,4,48,8,70,0,70,1,73,3,73,4,70,5,72,6,64,8,86,0,86,1,89,3,89,4,80,8,102,0,102, + 1,105,3,105,4,103,5,104,6,96,8,117,0,116,1,123,3,123,4,117,5,122,6,133,0,133,1,137,3,137,4,137,5,134,6,150,0,150,1,151, + 2,154,3,152,4,152,5,151,6,168,5,167,6,176,8,192,8,223,8,255,8,62,93,0,93,19,51,9,1,51,1,35,61,195,1,94,1,94,195,254, + 92,250,4,96,252,84,3,172,251,160,0,0,0,1,0,86,0,0,6,53,4,96,0,12,1,235,64,73,5,85,6,5,9,10,9,4,85,10,9,3, + 85,10,11,10,2,85,1,2,11,11,10,6,17,7,8,7,5,17,4,5,8,8,7,2,17,3,2,12,0,12,1,17,0,0,12,66,10,5,2,3, + 6,3,0,191,11,8,12,11,10,9,8,6,5,4,3,2,1,11,7,0,13,16,212,75,176,10,84,75,176,17,84,91,75,176,18,84,91,75,176,19, + 84,91,75,176,11,84,91,88,185,0,0,0,64,56,89,1,75,176,12,84,75,176,13,84,91,75,176,16,84,91,88,185,0,0,255,192,56,89,204,23, + 57,49,0,47,60,236,50,50,23,57,48,75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,7,16,8,237,7,16,5,237,7,5, + 237,7,16,8,237,89,34,1,64,255,5,2,22,2,22,5,34,10,53,10,73,2,73,5,70,10,64,10,91,2,91,5,85,10,80,10,110,2,110,5, + 102,10,121,2,127,2,121,5,127,5,135,2,153,2,152,5,148,10,188,2,188,5,206,2,199,3,207,5,29,5,2,9,3,6,4,11,5,10,8,11, + 9,4,11,5,12,21,2,25,3,22,4,26,5,27,8,27,9,20,11,21,12,37,0,37,1,35,2,39,3,33,4,37,5,34,6,34,7,37,8,39, + 9,36,10,33,11,35,12,57,3,54,4,54,8,57,12,48,14,70,2,72,3,70,4,64,4,66,5,64,6,64,7,64,8,68,9,68,10,68,11,64, + 14,64,14,86,0,86,1,86,2,80,4,81,5,82,6,82,7,80,8,83,9,84,10,85,11,99,0,100,1,101,2,106,3,101,4,106,5,106,6,106, + 7,110,9,97,11,103,12,111,14,117,0,117,1,121,2,125,3,120,4,125,5,122,6,127,6,122,7,127,7,120,8,121,9,127,9,123,10,118,11,125, + 12,135,2,136,5,143,14,151,0,151,1,148,2,147,3,156,4,155,5,152,6,152,7,153,8,64,47,150,12,159,14,166,0,166,1,164,2,164,3,171, + 4,171,5,169,6,169,7,171,8,164,12,175,14,181,2,177,3,189,4,187,5,184,9,191,14,196,2,195,3,204,4,202,5,121,93,0,93,19,51,27, + 1,51,27,1,51,1,35,11,1,35,86,184,230,229,217,230,229,184,254,219,217,241,242,217,4,96,252,150,3,106,252,150,3,106,251,160,3,150,252,106, + 0,1,0,59,0,0,4,121,4,96,0,11,1,67,64,70,5,17,6,7,6,4,17,3,4,7,7,6,4,17,5,4,1,2,1,3,17,2,2,1, + 11,17,0,1,0,10,17,9,10,1,1,0,10,17,11,10,7,8,7,9,17,8,8,7,66,10,7,4,1,4,8,0,191,5,2,10,7,4,1,4, + 8,0,2,8,6,12,16,212,75,176,10,84,75,176,15,84,91,75,176,16,84,91,75,176,17,84,91,88,185,0,6,0,64,56,89,75,176,20,84,88, + 185,0,6,255,192,56,89,196,212,196,17,23,57,49,0,47,60,236,50,23,57,48,75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5, + 237,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,89,34,1,64,152,10,4,4,10,26,4,21,10,38,10,61,4,49,10,85,4,87,7, + 88,10,102,10,118,1,122,4,118,7,116,10,141,4,130,10,153,4,159,4,151,7,146,10,144,10,166,1,169,4,175,4,165,7,163,10,160,10,28,10, + 3,4,5,5,9,10,11,26,3,21,5,21,9,26,11,41,3,38,5,37,9,42,11,32,13,58,1,57,3,55,5,52,7,54,9,57,11,48,13,73, + 3,70,5,69,9,74,11,64,13,89,0,86,1,89,2,89,3,87,5,86,6,89,7,86,8,86,9,89,11,80,13,111,13,120,1,127,13,155,1,148, + 7,171,1,164,7,176,13,207,13,223,13,255,13,47,93,0,93,9,2,35,9,1,35,9,1,51,9,1,4,100,254,107,1,170,217,254,186,254,186,217, + 1,179,254,114,217,1,41,1,41,4,96,253,223,253,193,1,184,254,72,2,74,2,22,254,113,1,143,0,0,1,0,61,254,86,4,127,4,96,0,15, + 1,139,64,67,7,8,2,9,17,0,15,10,17,11,10,0,0,15,14,17,15,0,15,13,17,12,13,0,0,15,13,17,14,13,10,11,10,12,17,11, + 11,10,66,13,11,9,16,0,11,5,135,3,189,14,11,188,16,14,13,12,10,9,6,3,0,8,15,4,15,11,16,16,212,75,176,10,84,75,176,8, + 84,91,88,185,0,11,0,64,56,89,75,176,20,84,88,185,0,11,255,192,56,89,196,196,17,23,57,49,0,16,228,50,244,236,17,57,17,57,18,57, + 48,75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,7,16,8,237,7,5,237,23,50,89,34,1,64,240,6,0,5,8,6,9, + 3,13,22,10,23,13,16,13,35,13,53,13,73,10,79,10,78,13,90,9,90,10,106,10,135,13,128,13,147,13,18,10,0,10,9,6,11,5,12,11, + 14,11,15,23,1,21,2,16,4,16,5,23,10,20,11,20,12,26,14,26,15,39,0,36,1,36,2,32,4,32,5,41,8,40,9,37,10,36,11,36, + 12,39,13,42,14,42,15,32,17,55,0,53,1,53,2,48,4,48,5,56,10,54,11,54,12,56,13,57,14,57,15,48,17,65,0,64,1,64,2,64, + 3,64,4,64,5,64,6,64,7,64,8,66,9,69,10,71,13,73,14,73,15,64,17,84,0,81,1,81,2,85,3,80,4,80,5,86,6,85,7,86, + 8,87,9,87,10,85,11,85,12,89,14,89,15,80,17,102,1,102,2,104,10,105,14,105,15,96,17,123,8,120,14,120,15,137,0,138,9,133,11,133, + 12,137,13,137,14,137,15,153,9,149,11,149,12,154,14,154,15,164,11,164,12,171,14,171,15,176,17,207,17,223,17,255,17,101,93,0,93,5,14,1, + 43,1,53,51,50,54,63,1,1,51,9,1,51,2,147,78,148,124,147,108,76,84,51,33,254,59,195,1,94,1,94,195,104,200,122,154,72,134,84,4, + 78,252,148,3,108,0,0,0,0,1,0,88,0,0,3,219,4,96,0,9,0,157,64,26,8,17,2,3,2,3,17,7,8,7,66,8,169,0,188,3, + 169,5,8,3,1,0,4,1,6,10,16,220,75,176,11,84,75,176,12,84,91,88,185,0,6,255,192,56,89,75,176,19,84,88,185,0,6,0,64,56, + 89,196,50,196,17,57,57,49,0,47,236,244,236,48,75,83,88,7,16,5,237,7,16,5,237,89,34,1,64,66,5,2,22,2,38,2,71,2,73,7, + 5,11,8,15,11,24,3,27,8,43,8,32,11,54,3,57,8,48,11,64,1,64,2,69,3,64,4,64,5,67,8,87,3,89,8,95,11,96,1,96, + 2,102,3,96,4,96,5,98,8,127,11,128,11,175,11,27,93,0,93,19,33,21,1,33,21,33,53,1,33,113,3,106,253,76,2,180,252,125,2,180, + 253,101,4,96,168,252,219,147,168,3,37,0,0,1,1,0,254,178,4,23,6,20,0,36,0,119,64,52,25,15,21,11,6,37,9,26,16,21,29,11, + 5,32,33,3,0,11,169,9,0,169,1,192,9,21,169,19,177,37,12,9,10,5,36,22,25,0,29,10,5,19,2,20,0,32,25,67,10,15,5,37, + 16,212,75,176,12,84,88,185,0,5,0,64,56,89,60,196,252,60,196,50,57,57,17,18,57,17,18,57,57,17,18,57,57,49,0,16,252,236,196,244, + 236,16,238,18,23,57,18,57,17,57,57,17,18,57,17,18,57,57,48,1,178,0,38,1,93,5,21,35,34,38,61,1,52,38,43,1,53,51,50,54, + 61,1,52,54,59,1,21,35,34,6,29,1,20,6,7,30,1,29,1,20,22,51,4,23,62,249,169,108,142,61,61,143,107,169,249,62,68,141,86,91, + 110,111,90,86,141,190,144,148,221,239,151,116,143,115,149,240,221,147,143,88,141,248,157,142,25,27,142,156,248,141,88,0,0,1,1,4,254,29,1,174, + 6,29,0,3,0,18,183,1,0,177,4,0,5,2,4,16,212,236,49,0,16,252,204,48,1,17,35,17,1,174,170,6,29,248,0,8,0,0,0,0, + 0,1,1,0,254,178,4,23,6,20,0,36,0,135,64,54,31,37,27,22,12,15,8,27,11,21,25,15,4,5,32,3,0,25,169,27,0,169,35,192, + 27,15,169,17,177,37,28,25,26,21,15,1,4,0,8,26,21,35,18,4,0,26,31,21,67,16,0,11,4,37,16,212,75,176,10,84,88,185,0,4, + 255,192,56,89,75,176,14,84,88,185,0,4,0,64,56,89,60,196,50,252,60,196,17,18,57,57,17,18,57,17,18,57,57,17,18,57,57,49,0,16, + 252,236,196,244,236,16,238,18,23,57,17,18,57,57,17,57,17,57,57,17,18,57,48,1,178,0,38,1,93,5,51,50,54,61,1,52,54,55,46,1, + 61,1,52,38,43,1,53,51,50,22,29,1,20,22,59,1,21,35,34,6,29,1,20,6,43,1,1,0,70,140,85,90,111,111,90,85,140,70,63,249, + 167,108,142,62,62,142,108,167,249,63,190,86,143,248,156,142,27,25,142,157,248,142,87,143,147,221,240,149,115,143,116,151,239,221,148,0,0,1,0,217, + 1,211,5,219,3,49,0,29,0,35,64,16,1,16,27,12,0,19,4,156,27,19,156,12,30,0,15,30,16,212,196,49,0,16,212,252,212,236,16,192, + 17,18,57,57,48,1,21,14,1,35,34,39,38,39,38,39,38,35,34,6,7,53,62,1,51,50,23,22,23,22,23,22,51,50,54,5,219,105,179,97, + 110,146,11,5,7,15,155,94,88,172,98,105,179,97,110,147,10,5,8,14,155,94,86,169,3,49,178,79,68,59,4,2,3,5,62,77,83,178,79,69, + 60,4,2,3,5,62,76,0,0,2,1,53,0,0,2,0,5,213,0,3,0,9,0,98,64,15,7,0,131,2,129,4,8,7,4,0,3,5,1,0, + 10,16,252,60,236,50,57,57,49,0,47,244,252,204,48,1,75,176,11,84,88,189,0,10,0,64,0,1,0,10,0,10,255,192,56,17,55,56,89,1, + 75,176,15,84,75,176,16,84,91,75,176,19,84,91,88,189,0,10,255,192,0,1,0,10,0,10,0,64,56,17,55,56,89,182,0,11,32,11,80,11, + 3,93,1,35,53,51,17,35,17,19,51,19,2,0,203,203,203,21,162,20,4,215,254,250,43,2,143,1,101,254,155,0,0,2,0,172,254,199,4,35, + 5,152,0,6,0,33,0,81,64,43,19,22,20,0,15,12,1,11,7,134,8,136,11,16,134,15,136,12,185,20,22,11,185,29,31,28,184,22,140,34, + 28,21,0,9,30,19,11,15,7,4,18,25,34,16,220,236,212,60,212,60,60,236,50,50,49,0,16,228,244,60,196,236,16,196,254,244,238,16,245,238, + 18,57,17,18,57,17,18,57,48,37,17,14,1,21,20,22,1,21,46,1,39,3,62,1,55,21,14,1,7,17,35,17,38,0,17,16,0,55,17,51, + 19,30,1,2,166,147,164,164,2,16,74,136,68,1,70,137,72,65,137,77,102,241,254,247,1,9,241,102,1,73,137,131,3,88,18,226,184,185,226,3, + 161,172,41,42,3,252,160,5,42,39,170,30,35,7,254,228,1,32,20,1,51,1,1,1,2,1,50,22,1,31,254,225,4,33,0,0,0,1,0,129, + 0,0,4,98,5,240,0,27,0,96,64,33,7,22,8,1,134,0,18,10,169,20,8,12,4,160,0,148,25,145,16,12,160,14,0,13,9,11,7,28, + 19,15,21,17,28,16,220,60,204,204,252,60,196,212,196,49,0,47,236,50,244,228,236,16,212,60,238,50,16,238,17,57,57,48,1,75,176,12,84,88, + 189,0,28,255,192,0,1,0,28,0,28,0,64,56,17,55,56,89,180,54,1,54,2,2,0,93,1,21,46,1,35,34,6,29,1,33,21,33,17,33, + 21,33,53,51,17,35,53,51,53,16,54,51,50,22,4,78,76,136,61,148,116,1,135,254,121,2,45,252,31,236,199,199,214,232,61,151,5,180,182,41, + 41,155,212,215,143,254,47,170,170,1,209,143,238,1,5,243,31,0,0,0,0,2,0,94,0,82,4,188,4,178,0,35,0,47,0,131,64,73,3,9, + 27,21,4,45,30,0,39,28,2,33,29,12,18,45,20,11,10,3,19,15,1,29,45,185,19,235,15,236,39,185,29,235,33,48,30,12,0,18,4,42, + 36,20,48,28,21,27,42,29,19,28,24,9,3,36,11,10,1,3,2,36,40,2,115,6,116,42,40,28,115,24,48,16,220,228,236,244,228,236,18,23, + 57,18,57,57,17,18,57,57,18,57,57,17,18,57,17,18,23,57,49,0,16,212,228,236,244,228,236,16,192,17,18,23,57,18,57,57,17,18,57,57, + 17,57,57,18,23,57,48,1,55,23,7,30,1,21,20,6,7,23,7,39,14,1,35,34,38,39,7,39,55,46,1,53,52,54,55,39,55,23,62,1, + 51,50,22,19,52,38,35,34,6,21,20,22,51,50,54,3,123,207,114,206,37,36,38,40,209,114,207,59,116,61,58,120,61,207,113,207,37,37,38,38, + 207,115,207,55,116,64,60,117,92,155,114,112,158,157,113,113,156,3,225,209,115,206,59,119,62,63,115,57,207,113,207,40,38,37,37,207,115,206,62,118, + 58,64,116,56,206,115,207,39,37,36,254,124,112,154,154,112,114,156,157,0,0,1,0,82,0,0,4,195,5,213,0,24,0,198,64,70,16,2,17,22, + 17,15,2,14,15,22,22,17,15,2,16,15,8,13,8,14,2,13,13,8,66,15,11,9,4,0,211,23,6,18,11,211,20,9,16,13,129,2,12,9, + 14,3,5,22,15,3,21,18,16,3,0,17,102,19,0,101,1,28,13,102,10,5,101,7,3,25,16,212,60,236,50,236,252,236,50,236,18,23,57,18, + 57,57,17,23,57,49,0,47,228,50,212,60,236,50,212,60,236,50,17,18,57,48,75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5, + 237,89,34,1,75,176,12,84,88,189,0,25,255,192,0,1,0,25,0,25,0,64,56,17,55,56,89,64,40,134,15,144,15,166,15,160,15,181,15,5, + 39,12,39,13,39,14,41,16,40,17,40,18,55,14,57,16,135,12,136,18,166,13,165,14,170,16,169,17,14,93,0,93,1,33,17,35,17,33,53,33, + 53,39,33,53,33,1,51,9,1,51,1,33,21,33,7,21,33,4,141,254,99,201,254,96,1,160,84,254,180,1,8,254,195,190,1,123,1,121,191,254, + 194,1,8,254,181,84,1,159,1,199,254,57,1,199,123,51,155,123,2,74,253,68,2,188,253,182,123,155,51,0,0,0,0,2,1,4,254,162,1,174, + 5,152,0,3,0,7,0,28,64,13,1,245,0,4,245,5,8,4,0,5,6,2,8,16,220,60,236,50,49,0,16,212,236,212,236,48,1,17,35,17, + 19,17,35,17,1,174,170,170,170,1,152,253,10,2,246,4,0,253,10,2,246,0,0,0,0,2,0,92,255,61,3,162,5,240,0,11,0,62,0,145, + 64,60,47,48,42,6,0,23,29,48,54,4,13,39,138,38,13,138,12,42,198,38,197,35,16,198,12,197,60,145,35,63,47,6,0,23,48,4,19,29, + 45,9,54,3,19,87,57,45,87,32,9,87,12,34,26,57,38,34,3,87,51,63,16,220,236,228,196,212,228,236,212,236,16,238,17,57,17,18,57,17, + 23,57,57,49,0,16,196,244,228,236,16,230,238,16,238,16,238,17,23,57,57,57,17,18,57,48,1,75,176,10,84,75,176,11,84,91,75,176,12,84, + 91,75,176,14,84,91,88,189,0,63,0,64,0,1,0,63,0,63,255,192,56,17,55,56,89,1,14,1,21,20,22,23,62,1,53,52,38,19,21,46, + 1,35,34,6,21,20,23,22,23,30,1,21,20,6,7,30,1,21,20,6,35,34,38,39,53,30,1,51,50,54,53,52,47,1,46,1,53,52,54,55, + 46,1,53,52,54,51,50,22,1,123,63,62,139,250,63,62,143,204,83,143,56,97,108,206,26,14,211,131,92,93,62,57,204,173,73,154,88,87,148,58, + 102,113,221,25,214,128,93,91,59,59,200,166,73,153,3,168,46,90,46,76,133,135,45,91,46,75,136,2,147,164,39,39,80,71,90,115,15,8,119,154, + 101,90,140,53,52,109,64,142,168,29,29,164,39,39,84,76,102,123,14,120,153,102,91,143,49,44,112,69,130,159,29,0,0,2,0,215,5,70,3,41, + 6,16,0,3,0,7,0,146,64,14,6,2,206,4,0,205,8,1,100,0,5,100,4,8,16,220,252,212,236,49,0,16,252,60,236,50,48,0,75,176, + 10,84,75,176,13,84,91,88,189,0,8,0,64,0,1,0,8,0,8,255,192,56,17,55,56,89,1,75,176,12,84,75,176,13,84,91,75,176,14,84, + 91,75,176,23,84,91,88,189,0,8,255,192,0,1,0,8,0,8,0,64,56,17,55,56,89,1,75,176,15,84,75,176,25,84,91,88,189,0,8,0, + 64,0,1,0,8,0,8,255,192,56,17,55,56,89,64,17,96,1,96,2,96,5,96,6,112,1,112,2,112,5,112,6,8,93,1,51,21,35,37,51, + 21,35,2,94,203,203,254,121,203,203,6,16,202,202,202,0,0,3,1,27,0,0,6,229,5,205,0,23,0,47,0,73,0,67,64,38,61,203,62,58, + 204,65,202,36,49,203,48,52,204,71,202,24,201,0,200,36,201,12,55,97,68,61,48,94,42,9,6,68,94,30,9,6,18,74,16,220,204,252,236,16, + 254,237,50,16,238,49,0,47,238,246,254,253,238,214,238,16,253,238,214,238,48,1,50,4,23,22,18,21,20,2,7,6,4,35,34,36,39,38,2,53, + 52,18,55,54,36,23,34,6,7,14,1,21,20,22,23,30,1,51,50,54,55,62,1,53,52,38,39,46,1,23,21,46,1,35,34,6,21,20,22,51, + 50,54,55,21,14,1,35,34,38,53,52,54,51,50,22,4,0,152,1,7,109,109,108,108,109,109,254,249,152,152,254,249,109,109,108,108,109,109,1,7, + 152,131,226,94,94,96,96,94,94,226,131,132,227,94,93,93,94,92,94,227,167,66,130,66,149,167,171,155,64,122,66,67,137,70,216,251,251,216,73,136, + 5,205,110,109,109,254,250,154,152,254,251,109,109,110,110,109,109,1,5,152,154,1,6,109,109,110,103,94,94,94,229,130,129,227,94,94,95,95,94,93, + 226,131,133,227,93,94,94,245,129,33,32,175,157,159,174,31,34,127,29,28,244,208,209,242,28,0,0,0,0,3,0,115,1,213,3,59,5,240,0,3, + 0,30,0,41,0,95,64,51,40,7,37,4,31,18,24,16,2,227,0,31,221,16,0,225,37,221,5,10,25,223,24,222,21,221,10,224,28,145,42,0, + 24,13,31,16,34,6,2,1,40,17,6,107,4,108,24,34,107,13,42,16,220,236,204,252,236,50,50,192,192,17,18,57,57,17,18,57,49,0,16,244, + 228,252,244,236,16,196,238,237,214,238,16,238,17,18,57,18,57,17,57,57,48,19,33,21,33,1,17,35,53,14,1,35,34,38,53,52,54,59,1,53, + 52,38,35,34,6,7,53,62,1,51,50,22,5,34,6,21,20,22,51,50,54,61,1,139,2,176,253,80,2,174,149,44,144,93,128,152,191,188,182,117, + 117,62,136,68,73,145,69,183,179,254,236,161,126,98,82,104,130,2,80,123,2,184,254,64,112,63,68,135,113,135,138,4,91,91,34,34,127,28,28,176, + 240,67,79,64,77,144,114,29,0,2,0,158,0,141,4,37,4,35,0,6,0,13,0,134,64,73,3,232,4,5,4,2,232,1,2,5,5,4,2,232, + 3,2,6,0,6,1,232,0,0,6,10,232,11,12,11,9,232,8,9,12,12,11,9,232,10,9,13,7,13,8,232,7,7,13,66,9,2,11,4,231, + 7,0,166,14,9,12,5,2,7,3,0,111,5,10,7,111,12,110,14,16,252,252,60,212,236,50,17,57,17,18,57,49,0,16,244,60,236,50,57,57, + 48,75,83,88,7,16,4,237,7,16,8,237,7,16,8,237,7,16,4,237,7,16,4,237,7,16,8,237,7,16,8,237,7,16,4,237,89,34,1,21, + 9,1,21,1,53,19,21,9,1,21,1,53,4,37,254,211,1,45,254,43,35,254,211,1,45,254,43,4,35,191,254,244,254,244,191,1,162,82,1,162, + 191,254,244,254,244,191,1,162,82,0,0,0,0,1,0,217,1,31,5,219,3,94,0,5,0,23,64,10,4,156,2,0,6,3,23,1,0,6,16,220, + 212,236,49,0,16,212,196,236,48,19,33,17,35,17,33,217,5,2,168,251,166,3,94,253,193,1,149,0,0,1,0,100,1,223,2,127,2,131,0,3, + 0,17,182,0,156,2,4,1,0,4,16,220,204,49,0,16,212,236,48,19,33,21,33,100,2,27,253,229,2,131,164,0,0,4,1,27,0,0,6,229, + 5,205,0,23,0,47,0,56,0,76,0,96,64,54,69,66,67,63,50,201,72,48,201,57,74,67,202,12,57,202,0,201,24,200,12,201,36,72,69,51, + 48,4,49,66,60,63,57,54,73,49,96,75,54,96,67,60,94,18,9,30,75,94,6,9,30,95,42,77,16,220,228,252,236,16,254,253,196,238,16,238, + 50,17,57,57,18,57,18,23,57,49,0,47,238,246,254,237,16,237,50,16,238,214,238,57,18,57,57,48,1,34,6,7,14,1,21,20,22,23,30,1, + 51,50,54,55,62,1,53,52,38,39,46,1,39,50,4,23,22,18,21,20,2,7,6,4,35,34,36,39,38,2,53,52,18,55,54,36,19,35,17,51, + 50,54,53,52,38,39,50,22,21,20,6,7,30,1,31,1,35,39,46,1,43,1,17,35,17,4,0,131,226,94,94,96,96,94,94,226,131,132,227,94, + 93,93,94,92,94,227,132,152,1,7,109,109,108,108,109,109,254,249,152,152,254,249,109,109,108,108,109,109,1,7,125,123,123,110,87,88,102,176,174,105, + 96,24,67,46,137,172,129,59,73,54,66,155,5,102,94,94,94,229,130,129,227,94,94,95,95,94,93,226,131,133,227,93,94,94,103,110,109,109,254,250, + 154,152,254,251,109,109,110,110,109,109,1,5,152,154,1,6,109,109,110,254,98,254,236,62,75,76,63,103,119,121,86,112,17,8,77,73,223,209,96,51, + 254,156,3,68,0,1,0,213,5,98,3,43,5,246,0,3,0,47,183,2,239,0,238,4,1,0,4,16,212,204,49,0,16,252,236,48,0,75,176,9, + 84,75,176,14,84,91,88,189,0,4,255,192,0,1,0,4,0,4,0,64,56,17,55,56,89,19,33,21,33,213,2,86,253,170,5,246,148,0,0,0, + 0,2,0,195,3,117,3,61,5,240,0,11,0,26,0,32,64,17,6,195,21,196,0,195,12,145,27,9,90,18,91,3,90,24,27,16,220,236,252,236, + 49,0,16,244,236,252,236,48,1,34,6,21,20,22,51,50,54,53,52,38,39,50,22,23,30,1,21,20,6,35,34,38,53,52,54,2,0,80,110,110, + 80,80,110,111,79,64,118,43,46,46,185,134,135,180,184,5,111,111,80,79,109,109,79,79,112,129,49,46,45,114,66,132,183,180,135,134,186,0,0,0, + 0,2,0,217,0,0,5,219,5,4,0,11,0,15,0,46,64,24,5,208,7,3,156,0,208,9,1,12,156,14,13,2,21,4,0,23,12,8,21,10, + 6,16,16,212,60,236,50,252,60,236,50,49,0,47,236,212,60,236,252,60,236,48,1,17,33,21,33,17,35,17,33,53,33,17,1,33,21,33,3,174, + 2,45,253,211,168,253,211,2,45,253,211,5,2,250,254,5,4,254,125,170,254,125,1,131,170,1,131,251,166,170,0,0,0,1,0,94,2,156,2,180, + 5,240,0,24,0,74,64,36,0,125,6,4,0,23,125,6,6,4,66,4,2,0,14,221,15,0,221,2,247,11,221,15,18,145,25,0,14,8,126,1, + 21,14,3,25,16,220,196,212,196,236,17,57,49,0,16,244,196,236,252,236,16,238,17,18,57,48,75,83,88,7,16,5,237,23,50,7,5,237,89,34, + 1,33,21,33,53,54,55,0,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,1,6,1,12,1,168,253,170,34,63,1,88,104,85,52,122,72, + 77,133,57,145,174,254,181,56,3,14,114,110,31,56,1,49,94,66,81,35,35,123,28,28,132,108,139,254,228,48,0,0,0,1,0,98,2,141,2,205, + 5,240,0,40,0,72,64,39,0,21,19,10,221,9,31,221,32,19,221,21,13,221,9,248,6,247,28,221,32,248,35,145,41,22,19,0,20,25,126,38, + 16,126,3,20,31,9,41,16,220,196,196,212,236,212,236,17,57,57,57,49,0,16,244,228,236,252,228,236,212,236,16,238,16,238,17,18,57,48,1,30, + 1,21,20,6,35,34,38,39,53,30,1,51,50,54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,6,2, + 12,92,101,190,177,57,125,70,52,119,67,109,120,111,108,86,94,94,97,100,95,40,102,81,73,128,55,144,169,90,4,96,18,109,82,124,134,21,20,121, + 27,26,79,70,74,76,108,63,60,58,61,18,23,115,17,18,118,99,69,96,0,1,1,115,4,238,3,82,6,102,0,3,0,49,64,9,2,180,0,179, + 4,3,68,1,4,16,212,236,49,0,16,244,236,48,0,75,176,9,84,75,176,14,84,91,88,189,0,4,255,192,0,1,0,4,0,4,0,64,56,17, + 55,56,89,1,51,1,35,2,139,199,254,186,153,6,102,254,136,0,0,0,0,1,0,174,254,86,4,229,4,96,0,32,0,77,64,37,19,25,31,3, + 22,6,3,9,12,3,1,18,15,6,135,28,22,140,10,1,188,0,189,33,25,9,18,9,8,11,78,31,2,8,0,70,33,16,252,236,50,244,236,196, + 18,57,49,0,16,228,228,50,244,60,236,220,196,17,23,57,17,18,23,57,48,182,31,34,96,34,207,34,3,1,93,19,17,51,17,20,22,51,50,54, + 53,17,51,17,20,22,51,50,54,55,21,14,1,35,34,38,39,14,1,35,34,38,39,17,174,184,138,135,148,149,184,35,37,9,32,28,41,73,35,69, + 82,15,50,145,98,102,143,42,254,86,6,10,253,72,145,148,168,168,2,141,252,162,60,57,11,12,148,23,22,78,80,79,79,78,78,253,215,0,0,0, + 0,1,0,158,255,59,4,57,5,213,0,13,0,37,64,18,8,2,4,193,0,129,6,2,14,0,7,93,5,3,93,1,11,14,16,212,212,252,220,236, + 57,49,0,16,196,50,244,236,17,57,48,1,33,17,35,17,35,17,35,17,46,1,53,52,36,2,121,1,192,141,190,142,215,235,1,4,5,213,249,102, + 6,31,249,225,3,78,17,221,184,190,232,0,0,1,0,219,2,72,1,174,3,70,0,3,0,18,183,2,131,0,4,1,25,0,4,16,212,236,49,0, + 16,212,236,48,19,51,21,35,219,211,211,3,70,254,0,0,0,1,1,35,254,117,2,193,0,0,0,19,0,31,64,14,9,6,10,13,243,6,0,19, + 0,16,39,3,9,20,16,220,212,236,212,204,49,0,47,212,252,196,18,57,48,33,30,1,21,20,6,35,34,38,39,53,30,1,51,50,54,53,52,38, + 39,2,84,55,54,120,118,46,87,43,34,74,47,59,60,43,45,62,105,48,89,91,12,12,131,17,15,48,46,30,87,61,0,1,0,137,2,156,2,197, + 5,223,0,10,0,44,64,24,7,0,221,9,3,221,4,2,221,9,247,5,145,11,8,124,6,93,3,124,1,124,0,11,16,220,244,228,252,228,49,0, + 16,244,236,236,212,236,16,238,50,48,19,51,17,7,53,55,51,17,51,21,33,156,204,223,230,137,205,253,215,3,10,2,99,41,116,39,253,43,110,0, + 0,3,0,96,1,213,3,100,5,240,0,3,0,15,0,27,0,46,64,25,2,227,0,225,22,221,10,224,16,221,4,145,28,0,19,13,1,25,107,7, + 108,19,107,13,28,16,220,236,252,236,57,17,18,57,49,0,16,244,236,244,236,252,236,48,19,33,21,33,1,50,22,21,20,6,35,34,38,53,52,54, + 23,34,6,21,20,22,51,50,54,53,52,38,139,2,176,253,80,1,88,179,206,206,179,179,208,208,179,105,126,127,104,105,125,124,2,80,123,4,27,221, + 191,191,219,220,190,191,221,115,161,136,133,160,160,133,137,160,0,2,0,193,0,141,4,72,4,35,0,6,0,13,0,134,64,73,12,232,13,12,9,10, + 9,11,232,10,10,9,13,232,7,8,7,12,232,11,12,8,8,7,5,232,6,5,2,3,2,4,232,3,3,2,6,232,0,1,0,5,232,4,5,1, + 1,0,66,12,5,10,3,231,7,0,166,14,12,8,1,5,0,8,111,10,7,1,111,3,0,112,14,16,252,60,252,212,60,236,18,57,17,18,57,49, + 0,16,244,60,236,50,57,57,48,75,83,88,7,16,8,237,7,16,4,237,7,16,4,237,7,16,8,237,7,16,8,237,7,16,4,237,7,16,4,237, + 7,16,8,237,89,34,19,1,21,1,53,9,1,37,1,21,1,53,9,1,193,1,213,254,43,1,45,254,211,1,178,1,213,254,43,1,45,254,211,4, + 35,254,94,82,254,94,191,1,12,1,12,191,254,94,82,254,94,191,1,12,1,12,0,0,255,255,0,137,255,227,7,127,5,240,16,38,0,123,0,0, + 16,39,11,75,4,139,253,100,16,7,11,34,3,53,0,0,255,255,0,137,255,227,7,63,5,240,16,38,0,123,0,0,16,39,0,116,4,139,253,100, + 16,7,11,34,3,53,0,0,255,255,0,98,255,227,7,127,5,240,16,38,0,117,0,0,16,39,11,75,4,139,253,100,16,7,11,34,3,53,0,0, + 0,2,0,143,255,227,3,172,5,213,0,32,0,36,0,134,64,47,32,26,5,2,4,6,25,0,16,134,15,136,12,0,33,131,35,12,149,19,140,35, + 129,37,6,34,25,22,9,5,1,0,26,34,9,0,28,1,34,28,33,38,15,9,28,22,37,16,220,236,212,252,236,212,236,17,18,57,17,18,57,17, + 18,57,18,57,49,0,16,228,244,236,16,254,205,16,244,238,18,57,57,23,57,48,1,75,176,16,84,75,176,18,84,91,75,176,19,84,91,88,189,0, + 37,255,192,0,1,0,37,0,37,0,64,56,17,55,56,89,64,11,116,4,116,5,116,6,116,7,118,28,5,93,1,51,21,20,6,15,1,14,1,21, + 20,22,51,50,54,55,21,14,1,35,34,38,53,52,54,63,1,62,1,55,62,1,53,19,35,53,51,1,244,190,55,90,90,58,51,131,109,78,180,96, + 94,192,103,184,224,73,89,88,48,38,8,7,6,196,202,202,4,68,156,101,130,87,88,53,94,49,89,110,70,67,188,57,56,194,159,76,137,86,86,47, + 53,25,21,60,54,1,14,254,255,255,0,16,0,0,5,104,7,107,18,38,0,36,0,0,16,7,22,188,4,188,1,117,255,255,0,16,0,0,5,104, + 7,107,18,38,0,36,0,0,16,7,22,186,4,188,1,117,255,255,0,16,0,0,5,104,7,109,18,38,0,36,0,0,17,7,22,189,4,188,1,117, + 0,16,180,5,13,17,10,7,43,64,5,15,13,0,17,2,93,49,0,0,255,255,0,16,0,0,5,104,7,94,18,38,0,36,0,0,17,7,22,187, + 4,188,1,117,0,20,180,10,20,35,5,7,43,64,9,64,20,79,35,32,20,47,35,4,93,49,0,0,255,255,0,16,0,0,5,104,7,78,18,38, + 0,36,0,0,17,7,22,185,4,188,1,117,0,20,180,10,18,13,5,7,43,64,9,48,18,63,13,0,18,15,13,4,93,49,0,0,0,3,0,16, + 0,0,5,104,7,109,0,11,0,14,0,33,0,203,64,84,12,17,13,12,27,28,27,14,17,28,27,30,17,28,27,29,17,28,28,27,13,17,33,15, + 33,12,17,14,12,15,15,33,32,17,15,33,31,17,33,15,33,66,12,27,15,13,9,3,193,21,9,30,149,13,9,142,32,28,30,29,28,24,32,31, + 33,13,18,6,14,24,12,6,27,0,86,24,28,15,6,86,18,28,33,34,16,212,196,212,236,50,16,212,238,50,17,57,17,57,17,18,57,17,57,57, + 17,18,57,57,49,0,47,60,230,214,238,16,212,238,17,18,57,57,57,48,75,83,88,7,16,5,237,7,5,237,7,16,8,237,7,16,5,237,7,16, + 5,237,7,5,237,7,5,237,7,16,8,237,89,34,178,32,35,1,1,93,64,32,26,12,115,12,155,12,3,7,15,8,27,80,35,102,13,105,14,117, + 13,123,14,121,28,121,29,118,32,118,33,128,35,12,93,0,93,1,52,38,35,34,6,21,20,22,51,50,54,3,1,33,1,46,1,53,52,54,51,50, + 22,21,20,6,7,1,35,3,33,3,35,3,84,89,63,64,87,88,63,63,89,152,254,240,2,33,254,88,61,62,159,115,114,161,63,60,2,20,210,136, + 253,95,136,213,6,90,63,89,87,65,63,88,88,254,243,253,25,3,78,41,115,73,115,160,161,114,70,118,41,250,139,1,127,254,129,0,0,2,0,8, + 0,0,7,72,5,213,0,15,0,19,0,135,64,57,17,17,14,15,14,16,17,15,15,14,13,17,15,14,12,17,14,15,14,66,5,149,3,11,149,17, + 1,149,16,149,0,129,17,7,149,3,173,13,9,17,16,15,13,12,5,14,10,0,4,8,6,2,28,18,10,14,20,16,212,212,60,236,50,212,196,196, + 17,18,23,57,49,0,47,60,236,236,196,244,236,236,16,238,16,238,48,75,83,88,7,16,5,237,7,5,237,7,16,5,237,7,16,5,237,89,34,178, + 128,21,1,1,93,64,19,103,17,119,16,119,17,134,12,133,16,150,17,144,21,160,21,191,21,9,93,1,21,33,17,33,21,33,17,33,21,33,17,33, + 3,35,1,23,1,33,17,7,53,253,27,2,199,253,57,2,248,252,61,253,240,160,205,2,113,139,254,182,1,203,5,213,170,254,70,170,253,227,170,1, + 127,254,129,5,213,158,252,240,3,16,0,0,255,255,0,115,254,117,5,39,5,240,18,38,0,38,0,0,16,7,0,122,1,45,0,0,255,255,0,201, + 0,0,4,139,7,107,18,38,0,40,0,0,16,7,22,188,4,158,1,117,255,255,0,201,0,0,4,139,7,107,18,38,0,40,0,0,16,7,22,186, + 4,158,1,117,255,255,0,201,0,0,4,139,7,109,18,38,0,40,0,0,17,7,22,189,4,158,1,117,0,7,64,3,64,12,1,93,49,0,0,0, + 255,255,0,201,0,0,4,139,7,78,18,38,0,40,0,0,17,7,22,185,4,158,1,117,0,9,64,5,64,12,64,16,2,93,49,0,255,255,0,59, + 0,0,1,186,7,107,18,38,0,44,0,0,16,7,22,188,3,47,1,117,255,255,0,162,0,0,2,31,7,107,18,38,0,44,0,0,16,7,22,186, + 3,47,1,117,255,255,255,254,0,0,2,96,7,109,18,38,0,44,0,0,17,7,22,189,3,47,1,117,0,8,180,1,6,10,0,7,43,49,0,0, + 255,255,0,6,0,0,2,88,7,78,18,38,0,44,0,0,17,7,22,185,3,47,1,117,0,8,180,0,10,7,1,7,43,49,0,0,0,2,0,10, + 0,0,5,186,5,213,0,12,0,25,0,103,64,32,16,9,169,11,13,149,0,129,18,149,14,11,7,7,1,25,19,4,15,13,22,25,4,50,10,17, + 13,28,8,0,121,26,16,244,60,236,50,196,244,236,16,196,23,57,49,0,47,198,50,238,246,238,16,238,50,48,64,40,32,27,127,27,176,27,3,159, + 9,159,10,159,11,159,12,159,14,159,15,159,16,159,17,191,9,191,10,191,11,191,12,191,14,191,15,191,16,191,17,16,93,1,93,19,33,32,0,17, + 16,0,41,1,17,35,53,51,19,17,33,21,33,17,51,32,0,17,16,0,33,211,1,160,1,177,1,150,254,105,254,80,254,96,201,201,203,1,80,254, + 176,243,1,53,1,31,254,225,254,203,5,213,254,151,254,128,254,126,254,150,2,188,144,1,227,254,29,144,253,234,1,24,1,46,1,44,1,23,0,0, + 255,255,0,201,0,0,5,51,7,94,18,38,0,49,0,0,17,7,22,187,4,254,1,117,0,20,180,0,19,34,4,7,43,64,9,48,19,63,34,16, + 19,31,34,4,93,49,0,0,255,255,0,115,255,227,5,217,7,107,18,38,0,50,0,0,16,7,22,188,5,39,1,117,255,255,0,115,255,227,5,217, + 7,107,18,38,0,50,0,0,16,7,22,186,5,39,1,117,255,255,0,115,255,227,5,217,7,109,18,38,0,50,0,0,17,7,22,189,5,39,1,117, + 0,16,180,15,26,30,21,7,43,64,5,31,26,16,30,2,93,49,0,0,255,255,0,115,255,227,5,217,7,94,18,38,0,50,0,0,17,7,22,187, + 5,39,1,117,0,24,180,3,33,48,9,7,43,64,13,48,33,63,48,32,33,47,48,16,33,31,48,6,93,49,0,0,255,255,0,115,255,227,5,217, + 7,78,18,38,0,50,0,0,17,7,22,185,5,39,1,117,0,20,180,3,31,26,9,7,43,64,9,64,31,79,26,16,31,31,26,4,93,49,0,0, + 0,1,1,25,0,63,5,156,4,197,0,11,0,133,64,77,10,156,11,10,7,8,7,9,156,8,8,7,4,156,3,4,7,7,6,5,156,6,7,6, + 4,156,5,4,1,2,1,3,156,2,2,1,11,156,0,1,0,10,156,9,10,1,1,0,66,10,8,7,6,4,2,1,0,8,5,3,11,9,12,11, + 10,9,7,5,4,3,1,8,2,0,8,6,12,16,212,60,204,50,23,57,49,0,16,212,60,204,50,23,57,48,75,83,88,7,16,8,237,7,16,5, + 237,7,16,5,237,7,16,8,237,7,16,5,237,7,16,8,237,7,16,5,237,7,16,8,237,89,34,9,2,7,9,1,39,9,1,55,9,1,5,156, + 254,55,1,201,119,254,53,254,53,118,1,200,254,56,118,1,203,1,203,4,76,254,53,254,55,121,1,203,254,53,121,1,201,1,203,121,254,53,1,203, + 0,3,0,102,255,186,5,229,6,23,0,9,0,19,0,43,0,158,64,60,29,31,26,13,43,44,19,10,1,0,4,13,41,38,32,20,13,4,42,38, + 30,26,4,149,38,13,149,26,145,38,140,44,43,44,42,20,23,16,32,30,35,19,10,1,0,4,29,41,16,7,31,7,25,35,51,16,25,23,16,44, + 16,252,236,252,236,192,17,18,57,57,23,57,18,57,57,17,18,57,57,17,57,49,0,16,228,244,236,16,238,16,192,16,192,17,18,57,57,18,57,18, + 23,57,18,57,17,18,57,57,48,64,42,87,0,90,21,87,25,85,33,106,21,101,33,123,21,118,28,117,33,9,70,19,89,0,86,19,106,0,100,19, + 100,28,106,40,124,0,115,19,118,28,122,40,11,93,1,93,9,1,30,1,51,50,0,17,52,38,39,46,1,35,34,0,17,20,22,23,7,38,2,53, + 16,0,33,50,22,23,55,23,7,22,18,21,16,0,33,34,38,39,7,39,4,182,253,51,62,161,95,220,1,1,39,121,61,161,95,220,254,253,39,39, + 134,78,79,1,121,1,59,130,221,87,162,102,170,78,80,254,136,254,198,128,221,91,162,103,4,88,252,178,64,67,1,72,1,26,112,184,184,64,67,254, + 184,254,229,112,188,68,158,102,1,8,160,1,98,1,165,77,75,191,89,198,103,254,246,158,254,159,254,91,75,75,191,88,255,255,0,178,255,227,5,41, + 7,107,18,38,0,56,0,0,16,7,22,188,4,238,1,117,255,255,0,178,255,227,5,41,7,107,18,38,0,56,0,0,16,7,22,186,4,238,1,117, + 255,255,0,178,255,227,5,41,7,109,18,38,0,56,0,0,17,7,22,189,4,238,1,117,0,20,180,10,20,24,0,7,43,64,9,47,20,32,24,31, + 20,16,24,4,93,49,0,0,255,255,0,178,255,227,5,41,7,78,18,38,0,56,0,0,17,7,22,185,4,238,1,117,0,28,180,1,25,20,9,7, + 43,64,17,80,25,95,20,64,25,79,20,32,25,47,20,16,25,31,20,8,93,49,0,0,255,255,255,252,0,0,4,231,7,107,18,38,0,60,0,0, + 16,7,22,186,4,115,1,117,0,2,0,201,0,0,4,141,5,213,0,12,0,21,0,61,64,27,14,149,9,13,149,2,246,0,129,11,21,15,9,3, + 4,1,18,25,6,63,13,10,1,28,0,4,22,16,252,236,50,50,252,236,17,23,57,49,0,47,244,252,236,212,236,48,64,9,15,23,31,23,63,23, + 95,23,4,1,93,19,51,17,51,50,4,21,20,4,43,1,17,35,19,17,51,50,54,53,52,38,35,201,202,254,251,1,1,254,255,251,254,202,202,254, + 141,154,153,142,5,213,254,248,225,220,220,226,254,174,4,39,253,209,146,134,134,145,0,0,0,1,0,186,255,227,4,172,6,20,0,47,0,154,64,48, + 45,39,33,12,4,6,13,32,0,4,42,22,134,23,26,185,19,42,185,3,151,19,140,46,12,9,13,29,32,33,39,9,8,36,39,8,6,29,8,36, + 16,22,45,8,16,0,70,48,16,252,196,252,204,16,198,238,212,238,16,238,17,57,57,18,57,18,57,49,0,47,228,254,238,16,254,213,238,18,23,57, + 23,57,48,64,64,15,5,15,6,15,7,15,39,15,40,138,12,138,13,7,10,6,10,7,10,11,10,12,10,13,10,31,13,32,10,33,12,34,4,38, + 25,13,25,31,25,32,58,32,58,33,77,31,77,32,73,33,73,34,106,31,106,32,165,6,165,7,166,32,24,93,1,93,19,52,54,51,50,22,23,14, + 1,21,20,22,31,1,30,1,21,20,6,35,34,38,39,53,30,1,51,50,54,53,52,38,47,1,46,1,53,52,54,55,46,1,35,34,6,21,17,35, + 186,239,218,208,219,3,151,168,58,65,57,166,96,225,211,64,136,73,80,140,65,116,120,59,101,92,96,87,167,151,8,131,113,130,136,187,4,113,200,219, + 232,224,8,115,96,47,81,42,37,106,142,100,172,183,25,24,164,30,29,95,91,63,84,62,55,59,135,91,127,172,29,103,112,139,131,251,147,0,0,0, + 255,255,0,123,255,227,4,45,6,102,18,38,0,68,0,0,17,6,0,67,82,0,0,11,64,7,63,38,47,38,31,38,3,93,49,0,255,255,0,123, + 255,227,4,45,6,102,18,38,0,68,0,0,17,6,0,118,82,0,0,11,64,7,63,38,47,38,31,38,3,93,49,0,255,255,0,123,255,227,4,45, + 6,102,18,38,0,68,0,0,17,6,2,136,82,0,0,8,180,11,40,44,20,7,43,49,255,255,0,123,255,227,4,45,6,55,18,38,0,68,0,0, + 17,6,2,158,82,0,0,20,180,20,46,60,11,7,43,64,9,32,46,47,60,16,46,31,60,4,93,49,255,255,0,123,255,227,4,45,6,16,18,38, + 0,68,0,0,17,6,0,106,82,0,0,32,180,20,45,40,11,7,43,64,21,127,40,111,40,80,45,95,40,64,45,79,40,48,45,63,40,0,45,15, + 40,10,93,49,255,255,0,123,255,227,4,45,7,6,18,38,0,68,0,0,17,6,2,156,82,0,0,37,64,14,38,44,20,44,38,11,7,50,56,20, + 56,50,11,7,43,16,196,43,16,196,49,0,64,9,63,53,63,47,15,53,15,47,4,93,48,0,0,0,0,3,0,123,255,227,7,111,4,123,0,6, + 0,51,0,62,1,3,64,67,39,45,37,61,14,13,0,52,169,37,22,134,21,136,18,0,169,14,58,18,185,28,25,46,134,45,186,42,3,185,14,187, + 7,49,10,184,31,25,140,37,63,52,55,38,6,15,0,37,55,28,7,38,15,21,0,8,13,61,38,8,15,45,55,8,34,69,63,16,252,236,204,212, + 252,60,212,236,196,17,18,57,57,17,57,17,18,57,17,18,57,49,0,16,196,228,50,244,60,196,228,252,60,244,236,16,196,238,50,16,238,16,244,238, + 16,238,17,57,17,57,17,18,57,48,64,129,48,43,48,44,48,45,48,46,48,47,48,48,64,43,64,44,64,45,64,46,64,47,64,48,80,43,80,44, + 80,45,80,46,80,47,80,48,133,43,133,48,128,64,144,64,160,64,176,64,192,64,208,64,224,64,224,64,240,64,29,63,0,63,6,63,13,63,14,63, + 15,5,48,44,48,45,48,46,48,47,64,44,64,45,64,46,64,47,80,44,80,45,80,46,80,47,111,0,111,6,111,13,111,14,111,15,96,44,96,45, + 96,46,96,47,112,44,112,45,112,46,112,47,128,44,128,45,128,46,128,47,29,93,113,1,93,1,46,1,35,34,6,7,3,62,1,51,50,0,29,1, + 33,30,1,51,50,54,55,21,14,1,35,34,38,39,14,1,35,34,38,53,52,54,51,33,53,52,38,35,34,6,7,53,62,1,51,50,22,3,34,6, + 21,20,22,51,50,54,61,1,6,182,1,165,137,153,185,14,68,74,212,132,226,1,8,252,178,12,204,183,104,200,100,100,208,106,167,248,77,73,216,143, + 189,210,253,251,1,2,167,151,96,182,84,101,190,90,142,213,239,223,172,129,111,153,185,2,148,151,180,174,158,1,48,90,94,254,221,250,90,191,200,53, + 53,174,42,44,121,119,120,120,187,168,189,192,18,127,139,46,46,170,39,39,96,254,24,102,123,98,115,217,180,41,0,0,255,255,0,113,254,117,3,231, + 4,123,18,38,0,70,0,0,16,7,0,122,0,143,0,0,255,255,0,113,255,227,4,127,6,102,18,38,0,72,0,0,16,7,0,67,0,139,0,0, + 255,255,0,113,255,227,4,127,6,102,18,38,0,72,0,0,16,7,0,118,0,139,0,0,255,255,0,113,255,227,4,127,6,102,18,38,0,72,0,0, + 17,7,2,136,0,139,0,0,0,8,180,21,30,34,27,7,43,49,0,0,255,255,0,113,255,227,4,127,6,16,18,38,0,72,0,0,17,7,0,106, + 0,139,0,0,0,7,64,3,64,32,1,93,49,0,0,0,255,255,255,199,0,0,1,166,6,102,16,39,0,67,255,29,0,0,18,6,0,243,0,0, + 255,255,0,144,0,0,2,111,6,102,16,39,0,118,255,29,0,0,18,6,0,243,0,0,255,255,255,222,0,0,2,92,6,102,18,38,0,243,0,0, + 17,7,2,136,255,29,0,0,0,8,180,1,7,11,0,7,43,49,0,0,255,255,255,244,0,0,2,70,6,16,18,38,0,243,0,0,17,7,0,106, + 255,29,0,0,0,8,180,0,11,8,1,7,43,49,0,0,0,2,0,113,255,227,4,117,6,20,0,14,0,40,1,39,64,94,37,123,38,37,30,35, + 30,36,123,35,35,30,15,123,35,30,40,123,39,40,30,35,30,38,39,40,39,37,36,37,40,40,39,34,35,34,31,32,31,33,32,32,31,66,40,39, + 38,37,34,33,32,31,8,35,30,3,15,35,3,185,27,9,185,21,140,27,35,177,41,38,39,18,12,33,32,24,40,37,35,34,31,5,30,15,6,12, + 18,18,81,6,18,24,69,41,16,252,236,244,236,17,57,57,23,57,18,57,57,17,18,57,57,49,0,16,236,196,244,236,16,238,18,57,18,57,18,23, + 57,48,75,83,88,7,16,14,201,7,16,8,201,7,16,8,201,7,16,14,201,7,16,8,237,7,14,237,7,16,5,237,7,16,8,237,89,34,178,63, + 42,1,1,93,64,118,22,37,43,31,40,34,47,35,47,36,41,37,45,38,45,39,42,40,54,37,70,37,88,32,88,33,96,32,96,33,102,34,117,32, + 117,33,117,34,19,37,35,37,36,38,38,38,39,39,40,54,36,54,37,70,36,69,37,90,32,90,33,98,32,98,33,127,0,127,1,127,2,122,3,123, + 9,127,10,127,11,127,12,127,13,127,14,127,15,127,16,127,17,127,18,127,19,127,20,123,21,122,27,122,28,127,29,127,30,118,32,118,33,120,34,160, + 42,240,42,39,93,0,93,1,46,1,35,34,6,21,20,22,51,50,54,53,52,38,19,22,18,21,20,0,35,34,0,17,52,0,51,50,22,23,39,5, + 39,37,39,51,23,37,23,5,3,70,50,88,41,167,185,174,146,145,174,54,9,126,114,254,228,230,231,254,229,1,20,221,18,52,42,159,254,193,33,1, + 25,181,228,127,1,77,33,254,217,3,147,17,16,216,195,188,222,222,188,122,188,1,38,143,254,224,173,255,254,201,1,55,0,255,250,1,55,5,5,180, + 107,99,92,204,145,111,97,98,255,255,0,186,0,0,4,100,6,55,18,38,0,81,0,0,16,7,2,158,0,152,0,0,255,255,0,113,255,227,4,117, + 6,102,18,38,0,82,0,0,16,6,0,67,115,0,0,0,255,255,0,113,255,227,4,117,6,102,18,38,0,82,0,0,16,6,0,118,115,0,0,0, + 255,255,0,113,255,227,4,117,6,102,18,38,0,82,0,0,17,6,2,136,115,0,0,8,180,15,26,30,21,7,43,49,255,255,0,113,255,227,4,117, + 6,55,18,38,0,82,0,0,17,6,2,158,115,0,0,20,180,21,32,46,15,7,43,64,9,32,32,47,46,16,32,31,46,4,93,49,255,255,0,113, + 255,227,4,117,6,16,18,38,0,82,0,0,17,6,0,106,115,0,0,20,180,3,31,26,9,7,43,64,9,64,31,79,26,48,31,63,26,4,93,49, + 0,3,0,217,0,150,5,219,4,111,0,3,0,7,0,11,0,41,64,20,0,234,2,6,234,4,2,8,156,4,10,12,9,5,1,114,4,0,8,12, + 16,220,212,60,252,60,196,49,0,16,212,196,252,196,16,238,16,238,48,1,51,21,35,17,51,21,35,1,33,21,33,2,223,246,246,246,246,253,250,5, + 2,250,254,4,111,246,254,18,245,2,65,170,0,3,0,72,255,162,4,156,4,188,0,9,0,19,0,43,0,228,64,60,43,44,38,31,29,26,19,10, + 1,0,4,13,41,38,32,20,13,4,42,38,30,26,4,185,38,13,185,26,184,38,140,44,43,44,42,20,23,16,32,30,35,19,10,1,0,4,16,7, + 31,29,7,18,35,81,41,16,18,23,69,44,16,252,236,50,244,236,50,192,17,18,23,57,18,57,57,17,18,57,57,17,57,49,0,16,228,244,236,16, + 238,16,192,16,192,17,18,57,57,18,57,18,23,57,17,57,57,17,18,57,48,64,112,40,1,63,45,89,20,86,28,85,29,86,32,106,21,102,33,127, + 0,123,4,127,5,127,6,127,7,127,8,127,9,127,10,127,11,127,12,123,13,122,21,123,26,127,27,127,28,127,29,127,30,127,31,127,32,123,33,127, + 34,127,35,127,36,127,37,123,38,155,25,149,37,168,25,160,45,240,45,38,89,0,86,19,85,29,90,40,105,0,102,19,101,28,106,40,122,0,116,19, + 118,28,122,40,137,30,149,24,154,36,162,24,173,36,17,93,1,93,9,1,30,1,51,50,54,53,52,38,39,46,1,35,34,6,21,20,22,23,7,46, + 1,53,16,0,51,50,22,23,55,23,7,30,1,21,16,0,35,34,38,39,7,39,3,137,254,25,41,103,65,147,172,20,92,42,103,62,151,169,19,20, + 125,54,54,1,17,241,93,159,67,139,95,146,53,54,254,238,240,96,161,63,139,96,3,33,253,176,42,40,232,200,79,117,154,41,41,235,211,72,110,46, + 151,77,197,119,1,20,1,56,51,52,168,79,179,77,198,120,254,237,254,199,52,51,168,78,255,255,0,174,255,227,4,88,6,102,18,38,0,88,0,0, + 16,6,0,67,123,0,0,0,255,255,0,174,255,227,4,88,6,102,18,38,0,88,0,0,16,6,0,118,123,0,0,0,255,255,0,174,255,227,4,88, + 6,102,18,38,0,88,0,0,17,6,2,136,123,0,0,8,180,11,23,27,1,7,43,49,255,255,0,174,255,227,4,88,6,16,18,38,0,88,0,0, + 17,6,0,106,123,0,0,24,180,2,27,24,10,7,43,64,13,64,27,79,24,48,27,63,24,0,27,15,24,6,93,49,255,255,0,61,254,86,4,127, + 6,102,18,38,0,92,0,0,16,6,0,118,94,0,0,0,0,2,0,186,254,86,4,164,6,20,0,16,0,28,0,62,64,27,20,185,5,8,26,185, + 0,14,140,8,184,1,189,3,151,29,17,18,11,71,23,4,0,8,2,70,29,16,252,236,50,50,244,236,49,0,16,236,228,228,244,196,236,16,198,238, + 48,64,9,96,30,128,30,160,30,224,30,4,1,93,37,17,35,17,51,17,62,1,51,50,0,17,16,2,35,34,38,1,52,38,35,34,6,21,20,22, + 51,50,54,1,115,185,185,58,177,123,204,0,255,255,204,123,177,2,56,167,146,146,167,167,146,146,167,168,253,174,7,190,253,162,100,97,254,188,254,248, + 254,248,254,188,97,1,235,203,231,231,203,203,231,231,0,0,255,255,0,61,254,86,4,127,6,16,18,38,0,92,0,0,17,6,0,106,94,0,0,22, + 180,24,23,18,25,7,43,64,11,48,23,63,18,32,23,47,18,31,18,5,93,49,0,0,255,255,0,16,0,0,5,104,7,49,16,39,0,113,0,188, + 1,59,19,6,0,36,0,0,0,16,180,14,3,2,9,7,43,64,5,64,3,79,2,2,93,49,0,0,255,255,0,123,255,227,4,45,5,246,16,38, + 0,113,74,0,19,6,0,68,0,0,0,16,180,24,3,2,15,7,43,64,5,111,2,127,3,2,93,49,255,255,0,16,0,0,5,104,7,146,16,39, + 2,154,0,206,1,74,19,6,0,36,0,0,0,18,180,24,0,8,19,7,43,49,0,64,5,111,0,111,8,2,93,48,255,255,0,123,255,227,4,45, + 6,31,16,38,2,154,79,215,19,6,0,68,0,0,0,8,180,34,0,8,25,7,43,49,255,255,0,16,254,117,5,165,5,213,18,38,0,36,0,0, + 16,7,2,157,2,228,0,0,255,255,0,123,254,117,4,128,4,123,18,38,0,68,0,0,16,7,2,157,1,191,0,0,255,255,0,115,255,227,5,39, + 7,107,18,38,0,38,0,0,16,7,22,186,5,45,1,117,255,255,0,113,255,227,3,231,6,102,18,38,0,70,0,0,16,7,0,118,0,137,0,0, + 255,255,0,115,255,227,5,39,7,109,16,39,22,189,5,76,1,117,19,6,0,38,0,0,0,9,178,4,4,30,16,60,61,47,49,0,255,255,0,113, + 255,227,3,231,6,102,18,38,0,70,0,0,16,7,2,136,0,164,0,0,255,255,0,115,255,227,5,39,7,80,16,39,22,193,5,76,1,117,18,6, + 0,38,0,0,255,255,0,113,255,227,3,231,6,20,16,39,2,184,4,164,0,0,18,6,0,70,0,0,255,255,0,115,255,227,5,39,7,109,18,38, + 0,38,0,0,17,7,22,190,5,45,1,117,0,7,64,3,31,29,1,93,49,0,0,0,255,255,0,113,255,227,3,231,6,102,18,38,0,70,0,0, + 16,7,2,137,0,137,0,0,255,255,0,201,0,0,5,176,7,109,16,39,22,190,4,236,1,117,18,6,0,39,0,0,255,255,0,113,255,227,5,219, + 6,20,18,38,0,71,0,0,17,7,22,184,5,20,0,0,0,11,64,7,95,29,63,29,31,29,3,93,49,0,0,0,255,255,0,10,0,0,5,186, + 5,213,16,6,0,146,0,0,0,2,0,113,255,227,4,244,6,20,0,24,0,36,0,74,64,36,7,3,211,9,1,249,34,185,0,22,28,185,13,16, + 140,22,184,5,151,11,2,31,12,4,3,0,8,8,10,6,71,25,18,19,69,37,16,252,236,244,60,196,252,23,60,196,49,0,47,236,228,244,196,236, + 16,196,238,253,60,238,50,48,182,96,38,128,38,160,38,3,1,93,1,17,33,53,33,53,51,21,51,21,35,17,35,53,14,1,35,34,2,17,16,0, + 51,50,22,1,20,22,51,50,54,53,52,38,35,34,6,3,162,254,186,1,70,184,154,154,184,58,177,124,203,255,0,255,203,124,177,253,199,167,146,146, + 168,168,146,146,167,3,182,1,78,125,147,147,125,250,252,168,100,97,1,68,1,8,1,8,1,68,97,254,21,203,231,231,203,203,231,231,255,255,0,201, + 0,0,4,139,7,51,18,38,0,40,0,0,16,7,0,113,0,161,1,61,255,255,0,113,255,227,4,127,5,246,16,39,0,113,0,150,0,0,19,6, + 0,72,0,0,0,7,64,3,112,0,1,93,49,0,0,0,255,255,0,201,0,0,4,139,7,109,16,39,22,192,4,161,1,117,19,6,0,40,0,0, + 0,7,64,3,64,0,1,93,49,0,0,0,255,255,0,113,255,227,4,127,6,72,16,39,2,154,0,150,0,0,19,6,0,72,0,0,0,7,64,3, + 112,0,1,93,49,0,0,0,255,255,0,201,0,0,4,139,7,80,16,39,22,193,4,158,1,117,18,6,0,40,0,0,255,255,0,113,255,227,4,127, + 6,20,16,39,2,184,4,150,0,0,18,6,0,72,0,0,255,255,0,201,254,117,4,141,5,213,18,38,0,40,0,0,16,7,2,157,1,204,0,0, + 255,255,0,113,254,117,4,127,4,123,18,38,0,72,0,0,16,7,2,157,1,120,0,0,255,255,0,201,0,0,4,139,7,103,18,38,0,40,0,0, + 17,7,22,190,4,166,1,111,0,7,64,3,64,12,1,93,49,0,0,0,255,255,0,113,255,227,4,127,6,97,18,38,0,72,0,0,17,7,2,137, + 0,148,255,251,0,16,180,0,33,29,15,7,43,64,5,15,33,0,29,2,93,49,0,0,255,255,0,115,255,227,5,139,7,109,16,39,22,189,5,92, + 1,117,19,6,0,42,0,0,0,9,178,4,4,21,16,60,61,47,49,0,255,255,0,113,254,86,4,90,6,102,16,38,2,136,104,0,19,6,0,74, + 0,0,0,9,178,4,4,10,16,60,61,47,49,0,0,0,255,255,0,115,255,227,5,139,7,109,18,38,0,42,0,0,16,7,22,192,5,27,1,117, + 255,255,0,113,254,86,4,90,6,72,18,38,0,74,0,0,16,7,2,154,0,139,0,0,255,255,0,115,255,227,5,139,7,80,16,39,22,193,5,92, + 1,117,19,6,0,42,0,0,0,8,0,64,3,63,0,1,93,48,0,0,255,255,0,113,254,86,4,90,6,20,16,39,2,184,4,106,0,0,18,6, + 0,74,0,0,255,255,0,115,254,1,5,139,5,240,16,39,2,215,5,94,255,237,18,6,0,42,0,0,255,255,0,113,254,86,4,90,6,52,16,39, + 2,195,3,224,1,12,18,6,0,74,0,0,255,255,0,201,0,0,5,59,7,109,16,39,22,189,5,2,1,117,19,6,0,43,0,0,0,20,180,12, + 2,6,7,7,43,64,9,47,2,32,6,31,2,16,6,4,93,49,0,0,255,255,255,229,0,0,4,100,7,109,16,39,22,189,3,22,1,117,19,6, + 0,75,0,0,0,42,180,20,2,6,19,7,43,49,0,75,176,14,81,88,187,0,20,255,192,0,19,255,192,56,56,89,64,13,144,20,144,19,128,20, + 128,19,64,20,64,19,6,93,0,2,0,201,0,0,6,139,5,213,0,19,0,23,0,58,64,30,6,2,18,149,9,20,17,12,149,21,173,4,0,129, + 14,10,7,12,23,4,28,5,56,18,13,20,1,28,0,24,16,220,236,50,50,204,252,236,50,50,204,49,0,47,60,228,50,252,236,220,50,50,236,50, + 50,48,1,51,21,33,53,51,21,51,21,35,17,35,17,33,17,35,17,35,53,51,23,21,33,53,1,113,202,2,222,202,168,168,202,253,34,202,168,168, + 202,2,222,5,213,224,224,224,164,251,175,2,199,253,57,4,81,164,164,224,224,0,0,0,0,1,0,120,0,0,4,159,6,20,0,27,0,62,64,33, + 3,9,0,3,22,1,14,18,135,13,21,6,135,22,25,184,16,151,10,1,2,8,0,78,19,14,17,21,9,8,16,11,28,16,220,50,236,50,50,204, + 204,244,236,49,0,47,60,236,244,196,236,220,50,236,50,17,18,23,57,48,1,17,35,17,52,38,35,34,6,21,17,35,17,35,53,51,53,51,21,33, + 21,33,17,62,1,51,50,22,4,159,184,124,124,149,172,185,125,125,185,1,96,254,160,66,179,117,193,198,2,164,253,92,2,158,159,158,190,164,253,135, + 4,246,164,122,122,164,254,188,101,100,239,0,255,255,255,228,0,0,2,120,7,94,16,39,22,187,3,46,1,117,19,6,0,44,0,0,0,8,180,30, + 9,24,31,7,43,49,0,0,255,255,255,211,0,0,2,103,6,55,16,39,2,158,255,29,0,0,19,6,0,243,0,0,0,8,180,28,8,22,29,7, + 43,49,0,0,255,255,0,3,0,0,2,89,7,49,16,39,0,113,255,46,1,59,19,6,0,44,0,0,0,8,180,4,3,2,5,7,43,49,0,0, + 255,255,255,242,0,0,2,72,5,245,16,39,0,113,255,29,255,255,19,6,0,243,0,0,0,8,180,4,3,2,5,7,43,49,0,0,255,255,255,245, + 0,0,2,103,7,109,16,39,22,192,3,46,1,117,19,6,0,44,0,0,0,8,180,14,0,8,15,7,43,49,0,0,255,255,255,228,0,0,2,86, + 6,72,16,39,2,154,255,29,0,0,19,6,0,243,0,0,0,8,180,14,0,8,15,7,43,49,0,0,255,255,0,176,254,117,2,37,5,213,16,39, + 2,157,255,100,0,0,18,6,0,44,0,0,255,255,0,150,254,117,2,11,6,20,16,39,2,157,255,74,0,0,18,6,0,76,0,0,255,255,0,201, + 0,0,1,149,7,80,18,38,0,44,0,0,17,7,22,193,3,47,1,117,0,19,179,6,1,7,0,16,60,16,60,49,0,180,63,7,63,6,2,93, + 48,0,0,0,0,2,0,193,0,0,1,121,4,123,0,3,0,4,0,44,64,11,4,184,0,191,2,4,1,8,0,70,5,16,252,236,57,49,0,47, + 236,228,48,64,17,4,4,52,4,68,4,16,6,64,6,80,6,96,6,112,6,8,1,93,19,51,17,35,19,193,184,184,92,4,96,251,160,4,123,0, + 255,255,0,201,254,102,3,239,5,213,16,39,0,45,2,92,0,0,17,6,0,44,0,0,0,8,64,3,17,4,1,16,236,49,0,0,255,255,0,193, + 254,86,3,177,6,20,16,39,0,77,2,56,0,0,17,6,0,76,0,0,0,8,64,3,25,70,1,16,236,49,0,0,255,255,255,150,254,102,2,95, + 7,109,16,39,22,189,3,46,1,117,19,6,0,45,0,0,0,8,180,8,2,6,7,7,43,49,0,0,255,255,255,219,254,86,2,92,6,102,16,39, + 2,136,255,29,0,0,19,6,1,249,0,0,0,8,180,8,2,6,7,7,43,49,0,0,255,255,0,201,254,30,5,106,5,213,16,39,2,215,5,27, + 0,10,18,6,0,46,0,0,255,255,0,186,254,30,4,156,6,20,16,39,2,215,4,172,0,10,18,6,0,78,0,0,0,1,0,186,0,0,4,156, + 4,96,0,10,0,187,64,40,8,17,5,6,5,7,17,6,6,5,3,17,4,5,4,2,17,5,5,4,66,8,5,2,3,3,0,188,9,6,5,1, + 4,6,8,1,8,0,70,11,16,252,236,50,212,196,17,57,49,0,47,60,236,50,23,57,48,75,83,88,7,16,4,237,7,16,5,237,7,16,5,237, + 7,16,4,237,89,34,178,16,12,1,1,93,64,95,4,2,10,8,22,2,39,2,41,5,43,8,86,2,102,2,103,8,115,2,119,5,130,2,137,5, + 142,8,147,2,150,5,151,8,163,2,18,9,5,9,6,2,11,3,10,7,40,3,39,4,40,5,43,6,43,7,64,12,104,3,96,12,137,3,133,4, + 137,5,141,6,143,7,154,3,151,7,170,3,167,5,182,7,197,7,214,7,247,3,240,3,247,4,240,4,26,93,113,0,93,19,51,17,1,51,9,1, + 35,1,17,35,186,185,2,37,235,253,174,2,107,240,253,199,185,4,96,254,27,1,229,253,242,253,174,2,33,253,223,0,255,255,0,201,0,0,4,106, + 7,108,16,39,22,186,3,110,1,118,18,6,0,47,0,0,255,255,0,193,0,0,2,74,7,108,16,39,22,186,3,90,1,118,19,6,0,79,0,0, + 0,30,177,3,4,16,60,49,0,75,176,14,81,88,185,0,0,0,64,56,89,64,7,159,0,143,0,79,0,3,93,48,255,255,0,201,254,30,4,106, + 5,213,16,39,2,215,4,155,0,10,18,6,0,47,0,0,255,255,0,136,254,30,1,173,6,20,16,39,2,215,3,30,0,10,19,6,0,79,0,0, + 0,7,64,3,64,0,1,93,49,0,0,0,255,255,0,201,0,0,4,106,5,213,16,39,22,184,2,159,255,195,18,6,0,47,0,0,255,255,0,193, + 0,0,3,0,6,20,16,39,22,184,2,57,0,2,17,6,0,79,0,0,0,9,64,5,143,0,31,0,2,93,49,0,255,255,0,201,0,0,4,106, + 5,213,16,39,0,121,2,49,0,119,18,6,0,47,0,0,255,255,0,193,0,0,2,132,6,20,16,39,0,121,0,214,0,115,17,6,0,79,0,0, + 0,23,75,176,13,81,75,176,17,83,75,176,24,81,90,91,88,185,0,0,0,64,56,89,49,0,0,0,0,1,255,242,0,0,4,117,5,213,0,13, + 0,63,64,30,12,11,10,4,3,2,6,0,6,149,0,129,8,3,4,1,11,14,0,4,5,1,28,12,7,58,9,0,121,14,16,244,60,236,196,252, + 60,196,17,18,57,17,18,57,49,0,47,228,236,17,23,57,48,180,48,15,80,15,2,1,93,19,51,17,37,23,1,17,33,21,33,17,7,39,55,211, + 203,1,57,80,254,119,2,215,252,94,148,77,225,5,213,253,152,219,111,254,238,253,227,170,2,59,106,110,158,0,0,0,0,1,0,2,0,0,2,72, + 6,20,0,11,0,94,64,26,10,9,8,4,3,2,6,0,151,6,3,4,1,9,10,0,4,122,5,1,8,10,122,7,0,12,16,212,60,228,252,60, + 228,17,18,57,17,18,57,49,0,47,236,23,57,48,1,75,176,16,84,88,189,0,12,0,64,0,1,0,12,0,12,255,192,56,17,55,56,89,64,19, + 16,13,64,13,80,13,96,13,115,4,122,10,112,13,224,13,240,13,9,93,19,51,17,55,23,7,17,35,17,7,39,55,199,184,125,76,201,184,123,74, + 197,6,20,253,166,90,106,141,252,227,2,154,88,106,141,0,255,255,0,201,0,0,5,51,7,108,16,39,22,186,4,197,1,118,19,6,0,49,0,0, + 0,7,64,3,79,0,1,93,49,0,0,0,255,255,0,186,0,0,4,100,6,109,16,38,0,118,66,7,19,6,0,81,0,0,0,9,64,5,63,0, + 79,0,2,93,49,0,0,0,255,255,0,201,254,30,5,51,5,213,16,39,2,215,5,0,0,10,18,6,0,49,0,0,255,255,0,186,254,30,4,100, + 4,123,16,39,2,215,4,144,0,10,18,6,0,81,0,0,255,255,0,201,0,0,5,51,7,95,18,38,0,49,0,0,17,7,22,190,4,245,1,103, + 0,20,180,4,15,11,0,7,43,64,9,47,15,32,11,31,15,16,11,4,93,49,0,0,255,255,0,186,0,0,4,100,6,102,18,38,0,81,0,0, + 17,7,2,137,0,141,0,0,0,16,180,0,25,21,12,7,43,64,5,15,25,0,21,2,93,49,0,0,255,255,0,205,0,0,5,185,5,213,16,39, + 0,81,1,85,0,0,16,6,2,126,27,0,0,1,0,201,254,86,5,25,5,240,0,28,0,59,64,13,25,22,18,24,28,28,18,10,5,28,7,65, + 29,16,252,75,176,16,84,88,185,0,7,255,192,56,89,236,50,212,252,204,17,49,0,64,12,25,149,22,176,7,2,149,14,145,8,129,7,47,228,244, + 236,16,244,236,48,1,16,33,34,6,21,17,35,17,51,21,54,55,54,51,50,18,25,1,20,7,6,43,1,53,51,50,54,53,4,80,254,205,179,215, + 202,202,78,105,106,153,227,233,81,82,181,87,49,102,79,3,127,1,172,255,222,252,178,5,213,241,134,67,67,254,193,254,204,252,111,213,97,96,156,90, + 160,0,0,0,0,1,0,186,254,86,4,100,4,123,0,31,0,59,64,28,13,19,0,3,24,21,7,135,6,16,135,24,28,184,22,188,21,7,13,8, + 0,78,19,23,8,22,70,32,16,252,236,50,244,236,196,49,0,47,228,244,196,236,212,236,17,18,23,57,48,180,96,33,207,33,2,1,93,1,17,20, + 7,6,43,1,53,51,50,55,54,53,17,52,38,35,34,6,21,17,35,17,51,21,54,55,54,51,50,23,22,4,100,82,81,181,254,233,105,38,38,124, + 124,149,172,185,185,66,89,90,117,193,99,99,2,164,253,72,214,96,96,156,48,49,153,2,178,159,158,190,164,253,135,4,96,174,101,50,50,119,120,0, + 255,255,0,115,255,227,5,217,7,49,16,39,0,113,1,39,1,59,19,6,0,50,0,0,0,16,180,13,2,3,7,7,43,64,5,31,2,16,3,2, + 93,49,0,0,255,255,0,113,255,227,4,117,5,245,16,38,0,113,115,255,19,6,0,82,0,0,0,8,180,19,2,3,25,7,43,49,255,255,0,115, + 255,227,5,217,7,109,16,39,22,192,5,39,1,117,19,6,0,50,0,0,0,16,180,17,0,8,23,7,43,64,5,16,0,31,8,2,93,49,0,0, + 255,255,0,113,255,227,4,117,6,72,16,38,2,154,115,0,19,6,0,82,0,0,0,8,180,29,8,0,35,7,43,49,255,255,0,115,255,227,5,217, + 7,107,16,39,22,194,5,39,1,117,18,6,0,50,0,0,255,255,0,113,255,227,4,117,6,102,16,39,2,159,0,160,0,0,18,6,0,82,0,0, + 0,2,0,115,0,0,8,12,5,213,0,16,0,25,0,59,64,31,5,149,3,17,1,149,0,129,24,7,149,3,173,9,24,18,16,10,21,6,2,28, + 17,0,4,8,21,25,13,16,26,16,252,236,212,196,196,212,236,50,18,57,57,57,57,49,0,47,236,236,50,244,236,50,16,238,48,1,21,33,17,33, + 21,33,17,33,21,33,32,0,17,16,0,33,23,35,32,0,17,16,0,33,51,7,250,253,26,2,199,253,57,2,248,251,215,254,79,254,65,1,191,1, + 177,103,129,254,191,254,192,1,64,1,65,129,5,213,170,254,70,170,253,227,170,1,124,1,112,1,109,1,124,170,254,225,254,224,254,223,254,223,0,0, + 0,3,0,113,255,227,7,195,4,123,0,6,0,39,0,51,0,132,64,49,7,8,0,16,134,15,136,12,0,169,8,46,12,185,22,19,40,3,185,8, + 187,34,37,31,184,25,19,140,52,6,0,22,34,49,9,15,0,8,7,75,49,18,9,81,43,18,28,69,52,16,252,236,244,252,244,236,196,17,18,57, + 57,18,57,49,0,16,228,50,244,60,196,228,236,50,16,196,238,50,16,238,16,244,238,17,18,57,48,64,37,63,53,95,53,112,53,159,53,207,53,208, + 53,240,53,7,63,0,63,6,63,7,63,8,63,9,5,111,0,111,6,111,7,111,8,111,9,5,93,113,1,93,1,46,1,35,34,6,7,5,21,33, + 30,1,51,50,54,55,21,14,1,35,34,38,39,14,1,35,34,0,17,16,0,51,50,22,23,62,1,51,50,0,37,34,6,21,20,22,51,50,54,53, + 52,38,7,10,2,164,137,153,185,14,3,72,252,178,12,204,183,106,200,98,100,208,106,160,242,81,71,209,140,241,254,239,1,17,241,140,211,66,78,232, + 143,226,1,8,250,176,148,172,171,149,147,172,172,2,148,152,179,174,158,53,90,190,199,52,52,174,42,44,110,109,110,109,1,57,1,19,1,20,1,56, + 111,108,107,112,254,221,135,231,201,201,231,232,200,199,233,0,255,255,0,201,0,0,5,84,7,108,16,39,22,186,4,149,1,118,18,6,0,53,0,0, + 255,255,0,186,0,0,3,148,6,109,16,38,0,118,66,7,18,6,0,85,0,0,0,0,255,255,0,201,254,30,5,84,5,213,16,39,2,215,5,16, + 0,10,18,6,0,53,0,0,255,255,0,130,254,30,3,74,4,123,16,39,2,215,3,24,0,10,18,6,0,85,0,0,255,255,0,201,0,0,5,84, + 7,95,18,38,0,53,0,0,17,7,22,190,4,125,1,103,0,8,0,64,3,95,29,1,93,48,0,0,255,255,0,186,0,0,3,90,6,102,18,38, + 0,85,0,0,17,6,2,137,27,0,0,16,180,17,23,19,9,7,43,64,5,15,23,0,19,2,93,49,255,255,0,135,255,227,4,162,7,108,16,39, + 22,186,4,149,1,118,18,6,0,54,0,0,255,255,0,111,255,227,3,199,6,109,16,38,0,118,66,7,18,6,0,86,0,0,0,0,255,255,0,135, + 255,227,4,162,7,109,16,39,22,189,4,147,1,117,19,6,0,54,0,0,0,11,180,4,32,21,41,41,16,73,99,58,49,0,0,0,255,255,0,111, + 255,227,3,199,6,102,16,38,2,136,37,0,19,6,0,86,0,0,0,11,180,4,32,21,41,41,16,73,99,58,49,0,255,255,0,135,254,117,4,162, + 5,240,18,38,0,54,0,0,16,7,0,122,0,139,0,0,255,255,0,111,254,117,3,199,4,123,18,38,0,86,0,0,16,6,0,122,23,0,0,0, + 255,255,0,135,255,227,4,162,7,109,18,38,0,54,0,0,17,7,22,190,4,139,1,117,0,11,180,43,32,14,34,34,16,73,99,58,49,0,0,0, + 255,255,0,111,255,227,3,199,6,102,18,38,0,86,0,0,17,7,2,189,4,39,0,0,0,11,180,43,32,14,34,34,16,73,99,58,49,0,0,0, + 255,255,255,250,254,117,4,233,5,213,16,38,0,122,80,0,18,6,0,55,0,0,0,0,255,255,0,55,254,117,2,242,5,158,16,38,0,122,225,0, + 18,6,0,87,0,0,0,0,255,255,255,250,0,0,4,233,7,95,18,38,0,55,0,0,17,7,22,190,4,115,1,103,0,16,180,1,13,9,0,7, + 43,49,0,64,3,95,8,1,93,48,0,0,255,255,0,55,0,0,2,254,6,130,18,38,0,87,0,0,17,7,22,184,2,55,0,112,0,7,64,3, + 143,20,1,93,49,0,0,0,0,1,255,250,0,0,4,233,5,213,0,15,0,70,64,24,7,11,149,4,12,9,3,15,149,0,129,9,5,1,64,7, + 3,28,12,0,64,10,14,16,16,212,60,228,204,252,60,228,204,49,0,47,244,236,50,16,212,60,236,50,48,1,64,19,0,17,31,0,16,1,16,2, + 31,15,16,17,64,17,112,17,159,17,9,93,3,33,21,33,17,33,21,33,17,35,17,33,53,33,17,33,6,4,239,253,238,1,9,254,247,203,254,247, + 1,9,253,238,5,213,170,253,192,170,253,191,2,65,170,2,64,0,0,0,0,1,0,55,0,0,2,242,5,158,0,29,0,67,64,31,8,22,169,5, + 23,4,26,169,0,1,27,188,13,135,16,16,13,14,2,6,8,4,0,8,23,27,21,25,29,70,30,16,252,60,60,196,50,252,60,60,196,196,50,57, + 57,49,0,47,236,244,60,196,252,60,220,60,236,50,48,178,175,31,1,1,93,1,17,33,21,33,21,33,21,33,21,20,23,22,59,1,21,35,34,39, + 38,61,1,35,53,51,53,35,53,51,17,1,119,1,123,254,133,1,123,254,133,37,38,115,189,189,213,81,81,135,135,135,135,5,158,254,194,143,233,142, + 233,137,39,39,154,80,79,210,233,142,233,143,1,62,0,0,255,255,0,178,255,227,5,41,7,94,16,39,22,187,4,238,1,117,19,6,0,56,0,0, + 0,16,180,31,9,24,39,7,43,64,5,16,9,31,24,2,93,49,0,0,255,255,0,174,255,227,4,88,6,55,16,39,2,158,0,131,0,0,19,6, + 0,88,0,0,0,8,180,30,8,22,38,7,43,49,0,0,255,255,0,178,255,227,5,41,7,49,16,39,0,113,0,238,1,59,19,6,0,56,0,0, + 0,20,180,5,3,2,13,7,43,64,9,47,2,32,3,31,2,16,3,4,93,49,0,0,255,255,0,174,255,227,4,88,5,245,16,39,0,113,0,131, + 255,255,19,6,0,88,0,0,0,8,180,6,3,2,14,7,43,49,0,0,255,255,0,178,255,227,5,41,7,109,16,39,22,192,4,238,1,117,19,6, + 0,56,0,0,0,16,180,15,0,8,23,7,43,64,5,16,0,31,8,2,93,49,0,0,255,255,0,174,255,227,4,88,6,72,16,39,2,154,0,131, + 0,0,19,6,0,88,0,0,0,8,180,16,0,8,24,7,43,49,0,0,255,255,0,178,255,227,5,41,7,111,18,38,0,56,0,0,16,7,2,156, + 0,240,0,105,255,255,0,174,255,227,4,88,6,202,18,38,0,88,0,0,17,6,2,156,124,196,0,9,64,5,64,21,64,33,2,93,49,0,0,0, + 255,255,0,178,255,227,5,41,7,107,16,39,22,194,4,238,1,117,18,6,0,56,0,0,255,255,0,174,255,227,4,94,6,102,16,39,2,159,0,176, + 0,0,18,6,0,88,0,0,255,255,0,178,254,117,5,41,5,213,18,38,0,56,0,0,16,7,2,157,0,250,0,0,255,255,0,174,254,117,4,232, + 4,123,18,38,0,88,0,0,16,7,2,157,2,39,0,0,255,255,0,68,0,0,7,166,7,116,16,39,22,189,5,245,1,124,19,6,0,58,0,0, + 0,8,180,21,2,6,20,7,43,49,0,0,255,255,0,86,0,0,6,53,6,109,16,39,2,136,1,69,0,7,19,6,0,90,0,0,0,8,180,21, + 2,6,20,7,43,49,0,0,255,255,255,252,0,0,4,231,7,116,16,39,22,189,4,114,1,124,19,6,0,60,0,0,0,8,180,11,2,6,7,7, + 43,49,0,0,255,255,0,61,254,86,4,127,6,109,16,38,2,136,94,7,19,6,0,92,0,0,0,8,180,24,2,6,23,7,43,49,255,255,255,252, + 0,0,4,231,7,78,18,38,0,60,0,0,17,7,22,185,4,115,1,117,0,8,180,0,16,11,4,7,43,49,0,0,255,255,0,92,0,0,5,31, + 7,108,16,39,22,186,4,149,1,118,18,6,0,61,0,0,255,255,0,88,0,0,3,219,6,109,16,38,0,118,66,7,18,6,0,93,0,0,0,0, + 255,255,0,92,0,0,5,31,7,80,16,39,22,193,4,190,1,117,18,6,0,61,0,0,255,255,0,88,0,0,3,219,6,20,16,39,2,184,4,23, + 0,0,19,6,0,93,0,0,0,14,1,64,9,79,10,95,10,175,10,223,10,4,93,49,255,255,0,92,0,0,5,31,7,109,18,38,0,61,0,0, + 16,7,22,190,4,190,1,117,255,255,0,88,0,0,3,219,6,102,18,38,0,93,0,0,17,6,2,137,27,0,0,16,180,1,15,11,0,7,43,64, + 5,15,15,0,11,2,93,49,0,1,0,47,0,0,2,248,6,20,0,16,0,35,64,18,11,135,10,151,1,2,169,5,188,1,10,16,8,4,6,2, + 76,17,16,252,60,204,252,204,49,0,47,244,236,16,244,236,48,33,35,17,35,53,51,53,52,54,59,1,21,35,34,7,6,21,1,152,185,176,176,174, + 189,174,176,99,39,38,3,209,143,78,187,171,153,40,41,103,0,2,0,32,255,227,4,164,6,20,0,15,0,44,0,68,64,37,4,185,16,20,12,185, + 32,28,140,20,184,34,41,37,169,44,36,39,151,34,46,69,0,18,24,71,42,32,6,44,40,8,37,35,39,70,45,16,252,60,204,236,50,50,50,204, + 244,236,236,49,0,47,244,220,60,236,50,16,228,244,196,236,16,198,238,48,1,52,39,38,35,34,7,6,21,20,23,22,51,50,55,54,1,54,55,54, + 51,50,23,22,17,16,7,6,35,34,39,38,39,21,35,17,35,53,51,53,51,21,33,21,33,3,229,83,84,146,146,84,83,83,84,146,146,84,83,253, + 142,58,89,88,123,204,127,128,128,127,204,123,88,89,58,185,154,154,185,1,69,254,187,2,47,203,116,115,115,116,203,203,116,115,115,116,2,82,100,48, + 49,162,162,254,248,254,248,162,162,49,48,100,168,5,4,125,147,147,125,0,0,3,255,151,0,0,5,80,5,213,0,8,0,17,0,41,0,67,64,35, + 25,0,149,10,9,149,18,129,1,149,10,173,31,17,11,8,2,19,25,31,5,0,14,28,22,5,25,28,46,9,0,28,18,4,42,16,252,236,50,252, + 236,212,236,17,23,57,57,57,49,0,47,236,236,244,236,16,238,57,48,178,15,34,1,1,93,1,17,33,50,54,53,52,38,35,1,17,33,50,54,53, + 52,38,35,37,33,50,22,21,20,6,7,30,1,21,20,4,35,33,17,34,6,29,1,35,53,52,54,1,247,1,68,163,157,157,163,254,188,1,43,148, + 145,145,148,254,11,2,4,231,250,128,124,149,165,254,240,251,253,232,132,118,156,192,2,201,253,221,135,139,140,133,2,102,254,62,111,114,113,112,166,192, + 177,137,162,20,32,203,152,200,218,5,48,95,105,49,70,181,163,0,0,0,255,255,0,201,0,0,4,236,5,213,18,6,3,165,0,0,0,2,0,186, + 255,227,4,164,6,20,0,22,0,38,0,56,64,31,27,185,0,4,35,185,16,12,140,4,184,18,22,169,19,151,18,40,69,20,23,18,8,71,16,31, + 22,8,19,70,39,16,252,236,50,50,244,236,196,236,49,0,47,244,236,16,228,244,196,236,16,198,238,48,1,54,55,54,51,50,23,22,17,16,7,6, + 35,34,39,38,39,21,35,17,33,21,37,1,52,39,38,35,34,7,6,21,20,23,22,51,50,55,54,1,115,58,89,88,123,204,127,128,128,127,204,123, + 88,89,58,185,3,78,253,107,2,114,83,84,146,146,84,83,83,84,146,146,84,83,3,182,100,48,49,162,162,254,248,254,248,162,162,49,48,100,168,6, + 20,166,1,252,192,203,116,115,115,116,203,203,116,115,115,116,0,2,0,0,0,0,4,236,5,213,0,10,0,23,0,51,64,12,23,11,25,0,25,16, + 46,5,11,28,21,22,47,220,236,50,252,236,196,16,204,49,64,9,5,149,12,173,11,129,6,149,20,0,47,236,228,244,236,179,21,21,11,20,17,18, + 57,47,48,1,52,39,38,35,33,17,33,50,55,54,1,17,33,50,4,21,20,4,35,33,17,35,1,4,23,79,78,163,254,188,1,68,163,78,79,253, + 124,1,78,251,1,16,254,240,251,253,232,201,1,56,1,183,139,68,67,253,221,68,67,4,168,253,154,218,222,221,218,4,68,1,145,0,0,2,0,0, + 255,227,4,164,6,21,0,18,0,30,0,62,64,13,17,18,32,19,18,6,71,13,25,18,8,15,16,47,220,236,50,50,244,236,196,16,204,49,64,14, + 0,22,185,3,184,14,12,28,185,9,140,17,151,14,0,47,228,244,236,196,16,244,236,196,179,15,15,17,14,17,18,57,47,48,1,62,1,51,50,0, + 17,16,2,35,34,38,39,21,35,17,35,1,51,1,52,38,35,34,6,21,20,22,51,50,54,1,115,58,177,123,204,0,255,255,204,123,177,58,185,186, + 1,34,81,2,114,167,146,146,167,167,146,146,167,3,182,100,97,254,188,254,248,254,248,254,188,97,100,168,4,68,1,209,252,26,203,231,231,203,203,231, + 231,0,0,0,0,1,0,115,255,227,5,39,5,240,0,25,0,48,64,27,25,134,0,136,22,149,3,145,26,13,134,12,136,16,149,9,140,26,27,16, + 19,25,6,48,13,0,26,16,220,60,244,236,236,49,0,16,244,236,244,236,16,244,236,244,236,48,19,62,1,51,32,0,17,16,0,33,34,38,39,53, + 30,1,51,32,0,17,16,0,33,34,6,7,115,104,237,134,1,83,1,134,254,122,254,173,132,237,106,102,231,130,1,0,1,16,254,240,255,0,130,231, + 102,5,98,71,71,254,97,254,152,254,153,254,97,72,72,211,95,94,1,57,1,39,1,40,1,57,94,95,0,1,0,115,255,227,6,90,7,100,0,36, + 0,68,64,34,33,149,32,37,13,161,14,174,10,149,17,1,161,0,174,4,149,23,145,17,140,37,32,7,25,20,27,17,13,0,48,20,16,37,16,252, + 252,50,236,16,236,196,49,0,16,228,244,236,244,236,16,238,246,238,16,220,236,48,180,15,38,31,38,2,1,93,1,21,46,1,35,32,0,17,16,0, + 33,50,54,55,21,14,1,35,32,0,17,16,0,33,50,23,22,23,54,55,54,59,1,21,35,34,6,5,39,102,231,130,255,0,254,240,1,16,1,0, + 130,231,102,106,237,132,254,173,254,122,1,134,1,83,96,156,13,12,16,83,102,227,77,63,134,110,5,98,213,95,94,254,199,254,216,254,217,254,199,94, + 95,211,72,72,1,159,1,103,1,104,1,159,36,3,4,195,98,122,170,150,0,1,0,113,255,227,4,204,6,20,0,34,0,78,64,36,0,134,1,136, + 4,14,134,13,136,10,185,17,4,185,23,184,17,140,35,1,135,30,151,35,7,18,20,25,8,30,13,0,72,20,69,35,16,252,244,50,204,236,16,236, + 49,0,16,244,236,16,228,244,236,16,254,244,238,16,245,238,48,64,11,15,36,16,36,128,36,144,36,160,36,5,1,93,1,21,46,1,35,34,6,21, + 20,22,51,50,54,55,21,14,1,35,34,0,17,16,0,33,50,23,53,52,54,59,1,21,35,34,6,3,231,78,157,80,179,198,198,179,80,157,78,77, + 165,93,253,254,214,1,45,1,6,71,70,161,181,69,48,105,76,4,126,245,43,43,227,205,205,227,43,43,170,36,36,1,62,1,14,1,18,1,58,12, + 15,214,192,156,97,0,0,0,255,255,0,10,0,0,5,186,5,213,16,6,0,146,0,0,0,2,255,151,0,0,6,20,5,213,0,8,0,26,0,46, + 64,21,0,149,9,129,1,149,16,8,2,16,10,0,5,25,13,50,0,28,9,4,27,16,252,236,244,236,17,57,57,57,57,49,0,47,236,244,236,48, + 178,96,19,1,1,93,1,17,51,32,0,17,16,0,33,37,33,32,0,17,16,0,41,1,17,34,6,29,1,35,53,52,54,1,247,244,1,53,1,31, + 254,225,254,203,254,66,1,159,1,178,1,150,254,104,254,80,254,97,132,118,156,192,5,47,251,119,1,24,1,46,1,44,1,23,166,254,151,254,128,254, + 126,254,150,5,48,95,105,49,70,181,163,0,0,2,0,201,0,0,4,236,5,213,0,7,0,20,0,46,64,12,22,8,4,19,28,10,46,0,25,14, + 16,21,16,252,236,244,236,50,196,196,49,64,12,19,149,9,129,10,4,149,18,173,3,149,10,0,47,236,244,236,16,244,236,48,1,16,41,1,17,33, + 34,6,17,33,17,33,34,36,53,52,36,51,33,17,33,1,158,1,64,1,68,254,188,163,157,3,78,253,232,251,254,240,1,16,251,1,78,253,124,1, + 183,254,239,2,35,135,3,147,250,43,218,222,221,218,1,192,0,2,0,113,255,227,4,90,6,20,0,18,0,30,0,63,64,29,28,185,17,14,22,185, + 5,8,140,14,184,3,18,135,1,151,3,25,4,17,8,2,71,0,19,18,11,69,31,16,252,236,196,244,236,50,50,49,0,47,252,236,16,228,244,196, + 236,16,196,238,48,182,96,32,128,32,160,32,3,1,93,1,53,33,17,35,53,14,1,35,34,2,17,16,0,51,50,22,23,17,1,20,22,51,50,54, + 53,52,38,35,34,6,1,13,3,77,184,58,177,124,203,255,0,255,203,124,177,58,253,141,167,146,146,168,168,146,146,167,5,110,166,249,236,168,100,97, + 1,68,1,8,1,8,1,68,97,100,1,185,252,192,203,231,231,203,203,231,231,0,0,0,0,2,0,113,254,86,4,116,4,99,0,25,0,39,0,84, + 64,20,13,12,11,32,41,69,23,11,18,2,26,18,23,81,6,32,18,17,69,40,16,252,236,196,244,178,127,23,1,93,236,212,236,16,236,17,18,57, + 57,0,64,14,13,12,29,9,6,7,9,185,4,29,185,20,182,40,16,244,236,212,252,212,204,17,18,57,57,64,6,0,37,83,12,13,12,7,14,16, + 236,57,49,48,37,22,21,16,33,34,39,53,22,51,50,53,52,37,38,39,38,17,16,0,51,50,0,3,20,2,3,54,38,35,34,6,21,20,22,23, + 22,23,62,1,3,107,157,254,71,221,120,102,246,246,254,248,208,117,142,1,18,239,240,1,19,1,155,39,1,171,148,148,172,188,126,64,51,99,110,66, + 79,141,254,240,70,153,70,117,92,48,37,112,135,1,15,1,15,1,57,254,199,254,237,156,254,252,1,160,203,229,232,195,194,199,11,6,14,42,220,0, + 0,1,0,131,0,0,4,69,5,213,0,11,0,43,64,9,13,5,9,28,0,11,7,2,12,16,220,196,196,212,236,50,196,49,64,12,10,149,11,129, + 2,6,149,7,173,3,149,2,0,47,236,244,236,16,244,236,48,1,17,33,53,33,17,33,53,33,17,33,53,4,69,252,62,2,248,253,57,2,199,253, + 26,5,213,250,43,170,2,29,170,1,186,170,0,2,0,117,255,227,5,217,5,240,0,19,0,26,0,68,64,38,1,20,0,8,161,7,174,4,0,149, + 20,23,149,17,0,149,20,173,4,149,11,145,17,140,27,1,20,26,26,25,15,51,20,25,7,0,16,27,16,252,196,236,244,236,17,18,57,49,0,16, + 228,244,236,244,228,16,238,16,238,16,244,238,17,18,57,48,19,33,16,0,33,34,6,7,53,54,36,51,32,0,17,16,0,33,32,0,55,22,0,51, + 50,0,55,117,4,143,254,237,254,238,139,252,112,111,1,7,146,1,94,1,139,254,136,254,198,254,183,254,151,220,13,0,255,202,202,0,255,13,3,12, + 1,12,1,50,96,95,215,70,72,254,103,254,146,254,159,254,91,1,183,204,195,254,228,1,28,195,0,0,0,1,0,164,255,227,4,123,5,240,0,40, + 0,64,64,36,10,134,9,136,13,149,6,145,41,0,22,149,19,173,41,31,134,32,136,28,149,35,140,41,42,20,9,31,16,25,3,25,25,38,16,41, + 16,252,236,212,236,212,196,196,204,49,0,16,244,236,244,236,16,244,236,57,16,244,236,244,236,48,1,46,1,53,52,36,51,50,22,23,21,46,1,35, + 34,6,21,20,22,59,1,21,35,34,6,21,20,22,51,50,54,55,21,14,1,35,32,36,53,52,54,1,216,131,142,1,12,230,89,201,115,114,190,83, + 152,163,158,149,182,174,165,185,199,190,109,200,84,106,199,94,254,232,254,208,163,3,37,33,171,124,178,209,32,32,180,38,36,123,115,112,119,166,149,132, + 143,150,50,49,195,37,37,242,221,144,196,0,0,1,255,150,254,102,4,35,5,213,0,17,0,65,64,31,17,8,18,13,149,12,176,18,6,149,4,2, + 149,0,129,4,173,18,17,8,0,7,12,5,1,7,3,28,0,4,18,16,252,236,50,212,196,196,17,18,57,57,49,0,16,236,244,236,16,238,16,244, + 236,16,57,57,48,178,15,11,1,1,93,19,33,21,33,17,33,21,33,17,16,6,43,1,53,51,50,54,53,201,3,90,253,112,2,80,253,176,205,227, + 77,63,134,110,5,213,170,254,72,170,253,159,254,242,244,170,150,194,0,0,0,1,255,127,254,86,2,248,6,20,0,27,0,101,64,35,19,10,15,135, + 13,189,29,5,24,1,20,8,169,6,1,135,0,151,22,6,188,28,2,27,7,0,7,9,5,8,21,23,19,76,28,16,252,75,176,10,84,88,185,0, + 19,0,64,56,89,75,176,22,84,88,185,0,19,255,192,56,89,60,196,252,60,196,196,18,57,57,49,0,16,228,50,252,236,16,238,50,18,57,57,16, + 244,236,57,57,48,1,182,64,29,80,29,160,29,3,93,1,21,35,34,6,29,1,33,21,33,17,20,6,43,1,53,51,50,54,53,17,35,53,51,53, + 52,54,51,2,248,176,99,77,1,47,254,209,174,189,174,176,99,77,176,176,174,189,6,20,153,80,104,99,143,251,235,187,171,153,80,104,4,42,143,78, + 187,171,0,0,0,1,0,115,255,227,6,151,7,100,0,38,0,73,64,16,21,2,0,28,4,17,28,26,52,4,51,33,25,11,70,39,16,252,236,252, + 244,236,16,252,196,196,49,64,24,22,149,21,39,0,5,36,1,149,3,36,149,8,27,161,26,174,30,149,14,145,8,140,39,0,16,228,244,236,244,236, + 16,254,212,238,17,57,57,16,220,236,48,37,17,33,53,33,17,6,4,35,32,0,17,16,0,33,50,22,23,52,54,59,1,21,35,34,6,29,1,46, + 1,35,32,0,17,16,0,33,50,54,4,195,254,182,2,18,117,254,230,160,254,162,254,117,1,139,1,94,91,163,68,201,227,77,63,134,110,112,252,139, + 254,238,254,237,1,19,1,18,107,168,213,1,145,166,253,127,83,85,1,153,1,109,1,110,1,153,25,25,188,234,170,150,194,215,95,96,254,206,254,209, + 254,210,254,206,37,0,0,0,0,2,0,8,254,82,5,118,5,213,0,15,0,37,0,149,64,13,39,80,18,1,18,4,25,23,12,25,31,36,38,16, + 212,212,236,212,236,212,93,196,181,16,8,0,3,4,12,17,18,23,57,49,64,10,0,149,27,189,17,37,18,36,129,38,0,16,228,50,50,50,244,236, + 179,31,23,8,27,17,18,57,57,48,64,12,19,17,17,18,18,8,35,37,17,36,36,8,7,5,16,236,60,7,16,236,60,182,19,17,8,18,8,36, + 8,7,8,16,236,182,35,17,8,36,8,18,8,7,8,16,236,180,16,37,19,17,35,15,64,16,22,21,20,3,23,19,36,8,34,33,32,3,31,35, + 18,8,4,7,17,18,23,57,7,17,18,23,57,1,50,55,54,53,52,39,38,39,6,7,6,21,20,23,22,19,1,51,1,22,23,22,21,20,7,6, + 35,34,39,38,53,52,55,54,55,1,51,2,191,54,44,28,31,51,44,44,51,31,28,44,54,1,217,222,253,186,104,67,46,75,100,155,155,100,75,46, + 67,104,253,186,222,254,253,32,20,66,57,73,121,92,92,121,73,57,66,20,32,3,122,3,94,251,207,200,174,119,66,139,65,87,87,65,139,66,119,174, + 200,4,49,0,0,1,0,186,0,0,7,71,6,20,0,42,0,79,64,17,44,13,18,4,8,17,42,21,8,38,78,31,27,8,29,70,43,16,252,236, + 50,244,236,196,196,204,212,236,57,49,0,64,25,8,135,9,39,20,38,0,135,17,21,27,38,3,32,17,24,135,32,9,35,184,30,151,17,28,47,60, + 236,244,60,196,236,17,18,23,57,16,236,18,57,57,16,236,48,37,50,55,54,53,52,39,38,39,53,22,23,22,17,20,0,43,1,34,38,53,17,52, + 38,35,34,6,21,17,35,17,51,17,62,1,51,50,22,21,17,20,22,51,5,76,149,84,87,74,62,121,224,109,111,254,224,221,70,187,157,124,124,149, + 172,185,185,66,179,117,193,198,76,105,156,98,101,155,222,112,95,33,148,29,143,145,254,236,245,254,230,200,206,1,8,159,158,190,164,253,135,6,20,253, + 158,101,100,239,232,254,242,147,103,0,0,0,0,1,0,201,0,0,2,198,5,213,0,11,0,46,64,16,11,2,0,6,149,0,129,7,5,8,6,1, + 28,0,4,12,16,252,75,176,16,84,88,185,0,0,0,64,56,89,236,196,57,57,49,0,47,228,236,17,57,57,48,1,19,51,17,20,22,59,1,21, + 35,34,38,17,201,202,110,134,63,77,227,205,5,213,252,45,194,150,170,244,1,14,0,0,0,1,0,10,0,0,2,82,5,213,0,11,0,69,64,17, + 2,11,149,5,8,0,175,6,3,5,1,28,10,8,0,4,12,16,252,60,196,75,176,16,84,88,187,0,8,0,64,0,0,0,64,56,56,89,236,50, + 196,49,0,47,236,220,60,244,50,48,1,64,13,48,13,64,13,80,13,96,13,143,13,159,13,6,93,19,51,17,51,21,35,17,35,17,35,53,51,201, + 202,191,191,202,191,191,5,213,253,22,170,253,191,2,65,170,0,1,0,201,0,0,5,247,5,240,0,23,0,102,64,14,0,28,1,7,8,15,7,9, + 11,15,28,14,4,24,16,252,236,50,212,196,17,57,16,212,236,0,49,0,64,37,11,17,8,9,8,10,17,9,9,8,17,17,7,8,7,16,17,8, + 8,7,66,11,8,16,3,14,12,23,2,5,149,19,145,14,175,12,9,47,60,236,244,236,57,57,17,18,23,57,48,75,83,88,7,16,4,237,7,16, + 5,237,7,16,5,237,7,16,4,237,89,34,1,35,53,52,38,35,34,7,9,1,33,1,17,35,17,51,17,1,54,51,50,23,22,21,5,247,170,73, + 38,70,37,253,221,3,26,254,246,253,51,202,202,2,108,85,113,136,85,85,4,72,121,54,80,35,253,249,252,227,2,207,253,49,5,213,253,137,2,67, + 79,92,91,110,0,1,0,185,0,0,4,156,6,20,0,18,0,203,64,11,4,13,9,12,14,16,9,8,0,70,19,16,252,236,50,212,196,17,57,196, + 49,0,64,15,66,16,13,10,3,11,17,6,149,3,151,11,188,17,14,47,60,228,252,228,17,18,23,57,48,75,83,88,64,20,16,17,13,14,13,15, + 17,14,14,13,11,17,12,13,12,10,17,13,13,12,7,16,4,237,7,16,5,237,7,16,5,237,7,16,4,237,89,178,16,20,1,1,93,64,53,11, + 11,10,15,40,11,39,12,40,13,43,14,43,15,64,20,104,11,96,20,137,11,133,12,137,13,141,14,143,15,154,11,151,15,170,11,167,13,182,15,197, + 15,214,15,247,11,240,11,247,12,240,12,26,93,180,9,13,9,14,2,113,0,64,37,4,10,10,16,22,10,39,10,41,13,43,16,86,10,102,10,103, + 16,115,10,119,13,130,10,137,13,142,16,147,10,150,13,151,16,163,10,18,93,19,52,54,59,1,21,35,34,6,21,17,1,51,9,1,35,1,17,35, + 185,163,181,191,168,105,76,2,37,235,253,174,2,107,240,253,199,185,4,126,214,192,156,97,153,253,255,1,227,253,244,253,172,2,35,253,221,0,0,0, + 0,1,0,10,0,0,2,42,6,20,0,11,0,50,64,7,5,1,8,8,0,70,12,16,252,60,236,50,49,0,64,8,2,11,169,5,8,0,151,6, + 47,236,212,60,236,50,48,64,13,16,13,64,13,80,13,96,13,112,13,240,13,6,1,93,19,51,17,51,21,35,17,35,17,35,53,51,193,184,177,177, + 184,183,183,6,20,253,56,144,253,68,2,188,144,0,0,0,0,1,0,61,0,0,4,127,6,20,0,15,0,160,64,19,8,2,11,5,1,14,7,13, + 8,12,6,9,4,6,17,12,6,0,16,16,212,196,178,128,6,1,93,212,196,16,196,204,17,18,23,57,180,16,9,64,9,2,93,49,0,64,15,8, + 2,11,5,1,14,6,6,0,4,9,6,151,13,0,47,60,244,196,196,17,18,23,57,48,64,50,10,3,169,2,169,11,169,5,8,4,12,7,9,4, + 15,17,0,14,17,1,13,6,1,0,5,17,2,17,14,17,15,14,1,17,0,1,13,17,12,7,12,11,17,8,17,7,17,13,6,13,7,5,16,236, + 236,236,7,16,5,236,8,236,8,236,5,236,236,7,8,16,236,5,16,236,7,8,16,60,60,236,236,14,252,60,51,1,39,5,39,37,39,51,23,37, + 23,5,1,35,9,1,61,1,235,71,254,212,33,1,41,75,200,52,1,58,33,254,201,1,237,195,254,198,254,126,4,50,188,101,99,99,197,138,104,97, + 104,250,215,3,60,252,196,0,0,1,0,178,255,227,7,39,5,213,0,39,0,74,64,18,0,18,20,32,29,28,41,31,80,18,28,20,80,10,28,8, + 4,40,16,252,236,252,252,252,204,252,60,17,18,57,49,0,64,22,7,20,10,28,17,0,6,33,8,14,24,149,33,3,36,140,40,18,29,8,129,32, + 47,244,60,60,16,244,60,196,236,50,17,18,23,57,48,57,37,14,1,35,34,39,38,53,17,51,17,20,23,22,51,50,54,53,17,51,17,20,23,22, + 51,50,55,54,53,17,51,17,35,53,14,1,35,34,39,38,3,166,69,192,130,175,95,95,203,39,57,117,143,166,203,57,57,119,123,83,83,203,203,63, + 176,121,122,86,85,213,124,118,123,122,226,4,27,251,239,186,53,78,190,164,3,236,251,239,162,78,77,95,96,163,3,236,250,41,174,103,98,62,62,0, + 0,1,255,150,254,102,5,51,5,213,0,17,0,140,64,41,7,17,1,2,1,2,17,6,7,6,66,8,17,0,13,149,12,176,18,7,2,3,0,175, + 5,6,1,7,2,28,4,54,11,14,12,57,7,28,0,4,18,16,252,236,228,57,57,252,236,17,57,57,49,0,47,236,50,57,57,16,252,236,17,57, + 57,48,75,83,88,7,16,4,237,7,16,4,237,89,34,178,31,11,1,1,93,64,48,54,2,56,7,72,2,71,7,105,2,102,7,128,2,7,6,1, + 9,6,21,1,26,6,70,1,73,6,87,1,88,6,101,1,105,6,121,6,133,1,138,6,149,1,154,6,159,19,16,93,0,93,19,33,1,17,51,17, + 33,1,17,16,6,43,1,53,51,50,54,53,201,1,16,2,150,196,254,240,253,106,205,227,71,63,134,110,5,213,251,31,4,225,250,43,4,225,251,135, + 254,242,244,170,150,194,0,0,255,255,0,186,254,86,4,100,4,123,16,6,3,75,0,0,0,3,0,115,255,227,5,217,5,240,0,11,0,18,0,25, + 0,49,64,11,25,16,25,6,51,15,19,25,0,16,26,16,252,236,50,244,236,50,49,0,64,15,22,149,9,19,149,15,173,26,12,149,3,145,9,140, + 26,16,228,244,236,16,244,236,16,236,48,19,16,0,33,32,0,17,16,0,33,32,0,1,34,0,7,33,38,2,1,26,1,51,50,18,19,115,1,121, + 1,58,1,59,1,120,254,136,254,197,254,198,254,135,2,181,202,255,0,12,3,172,14,254,253,86,8,251,220,220,248,8,2,233,1,98,1,165,254,91, + 254,159,254,158,254,91,1,164,3,197,254,228,195,195,1,28,253,122,254,255,254,194,1,61,1,2,0,0,255,255,0,103,255,227,6,29,6,20,16,38, + 0,50,244,0,16,7,2,204,5,162,1,52,255,255,0,118,255,227,4,211,4,235,16,39,2,204,4,88,0,11,16,6,0,82,5,0,0,2,0,115, + 255,227,6,207,5,240,0,20,0,31,0,51,64,28,4,149,16,175,0,21,149,13,145,0,27,149,7,140,0,33,19,28,0,30,28,16,4,24,25,10, + 16,32,16,252,236,212,60,236,220,236,196,49,0,47,244,236,16,244,236,16,244,236,48,33,17,52,38,35,17,6,33,32,0,17,16,0,33,50,23,33, + 50,22,25,1,1,34,0,17,16,0,51,50,55,17,38,6,5,110,122,188,254,197,254,198,254,135,1,121,1,59,112,97,1,39,227,205,252,88,220,254, + 253,1,3,220,175,128,138,3,211,194,150,251,139,211,1,164,1,98,1,98,1,165,27,244,254,242,252,45,5,76,254,184,254,230,254,229,254,184,103,4, + 24,70,0,0,0,2,0,113,254,86,5,89,4,123,0,22,0,33,0,58,64,32,5,135,17,188,34,23,185,14,184,34,29,185,8,140,22,189,34,17, + 1,5,35,21,8,1,31,8,5,26,18,11,69,34,16,252,236,212,236,220,236,196,17,18,57,49,0,16,228,244,236,16,244,236,16,244,236,48,1,17, + 52,39,38,35,17,6,35,34,0,17,16,0,51,50,23,51,50,23,22,21,17,1,34,6,21,20,22,51,50,55,17,38,4,161,38,38,105,137,240,241, + 254,239,1,17,241,100,82,216,181,82,81,253,26,148,172,171,149,129,64,84,254,86,4,116,153,49,48,252,188,157,1,57,1,19,1,20,1,56,27,96, + 96,214,251,140,5,137,231,201,201,231,58,2,240,54,0,0,0,2,255,151,0,0,4,241,5,213,0,8,0,28,0,58,64,24,1,149,16,0,149,9, + 129,18,16,10,8,2,4,0,5,25,13,63,17,0,28,9,4,29,16,252,236,50,252,236,17,23,57,49,0,47,244,236,212,236,48,64,11,15,21,31, + 21,63,21,95,21,175,21,5,1,93,1,17,51,50,54,53,52,38,35,37,33,50,4,21,20,4,43,1,17,35,17,34,6,29,1,35,53,52,54,1, + 247,254,141,154,154,141,254,56,1,200,251,1,1,254,255,251,254,202,132,118,156,192,5,47,253,207,146,135,134,146,166,227,219,221,226,253,168,5,48,95, + 105,49,70,181,163,0,0,0,0,2,0,185,254,86,4,164,6,20,0,24,0,36,0,79,64,36,35,185,0,23,29,185,14,17,184,23,140,1,189,37, + 3,12,9,169,6,151,37,26,18,20,71,6,9,3,7,32,12,0,8,2,70,37,16,252,236,50,50,204,17,57,57,244,236,49,0,16,244,236,57,57, + 16,228,228,244,196,236,16,196,238,48,64,9,96,38,128,38,160,38,224,38,4,1,93,37,17,35,17,52,54,59,1,21,35,34,6,29,1,62,1,51, + 50,0,17,16,2,35,34,38,1,52,38,35,34,6,21,20,22,51,50,54,1,115,186,163,181,254,231,105,76,58,177,123,204,0,255,255,204,123,177,2, + 56,167,146,146,167,167,146,146,167,168,253,174,6,40,214,192,156,97,153,200,100,97,254,188,254,248,254,248,254,188,97,1,235,203,231,231,203,203,231,231, + 0,2,0,201,254,248,5,84,5,213,0,21,0,29,0,86,64,23,5,6,3,19,0,9,29,24,16,5,10,26,25,4,19,63,14,22,10,18,12,4, + 30,16,252,236,50,50,252,196,236,17,23,57,17,57,57,57,49,0,64,16,0,23,6,3,4,23,149,9,22,149,15,129,4,13,129,11,47,236,220,244, + 236,212,236,18,57,57,18,57,48,1,64,9,32,31,64,31,117,4,124,5,2,93,1,30,1,23,19,35,3,46,1,43,1,17,35,17,51,17,51,32, + 22,21,20,6,1,17,51,50,54,16,38,35,3,141,65,123,62,205,217,191,74,139,120,220,202,202,254,1,0,252,131,253,137,254,141,154,153,142,1,180, + 22,144,126,254,104,1,127,150,98,254,145,5,213,254,248,214,216,141,186,2,79,253,209,146,1,12,145,0,0,1,0,114,255,227,4,141,5,240,0,33, + 0,100,64,17,7,24,25,6,29,10,15,29,25,4,45,0,34,10,25,21,34,16,220,236,228,252,236,196,17,18,57,57,57,57,49,0,64,25,66,25, + 24,7,6,4,14,33,0,14,161,15,148,12,149,17,32,149,0,148,2,145,17,140,34,16,228,244,228,236,16,238,246,238,16,206,17,23,57,48,75,83, + 88,64,10,24,2,7,6,7,25,2,6,6,7,7,16,14,237,7,16,14,237,89,19,54,32,4,16,6,15,1,14,1,20,22,51,50,55,21,4,35, + 32,39,38,53,52,54,63,1,54,55,54,52,39,38,32,7,204,228,1,198,1,23,202,226,123,154,135,188,173,225,248,254,253,214,254,231,146,145,215,226, + 122,166,60,59,89,90,254,161,228,5,164,76,228,254,143,192,45,24,31,124,236,136,139,208,95,112,112,217,182,217,43,25,31,50,51,217,64,64,109,0, + 0,1,0,100,255,227,3,188,4,123,0,39,0,207,64,17,10,30,29,9,13,33,20,33,8,6,13,8,0,82,26,69,40,16,252,228,236,212,236,196, + 17,18,57,57,57,57,49,64,25,30,29,10,9,4,19,0,134,39,137,36,20,134,19,137,16,185,23,36,185,3,184,23,140,40,0,16,228,244,236,16, + 254,245,238,16,245,238,18,23,57,48,64,18,27,28,2,26,29,83,9,10,32,31,2,33,30,83,10,10,9,66,75,83,88,7,16,14,237,17,23,57, + 7,14,237,17,23,57,89,34,178,0,1,1,1,93,64,17,47,41,63,41,95,41,127,41,128,41,144,41,160,41,240,41,8,93,64,37,32,0,32,39, + 36,38,40,30,40,29,42,21,47,20,47,19,42,18,40,10,40,9,41,8,41,7,36,1,134,30,134,29,134,28,134,27,18,0,93,64,23,28,30,28, + 29,28,28,46,31,44,30,44,29,44,28,59,31,59,30,59,29,59,28,11,113,19,62,1,51,50,22,21,20,6,15,1,14,1,21,20,22,51,50,54, + 55,21,14,1,35,34,38,53,52,54,63,1,62,1,53,52,38,35,34,6,7,160,76,180,102,206,224,152,171,64,171,101,140,130,97,198,102,108,195,90, + 216,247,165,196,63,148,98,137,137,90,168,78,4,63,30,30,172,158,130,149,36,15,37,80,75,81,89,53,53,190,35,35,182,156,137,153,42,14,33,73, + 64,84,84,40,40,0,0,0,255,255,0,201,0,0,4,139,5,213,16,6,3,55,0,0,0,2,254,242,254,86,2,215,6,20,0,22,0,31,0,54, + 64,12,29,14,10,21,6,20,1,8,23,10,79,32,16,252,50,252,50,204,204,16,212,204,49,0,64,15,20,31,135,0,11,27,135,16,151,32,4,135, + 6,189,32,16,252,236,16,244,236,212,60,236,50,48,1,17,20,22,59,1,21,35,34,38,53,17,35,32,53,52,33,50,23,22,23,51,21,37,38,39, + 38,35,34,7,6,51,1,119,77,99,176,174,189,174,190,254,242,1,47,181,82,53,18,191,254,134,8,17,33,110,124,3,3,119,4,106,251,61,104,80, + 153,171,187,4,174,210,216,96,64,111,155,154,44,24,48,65,51,0,0,0,0,1,0,55,254,86,2,242,5,158,0,29,0,63,64,14,14,20,8,8, + 2,9,4,0,8,26,28,24,70,30,16,252,60,196,252,60,220,50,57,252,204,49,0,64,18,24,5,8,25,3,169,0,27,1,188,8,135,21,16,135, + 14,189,21,47,252,236,16,236,244,60,204,236,50,17,57,57,48,1,17,33,21,33,17,20,22,59,1,21,20,6,43,1,53,51,50,55,54,61,1,34, + 38,53,17,35,53,51,17,1,119,1,123,254,133,75,115,189,164,180,70,48,106,38,38,213,167,135,135,5,158,254,194,143,253,160,137,78,174,214,192,156, + 48,49,153,20,159,210,2,96,143,1,62,0,0,1,0,24,0,0,4,233,5,213,0,15,0,88,64,21,13,10,12,6,2,149,0,129,4,0,7,1, + 64,3,28,5,11,28,13,5,16,16,212,212,236,16,252,228,57,57,49,0,47,244,236,50,196,57,57,48,1,75,176,10,84,88,189,0,16,0,64,0, + 1,0,16,0,16,255,192,56,17,55,56,89,64,19,0,17,31,0,16,1,16,2,31,7,16,17,64,17,112,17,159,17,9,93,1,33,21,33,17,35, + 17,35,34,6,29,1,35,53,52,54,1,174,3,59,253,238,203,94,132,118,156,192,5,213,170,250,213,5,43,90,105,49,70,181,163,0,0,1,0,55, + 0,0,2,242,6,20,0,27,0,73,64,16,25,22,11,8,4,23,9,2,4,0,8,16,19,14,70,28,16,252,60,196,252,60,196,50,50,23,57,49, + 0,64,19,19,0,25,135,22,151,10,14,5,8,15,3,169,17,1,188,8,135,10,47,236,244,60,236,50,17,57,57,16,244,236,57,57,48,178,175,21, + 1,1,93,1,21,33,21,33,17,20,22,59,1,21,35,34,38,53,17,35,53,51,53,52,54,59,1,21,35,34,6,1,119,1,123,254,133,75,115,189, + 189,213,162,135,135,174,189,174,176,99,77,4,195,99,143,253,160,137,78,154,159,210,2,96,143,78,187,171,153,81,0,0,0,1,255,250,254,102,4,233, + 5,213,0,15,0,84,64,20,7,149,10,189,16,14,2,149,0,129,16,8,1,64,3,28,0,64,13,16,16,212,228,252,228,196,49,0,16,244,236,50, + 16,244,236,48,1,75,176,10,84,88,189,0,16,0,64,0,1,0,16,0,16,255,192,56,17,55,56,89,64,19,0,17,31,0,16,1,16,2,31,15, + 16,17,64,17,112,17,159,17,9,93,3,33,21,33,17,20,22,59,1,21,35,34,38,25,1,33,6,4,239,253,238,110,134,63,78,227,205,253,238,5, + 213,170,251,61,194,150,170,244,1,14,4,195,255,255,0,173,255,247,6,95,6,20,16,38,0,56,251,20,16,7,2,204,5,228,1,52,255,255,0,176, + 255,227,5,105,4,235,16,39,2,204,4,238,0,11,16,6,0,88,2,0,0,1,0,78,255,227,5,207,5,202,0,31,0,58,64,16,29,26,25,33, + 16,0,4,51,10,17,20,25,13,10,16,32,16,252,196,252,196,16,244,196,236,252,196,49,0,64,14,13,17,1,29,149,30,16,129,32,23,149,7,140, + 32,16,244,236,16,252,60,236,50,50,50,48,1,33,22,18,21,16,0,33,32,0,17,52,18,55,33,53,33,21,6,2,21,20,0,51,50,0,53,52, + 2,39,53,33,5,207,254,192,161,142,254,127,254,209,254,207,254,129,145,158,254,193,2,88,178,199,1,9,216,216,1,8,198,177,2,88,5,24,141,254, + 216,194,254,203,254,119,1,138,1,62,184,1,42,139,178,178,97,254,180,202,239,254,221,1,34,240,202,1,76,97,178,0,0,1,0,201,255,225,5,118, + 5,213,0,27,0,45,64,13,16,21,12,7,8,3,25,12,24,28,21,4,28,16,252,236,212,236,47,60,17,18,57,49,0,64,9,8,22,129,28,0, + 149,16,140,28,16,244,236,16,236,196,48,37,50,0,53,52,39,38,39,53,23,22,18,21,16,7,6,33,39,38,39,38,25,1,51,17,20,22,51,2, + 198,216,1,8,99,65,110,179,161,142,192,191,254,207,77,232,97,103,202,110,134,141,1,34,240,202,166,109,87,68,1,141,254,216,194,254,203,197,196,2, + 6,116,122,1,14,3,240,252,16,194,150,0,0,1,255,252,0,0,5,240,5,240,0,23,0,100,64,15,19,28,20,12,4,11,7,0,64,5,28,9, + 64,7,24,16,212,228,252,228,18,57,196,57,47,236,49,0,64,11,18,21,20,0,149,14,145,11,9,175,6,47,236,57,244,236,204,57,57,48,64,25, + 12,17,4,5,4,11,17,10,11,5,5,4,11,17,12,11,8,9,8,10,17,9,9,8,66,75,83,88,7,16,5,237,7,16,8,237,7,16,8,237, + 7,16,5,237,89,34,1,34,7,6,7,1,17,35,17,1,51,9,1,54,51,50,23,22,29,1,35,53,52,38,4,215,57,21,37,17,254,132,203,253, + 240,217,1,158,1,78,90,163,136,85,85,170,73,5,71,14,24,25,253,191,253,57,2,199,3,14,253,154,1,249,136,92,91,110,131,121,54,80,0,0, + 0,1,0,61,254,86,5,216,4,123,0,31,1,106,64,23,18,14,21,27,31,24,8,21,31,14,13,12,10,9,6,3,0,8,31,4,31,11,32,16, + 212,75,176,10,84,75,176,8,84,91,88,185,0,11,0,64,56,89,75,176,20,84,88,185,0,11,255,192,56,89,196,196,17,23,57,16,212,236,17,57, + 17,18,57,49,0,64,58,7,8,2,9,17,0,31,10,17,11,10,0,0,31,14,17,29,0,31,13,17,12,13,0,0,31,13,17,14,13,10,11,10, + 12,17,11,11,10,66,13,11,9,32,0,11,5,135,3,189,32,27,185,18,184,11,188,23,32,16,196,228,244,236,16,244,236,17,57,17,57,18,57,48, + 75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,7,16,8,237,7,5,237,23,50,89,34,1,64,141,10,0,10,9,6,11,5, + 12,23,1,21,2,16,4,16,5,23,10,20,11,20,12,39,0,36,1,36,2,32,4,32,5,41,8,40,9,37,10,36,11,36,12,39,13,55,0,53, + 1,53,2,48,4,48,5,56,10,54,11,54,12,56,13,65,0,64,1,64,2,64,3,64,4,64,5,64,6,64,7,64,8,66,9,69,10,71,13,84, + 0,81,1,81,2,85,3,80,4,80,5,86,6,85,7,86,8,87,9,87,10,85,11,85,12,102,1,102,2,104,10,123,8,137,0,138,9,133,11,133, + 12,137,13,153,9,149,11,149,12,164,11,164,12,70,93,0,64,37,6,0,5,8,6,9,3,13,22,10,23,13,16,13,35,13,53,13,73,10,79,10, + 78,13,90,9,90,10,106,10,135,13,128,13,147,13,18,93,5,14,1,43,1,53,51,50,54,63,1,1,51,9,1,54,55,54,51,50,22,29,1,35, + 53,52,38,35,34,7,6,7,2,147,78,148,124,147,108,76,84,51,33,254,59,195,1,94,1,26,21,48,88,135,131,185,178,81,57,57,41,20,10,104, + 200,122,154,72,134,84,4,78,252,148,2,192,52,51,96,191,134,114,114,58,84,42,20,25,0,1,0,92,0,0,5,31,5,213,0,17,0,192,64,53, + 6,3,2,7,2,12,15,16,11,16,7,17,11,16,11,16,17,2,7,2,66,5,13,149,4,14,18,16,149,0,129,7,149,9,12,6,3,15,4,14, + 4,8,14,0,16,7,0,1,66,8,0,10,18,16,220,75,176,9,84,75,176,10,84,91,88,185,0,10,255,192,56,89,196,212,228,17,57,57,16,196, + 16,196,17,23,57,49,0,47,236,244,236,16,212,60,236,50,48,75,83,88,7,16,5,237,7,16,5,237,7,16,5,60,60,7,16,5,60,60,89,34, + 1,64,64,5,2,10,11,24,11,41,2,38,11,56,11,72,2,71,11,72,16,9,5,7,11,16,0,19,22,7,26,16,16,19,47,19,53,7,57,16, + 63,19,71,7,74,16,79,19,85,7,89,17,102,7,105,16,111,19,119,7,120,16,127,19,159,19,22,93,0,93,19,33,21,1,33,21,33,1,33,21, + 33,53,1,33,53,33,1,33,115,4,149,254,112,1,25,254,115,254,84,3,199,251,61,1,185,254,213,1,159,1,131,252,103,5,213,154,254,17,144,253, + 238,170,154,2,34,144,1,223,0,1,0,88,0,0,3,219,4,96,0,17,0,197,64,49,12,15,16,11,16,6,3,2,7,2,16,17,2,7,2,7, + 17,11,16,11,66,16,169,0,188,9,5,13,169,4,14,7,169,9,16,7,15,3,6,12,6,1,0,14,4,8,1,10,18,16,220,75,176,11,84,75, + 176,12,84,91,88,185,0,10,255,192,56,89,75,176,19,84,88,185,0,10,0,64,56,89,196,50,196,196,196,17,23,57,49,0,47,236,212,60,236,50, + 16,244,236,48,75,83,88,7,16,5,237,7,16,5,237,7,16,5,60,60,7,16,5,60,60,89,34,1,64,66,5,2,22,2,38,2,71,2,73,11, + 5,11,16,15,19,24,7,27,16,43,16,32,19,54,7,57,16,48,19,64,1,64,2,69,7,64,8,64,9,67,16,87,7,89,16,95,19,96,1,96, + 2,102,7,96,8,96,9,98,16,127,19,128,19,175,19,27,93,0,93,19,33,21,3,51,21,33,1,33,21,33,53,1,35,53,33,1,33,113,3,106, + 251,194,254,194,254,195,2,180,252,125,1,43,212,1,80,1,13,253,101,4,96,168,254,220,144,254,143,147,168,1,92,144,1,57,0,0,0,1,0,160, + 255,193,4,248,5,213,0,34,0,112,64,14,11,14,13,8,10,4,25,14,16,22,10,13,30,35,16,220,196,196,212,57,196,236,18,57,180,63,14,79, + 14,2,93,17,18,57,49,0,64,19,10,9,149,16,15,11,149,13,129,35,31,161,30,174,0,149,26,140,35,16,244,236,244,236,16,244,236,57,212,236, + 57,48,64,10,16,17,10,11,10,11,17,15,16,15,7,16,5,236,7,16,5,236,64,14,9,10,55,15,2,5,16,11,11,21,16,59,11,4,1,93, + 0,93,37,50,55,54,53,52,39,38,43,1,53,1,33,53,33,21,1,50,23,22,23,22,21,20,7,6,33,34,39,38,39,53,22,23,22,2,168,192, + 99,100,92,93,165,174,1,129,252,252,4,0,254,101,106,128,98,86,81,152,152,254,232,119,125,126,134,106,127,126,107,75,75,143,134,73,74,152,1,234, + 170,154,254,22,56,42,109,104,138,220,122,121,19,18,37,195,49,25,25,0,0,1,0,92,255,193,4,180,5,213,0,34,0,94,64,15,24,22,21,27, + 31,19,13,25,22,5,31,25,21,13,35,16,220,196,180,48,21,64,21,2,93,236,212,196,196,17,57,17,57,17,18,57,49,0,64,19,25,27,149,19, + 20,24,149,22,129,35,4,161,5,174,0,149,9,140,35,16,244,236,244,236,16,244,236,57,212,236,57,48,64,10,19,17,25,24,25,24,17,20,19,20, + 7,16,5,236,7,16,5,236,37,50,55,54,55,21,6,7,6,35,32,39,38,53,52,55,54,55,54,51,1,53,33,21,33,1,21,35,34,7,6,21, + 20,23,22,2,172,137,126,127,106,134,126,125,119,254,232,152,152,81,86,98,128,106,254,101,4,0,252,252,1,129,174,165,93,92,100,99,107,25,25,49, + 195,37,18,19,121,122,220,138,104,109,42,56,1,234,154,170,254,22,152,74,73,134,143,75,75,0,0,0,0,1,0,104,254,76,4,63,4,96,0,32, + 0,163,64,11,0,6,2,12,18,27,19,3,6,2,33,16,220,204,196,196,212,236,17,18,57,49,0,64,26,12,27,0,24,6,66,0,169,7,7,3, + 33,4,169,3,19,134,20,147,16,185,24,189,3,188,33,16,228,252,236,244,236,16,236,17,18,57,47,236,236,17,18,57,57,48,64,8,6,17,0,5, + 17,1,7,2,7,5,16,236,4,16,236,64,27,3,5,5,0,20,5,22,0,35,5,37,0,55,0,52,5,70,0,67,5,91,0,84,5,126,0,13, + 1,93,64,27,4,6,4,1,20,6,20,1,37,6,36,1,53,1,55,6,69,1,70,6,84,1,92,6,127,6,13,0,93,64,9,6,21,7,22,26, + 21,26,18,4,93,9,1,53,33,21,33,1,21,35,34,7,6,21,20,23,22,51,50,54,55,21,6,7,6,35,32,36,53,52,55,54,55,54,2,91, + 254,101,3,106,253,101,1,174,174,165,93,92,100,99,190,109,200,84,106,100,99,94,254,232,254,208,81,86,98,128,1,220,1,220,168,147,254,13,166,74, + 75,132,143,75,75,50,49,195,37,19,18,242,221,138,104,109,42,56,0,0,0,1,0,113,254,86,3,232,4,96,0,32,0,0,1,50,55,54,55,21, + 6,7,6,35,32,17,52,37,36,53,52,35,48,33,1,33,53,33,21,1,32,21,16,5,6,21,20,2,127,84,77,79,81,87,80,86,97,254,32,1, + 150,1,28,235,254,222,1,229,253,101,3,106,254,158,1,111,254,48,226,254,238,21,21,44,179,32,13,14,1,25,238,53,37,98,124,2,56,147,168,254, + 100,229,254,236,49,24,97,139,0,1,0,150,0,0,4,74,5,240,0,36,0,0,37,33,21,33,53,1,55,33,53,33,54,55,54,53,52,39,38,35, + 34,7,6,7,53,62,1,51,50,4,21,20,7,6,7,51,21,35,7,1,137,2,193,252,76,1,58,115,254,167,1,226,95,37,39,83,84,134,95,105, + 106,120,122,212,88,232,1,20,34,31,74,104,236,48,170,170,170,1,64,117,144,109,72,76,73,119,75,75,33,33,67,204,49,50,232,194,92,82,73,96, + 144,49,0,0,0,1,0,93,255,193,4,249,5,213,0,25,0,53,64,14,27,3,8,17,10,11,8,7,0,8,25,7,70,26,16,252,212,236,16,236, + 212,212,236,204,49,0,64,13,22,149,1,0,26,6,149,13,11,149,9,129,26,16,244,236,212,236,16,204,212,236,48,1,16,32,17,52,38,35,33,17, + 33,21,33,17,37,36,23,22,16,15,1,6,7,6,32,36,53,1,38,3,10,185,165,253,247,3,161,253,41,1,115,1,0,162,81,59,28,20,45,152, + 253,196,254,208,1,144,254,219,1,37,134,147,3,44,170,254,37,1,1,208,104,254,224,86,41,29,36,121,242,221,0,0,0,1,0,104,254,76,4,63, + 4,96,0,26,0,51,64,11,28,4,8,18,10,12,8,26,8,70,27,16,252,196,236,212,212,236,204,49,0,64,15,2,135,0,26,24,189,27,7,135, + 14,12,135,10,188,27,16,244,236,212,236,16,252,204,50,236,48,23,22,51,32,17,52,38,35,33,17,33,21,33,17,51,50,30,1,16,15,1,6,7, + 6,33,34,39,104,170,206,1,150,185,165,254,159,3,25,253,159,221,105,228,166,59,28,20,45,152,254,232,187,212,167,99,1,37,134,147,3,44,170,254, + 38,99,212,254,224,86,41,29,36,121,74,0,0,1,0,88,255,227,3,165,5,158,0,36,0,0,1,7,22,23,22,21,20,7,6,33,34,39,38,39, + 53,22,23,22,51,50,55,54,55,52,39,38,43,1,19,35,53,51,17,51,17,51,21,2,33,2,170,112,108,110,137,254,237,85,81,81,76,73,84,78, + 80,179,99,57,1,58,86,192,62,2,229,229,202,231,3,230,125,30,119,115,170,186,125,157,18,17,35,172,40,24,22,114,65,133,98,76,114,1,15,164, + 1,20,254,236,164,0,0,0,0,2,0,186,254,86,4,164,4,123,0,14,0,23,0,64,64,11,25,17,8,13,4,23,0,8,2,70,24,16,252,236, + 50,50,212,236,204,49,0,64,12,66,21,135,5,9,140,3,188,0,1,189,24,16,236,196,244,244,204,236,48,75,83,88,182,23,5,15,135,0,0,14, + 7,4,16,237,0,16,204,89,5,17,35,17,51,21,54,55,54,51,50,23,22,21,16,1,0,53,52,39,38,35,34,7,1,115,185,185,52,135,81,210, + 184,77,78,252,207,2,114,57,56,120,220,173,122,254,208,6,10,170,66,82,49,112,113,153,254,87,254,228,1,144,249,133,66,65,239,0,0,1,0,201, + 254,86,1,147,5,213,0,3,0,38,64,10,0,151,2,189,4,1,8,0,70,4,16,252,236,49,0,16,236,236,48,64,13,16,5,64,5,80,5,96, + 5,112,5,240,5,6,1,93,19,51,17,35,201,202,202,5,213,248,129,0,255,255,0,201,254,86,3,39,5,213,16,39,1,130,1,148,0,0,16,6, + 1,130,0,0,0,1,0,20,254,86,3,156,5,213,0,19,0,58,64,29,12,9,169,15,6,19,2,169,16,5,5,10,0,151,10,189,20,7,3,9, + 5,1,8,18,13,12,16,0,20,16,212,60,60,204,50,252,60,60,204,50,49,0,16,236,236,17,57,47,60,236,50,220,60,236,50,48,1,51,17,33, + 21,33,21,33,21,33,17,35,17,33,53,33,53,33,53,33,1,115,202,1,95,254,161,1,95,254,161,202,254,161,1,95,254,161,1,95,5,213,253,151, + 168,240,170,253,44,2,212,170,240,168,0,0,255,255,0,201,0,0,1,148,5,213,16,6,0,4,148,0,255,255,0,201,0,0,10,208,7,109,16,39, + 1,63,5,177,0,0,16,6,0,39,0,0,255,255,0,201,0,0,9,176,6,102,16,39,1,64,5,213,0,0,16,6,0,39,0,0,255,255,0,113, + 255,227,8,145,6,102,16,39,1,64,4,182,0,0,16,6,0,71,0,0,255,255,0,201,254,102,6,36,5,213,16,39,0,45,4,145,0,0,16,6, + 0,47,0,0,255,255,0,201,254,86,5,222,6,20,16,39,0,77,4,101,0,0,16,6,0,47,0,0,255,255,0,193,254,86,2,239,6,20,16,39, + 0,77,1,118,0,0,16,6,0,79,0,0,255,255,0,201,254,102,6,242,5,213,16,39,0,45,5,95,0,0,16,6,0,49,0,0,255,255,0,201, + 254,86,6,183,6,20,16,39,0,77,5,62,0,0,16,6,0,49,0,0,255,255,0,186,254,86,5,222,6,20,16,39,0,77,4,101,0,0,16,6, + 0,81,0,0,255,255,0,16,0,0,5,104,7,109,18,38,0,36,0,0,17,7,22,190,4,190,1,117,0,6,177,14,0,16,60,49,255,255,0,123, + 255,227,4,45,6,102,18,38,0,68,0,0,17,6,2,137,90,0,0,8,180,11,43,39,20,7,43,49,255,255,255,254,0,0,2,96,7,109,18,38, + 0,44,0,0,17,7,22,190,3,47,1,117,0,11,180,7,32,1,0,0,16,73,99,58,49,0,0,0,255,255,255,224,0,0,2,94,6,102,18,38, + 0,243,0,0,17,7,2,137,255,31,0,0,0,11,180,8,32,1,0,0,16,73,99,58,49,0,0,0,255,255,0,115,255,227,5,217,7,109,18,38, + 0,50,0,0,16,7,22,190,5,39,1,117,255,255,0,113,255,227,4,117,6,102,18,38,0,82,0,0,17,6,2,137,118,0,0,6,177,27,12,16, + 60,49,0,0,255,255,0,178,255,227,5,41,7,109,18,38,0,56,0,0,17,7,22,190,4,246,1,117,0,6,177,21,5,16,60,49,255,255,0,174, + 255,227,4,88,6,102,18,38,0,88,0,0,17,6,2,137,118,0,0,11,180,24,32,11,1,1,16,73,99,58,49,0,255,255,0,178,255,227,5,41, + 8,51,16,38,22,236,48,0,18,6,0,56,0,0,0,0,255,255,0,174,255,227,4,88,7,49,16,39,0,113,0,123,1,59,18,6,0,190,0,0, + 255,255,0,178,255,227,5,41,8,90,18,38,0,56,0,0,16,6,22,239,54,0,0,0,255,255,0,174,255,227,4,88,7,34,18,38,0,88,0,0, + 16,7,22,239,255,190,254,200,255,255,0,178,255,227,5,41,8,90,18,38,0,56,0,0,16,6,22,244,48,0,0,0,255,255,0,174,255,227,4,88, + 7,34,18,38,0,88,0,0,16,7,22,244,255,196,254,200,255,255,0,178,255,227,5,41,8,96,18,38,0,56,0,0,16,6,22,240,48,6,0,0, + 255,255,0,174,255,227,4,88,7,34,18,38,0,88,0,0,16,7,22,240,255,190,254,200,255,255,0,113,255,227,4,127,4,123,18,6,2,27,0,0, + 255,255,0,16,0,0,5,104,8,51,18,38,0,36,0,0,16,6,22,236,0,0,0,0,255,255,0,123,255,227,4,45,7,49,18,38,0,166,0,0, + 16,7,0,113,0,82,1,59,255,255,0,16,0,0,5,104,8,51,18,38,0,36,0,0,16,6,22,238,0,0,0,0,255,255,0,123,255,227,4,45, + 6,244,18,38,0,68,0,0,16,7,22,238,255,147,254,193,255,255,0,8,0,0,7,72,7,52,16,39,0,113,2,215,1,62,18,6,0,136,0,0, + 255,255,0,123,255,227,7,111,5,242,16,39,0,113,1,232,255,252,18,6,0,168,0,0,0,1,0,115,255,227,6,4,5,240,0,37,0,84,64,16, + 33,36,34,30,28,17,52,2,0,4,51,24,25,11,16,38,16,252,236,252,60,204,228,252,196,196,49,0,64,24,4,31,1,34,0,5,27,35,149,37, + 27,149,8,18,161,17,174,21,149,14,145,8,140,38,16,228,244,236,244,236,16,254,212,238,17,57,57,220,176,11,75,84,88,177,34,64,56,89,60,204, + 50,48,1,17,51,21,35,21,6,4,35,32,0,17,16,0,33,50,4,23,21,46,1,35,32,0,17,16,0,33,50,54,55,53,35,53,51,53,33,53, + 5,139,121,121,117,254,230,160,254,162,254,117,1,139,1,94,146,1,7,111,112,252,139,254,238,254,237,1,19,1,18,107,168,67,253,253,254,182,3,12, + 254,214,88,255,83,85,1,153,1,109,1,110,1,153,72,70,215,95,96,254,206,254,209,254,210,254,206,37,39,181,88,132,166,0,0,0,0,2,0,113, + 254,86,4,250,4,123,0,11,0,52,0,88,64,14,15,34,50,37,0,8,12,71,6,18,24,44,69,53,16,252,196,236,244,236,50,50,196,196,49,0, + 64,27,32,17,14,35,37,12,41,9,24,134,25,28,185,21,3,185,50,47,184,51,188,9,185,21,189,38,41,47,196,228,236,228,244,196,236,16,254,213, + 238,17,18,57,57,212,60,204,50,48,182,96,54,128,54,160,54,3,1,93,1,52,38,35,34,6,21,20,22,51,50,54,23,20,7,51,21,35,6,7, + 6,33,34,38,39,53,30,1,51,50,55,54,55,33,53,33,54,61,1,14,1,35,34,2,17,16,18,51,50,22,23,53,51,3,162,165,149,148,165,165, + 148,149,165,184,19,179,198,31,58,127,254,250,97,172,81,81,158,82,181,90,21,17,253,132,2,154,22,57,178,124,206,252,252,206,124,178,57,184,2,61, + 200,220,220,200,199,220,220,235,110,88,70,93,64,140,29,30,179,44,42,95,23,28,69,71,94,91,99,98,1,58,1,3,1,4,1,58,98,99,170,0, + 255,255,0,115,255,227,5,139,7,109,18,38,0,42,0,0,17,7,22,190,5,74,1,117,0,16,177,33,14,16,60,64,7,148,33,84,33,36,33,3, + 93,49,0,0,255,255,0,113,254,86,4,90,6,99,16,38,2,137,74,253,18,6,0,74,0,0,0,0,255,255,0,201,0,0,5,106,7,109,16,39, + 22,190,4,162,1,117,18,6,0,46,0,0,255,255,255,233,0,0,4,156,7,109,18,38,0,78,0,0,17,7,22,190,3,26,1,117,0,42,180,1, + 16,12,0,7,43,49,0,75,176,14,81,88,187,0,1,255,192,0,0,255,192,56,56,89,64,13,144,1,144,0,128,1,128,0,64,1,64,0,6,93, + 255,255,0,115,254,117,5,217,5,240,16,39,2,157,1,52,0,0,18,6,0,50,0,0,255,255,0,113,254,117,4,117,4,123,16,39,2,157,0,128, + 0,0,18,6,0,82,0,0,255,255,0,115,254,117,5,217,7,49,16,39,0,113,1,39,1,59,18,6,1,172,0,0,255,255,0,113,254,117,4,117, + 5,245,16,38,0,113,115,255,18,6,1,173,0,0,0,0,255,255,0,160,255,193,4,248,7,109,16,39,22,190,4,190,1,117,18,6,1,121,0,0, + 255,255,0,88,254,76,4,47,6,102,16,38,2,137,27,0,16,6,2,84,0,0,0,0,255,255,255,219,254,86,2,100,6,102,16,39,2,137,255,37, + 0,0,17,6,1,249,0,0,0,11,180,3,32,8,7,7,16,73,99,58,49,0,0,0,255,255,0,201,0,0,10,208,5,213,16,39,0,61,5,177, + 0,0,16,6,0,39,0,0,255,255,0,201,0,0,9,176,5,213,16,39,0,93,5,213,0,0,16,6,0,39,0,0,255,255,0,113,255,227,8,145, + 6,20,16,39,0,93,4,182,0,0,16,6,0,71,0,0,255,255,0,115,255,227,5,139,7,108,16,39,22,186,5,27,1,118,18,6,0,42,0,0, + 255,255,0,113,254,86,4,90,6,99,18,38,0,74,0,0,16,6,0,118,27,253,0,0,0,1,0,201,255,227,8,45,5,213,0,29,0,53,64,14, + 14,28,17,25,3,28,6,56,27,1,28,0,4,30,16,252,236,50,252,236,50,212,236,49,0,64,14,15,26,149,2,173,4,0,129,28,10,149,21,140, + 28,47,228,236,16,228,50,252,236,196,48,19,51,17,33,17,51,17,20,23,22,23,50,55,54,53,17,51,17,20,7,6,33,32,39,38,53,17,33,17, + 35,201,202,2,222,202,62,61,153,148,66,62,202,100,96,254,230,254,237,103,100,253,34,202,5,213,253,156,2,100,251,236,159,80,78,1,79,75,164,2, + 159,253,90,223,128,120,120,118,233,1,13,253,57,0,0,0,0,2,0,201,254,86,5,2,5,240,0,14,0,23,0,64,64,11,25,17,28,13,4,23, + 0,28,2,4,24,16,252,236,50,50,212,236,204,49,0,64,12,66,21,149,5,9,140,3,129,0,1,189,24,16,236,196,244,244,204,236,48,75,83,88, + 182,23,5,15,135,0,0,14,7,4,16,237,0,16,204,89,37,17,35,17,51,21,54,55,54,51,50,23,22,21,16,1,0,17,52,39,38,35,34,3, + 1,147,202,202,56,145,87,226,198,83,84,252,145,2,161,61,60,129,237,186,156,253,186,7,127,185,72,87,53,120,122,164,254,55,254,206,1,174,1,12, + 143,71,70,254,255,0,0,0,255,255,0,201,0,0,5,51,7,107,16,39,22,188,5,30,1,117,18,6,0,49,0,0,255,255,0,186,0,0,4,100, + 6,100,18,38,0,81,0,0,16,7,0,67,1,24,255,254,255,255,0,16,0,0,5,104,7,115,18,38,0,135,0,0,16,7,22,186,6,92,1,125, + 255,255,0,123,255,227,4,220,7,115,18,38,0,167,0,0,16,7,22,186,5,236,1,125,255,255,0,8,0,0,7,72,7,108,16,39,22,186,6,92, + 1,118,18,6,0,136,0,0,255,255,0,123,255,227,7,111,6,99,18,38,0,168,0,0,16,7,0,118,1,101,255,253,255,255,0,102,255,186,5,229, + 7,108,16,39,22,186,4,254,1,118,18,6,0,154,0,0,255,255,0,72,255,162,4,156,6,99,18,38,0,186,0,0,16,6,0,118,28,253,0,0, + 255,255,0,16,0,0,5,104,7,112,18,38,0,36,0,0,16,7,22,195,4,229,1,122,255,255,0,123,255,227,4,45,6,100,16,39,2,192,4,152, + 255,254,18,6,0,68,0,0,255,255,0,16,0,0,5,104,7,54,18,38,0,36,0,0,16,7,22,191,4,188,1,62,255,255,0,123,255,227,4,45, + 6,72,16,39,2,194,4,101,0,0,18,6,0,68,0,0,255,255,0,201,0,0,4,139,7,112,18,38,0,40,0,0,16,7,22,195,4,165,1,122, + 255,255,0,113,255,227,4,127,6,99,16,39,2,192,4,186,255,253,18,6,0,72,0,0,255,255,0,201,0,0,4,139,7,54,18,38,0,40,0,0, + 16,7,22,191,4,166,1,62,255,255,0,113,255,227,4,127,6,72,16,39,2,194,4,169,0,0,18,6,0,72,0,0,255,255,255,167,0,0,2,115, + 7,112,18,38,0,44,0,0,16,7,22,195,3,89,1,122,255,255,255,195,0,0,2,129,6,99,16,39,2,192,3,102,255,253,18,6,0,243,0,0, + 255,255,0,5,0,0,2,119,7,54,18,38,0,44,0,0,16,7,22,191,3,62,1,62,255,255,255,227,0,0,2,85,6,72,16,39,2,194,3,36, + 0,0,18,6,0,243,0,0,255,255,0,115,255,227,5,217,7,112,18,38,0,50,0,0,16,7,22,195,5,65,1,122,255,255,0,113,255,227,4,117, + 6,100,16,39,2,192,4,159,255,254,18,6,0,82,0,0,255,255,0,115,255,227,5,217,7,54,18,38,0,50,0,0,16,7,22,191,5,28,1,62, + 255,255,0,113,255,227,4,117,6,72,16,39,2,194,4,152,0,0,18,6,0,82,0,0,255,255,0,199,0,0,5,84,7,112,18,38,0,53,0,0, + 16,7,22,195,4,121,1,122,255,255,0,130,0,0,3,74,6,99,16,39,2,192,4,37,255,253,18,6,0,85,0,0,255,255,0,201,0,0,5,84, + 7,54,18,38,0,53,0,0,16,7,22,191,4,128,1,62,255,255,0,186,0,0,3,94,6,72,16,39,2,194,4,45,0,0,18,6,0,85,0,0, + 255,255,0,178,255,227,5,41,7,112,18,38,0,56,0,0,16,7,22,195,5,21,1,122,255,255,0,174,255,227,4,88,6,100,16,39,2,192,4,212, + 255,254,18,6,0,88,0,0,255,255,0,178,255,227,5,41,7,54,18,38,0,56,0,0,16,7,22,191,4,236,1,62,255,255,0,174,255,227,4,88, + 6,72,16,39,2,194,4,171,0,0,18,6,0,88,0,0,255,255,0,135,254,20,4,162,5,240,16,39,2,215,4,118,0,0,18,6,0,54,0,0, + 255,255,0,111,254,20,3,199,4,123,16,39,2,215,4,44,0,0,18,6,0,86,0,0,255,255,255,250,254,20,4,233,5,213,16,39,2,215,4,83, + 0,0,18,6,0,55,0,0,255,255,0,55,254,20,2,242,5,158,16,39,2,215,4,0,0,0,18,6,0,87,0,0,0,1,0,156,254,82,4,115, + 5,240,0,46,0,0,1,4,17,20,14,1,12,1,7,53,54,36,62,1,53,52,38,35,34,15,1,53,55,62,3,53,52,46,3,35,34,7,53,54, + 51,50,30,1,21,20,14,2,3,63,1,52,111,185,255,0,254,234,153,200,1,49,185,92,125,112,95,115,163,248,60,102,104,61,35,55,75,72,38,184, + 243,239,206,131,203,124,23,58,110,2,162,67,254,219,112,206,160,136,96,34,160,55,140,153,157,79,101,132,51,72,171,106,26,65,99,139,82,55,86,51, + 34,12,184,190,164,86,182,128,60,102,113,116,0,1,0,71,254,79,3,188,4,123,0,52,0,0,1,30,3,21,20,14,5,7,53,62,4,53,52,38, + 35,34,15,1,53,55,62,4,53,52,46,3,35,34,6,7,53,36,51,50,30,1,21,20,6,2,167,70,112,62,33,66,108,152,157,179,149,74,162,245, + 158,99,40,118,93,59,63,216,223,34,65,87,63,45,31,49,67,65,35,69,168,147,1,10,134,112,184,116,103,1,205,8,68,90,88,37,75,138,108,97, + 70,61,39,15,130,46,96,91,98,91,51,88,112,25,86,139,85,13,32,60,69,102,57,44,70,42,27,10,59,90,154,133,71,146,97,110,153,0,0,0, + 255,255,0,201,0,0,5,59,7,109,16,39,22,190,5,4,1,117,18,6,0,43,0,0,255,255,255,240,0,0,4,100,7,109,16,39,22,190,3,33, + 1,117,19,6,0,75,0,0,0,42,180,20,5,1,19,7,43,49,0,75,176,14,81,88,187,0,20,255,192,0,19,255,192,56,56,89,64,13,144,20, + 144,19,128,20,128,19,64,20,64,19,6,93,0,1,0,201,254,86,5,25,5,240,0,19,0,46,64,18,3,149,14,145,9,129,18,176,8,19,28,18, + 11,6,28,8,65,20,16,252,75,176,16,84,88,185,0,8,255,192,56,89,236,50,212,252,49,0,47,236,228,244,236,48,1,52,38,35,34,6,21,17, + 35,17,51,21,62,1,23,50,18,25,1,35,4,80,154,153,179,215,202,202,81,204,157,227,233,201,3,127,215,213,255,222,252,178,5,213,241,135,134,1, + 254,193,254,204,250,217,0,0,0,3,0,113,255,112,6,68,6,20,0,7,0,40,0,52,0,0,37,22,51,50,53,52,39,34,7,54,51,50,21,16, + 33,34,39,6,7,35,54,55,38,53,6,7,6,35,34,39,38,16,55,54,51,50,23,22,23,17,51,0,16,23,22,32,55,54,16,39,38,32,7,4, + 182,17,37,160,52,52,202,110,136,244,254,170,73,53,34,24,196,29,67,48,58,88,89,124,203,128,127,127,128,203,124,89,88,58,184,252,213,83,84,1, + 36,84,84,84,84,254,220,84,130,5,175,45,1,32,184,206,254,191,15,72,58,69,147,60,36,100,48,49,162,162,2,16,162,162,49,48,100,2,94,252, + 230,254,106,116,115,115,116,1,150,116,115,115,0,2,0,113,255,227,5,37,5,240,0,12,0,59,0,87,64,28,36,0,20,51,4,24,16,61,69,10, + 28,40,66,29,24,28,33,56,59,16,28,55,66,4,28,47,69,60,16,252,236,244,236,204,178,32,59,1,93,244,236,204,244,236,236,17,18,23,57,49, + 0,64,18,36,51,0,149,20,173,60,13,59,28,29,145,60,7,8,44,140,60,16,244,236,16,244,204,212,204,16,244,236,57,57,48,1,34,7,6,16, + 23,22,32,55,54,53,52,38,3,14,1,21,20,23,22,51,50,55,54,53,52,39,38,39,53,50,23,22,21,20,6,7,22,23,22,21,20,7,6,32, + 39,38,53,52,55,54,55,38,39,38,53,52,55,54,33,2,203,184,106,107,107,106,1,112,107,107,212,244,130,170,95,59,204,168,95,96,76,109,130,228, + 150,139,170,152,172,95,96,156,155,253,186,155,156,96,97,171,171,67,85,130,116,1,1,2,197,77,77,254,242,77,77,77,78,134,135,154,2,39,3,124, + 79,69,72,45,65,65,136,158,43,77,8,100,104,97,186,128,178,32,34,99,99,143,217,116,116,116,116,217,143,99,99,34,31,70,89,88,130,83,74,0, + 0,2,0,113,255,227,4,113,5,15,0,13,0,52,0,67,64,22,54,69,10,8,24,66,14,52,50,8,16,40,41,43,8,38,66,4,8,31,69,53, + 16,252,236,244,236,204,50,212,236,204,50,244,236,236,49,0,64,14,52,41,20,34,0,185,46,173,53,7,185,28,140,53,16,244,236,16,244,236,57,57, + 204,50,48,1,34,7,6,16,23,22,32,55,54,53,52,39,38,19,22,21,20,7,6,7,22,23,22,21,20,7,6,32,39,38,53,52,54,55,38,39, + 38,53,52,55,51,6,20,23,22,51,50,55,54,53,52,39,2,113,144,83,82,82,83,1,32,83,83,83,82,254,58,52,72,130,146,82,81,133,132,254, + 18,132,133,164,146,144,59,52,63,161,43,73,72,131,130,73,74,44,2,197,77,77,254,242,77,77,77,78,134,135,77,77,2,74,64,98,153,64,89,32, + 34,99,99,143,217,116,116,116,116,217,143,198,34,35,86,75,142,89,73,65,232,65,65,65,65,116,119,62,0,1,0,92,254,86,5,31,5,213,0,21, + 0,159,64,12,15,20,17,18,66,11,8,21,6,17,13,22,16,220,75,176,9,84,75,176,10,84,91,88,185,0,13,255,192,56,89,196,196,212,236,228, + 17,57,57,49,0,64,12,66,7,149,5,12,15,149,17,129,20,149,12,47,236,244,236,16,220,236,48,75,83,88,64,10,20,17,14,15,14,15,17,19, + 20,19,7,16,5,237,7,16,5,237,89,1,64,64,5,19,10,14,24,14,41,19,38,14,56,14,72,19,71,14,72,15,9,5,20,11,15,0,23,22, + 20,26,15,16,23,47,23,53,20,57,15,63,23,71,20,74,15,79,23,85,20,89,15,102,20,105,15,111,23,119,20,120,15,127,23,159,23,22,93,0, + 93,5,16,7,6,43,1,53,51,50,55,54,61,1,33,53,1,33,53,33,21,1,33,5,31,158,72,114,254,233,105,38,38,251,245,3,176,252,103,4, + 149,252,80,3,199,20,254,223,80,37,156,48,49,153,20,154,4,145,170,154,251,111,0,0,0,1,0,88,254,86,3,219,4,96,0,21,0,172,64,12, + 11,8,21,13,15,20,18,17,18,6,13,22,16,220,75,176,11,84,75,176,12,84,91,88,185,0,13,255,192,56,89,75,176,19,84,88,185,0,13,0, + 64,56,89,196,196,180,64,18,96,18,2,93,196,17,57,57,16,212,180,64,21,96,21,2,93,236,49,0,64,12,66,7,169,5,12,15,169,17,188,20, + 169,12,47,236,244,236,16,220,236,48,75,83,88,64,10,15,17,19,20,19,20,17,14,15,14,7,16,5,237,7,16,5,237,89,1,64,50,5,19,22, + 19,38,19,71,19,73,14,5,11,15,15,23,24,20,27,15,43,15,32,23,54,20,57,15,48,23,69,20,73,15,87,20,89,15,95,23,102,20,104,15, + 127,23,128,23,175,23,19,93,0,93,5,16,7,6,43,1,53,51,50,55,54,61,1,33,53,1,33,53,33,21,1,33,3,219,158,72,114,254,233,105, + 38,38,253,53,2,180,253,101,3,106,253,76,2,180,20,254,223,80,37,156,48,49,153,20,168,3,37,147,168,252,219,0,255,255,0,16,0,0,5,104, + 7,80,16,39,22,193,4,188,1,117,18,6,0,36,0,0,255,255,0,123,255,227,4,45,6,20,16,39,2,184,4,74,0,0,18,6,0,68,0,0, + 255,255,0,201,254,117,4,139,5,213,18,38,0,40,0,0,16,7,0,122,0,162,0,0,255,255,0,113,254,117,4,127,4,123,18,38,0,72,0,0, + 16,6,0,122,123,0,0,0,255,255,0,115,255,227,5,217,8,51,18,38,0,50,0,0,16,6,22,236,98,0,0,0,255,255,0,113,255,227,4,117, + 7,49,18,38,0,184,0,0,16,7,0,113,0,115,1,59,255,255,0,115,255,227,5,217,8,51,18,38,0,50,0,0,16,6,22,243,105,0,0,0, + 255,255,0,113,255,227,4,117,6,233,18,38,0,82,0,0,16,7,22,243,255,181,254,182,255,255,0,115,255,227,5,217,7,80,16,39,22,193,5,39, + 1,117,18,6,0,50,0,0,255,255,0,113,255,227,4,117,6,20,16,39,2,184,4,115,0,0,18,6,0,82,0,0,255,255,0,115,255,227,5,217, + 8,51,18,38,0,50,0,0,16,6,22,238,106,0,0,0,255,255,0,113,255,227,4,117,7,49,18,38,1,241,0,0,16,7,0,113,0,115,1,59, + 255,255,255,252,0,0,4,231,7,49,16,39,0,113,0,114,1,59,18,6,0,60,0,0,255,255,0,61,254,86,4,127,5,245,16,38,0,113,94,255, + 18,6,0,92,0,0,0,0,0,2,0,138,255,112,3,92,6,14,0,7,0,25,0,0,37,22,51,50,53,52,39,34,7,54,51,50,21,16,33,34, + 39,6,7,35,54,55,38,55,17,51,1,206,17,37,160,52,52,202,110,136,244,254,170,73,53,34,24,196,29,67,49,1,184,130,5,175,45,1,32,184, + 206,254,191,15,72,58,69,147,60,90,5,48,0,2,0,186,255,112,6,78,4,123,0,7,0,43,0,0,37,22,51,50,53,52,39,34,7,54,51,50, + 21,16,33,34,39,6,7,35,54,55,38,55,17,52,38,35,34,6,21,17,35,17,51,21,54,55,54,51,50,23,22,21,4,192,17,37,160,52,52,202, + 110,136,244,254,170,73,53,34,24,196,29,67,49,1,124,124,149,172,185,185,66,89,90,117,193,99,99,130,5,175,45,1,32,184,206,254,191,15,72,58, + 69,147,60,90,1,192,159,158,190,164,253,135,4,96,174,101,50,50,119,120,232,0,0,0,0,2,0,55,255,112,3,97,5,158,0,7,0,33,0,0, + 37,22,51,50,53,52,39,34,7,54,51,50,21,16,33,34,39,6,7,35,54,55,38,53,17,35,53,51,17,51,17,33,21,33,1,211,17,37,160,52, + 52,202,110,136,244,254,170,73,54,33,24,196,29,67,49,135,135,185,1,123,254,133,130,5,175,45,1,32,184,206,254,191,15,72,58,69,147,60,90,2, + 243,143,1,62,254,194,143,0,0,1,255,219,254,86,1,121,4,96,0,11,0,56,64,21,11,2,7,0,7,135,5,189,0,188,12,8,12,5,6,79, + 1,8,0,70,12,16,252,236,228,57,18,57,49,0,16,228,244,236,17,18,57,57,48,64,11,16,13,64,13,80,13,96,13,112,13,5,1,93,19,51, + 17,20,6,43,1,53,51,50,54,53,193,184,163,181,70,49,105,76,4,96,251,140,214,192,156,97,153,0,0,3,0,113,255,227,7,140,6,20,0,9, + 0,35,0,47,0,65,64,19,49,69,37,18,20,71,5,27,13,8,43,24,14,71,1,18,33,69,48,16,252,236,244,60,60,252,60,60,244,236,236,49, + 0,64,16,40,8,185,10,46,4,185,22,29,140,17,10,184,13,151,25,47,236,228,50,244,50,236,50,16,236,50,48,0,16,23,22,32,54,16,38,32, + 7,19,50,23,17,51,17,54,51,50,0,16,2,35,34,39,21,35,53,6,35,34,39,38,16,55,54,0,16,39,38,32,7,6,16,23,22,32,55,1, + 47,83,84,1,36,168,168,254,220,84,185,245,114,185,114,244,204,0,255,255,204,244,114,185,114,245,203,128,127,127,128,5,93,83,84,254,220,84,83,83, + 84,1,36,84,2,250,254,106,116,115,231,1,150,231,115,1,13,197,2,94,253,162,197,254,188,253,240,254,188,197,168,168,197,162,162,2,16,162,162,252, + 233,1,150,116,115,115,116,254,106,116,115,115,0,3,0,113,254,86,7,140,4,123,0,11,0,37,0,47,0,68,64,19,49,69,1,18,36,71,43,17, + 29,18,7,14,30,71,39,18,23,69,48,16,252,236,244,60,60,252,60,60,244,236,236,49,0,64,18,10,42,185,19,4,46,185,33,26,184,12,19,140, + 15,189,29,188,48,16,228,228,228,50,244,60,236,50,16,236,50,48,0,16,39,38,32,7,6,16,23,22,32,55,3,34,39,17,35,17,6,35,34,39, + 38,16,55,54,51,50,23,53,51,21,54,51,50,0,16,2,0,16,23,22,32,54,16,38,32,7,6,205,83,84,254,220,84,83,83,84,1,36,84,185, + 244,114,185,114,245,203,128,127,127,128,203,245,114,185,114,244,204,0,255,255,250,162,83,84,1,36,168,168,254,220,84,1,100,1,150,116,115,115,116,254, + 106,116,115,115,254,243,197,253,174,2,82,197,162,162,2,16,162,162,197,170,170,197,254,188,253,240,254,188,3,23,254,106,116,115,231,1,150,231,115,0, + 0,3,255,253,255,186,5,124,6,23,0,18,0,22,0,25,0,0,1,51,19,1,23,9,1,35,3,33,15,1,35,7,39,35,55,39,55,9,1,51, + 1,3,33,3,2,74,229,134,1,97,102,254,112,1,124,210,136,253,214,205,50,70,59,82,2,1,20,47,2,144,254,238,22,1,111,189,1,93,106,5, + 213,254,161,1,161,89,254,39,252,27,1,127,241,142,70,70,1,17,56,4,196,253,25,1,177,254,79,1,31,0,0,0,0,2,0,12,255,186,5,138, + 6,23,0,34,0,44,0,0,23,39,19,38,17,16,55,54,33,50,23,22,23,55,23,7,21,38,39,1,22,23,22,33,50,55,54,55,21,6,7,6, + 35,32,39,19,1,35,38,35,32,7,6,17,20,114,102,220,117,195,195,1,83,134,118,61,58,101,102,99,46,49,252,244,9,11,136,1,0,130,116,115, + 102,106,119,118,132,254,180,194,57,2,216,1,116,130,255,0,136,136,70,88,1,5,187,1,23,1,104,207,208,36,18,27,120,89,118,187,43,33,252,102, + 13,12,157,47,47,95,211,72,36,36,199,1,21,3,92,47,156,157,254,216,173,0,0,0,0,2,0,9,255,162,4,93,4,188,0,34,0,43,0,0, + 23,39,55,38,53,16,55,54,33,50,23,22,23,55,23,7,21,38,39,1,22,23,22,51,50,55,54,55,21,6,7,6,35,34,39,19,1,38,35,34, + 7,6,21,20,105,96,189,85,151,150,1,6,85,81,46,45,89,95,118,25,24,253,211,7,6,99,179,80,78,79,78,77,82,83,93,240,147,55,1,238, + 71,71,179,99,99,94,78,230,141,204,1,18,157,157,17,10,16,108,79,143,85,14,11,253,94,8,8,113,21,22,43,170,36,18,18,144,1,5,2,86, + 17,113,114,205,103,0,0,0,0,1,0,10,0,0,4,106,5,213,0,13,0,59,64,22,12,5,10,149,2,12,6,149,0,129,8,3,5,1,28,7, + 58,12,10,0,4,14,16,252,60,204,236,252,60,204,49,0,47,228,236,212,60,236,50,48,64,13,48,15,80,15,128,7,128,8,127,4,127,3,6,1, + 93,19,51,17,51,21,35,17,33,21,33,17,35,53,51,201,202,191,191,2,215,252,95,191,191,5,213,253,119,144,253,238,170,2,188,144,0,2,255,178, + 255,186,5,49,6,23,0,15,0,18,0,0,1,21,35,1,17,35,17,1,39,1,17,33,53,33,55,23,9,1,33,4,233,52,254,34,203,254,13,103, + 2,90,253,238,4,153,56,102,253,166,1,44,254,212,5,105,62,253,204,253,9,2,7,253,179,88,2,199,2,82,170,66,89,254,11,1,98,0,0,0, + 0,1,0,111,254,16,4,25,4,123,0,61,0,0,1,52,39,38,47,1,38,39,38,53,52,54,51,50,22,23,21,46,1,35,34,7,6,21,20,23, + 22,31,1,22,23,22,21,20,7,6,7,31,1,22,51,21,35,34,39,38,47,1,38,39,38,39,38,39,53,22,23,22,51,50,55,54,3,10,50,51, + 171,64,171,76,76,224,206,102,180,76,78,168,90,137,68,69,49,49,148,63,198,80,83,123,87,132,159,147,42,76,39,84,114,71,89,237,30,36,16,17, + 97,108,102,99,99,97,130,70,70,1,39,75,40,40,37,15,36,74,75,130,158,172,30,30,174,40,40,42,42,84,64,37,36,33,14,44,75,76,137,156, + 91,64,19,159,126,36,154,61,38,91,243,30,16,3,2,18,35,190,53,26,27,45,44,0,0,1,0,88,254,16,4,51,4,96,0,24,0,0,19,33, + 21,1,22,23,1,23,22,59,1,21,35,34,39,38,47,1,38,43,1,61,1,1,33,113,3,106,253,78,92,49,1,8,147,42,76,108,147,84,114,71, + 89,237,61,90,94,2,180,253,101,4,96,168,252,221,16,49,254,248,126,36,154,61,38,91,243,63,156,12,3,37,0,0,0,1,0,80,0,0,4,141, + 5,213,0,24,0,54,64,17,18,19,12,11,4,15,0,5,1,8,25,22,1,28,4,15,25,16,212,212,236,212,236,17,57,57,17,23,57,49,0,64, + 11,0,149,5,15,149,16,11,149,18,129,2,47,244,236,212,236,212,236,48,1,35,17,35,17,51,50,54,53,52,38,43,1,34,6,7,53,54,59,1, + 50,4,21,20,4,2,145,39,202,241,141,154,154,141,254,69,175,79,152,171,254,244,1,8,254,247,2,90,253,166,3,0,145,135,136,143,42,44,182,70, + 220,225,215,231,0,1,0,80,0,0,3,143,4,123,0,24,0,55,64,16,10,8,6,15,4,12,1,0,4,18,19,22,8,0,12,25,16,212,212,236, + 212,236,18,57,18,23,57,49,0,64,13,22,185,1,23,12,134,13,136,8,185,15,184,23,47,244,236,244,238,16,212,236,48,1,51,50,54,53,52,39, + 38,35,34,7,6,7,53,54,51,50,23,22,21,20,6,35,17,35,1,47,100,141,154,76,85,134,73,86,86,78,152,171,251,125,132,212,194,202,1,166, + 145,135,141,65,72,21,21,43,182,70,110,116,219,213,229,254,252,0,0,0,0,3,0,10,0,0,4,236,5,213,0,12,0,21,0,40,0,92,64,26, + 21,15,12,6,23,29,35,5,0,18,28,26,9,25,32,46,2,4,13,0,28,38,37,22,4,41,16,252,60,204,236,50,50,204,252,236,212,236,17,23, + 57,57,57,49,0,64,21,40,1,149,37,4,4,0,5,29,0,149,14,13,149,22,129,5,149,14,173,35,47,236,236,244,236,16,238,57,17,18,57,47, + 60,236,50,48,178,15,42,1,1,93,1,21,33,21,33,21,33,50,54,53,52,38,35,1,17,33,50,54,53,52,38,35,37,33,50,22,21,20,6,7, + 30,1,21,20,4,35,33,17,35,53,51,1,147,1,91,254,165,1,68,163,157,157,163,254,188,1,43,148,145,145,148,254,11,2,4,231,250,128,124,149, + 165,254,240,251,253,232,191,191,2,201,201,144,202,135,139,140,133,2,102,254,62,111,114,113,112,166,192,177,137,162,20,32,203,152,200,218,1,112,144,0, + 0,2,0,12,255,227,5,206,5,213,0,20,0,29,0,95,64,15,21,3,28,7,9,5,56,22,1,28,19,17,0,65,30,16,252,75,176,16,84,88, + 185,0,0,255,192,56,89,60,204,236,50,252,60,204,236,50,49,0,64,22,29,23,16,10,0,7,20,3,149,17,9,22,22,0,26,149,13,140,4,0, + 129,30,16,228,50,244,236,17,57,47,60,60,236,50,50,17,57,57,57,57,48,1,182,31,31,143,31,159,31,3,93,19,51,17,33,17,51,17,51,21, + 35,21,16,0,33,32,0,17,53,35,53,51,5,33,21,20,22,51,50,54,53,178,203,2,225,203,165,165,254,223,254,230,254,229,254,223,166,166,3,172, + 253,31,174,195,194,174,5,213,253,150,2,106,253,150,164,150,254,220,254,214,1,42,1,36,150,164,164,125,240,211,211,240,255,255,0,16,0,0,5,104, + 5,213,16,6,3,48,0,0,0,3,0,201,255,66,4,139,6,147,0,19,0,23,0,27,0,0,1,51,7,51,21,35,3,33,21,33,3,33,21,33, + 7,35,55,35,17,33,1,19,35,17,1,19,33,17,3,184,170,65,88,146,151,1,10,254,188,185,2,46,253,152,65,170,65,176,2,174,254,60,185,217, + 1,19,151,254,86,6,147,190,170,254,70,170,253,227,170,190,190,5,213,250,213,2,29,253,227,2,199,1,186,254,70,0,0,4,0,113,255,66,4,127, + 5,30,0,5,0,38,0,45,0,49,0,0,1,38,39,38,39,3,5,21,33,3,22,51,50,54,55,21,14,1,35,34,39,7,35,19,38,39,38,17, + 16,0,51,50,23,55,51,7,22,23,22,5,19,38,35,34,6,7,27,1,35,22,3,199,2,83,14,16,111,1,154,254,43,148,74,97,106,199,98,99, + 208,107,123,99,80,170,109,33,28,157,1,41,252,56,49,71,170,92,57,47,131,253,188,135,20,22,154,185,14,90,111,207,11,2,148,151,90,16,13,254, + 242,54,90,254,151,28,52,52,174,42,44,33,194,1,9,23,29,156,1,10,1,19,1,67,9,172,224,34,50,146,197,1,74,2,174,158,254,99,1,14, + 172,0,0,0,0,1,255,150,254,102,2,82,5,213,0,19,0,89,64,31,11,2,7,12,1,12,149,18,15,20,7,149,5,176,16,129,20,0,17,13, + 5,8,6,57,1,17,28,12,16,4,20,16,252,75,176,16,84,88,185,0,16,0,64,56,89,60,236,50,228,57,57,196,16,196,49,0,16,228,252,236, + 16,212,60,236,50,17,18,57,57,48,1,64,13,48,21,64,21,80,21,96,21,143,21,159,21,6,93,1,35,17,16,6,43,1,53,51,50,54,53,17, + 35,53,51,17,51,17,51,2,82,191,205,227,77,63,134,110,191,191,202,191,2,119,253,241,254,242,244,170,150,194,2,15,166,2,184,253,72,0,0,0, + 0,2,255,219,254,86,2,28,6,20,0,19,0,23,0,83,64,36,23,190,20,177,24,15,6,11,0,11,135,9,189,24,2,19,169,5,16,0,188,24, + 12,24,9,10,79,21,5,1,8,20,16,0,70,24,16,252,60,60,236,50,50,228,57,18,57,49,0,16,228,220,60,228,50,16,244,236,17,18,57,57, + 16,244,236,48,64,11,16,25,64,25,80,25,96,25,112,25,5,1,93,19,51,17,51,21,35,17,20,6,43,1,53,51,50,54,53,17,35,53,51,17, + 51,21,35,193,184,163,163,163,181,70,49,105,76,181,181,184,184,4,96,254,8,164,254,40,214,192,156,97,153,1,216,164,3,172,233,0,0,2,0,115, + 254,102,6,176,5,241,0,24,0,36,0,67,64,36,3,12,13,6,149,9,176,37,34,149,0,22,28,149,13,16,140,22,145,1,175,37,9,6,8,2, + 31,13,0,28,2,25,25,19,16,37,16,252,236,212,236,50,50,16,204,57,57,49,0,16,236,228,244,196,236,16,196,238,16,228,236,17,57,57,48,1, + 53,51,17,20,22,59,1,21,35,34,38,17,53,14,1,35,32,0,17,16,0,33,50,22,1,16,18,51,50,18,17,16,2,35,34,2,4,179,196,110, + 134,69,77,227,205,77,236,165,254,242,254,172,1,84,1,14,165,236,252,223,234,204,205,235,235,205,204,234,4,237,232,250,147,194,150,170,244,1,14,127, + 132,128,1,171,1,92,1,92,1,171,128,253,120,254,227,254,187,1,69,1,29,1,29,1,69,254,187,0,0,2,0,113,254,86,5,64,4,123,0,24, + 0,36,0,72,64,34,24,135,0,189,37,34,185,17,14,28,185,5,8,140,14,184,18,188,37,1,23,24,19,31,4,17,8,19,71,25,18,11,69,37, + 16,252,236,244,236,50,50,16,204,57,57,49,0,16,236,228,244,196,236,16,196,238,16,244,236,48,182,96,38,128,38,160,38,3,1,93,1,35,34,38, + 61,1,14,1,35,34,2,17,16,0,51,50,22,23,53,51,17,20,22,59,1,1,20,22,51,50,54,53,52,38,35,34,6,5,64,70,181,163,58,177, + 124,203,255,0,255,203,124,177,58,184,76,105,49,251,239,167,146,146,168,168,146,146,167,254,86,192,214,188,100,97,1,68,1,8,1,8,1,68,97,100, + 170,251,140,153,97,3,61,203,231,231,203,203,231,231,0,0,0,2,0,10,0,0,5,84,5,213,0,23,0,32,0,187,64,24,5,6,3,21,9,0, + 32,26,18,5,10,29,25,4,21,63,24,10,28,14,17,12,4,33,16,252,60,204,236,50,252,196,236,17,23,57,17,57,57,57,49,0,64,33,9,8, + 7,3,10,6,17,3,4,3,5,17,4,4,3,66,6,4,0,25,3,4,16,25,149,13,9,24,149,17,129,11,4,47,60,244,236,212,50,236,50,18, + 57,18,57,18,57,48,75,83,88,7,16,5,237,7,16,5,237,17,23,57,89,34,178,64,34,1,1,93,64,66,122,23,1,5,0,5,1,5,2,6, + 3,7,4,21,0,21,1,20,2,22,3,23,4,37,0,37,1,37,2,38,3,39,6,38,7,38,8,38,9,32,34,54,1,54,2,70,1,70,2,104, + 5,117,4,117,5,119,23,136,6,136,7,152,6,152,7,31,93,0,93,1,30,1,23,19,35,3,46,1,43,1,17,35,17,35,53,51,17,33,32,22, + 21,20,6,1,17,51,50,54,53,52,38,35,3,141,65,123,62,205,217,191,74,139,120,220,202,191,191,1,200,1,0,252,131,253,137,254,146,149,149,146, + 2,188,22,144,126,254,104,1,127,150,98,253,137,2,119,166,2,184,214,216,141,186,2,79,253,238,135,131,131,133,0,0,0,1,0,14,0,0,3,74, + 4,123,0,24,0,61,64,10,10,24,3,8,6,18,8,4,70,25,16,252,60,196,196,252,60,60,49,0,64,16,18,17,11,21,135,14,184,3,8,24, + 169,5,2,9,188,3,47,228,212,60,236,50,16,244,236,196,212,204,48,180,80,26,159,26,2,1,93,1,21,35,17,35,17,35,53,51,17,51,21,62, + 1,51,50,22,31,1,46,1,35,34,6,21,2,30,171,185,172,172,185,58,186,133,19,46,28,1,31,73,44,156,167,2,104,164,254,60,1,196,164,1, + 248,174,102,99,5,5,189,18,17,206,161,0,0,2,255,246,0,0,4,236,5,213,0,17,0,20,0,0,3,51,23,33,55,51,7,51,21,33,1,17, + 35,17,1,33,53,51,5,33,23,4,217,151,2,12,150,217,151,156,254,245,254,246,203,254,246,254,244,157,2,119,254,209,152,5,213,224,224,224,164,254, + 118,253,57,2,199,1,138,164,164,226,0,0,0,2,0,11,254,86,4,181,4,96,0,24,0,27,0,0,5,14,1,43,1,53,51,50,54,63,1,3, + 33,53,51,3,51,19,33,19,51,3,51,21,33,43,1,19,2,147,78,148,124,147,108,76,84,51,33,205,254,214,240,190,195,184,1,76,184,195,185,239, + 254,215,193,218,109,104,200,122,154,72,134,84,1,242,143,1,205,254,51,1,205,254,51,143,254,240,0,0,0,2,0,174,255,227,4,96,4,123,0,10, + 0,37,0,178,64,16,23,0,3,10,39,31,3,8,20,24,10,13,8,12,70,38,16,252,236,50,50,212,236,204,196,17,18,57,57,49,64,21,0,169, + 23,12,14,6,185,17,184,38,32,134,31,186,28,185,35,140,12,188,38,0,16,228,244,236,252,236,16,244,236,196,16,212,228,182,25,31,11,23,9,14, + 0,18,17,57,17,57,18,57,48,64,49,63,30,63,31,63,32,63,33,79,30,79,31,79,32,79,33,95,30,95,31,95,32,95,33,111,30,111,31,111, + 32,111,33,127,30,127,31,127,32,127,33,143,30,143,31,143,32,143,33,24,93,64,37,63,29,63,30,63,31,63,32,63,33,63,34,79,29,79,30,79, + 31,79,32,79,33,79,34,95,29,95,30,95,31,95,32,95,33,95,34,21,1,93,1,50,54,53,52,38,35,34,6,29,1,7,17,51,21,62,1,51, + 50,22,21,20,6,35,33,21,20,22,51,50,54,55,21,14,1,35,34,38,2,29,223,172,129,111,153,185,184,184,63,188,136,172,203,253,251,254,254,167, + 151,96,182,84,101,190,90,243,240,2,43,102,123,98,115,217,180,41,76,2,127,170,102,97,193,162,189,192,18,127,139,46,46,170,39,39,252,0,0,0, + 0,2,0,113,255,227,4,90,4,123,0,16,0,28,0,56,64,25,26,185,0,14,20,185,5,8,140,14,184,1,188,3,23,4,0,8,2,71,17,18, + 11,69,29,16,252,236,244,236,50,50,49,0,47,236,228,244,196,236,16,196,238,48,182,96,30,128,30,160,30,3,1,93,1,53,51,17,35,53,14,1, + 35,34,2,17,16,0,51,50,22,1,20,22,51,50,54,53,52,38,35,34,6,3,162,184,184,58,177,124,203,255,0,255,203,124,177,253,199,167,146,146, + 168,168,146,146,167,3,182,170,251,160,168,100,97,1,68,1,8,1,8,1,68,97,254,21,203,231,231,203,203,231,231,0,0,2,0,186,255,227,4,163, + 4,123,0,11,0,28,0,56,64,25,3,185,12,15,9,185,24,21,140,15,184,27,188,25,0,18,18,71,24,12,6,8,26,70,29,16,252,236,50,50, + 244,236,49,0,47,236,228,244,196,236,16,198,238,48,182,96,30,128,30,160,30,3,1,93,1,52,38,35,34,6,21,20,22,51,50,54,1,62,1,51, + 50,0,17,16,2,35,34,38,39,21,35,17,51,3,229,167,146,146,168,168,146,146,167,253,141,58,177,124,203,0,255,255,203,124,177,58,184,184,2,47, + 203,231,231,203,203,231,231,2,82,100,97,254,188,254,248,254,248,254,188,97,100,170,4,96,0,2,0,186,255,227,4,164,6,20,0,11,0,36,0,67, + 64,31,3,185,12,15,9,185,24,21,140,15,184,25,33,169,30,151,25,0,18,18,71,30,33,31,24,12,6,8,26,70,37,16,252,236,50,50,196,57, + 57,244,236,49,0,47,252,236,16,228,244,196,236,16,198,238,48,182,96,38,128,38,160,38,3,1,93,1,52,38,35,34,6,21,20,22,51,50,54,1, + 62,1,51,50,0,17,16,2,35,34,38,39,21,35,17,52,54,59,1,21,35,34,6,21,3,229,167,146,146,167,167,146,146,167,253,142,58,177,123,204, + 0,255,255,204,123,177,58,185,179,165,254,233,90,91,2,47,203,231,231,203,203,231,231,2,82,100,97,254,188,254,248,254,248,254,188,97,100,168,4,126, + 195,211,156,125,125,0,0,0,0,1,0,127,255,227,3,245,4,123,0,25,0,48,64,27,25,134,0,136,22,185,3,184,26,13,134,12,136,16,185,9, + 140,26,27,69,19,18,6,72,13,0,26,16,220,60,244,236,236,49,0,16,244,236,244,236,16,244,236,244,236,48,19,62,1,51,50,0,17,16,0,33, + 34,38,39,53,30,1,51,50,54,53,52,38,35,34,6,7,127,77,165,93,253,1,42,254,211,254,250,85,162,76,78,157,80,179,198,198,179,80,157,78, + 4,51,36,36,254,194,254,242,254,238,254,198,35,35,172,43,43,227,205,205,227,43,43,0,0,2,0,113,255,115,3,231,4,123,0,39,0,47,0,79, + 64,15,40,11,7,44,44,18,19,7,18,19,0,72,34,69,48,16,252,228,50,236,16,236,17,18,57,57,49,0,64,19,0,134,1,136,4,15,185,46, + 42,185,23,4,185,37,184,27,23,140,48,16,228,204,244,236,16,252,220,236,16,245,238,48,64,11,15,49,16,49,128,49,144,49,160,49,5,1,93,1, + 21,46,1,35,34,6,21,20,23,22,23,54,55,54,51,50,23,22,21,20,7,6,35,34,39,6,21,35,52,55,38,39,38,17,16,0,33,50,22,1, + 22,51,50,53,52,35,34,3,231,78,157,80,179,198,99,7,6,39,62,73,106,163,74,63,95,83,155,80,73,6,153,12,57,47,149,1,45,1,6,85, + 162,254,138,58,77,146,132,101,4,53,172,43,43,227,205,205,114,8,6,81,44,51,72,61,89,125,47,41,17,57,68,104,81,35,51,161,1,12,1,18, + 1,58,35,252,58,19,57,75,0,2,0,113,254,86,5,64,6,20,0,24,0,36,0,75,64,36,4,20,18,5,24,169,0,189,37,34,185,17,14,28, + 185,5,8,140,14,184,18,151,37,24,79,31,4,18,8,19,71,25,18,11,69,37,16,252,236,244,236,50,50,228,49,0,16,236,228,244,196,236,16,196, + 238,16,252,236,17,18,57,57,48,182,96,30,128,30,160,30,3,1,93,1,35,34,38,61,1,14,1,35,34,2,17,16,0,51,50,22,23,17,51,17, + 20,22,59,1,1,20,22,51,50,54,53,52,38,35,34,6,5,64,70,181,163,58,177,124,203,255,0,255,203,124,177,58,184,76,105,49,251,239,167,146, + 146,168,168,146,146,167,254,86,192,214,188,100,97,1,68,1,8,1,8,1,68,97,100,2,94,249,216,153,97,3,61,203,231,231,203,203,231,231,0,0, + 0,2,0,113,255,227,5,185,6,20,0,24,0,36,0,61,64,28,34,185,0,22,28,185,13,16,140,22,184,37,6,169,5,151,37,31,12,0,8,11, + 71,25,18,19,69,37,16,252,236,244,236,50,50,49,0,16,252,228,16,228,244,196,236,16,196,238,48,182,96,30,128,30,160,30,3,1,93,1,53,52, + 54,59,1,21,35,34,6,21,17,35,53,14,1,35,34,2,17,16,0,51,50,22,1,20,22,51,50,54,53,52,38,35,34,6,3,162,163,181,191,170, + 105,76,184,58,177,124,203,255,0,255,203,124,177,253,199,167,146,146,168,168,146,146,167,3,182,200,214,192,156,97,153,251,130,168,100,97,1,68,1,8, + 1,8,1,68,97,254,21,203,231,231,203,203,231,231,0,0,0,2,0,113,255,227,4,127,4,123,0,25,0,34,0,114,64,13,27,24,26,24,18,8, + 75,26,8,16,25,69,35,16,252,196,236,244,236,17,18,57,49,64,23,0,26,25,15,134,16,136,20,26,169,25,20,185,12,25,187,31,185,4,184,12, + 140,35,0,16,228,244,236,228,16,236,16,236,16,244,236,17,18,57,48,64,41,63,36,112,36,160,36,208,36,240,36,5,63,0,63,25,63,24,63,26, + 63,27,5,44,17,47,16,47,15,44,14,111,0,111,25,111,24,111,26,111,27,9,93,113,1,93,19,52,55,54,51,50,23,22,17,16,7,6,33,34, + 38,39,53,22,23,22,51,50,55,54,55,33,55,5,38,39,38,35,34,7,6,113,131,132,226,252,148,149,157,156,254,244,107,208,99,98,100,99,106,183, + 102,103,12,252,178,184,2,144,14,93,92,154,136,82,83,2,94,250,146,145,161,162,254,237,254,246,156,156,44,42,174,52,26,26,99,100,190,144,1,158, + 87,87,90,90,0,2,0,113,255,227,4,127,4,123,0,20,0,27,0,65,64,36,0,21,1,9,134,8,136,5,1,169,21,24,185,18,21,187,5,185, + 12,184,18,140,28,2,21,27,27,8,15,75,21,18,8,1,69,28,16,252,196,236,244,236,17,18,57,49,0,16,228,244,236,228,16,238,16,238,16,244, + 238,17,18,57,48,19,53,33,46,1,35,34,6,7,53,62,1,51,32,0,17,16,0,35,34,0,55,30,1,51,50,54,55,113,3,78,12,205,183,106, + 199,98,99,208,107,1,12,1,57,254,215,252,226,254,249,184,2,165,136,154,185,14,2,0,90,190,199,52,52,174,42,44,254,200,254,246,254,237,254,189, + 1,35,196,151,180,174,158,0,0,2,0,124,255,227,6,132,4,123,0,10,0,52,0,119,64,16,54,46,40,8,39,52,2,18,13,75,5,18,31,21, + 69,53,16,252,196,236,252,236,220,60,252,220,196,182,38,22,11,4,4,2,13,17,18,23,57,49,64,15,47,169,46,39,34,26,185,34,184,53,9,185, + 17,140,53,0,16,244,236,16,244,236,16,212,220,236,180,31,134,30,136,26,16,244,236,64,11,5,21,11,13,2,4,38,22,8,34,17,17,18,23,57, + 48,64,10,52,11,4,5,17,38,22,21,39,21,7,14,16,60,60,252,60,60,4,60,37,54,39,54,39,1,22,23,22,51,50,1,22,21,16,7,6, + 35,34,39,38,39,1,38,39,38,7,6,7,6,7,53,62,1,51,32,23,22,23,55,51,21,20,23,22,59,1,21,35,34,39,38,53,3,78,102,2, + 1,10,253,151,30,32,82,136,168,1,96,31,149,148,252,228,130,92,28,2,254,19,27,76,209,108,97,100,98,99,208,107,1,12,156,36,27,203,184,38, + 38,105,43,64,175,87,82,214,138,207,62,56,254,156,69,35,90,2,144,96,118,254,237,162,161,145,103,156,1,187,39,35,100,1,1,25,26,52,174,42, + 44,156,35,41,117,148,153,49,48,156,96,90,200,0,0,0,255,255,0,133,255,227,3,200,4,124,18,6,3,73,0,0,255,255,0,133,255,227,3,200, + 4,124,18,6,3,203,0,0,0,1,0,133,255,227,6,42,4,124,0,62,0,105,64,16,64,54,48,8,60,47,30,18,46,19,18,3,25,39,11,63, + 16,220,196,196,212,236,212,236,220,60,252,220,196,49,64,22,38,134,39,136,34,185,42,184,63,24,169,25,63,11,134,10,136,15,185,6,140,63,0,16, + 244,236,252,236,16,212,236,16,244,236,252,236,182,61,46,0,42,0,24,25,17,18,57,17,18,57,57,180,55,169,54,48,42,16,212,220,236,48,179,60, + 61,46,47,7,4,16,60,1,30,1,21,20,4,35,34,39,38,39,53,22,23,22,51,50,55,54,53,52,39,38,43,1,53,51,50,55,54,53,52,39, + 38,35,34,7,6,7,53,62,1,51,50,23,22,23,55,51,21,20,23,22,59,1,21,35,34,39,38,53,5,6,2,194,124,138,254,254,238,80,85,84, + 90,71,85,85,93,151,85,84,78,72,137,148,155,116,67,68,70,69,119,71,81,80,97,98,170,76,196,113,95,15,236,184,38,38,105,43,64,175,87,82, + 254,224,64,2,92,24,146,108,173,182,14,14,28,171,37,19,18,56,56,90,88,56,51,152,44,45,70,64,46,46,13,13,29,167,24,24,78,66,106,134, + 148,153,49,48,156,96,90,200,166,70,0,0,0,2,0,113,255,227,4,197,4,124,0,26,0,47,0,59,64,13,23,18,31,49,18,12,18,38,4,18, + 44,69,48,16,252,236,212,236,196,196,212,236,49,64,14,0,185,27,184,48,17,169,18,48,8,185,41,140,48,0,16,244,236,16,212,236,16,244,236,178, + 35,18,17,17,18,57,48,1,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,43,1,53,51,50,55,54,53,52,39,38,39,50,23,22,21,20, + 7,6,7,30,1,21,20,4,35,32,0,17,16,55,54,2,241,251,96,99,99,104,210,151,85,84,78,72,137,148,155,116,67,68,70,69,104,196,113,114, + 60,60,112,124,138,254,254,238,254,198,254,214,151,151,3,220,110,114,205,208,111,116,56,56,90,88,56,51,152,44,45,70,64,46,46,160,78,79,141,93, + 64,65,24,24,146,108,173,182,1,62,1,14,1,18,157,158,0,1,255,219,254,86,2,28,4,96,0,19,0,75,64,31,15,6,11,0,11,135,9,189, + 20,2,19,169,5,16,0,188,20,12,20,9,10,79,2,5,1,8,19,16,0,70,20,16,252,60,60,236,50,50,228,57,18,57,49,0,16,228,220,60, + 228,50,16,244,236,17,18,57,57,48,64,11,16,21,64,21,80,21,96,21,112,21,5,1,93,19,51,17,51,21,35,17,20,6,43,1,53,51,50,54, + 53,17,35,53,51,193,184,163,163,163,181,70,49,105,76,181,181,4,96,254,8,164,254,40,214,192,156,97,153,1,216,164,0,2,0,113,254,86,5,184, + 6,20,0,11,0,48,0,85,64,41,25,12,29,9,18,134,19,22,185,15,3,185,38,35,184,29,45,169,42,151,9,185,15,189,26,29,42,45,43,38, + 25,0,8,12,71,6,18,18,32,69,49,16,252,196,236,244,236,50,50,196,57,57,49,0,47,196,228,236,244,236,16,244,196,236,16,254,213,238,17,18, + 57,57,48,182,96,50,128,50,160,50,3,1,93,1,52,38,35,34,6,21,20,22,51,50,54,23,16,2,33,34,38,39,53,30,1,51,50,54,61,1, + 14,1,35,34,2,17,16,18,51,50,22,23,53,52,54,59,1,21,35,34,6,21,3,162,165,149,148,165,165,148,149,165,184,254,254,250,97,172,81,81, + 158,82,181,180,57,178,124,206,252,252,206,124,178,57,163,181,190,169,105,76,2,61,200,220,220,200,199,220,220,235,254,226,254,233,29,30,179,44,42,189, + 191,91,99,98,1,58,1,3,1,4,1,58,98,99,200,214,192,156,97,153,0,2,0,113,254,86,4,90,4,96,0,10,0,35,0,67,64,31,24,11, + 28,8,17,134,18,21,185,14,2,185,35,188,8,185,14,189,25,28,24,0,8,11,71,5,18,17,31,69,36,16,252,196,236,244,236,50,49,0,47,196, + 228,236,244,236,16,254,213,238,17,18,57,57,48,182,96,37,128,37,160,37,3,1,93,1,17,33,34,6,21,20,22,51,50,54,23,16,2,33,34,38, + 39,53,30,1,51,50,54,61,1,14,1,35,34,2,17,52,18,51,33,3,162,254,170,135,150,165,148,149,165,184,254,254,250,97,172,81,81,158,82,181, + 180,57,178,124,206,252,252,206,2,31,2,61,1,136,205,187,199,220,220,235,254,226,254,233,29,30,179,44,42,189,191,91,99,98,1,58,1,3,249,1, + 42,0,0,0,0,1,0,113,255,227,4,79,4,123,0,29,0,56,64,31,0,5,27,1,169,3,27,185,8,18,134,17,136,21,185,14,184,8,140,30, + 2,0,8,17,52,4,24,18,11,69,30,16,252,236,220,228,252,196,49,0,16,228,244,236,244,236,16,254,212,238,17,57,57,48,37,17,35,53,33,17, + 14,1,35,34,0,17,16,0,33,50,22,23,21,46,1,35,34,6,21,20,22,51,50,54,3,169,155,1,65,101,215,123,253,254,214,1,45,1,6,104, + 197,93,95,192,99,179,198,198,179,79,124,158,1,17,140,253,240,36,36,1,62,1,14,1,18,1,58,55,55,170,62,62,227,205,205,227,15,0,0,0, + 0,2,0,96,254,82,4,100,4,96,0,19,0,35,0,121,64,10,37,2,24,18,7,32,18,13,18,36,16,212,212,236,212,236,212,196,181,0,28,20, + 3,24,32,17,18,23,57,49,64,10,20,185,10,189,1,19,2,18,188,36,0,16,228,50,50,50,244,236,179,13,7,28,10,17,18,57,57,48,180,19, + 17,18,18,28,7,5,16,236,179,17,18,2,28,8,16,60,180,1,17,2,2,28,7,5,16,236,181,0,1,3,2,18,28,8,16,60,4,16,60,179, + 3,0,19,0,7,14,16,60,179,17,0,1,0,7,14,16,60,9,1,51,1,22,23,22,21,20,6,35,34,38,53,52,55,54,55,1,51,1,50,55, + 54,53,52,39,38,39,6,7,6,21,20,23,22,2,98,1,66,192,254,95,106,38,59,150,150,150,150,59,38,106,254,95,192,1,66,67,31,28,28,40, + 58,58,40,28,28,31,1,232,2,120,252,220,177,83,128,99,129,130,130,129,99,128,83,177,3,36,250,142,27,24,45,69,73,100,99,99,100,73,69,45, + 24,27,0,0,0,2,0,96,255,227,4,100,4,96,0,19,0,35,0,121,64,10,37,2,24,18,7,32,18,13,18,36,16,212,212,236,212,236,212,196, + 181,0,28,20,3,24,32,17,18,23,57,49,64,10,20,185,10,140,1,19,2,18,188,36,0,16,228,50,50,50,244,236,179,13,7,28,10,17,18,57, + 57,48,180,19,17,18,18,28,7,5,16,236,179,17,18,2,28,8,16,60,180,1,17,2,2,28,7,5,16,236,181,0,1,3,2,18,28,8,16,60, + 4,16,60,179,3,0,19,0,7,14,16,60,179,17,0,1,0,7,14,16,60,9,1,51,1,22,23,22,21,20,6,35,34,38,53,52,55,54,55,1, + 51,1,50,55,54,53,52,39,38,39,6,7,6,21,20,23,22,2,98,1,41,217,254,114,71,44,69,150,150,150,150,69,44,71,254,114,217,1,41,67, + 31,28,39,31,56,56,31,39,28,31,2,209,1,143,253,234,98,76,120,62,130,129,129,130,62,120,76,98,2,22,252,31,27,24,45,33,64,50,70,70, + 50,64,33,45,24,27,0,0,0,1,0,174,254,86,4,88,4,96,0,19,0,57,64,27,3,9,0,3,14,1,6,135,14,17,140,10,1,188,12,189, + 20,13,9,8,11,78,2,8,0,70,20,16,252,236,244,236,50,49,0,16,228,228,50,244,196,236,17,18,23,57,48,180,96,21,207,21,2,1,93,19, + 17,51,17,20,22,51,50,54,53,17,51,17,35,17,14,1,35,34,38,174,184,124,124,149,173,184,184,67,177,117,193,200,1,186,2,166,253,97,159,159, + 190,164,2,123,249,246,2,86,102,99,240,0,0,1,0,186,0,0,4,100,6,20,0,27,0,67,64,33,3,9,0,3,22,1,6,135,22,25,184,28, + 12,21,18,169,15,151,10,1,2,8,0,78,15,18,16,21,9,8,11,70,28,16,252,236,50,196,57,57,244,236,49,0,47,60,252,236,57,57,16,244, + 196,236,17,18,23,57,48,178,96,29,1,1,93,1,17,35,17,52,38,35,34,6,21,17,35,17,52,54,59,1,21,35,34,6,29,1,62,1,51,50, + 22,4,100,184,124,124,149,172,185,163,181,254,231,105,77,66,179,117,193,198,2,164,253,92,2,158,159,158,190,164,253,135,4,126,214,192,156,97,153,204, + 101,100,239,0,0,1,0,186,254,86,4,100,6,20,0,33,0,74,64,37,3,9,0,3,29,1,13,135,29,31,184,34,19,28,25,169,22,151,18,7, + 135,4,18,6,10,8,0,78,22,25,23,28,16,8,18,70,34,16,252,236,50,196,57,57,244,236,196,49,0,47,220,236,16,252,236,57,57,16,244,196, + 236,17,18,23,57,48,178,96,35,1,1,93,1,17,20,6,43,1,53,51,50,54,53,17,16,35,34,6,21,17,35,17,52,54,59,1,21,35,34,6, + 29,1,54,51,50,22,4,100,163,181,254,233,105,76,248,149,172,185,163,181,254,231,105,77,131,231,193,198,2,164,253,72,214,192,156,97,153,2,178,1, + 61,190,164,253,135,4,126,214,192,156,97,153,204,201,239,0,0,2,0,14,0,0,2,30,6,20,0,11,0,15,0,62,64,24,14,190,12,177,6,2, + 11,169,5,8,0,188,6,5,2,13,1,8,8,11,12,0,70,16,16,252,60,60,60,236,50,50,50,49,0,47,228,220,60,236,50,16,252,236,48,64, + 11,16,17,64,17,80,17,96,17,112,17,5,1,93,19,51,17,51,21,35,17,35,17,35,53,51,17,51,21,35,194,184,164,164,184,180,180,184,184,4, + 96,254,8,164,254,60,1,196,164,3,172,233,255,255,0,166,0,0,2,110,4,96,16,6,3,77,0,0,0,1,0,116,0,0,2,132,4,96,0,11, + 0,39,64,10,3,6,8,4,8,0,9,8,10,12,16,220,236,50,252,236,50,49,0,64,9,4,11,169,1,188,5,9,169,8,47,236,50,252,236,50, + 48,19,53,33,21,35,17,51,21,33,53,51,17,116,2,16,168,168,253,240,176,3,188,164,164,252,232,164,164,3,24,0,0,1,0,75,0,0,2,223, + 6,20,0,35,0,60,64,13,37,11,86,10,18,1,8,0,19,28,86,29,36,16,220,252,220,60,252,60,220,252,212,49,64,18,20,17,2,35,4,15, + 33,6,195,15,29,11,33,195,24,0,151,19,0,47,228,47,236,50,212,60,236,17,18,23,57,48,1,51,17,22,23,22,51,50,55,54,55,51,6,7, + 6,35,34,39,17,35,17,38,39,38,35,34,7,6,7,35,54,55,54,51,50,23,1,61,184,2,1,17,13,38,18,18,2,125,2,51,51,91,20,19, + 184,6,5,17,13,38,18,18,2,125,2,51,51,91,25,22,6,20,252,237,1,1,9,37,36,82,135,73,74,4,253,133,3,2,4,3,9,37,36,82, + 135,73,74,6,0,2,0,77,0,0,3,84,6,20,0,17,0,24,0,53,64,11,26,4,5,1,8,18,0,7,22,13,25,16,220,220,212,60,50,252, + 60,220,196,49,64,14,17,15,185,20,10,5,169,18,2,2,7,0,151,7,0,47,228,17,57,47,60,236,50,212,236,196,48,1,51,17,51,21,35,17, + 35,17,52,39,35,32,55,54,51,50,23,7,38,35,34,7,20,51,1,162,184,250,250,184,1,61,254,232,1,1,245,53,42,16,23,55,77,1,92,6, + 20,252,254,160,253,142,2,84,15,15,189,246,25,250,132,75,57,0,0,0,0,1,0,193,254,86,2,95,6,20,0,11,0,40,64,7,13,6,0,8, + 11,70,12,16,252,252,212,196,49,0,64,12,10,1,5,0,11,151,12,5,135,6,189,12,16,244,236,16,228,17,18,57,57,48,1,17,20,22,59,1, + 21,35,34,38,53,17,1,121,61,120,49,70,191,153,6,20,249,206,124,116,156,204,202,6,40,0,0,0,0,1,0,193,254,76,5,54,6,20,0,36, + 0,178,64,14,27,35,21,18,38,6,14,35,29,34,8,32,70,37,16,252,252,60,212,196,212,196,236,16,204,178,0,35,27,17,18,57,49,64,24,27, + 66,0,169,26,26,34,31,29,169,34,14,134,13,147,17,185,9,189,34,188,32,151,31,0,47,228,228,252,236,244,236,16,236,17,18,57,47,236,236,179, + 21,6,0,9,17,18,57,57,48,64,8,27,17,0,28,17,36,26,35,7,5,16,236,4,16,236,64,27,12,28,10,0,27,28,25,0,42,28,42,0, + 56,0,59,28,73,0,76,28,84,0,91,28,113,0,13,1,93,64,27,4,27,4,36,20,27,20,36,37,27,36,36,53,36,55,27,69,36,70,27,84, + 36,92,27,127,27,13,0,93,64,9,7,11,6,12,26,12,26,15,4,93,1,50,23,22,23,22,21,20,4,33,34,39,38,39,53,30,1,51,50,55, + 54,53,52,39,38,43,1,53,1,33,17,35,17,51,17,33,21,3,67,105,129,99,85,81,254,208,254,232,94,99,100,106,84,200,109,190,99,100,92,91, + 167,174,1,174,253,106,184,184,3,101,1,220,56,43,108,104,138,221,242,18,19,37,195,49,50,75,75,143,132,75,74,166,1,243,252,51,6,20,254,76, + 168,0,0,0,0,1,0,186,255,230,7,29,4,98,0,38,0,94,64,17,0,18,20,30,27,8,29,80,18,8,20,80,10,8,8,70,39,16,252,236, + 252,252,252,252,60,17,18,57,49,64,22,7,20,10,26,17,0,6,31,8,13,23,135,31,4,35,140,39,27,18,8,188,39,0,16,244,60,60,16,244, + 60,196,236,50,17,18,23,57,48,64,19,48,40,80,40,112,40,144,40,160,40,160,40,191,40,223,40,255,40,9,1,93,37,6,7,6,35,34,38,53, + 17,51,17,20,22,51,50,55,54,53,17,51,17,20,22,51,50,54,53,17,51,17,35,53,6,7,6,35,34,39,38,3,174,67,98,96,130,175,190,185, + 114,117,143,83,83,185,114,119,141,166,185,185,61,90,88,121,122,86,85,216,121,61,60,246,226,2,164,253,98,162,156,96,94,164,2,122,253,98,162,156, + 192,162,2,122,251,158,176,101,51,50,62,62,0,1,0,186,254,86,7,29,4,98,0,38,0,97,64,17,0,18,20,30,27,8,29,80,18,8,20,80, + 10,8,8,70,39,16,252,236,252,252,252,252,60,17,18,57,49,64,24,7,20,10,26,17,0,6,31,8,13,23,135,31,4,35,140,39,27,18,8,188, + 29,189,39,0,16,236,244,60,60,16,244,60,196,236,50,17,18,23,57,48,64,19,48,40,80,40,112,40,144,40,160,40,160,40,191,40,223,40,255,40, + 9,1,93,37,6,7,6,35,34,38,53,17,51,17,20,22,51,50,55,54,53,17,51,17,20,22,51,50,54,53,17,51,17,35,17,6,7,6,35,34, + 39,38,3,174,67,98,96,130,175,190,185,114,117,143,83,83,185,114,119,141,166,185,185,61,90,88,121,122,86,85,216,121,61,60,246,226,2,164,253,98, + 162,156,96,94,164,2,122,253,98,162,156,192,162,2,122,249,244,2,90,101,51,50,62,62,0,1,0,186,254,86,7,29,4,123,0,48,0,99,64,18, + 14,0,17,15,19,8,7,80,28,8,26,80,41,37,8,39,70,49,16,252,236,50,252,252,252,236,17,18,57,204,49,0,64,24,14,135,13,27,7,29, + 20,37,26,0,6,42,27,33,23,135,42,45,3,184,40,188,38,27,47,60,228,244,60,196,236,50,17,18,23,57,16,212,236,48,1,64,19,48,50,80, + 50,112,50,144,50,160,50,160,50,191,50,223,50,255,50,9,93,1,62,1,51,50,23,22,21,17,20,7,6,43,1,53,51,50,55,54,53,3,52,38, + 35,34,6,21,17,35,17,52,39,38,35,34,7,6,21,17,35,17,51,21,62,1,51,50,23,22,4,41,69,192,130,175,95,95,82,81,181,254,233,105, + 38,38,1,114,117,143,166,185,57,57,119,141,83,83,185,185,63,176,121,122,85,86,3,137,124,118,123,122,226,253,72,214,96,96,156,48,49,153,2,178, + 161,156,190,164,253,135,2,158,162,78,77,95,96,163,253,135,4,96,174,103,98,62,62,0,0,1,255,219,254,86,4,107,4,123,0,27,0,81,64,15, + 2,8,0,78,16,28,13,14,79,10,21,8,20,70,28,16,252,236,50,228,57,18,57,244,236,49,0,64,14,3,9,0,3,22,1,6,135,22,25,184, + 20,188,1,47,228,244,196,236,17,18,23,57,64,9,19,10,15,20,15,135,13,189,28,16,244,236,17,18,57,57,48,180,96,29,207,29,2,1,93,1, + 17,35,17,52,38,35,34,6,21,17,20,6,43,1,53,51,50,54,53,17,51,21,62,1,51,50,22,4,107,184,124,124,149,173,163,181,70,49,105,76, + 185,66,179,117,193,198,2,164,253,92,2,158,159,158,190,164,253,115,214,192,156,97,153,4,116,174,101,100,239,0,0,0,0,1,0,186,254,86,5,74, + 4,123,0,29,0,59,64,12,23,26,3,8,21,78,9,13,8,12,70,30,16,252,236,50,244,236,220,196,49,64,13,6,135,14,17,184,12,188,11,26, + 169,27,189,11,0,47,252,236,16,228,244,196,236,181,9,3,20,3,14,10,17,18,23,57,48,1,38,53,17,52,38,35,34,6,21,17,35,17,51,21, + 62,1,51,50,22,21,17,20,23,22,59,1,21,35,34,3,254,82,124,124,149,172,185,185,66,179,117,193,198,38,38,105,49,70,181,254,182,96,214,2, + 178,159,158,190,164,253,135,4,96,174,101,100,239,232,253,72,153,49,48,156,0,1,0,179,0,0,4,100,4,96,0,9,0,121,64,30,7,17,1,2, + 1,2,17,6,7,6,66,7,2,3,0,188,8,5,6,1,7,2,8,4,78,7,8,0,70,10,16,252,236,252,236,17,57,57,49,0,47,60,236,50, + 57,57,48,75,83,88,7,16,4,237,7,16,4,237,89,34,178,31,11,1,1,93,64,48,54,2,56,7,72,2,71,7,105,2,102,7,128,2,7,6, + 1,9,6,21,1,26,6,70,1,73,6,87,1,88,6,101,1,105,6,121,6,133,1,138,6,149,1,154,6,159,11,16,93,0,93,19,33,1,17,51, + 17,33,1,17,35,179,1,16,1,221,196,254,240,254,35,196,4,96,252,121,3,135,251,160,3,108,252,148,0,3,0,113,255,227,4,117,4,123,0,6, + 0,13,0,25,0,44,64,24,4,169,11,7,185,20,0,185,14,184,20,140,26,10,4,18,17,81,11,3,18,23,69,26,16,252,236,50,244,236,50,49, + 0,16,228,244,236,16,238,220,236,48,1,34,6,7,33,46,1,3,50,54,53,33,20,22,19,50,0,17,16,0,35,34,0,17,16,0,2,113,147,149, + 18,2,116,18,149,146,149,168,253,134,168,150,240,1,18,254,238,240,241,254,239,1,17,3,223,193,127,127,193,252,160,232,148,148,232,3,252,254,200,254, + 236,254,237,254,199,1,57,1,19,1,20,1,56,0,0,0,0,2,0,113,0,0,6,36,4,96,0,18,0,29,0,73,64,13,31,4,0,9,6,2, + 8,19,24,18,14,69,30,16,252,236,212,236,50,212,196,196,196,179,10,18,2,19,17,18,57,57,49,64,10,2,19,169,18,188,10,29,7,169,10,0, + 47,252,60,16,244,252,60,64,8,3,169,6,6,14,14,19,10,17,18,57,16,208,47,236,48,1,21,33,17,33,21,33,17,33,21,33,32,39,38,17, + 16,55,54,33,23,35,34,7,6,21,20,23,22,59,1,6,22,253,212,2,21,253,235,2,58,252,225,254,187,167,168,168,167,1,69,42,37,240,120,120, + 120,120,240,37,4,96,154,254,221,155,254,148,156,142,143,1,20,1,18,142,143,130,108,107,216,217,108,109,0,2,0,148,255,220,5,62,4,124,0,19, + 0,36,0,50,64,13,38,69,7,18,25,19,8,0,12,18,20,69,37,16,252,236,212,252,212,236,236,49,0,64,13,0,10,135,23,3,15,135,30,35, + 140,23,184,37,16,228,244,60,236,50,16,236,196,48,1,21,20,22,50,55,54,53,16,2,32,2,17,20,23,22,50,54,61,1,5,16,0,32,0,17, + 20,6,7,6,34,38,39,14,1,34,38,3,72,96,107,38,73,208,254,110,202,73,38,107,96,254,4,1,66,2,34,1,70,58,46,97,215,162,12,18, + 157,214,215,2,148,196,163,181,48,91,157,1,15,1,49,254,208,254,240,157,91,48,181,163,196,200,1,84,1,92,254,164,254,128,108,178,54,112,163,117, + 121,159,237,0,255,255,0,112,254,86,4,209,6,20,18,6,3,105,0,0,0,1,0,0,255,229,2,144,4,96,0,14,0,47,64,9,7,2,4,10, + 14,8,13,4,15,16,47,220,236,50,17,57,57,49,0,64,13,10,0,11,5,4,0,7,135,2,140,12,188,13,47,236,244,236,196,212,204,17,18,57, + 48,37,6,33,34,47,1,22,51,50,54,53,17,51,17,35,1,215,114,254,249,37,56,1,60,88,156,167,185,185,174,201,10,189,35,203,190,2,78,251, + 160,0,0,0,0,1,0,0,255,229,2,144,6,10,0,14,0,47,64,9,7,2,4,10,14,8,13,4,15,16,47,220,236,50,17,57,57,49,0,64, + 13,10,0,11,5,4,0,7,135,2,140,12,151,13,47,236,244,236,196,212,204,17,18,57,48,37,6,33,34,47,1,22,51,50,54,53,17,51,17,35, + 1,215,114,254,249,37,56,1,60,88,159,164,185,185,174,201,10,189,35,206,187,3,248,249,246,0,0,0,0,1,0,0,254,86,3,118,4,96,0,22, + 0,68,64,12,17,79,13,7,2,4,10,22,8,13,4,15,16,47,220,236,50,17,57,57,16,228,49,0,64,22,22,13,11,0,17,169,18,189,23,10, + 0,11,5,4,0,7,135,2,140,12,188,23,16,236,244,236,196,212,204,17,18,57,16,252,236,17,18,57,57,48,37,6,33,34,47,1,22,51,50,54, + 53,17,51,17,20,22,59,1,21,35,34,38,53,1,215,114,254,249,37,56,1,60,88,156,167,185,76,105,49,70,181,163,174,201,10,189,35,203,190,2, + 78,251,140,153,97,156,192,214,0,1,0,186,254,88,3,74,4,123,0,17,0,51,64,22,6,11,7,0,17,11,3,135,14,184,9,188,7,189,18,10, + 6,8,0,8,70,18,16,252,196,236,50,49,0,16,236,228,244,236,196,212,204,17,18,57,48,180,80,19,159,19,2,1,93,1,46,1,35,34,6,21, + 17,35,17,51,21,62,1,51,50,22,23,3,74,31,73,44,156,167,185,185,58,186,133,19,46,28,3,180,18,17,203,190,252,10,6,8,174,102,99,5, + 5,0,0,0,0,1,0,186,254,86,3,74,4,123,0,25,0,58,64,26,6,19,7,11,135,12,189,26,0,25,19,3,135,24,184,17,188,26,11,18, + 6,8,0,16,70,26,16,252,196,236,50,196,49,0,16,228,244,236,196,212,204,16,244,236,17,18,57,48,180,80,27,159,27,2,1,93,1,46,1,35, + 34,6,21,17,20,22,59,1,21,35,34,38,53,17,51,21,62,1,51,50,22,23,3,74,31,73,44,157,167,76,105,233,254,181,163,185,58,186,133,19, + 46,28,3,180,18,17,203,190,253,158,153,97,156,192,214,4,116,174,102,99,5,5,0,0,0,1,0,132,0,0,3,126,4,123,0,15,0,37,64,7, + 2,12,0,8,5,7,16,16,220,204,236,50,204,49,0,64,10,0,7,12,135,11,188,1,6,135,4,47,236,50,252,236,57,57,48,1,17,51,21,33, + 53,51,17,52,54,59,1,21,35,34,6,1,224,164,254,0,164,163,181,254,233,105,76,2,229,253,191,164,164,2,65,214,192,156,97,0,0,1,0,116, + 0,0,3,126,4,123,0,15,0,37,64,7,2,0,8,12,5,7,16,16,220,204,204,252,204,49,0,64,10,0,7,10,135,13,188,1,6,135,4,47, + 236,50,252,236,57,57,48,1,17,51,21,33,53,51,17,52,38,43,1,53,51,50,22,2,202,180,253,240,164,76,105,233,254,181,163,2,229,253,191,164, + 164,2,65,153,97,156,192,0,0,2,0,186,0,0,4,151,4,96,0,19,0,28,0,176,64,52,9,8,7,3,10,6,17,3,4,3,5,17,4,4, + 3,66,6,4,0,21,3,4,21,169,9,20,169,13,188,11,4,5,6,3,17,9,0,28,22,14,5,10,25,18,4,17,20,10,8,12,70,29,16,252, + 236,50,220,196,236,17,23,57,17,57,57,57,49,0,47,60,244,236,212,236,18,57,18,57,18,57,48,75,83,88,7,16,5,237,7,16,5,237,17,23, + 57,89,34,178,64,30,1,1,93,64,66,122,19,1,5,0,5,1,5,2,6,3,7,4,21,0,21,1,20,2,22,3,23,4,37,0,37,1,37,2, + 38,3,39,6,38,7,38,8,38,9,32,30,54,1,54,2,70,1,70,2,104,5,117,4,117,5,119,19,136,6,136,7,152,6,152,7,31,93,0,93, + 1,30,1,23,19,35,3,46,1,43,1,17,35,17,33,50,22,21,20,6,1,17,51,50,54,53,52,38,35,3,20,48,115,50,174,195,162,74,123,81, + 169,185,1,132,218,214,112,253,245,198,119,127,117,129,2,13,10,116,93,254,206,1,31,128,58,254,39,4,96,158,165,105,140,1,157,254,175,86,78,77, + 96,0,0,0,0,2,0,186,0,0,4,151,4,96,0,19,0,28,0,69,64,21,9,7,6,15,3,12,28,22,18,5,2,25,18,8,15,1,20,8, + 0,70,29,16,252,236,50,220,196,236,17,23,57,17,57,57,57,49,0,64,15,6,8,12,20,9,8,3,169,20,21,169,8,0,188,19,47,228,50,236, + 212,236,17,57,17,57,17,57,48,19,51,17,51,50,54,55,19,51,3,14,1,7,30,1,21,20,6,35,33,19,17,51,50,54,53,52,38,35,186,185, + 169,81,123,74,162,195,174,50,115,48,106,112,214,218,254,124,185,198,129,117,127,119,4,96,254,39,58,128,1,31,254,206,93,116,10,27,140,105,165,158, + 1,236,254,175,96,77,78,86,0,1,0,111,254,86,3,199,4,123,0,48,0,128,64,67,13,12,2,14,11,83,40,39,8,9,2,7,10,83,39,40, + 39,66,25,169,26,189,49,10,11,39,40,4,31,0,134,1,137,4,31,137,33,185,17,4,185,46,184,17,140,49,26,21,8,30,39,10,11,40,36,7, + 0,82,36,8,14,7,8,30,43,69,49,16,252,196,236,212,236,228,17,18,57,57,57,57,16,236,204,49,0,16,228,244,236,16,254,245,16,245,238,18, + 23,57,16,252,236,48,75,83,88,7,16,14,237,17,23,57,7,14,237,17,23,57,89,34,178,0,48,1,1,93,1,21,46,1,35,34,6,21,20,22, + 31,1,30,1,21,20,6,35,34,47,1,21,20,22,59,1,21,35,34,38,61,1,22,51,50,54,53,52,38,47,1,46,1,53,52,54,51,50,22,3, + 139,78,168,90,137,137,98,148,63,196,165,247,216,100,88,21,76,105,233,254,181,163,204,193,130,140,101,171,64,171,152,224,206,102,180,4,63,174,40,40, + 84,84,64,73,33,14,42,153,137,156,182,17,4,12,153,97,156,192,214,251,106,89,81,75,80,37,15,36,149,130,158,172,30,0,0,0,0,1,255,217, + 254,86,2,215,6,20,0,19,0,52,64,13,17,20,14,15,79,5,11,10,8,1,0,70,20,16,252,60,236,50,50,228,57,18,57,49,0,64,13,16, + 135,15,189,20,10,1,6,6,135,5,151,20,16,252,236,18,57,57,16,244,236,48,23,17,52,54,59,1,21,35,34,6,21,17,20,6,43,1,53,51, + 50,54,190,174,189,174,176,99,77,163,181,70,49,105,75,20,4,194,187,171,153,80,104,251,41,214,192,156,97,0,0,0,0,1,255,217,254,86,2,215, + 6,20,0,32,0,79,64,18,13,32,28,1,22,33,19,20,79,5,16,10,8,25,30,1,70,33,16,252,60,60,236,50,50,228,57,18,57,16,204,50, + 196,49,0,64,23,30,169,0,188,33,12,28,169,15,27,21,135,20,189,33,10,1,6,6,135,5,151,33,16,252,236,18,57,57,16,244,236,212,60,236, + 50,16,244,236,48,19,53,52,54,59,1,21,35,34,6,21,17,23,51,21,35,17,20,6,43,1,53,51,50,54,53,17,35,53,51,17,35,53,190,174, + 189,174,176,99,77,1,162,163,163,181,70,49,105,75,180,180,175,4,96,78,187,171,153,80,104,253,168,3,164,254,40,214,192,156,97,153,1,216,164,1, + 105,143,0,0,0,1,0,55,254,86,3,53,4,101,0,19,0,34,182,15,79,11,8,1,6,20,16,212,220,252,236,49,0,64,10,14,135,16,189,20, + 4,135,6,188,20,16,244,236,16,244,236,48,5,17,52,38,43,1,53,51,50,22,21,17,20,22,59,1,21,35,34,38,1,151,77,99,176,174,189,174, + 75,105,49,70,181,163,20,3,40,104,80,153,171,187,252,237,153,97,156,192,0,2,254,242,254,86,2,215,6,20,0,22,0,31,0,50,64,12,26,9, + 13,2,17,3,22,8,23,13,79,32,16,252,50,252,50,204,204,16,212,204,49,0,64,12,28,7,3,24,135,0,19,135,17,151,11,0,47,60,244,236, + 16,236,50,212,204,48,33,51,21,35,6,7,6,35,32,53,52,33,51,17,52,54,59,1,21,35,34,6,21,3,35,34,23,22,51,50,55,54,1,119, + 183,191,18,53,82,181,254,209,1,14,190,174,189,174,176,99,77,195,179,119,3,3,124,110,33,17,155,111,64,96,216,210,4,174,187,171,153,80,104,250, + 163,51,65,48,24,0,0,0,0,1,0,55,254,192,2,242,4,94,0,19,0,51,64,9,8,11,14,18,8,5,1,9,2,47,60,212,60,236,50,57, + 57,49,0,64,12,14,5,0,8,169,11,188,15,3,169,18,2,47,60,236,50,244,236,196,57,57,48,1,178,175,21,1,93,1,17,33,53,33,17,52, + 38,43,1,53,51,50,22,21,17,51,21,35,17,1,178,254,133,1,123,75,115,189,189,213,162,135,135,254,192,1,62,143,2,96,137,78,154,159,210,253, + 160,143,254,194,0,1,0,55,254,86,2,246,5,158,0,19,0,61,64,28,14,5,8,15,3,169,0,17,1,188,20,8,135,11,189,20,11,8,9,2, + 4,0,8,16,18,14,70,20,16,252,60,196,252,60,196,50,57,57,49,0,16,252,236,16,244,60,196,236,50,17,57,57,48,178,175,21,1,1,93,1, + 17,33,21,33,17,20,22,59,1,21,35,34,38,53,17,35,53,51,17,1,119,1,123,254,133,76,105,202,224,181,163,135,135,5,158,254,194,143,252,27, + 153,97,156,192,214,3,229,143,1,62,0,0,0,2,0,0,255,227,5,18,4,96,0,22,0,30,0,67,64,31,13,1,28,135,16,0,7,4,169,10, + 20,23,13,16,140,5,1,188,11,23,12,4,8,6,78,24,2,8,0,70,31,16,252,236,50,244,236,50,50,49,0,47,228,50,244,196,220,50,50,236, + 50,50,16,252,17,18,48,180,96,32,207,32,2,1,93,19,17,51,17,33,17,51,17,51,21,35,17,35,53,14,1,35,34,38,61,1,35,53,5,33, + 21,20,22,51,50,54,174,184,2,58,184,186,186,184,67,177,117,193,200,174,3,159,253,199,124,124,143,178,2,104,1,248,254,8,1,248,254,8,164,254, + 60,172,102,99,240,231,10,164,165,2,159,159,186,0,0,0,0,1,0,113,255,226,4,132,4,96,0,31,0,83,64,13,29,26,18,33,0,4,17,20, + 18,14,10,4,32,16,252,196,252,196,212,196,204,252,196,49,0,64,14,17,29,13,1,169,30,16,188,32,23,185,7,140,32,16,244,236,16,252,60,236, + 50,50,50,48,1,64,25,224,17,224,16,239,29,239,30,208,17,208,16,223,29,223,30,64,17,64,16,79,29,79,30,12,93,1,35,30,1,21,20,0, + 35,34,0,53,52,54,55,35,53,33,21,14,1,21,20,22,51,50,54,53,52,38,39,55,33,4,132,236,97,127,254,228,225,225,254,228,127,97,237,1, + 186,102,136,176,144,144,176,136,102,1,1,180,3,188,72,235,152,235,254,220,1,36,235,152,235,72,164,220,66,215,139,159,194,194,159,139,215,66,220,0, + 0,1,0,193,0,0,4,92,4,98,0,30,0,44,64,12,32,0,18,20,25,5,16,12,8,9,70,31,16,252,252,196,196,196,212,236,57,49,0,64, + 10,17,185,4,24,185,25,184,11,188,4,47,236,244,236,16,236,48,1,20,7,6,43,1,34,39,38,53,17,51,17,20,23,22,55,51,50,54,53,52, + 39,38,39,53,22,23,22,23,22,4,92,142,145,222,70,181,82,81,184,38,40,103,51,144,176,74,73,110,104,88,167,51,34,2,15,238,143,146,96,96, + 214,2,202,253,54,153,49,50,2,196,158,232,101,99,30,150,8,48,91,171,115,0,0,0,0,1,0,61,0,0,4,127,4,96,0,6,0,104,64,39, + 4,17,3,3,2,5,17,6,5,2,2,3,5,17,5,4,1,0,1,6,17,0,1,0,66,5,2,1,191,3,6,5,4,2,1,5,3,0,7,16, + 212,75,176,10,84,88,185,0,0,0,64,56,89,75,176,20,84,75,176,21,84,91,88,185,0,0,255,192,56,89,196,23,57,49,0,47,236,50,57,48, + 75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,89,34,1,51,1,51,1,35,9,1,61,1,164,250,1,164,195,254,162,254,162, + 4,96,251,160,3,172,252,84,0,1,0,86,0,0,6,53,4,96,0,12,1,239,64,15,8,9,10,11,12,1,2,3,4,5,6,11,0,7,13,16, + 212,75,176,10,84,75,176,17,84,91,75,176,18,84,91,75,176,19,84,91,75,176,11,84,91,88,185,0,7,0,64,56,89,1,75,176,12,84,75,176, + 13,84,91,75,176,16,84,91,88,185,0,7,255,192,56,89,204,23,57,49,64,10,10,5,2,3,12,8,191,7,3,0,0,47,60,60,236,50,23,57, + 48,64,48,2,85,1,2,11,10,11,3,85,10,11,4,85,10,9,10,5,85,6,5,9,9,10,1,17,0,12,0,2,17,3,2,12,12,0,5,17, + 4,5,8,7,8,6,17,7,7,8,66,75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,7,16,8,237,7,16,5,237,7,5, + 237,7,16,8,237,89,34,1,64,255,10,5,25,5,25,2,45,10,58,10,70,5,70,2,73,10,79,10,84,5,84,2,90,10,95,10,97,5,97,2, + 105,10,118,5,112,5,118,2,112,2,136,5,150,5,151,2,155,10,179,5,179,2,193,5,200,4,192,2,29,5,5,9,4,6,3,11,2,10,12,11, + 11,4,9,5,8,21,5,25,4,22,3,26,2,27,12,27,11,20,9,21,8,37,7,37,6,35,5,39,4,33,3,37,2,34,1,34,0,37,12,39, + 11,36,10,33,9,35,8,57,4,54,3,54,12,57,8,48,14,70,5,72,4,70,3,64,3,66,2,64,1,64,0,64,12,68,11,68,10,68,9,64, + 14,64,14,86,7,86,6,86,5,80,3,81,2,82,1,82,0,80,12,83,11,84,10,85,9,99,7,100,6,101,5,106,4,101,3,106,2,106,1,106, + 0,110,11,97,9,103,8,111,14,117,7,117,6,121,5,125,4,120,3,125,2,122,1,127,1,122,0,127,0,120,12,121,11,127,11,123,10,118,9,125, + 8,135,5,136,2,143,14,151,7,151,6,148,5,147,4,156,3,155,2,152,1,152,0,153,12,64,47,150,8,159,14,166,7,166,6,164,5,164,4,171, + 3,171,2,169,1,169,0,171,12,164,8,175,14,181,5,177,4,189,3,187,2,184,11,191,14,196,5,195,4,204,3,202,2,121,93,0,93,33,35,11, + 1,35,11,1,35,1,51,27,1,51,6,53,184,230,229,217,230,229,184,1,37,217,241,242,217,3,106,252,150,3,106,252,150,4,96,252,106,3,150,0, + 0,1,0,61,0,0,4,127,6,20,0,17,0,70,180,19,6,14,0,18,16,212,212,196,196,49,181,7,169,6,151,14,0,0,47,60,244,236,48,183, + 16,13,12,17,17,0,1,0,7,5,16,252,60,60,60,182,8,9,10,11,4,7,12,1,17,18,23,57,64,9,16,17,17,12,15,17,14,14,13,7, + 16,236,8,236,51,1,54,55,54,59,1,21,35,34,7,6,15,1,1,35,9,1,61,1,236,80,72,74,124,147,108,76,42,46,47,33,1,197,195,254, + 161,254,163,4,210,199,62,61,154,36,35,135,94,251,178,3,108,252,148,0,0,1,0,102,0,0,4,107,4,96,0,8,0,56,64,10,2,8,5,10, + 4,5,8,8,0,9,16,212,220,252,212,196,17,18,57,49,179,4,0,188,7,0,47,228,50,48,64,12,3,17,4,5,4,2,17,1,17,0,8,0, + 7,5,16,236,4,236,7,5,16,236,19,51,9,1,51,1,17,35,17,102,217,1,37,1,46,217,254,93,203,4,96,254,56,1,200,253,144,254,16,1, + 240,0,0,0,0,1,0,88,254,86,4,191,4,96,0,19,0,170,64,34,18,17,2,3,2,3,17,17,18,17,66,9,169,10,189,15,18,169,0,188, + 3,169,15,10,79,4,18,3,1,0,4,1,16,20,16,220,75,176,11,84,75,176,12,84,91,88,185,0,16,255,192,56,89,75,176,19,84,88,185,0, + 16,0,64,56,89,196,50,196,17,57,57,16,236,49,0,47,236,244,236,16,252,236,48,75,83,88,7,16,5,237,7,16,5,237,89,34,1,64,66,5, + 2,22,2,38,2,71,2,73,17,5,11,18,15,21,24,3,27,18,43,18,32,21,54,3,57,18,48,21,64,1,64,2,69,3,64,4,64,15,67,18, + 87,3,89,18,95,21,96,1,96,2,102,3,96,4,96,5,98,18,127,21,128,21,175,21,27,93,0,93,19,33,21,1,33,21,20,22,59,1,21,35, + 34,38,61,1,33,53,1,33,113,3,106,253,76,2,180,76,105,47,70,181,163,253,55,2,180,253,101,4,96,168,252,219,167,153,97,156,192,214,20,168, + 3,37,0,0,0,2,0,88,255,145,3,219,4,96,0,26,0,33,0,177,64,17,22,4,18,17,27,30,18,12,25,3,1,0,12,1,1,23,34,16, + 220,75,84,75,176,12,84,91,88,185,0,23,255,192,56,89,75,176,19,84,88,185,0,23,0,64,56,89,196,50,196,17,57,57,16,236,220,60,236,50, + 49,0,64,13,25,169,0,188,19,23,8,185,32,3,27,169,23,47,252,60,220,236,16,204,244,236,48,64,11,25,17,2,3,2,3,17,24,25,24,66, + 75,83,88,7,16,5,237,7,16,5,237,89,34,1,64,58,5,2,22,2,38,2,71,2,73,24,5,11,25,15,35,24,3,27,25,43,25,32,35,54, + 3,57,25,48,35,64,1,64,2,69,3,67,25,87,3,89,25,95,35,96,1,96,2,102,3,98,25,127,35,128,35,175,35,23,93,0,93,19,33,21, + 1,51,54,55,54,51,50,23,22,21,22,7,6,43,1,6,21,35,52,55,33,53,1,33,1,51,50,53,52,7,6,113,3,106,253,76,175,34,84,65, + 96,132,58,38,1,62,82,126,105,3,153,3,254,150,2,180,253,101,1,255,56,138,70,88,4,96,168,252,219,162,71,55,87,57,87,96,47,61,51,60, + 59,52,168,3,37,252,198,54,93,2,2,0,0,1,0,88,254,76,4,47,4,96,0,32,0,169,64,10,27,31,21,18,34,6,30,31,14,33,16,220, + 212,196,212,196,236,16,204,178,0,31,27,17,18,57,49,64,22,27,66,0,169,26,26,30,33,29,169,30,14,134,13,147,17,185,9,189,30,188,33,0, + 16,228,252,236,244,236,16,236,17,18,57,47,236,236,179,21,6,0,9,17,18,57,57,48,64,8,27,17,0,28,17,32,26,31,7,5,16,236,4,16, + 236,64,27,12,28,10,0,27,28,25,0,42,28,42,0,56,0,59,28,73,0,76,28,84,0,91,28,113,0,13,1,93,64,27,4,27,4,32,20,27, + 20,32,37,27,36,32,53,32,55,27,69,32,70,27,84,32,92,27,127,27,13,0,93,64,9,7,11,6,12,26,12,26,15,4,93,1,50,23,22,23, + 22,21,20,4,33,34,39,38,39,53,30,1,51,50,55,54,53,52,39,38,43,1,53,1,33,53,33,21,2,60,106,128,98,86,81,254,208,254,232,94, + 99,100,106,84,200,109,190,99,100,92,93,165,174,1,174,253,101,3,106,1,220,56,42,109,104,138,221,242,18,19,37,195,49,50,75,75,143,132,75,74, + 166,1,243,147,168,0,0,0,0,2,0,109,254,76,4,108,4,96,0,36,0,45,0,0,1,32,55,54,5,22,23,54,53,52,39,38,43,1,53,1, + 33,53,33,21,1,50,23,22,23,22,21,20,7,22,21,35,52,39,48,7,6,55,38,35,34,7,20,51,50,55,1,231,254,177,2,2,1,42,246,158, + 12,92,94,164,174,1,174,253,101,3,106,254,101,105,129,100,84,81,39,100,153,40,20,151,9,125,197,131,1,158,190,99,254,76,189,251,5,4,59,42, + 49,133,74,74,166,1,243,147,168,254,36,56,43,108,103,139,113,85,101,164,82,56,17,121,250,42,75,47,75,0,0,0,0,1,0,88,0,0,3,165, + 6,18,0,28,0,52,64,9,30,5,18,22,26,8,0,13,29,16,220,220,252,220,236,196,49,64,14,13,134,14,12,18,9,185,18,151,27,26,169,0, + 27,0,47,212,228,16,244,236,16,75,80,88,220,27,212,89,236,48,1,51,50,55,54,53,38,39,38,35,34,7,6,7,53,54,55,54,51,32,23,22, + 21,20,7,6,7,17,35,1,84,63,192,86,58,1,57,99,179,80,79,78,78,76,81,81,85,1,19,138,109,108,112,170,202,3,30,114,76,98,133,65, + 114,22,21,43,172,35,17,18,157,125,186,170,115,119,30,253,116,0,0,0,0,1,0,88,0,0,3,165,6,18,0,28,0,53,64,10,30,16,0,8, + 3,24,18,7,69,29,16,252,236,220,252,220,196,49,64,14,16,134,15,12,11,20,185,11,151,2,3,169,0,2,0,47,212,228,16,244,236,16,75,80, + 88,220,27,212,89,236,48,1,17,35,17,38,39,38,53,52,55,54,33,50,23,22,23,21,38,39,38,35,34,7,6,7,20,23,22,51,2,168,202,170, + 112,108,110,137,1,19,85,81,81,76,78,79,78,80,179,99,57,1,58,86,192,3,30,252,226,2,140,30,119,115,170,186,125,157,18,17,35,172,43,21, + 22,114,65,133,98,76,114,0,0,1,0,88,0,0,3,165,6,18,0,28,0,55,64,9,30,24,18,7,3,8,0,16,29,16,220,220,252,220,236,196, + 49,64,16,16,134,15,12,11,20,185,11,140,29,3,169,0,1,151,29,0,16,244,212,228,16,244,236,16,75,80,88,220,27,212,89,236,48,1,19,51, + 17,22,23,22,21,20,7,6,33,34,39,38,39,53,22,23,22,51,50,55,54,55,52,39,38,35,1,84,1,202,170,112,108,109,138,254,237,85,81,81, + 76,78,78,79,80,179,99,57,1,58,86,192,2,244,3,30,253,116,30,119,115,170,186,125,157,18,17,35,172,43,21,22,114,65,133,98,76,114,0,0, + 0,1,0,88,254,76,3,165,6,20,0,35,0,45,182,37,26,8,18,18,0,36,16,220,236,220,50,204,49,0,64,16,9,135,8,13,135,4,151,36, + 26,135,27,22,135,31,189,36,16,252,236,212,236,16,244,236,212,236,48,19,52,55,54,33,50,23,22,23,21,38,39,38,35,34,7,6,21,17,20,23, + 22,51,50,55,54,55,21,6,7,6,35,32,39,38,53,88,110,137,1,19,85,81,81,76,73,84,78,80,176,102,58,58,102,176,80,78,79,78,76,81, + 81,85,254,237,137,110,4,64,186,125,157,18,17,35,172,40,24,22,114,65,133,251,224,133,65,114,22,21,43,172,35,17,18,157,125,186,0,3,0,115, + 255,227,5,217,5,240,0,13,0,23,0,34,0,0,1,52,55,54,51,50,23,22,21,20,6,34,39,38,0,32,0,17,16,0,32,0,17,16,1,32, + 0,17,16,0,33,32,0,16,0,2,181,34,32,48,46,34,32,66,94,32,34,1,78,254,72,254,253,1,3,1,184,1,1,254,35,1,58,1,120,254, + 136,254,198,254,197,254,135,1,121,2,233,46,34,34,34,34,46,47,66,33,33,2,146,254,184,254,229,254,230,254,184,1,72,1,26,1,27,1,236,254, + 91,254,158,254,159,254,91,1,164,2,196,1,165,0,0,0,255,255,0,186,0,0,4,62,4,96,16,6,3,198,0,0,0,2,0,113,255,227,4,197, + 4,124,0,26,0,47,0,61,64,14,49,23,18,31,9,37,4,18,44,15,18,37,69,48,16,252,236,212,236,16,196,212,236,196,49,64,14,0,185,27, + 184,48,10,169,9,48,19,185,34,140,48,0,16,244,236,16,212,236,16,244,236,178,40,10,9,17,18,57,48,1,34,7,6,21,20,23,22,59,1,21, + 35,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,37,32,23,22,17,16,0,33,34,36,53,52,54,55,38,39,38,53,52,55,54,2,69,119, + 69,70,68,67,116,155,148,137,72,78,84,85,151,210,104,99,99,96,254,246,1,97,151,151,254,214,254,198,238,254,254,138,124,112,60,60,114,113,3,220, + 46,46,64,70,45,44,152,51,56,88,90,56,56,116,111,208,205,114,110,160,158,157,254,238,254,242,254,194,182,173,108,146,24,24,65,64,93,141,79,78, + 0,1,0,113,255,227,5,203,6,20,0,39,0,71,64,39,18,27,17,28,24,169,21,151,40,0,5,37,1,169,3,37,185,8,17,28,136,31,185,14, + 184,8,140,40,2,0,8,27,52,4,34,18,11,69,40,16,252,236,220,228,252,196,49,0,16,228,244,252,236,57,16,254,212,238,17,57,57,16,252,236, + 17,18,57,57,48,37,17,35,53,33,17,14,1,35,34,0,17,16,0,33,50,22,23,53,52,54,59,1,21,35,34,6,21,17,46,1,35,34,6,21, + 20,22,51,50,54,3,169,155,1,65,101,215,123,253,254,214,1,45,1,6,55,105,49,163,181,254,231,105,77,95,192,99,179,198,198,179,79,124,158,1, + 17,140,253,240,36,36,1,62,1,14,1,18,1,58,15,15,33,214,192,156,97,153,254,229,62,62,227,205,205,227,15,0,255,255,0,186,0,0,4,129, + 4,96,16,6,3,209,0,0,0,3,254,242,254,86,2,46,6,20,0,3,0,18,0,27,0,57,64,17,9,19,5,4,22,18,15,4,29,7,1,5, + 8,0,4,70,28,16,252,60,252,60,220,196,16,220,236,17,18,57,57,49,64,11,24,13,189,4,188,0,177,9,19,6,18,0,47,60,204,50,228,228, + 252,196,48,19,51,21,35,21,51,17,51,21,35,6,7,6,35,32,53,52,33,51,7,35,34,23,20,51,50,55,54,193,184,184,184,181,189,18,55,75, + 188,254,209,1,14,193,8,184,117,1,127,95,43,29,6,20,233,203,251,160,139,120,71,96,221,205,139,66,65,48,32,0,0,1,0,186,254,76,4,156, + 4,96,0,10,0,0,1,35,17,1,35,9,1,51,1,17,51,4,156,185,253,219,235,2,82,253,149,240,2,57,185,254,76,3,151,254,29,2,12,2, + 84,253,221,2,35,0,0,0,0,1,0,186,0,0,3,241,4,96,0,5,0,27,64,13,0,191,3,169,6,5,7,3,1,8,0,70,6,16,252,252, + 204,196,49,0,47,16,236,236,48,19,51,17,33,21,33,186,184,2,127,252,201,4,96,252,51,147,0,0,0,2,0,113,254,86,5,248,6,18,0,11, + 0,36,0,67,64,30,3,185,12,15,9,185,24,21,184,15,140,35,189,37,31,135,28,151,37,24,12,6,8,34,71,0,18,18,69,37,16,252,236,244, + 236,50,50,49,0,16,252,236,16,228,228,244,196,236,16,198,238,48,64,9,96,38,128,38,160,38,224,38,4,1,93,1,20,22,51,50,54,53,52,38, + 35,34,6,1,14,1,35,34,2,17,16,0,51,50,22,23,53,52,54,59,1,21,35,34,6,21,17,35,1,47,167,146,146,168,168,146,146,167,2,115, + 58,177,124,203,255,0,255,203,124,177,58,163,181,254,231,105,77,185,2,47,203,231,231,203,203,231,231,253,174,100,97,1,68,1,8,1,8,1,68,97, + 100,198,214,192,156,97,153,249,218,0,0,0,0,1,0,88,0,0,3,165,6,18,0,36,0,76,64,11,38,5,18,22,31,26,8,32,0,14,37,16, + 220,220,60,252,60,220,236,196,179,28,26,35,0,16,204,16,204,49,64,20,13,134,14,12,18,36,27,169,33,30,31,9,185,18,151,31,26,169,0,31, + 0,47,212,228,16,244,236,16,220,60,236,50,16,75,80,88,220,27,212,89,236,48,1,51,50,55,54,53,38,39,38,35,34,7,6,7,53,54,55,54, + 51,32,23,22,21,20,7,6,7,21,51,21,35,17,35,17,35,53,51,1,84,63,192,86,58,1,57,99,179,80,79,78,78,76,81,81,85,1,19,138, + 109,108,112,170,231,231,202,229,228,3,30,114,76,98,133,65,114,22,21,43,172,35,17,18,157,125,186,170,115,119,30,212,164,254,236,1,20,164,0,0, + 0,1,0,88,0,0,3,165,6,18,0,36,0,77,64,12,38,16,34,29,8,35,3,24,18,7,69,37,16,252,236,220,60,252,60,220,196,179,32,34, + 0,35,16,204,16,204,49,64,20,16,134,15,12,11,2,30,169,36,33,35,20,185,11,151,35,3,169,29,35,0,47,212,228,16,244,236,16,220,60,236, + 50,16,75,80,88,220,27,212,89,236,48,19,53,51,53,38,39,38,53,52,55,54,33,50,23,22,23,21,38,39,38,35,34,7,6,7,20,23,22,59, + 1,17,51,21,35,17,35,17,247,231,170,112,108,110,137,1,19,85,81,81,76,78,79,78,80,179,99,57,1,58,86,192,62,229,229,202,1,20,164,212, + 30,119,115,170,186,125,157,18,17,35,172,43,21,22,114,65,133,98,76,114,254,154,164,254,236,1,20,0,0,3,0,113,255,227,7,195,6,20,0,11, + 0,38,0,41,0,0,0,16,23,22,32,55,54,16,39,38,32,7,37,17,51,17,33,21,1,33,21,33,43,1,53,6,7,6,35,34,39,38,16,55, + 54,51,50,23,22,23,17,1,1,47,83,84,1,36,84,84,84,84,254,220,84,2,32,184,3,105,253,76,2,180,252,151,26,158,58,88,89,124,203,128, + 127,127,128,203,124,89,88,242,2,154,2,250,254,106,116,115,115,116,1,150,116,115,115,72,2,94,254,76,168,252,219,147,168,100,48,49,162,162,2,16, + 162,162,49,48,77,252,249,3,7,0,0,0,0,2,0,113,254,76,8,28,6,20,0,52,0,64,0,0,1,17,35,53,6,7,6,35,34,39,38,16, + 55,54,51,50,23,22,23,17,51,17,33,21,1,50,23,22,23,22,21,20,4,33,34,39,38,39,53,30,1,51,50,55,54,53,52,39,38,43,1,53, + 1,4,16,23,22,32,55,54,16,39,38,32,7,4,90,184,58,88,89,124,203,128,127,127,128,203,124,89,88,58,184,3,106,254,101,106,128,98,86,81, + 254,208,254,232,94,99,100,106,84,200,109,190,99,100,92,93,165,174,1,174,250,58,83,84,1,36,84,84,84,84,254,220,84,3,205,252,51,168,100,48, + 49,162,162,2,16,162,162,49,48,100,2,94,254,76,168,254,36,56,42,109,104,138,221,242,18,19,37,195,49,50,75,75,143,132,75,74,166,1,243,211, + 254,106,116,115,115,116,1,150,116,115,115,0,0,4,0,113,255,145,7,194,6,20,0,11,0,14,0,51,0,58,0,0,0,16,23,22,32,55,54,16, + 39,38,32,7,37,17,1,37,33,21,1,51,18,51,50,23,22,33,35,6,21,35,52,55,33,35,53,6,7,6,35,34,39,38,16,55,54,51,50,23, + 22,23,17,51,1,51,50,53,52,35,6,1,47,83,84,1,36,84,84,84,84,254,220,84,2,216,2,153,253,103,3,104,253,76,175,60,219,227,1,1, + 254,178,41,3,153,3,254,150,157,58,88,89,124,203,128,127,127,128,203,124,89,88,58,184,1,253,20,174,70,88,2,250,254,106,116,115,115,116,1,150, + 116,115,115,95,252,250,3,6,147,168,252,219,1,32,246,189,51,60,59,52,168,100,48,49,162,162,2,16,162,162,49,48,100,2,94,250,127,54,91,2, + 0,1,0,55,0,0,6,64,5,158,0,55,0,0,1,17,33,21,33,17,20,23,22,51,33,50,55,54,53,52,38,47,1,46,1,53,52,54,51,50, + 22,23,21,46,1,35,34,6,21,20,22,31,1,30,1,21,20,7,6,41,1,34,39,38,53,17,35,53,51,17,1,119,1,123,254,133,37,38,115,2, + 64,130,70,70,94,178,64,171,152,224,206,102,180,76,78,168,90,137,137,98,148,63,198,163,124,76,254,249,253,196,213,81,81,135,135,5,158,254,194,143, + 253,160,137,39,39,45,44,52,73,77,42,15,36,149,130,158,172,30,30,174,40,40,84,84,64,73,33,14,44,151,137,146,101,62,80,79,210,2,96,143, + 1,62,0,0,0,2,0,55,254,86,5,8,6,20,0,38,0,47,0,0,1,17,33,48,53,52,55,54,59,1,21,35,34,7,6,21,19,20,7,6, + 43,1,53,51,50,55,54,61,1,35,34,39,38,53,17,35,53,51,17,1,2,17,33,17,20,23,22,51,1,119,1,120,87,81,195,174,176,99,38,39, + 2,81,82,181,70,49,105,38,38,189,213,81,81,135,135,2,51,2,254,136,37,38,115,5,158,254,194,78,181,91,86,153,40,40,104,251,41,214,96,96, + 156,48,49,153,20,80,79,210,2,96,143,1,62,250,252,1,162,1,149,253,160,137,39,39,0,3,0,55,255,112,5,201,5,158,0,45,0,57,0,68, + 0,0,1,17,33,21,54,33,50,23,22,23,21,38,39,38,35,34,7,6,16,31,1,54,51,32,23,20,7,6,35,34,39,6,21,7,52,55,33,34, + 39,38,53,17,35,53,51,17,1,22,51,50,55,54,39,38,35,34,7,6,5,38,53,16,55,33,17,20,23,22,51,1,119,1,123,149,0,255,85,81, + 81,76,78,79,78,80,179,99,99,99,8,79,206,1,43,1,101,75,157,84,73,2,153,6,254,235,213,81,81,135,135,3,59,66,83,95,21,31,1,1, + 131,114,40,5,254,214,128,139,254,153,37,38,115,5,158,254,194,122,149,17,18,35,172,43,22,21,113,114,254,102,114,9,171,246,118,41,30,18,50,76, + 3,79,65,80,79,210,2,96,143,1,62,250,249,24,7,11,39,75,86,10,9,157,248,1,7,155,253,160,137,39,39,0,0,1,0,47,254,86,6,111, + 6,20,0,53,0,0,1,17,20,7,6,43,1,53,51,50,55,54,53,17,52,38,35,34,6,21,17,35,17,33,17,35,17,35,53,51,53,52,55,54, + 59,1,21,35,34,7,6,29,1,33,59,1,21,54,55,54,51,50,23,22,6,111,82,81,181,254,233,105,38,38,124,124,149,172,185,254,211,185,176,176, + 87,87,189,174,176,99,39,38,1,45,2,183,66,89,90,117,193,99,99,2,164,253,72,214,96,96,156,48,49,153,2,178,159,158,190,164,253,135,3,209, + 252,47,3,209,143,78,187,85,86,153,40,40,104,99,174,101,50,50,119,120,0,1,0,193,0,0,5,65,6,20,0,39,0,0,19,51,17,33,50,55, + 54,53,52,38,47,1,46,1,53,52,54,51,50,22,23,21,46,1,35,34,6,21,20,22,31,1,30,1,21,20,7,6,41,1,193,184,1,253,130,70, + 70,94,178,64,171,152,224,206,102,180,76,78,168,90,137,137,98,148,63,198,163,124,76,254,249,253,79,6,20,250,134,45,44,52,73,77,42,15,36,149, + 130,158,172,30,30,174,40,40,84,84,64,73,33,14,44,151,137,146,101,62,0,2,0,193,0,0,4,226,6,20,0,10,0,13,0,142,64,13,13,5, + 3,11,6,3,9,11,1,8,0,70,14,16,252,252,60,212,196,50,17,18,57,57,49,0,64,10,66,13,169,2,188,5,169,0,151,7,47,236,236,244, + 236,48,75,83,88,64,10,5,17,12,13,12,13,17,4,5,4,7,16,5,237,7,16,5,237,89,1,64,66,5,4,22,4,27,12,38,4,71,4,73, + 12,6,13,13,15,15,24,5,29,13,43,13,48,15,57,13,64,3,64,4,64,6,64,7,64,15,67,13,69,5,87,5,89,13,96,3,96,4,96,6, + 96,7,96,15,98,13,102,5,175,15,191,15,223,15,26,93,0,93,19,51,17,33,21,1,33,21,33,43,1,19,17,1,193,184,3,105,253,76,2,180, + 252,151,26,158,184,2,154,6,20,254,76,168,252,219,147,3,205,252,249,3,7,0,0,0,0,2,0,54,255,226,3,233,5,31,0,12,0,25,0,0, + 19,51,27,1,51,27,1,51,3,35,11,1,35,3,51,27,1,51,27,1,51,3,35,11,1,35,54,116,145,144,137,145,144,116,185,136,152,153,136,185, + 116,145,144,137,145,144,116,185,136,152,153,136,2,85,254,23,1,233,254,23,1,233,253,141,2,2,253,254,5,61,254,23,1,233,254,23,1,233,253,141, + 2,2,253,254,0,2,0,54,0,173,3,233,5,31,0,7,0,15,0,51,64,12,17,12,4,8,9,1,13,5,8,8,0,16,16,220,60,236,50,212, + 60,236,50,196,49,64,12,11,14,13,169,8,16,3,6,5,169,0,16,0,16,212,252,204,50,16,212,252,204,50,48,19,33,17,35,17,33,17,35,17, + 33,17,35,17,33,17,35,54,3,179,143,253,107,143,3,179,143,253,107,143,2,85,254,88,1,5,254,251,4,114,254,88,1,5,254,251,0,1,0,0, + 254,74,4,144,6,20,0,25,0,51,64,12,27,0,22,8,23,78,15,8,5,70,10,26,16,212,252,236,244,236,50,204,49,0,64,15,18,135,0,2, + 140,26,9,135,11,151,22,188,24,189,26,16,236,236,244,236,16,244,204,236,48,37,6,35,34,38,53,17,52,38,43,1,53,51,50,22,21,17,16,51, + 50,54,53,17,51,17,35,3,215,131,231,193,198,76,105,49,70,181,163,248,149,172,185,185,172,201,239,232,2,196,153,97,156,192,214,253,66,254,195,190, + 164,2,121,249,236,0,0,0,0,1,0,0,254,86,5,118,6,20,0,33,0,58,64,13,29,35,0,21,8,23,78,15,8,5,70,10,34,16,212,252, + 236,244,236,50,204,204,49,0,64,18,18,135,0,2,140,34,10,135,11,151,34,28,135,30,189,22,188,34,16,236,252,236,16,244,236,16,244,204,236,48, + 37,6,35,34,38,53,17,52,38,43,1,53,51,50,22,21,17,16,51,50,54,53,17,51,17,6,22,59,1,21,35,34,38,39,3,215,131,231,193,198, + 76,105,49,70,181,163,248,149,172,185,4,80,104,50,70,182,158,5,172,201,239,232,2,196,153,97,156,192,214,253,66,254,195,190,164,2,121,251,142,148, + 102,156,185,221,0,1,0,117,2,156,2,196,6,3,0,19,0,48,64,7,21,0,3,14,10,11,20,16,212,220,60,47,204,204,75,176,13,81,88,177, + 21,64,56,89,49,178,127,21,1,93,0,64,6,6,17,12,2,11,20,16,212,60,196,212,204,48,1,17,35,17,52,38,35,34,6,21,17,35,17,51, + 17,62,1,51,50,22,2,196,116,78,78,94,108,117,117,41,113,74,121,125,4,23,254,133,1,119,89,89,107,92,254,158,3,103,254,171,56,56,134,0, + 0,1,0,117,2,156,2,196,6,3,0,27,0,58,75,176,14,83,88,64,8,29,0,3,16,22,10,11,28,16,212,220,60,204,47,204,204,75,176,13, + 81,88,177,29,64,56,89,49,178,127,29,1,93,0,64,7,6,25,17,15,2,11,28,16,212,60,212,204,212,204,48,89,1,17,35,17,52,38,35,34, + 6,21,17,35,17,52,54,59,1,21,35,34,6,29,1,62,1,51,50,22,2,196,116,78,78,94,108,117,103,114,160,146,66,48,41,113,74,121,125,4, + 23,254,133,1,119,89,89,107,92,254,158,2,132,120,107,87,54,86,114,56,56,134,0,0,0,2,255,233,1,173,0,238,6,3,0,13,0,17,0,35, + 64,7,19,15,1,8,14,0,18,16,220,60,204,220,60,204,49,0,64,7,14,17,0,8,7,0,18,16,212,212,204,16,220,204,48,19,51,17,20,7, + 6,43,1,53,51,50,55,54,53,17,51,21,35,122,116,52,51,114,44,31,66,24,24,116,116,5,15,253,130,120,54,54,88,27,27,86,3,114,130,0, + 0,1,0,117,2,156,2,18,5,30,0,17,0,31,64,5,17,11,7,8,18,16,220,204,0,204,49,0,64,7,0,17,7,3,14,9,8,47,196,212, + 204,16,212,204,48,1,46,1,35,34,6,21,17,35,17,51,21,62,1,51,50,22,23,2,18,19,46,28,98,105,117,117,36,117,84,12,29,18,4,175, + 10,9,113,107,254,182,2,115,97,57,55,2,3,0,0,0,0,1,0,72,2,141,1,228,5,15,0,17,0,27,180,8,6,11,17,18,16,220,220,60, + 204,49,0,181,0,17,3,14,7,9,47,204,212,204,212,204,48,19,30,1,51,50,54,53,17,51,17,35,53,14,1,35,34,38,39,72,19,46,28,98, + 105,116,116,36,117,84,12,29,18,2,252,10,9,113,107,1,74,253,141,97,57,55,2,3,0,1,0,72,1,173,2,117,5,15,0,27,0,39,182,29, + 14,9,6,21,0,28,16,220,220,60,220,220,49,0,64,10,13,15,20,0,27,3,24,8,9,20,47,60,204,212,204,212,204,16,220,204,48,19,30,1, + 51,50,54,53,17,51,17,21,20,22,59,1,21,35,34,38,61,2,14,1,35,34,38,39,72,19,46,28,98,105,116,48,66,31,44,114,103,36,117,84, + 12,29,18,2,252,10,9,113,107,1,74,253,141,11,86,54,88,108,120,11,97,57,55,2,3,0,0,0,0,2,0,32,2,156,2,143,5,15,0,22, + 0,33,0,0,1,30,1,21,20,7,6,43,1,17,51,17,51,50,55,54,63,1,51,7,6,7,6,1,51,50,55,54,53,52,39,38,43,1,1,155, + 67,70,67,68,137,244,116,107,61,37,37,40,102,123,110,33,33,34,254,215,125,75,39,41,41,39,75,125,3,233,15,78,59,91,45,45,2,115,254,247, + 21,20,63,161,171,53,30,30,255,0,23,24,47,46,24,25,0,1,0,54,2,156,3,233,5,15,0,12,0,0,19,51,27,1,51,27,1,51,3,35, + 11,1,35,54,116,145,144,137,145,144,116,185,136,152,153,136,5,15,254,23,1,233,254,23,1,233,253,141,2,2,253,254,0,1,0,38,1,173,2,213, + 5,15,0,17,0,0,1,6,7,6,43,1,53,51,50,55,54,63,1,1,51,27,1,51,1,159,49,47,46,78,93,68,48,26,27,32,21,254,226,123, + 221,220,123,2,98,112,34,35,87,20,20,75,47,2,105,254,22,1,234,0,255,255,0,160,4,116,1,159,6,102,16,6,3,18,0,0,255,255,0,160, + 4,116,3,19,6,102,16,38,3,18,0,0,16,7,3,18,1,116,0,0,255,255,0,174,3,233,1,211,5,213,16,6,10,246,0,0,255,255,0,178, + 3,254,1,215,5,213,16,6,10,247,0,0,0,1,0,196,4,238,1,233,6,218,0,5,0,23,64,10,3,158,0,6,3,2,0,25,5,6,16,220, + 252,212,204,49,0,16,212,236,48,1,21,19,35,3,53,1,151,82,129,164,6,218,172,254,192,1,64,172,0,1,0,117,3,239,1,135,6,20,0,14, + 0,49,180,0,7,4,12,15,16,220,180,63,12,79,12,2,93,204,220,182,0,7,16,7,32,7,3,93,60,49,0,182,1,4,0,7,8,151,15,16, + 244,204,220,178,0,0,1,93,57,204,48,19,53,50,54,53,52,38,35,53,50,23,22,20,7,6,117,64,88,88,64,115,80,79,79,80,3,239,123,88, + 64,63,88,123,80,79,230,80,80,0,0,0,0,1,0,117,3,239,1,135,6,20,0,14,0,49,180,0,8,11,4,15,16,212,204,220,64,13,0,4, + 0,11,16,4,16,11,32,4,32,11,6,93,60,49,0,182,14,11,0,8,7,151,15,16,244,204,212,178,0,0,1,93,57,204,48,1,34,39,38,52, + 55,54,51,21,34,6,21,20,22,51,1,135,115,80,79,79,80,115,64,88,88,64,3,239,80,80,230,79,80,123,88,63,64,88,0,0,0,1,0,117, + 2,156,2,137,6,2,0,28,0,43,64,9,1,5,0,5,22,26,14,0,29,16,212,196,220,220,204,17,18,57,49,0,64,9,26,0,18,13,14,9, + 18,28,29,16,212,212,204,212,204,16,220,204,48,1,51,50,55,54,53,38,39,38,35,34,7,6,7,53,54,55,54,51,50,23,22,21,20,7,6,7, + 17,35,1,20,39,121,55,36,1,35,63,113,50,50,49,49,48,51,51,53,174,87,68,68,70,107,128,4,91,64,42,55,75,36,64,12,12,24,96,20, + 9,10,88,70,104,95,64,67,17,254,147,0,0,1,0,117,2,156,2,137,6,2,0,28,0,45,64,10,28,0,24,15,0,24,7,0,3,29,16,220, + 204,220,204,16,196,17,18,57,49,0,64,9,3,0,11,16,15,20,11,2,29,16,212,212,204,212,204,16,220,204,48,1,17,35,17,38,39,38,53,52, + 55,54,51,50,23,22,23,21,38,39,38,35,34,7,6,7,20,23,22,51,1,234,127,107,71,68,69,87,173,53,51,51,48,49,50,49,50,113,62,36, + 1,37,54,121,4,91,254,65,1,109,17,67,64,95,104,70,88,10,9,20,96,24,12,12,64,36,75,55,42,64,0,0,0,1,1,11,4,50,2,245, + 6,176,0,6,0,0,1,37,21,13,1,21,37,1,11,1,234,254,153,1,103,254,22,5,187,245,139,180,180,139,245,0,0,1,1,11,4,50,2,245, + 6,176,0,6,0,0,1,5,53,45,1,53,5,2,245,254,22,1,103,254,153,1,234,5,39,245,139,180,180,139,245,0,0,1,0,193,4,124,3,63, + 6,102,0,6,0,61,180,4,2,117,6,7,16,220,236,57,49,0,181,4,5,2,0,179,7,16,244,204,50,180,16,2,16,5,2,93,57,48,0,75, + 176,9,84,75,176,14,84,91,88,189,0,7,255,192,0,1,0,7,0,7,0,64,56,17,55,56,89,1,51,19,35,11,1,35,1,182,148,245,139,180, + 180,139,6,102,254,22,1,103,254,153,0,0,0,1,0,193,4,124,3,63,6,102,0,6,0,76,180,3,5,117,1,7,16,220,236,57,49,0,181,3, + 0,4,1,179,7,16,244,60,212,178,16,0,1,93,57,48,0,75,176,9,84,75,176,14,84,91,88,189,0,7,255,192,0,1,0,7,0,7,0,64, + 56,17,55,56,89,64,12,53,0,58,6,53,2,58,4,4,51,3,1,93,1,93,1,3,51,27,1,51,3,1,182,245,139,180,180,139,245,4,124,1, + 234,254,153,1,103,254,22,0,0,1,0,193,4,238,3,63,6,102,0,6,0,55,64,12,4,5,2,180,0,179,7,4,2,117,6,7,16,220,236,57, + 49,0,16,244,236,50,57,48,0,75,176,9,84,75,176,14,84,91,88,189,0,7,255,192,0,1,0,7,0,7,0,64,56,17,55,56,89,1,51,19, + 35,39,7,35,1,182,148,245,139,180,180,139,6,102,254,136,245,245,0,0,0,1,0,193,4,238,3,63,6,102,0,6,0,55,64,12,3,0,180,4, + 1,179,7,3,5,117,1,7,16,220,236,57,49,0,16,244,60,236,57,48,0,75,176,9,84,75,176,14,84,91,88,189,0,7,255,192,0,1,0,7, + 0,7,0,64,56,17,55,56,89,1,3,51,23,55,51,3,1,182,245,139,180,180,139,245,4,238,1,120,245,245,254,136,0,1,0,214,3,231,1,94, + 6,18,0,3,0,19,64,4,5,0,3,4,16,220,220,204,49,0,64,2,3,2,47,196,48,1,17,35,17,1,94,136,6,18,253,213,2,43,0,0, + 255,255,0,213,5,98,3,43,5,246,16,6,0,113,0,0,0,1,1,115,4,238,3,82,6,102,0,3,0,0,1,51,1,35,2,139,199,254,186,153, + 6,102,254,136,0,1,0,170,4,240,2,137,6,102,0,3,0,0,9,1,35,1,1,111,1,26,153,254,186,6,102,254,138,1,118,0,0,1,0,214, + 254,209,1,94,0,252,0,3,0,19,64,4,5,0,3,4,16,220,220,204,49,0,64,2,3,2,47,196,48,37,17,35,17,1,94,136,252,253,213,2, + 43,0,0,0,255,255,0,213,254,192,3,43,255,84,16,7,0,113,0,0,249,94,0,0,0,1,0,170,254,28,2,137,255,146,0,3,0,0,5,1, + 35,1,1,111,1,26,153,254,186,110,254,138,1,118,0,0,0,1,1,115,254,28,3,82,255,148,0,3,0,0,5,51,1,35,2,139,199,254,186,153, + 108,254,136,0,0,2,0,111,0,0,1,212,4,35,0,2,0,5,0,69,64,11,0,1,3,5,3,0,4,2,5,1,6,16,212,60,196,75,176,16, + 80,88,179,7,64,2,64,56,56,89,50,57,57,49,0,47,196,212,196,48,64,9,15,3,0,0,96,0,111,3,4,93,1,64,13,80,7,96,7,96, + 4,96,2,100,3,100,0,6,93,1,3,33,3,19,33,1,33,178,1,101,179,179,254,155,2,217,1,74,253,39,254,182,0,1,0,111,2,217,1,212, + 4,35,0,2,0,52,182,0,1,3,0,2,1,3,16,212,196,75,176,16,80,88,179,4,64,2,64,56,56,89,57,49,0,16,212,196,48,64,5,0, + 0,96,0,2,93,1,64,9,80,4,96,4,96,2,100,0,4,93,1,3,33,1,33,178,1,101,2,217,1,74,0,0,255,255,0,117,1,254,1,135, + 4,35,16,7,2,128,0,0,254,15,0,0,255,255,0,117,1,254,1,135,4,35,16,7,2,129,0,0,254,15,0,0,0,1,1,31,1,212,2,225, + 3,150,0,7,0,0,1,21,33,53,51,17,51,17,2,225,254,62,150,150,2,106,150,150,1,44,254,212,0,1,1,31,1,212,2,225,3,150,0,7, + 0,0,1,53,33,21,35,17,35,17,1,31,1,194,150,150,3,0,150,150,254,212,1,44,0,1,0,100,0,255,2,186,3,85,0,11,0,0,1,53, + 51,21,51,21,35,21,35,53,35,53,1,68,150,224,224,150,224,2,117,224,224,150,224,224,150,0,0,0,0,1,0,100,1,223,2,38,2,117,0,3, + 0,0,1,33,53,33,2,38,254,62,1,194,1,223,150,0,0,1,0,199,5,41,3,57,6,72,0,13,0,87,64,14,11,240,4,7,0,179,14,7, + 86,8,1,86,0,14,16,220,236,212,236,49,0,16,244,60,212,236,48,0,75,176,9,84,88,189,0,14,255,192,0,1,0,14,0,14,0,64,56,17, + 55,56,89,0,75,176,15,84,75,176,16,84,91,75,176,17,84,91,88,189,0,14,0,64,0,1,0,14,0,14,255,192,56,17,55,56,89,19,51,30, + 1,51,50,54,55,51,14,1,35,34,38,199,118,11,97,87,86,96,13,118,10,158,145,145,158,6,72,75,75,74,76,143,144,144,0,0,0,1,1,154, + 5,68,2,102,6,16,0,3,0,78,64,9,2,206,0,205,4,1,100,0,4,16,212,236,49,0,16,252,236,48,0,75,176,10,84,75,176,13,84,91, + 88,189,0,4,0,64,0,1,0,4,0,4,255,192,56,17,55,56,89,1,176,13,75,84,176,14,75,84,91,88,189,0,4,0,64,0,1,0,4,0, + 4,255,192,56,17,55,56,89,1,51,21,35,1,154,204,204,6,16,204,0,0,2,0,238,4,225,3,18,7,6,0,11,0,23,0,32,64,17,3,193, + 21,242,9,193,15,241,24,0,86,12,120,6,86,18,24,16,212,236,244,236,49,0,16,244,236,244,236,48,1,52,38,35,34,6,21,20,22,51,50,54, + 55,20,6,35,34,38,53,52,54,51,50,22,2,152,88,64,65,87,87,65,64,88,122,159,115,115,159,159,115,115,159,5,244,63,88,87,64,65,87,88, + 64,115,160,160,115,115,159,159,0,1,1,76,254,117,2,193,0,0,0,19,0,32,64,15,11,14,10,7,243,14,244,0,1,0,10,4,39,17,20,16, + 212,236,196,212,204,49,0,47,252,252,196,18,57,48,33,51,14,1,21,20,22,51,50,54,55,21,14,1,35,34,38,53,52,54,1,184,119,45,43,55, + 54,32,62,31,38,68,30,122,115,53,61,88,31,46,46,15,15,133,10,10,87,93,48,105,0,1,0,182,5,29,3,74,6,55,0,27,0,99,64,36, + 0,18,7,14,11,4,1,18,7,15,11,4,18,195,25,7,4,195,21,11,237,28,15,1,14,0,7,21,86,22,119,7,86,8,118,28,16,244,236,252, + 236,17,57,57,57,57,49,0,16,252,60,252,212,60,236,17,18,57,17,18,57,17,18,57,17,18,57,48,0,75,176,9,84,75,176,12,84,91,88,189, + 0,28,255,192,0,1,0,28,0,28,0,64,56,17,55,56,89,1,39,46,1,35,34,6,7,35,62,1,51,50,22,31,1,30,1,51,50,54,55,51, + 14,1,35,34,38,1,252,57,22,33,13,38,36,2,125,2,102,91,38,64,37,57,22,33,13,38,36,2,125,2,102,91,38,64,5,90,55,20,19,73, + 82,135,147,28,33,55,20,19,73,82,135,147,28,0,0,0,0,2,0,240,4,238,3,174,6,102,0,3,0,7,0,66,64,17,6,2,180,4,0,179, + 8,4,7,3,0,5,1,3,5,7,8,16,212,220,212,204,17,57,17,18,57,49,0,16,244,60,236,50,48,0,75,176,9,84,75,176,14,84,91,88, + 189,0,8,255,192,0,1,0,8,0,8,0,64,56,17,55,56,89,1,51,3,35,3,51,3,35,2,252,178,248,135,129,170,223,137,6,102,254,136,1, + 120,254,136,0,0,1,255,255,1,222,2,173,4,8,0,15,0,0,3,37,51,21,20,23,22,59,1,21,35,34,39,38,53,5,1,1,22,184,38,38, + 105,43,64,175,87,82,254,235,3,100,164,148,153,49,48,156,96,90,200,162,0,1,0,239,4,238,3,16,6,102,0,11,0,0,1,39,7,35,55,39, + 51,23,55,51,7,23,2,92,92,93,180,181,181,180,93,92,180,182,182,4,238,97,97,187,189,96,96,189,187,0,0,0,0,2,0,117,1,171,2,253, + 5,15,0,13,0,21,0,0,1,22,21,20,35,32,53,52,55,3,51,23,55,51,1,6,21,20,51,50,53,52,2,5,178,242,254,245,181,250,137,191, + 183,137,254,188,137,136,129,3,220,249,180,132,132,191,242,1,47,224,224,254,138,174,152,77,77,137,0,0,0,1,0,122,2,156,0,238,6,3,0,3, + 0,13,177,2,3,47,204,49,0,177,0,3,47,196,48,19,51,17,35,122,116,116,6,3,252,153,0,0,0,1,0,117,2,156,2,144,5,47,0,50, + 0,0,1,21,38,39,38,35,34,7,6,21,20,23,22,31,1,22,23,22,21,20,7,6,35,34,39,38,39,53,22,23,22,51,50,54,53,52,39,38, + 47,1,38,39,38,53,52,55,54,51,50,23,22,2,106,49,53,52,57,87,43,43,31,31,93,40,125,50,52,78,77,136,57,62,61,68,64,63,62,61, + 82,88,32,28,111,40,108,48,48,71,70,130,64,57,57,5,13,97,22,11,11,23,24,47,36,20,21,18,8,24,42,43,77,87,51,51,10,10,19,107, + 30,15,15,50,45,42,23,20,23,8,21,41,42,73,88,48,49,9,8,0,0,1,0,117,2,156,3,33,5,15,0,11,0,0,1,3,1,35,39,7, + 35,1,3,51,23,55,3,20,255,1,12,137,205,205,137,1,18,251,137,187,187,5,15,254,207,254,190,246,246,1,72,1,43,223,223,0,255,255,0,117, + 2,156,2,137,6,2,16,6,2,131,0,0,0,1,0,214,0,0,3,29,5,88,0,5,0,21,64,9,1,169,3,0,0,8,4,2,6,16,196,212, + 236,49,0,47,212,236,48,33,17,33,53,33,17,2,149,254,65,2,71,4,208,136,250,168,0,1,0,214,0,0,3,29,5,88,0,7,0,39,64,24, + 63,4,63,1,47,4,47,1,31,4,31,1,6,1,169,4,5,0,0,4,8,6,2,8,16,196,212,236,50,49,0,47,212,220,236,93,48,33,17,33, + 53,33,17,51,17,2,149,254,65,1,191,136,3,156,136,1,52,250,168,0,0,1,0,214,0,0,3,29,5,88,0,7,0,25,64,11,1,169,4,5, + 0,0,4,8,6,2,8,16,196,212,236,50,49,0,47,212,220,236,48,33,17,33,53,33,17,51,17,2,149,254,65,1,191,136,2,104,136,2,104,250, + 168,0,0,0,0,1,0,214,0,0,3,29,5,88,0,7,0,39,64,24,112,4,112,1,48,4,48,1,16,4,16,1,6,4,169,1,5,0,0,4, + 8,6,2,8,16,196,212,236,50,49,0,47,212,220,236,93,48,33,17,33,53,33,17,51,17,2,149,254,65,1,191,136,1,52,136,3,156,250,168,0, + 0,1,0,214,0,0,3,29,5,88,0,5,0,21,64,9,1,0,169,4,0,8,2,4,6,16,196,212,236,49,0,47,236,196,48,37,17,51,17,33, + 53,2,149,136,253,185,136,4,208,250,168,136,255,255,0,193,253,236,3,63,255,214,16,7,2,135,0,0,249,112,0,0,255,255,0,213,4,226,3,43, + 6,118,18,39,0,113,0,0,0,128,18,6,0,113,0,128,255,255,0,174,3,233,3,109,5,213,18,6,10,251,0,0,255,255,0,238,254,20,3,18, + 0,57,16,7,2,156,0,0,249,51,0,0,0,1,0,182,254,118,3,74,255,144,0,33,0,95,64,14,18,1,17,0,9,26,86,27,119,9,86,10, + 118,34,16,244,236,252,236,17,57,57,57,57,49,0,64,21,0,22,9,17,14,5,1,22,9,18,14,5,22,195,31,9,5,195,26,14,34,16,212,60, + 252,212,60,236,17,18,57,17,18,57,17,18,57,17,18,57,48,0,75,176,9,84,88,189,0,28,255,192,0,1,0,28,0,28,0,64,56,17,55,56, + 89,1,39,38,39,38,35,34,7,6,7,35,54,55,54,51,50,22,31,1,22,23,22,51,50,55,54,55,51,6,7,6,35,34,38,1,252,57,22,17, + 16,13,38,18,18,2,125,2,51,51,91,38,64,37,57,22,17,16,13,38,18,18,2,125,2,51,51,91,38,64,254,179,55,20,10,9,37,36,82,135, + 73,74,28,33,55,20,10,9,37,36,82,135,73,74,28,0,0,2,252,168,4,123,254,135,6,102,0,3,0,4,0,54,64,12,1,180,0,179,4,184, + 5,4,3,68,1,5,16,220,236,57,49,0,16,228,244,236,48,0,75,176,9,84,75,176,14,84,91,88,189,0,4,255,192,0,1,0,4,0,4,0, + 64,56,17,55,56,89,9,1,35,9,1,253,109,1,26,153,254,186,1,88,6,102,254,138,1,118,254,21,0,2,253,113,4,123,255,80,6,102,0,3, + 0,4,0,54,64,12,2,180,0,179,4,184,5,4,3,68,1,5,16,212,236,57,49,0,16,228,244,236,48,0,75,176,9,84,75,176,14,84,91,88, + 189,0,4,255,192,0,1,0,4,0,4,0,64,56,17,55,56,89,1,51,1,35,23,254,137,199,254,186,153,143,6,102,254,136,115,0,0,2,252,193, + 4,123,255,63,6,102,0,6,0,7,0,60,64,15,4,5,2,180,0,179,7,184,8,7,4,2,117,6,8,16,220,236,57,57,49,0,16,228,244,236, + 50,57,48,0,75,176,9,84,75,176,14,84,91,88,189,0,7,255,192,0,1,0,7,0,7,0,64,56,17,55,56,89,1,51,19,35,39,7,35,5, + 253,182,148,245,139,180,180,139,1,63,6,102,254,136,245,245,115,0,0,0,255,255,252,180,5,29,255,72,6,55,16,7,2,158,251,254,0,0,0,0, + 255,255,252,217,5,98,255,47,5,246,16,7,0,113,252,4,0,0,0,0,255,255,251,236,5,124,0,20,6,11,16,7,11,28,252,0,0,0,0,0, + 255,255,252,191,5,41,255,49,6,72,16,7,2,154,251,248,0,0,0,0,0,2,253,162,4,123,254,90,6,20,0,3,0,4,0,37,64,12,2,190, + 0,177,4,184,5,4,1,8,0,5,16,212,236,57,49,0,16,228,252,236,48,0,1,64,7,4,4,52,4,68,4,3,93,1,51,21,35,23,253,162, + 184,184,94,6,20,233,176,0,0,3,252,215,4,123,255,41,6,16,0,3,0,7,0,8,0,73,64,17,6,2,206,4,0,205,8,184,9,1,100,8, + 0,5,100,4,9,16,220,252,212,57,236,49,0,16,228,252,60,236,50,48,1,64,35,4,8,52,8,68,8,96,1,96,2,96,3,96,0,96,1,96, + 2,96,5,96,6,96,8,112,1,112,2,112,5,112,6,112,8,17,93,1,51,21,35,37,51,21,35,5,254,94,203,203,254,121,203,203,1,41,6,16, + 202,202,202,203,0,1,253,55,4,242,254,247,6,123,0,25,0,34,64,9,20,86,64,5,128,12,86,25,13,47,204,236,26,220,26,236,49,0,64,6, + 23,193,64,2,192,13,47,26,220,26,236,48,1,54,51,50,22,21,20,15,1,6,7,6,21,35,53,52,54,63,1,54,53,52,38,35,34,7,253,55, + 112,105,104,127,88,44,35,4,7,119,30,51,45,46,62,71,90,100,6,72,51,85,67,61,65,32,26,9,16,32,12,40,54,37,34,34,40,21,36,52, + 255,255,252,236,4,225,255,16,7,6,16,7,2,156,251,254,0,0,0,0,255,255,252,244,4,238,255,178,6,102,16,7,2,159,252,4,0,0,0,0, + 0,2,252,197,4,123,255,67,6,102,0,6,0,7,0,60,64,15,3,0,180,4,1,179,7,184,8,7,3,5,117,1,8,16,220,236,57,57,49,0, + 16,228,244,60,236,57,48,0,75,176,9,84,75,176,14,84,91,88,189,0,7,255,192,0,1,0,7,0,7,0,64,56,17,55,56,89,1,3,51,23, + 55,51,3,7,253,186,245,139,180,180,139,245,78,4,238,1,120,245,245,254,136,115,0,0,0,1,253,188,4,236,254,68,6,168,0,3,0,14,178,2, + 27,0,47,236,49,0,177,3,1,47,204,48,1,17,35,17,254,68,136,6,168,254,68,1,188,0,0,0,255,255,252,240,4,236,255,16,6,168,16,39, + 2,190,255,52,0,0,16,7,2,190,0,204,0,0,0,0,0,2,252,93,4,238,255,27,6,102,0,3,0,7,0,66,64,17,6,2,180,4,0,179, + 8,4,5,1,0,7,3,1,7,5,8,16,212,220,212,204,17,57,17,18,57,49,0,16,244,60,236,50,48,0,75,176,9,84,75,176,14,84,91,88, + 189,0,8,255,192,0,1,0,8,0,8,0,64,56,17,55,56,89,1,19,35,3,33,19,35,3,253,15,205,135,248,2,0,190,137,223,6,102,254,136, + 1,120,254,136,1,120,0,0,255,255,252,191,5,41,255,49,7,86,16,39,2,184,0,0,1,66,16,7,2,154,251,248,0,0,0,0,0,1,252,191, + 5,41,255,49,6,72,0,12,0,24,181,7,86,8,1,86,0,47,236,212,236,49,0,180,10,240,4,0,7,47,60,220,236,48,3,35,46,1,35,34, + 6,7,35,62,1,32,22,207,118,11,97,87,86,96,13,118,10,158,1,34,158,5,41,75,75,74,76,143,144,144,0,0,0,1,254,31,3,233,255,68, + 5,40,0,3,0,10,64,3,2,1,4,0,16,212,204,48,1,35,19,51,254,242,211,164,129,3,233,1,63,0,0,0,0,1,253,144,4,194,254,130, + 6,193,0,8,0,0,1,16,35,53,22,53,35,53,51,254,130,242,112,112,242,5,195,254,255,123,3,137,254,0,0,0,0,1,253,144,4,194,254,130, + 6,193,0,8,0,0,1,53,51,21,35,20,55,21,34,253,144,241,111,112,242,5,195,254,254,137,3,123,0,1,255,121,4,154,0,135,6,18,0,3, + 0,0,3,51,3,35,64,199,117,153,6,18,254,136,0,0,255,255,252,168,253,223,254,135,255,85,16,7,0,67,251,254,248,239,0,0,255,255,253,113, + 253,221,255,80,255,85,16,7,0,118,251,254,248,239,0,0,0,1,253,36,254,20,254,60,255,206,0,7,0,0,1,35,53,51,53,51,17,35,253,196, + 160,160,120,120,254,181,120,161,254,70,0,0,0,1,253,196,254,20,254,220,255,206,0,7,0,0,5,51,21,51,21,35,21,35,253,196,120,160,160,120, + 50,161,120,161,0,1,254,85,5,134,0,63,7,112,0,5,0,0,3,33,53,33,17,35,73,254,158,1,234,136,6,232,136,254,22,0,0,1,254,240, + 3,107,0,123,4,224,0,19,0,49,64,6,7,86,14,4,17,0,47,75,176,12,84,75,176,13,84,91,75,176,14,84,91,88,185,0,0,0,64,56, + 89,220,50,220,236,49,0,64,5,10,4,193,0,17,47,196,252,204,48,1,53,30,1,51,50,54,53,52,38,39,51,30,1,21,20,6,35,34,38,254, + 240,61,88,31,46,46,15,15,133,10,10,87,93,48,105,3,215,119,45,43,55,54,32,62,31,38,68,30,122,115,53,0,0,1,253,128,254,18,254,86, + 255,190,0,13,0,28,64,6,13,6,10,86,3,14,16,212,252,204,50,49,0,64,6,6,193,7,13,193,0,47,252,220,236,48,1,34,38,53,52,54, + 51,21,34,6,21,20,22,51,254,86,90,124,124,90,40,53,53,40,254,18,125,90,89,124,120,53,39,40,53,0,0,0,0,1,253,11,254,20,254,245, + 255,77,0,7,0,0,1,51,21,33,53,51,53,51,254,68,177,254,22,177,136,254,156,136,136,177,0,0,0,1,253,11,254,20,254,245,255,77,0,7, + 0,0,1,35,53,33,21,35,21,35,253,188,177,1,234,177,136,254,197,136,136,177,0,0,0,1,253,36,254,20,254,220,255,206,0,11,0,0,1,35, + 53,51,53,51,21,51,21,35,21,35,253,196,160,160,120,160,160,120,254,181,120,161,161,120,161,0,0,0,0,1,253,11,254,136,254,245,255,16,0,3, + 0,0,1,53,33,21,253,11,1,234,254,136,136,136,0,0,0,1,253,122,254,86,255,208,0,128,0,13,0,0,39,21,20,7,6,43,1,53,51,50, + 55,54,61,1,48,82,81,181,254,233,105,38,38,128,148,214,96,96,156,48,49,153,148,0,0,1,253,119,254,86,255,205,0,128,0,13,0,0,37,51, + 21,20,23,22,59,1,21,35,34,39,38,53,253,119,184,38,38,105,233,254,181,81,82,128,148,153,49,48,156,96,96,214,0,1,253,162,254,137,254,90, + 255,115,0,3,0,0,5,51,21,35,253,162,184,184,141,234,255,255,252,213,254,137,255,39,255,83,16,7,0,106,251,254,249,67,0,0,0,2,253,40, + 254,18,254,212,255,190,0,11,0,23,0,30,64,8,0,86,12,120,6,86,18,24,16,212,236,244,236,49,0,64,6,21,193,3,9,193,15,47,252,220, + 236,48,1,52,38,35,34,6,21,20,22,51,50,54,55,20,6,35,34,38,53,52,54,51,50,22,254,91,54,39,40,53,53,40,39,54,121,124,90,90, + 124,124,90,90,124,254,234,38,54,53,39,40,53,54,38,90,125,125,90,89,124,124,0,0,0,1,253,106,254,20,254,143,255,84,0,3,0,10,64,3, + 3,0,4,0,16,212,204,48,5,51,3,35,253,188,211,164,129,172,254,192,255,255,253,35,254,117,254,193,0,0,16,7,0,122,252,0,0,0,0,0, + 255,255,253,76,254,117,254,193,0,0,16,7,2,157,252,0,0,0,0,0,0,1,253,188,254,20,254,68,255,160,0,3,0,14,178,2,27,0,47,236, + 49,0,177,1,3,47,204,48,5,17,35,17,254,68,136,96,254,116,1,140,0,1,252,240,254,80,255,23,255,154,0,7,0,0,7,17,35,53,33,21, + 35,17,233,137,254,235,137,102,254,182,194,194,1,74,0,0,0,1,252,99,254,57,255,152,255,88,0,20,0,0,1,6,35,34,3,52,53,51,22,51, + 50,55,51,22,23,50,55,51,2,7,34,253,254,60,116,218,17,117,14,104,101,15,118,12,105,102,15,118,15,220,116,254,139,82,1,26,2,3,150,150, + 149,1,150,254,226,1,0,0,255,255,252,197,254,20,255,67,255,140,17,7,2,137,252,4,249,38,0,39,0,75,176,9,84,75,176,14,84,75,176,11, + 84,75,176,12,84,91,91,91,88,189,0,7,0,64,0,1,0,7,0,7,255,192,56,17,55,56,89,0,255,255,252,191,254,20,255,61,255,140,17,7, + 2,136,251,254,249,38,0,39,0,75,176,9,84,75,176,14,84,75,176,11,84,75,176,12,84,91,91,91,88,189,0,7,0,64,0,1,0,7,0,7, + 255,192,56,17,55,56,89,0,255,255,252,191,254,57,255,49,255,88,16,7,2,154,251,248,249,16,0,0,0,1,252,191,254,54,255,49,255,85,0,12, + 0,0,3,35,46,1,35,34,6,7,35,62,1,32,22,207,118,11,97,87,86,96,13,118,10,158,1,34,158,254,54,75,75,74,76,143,144,144,0,0, + 255,255,252,180,254,57,255,72,255,83,16,7,2,158,251,254,249,28,0,0,255,255,252,217,254,192,255,47,255,84,16,7,2,143,252,4,0,0,0,0, + 255,255,251,236,254,29,0,20,254,172,16,7,0,66,252,0,0,0,0,0,255,255,251,236,254,29,0,20,255,238,16,7,10,245,252,0,0,0,0,0, + 0,1,251,140,1,236,255,173,3,12,0,27,0,0,3,21,14,1,35,34,39,38,39,46,1,35,34,6,7,53,62,1,51,50,22,23,22,23,22,51, + 50,54,83,75,143,79,90,113,22,11,77,103,51,79,141,73,78,146,83,53,100,74,12,21,116,93,70,137,3,12,174,59,55,51,10,4,33,24,59,63, + 174,60,54,22,31,5,10,55,61,0,0,0,0,1,253,120,1,196,255,136,2,104,0,3,0,0,3,21,33,53,120,253,240,2,104,164,164,0,0,0, + 0,1,250,237,1,196,255,255,2,104,0,3,0,0,1,53,33,21,250,237,5,18,1,196,164,164,0,0,0,1,251,104,255,162,255,188,4,188,0,3, + 0,0,5,39,1,23,251,200,96,3,245,95,94,78,4,204,79,0,0,0,0,1,250,18,255,186,255,145,6,23,0,3,0,0,5,39,1,23,250,121, + 103,5,25,102,70,88,6,5,89,0,0,0,0,1,253,172,254,18,254,130,255,190,0,13,0,28,64,6,13,6,10,86,3,14,16,212,252,204,50,49, + 0,64,6,0,193,13,7,193,6,47,252,220,236,48,5,50,22,21,20,6,35,53,50,54,53,52,38,35,253,172,90,124,124,90,40,53,53,40,66,125, + 90,89,124,120,53,39,40,53,0,1,252,241,254,91,255,24,255,165,0,7,0,0,1,17,51,21,33,53,51,17,252,241,137,1,21,137,254,91,1,74, + 194,194,254,182,0,2,253,33,254,20,254,227,255,214,0,3,0,7,0,0,5,17,33,17,1,53,35,21,254,227,254,62,1,74,210,42,254,62,1,194, + 254,182,210,210,0,1,252,99,254,57,255,152,255,88,0,20,0,0,5,54,51,50,19,20,21,35,38,35,34,7,35,38,39,34,7,35,18,55,50,253, + 254,59,116,218,17,118,13,103,102,16,118,11,105,102,15,118,15,220,116,250,82,254,230,2,3,150,150,149,1,150,1,30,1,0,0,0,0,1,253,43, + 4,243,254,229,6,173,0,11,0,0,1,7,39,55,39,55,23,55,23,7,23,7,254,8,125,96,125,125,96,125,125,96,125,125,96,5,112,125,96,125, + 125,96,125,125,96,125,125,96,0,1,254,6,4,194,255,32,6,210,0,29,0,0,1,46,1,53,52,54,55,21,14,1,21,20,23,22,31,1,30,1, + 21,20,6,7,53,62,1,53,52,39,38,39,254,67,33,28,147,135,82,73,9,12,18,55,33,28,147,135,82,73,9,12,18,5,199,28,48,28,80,81, + 2,110,2,27,28,10,12,15,14,43,28,48,28,80,81,2,110,2,27,28,10,12,15,14,255,255,251,236,4,58,0,20,6,11,16,39,11,28,252,0, + 0,0,16,7,11,28,252,0,254,190,0,0,255,255,252,168,4,240,254,135,6,102,16,7,0,67,251,254,0,0,0,0,255,255,253,113,4,238,255,80, + 6,102,16,7,0,118,251,254,0,0,0,0,255,255,252,180,5,29,255,72,6,55,16,7,2,158,251,254,0,0,0,0,255,255,253,144,4,194,254,130, + 6,193,16,6,2,196,0,0,255,255,252,231,5,70,255,98,7,210,16,7,3,28,252,16,0,0,0,0,255,255,253,198,254,86,254,162,255,164,16,7, + 3,22,252,16,0,0,0,0,0,1,252,213,5,29,255,43,6,73,0,7,0,0,3,35,53,33,21,35,17,33,213,150,254,214,150,2,86,5,29,150, + 150,1,44,0,0,2,253,31,254,50,254,225,255,184,0,3,0,7,0,0,1,33,53,33,53,33,53,33,254,225,254,62,1,194,254,62,1,194,254,50, + 120,150,120,0,0,2,253,21,254,20,254,235,255,160,0,3,0,7,0,0,5,51,17,35,1,51,17,35,253,21,150,150,1,64,150,150,96,254,116,1, + 140,254,116,0,0,1,253,31,254,20,254,225,255,214,0,5,0,0,5,33,17,35,17,33,253,31,1,194,150,254,212,42,254,62,1,44,0,1,252,182, + 4,238,255,74,6,102,0,39,0,0,1,55,51,7,22,23,22,51,50,55,54,55,51,6,7,6,35,34,39,38,39,7,35,55,38,39,38,35,34,7, + 6,7,35,54,55,54,51,50,23,22,253,255,66,109,107,11,22,16,13,38,18,18,2,125,2,51,51,91,38,32,30,33,66,110,107,13,20,16,13,38, + 18,18,2,125,2,51,51,91,38,32,30,5,255,103,169,9,14,10,36,37,82,135,74,73,14,13,29,103,168,11,13,10,36,37,82,135,74,73,14,13, + 0,3,252,182,4,137,255,74,6,204,0,29,0,33,0,37,0,0,1,39,46,1,35,34,6,29,1,35,52,54,51,50,22,31,1,30,1,51,50,54, + 61,1,51,14,1,35,34,38,7,51,21,35,19,51,21,35,253,252,57,25,31,12,36,40,125,103,86,36,61,48,57,23,34,15,32,40,125,2,103,84, + 34,59,232,150,150,210,150,150,5,104,33,14,11,50,45,6,101,118,16,27,30,13,12,51,41,6,100,119,16,46,150,2,67,150,0,0,255,255,252,182, + 4,197,255,74,6,144,16,34,22,187,0,183,16,3,22,187,0,0,0,167,0,1,252,99,254,40,255,157,255,194,0,13,0,0,1,55,33,23,35,39, + 55,51,7,33,39,51,23,7,254,112,132,254,25,132,127,175,175,127,132,1,231,132,126,175,175,254,40,155,155,205,205,155,155,205,205,0,0,1,253,51, + 254,20,254,205,255,164,0,8,0,0,1,35,53,7,53,55,23,21,39,254,50,100,155,205,205,155,254,20,231,132,126,175,175,126,132,0,0,1,253,120, + 4,225,254,136,7,6,0,16,0,0,1,6,7,6,21,20,23,22,23,21,38,39,38,52,55,54,55,254,136,64,42,44,44,42,64,114,78,80,80,78, + 114,6,139,1,42,44,64,65,43,43,1,123,1,79,80,230,80,78,1,0,255,255,252,191,4,96,255,49,6,216,16,39,2,194,0,0,0,144,16,6, + 2,184,0,229,255,255,253,43,254,20,254,229,255,206,16,7,2,238,0,0,249,33,0,0,0,1,253,120,4,225,254,136,7,6,0,18,0,0,1,48, + 53,22,23,22,20,7,6,7,48,53,54,55,54,53,52,39,38,253,120,114,78,80,80,78,114,64,42,44,44,42,6,139,123,1,78,80,230,80,79,1, + 123,1,43,43,65,64,44,42,255,255,255,46,5,68,255,250,6,16,16,7,2,155,253,148,0,0,0,0,0,3,252,144,254,18,255,111,255,191,0,7, + 0,21,0,29,0,0,0,22,50,62,1,38,34,6,55,54,50,22,20,6,34,39,6,34,38,52,54,50,18,54,52,38,34,6,20,22,253,9,53,79, + 53,2,55,79,53,247,62,181,124,124,182,61,62,182,124,124,182,254,54,54,79,53,53,254,195,53,53,77,55,53,109,63,124,179,125,65,64,125,179,124, + 254,206,54,77,54,53,79,53,255,255,252,112,254,27,3,144,255,133,16,7,11,29,252,201,0,0,0,0,255,255,252,112,6,107,3,144,7,213,16,7, + 11,29,252,201,8,80,0,0,0,1,252,112,6,215,3,144,7,107,0,3,0,0,1,33,21,33,252,112,7,32,248,224,7,107,148,0,0,1,252,112, + 254,192,3,144,255,84,0,3,0,0,5,33,21,33,252,112,7,32,248,224,172,148,0,0,0,1,253,42,6,13,2,214,7,39,0,35,0,0,3,39, + 38,39,38,35,34,7,6,7,35,54,55,54,51,50,23,22,31,1,22,23,22,51,50,55,54,55,51,6,7,6,35,34,39,38,4,144,28,79,44,36, + 101,53,70,5,162,4,113,112,200,91,63,57,90,144,28,79,44,36,97,57,71,4,162,4,113,112,200,91,63,57,6,74,55,11,18,10,36,48,71,135, + 74,73,14,13,34,55,11,18,10,36,44,75,135,74,73,14,13,0,0,0,255,255,252,112,6,4,3,144,7,110,16,7,11,30,252,201,0,0,0,0, + 0,1,252,119,254,40,3,147,255,194,0,8,0,0,1,53,33,39,51,23,7,35,55,252,119,6,115,132,126,175,175,126,132,254,195,100,155,205,205,155, + 255,255,0,201,0,0,4,113,5,213,16,6,17,233,0,0,255,255,0,193,0,0,3,208,4,96,16,6,17,234,0,0,0,1,0,201,0,0,6,28, + 5,213,0,11,0,0,19,33,17,35,17,33,17,35,17,33,17,35,201,5,83,202,254,134,203,254,134,202,5,213,252,244,2,98,250,213,5,43,253,158, + 0,1,0,201,0,0,4,101,5,213,0,11,0,0,19,33,17,35,17,35,17,35,17,35,17,35,201,3,156,184,185,185,185,185,5,213,252,244,2,98, + 250,213,5,43,253,158,0,0,0,1,0,160,4,116,1,159,6,102,0,3,0,17,64,6,1,0,4,2,0,4,16,212,204,49,0,16,212,204,48,27, + 1,51,3,160,65,190,110,4,116,1,242,254,14,0,0,0,0,1,0,160,254,86,1,159,0,72,0,3,0,17,64,6,2,3,4,0,2,4,16,212, + 204,49,0,16,212,204,48,37,3,35,19,1,159,65,190,110,72,254,14,1,242,0,0,0,255,255,0,201,0,0,5,51,5,213,16,6,3,172,0,0, + 255,255,0,186,0,0,4,121,4,96,16,6,3,204,0,0,0,1,1,182,254,86,2,146,255,164,0,13,0,0,1,35,34,39,38,61,1,51,21,20, + 23,22,59,1,2,146,148,26,26,20,149,10,12,14,35,254,86,33,26,46,229,229,14,12,13,0,0,0,255,255,0,127,255,227,3,245,4,123,16,6, + 2,22,0,0,255,255,0,113,255,227,3,231,4,123,16,39,0,121,1,79,255,132,16,6,0,70,0,0,255,255,0,127,255,227,3,245,4,123,16,39, + 0,121,0,142,255,132,16,6,2,22,0,0,255,255,0,158,255,18,1,195,4,35,18,6,0,30,0,0,0,1,1,115,4,238,3,82,6,102,0,3, + 0,49,64,9,2,180,0,179,4,3,68,1,4,16,212,236,49,0,16,244,236,48,0,75,176,9,84,75,176,14,84,91,88,189,0,4,255,192,0,1, + 0,4,0,4,0,64,56,17,55,56,89,1,51,1,35,2,139,199,254,186,153,6,102,254,136,0,0,0,255,255,0,215,5,70,3,82,7,210,18,38, + 0,106,0,0,17,7,3,27,0,0,1,108,0,20,0,64,7,175,8,159,8,95,8,3,93,64,5,95,8,15,8,2,113,48,0,0,255,255,0,16, + 0,0,5,104,6,102,16,39,3,27,254,218,0,0,16,6,3,38,0,0,255,255,0,219,2,72,1,174,3,70,18,6,0,121,0,0,255,255,255,231, + 0,0,5,117,6,102,16,39,3,27,254,116,0,0,16,7,3,42,0,234,0,0,0,0,255,255,255,243,0,0,6,31,6,102,16,39,3,27,254,128, + 0,0,16,7,3,44,0,228,0,0,0,0,255,255,255,237,0,0,2,125,6,102,16,39,3,27,254,122,0,0,16,7,3,46,0,234,0,0,0,0, + 255,255,255,242,255,227,6,1,6,102,16,39,3,27,254,127,0,0,16,6,3,52,40,0,255,255,255,225,0,0,6,145,6,102,16,39,3,27,254,110, + 0,0,16,7,3,57,1,170,0,0,0,0,255,255,255,219,0,0,6,5,6,102,16,39,3,27,254,104,0,0,16,6,3,61,54,0,255,255,0,5, + 0,0,2,128,7,210,16,39,3,28,255,46,0,0,18,6,3,77,15,0,255,255,0,16,0,0,5,104,5,213,18,6,0,36,0,0,255,255,0,201, + 0,0,4,236,5,213,18,6,0,37,0,0,0,1,0,201,0,0,4,106,5,213,0,5,0,25,64,12,4,149,1,129,0,7,2,4,28,1,4,6, + 16,252,252,204,196,49,0,47,244,236,48,51,17,33,21,33,17,201,3,161,253,41,5,213,170,250,213,0,0,2,0,16,0,0,5,104,5,213,0,2, + 0,6,0,61,64,12,66,0,149,4,129,1,149,3,8,6,3,7,16,212,196,196,49,0,47,236,244,236,48,75,83,88,64,18,0,17,5,4,3,2, + 17,6,6,5,0,17,4,1,17,3,3,4,5,7,16,236,16,236,7,16,236,8,16,236,89,9,1,33,5,1,51,1,2,188,254,102,3,53,251,185, + 2,58,229,2,57,5,14,251,154,168,5,213,250,43,0,0,255,255,0,201,0,0,4,139,5,213,18,6,0,40,0,0,255,255,0,92,0,0,5,31, + 5,213,18,6,0,61,0,0,255,255,0,201,0,0,5,59,5,213,18,6,0,43,0,0,0,3,0,115,255,227,5,217,5,240,0,3,0,18,0,33, + 0,50,64,28,4,149,19,145,34,3,149,0,173,34,11,149,26,140,34,35,16,1,15,25,22,51,0,8,25,30,16,34,16,252,236,196,244,236,196,236, + 49,0,16,244,236,16,244,236,16,244,236,48,1,33,21,33,1,34,7,6,17,16,0,51,50,55,54,17,16,39,38,39,32,0,17,16,7,6,33,32, + 39,38,17,16,55,54,1,197,2,194,253,62,1,98,220,129,130,1,3,220,220,129,128,128,129,220,1,58,1,120,188,188,254,198,254,197,188,189,189,188, + 3,112,170,2,134,164,164,254,229,254,230,254,184,164,164,1,26,1,27,164,164,164,254,91,254,158,254,159,210,211,210,210,1,98,1,98,211,210,0,0, + 255,255,0,201,0,0,1,147,5,213,18,6,0,44,0,0,255,255,0,201,0,0,5,106,5,213,18,6,0,46,0,0,0,1,0,16,0,0,5,104, + 5,213,0,6,0,60,64,11,66,6,149,2,129,5,1,8,4,1,7,16,212,196,196,49,0,47,60,244,236,48,75,83,88,64,18,6,17,3,2,1, + 5,17,4,4,3,6,17,2,0,17,1,1,2,5,7,16,236,16,236,7,16,236,8,16,236,89,51,35,1,51,1,35,1,229,213,2,58,229,2,57, + 210,254,38,5,213,250,43,5,14,0,0,0,255,255,0,201,0,0,6,31,5,213,18,6,0,48,0,0,255,255,0,201,0,0,5,51,5,213,18,6, + 0,49,0,0,0,3,0,201,0,0,4,98,5,213,0,3,0,7,0,11,0,42,64,22,7,149,4,129,11,3,149,0,173,8,149,11,13,4,1,9, + 5,0,8,4,4,12,16,252,60,196,212,60,196,236,49,0,47,236,244,236,16,244,236,48,1,33,21,33,3,33,21,33,17,33,21,33,1,50,2,199, + 253,57,105,3,153,252,103,3,153,252,103,3,113,170,3,14,170,251,127,170,255,255,0,115,255,227,5,217,5,240,18,6,0,50,0,0,255,255,0,201, + 0,0,5,59,5,213,18,6,3,179,0,0,255,255,0,201,0,0,4,141,5,213,18,6,0,51,0,0,0,1,0,201,0,0,4,139,5,213,0,11, + 0,70,64,17,66,10,6,149,7,129,0,4,149,3,13,1,8,4,7,4,12,16,252,60,212,60,204,49,0,47,236,50,244,236,50,48,75,83,88,64, + 18,11,17,5,5,4,10,17,6,6,5,11,17,5,0,17,4,5,4,5,7,16,236,16,236,7,16,236,8,16,236,89,37,33,21,33,53,9,1,53, + 33,21,33,1,1,177,2,218,252,62,1,223,254,33,3,176,253,56,1,223,170,170,170,2,112,2,17,170,170,253,243,0,255,255,255,250,0,0,4,233, + 5,213,18,6,0,55,0,0,255,255,255,252,0,0,4,231,5,213,18,6,0,60,0,0,0,3,0,115,0,0,5,217,5,213,0,8,0,17,0,39, + 0,60,64,16,41,13,25,33,18,26,0,28,37,29,17,4,25,22,16,40,16,252,236,212,60,60,252,60,60,212,236,196,49,0,64,14,17,0,149,29, + 26,27,129,39,9,8,149,37,18,39,47,212,60,252,60,16,244,212,60,252,60,48,1,6,7,6,21,20,23,22,23,51,54,55,54,53,52,39,38,39, + 3,38,39,38,17,16,55,54,55,53,51,21,22,23,22,17,16,7,6,7,21,35,2,194,150,98,130,130,98,150,202,150,98,128,128,98,150,202,244,158, + 189,189,157,245,202,244,157,188,188,157,244,202,4,142,21,87,115,198,197,115,87,21,21,87,115,197,198,115,87,21,252,16,22,134,160,1,15,1,15,161, + 135,22,159,159,23,134,161,254,241,254,242,161,134,23,157,0,255,255,0,61,0,0,5,59,5,213,18,6,0,59,0,0,0,1,0,115,0,0,5,219, + 5,213,0,29,0,46,64,23,16,13,149,27,2,21,14,7,129,0,31,21,28,22,2,14,28,27,15,8,28,7,30,16,220,236,212,60,252,60,212,236, + 204,49,0,47,228,50,50,220,60,236,50,48,33,54,39,34,39,38,3,17,51,17,16,23,22,23,17,51,17,54,55,54,25,1,51,17,2,7,6,35, + 6,23,2,194,1,1,214,188,184,5,213,130,110,138,202,138,110,130,213,5,184,188,214,1,1,134,176,210,204,1,104,1,153,254,103,254,230,164,140,14, + 3,241,252,15,14,140,164,1,26,1,153,254,103,254,152,204,210,72,238,0,0,1,0,78,0,0,5,207,5,231,0,38,0,51,64,27,11,149,30,145, + 38,3,18,21,149,2,20,3,7,25,40,16,0,34,51,26,18,14,25,21,26,16,39,16,252,196,252,196,16,244,196,236,252,196,49,0,47,60,236,50, + 50,50,244,236,48,37,21,33,53,54,55,54,53,52,39,38,35,34,0,21,20,23,22,23,21,33,53,33,38,39,38,53,16,55,54,33,32,23,22,17, + 20,7,6,7,5,207,253,168,177,99,99,132,132,216,216,254,247,99,100,178,253,168,1,63,158,73,72,192,191,1,49,1,47,193,192,71,71,161,178,178, + 178,97,166,166,202,240,145,145,254,221,239,202,166,166,97,178,178,139,149,149,184,1,62,197,197,197,196,254,203,194,148,148,141,0,0,0,255,255,0,6, + 0,0,2,88,7,78,16,39,22,185,3,47,1,117,19,6,3,46,0,0,0,8,180,9,3,6,8,7,43,49,0,0,255,255,255,252,0,0,4,231, + 7,78,16,39,22,185,4,113,1,117,19,6,3,57,0,0,0,8,180,12,2,7,8,7,43,49,0,0,255,255,0,113,255,231,4,228,6,102,18,38, + 3,69,0,0,16,6,3,27,110,0,0,0,255,255,0,133,255,227,3,200,6,102,16,38,3,27,80,0,18,6,3,73,0,0,0,0,255,255,0,186, + 254,86,4,100,6,102,16,39,3,27,0,198,0,0,18,6,3,75,0,0,255,255,0,166,0,0,2,152,6,102,18,38,3,77,0,0,16,7,3,27, + 255,70,0,0,255,255,0,149,255,227,4,42,7,210,18,38,3,89,0,0,16,6,3,28,27,0,0,0,0,2,0,113,255,231,4,228,4,121,0,13, + 0,42,0,200,64,11,18,17,7,44,16,23,7,18,37,69,43,16,252,236,212,196,196,18,57,57,64,10,63,16,47,16,31,16,3,143,16,1,93,113, + 0,64,17,18,17,11,3,185,41,184,25,11,185,33,140,15,188,22,135,25,47,236,228,244,236,16,244,236,17,57,57,5,64,20,29,17,0,17,14,17, + 18,17,17,16,15,17,14,17,0,17,29,17,17,16,7,16,60,236,236,236,8,7,16,60,236,236,49,48,1,64,11,132,18,134,17,136,1,137,13,128, + 16,5,93,64,19,73,19,73,18,73,28,74,29,78,13,76,0,78,1,73,14,75,17,9,93,64,17,58,14,57,18,58,17,56,29,56,17,63,13,60, + 0,62,1,8,93,64,11,43,13,43,1,42,0,41,14,41,17,5,93,64,13,25,15,24,14,27,13,27,1,26,0,25,17,6,93,0,64,5,43,30, + 43,31,2,93,1,39,38,35,34,7,6,21,20,23,22,51,50,55,27,1,51,3,23,22,23,22,59,1,21,35,34,39,38,39,6,7,6,35,34,39, + 38,17,16,55,54,51,32,3,78,44,45,178,134,61,77,75,76,121,134,72,164,99,164,205,40,9,35,41,32,88,110,94,84,41,17,46,94,44,143,235, + 114,117,127,141,198,1,55,2,9,231,237,110,138,182,220,105,107,213,1,231,1,37,253,161,219,49,41,48,156,84,42,88,111,87,41,152,157,1,19,1, + 38,138,154,0,0,2,0,192,254,86,4,136,6,33,0,14,0,28,0,55,64,15,24,18,7,30,69,19,18,11,22,0,28,8,3,70,29,16,252,236, + 50,196,212,236,228,212,236,49,0,64,14,26,185,5,9,21,185,22,17,185,13,140,2,189,29,16,236,244,236,212,252,57,212,236,48,37,17,35,17,16, + 33,32,17,16,7,4,17,16,33,34,3,22,51,32,17,16,5,53,32,17,52,35,32,17,1,121,185,1,170,1,178,172,1,24,254,30,212,89,111,197, + 1,32,254,48,1,107,234,254,251,69,254,17,6,3,1,200,254,127,254,238,100,90,254,245,254,38,1,74,173,1,58,1,26,22,170,1,64,219,254,200, + 0,1,0,32,254,86,4,127,4,96,0,14,0,64,64,7,16,3,7,8,4,12,15,16,212,212,252,212,196,49,0,64,7,2,12,191,6,189,4,7, + 47,60,236,228,50,48,5,64,18,1,17,8,7,2,17,3,4,3,14,13,1,17,0,17,7,8,7,7,16,236,236,57,57,7,16,236,8,236,1,19, + 1,51,1,17,35,17,1,38,43,1,53,51,50,1,105,245,1,94,195,254,59,184,254,218,44,95,49,70,197,3,176,253,76,3,100,251,160,254,86,1, + 170,3,68,126,158,0,0,0,0,2,0,113,255,227,4,117,5,240,0,28,0,45,0,84,64,20,6,5,40,4,47,69,28,40,18,10,81,18,4,18, + 24,33,18,18,69,46,16,252,236,212,236,16,244,178,127,10,1,93,236,196,236,17,18,57,57,0,64,14,6,5,37,2,28,0,2,185,26,37,185,14, + 140,46,16,244,236,212,252,212,204,17,18,57,57,64,6,22,29,83,5,6,5,7,14,16,236,57,49,48,1,38,35,34,21,20,5,22,23,22,17,16, + 7,6,35,34,39,38,17,52,55,54,55,38,53,16,33,50,23,1,6,7,6,21,20,23,22,51,50,54,53,52,39,38,39,38,3,236,102,239,253,1, + 8,208,117,142,137,137,240,239,138,137,137,53,75,156,1,185,221,120,254,24,68,55,86,85,86,149,147,172,91,97,126,64,5,17,70,117,92,48,37,112, + 135,254,235,254,247,156,157,157,156,1,19,204,165,64,36,79,141,1,16,70,254,40,29,73,113,204,203,114,115,232,190,199,96,103,11,6,0,1,0,133, + 255,227,3,200,4,124,0,50,0,61,64,34,12,134,11,136,16,185,8,184,51,27,169,24,51,39,134,40,136,35,185,44,140,51,52,25,11,39,20,8, + 4,31,8,48,69,51,16,252,236,212,236,212,196,196,196,49,0,16,244,236,244,236,16,212,236,16,244,236,244,236,48,1,38,39,38,53,52,55,54,51, + 50,22,23,21,38,39,38,35,34,7,6,21,20,23,22,59,1,21,35,34,7,6,21,20,23,22,51,50,55,54,55,21,6,7,6,35,34,39,38,53, + 52,54,1,139,112,60,60,114,113,196,76,170,98,97,80,81,71,119,69,70,68,67,116,155,148,137,72,78,84,85,151,93,85,85,71,90,84,85,80,238, + 129,129,138,2,92,24,65,64,93,141,79,78,24,24,167,29,13,13,46,46,64,70,45,44,152,51,56,88,90,56,56,18,19,37,171,28,14,14,91,91, + 173,108,146,0,0,1,0,107,254,82,3,248,6,20,0,29,0,62,64,11,10,14,18,31,4,25,24,28,18,20,30,16,212,236,212,212,212,196,252,204, + 75,176,16,81,88,185,0,22,0,64,56,89,49,0,64,14,8,185,10,0,185,18,140,30,26,23,135,24,151,30,16,244,236,50,16,244,236,220,236,48, + 37,22,23,22,21,20,7,6,35,52,53,22,55,54,53,52,39,38,35,32,3,16,1,33,53,33,21,0,17,16,2,202,132,79,84,74,80,163,69,42, + 32,32,31,58,253,162,1,2,59,253,236,3,102,253,44,127,1,75,79,120,115,80,87,75,76,5,44,35,37,53,44,42,2,51,1,236,1,89,185,185, + 254,148,254,39,254,105,0,0,0,1,0,186,254,86,4,100,4,123,0,21,0,49,64,22,6,135,14,18,184,12,188,2,189,11,23,70,3,8,0,78, + 9,13,8,12,70,22,16,252,236,50,244,236,236,49,0,47,236,228,244,196,236,48,64,5,160,23,128,23,2,1,93,1,17,35,17,52,38,35,34,6, + 21,17,35,17,51,21,54,55,54,51,50,23,22,4,100,184,124,124,149,172,185,185,66,89,90,117,193,99,99,2,164,251,178,4,72,159,158,190,164,253, + 135,4,96,174,101,50,50,119,120,0,0,0,0,3,0,113,255,233,4,117,6,36,0,8,0,17,0,33,0,79,64,27,13,185,18,151,34,1,149,17, + 34,5,185,26,140,34,35,69,0,9,18,22,81,1,17,18,30,69,34,16,252,236,50,244,178,127,22,1,93,236,50,236,49,0,16,244,236,16,212,64, + 7,63,17,31,17,15,17,3,93,236,16,244,236,48,64,11,25,6,22,4,119,4,160,35,128,35,5,1,93,1,33,18,23,22,51,50,55,54,19,2, + 39,38,35,34,7,6,3,1,50,23,22,17,16,7,6,35,34,39,38,17,16,55,54,3,177,253,131,15,69,86,149,150,83,73,9,28,54,86,147,153, + 81,64,19,1,61,240,137,137,137,137,240,241,136,137,137,136,2,198,254,213,127,156,157,138,1,201,1,28,100,158,156,126,254,252,2,180,212,211,254,138, + 254,139,212,213,213,212,1,117,1,118,211,212,0,1,0,166,0,0,2,110,4,96,0,13,0,27,64,7,15,6,0,8,13,70,14,16,252,252,212,196, + 49,0,64,5,13,188,5,135,8,47,236,228,48,1,17,20,23,22,59,1,21,35,34,39,38,53,3,1,99,34,36,108,89,111,180,82,82,1,4,96, + 253,43,145,46,48,156,96,98,212,2,202,0,0,1,0,191,0,0,4,133,4,96,0,11,0,73,64,9,13,6,4,9,1,8,11,70,12,16,252,236, + 50,196,212,196,49,0,64,5,3,0,188,7,11,47,60,228,50,48,64,22,8,17,9,4,5,7,17,6,6,5,8,5,9,4,3,17,4,2,17,9, + 9,4,7,16,4,236,16,5,236,9,60,60,7,16,5,236,16,8,236,19,51,17,1,51,9,1,35,1,7,17,35,191,190,1,227,224,254,71,1,254, + 225,254,98,137,190,4,96,254,47,1,209,254,90,253,70,2,66,129,254,63,0,1,0,61,0,0,4,127,6,20,0,13,0,70,64,5,15,1,11,5, + 14,16,212,196,212,196,49,0,64,6,10,135,11,151,2,5,47,60,244,236,48,64,24,3,17,1,0,6,4,17,5,6,5,7,17,6,17,3,17,1, + 0,0,2,17,0,1,0,7,16,5,236,16,9,236,236,5,236,7,16,5,236,16,8,236,9,1,35,9,1,35,1,39,38,43,1,53,23,22,2,122, + 2,5,195,254,198,254,126,195,1,235,74,47,107,96,117,226,5,101,250,155,3,60,252,196,4,50,198,126,158,2,3,0,255,255,0,174,254,86,4,229, + 4,96,16,6,0,119,0,0,0,1,0,74,0,0,4,24,4,96,0,21,0,66,64,7,23,7,18,17,0,1,22,16,212,196,212,236,196,49,64,4, + 11,1,188,0,0,47,228,50,48,64,22,20,19,18,3,17,21,17,6,5,4,3,7,3,17,1,0,0,2,17,1,1,0,7,16,5,236,16,9,236, + 18,23,57,5,236,18,23,57,33,1,51,1,54,55,54,55,54,39,38,39,51,49,22,23,22,21,20,7,6,7,1,160,254,170,198,1,33,120,100,76, + 4,2,24,28,106,186,69,46,42,136,177,123,4,96,252,84,124,172,129,112,53,100,119,131,89,124,114,78,196,175,228,116,0,1,0,107,254,82,4,1, + 6,20,0,38,0,64,64,15,10,14,18,40,4,34,29,28,32,18,24,37,18,20,39,16,212,236,212,236,212,212,196,212,196,252,204,49,64,18,8,185, + 10,0,185,18,140,39,22,35,135,34,30,27,135,28,151,39,0,16,244,252,60,212,236,57,16,244,236,220,236,48,37,22,23,22,21,20,7,6,35,52, + 53,22,55,54,53,52,39,38,35,32,17,16,37,36,17,52,55,35,53,33,21,32,17,20,5,21,36,19,18,2,218,132,79,84,74,80,163,69,42,32, + 32,31,58,253,145,1,77,254,232,220,208,3,21,253,139,2,16,253,198,2,1,127,1,75,79,120,115,80,87,75,76,5,44,35,37,53,44,42,1,181, + 1,44,88,36,1,4,197,82,185,185,254,221,191,9,170,22,254,188,254,241,255,255,0,113,255,227,4,117,4,123,18,6,0,82,0,0,0,1,0,74, + 255,217,4,152,4,96,0,23,0,47,64,11,25,10,1,18,8,3,19,8,0,22,24,16,220,196,236,212,236,196,196,204,49,64,12,7,135,14,140,21, + 3,19,23,135,0,188,21,0,47,244,236,50,50,16,244,236,48,19,33,21,35,17,20,22,51,50,54,55,21,14,1,35,34,38,53,17,33,17,35,17, + 35,74,4,49,141,49,55,15,44,7,35,74,37,120,92,254,99,188,143,4,96,184,253,80,72,63,5,1,133,13,12,131,176,2,156,252,88,3,168,0, + 0,2,0,186,254,86,4,164,4,123,0,17,0,29,0,49,64,25,21,185,4,184,30,27,185,10,140,15,189,30,31,69,18,18,7,81,13,8,24,18, + 16,70,30,16,252,236,236,244,178,127,7,1,93,236,236,49,0,16,236,244,236,16,244,236,48,1,54,55,54,51,50,0,17,16,2,35,34,38,39,17, + 35,17,52,5,52,38,35,34,6,21,20,22,51,50,54,1,20,61,151,59,182,204,0,255,255,204,123,177,58,185,3,43,167,146,146,167,167,146,146,167, + 3,152,102,90,35,254,188,254,248,254,248,254,188,97,100,253,174,3,207,231,221,203,231,231,203,203,231,231,0,1,0,113,254,82,3,231,4,123,0,36, + 0,54,64,12,29,33,18,23,38,9,72,16,18,3,69,37,16,252,236,244,204,212,252,196,49,64,17,27,185,29,19,185,0,140,37,9,134,10,136,13, + 185,6,184,37,0,16,244,252,244,236,16,244,236,220,236,48,5,32,0,17,16,0,33,50,22,23,21,46,1,35,34,6,21,20,22,51,50,23,22,21, + 20,7,6,35,52,53,22,55,54,53,52,39,38,2,168,254,243,254,214,1,45,1,6,85,162,76,78,157,80,179,198,198,175,131,80,84,74,80,163,69, + 42,32,32,31,29,1,62,1,14,1,18,1,58,35,35,172,43,43,227,205,205,227,76,79,120,115,80,87,75,76,5,44,35,37,53,44,42,0,0,0, + 0,2,0,113,255,227,4,214,4,96,0,13,0,30,0,49,64,11,32,15,10,18,19,81,4,18,27,69,31,16,252,236,244,178,127,19,1,93,236,212, + 196,49,64,12,7,185,23,140,31,17,135,0,185,14,188,31,0,16,244,236,236,16,244,236,48,1,34,7,6,21,20,22,51,50,54,53,52,39,38,39, + 33,21,35,22,21,16,7,6,35,34,39,38,17,16,55,54,2,115,152,82,86,171,149,147,172,86,79,154,2,99,206,109,137,137,240,241,136,137,137,113, + 3,206,110,115,190,201,231,232,200,183,122,110,146,184,156,221,254,237,156,157,157,156,1,19,1,21,155,129,0,1,0,100,0,0,4,109,4,96,0,17, + 0,35,64,8,19,13,3,15,8,12,10,18,16,212,196,252,196,196,196,49,0,64,8,15,11,135,12,188,2,185,5,47,236,244,236,50,48,37,22,59, + 1,21,35,34,39,38,53,17,33,53,33,21,33,17,20,2,230,36,108,89,111,180,82,82,254,92,4,9,254,87,204,48,156,96,98,212,2,18,184,184, + 253,227,145,0,0,1,0,149,255,227,4,42,4,96,0,28,0,43,64,10,30,69,9,18,19,0,8,28,70,29,16,252,236,212,236,228,64,7,63,30, + 63,9,63,19,3,93,49,0,64,6,13,28,188,5,185,23,47,236,244,60,48,1,17,20,23,22,51,50,55,54,55,54,39,38,39,51,49,22,23,22, + 21,20,7,6,39,34,39,38,53,3,1,82,50,55,107,150,105,59,15,8,30,28,106,186,70,45,42,128,156,254,179,101,98,1,4,96,253,43,135,64, + 69,208,118,187,102,128,119,131,90,123,115,154,253,187,228,1,120,118,197,2,202,0,0,0,0,2,0,112,254,86,4,209,4,104,0,10,0,41,0,61, + 64,16,43,69,7,18,15,19,2,8,30,22,40,35,18,26,69,42,16,252,236,212,60,204,252,60,212,236,236,49,0,64,16,0,31,185,11,30,184,42, + 3,39,135,19,22,140,21,189,42,16,236,244,60,236,50,16,244,60,236,50,48,1,34,21,17,50,55,54,53,52,39,38,39,50,23,22,17,16,7,6, + 35,17,35,17,34,39,38,17,16,55,54,55,21,6,7,6,21,20,23,22,51,17,16,3,61,65,95,95,85,86,70,54,140,127,137,137,129,203,183,199, + 134,136,136,102,166,66,58,86,86,77,112,3,203,145,253,82,104,93,223,208,112,91,157,132,141,254,217,254,241,161,152,254,110,1,145,153,156,1,19,1, + 30,146,109,28,163,23,78,115,190,202,115,103,2,175,1,46,0,1,0,59,254,85,4,100,4,97,0,23,0,174,64,12,4,16,1,13,4,9,15,20, + 15,3,9,24,16,212,60,212,60,17,18,23,57,177,25,15,16,196,49,64,19,4,16,1,13,4,21,15,8,169,15,9,188,24,20,169,21,2,189,24, + 0,16,252,60,236,16,252,60,236,17,18,23,57,48,176,37,75,83,88,64,18,0,17,17,12,17,5,3,14,0,5,14,17,15,2,17,3,3,14,7, + 5,16,236,16,236,7,8,16,236,16,236,180,13,12,17,14,3,15,180,4,5,0,14,3,15,180,16,12,17,2,15,15,180,1,15,2,0,5,15,180, + 6,7,5,5,4,7,5,17,18,57,180,23,22,17,5,4,7,5,17,18,57,180,11,10,12,17,12,7,5,17,18,57,180,18,19,17,17,12,7,5, + 17,18,57,89,5,3,1,35,1,3,38,43,1,53,23,4,23,19,1,51,1,19,22,59,1,21,39,36,2,220,149,254,205,217,1,178,182,49,154,49, + 70,1,2,65,148,1,51,217,254,78,182,49,154,49,70,254,254,250,1,127,253,208,3,24,1,215,126,158,2,7,167,254,129,2,48,252,232,254,41,126, + 158,2,7,0,0,1,0,112,254,86,4,209,4,96,0,27,0,54,64,13,29,19,8,20,25,13,8,0,12,6,8,5,28,16,220,236,212,60,252,60, + 212,236,204,49,0,64,14,19,12,5,188,28,14,11,135,25,0,140,27,189,28,16,236,244,60,236,50,16,244,60,60,48,5,38,39,38,53,17,51,17, + 20,23,22,23,17,51,17,54,55,54,53,17,51,17,20,7,6,7,17,35,2,69,231,107,131,186,85,74,124,183,131,67,85,186,131,118,220,183,25,37, + 97,119,243,2,137,253,126,183,76,66,14,3,213,252,44,14,66,84,175,2,129,253,120,252,110,99,35,254,110,0,0,0,0,1,0,135,255,227,6,39, + 4,96,0,26,0,56,64,20,18,18,19,28,69,16,18,21,11,8,12,7,18,2,5,18,4,2,69,27,16,252,220,236,16,236,212,252,212,236,236,220, + 236,49,0,64,9,11,18,4,188,14,9,135,23,0,47,60,236,50,244,60,196,48,5,32,17,52,19,51,2,21,16,51,50,17,51,16,51,50,17,52, + 3,51,18,21,16,33,32,3,2,2,38,254,97,155,198,143,222,203,170,203,222,143,198,155,254,97,254,240,33,41,29,2,82,235,1,64,254,192,240,254, + 79,2,26,253,230,1,177,240,1,64,254,192,235,253,174,1,43,254,213,0,255,255,0,5,0,0,2,125,6,16,18,38,3,77,15,0,16,7,0,106, + 255,46,0,0,255,255,0,149,255,227,4,42,6,16,16,38,0,106,29,0,18,6,3,89,0,0,0,0,255,255,0,113,255,227,4,117,6,102,16,38, + 3,27,125,0,18,6,3,83,0,0,0,0,255,255,0,149,255,227,4,42,6,102,16,38,3,27,34,0,18,6,3,89,0,0,0,0,255,255,0,135, + 255,227,6,39,6,102,18,38,3,93,0,0,16,7,3,27,1,89,0,0,0,1,0,201,254,86,5,106,5,213,0,12,0,0,19,51,17,1,33,9, + 2,35,9,1,17,35,201,202,2,158,1,4,253,27,3,26,254,146,134,1,16,253,13,202,5,213,253,137,2,119,253,72,252,227,254,86,1,132,2,245, + 253,49,0,0,0,3,0,167,255,233,4,77,6,36,0,10,0,27,0,39,0,71,64,14,5,28,26,41,69,38,28,13,0,30,28,20,70,40,16,252, + 236,50,212,236,236,212,178,63,26,1,93,236,49,0,64,16,28,11,0,185,30,40,34,185,17,140,40,7,185,23,151,40,16,244,236,16,244,236,16,212, + 182,63,30,31,30,15,30,3,93,236,57,57,48,1,50,54,55,54,53,54,35,34,7,6,1,22,21,20,7,6,32,39,38,2,55,54,23,30,1,18, + 6,7,6,35,16,23,22,51,50,55,62,1,38,1,105,80,203,68,121,1,204,122,93,54,1,238,246,59,126,254,14,139,111,2,120,134,210,164,218,2, + 93,251,89,223,58,80,174,143,87,24,1,173,3,112,4,61,108,147,222,186,108,254,199,167,233,130,95,213,213,168,3,44,190,213,1,1,226,254,229,182, + 150,20,254,234,128,176,156,45,209,158,0,0,0,2,0,113,255,233,4,117,6,36,0,10,0,31,0,55,64,15,11,0,8,33,69,21,7,8,15,21, + 26,8,25,69,32,16,252,236,204,220,236,16,236,252,60,49,0,64,14,4,135,18,151,32,0,135,11,29,135,22,140,26,32,16,204,244,236,220,236,16, + 244,236,48,1,52,39,38,35,34,6,21,20,23,22,5,32,39,38,17,52,54,51,50,18,16,0,32,0,17,23,21,16,18,32,18,3,174,49,66,149, + 83,120,121,74,1,19,254,204,131,211,208,175,218,245,254,228,254,35,254,245,188,176,1,47,165,3,112,246,126,170,137,90,170,90,55,170,65,105,1,54, + 160,222,254,100,252,252,254,101,1,182,1,210,1,160,254,243,254,189,1,66,0,1,0,87,0,0,5,81,5,223,0,32,0,73,64,9,34,0,27,20, + 4,28,15,7,33,16,220,204,252,57,220,196,180,63,0,64,27,2,93,204,49,0,64,17,7,4,20,5,14,149,15,31,0,149,13,149,20,24,17,145, + 5,47,244,60,204,236,236,204,212,236,17,18,57,57,64,9,111,31,127,31,143,31,207,31,4,93,48,1,6,3,6,21,17,35,17,52,39,2,39,38, + 34,7,53,54,50,23,4,19,18,37,54,50,23,22,21,20,7,6,35,34,4,70,160,82,42,203,42,82,160,77,119,40,31,111,85,1,67,72,107,1, + 31,38,95,42,83,17,25,75,133,5,17,72,254,243,141,165,253,118,2,138,165,141,1,13,72,35,9,170,10,13,48,254,114,1,123,67,9,32,64,91, + 41,47,66,0,255,255,255,225,0,0,6,161,6,102,16,39,3,27,254,110,0,0,16,7,3,102,1,80,0,0,0,0,255,255,0,87,0,0,5,81, + 7,78,16,39,22,185,4,197,1,117,18,6,3,102,0,0,0,3,0,112,254,86,4,209,6,20,0,21,0,30,0,39,0,65,64,16,41,26,18,6, + 9,1,30,8,12,20,32,36,18,16,69,40,16,252,236,212,60,60,252,60,60,212,236,196,49,64,18,30,32,135,1,20,184,40,22,31,135,9,12,140, + 21,151,11,189,40,0,16,236,228,244,60,252,60,16,244,60,252,60,48,1,17,50,23,22,17,16,7,6,35,17,35,17,34,39,38,17,16,55,54,51, + 17,19,50,55,54,55,54,39,38,35,3,17,34,7,6,23,22,23,22,2,252,199,133,137,137,133,199,183,199,134,136,136,134,199,183,113,77,84,1,1, + 86,77,113,183,113,76,87,1,1,85,76,6,20,254,99,153,156,254,237,254,237,156,153,254,111,1,145,153,156,1,19,1,19,156,153,1,157,250,119,103, + 115,202,200,117,103,252,184,3,72,103,117,200,202,115,103,0,0,2,0,65,255,227,6,109,4,96,0,16,0,30,0,69,64,22,4,17,18,16,4,6, + 14,32,69,3,29,18,6,24,8,25,20,18,1,14,69,31,16,252,196,236,212,252,212,236,196,236,17,18,23,57,49,0,64,15,24,16,17,3,135,1, + 188,31,27,22,135,8,12,140,31,16,244,60,236,50,16,244,236,50,50,204,48,19,53,33,21,35,22,21,16,37,36,3,2,33,32,17,52,55,41,1, + 6,21,16,51,50,3,51,2,55,54,17,52,65,6,44,147,77,254,97,254,241,34,41,254,248,254,97,77,4,58,252,146,71,222,207,4,170,4,207,222, + 3,168,184,184,207,164,253,173,1,1,1,42,254,213,2,82,164,207,209,167,254,79,2,26,253,227,3,3,1,174,167,0,0,1,0,112,254,91,4,205, + 4,103,0,57,0,0,5,38,39,38,52,55,7,2,7,6,35,34,53,52,1,54,53,52,39,38,35,34,7,53,54,51,50,23,4,17,20,7,55,18, + 55,54,51,50,21,20,1,6,21,20,23,22,51,50,55,2,7,6,34,39,53,22,51,50,3,249,246,33,10,13,189,96,200,55,34,55,1,36,62,14, + 26,142,57,91,64,91,26,27,1,29,29,189,96,200,55,34,55,254,220,62,14,26,142,57,91,38,205,70,162,93,95,73,164,10,32,240,73,129,53,108, + 254,247,124,34,79,154,1,9,138,122,58,54,104,108,224,48,4,39,254,195,91,77,108,1,9,124,34,79,154,254,247,138,122,58,54,104,108,253,224,102, + 36,49,160,49,0,2,0,115,254,88,5,217,5,240,0,17,0,31,0,68,64,14,33,16,29,25,14,10,0,28,3,22,25,7,16,32,16,252,236,220, + 182,0,3,16,3,48,3,3,93,252,57,220,182,0,14,16,14,48,14,3,93,236,236,49,0,64,12,19,149,10,145,32,26,149,0,3,1,189,32,16, + 236,212,60,236,16,244,236,48,5,17,35,17,38,39,38,16,55,54,33,32,23,22,17,16,7,6,2,32,7,6,17,16,23,22,32,55,54,17,16,39, + 3,132,184,252,160,189,189,188,1,59,1,58,188,188,188,159,123,254,72,129,130,130,129,1,184,129,128,128,24,254,112,1,144,26,179,210,2,196,211,210, + 210,211,254,158,254,159,210,179,5,73,164,164,254,229,254,230,164,164,164,164,1,26,1,27,164,0,0,0,0,2,0,113,254,86,4,117,4,123,0,13, + 0,31,0,60,64,16,33,69,10,18,28,0,25,7,14,18,17,4,18,21,69,32,16,252,236,220,178,48,17,1,93,252,57,57,57,220,236,236,49,0, + 64,13,0,185,25,184,32,7,185,14,17,140,15,189,32,16,236,244,60,236,16,244,236,48,1,34,7,6,16,23,22,51,50,54,53,52,39,38,3,17, + 35,17,38,39,38,17,16,55,54,51,50,0,17,16,7,6,2,115,148,86,86,85,86,149,147,172,86,86,57,170,190,107,137,137,136,241,240,1,18,137, + 106,3,223,115,116,254,110,116,115,232,200,199,116,117,252,9,254,110,1,146,27,125,156,1,19,1,20,156,156,254,200,254,236,254,237,156,123,0,0,0, + 0,1,0,139,254,82,4,171,5,213,0,36,0,46,64,10,18,22,18,38,12,35,4,28,30,37,16,220,236,204,212,204,252,196,49,0,64,13,16,149, + 18,8,149,26,140,37,0,149,34,129,37,16,244,236,16,244,236,220,236,48,1,32,7,6,17,16,23,22,51,50,23,22,21,20,7,6,35,52,53,22, + 55,54,53,52,39,38,35,32,39,38,17,16,55,54,41,1,21,3,70,254,243,96,123,91,109,200,122,89,84,74,80,163,69,42,32,32,31,58,254,192, + 142,149,185,138,1,120,1,101,5,43,119,152,254,205,254,181,127,152,84,79,120,115,80,87,75,76,5,44,35,37,53,44,42,203,214,1,101,1,78,237, + 177,170,0,0,0,1,0,113,254,82,4,81,4,96,0,32,0,52,64,11,25,29,18,34,19,7,12,18,3,69,33,16,252,236,204,212,204,252,196,178, + 15,7,1,93,49,0,64,13,23,185,25,15,185,0,140,33,9,185,6,184,33,16,244,236,16,244,236,220,236,48,5,34,0,17,16,0,41,1,21,33, + 34,6,21,20,22,51,50,23,22,21,20,7,6,35,52,53,22,55,54,53,52,39,38,2,103,204,254,214,1,45,1,6,1,173,254,91,179,198,197,111, + 131,80,84,74,80,163,69,42,32,32,32,29,1,62,1,14,1,18,1,31,156,199,206,205,227,76,79,120,115,80,87,75,76,5,44,35,37,53,44,42, + 255,255,0,201,0,0,4,35,5,213,18,6,0,41,0,0,0,1,255,64,254,86,3,70,6,20,0,39,0,54,183,9,20,22,19,18,32,0,40,16, + 220,204,252,60,204,204,49,0,64,20,22,135,19,10,135,9,19,14,135,5,151,40,32,135,31,36,135,27,189,40,16,252,236,212,236,16,244,236,204,212, + 236,16,236,48,51,17,52,55,54,51,50,23,22,23,21,38,39,38,35,34,7,6,21,17,33,21,33,17,20,7,6,35,34,39,38,39,53,22,23,22, + 51,50,55,54,238,136,96,169,49,50,49,51,36,41,41,44,120,58,75,1,65,254,191,139,98,173,57,51,51,46,49,50,50,48,87,64,82,4,130,160, + 142,100,9,9,18,164,28,14,15,62,81,111,254,201,143,253,63,146,165,115,10,11,22,164,31,16,17,75,95,0,0,0,0,1,0,179,255,252,4,212, + 5,213,0,23,0,0,1,3,1,3,6,23,22,55,21,34,39,38,55,19,1,19,54,39,38,7,53,50,23,22,2,54,110,3,12,234,39,27,66,131, + 230,81,95,19,154,253,6,172,39,27,66,131,230,81,95,4,135,254,91,1,126,253,44,96,42,108,35,189,70,82,182,1,218,254,145,2,144,96,42,108, + 35,189,70,82,0,1,0,191,0,0,4,136,6,19,0,7,0,66,64,10,1,2,6,5,3,7,6,0,4,8,16,220,204,23,57,49,0,182,66,3, + 169,7,5,151,1,47,228,212,236,48,75,83,88,64,16,3,17,0,2,17,1,0,1,7,17,4,6,17,5,4,5,7,5,16,236,16,236,7,5,16, + 236,16,236,89,9,1,35,19,33,1,51,3,4,136,254,231,184,226,253,38,1,25,184,226,3,112,252,144,2,198,3,77,253,93,0,0,0,1,0,114, + 254,86,6,96,5,240,0,33,0,0,1,17,35,17,6,7,53,54,33,32,19,18,17,16,3,35,0,17,16,39,6,7,6,21,17,35,54,17,52,63, + 1,2,33,34,2,81,170,205,104,208,1,130,1,217,237,214,246,225,1,4,82,82,95,64,205,2,182,187,208,254,164,48,5,58,253,140,2,73,75,105, + 198,207,254,206,254,236,253,194,254,88,254,146,1,76,1,202,1,209,125,47,77,52,208,253,198,33,2,20,247,143,141,1,4,0,0,0,0,1,0,119, + 254,144,4,150,4,120,0,22,0,0,1,3,35,1,38,39,1,35,1,38,39,38,35,53,32,23,22,19,18,17,35,16,39,3,110,239,185,1,100,14, + 50,254,70,185,2,31,98,46,188,211,1,45,242,224,172,116,168,96,1,52,254,204,1,192,35,77,253,208,2,176,127,33,132,164,216,200,254,80,254,223, + 254,137,1,94,246,0,0,0,0,1,0,115,254,75,7,5,5,213,0,61,0,87,64,28,60,13,1,16,8,0,57,18,58,63,16,53,28,13,0,17, + 43,28,44,34,28,25,30,18,29,25,16,62,16,252,220,236,16,236,212,252,57,212,57,236,236,220,236,16,220,75,83,88,176,9,60,89,93,49,0,64, + 15,9,8,62,43,57,29,129,62,13,38,49,149,21,140,62,16,244,236,50,57,16,244,60,204,16,204,57,48,1,16,7,6,7,6,5,6,7,39,54, + 55,54,55,38,39,38,39,6,7,6,35,34,39,38,17,52,19,54,55,51,6,3,6,21,16,23,22,51,50,55,54,61,1,51,21,20,23,22,51,50, + 55,54,17,52,39,2,39,51,22,23,18,7,5,61,68,219,180,254,236,118,140,97,138,121,205,164,103,68,100,39,39,100,101,146,211,121,123,100,59,93, + 249,84,135,67,72,73,125,114,72,71,199,70,70,116,134,65,71,67,135,84,250,95,56,100,2,224,254,239,203,230,166,136,100,42,23,133,24,48,81,128, + 23,65,94,173,173,94,94,177,180,1,152,201,1,14,159,127,70,254,191,159,183,254,205,107,109,105,104,198,241,241,198,104,105,109,119,1,39,183,159,1, + 65,70,130,156,254,235,0,0,0,1,0,135,254,85,6,39,4,96,0,37,0,83,64,25,16,33,25,22,18,23,39,69,20,18,0,25,2,15,8,16, + 11,18,6,9,18,8,6,69,38,16,252,220,236,16,236,212,252,57,212,57,236,236,220,236,16,220,75,83,88,176,34,60,89,49,0,64,15,34,33,38, + 15,22,8,188,38,0,18,13,135,4,140,38,16,244,236,50,57,16,244,60,196,16,204,57,48,33,36,3,2,33,32,17,52,19,51,2,21,2,23,22, + 3,51,2,55,54,17,52,3,51,18,21,22,7,6,7,6,7,6,7,39,54,55,54,4,136,254,237,30,35,254,242,254,97,135,218,143,1,223,208,5, + 170,3,206,222,143,218,135,1,57,105,197,154,210,107,112,91,81,139,199,1,1,13,254,237,2,58,235,1,64,254,192,240,254,151,1,1,1,212,254,43, + 2,2,1,104,240,1,64,254,192,235,209,132,244,158,123,73,37,16,108,11,43,63,0,0,0,1,0,115,254,86,5,72,5,240,0,29,0,46,64,10, + 15,28,17,12,0,4,28,25,69,30,16,252,236,220,220,60,236,49,0,64,14,0,149,29,140,14,129,30,8,149,21,140,15,189,30,16,236,244,236,16, + 252,244,236,48,1,6,7,6,17,20,23,22,51,50,55,54,25,1,51,17,35,17,6,7,6,35,32,39,38,17,16,19,54,37,2,236,180,96,133,110, + 98,195,196,98,99,217,217,68,104,104,170,255,0,156,162,186,151,1,40,5,74,18,132,185,254,238,249,171,152,152,153,1,11,2,236,248,129,2,144,132, + 64,63,213,221,1,71,1,54,1,8,213,1,0,1,0,113,254,86,4,140,4,123,0,28,0,46,64,10,14,8,16,11,28,4,8,24,69,29,16,252, + 236,220,220,60,236,49,0,64,14,0,135,28,140,13,188,29,7,160,20,140,14,189,29,16,236,244,236,16,252,244,236,48,1,6,7,6,21,20,23,22, + 32,55,54,53,17,51,17,35,17,6,7,6,35,34,39,38,53,52,55,54,51,2,139,154,80,114,94,83,1,76,84,84,184,184,58,88,89,144,218,133, + 137,158,127,253,3,253,14,99,141,208,189,129,116,115,116,203,2,49,249,246,2,82,100,48,49,162,168,248,236,200,162,0,0,1,0,201,254,75,5,226, + 5,213,0,37,0,57,64,14,16,13,12,21,28,39,69,4,29,33,28,32,4,38,16,252,236,50,212,236,236,220,196,75,83,88,177,13,12,16,60,89, + 49,0,64,11,25,149,0,184,30,13,12,189,32,129,30,47,228,252,204,16,244,236,48,1,32,23,22,17,20,7,6,7,6,7,6,7,39,54,55,54, + 55,54,55,54,53,52,39,38,35,34,7,6,21,17,35,17,51,17,54,55,54,3,76,1,39,177,190,60,67,170,195,241,185,73,97,134,125,217,152,136, + 44,54,126,115,205,203,115,113,202,202,78,105,105,4,123,179,194,254,253,204,161,178,128,147,69,53,12,133,22,50,87,122,109,104,127,192,157,150,134,129, + 126,222,254,39,5,213,253,154,135,66,67,0,0,2,0,45,255,227,4,146,4,154,0,23,0,77,0,0,1,38,35,34,7,6,7,6,7,6,21,20, + 23,22,23,22,23,22,51,50,55,54,55,54,37,22,21,20,7,6,33,34,39,38,35,34,7,39,54,51,50,23,22,51,50,55,54,53,52,39,6,7, + 6,7,6,39,38,39,38,39,38,39,38,53,52,55,54,55,54,55,54,51,50,23,54,55,23,6,3,44,127,141,31,55,29,37,29,16,14,12,15,24, + 26,35,32,30,25,71,59,73,36,1,11,108,127,111,254,247,141,99,75,53,65,81,84,135,95,130,82,63,91,157,79,75,49,27,31,70,117,102,71,41, + 72,50,64,48,41,30,29,31,46,62,80,101,94,210,144,56,42,136,55,3,68,152,22,11,33,26,32,27,33,32,21,28,17,20,6,5,25,20,49,24, + 50,192,212,176,156,136,46,35,65,147,76,46,35,94,89,127,140,113,25,23,52,43,38,2,1,10,7,34,26,72,52,66,59,59,61,47,63,34,43,159, + 86,104,80,146,0,1,0,79,254,86,5,11,5,246,0,33,0,0,5,4,33,32,1,0,55,54,53,52,39,38,35,34,7,6,7,35,54,55,54,33, + 32,23,22,21,20,7,0,1,22,51,32,55,4,250,255,0,254,237,254,175,254,185,2,186,179,108,108,99,164,180,94,35,24,240,44,86,163,1,24,1, + 19,161,162,162,254,247,254,24,156,213,1,41,232,236,190,1,163,1,241,219,132,156,141,101,93,146,54,63,161,102,194,144,145,241,216,182,254,242,254,133, + 181,179,0,0,0,1,0,100,254,86,4,106,4,123,0,32,0,0,1,6,35,32,1,0,55,54,53,52,39,38,35,34,7,6,7,35,54,55,54,51, + 50,4,21,20,7,6,1,22,51,50,55,4,92,218,234,254,238,254,222,2,66,167,92,92,84,139,153,80,30,20,204,37,73,139,238,232,1,20,138,175, + 254,47,145,169,253,197,254,239,153,1,121,1,89,194,107,125,111,83,75,117,44,50,129,82,156,232,194,164,156,197,254,224,186,144,0,0,0,2,0,115, + 0,0,5,182,5,239,0,2,0,53,0,0,37,33,9,3,38,39,38,35,34,15,1,53,54,55,54,51,50,23,22,23,9,1,54,55,54,51,50,23, + 22,23,21,39,38,35,34,7,6,7,9,1,22,23,22,59,1,21,33,53,51,50,55,54,1,218,2,110,254,205,254,20,1,128,254,220,19,26,34,63, + 25,22,69,33,32,31,28,114,75,44,47,1,2,1,9,52,39,75,114,29,30,32,33,68,23,24,60,38,19,26,254,210,1,116,6,7,29,69,71,250, + 195,71,72,26,12,170,1,202,254,104,2,61,1,187,29,26,34,4,10,187,11,5,5,67,40,70,254,129,1,127,75,35,67,5,5,11,187,10,4,34, + 17,38,254,69,253,195,9,8,33,170,170,33,15,0,0,0,0,2,0,54,0,0,4,203,4,123,0,2,0,53,0,0,37,33,3,9,1,3,38,39, + 38,35,34,15,1,53,54,55,54,51,50,23,22,23,27,1,54,55,54,51,50,23,22,23,21,39,38,35,34,7,6,7,3,1,22,23,22,59,1,21, + 33,53,51,50,55,54,1,154,1,204,228,254,91,1,57,239,21,17,29,54,21,19,58,28,27,26,24,131,64,37,40,197,197,40,37,64,131,24,26,27, + 28,58,19,21,54,29,17,21,246,1,45,6,5,25,58,73,251,107,73,58,25,5,158,1,56,254,238,1,164,1,61,28,14,25,3,7,141,8,4,4, + 51,30,53,254,250,1,6,53,30,51,4,4,8,141,7,3,25,14,28,254,184,254,103,8,5,25,158,158,25,5,0,0,0,2,0,115,255,227,5,37, + 6,16,0,29,0,43,0,0,1,36,7,6,7,54,55,54,51,50,0,16,0,33,32,39,38,17,16,55,54,33,50,55,54,55,21,6,7,6,18,16, + 38,35,34,7,6,21,20,23,22,51,50,55,3,42,254,214,87,56,22,81,85,123,130,245,1,50,254,206,254,249,254,206,164,163,139,124,1,176,115,149, + 160,75,94,151,108,142,200,186,188,104,105,105,101,191,188,98,5,45,2,115,74,160,86,34,49,254,188,253,240,254,188,156,155,1,80,1,222,210,187,10, + 10,39,177,36,8,6,252,65,1,130,230,115,116,192,189,120,115,115,0,0,0,2,0,113,255,227,4,91,6,16,0,31,0,47,0,0,1,38,7,6, + 7,54,55,54,51,50,23,22,16,7,6,35,34,39,38,17,16,55,54,33,50,55,54,55,21,6,7,6,19,52,39,38,35,34,7,6,21,20,23,22, + 51,50,55,54,2,155,227,73,44,20,41,101,91,120,204,127,128,128,127,219,255,137,136,116,103,1,79,95,92,83,71,93,69,90,168,83,84,146,149,86, + 88,88,84,151,148,82,83,5,55,2,120,74,169,70,54,49,162,162,253,240,162,162,156,155,1,80,1,222,210,187,10,10,39,167,39,5,6,252,248,205, + 114,115,115,116,203,199,120,115,115,116,0,0,0,1,0,44,254,86,4,183,5,213,0,15,0,52,64,13,3,18,0,15,4,28,7,8,18,11,12,7, + 16,16,220,60,220,236,16,252,60,220,236,49,0,64,13,2,9,4,7,149,15,12,188,13,129,5,189,16,16,236,236,244,60,236,50,204,50,48,1,17, + 35,53,33,17,35,17,33,21,35,17,33,17,51,17,4,183,203,254,235,203,254,235,203,1,224,203,4,96,254,242,100,250,160,5,96,100,1,14,1,117, + 254,139,0,0,0,1,0,55,254,85,4,20,5,207,0,15,0,51,64,13,3,8,0,15,4,8,7,8,8,11,12,7,16,16,220,60,220,236,16,252, + 60,220,236,49,0,64,12,2,9,4,7,135,15,12,188,13,5,189,16,16,236,204,244,60,236,50,204,50,48,1,17,35,53,35,17,35,17,35,21,35, + 17,33,17,51,17,4,20,173,229,185,229,173,1,146,185,4,95,255,0,112,250,134,5,122,112,1,0,1,112,254,144,0,0,1,0,112,255,242,4,205, + 4,103,0,51,0,0,1,2,7,6,35,34,53,52,1,54,53,52,39,38,35,34,7,53,54,51,50,23,4,17,20,7,55,18,55,54,51,50,21,20, + 1,6,21,20,23,22,51,50,55,21,6,35,34,39,36,17,52,55,2,40,96,200,55,34,55,1,36,62,14,26,142,57,91,64,91,26,27,1,29,29, + 189,96,200,55,34,55,254,220,62,14,26,142,57,91,64,91,26,27,254,227,29,1,153,254,247,124,34,79,154,1,9,138,122,58,54,104,108,224,48,4, + 37,254,193,91,77,108,1,9,124,34,79,154,254,247,138,122,58,54,104,108,224,48,4,37,1,63,91,77,0,2,0,186,254,86,4,164,4,123,0,24, + 0,36,0,58,64,14,20,38,69,26,18,10,81,17,8,31,18,0,70,37,16,252,236,236,244,178,127,10,1,93,236,236,196,49,0,64,15,19,185,22, + 28,185,6,184,37,34,185,13,140,22,189,37,16,236,244,236,16,244,236,16,236,48,19,52,55,54,55,54,51,50,23,22,16,7,6,35,34,39,38,39, + 18,41,1,21,33,32,17,36,16,39,38,32,7,6,16,23,22,32,55,186,90,54,158,59,182,204,127,128,128,127,204,120,91,89,58,5,1,32,1,244, + 254,28,254,18,3,43,83,84,254,220,84,83,83,84,1,36,84,2,37,208,163,98,94,35,162,162,253,240,162,162,49,48,100,254,88,170,2,218,52,1, + 150,116,115,115,116,254,106,116,115,115,0,0,255,255,0,113,255,227,3,231,4,123,18,6,0,70,0,0,255,255,255,219,254,86,1,121,6,20,18,6, + 0,77,0,0,255,255,0,115,255,227,5,217,5,240,18,6,1,97,0,0,0,1,0,113,255,227,3,216,4,123,0,33,0,0,1,38,39,38,35,34, + 7,6,7,33,21,33,22,23,22,51,50,63,1,21,7,6,35,32,39,38,16,55,54,33,50,23,22,23,3,216,37,37,99,106,183,102,95,18,2,165, + 253,91,18,95,102,183,128,77,74,79,104,107,254,244,156,157,157,156,1,12,101,110,40,39,3,174,13,10,26,99,92,169,144,169,92,99,26,25,167,18, + 22,156,156,2,40,156,156,22,8,12,0,0,0,1,0,196,255,227,4,43,4,123,0,33,0,0,19,53,54,55,54,51,32,23,22,16,7,6,33,34, + 47,1,53,23,22,51,50,55,54,55,33,53,33,38,39,38,35,34,7,6,196,39,40,110,101,1,12,156,157,157,156,254,244,107,104,79,74,77,128,183, + 102,95,18,253,91,2,165,18,95,102,183,106,99,37,3,174,163,12,8,22,156,156,253,216,156,156,22,18,167,25,26,99,92,169,144,169,92,99,26,10, + 255,255,0,201,0,0,4,141,5,213,18,6,0,160,0,0,255,255,0,186,254,86,4,164,6,20,18,6,0,192,0,0,255,255,0,115,255,227,5,39, + 5,240,18,6,0,38,0,0,0,1,0,201,0,0,6,31,5,213,0,12,0,148,64,16,9,8,3,2,1,5,10,6,28,4,62,10,28,0,4,13, + 16,252,236,252,236,17,23,57,49,0,64,12,66,10,7,2,3,8,3,0,175,8,11,5,47,60,196,236,50,17,23,57,48,75,83,88,64,24,3,17, + 7,8,7,2,17,1,2,8,8,7,2,17,3,2,9,10,9,1,17,10,10,9,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,89,178, + 112,14,1,1,93,64,17,4,2,6,7,6,10,54,2,73,7,73,10,89,7,89,10,8,64,21,2,1,13,3,22,8,25,9,38,1,41,3,53,1, + 58,3,69,8,74,9,10,93,0,93,19,33,9,1,33,17,35,17,1,35,1,17,35,201,1,45,1,125,1,127,1,45,197,254,127,203,254,127,196,5, + 213,254,33,1,223,250,43,5,31,254,25,1,231,250,225,0,0,1,0,127,254,86,4,179,4,96,0,12,0,79,64,9,14,70,7,8,4,10,8,0, + 13,16,220,236,220,236,236,49,0,64,13,66,10,7,2,3,9,3,0,188,9,12,189,6,47,236,196,236,50,17,23,57,48,75,83,88,64,18,2,17, + 8,10,9,3,17,7,8,7,2,17,9,1,17,10,10,9,5,7,16,237,16,237,7,16,237,8,16,237,89,19,33,19,1,33,17,35,17,1,35,1, + 17,35,127,1,27,254,1,0,1,27,185,254,236,153,254,235,185,4,96,254,123,1,133,251,160,3,178,254,96,1,160,250,164,0,0,0,0,2,0,85, + 254,86,4,164,4,123,0,27,0,39,0,0,23,17,52,55,54,55,54,51,50,23,22,16,7,6,35,34,39,38,39,17,33,21,33,21,35,53,35,53, + 0,16,39,38,32,7,6,16,23,22,32,55,186,90,61,151,59,182,204,127,128,128,127,204,123,88,89,58,1,229,254,27,185,101,3,144,83,84,254,220, + 84,83,83,84,1,36,84,144,2,181,231,140,102,90,35,162,162,253,240,162,162,49,48,100,254,200,170,112,112,170,1,244,1,150,116,115,115,116,254,106, + 116,115,115,0,255,255,0,115,255,227,5,39,5,240,18,6,1,72,0,0,255,255,0,115,255,227,5,39,5,240,18,38,3,141,0,0,16,7,0,121, + 2,51,0,0,255,255,0,115,255,227,5,39,5,240,16,39,0,121,0,228,0,0,18,6,3,145,0,0,255,255,0,201,0,0,4,139,7,107,18,38, + 3,169,0,0,16,7,22,188,4,238,1,117,255,255,0,201,0,0,4,139,7,78,18,38,3,169,0,0,17,7,22,185,4,157,1,117,0,133,177,146, + 151,66,176,147,176,152,66,177,128,4,66,177,129,0,66,124,176,0,176,1,35,73,176,19,176,14,35,73,97,176,128,98,104,176,19,70,97,176,0,70, + 96,176,146,67,176,1,96,35,66,176,146,67,176,1,96,67,176,0,85,88,176,14,176,146,67,176,1,96,67,56,176,14,17,176,1,53,89,177,128,0, + 66,177,129,0,66,24,176,0,16,176,19,176,14,176,1,35,73,104,59,176,19,17,176,2,53,0,176,0,176,19,35,73,176,64,80,88,176,19,176,64, + 56,176,19,17,176,2,53,176,1,53,89,0,0,1,255,250,254,102,5,172,5,213,0,27,0,52,64,11,5,10,28,27,20,14,22,28,19,17,28,16, + 212,204,252,60,204,220,252,204,49,0,64,15,5,149,4,176,16,14,149,23,16,22,17,149,19,129,16,47,244,236,50,16,212,236,16,244,236,48,37,16, + 6,43,1,53,51,50,54,53,17,52,38,35,33,17,35,17,33,53,33,21,33,17,33,50,22,21,5,172,204,228,76,62,134,111,124,124,254,136,203,254, + 82,4,139,253,238,1,161,186,222,104,254,242,244,170,150,194,1,34,159,158,253,57,5,43,170,170,254,70,233,238,0,0,255,255,0,201,0,0,4,106, + 7,107,18,38,3,167,0,0,16,7,22,186,4,174,1,117,0,1,0,115,255,227,5,39,5,240,0,24,0,78,64,9,26,18,11,0,17,20,25,6, + 25,16,220,236,50,212,60,204,204,49,0,64,23,19,149,18,173,25,12,161,11,174,14,149,9,145,25,0,161,1,174,23,149,3,140,25,16,244,236,244, + 236,16,244,236,244,236,16,244,236,177,18,14,73,177,23,19,73,80,88,179,18,19,64,2,23,56,89,48,1,21,6,33,32,0,17,16,0,33,32,23, + 21,38,33,32,2,7,33,21,33,22,18,33,32,5,39,212,254,245,254,177,254,122,1,134,1,79,1,15,208,211,255,0,254,248,238,22,3,30,252,226, + 22,238,1,8,1,0,1,70,211,144,1,159,1,104,1,103,1,159,142,213,189,254,227,239,170,239,254,228,255,255,0,135,255,227,4,162,5,240,18,6, + 0,54,0,0,255,255,0,201,0,0,1,147,5,213,18,6,0,44,0,0,255,255,0,6,0,0,2,88,7,78,16,6,0,145,0,0,255,255,255,150, + 254,102,1,147,5,213,18,6,0,45,0,0,0,2,0,84,0,0,8,47,5,213,0,20,0,28,0,51,64,12,23,25,16,0,28,27,11,1,28,10, + 6,29,16,212,212,236,212,60,236,220,236,49,0,64,14,27,149,12,173,20,1,149,10,129,28,6,149,5,20,47,60,236,50,244,236,16,252,236,48,1, + 33,21,16,2,5,53,54,18,17,53,33,17,51,50,4,21,20,4,35,33,37,32,17,52,38,43,1,17,4,112,254,27,200,254,145,217,149,3,120,234, + 251,1,16,254,240,251,254,76,1,170,1,64,157,163,224,5,43,184,253,202,253,251,56,170,47,1,166,2,88,254,253,154,218,221,222,218,166,1,17,139, + 135,253,221,0,0,2,0,201,0,0,7,204,5,213,0,18,0,27,0,53,64,14,19,25,15,8,0,28,23,10,7,2,28,5,4,28,16,252,236,50, + 220,60,236,50,220,236,49,0,64,13,23,1,149,11,7,173,9,5,129,24,149,0,4,47,60,236,228,50,252,60,236,50,48,33,17,33,17,35,17,51, + 17,33,17,51,17,51,50,4,21,20,4,35,1,52,38,43,1,17,51,50,54,4,13,253,134,202,202,2,122,202,234,251,1,16,254,240,251,1,54,157, + 163,224,224,161,159,2,199,253,57,5,213,253,156,2,100,253,154,218,222,221,218,1,183,139,135,253,221,135,0,1,255,250,0,0,5,172,5,213,0,19, + 0,44,64,10,6,28,3,16,10,18,28,14,13,20,16,212,204,252,60,204,220,236,49,0,64,11,10,149,19,12,18,13,149,15,129,5,12,47,60,244, + 236,50,16,212,236,48,1,50,22,21,17,35,17,52,38,35,33,17,35,17,33,53,33,21,33,17,4,20,186,222,201,124,124,254,136,203,254,82,4,139, + 253,238,3,113,233,238,254,102,1,138,159,158,253,57,5,43,170,170,254,70,255,255,0,201,0,0,5,134,7,107,18,38,3,174,0,0,16,7,22,186, + 4,238,1,117,255,255,0,201,0,0,5,51,7,107,18,38,3,172,0,0,16,7,22,188,4,229,1,117,255,255,0,35,0,0,4,189,7,109,16,39, + 22,192,4,114,1,117,18,6,3,183,0,0,0,1,0,201,254,191,5,59,5,213,0,11,0,41,64,13,13,4,6,28,7,11,149,9,3,28,2,4, + 12,16,252,236,212,252,212,236,236,49,0,183,11,4,149,6,2,129,9,1,47,60,228,50,236,204,48,41,1,17,51,17,33,17,51,17,33,17,35,2, + 173,254,28,202,2,222,202,254,28,170,5,213,250,213,5,43,250,43,254,191,255,255,0,16,0,0,5,104,5,213,18,6,0,36,0,0,0,2,0,201, + 0,0,4,236,5,213,0,8,0,21,0,46,64,12,23,9,0,25,16,46,4,11,28,21,4,22,16,252,236,50,244,236,196,204,49,0,64,12,11,149, + 21,129,20,4,149,12,173,5,149,20,47,236,244,236,16,244,236,48,1,52,38,35,33,17,33,50,54,19,21,33,17,33,50,4,21,20,4,41,1,17, + 4,23,157,163,254,188,1,68,163,157,108,253,16,1,78,251,1,16,254,249,254,252,253,232,1,183,139,135,253,221,135,4,168,166,254,64,218,222,221,218, + 5,213,0,0,255,255,0,201,0,0,4,236,5,213,18,6,0,37,0,0,0,1,0,201,0,0,4,106,5,213,0,5,0,25,64,12,4,149,1,129, + 0,7,2,4,28,1,4,6,16,252,252,204,196,49,0,47,244,236,48,51,17,33,21,33,17,201,3,161,253,41,5,213,170,250,213,0,0,2,0,101, + 254,191,5,219,5,213,0,7,0,23,0,52,64,15,2,28,14,19,149,25,16,23,3,28,13,20,149,23,24,16,220,236,212,236,16,212,204,252,60,236, + 49,0,64,11,3,149,13,129,18,22,15,0,23,149,20,47,236,50,50,204,50,244,236,48,37,33,17,33,21,16,3,6,5,54,55,18,25,1,33,17, + 51,17,35,17,33,17,35,17,1,211,2,148,254,27,112,23,254,177,134,38,97,3,120,170,170,251,222,170,170,4,129,212,254,13,254,181,68,43,63,120, + 1,52,2,38,1,26,250,213,254,21,1,65,254,191,1,235,255,255,0,201,0,0,4,139,5,213,18,6,0,40,0,0,0,1,0,40,0,0,8,118, + 5,213,0,19,0,152,64,11,8,5,1,4,6,9,1,28,12,0,20,16,220,60,236,50,212,196,17,57,57,49,0,64,17,66,13,12,16,19,8,9, + 5,2,8,18,3,0,175,15,10,6,47,60,60,236,50,50,23,57,48,75,83,88,64,22,7,17,6,8,17,5,9,4,6,5,3,17,4,2,17,5, + 8,9,9,4,9,4,9,7,16,60,60,4,237,16,5,237,7,8,16,237,5,16,237,89,1,64,19,13,1,8,14,1,7,15,1,6,16,1,5,17, + 1,4,18,1,3,0,16,73,58,73,58,73,58,73,58,73,58,73,58,0,64,8,19,2,16,5,13,8,12,9,16,60,16,60,16,60,16,60,1,51, + 17,1,51,9,1,35,9,1,17,35,17,9,1,35,9,1,51,1,3,234,202,2,170,245,253,223,2,68,211,254,19,254,254,202,254,254,254,19,211,2, + 68,253,223,245,2,170,5,213,253,30,2,226,253,179,252,120,3,1,254,233,254,22,1,234,1,23,252,255,3,136,2,77,253,30,0,0,0,1,0,135, + 255,227,4,154,5,240,0,40,0,63,64,12,27,31,25,3,42,22,25,9,37,16,6,41,16,252,50,212,236,204,212,252,204,49,0,64,22,26,149,27, + 12,16,161,15,174,19,149,12,37,161,38,174,34,149,0,145,12,140,41,16,228,244,236,244,236,16,236,244,236,16,212,236,48,1,50,4,21,20,6,7, + 30,1,21,20,4,35,34,36,39,53,30,1,51,50,54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,7,53,62,1,2,73,246,1,56,142, + 131,145,163,254,157,238,122,254,228,44,153,169,124,188,208,185,195,204,212,179,158,163,198,134,92,205,113,236,5,240,209,178,124,171,33,31,196,144,230,233, + 66,28,208,89,43,144,149,132,149,166,119,112,115,123,24,77,197,40,34,0,0,1,0,201,0,0,5,51,5,213,0,9,0,121,64,30,3,17,9,9, + 8,8,17,4,4,3,66,8,3,9,6,175,2,5,9,4,7,3,28,0,54,7,28,6,4,10,16,252,236,252,236,17,57,57,49,0,47,60,236,50, + 57,57,48,75,83,88,7,16,4,237,7,16,4,237,89,34,178,31,11,1,1,93,64,48,54,8,56,3,72,8,71,3,105,8,102,3,128,8,7,6, + 4,9,9,21,4,26,9,70,4,73,9,87,4,88,9,101,4,105,9,121,9,133,4,138,9,149,4,154,9,159,11,16,93,0,93,1,17,35,17,1, + 33,17,51,17,1,5,51,196,253,106,254,240,196,2,150,5,213,250,43,4,225,251,31,5,213,251,31,4,225,0,0,0,255,255,0,201,0,0,5,51, + 7,109,18,38,3,172,0,0,17,7,22,192,4,245,1,117,0,35,180,6,10,18,0,7,43,176,10,75,84,176,11,75,84,91,176,16,75,84,91,88, + 187,0,18,0,64,0,10,255,192,56,56,89,49,0,0,0,0,1,0,201,0,0,5,134,5,213,0,11,0,89,64,11,8,5,1,4,6,9,1,28, + 0,4,12,16,252,236,50,212,196,17,57,57,49,0,64,11,66,8,9,5,2,4,3,0,175,10,6,47,60,236,50,23,57,48,75,83,88,64,22,7, + 17,6,8,17,5,9,4,6,5,3,17,4,2,17,5,8,9,9,4,9,4,9,7,16,60,60,4,237,16,5,237,7,8,16,237,5,16,237,89,19, + 51,17,1,33,9,1,35,9,1,17,35,201,202,2,210,1,3,253,191,2,95,220,253,250,254,239,202,5,213,253,30,2,226,253,178,252,121,3,1,254, + 233,254,22,0,0,1,0,84,0,0,5,58,5,213,0,15,0,37,64,10,17,4,10,28,7,11,28,6,1,16,16,212,212,236,212,236,236,49,0,64, + 8,11,149,6,129,1,149,0,9,47,60,236,244,236,48,51,53,54,55,18,17,53,33,17,35,17,33,21,16,3,6,84,217,62,87,3,120,202,254,27, + 102,98,170,47,164,1,2,2,88,254,250,43,5,43,184,253,202,254,248,253,255,255,0,201,0,0,6,31,5,213,18,6,0,48,0,0,255,255,0,201, + 0,0,5,59,5,213,18,6,0,43,0,0,255,255,0,115,255,227,5,217,5,240,18,6,0,50,0,0,0,1,0,201,0,0,5,59,5,213,0,7, + 0,31,64,16,4,149,7,129,2,6,9,4,3,28,0,4,28,7,4,8,16,252,236,212,236,236,49,0,47,60,244,236,48,1,17,35,17,33,17,35, + 17,5,59,202,253,34,202,5,213,250,43,5,43,250,213,5,213,0,0,0,255,255,0,201,0,0,4,141,5,213,18,6,0,51,0,0,255,255,0,115, + 255,227,5,39,5,240,18,6,0,38,0,0,255,255,255,250,0,0,4,233,5,213,18,6,0,55,0,0,0,1,0,35,0,0,4,189,5,213,0,17, + 0,62,180,19,17,6,13,18,16,212,196,212,196,49,0,182,66,16,13,129,6,149,5,47,236,236,50,48,75,83,88,64,18,15,17,0,13,12,16,17, + 17,17,0,15,17,12,14,17,13,13,12,5,7,16,236,16,236,7,16,236,8,16,236,89,37,6,7,6,43,1,53,51,50,55,54,63,1,1,51,9, + 1,51,2,143,21,32,79,251,77,63,119,46,28,18,45,254,33,217,1,115,1,117,217,181,50,38,93,170,27,17,42,106,4,107,252,148,3,108,0,0, + 0,3,0,121,0,0,6,106,5,213,0,6,0,13,0,31,0,61,64,17,33,16,10,25,26,14,0,21,28,29,13,22,3,25,17,16,32,16,252,236, + 212,60,60,252,60,60,212,236,236,49,0,64,14,13,0,149,23,20,21,129,31,7,5,149,29,14,31,47,220,60,236,50,16,244,220,60,236,50,48,1, + 14,1,21,20,22,23,51,62,1,53,52,38,39,3,36,0,17,16,0,37,53,51,21,4,0,17,16,0,5,21,35,3,13,217,230,230,217,203,217,228, + 228,217,203,254,195,254,169,1,87,1,61,203,1,61,1,85,254,171,254,195,203,4,162,20,204,197,197,203,20,20,203,197,197,204,20,252,16,23,1,43, + 1,9,1,9,1,45,23,139,139,23,254,213,254,245,254,247,254,213,23,178,255,255,0,61,0,0,5,59,5,213,18,6,0,59,0,0,0,1,0,201, + 254,191,5,229,5,213,0,11,0,41,64,12,13,9,149,0,6,28,7,3,28,2,4,12,16,252,236,212,236,60,252,204,49,0,64,8,6,2,129,11, + 8,4,149,1,47,236,50,204,244,60,48,41,1,17,51,17,33,17,51,17,51,17,35,5,59,251,142,202,2,222,202,170,170,5,213,250,213,5,43,250, + 213,254,21,0,0,1,0,175,0,0,4,179,5,213,0,15,0,36,64,10,17,4,1,13,28,14,7,28,6,16,16,220,236,212,236,50,236,49,0,183, + 2,149,11,173,13,6,129,0,47,228,50,244,236,48,33,17,33,34,38,53,17,51,17,20,22,51,33,17,51,17,3,232,254,95,186,222,201,124,124,1, + 120,203,2,100,233,238,1,154,254,118,159,158,2,199,250,43,0,1,0,201,0,0,7,197,5,213,0,11,0,42,64,13,13,4,2,28,3,10,28,11, + 7,28,6,4,12,16,252,236,212,252,212,236,236,49,0,64,8,10,2,6,129,0,8,149,5,47,236,50,244,60,60,48,37,33,17,51,17,33,17,51, + 17,33,17,51,4,172,2,79,202,249,4,202,2,79,202,170,5,43,250,43,5,213,250,213,5,43,0,0,0,1,0,201,254,191,8,111,5,213,0,15, + 0,50,64,15,17,13,149,0,10,28,11,6,28,7,3,28,2,4,16,16,252,236,212,252,212,236,60,252,204,49,0,64,10,6,10,2,129,15,12,8, + 4,149,1,47,236,50,50,204,244,60,60,48,41,1,17,51,17,33,17,51,17,33,17,51,17,51,17,35,7,197,249,4,202,2,79,202,2,79,202,170, + 170,5,213,250,213,5,43,250,213,5,43,250,213,254,21,0,0,2,0,60,0,0,6,24,5,213,0,12,0,23,0,42,64,22,2,149,3,129,0,18, + 149,5,173,19,149,0,16,13,25,9,18,4,28,1,3,24,16,204,220,236,50,212,236,204,49,0,47,236,244,236,16,244,236,48,33,17,33,53,33,17, + 33,50,4,21,20,4,35,1,52,39,38,35,33,17,33,50,55,54,1,245,254,71,2,131,1,78,251,1,16,254,240,251,1,54,79,78,163,254,188,1, + 68,161,80,79,5,43,170,253,154,218,222,221,218,1,183,139,68,67,253,221,68,67,0,0,255,255,0,201,0,0,6,70,5,213,16,38,3,192,0,0, + 16,7,0,44,4,179,0,0,0,2,0,201,0,0,4,236,5,213,0,10,0,21,0,36,64,19,5,149,13,173,11,129,6,149,21,23,0,25,17,5, + 12,28,11,4,22,16,252,236,50,212,236,204,49,0,47,236,228,244,236,48,1,52,39,38,35,33,17,33,50,55,54,1,51,17,33,50,4,21,20,4, + 35,33,4,23,79,78,163,254,188,1,68,163,78,79,252,178,202,1,78,251,1,16,254,240,251,253,232,1,183,139,68,67,253,221,68,67,4,168,253,154, + 218,222,221,218,0,1,0,111,255,227,5,35,5,240,0,24,0,78,64,9,26,5,8,25,19,7,0,14,25,16,220,60,204,212,236,50,204,49,0,64, + 23,6,149,7,173,25,13,161,14,174,11,149,16,145,25,0,161,24,174,2,149,22,140,25,16,244,236,244,236,16,244,236,244,236,16,244,236,177,7,11, + 73,177,2,6,73,80,88,179,7,6,64,2,23,56,89,48,19,22,33,32,18,55,33,53,33,38,2,33,32,7,53,54,33,32,0,17,16,0,33,32, + 39,111,211,1,0,1,8,238,22,252,226,3,30,22,238,254,248,255,0,211,208,1,15,1,79,1,134,254,122,254,177,254,245,212,1,70,189,1,28,239, + 170,239,1,29,189,213,142,254,97,254,153,254,152,254,97,144,0,2,0,211,255,227,8,48,5,240,0,15,0,38,0,56,64,31,0,149,20,145,39,8, + 149,28,140,39,33,149,38,173,36,129,35,40,12,25,24,4,25,32,16,33,37,28,36,4,39,16,252,236,50,212,60,236,212,236,204,49,0,47,228,244, + 236,16,244,236,16,244,236,48,1,34,7,6,17,16,23,22,51,50,55,54,17,16,39,38,1,18,55,54,33,32,23,22,17,16,7,6,33,32,39,38, + 3,33,17,35,17,51,17,5,126,220,130,129,129,130,220,220,128,129,129,128,252,115,14,180,180,1,59,1,58,188,188,188,188,254,198,254,197,180,180,14, + 254,208,202,202,5,76,164,164,254,229,254,230,164,164,164,164,1,26,1,27,164,164,253,243,1,24,205,204,210,211,254,158,254,159,210,211,205,205,1,24, + 253,107,5,213,253,106,0,0,0,2,0,136,0,0,4,198,5,213,0,8,0,22,0,64,64,11,24,4,20,5,28,17,0,25,9,13,23,16,212,196, + 236,212,236,50,236,49,0,64,12,66,6,149,16,129,9,21,149,3,173,19,9,47,60,244,236,16,244,236,48,75,83,88,183,21,17,10,22,17,9,10, + 9,5,7,16,236,16,236,89,1,20,22,51,33,17,33,34,6,9,1,38,36,53,52,36,41,1,17,35,17,33,1,1,155,149,146,1,58,254,198,146, + 149,254,237,1,152,100,255,0,1,4,1,2,2,4,202,254,242,254,118,4,39,131,135,2,18,133,251,86,2,141,26,169,215,206,224,250,43,2,119,253, + 137,0,0,0,255,255,0,123,255,227,4,45,4,123,18,6,0,68,0,0,0,2,0,112,255,227,4,127,6,55,0,29,0,41,0,58,64,14,19,20, + 43,69,39,18,3,81,28,33,18,9,69,42,16,252,236,50,244,236,236,212,196,49,0,64,17,22,169,17,151,42,36,185,6,30,185,9,28,0,184,6, + 140,42,16,228,244,57,57,236,16,238,16,244,236,48,1,50,0,17,16,0,35,34,0,3,39,38,53,52,55,54,36,37,54,55,23,6,15,1,6,7, + 6,15,1,54,23,34,6,21,20,22,51,50,54,53,52,38,2,125,240,1,18,254,238,240,241,254,246,7,6,5,58,91,1,59,1,8,122,54,51,49, + 45,250,126,76,199,19,7,130,211,148,172,171,149,147,172,172,4,123,254,200,254,236,254,237,254,199,1,48,1,28,229,119,41,160,118,185,160,2,1,17, + 146,20,1,17,9,44,117,153,56,119,156,231,201,201,231,232,200,199,233,0,0,3,0,186,0,0,4,62,4,96,0,8,0,17,0,32,0,47,64,13, + 14,18,22,34,5,18,28,0,9,8,18,70,33,16,252,236,50,212,236,204,212,236,49,0,64,11,0,169,10,32,9,169,18,188,1,169,32,47,236,244, + 236,16,212,236,48,1,17,33,50,54,53,52,38,35,1,17,51,50,54,53,52,38,35,37,33,50,22,21,20,6,7,30,1,21,20,6,35,33,1,114, + 1,6,126,132,132,126,254,250,242,104,132,132,104,254,86,1,182,197,212,108,106,127,140,231,214,254,57,2,4,254,143,95,90,90,94,1,201,254,202,83, + 74,74,79,147,144,133,103,121,15,24,152,114,150,164,0,0,0,1,0,186,0,0,3,208,4,96,0,5,0,25,182,7,2,4,8,1,70,6,16,252, + 252,220,204,49,0,180,4,169,1,188,0,47,244,236,48,51,17,33,21,33,17,186,3,22,253,163,4,96,147,252,51,0,0,2,0,107,254,229,5,29, + 4,96,0,6,0,22,0,52,64,15,2,8,13,18,169,24,15,22,3,8,12,19,169,22,23,16,220,236,212,236,16,212,196,252,60,236,49,0,64,11, + 3,169,12,188,17,21,14,0,22,169,19,47,236,50,50,204,50,244,236,48,37,33,17,33,21,16,7,5,54,55,54,17,53,33,17,51,17,35,17,33, + 17,35,17,1,187,2,22,254,125,118,254,216,91,40,98,2,245,147,147,252,116,147,147,3,58,140,254,100,220,54,40,85,211,1,169,212,252,51,254,82, + 1,27,254,229,1,174,0,0,255,255,0,113,255,227,4,127,4,123,18,6,0,72,0,0,0,1,0,70,0,0,6,239,4,96,0,19,0,152,64,11, + 8,5,1,4,6,9,1,8,12,0,20,16,220,60,236,50,212,196,17,57,57,49,0,64,17,66,13,12,16,19,8,9,5,2,8,18,3,0,188,15, + 10,6,47,60,60,236,50,50,23,57,48,75,83,88,64,22,7,17,6,8,17,5,9,4,6,5,3,17,4,2,17,5,8,9,9,4,9,4,9,7, + 16,60,60,4,237,16,5,237,7,8,16,237,5,16,237,89,1,64,19,13,1,8,14,1,7,15,1,6,16,1,5,17,1,4,18,1,3,0,16,73, + 58,73,58,73,58,73,58,73,58,73,58,0,64,8,19,2,16,5,13,8,12,9,16,60,16,60,16,60,16,60,1,51,17,1,51,9,1,35,1,7, + 17,35,17,39,1,35,9,1,51,1,3,63,183,1,233,214,254,110,1,204,197,254,135,187,183,187,254,135,197,1,204,254,110,214,1,233,4,96,253,242, + 2,14,254,81,253,79,2,54,201,254,147,1,109,201,253,202,2,177,1,175,253,242,0,0,0,1,0,133,255,227,3,200,4,124,0,40,0,78,64,11, + 25,18,38,42,16,18,3,21,32,10,41,16,220,196,196,212,236,204,212,236,49,0,64,22,32,134,31,136,28,185,35,184,41,20,169,21,41,9,134,10, + 136,13,185,6,140,41,16,244,252,176,12,75,81,88,252,27,244,89,236,16,212,236,16,244,252,176,12,75,81,88,252,27,244,89,236,48,1,30,1,21, + 20,4,35,34,38,39,53,30,1,51,50,54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,6,2,194,124, + 138,254,254,238,80,169,90,71,170,93,151,169,150,137,148,155,116,135,139,119,71,161,97,98,170,76,196,227,120,2,92,24,146,108,173,182,28,28,171,37, + 37,112,90,88,107,152,89,70,64,92,26,29,167,24,24,157,141,93,129,0,0,1,0,186,0,0,4,121,4,96,0,9,0,63,64,21,66,8,3,9, + 6,188,2,5,11,70,9,4,7,3,8,0,7,8,6,70,10,16,252,236,212,236,17,57,57,236,49,0,47,60,228,50,57,57,48,75,83,88,64,10, + 3,17,9,9,8,8,17,4,4,3,7,16,236,7,16,236,89,1,17,35,17,1,35,17,51,17,1,4,121,183,253,228,236,183,2,27,4,96,251,160, + 3,131,252,125,4,96,252,127,3,129,0,0,255,255,0,186,0,0,4,121,6,20,18,38,3,204,0,0,17,7,2,154,0,154,255,204,0,35,180,7, + 10,18,3,7,43,176,14,75,84,176,16,75,84,91,176,21,75,84,91,88,187,0,18,0,64,0,10,255,192,56,56,89,49,0,0,0,0,1,0,186, + 0,0,4,145,4,96,0,11,0,89,64,11,8,5,1,4,6,9,1,8,0,70,12,16,252,236,50,212,196,17,57,57,49,0,64,11,66,8,9,5, + 2,4,3,0,188,10,6,47,60,236,50,23,57,48,75,83,88,64,22,7,17,6,8,17,5,9,4,6,5,3,17,4,2,17,5,8,9,9,4,9, + 4,9,7,16,60,60,4,237,16,5,237,7,8,16,237,5,16,237,89,19,51,17,1,51,9,1,35,1,7,17,35,186,183,2,7,226,254,84,1,227, + 206,254,115,197,183,4,96,253,242,2,14,254,79,253,81,2,53,200,254,147,0,1,0,76,0,0,4,115,4,96,0,15,0,36,64,10,17,70,10,8, + 7,11,8,6,1,16,16,212,212,236,212,236,236,49,0,183,11,169,6,188,1,169,0,9,47,60,236,244,236,48,51,53,54,55,54,17,53,33,17,35, + 17,33,21,16,7,6,76,182,56,68,2,245,184,254,123,88,94,153,28,126,177,1,197,183,251,160,3,205,111,254,80,194,207,0,0,0,0,1,0,186, + 0,0,5,79,4,96,0,12,0,77,64,22,66,10,7,2,3,8,3,0,188,9,6,12,14,70,7,8,4,10,8,0,70,13,16,252,236,220,236,236, + 49,0,47,60,196,236,50,17,23,57,48,75,83,88,64,18,2,17,8,10,9,3,17,7,8,7,2,17,9,1,17,10,10,9,5,7,16,237,16,237, + 7,16,237,8,16,237,89,19,33,9,1,33,17,35,17,1,35,1,17,35,186,1,13,1,62,1,63,1,11,185,254,203,184,254,202,185,4,96,253,18, + 2,238,251,160,3,176,253,39,2,217,252,80,0,1,0,186,0,0,4,129,4,96,0,11,0,39,64,20,9,169,2,4,0,188,7,11,13,70,8,4, + 8,5,9,1,8,0,70,12,16,252,236,50,220,236,50,236,49,0,47,60,228,50,220,236,48,19,51,17,33,17,51,17,35,17,33,17,35,186,185,2, + 85,185,185,253,171,185,4,96,254,55,1,201,251,160,2,4,253,252,0,0,255,255,0,113,255,227,4,117,4,123,18,6,0,82,0,0,0,1,0,186, + 0,0,4,129,4,96,0,7,0,31,64,16,4,169,7,188,2,6,3,8,9,70,0,4,8,7,70,8,16,252,236,212,236,236,49,0,47,60,244,236, + 48,1,17,35,17,33,17,35,17,4,129,185,253,171,185,4,96,251,160,3,205,252,51,4,96,0,0,0,255,255,0,186,254,86,4,164,4,123,18,6, + 0,83,0,0,255,255,0,113,255,227,3,231,4,123,18,6,0,70,0,0,0,1,0,60,0,0,4,109,4,96,0,7,0,28,182,9,1,3,8,6, + 0,8,16,220,212,252,220,204,49,0,181,3,7,169,0,188,5,47,244,236,50,48,19,33,21,33,17,35,17,33,60,4,49,254,66,181,254,66,4,96, + 147,252,51,3,205,0,0,0,255,255,0,61,254,86,4,127,4,96,18,6,0,92,0,0,0,3,0,112,254,86,6,103,5,213,0,10,0,40,0,51, + 0,66,64,17,53,69,41,18,33,12,6,25,8,39,46,26,0,18,18,69,52,16,252,236,212,60,60,252,60,60,212,236,236,49,0,64,18,44,8,185, + 30,21,184,25,151,52,49,3,185,36,15,140,11,189,52,16,236,244,60,236,50,16,228,244,60,236,50,48,1,20,22,51,50,55,17,38,35,34,6,1, + 17,14,1,35,34,2,17,16,18,51,50,22,23,17,51,17,62,1,51,50,18,17,16,2,35,34,38,39,17,1,52,38,35,34,7,17,22,51,50,54, + 1,47,145,123,98,114,114,98,123,145,1,224,57,131,83,167,233,233,167,83,131,57,185,57,131,83,167,233,233,167,83,131,57,1,224,145,123,98,114,114, + 98,123,145,2,47,235,199,168,2,20,168,199,251,60,2,57,94,78,1,53,1,19,1,19,1,61,76,94,2,4,253,252,94,76,254,195,254,237,254,237, + 254,203,78,94,253,199,3,217,235,199,168,253,236,168,199,0,255,255,0,59,0,0,4,121,4,96,18,6,0,91,0,0,0,1,0,186,254,229,5,20, + 4,96,0,11,0,40,64,12,13,9,169,6,8,0,7,3,8,2,70,12,16,252,236,212,60,236,252,204,49,0,183,6,2,188,11,8,4,169,1,47, + 236,50,204,244,60,48,41,1,17,51,17,33,17,51,17,51,17,35,4,129,252,57,185,2,85,185,147,147,4,96,252,51,3,205,252,51,254,82,0,0, + 0,1,0,150,0,0,4,0,4,96,0,17,0,59,64,17,2,169,13,15,7,188,0,19,70,1,15,8,16,8,8,7,18,16,220,236,212,236,50,236, + 49,0,47,228,50,212,236,176,0,176,2,35,73,176,13,176,15,35,73,82,88,177,2,13,184,255,192,176,2,23,56,89,48,33,17,33,34,39,38,53, + 17,51,17,20,23,22,51,33,17,51,17,3,72,254,169,153,102,92,184,52,53,104,1,41,184,1,215,95,86,184,1,28,254,245,117,59,59,1,246,251, + 160,0,0,0,0,1,0,186,0,0,6,152,4,96,0,11,0,41,64,13,13,70,2,8,3,10,8,11,7,8,6,70,12,16,252,236,212,252,212,236, + 236,49,0,183,10,2,6,188,0,8,169,5,47,236,50,244,60,60,48,37,33,17,51,17,33,17,51,17,33,17,51,4,5,1,218,185,250,34,185,1, + 217,185,147,3,205,251,160,4,96,252,51,3,205,0,0,0,0,1,0,186,254,229,7,43,4,96,0,15,0,50,64,15,17,13,169,10,8,0,11,6, + 8,7,3,8,2,70,16,16,252,236,212,252,212,60,236,252,204,49,0,64,10,6,10,2,188,15,12,8,4,169,1,47,236,50,50,204,244,60,60,48, + 41,1,17,51,17,33,17,51,17,33,17,51,17,51,17,35,6,152,250,34,185,1,217,185,1,218,185,147,147,4,96,252,51,3,205,252,51,3,205,252, + 51,254,82,0,0,2,0,62,0,0,5,46,4,96,0,12,0,21,0,44,64,11,23,69,19,18,3,14,11,8,8,10,22,16,196,220,236,50,212,236, + 236,49,0,64,11,8,169,11,188,7,14,169,12,15,169,7,47,236,212,236,16,244,236,48,1,50,22,21,20,6,35,33,17,33,53,33,17,5,33,17, + 33,50,54,53,52,38,3,113,214,231,231,214,254,56,254,149,2,36,1,7,254,249,1,7,126,131,131,2,151,163,168,168,164,3,205,147,254,55,147,254, + 143,95,90,90,94,0,0,0,255,255,0,186,0,0,5,155,4,123,16,39,0,243,4,34,0,0,16,6,3,224,0,0,0,2,0,186,0,0,4,62, + 4,96,0,8,0,19,0,37,64,11,21,69,0,18,15,5,11,8,9,70,20,16,252,236,50,212,236,236,49,0,183,4,169,11,9,188,5,169,19,47, + 236,228,212,236,48,1,52,38,35,33,17,33,50,54,1,51,17,33,50,22,21,20,6,35,33,3,122,131,126,254,250,1,6,126,131,253,64,185,1,14, + 214,231,231,214,254,57,1,76,90,94,254,143,95,3,110,254,55,163,168,168,164,0,0,0,0,1,0,113,255,227,3,231,4,123,0,24,0,77,64,9, + 5,8,18,19,72,7,14,0,25,16,220,60,204,244,236,50,49,0,64,23,14,134,13,136,11,24,134,0,136,2,185,22,7,169,6,187,11,185,16,184, + 22,140,25,16,228,244,236,244,238,16,254,244,238,16,245,238,177,7,11,73,177,2,6,73,80,88,179,7,6,64,2,23,56,89,48,55,22,51,50,54, + 55,33,53,33,46,1,35,34,7,53,54,51,32,0,17,16,0,33,34,39,113,158,157,147,210,19,253,200,2,50,12,159,199,154,161,157,166,1,6,1, + 45,254,219,254,255,189,147,213,86,171,218,147,105,223,86,172,70,254,195,254,241,254,242,254,194,72,0,0,0,2,0,193,255,227,6,76,4,123,0,11, + 0,30,0,58,64,15,32,69,9,18,18,3,18,24,12,25,29,8,28,70,31,16,252,236,50,212,60,236,212,236,236,49,0,64,16,0,185,15,184,27, + 6,185,21,140,27,25,169,30,28,188,27,47,228,212,236,16,244,236,16,244,236,48,1,34,6,21,20,22,51,50,54,53,52,38,1,54,18,51,50,0, + 17,16,0,35,34,0,39,35,17,35,17,51,17,4,74,148,172,171,149,147,172,172,253,113,19,249,240,240,1,18,254,238,240,241,254,249,9,208,184,184, + 3,223,231,201,201,231,232,200,199,233,254,194,190,1,28,254,200,254,236,254,237,254,199,1,46,248,253,247,4,96,254,65,0,2,0,116,0,0,4,34, + 4,96,0,8,0,22,0,60,64,9,20,5,8,17,0,18,9,13,23,16,212,196,236,212,236,50,49,0,64,11,66,6,169,16,188,9,21,169,3,19, + 9,47,60,212,236,16,244,236,48,75,83,88,183,21,17,10,22,17,9,10,9,5,7,16,236,16,236,89,1,20,22,59,1,17,35,34,6,9,1,46, + 1,53,52,54,51,33,17,35,17,35,1,1,122,128,119,248,248,119,128,254,250,1,86,116,154,215,217,1,182,185,229,254,182,3,29,83,94,1,97,92, + 252,143,1,235,26,137,143,162,161,251,160,1,217,254,39,0,255,255,0,113,255,227,4,127,6,107,18,38,3,201,0,0,16,6,0,67,90,5,0,0, + 255,255,0,113,255,227,4,127,6,16,18,38,3,201,0,0,17,7,0,106,0,150,0,0,0,133,177,146,151,66,176,147,176,152,66,177,128,4,66,177, + 129,0,66,124,176,15,176,1,35,73,176,35,176,30,35,73,97,176,128,98,104,176,35,70,97,176,15,70,96,176,146,67,176,1,96,35,66,176,146,67, + 176,1,96,67,176,0,85,88,176,30,176,146,67,176,1,96,67,56,176,30,17,176,2,53,89,177,128,0,66,177,129,0,66,24,176,15,16,176,35,176, + 30,176,1,35,73,104,59,176,35,17,176,3,53,0,176,18,176,35,35,73,176,64,80,88,176,35,176,64,56,176,35,17,176,3,53,176,2,53,89,0, + 0,1,0,47,254,86,4,144,6,20,0,31,0,63,64,15,20,23,8,16,78,8,29,9,5,8,1,3,0,70,32,16,252,60,204,236,50,50,204,244, + 252,204,49,0,64,17,20,169,19,31,8,1,169,7,2,4,26,135,10,13,4,151,30,47,236,212,196,236,16,220,60,236,50,16,212,236,48,19,35,53, + 51,17,51,17,33,21,33,17,62,1,51,50,22,17,20,0,7,53,54,18,53,52,38,35,34,6,21,17,35,223,176,176,185,2,29,253,227,66,178,118, + 182,216,254,169,215,122,245,124,124,154,167,185,3,209,143,1,180,254,76,143,254,109,101,100,233,254,234,226,254,89,41,140,22,1,46,210,208,159,196,158, + 254,251,0,0,255,255,0,186,0,0,3,216,6,109,18,38,3,199,0,0,16,7,0,118,0,134,0,7,0,1,0,113,255,227,3,231,4,123,0,24, + 0,78,64,10,10,11,8,18,16,2,72,22,69,25,16,252,228,50,252,50,204,49,0,64,23,2,134,3,136,5,17,134,16,136,14,185,19,9,169,10, + 187,5,185,0,184,19,140,25,16,228,244,236,244,238,16,254,244,238,16,245,238,177,9,5,73,177,14,10,73,80,88,179,9,10,64,2,23,56,89,48, + 1,50,23,21,38,35,34,6,7,33,21,33,30,1,51,50,55,21,6,35,32,0,17,16,0,2,164,166,157,161,154,199,159,12,2,50,253,200,19,210, + 147,157,158,147,189,254,255,254,219,1,45,4,123,70,172,86,223,105,147,218,171,86,170,72,1,62,1,14,1,15,1,61,255,255,0,111,255,227,3,199, + 4,123,18,6,0,86,0,0,255,255,0,193,0,0,1,121,6,20,18,6,0,76,0,0,255,255,255,244,0,0,2,70,6,16,16,6,0,177,0,0, + 255,255,255,219,254,86,1,121,6,20,18,6,0,77,0,0,0,2,0,76,0,0,6,191,4,96,0,22,0,31,0,54,64,14,33,69,26,18,12,17, + 8,30,7,18,8,6,1,32,16,212,212,236,212,60,236,212,236,236,49,0,64,14,30,169,9,31,169,16,18,169,6,188,1,169,0,16,47,60,236,244, + 236,16,236,212,236,48,51,53,54,55,54,17,53,33,17,51,50,22,21,20,6,35,33,17,33,21,16,7,6,37,50,54,53,52,38,43,1,17,76,182, + 56,68,2,216,171,214,232,231,214,254,155,254,154,88,94,3,120,126,132,132,126,163,153,28,126,177,1,197,183,254,55,163,168,168,164,3,205,111,254,80, + 194,207,118,95,90,90,94,254,143,0,0,0,0,2,0,186,0,0,6,183,4,96,0,18,0,27,0,56,64,16,29,69,22,18,5,10,18,8,26,0, + 11,15,8,13,70,28,16,252,236,50,220,60,236,50,212,236,49,0,64,13,19,169,9,26,11,169,1,16,18,14,188,9,13,47,60,228,50,220,60,236, + 50,16,236,48,1,17,51,50,22,21,20,6,35,33,17,33,17,35,17,51,17,33,17,1,50,54,53,52,38,43,1,17,4,78,171,214,232,231,214,254, + 155,253,222,185,185,2,34,1,92,126,132,132,126,163,4,96,254,55,163,168,168,164,2,4,253,252,4,96,254,55,1,201,252,51,95,90,90,94,254,143, + 0,1,0,47,0,0,4,137,6,20,0,27,0,58,64,15,8,25,19,8,16,78,25,9,5,8,1,3,0,70,28,16,252,60,204,236,50,50,244,236, + 16,204,49,0,64,14,8,1,169,7,2,4,22,135,10,13,4,151,18,26,47,60,236,212,196,236,16,220,60,236,50,48,19,35,53,51,17,51,17,33, + 21,33,17,62,1,51,50,22,21,17,35,17,52,38,35,34,6,21,17,35,223,176,176,185,2,29,253,227,66,179,117,189,202,184,124,124,152,169,185,3, + 209,143,1,180,254,76,143,254,109,101,100,234,237,254,208,1,42,159,158,193,161,254,251,0,255,255,0,186,0,0,4,145,6,109,18,38,3,206,0,0, + 16,6,0,118,111,7,0,0,255,255,0,186,0,0,4,121,6,107,18,38,3,204,0,0,16,6,0,67,93,5,0,0,255,255,0,61,254,86,4,127, + 6,20,18,38,3,215,0,0,16,6,2,154,94,204,0,0,0,1,0,186,254,229,4,129,4,96,0,11,0,41,64,13,13,70,6,8,7,11,169,9, + 3,8,2,70,12,16,252,236,212,252,212,236,236,49,0,183,11,4,169,6,2,188,9,1,47,60,228,50,236,204,48,41,1,17,51,17,33,17,51,17, + 33,17,35,2,84,254,102,185,2,85,185,254,102,147,4,96,252,51,3,205,251,160,254,229,0,1,0,115,255,227,7,5,5,213,0,52,0,56,64,20, + 36,18,37,54,16,32,28,41,22,28,23,13,28,4,9,18,8,4,16,53,16,252,220,236,16,236,212,252,212,236,236,220,236,49,0,64,9,22,36,8, + 129,17,28,149,45,0,47,60,236,50,244,60,204,48,5,34,39,38,17,52,19,54,55,51,6,3,6,21,16,23,22,51,50,55,54,61,1,51,21,20, + 23,22,51,50,55,54,17,52,39,2,39,51,22,23,18,21,16,7,6,35,34,39,38,39,6,7,6,2,58,211,121,123,100,59,93,249,84,135,67,72, + 73,125,114,72,71,199,70,70,116,134,65,71,67,135,84,250,95,56,100,123,123,209,146,101,100,39,39,100,101,29,177,180,1,152,201,1,14,159,127,70, + 254,191,159,183,254,205,107,109,105,104,198,241,241,198,104,105,109,119,1,39,183,159,1,65,70,130,156,254,231,190,254,102,178,177,94,94,173,173,94,94, + 255,255,0,135,255,227,6,39,4,96,16,6,3,93,0,0,0,2,0,30,0,0,5,177,5,213,0,18,0,29,0,58,64,14,31,19,25,5,13,17, + 25,15,0,28,11,9,13,30,16,220,60,204,252,60,60,204,16,212,236,204,49,0,64,15,10,18,149,12,16,14,129,9,24,149,1,173,25,149,9,47, + 236,244,236,16,244,212,60,236,50,48,1,21,33,50,4,21,20,4,35,33,17,33,53,33,53,51,21,33,21,1,52,39,38,35,33,17,33,50,55,54, + 2,88,1,78,251,1,16,254,240,251,253,232,254,144,1,112,202,1,113,1,19,79,78,163,254,188,1,68,163,78,79,4,81,226,218,222,221,218,4,81, + 164,224,224,164,253,102,139,68,67,253,221,68,67,0,0,0,0,2,0,30,0,0,4,231,6,20,0,7,0,25,0,58,64,15,27,69,0,18,23,9, + 17,5,19,15,28,11,9,13,26,16,220,60,204,252,60,60,204,16,212,236,236,49,0,64,14,9,17,169,11,15,13,4,169,19,13,151,5,169,8,47, + 236,228,212,236,16,212,60,236,50,48,36,52,38,35,33,17,33,50,5,17,33,53,33,17,51,17,33,21,33,17,33,50,22,16,6,35,4,35,131,126, + 254,250,1,6,126,253,195,254,187,1,69,185,1,169,254,87,1,14,214,231,231,214,242,180,94,254,143,147,3,205,147,1,180,254,76,147,254,202,163,254, + 176,164,0,0,0,1,0,211,255,227,7,27,5,240,0,43,0,0,1,17,35,17,51,17,51,18,55,54,33,50,23,22,23,21,38,39,38,35,32,7, + 6,7,33,21,33,18,23,22,33,50,55,54,55,21,6,7,6,35,32,39,38,3,1,157,202,202,210,30,157,195,1,83,134,118,119,104,102,115,116,130, + 255,0,136,103,25,2,178,253,70,7,129,137,0,255,130,116,115,102,106,119,118,132,254,173,195,186,9,2,199,253,57,5,213,253,156,1,8,167,208,36, + 35,71,213,95,47,47,156,119,198,170,254,243,148,157,47,47,95,211,72,36,36,207,198,1,79,0,0,0,0,1,0,193,255,227,5,129,4,123,0,35, + 0,0,1,50,23,21,38,35,34,7,6,7,33,21,33,22,23,22,51,50,55,21,6,35,32,39,38,39,35,17,35,17,51,17,51,54,55,54,4,62, + 166,157,161,154,230,92,34,12,1,204,254,44,13,158,85,120,157,158,147,188,254,243,148,123,10,147,184,184,152,23,122,151,4,123,70,172,86,180,65,87, + 143,244,94,51,86,170,72,173,144,228,253,252,4,96,254,51,202,128,158,0,0,2,0,16,0,0,6,248,5,213,0,11,0,14,0,0,33,35,1,33, + 17,35,17,33,1,35,1,51,19,9,1,6,248,225,254,234,254,233,202,254,231,254,234,225,3,2,229,177,254,220,254,220,2,27,253,229,2,27,253,229, + 5,213,252,243,2,55,253,201,0,2,0,51,0,0,6,17,4,96,0,11,0,14,0,0,33,35,3,35,17,35,17,35,3,35,1,51,19,11,1,6, + 17,195,236,227,184,229,236,195,2,142,195,145,243,243,1,149,254,107,1,149,254,107,4,96,253,185,1,161,254,95,0,0,0,2,0,201,0,0,9,20, + 5,213,0,19,0,22,0,0,33,35,1,33,17,35,17,33,1,35,1,33,17,35,17,51,17,33,1,51,19,9,1,9,20,225,254,234,254,233,202,254, + 231,254,234,225,1,111,253,248,202,202,2,95,1,60,229,177,254,220,254,220,2,27,253,229,2,27,253,229,2,199,253,57,5,213,253,156,2,100,252,243, + 2,55,253,201,0,2,0,193,0,0,7,208,4,96,0,19,0,22,0,0,33,35,3,35,17,35,17,35,3,35,1,33,17,35,17,51,17,33,1,51, + 19,11,1,7,208,195,236,227,184,229,236,195,1,28,254,107,184,184,1,233,1,30,195,145,243,243,1,149,254,107,1,149,254,107,1,231,254,25,4,96, + 254,23,1,233,253,185,1,161,254,95,0,0,0,2,0,115,0,0,5,217,5,213,0,23,0,26,0,130,64,20,25,26,14,13,20,28,15,19,14,0, + 7,28,12,8,13,24,0,28,3,27,16,220,236,57,204,220,180,15,8,79,8,2,93,57,236,16,204,220,182,0,19,64,14,64,19,3,93,57,236,17, + 18,57,57,49,0,64,14,66,12,15,17,0,3,25,149,24,13,129,20,8,2,47,60,60,244,57,236,212,60,236,50,48,75,83,88,64,20,24,17,15, + 26,24,25,17,14,15,14,24,17,12,25,24,26,17,13,12,13,7,5,16,237,8,16,237,7,5,16,237,8,16,237,89,178,64,28,1,1,93,1,17, + 35,17,6,7,6,17,35,16,55,54,55,1,33,1,22,23,22,17,35,16,39,38,39,1,33,3,139,202,147,100,130,213,189,120,170,254,81,5,18,254, + 80,164,116,188,213,128,96,248,1,62,253,131,2,89,253,167,2,89,28,126,164,254,229,1,98,210,134,49,2,234,253,19,50,130,210,254,158,1,30,161, + 122,202,2,40,0,2,0,107,0,0,4,123,4,96,0,2,0,26,0,126,64,20,0,1,3,26,9,28,4,8,3,13,20,28,25,21,26,2,13,28, + 16,27,16,220,236,57,204,220,178,128,21,1,93,57,236,16,204,220,178,48,3,1,93,57,236,17,18,57,57,49,0,64,14,66,25,4,17,13,16,0, + 149,2,26,188,9,21,15,47,60,60,244,57,236,212,60,236,50,48,75,83,88,64,20,2,17,4,1,2,0,17,3,4,3,2,17,25,0,2,1,17, + 26,25,26,7,5,16,237,8,16,237,7,5,16,237,8,16,237,89,180,112,28,143,28,2,1,93,1,33,19,9,1,22,23,22,17,35,52,39,38,39, + 17,35,17,6,7,6,21,35,16,55,54,55,1,3,69,254,93,209,2,8,254,187,107,75,137,195,86,58,86,184,83,56,86,194,137,74,108,254,187,3, + 182,254,150,2,20,253,204,38,86,156,254,236,199,116,79,26,254,92,1,162,26,75,116,201,1,20,156,85,39,2,52,0,0,2,0,201,0,0,7,196, + 5,213,0,30,0,33,0,0,9,1,33,1,22,23,22,17,35,16,39,38,39,17,35,17,6,7,6,17,35,16,55,54,55,33,17,35,17,51,17,5, + 1,33,3,239,254,159,5,18,254,80,164,116,188,213,128,96,153,202,147,100,130,213,189,85,110,253,181,202,202,3,132,1,62,253,131,3,113,2,100,253, + 19,50,130,210,254,158,1,30,161,122,32,253,167,2,89,28,126,164,254,229,1,98,210,95,52,253,57,5,213,253,156,110,2,40,0,0,0,2,0,193, + 0,0,6,46,4,96,0,30,0,33,0,0,9,1,33,1,22,23,22,17,35,52,39,38,39,17,35,17,6,7,6,21,35,16,55,54,55,33,17,35, + 17,51,17,1,33,19,3,55,254,231,4,16,254,187,107,75,137,195,86,58,86,184,83,56,86,194,137,27,31,254,146,184,184,3,127,254,93,209,2,119, + 1,233,253,204,38,86,156,254,236,199,116,79,26,254,92,1,162,26,75,116,201,1,20,156,31,24,254,25,4,96,254,23,1,63,254,150,0,1,0,115, + 254,86,4,115,7,122,0,83,0,0,1,20,7,6,35,34,38,35,34,21,20,51,50,55,54,23,22,23,21,38,35,34,6,35,34,39,38,53,52,55, + 54,51,33,50,55,54,53,52,39,38,35,53,50,22,51,50,55,54,53,52,33,34,7,53,54,55,3,51,19,55,54,55,54,55,54,51,50,23,21,39, + 38,35,34,15,1,22,23,22,21,16,5,22,23,22,4,115,115,152,198,68,186,35,96,220,65,128,116,32,98,84,68,116,59,252,60,125,74,163,53,63, + 117,1,95,104,70,65,187,88,249,18,86,23,163,82,117,254,197,165,222,160,129,159,115,160,106,30,15,23,23,35,66,26,35,39,11,15,34,50,90,166, + 98,114,254,239,141,82,85,1,190,207,103,136,8,130,114,12,11,2,7,37,167,39,27,44,97,146,122,81,94,88,82,106,189,55,25,166,2,38,54,141, + 238,74,180,45,13,1,131,254,131,222,64,24,39,18,27,10,87,5,2,111,202,24,87,100,167,254,253,69,30,92,96,0,0,1,0,91,254,116,3,200, + 6,6,0,79,0,0,1,20,7,6,35,34,38,35,34,21,20,23,22,51,50,54,51,50,23,21,38,35,34,6,35,34,39,38,53,16,51,33,50,54, + 53,52,39,38,39,34,35,53,50,23,50,51,32,53,52,39,38,35,34,7,53,54,55,3,51,19,55,54,55,54,51,50,23,21,38,35,34,15,1,4, + 21,20,7,22,23,22,3,200,118,109,162,68,168,25,80,98,33,39,44,178,45,99,88,59,98,49,210,50,105,63,137,196,1,44,90,110,78,60,114,5, + 178,11,33,32,21,1,53,94,72,92,145,184,126,102,159,115,160,106,47,21,43,81,26,35,50,15,34,50,91,1,48,232,111,71,80,1,82,158,94,86, + 8,129,97,27,9,36,39,139,34,23,37,82,151,1,12,96,89,76,56,43,8,152,1,160,81,42,33,55,167,31,11,1,131,254,131,222,99,23,50,10, + 87,7,111,202,47,242,196,50,22,64,73,0,0,1,0,16,0,0,6,193,5,213,0,28,0,0,1,39,38,35,34,7,6,7,1,35,17,35,17,35, + 1,51,1,51,17,51,17,51,19,54,55,54,51,50,23,6,193,58,25,32,37,29,66,60,254,228,250,202,250,254,92,195,1,94,125,202,125,232,78,104, + 66,129,51,56,5,20,7,3,25,56,161,253,10,254,202,1,54,4,96,252,84,3,235,252,19,2,114,212,80,51,16,0,0,1,0,50,254,86,6,208, + 6,30,0,28,0,0,1,39,38,35,34,7,6,7,1,35,17,35,17,35,1,51,1,51,17,51,17,51,19,54,55,54,51,50,23,6,208,58,25,32, + 37,29,66,60,254,228,250,183,250,254,92,195,1,94,125,183,125,232,78,104,66,129,51,56,3,222,7,3,25,56,161,253,10,254,86,1,170,4,96,252, + 84,5,106,250,148,2,114,212,80,51,16,0,255,255,0,115,255,227,5,217,5,240,18,6,1,97,0,0,255,255,0,113,255,227,4,117,4,123,18,6, + 2,55,0,0,0,1,0,16,0,0,6,39,5,240,0,18,0,0,1,50,23,21,39,38,35,34,7,6,7,1,35,1,51,9,1,18,54,5,169,63, + 63,68,22,25,73,34,71,84,254,129,229,253,198,211,1,217,1,56,115,174,5,240,21,187,10,4,34,67,221,252,20,5,213,251,23,3,61,1,50,149, + 0,1,0,50,0,0,5,31,4,123,0,19,0,0,1,50,23,21,39,38,35,34,7,6,7,1,35,1,51,1,19,54,55,54,4,180,51,56,58,19, + 38,37,29,65,61,254,228,250,254,92,195,1,94,232,80,102,66,4,123,16,141,7,3,25,55,162,253,10,4,96,252,84,2,112,213,79,51,0,0,0, + 255,255,0,16,0,0,6,39,7,112,16,39,22,195,4,228,1,122,18,6,4,8,0,0,255,255,0,50,0,0,5,31,6,102,16,39,2,192,4,194, + 0,0,18,6,4,9,0,0,0,3,0,115,254,86,7,179,5,240,0,17,0,30,0,44,0,0,9,1,6,7,6,43,1,53,51,50,55,54,55,19, + 1,51,27,1,1,16,7,2,32,3,38,16,55,18,32,19,22,3,16,39,38,32,7,6,17,16,23,22,32,55,54,7,179,254,20,82,70,74,124,147, + 108,76,42,38,55,124,254,162,195,253,253,253,63,95,126,254,0,127,96,96,127,2,0,126,95,213,28,56,254,152,58,28,29,57,1,104,57,27,4,96, + 251,56,203,58,61,154,36,33,137,1,55,3,107,253,138,2,118,254,138,254,221,208,254,236,1,19,209,2,68,209,1,20,254,237,209,254,222,1,6,114, + 234,234,116,254,251,254,252,116,234,234,114,0,0,3,0,113,254,86,6,255,4,123,0,17,0,31,0,37,0,0,9,1,6,7,6,43,1,53,51,50, + 55,54,55,19,1,51,27,1,0,16,7,6,35,34,39,38,16,55,54,51,50,23,2,16,35,34,16,51,6,255,254,20,82,70,74,124,147,108,76,42, + 38,55,124,254,162,195,253,253,253,117,95,115,204,206,116,96,96,116,206,204,115,100,219,224,224,4,96,251,56,203,58,61,154,36,33,137,1,55,3,107, + 253,138,2,118,254,171,254,72,167,201,200,166,1,188,166,200,201,252,205,3,96,252,160,0,0,2,0,115,255,227,7,45,5,240,0,41,0,82,0,0, + 37,51,50,55,54,53,52,39,38,43,1,6,7,6,7,6,34,39,38,39,38,39,35,34,7,6,21,20,23,22,59,1,54,55,54,55,54,50,23,22, + 23,22,7,35,32,39,38,16,55,54,33,51,54,55,54,55,54,50,23,22,23,22,23,51,32,23,22,17,16,7,6,33,35,6,7,6,7,6,34,39, + 38,39,38,4,93,30,235,114,128,128,114,235,30,11,15,22,27,26,62,26,27,22,16,10,46,235,114,130,130,114,235,46,10,16,22,27,26,62,26,27, + 22,16,254,46,254,161,152,189,189,152,1,95,45,11,16,22,27,26,62,26,31,18,16,11,29,1,94,152,188,188,152,254,162,29,10,17,22,27,26,62, + 26,31,18,16,194,145,164,242,243,164,145,20,14,21,12,11,11,12,21,16,18,145,164,243,242,164,145,18,16,21,12,11,11,12,21,16,161,170,210,2, + 116,211,170,21,15,21,12,11,11,14,19,17,19,170,211,254,198,254,199,210,171,19,17,21,12,11,11,14,19,17,0,0,0,2,0,113,255,227,5,161, + 4,123,0,38,0,80,0,0,37,51,50,55,54,53,52,39,38,43,1,6,7,14,1,34,38,39,38,39,35,34,7,6,21,20,23,22,59,1,54,55, + 62,1,50,23,22,23,22,7,35,32,39,38,53,52,55,54,33,51,54,55,54,55,54,50,23,22,23,22,23,51,32,23,22,21,20,7,6,33,35,6, + 7,6,7,6,34,39,38,39,38,3,114,45,161,72,86,86,63,170,45,7,10,18,44,52,44,18,10,7,45,163,71,86,85,72,163,45,7,10,18,44, + 52,22,27,13,9,201,46,254,255,120,137,137,116,1,5,46,7,9,13,27,22,52,22,27,13,9,7,46,1,2,119,137,137,116,254,251,46,7,9,13, + 27,22,52,22,27,13,9,164,96,116,183,167,131,97,11,10,17,20,20,17,10,11,95,116,184,188,112,95,11,10,17,20,10,12,15,10,147,137,156,238, + 233,162,136,10,10,15,12,10,10,12,15,10,10,136,156,239,232,162,137,10,10,15,12,10,10,12,15,10,255,255,0,118,255,227,8,250,7,116,16,38, + 18,203,0,0,16,39,4,26,6,151,0,0,16,7,4,24,6,48,1,39,255,255,0,152,255,227,7,161,6,16,16,38,18,204,0,0,16,39,4,26, + 5,252,254,156,16,7,4,24,5,149,255,195,255,255,0,115,255,227,7,5,7,51,16,39,23,131,0,99,1,83,16,6,3,244,0,0,255,255,0,135, + 255,227,6,39,5,224,16,38,23,131,0,0,16,6,3,245,0,0,0,0,0,1,0,115,254,86,5,39,5,240,0,29,0,57,64,10,0,28,27,13, + 48,22,25,5,16,30,16,252,236,252,212,180,47,27,63,27,2,93,236,49,0,64,12,14,161,13,174,18,149,9,145,28,26,149,0,47,236,204,244,236, + 244,236,48,180,15,31,31,31,2,1,93,33,35,32,39,38,17,16,55,54,33,50,23,22,23,21,38,39,38,35,32,7,6,17,16,23,22,51,33,17, + 35,3,250,174,254,165,187,195,195,195,1,83,134,118,119,104,102,115,116,130,255,0,136,136,136,152,240,1,107,201,198,208,1,83,1,104,207,208,36,35, + 71,213,95,47,47,156,157,254,216,254,211,130,148,253,176,0,0,1,0,113,254,86,3,231,4,123,0,29,0,57,64,10,29,18,26,12,72,21,18,4, + 69,30,16,252,236,244,212,236,49,0,64,12,12,134,13,136,17,185,8,184,28,25,169,0,47,236,204,244,252,245,238,48,64,11,15,31,16,31,128,31, + 144,31,160,31,5,1,93,33,32,39,38,53,16,55,54,33,50,23,22,23,21,38,39,38,35,34,7,6,21,20,23,22,59,1,17,35,17,2,152,254, + 251,141,149,151,150,1,6,85,81,81,76,78,79,78,80,179,99,99,99,99,179,245,201,150,159,250,1,18,157,157,17,18,35,172,43,22,21,113,114,205, + 185,114,113,253,195,1,170,0,0,1,0,59,255,165,3,202,3,167,0,19,0,0,1,7,39,7,23,7,39,7,39,55,39,55,23,55,39,55,23,55, + 23,7,3,202,100,216,105,216,100,216,125,174,125,216,100,216,105,216,100,216,105,174,105,2,17,174,125,181,125,174,125,216,100,216,125,174,125,181,125,174, + 125,181,100,181,0,1,251,218,4,222,255,66,6,122,0,47,0,0,1,33,20,7,6,7,6,7,6,34,39,38,39,38,39,38,53,52,55,54,55,54, + 55,54,51,33,52,55,54,55,54,55,54,50,23,22,23,22,23,22,21,20,7,6,7,6,7,6,254,185,254,51,10,11,19,20,25,24,56,24,25,20, + 19,11,10,10,11,19,20,25,24,28,1,205,10,11,19,20,25,24,56,24,25,20,20,10,10,10,11,19,20,25,24,5,103,27,25,27,18,19,11,10, + 10,11,19,18,27,25,27,28,25,27,18,19,11,10,27,25,27,18,19,11,10,10,11,19,21,24,25,28,27,25,27,18,19,11,10,0,0,1,253,7, + 5,41,0,9,6,77,0,13,0,0,19,35,38,35,34,7,6,7,53,54,55,54,51,32,9,118,23,162,93,91,147,136,139,74,119,125,1,36,5,41, + 155,47,75,23,134,39,42,67,0,1,253,179,4,194,254,165,6,97,0,8,0,0,1,34,17,53,51,21,35,20,55,254,165,242,241,133,134,4,194,1, + 11,148,158,157,3,0,0,0,0,1,253,179,4,194,254,165,6,97,0,8,0,0,1,16,35,53,22,53,35,53,51,254,165,242,134,133,241,5,205,254, + 245,103,3,157,158,0,0,0,0,1,249,202,4,217,0,9,6,77,0,13,0,0,1,18,33,50,5,4,37,21,36,39,36,39,38,7,249,202,135,1, + 175,114,1,69,1,50,1,32,254,95,239,254,217,102,221,152,5,1,1,76,123,116,1,134,23,92,113,7,12,207,0,0,0,8,247,214,254,144,3,70, + 7,96,0,12,0,25,0,38,0,51,0,64,0,77,0,90,0,103,0,0,1,35,46,1,35,34,6,7,35,62,1,32,22,1,35,46,1,35,34,6, + 7,35,62,1,32,22,5,35,46,1,35,34,6,7,35,62,1,32,22,1,35,46,1,35,34,6,7,35,62,1,32,22,5,35,46,1,35,34,6,7, + 35,62,1,32,22,1,35,46,1,35,34,6,7,35,62,1,32,22,5,35,46,1,35,34,6,7,35,62,1,32,22,1,35,46,1,35,34,6,7,35, + 62,1,32,22,254,199,118,11,97,87,86,96,13,118,10,158,1,34,158,3,56,118,11,97,87,86,96,13,118,10,158,1,34,158,249,174,118,11,97,87, + 86,96,13,118,10,158,1,34,158,6,102,118,11,97,87,86,96,13,118,10,158,1,34,158,249,174,118,11,97,87,86,96,13,118,10,158,1,34,158,7, + 183,118,11,97,87,86,96,13,118,10,158,1,34,158,247,12,118,11,97,87,86,96,13,118,10,158,1,34,158,4,137,118,11,97,87,86,96,13,118,10, + 158,1,34,158,6,65,75,75,74,76,143,144,144,254,81,75,75,74,76,143,144,144,143,75,75,74,76,143,144,144,250,1,75,75,74,76,143,144,144,143, + 75,75,74,76,143,144,144,2,41,75,75,74,76,143,144,144,143,75,75,74,76,143,144,144,251,152,75,75,74,76,143,144,144,0,0,0,0,8,248,88, + 253,195,2,194,8,45,0,5,0,11,0,17,0,23,0,29,0,35,0,41,0,47,0,0,39,55,23,19,7,3,1,7,39,3,55,19,1,39,55,37, + 23,5,1,23,7,5,39,37,1,53,51,5,21,45,1,21,35,37,53,5,1,35,53,19,51,11,1,51,21,3,35,19,107,150,121,111,92,169,251,119, + 150,121,111,92,169,5,31,150,122,1,86,92,254,227,250,76,149,121,254,169,91,1,28,6,96,172,1,64,254,192,248,194,172,254,192,1,64,4,95,211, + 164,129,82,211,211,164,129,82,90,150,121,254,169,92,1,29,5,181,150,121,1,87,92,254,227,254,241,149,122,110,91,169,251,119,150,121,111,92,168,2, + 24,212,164,130,82,212,212,164,130,82,2,223,172,1,64,254,192,248,194,172,254,192,1,64,255,255,0,201,254,86,5,252,7,109,16,38,23,132,0,0, + 16,7,22,192,4,245,1,117,255,255,0,193,254,86,5,56,6,20,16,38,23,133,0,0,16,7,2,154,0,160,255,204,0,2,0,33,0,0,4,236, + 5,213,0,18,0,29,0,58,64,14,31,19,25,5,13,17,25,15,0,28,11,9,13,30,16,220,60,204,252,60,60,204,16,212,236,204,49,0,64,15, + 10,18,149,12,16,14,129,9,24,149,1,173,25,149,9,47,236,244,236,16,244,212,60,236,50,48,1,21,33,50,4,21,20,4,35,33,17,35,53,51, + 53,51,21,51,21,1,52,39,38,35,33,17,33,50,55,54,1,147,1,78,251,1,16,254,240,251,253,232,168,168,202,168,1,220,79,78,163,254,188,1, + 68,163,78,79,4,81,226,218,222,221,218,4,81,164,224,224,164,253,102,139,68,67,253,221,68,67,0,0,0,2,0,38,0,0,4,69,5,158,0,10, + 0,30,0,57,64,15,32,69,0,18,17,22,30,6,12,28,28,24,22,26,31,16,220,60,204,252,60,60,204,16,212,236,236,49,0,64,13,22,30,169, + 24,28,26,5,169,12,26,6,169,21,47,236,196,212,236,16,212,60,236,50,48,1,52,39,38,35,33,17,33,50,55,54,1,17,33,50,23,22,16,7, + 6,35,33,17,35,53,51,17,51,17,51,21,3,129,62,67,128,254,249,1,7,129,66,62,253,248,1,15,208,121,116,116,115,214,254,57,155,155,184,157, + 1,76,94,42,46,254,151,46,43,2,223,254,202,85,82,254,176,82,82,3,209,143,1,62,254,194,143,0,0,2,0,201,0,0,4,225,5,213,0,15, + 0,28,0,0,1,23,7,39,6,43,1,17,35,17,33,50,23,22,21,20,39,54,55,52,38,43,1,17,51,50,55,39,55,4,85,140,106,146,126,214, + 254,202,1,200,251,128,129,226,12,1,154,141,254,254,114,71,215,106,3,35,117,126,123,83,253,168,5,213,113,114,219,146,45,44,57,134,146,253,207,47, + 180,126,0,0,0,2,0,186,254,86,4,164,4,123,0,16,0,41,0,0,37,39,55,23,54,53,52,39,38,32,7,6,16,23,22,51,50,5,23,7, + 39,6,35,34,39,38,39,17,35,17,51,21,54,55,54,51,50,23,22,16,7,6,3,42,140,110,138,79,83,84,254,220,84,83,83,84,146,70,1,27, + 147,111,149,87,108,123,88,89,58,185,185,58,89,88,123,204,127,128,128,12,152,167,93,165,115,197,203,116,115,116,115,254,106,116,115,20,174,93,179,46, + 48,49,100,253,174,6,10,170,100,48,49,162,162,253,240,162,15,0,0,0,0,1,0,201,0,0,4,106,7,7,0,7,0,27,64,13,3,6,149,1, + 129,0,3,4,6,28,1,4,8,16,252,252,220,204,49,0,47,244,236,204,48,51,17,33,17,51,17,33,17,201,2,247,170,253,41,5,213,1,50,254, + 36,250,213,0,0,1,0,186,0,0,3,208,5,154,0,7,0,29,183,9,3,4,6,8,1,70,8,16,252,252,220,204,204,49,0,181,3,6,169,1, + 188,0,47,244,236,204,48,51,17,33,17,51,17,33,17,186,2,131,147,253,162,4,96,1,58,254,51,252,51,0,0,0,0,1,0,71,0,0,4,239, + 5,213,0,13,0,41,64,20,1,12,149,9,4,8,149,5,129,0,15,6,10,12,9,28,2,4,1,14,16,220,60,204,252,60,204,204,196,49,0,47, + 244,252,220,60,236,50,48,33,17,33,53,33,17,33,21,33,17,33,21,33,17,1,78,254,249,1,7,3,161,253,41,2,35,253,221,2,148,170,2,151, + 170,254,19,170,253,108,0,0,0,1,0,56,0,0,4,85,4,96,0,13,0,43,64,10,15,6,10,12,9,8,2,4,1,14,16,220,60,204,252,60, + 204,220,204,49,0,64,10,1,12,169,9,4,8,169,5,188,0,47,244,252,220,60,236,50,48,33,17,33,53,33,17,33,21,33,17,33,21,33,17,1, + 63,254,249,1,7,3,22,253,162,1,160,254,96,1,244,170,1,194,157,254,219,170,254,12,0,1,0,201,254,102,4,204,5,213,0,27,0,51,64,12, + 18,24,28,4,29,12,0,6,28,3,4,28,16,252,252,60,220,204,196,252,204,49,0,64,14,18,149,17,176,2,0,149,7,2,6,149,3,129,2,47, + 244,236,16,212,236,16,244,236,48,1,17,35,17,33,21,33,17,33,50,23,22,21,17,16,6,43,1,53,51,50,55,54,53,17,52,38,35,1,147,202, + 3,161,253,41,1,161,186,113,109,204,228,76,62,134,56,55,124,124,2,199,253,57,5,213,170,254,70,119,114,238,254,206,254,242,244,170,75,75,194,1, + 34,159,158,0,0,1,0,186,254,86,4,11,4,96,0,29,0,51,64,12,19,25,8,4,31,12,0,6,8,3,70,30,16,252,252,60,220,204,196,252, + 204,49,0,64,14,19,169,18,189,1,0,169,7,1,6,169,3,188,1,47,244,236,16,212,236,16,252,236,48,1,17,35,17,33,21,33,17,51,32,23, + 22,21,17,20,7,6,43,1,53,51,50,55,54,53,17,52,39,38,35,1,114,184,3,22,253,162,250,1,7,70,82,82,81,181,193,172,110,33,38,38, + 49,134,1,231,254,25,4,96,170,254,193,71,81,229,254,242,214,96,96,156,48,55,147,1,8,170,32,41,0,1,0,40,254,191,8,145,5,213,0,23, + 0,0,1,51,17,1,51,9,1,51,17,35,17,35,9,1,17,35,17,9,1,35,9,1,51,1,3,234,202,2,170,245,253,223,1,215,136,197,41,254, + 19,254,254,202,254,254,254,19,211,2,68,253,223,245,2,170,5,213,253,30,2,226,253,179,253,34,254,21,1,65,3,1,254,233,254,22,1,234,1,23, + 252,255,3,136,2,77,253,30,0,1,0,70,254,229,7,3,4,96,0,23,0,0,1,51,17,1,51,9,1,51,17,35,17,35,1,7,17,35,17,39, + 1,35,9,1,51,1,3,63,183,1,233,214,254,110,1,102,122,184,33,254,135,187,183,187,254,135,197,1,204,254,110,214,1,233,4,96,253,242,2,14, + 254,81,253,232,254,76,1,27,2,54,201,254,147,1,109,201,253,202,2,177,1,175,253,242,255,255,0,135,254,117,4,154,5,240,16,38,0,122,57,0, + 18,6,3,171,0,0,0,0,255,255,0,133,254,117,3,200,4,124,16,38,0,122,206,0,18,6,3,203,0,0,0,0,0,1,0,201,254,191,5,180, + 5,213,0,15,0,0,19,51,17,1,33,9,1,51,17,35,17,35,9,1,17,35,201,202,2,210,1,3,253,191,1,237,160,197,69,253,250,254,239,202, + 5,213,253,30,2,226,253,178,253,35,254,21,1,65,3,1,254,233,254,22,0,1,0,186,254,229,4,179,4,96,0,15,0,0,19,51,17,1,51,9, + 1,51,17,35,17,35,1,7,17,35,186,183,2,7,226,254,84,1,119,142,184,56,254,115,197,183,4,96,253,242,2,14,254,79,253,234,254,76,1,27, + 2,53,200,254,147,0,0,0,0,1,0,201,0,0,5,134,5,213,0,18,0,0,19,51,17,55,17,51,21,1,33,9,1,35,1,17,35,17,7,17, + 35,201,202,173,100,1,193,1,3,253,191,2,95,220,253,250,100,173,202,5,213,253,30,177,1,84,238,1,203,253,178,252,121,3,1,254,37,1,117,177, + 254,22,0,0,0,1,0,186,0,0,4,145,4,96,0,18,0,0,19,51,17,55,53,51,21,1,51,9,1,35,1,17,35,53,7,17,35,186,183,96, + 101,1,66,226,254,84,1,227,206,254,115,101,96,183,4,96,253,242,97,221,118,1,70,254,79,253,81,2,53,254,197,212,97,254,147,0,0,1,0,33, + 0,0,5,134,5,213,0,19,0,0,19,51,21,51,21,35,17,1,33,9,1,35,9,1,17,35,17,35,53,51,201,202,168,168,2,210,1,3,253,191, + 2,95,220,253,250,254,239,202,168,168,5,213,224,144,254,142,2,226,253,178,252,121,3,1,254,233,254,22,4,101,144,0,0,1,0,61,0,0,4,145, + 6,20,0,19,0,0,19,51,21,33,21,33,17,1,51,9,1,35,1,7,17,35,17,35,53,51,186,183,1,100,254,156,2,7,226,254,84,1,227,206, + 254,115,197,183,125,125,6,20,122,125,253,53,2,14,254,79,253,81,2,53,200,254,147,5,29,125,0,0,0,1,0,50,0,0,6,178,5,213,0,13, + 0,95,64,11,8,5,1,4,6,9,1,28,12,0,14,16,212,220,236,50,212,196,17,57,57,49,0,64,14,66,13,160,0,8,9,5,2,4,3,0, + 175,10,6,47,60,236,50,23,57,16,236,48,75,83,88,64,22,7,17,6,8,17,5,9,4,6,5,3,17,4,2,17,5,8,9,9,4,9,4,9, + 7,16,60,60,4,237,16,5,237,7,8,16,237,5,16,237,89,19,33,17,1,33,9,1,35,9,1,17,35,17,33,50,2,141,2,210,1,3,253,191, + 2,95,220,253,250,254,239,202,254,61,5,213,253,30,2,226,253,178,252,121,3,1,254,233,254,22,5,43,0,1,0,42,0,0,5,130,4,96,0,13, + 0,95,64,11,8,5,1,4,6,9,1,8,11,0,14,16,212,220,236,50,212,196,17,57,57,49,0,64,14,66,13,160,0,8,9,5,2,4,3,0, + 188,10,6,47,60,236,50,23,57,16,236,48,75,83,88,64,22,7,17,6,8,17,5,9,4,6,5,3,17,4,2,17,5,8,9,9,4,9,4,9, + 7,16,60,60,4,237,16,5,237,7,8,16,237,5,16,237,89,19,33,17,1,51,9,1,35,1,7,17,35,17,33,42,2,56,2,7,226,254,84,1, + 227,206,254,115,197,183,254,127,4,96,253,242,2,14,254,79,253,81,2,53,200,254,147,3,198,0,0,0,0,1,0,201,254,191,6,4,5,213,0,15, + 0,54,64,26,12,149,2,173,4,0,129,6,149,9,14,10,7,149,10,11,3,28,5,56,13,1,28,0,4,16,16,252,236,50,252,236,50,60,236,49, + 0,47,60,204,236,228,50,252,236,48,178,80,17,1,1,93,19,51,17,33,17,51,17,51,17,35,17,35,17,33,17,35,201,202,2,222,202,201,201,202, + 253,34,202,5,213,253,156,2,100,250,213,254,21,1,65,2,199,253,57,0,0,1,0,193,254,229,5,64,4,96,0,15,0,49,64,26,13,169,2,4, + 0,188,6,169,9,11,15,17,70,12,4,8,7,169,10,5,13,1,8,0,70,16,16,252,236,50,220,60,236,236,50,236,49,0,47,60,204,236,228,50, + 220,236,48,19,51,17,33,17,51,17,51,17,35,17,35,17,33,17,35,193,184,2,87,184,184,184,184,253,169,184,4,96,254,51,1,205,252,57,254,76, + 1,27,2,4,253,252,0,0,0,1,0,201,0,0,8,18,5,213,0,13,0,45,64,24,6,149,4,10,149,2,173,4,0,129,12,8,5,9,3,28, + 7,56,11,1,28,0,4,14,16,252,236,50,252,236,50,196,49,0,47,60,228,50,252,236,16,236,48,19,51,17,33,17,33,21,33,17,35,17,33,17, + 35,201,202,2,222,3,161,253,41,202,253,34,202,5,213,253,156,2,100,170,250,213,2,199,253,57,0,0,0,1,0,193,0,0,6,230,4,96,0,13, + 0,43,64,22,6,169,4,11,169,2,4,0,188,9,13,5,10,4,8,7,11,1,8,0,70,14,16,252,236,50,220,236,50,196,49,0,47,60,228,50, + 220,236,16,236,48,19,51,17,33,17,33,21,33,17,35,17,33,17,35,193,184,2,87,3,22,253,162,184,253,169,184,4,96,254,51,1,205,170,252,74, + 2,4,253,252,0,1,0,201,254,102,8,116,5,213,0,29,0,56,64,14,31,15,28,19,26,3,28,0,8,4,28,7,4,30,16,252,236,212,60,236, + 220,204,252,204,49,0,64,15,29,149,10,173,2,3,149,7,129,6,19,149,20,6,2,47,60,220,236,16,244,236,16,244,236,48,1,17,35,17,33,17, + 35,17,33,17,33,50,23,22,21,17,16,6,43,1,53,51,50,55,54,53,17,52,38,35,5,59,202,253,34,202,4,114,1,161,186,113,109,204,228,76, + 62,134,56,55,124,124,2,199,253,57,5,43,250,213,5,213,253,156,119,114,238,254,206,254,242,244,170,75,75,194,1,34,159,158,0,0,0,1,0,193, + 254,86,7,33,4,96,0,31,0,51,64,14,33,15,8,20,27,3,8,0,8,4,8,7,70,32,16,252,236,212,60,236,220,204,252,204,49,0,64,11, + 31,9,3,169,7,188,2,19,21,2,6,47,60,220,204,16,244,236,220,204,48,1,17,35,17,33,17,35,17,33,17,51,32,23,22,21,17,20,7,6, + 43,1,53,51,50,55,54,53,17,52,39,38,7,4,136,184,253,169,184,3,199,250,1,7,70,82,82,81,181,193,172,110,33,38,38,49,134,1,231,254, + 25,3,198,252,58,4,96,254,23,71,81,229,254,242,214,96,96,156,48,55,147,1,8,164,38,46,5,0,0,2,0,115,255,227,6,247,5,241,0,65, + 0,89,0,0,37,46,3,53,52,62,4,51,50,30,4,21,20,14,2,7,30,1,51,50,54,55,21,14,1,35,34,46,2,39,14,1,35,34,36,38, + 2,53,52,18,62,1,55,21,14,3,21,20,30,2,51,50,54,55,62,3,53,52,46,4,35,34,14,4,21,20,30,2,4,43,57,108,82,50,19,42, + 68,97,129,83,78,125,97,70,45,21,26,63,106,81,38,104,59,62,101,51,46,120,61,38,81,85,87,43,66,195,121,170,254,244,188,99,91,172,247,157, + 115,171,112,56,60,123,190,129,82,128,177,63,83,48,20,11,23,36,48,62,38,49,72,51,33,18,7,40,66,84,174,49,137,170,196,107,66,138,131,116, + 87,50,50,84,112,123,127,58,83,180,178,170,74,26,21,19,26,168,23,18,8,20,35,27,38,52,116,207,1,29,168,160,1,16,203,125,14,167,22,102, + 154,205,124,125,222,167,98,25,109,58,134,142,145,69,47,102,99,89,67,40,43,71,91,96,95,38,98,171,142,110,0,0,0,2,0,113,255,227,5,120, + 4,122,0,63,0,80,0,0,19,52,62,2,55,21,14,3,21,20,30,2,51,50,54,55,46,3,53,52,62,2,51,50,30,2,21,20,6,7,30,1, + 51,50,62,2,55,21,14,3,35,34,38,39,14,3,35,34,46,2,5,62,3,53,52,46,2,35,34,14,2,21,20,113,75,143,209,134,93,138,91,45, + 50,96,138,88,39,86,28,36,63,47,27,40,80,116,77,66,112,80,45,92,95,35,68,30,27,45,41,42,24,17,37,45,56,37,55,130,67,30,70,73, + 71,31,135,212,145,76,3,86,34,45,26,11,22,33,40,18,26,44,33,19,2,40,131,216,156,88,3,155,6,70,114,152,88,98,160,114,62,11,17,37, + 103,120,130,64,93,159,115,65,57,104,146,89,155,241,94,19,10,4,10,19,15,157,10,17,12,7,28,44,18,27,18,9,84,153,214,184,38,94,100,99, + 43,75,105,66,31,38,72,105,67,247,0,0,255,255,0,115,254,117,5,39,5,240,16,39,0,122,1,45,0,0,18,6,3,181,0,0,255,255,0,113, + 254,117,3,231,4,123,16,39,0,122,0,143,0,0,18,6,3,213,0,0,0,1,255,250,254,191,4,233,5,213,0,11,0,44,64,13,13,10,64,1, + 28,4,11,28,8,64,5,8,12,16,196,220,236,252,60,236,252,196,49,0,64,9,10,6,149,9,129,1,149,3,5,47,204,236,244,236,50,48,37,51, + 17,35,17,35,17,33,53,33,21,33,2,215,201,201,203,253,238,4,239,253,238,170,254,21,1,65,5,43,170,170,0,0,0,1,0,60,254,229,4,109, + 4,96,0,11,0,40,64,10,13,9,1,8,4,11,8,6,8,12,16,220,220,252,60,236,220,204,49,0,64,9,11,7,169,8,188,0,169,3,5,47, + 204,236,244,236,50,48,37,51,17,35,17,35,17,33,53,33,21,33,2,175,184,184,181,254,66,4,49,254,66,153,254,76,1,27,3,182,170,170,0,0, + 255,255,255,252,0,0,4,231,5,213,18,6,0,60,0,0,0,1,0,61,254,86,4,127,4,96,0,8,0,111,64,16,4,8,188,2,9,6,3,0, + 8,3,4,0,8,3,4,9,16,212,75,176,10,84,75,176,8,84,91,88,185,0,11,0,64,56,89,75,176,20,84,88,185,0,11,255,192,56,89,212, + 252,73,58,17,18,57,49,0,16,204,228,50,48,64,25,7,17,8,0,8,6,17,5,6,0,8,0,6,17,6,7,3,3,4,5,17,4,4,3,66, + 75,83,88,7,16,5,237,7,16,8,237,7,16,8,237,7,16,5,237,89,34,37,17,35,17,1,51,9,1,51,2,197,195,254,59,195,1,94,1,94, + 195,18,254,68,1,188,4,78,252,148,3,108,0,1,255,252,0,0,4,231,5,213,0,16,0,0,1,33,17,35,17,33,53,33,53,1,51,9,1,51, + 1,21,33,3,223,254,248,203,254,249,1,7,253,240,217,1,158,1,155,217,253,240,1,8,1,115,254,141,1,115,170,170,3,14,253,154,2,102,252,242, + 170,0,0,0,0,1,0,61,254,86,4,127,4,96,0,16,0,0,9,1,21,33,21,33,21,35,53,33,53,33,53,1,51,9,1,4,127,254,70,1, + 6,254,250,195,254,239,1,17,254,59,195,1,94,1,94,4,96,251,178,88,170,186,186,170,88,4,78,252,148,3,108,0,0,1,0,61,254,191,5,59, + 5,213,0,15,0,0,37,51,17,35,17,35,9,1,35,9,1,51,9,1,51,1,4,203,112,197,20,254,92,254,89,218,2,21,254,47,217,1,115,1, + 117,217,254,32,170,254,21,1,65,2,123,253,133,3,29,2,184,253,213,2,43,253,51,0,0,1,0,59,254,229,4,121,4,96,0,15,0,0,37,51, + 17,35,17,35,9,1,35,9,1,51,9,1,51,1,4,8,113,184,33,254,186,254,186,217,1,179,254,114,217,1,41,1,41,217,254,107,153,254,76,1, + 27,1,184,254,72,2,74,2,22,254,113,1,143,253,223,0,0,1,255,250,254,191,7,71,5,213,0,15,0,53,64,16,17,5,149,8,2,28,3,10, + 13,64,15,28,12,64,10,16,16,212,228,252,228,16,212,236,60,252,204,49,0,64,11,15,10,149,2,12,129,7,4,0,149,9,47,236,50,204,244,60, + 236,50,48,37,33,17,51,17,51,17,35,17,33,17,33,53,33,21,33,2,214,2,222,202,201,201,251,142,253,238,4,239,253,238,170,5,43,250,213,254, + 21,1,65,5,43,170,170,0,0,1,0,5,254,229,6,66,4,96,0,15,0,51,64,14,17,5,169,2,8,8,3,10,13,15,8,12,10,16,16,220, + 196,252,196,16,212,60,236,252,204,49,0,64,11,15,11,169,2,12,188,7,4,0,169,9,47,236,50,204,244,60,236,50,48,37,33,17,51,17,51,17, + 35,17,33,17,33,53,33,21,33,2,120,2,90,184,184,184,252,57,254,66,4,49,254,66,153,3,199,252,57,254,76,1,27,3,182,170,170,0,0,0, + 0,1,0,175,254,191,5,124,5,213,0,20,0,46,64,12,1,22,4,6,19,28,4,20,13,28,12,21,16,220,236,212,60,236,50,236,50,49,0,64, + 11,7,149,17,173,19,12,129,0,149,3,5,47,204,236,228,50,244,236,48,37,51,17,35,17,35,17,33,34,39,38,53,17,51,17,20,22,51,33,17, + 51,4,179,201,201,203,254,95,186,113,109,201,124,124,1,120,203,170,254,21,1,65,2,199,119,114,238,1,55,254,217,159,158,2,100,0,0,1,0,150, + 254,229,4,184,4,96,0,21,0,70,64,12,1,23,70,6,20,8,4,21,13,8,12,22,16,220,236,212,60,236,50,236,50,49,0,64,10,7,169,18, + 20,12,188,0,169,3,5,47,204,236,228,50,212,236,176,5,176,7,35,73,176,18,176,20,35,73,82,88,177,7,18,184,255,192,176,2,23,56,89,48, + 37,51,17,35,17,35,17,33,34,39,38,61,1,51,21,20,23,22,51,33,17,51,4,0,184,184,184,254,169,153,102,92,184,52,53,104,1,41,184,153, + 254,76,1,27,2,9,95,86,184,234,211,117,59,59,1,190,0,1,0,175,0,0,4,179,5,213,0,24,0,0,1,35,34,39,38,53,17,51,17,20, + 22,59,1,17,51,17,51,17,51,17,35,17,35,17,35,2,130,59,186,113,109,201,124,124,18,144,214,203,203,214,144,2,199,119,114,238,1,55,254,217, + 159,158,1,57,254,199,2,100,250,43,2,199,254,207,0,0,0,1,0,150,0,0,4,0,4,96,0,24,0,0,1,53,51,21,51,17,51,17,35,17, + 35,21,35,53,35,34,39,38,61,1,51,21,20,23,22,1,249,160,175,184,184,175,160,8,153,102,92,184,52,43,2,164,194,196,1,190,251,160,2,9, + 196,196,95,86,184,234,211,117,59,48,0,0,0,1,0,175,0,0,4,179,5,213,0,15,0,36,64,10,17,8,28,6,12,0,28,15,4,16,16,252, + 236,50,212,236,204,49,0,183,2,149,11,173,15,129,7,14,47,60,244,244,236,48,1,17,33,50,22,21,17,35,17,52,38,35,33,17,35,17,1,122, + 1,161,186,222,201,124,124,254,136,203,5,213,253,156,233,238,254,102,1,138,159,158,253,57,5,213,0,0,255,255,0,186,0,0,4,100,6,20,18,6, + 0,75,0,0,0,2,0,20,255,227,7,20,5,240,0,34,0,42,0,73,64,17,35,36,9,15,36,25,8,51,9,25,24,30,18,29,0,24,43,16, + 220,50,220,236,16,236,244,236,196,17,18,57,49,0,64,22,16,161,15,174,12,30,24,8,149,0,36,173,12,149,20,40,149,4,145,20,140,43,16,228, + 244,236,16,236,244,60,236,50,204,16,244,236,48,1,18,55,54,33,32,23,22,19,33,16,0,33,50,54,55,21,6,7,6,35,32,39,38,3,6,39, + 38,61,1,51,21,20,23,22,37,33,38,39,38,32,7,6,1,178,34,150,188,1,58,1,67,181,187,1,251,112,1,18,1,18,139,252,112,111,131,132, + 146,254,162,197,188,10,170,118,122,170,75,66,1,64,3,173,24,98,130,254,72,128,97,3,109,1,10,167,210,210,219,254,132,254,244,254,206,96,95,215, + 70,36,36,205,194,1,85,1,103,107,223,76,62,160,65,57,2,191,124,164,164,124,0,0,0,2,0,15,255,227,5,102,4,123,0,37,0,46,0,105, + 64,17,46,38,21,29,38,8,19,75,0,6,18,5,21,18,11,0,47,16,220,50,236,220,64,11,0,5,112,48,127,5,176,48,207,48,5,93,236,16, + 244,236,196,17,18,57,49,0,64,26,19,38,20,30,134,29,136,25,6,11,38,169,20,25,185,34,0,20,187,42,185,15,184,34,140,47,16,228,244,236, + 228,178,111,20,1,93,50,16,236,16,252,60,204,16,244,178,47,29,1,93,236,17,18,57,48,1,34,39,38,61,1,51,21,20,23,22,51,54,55,54, + 33,50,23,22,29,1,33,22,23,22,51,50,55,54,55,21,6,7,6,35,32,39,38,1,38,39,38,35,34,7,6,7,1,88,144,89,96,156,48,57, + 74,26,116,146,0,255,226,131,132,252,178,12,102,103,183,106,100,99,98,104,99,110,101,254,243,156,148,3,78,2,82,83,136,154,93,92,14,2,4,82, + 90,172,70,49,151,33,38,197,130,161,145,146,250,90,190,100,99,26,26,52,174,44,20,22,156,148,1,129,151,90,90,87,87,158,0,0,0,2,0,20, + 254,135,7,20,5,240,0,7,0,45,0,0,1,33,38,39,38,32,7,6,7,18,55,54,33,32,23,22,19,33,16,0,33,50,54,55,21,6,7,6, + 7,17,35,17,36,39,38,3,6,39,38,61,1,51,21,20,23,22,2,139,3,173,24,98,130,254,72,128,97,241,34,150,188,1,58,1,67,181,187,1, + 251,112,1,18,1,18,139,252,112,111,131,109,119,178,254,253,160,188,10,170,118,122,170,75,66,3,109,191,124,164,164,124,191,1,10,167,210,210,219,254, + 132,254,244,254,206,96,95,215,70,36,30,5,254,163,1,99,32,166,195,1,84,1,103,107,223,76,62,160,65,57,0,0,0,2,0,15,254,183,5,102, + 4,123,0,8,0,49,0,0,1,38,39,38,35,34,7,6,15,1,34,39,38,61,1,51,21,20,23,22,51,54,55,54,33,50,23,22,29,1,33,22, + 23,22,51,50,55,54,55,21,6,7,6,7,17,35,17,38,39,38,4,174,2,82,83,136,154,93,92,14,198,144,89,96,156,48,57,74,26,116,146,0, + 255,226,131,132,252,178,12,102,103,183,106,100,99,98,104,99,79,74,166,194,123,148,2,148,151,90,90,87,87,158,143,82,90,172,70,49,151,33,38,197, + 130,161,145,146,250,90,190,100,99,26,26,52,174,44,20,16,4,254,210,1,51,26,123,148,255,255,0,201,0,0,1,147,5,213,18,6,0,44,0,0, + 255,255,0,40,0,0,8,118,7,109,16,39,22,192,6,91,1,117,18,6,3,170,0,0,255,255,0,70,0,0,6,239,6,72,16,39,2,154,1,168, + 0,0,18,6,3,202,0,0,0,1,0,201,254,102,5,53,5,213,0,28,0,0,1,51,50,23,22,21,17,16,6,43,1,53,51,50,55,54,53,17, + 52,38,35,33,17,35,17,51,17,1,33,2,169,139,186,113,109,204,228,76,62,134,56,55,124,124,254,136,202,202,2,158,1,4,3,113,119,114,238,254, + 206,254,242,244,170,75,75,194,1,34,159,158,253,57,5,213,253,137,2,119,0,1,0,191,254,86,4,136,4,96,0,30,0,0,1,51,32,23,22,21, + 17,20,7,6,43,1,53,51,50,55,54,53,17,52,39,38,35,33,17,35,17,51,17,1,51,2,94,20,1,5,72,82,82,81,181,193,172,110,33,38, + 38,44,139,254,252,185,185,2,37,235,2,119,71,81,229,254,242,214,96,96,156,48,55,147,1,8,166,36,41,254,25,4,96,254,29,1,227,0,0,0, + 0,1,0,54,254,86,6,3,5,213,0,20,0,0,33,35,17,33,21,16,3,6,5,53,54,55,18,25,1,33,17,51,21,1,35,5,58,202,254,27, + 132,98,254,145,212,67,117,3,120,201,254,146,134,5,43,212,254,24,254,170,253,56,167,46,168,1,37,2,53,1,26,250,213,170,254,86,0,1,0,46, + 254,86,5,43,4,96,0,20,0,0,37,51,21,1,35,19,35,17,33,21,16,3,6,5,53,54,55,54,17,53,33,4,115,184,254,222,123,229,184,254, + 123,118,94,254,204,179,59,98,2,245,153,153,254,86,1,170,3,199,134,254,146,254,252,207,29,153,27,127,207,1,167,212,0,1,0,201,254,102,5,59, + 5,213,0,20,0,49,64,14,15,8,0,28,22,4,10,56,7,3,28,5,4,21,16,252,236,50,252,236,252,60,204,49,0,64,11,14,16,4,2,149, + 8,173,9,6,129,4,47,228,50,252,236,16,220,204,48,37,17,33,17,35,17,51,17,33,17,51,17,16,6,43,1,53,51,50,55,54,4,113,253,34, + 202,202,2,222,202,206,227,76,62,134,56,55,104,2,95,253,57,5,213,253,156,2,100,250,147,254,242,244,170,75,75,0,0,1,0,193,254,86,4,136, + 4,96,0,21,0,47,64,13,16,8,0,8,23,70,10,7,3,8,5,70,22,16,252,236,50,220,236,252,60,204,49,0,64,10,15,17,4,2,169,8, + 9,6,188,4,47,244,60,220,236,16,220,204,48,5,17,33,17,35,17,51,17,33,17,51,17,20,7,6,43,1,53,51,50,55,54,3,208,253,169,184, + 184,2,87,184,82,81,181,193,172,110,33,38,20,2,24,253,252,4,96,254,51,1,205,251,140,214,96,96,156,48,55,0,0,1,0,201,254,86,6,4, + 5,213,0,16,0,0,33,35,17,33,17,35,17,51,17,33,17,51,17,51,21,1,35,5,59,202,253,34,202,202,2,222,202,201,254,146,134,2,199,253, + 57,5,213,253,156,2,100,250,213,170,254,86,0,1,0,193,254,86,5,64,4,96,0,16,0,0,33,35,17,33,17,35,17,51,17,33,17,51,17,51, + 21,1,35,4,136,184,253,169,184,184,2,87,184,184,254,222,123,2,4,253,252,4,96,254,51,1,205,252,57,153,254,86,0,1,0,175,254,191,4,179, + 5,213,0,20,0,47,64,13,20,28,17,1,14,28,22,4,15,8,28,7,21,16,220,236,212,236,252,50,50,236,49,0,64,11,2,149,12,173,14,7, + 129,0,149,19,17,47,204,236,228,50,244,236,48,37,17,33,34,39,38,53,17,51,17,20,22,51,33,17,51,17,35,17,35,17,3,232,254,95,186,113, + 109,201,124,124,1,120,203,203,201,170,2,29,119,114,238,1,55,254,217,159,158,2,100,250,43,254,191,1,235,0,0,0,0,1,0,150,254,229,4,0, + 4,96,0,21,0,71,64,13,21,8,18,1,15,8,23,70,16,8,8,7,22,16,220,236,212,236,252,50,50,236,49,0,64,10,2,169,13,15,7,188, + 0,169,20,18,47,204,236,228,50,212,236,176,18,176,2,35,73,176,13,176,15,35,73,82,88,177,2,13,184,255,192,176,2,23,56,89,48,37,17,33, + 34,39,38,61,1,51,21,20,23,22,51,33,17,51,17,35,17,35,17,3,72,254,169,153,102,92,184,52,53,104,1,41,184,184,184,153,1,112,95,86, + 184,234,211,117,59,59,1,190,251,160,254,229,1,180,0,0,0,1,0,201,254,86,6,232,5,213,0,17,0,0,37,51,21,1,35,1,35,17,1,35, + 1,17,35,17,33,9,1,33,6,31,201,254,146,134,1,43,197,254,127,203,254,127,196,1,45,1,125,1,127,1,45,170,170,254,86,1,170,5,31,252, + 0,4,0,250,225,5,213,252,8,3,248,0,0,1,0,193,254,86,6,0,4,96,0,17,0,0,37,51,21,1,35,19,35,17,1,35,1,17,35,17, + 33,9,1,33,5,72,184,254,222,123,229,178,254,203,184,254,202,178,1,6,1,62,1,63,1,4,153,153,254,86,1,170,3,176,253,39,2,217,252,80, + 4,96,253,18,2,238,0,0,255,255,0,193,0,0,1,121,6,20,18,6,0,79,0,0,255,255,0,16,0,0,5,104,7,146,16,39,2,154,0,206, + 1,74,19,6,3,164,0,0,0,18,180,24,0,8,19,7,43,49,0,64,5,111,0,111,8,2,93,48,255,255,0,123,255,227,4,45,6,31,16,38, + 2,154,79,215,19,6,3,196,0,0,0,8,180,34,0,8,25,7,43,49,255,255,0,16,0,0,5,104,7,78,18,38,3,164,0,0,17,7,22,185, + 4,188,1,117,0,20,180,10,18,13,5,7,43,64,9,48,18,63,13,0,18,15,13,4,93,49,0,0,255,255,0,123,255,227,4,45,6,16,18,38, + 3,196,0,0,17,6,0,106,82,0,0,32,180,20,45,40,11,7,43,64,21,127,40,111,40,80,45,95,40,64,45,79,40,48,45,63,40,0,45,15, + 40,10,93,49,255,255,0,8,0,0,7,72,5,213,18,6,0,136,0,0,255,255,0,123,255,227,7,111,4,123,18,6,0,168,0,0,255,255,0,201, + 0,0,4,139,7,109,16,39,22,192,4,161,1,117,19,6,3,169,0,0,0,7,64,3,64,0,1,93,49,0,0,0,255,255,0,113,255,227,4,127, + 6,72,16,39,2,154,0,150,0,0,19,6,3,201,0,0,0,7,64,3,112,0,1,93,49,0,0,0,255,255,0,117,255,227,5,217,5,240,18,6, + 1,81,0,0,255,255,0,113,255,227,4,127,4,123,18,6,2,27,0,0,255,255,0,117,255,227,5,217,7,78,16,39,22,185,5,32,1,117,18,6, + 4,108,0,0,255,255,0,113,255,227,4,127,6,16,16,38,0,106,84,0,18,6,4,109,0,0,0,0,255,255,0,40,0,0,8,118,7,78,16,39, + 22,185,6,81,1,117,18,6,3,170,0,0,255,255,0,70,0,0,6,239,6,16,16,39,0,106,1,158,0,0,18,6,3,202,0,0,255,255,0,135, + 255,227,4,154,7,78,16,39,22,185,4,135,1,117,18,6,3,171,0,0,255,255,0,133,255,227,3,200,6,16,16,38,0,106,58,0,18,6,3,203, + 0,0,0,0,255,255,0,160,255,193,4,248,5,213,18,6,1,121,0,0,255,255,0,88,254,76,4,47,4,96,18,6,2,84,0,0,255,255,0,201, + 0,0,5,51,7,49,16,39,0,113,0,245,1,59,18,6,3,172,0,0,255,255,0,186,0,0,4,121,5,245,16,39,0,113,0,146,255,255,18,6, + 3,204,0,0,255,255,0,201,0,0,5,51,7,78,16,39,22,185,4,245,1,117,18,6,3,172,0,0,255,255,0,186,0,0,4,121,6,16,16,39, + 0,106,0,146,0,0,18,6,3,204,0,0,255,255,0,115,255,227,5,217,7,78,18,38,3,178,0,0,17,7,22,185,5,39,1,117,0,20,180,3, + 31,26,9,7,43,64,9,64,31,79,26,16,31,31,26,4,93,49,0,0,255,255,0,113,255,227,4,117,6,16,18,38,3,210,0,0,17,6,0,106, + 115,0,0,20,180,3,31,26,9,7,43,64,9,64,31,79,26,48,31,63,26,4,93,49,255,255,0,115,255,227,5,217,5,240,18,6,1,97,0,0, + 255,255,0,113,255,227,4,117,4,123,18,6,2,55,0,0,255,255,0,115,255,227,5,217,7,78,18,38,4,124,0,0,16,7,22,185,5,39,1,117, + 255,255,0,113,255,227,4,117,6,16,18,38,4,125,0,0,16,6,0,106,115,0,0,0,255,255,0,111,255,227,5,35,7,78,16,39,22,185,4,103, + 1,117,18,6,3,193,0,0,255,255,0,113,255,227,3,231,6,16,16,38,0,106,226,0,18,6,3,225,0,0,0,0,255,255,0,35,0,0,4,189, + 7,49,16,39,0,113,0,114,1,59,18,6,3,183,0,0,255,255,0,61,254,86,4,127,5,245,16,38,0,113,94,255,18,6,3,215,0,0,0,0, + 255,255,0,35,0,0,4,189,7,78,16,39,22,185,4,114,1,117,18,6,3,183,0,0,255,255,0,61,254,86,4,127,6,16,16,38,0,106,94,0, + 18,6,3,215,0,0,0,0,255,255,0,35,0,0,4,189,7,107,16,39,22,194,4,114,1,117,18,6,3,183,0,0,255,255,0,61,254,86,4,127, + 6,102,16,38,2,159,94,0,18,6,3,215,0,0,0,0,255,255,0,175,0,0,4,179,7,78,16,39,22,185,4,204,1,117,18,6,3,187,0,0, + 255,255,0,150,0,0,4,0,6,16,16,38,0,106,94,0,18,6,3,219,0,0,0,0,0,1,0,201,254,191,4,106,5,213,0,9,0,35,64,10, + 11,2,6,149,9,4,28,1,4,10,16,252,252,60,236,204,196,49,0,182,4,149,1,129,6,8,0,47,204,204,244,236,48,51,17,33,21,33,17,51, + 17,35,17,201,3,161,253,41,201,201,5,213,170,251,127,254,21,1,65,0,0,1,0,186,254,229,3,208,4,96,0,9,0,35,64,10,11,2,6,169, + 9,4,8,1,70,10,16,252,252,60,236,220,204,49,0,182,4,169,1,188,6,8,0,47,204,204,244,236,48,51,17,33,21,33,17,51,17,35,17,186, + 3,22,253,162,184,184,4,96,170,252,227,254,76,1,27,0,255,255,0,201,0,0,6,70,7,78,18,38,3,191,0,0,16,7,22,185,5,183,1,117, + 255,255,0,186,0,0,5,155,6,16,18,38,3,223,0,0,16,7,0,106,1,8,0,0,0,1,0,71,254,86,4,239,5,213,0,25,0,57,64,13, + 25,14,27,6,10,12,9,28,2,21,4,1,26,16,220,60,60,204,252,60,204,204,196,220,204,49,0,64,14,20,21,14,0,1,12,149,9,4,8,149, + 5,129,0,47,244,252,220,60,236,50,16,204,220,204,48,33,17,33,53,33,17,33,21,33,17,33,21,33,17,33,21,20,7,6,43,1,53,51,50,54, + 53,1,78,254,249,1,7,3,161,253,41,2,35,253,221,1,105,71,82,191,254,233,105,76,2,148,170,2,151,170,254,19,170,253,236,148,200,96,110,156, + 97,173,0,0,0,1,0,56,254,86,4,85,4,96,0,25,0,59,64,14,27,6,9,25,14,10,12,9,8,2,21,4,1,26,16,220,60,196,204,252, + 60,204,220,204,16,220,204,49,0,64,14,20,21,14,0,1,12,169,9,4,8,169,5,188,0,47,244,236,220,60,252,60,16,204,220,204,48,33,17,33, + 53,33,17,33,21,33,17,33,21,33,17,33,21,20,7,6,43,1,53,51,50,54,53,1,63,254,249,1,7,3,22,253,162,1,160,254,96,1,110,70, + 82,192,254,233,106,75,1,244,170,1,194,157,254,219,170,254,140,148,200,96,110,156,97,173,0,1,0,61,254,102,5,42,5,213,0,23,0,0,37,22, + 7,6,7,6,43,1,53,51,50,55,54,55,9,1,35,9,1,51,9,1,51,1,5,42,1,2,15,83,102,228,76,62,135,55,40,11,254,94,254,89, + 218,2,21,254,47,217,1,115,1,117,217,254,32,26,2,24,190,98,122,170,75,53,115,2,120,253,133,3,29,2,184,253,213,2,43,253,51,0,0,0, + 0,1,0,59,254,86,4,100,4,96,0,23,0,0,9,2,22,21,20,7,6,43,1,53,50,55,62,1,53,9,1,35,9,1,51,9,1,4,100,254, + 107,1,107,27,67,81,196,193,196,25,79,53,254,189,254,186,217,1,179,254,114,217,1,41,1,41,4,96,253,223,254,23,38,57,205,97,115,156,3,10, + 109,152,1,180,254,72,2,74,2,22,254,113,1,143,0,0,0,1,0,61,0,0,5,59,5,213,0,17,0,0,19,51,9,1,51,1,33,21,33,1, + 35,9,1,35,1,33,53,33,129,217,1,115,1,117,217,254,78,1,116,254,144,1,206,217,254,92,254,89,218,1,212,254,140,1,150,5,213,253,213,2, + 43,253,119,144,253,68,2,123,253,133,2,188,144,0,0,0,0,1,0,59,0,0,4,121,4,96,0,17,0,0,9,1,51,9,1,51,1,33,21,33, + 1,35,9,1,35,1,33,53,1,183,254,169,217,1,41,1,41,217,254,170,1,13,254,224,1,126,217,254,186,254,186,217,1,127,254,223,2,148,1,204, + 254,113,1,143,254,52,144,253,252,1,184,254,72,2,4,144,0,2,0,145,0,0,4,180,5,213,0,10,0,21,0,38,64,10,23,4,5,20,28,11, + 0,25,16,22,16,220,236,212,236,50,236,49,0,64,9,6,149,20,173,11,129,5,149,12,47,236,228,244,236,48,1,20,23,22,51,33,17,33,34,7, + 6,1,17,33,34,36,53,52,36,51,33,17,1,102,79,78,163,1,68,254,188,163,78,79,3,78,253,232,251,254,240,1,16,251,1,78,1,183,138,67, + 68,2,35,67,68,3,147,250,43,218,221,222,218,2,102,0,0,2,0,113,0,0,3,245,4,96,0,10,0,22,0,37,64,11,24,70,5,21,8,11, + 0,18,17,69,23,16,252,236,212,236,50,236,49,0,183,6,169,21,11,188,5,169,12,47,236,228,212,236,48,1,20,23,22,51,33,17,33,34,7,6, + 1,17,33,34,39,38,16,55,54,51,33,17,1,53,62,66,129,1,7,254,249,128,67,62,2,192,254,57,214,115,116,116,121,208,1,15,1,76,90,43, + 46,1,105,46,42,2,182,251,160,82,82,1,80,82,85,1,197,0,0,0,0,2,0,145,255,227,7,67,5,213,0,12,0,48,0,57,64,14,50,4, + 38,28,41,13,27,12,28,29,5,25,23,49,16,220,236,212,236,50,57,212,236,236,49,0,64,16,34,8,149,19,1,149,26,173,45,19,140,40,188,29, + 129,49,16,236,236,228,50,244,236,16,236,50,48,1,33,34,7,6,16,23,22,51,50,55,54,53,19,6,7,6,7,6,35,34,39,38,53,52,36,51, + 33,17,51,17,20,23,22,51,50,55,54,53,17,51,17,20,7,6,35,34,39,38,3,234,254,188,163,78,79,79,95,129,180,75,86,33,12,14,51,106, + 94,110,238,129,136,1,16,251,1,78,201,63,52,112,105,59,63,202,110,104,215,217,102,49,2,201,67,68,254,234,80,95,109,125,159,254,221,29,28,96, + 54,49,129,137,202,222,218,2,102,251,236,143,91,74,74,79,155,2,159,253,90,224,127,120,120,57,0,0,0,2,0,113,255,227,6,115,4,96,0,13, + 0,48,0,56,64,15,50,70,38,8,41,14,13,27,8,30,5,18,22,69,49,16,252,236,212,236,50,57,212,236,236,49,0,64,14,34,9,169,49,1, + 169,26,45,18,140,40,29,188,49,16,236,204,228,50,212,236,16,236,50,48,1,33,34,7,6,21,20,23,22,51,50,55,54,53,19,6,7,6,35,34, + 39,38,53,52,55,54,51,33,17,51,17,20,23,22,51,50,55,54,53,17,51,17,20,7,6,35,34,39,38,3,61,254,249,128,67,62,65,64,106,148, + 92,45,49,67,93,94,136,172,102,101,116,121,208,1,15,184,62,60,106,104,60,62,184,100,104,206,211,100,31,2,2,46,42,94,92,58,57,109,52,156, + 254,246,108,48,49,97,96,166,170,82,85,1,197,253,97,159,80,79,79,82,157,1,65,254,184,236,115,120,120,37,0,0,0,1,0,201,255,227,7,3, + 5,240,0,55,0,64,64,15,57,46,28,44,6,11,25,27,44,0,25,35,18,6,56,16,252,212,236,204,212,252,204,16,236,204,49,0,64,19,31,5, + 149,6,39,149,50,18,161,19,174,15,149,23,145,45,50,140,56,16,228,204,244,236,244,236,16,236,212,236,57,48,1,52,39,38,43,1,53,51,50,55, + 54,53,52,39,38,35,34,6,7,53,54,55,54,51,50,23,22,21,20,7,6,7,22,23,22,21,20,23,22,51,50,55,54,53,17,51,17,20,7,6, + 35,34,39,38,39,38,3,170,92,93,165,174,182,149,79,79,81,82,152,83,190,114,115,100,101,89,230,134,134,71,71,131,145,82,81,63,52,112,105,59, + 63,202,110,104,215,217,102,48,28,33,1,178,132,74,75,166,59,60,112,115,61,62,36,38,180,32,16,16,104,105,178,124,85,86,33,31,98,98,144,128, + 91,74,74,79,155,2,159,253,90,224,127,120,120,56,80,97,0,1,0,171,255,227,6,70,4,124,0,53,0,71,64,14,55,46,18,44,11,18,27,44, + 0,18,35,6,20,54,16,220,196,212,236,204,212,236,16,236,204,49,0,64,19,20,134,19,136,15,185,23,184,54,5,169,6,54,39,185,50,140,44,54, + 16,204,244,236,16,212,236,16,244,252,176,12,75,81,88,252,27,244,89,236,48,1,52,39,38,43,1,53,51,50,55,54,53,52,39,38,35,34,7,6, + 7,53,62,1,51,50,23,22,21,20,7,6,7,22,23,22,21,20,23,22,51,50,55,54,53,17,51,17,20,7,6,35,34,39,38,3,19,78,72,137, + 148,155,116,67,68,70,69,119,71,81,80,97,98,170,76,196,113,114,60,60,112,129,64,69,62,61,105,104,60,62,184,100,104,206,199,112,98,1,56,102, + 56,51,152,44,45,70,64,46,46,13,13,29,167,24,24,78,79,141,93,64,65,24,25,72,79,72,88,68,69,79,82,157,1,65,254,184,236,115,120,117, + 101,0,0,0,0,1,0,201,254,86,5,60,5,240,0,41,0,58,64,13,8,13,25,29,39,28,43,2,25,37,20,6,42,16,252,212,236,204,236,212, + 252,204,49,0,64,18,33,7,149,8,0,20,161,21,174,17,149,25,145,39,149,40,189,0,47,236,236,244,236,244,236,16,212,236,57,48,33,35,17,52, + 39,38,43,1,53,51,50,55,54,53,52,39,38,35,34,6,7,53,54,55,54,51,50,23,22,21,20,7,6,7,22,23,22,21,17,51,17,35,4,115, + 201,92,93,165,174,182,149,79,79,81,82,152,83,190,114,115,100,101,89,230,134,134,71,71,131,145,82,81,201,201,1,177,133,74,75,166,59,60,112,115, + 61,62,36,38,180,32,16,16,104,105,178,124,85,86,33,31,98,97,146,254,249,253,172,0,0,1,0,171,254,86,4,131,4,124,0,41,0,63,64,12, + 17,18,33,1,18,43,6,18,41,12,26,42,16,220,196,212,236,204,236,212,236,49,0,64,17,26,134,25,136,21,185,29,184,4,11,169,12,0,169,2, + 189,4,47,236,236,212,236,16,244,252,176,12,75,81,88,252,27,244,89,236,48,37,51,17,35,17,35,17,52,39,38,43,1,53,51,50,55,54,53,52, + 39,38,35,34,7,6,7,53,62,1,51,50,23,22,21,20,7,6,7,22,23,22,21,3,200,187,184,184,78,72,137,148,155,116,67,68,70,69,119,71, + 81,80,97,98,170,76,196,113,114,60,60,112,126,67,69,153,253,189,1,170,1,70,88,56,51,152,44,45,70,64,46,46,13,13,29,167,24,24,78,79, + 141,93,64,65,24,24,73,75,106,0,0,0,0,1,0,54,255,227,7,202,5,213,0,33,0,52,64,13,35,4,11,28,10,21,28,0,22,28,33,28, + 34,16,212,212,236,212,236,212,252,236,49,0,64,14,22,149,33,129,34,5,149,16,140,28,149,27,10,34,16,204,60,236,244,236,16,244,236,48,1,17, + 20,23,22,51,50,55,54,53,17,51,17,20,7,6,35,34,39,38,53,17,33,21,16,3,6,5,53,54,55,18,25,1,5,58,63,52,112,105,59,63, + 202,110,104,215,214,105,110,254,27,132,98,254,145,212,67,117,5,213,251,236,143,91,74,74,79,155,2,159,253,90,224,127,120,120,125,226,3,113,212,254, + 24,254,170,253,56,167,46,168,1,37,2,53,1,26,0,0,0,1,0,46,255,227,6,238,4,96,0,32,0,52,64,13,34,70,10,8,9,20,8,0, + 21,8,32,27,33,16,212,212,236,212,236,212,252,236,49,0,64,14,21,169,32,188,33,4,169,15,140,27,169,26,9,33,16,204,60,236,244,236,16,244, + 236,48,1,17,20,22,51,50,55,54,53,17,51,17,20,7,6,35,34,39,38,53,17,33,21,16,3,6,5,53,54,55,54,17,53,4,115,122,103,104, + 60,62,184,100,104,206,199,112,98,254,123,118,94,254,204,179,59,98,4,96,253,4,87,138,79,82,157,1,65,254,184,236,115,120,117,101,123,2,143,134, + 254,146,254,252,207,29,153,27,127,207,1,167,212,0,0,0,255,255,0,201,255,227,8,45,5,213,18,6,1,184,0,0,0,1,0,193,255,227,7,3, + 4,96,0,28,0,54,64,15,30,70,10,8,9,20,28,8,0,21,25,8,24,70,29,16,252,236,50,220,236,50,212,252,236,49,0,64,13,21,169,26, + 28,24,188,23,4,169,15,140,9,23,47,204,244,236,16,228,50,220,236,48,1,17,20,22,51,50,55,54,53,17,51,17,20,7,6,35,34,39,38,61, + 1,33,17,35,17,51,17,33,17,4,136,122,103,104,60,62,184,100,104,206,199,112,98,253,169,184,184,2,87,4,96,253,4,87,138,79,82,157,1,65, + 254,184,236,115,120,117,101,123,204,253,252,4,96,254,51,1,205,0,0,0,0,1,0,115,255,227,5,137,5,240,0,27,0,48,64,11,29,4,16,25, + 28,27,20,28,10,16,28,16,252,236,220,236,196,236,49,0,64,14,22,149,6,26,16,149,15,18,149,13,145,6,140,28,16,228,244,236,212,252,204,16, + 236,48,1,20,7,6,7,6,35,32,39,38,16,55,54,33,32,23,21,38,33,32,17,16,33,50,54,53,17,51,5,137,100,45,137,124,151,254,155,196, + 192,191,197,1,101,1,39,225,225,254,234,253,219,2,37,215,123,202,1,186,224,127,57,33,30,210,204,2,208,205,210,142,215,191,253,159,253,160,148,164, + 1,240,0,0,0,1,0,113,255,227,4,70,4,123,0,27,0,48,64,11,29,69,6,18,18,20,13,18,0,69,28,16,252,236,212,236,196,236,49,0, + 64,14,16,185,24,19,7,185,6,9,185,4,184,24,140,28,16,228,244,236,212,252,204,16,236,48,19,16,55,54,33,50,23,21,38,35,34,7,6,16, + 23,22,51,50,17,53,51,21,20,6,35,32,39,38,113,146,150,1,11,208,186,190,196,189,98,90,90,98,189,226,184,201,229,254,252,149,142,2,47,1, + 14,157,161,110,170,124,124,114,254,124,114,124,1,62,190,197,236,231,166,158,0,1,255,250,255,227,5,102,5,213,0,25,0,47,64,12,9,28,11,27, + 24,64,0,28,23,64,20,26,16,212,228,252,228,204,220,236,49,0,64,12,5,149,16,21,0,149,23,129,16,140,10,26,16,204,228,244,236,50,16,236, + 48,1,17,20,23,22,51,50,55,54,53,17,51,17,20,7,6,35,34,39,38,53,17,33,53,33,21,2,215,63,52,111,105,59,63,202,110,104,215,214, + 105,110,253,238,4,239,5,43,252,150,143,91,74,74,79,155,2,159,253,90,224,127,120,120,125,226,3,113,170,170,0,0,0,1,0,5,255,227,4,246, + 4,96,0,25,0,50,64,10,10,8,11,27,24,0,8,21,23,26,16,212,220,252,204,204,220,236,49,0,64,12,5,169,16,140,26,0,22,169,23,188, + 10,26,16,204,244,236,50,16,244,236,178,16,10,1,93,48,1,17,20,23,22,51,50,55,54,53,17,51,17,20,7,6,35,34,39,38,53,17,33,53, + 33,21,2,120,62,61,105,104,60,62,184,100,104,206,199,112,98,254,66,4,49,3,182,253,174,86,70,69,79,82,157,1,65,254,184,236,115,120,117,101, + 123,2,126,170,170,0,0,0,255,255,0,164,255,227,4,123,5,240,18,6,1,82,0,0,255,255,0,133,255,227,3,200,4,124,18,6,3,73,0,0, + 0,1,0,84,254,102,5,58,5,213,0,24,0,47,64,11,13,26,4,19,28,7,20,28,6,1,25,16,212,212,236,212,236,236,204,49,0,64,13,13, + 149,12,189,25,20,149,6,129,1,149,0,25,16,50,236,244,236,16,244,236,48,51,53,54,55,54,17,53,33,17,16,6,43,1,53,51,50,55,54,53, + 17,33,21,16,3,6,84,221,58,87,3,120,205,227,77,63,134,55,55,254,27,102,98,170,48,163,246,2,100,254,250,147,254,242,244,170,75,76,193,4, + 195,184,253,202,254,248,253,0,0,1,0,76,254,86,4,115,4,96,0,24,0,47,64,11,13,26,70,19,8,7,20,8,6,1,25,16,212,212,236,212, + 236,236,204,49,0,64,13,13,169,12,189,25,20,169,6,188,1,169,0,25,16,50,236,244,236,16,244,236,48,51,53,54,55,54,17,53,33,17,20,6, + 43,1,53,51,50,55,54,53,17,33,21,16,7,6,76,187,51,68,2,245,163,181,70,49,97,46,38,254,123,88,94,153,29,125,166,1,208,183,251,140, + 214,192,156,48,41,161,3,225,111,254,80,194,207,0,0,0,0,1,0,84,0,0,9,28,5,213,0,23,0,0,51,53,54,55,18,17,53,33,9,1, + 51,9,1,35,9,1,35,9,1,33,21,16,3,6,84,217,62,87,3,121,1,115,1,117,217,254,32,2,0,217,254,92,254,89,218,2,21,254,160,253, + 184,102,98,170,47,164,1,2,2,88,254,253,213,2,43,253,51,252,248,2,123,253,133,3,29,2,14,184,253,202,254,248,253,0,0,0,0,1,0,76, + 0,0,7,178,4,96,0,24,0,0,9,2,35,9,1,35,9,1,33,21,16,7,6,5,53,54,55,54,17,53,33,23,9,1,7,157,254,107,1,170, + 217,254,186,254,186,217,1,179,254,223,254,48,88,94,254,204,182,56,68,2,245,1,1,39,1,41,4,96,253,223,253,193,1,184,254,72,2,74,1,131, + 111,254,80,194,207,29,153,28,126,177,1,197,183,3,254,116,1,143,0,0,0,2,0,201,0,0,6,232,5,213,0,8,0,26,0,0,1,17,51,50, + 54,53,52,38,35,1,6,33,35,17,35,17,33,50,4,21,20,7,1,51,9,1,35,1,147,254,141,154,154,141,1,149,127,254,234,254,202,1,200,251, + 1,1,6,1,104,217,254,32,2,0,217,5,47,253,207,146,135,134,146,253,179,138,253,168,5,213,227,219,48,42,2,24,253,51,252,248,0,2,0,186, + 254,86,6,168,4,123,0,24,0,32,0,0,9,2,35,1,6,7,6,35,34,38,39,17,35,17,51,21,62,1,51,50,23,22,23,1,0,16,38,32, + 6,16,22,32,6,147,254,107,1,170,217,254,203,26,92,127,204,123,177,58,185,185,58,177,123,204,127,84,29,1,37,254,43,167,254,220,167,167,1,36, + 4,96,253,223,253,193,1,161,168,116,162,97,100,253,174,6,10,170,100,97,162,107,151,1,137,253,4,1,150,231,231,254,106,231,0,0,0,2,0,136, + 0,0,7,188,5,213,0,21,0,29,0,0,51,1,38,36,53,52,36,41,1,21,33,17,33,21,33,17,33,21,33,17,33,1,18,16,22,51,33,17, + 33,34,136,1,152,100,255,0,1,4,1,2,4,232,253,28,2,197,253,59,2,246,252,62,254,244,254,118,55,149,146,1,56,254,200,146,2,141,26,169, + 215,206,224,170,254,70,170,253,227,170,2,119,253,137,4,170,254,250,135,2,18,0,0,0,0,3,0,116,255,227,7,119,4,123,0,31,0,38,0,47, + 0,0,1,21,33,30,1,51,50,54,55,21,14,1,35,32,39,38,39,35,1,35,1,46,1,53,52,54,51,33,54,51,50,0,7,46,1,35,34,6, + 7,37,20,22,59,1,17,35,34,6,7,119,252,178,12,205,183,106,199,98,99,208,107,254,244,157,152,4,229,254,182,198,1,86,116,154,215,217,2,101, + 86,103,226,1,7,184,2,165,136,154,185,14,253,75,128,119,248,248,119,128,2,94,90,190,199,52,52,174,42,44,156,152,194,254,39,1,235,26,137,143, + 162,161,27,254,221,196,151,180,174,158,138,83,94,1,97,92,255,255,0,115,254,248,5,217,5,240,16,6,0,52,0,0,255,255,0,113,254,86,4,90, + 4,123,16,6,0,84,0,0,255,255,0,68,0,0,7,166,5,213,16,6,0,58,0,0,255,255,0,86,0,0,6,53,4,96,16,6,0,90,0,0, + 0,1,0,201,0,0,5,134,5,213,0,20,0,0,1,51,23,55,33,1,23,35,39,7,1,35,9,1,17,35,17,51,17,1,39,2,106,135,151,221, + 1,3,254,163,200,142,128,158,2,95,220,253,250,254,239,202,202,1,175,219,5,138,151,226,254,155,200,128,161,252,121,3,1,254,233,254,22,5,213,253, + 30,1,184,220,0,1,0,186,0,0,4,145,4,96,0,19,0,0,1,51,23,55,51,7,23,35,39,7,1,35,1,7,17,35,17,51,17,1,2,53, + 140,65,118,226,230,147,142,76,127,1,227,206,254,115,197,183,183,1,75,4,41,64,119,233,147,76,129,253,81,2,53,200,254,147,4,96,253,242,1,80, + 0,1,0,84,254,102,8,115,5,213,0,37,0,57,64,14,14,28,39,19,25,32,28,29,7,33,28,6,1,38,16,212,212,236,212,60,236,220,196,204, + 236,49,0,64,15,19,149,18,29,149,8,33,149,6,129,18,189,8,0,31,47,60,204,236,244,236,16,236,16,236,48,51,53,54,55,18,17,53,33,17, + 33,50,23,22,21,17,16,6,43,1,53,51,50,55,54,53,17,52,38,35,33,17,35,17,33,21,16,3,6,84,217,62,87,3,120,1,161,186,113,109, + 204,228,76,62,134,56,55,124,124,254,136,202,254,27,102,98,170,47,164,1,2,2,88,254,253,156,119,114,238,254,206,254,242,244,170,75,75,194,1,34, + 159,158,253,57,5,43,184,253,202,254,248,253,0,1,0,76,254,86,7,12,4,96,0,39,0,57,64,14,14,8,41,20,26,34,8,31,7,35,8,6, + 1,40,16,212,212,236,212,60,236,220,196,204,236,49,0,64,15,20,169,19,31,169,8,35,169,6,188,19,189,8,0,33,47,60,204,236,244,236,16,236, + 16,236,48,51,53,54,55,54,17,53,33,17,51,32,23,22,21,17,20,7,6,43,1,53,51,50,55,54,53,17,52,39,38,35,33,17,35,17,33,21, + 16,7,6,76,182,56,68,2,245,250,1,7,70,82,82,81,181,193,172,110,33,38,38,44,139,254,252,184,254,123,88,94,153,28,126,177,1,197,183,254, + 23,71,81,229,254,242,213,97,96,156,48,55,147,1,8,166,36,41,254,25,3,205,111,254,80,194,207,0,0,1,0,201,254,102,8,116,5,213,0,33, + 0,63,64,17,16,12,28,35,23,29,3,28,27,5,56,31,1,28,0,4,34,16,252,236,50,252,60,236,50,212,204,236,204,49,0,64,16,18,149,16, + 189,28,27,30,149,6,2,173,4,0,129,32,28,47,60,228,50,252,60,236,50,16,252,236,48,19,51,17,33,17,51,17,33,50,23,22,21,17,16,6, + 43,1,53,51,50,55,54,53,17,52,38,35,33,17,35,17,33,17,35,201,202,2,222,202,1,161,186,113,109,204,228,76,62,134,56,55,124,124,254,136, + 202,253,34,202,5,213,253,156,2,100,253,156,119,114,238,254,206,254,242,244,170,75,75,194,1,34,159,158,253,57,2,199,253,57,0,0,0,1,0,186, + 254,86,7,26,4,96,0,35,0,64,64,16,12,8,37,18,24,32,4,8,29,5,33,1,8,0,70,36,16,252,236,50,220,60,236,50,220,196,204,236, + 49,0,64,17,18,169,17,29,169,6,33,169,2,4,0,188,31,17,189,6,35,47,204,236,60,228,50,220,236,16,236,16,236,48,19,51,17,33,17,51, + 17,51,32,23,22,21,17,20,7,6,43,1,53,51,50,55,54,53,17,52,39,38,35,33,17,35,17,33,17,35,186,185,2,85,185,250,1,7,70,82, + 82,81,181,193,172,110,33,38,38,44,139,254,252,185,253,171,185,4,96,254,55,1,201,254,23,71,81,229,254,242,213,97,96,156,48,55,147,1,8,166, + 36,41,254,25,2,4,253,252,0,1,0,201,254,191,6,4,5,213,0,11,0,0,33,17,33,17,35,17,33,17,51,17,35,17,4,113,253,34,202,4, + 114,201,201,5,43,250,213,5,213,250,213,254,21,1,65,0,0,1,0,186,254,229,5,57,4,96,0,11,0,0,1,17,51,17,35,17,35,17,33,17, + 35,17,4,129,184,184,185,253,171,185,4,96,252,57,254,76,1,27,3,205,252,51,4,96,0,1,0,178,255,196,5,112,5,213,0,35,0,0,1,30, + 1,23,54,53,17,51,17,20,7,22,23,7,38,39,14,1,35,32,0,25,1,51,17,20,30,2,51,50,54,55,46,1,39,3,136,39,85,46,44,203, + 97,79,89,70,113,108,69,175,107,254,235,254,217,203,42,89,140,98,63,102,41,54,94,38,1,227,52,90,41,101,185,3,139,252,92,229,144,51,39,158, + 52,72,46,47,1,41,1,37,3,164,252,117,120,171,109,51,18,20,45,96,52,0,0,0,0,1,0,178,0,0,5,51,5,242,0,25,0,0,51,17, + 16,0,33,32,0,17,21,35,53,52,46,2,35,34,14,2,21,17,33,21,33,17,178,1,34,1,24,1,25,1,36,203,43,90,139,96,98,139,90,42, + 3,182,252,74,3,164,1,37,1,41,254,217,254,217,57,32,121,171,109,50,50,109,171,121,254,231,175,254,61,0,0,0,0,2,0,93,0,0,5,213, + 5,242,0,19,0,35,0,0,1,51,21,35,17,35,17,33,34,46,2,52,62,2,51,32,0,17,3,17,52,46,2,35,34,14,2,20,30,2,51,4, + 219,250,250,203,254,145,139,216,148,77,77,148,216,140,1,23,1,34,203,42,90,138,96,105,143,86,37,44,91,139,95,2,114,175,254,61,1,195,80,142, + 196,232,197,143,81,254,214,254,220,254,206,1,25,121,171,109,50,58,100,136,158,132,95,53,0,1,0,90,0,0,5,203,5,242,0,25,0,0,33,17, + 52,46,2,35,34,14,2,29,1,35,53,16,0,33,32,0,25,1,51,21,35,17,4,6,42,90,140,97,96,139,90,43,203,1,36,1,25,1,24,1, + 34,250,250,3,139,121,171,109,50,50,109,171,121,32,57,1,39,1,39,254,215,254,219,254,206,175,254,61,0,1,0,178,255,227,5,51,5,213,0,25, + 0,0,1,17,33,21,33,17,20,30,2,51,50,62,2,61,1,51,21,16,0,33,32,0,25,1,1,125,3,182,252,74,42,90,139,98,96,139,90,43, + 203,254,220,254,231,254,232,254,222,5,213,254,139,175,254,153,121,171,109,50,50,109,171,121,32,57,254,217,254,217,1,41,1,37,3,164,0,1,0,178, + 0,0,5,138,5,243,0,41,0,0,1,20,14,4,7,33,21,33,17,51,21,51,50,62,4,53,52,46,2,34,14,2,29,1,35,53,52,62,2,32, + 30,2,5,138,51,84,109,113,110,44,1,228,251,100,203,86,61,153,157,151,117,71,48,102,158,220,156,99,46,203,76,153,229,1,50,235,159,82,3,129, + 103,180,153,124,93,61,13,170,1,76,162,43,83,123,162,199,117,103,171,121,67,64,112,151,86,71,75,121,210,154,88,90,165,231,0,0,0,1,0,188, + 0,0,4,237,5,213,0,9,0,0,37,33,21,33,17,51,17,33,21,33,1,135,2,219,252,90,203,3,102,252,154,175,175,5,213,254,139,175,0,0, + 0,1,0,178,0,0,5,51,5,242,0,23,0,0,51,17,16,0,33,32,0,17,21,35,53,52,46,2,35,34,14,2,21,17,33,21,178,1,34,1, + 24,1,25,1,36,203,43,90,139,96,98,139,90,42,3,182,3,164,1,37,1,41,254,217,254,217,57,32,121,171,109,50,50,109,171,121,253,36,175,0, + 0,2,0,178,255,227,6,174,5,242,0,41,0,56,0,0,0,34,14,2,21,17,35,17,52,62,2,32,30,2,29,1,51,21,35,17,20,14,2,35, + 34,46,2,52,62,2,59,1,53,52,46,1,0,20,30,2,50,62,2,53,17,35,34,14,1,3,195,240,175,113,54,203,91,171,246,1,54,246,171,91, + 206,206,66,116,161,94,95,159,116,65,68,117,159,91,234,53,111,254,200,37,65,88,104,86,62,34,234,57,90,62,5,78,50,109,171,121,252,117,3,164, + 147,221,148,74,74,148,221,147,52,175,254,215,107,163,110,57,58,115,175,234,168,108,51,24,122,173,109,252,225,168,112,66,28,27,65,107,80,1,35,25, + 63,0,0,0,0,2,0,93,255,227,5,213,5,213,0,21,0,35,0,0,1,20,14,2,35,34,46,2,52,62,2,51,33,17,51,17,51,21,35,33, + 34,14,2,20,30,2,51,50,54,53,17,4,219,73,144,213,139,140,216,148,77,77,148,216,139,1,111,203,250,250,253,197,95,139,91,44,37,86,143,105, + 192,174,2,87,146,233,162,87,93,157,209,232,208,158,92,1,117,254,139,175,66,110,144,158,148,115,69,247,242,1,65,0,0,1,0,188,0,0,5,51, + 5,213,0,24,0,0,19,51,17,62,1,51,50,30,2,29,1,35,53,52,46,2,34,14,2,21,17,35,188,203,63,188,118,138,212,146,75,203,43,90, + 139,192,139,91,43,203,5,213,254,9,77,73,72,147,221,150,75,50,121,171,109,50,50,108,172,121,253,243,0,1,0,188,0,0,4,68,5,213,0,5, + 0,0,1,17,33,21,33,17,1,135,2,189,252,120,5,213,250,218,175,5,213,0,0,0,0,1,0,188,255,227,6,203,5,213,0,29,0,0,1,17, + 20,30,2,50,62,2,53,17,51,17,20,14,2,34,46,2,53,17,33,17,35,17,51,17,3,202,54,84,102,96,98,81,51,203,72,128,176,210,179,132, + 75,254,136,203,203,4,96,253,49,75,102,62,27,27,62,102,75,2,207,253,73,119,171,111,53,53,111,171,119,2,8,252,79,5,213,254,139,0,0,0, + 0,2,1,8,255,230,6,26,5,240,0,43,0,62,0,0,1,51,21,51,62,3,51,50,30,2,23,21,46,3,35,34,6,7,22,4,30,1,21,20, + 14,4,35,34,46,2,53,52,54,55,35,19,20,30,2,51,50,62,2,53,52,46,1,36,43,1,14,1,1,12,203,78,66,153,163,168,82,60,100,88, + 84,45,53,106,101,92,39,97,179,79,155,1,17,204,118,39,76,111,147,180,106,159,239,161,80,76,67,139,203,42,101,166,125,124,172,106,47,66,159,254, + 246,200,29,76,87,5,213,245,63,101,71,37,9,18,27,18,215,35,47,28,11,57,52,9,89,161,232,153,83,157,139,117,84,47,99,174,237,137,128,231, + 101,254,52,95,175,133,80,76,127,168,92,96,174,132,78,97,235,0,0,0,0,1,0,178,0,0,5,41,5,213,0,24,0,0,33,35,17,14,1,35, + 34,46,2,53,17,51,17,20,30,2,50,62,2,61,1,51,5,41,203,69,182,118,138,212,146,75,203,43,90,139,192,139,91,43,203,1,227,63,67,72, + 147,221,150,2,38,253,243,121,171,109,50,50,108,171,122,152,0,1,0,70,255,202,5,26,5,213,0,25,0,0,37,21,1,46,3,62,1,55,54,36, + 55,3,51,1,14,3,7,14,2,22,23,5,26,252,22,62,103,63,11,59,139,119,155,1,56,164,207,238,1,3,113,203,193,187,96,103,95,13,56,47, + 152,206,1,64,19,57,76,96,117,138,80,104,166,71,1,47,254,137,43,88,97,109,64,69,92,62,38,15,0,2,0,168,255,208,5,128,5,243,0,53, + 0,67,0,0,19,52,62,2,51,50,22,23,62,3,53,52,46,2,34,14,2,29,1,35,53,52,62,2,32,30,2,21,20,14,2,7,30,1,23,7, + 46,1,39,14,1,35,34,46,2,37,34,14,2,21,20,22,51,50,54,55,46,1,183,59,101,132,72,120,237,118,40,65,47,26,47,100,159,224,157,98, + 44,203,78,154,229,1,44,235,160,84,34,63,87,54,56,109,56,136,54,111,56,110,249,126,71,132,102,61,1,108,33,63,49,29,88,88,86,176,81,94, + 175,1,9,73,114,78,40,96,80,50,115,124,134,70,103,174,125,70,64,112,151,86,71,75,121,210,154,88,88,163,231,144,86,165,156,142,63,45,95,51, + 142,52,101,48,89,100,36,75,113,220,19,36,51,32,65,79,72,64,66,80,0,1,0,100,0,0,5,213,5,242,0,23,0,0,37,51,21,33,17,52, + 46,2,35,34,14,2,29,1,35,53,16,0,33,32,0,17,4,219,250,254,59,43,90,140,97,98,139,89,41,203,1,32,1,28,1,26,1,33,175,175, + 3,139,121,171,109,50,52,109,171,119,32,57,1,39,1,39,254,214,254,220,0,2,0,105,0,0,5,185,5,226,0,26,0,36,0,0,1,34,14,2, + 7,1,21,33,34,46,2,62,1,55,62,1,55,1,51,19,62,3,51,1,14,1,30,1,51,33,1,14,1,5,38,45,112,124,133,67,2,116,251,196, + 66,110,75,35,20,81,77,67,161,89,254,228,243,188,80,159,150,136,56,252,145,80,68,14,89,77,2,244,253,234,71,129,5,41,35,64,91,57,252,114, + 164,32,69,108,153,200,126,109,201,88,1,151,254,238,66,107,74,40,252,126,133,169,96,35,2,251,74,166,0,1,0,178,255,227,6,35,5,213,0,23, + 0,0,1,17,16,0,33,32,0,25,1,51,17,20,30,2,51,50,62,2,53,17,33,21,5,41,254,223,254,230,254,228,254,224,203,42,89,140,98,97, + 140,89,42,1,197,5,38,253,11,254,221,254,213,1,39,1,39,3,164,252,117,120,171,109,51,51,109,171,120,3,139,175,0,1,0,146,255,227,5,89, + 5,241,0,55,0,0,1,20,14,2,32,46,2,53,51,20,30,2,51,50,62,2,53,52,38,35,33,53,33,50,62,2,53,52,38,32,6,21,35,52, + 62,2,50,30,2,21,20,14,2,7,30,3,5,89,77,153,230,254,206,229,152,76,203,43,96,155,113,112,155,94,42,202,201,253,176,2,80,81,119,77, + 37,159,254,202,160,203,74,136,191,234,192,137,76,37,64,84,46,68,117,87,50,1,188,103,173,126,71,74,130,175,101,65,114,87,50,50,86,112,62,128, + 127,175,39,67,92,53,118,113,114,123,95,149,103,54,53,102,147,93,59,104,83,60,15,17,63,91,118,0,0,1,0,0,255,227,5,113,5,213,0,23, + 0,0,1,17,20,30,2,51,50,62,2,61,1,51,21,16,0,33,32,0,25,1,35,53,1,197,41,90,140,99,98,139,89,41,203,254,223,254,229,254, + 230,254,223,250,5,213,252,117,120,171,109,51,51,110,170,120,32,57,254,220,254,214,1,45,1,33,2,244,176,0,0,0,0,1,0,160,255,226,5,121, + 5,213,0,46,0,0,1,46,1,43,1,53,51,50,22,23,1,21,37,46,1,35,34,14,2,21,20,22,51,50,62,2,61,1,51,21,20,14,2,35, + 34,46,2,53,52,62,2,55,2,100,56,138,85,141,219,106,162,71,2,107,254,150,26,64,42,111,186,135,75,208,211,105,155,101,50,203,82,156,228,145, + 146,233,163,88,78,138,189,111,5,0,25,18,170,24,30,254,254,212,148,11,13,72,134,192,121,240,248,60,109,152,92,71,75,128,211,151,83,86,165,242, + 156,126,215,165,107,19,0,0,0,1,0,178,0,0,5,41,5,242,0,21,0,0,51,17,16,0,33,32,0,25,1,35,17,52,46,2,35,34,14,2, + 21,17,178,1,32,1,28,1,26,1,33,203,43,90,139,96,98,139,90,42,3,164,1,39,1,39,254,214,254,220,252,92,3,139,121,171,109,50,50,109, + 171,121,252,117,0,1,0,120,255,198,5,80,5,243,0,37,0,0,37,23,21,1,53,23,30,1,51,50,62,2,53,52,38,35,34,14,2,29,1,35, + 53,52,62,2,32,30,2,21,20,14,2,3,77,195,252,251,237,26,74,42,114,187,132,73,210,208,104,155,102,50,203,82,156,227,1,36,233,163,87,75, + 137,189,233,85,206,1,69,212,103,11,13,86,148,198,113,223,239,60,109,152,92,71,75,128,211,151,83,83,160,233,150,116,222,182,125,0,0,1,0,90, + 0,0,5,181,5,242,0,28,0,0,1,17,35,17,14,3,29,1,35,53,52,62,2,51,50,4,30,1,21,17,35,17,52,46,2,3,103,203,86,139, + 98,52,203,102,182,248,147,157,0,255,181,99,203,56,102,142,5,71,252,148,3,108,12,73,112,149,88,42,57,130,217,156,87,87,156,217,130,252,92,3, + 149,79,149,118,79,0,0,0,0,2,0,168,0,0,5,125,5,243,0,34,0,59,0,0,1,34,46,4,53,38,62,2,51,50,30,2,21,20,14,2, + 7,33,21,33,17,51,21,51,50,54,55,54,38,37,52,46,2,35,34,14,2,23,30,3,51,50,30,2,7,62,3,2,18,86,120,80,46,23,7,3, + 79,156,229,147,160,236,156,77,76,133,183,108,1,217,251,100,203,78,81,195,95,40,162,1,213,48,101,158,111,107,158,101,46,6,3,18,43,75,59,121, + 177,109,39,17,43,72,53,29,2,155,35,57,71,71,64,21,107,194,148,88,94,167,229,136,121,221,188,148,49,170,1,76,162,63,61,178,195,230,100,170, + 123,69,57,100,135,77,38,55,37,18,64,114,156,91,45,106,120,135,0,0,0,1,0,178,0,0,6,35,5,242,0,25,0,0,33,17,52,46,2,35, + 34,14,2,21,17,35,17,16,0,33,32,0,25,1,51,21,35,17,4,94,42,90,140,97,96,139,90,43,203,1,36,1,25,1,24,1,34,250,250,3, + 139,121,171,109,50,50,109,171,121,252,117,3,164,1,39,1,39,254,215,254,219,254,206,175,254,61,0,0,255,255,0,178,255,227,5,41,5,213,18,6, + 0,56,0,0,0,1,0,100,0,0,5,213,5,213,0,26,0,0,41,1,17,14,1,35,34,46,2,61,1,51,21,20,30,2,50,62,2,53,17,51, + 17,51,5,213,254,59,65,186,118,138,212,146,75,203,43,90,139,192,139,91,43,203,250,1,243,72,74,72,147,221,150,177,152,121,171,109,50,50,108,171, + 122,2,13,250,218,0,0,0,0,1,0,150,255,227,5,14,5,238,0,61,0,0,19,51,20,30,2,51,50,62,2,53,52,46,2,39,46,5,39,38, + 62,2,50,30,2,21,35,46,3,35,34,14,2,23,30,3,23,30,3,21,20,14,2,32,46,2,150,203,53,96,135,82,80,136,100,56,54,97,137,84, + 67,127,113,95,70,40,2,2,73,135,191,234,195,141,78,203,3,39,78,122,86,79,120,79,36,4,4,38,75,113,80,136,213,148,78,82,150,213,254,252, + 210,149,80,1,195,68,116,84,48,32,68,105,73,58,85,61,40,13,10,30,45,63,88,115,75,90,154,114,64,61,108,145,84,44,84,66,41,39,70,95, + 55,50,73,53,37,13,23,66,105,153,110,102,164,115,61,75,130,175,0,0,0,1,0,178,0,0,5,41,5,242,0,21,0,0,51,17,16,0,33,32, + 0,17,21,35,53,52,46,2,35,34,14,2,21,17,178,1,34,1,22,1,23,1,40,203,44,92,140,96,98,138,88,41,3,164,1,37,1,41,254,221, + 254,213,57,32,121,171,109,50,50,109,171,121,252,117,0,0,0,2,0,160,255,227,5,103,5,241,0,49,0,64,0,0,1,20,14,2,32,46,2,53, + 51,20,30,2,51,50,62,2,53,52,38,35,33,53,51,46,3,53,52,62,2,50,30,2,21,20,14,2,7,30,3,1,50,62,2,53,52,38,32,6, + 21,20,30,2,5,103,77,153,230,254,206,229,152,76,203,43,96,155,113,112,155,94,42,202,201,253,176,224,32,55,40,23,74,136,191,234,192,137,76,37, + 64,84,46,68,117,87,50,253,155,81,119,77,37,159,254,202,160,24,68,124,1,188,103,173,126,71,74,130,175,101,65,114,87,50,50,86,112,62,128,127, + 175,17,50,63,74,41,95,149,103,54,53,102,147,93,59,104,83,60,15,17,63,91,118,1,103,39,67,92,53,118,115,116,123,38,85,74,48,0,0,0, + 0,1,0,188,0,0,4,77,5,213,0,7,0,0,1,17,33,21,33,17,35,17,1,135,2,198,253,58,203,5,213,254,139,175,252,79,5,213,0,0, + 0,3,0,120,0,0,6,4,5,213,0,5,0,15,0,39,0,0,1,14,1,16,22,23,51,62,3,52,46,2,39,3,46,3,16,62,2,55,53,51, + 21,30,3,16,14,2,7,21,35,2,215,193,209,209,193,203,93,149,104,56,56,104,149,93,203,135,224,160,88,88,160,224,135,203,135,224,161,90,90,161, + 224,135,203,4,142,7,217,254,118,216,7,4,59,107,152,196,153,108,59,3,252,16,6,84,150,213,1,12,214,152,84,5,159,159,5,84,152,214,254,244, + 213,152,84,5,157,0,0,0,0,2,0,50,0,0,5,110,5,242,0,27,0,43,0,0,1,34,46,2,39,17,33,21,33,21,35,53,35,53,51,17, + 16,0,33,50,30,2,20,14,2,0,20,30,2,50,62,2,52,46,2,34,14,1,3,42,62,110,94,75,26,3,152,252,104,203,190,190,1,34,1,23, + 139,217,148,77,77,148,216,254,6,36,86,141,210,142,85,37,38,87,142,208,140,86,1,215,21,37,52,30,254,230,175,154,154,175,2,101,1,36,1,32, + 78,139,194,232,193,138,77,2,90,156,129,92,50,50,91,129,158,133,97,54,55,97,0,0,255,255,0,115,255,227,5,217,5,240,18,6,0,50,0,0, + 0,3,0,110,255,230,5,248,5,213,0,31,0,41,0,51,0,0,0,20,14,1,4,32,36,46,1,61,1,51,21,20,30,2,23,17,34,46,2,53, + 52,54,59,1,17,50,30,1,37,17,34,14,2,20,30,2,0,52,46,2,35,17,62,2,5,248,100,186,254,249,254,186,254,250,183,98,203,60,107,148, + 87,119,175,115,56,237,239,192,133,224,162,253,46,79,102,60,23,23,60,102,2,172,56,105,149,92,90,149,105,2,132,254,201,140,75,77,142,200,124,39, + 39,86,135,93,52,4,2,230,42,80,112,71,153,146,254,81,75,141,216,1,11,16,33,51,70,50,32,15,253,138,170,137,96,51,253,29,4,52,95,0, + 0,1,0,117,3,239,1,135,6,20,0,14,0,0,1,34,39,38,52,55,54,51,21,34,6,21,20,22,51,1,135,115,80,79,79,80,115,64,88,88, + 64,3,239,80,80,230,79,80,123,88,63,64,88,0,0,0,0,1,0,178,3,254,1,215,5,213,0,5,0,0,1,51,21,3,35,19,1,4,211,164, + 129,82,5,213,152,254,193,1,63,0,0,0,0,1,0,0,4,245,1,223,6,109,0,3,0,0,1,51,1,35,1,24,199,254,186,153,6,109,254,136, + 0,1,0,5,4,241,2,217,7,37,0,21,0,0,1,14,3,21,35,52,62,2,55,62,3,53,51,20,14,2,1,111,58,90,61,31,122,51,94,134, + 83,66,91,57,26,122,46,90,136,5,195,5,36,57,72,40,64,123,98,63,6,4,37,57,72,40,71,123,94,59,0,0,255,255,255,255,4,240,1,222, + 6,102,16,7,0,67,255,85,0,0,0,0,0,1,0,8,4,232,3,53,6,237,0,41,0,0,19,35,38,62,2,51,50,30,2,21,20,14,2,35, + 34,46,2,39,51,30,3,51,50,62,2,53,52,46,2,39,38,14,2,117,109,1,71,126,174,102,63,122,96,60,32,61,91,60,39,79,67,49,7,134, + 3,19,27,30,14,26,38,25,12,28,48,66,38,74,133,101,59,4,240,121,190,130,68,34,70,110,76,48,82,62,35,19,43,71,51,15,24,18,9,19, + 30,37,18,39,60,42,24,3,6,46,99,147,0,1,0,90,4,241,3,178,6,20,0,5,0,0,19,17,51,21,33,21,90,140,2,204,4,241,1,35, + 169,122,0,0,0,1,0,174,255,228,7,17,4,96,0,42,0,0,37,14,1,35,34,46,2,53,17,51,17,20,30,2,51,50,62,2,53,17,51,17, + 20,22,51,50,62,2,53,17,51,17,35,53,14,1,35,34,38,3,162,69,191,131,87,136,93,49,185,28,58,86,59,71,114,81,43,185,113,120,70,114, + 80,43,185,185,63,176,121,124,168,214,126,116,63,120,176,113,2,164,253,78,81,113,72,32,49,92,131,82,2,122,253,98,163,155,50,93,130,81,2,122, + 251,160,174,105,97,122,0,0,0,1,0,186,254,86,4,100,4,123,0,22,0,0,1,53,16,35,34,6,21,17,33,21,33,17,35,17,51,21,62,1, + 51,50,22,29,1,3,172,248,149,172,2,241,253,15,185,185,66,178,118,194,197,1,194,220,1,61,190,164,254,39,160,254,86,6,10,174,102,99,238,233, + 226,0,0,0,0,2,0,113,254,86,5,47,4,123,0,16,0,40,0,0,0,20,30,2,50,62,2,53,52,46,2,34,14,1,1,35,17,14,1,35, + 34,46,2,16,62,2,51,50,22,23,53,51,17,51,21,35,1,47,43,81,116,146,117,81,43,44,81,116,146,116,81,3,0,184,58,176,125,102,168,121, + 67,67,121,168,102,125,176,58,184,213,213,2,148,202,161,112,60,60,112,161,101,100,161,113,60,60,112,251,33,2,82,100,97,85,155,217,1,6,217,155, + 85,97,100,170,252,64,160,0,0,1,0,186,254,86,5,58,4,123,0,22,0,0,33,17,35,17,16,35,34,6,21,17,35,17,51,21,62,1,51,50, + 22,21,17,51,21,4,101,185,248,149,172,185,185,66,178,118,194,198,213,254,86,4,72,1,61,190,164,253,135,4,96,174,102,99,238,233,253,252,160,0, + 0,1,0,174,255,227,4,98,6,20,0,26,0,0,19,17,51,17,33,21,33,17,20,23,22,51,50,55,54,61,1,51,17,35,53,14,1,35,34,39, + 38,174,184,2,252,253,4,62,61,125,152,84,86,184,184,67,176,118,193,100,100,1,186,4,90,254,76,160,254,1,159,80,79,95,98,161,235,253,48,172, + 103,98,120,119,0,2,0,113,254,86,5,47,4,123,0,21,0,45,0,0,1,51,21,33,17,14,1,35,34,46,2,16,62,2,51,50,22,23,53,51, + 1,20,30,2,51,50,62,4,53,52,46,2,35,34,14,4,4,90,213,254,115,58,176,125,102,168,121,67,67,121,168,102,125,176,58,184,252,213,33,73, + 120,87,60,93,70,48,30,13,33,75,119,87,60,93,69,48,30,13,254,246,160,2,82,100,97,85,155,217,1,6,217,155,85,97,100,170,253,207,78,156, + 123,77,37,65,85,97,102,48,78,155,124,77,38,64,86,96,102,0,0,0,0,1,0,186,0,0,3,236,6,20,0,9,0,0,41,1,17,51,17,33, + 21,33,17,33,3,151,253,35,184,2,122,253,134,2,37,6,20,254,76,160,252,224,0,0,0,1,0,186,254,86,4,100,4,123,0,20,0,0,33,17, + 16,35,34,6,21,17,33,21,33,17,51,21,62,1,51,50,22,21,17,3,172,248,149,172,2,241,252,86,185,66,178,118,194,197,2,158,1,61,190,164, + 252,125,160,6,10,174,102,99,238,233,253,92,0,2,0,186,254,86,5,232,4,123,0,44,0,60,0,0,1,33,52,46,2,35,34,14,2,21,17,35, + 17,51,21,62,3,51,50,30,4,21,51,21,35,14,3,35,34,46,2,52,62,2,5,33,34,14,2,21,20,30,2,51,50,62,2,3,102,1,49,72, + 118,151,79,82,140,103,59,185,185,42,99,109,118,61,68,136,126,109,81,46,146,150,18,96,129,148,70,72,127,96,56,55,90,115,1,102,254,214,26,50, + 40,24,23,43,64,41,25,81,81,68,2,47,100,161,112,61,41,90,142,101,251,235,6,10,170,60,76,44,17,39,72,104,131,155,87,160,113,161,105,49, + 36,73,110,148,111,73,37,160,15,33,51,36,29,49,38,21,23,61,105,0,0,2,0,113,255,227,5,47,6,20,0,16,0,38,0,0,1,33,34,14, + 2,21,20,30,2,51,50,62,2,53,19,17,20,14,2,34,46,2,53,52,62,2,51,33,17,51,17,51,21,3,162,254,198,73,116,81,43,43,81,116, + 73,81,118,77,38,184,66,127,186,242,187,127,66,64,127,187,123,1,60,184,213,3,192,53,102,149,97,101,161,112,60,60,113,160,101,1,145,254,57,114, + 195,144,81,86,155,216,131,113,203,154,91,1,180,254,76,160,0,1,0,186,254,86,4,100,6,20,0,18,0,0,1,17,35,17,16,35,34,6,21,17, + 35,17,51,17,62,1,51,50,22,4,100,184,248,149,172,185,185,66,178,118,194,197,2,164,253,92,2,158,1,61,190,164,251,221,7,190,253,158,102,99, + 238,0,0,0,0,1,0,186,254,86,2,108,4,96,0,5,0,0,1,51,21,33,17,51,1,114,250,254,78,184,254,246,160,6,10,0,0,1,0,186, + 254,86,7,29,6,20,0,42,0,0,1,21,20,22,51,50,62,2,53,17,51,17,35,53,14,1,35,34,46,2,53,17,16,35,34,14,2,21,17,35, + 17,51,17,62,3,51,50,22,4,72,113,120,70,114,80,43,185,185,63,176,121,61,129,107,68,247,75,110,72,36,185,185,19,65,87,104,59,195,196,2, + 164,226,163,155,50,93,130,81,2,122,251,160,174,105,97,41,101,169,129,1,2,1,61,50,92,131,81,251,221,7,190,253,158,39,73,55,34,236,0,0, + 0,2,0,113,255,227,4,116,6,20,0,24,0,45,0,0,1,19,51,7,5,33,21,35,30,1,21,20,14,2,34,46,2,53,52,62,2,55,3,20, + 30,2,51,50,62,2,53,52,46,2,39,35,34,14,2,1,6,194,212,164,1,66,1,55,125,67,61,68,131,192,246,192,130,68,62,111,154,91,225,40, + 81,119,80,79,120,80,40,18,43,71,52,135,78,120,81,41,5,10,1,10,226,210,160,78,215,132,122,206,151,85,85,151,206,122,120,198,148,94,16,253, + 192,83,149,111,65,65,111,149,83,77,119,99,86,44,69,117,154,0,0,0,0,1,0,174,254,86,4,88,6,20,0,19,0,0,19,17,51,17,16,51, + 50,55,54,53,17,51,17,35,17,14,1,35,34,38,174,184,248,149,86,87,184,184,67,176,118,194,199,1,186,4,90,251,173,254,194,95,94,165,2,123, + 249,246,2,86,103,98,239,0,255,255,0,186,0,0,4,100,6,20,18,6,0,75,0,0,0,2,0,106,255,226,4,48,6,20,0,45,0,66,0,0, + 1,21,14,1,7,22,18,21,17,35,53,14,3,35,34,46,2,55,62,3,55,46,3,53,52,63,1,51,7,14,1,7,6,30,2,55,62,1,1,20, + 30,2,51,50,62,2,61,1,52,46,2,39,14,3,3,60,26,52,26,169,179,184,27,72,92,112,67,98,156,106,55,3,2,62,109,154,94,68,93,59, + 26,34,36,199,42,19,15,1,2,46,71,87,40,27,57,254,10,33,67,101,68,77,120,82,43,30,69,112,81,61,108,82,48,5,44,177,16,32,18,100, + 254,229,185,253,255,172,45,74,54,29,66,120,170,105,96,183,173,163,75,10,52,71,83,41,68,53,57,63,29,59,23,45,63,34,2,17,18,34,252,160, + 69,115,83,45,55,93,123,68,86,53,119,117,104,38,50,117,135,154,0,0,0,1,0,186,254,86,5,57,4,123,0,20,0,0,1,21,33,17,16,35, + 34,6,21,17,35,17,51,21,62,1,51,50,22,21,17,5,57,254,115,248,149,172,185,185,66,178,118,194,197,254,246,160,4,72,1,61,190,164,253,135, + 4,96,174,102,99,238,233,252,82,0,0,0,0,2,0,140,255,227,4,90,6,36,0,40,0,62,0,0,19,53,51,62,3,51,50,22,23,21,38,35, + 34,14,2,7,51,50,30,2,21,17,35,53,14,3,35,34,46,2,39,38,18,55,19,30,3,51,50,62,2,61,1,52,46,2,43,1,14,3,140,196, + 55,141,167,193,107,25,45,22,52,50,71,127,114,98,42,3,119,209,156,90,184,24,70,92,116,69,102,151,102,53,3,5,54,56,86,6,45,73,97,56, + 70,115,83,46,42,98,159,117,71,29,42,27,10,3,182,170,96,165,122,69,6,4,189,29,42,75,104,61,76,138,194,119,253,175,174,44,74,54,31,65, + 114,155,90,131,1,29,139,253,253,88,117,70,29,51,91,124,73,104,64,134,109,69,65,135,132,126,0,0,0,1,0,174,255,227,5,45,6,20,0,22, + 0,0,19,17,51,17,16,51,50,62,2,53,17,33,21,35,17,35,53,14,1,35,34,38,174,184,248,75,119,83,45,1,141,213,184,67,176,118,195,198, + 1,186,2,166,253,97,254,194,50,92,131,81,4,47,160,250,140,172,103,98,238,0,0,0,0,1,255,212,254,86,1,114,4,96,0,11,0,0,19,51, + 17,20,6,43,1,53,51,50,54,53,186,184,163,181,70,49,105,76,4,96,251,140,214,192,156,97,153,0,0,1,255,217,255,227,4,88,6,20,0,22, + 0,0,3,33,17,16,51,50,62,2,53,17,51,17,35,53,14,1,35,34,38,53,17,35,39,1,141,248,75,119,83,45,184,184,67,176,118,195,198,213, + 6,20,251,173,254,194,50,92,131,81,2,123,251,160,172,103,98,238,233,3,186,0,0,0,0,1,0,0,254,86,3,123,4,123,0,49,0,0,23,20, + 30,2,51,33,21,33,34,46,2,53,52,62,6,53,52,46,2,35,34,6,7,53,62,3,51,50,30,2,21,20,14,6,193,4,10,20,17,2,80,253, + 116,42,68,48,26,60,98,125,131,125,98,60,45,82,115,71,91,154,78,38,74,79,89,53,115,184,129,69,60,98,126,130,126,98,60,217,8,17,15,9, + 160,27,47,63,36,49,106,113,118,124,127,131,133,67,72,105,68,33,38,42,174,14,23,15,8,53,108,162,109,75,149,144,135,124,111,94,74,0,0,0, + 255,255,0,186,0,0,4,100,4,123,18,6,0,81,0,0,0,1,0,10,254,86,2,246,4,96,0,49,0,0,19,33,21,33,34,46,2,53,52,62, + 4,55,46,3,53,52,62,2,55,51,14,3,21,20,30,2,55,62,1,55,7,14,3,21,20,30,2,252,1,250,253,214,36,70,55,33,35,60,83,96, + 106,53,47,110,95,63,11,32,59,48,231,59,77,44,17,38,63,82,45,25,66,35,1,102,169,121,66,4,11,17,254,246,160,22,46,70,47,58,135,142, + 144,137,125,51,2,32,68,107,76,30,63,70,77,44,37,72,67,62,26,48,68,40,14,5,3,21,18,183,89,203,200,184,69,12,26,20,13,0,0,0, + 0,1,0,174,254,86,7,17,4,96,0,42,0,0,37,14,1,35,34,46,2,53,17,51,17,20,30,2,51,50,62,2,53,17,51,17,20,22,51,50, + 62,2,53,17,51,17,35,17,14,1,35,34,38,3,162,69,191,131,87,136,93,49,185,28,58,86,59,71,114,81,43,185,113,120,70,114,80,43,185,185, + 63,176,121,124,168,214,126,116,63,120,176,113,2,164,253,78,81,113,72,32,49,92,131,82,2,122,253,98,163,155,50,93,130,81,2,122,249,246,2,88, + 105,97,122,0,0,2,0,110,254,86,3,244,4,124,0,44,0,68,0,0,1,20,14,6,21,20,22,51,33,21,33,34,46,2,53,52,54,55,62,3, + 39,46,5,53,52,62,2,51,50,30,2,37,34,14,2,21,20,30,4,21,20,7,62,3,53,52,46,2,3,244,60,98,126,131,126,98,60,31,21,2, + 80,253,116,38,67,49,29,82,72,25,35,20,4,6,8,42,54,59,49,32,73,120,154,80,110,176,123,66,254,37,43,86,68,42,31,46,55,46,31,50, + 60,130,108,69,40,75,106,2,210,78,153,145,137,125,110,93,73,25,23,26,160,25,43,57,32,66,144,73,25,68,76,79,36,47,82,75,72,77,84,50, + 79,134,96,54,58,110,158,170,26,52,77,51,33,66,68,72,76,83,44,81,79,58,126,132,138,72,69,105,72,36,0,0,0,1,0,186,0,0,4,224, + 4,123,0,36,0,0,1,34,14,2,21,17,35,17,51,21,62,1,51,50,30,2,21,20,14,2,7,33,21,33,53,62,3,53,52,46,2,2,193,79, + 124,86,45,185,185,63,189,121,99,162,116,63,33,61,86,53,1,41,253,253,63,96,66,34,35,71,108,3,219,52,90,122,70,253,115,4,96,172,97,102, + 70,125,174,103,83,139,123,113,57,160,132,52,109,121,138,80,73,129,97,56,255,255,0,174,255,227,4,88,4,123,18,6,0,88,0,0,0,1,0,174, + 254,86,5,45,6,20,0,22,0,0,19,17,51,17,16,51,50,62,2,53,17,51,17,51,21,33,17,14,1,35,34,38,174,184,248,75,119,83,45,184, + 213,254,115,67,176,118,195,198,1,186,2,166,253,97,254,194,50,92,131,81,4,47,248,226,160,2,86,103,98,238,0,0,0,1,0,174,255,227,7,28, + 4,123,0,39,0,0,1,17,51,21,62,3,51,50,22,21,17,35,17,16,35,34,14,2,21,17,35,53,14,1,35,34,38,53,17,51,17,16,51,50, + 62,2,3,143,184,33,79,87,91,44,195,196,184,248,60,107,80,46,184,67,177,100,195,198,184,248,63,111,83,48,1,229,2,123,174,51,75,50,25,236, + 235,253,92,2,158,1,61,50,92,131,81,253,135,172,103,98,238,233,2,166,253,97,254,194,47,91,132,0,0,1,0,186,254,86,4,100,4,123,0,20, + 0,0,1,17,35,17,16,35,34,14,2,21,17,35,17,51,21,62,1,51,50,22,4,100,184,248,75,119,83,44,185,185,66,178,118,195,196,2,164,253, + 92,2,158,1,61,50,92,131,81,251,221,6,10,174,103,98,236,0,0,0,255,255,0,111,254,86,4,88,4,123,16,6,0,74,254,0,0,1,0,186, + 0,0,3,152,4,96,0,5,0,0,37,33,21,33,17,51,1,114,2,38,253,34,184,160,160,4,96,0,0,1,0,174,254,86,7,28,6,20,0,39, + 0,0,1,17,51,17,62,3,51,50,22,21,17,35,17,16,35,34,14,2,21,17,35,17,14,1,35,34,38,53,17,51,17,16,51,50,62,2,3,143, + 184,33,79,87,91,44,195,196,184,248,57,106,81,49,184,67,177,100,195,198,184,248,63,111,83,48,1,229,4,47,253,158,51,75,50,25,236,235,253,92, + 2,158,1,61,47,90,132,85,251,221,2,86,103,98,238,233,2,166,253,97,254,194,47,91,132,0,0,0,0,2,0,41,254,86,4,164,4,123,0,27, + 0,44,0,0,37,17,33,21,33,21,35,53,35,53,51,17,51,21,62,1,51,50,30,2,16,14,2,35,34,38,1,52,46,2,34,14,2,20,30,2, + 50,62,2,1,115,3,21,252,235,185,145,145,185,58,176,124,102,168,122,67,67,122,168,102,124,176,2,56,43,81,116,146,116,81,43,43,81,116,146,117, + 80,43,168,254,168,155,95,95,155,5,16,170,100,97,86,155,216,254,250,216,155,86,97,1,235,100,161,112,61,60,112,161,202,161,112,60,60,113,160,0, + 255,255,0,111,255,227,4,115,4,123,16,6,0,82,254,0,0,3,0,70,254,86,6,33,6,20,0,39,0,46,0,56,0,0,0,16,14,2,35,17, + 35,17,34,46,4,61,1,51,21,20,30,2,51,17,34,46,2,53,52,62,2,59,1,17,50,30,1,37,17,34,6,21,20,22,0,52,46,2,35,17, + 50,62,1,6,33,103,180,243,139,184,87,164,145,120,86,48,180,80,131,169,90,98,156,111,59,59,111,156,98,184,142,243,178,253,21,125,116,123,3,10, + 69,125,176,106,106,176,125,2,199,254,248,214,151,82,254,86,1,170,39,73,103,128,149,83,93,86,87,152,114,66,3,26,43,79,110,67,72,112,77,39, + 254,76,70,137,207,1,38,79,72,66,77,253,128,192,143,95,47,252,230,57,107,0,0,0,0,1,0,174,255,227,6,126,6,20,0,22,0,0,37,33, + 21,33,53,14,1,35,34,38,53,17,51,17,16,51,50,62,2,55,17,51,4,88,2,38,253,34,67,176,118,195,198,184,248,73,117,84,46,2,184,160, + 160,172,103,98,238,233,4,90,251,173,254,194,47,88,125,77,2,140,0,0,0,2,0,240,0,0,1,195,3,82,0,3,0,7,0,0,55,51,21,35, + 17,51,21,35,240,211,211,211,211,254,254,3,82,254,0,0,0,1,0,100,1,178,2,127,2,131,0,6,0,0,19,4,37,21,6,36,39,100,1,15, + 1,12,136,254,245,136,2,131,90,90,164,45,1,44,0,0,0,2,2,68,254,67,2,218,255,211,0,3,0,7,0,28,180,4,3,5,1,9,16,220, + 60,204,50,49,0,182,6,2,0,4,2,0,8,16,220,220,220,73,58,48,5,51,21,35,21,51,21,35,2,68,150,150,150,150,45,150,100,150,0,0, + 255,255,0,171,254,67,3,130,255,211,16,39,5,16,0,168,0,0,17,7,5,22,254,228,0,0,0,19,176,16,75,82,88,187,0,0,0,4,0,4, + 0,64,56,16,60,49,89,0,0,3,0,255,254,67,3,162,255,211,0,3,0,7,0,11,0,37,182,0,3,8,4,9,5,13,16,220,60,220,60,220, + 204,49,0,64,9,10,6,4,8,6,3,4,1,12,16,220,60,220,60,220,73,58,48,5,53,33,21,55,51,21,35,21,51,21,35,0,255,1,144,125, + 150,150,150,150,195,150,150,150,150,100,150,0,0,3,0,255,254,67,3,162,255,211,0,3,0,7,0,15,0,46,64,9,12,11,8,15,4,0,5,1, + 17,16,220,60,220,60,220,220,220,204,49,0,64,11,7,2,0,5,10,2,8,11,0,13,16,16,220,60,220,60,60,204,220,73,58,48,5,51,21,35, + 21,51,21,35,39,21,35,53,35,53,33,21,3,12,150,150,150,150,250,150,125,1,144,45,150,100,150,250,200,200,150,150,0,1,2,68,254,187,2,218, + 255,81,0,3,0,16,181,2,0,4,0,1,5,16,220,204,49,0,16,220,204,48,5,51,21,35,2,68,150,150,175,150,255,255,1,199,254,187,3,87, + 255,81,16,38,5,20,125,0,17,6,5,20,131,0,0,15,178,0,0,5,73,83,88,185,0,0,0,64,56,89,49,0,0,3,1,199,254,67,3,87, + 255,211,0,3,0,7,0,11,0,79,64,9,4,11,10,5,0,1,11,10,13,16,212,204,220,204,220,73,58,49,178,0,8,5,73,83,88,65,12,0, + 11,0,10,0,9,0,8,0,64,0,4,0,7,0,6,0,5,0,4,255,192,0,4,23,56,23,56,89,0,64,9,3,11,8,0,11,7,8,4,12, + 16,220,60,220,60,220,73,58,48,1,51,21,35,3,51,21,35,55,51,21,35,2,68,150,150,125,150,150,250,150,150,254,217,150,1,144,150,150,150,0, + 0,1,1,99,254,187,3,187,255,81,0,3,0,16,181,2,0,4,0,2,5,16,220,204,49,0,16,220,204,48,5,33,21,33,1,99,2,88,253,168, + 175,150,0,0,0,1,1,99,254,117,3,187,255,161,0,7,0,25,180,5,2,0,6,9,16,220,220,220,204,49,0,180,1,0,3,5,8,16,220,220, + 60,204,48,5,21,35,53,35,53,33,21,2,218,150,225,2,88,245,150,150,150,150,0,0,0,1,0,0,5,0,0,150,5,150,0,3,0,16,181,1, + 3,4,1,3,4,16,212,204,49,0,16,220,204,48,17,51,21,35,150,150,5,150,150,0,255,255,0,0,5,0,0,150,5,150,16,6,5,25,0,0, + 255,255,1,47,254,27,3,185,255,221,16,39,5,20,0,223,255,96,16,38,5,20,229,246,17,7,5,20,254,235,0,140,0,61,178,0,10,4,73,83, + 88,185,0,10,255,192,56,89,179,0,4,10,5,16,73,58,49,0,178,0,9,12,73,83,88,185,0,9,255,192,56,89,178,0,4,9,73,83,88,185, + 0,4,255,192,56,89,179,0,4,9,4,16,73,58,48,0,0,1,2,78,1,229,2,228,2,123,0,3,0,16,181,1,3,4,3,1,5,16,212,204, + 49,0,16,220,204,48,1,51,21,35,2,78,150,150,2,123,150,0,0,0,0,1,2,68,254,67,2,218,255,211,0,3,0,16,181,2,0,4,0,2, + 5,16,220,204,49,0,16,220,204,48,5,51,17,35,2,68,150,150,45,254,112,0,0,0,0,1,0,100,3,198,2,127,4,106,0,3,0,0,19,33, + 21,33,100,2,27,253,229,4,106,164,0,0,0,1,1,99,5,0,3,187,5,150,0,3,0,16,181,1,3,4,3,1,5,16,212,204,49,0,16,220, + 204,48,1,33,21,33,1,99,2,88,253,168,5,150,150,0,0,1,0,209,255,56,1,139,5,40,0,3,0,28,180,5,2,8,0,4,16,212,236,204, + 49,0,178,1,2,4,16,204,204,48,180,64,5,80,5,2,1,93,19,51,17,35,209,186,186,5,40,250,16,0,0,0,0,1,5,25,5,0,5,175, + 5,150,0,3,0,16,181,1,3,4,1,3,4,16,212,204,49,0,16,220,204,48,1,51,21,35,5,25,150,150,5,150,150,0,0,0,0,1,0,197, + 5,0,1,91,5,150,0,3,0,16,181,1,3,4,1,3,4,16,212,204,49,0,16,220,204,48,19,51,21,35,197,150,150,5,150,150,0,2,0,209, + 0,0,1,139,4,96,0,3,0,7,0,35,182,9,2,6,8,0,4,8,16,212,50,236,50,204,49,0,180,3,1,188,5,7,47,204,244,204,48,180, + 64,9,80,9,2,1,93,19,51,21,35,17,51,21,35,209,186,186,186,186,4,96,202,253,52,202,0,0,0,1,0,102,0,0,2,220,4,96,0,13, + 0,29,182,15,5,12,9,8,13,14,16,212,236,212,204,204,49,0,182,5,169,4,188,10,169,12,47,236,244,236,48,19,16,54,59,1,21,35,34,6, + 21,17,33,21,33,102,205,227,146,148,134,110,1,188,253,138,2,94,1,14,244,143,150,194,254,22,143,0,0,1,1,99,254,67,3,187,255,211,0,7, + 0,25,180,5,2,0,6,9,16,220,220,220,204,49,0,180,1,0,3,5,8,16,220,220,60,204,48,5,21,35,53,35,53,33,21,2,218,150,225,2, + 88,195,250,250,150,150,0,0,0,1,0,186,0,0,4,159,4,96,0,39,0,111,183,41,70,31,8,30,1,8,2,183,22,8,21,10,8,11,70,40, + 16,252,236,212,252,220,183,127,2,127,2,111,2,95,2,178,63,2,5,93,236,212,75,176,29,83,88,185,0,30,255,192,56,89,252,252,183,74,3,58, + 3,41,3,122,3,178,68,3,5,93,75,176,10,81,88,185,0,41,255,192,56,89,49,0,180,31,22,188,10,1,47,47,252,196,183,58,0,58,3,85, + 29,91,9,182,101,23,106,3,121,9,7,93,48,9,1,35,1,14,4,21,17,35,53,52,62,5,55,1,51,1,62,4,53,17,51,21,20,14,5,3, + 128,1,29,217,254,96,28,35,56,33,26,184,20,31,50,45,65,44,31,254,228,217,1,160,27,35,56,34,26,184,20,31,50,46,64,44,1,155,254,101, + 2,88,14,21,53,65,110,69,254,244,185,81,138,96,81,50,44,21,13,1,155,253,168,13,21,54,65,110,69,1,12,185,82,137,97,81,49,44,21,0, + 0,1,0,88,0,0,4,72,4,96,0,21,0,54,183,23,19,17,8,0,8,21,22,16,220,212,220,252,220,220,180,116,10,111,7,2,93,49,75,176, + 10,81,88,185,0,23,255,192,56,89,0,183,8,169,9,188,17,169,21,169,176,20,47,236,236,252,236,48,37,17,52,46,3,35,33,53,33,50,30,3, + 21,17,51,21,33,53,2,232,11,38,69,121,87,254,182,1,74,123,177,116,69,27,166,252,16,143,1,207,75,99,102,58,37,143,46,85,139,166,114,254, + 85,143,143,0,0,1,0,88,255,246,3,17,4,96,0,31,0,63,183,33,3,8,4,0,8,22,27,177,13,32,16,220,212,212,236,220,236,204,180,116, + 29,92,16,2,93,75,176,15,81,75,176,13,83,90,88,125,176,6,47,24,89,49,0,183,27,169,28,188,32,16,169,11,176,3,47,47,236,16,252,236, + 48,1,20,18,23,35,38,39,14,3,35,34,39,53,22,51,50,62,3,53,52,46,1,43,1,53,51,50,22,2,127,69,77,199,58,25,33,70,80,80, + 55,46,51,34,36,44,69,86,56,40,51,101,92,90,96,221,203,2,94,144,254,192,142,135,112,81,103,54,19,14,169,10,13,52,91,170,117,151,161,59, + 143,244,0,0,0,1,0,88,0,0,4,23,4,96,0,7,0,40,182,9,0,1,8,4,5,8,16,220,220,252,220,220,49,75,176,10,81,88,185,0, + 9,255,192,56,89,0,181,1,4,169,6,188,3,47,252,252,196,48,1,35,17,35,17,33,53,33,4,23,198,186,253,193,3,191,3,209,252,47,3,209, + 143,0,0,0,0,2,0,186,0,0,4,128,4,96,0,3,0,15,0,60,183,17,70,4,8,7,11,1,8,178,2,70,16,16,252,236,212,212,252,252, + 180,112,13,106,10,2,93,75,176,10,81,88,185,0,17,255,192,56,89,49,0,183,11,169,12,188,2,0,3,2,176,6,47,47,212,196,16,252,252,48, + 1,17,35,17,5,17,35,17,52,38,35,33,53,33,32,22,1,136,185,3,177,185,129,186,254,46,1,208,1,21,225,2,172,253,84,2,96,38,253,198, + 2,96,216,153,143,250,0,0,0,1,0,186,0,0,1,116,4,96,0,3,0,33,182,5,70,1,8,2,70,4,16,252,252,252,75,176,10,81,88,185, + 0,5,255,192,56,89,49,0,178,3,188,1,47,228,48,1,17,35,17,1,116,186,4,96,251,160,4,96,0,1,0,88,0,0,2,109,4,96,0,13, + 0,69,182,15,1,5,8,8,13,14,16,220,220,252,220,220,49,75,176,14,83,75,176,16,81,90,88,124,176,2,47,24,179,106,3,90,3,180,106,11, + 90,11,4,93,49,89,75,176,10,81,88,185,0,15,255,192,56,89,0,181,2,12,169,13,188,7,47,252,252,196,48,1,21,35,34,6,21,17,35,17, + 52,54,55,35,53,2,109,80,87,65,186,77,56,248,4,96,143,155,189,253,135,2,121,127,178,39,143,0,0,1,0,186,0,0,4,128,4,96,0,13, + 0,55,183,15,70,1,8,2,8,8,9,177,70,14,16,252,252,220,252,252,178,112,11,1,93,75,176,10,81,88,185,0,15,255,192,56,89,49,0,181, + 7,169,10,188,8,2,47,47,252,236,178,116,0,1,93,0,48,1,17,35,17,52,38,35,33,17,35,17,33,32,22,4,128,186,130,184,254,231,185,1, + 208,1,20,226,2,94,253,162,2,121,198,146,252,47,4,96,240,0,0,0,0,1,0,185,255,227,4,191,4,107,0,31,0,91,183,33,25,8,10,17, + 1,8,30,177,70,32,16,252,252,220,220,183,116,20,112,20,127,10,47,10,178,160,10,5,93,252,220,49,75,176,10,81,88,185,0,33,255,192,56,89, + 0,183,15,169,20,31,188,32,5,169,176,28,47,236,16,252,196,236,181,108,10,110,25,110,30,181,92,10,94,25,94,30,183,68,10,68,1,52,10,52, + 1,176,10,93,48,1,17,20,30,2,50,62,2,53,52,46,2,35,34,7,53,54,51,50,30,2,21,16,2,32,2,25,1,1,114,45,89,116,160,116, + 89,45,19,48,90,67,66,93,114,87,102,144,84,37,252,253,242,252,4,96,253,180,116,162,91,40,40,91,162,116,113,157,125,61,30,143,30,81,159,210, + 141,254,212,254,243,1,13,1,44,2,68,0,0,1,0,136,1,162,1,66,4,96,0,3,0,35,180,5,1,8,2,4,16,220,252,220,49,75,176,10, + 81,88,185,0,5,255,192,56,89,0,180,1,2,0,188,4,16,228,47,196,48,1,17,7,17,1,66,186,4,96,253,142,76,2,190,0,0,1,0,88, + 254,86,3,146,4,96,0,16,0,56,182,18,70,0,8,3,10,17,16,220,220,252,252,180,97,12,95,9,2,93,75,176,10,81,88,185,0,18,255,192, + 56,89,49,0,182,10,169,11,188,1,189,17,16,236,252,236,182,95,3,79,3,63,3,3,93,48,1,17,35,17,52,46,3,35,33,53,33,50,30,2, + 3,146,186,21,50,88,127,93,254,251,1,1,168,214,134,53,1,238,252,104,3,152,114,155,117,66,31,143,61,151,232,0,0,1,0,88,0,0,3,202, + 4,96,0,25,0,53,182,27,7,8,19,14,25,26,16,220,212,220,252,220,183,79,15,79,24,63,15,63,24,176,4,93,49,75,176,10,81,88,185,0, + 27,255,192,56,89,0,182,25,169,0,188,14,169,13,47,236,252,236,48,19,33,50,30,3,20,14,3,35,33,53,33,50,62,2,52,46,2,35,33,88, + 1,88,117,187,120,80,34,34,80,120,187,117,254,168,1,88,100,141,78,34,34,78,141,100,254,168,4,96,64,107,146,157,172,157,146,107,64,142,62,117, + 145,188,145,117,62,0,0,0,0,1,0,88,0,0,3,240,5,213,0,8,0,54,183,10,7,8,1,8,8,0,5,178,8,2,9,16,220,252,220,252, + 212,178,127,1,1,93,252,220,49,75,176,10,81,88,185,0,10,255,192,56,89,0,182,7,2,169,4,5,188,0,47,252,204,252,196,48,33,1,33,17, + 51,17,5,7,1,1,129,1,148,253,67,187,2,221,3,254,87,3,209,2,4,254,139,1,110,252,15,0,0,2,0,186,0,0,4,149,4,96,0,8, + 0,15,0,52,183,17,70,0,8,11,10,8,1,177,70,16,16,252,252,220,252,252,49,75,176,10,81,88,185,0,17,255,192,56,89,0,182,9,169,2, + 188,10,169,1,47,236,244,236,180,111,12,126,12,2,93,48,41,1,17,33,50,30,2,21,1,17,33,17,52,38,35,4,149,252,37,1,227,141,192,119, + 52,252,223,2,103,130,185,4,96,58,129,189,138,1,115,252,190,1,234,198,146,0,0,0,0,1,0,88,0,0,4,181,4,112,0,37,0,100,183,39, + 70,12,8,17,14,27,8,180,28,1,8,0,38,16,220,236,212,178,112,28,1,93,252,220,220,252,252,183,74,35,58,35,42,35,28,35,183,104,35,90, + 35,74,4,104,4,180,115,4,12,35,8,93,75,176,10,81,88,185,0,39,255,192,56,89,49,0,183,20,169,10,0,188,15,169,14,176,27,47,47,236, + 252,212,252,183,88,4,108,17,92,17,118,4,178,127,17,5,93,48,19,51,30,1,23,62,4,51,32,25,1,33,53,33,17,52,38,35,34,7,6,7, + 6,7,3,35,19,62,4,53,52,2,88,217,4,66,22,28,77,76,98,76,51,1,146,253,206,1,120,122,97,180,86,48,42,2,5,98,186,80,3,15, + 5,7,3,93,4,96,11,157,78,70,100,54,30,8,253,238,253,162,142,1,208,195,187,160,91,206,14,23,254,18,1,162,16,73,27,51,39,22,64,1, + 7,0,0,0,0,1,0,186,254,86,1,116,4,96,0,3,0,36,182,5,70,1,8,2,70,4,16,252,252,252,75,176,10,81,88,185,0,5,255,192, + 56,89,49,0,180,2,189,3,188,4,16,228,228,48,1,17,35,17,1,116,186,4,96,249,246,6,10,0,0,1,0,88,0,0,2,120,4,96,0,13, + 0,49,183,15,70,11,8,0,5,13,14,16,220,212,220,252,252,75,176,10,81,88,185,0,15,255,192,56,89,49,0,182,5,169,6,188,13,169,12,47, + 236,252,236,180,16,10,0,10,2,93,48,37,17,52,38,43,1,53,51,50,22,21,17,33,53,1,190,100,106,126,126,205,187,253,224,143,2,88,123,111, + 143,177,221,253,46,143,0,0,0,2,0,185,255,227,4,191,4,96,0,9,0,19,0,93,183,21,4,8,15,12,8,9,70,176,20,16,252,252,220,178, + 127,15,1,93,252,220,182,74,10,60,10,96,1,3,93,49,183,89,7,84,6,105,7,100,6,176,4,93,75,176,10,81,88,185,0,21,255,192,56,89, + 0,183,10,169,0,188,20,14,169,6,47,236,16,252,252,183,52,15,52,12,38,15,38,12,183,66,15,66,12,82,3,100,3,176,8,93,48,19,33,32, + 4,17,16,0,32,0,17,1,33,17,16,32,17,52,46,2,185,1,231,1,29,1,2,255,0,253,250,255,0,1,231,254,210,2,148,45,95,127,4,96, + 250,254,212,254,208,254,217,1,39,1,48,1,141,254,107,254,73,1,191,117,156,88,36,0,0,1,0,88,255,66,4,72,4,96,0,19,0,75,183,21, + 70,2,8,1,15,8,12,177,14,20,16,220,196,252,220,252,252,182,62,13,29,13,15,13,3,93,49,75,176,10,81,88,185,0,21,255,192,56,89,0, + 183,16,169,11,169,12,1,188,14,177,188,21,16,228,228,212,236,228,180,20,16,5,16,2,93,48,180,103,13,71,13,2,93,1,17,51,17,20,14,4, + 7,5,53,37,1,51,1,62,1,18,3,136,192,19,49,88,136,194,130,254,128,1,36,254,212,194,1,20,132,144,70,3,68,1,28,254,228,118,178,175, + 136,127,106,47,139,169,104,4,13,252,50,57,150,1,8,0,0,1,0,186,254,86,4,100,4,96,0,23,0,94,183,25,70,0,8,3,13,8,8,178, + 19,70,24,16,252,252,212,220,252,252,49,75,176,10,81,88,185,0,25,255,192,56,89,0,183,16,169,11,7,169,20,188,2,177,189,24,16,236,252,252, + 220,183,74,19,31,11,15,11,47,11,176,4,93,75,176,23,80,75,176,18,83,90,88,185,0,11,0,64,56,89,252,183,106,3,92,3,74,3,127,4, + 176,4,93,48,1,17,35,17,52,38,43,1,21,20,22,51,50,55,21,6,35,34,38,53,17,33,32,22,4,100,186,145,169,253,71,74,41,67,82,67, + 134,155,1,182,1,16,228,2,94,251,248,4,10,208,161,240,73,69,13,152,16,148,176,1,100,245,0,0,0,1,0,186,0,0,4,142,4,96,0,28, + 0,106,183,30,3,8,12,22,16,8,7,178,0,70,29,16,252,196,252,212,220,180,95,12,63,12,2,93,252,220,183,61,14,61,10,75,14,75,10,176, + 4,93,49,75,176,10,81,88,185,0,30,255,192,56,89,0,183,25,169,20,16,169,0,188,9,177,169,6,47,236,252,252,125,220,178,95,20,1,113,24, + 182,112,20,80,20,74,28,3,93,75,176,25,80,75,176,18,83,90,88,185,0,20,0,64,56,89,252,48,19,33,32,0,16,0,41,1,53,33,50,54, + 53,52,38,43,1,7,6,22,51,50,55,21,6,35,34,38,53,186,1,170,1,2,1,40,254,215,254,255,254,86,1,94,236,209,216,228,165,1,1,72, + 74,41,67,82,67,134,155,4,96,254,220,253,232,254,220,142,192,238,219,186,222,73,69,13,152,16,148,176,0,1,0,88,254,86,3,249,4,99,0,22, + 0,71,183,24,8,8,7,3,14,8,17,179,0,8,22,23,16,220,252,212,252,196,220,178,127,7,1,93,252,220,183,54,3,68,3,84,3,5,3,176, + 4,93,49,75,176,10,81,88,185,0,24,255,192,56,89,0,181,7,0,188,16,189,23,16,236,252,196,178,55,3,1,93,48,1,23,22,23,62,1,61, + 1,51,21,20,14,2,7,17,35,17,52,46,1,39,3,1,37,159,102,58,117,104,184,61,104,128,72,186,57,61,49,211,4,99,228,146,153,46,195,151, + 132,132,111,186,126,83,18,252,134,3,38,80,171,106,73,1,57,0,0,0,0,1,0,88,0,0,4,5,4,96,0,26,0,108,183,28,70,23,13,8, + 12,2,8,178,26,1,27,16,220,196,252,220,176,12,75,81,176,16,75,83,90,88,185,0,12,0,64,56,177,12,0,47,16,89,252,196,252,183,60,22, + 59,3,63,0,72,3,183,108,0,89,0,95,0,74,22,182,105,22,124,0,61,0,9,93,49,75,176,10,81,88,185,0,28,255,192,56,89,0,181,12, + 1,188,26,169,25,47,236,252,196,183,84,22,56,3,84,3,116,3,176,4,93,48,37,1,51,1,54,55,62,4,53,17,51,21,20,14,5,7,1,21, + 33,53,2,244,253,100,218,1,131,4,7,24,26,44,24,19,184,18,26,46,38,61,36,30,1,3,252,83,142,3,210,253,201,3,5,17,22,52,55,90, + 55,1,12,185,74,125,88,77,46,47,21,16,254,142,71,142,0,2,0,186,254,86,5,17,4,95,0,3,0,10,0,82,176,7,183,12,8,8,5,10, + 8,4,1,180,8,2,6,70,11,16,252,212,252,220,252,212,183,79,5,95,5,111,5,127,5,176,4,93,252,204,49,75,176,10,81,88,185,0,12,255, + 192,56,89,0,183,2,1,6,169,7,188,0,189,176,4,47,236,252,252,220,196,178,175,1,1,93,180,64,9,80,9,2,113,48,1,17,7,17,9,1, + 33,53,33,21,1,1,140,186,1,211,1,148,252,129,4,87,254,87,254,86,4,86,76,251,246,1,170,3,209,142,110,252,15,0,0,0,0,1,0,88, + 0,0,3,202,4,96,0,17,0,64,182,19,70,1,8,2,10,18,16,220,220,252,236,49,176,14,75,84,176,15,75,84,91,88,176,12,47,49,89,75, + 176,10,81,88,185,0,19,255,192,56,89,0,180,10,169,11,188,2,47,252,236,48,75,176,16,80,88,177,3,0,47,47,48,89,1,17,35,17,52,46, + 3,35,33,53,33,50,30,3,3,202,186,21,51,80,126,82,254,176,1,79,126,191,122,77,31,2,58,253,198,2,58,73,118,105,70,41,143,53,93,141, + 161,0,0,0,0,1,0,88,0,0,5,83,4,96,0,40,0,162,183,42,32,8,31,15,8,14,3,182,8,2,22,8,1,2,41,16,220,212,252,16, + 252,220,180,16,14,0,14,2,93,252,220,183,72,6,59,6,43,6,16,31,183,0,31,80,0,96,0,112,0,176,8,93,252,220,75,176,11,80,88,187, + 0,22,255,192,0,1,255,192,56,56,49,177,4,21,47,125,47,24,89,183,32,0,48,0,87,21,87,4,176,4,93,49,183,102,19,103,4,119,4,118, + 19,178,135,4,5,93,75,176,10,81,88,185,0,42,255,192,56,89,0,183,21,169,4,31,14,2,188,22,177,169,0,47,236,252,196,196,220,183,175,4, + 31,4,47,4,159,4,176,4,93,236,182,67,29,67,34,72,37,3,93,48,33,35,3,51,19,62,8,55,51,2,7,6,7,6,7,19,50,62,6,55, + 51,14,7,1,174,188,154,185,73,48,75,56,40,29,17,15,8,13,6,165,18,24,41,108,95,167,43,98,151,146,107,99,69,56,34,10,185,18,42,61, + 75,105,129,171,203,4,96,253,241,1,15,33,35,64,53,93,69,121,43,254,252,103,171,69,61,6,254,205,15,40,67,105,146,197,250,157,166,252,228,163, + 137,87,61,26,0,1,0,20,255,248,4,136,4,96,0,30,0,73,183,32,70,1,8,3,10,8,23,179,8,24,17,31,16,220,212,252,252,220,252,252, + 49,180,208,25,208,24,2,93,75,176,10,81,88,185,0,32,255,192,56,89,0,183,19,169,14,1,10,169,24,169,178,25,188,1,47,252,236,252,16,212, + 252,182,127,3,106,3,91,3,3,93,48,1,17,35,17,52,46,3,43,1,17,20,6,35,34,39,53,22,51,50,54,53,17,35,53,33,50,30,2,4, + 136,186,10,36,64,112,80,246,123,152,53,78,65,38,71,46,173,2,93,143,193,108,44,2,94,253,162,2,96,74,99,101,58,37,253,205,214,208,16,143, + 14,114,163,2,51,143,67,138,180,0,0,0,255,255,0,186,0,0,3,10,4,96,16,39,5,43,1,150,0,0,16,6,5,43,0,0,255,255,0,136, + 0,0,2,168,4,96,16,39,5,43,1,52,0,0,16,6,5,47,0,0,255,255,0,136,1,162,2,127,4,96,16,39,5,47,1,61,0,0,16,6, + 5,47,0,0,0,1,0,186,2,228,2,153,4,96,0,3,0,20,64,9,2,180,0,188,4,3,68,1,4,16,212,236,49,0,16,244,236,48,1,51, + 1,35,1,210,199,254,186,153,4,96,254,132,0,2,0,186,2,228,4,110,4,96,0,3,0,7,0,29,64,14,3,7,180,1,5,188,8,3,68,1, + 7,68,5,8,16,212,236,220,236,49,0,16,244,60,236,50,48,1,51,1,35,3,51,1,35,3,167,199,254,186,153,189,199,254,186,153,4,96,254,132, + 1,124,254,132,0,2,0,0,255,215,4,220,7,34,0,37,0,48,0,0,1,22,23,22,21,35,52,39,38,39,51,22,23,22,55,54,55,54,53,51, + 20,23,22,23,22,55,54,53,51,20,7,6,35,34,39,6,7,6,37,9,1,5,7,39,1,35,1,35,53,2,177,15,10,20,114,23,31,98,123,30, + 25,13,29,46,5,4,113,9,14,29,38,9,8,113,24,45,97,84,21,32,33,29,253,246,2,4,1,0,1,27,25,125,254,193,66,253,174,115,6,22, + 49,50,106,255,238,123,162,205,64,69,35,4,7,36,28,93,125,13,21,1,1,24,24,113,171,33,60,34,28,7,5,105,250,141,2,197,98,80,45,252, + 141,6,70,96,0,2,0,0,255,215,4,220,7,41,0,42,0,53,0,0,1,21,6,7,6,21,20,23,22,23,21,34,7,6,21,20,23,22,23,50, + 55,54,55,21,6,7,6,35,34,39,38,53,52,55,54,55,38,39,38,53,38,55,54,5,9,1,5,7,39,1,35,1,35,53,3,168,77,64,86,58, + 49,49,56,85,70,30,37,47,62,55,80,54,46,78,64,63,94,71,63,68,41,55,45,28,35,1,142,70,253,150,2,4,1,0,1,27,25,125,254,193, + 66,253,174,115,7,41,94,10,29,38,35,20,32,27,2,92,42,36,64,46,34,41,1,13,19,24,110,20,16,13,70,62,93,75,72,42,14,18,26,33, + 35,84,72,35,157,250,141,2,197,98,80,45,252,141,6,70,96,0,0,0,0,4,0,133,0,0,5,122,5,20,0,3,0,7,0,11,0,15,0,0, + 37,51,21,35,37,51,21,35,1,51,21,35,37,51,1,35,4,198,180,180,254,62,180,180,253,143,180,180,2,148,160,253,94,160,250,250,250,250,5,20, + 250,250,250,236,0,5,0,133,0,0,7,60,5,20,0,3,0,7,0,11,0,15,0,19,0,0,37,51,21,35,37,51,21,35,37,51,21,35,1,51, + 21,35,37,51,1,35,6,136,180,180,254,62,180,180,254,62,180,180,253,143,180,180,2,148,160,253,94,160,250,250,250,250,250,250,5,20,250,250,250,236, + 0,1,0,219,0,0,2,0,1,236,0,5,0,0,33,35,53,19,51,3,1,174,211,164,129,82,172,1,64,254,192,0,0,2,0,252,4,253,3,5, + 6,241,0,10,0,27,0,0,1,51,50,55,54,53,52,39,38,7,6,23,43,1,53,51,17,51,17,54,55,54,23,22,21,20,7,6,1,205,55,78, + 22,53,30,1,71,52,24,175,112,81,102,36,104,63,70,65,64,54,5,98,13,33,21,32,16,1,28,21,168,101,1,143,254,191,73,40,24,26,25,82, + 91,50,42,0,0,2,0,219,0,0,2,0,5,17,0,5,0,9,0,0,1,35,53,19,51,11,1,51,21,35,1,174,211,164,129,82,211,211,211,3, + 37,172,1,64,254,192,253,45,254,0,0,0,0,2,0,147,0,0,3,176,5,240,0,3,0,36,0,0,37,21,35,53,55,53,52,38,39,46,1,47, + 1,46,1,53,52,54,51,50,22,23,21,46,1,35,34,6,21,20,22,31,1,30,1,29,1,2,188,203,6,6,6,8,39,47,88,90,72,223,184,103, + 193,94,97,179,79,108,131,51,57,90,90,56,254,254,254,147,123,52,60,21,25,53,47,86,86,137,76,159,194,56,57,188,67,70,110,89,49,94,53,89, + 86,130,101,154,0,1,0,163,0,85,3,30,3,222,0,34,0,0,55,53,54,55,54,55,38,39,38,53,52,55,54,55,54,51,50,23,21,38,7,6, + 7,6,23,20,23,22,55,54,55,21,6,7,6,163,47,83,68,52,142,51,53,21,30,103,99,98,110,90,100,70,51,49,96,1,200,57,58,72,58,90, + 205,231,85,176,6,25,20,33,24,76,79,84,65,75,118,63,61,22,185,31,2,1,26,48,112,115,50,14,15,19,35,185,60,80,90,0,255,255,255,181, + 0,0,2,133,7,131,16,39,5,123,255,29,1,194,16,6,5,84,0,0,255,255,0,108,0,0,1,195,7,253,16,39,5,124,255,29,1,134,16,6, + 5,84,0,0,255,255,255,171,254,12,3,64,4,181,16,39,5,124,255,194,254,62,16,6,5,112,0,0,255,255,0,108,254,12,1,195,6,20,16,39, + 5,125,255,29,0,0,16,6,5,84,0,0,255,255,0,130,254,243,5,192,4,181,16,39,5,124,255,244,254,62,16,6,5,113,0,0,0,1,0,193, + 0,0,1,121,6,20,0,3,0,0,19,51,17,35,193,184,184,6,20,249,236,0,0,0,255,255,0,130,254,162,6,235,2,157,16,38,5,142,0,0, + 16,7,22,196,3,57,254,162,255,255,0,139,255,198,3,160,4,26,16,38,5,111,0,0,16,7,22,197,0,250,3,132,255,255,0,130,255,236,6,235, + 3,32,16,38,5,142,0,0,16,7,22,197,2,188,2,138,255,255,0,130,255,236,6,235,4,26,16,38,5,142,0,0,16,7,22,198,2,188,2,138, + 255,255,0,157,254,12,5,40,3,102,16,38,5,90,0,0,16,7,22,196,3,7,0,25,0,1,0,157,254,12,5,40,3,102,0,30,0,0,19,36, + 51,32,23,21,32,7,6,17,20,23,22,33,50,55,21,6,35,32,39,38,53,16,55,54,55,34,7,6,7,157,1,20,195,1,36,196,254,218,215,224, + 74,127,1,75,193,212,150,250,254,94,169,131,212,96,137,101,159,126,104,3,39,63,54,154,167,174,254,251,135,96,164,118,184,99,194,150,224,1,2,223, + 101,52,19,15,45,0,0,0,255,255,0,157,254,12,5,40,4,176,16,38,5,90,0,0,16,7,22,196,2,63,4,26,0,1,0,125,255,218,3,27, + 3,82,0,25,0,0,37,54,55,54,53,52,39,38,39,51,22,23,22,21,20,7,6,5,6,35,34,39,53,22,51,50,1,135,172,35,8,60,66,173, + 227,113,66,82,32,80,254,250,46,45,102,103,115,84,33,151,49,112,27,42,78,116,129,146,91,124,152,105,99,75,194,41,7,38,184,42,255,255,0,125, + 255,218,3,27,4,176,16,38,5,92,0,0,16,7,22,196,1,69,4,26,0,1,255,171,254,12,3,98,2,38,0,17,0,0,37,54,53,52,39,51, + 22,21,20,7,2,5,4,33,53,32,55,54,2,163,10,53,184,50,8,46,254,221,254,228,254,190,1,48,203,218,158,58,72,126,136,118,132,82,62,254, + 162,155,151,184,128,138,0,0,255,255,255,171,254,12,3,98,3,182,16,38,5,94,0,0,16,7,22,196,2,113,3,32,0,1,0,130,254,12,9,26, + 2,238,0,63,0,0,37,6,7,6,7,6,35,38,39,36,17,52,55,51,6,23,22,23,22,51,50,55,54,55,54,39,38,47,1,51,23,22,23,22, + 51,50,55,54,53,51,20,23,22,51,50,25,1,51,17,20,7,6,7,6,35,34,39,38,39,6,7,6,7,6,4,252,24,84,133,193,80,120,128,109, + 254,237,105,184,108,1,1,147,95,81,98,95,121,94,64,1,1,16,64,184,36,16,28,59,115,82,44,37,184,19,64,110,142,184,92,75,102,37,32,73, + 48,138,17,49,95,50,70,132,44,179,107,170,62,26,1,28,71,1,72,246,180,206,220,179,38,24,37,48,158,108,142,125,61,234,156,74,60,129,122,103, + 194,205,50,169,1,24,1,38,254,170,199,113,92,24,9,25,70,123,159,30,15,3,6,0,255,255,0,130,254,12,9,26,4,176,16,38,5,96,0,0, + 16,7,22,198,4,226,3,32,0,2,0,130,254,12,9,19,2,229,0,50,0,63,0,0,5,6,7,6,35,38,39,36,17,52,55,51,6,23,22,23, + 22,51,50,55,54,55,54,53,52,39,51,6,23,22,23,54,55,54,55,54,23,22,23,22,21,20,7,6,41,1,34,39,38,53,20,1,34,7,6,7, + 51,50,55,54,39,38,39,38,4,144,88,238,80,120,128,109,254,237,105,184,108,1,1,147,95,81,102,91,162,43,33,39,171,1,14,10,40,115,123,126, + 129,79,81,125,97,186,184,202,254,228,254,236,38,52,45,2,161,76,126,168,145,187,237,129,187,1,2,137,37,242,155,77,26,1,28,71,1,72,246,180, + 206,220,179,38,24,37,68,138,108,127,147,138,15,55,40,50,146,108,110,54,34,1,2,37,71,233,169,109,120,30,26,16,186,2,169,81,108,194,63,91, + 70,135,19,5,255,255,0,130,254,12,9,19,3,182,16,38,5,98,0,0,16,7,22,196,4,251,3,32,0,2,0,144,0,0,6,220,6,20,0,12, + 0,31,0,0,37,51,50,55,54,39,38,39,38,35,34,7,6,19,41,1,53,33,17,51,17,18,37,54,51,50,23,22,21,20,7,6,3,65,187,237, + 129,187,1,2,137,37,48,80,122,177,117,253,193,254,145,1,111,184,217,1,20,92,68,120,102,186,184,202,184,63,93,68,135,19,5,81,120,254,146,184, + 5,92,251,14,1,63,99,33,39,69,235,169,109,120,0,0,255,255,0,144,0,0,6,220,6,20,16,38,5,100,0,0,16,7,22,196,3,207,3,82, + 0,1,0,117,254,12,4,178,4,42,0,42,0,0,5,22,33,50,55,21,6,35,32,39,38,53,52,55,54,55,38,39,38,53,52,55,54,51,21,34, + 7,6,21,20,23,22,51,50,55,54,55,21,4,7,6,21,20,1,83,119,1,83,193,212,150,250,254,91,166,98,87,113,77,51,47,88,204,124,252,195, + 116,93,48,45,46,40,41,158,254,254,239,236,209,177,158,118,184,99,188,111,201,177,101,131,25,4,30,56,130,208,127,77,169,65,52,104,75,25,24,18, + 69,29,184,26,149,131,185,117,255,255,0,117,254,12,4,178,5,70,16,38,5,102,0,0,16,7,22,196,1,119,4,176,0,1,255,236,0,0,2,108, + 0,184,0,3,0,0,35,53,33,21,20,2,128,184,184,0,255,255,0,130,255,164,7,158,5,20,16,38,5,186,0,0,16,7,22,196,5,245,4,126, + 255,255,0,107,254,72,5,155,5,20,16,38,5,143,0,0,16,7,22,197,3,82,4,126,0,2,0,144,255,201,5,199,6,20,0,33,0,61,0,0, + 1,21,6,7,6,21,20,23,22,23,22,21,20,7,6,35,34,39,53,22,51,50,55,54,53,52,39,38,39,38,55,54,55,54,1,54,25,1,51,17, + 16,7,6,7,6,39,38,39,36,53,52,55,51,6,21,22,23,22,51,50,55,54,3,208,74,38,80,14,12,68,102,88,82,78,66,56,68,45,60,57, + 60,78,74,18,32,1,2,75,85,1,102,76,184,110,149,221,136,118,207,101,254,219,16,184,14,2,160,121,127,140,89,152,4,111,82,4,14,30,33,28, + 18,16,10,15,88,110,42,39,11,88,10,26,26,30,38,17,16,28,47,46,81,38,43,252,174,73,1,1,3,177,252,79,254,185,123,167,31,19,1,2, + 30,88,195,75,53,58,44,92,46,35,27,47,0,1,0,144,254,200,5,24,6,20,0,27,0,0,37,54,53,17,51,17,16,7,6,5,6,35,34,39, + 36,3,38,55,51,6,21,20,23,22,51,50,55,54,4,18,78,184,98,121,254,251,134,85,95,73,254,220,1,1,64,184,65,166,40,73,80,109,174,73, + 126,227,4,106,251,150,254,195,144,177,66,34,22,92,1,17,138,92,115,115,130,62,16,34,53,0,0,0,0,2,0,140,254,20,4,94,2,243,0,17, + 0,46,0,0,1,22,51,50,55,54,53,52,39,38,39,38,35,34,7,6,21,20,7,38,7,6,21,17,35,17,52,55,54,51,38,53,52,55,54,51, + 50,23,22,23,22,21,20,7,6,35,6,2,98,122,76,44,21,53,6,21,59,40,46,59,27,68,110,50,75,25,200,120,65,90,2,162,77,92,77,79, + 182,28,8,98,120,88,178,1,39,42,22,57,58,24,20,88,17,12,27,68,68,40,193,28,78,26,79,254,20,1,236,173,102,55,42,40,148,132,63,36, + 83,167,45,56,146,65,80,2,255,255,0,147,254,181,5,72,3,182,16,38,5,211,0,0,16,7,22,196,2,63,3,32,0,2,0,139,255,198,3,160, + 2,222,0,15,0,31,0,0,1,34,7,6,23,22,23,22,51,50,55,54,53,52,39,38,39,50,23,22,21,6,7,6,35,34,39,38,53,52,55,54, + 1,187,66,33,26,1,1,55,57,57,91,93,75,66,123,152,198,182,141,1,147,165,132,96,81,167,37,84,2,42,87,69,123,82,44,44,57,46,85,77, + 65,120,179,160,124,148,200,75,85,35,74,239,181,78,185,0,0,2,255,171,254,12,3,64,2,134,0,11,0,38,0,0,1,34,7,6,21,20,23,22, + 51,52,39,38,1,16,7,6,7,6,33,53,32,55,54,55,34,39,38,39,38,53,52,55,54,51,50,23,22,23,22,1,238,63,44,24,51,47,192,86, + 37,1,46,172,95,93,192,254,147,1,103,134,168,62,118,45,150,40,116,89,104,137,89,72,130,25,17,1,196,57,33,36,51,47,44,184,59,25,254,244, + 254,204,160,88,42,86,184,76,95,148,10,33,34,98,137,141,87,103,51,90,143,102,0,0,0,1,0,130,254,243,5,192,3,74,0,54,0,0,37,6, + 5,6,35,34,39,36,17,52,55,51,6,23,22,23,22,55,54,55,54,55,54,53,52,39,38,39,38,39,38,39,52,55,54,50,23,22,23,35,38,39, + 38,39,38,7,6,21,20,23,22,23,22,23,22,5,86,102,254,169,177,120,129,72,254,219,63,184,66,1,2,164,97,61,126,129,177,84,59,126,66,114, + 67,58,64,1,190,95,208,96,141,27,184,13,66,40,69,78,62,60,125,248,57,77,2,1,12,170,73,38,26,104,1,5,117,113,131,99,147,45,26,6, + 11,24,33,80,56,53,74,29,15,46,27,51,57,115,150,74,37,42,61,173,61,33,20,2,2,39,38,34,55,42,83,64,85,89,68,0,255,255,0,130, + 254,12,5,192,3,74,16,38,5,113,0,0,16,7,22,197,1,244,254,12,0,2,0,220,4,186,3,36,6,154,0,3,0,7,0,0,19,53,37,21, + 1,53,37,21,220,2,72,253,184,2,72,5,170,110,130,110,254,142,110,130,110,0,0,0,0,2,0,220,4,186,3,36,6,253,0,38,0,53,0,0, + 1,54,55,38,39,38,53,52,55,54,51,50,23,22,21,20,7,22,51,22,51,21,34,47,1,6,7,6,35,34,39,38,53,51,20,23,22,51,50,55, + 54,55,54,53,52,38,35,34,7,6,21,20,23,22,2,11,37,21,33,23,108,69,28,63,73,40,55,12,19,14,18,20,47,20,52,26,75,85,94,114, + 56,15,90,12,35,48,56,159,3,3,9,34,20,23,11,18,45,20,5,100,36,42,7,13,57,94,87,52,21,39,54,79,39,38,1,1,110,2,5,61, + 78,86,154,41,113,97,26,75,238,7,7,21,24,34,28,9,13,28,37,18,8,0,0,0,0,2,0,220,254,22,3,36,255,246,0,3,0,7,0,0, + 19,53,37,21,37,53,37,21,220,2,72,253,184,2,72,254,22,110,130,110,110,110,130,110,0,1,0,220,4,186,3,36,5,170,0,3,0,0,19,53, + 37,21,220,2,72,4,186,110,130,110,0,0,0,2,0,220,4,185,3,36,6,253,0,30,0,45,0,0,1,38,39,38,53,52,55,54,51,50,23,22, + 21,20,7,30,1,51,21,34,39,38,39,6,7,6,35,53,50,55,54,55,54,55,54,53,52,38,35,34,7,6,21,20,23,22,2,41,9,19,108,69, + 28,63,73,40,55,14,17,36,20,35,32,30,28,43,69,200,147,152,139,23,86,3,3,9,34,20,23,11,18,45,20,5,186,2,10,56,95,87,52,21, + 39,54,79,32,45,1,1,110,2,2,3,61,42,123,110,109,18,112,7,7,21,24,34,28,9,13,28,37,18,8,0,0,0,1,0,220,254,232,3,36, + 255,216,0,3,0,0,19,53,37,21,220,2,72,254,232,110,130,110,0,0,0,1,0,200,4,203,3,56,6,244,0,40,0,0,1,6,7,6,35,34, + 39,38,53,52,55,51,6,21,20,23,22,55,54,55,54,53,51,22,21,20,51,50,53,52,39,51,22,21,20,7,6,7,6,39,38,2,16,15,33,57, + 69,79,41,34,16,97,11,25,19,50,61,4,2,96,3,89,71,13,103,12,27,45,83,71,31,27,5,132,76,40,69,63,52,109,109,98,125,56,84,34, + 25,20,24,170,82,89,36,54,195,174,115,57,73,116,133,54,89,10,9,33,30,0,0,0,0,2,0,236,4,225,3,16,7,6,0,11,0,19,0,0, + 1,52,38,35,34,6,21,20,22,51,50,62,1,20,6,34,38,52,54,50,2,150,88,64,65,87,87,65,64,88,122,159,230,159,159,230,5,244,63,88, + 87,64,65,87,88,179,230,160,160,230,159,0,0,1,0,152,4,185,3,104,5,193,0,19,0,0,19,55,22,23,22,51,50,55,54,55,21,6,7,6, + 35,34,39,38,39,7,152,160,103,67,42,54,58,41,107,88,90,90,67,53,34,76,77,68,165,5,54,123,83,21,13,16,41,76,125,64,29,22,17,17, + 70,128,0,0,255,255,1,79,4,191,2,166,6,119,16,7,5,145,0,213,255,141,0,0,255,255,1,79,254,12,2,166,255,196,16,7,5,145,0,213, + 248,218,0,0,0,2,0,220,4,235,3,36,7,47,0,30,0,45,0,0,1,22,23,22,21,20,7,6,35,34,39,38,53,52,55,46,1,35,53,50, + 23,22,23,54,55,54,51,21,34,7,6,7,6,7,6,21,20,22,51,50,55,54,53,52,39,38,1,215,9,19,108,69,28,63,73,40,55,14,17,36, + 20,35,32,30,28,43,69,200,147,152,139,23,86,3,3,9,34,20,23,11,18,45,20,6,46,2,10,56,95,87,52,21,39,54,79,32,45,1,1,110, + 2,2,3,61,42,123,110,109,18,112,7,7,21,24,34,28,9,13,28,37,18,8,0,0,0,1,0,243,4,238,3,13,6,52,0,6,0,0,1,3, + 51,23,55,51,3,1,182,195,139,130,130,139,195,4,238,1,70,195,195,254,186,0,0,0,0,1,1,184,1,194,2,148,2,188,0,3,0,0,1,51, + 21,35,1,184,220,220,2,188,250,0,0,0,0,1,1,22,0,0,2,188,5,20,0,9,0,0,33,35,16,39,2,3,51,18,19,22,2,188,180,37, + 49,156,196,121,73,32,1,169,220,1,33,1,110,254,221,254,148,155,0,0,0,1,0,82,0,0,3,240,5,20,0,24,0,0,1,22,23,22,17,35, + 16,39,2,3,51,22,23,22,51,22,55,54,55,51,6,7,2,35,34,1,166,27,23,32,180,37,49,156,199,66,3,82,180,123,54,31,8,180,8,41, + 99,243,111,3,97,106,114,155,254,22,1,169,220,1,33,1,110,155,5,152,2,149,85,80,121,109,254,250,0,1,0,76,0,0,4,18,5,20,0,37, + 0,0,1,22,23,22,17,35,16,39,2,3,51,22,23,22,55,54,55,54,53,51,20,23,22,23,22,55,54,53,51,16,7,6,35,34,39,6,7,6, + 1,171,24,15,32,180,37,49,156,196,47,40,20,47,72,8,6,180,14,22,47,59,15,13,180,39,71,155,133,32,52,52,46,3,53,87,89,190,254,57, + 1,169,220,1,33,1,110,114,124,62,8,12,64,50,166,222,25,37,2,2,44,42,202,254,207,59,108,62,51,12,10,0,0,1,0,175,255,236,3,167, + 5,32,0,42,0,0,1,21,6,7,6,21,20,23,22,23,21,34,7,6,21,20,23,22,23,50,55,54,55,21,6,7,6,35,34,39,38,53,52,55, + 54,55,38,39,38,39,38,55,54,3,35,122,102,136,92,77,79,89,135,112,48,59,74,99,88,126,86,73,124,101,101,149,112,100,107,65,88,72,44,55, + 1,2,226,112,5,32,168,17,52,67,64,35,57,48,4,164,76,64,114,82,60,74,1,23,33,43,196,37,28,23,125,112,165,134,128,76,24,32,48,58, + 63,150,128,63,0,2,0,135,255,236,3,197,5,36,0,13,0,28,0,0,0,34,7,6,7,6,23,22,50,55,54,39,38,39,3,22,19,22,21,16, + 7,6,32,39,38,17,52,55,18,2,105,134,86,78,4,4,71,41,254,41,71,4,4,78,153,191,134,90,85,105,254,62,105,85,90,135,4,104,212,192, + 174,199,115,66,66,115,199,174,192,1,144,1,254,161,235,179,254,203,117,144,144,117,1,53,179,235,1,97,0,1,0,85,0,0,3,242,5,20,0,17, + 0,0,1,16,19,18,19,35,2,3,2,39,6,35,34,39,53,22,51,50,3,78,37,29,98,196,85,31,28,2,96,142,178,167,180,165,210,5,20,254, + 220,254,159,254,235,254,134,1,68,1,75,1,42,145,28,50,180,50,0,0,0,1,0,60,0,0,4,16,5,20,0,18,0,0,33,38,3,2,39,51, + 18,19,22,23,54,55,18,19,51,2,3,2,7,1,204,17,98,159,126,196,154,90,48,2,2,48,90,154,196,165,120,85,30,246,1,58,1,254,230,254, + 202,254,197,168,11,11,168,1,59,1,54,254,211,254,73,254,202,250,0,0,0,1,0,60,0,0,4,16,5,20,0,18,0,0,1,51,22,19,18,19, + 35,2,3,38,39,6,7,2,3,35,54,19,18,1,204,180,30,85,120,165,196,154,90,48,2,2,48,90,154,196,126,159,98,5,20,250,254,202,254,73, + 254,211,1,54,1,59,168,11,11,168,254,197,254,202,230,1,254,1,58,0,0,2,0,100,0,0,3,242,5,30,0,20,0,35,0,0,1,34,39,38, + 39,38,53,52,55,54,51,50,23,22,23,22,23,18,19,35,2,3,53,52,39,38,35,34,7,6,21,20,23,22,23,22,2,191,206,61,173,58,105,95, + 123,149,154,92,129,13,10,18,37,90,196,91,44,44,71,92,79,57,56,60,27,83,71,2,85,18,51,55,101,123,143,97,125,85,119,166,135,150,254,205, + 254,164,1,156,1,110,87,108,60,97,55,54,71,57,54,24,20,17,0,0,0,3,0,133,0,0,3,199,5,20,0,3,0,7,0,11,0,0,37,51, + 21,35,1,51,21,35,37,51,1,35,3,4,180,180,253,143,180,180,2,148,160,253,94,160,250,250,5,20,250,250,250,236,0,1,0,0,255,31,2,102, + 2,139,0,17,0,0,21,54,55,54,55,54,53,52,39,51,22,21,20,7,6,7,6,7,169,112,107,47,26,22,150,25,76,79,165,105,189,70,5,113, + 109,143,80,79,96,96,78,111,170,160,166,113,72,6,0,0,0,1,0,178,3,254,1,215,5,213,0,5,0,0,1,51,21,3,35,19,1,4,211,164, + 129,82,5,213,152,254,193,1,63,0,0,0,0,1,0,87,0,206,4,5,4,76,0,9,0,0,19,33,27,1,33,5,19,37,5,19,87,1,103,112, + 112,1,103,254,222,111,254,220,254,220,111,2,247,1,85,254,171,212,254,171,211,211,1,85,0,1,0,130,255,236,6,235,2,157,0,29,0,0,1,22, + 21,20,7,6,5,4,35,34,39,36,17,52,55,51,6,21,20,23,22,51,50,37,36,55,54,53,52,39,6,220,15,76,128,254,195,254,227,185,191,129, + 254,182,63,184,65,203,104,151,185,1,9,0,255,67,55,25,2,157,90,70,135,101,171,64,58,38,97,1,12,138,92,94,136,125,67,34,57,54,113,93, + 75,59,61,0,0,2,0,107,254,72,5,155,3,217,0,15,0,56,0,0,1,54,53,52,39,38,7,6,7,6,7,20,23,22,51,50,1,50,55,36, + 17,6,35,34,39,38,53,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,37,38,39,38,53,52,55,51,6,7,6,23,22,4,168,41, + 66,31,44,52,40,40,1,55,40,42,72,253,128,240,162,1,74,63,122,133,75,98,8,23,150,78,76,99,57,103,39,33,60,92,243,206,254,206,211,133, + 77,82,183,85,3,1,12,53,2,25,43,77,59,51,25,1,1,42,41,51,80,38,25,253,6,115,234,1,72,75,67,87,129,52,44,148,69,36,50,90, + 119,102,160,204,140,213,189,159,1,1,191,110,174,180,216,185,155,60,52,229,0,1,1,201,4,209,2,55,7,25,0,3,0,0,1,17,51,17,1,201, + 110,4,209,2,72,253,184,0,0,1,0,122,5,50,1,209,6,234,0,24,0,0,19,55,38,39,38,53,52,55,54,51,50,23,21,38,35,34,7,6, + 21,20,23,22,55,21,5,122,78,44,16,16,56,58,92,62,52,50,64,66,17,29,94,33,120,254,169,5,150,18,20,36,37,45,96,43,45,33,100,33, + 18,32,26,77,27,10,29,102,77,0,0,0,255,255,0,130,255,236,6,235,4,153,16,38,5,142,0,0,16,7,5,75,1,132,253,168,255,255,0,130, + 255,236,6,235,4,26,16,38,5,142,0,0,16,7,22,200,3,57,3,132,255,255,0,130,254,12,6,235,2,157,16,38,5,142,0,0,16,7,22,200, + 3,57,255,6,255,255,0,130,254,144,6,235,3,32,16,38,5,142,0,0,16,39,22,197,2,188,2,138,16,7,22,213,2,169,254,144,255,255,0,130, + 255,236,6,235,3,182,16,38,5,142,0,0,16,7,22,199,2,188,3,32,255,255,0,130,254,12,6,235,2,157,16,38,5,142,0,0,16,7,22,199, + 2,188,255,6,255,255,0,130,255,236,6,235,4,26,16,38,5,142,0,0,16,7,22,201,2,188,3,132,255,255,0,130,254,12,6,235,2,157,16,38, + 5,142,0,0,16,7,22,201,2,188,255,6,255,255,0,157,254,12,5,40,5,175,16,38,5,90,0,0,16,7,5,124,0,138,255,56,255,255,0,157, + 254,12,5,40,5,170,16,38,5,90,0,0,16,7,22,200,2,63,5,20,255,255,0,157,254,12,5,40,3,102,16,38,5,90,0,0,16,7,22,197, + 2,138,0,25,255,255,0,157,254,12,5,40,3,102,16,38,5,90,0,0,16,7,22,200,3,7,0,175,255,255,0,157,254,12,5,40,5,170,16,38, + 5,90,0,0,16,7,22,198,1,194,4,26,255,255,0,157,254,12,5,40,3,102,16,38,5,90,0,0,16,7,22,199,2,150,0,150,255,255,0,157, + 254,12,5,40,3,102,16,38,5,90,0,0,16,7,22,201,2,150,0,175,255,255,0,125,255,218,3,27,5,247,16,38,5,92,0,0,16,7,5,75, + 255,194,255,6,255,255,0,125,254,144,3,27,3,82,16,38,5,92,0,0,16,7,22,213,1,25,254,144,255,255,0,125,254,162,3,27,3,82,16,38, + 5,92,0,0,16,7,22,196,1,169,254,162,255,255,0,125,254,162,3,27,5,247,16,39,22,196,1,169,254,162,16,38,5,92,0,0,16,7,5,75, + 255,194,255,6,255,255,0,125,255,218,3,27,4,176,16,38,5,92,0,0,16,7,22,197,0,250,4,26,255,255,0,125,254,212,3,27,3,82,16,38, + 5,92,0,0,16,7,22,197,1,43,254,212,255,255,0,125,255,218,3,27,5,170,16,38,5,92,0,0,16,7,22,198,0,250,4,26,255,255,0,125, + 255,218,3,27,5,120,16,38,5,92,0,0,16,7,22,199,0,250,4,226,255,255,0,125,255,218,3,27,5,170,16,38,5,92,0,0,16,7,22,201, + 0,250,5,20,255,255,255,171,254,12,3,193,5,47,16,39,5,75,0,188,254,62,16,6,5,94,0,0,255,255,255,171,254,12,3,201,4,114,16,39, + 5,127,0,188,254,62,16,6,5,94,0,0,255,255,255,171,254,12,4,14,2,38,16,38,5,94,0,0,16,7,22,213,2,88,254,12,255,255,255,171, + 254,12,3,202,2,38,16,38,5,94,0,0,16,7,22,196,3,52,254,72,255,255,255,171,254,12,5,19,2,38,16,39,5,127,2,6,249,30,16,6, + 5,94,0,0,255,255,255,171,254,12,3,202,2,38,16,39,22,196,3,52,254,72,16,38,5,94,0,0,16,7,22,196,0,180,0,40,255,255,255,171, + 254,12,3,132,3,182,16,38,5,94,0,0,16,7,22,197,1,244,3,32,255,255,255,171,254,12,3,132,4,176,16,38,5,94,0,0,16,7,22,198, + 1,244,3,32,255,255,255,171,254,12,3,132,4,176,16,38,5,94,0,0,16,7,22,201,1,244,4,26,255,255,0,130,254,12,9,26,3,182,16,38, + 5,96,0,0,16,39,22,196,5,95,3,32,16,7,22,196,5,245,254,162,255,255,0,130,254,12,9,26,2,238,16,38,5,96,0,0,16,7,22,199, + 5,120,255,6,255,255,0,130,254,12,9,26,4,176,16,38,5,96,0,0,16,39,22,198,4,226,3,32,16,7,22,199,5,120,255,6,255,255,0,130, + 254,12,9,19,2,229,16,38,5,98,0,0,16,7,22,197,5,120,254,162,255,255,0,130,254,12,9,19,4,176,16,38,5,98,0,0,16,7,22,198, + 4,126,3,32,255,255,0,144,0,0,6,220,6,20,16,38,5,100,0,0,16,7,22,198,3,132,3,82,255,255,0,117,254,12,4,178,6,64,16,38, + 5,102,0,0,16,7,22,198,1,44,4,176,0,2,0,130,255,164,7,158,3,217,0,15,0,58,0,0,1,54,53,52,39,38,7,6,7,6,7,20, + 23,22,51,50,19,6,5,4,33,32,39,36,3,38,55,51,6,21,20,23,22,33,32,55,54,55,54,55,6,35,34,39,38,53,52,55,54,55,54,51, + 50,23,22,23,22,7,6,6,181,41,66,31,44,52,40,40,1,55,40,42,72,179,110,254,195,254,239,254,225,254,217,130,254,183,1,1,64,184,65,203, + 90,1,24,1,65,209,215,100,35,20,63,122,133,75,98,8,23,150,78,76,90,66,96,46,24,1,2,2,25,43,77,59,51,25,1,1,42,41,51,80, + 38,25,254,218,180,70,61,41,100,1,9,138,92,94,136,116,76,34,57,59,108,38,78,75,67,87,129,52,44,148,69,36,50,72,102,54,137,226,0,0, + 255,255,0,130,254,162,7,158,3,217,16,38,5,186,0,0,16,7,22,196,3,107,254,162,255,255,0,130,254,162,7,158,5,20,16,38,5,186,0,0, + 16,39,22,196,5,245,4,126,16,7,22,196,3,107,254,162,255,255,0,130,255,164,7,158,6,14,16,38,5,186,0,0,16,7,22,198,5,120,4,126, + 255,255,0,130,253,168,7,158,3,217,16,38,5,186,0,0,16,7,22,199,2,238,254,162,255,255,0,130,255,164,7,158,6,14,16,38,5,186,0,0, + 16,7,22,201,5,120,5,120,255,255,0,107,254,72,5,155,5,20,16,38,5,143,0,0,16,7,22,196,3,207,4,126,255,255,0,107,254,72,5,155, + 6,14,16,38,5,143,0,0,16,7,22,198,3,82,4,126,0,1,0,130,255,167,7,41,6,20,0,45,0,0,37,50,55,54,55,54,53,52,39,1, + 38,53,52,55,54,55,1,21,5,6,7,6,21,20,23,1,22,21,20,7,6,5,6,35,34,39,36,17,52,55,51,6,21,20,23,22,3,2,184,194, + 157,36,16,54,254,202,50,10,35,100,2,233,253,173,71,21,6,31,1,19,102,62,53,254,247,227,161,192,128,254,182,63,184,65,203,104,88,80,65,55, + 26,46,69,66,1,124,61,81,35,33,119,42,1,54,186,250,30,40,11,25,32,37,254,182,123,123,113,101,86,85,73,38,98,1,11,138,92,94,136,126, + 66,34,0,0,0,1,0,130,255,167,8,0,6,20,0,46,0,0,1,53,52,55,54,55,1,33,1,6,7,6,23,22,23,5,22,21,20,7,6,4, + 35,33,34,39,36,17,52,55,51,6,21,20,23,22,51,33,50,36,54,61,1,52,39,37,36,1,199,11,17,162,2,176,1,96,252,104,95,15,9,4, + 6,174,3,202,248,62,53,254,20,161,254,12,192,128,254,182,63,184,65,203,104,151,1,244,184,1,109,47,121,252,89,254,157,3,107,8,5,62,98,97, + 1,155,253,232,55,35,10,35,53,27,150,38,248,113,101,86,158,38,98,1,11,138,92,94,136,126,66,34,150,106,8,8,106,19,145,55,255,255,0,130, + 255,167,7,41,6,20,16,38,5,194,0,0,16,7,22,213,5,70,3,132,255,255,0,144,255,201,5,199,6,20,16,38,5,107,0,0,16,7,22,196, + 2,238,5,70,255,255,0,144,255,201,5,199,6,214,16,38,5,107,0,0,16,7,22,198,2,113,5,70,255,255,0,144,253,168,5,199,6,20,16,38, + 5,107,0,0,16,7,22,199,2,88,254,162,255,255,0,130,255,167,7,41,7,43,16,38,5,194,0,0,16,7,22,232,3,202,0,0,255,255,0,130, + 255,167,7,41,7,43,16,38,5,200,0,0,16,7,22,213,5,70,3,132,255,255,0,130,255,167,7,41,7,58,16,38,5,200,0,0,16,7,22,197, + 3,132,6,164,255,255,0,130,254,162,7,41,7,43,16,38,5,200,0,0,16,7,22,197,2,88,254,162,255,255,0,130,253,168,7,41,7,43,16,38, + 5,200,0,0,16,7,22,200,2,213,254,162,255,255,0,130,255,167,7,41,8,52,16,38,5,200,0,0,16,7,22,198,3,132,6,164,255,255,0,144, + 254,200,5,201,7,196,16,38,5,108,0,0,16,7,5,127,2,188,1,144,255,255,0,144,254,200,5,24,7,158,16,38,5,108,0,0,16,7,22,196, + 4,106,7,8,255,255,0,144,254,200,5,120,8,52,16,38,5,108,0,0,16,7,22,198,3,232,6,164,255,255,0,144,252,224,5,24,6,20,16,38, + 5,108,0,0,16,7,22,199,2,38,253,218,255,255,0,147,253,118,5,72,3,182,16,38,5,211,0,0,16,39,22,196,2,63,3,32,16,7,22,196, + 2,188,253,118,0,1,0,147,254,181,5,72,2,238,0,29,0,0,1,20,7,6,7,6,35,34,39,36,17,52,55,51,6,21,20,23,22,51,50,55, + 54,55,54,53,52,39,51,22,5,72,100,110,249,97,80,132,109,254,184,47,184,49,201,93,93,76,71,193,76,34,102,184,104,1,56,173,178,197,68,27, + 37,106,1,100,235,81,144,172,237,52,24,20,53,222,98,96,184,222,156,0,255,255,0,147,254,181,5,72,5,22,16,38,5,211,0,0,16,7,5,75, + 0,200,254,37,255,255,0,147,253,93,5,72,3,182,16,38,5,211,0,0,16,39,22,196,2,63,3,32,16,7,22,213,2,38,253,93,255,255,0,147, + 254,181,5,72,4,176,16,38,5,211,0,0,16,7,22,198,1,244,3,32,0,3,0,144,255,189,5,27,3,229,0,10,0,50,0,63,0,0,1,52, + 35,34,6,20,23,22,23,62,1,3,6,35,34,39,38,53,52,55,51,6,21,20,22,51,50,54,55,38,39,38,53,52,55,54,51,50,23,38,39,53, + 22,23,0,17,20,7,6,35,34,19,22,21,20,15,1,22,51,50,55,54,52,38,3,95,95,65,45,7,21,68,36,73,108,150,110,57,101,193,16,184, + 14,124,27,26,56,45,72,29,18,44,45,67,7,7,44,81,218,221,1,78,40,74,175,132,127,6,98,29,52,49,125,17,7,62,1,237,135,88,65,37, + 118,51,27,136,254,104,79,32,61,172,74,54,62,40,69,38,9,33,66,132,81,72,74,81,83,1,39,14,185,66,181,254,239,254,245,103,61,113,2,63, + 37,39,147,105,33,46,67,30,93,147,0,0,255,255,0,157,254,12,5,40,4,176,16,39,22,199,2,150,0,150,16,38,5,90,0,0,16,7,22,196, + 2,63,4,26,255,255,255,171,254,12,3,64,4,114,16,39,5,127,255,244,254,62,16,6,5,112,0,0,255,255,0,130,254,243,5,192,3,74,16,6, + 5,113,0,0,255,255,0,130,254,243,5,192,4,114,16,38,5,113,0,0,16,7,5,127,255,244,254,62,255,255,0,139,255,198,3,160,2,222,16,6, + 5,111,0,0,255,255,1,184,1,194,2,148,2,188,16,6,5,128,0,0,255,255,1,22,0,0,2,188,5,20,16,6,5,129,0,0,255,255,0,82, + 0,0,3,240,5,20,16,6,5,130,0,0,255,255,0,76,0,0,4,18,5,20,16,6,5,131,0,0,0,1,0,82,0,0,3,197,5,37,0,39, + 0,0,1,38,53,52,55,54,51,50,23,21,38,7,6,7,6,21,20,23,22,55,54,55,21,6,35,34,39,22,23,22,17,35,16,39,2,3,51,22, + 23,22,1,200,4,88,92,108,84,88,92,68,56,30,31,25,47,48,69,141,195,61,141,146,27,23,32,180,37,49,156,199,66,3,27,4,20,15,19,120, + 58,61,25,156,36,2,1,33,34,21,52,21,39,2,2,17,180,26,81,106,114,155,254,22,1,169,220,1,33,1,110,155,5,56,0,0,0,2,0,106, + 255,245,3,226,5,36,0,20,0,40,0,0,1,22,51,50,55,54,53,52,39,38,35,34,7,6,21,20,23,22,51,50,55,23,6,35,34,39,38,53, + 16,55,18,51,50,19,22,17,20,7,6,35,34,2,128,45,50,33,19,27,87,90,87,88,90,86,27,15,37,50,45,90,40,145,160,46,53,95,179,170, + 159,190,95,53,50,156,145,1,90,161,74,107,86,215,216,224,224,213,218,60,133,74,161,208,149,158,184,121,1,38,196,1,118,254,138,187,254,209,139,166, + 158,0,0,0,0,1,0,208,0,0,3,144,5,31,0,32,0,0,51,18,55,54,55,34,39,38,53,52,55,54,51,50,23,21,38,35,34,7,6,21, + 20,23,22,51,50,55,21,6,7,6,7,208,65,111,68,100,78,46,134,98,112,140,120,88,87,115,62,48,66,55,44,103,140,96,225,112,134,53,0,255, + 181,111,85,37,109,151,174,97,111,31,180,51,47,65,98,77,51,41,41,180,73,152,183,225,255,255,0,60,0,0,4,16,5,20,16,6,5,135,0,0, + 255,255,0,60,0,0,4,16,5,20,16,6,5,136,0,0,255,255,0,100,0,0,3,242,5,30,16,6,5,137,0,0,0,2,0,135,255,227,4,143, + 5,240,0,11,0,21,0,40,64,11,23,27,9,28,15,30,3,28,20,27,22,16,252,236,244,236,236,49,0,64,10,6,160,22,0,160,13,145,18,140, + 22,16,228,244,236,16,236,48,1,34,2,17,16,18,51,50,18,17,16,2,36,32,0,17,16,0,32,0,17,16,2,139,156,157,157,156,157,157,157,254, + 104,1,246,1,9,254,247,254,10,254,247,5,80,254,205,254,204,254,205,254,205,1,51,1,51,1,52,1,51,160,254,115,254,134,254,135,254,115,1,141, + 1,121,1,122,0,1,0,225,0,0,4,90,5,213,0,10,0,40,64,9,3,31,5,28,8,0,31,10,12,16,212,236,204,252,252,49,0,64,11,8, + 160,7,9,160,6,129,4,0,160,2,47,236,50,244,236,212,236,48,37,21,33,53,33,17,51,5,21,37,17,4,61,252,164,1,74,202,1,101,254,153, + 170,170,170,5,43,72,184,72,251,141,0,0,0,1,0,225,0,0,4,61,5,213,0,9,0,31,183,1,28,2,4,8,28,7,10,16,220,236,50,212, + 236,49,0,182,3,160,9,2,8,129,6,47,228,50,212,236,48,1,17,51,17,33,17,35,17,51,17,3,117,200,253,108,200,200,3,231,1,238,253,104, + 252,195,5,213,254,18,0,0,0,1,0,225,0,0,4,61,5,213,0,9,0,31,182,3,7,28,9,5,1,10,16,220,50,212,236,50,49,0,183,6, + 160,4,9,129,3,160,1,47,236,244,212,236,48,41,1,53,33,17,33,53,33,17,51,4,61,252,164,2,148,253,108,2,148,200,170,1,185,170,2,200, + 0,1,0,225,0,0,4,61,5,213,0,9,0,32,183,5,28,1,7,9,28,3,10,16,220,236,212,50,236,49,0,183,4,160,8,7,129,0,160,2, + 47,236,228,212,236,48,37,33,21,33,17,33,17,51,17,33,1,169,2,148,252,164,2,148,200,253,108,170,170,3,13,2,200,252,142,0,0,1,0,225, + 0,0,4,61,5,213,0,7,0,27,181,0,5,1,28,3,8,16,220,236,50,196,49,0,182,12,6,160,0,4,129,2,47,228,212,236,48,1,33,17, + 35,17,51,17,33,4,61,253,108,200,200,2,148,2,214,253,42,5,213,253,171,0,0,0,0,1,0,225,0,0,4,61,5,213,0,7,0,27,182,1, + 28,7,5,28,3,8,16,220,236,212,236,49,0,181,6,160,2,4,129,0,47,228,212,236,48,33,35,17,33,17,51,17,33,4,61,200,253,108,200,2, + 148,2,99,3,114,253,56,0,0,1,0,214,0,0,4,65,5,213,0,7,0,39,181,2,0,6,28,4,8,16,220,252,204,57,49,0,180,1,0,5, + 129,3,47,236,220,204,48,182,7,135,6,135,1,2,1,7,16,4,236,5,236,1,21,1,35,17,51,17,1,4,65,253,147,254,201,2,83,4,117,195, + 252,78,5,213,250,219,3,197,0,2,0,214,0,0,4,65,5,213,0,2,0,9,0,40,182,11,7,5,0,28,3,10,16,220,252,60,220,204,0,181, + 2,160,6,4,129,9,47,244,220,236,180,0,1,7,8,8,16,7,5,220,4,60,49,48,37,1,33,3,51,17,33,21,1,35,1,159,1,254,254,2, + 201,201,2,162,253,147,254,176,3,29,2,8,254,160,195,252,78,0,0,0,0,2,0,157,0,0,4,123,5,238,0,11,0,30,0,50,64,14,32,69, + 7,28,26,22,30,28,14,1,28,19,69,31,16,252,236,220,178,64,14,1,93,252,57,220,236,236,49,0,64,9,3,149,14,30,9,149,22,145,12,47, + 244,236,212,60,236,48,0,20,30,1,50,62,1,52,46,1,34,6,1,35,17,38,39,46,1,52,62,1,51,50,30,1,20,6,7,6,7,1,57,91, + 156,184,157,90,90,157,184,156,1,95,200,80,71,114,133,133,228,134,135,228,132,132,114,69,77,4,187,112,96,55,55,96,112,95,56,56,250,230,3,31, + 11,30,49,167,197,167,98,98,167,197,167,49,29,12,0,0,0,1,0,193,0,0,1,121,5,213,0,3,0,21,64,10,0,175,2,5,4,2,8,0, + 4,4,16,252,252,236,49,0,47,236,48,19,51,17,35,193,184,184,5,213,250,43,0,0,0,2,0,113,255,227,4,33,3,147,0,7,0,15,0,47, + 64,10,17,69,5,28,13,1,28,9,69,16,16,244,236,212,182,16,13,48,13,160,13,3,93,236,236,49,0,64,9,7,160,11,16,3,160,15,140,16, + 16,244,236,16,212,236,48,0,16,22,32,54,16,38,32,0,16,0,32,0,16,0,32,1,13,185,1,6,185,185,254,250,254,171,1,21,1,134,1,21, + 254,235,254,122,2,62,254,250,185,185,1,6,185,254,1,1,134,1,21,254,235,254,122,254,235,0,0,0,0,1,0,61,0,0,3,39,5,217,0,8, + 0,43,64,11,0,6,3,2,1,3,28,7,8,6,9,16,220,196,50,252,196,50,17,18,57,49,0,64,9,0,6,3,3,4,1,7,129,4,47,236, + 50,17,23,57,48,1,19,51,1,17,35,17,1,51,1,178,179,194,254,231,184,254,231,194,4,54,1,163,253,81,252,214,3,42,2,175,0,1,0,61, + 0,0,4,127,3,113,0,6,0,0,51,1,51,1,35,9,1,61,1,164,250,1,164,195,254,162,254,162,3,113,252,143,2,189,253,67,0,1,0,186, + 0,0,4,129,3,113,0,7,0,32,64,10,9,4,7,28,5,4,28,2,4,8,16,252,236,212,252,236,49,0,181,6,3,163,5,160,1,47,236,244, + 60,48,41,1,17,51,17,33,17,51,4,129,252,57,185,2,85,185,3,113,253,34,2,222,0,1,0,186,0,0,4,129,3,113,0,7,0,32,64,9, + 9,4,0,28,5,3,6,4,8,16,252,60,212,252,236,49,0,182,6,160,0,163,4,160,2,47,236,244,236,48,1,17,33,53,33,17,33,53,4,129, + 252,57,3,14,252,242,3,113,252,143,147,2,75,147,0,0,0,2,0,113,0,0,4,79,5,226,0,21,0,33,0,62,64,15,35,69,1,29,28,17, + 21,28,6,23,28,4,11,69,34,16,252,196,236,220,178,64,6,1,93,252,220,178,64,17,1,93,236,196,236,49,0,64,12,26,149,6,21,32,149,14, + 145,0,5,160,2,47,236,50,244,236,212,60,236,48,37,33,21,33,53,33,17,38,39,46,1,52,62,1,32,30,1,20,6,7,6,7,0,20,30,1, + 50,62,1,52,46,1,34,6,2,188,1,135,252,58,1,135,82,74,114,133,133,228,1,12,230,131,131,115,75,82,254,81,91,156,184,157,90,90,157,184, + 156,147,147,147,2,123,11,32,49,168,197,169,98,98,169,197,168,49,32,11,1,159,112,96,56,56,96,112,96,56,56,0,0,2,0,186,0,0,4,129, + 4,166,0,8,0,12,0,37,64,10,3,6,0,5,12,4,14,11,4,13,16,236,220,252,212,204,204,50,49,0,182,2,3,6,8,11,160,9,47,236, + 220,220,220,204,48,1,16,51,21,34,7,51,21,35,1,33,53,33,2,17,242,132,2,133,241,2,112,252,57,3,199,3,156,1,10,102,154,158,252,248, + 147,0,0,0,0,2,0,113,0,0,5,231,5,238,0,17,0,27,0,50,64,14,29,3,8,5,8,18,8,6,0,25,8,13,69,28,16,252,236,212, + 60,236,50,212,252,204,49,0,64,11,7,9,5,160,27,1,22,160,14,145,3,47,244,236,212,60,236,50,204,48,1,21,33,17,35,17,33,17,35,17, + 35,34,38,16,54,32,23,22,3,53,52,39,38,34,6,20,22,51,3,113,2,118,185,254,67,156,248,188,176,177,1,102,94,139,156,93,56,198,109,114, + 94,4,58,201,252,143,2,222,254,196,1,60,214,1,85,229,102,152,254,129,201,131,93,56,152,198,131,0,0,1,0,193,0,0,3,68,5,213,0,9, + 0,39,64,10,11,5,9,19,0,6,28,3,4,10,16,252,252,60,252,60,204,49,0,64,9,7,160,9,1,6,160,4,175,1,47,244,236,16,220,236, + 48,1,17,35,17,33,21,33,17,33,21,1,121,184,2,131,254,53,1,203,2,223,253,33,5,213,147,254,47,146,0,0,0,1,0,61,0,0,2,192, + 5,213,0,9,0,39,64,10,11,4,3,18,1,7,19,9,5,10,16,220,60,252,60,252,236,49,0,64,9,7,160,9,2,6,160,4,175,2,47,244, + 236,16,220,236,48,1,17,51,17,33,21,33,17,33,21,2,8,184,253,125,1,203,254,53,2,223,253,33,5,213,147,254,47,146,0,0,0,2,0,186, + 0,0,4,8,5,213,0,10,0,23,0,37,64,11,25,27,7,28,15,23,2,28,21,4,24,16,252,252,60,212,236,236,49,0,183,1,160,11,22,129, + 3,160,20,47,236,236,212,236,48,1,33,17,33,50,55,54,53,52,39,38,39,50,23,22,21,20,7,6,35,33,17,51,17,2,156,254,208,1,44,82, + 52,44,44,61,25,105,127,88,88,88,108,253,206,185,2,222,253,181,93,79,122,125,73,95,147,135,95,210,173,135,133,5,213,253,156,0,0,1,0,193, + 0,0,4,36,5,213,0,16,0,59,64,10,18,4,16,6,28,12,7,13,4,17,16,244,220,178,95,7,1,93,57,252,212,236,0,64,9,1,12,6, + 13,0,160,14,129,6,47,244,236,57,17,57,57,64,7,1,18,0,18,12,13,12,7,16,5,236,236,49,48,1,19,22,23,22,18,7,35,52,2,39, + 38,39,3,53,33,21,1,189,157,136,52,66,11,1,184,27,53,77,137,195,3,99,5,65,254,239,234,184,230,254,201,113,153,1,95,150,220,220,1,57, + 86,147,0,0,0,1,0,61,0,0,2,12,5,213,0,6,0,52,183,8,3,2,4,28,0,2,7,16,212,220,252,17,57,204,49,0,64,11,1,18, + 0,18,2,3,2,2,3,129,5,47,244,204,178,31,2,1,93,7,16,4,236,236,180,141,1,141,0,2,93,48,9,1,53,1,51,17,35,1,84,254, + 233,1,21,186,184,4,223,254,199,246,1,57,250,43,0,0,0,3,0,193,0,0,6,235,4,26,0,15,0,24,0,33,0,45,64,13,35,4,14,28, + 16,22,28,25,31,28,1,4,34,16,252,236,212,236,212,252,236,49,0,64,10,19,160,10,28,160,4,24,33,160,0,47,236,50,212,236,212,236,48,51, + 17,52,18,51,50,22,23,62,1,51,50,23,22,21,17,3,52,38,35,34,6,21,17,33,1,52,38,35,34,6,29,1,33,193,244,198,125,120,53,37, + 150,211,210,94,136,186,164,90,129,127,1,254,253,72,164,90,108,148,1,254,1,238,166,0,255,75,45,45,210,88,128,104,253,38,2,124,130,128,197,149, + 254,110,1,99,131,127,167,210,242,0,0,0,0,1,0,61,0,0,3,139,5,213,0,11,0,38,64,11,13,8,31,10,6,28,4,0,31,2,12,16, + 220,252,60,252,60,252,204,49,0,182,9,1,2,6,4,129,11,47,244,220,60,220,60,48,1,33,53,33,17,51,17,33,21,33,17,35,1,136,254,181, + 1,75,184,1,75,254,181,184,3,128,148,1,193,254,63,148,252,128,0,0,0,1,0,61,0,0,6,8,5,213,0,19,0,57,64,16,21,12,31,10, + 14,28,16,8,6,18,28,0,4,31,2,20,16,220,252,60,252,60,220,60,252,60,252,204,49,0,64,12,1,17,13,160,3,7,11,5,9,129,19,15, + 47,60,244,60,220,60,60,252,60,60,48,33,17,33,53,33,17,51,17,33,17,51,17,33,21,33,17,35,17,33,17,1,136,254,181,1,75,185,1,195, + 184,1,76,254,180,184,254,61,3,129,147,1,193,254,63,1,193,254,63,147,252,127,3,129,252,127,0,0,0,2,0,186,0,0,4,129,3,113,0,3, + 0,7,0,33,64,10,9,4,1,28,7,5,28,3,4,8,16,252,236,212,252,236,49,0,182,4,160,0,163,6,160,2,47,236,244,236,48,1,17,33, + 17,23,17,33,17,4,129,252,57,185,2,85,3,113,252,143,3,113,147,253,181,2,75,0,0,2,0,61,0,0,4,195,5,213,0,2,0,6,0,61, + 179,8,3,6,7,16,212,196,196,49,0,183,66,1,149,6,129,2,149,5,47,236,244,236,48,75,83,88,64,18,2,17,4,1,2,0,17,3,3,4, + 2,17,5,1,17,6,6,5,5,7,16,236,16,236,7,16,236,8,16,236,89,1,33,9,2,35,1,3,198,253,116,1,70,2,67,254,48,230,254,48, + 5,66,251,126,5,21,250,43,5,213,0,0,0,3,0,193,0,0,5,110,5,213,0,10,0,14,0,29,0,52,64,15,31,27,5,28,20,26,0,28, + 15,14,12,28,28,4,30,16,252,236,220,60,252,60,212,236,236,49,0,64,12,25,11,160,1,29,10,160,16,129,13,160,27,47,236,244,236,220,60,236, + 50,48,1,51,50,55,54,53,52,39,38,43,1,1,17,33,25,1,33,50,23,22,21,6,7,6,47,1,17,33,17,33,3,109,168,93,37,31,31,29, + 105,164,254,13,1,59,1,176,132,64,69,1,68,92,140,212,253,84,1,244,3,113,81,69,61,60,100,94,253,156,253,181,2,75,2,247,133,144,124,145, + 91,124,1,1,253,34,3,113,0,1,0,193,0,0,3,125,5,213,0,11,0,40,64,12,13,4,0,28,10,2,8,4,28,6,4,12,16,252,252,60, + 220,60,252,236,49,0,183,5,3,160,7,9,11,129,1,47,244,220,204,252,204,48,33,35,17,33,17,35,17,51,17,33,17,51,3,125,184,254,181,185, + 185,1,75,184,3,129,254,252,2,155,254,252,1,193,0,0,0,2,0,112,0,0,5,10,5,213,0,10,0,27,0,46,64,13,29,4,26,31,24,11, + 28,13,1,7,19,27,28,16,252,204,212,60,252,60,252,236,49,0,64,10,27,14,160,0,25,2,160,23,129,12,47,244,236,212,60,236,50,48,1,33, + 17,33,34,7,6,21,20,23,22,5,17,35,17,33,34,39,38,53,52,55,54,51,33,17,33,21,1,220,1,48,254,212,82,52,44,44,61,2,39,185, + 254,171,107,125,88,88,88,108,2,50,1,76,2,247,2,75,93,79,122,125,73,95,147,253,156,2,100,135,95,210,173,135,133,253,34,147,0,1,0,61, + 0,0,3,139,5,213,0,7,0,31,64,9,9,0,31,2,28,4,31,6,8,16,220,252,252,252,204,49,0,181,5,2,160,7,129,3,47,244,236,50, + 48,1,21,33,17,35,17,33,53,3,139,254,181,184,254,181,5,213,147,250,190,5,66,147,0,2,0,61,0,0,4,195,5,213,0,2,0,6,0,61, + 179,8,3,4,7,16,212,196,196,49,0,183,66,1,149,5,129,2,160,4,47,236,244,236,48,75,83,88,64,18,1,17,6,2,1,0,17,3,3,6, + 1,17,5,2,17,4,4,5,5,7,16,236,16,236,7,16,236,8,16,236,89,37,9,1,5,33,1,51,3,198,254,186,254,186,3,137,251,122,1,208, + 230,147,4,130,251,126,147,5,213,0,0,0,0,2,0,113,0,0,4,79,5,213,0,26,0,38,0,0,1,53,33,53,33,17,22,23,30,1,20,6, + 7,6,7,17,35,17,38,39,46,1,52,55,54,55,54,2,20,30,1,50,62,1,52,46,1,34,6,2,4,254,181,2,3,88,69,114,132,132,114,74, + 83,184,82,74,114,133,67,69,111,74,165,91,156,184,157,90,90,157,184,156,4,79,243,147,254,123,13,30,50,166,198,166,49,32,11,254,123,1,134,11, + 31,49,166,198,83,86,47,31,254,222,112,95,56,56,95,112,96,56,56,0,0,1,0,193,0,0,3,125,5,213,0,7,0,32,64,10,9,4,3,28, + 1,5,28,7,4,8,16,252,236,212,236,236,49,0,181,6,4,160,0,129,2,47,244,252,204,48,1,17,35,17,33,17,35,17,3,125,184,254,181,185, + 5,213,250,43,5,66,254,197,1,206,0,0,0,1,0,193,0,0,3,125,4,230,0,9,0,35,64,11,11,4,1,28,3,9,5,28,7,4,10,16, + 252,252,60,220,252,236,49,0,181,8,0,160,6,4,2,47,212,204,252,204,48,1,17,35,17,33,17,35,17,51,17,3,125,184,254,181,185,185,3,226, + 252,30,3,79,254,252,2,155,254,252,0,0,0,2,0,193,0,0,3,109,5,213,0,3,0,11,0,43,64,12,13,4,10,28,6,3,1,28,4,8, + 4,12,16,252,60,236,220,60,252,236,49,0,64,10,0,160,5,7,160,9,129,2,160,11,47,236,244,236,212,236,48,1,17,33,17,37,33,17,33,53, + 33,17,33,1,122,1,59,254,12,1,244,254,12,2,172,253,84,2,222,253,181,2,75,147,1,209,147,250,43,0,0,0,0,2,0,113,0,0,4,79, + 5,213,0,11,0,36,0,61,64,15,38,69,7,28,17,12,21,28,34,24,1,28,29,69,37,16,252,236,220,178,64,24,1,93,60,252,60,220,178,64, + 17,1,93,236,236,49,0,64,11,3,149,24,21,10,149,12,34,35,129,22,47,236,212,60,236,212,60,236,48,0,20,30,1,50,62,1,52,46,1,34, + 6,37,22,23,30,1,20,6,7,6,7,17,35,17,38,39,46,1,52,55,54,55,54,55,17,51,1,13,91,156,184,157,90,90,157,184,156,1,84,88, + 69,114,132,132,114,74,83,184,82,74,114,133,67,69,111,74,82,184,3,34,112,95,56,56,95,112,96,56,56,206,13,30,50,166,198,166,49,32,11,254, + 123,1,134,11,31,49,166,198,83,86,47,31,11,1,134,0,0,2,0,113,0,0,4,79,5,213,0,28,0,40,0,0,1,22,23,30,1,20,6,7, + 6,7,17,35,17,38,39,46,1,52,55,54,55,54,55,53,33,53,33,21,33,0,20,30,1,50,62,1,52,46,1,34,6,2,188,88,69,114,132,132, + 114,74,83,184,82,74,114,133,67,69,111,74,82,254,181,3,78,254,181,254,81,91,156,184,157,90,90,157,184,156,4,80,13,30,50,166,198,166,49,32, + 11,254,123,1,134,11,31,49,166,198,83,86,47,31,11,243,147,147,253,224,112,95,56,56,95,112,96,56,56,0,0,0,0,1,0,217,5,98,3,47, + 5,246,0,3,0,16,178,2,0,4,16,220,204,49,0,178,1,160,3,47,236,48,19,33,21,33,217,2,86,253,170,5,246,148,0,0,0,1,0,66, + 4,224,3,190,6,102,0,19,0,0,1,3,14,1,35,34,38,47,1,7,35,19,51,23,30,1,51,50,63,1,3,190,162,17,69,61,57,81,27,99, + 180,139,245,148,116,5,50,13,37,19,120,6,102,254,188,34,32,37,47,175,245,1,120,224,10,28,36,226,0,1,1,164,5,68,2,112,6,16,0,3, + 0,15,178,2,8,0,47,236,49,0,178,1,8,3,47,236,48,1,51,21,35,1,164,204,204,6,16,204,0,1,0,191,4,238,3,61,6,102,0,6, + 0,55,180,4,2,117,6,7,16,220,236,57,49,0,182,4,5,2,180,0,179,7,16,244,236,50,57,48,0,75,176,9,84,75,176,14,84,91,88,189, + 0,7,255,192,0,1,0,7,0,7,0,64,56,17,55,56,89,1,51,19,35,39,7,35,1,180,148,245,139,180,180,139,6,102,254,136,245,245,0,0, + 0,1,0,91,4,238,3,165,6,102,0,6,0,69,179,5,6,2,7,16,220,204,57,49,0,182,6,0,5,3,160,0,7,16,220,252,204,17,57,48, + 183,3,160,6,4,160,5,6,5,7,5,16,236,16,236,64,9,85,6,101,6,117,6,133,6,4,64,11,41,4,57,4,73,4,85,5,101,5,5,1, + 93,0,93,1,33,53,5,39,51,5,3,165,252,182,2,123,236,182,1,5,4,238,148,2,230,228,0,0,0,1,0,66,4,224,3,190,6,102,0,19, + 0,0,19,51,23,22,51,50,54,63,1,51,19,35,39,7,14,1,35,34,38,39,66,139,120,19,37,13,50,5,116,148,245,139,180,99,27,81,57,61, + 69,17,6,102,226,36,28,10,224,254,136,245,175,47,37,32,34,0,0,0,0,1,0,91,4,238,3,165,6,102,0,6,0,67,179,2,5,1,7,16, + 220,204,57,49,0,182,1,0,2,4,160,0,7,16,220,252,204,17,57,48,183,4,160,1,3,160,2,1,2,7,5,16,236,16,236,64,20,85,1,101, + 1,117,1,133,1,4,38,3,54,3,70,3,90,2,106,2,5,1,93,0,93,19,53,37,51,7,37,21,91,1,5,182,236,2,123,4,238,148,228,230, + 2,148,0,0,0,1,1,154,254,135,2,102,255,83,0,3,0,15,178,2,8,0,47,236,49,0,178,3,8,1,47,236,48,5,51,21,35,1,154,204, + 204,173,204,0,0,2,0,213,5,70,3,39,6,16,0,3,0,7,0,24,181,2,8,0,4,8,6,47,252,220,236,49,0,180,5,1,8,7,3,47, + 60,252,60,48,1,51,21,35,37,51,21,35,2,92,203,203,254,121,203,203,6,16,202,202,202,0,0,0,0,1,0,200,4,117,1,186,6,20,0,8, + 0,28,183,10,4,0,5,3,7,4,9,16,252,60,220,220,236,49,0,180,2,3,8,160,6,47,236,220,204,48,1,16,35,53,50,55,35,53,51,1, + 186,242,132,2,133,241,5,128,254,245,103,154,158,0,0,0,0,1,0,200,4,117,1,186,6,20,0,8,0,28,183,10,4,6,3,5,8,4,9,16, + 252,220,220,60,236,49,0,180,2,3,7,160,5,47,236,220,204,48,19,16,51,21,34,7,51,21,35,200,242,132,2,133,241,5,9,1,11,103,154,158, + 0,2,0,100,0,0,4,23,3,251,0,3,0,7,0,28,182,9,6,2,8,0,4,8,16,220,220,252,220,204,49,0,181,1,8,3,5,160,7,47, + 236,212,236,48,1,51,21,35,1,33,21,33,1,215,204,204,254,141,3,179,252,77,3,251,204,253,100,147,0,3,0,100,0,0,4,23,3,222,0,3, + 0,7,0,11,0,39,64,9,13,10,6,2,8,4,0,8,12,16,220,220,60,252,60,220,204,49,0,64,9,9,160,11,1,8,3,5,8,7,47,236, + 212,236,212,236,48,1,51,21,35,21,51,21,35,1,33,21,33,1,215,204,204,204,204,254,141,3,179,252,77,2,132,204,236,204,3,222,146,0,0,0, + 0,1,255,236,0,0,2,247,0,147,0,3,0,18,179,2,5,0,4,16,196,220,196,49,0,178,1,160,3,47,236,48,39,33,21,33,20,3,11,252, + 245,147,147,0,0,5,0,176,254,230,4,145,6,39,0,3,0,7,0,30,0,39,0,47,0,0,1,17,51,17,3,17,51,25,1,33,17,33,17,51, + 17,22,23,22,21,20,6,7,30,1,21,20,7,6,39,17,35,19,17,54,55,54,53,52,39,38,3,17,54,55,54,53,52,38,1,110,205,205,205,254, + 117,1,139,100,209,114,117,120,116,139,155,128,129,241,100,100,120,62,68,68,62,120,152,73,73,146,4,137,254,118,1,138,253,231,254,33,1,223,253,144, + 5,26,1,13,254,243,2,82,84,154,120,142,18,28,177,133,175,96,97,2,254,230,5,163,254,119,4,44,48,100,99,49,45,253,235,254,33,1,58,59, + 122,123,116,0,0,3,0,130,255,235,4,219,4,123,0,7,0,15,0,42,0,76,64,15,36,8,37,16,8,22,14,6,10,2,18,27,20,69,43,16, + 252,60,244,60,212,60,60,236,220,252,64,6,33,31,29,3,27,35,17,18,23,57,49,0,64,8,0,22,4,135,18,140,36,43,16,60,244,236,212,196, + 64,9,12,25,8,135,40,135,29,184,43,16,252,236,236,212,196,48,37,34,21,20,51,50,53,52,3,34,21,20,51,50,53,52,19,20,35,34,53,52, + 33,17,6,35,34,53,52,51,50,23,54,51,32,25,1,35,17,52,35,34,7,1,104,63,63,65,65,63,63,65,184,249,230,1,39,43,22,230,230,168, + 44,76,189,1,150,184,226,137,87,240,64,64,64,64,3,7,64,64,64,64,252,193,205,201,208,1,112,8,216,183,81,81,254,190,252,199,3,57,170,142, + 0,2,0,139,255,221,5,135,4,140,0,7,0,47,0,64,64,14,49,28,15,18,40,6,46,2,10,20,18,35,69,48,16,252,236,60,204,220,204,220, + 252,60,204,49,0,64,19,25,135,30,22,135,33,140,48,18,135,37,4,8,0,42,135,13,184,48,16,252,236,204,220,204,220,244,16,244,236,212,236,48, + 1,34,21,20,51,50,53,52,3,34,53,52,36,51,32,17,16,13,1,4,21,20,33,50,54,51,50,23,7,38,35,34,6,35,32,53,52,45,1,54, + 53,52,33,34,7,22,21,20,1,96,64,64,64,67,210,1,118,187,2,66,254,153,254,238,254,196,1,15,137,213,168,159,138,134,105,85,118,203,171,254, + 58,1,214,1,14,215,254,107,110,76,63,3,111,64,64,64,64,254,236,228,137,196,254,171,254,236,78,59,69,106,102,142,213,97,145,127,249,239,101,58, + 46,154,186,56,56,85,216,0,0,3,0,137,255,236,4,244,4,140,0,7,0,14,0,56,0,0,1,22,51,50,55,38,39,34,18,50,53,52,34,29, + 1,37,52,55,38,53,52,55,54,33,32,23,22,25,1,35,17,52,39,38,35,32,7,6,21,54,51,32,16,35,34,39,6,21,20,23,54,51,50,21, + 20,35,32,1,105,54,5,23,48,73,1,18,75,104,104,254,175,42,41,133,147,1,55,1,33,139,111,184,94,82,191,254,253,88,59,42,58,1,4,250, + 57,20,28,22,23,171,204,204,254,117,2,96,20,18,17,1,254,16,47,39,34,4,173,127,128,54,79,212,102,113,179,143,254,247,253,191,2,65,188,133, + 116,113,76,73,19,254,182,11,36,92,57,46,141,200,182,0,0,2,0,109,254,24,3,81,4,140,0,25,0,33,0,54,64,13,6,8,17,13,8,12, + 0,32,22,28,0,69,34,16,252,204,220,204,16,212,252,220,252,49,0,64,14,30,24,26,20,135,3,184,34,13,15,135,9,189,34,16,252,236,204,16, + 252,236,196,220,196,48,19,52,54,51,32,25,1,16,6,35,34,38,39,55,22,51,50,53,17,16,35,22,7,6,39,38,19,38,23,6,55,22,39,54, + 109,162,221,1,101,154,205,214,116,13,189,34,120,175,130,3,1,5,216,208,214,67,3,2,66,67,3,1,3,166,113,117,253,244,253,143,254,249,240,208, + 141,10,209,243,2,223,1,104,21,33,207,1,1,1,9,1,65,67,3,2,66,66,0,0,0,2,0,127,255,255,4,151,4,154,0,11,0,41,0,50, + 64,13,16,18,19,29,9,21,3,25,35,18,38,69,42,16,252,236,212,204,212,204,220,60,236,49,0,64,11,31,135,12,184,42,0,37,27,6,23,18, + 47,212,204,212,196,204,16,244,236,48,1,34,6,21,20,22,51,50,54,53,52,38,3,32,23,22,25,1,7,19,52,39,20,39,38,53,52,51,50,23, + 16,5,6,7,6,29,1,35,53,52,55,54,2,176,36,28,32,32,37,27,32,85,1,37,124,123,184,1,101,200,217,218,244,54,254,153,227,76,17,184, + 30,106,2,96,32,32,37,27,34,30,37,27,2,58,121,120,254,217,253,126,1,1,41,142,82,166,1,2,183,192,104,1,150,6,4,134,30,134,75,75, + 170,62,220,0,0,2,0,139,254,32,5,134,4,140,0,11,0,54,0,53,64,14,31,18,18,36,45,9,51,3,23,18,12,40,69,55,16,252,60,236, + 204,212,204,212,60,252,60,49,0,64,13,6,53,0,47,135,16,184,55,25,135,38,140,55,16,244,236,16,244,236,204,212,204,1,34,6,21,20,22,51, + 50,54,53,52,38,7,52,55,54,51,32,17,20,13,1,6,21,20,33,50,55,54,51,50,21,16,19,7,2,17,2,33,32,53,52,45,1,54,53,52, + 33,34,7,22,7,6,35,34,1,96,36,28,32,32,37,27,32,245,231,144,186,2,66,254,153,254,173,251,1,15,239,121,35,120,151,148,144,190,74,254, + 105,254,58,1,149,1,79,215,254,107,110,76,73,16,26,191,210,3,111,32,32,37,27,34,30,37,27,48,137,121,75,254,233,254,112,106,78,100,102,239, + 68,215,254,252,254,148,81,1,99,1,119,254,245,249,216,127,105,67,145,124,56,53,115,189,0,2,0,115,255,239,4,244,4,149,0,11,0,42,0,59, + 64,14,38,8,37,3,20,9,29,24,32,8,12,16,69,43,16,252,60,236,220,204,204,212,204,220,236,49,0,64,16,34,135,41,140,43,29,135,28,0, + 22,6,18,184,38,188,43,16,236,244,204,212,204,212,236,16,244,236,48,1,50,54,53,52,38,39,38,6,21,20,22,1,52,55,38,55,18,5,22,21, + 20,7,6,39,22,23,22,55,21,7,6,21,20,5,4,25,1,51,17,16,37,36,1,230,36,28,33,31,37,27,32,254,173,165,166,1,1,1,108,220, + 221,129,54,2,90,65,144,141,147,1,139,1,124,184,253,204,253,179,3,149,32,32,36,27,1,1,33,32,36,28,253,152,143,86,109,234,1,45,1,1, + 183,198,2,1,136,189,71,52,12,161,23,24,112,168,6,6,1,190,2,63,253,193,253,180,1,1,0,0,0,2,0,186,255,227,4,188,4,123,0,7, + 0,28,0,49,64,11,9,8,28,6,16,2,14,8,20,70,29,16,252,236,204,220,204,220,236,49,0,64,6,11,135,24,184,8,29,16,60,252,236,64, + 6,0,14,4,18,140,29,16,244,196,220,196,48,37,34,21,20,51,50,53,52,5,17,52,33,32,21,17,32,21,20,35,34,53,17,52,36,51,50,4, + 21,17,1,165,64,64,64,2,31,254,185,254,181,1,25,230,235,1,31,228,214,1,41,235,64,64,64,64,235,3,31,198,198,254,80,196,200,200,2,142, + 204,118,118,204,252,199,0,0,0,2,0,129,255,226,4,131,4,161,0,11,0,46,0,60,64,14,16,18,18,45,25,32,9,34,3,32,18,39,69,47, + 16,252,236,204,212,204,16,220,60,220,236,49,0,64,16,0,32,6,36,140,47,25,135,45,29,21,135,14,41,184,18,47,244,60,236,50,220,236,16,244, + 204,212,204,48,37,34,6,21,20,22,51,50,54,53,52,38,1,54,55,50,25,1,35,17,52,35,34,7,6,35,34,39,38,35,34,7,3,32,21,20, + 35,34,53,17,16,51,50,23,22,51,50,1,108,36,28,32,32,37,27,32,1,76,32,153,242,184,55,42,62,40,128,122,42,77,35,54,1,1,1,25, + 213,251,242,151,38,56,34,36,241,32,32,37,27,34,30,37,27,3,51,124,1,254,169,252,182,3,48,219,175,113,105,189,225,254,80,196,218,210,2,150, + 1,87,117,171,0,3,0,0,254,20,4,178,4,123,0,7,0,15,0,43,0,63,64,14,45,36,8,39,6,18,2,23,8,14,43,10,27,44,16,60, + 204,220,204,252,204,220,204,220,252,204,49,0,64,17,12,25,8,41,135,29,33,184,44,0,16,5,20,140,38,189,44,16,236,244,196,220,196,16,252,60, + 236,196,220,196,48,37,34,21,20,51,50,53,52,1,34,21,20,51,50,53,52,19,32,23,22,35,34,53,17,6,35,38,55,54,55,54,23,54,51,32, + 22,21,17,35,17,52,33,34,7,2,9,64,64,64,254,153,64,64,64,174,1,23,2,2,228,239,33,31,217,1,1,211,162,55,121,193,1,45,158,184, + 254,230,178,94,245,64,64,64,64,2,246,64,64,64,64,253,152,221,195,227,2,27,7,2,215,199,1,1,101,100,213,109,250,219,5,37,163,139,0,0, + 0,2,0,87,255,239,4,203,4,145,0,11,0,44,0,57,64,16,46,29,18,32,36,18,25,9,16,3,20,18,12,41,69,45,16,252,60,236,204,212, + 204,212,252,220,252,220,49,0,64,13,22,135,39,140,45,6,43,0,34,135,14,27,184,244,60,236,204,212,204,16,244,236,48,1,34,6,21,20,22,51, + 50,54,53,52,38,5,52,51,50,21,20,7,6,23,20,51,50,53,17,52,5,4,21,17,35,17,52,35,34,21,17,16,37,36,17,16,55,34,1,64, + 36,28,32,32,37,27,32,254,249,230,236,144,139,1,181,182,1,39,1,40,184,117,106,254,145,254,146,213,211,3,248,32,32,37,27,34,30,37,27,64, + 217,213,175,141,136,168,204,176,2,88,254,1,1,251,252,115,3,141,103,104,253,169,254,185,1,1,1,92,1,21,151,0,0,2,0,95,255,227,4,190, + 4,140,0,7,0,34,0,57,64,13,36,25,8,28,9,13,8,2,20,6,16,69,35,16,252,204,220,204,252,204,220,236,204,49,0,64,16,0,14,4, + 18,184,26,188,35,23,135,10,169,30,8,140,35,16,244,60,236,236,16,236,252,196,220,196,48,1,50,53,52,35,34,7,20,3,53,51,50,54,53,17, + 36,53,52,55,54,21,17,22,55,54,53,17,51,17,16,33,34,39,6,35,1,87,64,64,62,2,184,122,93,85,254,232,226,238,93,131,227,184,254,105, + 185,84,114,217,3,115,64,64,64,64,252,112,143,101,156,1,103,8,204,221,1,1,219,253,117,169,1,1,177,3,47,252,209,254,178,115,115,0,0,0, + 0,2,0,73,255,239,4,115,4,124,0,7,0,29,0,50,64,12,25,8,23,6,16,2,12,19,18,8,69,30,16,252,236,60,204,220,204,220,252,49, + 0,64,13,4,10,0,14,184,24,188,30,21,135,28,140,30,16,244,252,16,236,252,196,220,196,48,1,34,21,20,51,50,53,52,1,52,55,38,55,54, + 51,22,7,6,0,21,22,33,32,25,1,51,17,16,37,36,1,53,64,64,64,254,212,182,183,1,1,229,237,1,1,254,236,1,1,77,1,103,184,253, + 225,253,245,3,238,64,64,64,64,253,82,218,196,38,182,194,2,188,151,254,209,168,203,1,39,2,180,253,76,254,66,1,1,0,0,0,0,2,0,73, + 255,239,4,115,6,20,0,7,0,29,0,50,64,12,26,8,23,6,16,2,12,19,18,8,69,30,16,252,236,60,204,220,204,220,252,49,0,64,13,4, + 10,0,14,184,24,151,30,21,135,28,140,30,16,244,252,16,236,252,196,220,196,48,1,34,21,20,51,50,53,52,1,52,55,38,55,54,23,22,7,6, + 0,21,22,33,32,25,1,51,17,16,37,36,1,53,64,64,64,254,212,182,183,1,1,229,237,1,1,254,236,1,1,77,1,103,184,253,225,253,245,4, + 4,64,64,64,64,253,60,239,197,37,183,194,1,1,189,173,254,210,168,203,1,39,4,104,251,152,254,66,1,1,0,0,0,3,0,89,255,239,5,204, + 4,233,0,11,0,23,0,69,0,0,1,34,6,21,20,22,51,50,54,53,52,38,33,34,6,21,20,22,51,50,54,53,52,38,1,38,39,6,39,34, + 38,53,17,54,23,50,7,6,5,17,20,51,50,53,17,51,3,20,55,54,53,17,36,55,52,23,22,23,54,53,38,39,55,22,23,6,7,17,20,6, + 4,31,36,28,32,32,37,27,32,253,6,36,28,32,32,37,27,32,2,75,148,102,103,180,166,156,1,252,212,1,1,254,233,165,164,184,1,163,155,254, + 231,1,211,215,27,29,7,18,168,31,5,1,196,178,3,210,32,32,37,27,34,30,37,27,32,32,37,27,34,30,37,27,252,29,1,73,75,1,163,154, + 2,98,225,2,235,199,5,254,118,132,132,1,52,254,203,139,5,5,130,1,140,8,203,238,1,1,152,52,50,64,55,45,93,102,197,110,254,57,165,153, + 0,2,0,186,255,227,5,104,6,20,0,29,0,37,0,65,64,16,39,0,8,27,23,8,20,16,36,13,32,16,8,8,70,38,16,252,236,204,220,204, + 16,220,252,220,252,204,49,0,64,8,21,25,18,135,2,6,140,38,16,244,60,252,60,204,64,8,34,15,30,11,184,28,151,38,16,236,252,196,220,196, + 48,1,16,33,34,39,6,35,32,25,1,52,51,50,21,20,33,17,20,51,50,53,17,51,17,20,51,50,53,17,51,1,34,21,20,51,50,53,52,5, + 104,254,169,148,102,103,180,254,190,253,211,254,232,165,164,184,162,155,184,252,62,64,64,64,1,32,254,195,74,74,1,61,2,124,223,235,204,254,92,164, + 164,1,64,254,191,166,167,4,244,253,204,64,64,64,64,0,0,2,0,104,255,239,5,22,4,125,0,11,0,45,0,63,64,16,24,8,21,17,8,14, + 44,9,40,3,44,8,36,32,69,46,16,252,60,236,204,212,204,16,212,252,212,236,49,0,64,16,6,34,0,38,184,22,188,46,15,19,12,135,26,30, + 140,46,16,244,60,252,60,196,16,228,244,204,212,204,48,1,34,6,21,20,22,51,50,54,53,52,38,19,50,53,17,51,17,20,51,50,53,17,51,17, + 16,33,34,39,6,35,32,17,52,55,38,53,52,51,50,21,20,3,6,21,20,1,100,36,28,32,32,37,27,32,65,164,184,162,155,184,254,169,148,102, + 103,180,254,190,153,137,230,236,232,66,3,210,32,32,37,27,34,30,37,27,252,179,167,1,52,254,203,169,170,3,47,252,209,254,195,74,74,1,61,240, + 166,37,158,248,220,137,254,241,77,144,167,0,0,2,0,104,255,239,5,22,6,20,0,11,0,45,0,63,64,16,24,8,21,17,8,14,44,9,40,3, + 44,8,36,32,69,46,16,252,60,236,204,212,204,16,212,252,212,236,49,0,64,16,6,34,0,38,184,22,151,46,15,19,12,135,26,30,140,46,16,244, + 60,252,60,196,16,228,244,204,212,204,48,1,34,6,21,20,22,51,50,54,53,52,38,19,50,53,17,51,17,20,51,50,53,17,51,17,16,33,34,39, + 6,35,32,17,52,55,38,53,52,51,50,21,20,3,6,21,20,1,100,36,28,32,32,37,27,32,65,164,184,162,155,184,254,169,148,102,103,180,254,190, + 153,137,230,236,232,66,3,210,32,32,37,27,34,30,37,27,252,179,167,1,52,254,203,169,170,4,232,251,24,254,195,74,74,1,61,240,166,37,158,248, + 220,139,254,243,76,145,167,0,0,1,0,64,255,227,5,22,4,96,0,23,0,36,64,7,6,8,8,2,8,0,24,16,220,236,220,236,49,0,64,10, + 7,1,188,24,4,135,11,15,140,24,16,244,60,252,16,252,60,48,1,51,17,16,33,50,25,1,51,17,16,33,32,39,6,35,34,53,52,51,50,7, + 50,53,1,147,184,1,26,249,184,254,79,254,179,41,51,182,198,156,144,2,41,4,96,253,44,254,237,1,19,2,212,252,197,254,190,56,56,156,150,123, + 139,0,0,0,0,2,0,115,255,239,4,244,6,20,0,11,0,42,0,59,64,14,38,8,37,3,20,9,29,24,32,8,12,16,69,43,16,252,60,236, + 220,204,204,212,204,220,236,49,0,64,16,34,135,41,140,43,29,135,28,0,22,6,18,184,38,151,43,16,236,244,204,212,204,212,236,16,244,236,48,1, + 50,54,53,52,38,39,38,6,21,20,22,1,52,55,38,55,18,5,22,21,20,7,6,39,22,23,22,55,21,7,6,21,20,5,4,25,1,51,17,16, + 37,36,1,230,36,28,33,31,37,27,32,254,173,165,166,1,1,1,108,220,221,129,54,2,90,65,144,141,147,1,139,1,124,184,253,204,253,179,3,149, + 32,32,36,27,1,1,33,32,36,28,253,152,143,86,109,234,1,45,1,1,183,198,2,1,136,189,71,52,12,161,23,24,112,168,6,6,1,190,3,218, + 252,38,253,180,1,1,0,0,0,2,0,139,255,239,5,18,4,140,0,11,0,44,0,55,64,12,29,18,12,9,39,25,18,3,16,35,69,45,16,252, + 60,204,236,212,204,212,252,49,0,64,16,43,135,31,140,46,6,0,37,14,135,27,23,135,18,184,46,16,244,252,212,252,212,220,204,16,244,236,48,1, + 34,6,21,20,22,51,50,54,53,52,38,5,52,33,32,17,16,33,32,23,7,38,35,32,21,20,33,32,17,16,33,32,39,38,53,52,51,50,21,20, + 7,22,51,32,1,99,36,28,32,32,36,28,32,2,189,254,128,253,212,2,54,1,98,230,117,248,229,254,140,1,146,2,26,253,196,254,171,135,85,211, + 224,22,75,183,1,22,1,88,32,32,36,28,32,32,36,28,16,232,1,56,1,36,220,123,187,140,159,254,143,254,155,110,69,123,203,210,78,20,37,0, + 0,2,0,79,255,239,4,170,4,140,0,11,0,48,0,64,64,16,50,44,18,30,26,18,12,9,18,37,18,3,38,22,69,49,16,252,60,204,236,212, + 204,220,236,212,236,220,49,0,64,17,14,135,37,24,0,16,6,28,135,20,47,140,49,33,135,42,184,244,236,16,244,60,236,204,212,204,212,204,236,48, + 37,34,6,21,20,22,51,50,54,53,52,38,5,38,39,38,7,22,7,6,39,38,53,16,33,32,19,22,55,54,53,17,16,33,32,7,6,7,39,54, + 55,54,5,4,25,1,20,37,38,1,52,37,27,32,32,36,28,32,1,11,44,171,68,12,227,2,2,207,249,1,41,1,60,87,37,68,118,254,162,254, + 243,39,26,2,183,6,17,71,1,161,2,38,254,190,222,248,33,31,36,28,32,32,36,27,30,243,3,1,84,1,183,214,1,1,235,1,137,254,176,145, + 1,2,174,1,168,1,24,114,74,99,20,111,60,249,1,1,254,137,253,212,250,1,1,0,0,2,0,115,255,229,4,118,4,123,0,7,0,33,0,58, + 64,7,33,18,8,2,18,69,34,16,252,196,212,236,64,6,6,22,12,8,28,35,16,220,236,220,196,49,0,64,9,33,0,20,4,26,135,15,140,34, + 16,244,236,204,220,204,204,64,5,31,135,10,184,34,16,252,252,48,1,34,21,20,51,50,53,52,1,18,33,32,25,1,16,33,32,36,53,52,51,50, + 21,20,7,22,51,32,53,17,52,33,32,7,1,84,64,64,64,254,248,41,1,205,1,244,254,34,255,0,254,219,229,221,69,25,143,1,30,254,204,254, + 217,24,1,84,64,64,64,64,1,206,1,89,254,215,253,184,254,219,157,143,210,215,61,73,8,216,1,196,204,213,0,0,0,3,0,79,255,239,5,129, + 5,111,0,11,0,53,0,61,0,0,37,34,6,21,20,22,51,50,54,53,52,38,37,17,6,33,36,55,54,33,32,23,54,61,1,38,39,55,22,23, + 6,7,17,20,37,38,39,38,39,38,7,22,7,6,39,38,55,18,33,32,19,22,55,54,1,32,39,52,33,32,21,20,1,52,37,27,32,32,36,28, + 32,2,150,70,254,235,253,222,2,2,2,30,1,142,114,64,10,92,160,116,4,1,214,254,190,222,43,44,171,68,12,227,2,2,207,250,1,1,1,40, + 1,60,87,37,68,118,254,165,1,116,1,254,141,254,137,248,33,31,36,28,32,32,36,27,61,1,153,14,1,252,233,154,54,28,2,84,98,90,171,100, + 149,166,253,195,250,1,1,233,243,3,1,84,1,183,214,1,1,235,1,137,254,176,145,1,2,2,209,69,109,77,100,0,0,3,0,127,255,232,6,25, + 4,153,0,6,0,13,0,57,0,0,0,34,21,6,51,50,55,36,34,21,6,51,50,55,1,36,17,16,55,38,55,54,23,22,7,6,7,6,19,22, + 37,36,53,17,6,43,1,38,55,54,23,50,23,54,23,22,25,1,35,17,52,7,6,7,6,7,19,16,1,168,128,1,65,63,1,1,224,128,1,65, + 63,1,254,249,254,28,163,194,1,1,229,238,2,1,117,138,12,7,1,28,1,0,20,29,2,230,1,1,211,162,53,114,151,253,184,82,88,54,38,36, + 1,4,4,64,64,64,64,64,64,64,252,36,1,1,45,1,10,211,47,153,215,1,1,212,139,117,138,254,234,159,1,1,181,1,178,9,6,238,201,1, + 99,100,1,2,254,192,252,169,3,87,131,1,1,55,39,28,253,214,254,179,0,3,0,115,255,227,4,118,4,123,0,7,0,32,0,40,0,60,64,14, + 33,18,14,8,31,6,24,2,37,18,10,20,69,41,16,252,60,236,196,220,196,220,252,236,49,0,64,6,4,28,135,17,140,41,16,244,236,204,64,10, + 0,22,39,135,8,35,135,12,184,41,16,252,236,220,236,220,204,48,1,34,21,20,51,50,53,52,55,32,17,16,33,32,25,1,20,33,34,36,53,52, + 51,50,21,20,7,22,51,32,53,17,6,19,52,33,32,21,20,33,32,1,84,64,64,64,237,253,242,2,21,1,238,253,254,210,254,209,221,237,61,65, + 64,1,53,83,85,254,187,254,184,1,72,1,69,1,71,64,64,64,64,203,1,52,1,53,254,208,253,145,249,130,170,214,217,71,41,35,175,1,31,53, + 1,54,155,155,160,0,0,0,0,2,0,139,255,239,5,120,4,216,0,11,0,52,0,62,64,13,26,39,18,14,9,49,35,18,3,18,45,69,53,16, + 252,60,204,236,212,204,212,252,60,49,0,64,19,12,135,41,140,54,6,0,47,16,135,37,29,135,24,33,135,20,184,54,16,244,236,220,236,212,252,212, + 220,196,16,244,236,48,1,34,6,21,20,22,51,50,54,53,52,38,1,32,17,52,37,36,53,52,33,50,23,22,51,50,19,23,2,35,34,39,38,35, + 34,21,20,5,4,17,16,33,32,39,38,53,52,51,50,21,20,7,22,1,104,36,28,32,32,37,27,32,1,36,1,151,254,123,253,221,1,161,203,97, + 106,106,104,64,148,77,243,167,113,75,157,205,1,121,2,41,253,171,254,199,135,109,225,215,95,156,1,139,32,32,37,27,34,30,37,27,254,249,1,0, + 189,49,69,230,252,89,108,1,4,48,254,148,120,80,94,98,56,82,254,194,254,115,117,95,124,222,218,93,70,28,0,0,0,2,0,203,254,173,5,240, + 4,161,0,3,0,39,0,0,0,34,20,50,3,39,1,0,39,38,15,1,6,39,36,19,18,33,51,50,7,6,39,38,53,52,55,34,17,20,51,50, + 63,1,54,23,22,21,20,1,3,65,128,128,241,129,2,83,1,50,59,57,138,194,146,160,254,104,1,2,1,104,205,212,1,1,211,212,4,164,218,78, + 85,215,126,156,245,254,177,4,13,128,251,32,134,2,43,1,30,59,57,106,150,113,1,1,1,144,1,144,206,214,1,1,208,20,33,254,254,230,66,166, + 97,3,5,166,169,254,200,0,255,255,0,111,255,229,4,182,4,128,16,39,6,59,5,15,253,117,16,7,6,59,5,15,250,201,0,0,0,2,251,96, + 5,28,255,167,7,11,0,19,0,27,0,43,64,11,13,11,15,9,0,18,15,20,9,24,5,47,204,220,204,220,252,17,18,57,57,49,0,64,8,22, + 7,26,2,17,13,18,2,47,252,204,16,204,220,204,48,3,2,33,32,38,55,54,23,50,7,6,7,22,51,36,39,52,39,55,22,5,52,7,34,21, + 6,23,22,89,2,253,199,254,182,195,1,1,229,242,4,1,35,33,65,1,91,1,86,138,168,252,222,66,56,1,63,60,6,29,254,255,168,107,217,1, + 216,80,36,4,1,85,46,70,138,143,77,63,1,62,61,1,1,0,0,0,0,2,0,123,0,0,3,201,4,123,0,16,0,24,0,43,64,9,3,8, + 4,21,11,17,15,69,25,16,252,204,220,204,220,236,49,0,64,11,19,13,0,23,9,7,135,0,184,4,25,16,60,252,236,220,204,16,220,204,48,1, + 32,25,1,35,17,16,35,34,7,50,21,20,35,34,53,16,19,20,51,50,53,52,35,34,2,18,1,183,184,255,110,61,218,229,225,166,59,67,62,64, + 4,123,254,106,253,27,2,203,1,25,86,193,199,199,1,174,254,82,55,55,55,0,0,0,255,255,252,154,0,0,3,201,6,114,16,38,6,82,0,0, + 16,6,6,60,0,0,0,0,0,1,251,64,4,236,255,106,7,105,0,17,0,31,183,0,18,6,2,11,14,18,9,47,236,212,220,212,236,49,0,181, + 16,7,2,12,3,11,47,60,204,50,212,204,48,1,20,33,21,32,17,16,33,32,17,16,33,53,32,55,52,33,32,251,254,1,37,254,29,2,38,2, + 4,254,63,1,1,2,254,186,254,152,6,37,187,126,1,63,1,62,254,194,254,193,126,187,197,0,0,0,0,1,251,64,4,236,0,0,7,105,0,20, + 0,36,64,9,0,18,6,2,14,17,18,12,9,47,204,236,212,220,212,236,49,0,182,19,7,12,2,15,3,14,47,60,204,50,50,212,204,48,1,20, + 33,21,32,17,16,33,32,17,20,7,51,21,33,53,32,55,54,33,32,251,254,1,37,254,29,2,38,2,4,62,212,253,169,1,2,1,1,254,185,254, + 152,6,37,187,126,1,63,1,62,254,194,119,74,126,126,187,197,0,0,0,0,2,251,64,4,236,255,106,7,105,0,17,0,21,0,42,64,10,0,18, + 6,20,2,18,12,14,18,9,47,236,220,196,220,196,220,236,49,0,64,9,16,7,21,160,19,2,12,3,11,47,60,204,50,220,252,220,204,48,1,20, + 33,21,32,17,16,33,32,17,16,33,53,32,55,52,33,32,5,21,35,53,251,254,1,37,254,29,2,38,2,4,254,63,1,1,2,254,186,254,152,1, + 223,238,6,37,187,126,1,63,1,62,254,194,254,193,126,187,197,78,220,220,0,2,251,64,4,236,0,0,7,105,0,20,0,24,0,46,64,11,0,18, + 6,24,2,22,14,17,18,12,9,47,204,236,212,196,220,196,212,236,49,0,64,10,19,7,21,160,23,12,2,15,3,14,47,60,204,50,50,220,252,220, + 204,48,1,20,33,21,32,17,16,33,32,17,20,7,51,21,33,53,32,55,54,33,32,5,21,35,53,251,254,1,37,254,29,2,38,2,4,62,212,253, + 169,1,2,1,1,254,185,254,152,1,223,238,6,37,187,126,1,63,1,62,254,194,119,74,126,126,187,197,84,220,220,0,0,2,252,254,253,51,254,182, + 255,178,0,4,0,21,0,0,4,34,20,51,54,3,54,53,52,39,6,35,34,53,52,51,50,23,22,21,20,7,253,238,130,65,65,92,144,5,40,68, + 179,170,101,78,91,204,188,129,1,254,207,111,91,17,16,36,158,186,78,91,139,117,214,0,0,2,252,167,253,142,254,200,255,175,0,7,0,29,0,37, + 64,8,27,25,6,18,2,14,21,10,47,204,212,204,220,204,220,204,49,0,64,7,4,12,0,16,26,8,23,47,204,204,220,196,220,196,48,5,34,21, + 20,51,50,53,52,19,34,53,52,55,38,53,52,51,50,21,20,6,21,20,51,50,53,17,51,17,20,253,30,22,23,21,114,243,62,74,117,117,109,130, + 158,132,178,22,22,21,23,254,64,146,115,62,10,91,121,117,63,123,69,66,88,1,70,254,186,195,0,0,0,2,251,96,5,28,255,167,7,11,0,20, + 0,27,0,0,3,22,7,39,54,53,54,37,34,7,22,7,6,7,6,39,38,55,54,33,32,0,52,7,34,23,20,51,89,1,168,138,86,1,254,165, + 65,33,46,10,21,217,229,1,1,123,120,1,26,2,57,252,225,60,63,1,56,6,10,95,143,138,70,46,85,1,4,68,87,176,1,1,217,84,95,96, + 254,174,126,1,63,61,0,0,0,2,251,28,253,199,0,13,255,177,0,7,0,26,0,35,64,5,6,17,2,24,13,47,204,196,220,196,49,0,64,10, + 22,135,8,0,15,4,11,135,19,27,16,220,252,196,220,196,60,252,48,1,50,53,52,35,34,21,20,5,34,2,35,22,21,20,35,34,53,16,33,50, + 18,51,50,55,23,6,251,220,48,48,43,2,201,218,172,184,92,196,184,1,76,222,222,96,93,166,134,191,254,78,48,47,46,49,105,1,51,32,114,191, + 167,1,67,254,208,198,114,240,0,2,0,129,254,20,4,244,5,185,0,11,0,50,0,0,5,50,54,53,52,38,35,34,6,21,20,22,1,17,16,33, + 32,17,53,16,33,50,21,20,35,34,39,21,20,33,32,25,1,52,0,53,52,51,50,4,50,55,23,2,35,34,36,35,34,20,0,1,242,36,28,32, + 32,37,27,32,2,177,254,1,253,253,1,109,217,217,142,45,1,81,1,71,253,88,249,117,1,9,94,124,128,116,190,73,254,243,84,75,2,182,63,32, + 32,36,28,32,32,36,28,2,179,253,96,254,64,1,17,127,1,44,200,209,115,107,150,1,69,2,114,125,1,51,216,209,253,196,84,254,251,249,174,254, + 153,0,0,0,0,2,0,122,255,227,2,152,4,123,0,21,0,33,0,42,64,9,25,0,31,11,16,8,7,70,34,16,252,252,204,196,220,196,49,0, + 64,11,14,135,9,184,34,28,20,22,4,140,34,16,244,204,220,204,16,252,252,48,37,6,7,6,35,34,25,1,52,51,50,23,7,38,35,34,21,17, + 62,1,51,50,7,50,54,55,52,38,35,34,6,21,6,22,2,142,1,67,67,155,242,232,204,106,70,80,136,72,11,79,81,178,181,36,27,1,33,31, + 37,27,1,33,162,112,39,40,1,70,2,110,228,74,118,45,79,253,33,51,93,239,32,32,36,28,32,32,36,28,0,0,255,255,0,122,255,227,4,200, + 4,123,16,38,6,71,0,0,16,7,6,71,2,48,0,0,0,2,255,211,255,246,3,48,7,44,0,11,0,40,0,0,1,34,6,21,20,22,51,50, + 54,53,52,38,1,38,7,6,19,23,22,21,17,51,32,7,6,7,35,34,25,1,52,47,1,38,53,52,51,50,23,1,7,2,78,36,28,32,32,37, + 27,32,254,164,115,32,36,203,140,101,23,1,3,1,1,211,2,251,144,139,113,201,152,122,1,109,133,1,18,32,32,37,27,34,30,37,27,5,24,144, + 26,29,254,249,180,131,181,254,29,231,207,1,1,56,2,50,174,186,180,145,121,166,156,254,44,118,0,0,0,2,0,92,255,227,3,235,7,35,0,26, + 0,34,0,54,64,8,3,18,16,7,18,12,69,35,16,252,236,220,236,64,7,33,22,29,19,8,0,12,16,220,236,220,220,204,49,0,64,11,5,135, + 14,152,35,27,20,31,24,140,35,16,244,196,220,196,16,252,252,48,1,52,36,53,52,37,38,21,20,23,7,38,53,16,33,32,17,20,4,21,17,36, + 21,20,35,34,53,55,34,21,20,51,50,53,52,1,194,1,105,254,216,243,160,120,220,1,171,1,228,254,143,1,25,226,239,239,64,64,64,3,231,184, + 220,88,186,1,1,184,52,160,124,236,96,1,80,254,176,164,217,179,253,247,10,229,220,221,63,64,64,64,64,0,0,0,0,2,0,188,255,234,3,144, + 7,22,0,11,0,34,0,0,1,34,6,21,20,22,51,50,54,53,52,38,1,53,38,39,55,22,31,1,33,23,6,21,17,36,7,6,35,34,25,1, + 52,55,35,2,174,36,28,32,32,37,27,32,254,100,2,116,166,132,4,4,1,46,59,224,1,26,1,1,213,251,156,239,1,6,32,32,37,27,34,30, + 37,27,3,200,136,157,196,95,248,112,149,189,172,152,254,137,10,241,208,1,56,2,62,153,117,0,0,0,0,2,0,147,254,37,4,152,4,116,0,47, + 0,59,0,0,1,52,35,34,7,6,35,34,39,38,35,34,29,1,36,7,6,7,35,38,17,53,16,51,50,23,22,51,50,55,54,51,50,25,1,16, + 7,6,33,32,39,38,53,55,22,5,4,17,1,34,6,21,20,22,51,50,54,53,52,38,3,224,34,51,67,50,127,122,55,74,44,34,1,26,1,1, + 211,2,251,182,133,47,73,78,92,61,48,130,182,66,87,254,150,254,161,84,79,189,21,1,51,1,72,253,169,36,28,32,32,37,27,32,3,88,116,92, + 68,68,92,116,93,10,241,207,1,3,1,53,246,1,2,60,92,85,67,254,254,252,170,254,247,102,136,119,112,118,10,202,8,9,1,103,2,72,32,32, + 37,27,34,30,37,27,0,0,0,1,253,18,4,241,253,198,6,86,0,3,0,14,64,5,2,0,2,8,0,47,252,49,0,47,204,48,1,51,17,35, + 253,18,180,180,6,86,254,155,0,2,251,127,4,224,255,163,7,32,0,7,0,27,0,39,64,8,27,8,15,2,21,6,17,12,47,212,204,220,204,204, + 220,204,49,0,64,8,0,15,4,19,27,13,24,12,47,220,60,204,220,196,220,196,48,1,22,39,54,7,34,23,6,37,20,2,41,1,53,54,53,6, + 55,52,23,22,29,1,20,7,32,54,53,252,25,43,2,1,42,43,1,1,3,181,215,254,132,254,85,144,183,1,157,145,71,1,177,243,6,109,1,43, + 43,2,41,44,125,229,254,221,133,46,112,7,157,136,1,1,131,183,92,40,141,250,0,0,0,1,251,62,4,200,0,46,6,243,0,52,0,0,1,34, + 17,16,33,50,22,55,54,55,54,51,50,21,20,7,22,55,54,55,51,6,7,6,33,35,53,54,53,52,35,34,7,6,39,38,39,38,35,34,21,20, + 59,1,38,53,52,51,22,7,6,7,6,252,46,240,1,37,50,126,42,38,73,72,72,220,157,132,66,79,5,153,2,103,40,254,226,197,208,76,24,66, + 67,93,105,37,62,23,146,101,62,46,96,104,2,2,62,51,4,200,1,20,1,23,130,1,1,65,63,215,126,61,4,13,16,104,130,92,36,133,107,98, + 56,58,59,1,1,45,70,144,161,2,95,90,1,107,102,50,41,0,0,0,0,1,252,78,4,224,254,140,7,30,0,11,0,33,64,7,7,5,8,169, + 0,2,11,47,60,204,252,60,220,49,0,64,7,4,2,5,169,9,11,8,47,60,204,252,60,220,48,1,53,51,53,51,21,51,21,35,21,35,53,252, + 78,216,142,216,216,142,5,184,142,216,216,142,216,216,0,0,255,255,251,28,5,23,0,13,7,1,16,7,6,69,0,0,7,80,0,0,0,2,252,154, + 4,246,254,62,6,114,0,7,0,15,0,23,64,4,12,4,8,0,47,204,220,204,49,0,64,4,14,2,10,6,47,204,220,204,48,1,52,51,50,21, + 20,35,34,55,20,51,50,53,52,35,34,252,154,212,208,212,208,132,76,84,80,80,5,190,180,180,200,200,72,72,72,0,0,2,0,135,255,227,4,143, + 4,96,0,13,0,29,0,0,1,34,7,6,21,20,23,22,32,55,54,53,52,38,39,32,23,22,21,20,7,6,33,32,39,38,17,52,55,54,2,139, + 143,94,76,58,78,1,98,88,49,157,157,1,25,136,99,111,140,254,247,254,237,128,113,111,146,3,192,132,104,179,189,96,129,153,87,174,163,252,160,196, + 146,233,253,142,179,165,148,1,5,230,149,196,0,2,0,99,255,103,4,168,4,155,0,3,0,38,0,0,0,20,50,52,3,55,54,17,52,39,38,35, + 34,7,6,7,6,23,54,55,54,21,20,39,38,39,38,53,52,55,54,5,32,23,22,21,16,5,7,1,182,128,10,242,210,112,72,188,146,103,99,1, + 1,47,53,112,216,228,134,73,180,141,117,1,11,1,17,129,166,254,206,246,2,22,128,128,253,234,135,117,1,203,127,112,72,69,67,108,101,92,103,2, + 2,226,212,2,1,85,212,220,154,137,115,1,117,151,200,253,207,168,135,0,0,2,0,99,255,121,4,92,5,177,0,3,0,36,0,0,0,50,52,34, + 3,50,55,6,35,38,53,52,51,50,17,20,7,6,35,32,39,38,53,16,63,1,36,53,23,16,1,7,6,17,20,23,22,3,43,128,128,114,208,37, + 15,51,221,224,237,93,102,220,254,205,129,166,207,211,1,31,184,254,148,217,124,112,72,1,70,128,254,80,182,19,3,198,216,254,228,240,102,111,117,151, + 200,1,84,162,165,224,233,1,254,199,254,229,169,97,254,251,127,112,72,0,0,1,0,22,255,237,5,138,6,164,0,47,0,0,37,50,25,1,52,39, + 36,53,52,51,50,23,22,51,50,55,23,2,35,34,39,38,35,34,21,20,5,22,21,17,16,37,36,39,6,35,34,53,52,51,50,7,50,53,17,51, + 17,16,3,17,226,182,254,182,239,161,51,93,76,47,124,128,116,190,107,90,49,132,65,1,81,189,254,102,254,220,40,51,182,198,156,144,2,41,184,131, + 1,68,1,106,190,82,151,198,230,58,106,196,84,254,251,104,56,75,79,200,112,198,254,116,254,36,2,2,54,56,156,150,123,139,2,145,253,214,254,237, + 0,2,0,99,255,87,4,206,5,177,0,3,0,37,0,0,0,50,52,34,1,36,5,4,39,38,53,16,63,1,36,53,23,16,1,7,6,17,20,23, + 22,51,50,23,38,39,38,51,50,7,6,7,22,23,3,33,128,128,1,173,254,226,254,241,254,190,114,138,207,211,1,31,184,254,148,217,124,84,57,239, + 108,99,217,2,2,212,236,12,11,126,120,162,1,152,128,253,63,76,1,1,118,143,167,1,84,162,165,224,233,1,254,199,254,229,169,97,254,251,109,89, + 60,24,197,208,228,216,201,5,199,75,0,0,0,3,0,99,255,87,4,206,5,177,0,3,0,45,0,50,0,0,0,50,52,34,5,18,55,38,53,38, + 51,50,7,54,53,23,20,7,6,7,6,7,6,17,20,23,22,51,50,23,38,39,38,51,50,7,6,7,22,23,21,36,5,4,39,38,18,20,51,50, + 52,3,33,128,128,253,66,2,229,145,1,228,251,15,156,184,179,125,98,36,143,124,84,57,239,108,99,217,2,2,212,236,12,11,126,120,162,254,226,254, + 241,254,190,114,138,248,61,67,1,152,128,203,1,104,161,40,170,231,173,173,162,1,189,235,164,12,63,102,88,254,242,109,89,60,24,197,208,228,216,201, + 5,199,75,157,76,1,1,118,143,3,200,116,116,0,0,0,0,2,0,89,255,239,5,244,6,127,0,52,0,64,0,0,1,20,6,39,38,39,6,39, + 34,38,53,17,52,51,50,7,6,5,17,20,51,50,53,17,51,3,20,55,54,53,17,16,39,36,53,52,51,50,4,50,55,23,2,35,34,36,35,34, + 21,20,5,22,17,1,34,6,21,20,22,51,50,54,53,52,38,5,7,178,165,148,102,103,180,166,156,253,212,1,1,254,233,165,164,184,1,163,155,217, + 254,172,250,117,1,9,94,124,128,117,189,73,254,242,83,76,1,92,223,252,62,36,28,32,32,37,27,32,1,44,165,153,1,1,73,75,1,163,154,2, + 98,223,235,199,5,254,118,132,132,1,52,254,203,139,5,5,130,1,106,1,69,97,154,216,209,252,195,84,254,251,249,87,56,210,139,254,190,1,26,32, + 32,37,27,34,30,37,27,0,0,3,0,130,254,20,4,219,4,123,0,5,0,11,0,38,0,0,37,34,20,51,50,52,3,34,20,51,50,52,19,20, + 35,34,53,52,33,17,6,35,34,53,52,51,50,23,54,51,32,25,1,35,17,52,35,34,7,1,104,63,63,65,65,63,63,65,184,249,230,1,39,43, + 22,230,230,168,44,76,189,1,150,184,226,137,87,240,128,128,3,7,128,128,252,193,205,201,208,1,112,8,216,183,81,81,254,190,250,219,5,37,170,142, + 0,4,0,150,254,82,5,112,4,116,0,11,0,17,0,77,0,85,0,0,1,34,6,21,20,22,51,50,54,53,52,38,0,50,53,52,34,21,5,6, + 35,38,55,54,55,54,55,37,17,52,35,34,7,6,35,34,39,38,35,34,21,17,36,7,6,7,35,38,25,1,16,51,50,23,22,51,50,55,54,51, + 50,25,1,55,23,7,21,54,23,22,21,20,7,6,7,6,39,6,19,1,6,23,22,55,54,55,1,137,36,28,32,32,37,27,32,2,229,110,110,254, + 180,118,112,134,2,1,43,45,149,1,26,34,50,68,50,127,122,55,74,44,34,1,26,1,1,211,2,251,182,132,48,73,78,92,61,48,130,182,142,74, + 216,37,18,149,46,51,63,173,53,120,118,254,132,39,15,24,170,129,81,1,156,32,32,37,27,34,30,37,27,253,158,57,51,51,185,104,1,107,47,47, + 51,119,225,2,177,116,92,68,68,92,116,254,223,10,241,207,1,3,1,53,1,186,1,2,60,92,85,67,254,254,253,200,114,84,173,171,8,1,8,148, + 70,45,50,1,3,98,71,1,59,254,208,31,21,34,130,98,44,0,0,0,0,2,0,105,255,247,4,247,4,145,0,28,0,32,0,0,1,36,27,1, + 20,23,22,53,17,51,17,20,5,4,53,17,52,35,34,21,17,32,21,20,35,34,53,17,16,18,50,52,34,1,197,1,109,1,1,126,141,184,254,192, + 254,197,182,165,1,24,211,253,172,128,128,4,145,1,254,185,253,169,101,3,3,106,3,141,252,115,251,1,1,254,2,88,176,164,254,92,204,235,223,2, + 124,1,57,252,7,128,0,0,0,3,0,127,255,232,7,147,4,153,0,6,0,13,0,73,0,0,0,34,21,6,51,50,55,36,34,21,6,51,50,55, + 5,17,22,51,54,53,17,51,17,16,37,34,39,6,37,53,50,53,17,52,7,6,7,6,7,19,18,37,36,17,16,55,38,55,54,23,22,7,6,7, + 6,19,22,37,36,53,17,6,35,48,35,38,55,54,23,50,23,54,23,22,1,168,128,1,65,63,1,1,224,128,1,65,63,1,2,145,11,84,99,184, + 254,233,98,42,64,254,214,219,82,88,54,38,36,1,1,254,72,254,28,163,194,1,1,229,238,2,1,117,138,12,7,1,28,1,0,20,29,2,230,1, + 1,211,162,53,114,151,253,4,4,64,64,64,64,64,64,64,109,253,111,54,4,160,3,74,252,182,254,189,1,44,47,3,184,204,1,225,131,1,1,55, + 39,28,253,214,254,179,1,1,1,45,1,10,211,47,153,215,1,1,212,139,117,138,254,234,159,1,1,181,1,178,9,6,238,201,1,99,100,1,2,0, + 0,4,0,127,255,232,7,201,4,153,0,6,0,13,0,76,0,88,0,0,0,34,21,6,51,50,55,36,34,21,6,51,50,55,5,17,22,51,50,53, + 17,51,17,16,33,34,39,6,39,38,55,54,51,50,23,17,52,7,6,7,6,7,19,18,37,36,17,16,55,38,55,54,23,22,7,6,7,6,19,22, + 37,36,53,17,6,35,48,35,38,55,54,23,50,23,54,23,22,3,50,54,53,52,38,39,38,6,21,20,22,1,168,128,1,65,63,1,1,224,128,1, + 65,63,1,2,145,26,102,120,184,254,212,133,36,56,159,217,5,5,196,36,43,82,98,44,19,55,1,1,254,72,254,28,163,194,1,1,229,238,2,1, + 117,138,12,7,1,28,1,0,20,29,2,230,1,1,211,162,53,114,151,253,244,36,28,33,31,37,27,32,4,4,64,64,64,64,64,64,64,109,253,211, + 148,158,3,74,252,182,254,190,99,101,2,3,198,193,8,1,227,147,17,20,36,16,51,253,214,254,179,1,1,1,45,1,10,211,47,153,215,1,1,212, + 139,117,138,254,234,159,1,1,181,1,178,9,6,238,201,1,99,100,1,2,251,234,32,32,36,27,1,1,33,32,36,28,0,1,0,120,255,225,6,134, + 6,159,0,25,0,0,1,16,0,33,32,0,17,16,1,33,53,33,21,33,4,17,16,0,37,54,0,17,52,39,55,22,6,134,254,59,254,183,254,177, + 254,79,1,220,254,116,5,74,253,117,253,175,1,52,1,17,250,1,83,83,155,118,3,16,254,150,254,59,1,248,1,88,1,194,1,4,168,169,231,254, + 34,254,242,254,93,1,1,1,124,1,12,133,191,75,197,0,0,1,0,110,255,255,5,162,6,159,0,21,0,0,5,17,6,35,34,0,53,16,55,33, + 4,21,20,22,51,50,55,17,51,17,33,21,3,193,188,150,226,254,225,190,1,15,254,241,204,113,158,186,180,1,45,1,2,193,74,1,76,223,1,7, + 247,247,248,189,221,88,3,49,250,2,162,0,0,1,0,111,254,209,5,50,6,179,0,23,0,0,1,17,33,17,54,38,35,34,6,21,20,23,7,38, + 53,38,54,51,50,22,21,17,33,17,4,126,254,141,1,112,111,131,126,100,144,145,1,254,183,189,223,1,115,254,209,1,46,5,3,141,134,120,115,103, + 100,123,178,143,174,224,239,176,251,140,254,49,0,2,0,110,255,226,6,63,6,159,0,11,0,28,0,0,1,16,0,35,34,0,17,16,0,51,50,0, + 55,16,0,37,4,0,17,16,37,53,33,53,33,21,33,21,4,5,130,254,162,205,209,254,166,1,73,230,235,1,60,189,254,80,254,204,254,211,254,64, + 2,151,253,208,5,6,253,209,2,147,2,222,1,11,1,61,254,194,254,247,254,253,254,166,1,96,253,254,184,254,73,2,1,1,180,1,73,2,61,156, + 63,169,169,60,165,0,0,0,0,1,0,100,0,0,4,106,6,179,0,19,0,0,33,17,16,38,35,34,6,21,20,23,7,38,17,52,0,51,50,0, + 25,1,3,182,206,130,148,177,138,121,206,1,16,242,228,1,32,4,89,1,4,183,171,145,211,133,141,191,1,29,176,1,52,254,212,254,211,251,166,0, + 0,1,0,80,0,1,5,182,6,179,0,25,0,0,1,17,33,17,35,17,52,38,35,34,6,21,20,23,7,38,53,52,54,51,50,22,29,1,33,17, + 5,2,254,168,181,146,95,107,139,88,132,146,253,181,186,238,2,12,2,8,1,245,252,4,5,35,137,103,105,146,77,107,124,144,160,170,244,232,172,131, + 253,108,0,0,0,2,0,60,255,225,5,143,6,159,0,10,0,25,0,0,1,33,17,30,1,51,62,1,17,52,38,1,2,0,35,34,0,25,1,33, + 53,33,17,33,32,0,3,62,254,254,1,158,179,131,192,225,1,159,2,254,231,230,239,254,234,254,179,2,1,1,1,1,10,1,70,3,253,254,43,251, + 172,1,212,1,12,250,161,254,87,254,223,254,174,1,2,1,53,3,231,160,253,254,254,222,0,2,0,121,255,225,7,20,6,179,0,8,0,23,0,0, + 37,17,35,32,0,17,16,0,33,1,17,33,17,33,4,0,19,16,0,41,1,17,33,17,4,89,128,254,162,254,186,1,70,1,94,2,138,254,172,254, + 214,254,101,254,46,1,1,200,1,164,1,42,2,5,129,5,148,254,122,254,192,254,229,254,77,1,106,2,17,251,229,2,1,225,1,142,1,131,1,226, + 253,233,253,79,0,1,0,60,0,1,3,30,6,253,0,7,0,0,37,17,33,17,51,21,33,17,2,107,253,209,179,2,47,1,5,185,1,67,164,249, + 168,0,0,0,0,2,0,120,0,0,4,125,6,159,0,11,0,27,0,0,1,17,52,38,35,34,7,17,20,22,51,54,19,17,6,35,38,0,25,1, + 51,17,54,51,50,0,21,17,3,202,180,156,149,186,176,159,116,220,195,145,245,254,247,180,222,108,245,1,18,2,6,1,181,125,223,57,254,94,157,228, + 1,254,68,1,111,85,2,1,68,1,3,3,60,254,203,78,254,183,238,252,127,0,0,0,0,2,0,60,255,225,6,70,6,160,0,11,0,28,0,0, + 1,16,38,35,34,7,17,16,22,23,62,1,1,6,0,25,1,33,17,35,17,33,17,54,51,32,0,16,0,5,136,228,130,141,153,182,142,119,207,254, + 193,235,254,237,254,166,179,2,192,164,141,1,5,1,20,254,195,2,56,1,9,187,61,254,128,254,250,181,2,2,164,254,185,1,1,49,1,48,3,191, + 253,235,2,181,253,192,60,254,191,253,156,254,234,0,0,0,0,2,0,120,255,226,6,151,6,159,0,10,0,31,0,0,1,34,6,21,30,1,51,50, + 54,53,17,1,17,33,17,16,2,37,34,0,17,16,0,51,33,17,33,53,33,17,33,17,2,171,130,242,2,187,135,181,154,2,23,254,158,244,254,238, + 199,254,198,1,53,254,1,31,253,76,3,105,2,24,3,252,193,254,219,224,223,220,1,191,252,25,3,231,254,65,254,236,254,184,1,1,45,1,42,1, + 39,1,61,1,88,170,253,254,251,120,0,0,0,1,0,130,0,1,4,135,6,159,0,25,0,0,37,17,52,38,35,34,7,17,35,17,52,54,51,33, + 21,33,38,6,23,21,54,51,50,0,21,17,3,202,189,154,177,140,180,229,241,1,191,254,21,132,116,2,167,170,252,1,4,1,2,119,226,162,97,252, + 102,5,9,204,201,170,1,88,165,173,80,254,210,254,253,145,0,2,0,100,254,169,6,114,6,179,0,11,0,33,0,0,1,16,0,35,34,0,17,16, + 0,51,32,0,19,51,16,33,32,3,7,32,0,17,16,0,33,32,0,17,16,0,7,22,51,54,5,180,254,173,251,239,254,171,1,95,230,1,3,1, + 74,10,180,254,190,254,212,25,129,254,187,254,63,1,203,1,56,1,57,1,210,254,232,190,1,149,140,3,98,1,19,1,159,254,105,254,229,254,202,254, + 86,1,201,253,181,254,169,1,71,14,2,27,1,101,1,106,1,231,254,24,254,150,254,237,254,52,84,240,3,0,0,0,0,1,0,50,255,226,5,189, + 6,179,0,19,0,0,1,22,0,35,34,0,53,17,33,53,33,17,20,22,51,62,1,53,17,51,5,189,1,254,230,228,225,254,216,254,123,2,57,203, + 137,141,190,179,1,255,224,254,195,1,61,234,4,11,159,251,82,173,215,1,213,174,4,174,0,1,0,80,0,1,4,135,6,160,0,22,0,0,37,17, + 6,35,34,0,53,52,55,35,53,33,21,6,3,30,1,51,50,55,17,51,17,3,212,162,173,242,254,240,165,216,1,216,232,1,1,178,147,145,190,179, + 1,2,202,86,1,45,231,159,216,160,147,118,254,230,185,175,86,3,52,249,98,0,0,0,0,1,0,110,255,226,6,211,6,160,0,25,0,0,37,17, + 33,17,16,0,35,34,0,53,16,55,23,6,21,30,1,51,50,54,53,17,51,17,33,17,6,33,254,73,254,230,220,227,254,221,188,115,114,2,199,128, + 174,148,180,2,105,131,3,121,254,56,254,210,254,220,1,47,211,1,28,143,113,117,197,154,200,223,211,4,108,253,251,251,232,0,0,0,0,1,0,130, + 255,226,4,137,6,160,0,19,0,0,1,2,0,35,32,0,53,17,51,17,30,1,51,62,1,53,52,39,55,22,4,137,2,254,208,191,254,244,254,246, + 179,1,194,160,129,177,151,95,246,2,42,254,245,254,195,1,106,235,4,105,251,148,197,238,1,221,219,209,142,144,193,0,0,2,0,130,255,255,4,136, + 6,179,0,8,0,21,0,0,1,54,38,35,33,17,33,62,1,55,20,0,41,1,17,33,21,33,17,33,32,0,3,202,2,219,156,254,224,1,32,157, + 217,189,254,209,254,252,254,224,2,194,252,139,1,211,1,0,1,51,4,139,190,203,253,1,1,182,191,218,254,196,254,43,161,6,180,254,193,0,0,0, + 0,2,0,100,254,139,6,114,6,179,0,11,0,33,0,0,1,16,0,35,34,0,17,16,0,51,50,0,19,16,33,53,50,55,38,39,6,33,32,0, + 17,16,0,33,32,0,17,16,3,22,5,180,254,176,248,250,254,176,1,97,231,245,1,85,190,254,109,230,2,2,125,216,254,252,254,179,254,69,1,194, + 1,73,1,61,1,198,201,201,3,97,1,19,1,160,254,93,254,241,254,211,254,77,1,184,253,168,254,169,158,188,118,56,177,2,34,1,96,1,95,1, + 240,254,18,254,156,254,200,254,216,128,0,0,0,3,0,100,0,1,6,137,6,172,0,8,0,17,0,34,0,0,1,35,17,51,50,18,55,38,2,37, + 35,6,2,21,20,0,59,1,1,16,0,33,35,17,35,17,35,4,0,16,0,41,1,32,0,4,55,98,98,180,220,1,2,212,254,54,101,179,238,0, + 255,162,101,3,97,254,177,254,253,98,173,101,254,252,254,165,1,94,1,1,1,116,1,4,1,78,6,23,252,52,1,32,202,210,1,15,1,2,254,241, + 208,206,254,227,1,235,254,203,254,180,254,76,1,180,1,1,78,2,104,1,66,254,196,0,0,1,0,90,0,1,5,112,6,160,0,15,0,0,1,17, + 33,17,35,17,33,17,51,17,33,17,51,17,33,17,4,180,254,136,179,253,209,189,1,114,179,2,52,2,102,1,81,252,74,3,181,1,217,254,208,2, + 65,253,193,254,5,0,0,0,0,1,0,131,255,225,4,136,6,179,0,17,0,0,5,35,17,52,38,7,34,6,21,17,35,17,38,0,51,50,0,23, + 4,136,180,191,139,138,203,178,1,1,40,225,229,1,23,1,31,4,172,172,220,1,219,172,251,84,4,168,233,1,65,254,184,216,0,0,0,1,0,110, + 0,1,4,117,6,160,0,17,0,0,37,17,6,35,34,2,53,17,51,17,6,22,51,50,55,17,51,17,3,193,210,144,252,245,180,2,150,160,184,179, + 180,1,2,194,77,1,18,219,2,61,253,197,177,158,85,3,53,249,97,0,0,1,0,120,255,225,4,126,6,160,0,31,0,0,1,20,2,5,38,36, + 61,1,51,21,20,22,51,50,54,61,1,6,35,34,2,53,17,51,17,30,1,51,50,55,17,51,4,126,244,254,234,209,254,213,189,182,135,142,203,182, + 169,246,254,180,1,167,166,164,173,179,1,206,184,254,205,2,2,240,224,36,33,144,164,165,167,251,83,1,57,185,2,56,253,200,151,187,88,3,50,0, + 0,1,0,130,0,1,4,135,6,159,0,17,0,0,37,17,54,38,35,34,7,17,35,17,51,17,54,51,50,4,25,1,3,212,1,153,207,135,176,180, + 179,174,156,217,1,47,1,2,171,147,189,48,252,53,6,158,253,205,48,255,254,216,253,140,0,1,0,121,255,225,6,29,6,179,0,25,0,0,5,53, + 6,35,36,0,17,2,0,33,4,23,7,38,35,32,0,17,16,0,37,22,55,17,51,17,5,103,246,163,254,117,254,54,1,1,223,1,119,1,5,246, + 102,219,192,254,252,254,114,1,128,1,20,160,253,182,1,97,127,1,2,7,1,110,1,135,1,213,2,165,176,184,254,145,254,178,254,209,254,88,2,1, + 158,1,247,252,233,0,0,0,0,2,0,120,255,226,6,123,6,160,0,10,0,29,0,0,1,34,2,21,20,22,51,50,54,53,17,1,17,33,17,16, + 0,35,32,0,17,16,0,33,51,17,51,17,33,17,2,199,199,202,199,155,136,160,2,10,254,171,254,245,207,254,251,254,226,1,71,1,8,249,181,2, + 6,3,252,254,244,158,218,246,199,215,1,220,252,23,3,233,254,36,254,218,254,232,1,80,1,32,1,15,1,59,2,4,253,252,251,119,0,2,0,130, + 255,255,4,136,6,159,0,8,0,25,0,0,1,52,38,35,33,17,33,62,1,55,20,6,35,33,21,33,17,35,53,33,17,35,17,33,50,22,3,202, + 112,93,254,57,1,199,80,126,189,210,185,254,57,2,27,179,254,152,180,2,123,185,210,5,18,129,109,254,20,2,127,128,170,247,255,254,123,231,254,40, + 6,160,226,0,0,1,0,100,255,226,4,152,6,179,0,32,0,0,1,20,0,35,32,0,53,51,6,18,51,50,54,53,52,37,36,17,52,18,51,50, + 18,21,35,54,38,35,34,6,23,20,0,4,152,254,235,228,254,244,254,209,191,1,205,172,164,154,254,93,254,96,254,212,226,238,186,1,170,121,128,138, + 2,3,68,1,209,211,254,228,1,101,252,181,254,244,169,154,200,170,170,1,31,160,1,19,254,225,209,198,139,150,118,206,254,162,0,0,0,1,0,130, + 255,255,4,136,6,159,0,19,0,0,1,16,0,35,34,39,17,33,21,33,17,51,17,22,51,50,54,25,1,51,4,136,254,222,240,165,155,2,204,252, + 128,180,141,190,132,207,180,4,210,254,204,254,216,23,254,30,172,6,160,252,141,22,160,1,6,1,227,0,0,2,0,60,0,1,5,144,6,159,0,2, + 0,13,0,0,1,33,9,1,35,3,1,35,9,1,35,53,33,1,4,122,253,158,1,19,1,174,215,235,254,107,220,2,26,254,123,255,5,84,253,239, + 5,246,253,248,252,206,1,246,253,79,3,95,2,150,169,252,156,0,0,0,0,1,0,60,255,226,6,71,6,160,0,21,0,0,1,22,0,35,32,0, + 53,17,33,17,35,17,33,17,30,1,51,50,54,53,17,51,6,71,2,254,213,208,254,255,254,243,254,176,180,2,183,2,179,168,129,195,179,2,12,243, + 254,201,1,90,208,3,244,254,137,2,23,251,94,139,241,209,171,2,158,0,0,1,0,130,0,1,4,136,6,160,0,17,0,0,1,53,52,38,43,1, + 17,35,17,51,17,33,50,22,29,1,51,21,3,15,88,132,253,180,180,1,0,189,215,190,2,55,159,155,139,252,5,6,159,253,252,189,167,98,160,0, + 0,1,0,111,255,226,5,20,6,179,0,33,0,0,1,16,0,35,34,0,17,38,55,23,6,21,20,22,51,50,54,53,18,0,53,52,54,51,50,22, + 21,35,38,35,34,7,22,0,5,20,254,152,244,243,254,170,1,183,137,129,230,168,211,199,2,252,250,195,125,145,195,194,1,145,125,2,2,3,0,2, + 53,254,231,254,198,1,58,1,35,230,195,131,137,159,228,215,231,204,1,28,1,76,246,129,159,159,142,142,125,184,254,197,0,1,0,60,0,1,4,66, + 6,160,0,17,0,0,37,17,35,38,2,61,1,35,53,33,21,6,22,59,1,17,51,17,3,143,238,214,209,190,1,118,13,90,159,241,179,1,2,116, + 1,1,5,180,20,159,109,102,249,3,138,249,97,0,0,0,0,1,0,110,0,1,4,82,6,160,0,21,0,0,1,16,4,7,17,35,17,38,36,25, + 1,51,17,30,1,59,1,62,1,53,17,51,4,82,254,194,76,187,91,254,188,180,1,163,97,131,94,149,181,4,135,254,217,225,1,253,131,2,125,1, + 229,1,35,2,25,253,229,199,169,1,164,203,2,27,0,0,0,3,0,80,255,225,5,152,6,179,0,10,0,21,0,51,0,0,1,35,34,6,7,20, + 22,51,50,54,53,1,52,38,35,34,6,23,21,51,50,54,55,14,1,43,1,17,33,21,33,21,14,1,7,46,1,53,52,54,59,1,17,33,53,33, + 53,62,1,51,50,22,2,156,194,69,133,2,127,72,80,119,2,61,120,88,99,97,1,179,104,120,191,1,222,192,179,1,90,254,166,2,214,148,176,218, + 213,181,194,254,130,1,126,2,184,161,190,226,2,57,93,126,125,95,104,96,4,13,100,89,135,90,181,121,100,159,211,254,231,151,239,156,203,2,2,199, + 178,147,225,1,25,149,181,190,194,188,0,0,0,1,0,100,255,226,3,172,4,189,0,17,0,0,1,16,33,32,17,55,51,7,16,51,50,17,38,0, + 53,51,22,0,3,172,254,91,254,93,38,176,34,242,239,1,254,122,187,1,1,126,1,170,254,56,1,210,207,207,254,186,1,60,212,1,107,212,164,254, + 150,0,0,0,0,2,0,100,255,227,3,192,6,179,0,18,0,26,0,0,1,16,33,32,17,16,37,55,54,39,38,53,51,20,23,22,15,1,4,3, + 16,39,6,17,16,33,50,3,192,254,89,254,75,1,139,19,47,147,147,183,129,130,48,19,1,62,180,246,254,1,1,243,2,33,253,194,2,60,2,8, + 65,67,167,105,106,142,65,136,133,180,73,123,254,50,1,183,21,20,254,72,254,80,0,0,0,2,0,90,254,30,4,76,4,105,0,24,0,36,0,0, + 37,20,0,35,34,0,53,16,37,54,55,52,35,34,31,1,7,39,16,33,32,3,20,7,4,3,52,38,39,6,2,21,20,22,51,50,54,4,76,254, + 255,243,232,254,234,1,210,171,1,179,156,2,6,160,15,1,69,1,83,2,169,1,125,180,145,167,169,170,183,145,132,191,42,215,254,203,1,54,214,1, + 166,141,119,130,147,134,49,40,87,1,8,254,228,127,130,169,254,135,149,246,29,28,254,255,137,174,212,213,0,2,0,100,254,40,6,19,4,97,0,31, + 0,39,0,0,1,2,33,32,17,52,55,38,35,34,17,16,5,4,23,35,38,37,6,7,39,54,55,36,17,16,33,50,23,54,33,32,3,16,35,32, + 17,16,33,50,6,19,1,254,94,254,78,28,87,117,246,1,101,2,43,5,199,11,254,104,150,116,122,107,156,254,158,1,133,179,111,102,0,255,1,163, + 180,239,254,245,1,11,239,2,80,253,227,2,40,142,66,164,254,173,254,11,193,202,212,158,99,3,162,108,113,47,253,1,227,1,236,172,177,253,249,1, + 122,254,135,254,98,0,0,0,0,1,0,100,254,29,3,152,4,96,0,23,0,0,5,16,33,32,17,55,51,7,16,51,50,25,1,16,35,34,21,23, + 35,39,16,33,32,17,3,152,254,116,254,88,33,172,25,244,226,225,200,55,172,49,1,110,1,139,63,254,92,1,166,225,227,254,232,1,22,3,19,1, + 2,244,226,220,1,134,254,111,0,1,0,100,254,29,3,172,4,96,0,34,0,0,5,16,33,32,17,55,51,7,16,33,22,17,53,52,39,35,53,51, + 54,53,52,35,34,21,23,35,39,16,33,32,17,20,7,22,21,3,172,254,111,254,73,37,174,32,1,4,221,170,166,129,200,235,200,22,176,23,1,121, + 1,159,211,218,61,254,90,1,160,229,229,254,236,2,1,26,134,216,26,152,92,217,207,191,165,155,1,84,254,162,210,133,104,254,0,0,0,3,0,41, + 255,227,3,157,6,180,0,15,0,23,0,31,0,0,1,16,33,32,17,16,55,38,19,16,37,4,17,6,7,4,3,16,7,38,17,16,51,50,3,54, + 35,34,23,2,23,54,3,157,254,92,254,90,193,236,1,1,91,1,70,1,120,1,76,180,242,241,243,238,188,1,171,177,1,1,175,174,2,13,253,214, + 2,42,1,113,97,113,1,14,1,69,17,17,254,172,177,116,68,254,39,1,165,1,1,254,92,254,97,4,201,250,220,254,229,1,1,0,0,2,0,100, + 255,227,6,4,4,96,0,22,0,30,0,0,19,16,33,50,23,54,51,32,17,2,3,35,0,17,18,35,34,7,22,21,2,33,32,1,16,35,34,17, + 16,51,50,100,1,164,245,104,126,146,1,143,2,229,224,1,19,2,232,101,111,23,28,254,115,254,96,2,148,242,238,236,244,2,11,2,85,188,183,253, + 236,254,192,254,230,1,21,1,64,1,142,186,74,189,253,212,2,40,1,202,254,54,254,100,0,1,0,100,0,0,3,192,4,96,0,15,0,0,1,16, + 3,35,18,17,16,32,17,16,19,35,2,17,16,32,3,192,143,183,146,254,12,145,184,141,3,92,2,68,254,244,254,201,1,32,1,35,1,144,254,109, + 254,224,254,223,1,56,1,15,2,25,0,0,0,1,0,90,254,29,3,165,4,86,0,28,0,0,5,18,33,32,17,55,51,7,16,33,22,17,53,52, + 43,1,53,51,36,53,52,39,51,22,21,20,7,4,17,3,165,2,254,109,254,70,50,170,40,1,9,218,232,180,103,1,41,182,233,121,239,1,3,62, + 254,91,1,152,239,230,254,235,2,1,27,157,254,148,70,192,179,172,168,183,207,97,91,254,243,0,0,0,0,1,0,100,254,40,8,32,4,106,0,48, + 0,0,1,6,3,35,18,53,16,35,34,3,7,35,39,16,35,34,17,7,35,39,16,35,34,17,16,5,4,19,35,38,37,4,7,39,54,55,36,17, + 16,33,50,23,54,51,50,23,54,51,32,8,32,1,199,215,236,219,216,2,11,151,12,202,197,10,150,10,222,219,3,8,1,178,67,175,49,254,67,254, + 176,132,109,130,230,253,197,1,143,213,92,96,188,205,88,94,206,1,143,2,170,236,254,244,1,4,244,1,43,254,249,225,225,1,12,254,244,225,225,1, + 7,254,163,254,62,224,102,254,184,231,84,30,152,128,111,39,229,1,213,1,227,203,213,217,207,0,0,0,0,2,0,100,255,226,3,172,6,179,0,20, + 0,29,0,0,1,16,33,32,17,16,33,22,23,17,52,35,34,29,1,35,53,16,33,32,17,3,38,39,32,17,16,33,50,17,3,172,254,111,254,73, + 1,186,127,101,208,217,183,1,144,1,122,170,68,150,254,240,1,7,227,1,188,254,38,2,63,2,33,11,49,1,78,211,200,47,47,1,84,254,160,254, + 45,44,10,254,106,254,78,1,89,0,0,0,0,2,0,130,255,225,3,202,6,169,0,16,0,25,0,0,1,16,33,32,25,1,16,41,1,21,33,34, + 21,17,54,55,32,3,16,35,6,7,17,16,51,50,3,202,254,82,254,102,1,78,1,162,254,48,118,139,146,1,129,180,251,123,116,237,253,2,25,253, + 200,1,241,3,123,1,92,146,142,254,110,64,11,253,215,1,157,10,59,254,107,254,145,0,0,1,0,100,255,255,5,229,4,96,0,28,0,0,1,18, + 1,35,0,17,2,35,34,17,21,35,53,16,35,34,17,2,1,35,0,17,16,33,50,23,54,51,32,5,229,1,254,237,209,1,47,1,210,231,165,231, + 211,1,1,56,209,254,230,1,136,225,87,97,220,1,133,2,86,254,210,254,216,1,22,1,64,1,126,254,167,210,210,1,89,254,130,254,206,254,219,1, + 36,1,51,2,10,227,227,0,0,1,0,100,255,226,3,172,6,169,0,28,0,0,1,16,33,32,17,55,51,7,16,51,50,17,16,43,1,53,51,50, + 55,52,36,53,51,20,4,21,20,7,22,3,172,254,91,254,93,18,178,16,239,241,199,174,129,194,28,254,175,193,1,45,180,225,2,1,253,225,1,217, + 200,198,254,177,1,147,1,109,150,171,159,153,194,100,200,168,175,72,148,0,0,1,0,100,254,29,3,171,4,105,0,24,0,0,5,18,33,32,3,55, + 51,7,16,51,50,25,1,5,22,21,16,5,53,32,39,54,37,53,37,3,171,1,254,99,254,87,2,20,180,20,242,247,254,100,227,254,57,1,41,1, + 1,254,215,3,42,64,254,93,1,162,148,148,254,234,1,25,3,247,79,135,114,254,220,2,164,150,117,71,118,178,0,0,0,1,0,100,0,0,5,250, + 6,169,0,35,0,0,1,16,1,35,0,17,2,35,34,17,21,35,53,18,35,34,17,16,1,35,0,17,16,19,18,37,21,4,1,21,55,50,23,54, + 51,32,5,250,254,226,229,1,79,2,228,222,167,1,220,232,1,80,238,254,234,254,254,1,168,254,118,254,196,182,217,91,96,220,1,146,2,75,254,219, + 254,219,1,8,1,66,1,137,254,158,195,195,1,98,254,119,254,190,254,247,1,43,1,32,1,141,1,73,1,72,64,167,23,254,81,41,77,253,253,0, + 0,1,0,130,255,226,3,202,6,158,0,19,0,0,1,16,33,32,25,1,51,17,16,33,50,17,54,2,53,55,51,7,20,18,3,202,254,102,254,82, + 170,1,4,230,1,200,6,182,27,218,1,227,253,255,2,16,4,172,251,84,254,124,1,117,169,1,16,127,170,164,93,254,204,0,0,0,0,2,0,90, + 254,29,4,226,5,112,0,12,0,25,0,0,19,16,37,3,51,3,4,17,16,0,33,32,0,19,2,18,51,50,18,17,16,37,19,35,19,4,90,2, + 5,23,178,23,1,255,254,197,254,251,254,248,254,192,180,1,220,184,173,230,254,175,23,177,22,254,175,1,58,2,200,95,1,15,254,237,92,253,50,254, + 193,254,41,1,210,1,75,254,210,254,157,1,91,1,54,2,48,146,253,129,2,126,144,0,0,1,0,10,254,29,3,182,4,146,0,32,0,0,5,16, + 33,32,17,55,51,7,16,33,50,25,1,38,35,34,21,3,35,3,52,43,1,39,55,23,51,50,23,54,51,32,17,3,182,254,110,254,71,25,178,23, + 1,5,232,2,135,123,10,143,10,156,82,109,20,87,80,143,79,67,160,1,48,64,254,93,1,163,227,227,254,233,1,23,3,103,182,140,254,165,1,91, + 120,40,161,50,187,187,254,199,0,2,0,100,254,29,6,33,4,96,0,50,0,58,0,0,19,16,33,32,23,54,51,32,3,20,7,22,29,1,6,4, + 33,32,36,61,1,52,54,22,29,1,20,22,51,50,54,61,1,52,43,1,53,51,50,54,39,16,35,34,7,30,1,21,16,33,32,1,16,35,34,17, + 16,51,50,100,1,161,1,3,93,120,188,1,137,1,251,223,1,254,216,254,234,254,226,254,232,99,100,153,214,235,160,183,80,27,83,185,3,212,159,97, + 10,10,254,93,254,89,2,150,245,237,237,245,2,101,1,251,198,193,254,82,250,163,106,152,92,180,225,188,119,29,31,67,68,30,29,52,115,154,111,88, + 167,151,181,155,1,55,174,60,92,34,254,23,1,229,1,113,254,145,254,166,0,1,0,100,254,29,3,152,6,159,0,25,0,0,5,16,33,32,17,55, + 51,7,16,51,50,25,1,38,39,34,21,23,35,39,16,33,22,23,17,51,3,152,254,119,254,85,33,182,35,247,223,103,173,164,50,177,42,1,62,167, + 124,170,63,254,92,1,164,225,225,254,232,1,24,3,190,75,11,201,246,206,1,124,10,80,2,153,0,0,0,1,0,100,254,41,5,230,4,95,0,37, + 0,0,5,54,55,0,17,16,33,50,23,54,51,32,17,20,7,35,18,53,2,35,34,17,7,35,39,16,35,34,17,16,5,4,21,35,52,39,38,7, + 1,16,80,179,254,81,1,140,216,96,91,202,1,153,168,201,192,2,224,219,3,158,5,224,218,2,2,1,110,179,230,191,194,179,60,53,1,41,1,149, + 1,227,231,231,254,53,217,250,1,3,208,1,65,254,233,196,196,1,23,254,167,254,41,225,170,241,167,113,43,173,0,0,0,1,0,100,254,29,3,172, + 4,78,0,27,0,0,5,16,33,32,17,55,51,7,16,51,50,25,1,6,7,32,17,52,55,51,6,21,16,51,54,55,17,51,3,172,254,103,254,81, + 18,184,22,253,237,124,128,254,122,175,207,203,211,145,107,170,66,254,95,1,160,150,147,254,233,1,25,1,118,63,10,1,173,220,214,224,210,254,222,11, + 62,2,138,0,0,2,0,60,255,226,3,162,6,179,0,30,0,40,0,0,1,16,33,32,17,16,33,22,23,17,52,35,34,29,1,20,6,38,61,1, + 54,35,7,53,51,50,23,54,51,32,17,3,17,46,1,39,34,17,16,51,50,3,162,254,131,254,53,1,162,135,122,164,128,71,78,1,126,139,134,90, + 88,82,164,1,56,170,54,122,72,242,254,236,1,169,254,57,2,33,2,63,10,44,1,153,140,150,86,53,39,39,53,88,128,52,202,184,184,254,238,251, + 228,2,6,17,21,5,254,77,254,107,0,0,0,1,0,130,0,0,3,202,6,179,0,27,0,0,1,55,52,35,34,21,17,54,51,32,17,16,3,35, + 18,17,16,35,34,7,17,35,17,16,33,32,21,7,2,90,22,160,164,148,116,1,150,173,211,203,239,132,118,170,1,78,1,65,17,5,37,152,116,207, + 254,153,71,254,52,254,219,254,176,1,83,1,30,1,68,57,252,131,5,83,1,96,245,153,0,1,0,90,254,29,4,56,4,65,0,32,0,0,1,20, + 7,22,17,2,33,32,17,53,16,19,51,2,17,21,16,33,32,17,2,43,1,53,51,50,39,54,38,39,51,30,1,4,26,199,229,1,254,20,254,15, + 116,187,123,1,62,1,64,2,215,173,166,199,2,2,215,10,186,10,196,2,171,167,96,87,254,204,254,4,3,30,163,1,40,1,59,254,204,254,198,152, + 253,110,1,108,1,61,135,206,87,141,182,132,149,0,0,0,0,2,0,100,255,227,3,171,6,159,0,10,0,19,0,0,1,18,33,32,17,16,33,54, + 23,17,51,3,17,38,35,34,17,16,51,50,3,171,1,254,91,254,93,1,163,92,159,169,169,132,120,238,239,251,1,247,253,236,2,52,2,43,1,71, + 2,163,251,46,1,167,66,254,97,254,88,0,0,2,0,131,255,226,3,232,6,179,0,30,0,39,0,0,19,2,33,50,23,54,59,1,21,39,34,23, + 21,20,6,38,61,1,52,35,34,21,17,54,51,32,17,16,33,32,17,23,16,51,32,17,16,35,38,7,131,1,1,57,164,82,88,90,133,138,126,1, + 78,71,128,159,127,125,1,162,254,43,254,141,170,226,1,8,242,127,121,5,161,1,18,184,184,202,52,128,88,53,39,40,52,86,150,150,254,96,71,253, + 213,253,203,1,249,36,254,183,1,169,1,159,1,62,0,0,0,1,0,100,254,29,3,197,6,158,0,37,0,0,1,51,17,33,21,33,21,22,0,21, + 16,33,32,3,55,51,7,16,51,50,19,52,0,3,53,35,34,21,20,59,1,21,35,4,17,16,33,51,2,10,168,1,19,254,237,2,1,12,254,94, + 254,91,1,32,175,27,242,238,1,255,0,3,86,190,154,47,47,254,212,1,85,81,6,158,253,164,130,75,250,254,17,206,254,95,1,161,229,239,254,245, + 1,24,166,2,12,1,2,75,183,166,134,1,1,43,1,59,0,2,0,130,255,226,3,202,6,158,0,10,0,19,0,0,1,16,33,32,25,1,51,17, + 54,51,32,3,16,35,34,7,17,16,51,50,3,202,254,98,254,86,170,137,127,1,150,180,239,96,155,254,236,2,40,253,186,2,47,4,141,253,131,63, + 253,200,1,172,59,254,76,254,137,0,0,0,0,1,0,20,254,30,3,142,4,147,0,35,0,0,1,7,37,3,4,23,6,4,35,53,50,54,53,38, + 47,1,19,37,55,5,55,54,53,52,38,43,1,53,51,50,23,22,21,20,15,1,3,142,81,254,232,143,1,9,1,1,254,179,238,160,230,1,192,115, + 214,254,136,81,1,102,86,19,63,76,69,68,145,79,82,35,92,1,213,128,176,254,210,120,181,188,208,150,115,112,152,50,69,1,160,186,140,194,154,34, + 37,45,52,135,46,45,140,85,65,156,0,0,0,1,0,100,255,226,3,172,6,179,0,39,0,0,1,16,33,32,17,55,51,7,16,51,50,17,52,39, + 35,53,51,50,53,54,43,1,53,51,50,55,52,36,53,51,20,4,21,20,7,22,21,20,7,22,3,172,254,97,254,87,40,180,40,239,241,113,163,163, + 101,2,103,163,162,90,2,254,130,167,1,129,163,183,177,189,1,129,254,97,1,179,148,148,254,217,1,11,220,2,130,156,128,133,146,109,149,165,86,138, + 183,160,61,69,136,145,72,113,0,1,0,120,255,226,3,192,6,179,0,39,0,0,1,16,33,32,25,1,51,17,16,51,50,17,52,43,1,53,51,50, + 53,54,43,1,53,51,50,55,52,38,53,51,20,22,23,20,7,22,21,20,7,22,3,192,254,91,254,93,170,243,247,119,183,183,111,2,113,183,182,100, + 2,252,186,239,4,173,183,177,188,1,129,254,97,1,239,4,184,251,72,254,157,1,11,227,120,151,143,123,191,109,81,193,136,89,162,179,62,69,146,135, + 72,113,0,0,0,2,0,100,254,224,3,170,4,96,0,17,0,25,0,0,23,50,55,36,17,16,33,32,17,18,5,22,51,21,38,39,6,7,19,16, + 23,54,17,16,35,34,141,151,70,254,250,1,166,1,160,2,254,237,82,145,225,145,158,223,139,242,236,238,240,84,115,178,1,95,2,48,253,208,254,162, + 179,115,204,73,209,207,75,3,83,254,157,122,121,1,100,1,161,0,0,0,0,1,0,100,254,29,3,172,4,95,0,29,0,0,5,16,33,32,17,55, + 51,7,18,51,50,17,53,16,7,35,53,51,36,61,1,5,21,35,17,37,16,5,4,17,3,172,254,89,254,95,31,187,39,1,242,239,221,181,111,1, + 35,254,66,174,3,31,254,218,1,38,61,254,90,1,164,226,221,254,227,1,31,164,1,30,2,131,90,244,121,19,244,1,117,31,253,211,63,128,254,244, + 0,1,0,100,254,29,3,171,6,179,0,37,0,0,5,16,33,32,17,55,51,7,16,51,50,17,53,52,43,1,53,51,36,17,6,35,36,17,16,33, + 21,32,21,20,55,50,55,17,18,5,4,21,3,171,254,95,254,90,32,180,32,242,236,242,157,67,1,77,92,142,254,87,1,169,255,0,253,196,221,1, + 254,228,1,27,65,254,94,1,168,222,226,254,221,1,33,209,253,138,17,1,181,41,2,1,135,1,118,132,242,252,1,176,254,229,254,128,84,119,252,0, + 0,3,0,100,255,226,4,31,6,179,0,23,0,31,0,39,0,0,1,21,16,33,32,17,16,37,33,17,33,32,17,16,33,32,17,21,51,21,35,17, + 51,21,5,33,34,21,20,51,50,53,1,20,51,33,53,52,35,34,3,173,254,89,254,94,1,159,1,10,254,246,254,97,1,166,1,163,114,114,114,254, + 233,254,251,235,246,250,254,16,235,1,5,250,246,2,54,238,254,154,1,102,1,119,1,1,19,1,119,1,105,254,151,239,136,254,237,138,1,230,226,237, + 3,238,237,239,221,0,0,0,0,2,0,100,254,29,6,57,4,96,0,27,0,36,0,0,1,18,33,34,39,21,16,33,53,50,53,17,16,35,34,17, + 16,33,21,36,17,16,33,50,23,54,51,32,3,16,35,34,17,21,16,55,50,6,57,2,254,89,136,96,254,94,248,248,242,1,4,254,72,1,166,231, + 93,89,237,1,167,181,247,227,232,242,2,39,253,187,136,199,254,122,140,248,2,147,1,161,254,83,254,101,138,3,2,34,2,56,236,236,253,199,1,174, + 254,197,231,254,185,1,0,0,0,1,0,90,254,29,4,16,4,96,0,31,0,0,5,16,33,32,17,16,37,36,53,52,35,34,7,23,35,39,16,33, + 32,19,20,5,4,21,16,33,32,17,52,39,51,22,4,16,254,20,254,54,1,55,1,54,159,191,2,5,156,10,1,98,1,79,2,254,203,254,202,1, + 26,1,52,96,190,86,25,254,54,1,202,1,57,188,189,141,175,170,60,47,1,66,254,207,222,185,184,240,254,185,1,76,129,152,158,0,0,1,0,100, + 254,29,3,172,4,78,0,27,0,0,19,51,17,22,23,50,17,52,39,51,22,21,16,33,34,39,17,16,51,50,17,39,51,23,16,33,32,17,100,170, + 108,144,211,223,217,185,254,122,130,122,251,239,29,180,29,254,95,254,89,4,77,253,108,62,1,1,34,181,253,215,219,254,83,43,254,174,254,225,1,27, + 141,144,254,92,1,167,0,0,0,2,0,80,254,29,4,66,4,104,0,24,0,36,0,0,19,52,18,51,32,18,21,16,5,6,7,20,51,50,47,1, + 55,23,16,33,32,19,52,55,36,19,20,18,51,50,18,53,52,38,35,34,6,80,245,253,1,8,248,254,4,131,1,179,156,2,6,160,15,254,187,254, + 173,2,149,254,153,180,147,168,194,142,152,178,141,180,2,72,227,1,61,254,190,222,254,70,101,119,130,147,134,49,40,87,254,248,1,28,126,131,170,1, + 100,128,254,246,1,9,127,186,220,221,0,0,0,1,0,100,255,99,3,172,4,97,0,27,0,0,5,53,52,39,38,35,34,7,39,54,55,36,17,16, + 37,32,17,7,35,55,16,35,34,17,16,5,22,23,2,233,59,59,95,131,67,131,67,136,254,206,1,175,1,153,11,195,26,226,254,1,66,141,124,157, + 1,3,77,75,144,79,109,48,193,1,132,1,191,2,254,84,203,199,1,36,254,188,254,169,151,44,157,0,0,3,0,110,255,236,3,39,3,224,0,3, + 0,7,0,11,0,0,19,51,21,35,5,51,21,35,5,51,21,35,110,205,205,1,242,199,199,254,14,202,202,3,224,189,202,186,248,187,0,2,0,100, + 3,92,2,40,6,179,0,15,0,23,0,0,1,50,3,16,7,34,25,1,52,59,1,21,33,34,29,1,23,52,35,34,7,20,51,50,1,74,223,1, + 228,224,198,251,254,236,65,234,123,110,1,116,118,5,178,254,220,254,207,1,1,50,1,99,194,96,76,169,208,183,189,195,0,2,0,16,0,3,5,104, + 5,216,0,2,0,6,0,61,64,12,66,0,149,6,129,1,149,5,8,3,6,7,16,212,196,196,49,0,47,236,244,236,48,75,83,88,64,18,1,17, + 4,6,5,2,17,3,4,3,1,17,5,0,17,6,5,6,5,7,16,236,16,236,7,16,236,8,16,236,89,9,2,37,1,35,1,1,35,1,153,1, + 156,1,16,253,199,229,253,198,5,46,251,156,4,100,170,250,43,5,213,0,255,255,0,16,0,0,5,104,8,75,16,39,2,156,0,192,1,69,18,6, + 6,180,0,0,255,255,0,16,0,0,5,104,5,213,18,6,3,41,0,0,255,255,0,16,0,0,5,104,7,79,16,39,22,193,4,192,1,116,18,6, + 6,180,0,0,0,2,0,201,0,0,5,176,5,213,0,2,0,6,0,64,183,2,28,5,0,28,3,4,7,16,252,236,212,236,49,0,181,66,0,1, + 4,175,3,47,236,57,57,48,75,83,88,64,18,2,17,5,4,6,1,17,3,6,3,2,17,5,0,17,4,5,4,4,7,16,237,16,237,7,16,237, + 16,8,237,89,1,17,9,1,17,1,21,1,115,3,163,251,179,4,231,4,194,252,78,1,218,253,22,5,213,253,135,228,255,255,0,201,0,0,5,176, + 7,79,16,39,22,193,4,41,1,116,18,6,6,182,0,0,255,255,0,201,0,0,5,176,7,78,16,39,22,185,4,41,1,117,18,6,6,182,0,0, + 255,255,0,201,0,0,5,176,5,213,16,39,6,214,1,101,0,0,18,6,6,182,0,0,0,2,0,119,0,0,5,94,5,213,0,2,0,6,0,63, + 182,2,28,3,1,28,4,7,16,220,236,212,236,49,0,181,66,0,2,6,175,3,47,236,57,57,48,75,83,88,64,18,1,17,5,6,4,2,17,3, + 4,3,1,17,5,0,17,6,5,6,4,7,16,237,16,237,7,16,237,16,8,237,89,9,2,19,1,53,1,4,180,252,93,3,163,170,251,25,4,231, + 4,194,254,40,254,38,254,240,2,120,228,2,121,0,0,0,255,255,0,119,0,0,5,94,7,79,16,39,22,193,5,49,1,116,18,6,6,186,0,0, + 255,255,0,201,0,3,6,157,5,216,16,39,6,178,1,53,0,0,16,6,6,214,0,0,255,255,0,16,0,3,6,54,5,216,16,39,6,214,4,161, + 0,0,16,6,6,178,0,0,255,255,0,201,0,0,6,157,5,213,16,38,6,214,0,0,16,7,6,180,1,53,0,0,255,255,0,16,0,0,6,54, + 5,213,16,39,6,214,4,161,0,0,16,6,6,180,0,0,255,255,0,201,0,0,6,157,7,79,16,39,6,181,1,53,0,0,16,6,6,214,0,0, + 255,255,0,16,0,0,6,54,7,79,16,38,6,181,0,0,16,7,6,214,4,161,0,0,255,255,0,201,0,0,7,69,5,213,16,39,6,182,1,149, + 0,0,16,6,6,214,0,0,255,255,0,201,0,0,7,69,5,213,16,39,6,214,5,176,0,0,16,6,6,182,0,0,255,255,0,201,0,0,7,69, + 7,79,16,39,6,183,1,149,0,0,16,6,6,214,0,0,255,255,0,201,0,0,7,69,7,79,16,38,6,183,0,0,16,7,6,214,5,176,0,0, + 255,255,0,201,0,0,5,176,7,79,16,39,22,193,6,201,0,48,18,6,6,183,0,0,255,255,0,201,0,0,6,243,5,213,16,39,6,186,1,149, + 0,0,16,6,6,214,0,0,255,255,0,119,0,0,7,69,5,213,16,38,6,186,0,0,16,7,6,214,5,176,0,0,255,255,0,201,0,0,6,243, + 7,79,16,39,6,187,1,149,0,0,16,6,6,214,0,0,255,255,0,119,0,0,7,69,7,79,16,38,6,187,0,0,16,7,6,214,5,176,0,0, + 255,255,0,119,0,0,5,94,7,79,16,39,22,193,3,63,0,48,18,6,6,187,0,0,0,1,0,201,5,9,1,149,5,213,0,3,0,0,19,51, + 21,35,201,204,204,5,213,204,0,2,0,137,2,156,3,231,5,223,0,2,0,6,0,0,1,3,33,5,1,51,1,2,56,246,1,238,253,89,1,103, + 144,1,103,5,96,253,170,110,3,67,252,189,0,1,0,94,2,218,2,229,5,183,0,3,0,0,19,1,23,1,94,2,25,110,253,231,3,55,2,128, + 93,253,128,0,0,1,0,94,2,218,2,229,5,183,0,3,0,0,1,7,1,55,2,229,110,253,231,110,3,55,93,2,128,93,0,0,0,1,0,137, + 3,48,2,173,5,100,0,17,0,0,1,20,6,34,38,53,17,51,17,20,22,51,50,54,53,52,53,51,2,173,159,230,159,122,87,65,64,88,122,4, + 67,115,160,160,115,1,33,254,223,65,87,88,64,43,246,0,0,1,0,137,3,33,2,173,5,85,0,17,0,0,1,17,35,52,53,52,38,35,34,6, + 21,17,35,17,52,54,50,22,2,173,122,88,64,65,87,122,159,230,159,4,66,254,223,246,43,64,88,87,65,254,223,1,33,115,160,160,0,1,0,137, + 3,48,2,181,5,85,0,16,0,0,1,33,53,33,50,54,53,52,38,35,33,53,33,50,22,20,6,1,163,254,230,1,26,64,88,88,64,254,230,1, + 26,115,159,159,3,48,123,88,64,63,88,123,159,230,160,0,0,2,0,137,3,48,2,173,5,85,0,11,0,19,0,0,1,52,38,35,34,6,21,20, + 22,51,50,62,1,20,6,34,38,52,54,50,2,51,88,64,65,87,87,65,64,88,122,159,230,159,159,230,4,67,63,88,87,64,65,87,88,179,230,160, + 160,230,159,0,0,2,0,72,2,157,3,62,5,222,0,3,0,7,0,0,9,1,23,1,37,1,23,1,1,153,1,30,135,254,227,254,39,1,29,135, + 254,227,2,206,3,16,49,252,240,49,3,16,49,252,240,0,0,2,0,137,2,156,2,165,5,223,0,3,0,7,0,31,183,9,3,93,0,7,93,4, + 8,16,220,236,220,236,196,49,0,182,3,4,247,1,5,145,8,16,244,60,236,50,48,1,17,51,17,33,17,51,17,2,21,144,253,228,144,2,156,3, + 67,252,189,3,67,252,189,0,0,1,0,201,2,126,1,149,3,75,0,3,0,0,19,51,21,35,201,204,204,3,75,205,0,1,0,137,4,6,2,173, + 4,129,0,3,0,0,1,33,53,33,2,173,253,220,2,36,4,6,123,0,0,1,0,137,3,49,2,173,5,86,0,11,0,0,1,21,35,53,35,53, + 51,53,51,21,51,21,1,216,122,213,213,122,213,4,6,213,213,123,213,213,123,0,0,0,0,1,0,137,3,49,2,173,5,135,0,7,0,0,1,17, + 35,17,35,53,33,21,1,216,122,213,2,36,5,12,254,37,1,219,123,123,255,255,0,16,0,3,8,58,5,216,16,39,6,207,5,85,0,0,16,6, + 6,178,0,0,255,255,0,16,0,0,6,199,5,213,16,39,6,207,3,226,0,0,16,6,6,180,0,0,255,255,0,201,0,0,7,34,5,213,16,39, + 6,207,4,61,0,0,16,6,6,182,0,0,255,255,0,119,0,0,8,113,5,213,16,39,6,207,5,140,0,0,16,6,6,186,0,0,255,255,0,16, + 0,0,5,104,5,213,18,6,0,57,0,0,255,255,0,16,0,0,5,104,8,75,16,39,2,156,0,192,1,69,18,6,6,224,0,0,255,255,0,16, + 0,0,5,104,5,213,18,6,3,48,0,0,255,255,0,16,0,0,5,104,7,79,16,39,22,193,4,192,1,116,18,6,6,224,0,0,0,1,0,119, + 0,0,5,94,5,213,0,6,0,58,181,1,28,4,3,0,7,16,220,60,212,236,49,0,179,66,3,175,6,47,236,48,75,83,88,64,18,1,17,3, + 4,5,0,17,6,6,5,1,17,4,2,17,3,3,4,4,7,16,237,16,237,7,16,237,16,8,237,89,55,9,1,53,1,21,1,119,4,77,251,179, + 4,231,251,25,182,2,52,2,48,187,253,135,228,253,136,0,255,255,0,119,0,0,5,94,7,79,16,39,22,193,4,41,1,116,18,6,6,226,0,0, + 255,255,0,119,0,0,5,94,7,78,16,39,22,185,4,41,1,117,18,6,6,226,0,0,255,255,0,119,0,0,5,94,5,213,16,39,6,214,0,182, + 0,0,18,6,6,226,0,0,0,1,0,119,0,0,5,94,5,213,0,6,0,58,181,5,0,6,28,3,7,16,220,236,204,50,49,0,179,66,4,175, + 1,47,236,48,75,83,88,64,18,6,17,4,3,2,0,17,1,1,2,6,17,3,5,17,4,4,3,4,7,16,237,16,237,7,16,237,16,8,237,89, + 37,21,1,53,1,21,1,5,94,251,25,4,231,251,179,182,182,2,120,228,2,121,187,253,208,0,0,0,255,255,0,119,0,0,5,94,7,79,16,39, + 22,193,5,49,1,116,18,6,6,230,0,0,255,255,0,201,0,0,6,157,5,213,16,39,6,222,1,53,0,0,16,6,6,214,0,0,255,255,0,16, + 0,0,6,54,5,213,18,38,0,57,0,0,16,7,6,214,4,161,0,0,255,255,0,201,0,0,6,157,5,213,16,39,6,224,1,53,0,0,16,6, + 6,214,0,0,255,255,0,16,0,0,6,54,5,213,16,38,6,224,0,0,16,7,6,214,4,161,0,0,255,255,0,201,0,0,6,157,7,79,16,39, + 6,225,1,53,0,0,16,6,6,214,0,0,255,255,0,16,0,0,6,54,7,79,16,38,6,225,0,0,16,7,6,214,4,161,0,0,255,255,0,201, + 0,0,6,243,5,213,16,39,6,226,1,149,0,0,16,6,6,214,0,0,255,255,0,119,0,0,7,69,5,213,16,38,6,226,0,0,16,7,6,214, + 5,176,0,0,255,255,0,201,0,0,6,243,7,79,16,39,6,227,1,149,0,0,16,6,6,214,0,0,255,255,0,119,0,0,7,69,7,79,16,38, + 6,227,0,0,16,7,6,214,5,176,0,0,255,255,0,201,0,0,6,243,5,213,16,39,6,230,1,149,0,0,16,6,6,214,0,0,255,255,0,119, + 0,0,7,69,5,213,16,38,6,230,0,0,16,7,6,214,5,176,0,0,255,255,0,201,0,0,6,243,7,79,16,39,6,231,1,149,0,0,16,6, + 6,214,0,0,255,255,0,119,0,0,7,69,7,79,16,38,6,231,0,0,16,7,6,214,5,176,0,0,255,255,0,119,0,0,5,94,7,78,16,39, + 22,185,5,49,1,117,18,6,6,230,0,0,0,1,0,137,2,155,3,160,5,223,0,6,0,60,180,1,5,0,3,7,16,220,204,50,57,49,0,181, + 66,1,247,4,145,7,16,244,228,48,75,83,88,64,18,6,125,4,3,2,0,125,1,1,2,6,125,3,5,125,4,4,3,4,7,16,237,16,237,7, + 16,237,16,8,237,89,1,21,1,53,1,21,1,3,160,252,233,3,23,253,96,3,14,115,1,98,128,1,98,115,254,209,0,1,0,137,2,156,1,25, + 5,223,0,3,0,20,179,2,93,0,4,16,220,236,49,0,180,3,247,1,145,4,16,244,236,48,19,17,51,17,137,144,2,156,3,67,252,189,0,0, + 255,255,0,178,255,227,5,41,5,213,18,6,0,56,0,0,255,255,0,178,0,0,5,41,8,75,16,39,2,156,0,240,1,69,18,6,6,251,0,0, + 0,1,0,178,0,0,5,41,5,242,0,17,0,42,64,9,10,28,8,56,17,28,0,65,18,16,252,75,176,16,84,88,185,0,0,255,192,56,89,236, + 252,236,49,0,181,13,149,4,145,9,0,47,60,244,236,48,51,17,16,0,33,32,0,25,1,35,17,52,38,35,34,6,21,17,178,1,33,1,27,1, + 26,1,33,203,174,194,195,174,3,164,1,36,1,42,254,214,254,220,252,92,3,139,240,211,211,240,252,117,255,255,0,178,0,0,5,41,7,79,16,39, + 22,193,4,231,1,116,18,6,6,251,0,0,0,1,0,119,0,0,5,94,5,213,0,17,0,28,182,4,25,13,50,0,9,18,16,220,60,244,236,49, + 0,182,7,149,9,129,1,149,16,47,236,244,236,48,55,33,32,0,17,16,0,41,1,53,33,32,0,17,16,0,41,1,119,1,190,1,53,1,31,254, + 225,254,203,254,66,1,159,1,178,1,150,254,104,254,80,254,97,166,1,24,1,46,1,44,1,23,166,254,151,254,128,254,126,254,150,0,255,255,0,119, + 0,0,5,94,7,79,16,39,22,193,4,199,1,116,18,6,6,253,0,0,255,255,0,119,0,0,5,94,7,78,16,39,22,185,4,199,1,117,18,6, + 6,253,0,0,255,255,0,119,0,0,5,94,5,213,16,39,6,214,0,182,0,0,18,6,6,253,0,0,0,1,0,121,0,0,5,96,5,213,0,17, + 0,29,183,0,9,50,14,25,5,16,18,16,252,236,244,60,49,0,182,11,149,8,129,17,149,2,47,236,244,236,48,37,21,33,32,0,17,16,0,41, + 1,21,33,32,0,17,16,0,33,5,96,254,97,254,80,254,104,1,150,1,178,1,159,254,66,254,203,254,225,1,31,1,53,166,166,1,106,1,130,1, + 128,1,105,166,254,233,254,212,254,210,254,232,255,255,0,121,0,0,5,96,7,79,16,39,22,193,5,34,1,116,18,6,7,1,0,0,255,255,0,201, + 255,227,6,172,5,213,16,38,6,214,0,0,16,7,6,249,1,131,0,0,255,255,0,178,255,227,6,165,5,213,16,39,6,214,5,16,0,0,16,6, + 6,249,0,0,255,255,0,201,0,0,6,172,5,242,16,39,6,251,1,131,0,0,16,6,6,214,0,0,255,255,0,178,0,0,6,165,5,242,16,38, + 6,251,0,0,16,7,6,214,5,16,0,0,255,255,0,201,0,0,6,172,7,79,16,39,6,252,1,131,0,0,16,6,6,214,0,0,255,255,0,178, + 0,0,6,165,7,79,16,38,6,252,0,0,16,7,6,214,5,16,0,0,255,255,0,201,0,0,6,243,5,213,16,39,6,253,1,149,0,0,16,6, + 6,214,0,0,255,255,0,119,0,0,6,189,5,213,16,39,6,214,5,40,0,0,16,6,6,253,0,0,255,255,0,201,0,0,6,243,7,79,16,39, + 6,254,1,149,0,0,16,6,6,214,0,0,255,255,0,119,0,0,6,189,7,79,16,38,6,254,0,0,16,7,6,214,5,40,0,0,255,255,0,201, + 0,0,7,29,5,213,16,39,7,1,1,189,0,0,16,6,6,214,0,0,255,255,0,121,0,0,6,189,5,213,16,39,6,214,5,40,0,0,16,6, + 7,1,0,0,255,255,0,201,0,0,7,29,7,79,16,39,7,2,1,189,0,0,16,6,6,214,0,0,255,255,0,121,0,0,6,189,7,79,16,38, + 7,2,0,0,16,7,6,214,5,40,0,0,255,255,0,240,0,0,7,29,5,213,16,39,7,1,1,189,0,0,16,6,23,21,0,0,0,1,0,137, + 2,156,3,8,5,223,0,17,0,31,181,9,0,14,126,5,18,16,220,236,204,50,49,0,64,9,17,221,1,247,11,221,8,145,18,16,244,236,244,236, + 48,1,21,35,32,36,53,52,36,33,51,21,35,34,6,21,20,22,51,3,8,110,254,240,254,255,1,0,1,17,110,129,205,153,190,168,3,10,110,203, + 215,215,202,110,147,160,185,123,255,255,0,178,255,227,6,149,5,223,16,39,6,248,5,124,0,0,16,6,6,249,0,0,255,255,0,178,0,0,6,149, + 5,242,16,39,6,248,5,124,0,0,16,6,6,251,0,0,255,255,0,119,0,0,6,125,5,223,16,39,6,248,5,100,0,0,16,6,6,253,0,0, + 255,255,0,121,0,0,6,175,5,223,16,39,6,248,5,150,0,0,16,6,7,1,0,0,0,2,0,70,0,0,4,62,5,242,0,11,0,25,0,37, + 64,9,12,9,28,23,3,25,17,16,26,16,252,236,220,236,50,49,0,64,9,6,149,12,14,0,149,20,145,24,47,244,236,220,57,238,48,1,34,6, + 21,20,22,51,50,54,53,52,38,19,6,7,34,36,53,52,36,51,50,4,21,17,35,2,66,122,173,200,95,128,178,204,204,128,178,235,254,239,1,35, + 217,236,1,16,202,5,82,164,151,168,148,169,147,164,151,253,51,73,1,240,236,250,225,240,236,251,234,0,255,255,0,201,0,0,4,193,8,75,16,39, + 2,156,0,192,1,69,18,6,7,25,0,0,0,2,0,201,0,0,4,193,5,242,0,11,0,25,0,37,64,9,9,25,21,13,3,28,15,4,26,16, + 252,236,50,220,236,49,0,64,9,6,149,12,24,0,149,18,145,14,47,244,236,220,57,238,48,1,34,6,21,20,22,51,50,54,53,52,38,1,17,35, + 17,52,36,51,50,4,21,20,4,35,38,2,197,102,204,178,128,95,200,173,254,84,202,1,16,236,217,1,35,254,239,235,178,5,82,151,164,147,169,148, + 168,151,164,253,51,253,123,4,22,236,240,225,250,236,240,1,255,255,0,201,0,0,4,193,7,79,16,39,22,193,4,192,1,116,18,6,7,25,0,0, + 0,2,0,70,255,227,4,62,5,213,0,11,0,25,0,40,64,9,12,3,28,15,9,25,21,16,26,16,252,236,220,236,50,49,0,64,11,6,149,12, + 24,0,149,18,140,14,145,26,16,236,244,238,212,57,236,48,37,50,54,53,52,38,35,34,6,21,20,22,1,17,51,17,20,4,35,34,36,53,52,36, + 51,22,2,66,102,204,178,128,95,200,173,1,172,202,254,240,236,217,254,221,1,17,235,178,131,151,164,147,169,148,168,151,164,2,205,2,133,251,234,236, + 240,225,250,236,240,1,0,0,255,255,0,70,255,227,4,62,7,79,16,39,22,193,5,211,1,116,18,6,7,27,0,0,255,255,0,70,255,227,4,252, + 7,78,16,39,22,185,5,211,1,117,18,6,7,27,0,0,0,2,0,201,255,227,4,193,5,213,0,11,0,25,0,40,64,9,3,25,17,25,9,28, + 23,4,26,16,252,236,50,220,236,49,0,64,11,6,149,12,14,0,149,20,140,24,145,26,16,236,244,238,212,57,236,48,37,50,54,53,52,38,35,34, + 6,21,20,22,3,54,55,50,4,21,20,4,35,34,36,53,17,51,2,197,122,173,200,95,128,178,204,204,128,178,235,1,17,254,221,217,236,254,240,202, + 131,164,151,168,148,169,147,164,151,2,205,73,1,240,236,250,225,240,236,4,22,0,0,0,255,255,0,201,255,227,4,193,7,79,16,39,22,193,3,53, + 1,116,18,6,7,30,0,0,255,255,0,201,0,0,6,24,5,242,16,39,7,23,1,218,0,0,16,6,6,214,0,0,255,255,0,70,0,0,5,179, + 5,242,16,39,6,214,4,30,0,0,16,6,7,23,0,0,255,255,0,201,0,0,6,63,5,242,16,39,7,25,1,126,0,0,16,6,6,214,0,0, + 255,255,0,201,0,0,6,17,5,242,16,39,6,214,4,124,0,0,16,6,7,25,0,0,255,255,0,201,0,0,6,63,7,79,16,38,6,214,0,0, + 16,7,7,26,1,126,0,0,255,255,0,201,0,0,6,17,7,79,16,38,7,26,0,0,16,7,6,214,4,124,0,0,255,255,0,201,255,227,6,24, + 5,213,16,39,7,27,1,218,0,0,16,6,6,214,0,0,255,255,0,70,255,227,5,179,5,213,16,38,7,27,0,0,16,7,6,214,4,30,0,0, + 255,255,0,201,255,227,6,24,7,79,16,39,7,28,1,218,0,0,16,6,6,214,0,0,255,255,0,70,255,227,5,179,7,79,16,38,7,28,0,0, + 16,7,6,214,4,30,0,0,255,255,0,201,255,227,6,63,5,213,16,39,7,30,1,126,0,0,16,6,6,214,0,0,255,255,0,201,255,227,6,17, + 5,213,16,38,7,30,0,0,16,7,6,214,4,124,0,0,255,255,0,201,255,227,6,63,7,79,16,39,7,31,1,126,0,0,16,6,6,214,0,0, + 255,255,0,201,255,227,6,17,7,79,16,38,7,31,0,0,16,7,6,214,4,124,0,0,255,255,0,240,255,227,6,63,5,213,16,38,23,21,0,0, + 16,7,7,30,1,126,0,0,0,2,0,137,2,139,3,9,5,223,0,11,0,25,0,36,183,3,126,17,9,25,93,24,26,16,220,236,50,212,236,49, + 0,64,10,6,221,14,0,221,20,247,24,145,26,16,244,244,252,212,236,48,1,50,54,53,52,38,35,34,6,21,20,22,3,54,51,50,22,21,20,6, + 35,34,38,53,17,51,1,201,88,80,94,74,92,84,97,97,81,95,148,172,183,137,149,171,144,2,249,86,70,84,72,85,71,81,75,1,125,41,134,132, + 140,126,134,132,2,74,0,0,0,2,0,56,2,139,2,184,5,223,0,11,0,26,0,0,1,50,54,53,52,38,35,34,6,21,20,22,1,48,17,51, + 17,20,6,35,34,38,53,52,54,51,50,1,120,79,97,84,92,74,94,80,1,8,144,171,149,137,183,172,148,95,2,249,75,81,71,85,72,84,70,86, + 1,125,1,105,253,182,132,134,126,140,132,134,255,255,0,70,0,0,5,145,5,242,16,39,6,248,4,120,0,0,16,6,7,23,0,0,255,255,0,201, + 0,0,5,195,5,242,16,39,6,248,4,170,0,0,16,6,7,25,0,0,255,255,0,70,255,227,5,145,5,223,16,39,6,248,4,120,0,0,16,6, + 7,27,0,0,255,255,0,201,255,227,5,195,5,223,16,39,6,248,4,170,0,0,16,6,7,30,0,0,0,1,0,70,0,0,4,62,5,242,0,15, + 0,27,182,10,28,7,0,28,1,16,16,220,236,220,236,49,0,181,0,13,149,4,145,8,47,244,236,204,48,1,35,52,36,51,50,4,21,17,35,17, + 52,38,35,34,6,1,16,202,1,35,217,236,1,16,202,204,102,128,178,4,23,250,225,240,236,251,234,4,23,164,151,169,255,255,0,201,0,0,4,193, + 8,75,16,39,2,156,0,192,1,69,18,6,7,55,0,0,0,1,0,201,0,0,4,193,5,242,0,15,0,28,183,0,28,15,6,28,9,4,16,16, + 252,236,220,236,49,0,181,15,3,149,12,145,8,47,244,236,204,48,1,52,38,35,34,6,21,17,35,17,52,36,51,50,4,21,3,247,178,128,102,204, + 202,1,16,236,217,1,35,4,23,146,169,151,164,251,233,4,22,236,240,225,250,0,0,0,255,255,0,201,0,0,4,193,7,79,16,39,22,193,4,192, + 1,116,18,6,7,55,0,0,0,1,0,70,255,227,4,62,5,213,0,15,0,30,182,6,28,9,0,28,15,16,16,220,236,220,236,49,0,183,0,3, + 149,12,140,7,145,16,16,228,244,238,204,48,1,20,22,51,50,54,53,17,51,17,20,4,35,34,36,53,1,16,178,128,102,204,202,254,240,236,217,254, + 221,1,190,146,169,151,164,4,23,251,234,236,240,225,250,0,255,255,0,70,255,227,4,62,7,79,16,39,22,193,5,211,1,116,18,6,7,57,0,0, + 255,255,0,70,255,227,4,252,7,78,16,39,22,185,5,211,1,117,18,6,7,57,0,0,0,1,0,201,255,227,4,193,5,213,0,15,0,31,183,0, + 28,1,10,28,7,4,16,16,252,236,220,236,49,0,183,0,13,149,4,140,8,145,16,16,228,244,238,204,48,1,51,20,4,35,34,36,53,17,51,17, + 20,22,51,50,54,3,247,202,254,221,217,236,254,240,202,204,102,128,178,1,190,250,225,240,236,4,22,251,233,164,151,169,255,255,0,201,255,227,4,193, + 7,79,16,39,22,193,3,53,1,116,16,6,7,60,0,0,255,255,0,201,0,0,6,24,5,242,16,39,7,53,1,218,0,0,16,6,6,214,0,0, + 255,255,0,70,0,0,5,179,5,242,16,38,7,53,0,0,16,7,6,214,4,30,0,0,255,255,0,201,0,0,6,63,5,242,16,39,7,55,1,126, + 0,0,16,6,6,214,0,0,255,255,0,201,0,0,6,17,5,242,16,38,7,55,0,0,16,7,6,214,4,124,0,0,255,255,0,201,0,0,6,63, + 7,79,16,39,7,56,1,126,0,0,16,6,6,214,0,0,255,255,0,201,0,0,6,17,7,79,16,38,7,56,0,0,16,7,6,214,4,124,0,0, + 255,255,0,201,255,227,6,24,5,213,16,39,7,57,1,218,0,0,16,6,6,214,0,0,255,255,0,70,255,227,5,179,5,213,16,38,7,57,0,0, + 16,7,6,214,4,30,0,0,255,255,0,201,255,227,6,24,7,79,16,39,7,58,1,218,0,0,16,6,6,214,0,0,255,255,0,70,255,227,5,179, + 7,79,16,38,7,58,0,0,16,7,6,214,4,30,0,0,255,255,0,201,255,227,6,63,5,213,16,39,7,60,1,126,0,0,16,6,6,214,0,0, + 255,255,0,201,255,227,6,17,5,213,16,38,7,60,0,0,16,7,6,214,4,124,0,0,255,255,0,201,255,227,6,63,7,79,16,39,7,61,1,126, + 0,0,16,6,6,214,0,0,255,255,0,201,255,227,6,17,7,79,16,38,7,61,0,0,16,7,6,214,4,124,0,0,255,255,0,240,255,227,6,63, + 5,213,16,38,23,21,0,0,16,7,7,60,1,126,0,0,0,1,0,137,2,139,3,9,5,223,0,15,0,30,182,0,93,1,10,93,7,16,16,220, + 236,212,236,49,0,183,0,13,221,4,247,8,145,16,16,244,244,252,204,48,1,51,20,6,35,34,38,53,17,51,17,20,22,51,50,54,2,121,144,183, + 137,149,171,144,97,79,92,84,3,149,140,126,134,132,2,74,253,182,80,77,76,0,0,0,0,1,0,137,2,139,3,9,5,223,0,15,0,0,1,20, + 22,51,50,54,53,17,51,17,20,6,35,34,38,53,1,25,84,92,79,97,144,171,149,137,183,3,149,81,76,77,80,2,74,253,182,132,134,126,140,0, + 0,1,0,119,0,0,4,24,5,213,0,5,0,23,181,2,28,0,58,3,6,16,220,252,236,49,0,180,3,149,4,129,1,47,244,236,48,33,35,17, + 33,53,33,4,24,202,253,41,3,161,5,43,170,0,0,0,255,255,0,201,0,0,4,106,8,75,16,39,2,156,0,169,1,69,18,6,7,81,0,0, + 0,1,0,201,0,0,4,106,5,213,0,5,0,24,64,12,4,149,1,129,0,4,28,2,58,0,4,6,16,252,236,236,49,0,47,244,236,48,51,17, + 33,21,33,17,201,3,161,253,41,5,213,170,250,213,0,0,255,255,0,201,0,0,4,106,7,79,16,39,22,193,4,169,1,116,18,6,7,81,0,0, + 0,1,0,119,0,0,4,24,5,213,0,5,0,23,181,4,28,1,58,3,6,16,220,252,236,49,0,180,3,149,0,129,2,47,228,236,48,1,17,33, + 53,33,17,4,24,252,95,2,215,5,213,250,43,170,5,43,255,255,0,119,0,0,4,25,7,79,16,39,22,193,5,179,1,116,18,6,7,83,0,0, + 255,255,0,119,0,0,4,220,7,78,16,39,22,185,5,179,1,117,18,6,7,83,0,0,255,255,0,201,0,0,4,106,5,213,18,6,0,47,0,0, + 255,255,0,201,0,0,4,106,7,79,16,39,22,193,3,53,1,116,18,6,7,86,0,0,255,255,0,201,0,0,5,53,5,213,16,38,6,214,0,0, + 16,7,7,79,1,29,0,0,255,255,0,119,0,0,5,175,5,213,16,39,6,214,4,26,0,0,16,6,7,79,0,0,255,255,0,201,0,0,5,237, + 5,213,16,38,6,214,0,0,16,7,7,81,1,131,0,0,255,255,0,201,0,0,5,165,5,213,16,39,6,214,4,16,0,0,16,6,7,81,0,0, + 255,255,0,201,0,0,5,237,7,79,16,39,7,82,1,131,0,0,16,6,6,214,0,0,255,255,0,201,0,0,5,165,7,79,16,38,7,82,0,0, + 16,7,6,214,4,16,0,0,255,255,0,201,0,0,5,53,5,213,16,39,7,83,1,29,0,0,16,6,6,214,0,0,255,255,0,119,0,0,5,175, + 5,213,16,38,7,83,0,0,16,7,6,214,4,26,0,0,255,255,0,201,0,0,5,54,7,79,16,39,7,84,1,29,0,0,16,6,6,214,0,0, + 255,255,0,119,0,0,5,175,7,79,16,38,7,84,0,0,16,7,6,214,4,26,0,0,255,255,0,201,0,0,5,237,5,213,16,39,7,86,1,131, + 0,0,16,6,6,214,0,0,255,255,0,201,0,0,5,165,5,213,16,38,7,86,0,0,16,7,6,214,4,16,0,0,255,255,0,201,0,0,5,237, + 7,79,16,39,7,87,1,131,0,0,16,6,6,214,0,0,255,255,0,201,0,0,5,165,7,79,16,38,7,87,0,0,16,7,6,214,4,16,0,0, + 255,255,0,240,0,0,5,237,5,213,16,38,23,21,0,0,16,7,7,86,1,131,0,0,0,1,0,137,2,156,2,165,5,223,0,5,0,25,180,1, + 0,93,3,6,16,220,236,204,49,0,182,0,221,2,247,4,145,6,16,244,244,236,48,1,33,21,33,17,51,1,25,1,140,253,228,144,3,10,110,3, + 67,0,0,0,0,1,0,137,2,156,3,160,5,223,0,17,0,31,181,9,0,14,126,5,18,16,220,236,204,50,49,0,64,9,17,221,1,247,11,221, + 8,145,18,16,244,236,244,236,48,1,21,33,32,36,53,52,36,41,1,21,33,34,6,21,20,22,51,3,160,254,250,254,240,254,255,1,0,1,17,1, + 6,254,231,205,153,190,168,3,10,110,203,215,215,202,110,147,160,185,123,0,0,1,0,137,2,156,2,165,5,223,0,5,0,0,1,17,51,17,33,53, + 2,21,144,253,228,3,10,2,213,252,189,110,0,2,0,119,255,227,6,138,3,125,0,11,0,25,0,40,64,9,3,25,23,21,9,25,15,25,26,16, + 220,212,236,212,57,236,49,0,64,10,6,149,18,140,26,23,0,149,12,26,16,212,236,50,16,244,238,48,1,34,6,21,20,22,51,50,54,53,52,38, + 39,50,4,21,20,4,35,34,36,53,52,55,33,53,4,141,156,139,200,95,95,200,152,143,250,1,3,254,239,236,235,254,239,76,253,154,2,211,166,110, + 168,148,148,168,131,145,170,225,221,236,240,240,236,170,106,170,255,255,0,70,255,227,6,89,6,10,16,39,2,156,0,105,255,4,18,6,7,108,0,0, + 0,2,0,70,255,227,6,89,3,125,0,11,0,25,0,41,64,10,9,25,15,17,3,25,13,23,16,26,16,252,196,236,212,57,236,49,0,64,10,6, + 149,20,140,26,15,0,149,12,26,16,212,236,50,16,244,238,48,1,34,6,21,20,22,51,50,54,53,52,38,39,33,21,33,22,21,20,4,35,34,36, + 53,52,36,2,67,143,153,200,96,94,200,139,155,4,22,253,153,77,254,239,235,236,254,239,1,3,2,211,145,131,168,148,148,168,110,166,170,170,106,170, + 236,240,240,236,221,225,0,0,255,255,0,11,255,227,6,30,5,23,16,39,22,193,4,105,255,60,18,6,7,108,197,0,0,2,0,119,0,0,6,138, + 3,154,0,11,0,25,0,34,64,9,9,25,15,17,3,25,23,13,26,16,220,212,236,212,57,236,49,0,182,6,149,19,0,15,149,12,47,236,50,212, + 236,48,37,50,54,53,52,38,35,34,6,21,20,22,23,33,53,33,38,53,52,36,51,50,4,21,20,4,4,141,143,152,200,95,95,200,139,156,251,234, + 2,102,76,1,17,235,236,1,17,254,253,170,145,131,168,148,148,168,110,166,170,170,106,170,236,240,240,236,221,225,0,0,255,255,0,119,0,0,6,138, + 5,23,16,39,22,193,6,170,255,60,18,6,7,110,0,0,255,255,0,119,0,0,6,138,5,21,16,39,22,185,6,170,255,60,18,6,7,110,0,0, + 0,2,0,70,0,0,6,89,3,154,0,11,0,25,0,35,64,10,3,25,23,21,9,25,24,15,16,26,16,252,196,236,212,57,236,49,0,182,6,149, + 18,0,24,149,12,47,236,50,212,236,48,37,50,54,53,52,38,35,34,6,21,20,22,23,34,36,53,52,36,51,50,4,21,20,7,33,21,2,67,155, + 139,200,94,96,200,153,143,250,254,253,1,17,236,235,1,17,77,2,103,170,166,110,168,148,148,168,131,145,170,225,221,236,240,240,236,170,106,170,0,0, + 255,255,0,70,0,0,6,89,5,23,16,39,22,193,4,84,255,60,18,6,7,113,0,0,255,255,0,201,255,227,8,72,3,125,16,39,7,106,1,190, + 0,0,16,6,6,214,0,0,255,255,0,119,255,227,7,208,3,125,16,39,6,214,6,59,0,0,16,6,7,106,0,0,255,255,0,201,0,0,8,51, + 3,154,16,39,7,113,1,218,0,0,16,6,6,214,0,0,255,255,0,70,0,0,6,89,3,154,16,39,6,214,4,121,0,0,18,6,7,113,0,0, + 255,255,0,201,0,0,8,51,5,23,16,39,7,114,1,218,0,0,16,6,6,214,0,0,255,255,0,70,0,0,6,89,5,23,18,38,7,114,0,0, + 16,7,6,214,4,121,0,0,255,255,0,70,0,0,6,89,5,21,16,39,22,185,4,84,255,60,18,6,7,113,0,0,0,2,0,137,3,223,4,92, + 5,228,0,11,0,24,0,0,1,50,54,53,52,38,35,34,6,21,20,22,23,34,38,53,52,54,32,22,21,20,7,33,21,1,201,106,62,95,73,69, + 99,73,95,157,163,172,1,40,172,48,1,131,4,77,74,66,83,75,70,88,67,73,110,126,124,132,135,135,132,81,59,110,0,1,0,137,2,139,3,46, + 5,223,0,17,0,0,1,34,38,53,17,51,17,20,22,51,50,54,53,17,51,17,20,6,1,220,168,171,144,97,98,97,97,144,171,2,139,134,132,2, + 74,253,182,80,77,77,80,2,74,253,182,132,134,0,0,0,0,2,0,137,3,223,4,92,5,228,0,11,0,25,0,0,1,50,54,53,52,38,35,34, + 6,21,20,22,23,48,33,53,33,38,53,52,54,32,22,21,20,6,3,28,95,73,99,69,73,95,62,106,253,109,1,131,48,172,1,40,172,163,4,77, + 73,67,88,70,75,83,66,74,110,110,59,81,132,135,135,132,124,126,0,0,0,1,0,119,0,0,6,138,3,154,0,15,0,26,181,0,3,25,12,8, + 16,16,220,212,236,204,49,0,181,6,149,9,0,149,15,47,236,212,236,48,37,50,54,53,52,38,35,33,53,33,50,4,21,20,4,35,4,141,98,197, + 152,143,251,234,4,22,250,1,3,254,239,236,165,146,165,131,145,170,225,221,236,240,0,0,255,255,0,70,0,0,6,89,6,10,16,39,2,156,0,164, + 255,4,18,6,7,127,0,0,0,1,0,70,0,0,6,89,3,154,0,15,0,27,182,0,13,25,8,4,16,16,16,252,196,236,204,49,0,181,10,149, + 7,0,149,1,47,236,212,236,48,37,21,34,36,53,52,36,51,33,21,33,34,6,21,20,22,2,67,236,254,239,1,3,250,4,22,251,234,143,153,198, + 165,165,240,236,221,225,170,145,131,165,146,0,255,255,0,70,0,0,6,89,5,23,16,39,22,193,4,164,255,60,18,6,7,127,0,0,0,1,0,119, + 0,0,6,138,3,154,0,15,0,26,181,0,13,25,4,9,16,16,220,212,236,204,49,0,181,0,149,1,10,149,7,47,236,212,236,48,1,53,50,4, + 21,20,4,35,33,53,33,50,54,53,52,38,4,141,236,1,17,254,253,250,251,234,4,22,143,152,197,2,245,165,240,236,221,225,170,145,131,165,146,0, + 255,255,0,119,0,0,6,138,5,23,16,39,22,193,6,170,255,60,18,6,7,129,0,0,255,255,0,119,0,0,6,138,5,21,16,39,22,185,6,170, + 255,60,18,6,7,129,0,0,0,1,0,70,0,0,6,89,3,154,0,15,0,27,182,0,3,25,8,12,16,16,16,252,196,236,204,49,0,181,0,149, + 15,6,149,9,47,236,212,236,48,1,34,6,21,20,22,51,33,21,33,34,36,53,52,36,51,2,67,98,198,153,143,4,22,251,234,250,254,253,1,17, + 236,2,245,146,165,131,145,170,225,221,236,240,255,255,0,70,0,0,6,89,5,23,16,39,22,193,4,164,255,60,18,6,7,132,0,0,255,255,0,201, + 0,0,8,72,3,154,16,39,7,125,1,190,0,0,16,6,6,214,0,0,255,255,0,119,0,0,7,208,3,154,16,38,7,125,0,0,16,7,6,214, + 6,59,0,0,255,255,0,201,0,0,8,51,3,154,16,39,7,127,1,218,0,0,16,6,6,214,0,0,255,255,0,70,0,0,7,198,3,154,16,38, + 7,127,0,0,16,7,6,214,6,49,0,0,255,255,0,201,0,0,8,51,5,23,16,39,7,128,1,218,0,0,16,6,6,214,0,0,255,255,0,70, + 0,0,7,198,5,23,16,38,7,128,0,0,16,7,6,214,6,49,0,0,255,255,0,201,0,0,8,72,3,154,16,39,7,129,1,190,0,0,16,6, + 6,214,0,0,255,255,0,119,0,0,7,208,3,154,16,38,7,129,0,0,16,7,6,214,6,59,0,0,255,255,0,201,0,0,8,72,5,23,16,39, + 7,130,1,190,0,0,16,6,6,214,0,0,255,255,0,119,0,0,7,208,5,23,16,38,7,130,0,0,16,7,6,214,6,59,0,0,255,255,0,201, + 0,0,8,51,3,154,16,39,7,132,1,218,0,0,16,6,6,214,0,0,255,255,0,70,0,0,7,198,3,154,16,38,7,132,0,0,16,7,6,214, + 6,49,0,0,255,255,0,201,0,0,8,51,5,23,16,39,7,133,1,218,0,0,16,6,6,214,0,0,255,255,0,70,0,0,7,198,5,23,16,38, + 7,133,0,0,16,7,6,214,6,49,0,0,0,1,0,137,3,223,4,92,5,228,0,15,0,0,1,34,6,21,20,22,51,33,21,33,34,38,53,52, + 54,51,1,220,82,105,80,89,2,146,253,110,158,163,172,167,5,118,68,90,72,67,110,126,131,125,135,0,0,1,0,119,0,0,5,94,5,213,0,12, + 0,0,37,21,1,53,45,1,53,1,21,13,1,21,5,5,94,251,25,3,106,252,150,4,231,252,20,3,236,252,20,182,182,1,50,228,212,213,228,1, + 50,187,233,236,184,233,0,0,0,1,0,70,0,0,4,10,5,213,0,12,0,28,183,7,28,4,63,0,28,11,13,16,220,236,252,236,49,0,181,3, + 149,7,11,129,6,47,244,212,236,48,1,16,0,33,51,17,35,17,36,0,17,53,51,1,16,1,84,1,67,99,202,254,250,254,12,202,5,168,254,153, + 254,189,253,2,2,88,3,1,111,1,157,110,255,255,0,201,0,0,5,50,8,75,16,39,2,156,2,32,1,69,18,6,7,152,0,0,0,1,0,201, + 0,0,4,141,5,213,0,12,0,30,64,9,1,28,2,63,6,28,8,4,13,16,252,236,252,236,49,0,181,10,149,6,1,129,8,47,244,212,236,48, + 1,53,51,21,16,0,5,17,35,17,51,32,0,3,195,202,254,12,254,250,202,99,1,67,1,84,5,168,45,110,254,99,254,145,3,253,168,2,254,1, + 67,0,0,0,255,255,0,201,0,0,4,141,7,79,16,39,22,193,6,32,1,116,18,6,7,152,0,0,0,1,0,70,0,0,4,10,5,213,0,12, + 0,28,183,6,28,9,63,0,28,3,13,16,220,236,252,236,49,0,181,10,149,6,7,129,2,47,228,212,236,48,37,21,35,53,16,0,37,17,51,17, + 35,32,0,1,16,202,1,244,1,6,202,99,254,189,254,172,45,45,110,1,157,1,111,3,2,88,253,2,254,189,0,0,255,255,0,70,0,0,4,10, + 7,79,16,39,22,193,5,163,1,116,18,6,7,154,0,0,255,255,0,70,0,0,4,204,7,78,16,39,22,185,5,163,1,117,18,6,7,154,0,0, + 0,1,0,201,0,0,4,141,5,213,0,12,0,30,64,9,0,28,10,63,6,28,5,4,13,16,252,236,252,236,49,0,181,3,149,7,5,129,11,47, + 228,212,236,48,37,16,0,33,35,17,51,17,4,0,17,21,35,3,195,254,172,254,189,99,202,1,6,1,244,202,45,1,103,1,67,2,254,253,168,3, + 254,145,254,99,110,0,0,0,255,255,0,201,0,0,4,141,7,79,16,39,22,193,3,51,1,116,18,6,7,157,0,0,255,255,0,201,0,0,5,228, + 5,213,16,39,7,150,1,218,0,0,16,6,6,214,0,0,255,255,0,70,0,0,5,145,5,213,16,39,6,214,3,252,0,0,16,6,7,150,0,0, + 255,255,0,201,0,0,6,16,5,213,16,39,7,152,1,131,0,0,16,6,6,214,0,0,255,255,0,201,0,0,5,180,5,213,16,39,6,214,4,31, + 0,0,16,6,7,152,0,0,255,255,0,201,0,0,6,16,7,79,16,39,7,153,1,131,0,0,16,6,6,214,0,0,255,255,0,201,0,0,5,180, + 7,79,16,38,7,153,0,0,16,7,6,214,4,31,0,0,255,255,0,201,0,0,5,228,5,213,16,39,7,154,1,218,0,0,16,6,6,214,0,0, + 255,255,0,70,0,0,5,145,5,213,16,38,7,154,0,0,16,7,6,214,3,252,0,0,255,255,0,201,0,0,5,228,7,79,16,39,7,155,1,218, + 0,0,16,6,6,214,0,0,255,255,0,70,0,0,5,145,7,79,16,38,7,155,0,0,16,7,6,214,3,252,0,0,255,255,0,201,0,0,6,16, + 5,213,16,39,7,157,1,131,0,0,16,6,6,214,0,0,255,255,0,201,0,0,5,180,5,213,16,38,7,157,0,0,16,7,6,214,4,31,0,0, + 255,255,0,201,0,0,6,16,7,79,16,39,7,158,1,131,0,0,16,6,6,214,0,0,255,255,0,201,0,0,5,180,7,79,16,38,7,158,0,0, + 16,7,6,214,4,31,0,0,255,255,0,240,0,0,6,16,5,213,16,38,23,21,0,0,16,7,7,157,1,131,0,0,0,1,0,137,2,156,2,232, + 5,223,0,12,0,30,182,12,93,11,7,93,4,13,16,220,236,212,236,49,0,183,7,221,4,12,247,5,145,13,16,244,244,220,236,48,1,52,38,43, + 1,17,51,17,30,1,29,1,35,2,88,184,207,72,144,227,236,144,2,198,199,156,1,182,254,185,21,229,172,86,0,0,0,1,0,137,2,139,2,236, + 5,238,0,43,0,0,1,21,46,1,35,34,6,21,20,23,22,31,1,22,23,22,21,20,6,35,34,38,39,53,30,1,51,50,54,53,52,39,38,47, + 1,38,39,38,53,52,54,51,50,22,2,184,67,119,55,66,104,35,45,56,71,127,67,62,169,164,61,139,74,71,137,66,65,109,39,46,47,71,127,63, + 59,162,143,61,126,5,195,135,31,30,72,41,64,19,28,15,14,24,64,60,102,121,126,27,26,132,39,39,76,56,61,35,40,9,13,23,59,54,95,111, + 128,22,0,0,0,1,0,137,2,156,2,232,5,223,0,14,0,0,1,48,21,35,53,52,54,55,48,17,51,17,35,34,6,1,25,144,236,227,144,72, + 207,184,2,198,42,86,172,229,21,1,71,254,74,156,0,0,0,1,0,70,255,227,5,108,5,242,0,27,0,0,1,20,22,51,50,54,53,51,16,6, + 35,34,38,25,1,52,38,35,34,6,21,35,16,54,51,50,22,17,3,62,86,92,96,82,202,186,194,170,210,86,92,96,82,202,186,194,170,210,1,190, + 211,104,90,225,254,231,194,183,1,37,2,88,211,104,90,225,1,25,194,183,254,219,0,0,0,1,0,70,255,227,5,108,5,242,0,27,0,0,1,17, + 16,54,51,50,22,17,35,52,38,35,34,6,21,17,16,6,35,34,38,17,51,20,22,51,50,54,2,116,210,170,194,186,202,82,96,92,86,210,170,194, + 186,202,82,96,92,86,1,190,2,88,1,37,183,194,254,231,225,90,104,211,253,168,254,219,183,194,1,25,225,90,104,0,255,255,0,70,255,227,5,108, + 7,79,16,39,22,193,5,243,1,116,16,6,7,178,0,0,0,1,0,70,255,227,6,220,3,183,0,39,0,0,1,30,1,51,50,54,53,52,38,35, + 53,32,18,21,6,2,33,34,2,47,1,46,1,35,34,6,21,20,22,51,21,34,2,53,52,18,33,50,18,23,3,250,33,132,114,122,124,75,171,1, + 3,200,1,163,254,217,172,215,52,50,32,132,115,127,119,85,161,249,210,164,1,39,173,214,52,1,176,88,203,167,124,96,229,165,254,195,173,149,254,200, + 1,25,126,112,88,203,167,124,96,229,165,1,74,160,154,1,51,254,231,126,255,255,0,70,255,227,6,220,5,23,16,39,22,193,5,139,255,60,16,6, + 7,180,0,0,0,1,0,70,255,227,6,220,3,183,0,39,0,0,1,55,54,18,51,32,18,23,20,2,35,53,50,54,53,52,38,35,34,6,15,1, + 6,2,35,32,2,39,52,18,33,21,34,6,21,20,22,51,50,54,3,40,50,52,215,172,1,39,163,1,210,249,161,85,118,128,114,132,33,50,52,214, + 173,254,217,163,1,200,1,3,171,75,124,122,115,132,1,176,112,126,1,25,254,200,149,166,254,188,165,229,96,124,167,203,88,112,126,254,231,1,56,149, + 173,1,61,165,229,96,124,167,203,0,0,0,255,255,0,70,255,227,6,220,5,23,16,39,22,193,5,139,255,60,16,6,7,182,0,0,255,255,0,201, + 255,227,7,1,5,242,16,38,6,214,0,0,16,7,7,177,1,149,0,0,255,255,0,70,255,227,6,131,5,242,16,38,7,177,0,0,16,7,6,214, + 4,238,0,0,255,255,0,201,255,227,7,1,5,242,16,39,7,178,1,149,0,0,16,6,6,214,0,0,255,255,0,70,255,227,6,131,5,242,16,38, + 7,178,0,0,16,7,6,214,4,238,0,0,255,255,0,201,255,227,7,1,7,79,16,39,7,179,1,149,0,0,16,6,6,214,0,0,255,255,0,70, + 255,227,6,131,7,79,16,38,7,179,0,0,16,7,6,214,4,238,0,0,255,255,0,201,255,227,8,217,3,183,16,39,7,180,1,253,0,0,16,6, + 6,214,0,0,255,255,0,70,255,227,8,85,3,183,16,39,6,214,6,192,0,0,16,6,7,180,0,0,255,255,0,201,255,227,8,217,5,23,16,39, + 7,181,1,253,0,0,16,6,6,214,0,0,255,255,0,70,255,227,8,85,5,23,16,38,7,181,0,0,16,7,6,214,6,192,0,0,255,255,0,201, + 255,227,8,217,3,183,16,39,7,182,1,253,0,0,16,6,6,214,0,0,255,255,0,70,255,227,8,85,3,183,16,38,7,182,0,0,16,7,6,214, + 6,192,0,0,255,255,0,201,255,227,8,217,5,23,16,39,7,183,1,253,0,0,16,6,6,214,0,0,255,255,0,70,255,227,8,85,5,23,16,38, + 7,183,0,0,16,7,6,214,6,192,0,0,0,1,0,137,3,207,4,175,5,230,0,39,0,0,1,62,2,55,50,22,23,20,6,35,53,50,54,53, + 52,38,35,34,6,15,1,14,1,35,34,38,39,52,54,51,21,34,6,21,20,22,51,50,54,2,91,42,39,115,111,190,98,1,132,157,73,61,74,60, + 75,50,23,65,11,145,115,186,102,1,126,163,77,56,75,58,66,69,4,204,70,61,150,1,168,77,93,181,110,119,45,27,108,65,35,118,21,186,174,84, + 97,177,107,121,46,49,101,77,0,1,0,119,0,0,4,59,5,213,0,8,0,46,181,2,28,8,6,4,9,16,220,204,212,236,49,0,182,66,8,149, + 2,6,129,0,47,244,212,236,48,75,83,88,183,6,17,5,7,17,4,4,5,5,7,16,237,16,237,89,33,35,17,33,53,1,51,1,33,4,59,202, + 253,6,2,61,202,253,195,2,250,2,88,173,2,208,253,45,255,255,0,201,0,0,4,141,8,75,16,39,2,156,255,226,1,69,18,6,7,201,0,0, + 0,1,0,201,0,0,4,141,5,213,0,8,0,47,182,4,5,7,28,0,4,9,16,252,236,212,204,49,0,182,66,1,149,7,3,129,0,47,244,212, + 236,48,75,83,88,183,2,17,5,3,17,4,4,5,5,7,16,237,16,237,89,51,17,33,1,51,1,21,33,17,201,2,250,253,195,202,2,61,253,6, + 3,2,2,211,253,48,173,253,168,0,0,0,255,255,0,201,0,0,4,141,7,79,16,39,22,193,3,226,1,116,18,6,7,201,0,0,0,1,0,119, + 0,0,4,59,5,213,0,8,0,46,181,7,28,1,3,6,9,16,220,204,212,236,49,0,182,66,2,149,7,0,129,4,47,228,212,236,48,75,83,88, + 183,2,17,5,3,17,4,4,5,5,7,16,237,16,237,89,1,17,33,1,35,1,53,33,17,4,59,253,6,2,61,202,253,195,2,250,5,213,252,254, + 253,45,2,208,173,2,88,0,255,255,0,119,0,0,4,64,7,79,16,39,22,193,5,218,1,116,18,6,7,203,0,0,255,255,0,119,0,0,5,3, + 7,78,16,39,22,185,5,218,1,117,18,6,7,203,0,0,0,1,0,201,0,0,4,141,5,213,0,8,0,47,182,5,4,1,28,0,4,9,16,252, + 236,212,204,49,0,182,66,7,149,3,0,129,6,47,228,212,236,48,75,83,88,183,6,17,5,7,17,4,4,5,5,7,16,237,16,237,89,19,51,17, + 33,21,1,35,1,33,201,202,2,250,253,195,202,2,61,253,6,5,213,253,168,173,253,48,2,211,0,0,255,255,0,201,0,0,4,141,7,79,16,39, + 22,193,3,53,1,116,18,6,7,206,0,0,255,255,0,201,0,0,5,248,5,213,16,39,7,199,1,189,0,0,16,6,6,214,0,0,255,255,0,119, + 0,0,5,200,5,213,16,39,6,214,4,51,0,0,16,6,7,199,0,0,255,255,0,201,0,0,6,16,5,213,16,39,7,201,1,131,0,0,16,6, + 6,214,0,0,255,255,0,201,0,0,6,21,5,213,16,39,6,214,4,128,0,0,16,6,7,201,0,0,255,255,0,201,0,0,6,16,7,79,16,39, + 7,202,1,131,0,0,16,6,6,214,0,0,255,255,0,201,0,0,6,21,7,79,16,38,7,202,0,0,16,7,6,214,4,128,0,0,255,255,0,201, + 0,0,5,248,5,213,16,39,7,203,1,189,0,0,16,6,6,214,0,0,255,255,0,119,0,0,5,200,5,213,16,38,7,203,0,0,16,7,6,214, + 4,51,0,0,255,255,0,201,0,0,5,253,7,79,16,39,7,204,1,189,0,0,16,6,6,214,0,0,255,255,0,119,0,0,5,200,7,79,16,38, + 7,204,0,0,16,7,6,214,4,51,0,0,255,255,0,201,0,0,6,16,5,213,16,39,7,206,1,131,0,0,16,6,6,214,0,0,255,255,0,201, + 0,0,6,21,5,213,16,38,7,206,0,0,16,7,6,214,4,128,0,0,255,255,0,201,0,0,6,16,7,79,16,39,7,207,1,131,0,0,16,6, + 6,214,0,0,255,255,0,201,0,0,6,21,7,79,16,38,7,207,0,0,16,7,6,214,4,128,0,0,255,255,0,240,0,0,6,16,5,213,16,38, + 23,21,0,0,16,7,7,206,1,131,0,0,0,1,0,137,2,155,2,232,5,223,0,8,0,52,182,5,7,3,2,93,8,9,16,220,236,212,57,204, + 49,0,64,9,66,2,221,8,5,247,0,145,9,16,244,244,220,236,48,75,83,88,183,6,125,5,7,125,4,4,5,7,16,5,237,16,237,89,19,51, + 17,33,21,1,35,1,33,137,144,1,207,254,165,145,1,109,254,32,5,223,254,183,121,254,126,1,141,0,255,255,0,137,3,49,2,173,5,86,18,6, + 6,216,0,0,0,1,0,137,2,156,3,111,5,223,0,11,0,0,19,51,27,1,51,9,1,35,11,1,35,1,176,145,197,198,145,254,237,1,37,145, + 225,227,145,1,47,5,223,254,222,1,34,254,121,254,68,1,82,254,174,1,188,0,0,0,0,1,0,201,255,227,6,220,3,125,0,19,0,39,64,9, + 9,28,12,1,28,10,0,4,20,16,252,196,236,212,236,49,0,64,10,5,149,16,140,20,12,149,9,0,20,16,212,60,236,16,244,238,48,19,51,17, + 20,22,51,50,54,53,17,33,21,33,17,20,4,35,34,36,53,201,202,206,101,94,212,2,228,253,230,254,239,235,236,254,239,3,125,254,66,164,152,148, + 168,1,190,170,254,236,236,240,240,236,0,0,0,1,0,119,255,227,6,138,3,125,0,19,0,37,183,11,28,8,19,28,0,10,20,16,220,212,236,212, + 236,49,0,64,10,15,149,4,140,20,8,149,10,0,20,16,212,60,236,16,244,238,48,1,17,20,4,35,34,36,53,17,33,53,33,17,20,22,51,50, + 54,53,17,6,138,254,239,236,235,254,239,253,230,2,228,211,95,101,206,3,125,254,66,236,240,240,236,1,20,170,254,66,168,148,152,164,1,190,0,0, + 0,1,0,119,0,0,6,138,3,154,0,19,0,31,183,9,28,13,1,28,0,10,20,16,220,212,236,212,236,49,0,182,5,149,16,12,149,10,0,47, + 60,236,212,236,48,33,35,17,52,38,35,34,6,21,17,33,53,33,17,52,36,51,50,4,21,6,138,202,206,101,95,211,253,28,2,26,1,17,235,236, + 1,17,1,190,164,152,148,168,254,66,170,1,20,236,240,240,236,0,0,0,255,255,0,201,0,0,6,220,6,10,16,39,2,156,0,192,255,4,16,6, + 7,230,0,0,0,1,0,201,0,0,6,220,3,154,0,19,0,33,64,9,11,28,7,19,28,9,0,4,20,16,252,196,236,212,236,49,0,182,15,149, + 4,8,149,10,0,47,60,236,212,236,48,51,17,52,36,51,50,4,21,17,33,21,33,17,52,38,35,34,6,21,17,201,1,17,236,235,1,17,2,26, + 253,28,212,94,101,206,1,190,236,240,240,236,254,236,170,1,190,168,148,152,164,254,66,0,255,255,0,201,0,0,6,220,5,23,16,39,22,193,4,192, + 255,60,18,6,7,230,0,0,0,1,0,201,0,0,4,141,5,213,0,19,0,35,64,10,16,25,5,63,10,28,0,11,4,20,16,252,60,236,252,236, + 49,0,183,13,149,8,0,149,1,129,11,47,244,236,212,236,48,19,53,33,50,4,21,20,4,43,1,17,35,17,33,50,54,53,52,38,35,201,1,200, + 251,1,1,254,255,251,254,202,1,200,141,154,154,141,5,47,166,227,219,221,226,253,168,2,254,146,135,134,146,0,0,0,255,255,0,201,0,0,4,141, + 7,79,16,39,22,193,4,22,1,116,18,6,7,232,0,0,0,1,0,201,0,0,4,141,5,213,0,19,0,35,64,10,4,25,15,63,10,28,0,9, + 4,20,16,252,60,236,252,236,49,0,183,7,149,11,0,149,9,129,19,47,228,236,212,236,48,55,33,50,54,53,52,38,35,33,17,51,17,51,50,4, + 21,20,4,35,33,201,1,200,141,154,154,141,254,56,202,254,251,1,1,254,255,251,254,56,166,146,134,135,146,2,254,253,168,226,221,219,227,0,0,0, + 0,1,0,70,0,0,4,10,5,213,0,19,0,34,64,9,11,28,19,8,63,4,25,15,20,16,220,236,252,60,236,49,0,183,7,149,11,0,149,19, + 129,10,47,244,236,212,236,48,1,33,34,6,21,20,22,51,33,17,35,17,35,34,36,53,52,36,51,33,4,10,254,56,141,154,154,141,1,200,202,254, + 251,254,255,1,1,251,1,200,5,47,146,134,135,146,253,2,2,88,226,221,219,227,0,0,255,255,0,70,0,0,4,10,7,79,16,39,22,193,4,132, + 1,116,18,6,7,235,0,0,0,1,0,70,0,0,4,10,5,213,0,19,0,34,64,9,9,28,12,0,63,16,25,5,20,16,220,236,252,60,236,49, + 0,183,13,149,9,0,149,10,129,1,47,228,236,212,236,48,37,21,33,34,36,53,52,36,59,1,17,51,17,33,34,6,21,20,22,51,4,10,254,56, + 251,254,255,1,1,251,254,202,254,56,141,154,154,141,166,166,227,219,221,226,2,88,253,2,146,135,134,146,255,255,0,201,0,0,5,228,7,79,16,39, + 7,236,1,218,0,0,16,6,6,214,0,0,255,255,0,70,0,0,5,145,7,79,16,39,6,214,3,252,0,0,16,6,7,236,0,0,0,1,0,137, + 2,155,2,232,5,223,0,20,0,36,183,11,93,8,0,4,126,16,21,16,220,236,212,60,236,49,0,64,10,8,221,11,0,221,9,247,20,145,21,16, + 244,228,252,212,236,48,1,33,34,6,21,20,22,51,33,17,35,17,35,34,39,38,53,52,54,51,33,2,232,254,225,86,82,88,80,1,31,144,143,148, + 91,81,162,158,1,31,5,113,69,80,66,74,254,75,1,72,71,63,124,123,127,0,0,0,0,1,0,119,0,0,5,94,5,213,0,12,0,0,55,45, + 1,53,45,1,53,1,21,13,1,21,1,119,3,236,252,20,3,236,252,20,4,231,252,150,3,106,251,25,182,238,233,184,236,233,187,254,206,228,213,212, + 228,254,206,0,0,2,0,150,0,0,5,104,5,243,0,11,0,28,0,80,182,9,23,20,3,26,14,29,16,212,196,204,212,57,204,49,0,64,9,66, + 6,23,0,17,24,25,175,28,47,252,57,212,204,212,204,48,75,83,88,64,22,22,21,23,20,24,17,27,12,28,25,17,26,27,26,24,17,28,23,17, + 12,12,28,5,7,16,237,16,237,7,16,237,8,16,237,17,18,57,57,89,1,34,6,21,20,22,51,50,54,53,52,38,1,38,53,52,54,23,50,22, + 21,20,6,7,9,1,51,1,35,1,166,52,60,60,50,44,66,58,254,231,41,176,96,106,167,159,126,1,34,1,218,210,253,199,229,5,78,47,48,64, + 46,66,44,34,61,254,190,106,121,105,156,1,145,115,102,156,8,252,226,5,14,250,43,0,255,255,0,150,255,226,5,104,8,75,16,39,2,156,0,192, + 1,69,18,6,7,244,0,0,0,2,0,150,255,226,5,104,5,213,0,11,0,28,0,80,182,9,3,21,9,15,27,29,16,212,196,204,212,57,204,49, + 0,64,9,66,6,18,0,24,17,13,175,16,47,236,57,212,204,212,204,48,75,83,88,64,22,20,19,28,21,17,17,14,12,13,16,17,15,15,14,17, + 17,13,18,17,12,12,13,5,7,16,237,16,237,7,16,237,8,16,237,17,18,57,57,89,37,50,54,53,52,38,35,34,6,21,20,22,3,1,51,1, + 35,9,1,30,1,21,20,6,35,6,38,53,52,1,166,50,58,66,44,50,60,60,179,1,139,229,2,57,210,254,38,254,222,126,159,167,106,96,176,135, + 61,34,44,66,46,64,48,47,1,66,4,12,250,43,5,14,252,226,8,156,102,115,145,1,156,105,121,0,255,255,0,150,255,226,5,104,7,79,16,39, + 22,193,4,192,1,116,18,6,7,244,0,0,0,2,0,77,0,0,5,88,5,75,0,11,0,28,0,84,64,10,3,12,9,18,28,28,25,18,27,29, + 16,220,196,212,236,16,204,212,204,49,0,183,66,0,12,15,6,28,21,26,47,220,57,204,212,57,204,48,75,83,88,64,22,14,13,15,12,28,17,25, + 26,24,12,17,23,24,23,28,17,25,27,17,26,25,26,4,7,16,237,16,237,7,16,237,16,8,237,17,18,57,57,89,1,50,54,53,52,38,35,34, + 6,21,20,22,37,14,1,35,34,38,53,52,54,51,50,23,1,21,1,53,1,1,93,50,58,66,44,50,60,60,1,68,12,164,96,109,163,174,71,65, + 74,3,139,251,25,4,77,3,221,61,34,44,66,46,64,48,47,59,97,127,161,99,142,129,37,254,54,228,253,136,182,2,52,0,0,0,255,255,0,77, + 0,0,5,88,7,79,16,39,22,193,4,174,1,116,18,6,7,246,0,0,0,2,0,119,0,0,5,130,5,75,0,11,0,28,0,82,64,9,9,12, + 3,23,15,13,28,16,29,16,220,236,212,212,204,212,204,49,0,183,66,0,12,26,6,13,20,15,47,220,57,204,212,57,204,48,75,83,88,64,22,28, + 27,26,12,13,17,16,15,17,12,17,18,17,18,13,17,16,14,17,15,16,15,4,7,16,237,16,237,7,16,237,16,8,237,17,18,57,57,89,1,50, + 54,53,52,38,35,34,6,21,20,22,39,9,1,21,1,53,1,54,51,50,22,21,20,6,35,34,38,4,114,52,60,60,50,44,66,58,222,253,175,4, + 77,251,25,3,139,74,65,71,174,180,90,110,153,3,221,47,48,64,46,66,44,34,61,59,254,210,253,204,182,2,120,228,1,202,37,129,142,109,151,135, + 255,255,0,119,0,0,5,130,7,79,16,39,22,193,5,49,1,116,18,6,7,248,0,0,255,255,0,201,0,0,7,23,7,79,16,39,7,249,1,149, + 0,0,16,6,6,214,0,0,255,255,0,119,0,0,7,69,7,79,16,38,7,249,0,0,16,7,6,214,5,176,0,0,0,2,0,137,2,155,3,178, + 5,144,0,11,0,32,0,0,1,50,54,53,52,38,35,34,6,21,20,22,39,5,1,21,1,53,37,54,51,50,23,22,21,20,7,6,35,34,35,34, + 38,3,6,33,38,38,31,28,42,37,136,254,161,2,160,252,233,2,55,46,41,44,39,72,50,48,71,1,2,64,98,4,194,27,27,36,25,37,24,19, + 35,25,158,254,209,115,1,98,128,254,20,25,47,79,59,44,43,73,0,0,0,2,0,178,255,227,5,41,5,242,0,10,0,39,0,0,1,50,54,53, + 52,38,34,6,21,20,22,7,17,20,22,51,50,54,53,17,51,17,16,0,33,32,0,25,1,52,54,51,50,22,21,20,7,6,35,34,1,235,40,66, + 58,100,58,66,66,174,195,194,174,203,254,223,254,230,254,229,254,223,173,138,106,167,73,74,126,60,4,128,66,44,34,62,62,34,44,66,136,254,82,240, + 211,211,240,3,139,252,92,254,220,254,214,1,42,1,36,2,178,106,165,144,116,95,85,86,0,2,0,178,255,227,5,41,5,242,0,10,0,39,0,0, + 1,50,54,53,52,38,34,6,21,20,22,23,6,35,34,39,38,53,52,54,51,50,22,21,17,16,0,33,32,0,25,1,51,17,20,22,51,50,54,53, + 3,240,44,66,58,100,58,66,150,48,60,126,74,73,167,106,138,173,254,223,254,229,254,230,254,223,203,174,194,195,174,4,128,66,44,34,62,62,34,44, + 66,136,20,86,85,95,116,144,165,106,253,78,254,220,254,214,1,42,1,36,3,164,252,117,240,211,211,240,0,2,0,178,255,227,5,41,5,242,0,10, + 0,39,0,0,1,34,6,21,20,22,50,54,53,52,38,39,54,51,50,23,22,21,20,6,35,34,38,53,17,16,0,33,32,0,25,1,35,17,52,38, + 35,34,6,21,1,235,44,66,58,100,58,66,150,48,60,126,74,73,167,106,138,173,1,33,1,27,1,26,1,33,203,174,194,195,174,1,85,66,44,34, + 62,62,34,44,66,136,20,86,85,95,116,144,165,106,2,178,1,36,1,42,254,214,254,220,252,92,3,139,240,211,211,240,0,2,0,178,255,227,5,41, + 5,242,0,10,0,39,0,0,1,34,6,21,20,22,50,54,53,52,38,55,17,52,38,35,34,6,21,17,35,17,16,0,33,32,0,25,1,20,6,35, + 34,38,53,52,55,54,51,50,3,240,40,66,58,100,58,66,66,174,195,194,174,203,1,33,1,26,1,27,1,33,173,138,106,167,73,74,126,60,1,85, + 66,44,34,62,62,34,44,66,136,1,174,240,211,211,240,252,117,3,164,1,36,1,42,254,214,254,220,253,78,106,165,144,116,95,85,86,255,255,0,178, + 255,227,5,41,7,79,16,39,22,193,4,231,1,116,18,6,7,255,0,0,255,255,0,178,255,227,5,41,7,79,16,39,22,193,4,231,1,116,18,6, + 8,0,0,0,0,2,0,83,0,0,5,94,5,213,0,8,0,36,0,0,18,20,22,50,54,52,38,7,34,5,22,21,20,6,7,6,38,53,52,54, + 59,1,32,0,17,16,0,41,1,53,33,32,0,17,16,39,38,243,60,104,60,59,53,53,1,49,20,139,133,115,157,163,109,179,1,178,1,150,254,104, + 254,80,254,97,1,190,1,53,1,31,143,134,5,1,96,47,47,96,47,1,1,44,49,106,151,3,3,151,112,99,161,254,151,254,128,254,126,254,150,166, + 1,24,1,46,1,44,140,129,255,255,0,83,0,0,5,94,7,79,16,39,22,193,4,199,1,116,18,6,8,3,0,0,0,2,0,121,0,0,5,132, + 5,213,0,8,0,36,0,0,0,52,38,35,38,6,20,22,50,37,4,7,6,17,16,0,41,1,21,33,32,0,17,16,0,33,51,50,22,21,20,6, + 39,46,1,53,52,4,228,59,53,53,59,60,104,254,208,254,235,133,144,1,31,1,53,1,190,254,97,254,80,254,104,1,150,1,178,179,109,163,157,115, + 133,139,4,161,96,46,1,47,96,47,188,9,129,140,254,212,254,210,254,232,166,1,106,1,130,1,128,1,105,161,99,112,151,3,3,151,106,49,0,0, + 255,255,0,121,0,0,5,132,7,79,16,39,22,193,5,34,1,116,18,6,8,5,0,0,255,255,0,201,0,0,7,65,7,79,16,39,8,6,1,189, + 0,0,16,6,6,214,0,0,255,255,0,121,0,0,6,189,7,79,16,38,8,6,0,0,16,7,6,214,5,40,0,0,0,2,0,137,2,156,3,189, + 5,223,0,11,0,38,0,0,1,34,6,21,20,22,51,50,54,53,52,38,7,34,38,53,52,55,6,7,6,21,20,22,51,33,21,33,32,36,16,36, + 33,51,50,22,21,20,6,3,21,31,38,38,33,27,38,38,30,70,99,13,193,73,77,190,168,1,25,254,250,254,240,254,255,1,0,1,17,114,82,95, + 98,5,113,25,36,27,27,27,27,36,25,207,86,60,33,28,3,70,74,160,185,123,110,203,1,174,202,89,82,59,87,0,0,2,0,70,0,0,6,46, + 5,242,0,11,0,28,0,0,1,34,6,21,20,22,51,50,54,53,52,38,19,17,6,7,34,36,53,52,36,51,50,4,21,17,1,23,1,2,66,122, + 173,200,95,128,178,204,204,128,178,235,254,239,1,35,217,236,1,16,1,86,154,254,104,5,82,164,151,168,148,169,147,164,151,250,174,2,133,73,1,240, + 236,250,225,240,236,252,168,2,12,102,253,156,0,2,0,119,0,0,6,95,5,242,0,11,0,28,0,0,1,34,6,21,20,22,51,50,54,53,52,38, + 1,33,1,55,1,17,52,36,51,50,4,21,20,4,35,38,39,4,99,102,204,178,128,95,200,173,254,84,254,222,254,104,154,1,86,1,16,236,217,1, + 35,254,239,235,178,128,5,82,151,164,147,169,148,168,151,164,250,174,2,100,102,253,244,3,88,236,240,225,250,236,240,1,73,0,0,0,255,255,0,119, + 0,0,6,95,7,79,16,39,22,193,6,94,1,116,18,6,8,11,0,0,0,2,0,70,255,227,6,46,5,213,0,11,0,28,0,0,37,50,54,53, + 52,38,35,34,6,21,20,22,1,33,1,7,1,17,20,4,35,34,36,53,52,36,51,22,23,2,66,102,204,178,128,95,200,173,1,172,1,34,1,152, + 154,254,170,254,240,236,217,254,221,1,17,235,178,128,131,151,164,147,169,148,168,151,164,5,82,253,156,102,2,12,252,168,236,240,225,250,236,240,1,73, + 255,255,0,70,255,227,6,46,7,79,16,39,22,193,5,211,1,116,18,6,8,13,0,0,0,2,0,119,255,227,6,95,5,213,0,11,0,28,0,0, + 37,50,54,53,52,38,35,34,6,21,20,22,3,17,54,55,50,4,21,20,4,35,34,36,53,17,1,39,1,4,99,122,173,200,95,128,178,204,204,128, + 178,235,1,17,254,221,217,236,254,240,254,170,154,1,152,131,164,151,168,148,169,147,164,151,5,82,253,123,73,1,240,236,250,225,240,236,3,88,253,244, + 102,2,100,0,255,255,0,119,255,227,6,95,7,79,16,39,22,193,4,211,1,116,18,6,8,15,0,0,0,2,0,137,2,139,4,17,5,223,0,16, + 0,28,0,0,1,17,3,39,19,51,17,54,51,50,22,21,20,6,35,34,38,5,50,54,53,52,38,35,34,6,21,20,22,1,145,198,66,247,161,81, + 95,148,172,183,137,149,171,1,64,88,80,94,74,92,84,97,3,149,1,192,254,254,61,1,79,254,151,41,134,132,140,126,134,24,86,70,84,72,85,71, + 81,75,0,0,255,255,0,201,0,0,5,59,5,213,18,6,0,43,0,0,255,255,0,137,2,156,3,111,5,223,18,6,7,225,0,0,255,255,0,137, + 0,0,8,26,8,75,16,39,7,24,3,89,0,0,16,6,7,240,0,0,255,255,0,137,0,0,8,26,5,242,16,38,7,240,0,0,16,7,7,25, + 3,89,0,0,255,255,0,137,0,0,8,26,7,79,16,38,7,240,0,0,16,7,7,26,3,89,0,0,255,255,0,137,255,227,7,151,5,223,16,38, + 7,240,0,0,16,7,7,27,3,89,0,0,255,255,0,137,255,227,7,151,7,79,16,38,7,240,0,0,16,7,7,28,3,89,0,0,255,255,0,137, + 255,227,8,26,5,223,16,38,7,240,0,0,16,7,7,30,3,89,0,0,255,255,0,137,255,227,8,26,7,79,16,38,7,240,0,0,16,7,7,31, + 3,89,0,0,255,255,0,137,2,139,6,98,5,223,16,39,7,47,3,89,0,0,16,6,7,240,0,0,0,1,0,70,0,0,6,46,5,242,0,18, + 0,58,64,9,3,2,5,28,18,11,28,12,19,16,220,236,220,236,204,57,49,0,64,9,66,11,8,149,0,15,145,1,4,47,204,244,57,236,204,48, + 75,83,88,183,1,17,2,0,17,3,3,2,4,7,16,237,16,14,237,89,37,1,23,1,33,17,52,38,35,34,6,21,35,52,36,51,50,4,21,4, + 62,1,86,154,254,104,254,222,204,102,128,178,202,1,35,217,236,1,16,190,2,12,102,253,156,4,23,164,151,169,146,250,225,240,236,0,0,1,0,119, + 0,0,6,95,5,242,0,18,0,58,64,9,8,28,7,15,28,16,0,17,19,16,220,220,57,236,220,236,49,0,64,9,66,7,11,149,0,4,145,18, + 15,47,204,244,57,236,204,48,75,83,88,183,18,17,17,0,17,16,17,16,4,7,16,237,16,14,237,89,37,17,52,36,51,50,4,21,35,52,38,35, + 34,6,21,17,33,1,55,2,103,1,16,236,217,1,35,202,178,128,102,204,254,222,254,104,154,190,3,88,236,240,225,250,146,169,151,164,251,233,2,100, + 102,0,0,0,0,1,0,70,255,227,6,46,5,213,0,18,0,61,64,9,16,17,14,28,1,8,28,7,19,16,220,236,220,236,49,0,64,12,66,18, + 15,7,11,149,4,140,0,15,145,19,16,228,57,244,238,204,16,204,48,75,83,88,183,18,17,17,0,17,16,17,16,4,7,16,237,16,14,237,89,1, + 17,20,4,35,34,36,53,51,20,22,51,50,54,53,17,33,1,7,4,62,254,240,236,217,254,221,202,178,128,102,204,1,34,1,152,154,5,23,252,168, + 236,240,225,250,146,169,151,164,4,23,253,156,102,0,0,0,0,1,0,119,255,227,6,95,5,213,0,18,0,63,64,9,11,28,12,5,28,3,0,2, + 19,16,220,220,57,236,220,236,49,0,64,12,66,1,4,12,8,149,15,140,0,4,145,19,16,228,57,244,238,204,16,204,48,75,83,88,183,1,17,2, + 0,17,3,3,2,4,7,16,237,16,14,237,89,9,1,39,1,33,17,20,22,51,50,54,53,51,20,4,35,34,36,53,2,103,254,170,154,1,152,1, + 34,204,102,128,178,202,254,221,217,236,254,240,5,23,253,244,102,2,100,251,233,164,151,169,146,250,225,240,236,0,0,0,255,255,0,137,0,0,9,205, + 8,75,16,39,7,54,5,12,0,0,16,6,8,39,0,0,255,255,0,137,0,0,9,205,5,242,16,39,7,55,5,12,0,0,16,6,8,39,0,0, + 255,255,0,137,0,0,9,205,7,79,16,39,7,56,5,12,0,0,16,6,8,39,0,0,255,255,0,137,255,227,7,59,5,228,16,39,7,57,2,253, + 0,0,16,6,8,39,0,0,255,255,0,137,255,227,7,59,7,79,16,39,7,58,2,253,0,0,16,6,8,39,0,0,255,255,0,137,255,227,9,205, + 5,228,16,39,7,60,5,12,0,0,16,6,8,39,0,0,255,255,0,137,255,227,9,205,7,79,16,39,7,61,5,12,0,0,16,6,8,39,0,0, + 0,2,0,137,2,168,5,40,5,228,0,10,0,40,0,0,1,50,54,53,52,38,34,6,21,20,22,23,34,38,53,52,54,51,50,22,21,20,7,51, + 21,20,22,51,50,54,61,1,51,21,20,6,35,34,38,61,1,1,201,98,70,110,116,110,80,88,148,172,172,148,149,171,47,185,81,44,67,69,144,171, + 109,97,172,4,90,84,58,75,77,77,75,70,72,110,133,124,112,135,135,112,88,59,167,111,66,71,106,167,167,132,135,136,131,57,0,0,0,3,0,137, + 2,168,8,36,5,228,0,10,0,51,0,62,0,0,1,50,54,53,52,38,34,6,21,20,22,33,38,53,52,54,51,50,22,21,20,7,51,21,20,22, + 51,50,54,61,1,51,21,20,6,35,34,38,61,1,33,34,38,53,52,54,51,50,22,21,20,7,33,50,54,53,52,38,34,6,21,20,22,1,201,98, + 70,110,116,110,80,2,63,43,172,148,149,171,47,185,81,44,67,69,144,171,109,97,172,251,202,148,172,172,148,149,171,47,1,235,98,70,110,116,110,80, + 4,90,84,58,75,77,77,75,70,72,59,88,112,135,135,112,88,59,167,111,66,71,106,167,167,132,135,136,131,57,133,124,112,135,135,112,88,59,84,58, + 75,77,77,75,70,72,0,0,0,1,0,70,0,0,6,89,5,137,0,18,0,60,64,10,16,18,1,9,5,25,1,12,16,19,16,252,196,236,204,16, + 204,57,49,0,183,66,18,2,149,15,8,149,9,47,236,212,236,204,48,75,83,88,64,10,17,17,17,18,18,16,17,0,18,0,5,7,16,237,16,8, + 237,89,1,17,33,34,6,21,20,22,51,21,34,36,53,52,36,51,33,1,55,6,89,251,234,143,153,198,98,236,254,239,1,3,250,3,88,253,242,104, + 3,242,254,254,145,131,165,146,165,240,236,221,225,1,85,154,255,255,0,70,0,0,6,89,5,137,16,39,22,193,4,164,255,60,18,6,8,41,0,0, + 0,1,0,119,254,17,6,138,3,154,0,18,0,56,183,9,5,25,12,16,18,0,19,16,204,57,220,212,236,204,49,0,183,66,8,149,9,1,149,18, + 16,47,204,236,212,236,48,75,83,88,64,10,17,17,17,18,18,16,17,0,18,0,5,7,16,237,16,8,237,89,23,17,33,50,54,53,52,38,35,53, + 50,4,21,20,4,35,33,1,7,119,4,22,143,153,198,98,236,1,17,254,253,250,252,168,2,13,103,88,1,2,145,131,165,146,165,240,236,221,225,254, + 171,154,0,0,255,255,0,119,254,17,6,138,5,23,16,39,22,193,6,92,255,60,18,6,8,43,0,0,0,1,0,70,254,17,6,89,3,154,0,18, + 0,58,64,9,3,1,18,14,25,10,7,16,19,16,252,204,236,212,204,57,49,0,183,66,11,149,10,17,149,1,3,47,204,236,212,236,48,75,83,88, + 64,10,2,17,1,1,1,3,17,0,1,0,5,7,16,237,16,8,237,89,5,1,39,1,33,34,36,53,52,36,51,21,34,6,21,20,22,51,33,6, + 89,253,156,104,2,14,252,168,250,254,253,1,17,236,98,198,153,143,4,22,88,254,105,154,1,85,225,221,236,240,165,146,165,131,145,0,255,255,0,70, + 254,17,6,89,5,23,16,39,22,193,4,105,255,60,18,6,8,45,0,0,0,1,0,137,2,181,4,92,5,228,0,18,0,0,1,5,39,37,33,34, + 38,53,52,54,51,21,34,6,21,20,22,51,33,4,92,254,177,61,1,46,253,204,158,163,172,167,82,105,80,89,2,146,3,172,247,66,232,126,131,125, + 135,110,68,90,72,67,0,0,0,1,0,119,0,0,5,4,5,213,0,16,0,0,37,35,53,51,53,33,53,1,51,1,33,17,51,21,35,21,35,3, + 113,201,201,253,6,2,61,202,253,195,2,250,201,201,202,224,164,212,173,2,208,253,45,254,130,164,224,0,0,1,0,33,0,0,4,174,5,213,0,16, + 0,0,37,21,35,53,35,53,51,17,33,1,51,1,21,33,21,51,21,1,180,202,201,201,2,250,253,195,202,2,61,253,6,201,224,224,224,164,1,126, + 2,211,253,48,173,212,164,0,255,255,0,33,0,0,4,174,7,79,16,39,22,193,4,3,1,116,18,6,8,49,0,0,0,1,0,119,0,0,5,4, + 5,213,0,16,0,0,1,53,51,21,51,21,35,17,33,1,35,1,53,33,53,35,53,3,113,202,201,201,253,6,2,61,202,253,195,2,250,201,4,245, + 224,224,164,254,130,253,45,2,208,173,212,164,255,255,0,119,0,0,5,4,7,79,16,39,22,193,5,218,1,116,18,6,8,51,0,0,0,1,0,33, + 0,0,4,174,5,213,0,16,0,0,1,51,21,35,21,33,21,1,35,1,33,17,35,53,51,53,51,1,180,201,201,2,250,253,195,202,2,61,253,6, + 201,201,202,4,245,164,212,173,253,48,2,211,1,126,164,224,255,255,0,33,0,0,4,174,7,79,16,39,22,193,3,86,1,116,18,6,8,53,0,0, + 0,1,0,10,2,155,2,232,5,223,0,16,0,0,19,51,21,51,21,35,21,33,21,1,35,1,33,53,35,53,51,137,144,127,127,1,207,254,165,145, + 1,109,254,32,127,127,5,223,117,110,102,121,254,126,1,141,212,110,0,0,0,2,0,201,255,227,4,193,5,213,0,11,0,27,0,44,64,10,3,25, + 17,22,27,9,28,25,4,28,16,252,236,50,50,220,236,49,0,64,12,6,149,22,12,14,0,149,20,140,26,145,25,47,236,244,238,212,57,57,236,48, + 37,50,54,53,52,38,35,34,6,21,20,22,3,54,55,50,4,21,20,4,35,34,39,21,34,35,17,51,2,197,122,173,200,95,128,178,204,204,128,178, + 235,1,17,254,221,217,183,123,79,123,202,131,164,151,168,148,169,147,164,151,2,205,73,1,240,236,250,225,72,43,5,213,255,255,0,201,0,0,5,176, + 5,213,18,6,0,39,0,0,0,2,0,115,0,0,5,90,5,213,0,8,0,17,0,31,64,9,0,28,10,50,4,25,14,16,18,16,252,236,244,236, + 49,0,182,0,149,9,129,7,149,11,47,236,244,236,48,1,35,32,0,17,16,0,33,51,19,17,33,32,0,17,16,0,33,4,144,244,254,203,254,225, + 1,31,1,53,244,202,254,97,254,80,254,104,1,150,1,178,5,47,254,233,254,212,254,210,254,232,5,47,250,43,1,106,1,130,1,128,1,105,0,0, + 0,1,0,137,2,156,3,78,5,223,0,9,0,0,19,33,21,1,33,21,33,53,1,33,151,2,169,253,249,2,21,253,59,2,8,254,6,5,223,86, + 253,129,110,86,2,127,0,0,0,3,0,137,1,236,3,78,6,143,0,19,0,22,0,25,0,0,1,21,35,53,33,53,1,17,33,53,33,53,51,21, + 33,21,1,17,33,21,1,21,55,3,53,7,2,36,105,254,206,1,50,254,220,1,36,105,1,28,254,228,1,42,254,214,109,214,130,2,156,176,176,86, + 1,120,1,7,110,176,176,86,254,162,254,223,110,2,213,134,134,253,153,160,160,0,0,0,0,1,0,117,0,0,3,33,2,115,0,11,0,0,1,3, + 1,35,39,7,35,1,3,51,23,55,3,20,255,1,12,137,205,205,137,1,18,251,137,187,187,2,115,254,207,254,190,246,246,1,72,1,43,223,223,0, + 255,255,0,137,0,0,7,151,5,242,16,39,7,23,3,89,0,0,16,6,7,240,0,0,255,255,0,137,0,0,9,177,5,242,16,38,8,39,0,0, + 16,7,7,53,5,115,0,0,255,255,0,137,0,0,12,201,5,242,16,38,8,40,0,0,16,7,7,55,8,8,0,0,255,255,0,137,0,0,12,201, + 7,79,16,38,8,40,0,0,16,7,7,56,8,8,0,0,255,255,0,137,255,227,10,55,5,228,16,38,8,40,0,0,16,7,7,57,5,249,0,0, + 255,255,0,137,255,227,10,55,7,79,16,38,8,40,0,0,16,7,7,58,5,249,0,0,255,255,0,137,255,227,12,201,5,228,16,38,8,40,0,0, + 16,7,7,60,8,8,0,0,255,255,0,137,255,227,12,201,7,79,16,38,8,40,0,0,16,7,7,61,8,8,0,0,0,1,255,236,1,247,3,229, + 2,159,0,3,0,0,3,33,21,33,20,3,249,252,7,2,159,168,0,0,0,1,255,236,255,1,4,5,2,159,0,7,0,0,3,33,21,33,17,35, + 17,33,20,4,25,254,89,202,254,88,2,159,168,253,10,2,246,0,0,0,0,1,255,236,255,1,5,198,2,159,0,11,0,0,3,33,21,33,17,35, + 17,35,17,35,17,33,20,5,218,254,89,202,247,202,254,88,2,159,168,253,10,2,246,253,10,2,246,0,0,1,255,236,255,1,7,135,2,159,0,15, + 0,0,3,33,21,33,17,35,17,35,17,35,17,35,17,35,17,33,20,7,155,254,89,202,247,202,247,202,254,88,2,159,168,253,10,2,246,253,10,2, + 246,253,10,2,246,0,0,0,0,1,255,236,255,1,9,72,2,159,0,19,0,0,3,33,21,33,17,35,17,35,17,35,17,35,17,35,17,35,17,35, + 17,33,20,9,92,254,89,202,247,202,247,202,247,202,254,88,2,159,168,253,10,2,246,253,10,2,246,253,10,2,246,253,10,2,246,0,0,1,255,236, + 255,1,11,9,2,159,0,23,0,0,3,33,21,33,17,35,17,35,17,35,17,35,17,35,17,35,17,35,17,35,17,35,17,33,20,11,29,254,89,202, + 247,202,247,202,247,202,247,202,254,88,2,159,168,253,10,2,246,253,10,2,246,253,10,2,246,253,10,2,246,253,10,2,246,0,0,0,0,1,255,236, + 1,247,4,5,5,148,0,7,0,0,3,33,17,51,17,33,21,33,20,1,168,202,1,167,251,231,2,159,2,245,253,11,168,0,0,0,0,1,255,236, + 1,247,5,198,5,148,0,11,0,0,3,33,17,51,17,51,17,51,17,33,21,33,20,1,168,202,247,202,1,167,250,38,2,159,2,245,253,11,2,245, + 253,11,168,0,0,1,255,236,1,247,7,135,5,148,0,15,0,0,3,33,17,51,17,51,17,51,17,51,17,51,17,33,21,33,20,1,168,202,247,202, + 247,202,1,167,248,101,2,159,2,245,253,11,2,245,253,11,2,245,253,11,168,0,0,0,0,1,255,236,1,247,9,71,5,148,0,19,0,0,3,33, + 17,51,17,51,17,51,17,51,17,51,17,51,17,51,17,33,21,33,20,1,168,202,247,202,247,202,247,202,1,166,246,165,2,159,2,245,253,11,2,245, + 253,11,2,245,253,11,2,245,253,11,168,0,0,1,255,236,1,247,11,9,5,148,0,23,0,0,3,33,17,51,17,51,17,51,17,51,17,51,17,51, + 17,51,17,51,17,51,17,33,21,33,20,1,168,202,247,202,247,202,247,202,247,202,1,167,244,227,2,159,2,245,253,11,2,245,253,11,2,245,253,11, + 2,245,253,11,2,245,253,11,168,0,0,0,0,1,255,236,255,1,4,16,5,148,0,11,0,0,3,33,19,51,3,33,21,33,3,35,19,33,20,1, + 194,234,213,234,1,141,254,63,234,213,234,254,114,2,159,2,245,253,11,168,253,10,2,246,0,1,255,236,255,1,5,211,5,148,0,19,0,0,3,33, + 19,51,3,51,19,51,3,33,21,33,3,35,19,35,3,35,19,33,20,1,194,234,213,234,238,234,213,234,1,141,254,63,234,213,234,238,234,213,234,254, + 114,2,159,2,245,253,11,2,245,253,11,168,253,10,2,246,253,10,2,246,0,1,255,236,255,1,7,150,5,148,0,27,0,0,3,33,19,51,3,51, + 19,51,3,51,19,51,3,33,21,33,3,35,19,35,3,35,19,35,3,35,19,33,20,1,194,234,213,234,238,234,213,234,238,234,213,234,1,141,254,63, + 234,213,234,238,234,213,234,238,234,213,234,254,114,2,159,2,245,253,11,2,245,253,11,2,245,253,11,168,253,10,2,246,253,10,2,246,253,10,2,246, + 0,1,255,236,255,1,9,89,5,148,0,35,0,0,3,33,19,51,3,51,19,51,3,51,19,51,3,51,19,51,3,33,21,33,3,35,19,35,3,35, + 19,35,3,35,19,35,3,35,19,33,20,1,194,234,213,234,238,234,213,234,238,234,213,234,238,234,213,234,1,141,254,63,234,213,234,238,234,213,234,238, + 234,213,234,238,234,213,234,254,114,2,159,2,245,253,11,2,245,253,11,2,245,253,11,2,245,253,11,168,253,10,2,246,253,10,2,246,253,10,2,246, + 253,10,2,246,0,1,255,236,255,1,11,28,5,148,0,43,0,0,3,33,19,51,3,51,19,51,3,51,19,51,3,51,19,51,3,51,19,51,3,33, + 21,33,3,35,19,35,3,35,19,35,3,35,19,35,3,35,19,35,3,35,19,33,20,1,194,234,213,234,238,234,213,234,238,234,213,234,238,234,213,234, + 238,234,213,234,1,141,254,63,234,213,234,238,234,213,234,238,234,213,234,238,234,213,234,238,234,213,234,254,114,2,159,2,245,253,11,2,245,253,11,2, + 245,253,11,2,245,253,11,2,245,253,11,168,253,10,2,246,253,10,2,246,253,10,2,246,253,10,2,246,253,10,2,246,0,1,255,236,0,83,4,5, + 4,67,0,11,0,0,3,33,17,51,17,33,21,33,17,35,17,33,20,1,168,202,1,167,254,89,202,254,88,2,159,1,164,254,92,168,254,92,1,164, + 0,1,255,236,0,83,5,198,4,67,0,19,0,0,3,33,17,51,17,51,17,51,17,33,21,33,17,35,17,35,17,35,17,33,20,1,168,202,246,202, + 1,168,254,88,202,246,202,254,88,2,159,1,164,254,92,1,164,254,92,168,254,92,1,164,254,92,1,164,0,1,255,236,0,83,7,132,4,67,0,27, + 0,0,3,33,17,51,17,51,17,51,17,51,17,51,17,33,21,33,17,35,17,35,17,35,17,35,17,35,17,33,20,1,168,202,246,202,248,202,1,164, + 254,92,202,248,202,246,202,254,88,2,159,1,164,254,92,1,164,254,92,1,164,254,92,168,254,92,1,164,254,92,1,164,254,92,1,164,0,1,255,236, + 0,83,9,70,4,67,0,35,0,0,3,33,17,51,17,51,17,51,17,51,17,51,17,51,17,51,17,33,21,33,17,35,17,35,17,35,17,35,17,35, + 17,35,17,35,17,33,20,1,168,202,246,202,248,202,246,202,1,166,254,90,202,246,202,248,202,246,202,254,88,2,159,1,164,254,92,1,164,254,92,1, + 164,254,92,1,164,254,92,168,254,92,1,164,254,92,1,164,254,92,1,164,254,92,1,164,0,1,255,236,0,83,11,9,4,67,0,43,0,0,3,33, + 17,51,17,51,17,51,17,51,17,51,17,51,17,51,17,51,17,51,17,33,21,33,17,35,17,35,17,35,17,35,17,35,17,35,17,35,17,35,17,35, + 17,33,20,1,168,202,246,202,248,202,246,202,248,202,1,167,254,89,202,248,202,246,202,248,202,246,202,254,88,2,159,1,164,254,92,1,164,254,92,1, + 164,254,92,1,164,254,92,1,164,254,92,168,254,92,1,164,254,92,1,164,254,92,1,164,254,92,1,164,254,92,1,164,0,1,255,236,255,1,4,16, + 5,148,0,17,0,0,3,33,3,51,27,1,51,3,33,21,33,19,35,11,1,35,19,33,20,1,141,234,213,154,154,213,234,1,141,254,114,234,213,153, + 153,213,234,254,114,2,159,2,245,254,14,1,242,253,11,168,253,10,1,239,254,17,2,246,0,3,255,236,255,1,6,25,5,148,0,2,0,14,0,17, + 0,0,1,27,1,37,33,1,51,1,33,21,33,1,35,1,33,1,3,33,2,50,208,209,252,25,1,94,1,68,233,1,68,1,94,254,163,254,187,233, + 254,187,254,163,3,22,207,1,159,1,247,254,26,1,230,168,2,245,253,11,168,253,10,2,246,2,141,254,27,0,0,0,0,1,255,236,255,87,6,99, + 2,159,0,13,0,0,3,33,21,33,17,33,53,33,53,33,17,33,17,33,20,6,119,251,251,1,249,254,209,1,249,252,115,254,88,2,159,168,254,8, + 168,168,254,8,2,160,0,0,0,5,255,236,254,21,9,183,2,159,0,20,0,24,0,27,0,31,0,35,0,0,3,53,33,21,33,9,1,33,1,7, + 5,33,39,7,33,37,39,1,33,9,1,33,1,55,37,33,23,55,1,23,55,39,55,23,1,33,20,9,203,254,186,253,244,2,12,254,250,254,119,131, + 1,6,254,250,131,131,254,250,1,6,131,254,119,254,250,2,12,253,244,1,6,1,137,131,254,250,1,6,131,131,254,250,131,131,131,131,131,1,137,254, + 250,1,247,168,168,254,15,254,15,1,117,124,249,124,124,249,124,254,139,1,241,1,241,254,139,124,249,124,124,254,15,124,124,124,124,124,1,117,0,0, + 0,10,255,236,1,247,9,71,7,55,0,43,0,47,0,51,0,55,0,59,0,63,0,67,0,71,0,75,0,79,0,0,3,33,53,35,53,51,53,35, + 53,51,53,35,53,51,53,51,21,51,53,51,21,51,53,51,21,51,53,51,21,51,21,35,21,51,21,35,21,51,21,35,21,33,21,33,1,35,21,51, + 37,35,21,51,37,35,21,51,5,35,21,51,37,35,21,51,37,35,21,51,5,35,21,51,37,35,21,51,37,35,21,51,20,1,168,202,202,202,202,202, + 202,202,247,202,247,202,247,202,202,202,202,202,202,202,1,166,246,165,6,235,247,247,254,63,247,247,254,63,247,247,3,130,247,247,254,63,247,247,254,63, + 247,247,3,130,247,247,254,63,247,247,254,63,247,247,2,159,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,3,240,168, + 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,0,2,255,236,0,167,5,139,2,159,0,3,0,7,0,0,19,33,21,33,3,33,21,33, + 182,3,248,252,8,202,5,159,250,97,1,79,168,1,248,168,0,1,0,113,0,58,4,35,4,91,0,8,0,0,1,21,33,1,39,9,1,55,1,4, + 35,254,125,254,67,114,1,159,254,97,114,1,188,2,159,168,254,67,114,1,159,1,158,114,254,68,0,0,0,1,255,236,0,58,3,158,4,91,0,8, + 0,0,3,33,1,23,9,1,7,1,33,20,1,132,1,188,114,254,97,1,159,114,254,67,254,125,2,159,1,188,114,254,98,254,97,114,1,189,0,0, + 0,2,0,61,0,0,4,127,4,96,0,7,0,10,0,0,33,35,3,33,3,35,1,51,1,33,3,4,127,195,102,254,16,102,195,1,164,250,254,195, + 1,128,192,1,19,254,237,4,96,253,71,2,5,0,0,0,0,2,0,11,0,0,5,91,4,96,0,15,0,19,0,0,51,1,33,21,33,17,33,21, + 33,17,33,21,33,17,33,3,1,3,33,17,11,1,217,3,106,253,246,1,243,254,13,2,23,253,47,254,190,116,1,154,232,1,4,4,96,148,254,211, + 148,254,136,147,1,19,254,237,3,205,253,218,2,38,0,0,0,3,0,123,255,227,7,111,4,123,0,52,0,61,0,74,0,0,37,14,1,35,34,39, + 38,61,1,33,46,1,35,34,7,6,7,53,62,1,51,50,23,22,23,62,1,51,50,23,22,21,20,7,6,35,33,21,20,23,22,51,50,54,55,21, + 6,7,6,35,34,39,38,1,22,23,22,51,50,55,54,55,37,50,54,53,52,39,38,35,34,7,6,29,1,4,7,74,212,132,226,132,132,3,78,12, + 204,183,104,100,100,100,100,208,106,167,124,124,77,73,216,143,189,105,105,127,126,251,254,254,83,84,151,96,182,84,101,95,95,90,142,106,107,252,247,1, + 83,82,137,153,92,93,14,1,105,223,172,65,64,111,153,92,93,155,90,94,145,146,250,90,191,200,27,26,53,174,42,44,61,60,119,120,120,93,94,168, + 189,96,96,18,127,70,69,46,46,170,39,20,19,48,48,1,135,151,90,90,87,87,158,96,102,123,98,58,57,109,108,180,41,0,0,0,0,3,0,62, + 0,0,4,62,4,96,0,10,0,17,0,35,0,0,37,32,53,52,41,1,21,51,21,35,21,1,52,43,1,17,51,50,55,20,7,30,1,21,20,6, + 35,33,53,35,53,51,17,33,50,22,2,120,1,2,254,254,254,250,220,220,1,222,236,242,242,236,185,214,127,140,231,214,254,57,124,124,1,182,197,212, + 153,181,180,102,164,95,2,157,145,254,218,170,208,31,24,152,114,150,164,248,164,2,196,144,255,255,0,113,255,227,3,231,4,123,16,6,0,70,0,0, + 0,2,0,186,0,0,4,103,4,96,0,8,0,17,0,0,1,17,51,50,54,53,52,38,35,37,33,32,0,17,16,0,41,1,1,115,141,217,203,203, + 217,254,186,1,55,1,70,1,48,254,206,254,188,254,201,3,205,252,199,199,214,213,199,147,254,241,254,224,254,223,254,240,0,2,0,36,0,0,4,103, + 4,96,0,12,0,25,0,0,19,33,32,0,17,16,0,41,1,17,35,53,51,33,21,35,17,51,50,54,53,52,38,43,1,17,186,1,55,1,70,1, + 48,254,206,254,188,254,201,150,150,1,122,193,141,217,203,203,217,141,4,96,254,241,254,224,254,223,254,240,1,245,164,164,254,159,199,214,213,199,254,204, + 0,1,0,186,0,0,3,139,4,96,0,11,0,0,19,33,21,33,17,33,21,33,17,33,21,33,186,2,196,253,246,1,243,254,13,2,23,253,47,4, + 96,148,254,211,148,254,136,147,0,1,0,130,255,227,3,197,4,124,0,49,0,0,1,22,23,22,21,20,7,6,35,34,38,39,53,22,23,22,51,50, + 55,54,53,52,39,38,43,1,53,51,50,55,54,53,52,39,38,35,34,7,6,7,53,54,55,54,51,50,4,21,20,6,2,191,112,60,60,114,113,196, + 76,170,98,97,80,81,71,119,69,70,68,67,116,155,148,137,72,78,84,85,151,93,85,85,71,90,84,85,80,238,1,2,138,2,3,24,65,64,93,141, + 79,78,24,24,167,29,13,13,46,46,64,70,45,44,152,51,56,88,90,56,56,18,19,37,171,28,14,14,182,173,108,146,0,2,0,193,254,76,1,121, + 4,96,0,3,0,7,0,0,19,51,17,35,17,53,51,21,193,184,184,184,4,96,251,160,254,76,233,233,0,1,0,0,255,227,2,123,4,96,0,16, + 0,0,61,1,30,1,51,50,55,54,53,17,51,17,16,6,35,34,38,68,146,78,103,46,43,151,158,186,71,143,61,185,60,61,77,70,215,2,121,253, + 135,254,230,234,44,0,0,0,255,255,0,186,0,0,4,156,4,96,16,6,0,250,0,0,0,1,0,2,0,0,3,252,4,123,0,13,0,0,19,51, + 17,55,23,7,17,33,21,33,17,7,39,55,186,185,137,76,213,2,137,252,190,110,74,184,4,123,254,100,97,106,151,254,107,170,1,188,78,106,131,0, + 255,255,0,186,0,0,5,79,4,96,16,6,3,208,0,0,255,255,0,186,0,0,4,121,4,96,16,6,3,204,0,0,255,255,0,113,255,227,4,117, + 4,123,16,6,0,82,0,0,255,255,0,127,255,227,3,245,4,123,16,6,2,22,0,0,0,2,0,113,0,45,5,9,4,49,0,10,0,22,0,0, + 1,52,38,32,6,21,20,22,51,50,54,55,20,0,33,32,0,53,52,0,33,32,0,4,109,231,254,110,231,232,200,199,233,156,254,200,254,236,254,237, + 254,199,1,57,1,19,1,20,1,56,2,47,148,172,171,149,147,172,172,147,240,254,238,1,18,240,241,1,17,254,239,0,0,1,0,113,0,116,5,9, + 3,234,0,24,0,0,37,35,62,1,53,52,38,32,6,21,20,22,23,35,46,1,53,52,0,33,32,0,17,20,6,4,195,172,43,43,227,254,102,227, + 43,43,170,36,36,1,62,1,14,1,18,1,58,35,116,78,157,80,179,198,198,179,80,157,78,77,165,93,253,1,42,254,211,254,250,85,162,0,0,0, + 0,3,0,51,0,5,5,77,4,89,0,9,0,19,0,43,0,0,9,1,14,1,21,20,22,51,50,54,55,62,1,53,52,38,35,34,6,7,39,62, + 1,51,32,0,21,20,6,7,23,7,39,14,1,35,32,0,53,52,54,55,39,55,3,178,253,176,42,40,232,200,79,117,154,41,41,235,211,72,110,46, + 151,77,197,119,1,20,1,56,51,52,168,79,179,77,198,120,254,237,254,199,52,51,168,78,1,24,1,231,41,103,65,147,172,20,92,42,103,62,151,169, + 19,20,125,54,54,254,239,241,93,159,67,139,95,146,53,54,1,18,240,96,161,63,139,96,0,3,0,113,255,227,7,195,4,123,0,38,0,47,0,61, + 0,0,19,53,33,38,39,38,35,34,6,7,53,62,1,51,50,22,23,54,55,54,51,50,23,22,17,16,7,6,35,34,39,38,39,14,1,35,34,39, + 38,55,22,23,22,51,50,55,54,55,1,50,55,54,16,39,38,35,34,6,21,20,23,22,113,3,78,12,102,102,183,106,200,98,100,208,106,160,242,81, + 71,104,105,140,241,136,137,137,136,241,140,105,106,66,78,232,143,226,132,132,185,2,82,82,137,153,92,93,14,2,8,148,86,86,85,86,149,147,172,86, + 86,2,0,90,190,100,99,52,52,174,42,44,110,109,110,54,55,157,156,254,237,254,236,156,156,55,56,108,107,112,145,146,196,152,90,89,87,87,158,254, + 180,115,116,1,146,116,115,232,200,199,116,117,0,1,0,113,2,47,4,117,4,123,0,13,0,0,1,52,38,35,34,6,21,35,16,0,51,50,0,17, + 3,178,172,147,148,172,194,1,17,241,240,1,18,2,47,199,233,231,201,1,20,1,56,254,200,254,236,0,0,1,0,113,255,227,4,117,2,47,0,13, + 0,0,1,20,22,51,50,54,53,51,16,0,35,34,0,17,1,52,172,147,148,172,194,254,239,241,240,254,238,2,47,199,233,231,201,254,236,254,200,1, + 56,1,20,0,0,2,0,151,0,0,3,204,4,96,0,7,0,17,0,0,1,17,33,50,54,52,38,35,37,33,50,22,16,6,35,33,17,35,1,78, + 1,1,91,99,99,91,254,72,1,184,188,193,193,188,254,255,183,3,197,254,152,94,172,94,155,170,254,182,170,254,62,0,0,2,0,50,0,0,4,15, + 4,96,0,22,0,33,0,0,1,46,1,53,52,55,54,51,33,17,35,17,35,34,7,6,7,3,35,19,54,55,54,1,35,34,7,6,21,20,23,22, + 59,1,1,181,106,112,107,108,217,1,132,185,169,97,59,59,63,162,195,174,53,52,53,1,216,198,119,63,64,64,63,119,198,2,13,27,140,105,162,81, + 80,251,160,1,217,37,36,113,254,225,1,50,94,54,54,1,201,42,42,84,83,43,43,0,0,2,0,50,0,0,4,15,4,96,0,22,0,33,0,0, + 1,38,39,38,39,3,51,19,22,23,22,59,1,17,51,17,33,34,39,38,53,52,54,1,17,35,34,7,6,21,20,23,22,51,1,181,55,53,52,53, + 174,195,162,63,59,59,97,169,185,254,124,217,108,107,112,2,11,198,119,63,64,64,63,119,2,83,17,54,54,94,1,50,254,225,113,36,37,1,217,251, + 160,80,81,162,105,140,254,99,1,81,43,43,83,84,42,42,255,255,0,60,0,0,4,109,4,96,16,6,3,214,0,0,0,1,0,186,255,224,4,20, + 4,96,0,15,0,0,36,32,54,53,17,51,17,20,6,32,38,53,17,51,17,20,1,230,1,2,115,185,217,254,88,217,185,125,142,162,2,179,253,59, + 219,224,224,219,2,197,253,77,162,0,0,0,0,1,0,174,0,76,5,43,3,246,0,19,0,0,37,33,53,33,50,54,53,52,38,35,33,53,33,21, + 35,30,1,21,20,6,3,84,253,90,2,159,159,159,190,164,253,133,4,96,172,102,99,240,76,184,124,124,150,172,184,184,66,178,116,194,200,0,0,0, + 0,3,0,174,0,78,6,219,3,248,0,3,0,7,0,27,0,0,19,53,51,21,3,53,51,21,5,33,53,33,50,54,53,52,38,35,33,53,33,21, + 35,30,1,21,20,6,174,202,202,202,3,140,253,90,2,159,159,159,190,164,253,133,4,96,172,102,99,240,2,120,204,204,254,122,202,202,164,184,124,124, + 148,174,184,184,68,176,118,192,200,0,0,0,0,1,0,47,254,24,4,170,4,123,0,38,0,0,1,30,1,21,20,7,6,35,33,53,33,50,54,53, + 52,38,35,33,53,33,50,55,54,53,52,39,38,35,33,53,33,21,35,30,1,21,20,7,6,3,184,124,118,122,123,226,253,92,2,158,161,156,190,164, + 253,135,2,158,162,77,78,96,95,163,253,135,4,96,174,103,98,62,62,1,12,69,192,130,175,95,95,185,114,117,143,166,185,57,57,119,141,83,83,185, + 185,63,176,121,122,86,85,0,255,255,0,61,0,0,4,127,4,96,16,6,0,89,0,0,255,255,0,86,0,0,6,53,4,96,16,6,0,90,0,0, + 255,255,0,88,0,0,3,219,4,96,16,6,0,93,0,0,0,1,0,120,255,227,3,186,4,96,0,23,0,0,55,22,51,50,54,52,38,43,1,53, + 1,37,53,33,21,1,50,30,1,21,20,6,32,39,138,161,211,128,132,123,110,127,1,10,253,212,3,0,254,246,70,151,111,228,254,125,201,189,66,100, + 187,100,144,1,62,1,147,147,254,194,74,159,109,160,182,55,0,1,0,179,0,0,3,252,4,123,0,5,0,0,51,17,33,21,33,17,179,3,73,253, + 129,4,123,170,252,47,0,0,255,255,0,61,0,0,4,127,4,96,16,6,2,78,0,0,0,1,0,151,0,0,3,236,4,96,0,7,0,0,1,17, + 35,17,33,17,35,17,3,236,182,254,23,182,4,96,251,160,3,183,252,73,4,96,0,0,255,255,0,151,0,0,3,204,4,96,16,6,8,122,0,0, + 0,1,0,90,0,0,4,94,4,96,0,27,0,0,1,51,17,54,55,54,53,17,51,17,16,7,6,7,21,35,53,38,39,38,25,1,51,17,20,23, + 22,23,2,0,184,85,57,86,194,136,109,177,184,175,109,138,196,86,57,83,4,96,253,49,26,77,115,201,1,44,254,212,254,236,156,125,25,238,238,25, + 125,156,1,20,1,44,254,212,199,117,77,26,255,255,0,76,0,0,4,115,4,96,16,6,3,207,0,0,0,2,0,10,2,156,3,104,5,224,0,2, + 0,10,0,0,1,3,33,3,51,1,35,39,33,7,35,1,185,173,1,90,245,144,1,103,132,86,254,88,86,134,5,113,254,96,2,15,252,188,214,214, + 0,2,0,5,2,156,4,150,5,224,0,15,0,19,0,0,1,21,33,21,33,21,33,17,33,21,33,53,33,7,35,1,23,3,33,17,4,138,254,46, + 1,191,254,65,1,222,253,162,254,179,101,129,1,138,87,208,1,34,5,224,95,248,95,254,209,95,214,214,3,68,88,254,73,1,183,0,0,3,0,127, + 2,156,3,26,5,224,0,10,0,21,0,38,0,0,19,17,51,50,55,54,53,52,39,38,35,3,21,51,50,55,54,53,52,39,38,35,37,33,50,23, + 22,21,20,7,6,7,30,1,21,20,6,35,33,254,204,103,49,50,50,49,103,204,188,94,45,46,46,45,94,254,197,1,69,145,79,79,41,40,78,94, + 104,172,158,254,175,4,43,254,206,38,38,77,79,37,37,1,88,252,31,31,64,63,32,31,93,54,53,100,76,46,45,11,18,114,85,112,122,0,0,0, + 0,2,0,127,2,156,3,149,5,224,0,10,0,21,0,0,19,17,51,50,55,54,53,52,39,38,35,37,33,32,23,22,21,20,7,6,41,1,254,154, + 194,91,90,90,91,194,254,231,1,5,1,18,127,128,128,129,254,240,254,251,5,131,253,118,78,79,169,168,78,78,93,101,101,215,216,102,101,0,0,0, + 0,1,0,127,2,156,2,221,5,224,0,11,0,0,19,33,21,33,21,33,21,33,17,33,21,33,127,2,82,254,45,1,192,254,64,1,223,253,162,5, + 224,95,248,95,254,209,95,0,0,1,0,83,2,156,2,177,5,224,0,11,0,0,1,17,33,53,33,17,33,53,33,53,33,53,2,177,253,162,1,222, + 254,64,1,192,254,45,5,224,252,188,95,1,47,95,248,95,0,1,0,72,2,140,3,126,5,239,0,36,0,0,1,53,35,53,33,17,6,7,6,35, + 34,39,38,53,52,55,54,51,50,23,22,23,21,38,39,38,35,34,7,6,21,20,23,22,51,50,54,3,0,208,1,78,74,89,88,101,221,124,125,125, + 124,221,92,83,82,70,70,80,79,87,173,87,86,86,87,173,67,106,3,19,225,93,254,153,47,23,24,114,115,204,205,115,114,20,20,39,121,53,27,27, + 85,86,170,169,86,85,20,0,0,1,0,127,2,156,3,76,5,224,0,11,0,0,19,51,17,33,17,51,17,35,17,33,17,35,127,127,1,206,128,128, + 254,50,127,5,224,254,169,1,87,252,188,1,142,254,114,0,0,1,0,127,2,156,0,254,5,224,0,3,0,0,19,51,17,35,127,127,127,5,224,252, + 188,0,0,0,0,1,255,189,1,182,0,254,5,224,0,12,0,0,19,51,17,20,7,6,43,1,53,51,50,54,53,127,127,65,64,143,49,40,84,70, + 5,224,252,246,151,68,69,96,84,108,0,0,0,1,0,127,2,156,3,105,5,224,0,10,0,0,19,51,17,1,51,9,1,35,1,17,35,127,127,1, + 166,164,254,45,1,244,167,254,60,127,5,224,254,159,1,97,254,122,254,66,1,147,254,109,0,1,0,127,2,156,2,200,5,224,0,5,0,0,19,51, + 17,33,21,33,127,127,1,202,253,183,5,224,253,27,95,0,0,1,0,127,2,156,3,219,5,224,0,12,0,0,19,51,27,1,51,17,35,17,3,35, + 3,17,35,127,189,240,242,189,124,242,128,243,123,5,224,253,199,2,57,252,188,2,222,253,195,2,61,253,34,0,0,0,0,1,0,127,2,156,3,71, + 5,224,0,9,0,0,19,51,1,17,51,17,35,1,17,35,127,171,1,161,124,172,254,95,123,5,224,253,69,2,187,252,188,2,187,253,69,0,0,0, + 0,1,0,127,2,156,3,71,5,224,0,9,0,0,1,17,35,17,1,35,17,51,17,1,3,71,124,254,95,171,123,1,161,5,224,252,188,2,187,253, + 69,3,68,253,69,2,187,0,0,2,0,72,2,140,3,175,5,239,0,15,0,27,0,0,1,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38, + 36,32,23,22,21,20,7,6,32,39,38,16,1,252,138,82,81,81,82,138,139,81,81,81,81,254,175,1,140,119,118,118,119,254,116,119,119,5,147,91, + 92,159,158,92,91,91,92,158,159,92,91,92,118,118,198,197,118,118,117,118,1,140,0,0,0,2,0,71,2,140,3,62,5,239,0,15,0,64,0,0, + 1,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,3,6,7,6,21,20,23,22,51,50,55,54,53,52,39,38,39,53,50,23,22,21,20,7, + 6,7,22,23,22,21,20,7,6,35,34,38,53,52,55,54,55,38,39,38,53,52,55,54,51,1,194,115,67,68,68,67,115,116,68,67,67,66,154,82, + 54,53,60,37,128,106,60,61,48,69,82,144,94,88,54,53,96,108,60,61,99,97,184,183,196,61,61,108,108,42,54,82,73,162,4,41,43,43,76,75, + 44,43,43,44,75,76,43,43,1,53,2,35,35,44,38,41,25,36,37,76,89,24,43,4,56,58,54,105,71,50,50,18,19,55,56,80,121,65,65,130, + 121,80,56,55,19,18,39,50,49,73,46,42,0,2,0,127,2,156,2,222,5,224,0,9,0,21,0,0,19,17,51,50,55,54,52,39,38,35,37,33, + 50,23,22,20,7,6,43,1,17,35,254,160,89,48,49,49,48,89,254,225,1,31,158,81,81,81,81,158,160,127,5,131,254,198,41,41,150,41,41,93, + 63,64,246,64,63,254,176,0,0,2,0,127,2,156,3,91,5,224,0,23,0,32,0,0,1,22,23,22,31,1,35,39,38,39,38,43,1,17,35,17, + 33,50,23,22,21,20,7,6,1,17,51,50,54,53,52,38,35,2,61,41,38,39,39,129,136,121,46,44,44,76,138,127,1,31,161,80,79,41,42,254, + 115,160,92,94,94,92,4,36,12,41,40,71,228,214,84,28,27,254,159,3,68,60,60,121,79,52,52,1,75,254,215,76,73,74,74,0,0,1,255,252, + 2,156,3,24,5,224,0,7,0,0,3,33,21,33,17,35,17,33,4,3,28,254,178,128,254,178,5,224,95,253,27,2,229,0,0,0,0,1,0,112, + 2,140,3,64,5,224,0,19,0,0,19,51,17,20,22,51,50,55,54,53,17,51,17,20,7,6,32,39,38,53,112,128,110,122,123,55,54,128,91,91, + 254,156,91,91,5,224,254,4,134,118,59,59,134,1,252,253,246,163,84,83,83,84,163,0,0,1,0,43,2,156,4,210,5,224,0,12,0,0,19,51, + 27,1,51,27,1,51,3,35,11,1,35,43,128,198,197,143,198,197,130,237,160,198,201,160,5,224,253,61,2,195,253,61,2,195,252,188,2,214,253,42, + 0,2,0,77,2,140,2,161,5,30,0,12,0,43,0,0,1,34,7,6,21,20,22,51,50,55,54,61,1,55,17,35,53,6,7,6,35,34,38,53, + 52,54,59,1,53,52,38,35,34,7,6,7,53,54,55,54,51,50,23,22,1,186,140,54,55,82,70,96,58,59,115,115,40,59,60,85,109,128,160,158, + 163,106,95,60,58,57,53,64,60,59,57,153,76,75,3,215,28,29,69,55,64,61,61,100,23,43,254,154,95,57,27,27,108,91,105,108,10,71,78,13, + 13,26,96,21,11,11,70,71,0,2,0,77,2,140,2,161,5,30,0,12,0,45,0,0,1,50,55,54,53,52,38,35,34,7,6,29,1,7,17,51, + 21,54,55,54,51,50,23,22,21,20,7,6,43,1,21,20,22,51,50,55,54,55,21,6,7,6,35,34,39,38,1,53,140,54,55,82,70,96,58,59, + 116,116,40,59,60,85,109,64,63,80,79,158,163,106,95,60,58,57,53,64,60,60,56,153,76,76,3,211,28,29,69,55,64,61,60,101,23,43,1,102, + 95,57,27,27,54,54,90,106,54,54,10,71,78,13,13,26,96,21,12,10,70,71,0,0,0,2,0,71,2,140,2,190,5,30,0,19,0,31,0,0, + 1,53,51,17,35,53,6,7,6,35,34,39,38,16,55,54,51,50,23,22,4,20,23,22,50,55,54,52,39,38,34,7,2,74,116,116,37,55,56,78, + 128,81,80,80,81,128,78,56,55,254,154,52,53,184,53,53,53,53,184,53,4,176,95,253,141,94,56,27,27,90,91,1,40,91,90,27,27,161,228,65, + 64,64,65,228,65,64,64,0,0,3,0,77,2,140,4,175,5,30,0,51,0,60,0,74,0,0,1,14,1,35,34,39,38,61,1,33,38,39,38,35, + 34,6,7,53,54,55,54,51,50,23,22,23,54,55,54,51,50,22,21,20,7,6,43,1,21,20,23,22,51,50,54,55,21,14,1,35,34,38,37,22, + 23,22,51,50,55,54,63,1,50,55,54,53,52,39,38,35,34,7,6,29,1,2,138,47,134,83,142,83,84,2,21,7,64,65,115,65,126,63,63,65, + 66,66,106,78,78,48,46,68,68,91,119,132,80,79,159,162,52,53,95,61,114,53,63,120,57,89,134,254,22,1,52,52,86,96,59,58,9,227,141,54, + 54,41,40,70,97,58,58,2,243,51,52,81,82,140,50,107,56,56,30,29,97,24,12,12,34,33,67,67,34,33,104,94,106,54,54,10,71,39,39,26, + 26,96,21,22,54,218,84,50,51,49,49,88,54,28,29,69,55,32,32,61,60,101,23,0,0,2,0,117,2,140,2,236,6,3,0,11,0,29,0,0, + 0,52,39,38,34,7,6,20,23,22,50,55,1,62,1,51,50,23,22,16,7,6,35,34,38,39,21,35,17,51,2,116,52,53,184,53,52,52,53,184, + 53,254,170,36,112,77,129,80,80,80,80,129,77,112,36,117,117,3,99,228,64,65,65,64,228,64,65,65,1,141,56,54,90,91,254,216,91,90,54,56, + 94,3,103,0,0,2,0,71,2,140,2,190,6,3,0,19,0,31,0,0,1,17,51,17,35,53,6,7,6,35,34,39,38,16,55,54,51,50,23,22, + 4,20,23,22,50,55,54,52,39,38,34,7,2,74,116,116,37,55,56,78,128,80,81,81,80,128,78,56,55,254,154,52,53,184,53,53,53,53,184,53, + 4,176,1,83,252,153,94,56,27,27,90,91,1,40,91,90,27,27,161,228,64,65,65,64,228,64,65,65,0,2,0,71,2,140,2,213,5,30,0,26, + 0,35,0,0,1,21,33,22,23,22,51,50,55,54,55,21,6,7,6,35,34,39,38,53,52,55,54,51,50,23,22,7,38,39,38,35,34,7,6,7, + 2,213,253,235,8,64,65,115,67,63,62,62,62,66,65,68,169,98,99,94,93,159,142,83,83,116,1,52,52,86,97,58,58,9,3,239,50,106,56,56, + 15,14,29,97,24,12,12,87,87,149,154,91,90,81,82,109,84,51,50,49,48,88,0,0,0,2,0,71,2,140,2,213,5,30,0,20,0,27,0,77, + 75,176,12,83,88,64,7,2,27,15,9,21,0,28,16,212,204,196,212,204,50,75,176,21,83,75,176,24,81,90,75,176,17,84,91,88,189,0,2,255, + 192,0,15,255,192,0,27,255,192,56,56,56,89,49,0,64,9,3,9,21,2,5,12,24,18,28,16,212,204,47,204,212,204,212,204,48,89,19,53,33, + 46,1,35,34,6,7,53,62,1,51,50,22,21,20,6,35,34,38,55,30,1,51,50,54,55,71,2,21,7,130,115,67,125,62,63,131,67,169,197,187, + 159,142,166,116,1,104,86,97,117,8,3,187,50,107,111,29,29,97,24,24,174,149,154,181,163,109,84,101,98,88,0,0,0,1,0,84,2,140,2,98, + 5,31,0,50,0,0,19,38,39,38,53,52,55,54,51,50,23,22,23,21,46,1,35,34,7,6,21,20,23,22,59,1,21,35,34,7,6,21,20,23, + 22,51,50,55,54,55,21,6,7,6,35,34,38,53,52,55,54,249,71,38,37,72,71,123,48,54,53,62,61,102,44,75,44,44,43,42,73,98,93,87, + 45,49,53,53,95,59,54,53,45,57,53,53,51,150,162,43,44,3,238,14,36,36,52,79,44,44,7,7,13,94,17,14,25,26,36,39,25,25,85,29, + 31,49,51,31,32,11,10,21,96,16,7,8,102,97,60,41,41,0,0,0,0,1,0,82,2,140,2,96,5,31,0,49,0,0,1,30,1,21,20,7, + 6,35,34,39,38,39,53,22,23,22,51,50,54,53,52,39,38,43,1,53,51,50,55,54,53,52,39,38,35,34,7,6,7,53,62,1,51,50,23,22, + 21,20,7,6,1,187,70,76,72,71,123,48,54,53,62,61,50,51,45,75,88,43,42,73,98,93,86,46,49,53,54,95,58,54,53,45,57,106,50,150, + 82,81,44,43,3,188,13,72,52,79,45,43,6,7,14,93,16,7,8,52,36,39,25,25,85,28,32,49,50,32,31,10,11,20,96,15,16,51,51,97, + 60,41,41,0,0,2,0,71,1,173,2,190,5,30,0,13,0,49,0,0,0,52,39,38,35,34,7,6,20,23,22,51,50,55,23,20,7,6,35,34, + 39,38,39,53,22,23,22,51,50,55,54,61,1,6,7,6,35,34,39,38,16,55,54,51,50,23,22,23,53,51,2,74,52,52,94,93,52,52,52,52, + 93,94,52,168,80,80,165,61,55,54,51,51,50,50,51,114,57,57,36,56,56,78,130,79,80,80,79,130,78,56,56,36,116,3,109,224,61,62,62,61, + 224,61,62,62,70,160,78,79,9,8,16,101,25,12,11,52,53,107,51,55,28,27,88,88,1,34,88,88,27,28,55,95,0,2,0,122,1,168,0,238, + 5,15,0,3,0,7,0,0,19,51,17,35,21,53,51,21,122,116,116,116,5,15,253,141,244,130,130,0,0,1,0,117,2,156,2,231,6,3,0,10, + 0,0,19,51,17,1,51,9,1,35,1,17,35,117,117,1,90,148,254,137,1,134,151,254,154,117,6,3,253,254,1,14,254,219,254,178,1,50,254,206, + 0,1,0,117,2,156,4,123,5,30,0,34,0,52,64,10,36,27,28,20,0,3,14,10,11,35,16,212,220,60,47,204,57,47,220,204,49,178,127,36, + 1,93,0,64,10,32,6,12,23,17,35,28,2,11,35,16,212,60,60,16,212,60,196,204,50,48,1,17,35,17,52,38,35,34,6,21,17,35,17,51, + 21,62,1,51,50,22,23,62,1,51,50,22,21,17,35,17,52,38,35,34,6,2,178,116,72,75,89,104,117,117,39,111,77,76,108,26,43,121,82,111, + 119,116,72,74,90,105,3,254,254,158,1,119,91,87,107,92,254,158,2,115,97,57,55,69,66,69,66,137,126,254,133,1,119,90,88,107,0,1,0,117, + 1,173,2,196,5,30,0,30,0,52,64,7,7,0,12,23,19,20,31,16,212,220,60,47,204,204,75,176,13,81,88,177,32,64,56,89,49,178,127,32, + 1,93,0,64,8,15,21,27,31,7,6,20,31,16,212,212,204,16,212,196,204,48,1,17,20,7,6,43,1,53,51,50,54,53,17,52,38,35,34,6, + 21,17,35,17,51,21,54,55,54,51,50,23,22,2,196,52,51,114,160,147,66,48,78,78,94,108,117,117,41,56,57,74,121,63,62,4,23,254,122,120, + 54,54,88,54,86,1,130,89,89,107,92,254,158,2,115,97,56,28,28,66,68,0,0,0,0,2,0,71,2,140,2,207,5,30,0,11,0,23,0,54, + 64,5,9,15,3,21,24,16,212,204,212,204,75,176,21,83,75,176,24,81,90,75,176,17,84,91,88,187,0,15,255,192,0,9,255,192,56,56,89,49, + 0,64,5,0,12,6,18,24,16,212,204,47,204,48,1,34,6,21,20,22,51,50,54,53,52,38,39,50,22,21,20,6,35,34,38,53,52,54,1,139, + 93,109,108,94,93,108,108,93,151,173,173,151,152,172,172,4,199,129,113,113,129,130,112,111,131,87,174,155,154,175,175,154,155,174,0,0,0,1,0,71, + 2,140,2,117,5,30,0,32,0,0,19,54,55,54,51,50,23,22,21,20,7,6,35,34,39,38,39,53,22,23,22,51,50,55,54,52,39,38,35,34, + 7,6,7,71,48,51,51,54,165,94,95,93,94,160,58,53,51,49,49,50,49,51,112,63,62,62,63,112,51,49,50,49,4,247,20,10,9,88,88,153, + 151,89,89,10,10,20,95,24,12,12,63,64,230,64,63,12,12,24,0,0,0,1,0,71,3,213,2,207,5,30,0,16,0,0,1,52,39,38,34,7, + 6,21,35,52,54,51,50,23,22,21,48,2,84,54,54,186,54,55,122,172,152,151,87,86,3,213,111,66,65,65,64,113,155,174,87,87,155,0,0,0, + 0,1,0,71,2,140,2,207,3,213,0,16,0,0,19,20,23,22,50,55,54,53,51,20,6,35,34,39,38,53,48,194,54,54,186,54,55,122,172,152, + 151,86,87,3,213,111,66,65,65,64,113,155,174,87,87,155,0,2,0,117,1,173,2,236,5,30,0,17,0,29,0,0,19,17,35,17,51,21,62,1, + 51,50,23,22,16,7,6,35,34,38,36,52,39,38,34,7,6,20,23,22,50,55,234,117,117,36,112,77,129,80,80,80,80,129,77,112,1,102,52,53, + 184,53,52,52,53,184,53,2,250,254,179,3,98,95,56,54,90,91,254,216,91,90,54,161,228,64,65,65,64,228,64,65,65,0,0,0,0,1,0,35, + 2,156,1,219,5,193,0,20,0,0,19,21,51,21,35,17,20,22,59,1,21,35,34,39,38,53,17,35,53,51,53,236,239,239,48,72,119,119,134,51, + 51,85,85,5,193,178,80,254,172,77,44,86,45,44,118,1,84,80,178,0,0,1,0,110,2,140,2,189,5,15,0,22,0,0,19,17,51,17,20,23, + 22,51,50,55,54,53,17,51,17,35,53,6,7,6,35,34,38,110,116,39,39,78,94,54,55,116,116,43,55,56,74,121,126,3,148,1,123,254,136,89, + 44,45,54,53,92,1,99,253,141,96,57,28,27,134,0,0,0,1,0,110,2,199,3,65,4,212,0,22,0,0,1,33,53,33,50,55,54,53,52,39, + 38,35,33,53,33,21,35,30,1,21,20,7,6,2,25,254,85,1,166,101,50,50,60,60,103,254,112,2,193,108,64,62,75,76,2,199,103,35,34,70, + 83,49,48,103,103,37,100,65,108,56,56,0,0,1,0,117,2,141,4,123,5,16,0,40,0,0,1,6,7,6,35,34,38,53,17,51,17,20,23,22, + 51,50,55,54,53,17,51,17,20,23,22,51,50,55,54,53,17,51,17,35,53,6,7,6,35,34,38,2,81,43,60,61,82,110,120,117,36,36,73,90, + 53,52,116,36,36,75,89,52,53,116,116,40,55,56,76,77,108,3,21,69,33,34,138,127,1,122,254,137,91,43,44,54,52,92,1,99,254,137,91,43, + 44,54,54,90,1,99,253,141,98,59,27,28,70,0,0,0,0,1,0,38,2,156,2,213,5,15,0,6,0,0,19,51,27,1,51,1,35,38,123,221, + 220,123,254,248,158,5,15,253,242,2,14,253,141,0,0,0,0,2,0,121,1,173,2,219,6,11,0,14,0,28,0,0,19,17,35,17,16,33,32,23, + 22,7,22,23,18,33,38,39,22,51,50,53,52,5,53,22,53,52,35,34,21,237,116,1,12,1,17,1,1,110,176,1,1,254,207,133,57,70,125,181, + 254,219,230,148,165,2,195,254,234,3,94,1,0,216,153,56,51,149,254,246,1,184,97,176,158,12,95,4,183,123,175,0,0,1,0,20,1,173,2,213, + 5,15,0,14,0,0,27,2,51,1,21,35,53,3,38,43,1,53,51,50,227,155,220,123,254,227,116,185,28,60,31,44,124,4,173,254,124,1,230,253, + 141,239,239,1,212,71,88,0,0,2,0,71,2,140,2,207,5,239,0,27,0,43,0,0,1,38,35,34,21,20,23,22,23,22,21,20,7,6,32,39, + 38,53,52,55,54,55,38,53,52,33,50,23,1,6,7,6,20,23,22,51,50,54,53,52,39,38,39,38,2,121,65,150,160,167,130,74,90,86,87,254, + 210,86,87,87,33,47,98,1,22,139,76,254,204,43,34,55,54,54,94,93,108,57,61,80,40,5,114,40,66,52,26,21,63,75,156,148,87,88,88,87, + 154,114,93,36,20,44,79,152,39,254,248,17,40,64,228,63,65,130,106,112,54,57,6,4,0,2,0,71,1,173,3,9,5,20,0,10,0,41,0,0, + 1,34,21,17,50,55,54,53,52,39,38,39,50,23,22,21,20,7,6,35,21,35,53,34,39,38,53,52,55,54,55,21,6,7,6,21,20,23,22,51, + 17,52,2,10,41,61,59,54,55,45,33,88,81,86,86,81,129,115,126,83,86,86,64,104,41,37,54,54,49,70,4,188,81,254,127,58,53,125,116,63, + 51,88,74,79,165,152,90,85,226,225,85,88,154,160,82,61,16,92,12,44,65,106,113,64,58,1,129,169,0,1,0,37,1,173,2,196,5,16,0,23, + 0,0,1,39,3,35,1,3,38,43,1,53,23,22,31,1,19,51,1,19,22,59,1,21,39,38,1,205,94,193,137,1,18,115,31,97,31,44,163,40, + 94,193,137,254,239,114,31,97,31,44,163,2,16,215,254,198,1,188,1,7,71,88,1,4,93,215,1,58,254,68,254,248,70,89,2,4,255,255,0,122, + 0,0,0,238,3,103,18,7,11,74,0,0,253,100,0,0,255,255,0,117,0,0,2,18,2,130,18,7,2,117,0,0,253,100,0,0,255,255,0,110, + 255,240,2,189,2,115,18,7,8,183,0,0,253,100,0,0,255,255,0,38,0,0,2,213,2,115,18,7,8,186,0,0,253,100,0,0,255,255,0,121, + 255,17,2,219,3,111,18,7,8,187,0,0,253,100,0,0,255,255,0,20,255,17,2,213,2,115,18,7,8,188,0,0,253,100,0,0,0,2,0,121, + 255,17,2,239,2,130,0,16,0,28,0,0,19,54,55,54,51,50,22,16,6,35,34,38,39,17,35,17,52,5,52,38,35,34,6,21,20,22,51,50, + 54,178,38,95,37,115,128,160,160,128,78,111,37,116,1,254,105,92,91,106,106,91,92,105,2,3,57,50,20,181,254,216,182,55,56,254,179,2,34,129, + 123,113,130,130,113,114,129,129,255,255,0,71,255,17,3,9,2,120,18,7,8,190,0,0,253,100,0,0,255,255,0,37,255,17,2,196,2,116,18,7, + 8,191,0,0,253,100,0,0,0,2,0,186,254,86,4,163,4,123,0,28,0,40,0,0,19,16,18,33,50,22,23,21,46,1,35,34,6,29,1,62, + 1,51,50,18,17,16,2,35,34,38,39,21,35,19,20,22,51,50,54,53,52,38,35,34,6,186,254,1,6,97,172,81,81,158,82,181,180,57,178,124, + 206,252,252,206,124,178,57,184,184,165,149,148,165,165,148,149,165,2,70,1,30,1,23,29,30,179,44,42,189,191,91,99,98,254,198,254,253,254,252,254, + 198,98,99,170,2,35,200,220,220,200,199,220,220,0,0,0,255,255,0,127,2,156,3,76,5,224,16,6,8,147,0,0,0,1,0,116,0,0,2,132, + 4,96,0,19,0,0,19,53,33,21,35,17,51,21,35,17,51,21,33,53,51,17,35,53,51,17,116,2,16,168,168,168,168,253,240,176,176,176,3,188, + 164,164,254,172,164,254,224,164,164,1,32,164,1,84,0,0,0,3,0,50,254,86,5,36,4,123,0,25,0,34,0,43,0,0,37,17,35,17,35,53, + 51,17,51,21,62,1,51,50,23,22,23,51,21,35,6,7,6,35,34,38,1,33,22,23,22,51,50,55,54,1,33,38,39,38,35,34,7,6,1,115, + 185,136,136,185,58,177,123,203,128,102,21,133,129,11,116,128,203,123,177,2,55,253,144,8,74,84,146,146,84,74,253,157,2,102,15,62,84,146,146,84, + 62,168,253,174,3,174,144,1,204,170,100,97,162,130,195,144,234,149,162,97,1,192,174,102,116,116,102,1,62,132,86,116,116,86,0,0,0,1,0,145, + 254,86,2,47,6,20,0,16,0,0,37,21,20,6,43,1,53,51,50,55,54,39,55,35,17,51,17,2,47,164,180,70,48,106,38,42,4,2,184,184, + 154,174,214,192,156,48,54,148,20,6,20,250,134,0,0,0,0,2,0,71,2,140,2,190,5,30,0,19,0,31,0,0,19,21,35,17,51,21,54,55, + 54,51,50,23,22,16,7,6,35,34,39,38,36,52,39,38,34,7,6,20,23,22,50,55,187,116,116,37,56,55,78,128,80,81,81,80,128,78,55,56, + 1,102,53,52,184,53,53,53,53,184,52,2,250,95,2,115,94,56,27,27,90,91,254,216,91,90,27,27,161,228,65,64,64,65,228,65,64,64,0,0, + 0,1,0,71,2,140,2,117,5,30,0,29,0,0,1,21,38,39,38,35,34,7,6,20,23,22,51,50,55,54,55,21,14,1,35,34,38,53,52,54, + 51,50,23,22,2,117,49,49,50,50,113,62,63,63,62,113,50,50,49,49,48,104,59,159,188,190,165,53,51,51,4,247,96,24,12,12,64,63,230,63, + 64,12,12,24,95,20,20,178,151,153,176,9,10,0,0,0,0,2,0,71,2,75,2,117,5,30,0,7,0,43,0,0,1,22,51,50,53,38,35,34, + 7,6,21,7,52,55,38,39,38,53,52,54,51,50,23,22,23,21,38,39,38,35,34,7,6,20,23,22,23,54,51,50,23,22,35,34,1,90,37,48, + 92,1,82,64,53,4,96,8,36,30,94,190,165,52,52,49,50,47,52,49,50,113,62,63,63,2,6,53,123,188,1,1,210,51,2,238,11,32,42,154, + 32,38,2,59,47,19,29,90,150,153,176,9,10,20,96,23,13,12,63,64,230,64,2,5,98,138,105,0,0,2,0,71,2,140,2,207,6,3,0,17, + 0,46,0,0,1,38,39,38,35,34,7,6,21,20,22,51,50,54,53,52,39,38,55,22,23,22,21,20,7,6,35,34,38,53,52,54,51,50,23,22, + 23,39,7,39,55,39,51,23,55,23,7,2,16,32,27,28,26,105,58,59,110,92,91,110,17,17,6,79,36,36,90,89,145,146,178,174,139,12,16,16, + 27,100,201,21,177,114,144,80,209,21,186,4,156,10,4,5,61,60,109,106,124,124,106,68,53,52,165,80,81,80,97,143,87,87,174,143,140,174,2,1, + 3,101,60,56,51,114,81,62,54,55,0,0,0,1,0,84,2,140,2,98,5,31,0,49,0,0,1,22,23,22,21,20,7,6,35,34,39,38,39,53, + 22,23,22,51,50,55,54,53,52,39,38,43,1,53,51,50,54,53,52,39,38,35,34,7,6,7,53,62,1,51,50,23,22,21,20,6,1,189,78,43, + 44,81,82,150,50,54,53,56,45,53,54,58,95,54,53,49,46,86,93,97,73,86,45,43,75,45,51,50,61,61,108,47,124,71,72,76,3,238,13,41, + 41,60,97,51,51,8,7,16,96,21,10,11,32,31,51,49,31,29,85,50,39,36,26,25,7,7,17,94,13,14,44,44,79,52,72,0,0,1,0,30, + 2,156,1,223,6,3,0,21,0,0,1,21,35,34,7,6,29,1,51,21,35,17,35,17,35,53,51,53,52,55,54,51,1,223,111,62,25,24,191,191, + 117,110,110,55,55,119,6,3,85,23,22,58,56,80,253,221,2,35,80,44,105,47,48,0,0,1,255,233,1,173,1,92,5,15,0,21,0,0,19,21, + 20,7,6,43,1,53,51,50,55,54,61,1,35,53,51,17,51,17,51,21,238,52,51,114,44,31,66,24,24,114,114,116,110,2,156,11,120,54,54,88, + 27,28,85,11,80,2,35,253,221,80,0,0,0,2,0,71,1,173,2,190,5,15,0,12,0,44,0,0,1,53,35,34,7,6,20,23,22,51,50,55, + 54,19,17,20,7,6,35,34,39,38,39,53,22,23,22,51,50,55,54,61,1,6,7,6,35,34,39,38,53,52,55,54,51,2,74,198,93,52,52,52, + 52,93,94,52,52,116,80,80,165,61,55,54,51,51,50,50,51,114,57,57,36,56,56,78,130,79,80,80,79,130,3,221,235,62,61,224,61,62,62,61, + 1,162,253,219,160,78,79,8,9,16,101,25,12,11,52,53,107,51,55,28,27,88,88,145,130,88,88,0,0,1,0,110,1,173,2,189,5,15,0,22, + 0,0,19,17,51,17,20,23,22,51,50,55,54,53,17,51,17,35,17,6,7,6,35,34,38,110,116,39,39,78,94,54,55,116,116,43,56,55,74,121, + 126,3,148,1,123,254,136,89,44,45,54,53,92,1,99,252,158,1,79,57,28,27,134,0,0,2,0,73,2,156,1,150,6,3,0,11,0,15,0,0, + 19,53,51,17,51,17,51,21,35,21,35,53,17,51,21,35,73,114,116,103,103,116,116,116,3,153,92,1,26,254,230,92,253,253,2,106,130,0,0,0, + 0,1,0,122,2,156,1,126,5,15,0,12,0,0,19,17,20,23,22,59,1,21,35,34,38,53,17,238,23,24,67,30,44,114,102,5,15,254,112,85, + 28,27,87,108,119,1,144,0,0,1,0,73,2,156,1,150,5,15,0,11,0,0,19,53,33,21,35,17,51,21,33,53,51,17,73,1,77,106,106,254, + 179,111,4,179,92,92,254,69,92,92,1,187,0,1,0,73,2,156,1,150,5,15,0,19,0,0,19,53,33,21,35,21,51,21,35,21,51,21,33,53, + 51,53,35,53,51,53,73,1,77,106,106,106,106,254,179,111,111,111,4,179,92,92,190,92,161,92,92,161,92,190,0,0,0,3,255,86,1,173,1,96, + 6,3,0,3,0,18,0,27,0,0,19,51,21,35,3,34,53,52,59,1,17,51,17,51,21,35,6,7,6,39,35,34,23,22,51,50,55,54,122,116, + 116,101,191,170,122,116,114,121,11,34,51,20,114,75,2,2,78,66,24,11,6,3,130,252,44,124,115,2,115,253,141,87,63,35,53,152,29,36,27,13, + 0,1,0,122,1,173,1,126,6,3,0,14,0,0,19,17,51,17,21,20,23,22,59,1,21,35,34,38,53,122,116,23,24,67,30,44,114,102,2,228, + 3,31,252,225,83,86,27,27,88,108,120,0,0,1,0,91,1,173,1,96,6,3,0,17,0,0,1,21,20,7,6,43,1,53,51,50,55,54,39,55, + 35,17,51,17,1,96,51,52,114,44,31,66,24,27,3,2,116,116,2,242,97,120,54,54,88,27,30,83,11,3,103,252,239,0,0,0,0,1,0,113, + 2,156,2,131,5,30,0,5,0,0,19,51,17,33,21,33,113,127,1,147,253,238,5,30,253,221,95,0,0,1,0,117,1,173,4,123,5,30,0,52, + 0,0,1,54,55,54,51,50,23,22,21,17,20,6,43,1,53,51,50,54,53,38,55,52,53,52,38,35,34,7,6,21,17,35,17,52,39,38,35,34, + 7,6,21,17,35,17,51,21,54,55,54,51,50,23,22,2,159,43,61,60,82,111,59,60,102,114,161,147,66,48,1,1,72,74,90,52,53,116,36,36, + 75,89,52,52,117,117,39,56,55,77,76,54,54,4,151,69,33,33,69,68,126,254,122,120,108,88,54,86,48,232,61,45,90,88,53,54,92,254,158,1, + 119,91,44,43,53,54,92,254,158,2,115,97,57,28,27,34,35,0,0,0,0,1,0,117,1,173,4,123,5,16,0,40,0,0,1,6,7,6,35,34, + 38,53,17,51,17,20,23,22,51,50,55,54,53,17,51,17,20,23,22,51,50,55,54,53,17,51,17,35,17,6,7,6,35,34,38,2,81,43,60,61, + 82,110,120,117,36,36,73,90,53,52,116,36,36,75,89,52,53,116,116,40,55,56,76,77,108,3,21,69,34,33,138,126,1,123,254,137,91,43,44,53, + 53,92,1,99,254,137,91,43,44,54,53,91,1,99,252,157,1,81,58,27,28,70,0,0,0,1,255,233,1,173,2,201,5,30,0,31,0,0,19,20, + 7,6,43,1,53,51,50,54,53,17,51,21,62,1,51,50,23,22,21,17,35,17,52,39,38,35,34,7,6,21,238,52,51,114,44,31,66,48,116,42, + 112,74,122,62,63,116,39,40,78,94,54,54,2,145,120,54,54,88,54,86,2,126,97,56,56,66,68,129,254,133,1,119,89,44,45,53,54,92,0,0, + 0,1,0,117,1,173,3,85,5,30,0,32,0,0,1,52,39,38,35,34,7,6,21,17,35,17,51,21,54,55,54,51,50,23,22,21,17,20,22,59, + 1,21,35,34,39,38,53,2,80,39,39,78,94,54,54,117,117,41,56,57,74,121,63,62,48,66,31,44,114,51,52,4,19,89,44,45,53,54,92,254, + 158,2,115,97,56,28,28,66,68,129,254,122,86,54,88,54,54,120,0,0,0,1,0,113,2,156,2,196,5,30,0,9,0,0,19,51,1,17,51,17, + 35,1,17,35,113,171,1,45,123,171,254,211,123,5,30,254,7,1,249,253,126,1,250,254,6,0,0,0,0,3,0,71,2,140,2,207,5,30,0,15, + 0,23,0,32,0,0,1,50,23,22,21,20,7,6,35,34,39,38,53,52,55,54,22,34,7,6,7,33,38,39,23,33,22,23,22,51,50,55,54,1, + 139,151,87,86,86,87,151,152,85,87,87,85,245,186,54,47,7,1,145,6,47,49,254,119,11,38,54,94,93,54,38,5,30,87,87,155,154,87,88,88, + 87,154,155,87,87,87,64,57,92,91,56,239,69,45,65,65,46,0,0,0,0,3,0,71,1,174,2,207,6,3,0,29,0,38,0,46,0,0,1,35, + 53,33,21,35,21,22,23,22,21,20,7,6,7,21,51,21,33,53,51,53,38,39,38,53,52,55,54,55,23,17,54,55,54,53,52,39,38,3,17,6, + 7,6,20,23,22,1,79,151,1,162,151,112,70,86,86,70,112,151,254,94,151,110,67,87,87,67,110,116,54,37,54,54,37,170,52,35,55,54,36,5, + 167,92,92,140,14,70,87,155,154,87,71,14,133,92,92,134,14,70,87,154,155,87,69,15,91,254,42,14,44,65,112,111,65,45,254,57,1,212,14,42, + 65,226,64,43,0,1,0,70,1,173,2,97,5,30,0,58,0,0,1,21,46,1,35,34,7,6,21,20,23,22,31,1,22,23,22,21,20,7,6,35, + 34,47,1,21,20,22,59,1,21,35,34,39,38,61,2,22,23,22,51,50,54,53,52,39,38,47,1,46,1,53,52,55,54,51,50,22,2,59,49,106, + 56,87,42,44,31,31,93,40,123,52,52,77,78,136,57,62,13,48,66,147,160,114,51,52,64,63,62,61,82,88,31,32,108,41,107,96,71,70,130,64, + 114,4,253,98,23,22,23,24,47,36,21,20,18,8,24,43,42,77,87,51,51,9,3,7,86,54,88,54,54,120,34,106,29,15,15,50,45,42,23,22, + 21,8,20,84,73,88,48,48,16,0,0,0,0,1,255,233,1,173,1,202,6,3,0,23,0,0,19,2,3,52,55,54,59,1,21,35,34,7,6,21, + 19,20,7,6,43,1,53,51,50,54,122,1,1,55,51,122,110,111,62,24,25,2,52,51,114,44,31,66,48,2,145,1,93,1,77,101,51,48,85,23, + 22,58,253,74,120,54,54,88,54,0,0,0,0,1,0,35,1,173,1,219,5,193,0,31,0,0,19,21,51,21,35,17,20,22,59,1,21,20,7,6, + 43,1,53,51,50,54,61,1,35,34,39,38,53,17,35,53,51,53,236,239,239,48,72,119,52,51,114,44,31,66,48,3,134,51,51,85,85,5,193,178, + 80,254,172,77,44,97,120,54,54,88,54,86,11,45,44,118,1,84,80,178,0,2,0,94,2,140,3,144,5,15,0,23,0,33,0,0,19,53,51,17, + 51,17,33,17,51,17,51,21,35,21,35,53,6,7,6,35,34,38,61,1,41,1,21,20,23,22,51,50,55,54,94,110,116,1,103,116,117,117,116,43, + 56,55,74,121,126,1,218,254,154,39,39,78,94,54,49,3,153,92,1,26,254,230,1,26,254,230,92,253,96,57,28,27,134,130,5,2,89,44,45,54, + 47,0,0,0,0,1,0,71,2,139,2,216,5,15,0,38,0,0,19,53,33,21,6,7,6,21,20,23,22,51,50,55,54,53,52,39,38,39,53,33, + 21,35,22,23,22,21,20,7,6,32,39,38,53,52,55,54,55,71,1,23,69,40,41,55,56,90,91,55,56,42,44,63,1,18,148,71,36,34,90,89, + 254,228,89,90,33,34,74,4,179,92,123,39,58,63,75,89,55,54,54,55,89,82,56,62,35,123,92,56,63,62,76,131,82,82,81,82,128,82,60,61, + 58,0,0,0,0,1,0,117,2,138,2,146,5,15,0,19,0,0,1,50,54,53,17,51,17,20,7,6,35,34,39,38,53,17,51,17,20,22,1,132, + 81,72,117,68,69,133,134,69,68,117,72,2,226,80,90,1,131,254,115,123,62,63,63,62,123,1,141,254,125,90,80,0,0,1,0,122,2,156,2,191, + 5,15,0,30,0,0,1,51,22,23,22,21,20,7,6,43,1,34,38,53,17,51,17,20,23,22,63,1,50,55,54,53,52,39,38,39,38,1,103,203, + 72,35,34,89,90,142,44,114,102,116,23,26,65,32,90,56,55,41,50,58,48,4,196,56,63,62,76,131,82,82,108,119,1,144,254,112,85,28,28,1, + 1,54,55,89,81,56,67,31,24,0,0,0,0,1,0,38,2,156,2,213,5,15,0,6,0,0,1,35,11,1,35,1,51,2,213,123,220,221,123,1, + 9,158,2,156,2,14,253,242,2,115,0,0,0,1,0,55,2,156,2,110,5,15,0,9,0,0,19,33,21,1,33,21,33,53,1,33,71,2,39,254, + 76,1,180,253,201,1,180,254,92,5,15,94,254,61,82,94,1,195,0,0,0,1,0,55,1,173,2,253,5,15,0,22,0,0,19,33,21,1,33,21, + 35,21,20,23,22,59,1,21,35,34,38,61,1,33,53,1,33,71,2,39,254,76,1,180,1,23,24,67,30,44,114,102,254,62,1,180,254,92,5,15, + 94,254,61,82,11,86,27,27,88,108,120,11,94,1,195,0,0,2,0,55,2,94,2,110,5,15,0,20,0,27,0,0,1,6,21,35,52,55,35,53, + 1,33,53,33,21,1,51,54,51,50,23,20,35,39,51,50,53,52,35,6,1,124,2,96,2,229,1,180,254,92,2,39,254,76,110,38,138,143,1,210, + 13,13,109,44,55,2,156,29,33,33,29,94,1,195,82,94,254,61,162,138,106,82,31,51,1,0,0,0,0,1,0,55,1,168,2,163,5,15,0,33, + 0,0,1,50,23,22,23,22,21,20,7,6,35,34,39,38,39,53,30,1,51,50,55,54,53,52,39,38,43,1,53,1,33,53,33,21,1,104,67,81, + 62,54,51,96,96,176,59,63,63,67,53,126,69,120,62,63,58,58,104,110,1,15,254,92,2,38,3,167,32,23,61,59,77,124,67,68,10,11,20,109, + 27,28,42,42,80,74,42,41,93,1,24,82,94,0,0,0,0,3,0,71,2,143,2,207,6,12,0,8,0,16,0,29,0,0,1,33,22,23,22,51, + 50,55,54,55,38,39,38,34,7,6,7,19,50,23,22,16,7,6,35,34,38,16,55,54,2,83,254,111,6,47,54,94,93,54,47,5,9,43,54,186, + 54,44,8,199,151,87,86,86,87,151,152,172,86,86,4,42,128,77,87,88,77,222,109,71,89,88,70,111,1,131,118,119,254,94,119,119,238,1,162,119, + 118,0,0,0,0,1,252,91,4,238,255,165,6,102,0,5,0,0,1,33,53,33,55,51,254,176,253,171,2,23,168,139,4,238,148,228,0,1,252,91, + 4,238,255,165,6,102,0,5,0,0,1,3,51,23,33,21,253,80,245,139,168,2,23,4,238,1,120,228,148,0,0,0,0,1,252,91,4,238,255,165, + 6,102,0,5,0,0,1,19,35,39,33,53,254,176,245,139,168,253,233,6,102,254,136,228,148,0,0,0,0,1,252,91,4,238,255,165,6,102,0,5, + 0,0,1,33,21,33,7,35,253,80,2,85,253,233,168,139,6,102,148,228,0,1,252,66,4,238,255,190,6,102,0,9,0,0,1,51,19,35,39,7, + 35,3,51,23,254,53,148,245,139,180,180,148,245,139,180,6,102,254,136,245,245,1,120,245,0,1,252,66,4,238,255,190,6,102,0,9,0,0,1,23, + 55,51,3,35,39,7,35,19,253,203,180,180,139,245,148,180,180,139,245,6,102,245,245,254,136,245,245,1,120,0,0,0,255,255,0,16,254,19,5,104, + 5,213,16,39,2,214,4,188,0,1,18,6,0,36,0,0,255,255,0,123,254,19,4,45,4,123,16,39,2,214,4,84,0,1,18,6,0,68,0,0, + 255,255,0,201,0,0,4,236,7,80,16,39,22,193,4,188,1,117,18,6,0,37,0,0,255,255,0,184,255,227,4,164,7,82,16,39,2,184,3,22, + 1,62,18,6,0,69,0,0,255,255,0,201,254,137,4,236,5,213,18,38,0,37,0,0,16,7,2,212,4,165,0,0,255,255,0,186,254,137,4,164, + 6,20,18,38,0,69,0,0,16,7,2,212,4,154,0,0,255,255,0,201,254,192,4,236,5,213,18,38,0,37,0,0,16,7,2,143,0,151,0,0, + 255,255,0,186,254,192,4,164,6,20,18,38,0,69,0,0,16,7,2,143,0,143,0,0,255,255,0,115,254,117,5,39,7,108,16,39,22,186,5,76, + 1,118,18,6,0,137,0,0,255,255,0,113,254,117,3,231,6,102,18,38,0,169,0,0,16,6,0,118,67,0,0,0,255,255,0,201,0,0,5,176, + 7,80,16,39,22,193,4,236,1,117,18,6,0,39,0,0,255,255,0,113,255,227,4,90,7,137,16,39,2,184,5,254,1,117,18,6,0,71,0,0, + 255,255,0,201,254,138,5,176,5,213,16,39,2,212,4,236,0,1,18,6,0,39,0,0,255,255,0,113,254,138,4,90,6,20,16,39,2,212,4,102, + 0,1,18,6,0,71,0,0,255,255,0,201,254,193,5,176,5,213,16,39,2,226,4,236,0,1,18,6,0,39,0,0,255,255,0,113,254,193,4,90, + 6,20,16,39,2,226,4,102,0,1,18,6,0,71,0,0,255,255,0,201,254,119,5,176,5,213,18,38,0,39,0,0,16,6,0,122,91,2,0,0, + 255,255,0,113,254,117,4,90,6,20,18,38,0,71,0,0,16,6,0,122,246,0,0,0,255,255,0,201,254,21,5,176,5,213,16,39,2,222,4,236, + 0,1,18,6,0,39,0,0,255,255,0,113,254,21,4,90,6,20,16,39,2,222,4,102,0,1,18,6,0,71,0,0,255,255,0,201,0,0,4,139, + 8,90,18,38,0,40,0,0,16,6,22,242,238,0,0,0,255,255,0,113,255,227,4,127,7,94,16,39,22,242,255,217,255,4,18,6,0,72,0,0, + 255,255,0,201,0,0,4,139,8,90,18,38,0,40,0,0,16,6,22,241,236,0,0,0,255,255,0,113,255,227,4,127,7,94,18,38,0,72,0,0, + 16,7,22,241,255,215,255,4,255,255,0,201,254,75,4,139,5,213,18,38,0,40,0,0,16,7,2,222,4,177,0,55,255,255,0,113,254,75,4,127, + 4,123,18,38,0,72,0,0,16,7,2,222,4,176,0,55,255,255,0,201,254,118,4,139,5,213,18,38,0,40,0,0,16,7,2,176,0,179,0,0, + 255,255,0,113,254,118,4,127,4,123,18,38,0,72,0,0,16,7,2,176,0,155,0,0,255,255,0,201,254,117,4,139,7,109,16,39,22,192,4,161, + 1,117,18,38,0,40,0,0,16,7,0,122,0,190,0,0,255,255,0,113,254,117,4,127,6,72,18,38,0,72,0,0,16,39,2,154,0,135,0,0, + 16,6,0,122,75,0,0,0,255,255,0,201,0,0,4,35,7,79,16,39,22,193,4,118,1,116,18,6,0,41,0,0,255,255,0,47,0,0,2,248, + 7,137,16,39,2,184,3,224,1,117,18,6,0,73,0,0,255,255,0,115,255,227,5,139,7,24,18,38,0,42,0,0,16,7,2,139,1,50,1,34, + 255,255,0,113,254,86,4,90,5,246,18,38,0,74,0,0,16,6,2,139,73,0,0,0,255,255,0,201,0,0,5,59,7,78,16,39,22,193,5,20, + 1,115,18,6,0,43,0,0,255,255,0,184,0,0,4,100,7,82,16,39,2,184,3,22,1,62,18,6,0,75,0,0,255,255,0,201,254,137,5,59, + 5,213,16,39,2,212,5,2,0,0,18,6,0,43,0,0,255,255,0,186,254,137,4,100,6,20,16,39,2,212,4,143,0,0,18,6,0,75,0,0, + 255,255,0,201,0,0,5,59,7,80,18,38,0,43,0,0,16,7,0,106,1,8,1,64,255,255,255,237,0,0,4,100,7,78,16,39,2,185,3,22, + 1,62,18,6,0,75,0,0,255,255,0,17,254,116,5,59,5,213,18,38,0,43,0,0,16,7,0,122,254,238,255,255,255,255,0,2,254,116,4,100, + 6,20,18,38,0,75,0,0,16,7,0,122,254,223,255,255,255,255,0,201,254,57,5,59,5,213,18,38,0,43,0,0,16,7,2,223,5,10,0,0, + 255,255,0,186,254,57,4,100,6,20,18,38,0,75,0,0,16,7,2,223,4,149,0,0,255,255,0,0,254,118,2,148,5,213,18,38,0,44,0,0, + 16,7,2,176,255,74,0,0,255,255,255,211,254,118,2,103,6,20,16,39,2,176,255,29,0,0,18,6,0,76,0,0,255,255,0,7,0,0,2,89, + 8,90,18,38,0,44,0,0,16,7,22,239,254,116,0,0,255,255,255,244,0,0,2,70,7,22,18,38,0,243,0,0,16,7,22,239,254,97,254,188, + 255,255,0,201,0,0,5,106,7,108,16,39,22,186,4,226,1,118,18,6,0,46,0,0,255,255,0,186,0,0,4,156,7,108,16,39,22,186,3,90, + 1,118,18,6,0,78,0,0,255,255,0,201,254,137,5,106,5,213,18,38,0,46,0,0,16,7,2,212,4,220,0,0,255,255,0,186,254,137,4,156, + 6,20,18,38,0,78,0,0,16,7,2,212,4,145,0,0,255,255,0,201,254,192,5,106,5,213,18,38,0,46,0,0,16,7,2,143,1,13,0,0, + 255,255,0,186,254,192,4,156,6,20,18,38,0,78,0,0,16,6,2,143,118,0,0,0,255,255,0,201,254,137,4,106,5,213,16,39,2,212,4,154, + 0,0,16,6,0,47,0,0,255,255,0,201,254,137,1,132,6,20,16,39,2,212,3,39,0,0,16,6,0,79,11,0,255,255,0,3,254,138,4,106, + 7,107,16,39,2,181,3,42,1,117,16,39,2,212,4,153,0,1,18,6,0,47,0,0,255,255,255,253,254,137,2,83,7,49,16,39,0,113,255,40, + 1,59,16,6,9,48,0,0,255,255,0,201,254,192,4,106,5,213,18,38,0,47,0,0,16,7,2,143,0,142,0,0,255,255,255,244,254,192,2,74, + 6,20,16,39,2,143,255,31,0,0,18,6,0,79,0,0,255,255,0,201,254,20,4,106,5,213,16,39,2,136,0,151,249,38,18,6,0,47,0,0, + 255,255,255,222,254,20,2,92,6,20,16,39,2,136,255,29,249,38,18,6,0,79,0,0,255,255,0,201,0,0,6,31,7,108,16,39,22,186,5,115, + 1,118,18,6,0,48,0,0,255,255,0,186,0,0,7,29,6,102,18,38,0,80,0,0,16,7,0,118,1,148,0,0,255,255,0,201,0,0,6,31, + 7,79,16,39,22,193,5,119,1,116,18,6,0,48,0,0,255,255,0,186,0,0,7,29,6,20,16,39,2,184,5,233,0,0,18,6,0,80,0,0, + 255,255,0,201,254,137,6,31,5,213,16,39,2,212,5,116,0,0,16,6,0,48,0,0,255,255,0,186,254,137,7,29,4,123,16,39,2,212,5,230, + 0,0,16,6,0,80,0,0,255,255,0,201,0,0,5,51,7,80,16,39,22,193,4,245,1,117,18,6,0,49,0,0,255,255,0,186,0,0,4,100, + 6,20,16,39,2,184,4,137,0,0,18,6,0,81,0,0,255,255,0,201,254,137,5,51,5,213,16,39,2,212,4,254,0,0,16,6,0,49,0,0, + 255,255,0,186,254,137,4,100,4,123,16,39,2,212,4,143,0,0,16,6,0,81,0,0,255,255,0,201,254,192,5,51,5,213,18,38,0,49,0,0, + 16,7,2,143,0,247,0,0,255,255,0,186,254,192,4,100,4,123,18,38,0,81,0,0,16,7,2,143,0,140,0,0,255,255,0,201,254,20,5,51, + 5,213,16,39,2,136,0,254,249,38,18,6,0,49,0,0,255,255,0,186,254,20,4,100,4,123,16,39,2,136,0,149,249,38,18,6,0,81,0,0, + 255,255,0,115,255,227,5,217,8,90,18,38,0,50,0,0,16,6,22,247,102,0,0,0,255,255,0,113,255,227,4,117,7,12,18,38,0,82,0,0, + 16,7,22,247,255,178,254,178,255,255,0,115,255,227,5,217,8,86,18,38,0,50,0,0,16,6,22,245,108,0,0,0,255,255,0,113,255,227,4,117, + 7,15,18,38,0,82,0,0,16,39,0,106,0,111,0,255,16,7,22,187,4,114,0,18,255,255,0,115,255,227,5,217,8,90,18,38,0,50,0,0, + 16,6,22,242,106,0,0,0,255,255,0,113,255,227,4,117,7,94,16,38,0,82,0,0,16,7,22,242,255,181,255,4,255,255,0,115,255,227,5,217, + 8,90,18,38,0,50,0,0,16,6,22,241,104,0,0,0,255,255,0,113,255,227,4,117,7,94,16,39,22,241,255,185,255,4,16,6,0,82,0,0, + 255,255,0,201,0,0,4,141,7,108,16,39,22,186,4,158,1,118,18,6,0,51,0,0,255,255,0,186,254,86,4,164,6,102,18,38,0,83,0,0, + 16,6,0,118,50,0,0,0,255,255,0,201,0,0,4,141,7,79,16,39,22,193,4,132,1,116,18,6,0,51,0,0,255,255,0,186,254,86,4,164, + 6,20,16,39,2,184,4,166,0,0,18,6,0,83,0,0,255,255,0,201,0,0,5,84,7,78,16,39,22,193,4,131,1,115,18,6,0,53,0,0, + 255,255,0,186,0,0,3,74,6,20,16,39,2,184,4,23,0,0,18,6,0,85,0,0,255,255,0,201,254,137,5,84,5,213,16,39,2,212,4,125, + 0,0,16,6,0,53,0,0,255,255,0,186,254,137,3,74,4,123,16,39,2,212,3,32,0,0,16,6,0,85,0,0,255,255,0,201,254,137,5,84, + 7,49,16,39,0,113,0,125,1,59,16,6,9,83,0,0,255,255,0,186,254,137,3,74,5,245,16,38,0,113,24,255,16,6,9,84,0,0,0,0, + 255,255,0,201,254,192,5,84,5,213,18,38,0,53,0,0,16,7,2,143,0,229,0,0,255,255,0,84,254,192,3,74,4,123,18,38,0,85,0,0, + 16,7,2,143,255,127,0,0,255,255,0,135,255,227,4,162,7,79,16,39,22,193,4,184,1,116,18,6,0,54,0,0,255,255,0,111,255,227,3,199, + 6,20,16,39,2,184,4,39,0,0,18,6,0,86,0,0,255,255,0,135,254,137,4,162,5,240,16,39,2,212,4,138,0,0,16,6,0,54,0,0, + 255,255,0,111,254,138,3,199,4,123,16,39,2,212,4,37,0,1,18,6,0,86,0,0,255,255,0,135,255,227,4,162,7,109,16,39,22,186,4,226, + 1,118,16,39,22,193,3,164,1,146,18,6,0,54,0,0,255,255,0,111,255,227,3,226,6,102,18,38,0,86,0,0,16,38,2,155,140,86,16,7, + 0,118,0,144,0,0,0,0,255,255,0,135,255,227,4,162,8,87,16,38,22,246,228,0,18,6,0,54,0,0,0,0,255,255,0,111,255,227,3,199, + 7,201,16,39,2,184,4,45,1,181,18,6,1,35,0,0,255,255,0,135,254,137,4,162,7,79,16,39,22,193,4,155,1,116,18,6,9,91,0,0, + 255,255,0,111,254,138,3,199,5,222,16,39,2,184,4,39,255,202,18,6,9,92,0,0,255,255,255,250,0,0,4,233,7,79,16,39,22,193,4,114, + 1,116,18,6,0,55,0,0,255,255,0,55,0,0,2,242,7,137,16,39,2,184,3,26,1,117,18,6,0,87,0,0,255,255,255,250,254,137,4,233, + 5,213,16,39,2,212,4,113,0,0,16,6,0,55,0,0,255,255,0,55,254,137,2,242,5,158,16,39,2,212,3,232,0,0,16,6,0,87,0,0, + 255,255,255,250,254,192,4,233,5,213,18,38,0,55,0,0,16,6,2,143,98,0,0,0,255,255,0,55,254,192,3,31,5,158,16,38,2,143,244,0, + 18,6,0,87,0,0,0,0,255,255,255,250,254,20,4,233,5,213,16,39,2,136,0,114,249,38,18,6,0,55,0,0,255,255,0,55,254,20,3,39, + 5,158,16,39,2,136,255,232,249,38,18,6,0,87,0,0,255,255,0,178,254,137,5,41,5,213,16,39,2,213,4,240,0,0,18,6,0,56,0,0, + 255,255,0,174,254,137,4,88,4,123,16,39,2,213,4,123,0,0,18,6,0,88,0,0,255,255,0,178,254,118,5,41,5,213,18,38,0,56,0,0, + 16,7,2,176,0,242,0,0,255,255,0,174,254,118,4,88,4,123,18,38,0,88,0,0,16,7,2,176,0,143,0,0,255,255,0,178,254,75,5,41, + 5,213,18,38,0,56,0,0,16,7,2,222,4,224,0,55,255,255,0,174,254,75,4,88,4,123,18,38,0,88,0,0,16,7,2,222,4,117,0,55, + 255,255,0,178,255,227,5,41,8,90,16,38,22,247,46,0,18,6,0,56,0,0,0,0,255,255,0,174,255,227,4,88,7,236,16,38,1,43,0,0, + 16,7,0,118,0,150,1,134,255,255,0,178,255,227,5,41,8,52,16,38,22,237,50,0,18,6,0,56,0,0,0,0,255,255,0,174,255,227,4,88, + 6,244,16,39,22,237,255,200,254,192,18,6,0,88,0,0,255,255,0,16,0,0,5,104,7,125,18,38,0,57,0,0,16,7,2,158,0,237,1,70, + 255,255,0,61,0,0,4,127,6,55,18,38,0,89,0,0,16,6,2,158,109,0,0,0,255,255,0,16,254,137,5,104,5,213,16,38,0,57,0,0, + 16,7,2,212,4,188,0,0,255,255,0,61,254,137,4,127,4,96,16,38,0,89,0,0,16,7,2,212,4,94,0,0,255,255,0,68,0,0,7,166, + 7,114,16,39,22,188,5,245,1,124,18,6,0,58,0,0,255,255,0,86,0,0,6,53,6,107,16,39,0,67,1,9,0,5,18,6,0,90,0,0, + 255,255,0,68,0,0,7,166,7,114,16,39,22,186,5,245,1,124,18,6,0,58,0,0,255,255,0,86,0,0,6,53,6,109,16,39,0,118,1,134, + 0,7,18,6,0,90,0,0,255,255,0,68,0,0,7,166,7,78,16,39,0,106,1,245,1,62,18,6,0,58,0,0,255,255,0,86,0,0,6,53, + 6,16,16,39,0,106,1,69,0,0,18,6,0,90,0,0,255,255,0,68,0,0,7,166,7,78,16,39,22,193,5,245,1,115,18,6,0,58,0,0, + 255,255,0,86,0,0,6,53,6,20,16,39,2,184,5,71,0,0,18,6,0,90,0,0,255,255,0,68,254,137,7,166,5,213,18,38,0,58,0,0, + 16,7,2,212,5,251,0,0,255,255,0,86,254,137,6,53,4,96,18,38,0,90,0,0,16,7,2,212,5,74,0,0,255,255,0,61,0,0,5,59, + 7,79,16,39,22,193,4,202,1,115,18,6,0,59,0,0,255,255,0,59,0,0,4,121,6,20,16,39,2,184,4,98,0,0,18,6,0,91,0,0, + 255,255,0,61,0,0,5,59,7,78,18,38,0,59,0,0,16,7,0,106,0,202,1,62,255,255,0,59,0,0,4,121,6,16,18,38,0,91,0,0, + 16,6,0,106,102,0,0,0,255,255,255,252,0,0,4,231,7,80,16,39,22,193,4,114,1,117,18,6,0,60,0,0,255,255,0,61,254,86,4,127, + 6,20,16,39,2,184,4,96,0,0,18,6,0,92,0,0,255,255,0,92,0,0,5,31,7,109,16,39,22,189,4,190,1,117,18,6,0,61,0,0, + 255,255,0,88,0,0,3,219,6,102,18,38,0,93,0,0,16,6,2,136,26,0,0,0,255,255,0,92,254,137,5,31,5,213,18,38,0,61,0,0, + 16,7,2,212,4,217,0,0,255,255,0,88,254,137,3,219,4,96,18,38,0,93,0,0,16,7,2,212,4,49,0,0,255,255,0,92,254,192,5,31, + 5,213,18,38,0,61,0,0,16,7,2,143,0,199,0,0,255,255,0,88,254,192,3,219,4,96,18,38,0,93,0,0,16,6,2,143,27,0,0,0, + 255,255,0,186,254,192,4,100,6,20,18,38,0,75,0,0,16,6,2,143,102,0,0,0,255,255,0,4,0,0,2,242,7,78,18,38,0,87,0,0, + 16,7,0,106,255,45,1,62,255,255,0,86,0,0,6,53,7,6,18,38,0,90,0,0,16,7,2,156,1,66,0,0,255,255,0,61,254,86,4,127, + 7,6,18,38,0,92,0,0,16,7,2,156,0,129,0,0,255,255,0,123,255,227,5,97,6,20,18,38,0,68,0,0,16,7,2,128,3,218,0,0, + 255,255,0,47,0,0,2,248,7,137,16,39,2,184,3,224,1,117,18,6,1,65,0,0,0,1,0,2,0,0,2,248,6,20,0,24,0,0,33,35, + 17,7,39,55,17,35,53,51,53,52,54,59,1,21,35,34,7,6,21,17,55,23,5,1,152,185,147,74,221,176,176,174,189,174,176,100,38,38,214,75, + 254,223,2,20,104,106,157,1,30,143,78,187,171,153,40,41,103,254,116,152,105,207,0,0,0,1,0,47,0,0,2,248,6,20,0,23,0,0,33,35, + 17,35,53,51,53,35,53,51,54,55,54,59,1,21,35,34,7,6,7,51,21,35,1,152,185,176,176,176,179,13,71,87,189,174,176,100,38,30,6,253, + 255,3,69,143,140,143,137,70,86,153,40,32,68,143,0,0,0,1,0,178,255,227,5,180,5,242,0,55,0,0,1,38,35,34,14,3,21,17,35,17, + 52,62,3,51,50,4,23,34,4,21,20,30,5,21,20,4,35,34,39,53,30,1,51,50,54,53,52,46,7,53,52,54,4,3,109,174,64,102,95,64, + 38,203,57,100,144,166,99,217,1,48,55,207,254,255,67,106,129,129,106,67,254,247,211,180,201,109,177,111,98,151,41,70,91,100,100,91,70,41,223,4, + 244,90,24,64,104,167,111,252,136,3,145,131,207,139,92,40,197,189,125,95,45,67,45,45,62,84,140,92,164,201,95,208,69,70,118,88,53,80,51,41, + 32,36,50,66,103,67,143,187,255,255,0,113,255,227,4,117,5,240,16,6,3,72,0,0,255,255,0,16,254,137,5,104,5,213,16,39,2,212,4,183, + 0,0,18,6,0,36,0,0,255,255,0,123,254,137,4,45,4,123,16,39,2,212,4,33,0,0,18,6,0,68,0,0,255,255,0,16,0,0,5,104, + 7,240,18,38,0,36,0,0,16,7,2,186,4,188,1,117,255,255,0,123,255,227,4,45,6,123,18,38,0,68,0,0,16,7,2,186,4,84,0,0, + 255,255,0,16,0,0,5,104,8,58,18,38,0,36,0,0,16,6,22,248,0,0,0,0,255,255,0,123,255,227,4,175,6,197,16,39,22,248,255,151, + 254,139,16,6,0,68,0,0,255,255,0,16,0,0,5,104,8,58,18,38,0,36,0,0,16,6,22,249,0,0,0,0,255,255,0,123,255,227,4,45, + 6,198,16,38,0,68,0,0,16,7,22,249,255,148,254,140,255,255,0,16,0,0,5,104,8,91,18,38,0,36,0,0,16,6,22,255,0,0,0,0, + 255,255,0,123,255,227,4,157,6,230,16,39,22,255,255,150,254,139,16,6,0,68,0,0,255,255,0,16,0,0,5,104,8,117,18,38,0,36,0,0, + 16,6,22,250,0,0,0,0,255,255,0,123,255,227,4,45,7,0,16,39,22,250,255,150,254,139,16,6,0,68,0,0,255,255,0,16,254,137,5,104, + 7,109,18,38,0,132,0,0,16,7,2,212,4,175,0,0,255,255,0,123,254,137,4,45,6,102,18,38,0,164,0,0,16,7,2,212,4,34,0,0, + 255,255,0,16,0,0,5,104,8,90,18,38,0,36,0,0,16,6,22,252,0,0,0,0,255,255,0,123,255,227,4,45,7,4,16,39,22,252,255,145, + 254,170,16,6,0,68,0,0,255,255,0,16,0,0,5,104,8,90,18,38,0,36,0,0,16,6,22,253,0,0,0,0,255,255,0,123,255,227,4,45, + 7,4,16,39,22,253,255,146,254,170,16,6,0,68,0,0,255,255,0,16,0,0,5,104,8,139,18,38,0,36,0,0,16,6,22,254,0,0,0,0, + 255,255,0,123,255,227,4,45,7,53,16,39,22,254,255,148,254,170,16,6,0,68,0,0,255,255,0,16,0,0,5,104,8,89,18,38,0,36,0,0, + 16,6,22,251,0,0,0,0,255,255,0,123,255,227,4,45,7,3,16,38,0,68,0,0,16,7,22,251,255,146,254,170,255,255,0,16,254,137,5,104, + 7,146,18,38,0,196,0,0,16,7,2,212,4,192,0,0,255,255,0,123,254,137,4,45,6,31,18,38,0,197,0,0,16,7,2,212,4,51,0,0, + 255,255,0,201,254,137,4,139,5,213,16,38,0,40,0,0,16,7,2,212,4,158,0,0,255,255,0,113,254,137,4,127,4,123,16,38,0,72,0,0, + 16,7,2,212,4,139,0,0,255,255,0,201,0,0,4,139,7,240,18,38,0,40,0,0,16,7,2,186,4,158,1,117,255,255,0,113,255,227,4,127, + 6,123,18,38,0,72,0,0,16,7,2,186,4,141,0,0,255,255,0,201,0,0,4,139,7,94,16,39,22,187,4,158,1,117,18,6,0,40,0,0, + 255,255,0,113,255,227,4,127,6,55,16,39,2,158,0,151,0,0,18,6,0,72,0,0,255,255,0,201,0,0,5,24,8,58,18,38,0,40,0,0, + 16,6,22,248,0,0,0,0,255,255,0,113,255,227,4,232,6,197,16,39,22,248,255,208,254,139,16,6,0,72,0,0,255,255,0,201,0,0,4,139, + 8,58,18,38,0,40,0,0,16,6,22,249,238,0,0,0,255,255,0,113,255,227,4,127,6,198,16,39,22,249,255,208,254,140,16,6,0,72,0,0, + 255,255,0,201,0,0,4,245,8,91,18,38,0,40,0,0,16,6,22,255,238,0,0,0,255,255,0,113,255,227,4,215,6,230,16,38,0,72,0,0, + 16,7,22,255,255,208,254,139,255,255,0,201,0,0,4,139,8,117,18,38,0,40,0,0,16,6,22,250,234,0,0,0,255,255,0,113,255,227,4,127, + 7,0,16,39,22,250,255,209,254,139,16,6,0,72,0,0,255,255,0,201,254,137,4,139,7,109,18,38,0,140,0,0,16,7,2,212,4,158,0,0, + 255,255,0,113,254,137,4,127,6,102,16,39,2,212,4,139,0,0,16,38,9,178,0,0,16,7,2,136,0,139,0,0,255,255,0,90,0,0,2,26, + 7,240,18,38,0,44,0,0,16,7,2,186,3,35,1,117,255,255,0,68,0,0,2,4,6,124,18,38,0,243,0,0,16,7,2,186,3,13,0,1, + 255,255,0,201,254,137,1,147,5,213,16,38,0,44,0,0,16,7,2,212,3,46,0,0,255,255,0,191,254,137,1,121,6,20,16,38,0,76,0,0, + 16,7,2,212,3,29,0,0,255,255,0,115,254,137,5,217,5,240,16,38,0,50,0,0,16,7,2,212,5,39,0,0,255,255,0,113,254,137,4,117, + 4,123,16,38,0,82,0,0,16,7,2,212,4,115,0,0,255,255,0,115,255,227,5,217,7,240,18,38,0,50,0,0,16,7,2,186,5,39,1,117, + 255,255,0,113,255,227,4,117,6,123,18,38,0,82,0,0,16,7,2,186,4,125,0,0,255,255,0,115,255,227,5,217,8,58,18,38,0,50,0,0, + 16,6,22,248,108,0,0,0,255,255,0,113,255,227,4,206,6,197,16,39,22,248,255,182,254,139,16,6,0,82,0,0,255,255,0,115,255,227,5,217, + 8,58,18,38,0,50,0,0,16,6,22,249,106,0,0,0,255,255,0,113,255,227,4,117,6,198,16,39,22,249,255,181,254,140,16,6,0,82,0,0, + 255,255,0,115,255,227,5,217,8,91,18,38,0,50,0,0,16,6,22,255,106,0,0,0,255,255,0,113,255,227,4,189,6,230,16,39,22,255,255,182, + 254,139,16,6,0,82,0,0,255,255,0,115,255,227,5,217,8,117,18,38,0,50,0,0,16,6,22,250,101,0,0,0,255,255,0,113,255,227,4,117, + 7,0,16,39,22,250,255,182,254,139,16,6,0,82,0,0,255,255,0,115,254,137,5,217,7,109,18,38,0,150,0,0,16,7,2,212,5,39,0,0, + 255,255,0,113,254,137,4,117,6,102,16,39,2,212,4,115,0,0,16,38,9,198,0,0,16,6,2,136,115,0,0,0,255,255,0,103,255,227,6,29, + 7,107,16,39,22,186,5,39,1,117,18,6,1,98,0,0,255,255,0,118,255,227,4,211,6,102,16,38,0,118,115,0,18,6,1,99,0,0,0,0, + 255,255,0,103,255,227,6,29,7,107,16,39,22,188,5,39,1,117,18,6,1,98,0,0,255,255,0,118,255,227,4,211,6,102,16,38,0,67,115,0, + 18,6,1,99,0,0,0,0,255,255,0,103,255,227,6,29,7,240,18,38,1,98,0,0,16,7,2,186,5,39,1,117,255,255,0,118,255,227,4,211, + 6,123,18,38,1,99,0,0,16,7,2,186,4,125,0,0,255,255,0,103,255,227,6,29,7,94,16,39,22,187,5,39,1,117,18,6,1,98,0,0, + 255,255,0,118,255,227,4,211,6,55,16,38,2,158,115,0,18,6,1,99,0,0,0,0,255,255,0,103,254,137,6,29,6,20,18,38,1,98,0,0, + 16,7,2,212,5,39,0,0,255,255,0,118,254,137,4,211,4,235,18,38,1,99,0,0,16,7,2,212,4,115,0,0,255,255,0,178,254,137,5,41, + 5,213,16,38,0,56,0,0,16,7,2,212,4,245,0,0,255,255,0,174,254,137,4,88,4,123,16,38,0,88,0,0,16,7,2,212,4,123,0,0, + 255,255,0,178,255,227,5,41,7,240,18,38,0,56,0,0,16,7,2,186,4,238,1,117,255,255,0,174,255,227,4,88,6,123,18,38,0,88,0,0, + 16,7,2,186,4,125,0,0,255,255,0,173,255,247,6,95,7,107,16,39,22,186,4,238,1,117,18,6,1,113,0,0,255,255,0,176,255,227,5,105, + 6,102,16,38,0,118,123,0,18,6,1,114,0,0,0,0,255,255,0,173,255,247,6,95,7,107,16,39,22,188,4,238,1,117,18,6,1,113,0,0, + 255,255,0,176,255,227,5,105,6,102,16,38,0,67,123,0,18,6,1,114,0,0,0,0,255,255,0,173,255,247,6,95,7,240,18,38,1,113,0,0, + 16,7,2,186,4,238,1,117,255,255,0,176,255,227,5,105,6,123,18,38,1,114,0,0,16,7,2,186,4,125,0,0,255,255,0,173,255,247,6,95, + 7,94,16,39,22,187,4,238,1,117,18,6,1,113,0,0,255,255,0,176,255,227,5,105,6,55,16,39,2,158,0,128,0,0,18,6,1,114,0,0, + 255,255,0,173,254,137,6,95,6,20,18,38,1,113,0,0,16,7,2,212,4,245,0,0,255,255,0,176,254,137,5,105,4,235,18,38,1,114,0,0, + 16,7,2,212,4,123,0,0,255,255,255,252,0,0,4,231,7,114,18,38,0,60,0,0,16,7,22,188,4,114,1,124,255,255,0,61,254,86,4,127, + 6,107,18,38,0,92,0,0,16,6,0,67,33,5,0,0,255,255,255,252,254,137,4,231,5,213,16,39,2,212,4,118,0,0,18,6,0,60,0,0, + 255,255,0,61,254,86,4,127,4,96,16,39,2,212,5,116,0,0,18,6,0,92,0,0,255,255,255,252,0,0,4,231,7,247,18,38,0,60,0,0, + 16,7,2,186,4,114,1,124,255,255,0,61,254,86,4,127,6,130,18,38,0,92,0,0,16,7,2,186,4,96,0,7,255,255,255,252,0,0,4,231, + 7,94,16,39,22,187,4,114,1,117,18,6,0,60,0,0,255,255,0,61,254,86,4,127,6,55,16,38,2,158,119,0,18,6,0,92,0,0,0,0, + 0,1,0,201,0,0,6,28,5,213,0,9,0,0,19,51,17,51,17,51,17,33,21,33,201,202,232,202,2,215,250,173,5,213,250,213,5,43,250,213, + 170,0,0,0,0,1,0,32,0,0,3,178,6,20,0,19,0,0,19,51,21,51,53,51,21,51,21,35,17,35,17,35,17,35,17,35,53,51,193,184, + 224,184,161,161,184,224,184,161,161,6,20,147,147,147,125,250,252,5,4,250,252,5,4,125,255,255,0,113,255,231,4,228,6,97,16,38,3,69,0,0, + 16,6,10,165,112,0,0,0,255,255,0,113,255,231,4,228,6,97,16,38,3,69,0,0,16,6,10,221,72,0,0,0,255,255,0,113,255,231,4,228, + 6,102,16,38,3,69,0,0,16,7,10,178,0,148,0,0,255,255,0,113,255,231,4,228,6,102,16,38,3,69,0,0,16,7,10,191,0,132,0,0, + 255,255,0,113,255,231,4,228,6,102,16,38,3,69,0,0,16,7,10,179,0,132,0,0,255,255,0,113,255,231,4,228,6,102,16,38,3,69,0,0, + 16,7,10,192,0,160,0,0,255,255,0,113,255,231,4,228,7,109,16,38,3,69,0,0,16,6,10,180,118,0,0,0,255,255,0,113,255,231,4,228, + 7,109,16,38,3,69,0,0,16,6,10,193,68,0,0,0,255,255,0,16,0,0,5,104,6,97,16,38,3,38,0,0,16,7,10,165,255,35,0,0, + 255,255,0,16,0,0,5,104,6,97,16,38,3,38,0,0,16,7,10,221,254,243,0,0,255,255,0,5,0,0,6,244,6,102,16,39,3,38,1,140, + 0,0,16,7,10,178,255,124,0,0,0,0,255,255,0,6,0,0,6,244,6,102,16,39,3,38,1,140,0,0,16,6,10,191,136,0,255,255,0,7, + 0,0,6,22,6,102,16,39,3,38,0,174,0,0,16,7,10,179,255,83,0,0,0,0,255,255,0,4,0,0,6,88,6,102,16,39,3,38,0,240, + 0,0,16,7,10,192,255,111,0,0,0,0,255,255,0,7,0,0,5,153,7,109,16,38,3,38,49,0,16,7,10,180,255,81,0,0,255,255,0,4, + 0,0,5,224,7,109,16,38,3,38,120,0,16,7,10,193,255,78,0,0,255,255,0,133,255,227,3,200,6,97,16,38,3,73,0,0,16,6,10,165, + 68,0,0,0,255,255,0,133,255,227,3,200,6,97,16,38,3,73,0,0,16,6,10,221,57,0,0,0,255,255,0,133,255,227,3,200,6,102,16,38, + 3,73,0,0,16,6,10,178,32,0,0,0,255,255,0,133,255,227,3,200,6,102,16,38,3,73,0,0,16,6,10,191,37,0,0,0,255,255,0,133, + 255,227,3,227,6,102,16,38,3,73,0,0,16,6,10,179,79,0,0,0,255,255,0,133,255,227,4,3,6,102,16,38,3,73,0,0,16,6,10,192, + 82,0,0,0,255,255,0,7,0,0,5,45,6,97,16,39,3,42,0,162,0,0,16,7,10,165,254,129,0,0,0,0,255,255,0,7,0,0,5,45, + 6,97,16,39,3,42,0,162,0,0,16,7,10,221,254,129,0,0,0,0,255,255,0,5,0,0,7,55,6,102,16,39,3,42,2,172,0,0,16,7, + 10,178,255,124,0,0,0,0,255,255,0,6,0,0,7,73,6,102,16,39,3,42,2,190,0,0,16,6,10,191,136,0,255,255,0,7,0,0,6,173, + 6,102,16,39,3,42,2,34,0,0,16,7,10,179,255,83,0,0,0,0,255,255,0,4,0,0,6,233,6,102,16,39,3,42,2,94,0,0,16,7, + 10,192,255,111,0,0,0,0,255,255,0,186,254,86,4,100,6,97,16,38,3,75,0,0,16,7,10,165,0,166,0,0,255,255,0,186,254,86,4,100, + 6,97,16,38,3,75,0,0,16,7,10,221,0,162,0,0,255,255,0,186,254,86,4,100,6,102,16,38,3,75,0,0,16,7,10,178,0,128,0,0, + 255,255,0,186,254,86,4,100,6,102,16,38,3,75,0,0,16,6,10,191,112,0,0,0,255,255,0,186,254,86,4,100,6,102,16,38,3,75,0,0, + 16,7,10,179,0,132,0,0,255,255,0,186,254,86,4,100,6,102,16,38,3,75,0,0,16,7,10,192,0,174,0,0,255,255,0,186,254,86,4,100, + 7,109,16,38,3,75,0,0,16,7,10,180,0,156,0,0,255,255,0,186,254,86,4,100,7,109,16,38,3,75,0,0,16,7,10,193,0,135,0,0, + 255,255,0,7,0,0,5,233,6,97,16,39,3,44,0,174,0,0,16,7,10,165,254,129,0,0,0,0,255,255,0,7,0,0,5,230,6,97,16,39, + 3,44,0,171,0,0,16,7,10,221,254,129,0,0,0,0,255,255,0,5,0,0,7,231,6,102,16,39,3,44,2,172,0,0,16,7,10,178,255,124, + 0,0,0,0,255,255,0,6,0,0,7,237,6,102,16,39,3,44,2,178,0,0,16,6,10,191,136,0,255,255,0,7,0,0,7,110,6,102,16,39, + 3,44,2,51,0,0,16,7,10,179,255,83,0,0,0,0,255,255,0,4,0,0,7,159,6,102,16,39,3,44,2,100,0,0,16,7,10,192,255,111, + 0,0,0,0,255,255,0,7,0,0,6,175,7,109,16,39,3,44,1,116,0,0,16,7,10,180,255,81,0,0,0,0,255,255,0,4,0,0,6,202, + 7,109,16,39,3,44,1,143,0,0,16,7,10,193,255,78,0,0,0,0,255,255,0,155,0,0,2,110,6,97,16,38,3,77,0,0,16,7,10,165, + 255,21,0,0,255,255,0,145,0,0,2,110,6,97,16,38,3,77,0,0,16,7,10,221,255,11,0,0,255,255,255,176,0,0,2,185,6,102,16,38, + 3,77,0,0,16,7,10,178,255,39,0,0,255,255,255,186,0,0,2,199,6,102,16,38,3,77,0,0,16,7,10,191,255,60,0,0,255,255,0,5, + 0,0,2,229,6,102,16,38,3,77,0,0,16,7,10,179,255,81,0,0,255,255,255,210,0,0,2,238,6,102,16,38,3,77,0,0,16,7,10,192, + 255,61,0,0,255,255,255,203,0,0,2,110,7,109,16,38,3,77,0,0,16,7,10,180,255,21,0,0,255,255,255,198,0,0,2,110,7,109,16,38, + 3,77,0,0,16,7,10,193,255,16,0,0,255,255,0,7,0,0,2,65,6,97,16,39,3,46,0,174,0,0,16,7,10,165,254,129,0,0,0,0, + 255,255,0,7,0,0,2,53,6,97,16,39,3,46,0,162,0,0,16,7,10,221,254,129,0,0,0,0,255,255,0,5,0,0,4,75,6,102,16,39, + 3,46,2,184,0,0,16,7,10,178,255,124,0,0,0,0,255,255,0,6,0,0,4,75,6,102,16,39,3,46,2,184,0,0,16,6,10,191,136,0, + 255,255,0,7,0,0,3,199,6,102,16,39,3,46,2,52,0,0,16,7,10,179,255,83,0,0,0,0,255,255,0,4,0,0,4,3,6,102,16,39, + 3,46,2,112,0,0,16,7,10,192,255,111,0,0,0,0,255,255,0,7,0,0,3,34,7,109,16,39,3,46,1,143,0,0,16,7,10,180,255,81, + 0,0,0,0,255,255,0,4,0,0,3,41,7,109,16,39,3,46,1,150,0,0,16,7,10,193,255,78,0,0,0,0,255,255,0,113,255,227,4,117, + 6,97,16,38,3,83,0,0,16,6,10,165,120,0,0,0,255,255,0,113,255,227,4,117,6,97,16,38,3,83,0,0,16,6,10,221,110,0,0,0, + 255,255,0,113,255,227,4,117,6,102,16,38,3,83,0,0,16,6,10,178,101,0,0,0,255,255,0,113,255,227,4,117,6,102,16,38,3,83,0,0, + 16,6,10,191,84,0,0,0,255,255,0,113,255,227,4,117,6,102,16,38,3,83,0,0,16,7,10,179,0,136,0,0,255,255,0,113,255,227,4,117, + 6,102,16,38,3,83,0,0,16,7,10,192,0,145,0,0,255,255,0,7,255,227,5,252,6,97,16,38,3,52,35,0,16,7,10,165,254,129,0,0, + 255,255,0,7,255,227,6,86,6,97,16,38,3,52,125,0,16,7,10,221,254,129,0,0,255,255,0,5,255,227,8,79,6,102,16,39,3,52,2,118, + 0,0,16,7,10,178,255,124,0,0,0,0,255,255,0,6,255,227,8,89,6,102,16,39,3,52,2,128,0,0,16,6,10,191,136,0,255,255,0,7, + 255,227,7,15,6,102,16,39,3,52,1,54,0,0,16,7,10,179,255,83,0,0,0,0,255,255,0,4,255,227,7,80,6,102,16,39,3,52,1,119, + 0,0,16,7,10,192,255,111,0,0,0,0,255,255,0,149,255,227,4,42,6,97,16,38,3,89,0,0,16,6,10,165,61,0,0,0,255,255,0,149, + 255,227,4,42,6,97,16,38,3,89,0,0,16,6,10,221,27,0,0,0,255,255,0,149,255,227,4,42,6,102,16,38,3,89,0,0,16,6,10,178, + 39,0,0,0,255,255,0,149,255,227,4,42,6,102,16,38,3,89,0,0,16,6,10,191,33,0,0,0,255,255,0,149,255,227,4,42,6,102,16,38, + 3,89,0,0,16,6,10,179,96,0,0,0,255,255,0,149,255,227,4,42,6,102,16,38,3,89,0,0,16,6,10,192,87,0,0,0,255,255,0,149, + 255,227,4,42,7,109,16,38,3,89,0,0,16,6,10,180,56,0,0,0,255,255,0,149,255,227,4,42,7,109,16,38,3,89,0,0,16,6,10,193, + 24,0,0,0,255,255,0,7,0,0,6,73,6,97,16,39,3,57,1,98,0,0,16,7,10,221,254,129,0,0,0,0,255,255,0,6,0,0,7,255, + 6,102,16,39,3,57,3,24,0,0,16,6,10,191,136,0,255,255,0,4,0,0,8,29,6,102,16,39,3,57,3,54,0,0,16,7,10,192,255,111, + 0,0,0,0,255,255,0,4,0,0,7,51,7,109,16,39,3,57,2,76,0,0,16,7,10,193,255,78,0,0,0,0,255,255,0,135,255,227,6,39, + 6,97,16,38,3,93,0,0,16,7,10,165,1,94,0,0,255,255,0,135,255,227,6,39,6,97,16,38,3,93,0,0,16,7,10,221,1,84,0,0, + 255,255,0,135,255,227,6,39,6,102,16,38,3,93,0,0,16,7,10,178,1,89,0,0,255,255,0,135,255,227,6,39,6,102,16,38,3,93,0,0, + 16,7,10,191,1,94,0,0,255,255,0,135,255,227,6,39,6,102,16,38,3,93,0,0,16,7,10,179,1,164,0,0,255,255,0,135,255,227,6,39, + 6,102,16,38,3,93,0,0,16,7,10,192,1,139,0,0,255,255,0,135,255,227,6,39,7,109,16,38,3,93,0,0,16,7,10,180,1,99,0,0, + 255,255,0,135,255,227,6,39,7,109,16,38,3,93,0,0,16,7,10,193,1,94,0,0,255,255,0,7,0,0,6,29,6,97,16,38,3,61,78,0, + 16,7,10,165,254,129,0,0,255,255,0,7,0,0,6,113,6,97,16,39,3,61,0,162,0,0,16,7,10,221,254,129,0,0,0,0,255,255,0,5, + 0,0,8,105,6,102,16,39,3,61,2,154,0,0,16,7,10,178,255,124,0,0,0,0,255,255,0,6,0,0,8,117,6,102,16,39,3,61,2,166, + 0,0,16,6,10,191,136,0,255,255,0,7,0,0,7,67,6,102,16,39,3,61,1,116,0,0,16,7,10,179,255,83,0,0,0,0,255,255,0,4, + 0,0,7,121,6,102,16,39,3,61,1,170,0,0,16,7,10,192,255,111,0,0,0,0,255,255,0,7,0,0,7,17,7,109,16,39,3,61,1,66, + 0,0,16,7,10,180,255,81,0,0,0,0,255,255,0,4,0,0,7,80,7,109,16,39,3,61,1,129,0,0,16,7,10,193,255,78,0,0,0,0, + 255,255,0,113,255,231,4,228,6,102,16,38,3,69,0,0,16,6,10,209,116,0,0,0,255,255,0,113,255,231,4,228,6,102,16,6,3,64,0,0, + 255,255,0,133,255,227,3,200,6,102,16,38,3,73,0,0,16,6,10,209,84,0,0,0,255,255,0,133,255,227,3,200,6,102,16,6,3,65,0,0, + 255,255,0,186,254,86,4,100,6,102,16,38,3,75,0,0,16,7,10,209,0,198,0,0,255,255,0,186,254,86,4,100,6,102,16,6,3,66,0,0, + 255,255,255,141,0,0,2,110,6,102,16,38,3,77,0,0,16,7,10,209,254,227,0,0,255,255,0,166,0,0,2,152,6,102,16,6,3,67,0,0, + 255,255,0,113,255,227,4,117,6,102,16,38,3,83,0,0,16,6,10,209,123,0,0,0,255,255,0,113,255,227,4,117,6,102,16,6,3,96,0,0, + 255,255,0,149,255,227,4,42,6,102,16,38,3,89,0,0,16,6,10,209,48,0,0,0,255,255,0,149,255,227,4,42,6,102,16,6,3,97,0,0, + 255,255,0,135,255,227,6,39,6,102,16,38,3,93,0,0,16,7,10,209,1,77,0,0,255,255,0,135,255,227,6,39,6,102,16,6,3,98,0,0, + 255,255,0,113,254,86,4,228,6,97,16,38,9,245,0,0,16,6,3,22,72,0,0,0,255,255,0,113,254,86,4,228,6,97,16,38,9,246,0,0, + 16,6,3,22,72,0,0,0,255,255,0,113,254,86,4,228,6,102,16,38,9,247,0,0,16,6,3,22,72,0,0,0,255,255,0,113,254,86,4,228, + 6,102,16,38,9,248,0,0,16,6,3,22,72,0,0,0,255,255,0,113,254,86,4,228,6,102,16,38,9,249,0,0,16,6,3,22,72,0,0,0, + 255,255,0,113,254,86,4,228,6,102,16,38,9,250,0,0,16,6,3,22,72,0,0,0,255,255,0,113,254,86,4,228,7,109,16,38,9,251,0,0, + 16,6,3,22,72,0,0,0,255,255,0,113,254,86,4,228,7,109,16,38,9,252,0,0,16,6,3,22,72,0,0,0,255,255,0,16,254,86,5,104, + 6,97,16,38,9,253,0,0,16,7,10,164,0,186,0,0,255,255,0,16,254,86,5,104,6,97,16,38,9,254,0,0,16,7,10,164,0,186,0,0, + 255,255,0,5,254,86,6,244,6,102,16,38,9,255,0,0,16,7,10,164,2,70,0,0,255,255,0,6,254,86,6,244,6,102,16,38,10,0,0,0, + 16,7,10,164,2,70,0,0,255,255,0,7,254,86,6,22,6,102,16,38,10,1,0,0,16,7,10,164,1,104,0,0,255,255,0,4,254,86,6,88, + 6,102,16,38,10,2,0,0,16,7,10,164,1,170,0,0,255,255,0,7,254,86,5,153,7,109,16,38,10,3,0,0,16,7,10,164,0,235,0,0, + 255,255,0,4,254,86,5,224,7,109,16,38,10,4,0,0,16,7,10,164,1,50,0,0,255,255,0,186,254,86,4,100,6,97,16,38,10,17,0,0, + 16,7,3,22,255,56,0,0,255,255,0,186,254,86,4,100,6,97,16,38,10,18,0,0,16,7,3,22,255,56,0,0,255,255,0,186,254,86,4,100, + 6,102,16,38,10,19,0,0,16,7,3,22,255,56,0,0,255,255,0,186,254,86,4,100,6,102,16,38,10,20,0,0,16,7,3,22,255,56,0,0, + 255,255,0,186,254,86,4,100,6,102,16,38,10,21,0,0,16,7,3,22,255,56,0,0,255,255,0,186,254,86,4,100,6,102,16,38,10,22,0,0, + 16,7,3,22,255,56,0,0,255,255,0,186,254,86,4,100,7,109,16,38,10,23,0,0,16,7,3,22,255,56,0,0,255,255,0,186,254,86,4,100, + 7,109,16,38,10,24,0,0,16,7,3,22,255,56,0,0,255,255,0,7,254,86,5,233,6,97,16,38,10,25,0,0,16,7,10,164,1,158,0,0, + 255,255,0,7,254,86,5,230,6,97,16,38,10,26,0,0,16,7,10,164,1,155,0,0,255,255,0,5,254,86,7,231,6,102,16,38,10,27,0,0, + 16,7,10,164,3,156,0,0,255,255,0,6,254,86,7,237,6,102,16,38,10,28,0,0,16,7,10,164,3,162,0,0,255,255,0,7,254,86,7,110, + 6,102,16,38,10,29,0,0,16,7,10,164,3,35,0,0,255,255,0,4,254,86,7,159,6,102,16,38,10,30,0,0,16,7,10,164,3,84,0,0, + 255,255,0,7,254,86,6,175,7,109,16,38,10,31,0,0,16,7,10,164,2,100,0,0,255,255,0,4,254,86,6,202,7,109,16,38,10,32,0,0, + 16,7,10,164,2,127,0,0,255,255,0,135,254,86,6,39,6,97,16,38,10,73,0,0,16,7,3,22,1,89,0,0,255,255,0,135,254,86,6,39, + 6,97,16,38,10,74,0,0,16,7,3,22,1,89,0,0,255,255,0,135,254,86,6,39,6,102,16,38,10,75,0,0,16,7,3,22,1,89,0,0, + 255,255,0,135,254,86,6,39,6,102,16,38,10,76,0,0,16,7,3,22,1,89,0,0,255,255,0,135,254,86,6,39,6,102,16,38,10,77,0,0, + 16,7,3,22,1,89,0,0,255,255,0,135,254,86,6,39,6,102,16,38,10,78,0,0,16,7,3,22,1,89,0,0,255,255,0,135,254,86,6,39, + 7,109,16,38,10,79,0,0,16,7,3,22,1,89,0,0,255,255,0,135,254,86,6,39,7,109,16,38,10,80,0,0,16,7,3,22,1,89,0,0, + 255,255,0,7,254,86,6,29,6,97,16,38,10,81,0,0,16,7,10,164,1,92,0,0,255,255,0,7,254,86,6,113,6,97,16,38,10,82,0,0, + 16,7,10,164,1,176,0,0,255,255,0,5,254,86,8,105,6,102,16,38,10,83,0,0,16,7,10,164,3,168,0,0,255,255,0,6,254,86,8,117, + 6,102,16,38,10,84,0,0,16,7,10,164,3,180,0,0,255,255,0,7,254,86,7,67,6,102,16,38,10,85,0,0,16,7,10,164,2,130,0,0, + 255,255,0,4,254,86,7,121,6,102,16,38,10,86,0,0,16,7,10,164,2,184,0,0,255,255,0,7,254,86,7,17,7,109,16,38,10,87,0,0, + 16,7,10,164,2,80,0,0,255,255,0,4,254,86,7,80,7,109,16,38,10,88,0,0,16,7,10,164,2,143,0,0,255,255,0,113,255,231,4,228, + 6,72,16,38,3,69,0,0,16,6,2,154,122,0,0,0,255,255,0,113,255,231,4,228,5,246,16,38,3,69,0,0,16,6,0,113,121,0,0,0, + 255,255,0,113,254,86,4,228,6,102,16,38,10,89,0,0,16,6,3,22,72,0,0,0,255,255,0,113,254,86,4,228,4,121,16,38,3,69,0,0, + 16,6,3,22,72,0,0,0,255,255,0,113,254,86,4,228,6,102,16,38,3,64,0,0,16,6,3,22,72,0,0,0,255,255,0,113,255,231,4,228, + 6,55,16,38,3,69,0,0,16,6,10,166,110,0,0,0,255,255,0,113,254,86,4,228,6,55,16,38,10,156,0,0,16,6,3,22,72,0,0,0, + 255,255,0,16,0,0,5,104,7,109,16,38,3,38,0,0,16,7,22,192,4,186,1,117,255,255,0,16,0,0,5,104,7,49,16,38,3,38,0,0, + 16,7,0,113,0,188,1,59,255,255,255,252,0,0,5,170,6,102,16,38,3,38,66,0,16,7,10,209,255,82,0,0,255,255,0,16,0,0,5,104, + 6,102,16,6,3,29,0,0,255,255,0,16,254,86,5,104,5,213,16,38,3,38,0,0,16,7,10,164,0,186,0,0,255,255,1,134,4,194,2,120, + 6,97,16,6,10,165,0,0,255,255,1,182,254,86,2,146,255,164,16,6,3,22,0,0,0,1,1,134,4,194,2,120,6,97,0,8,0,72,180,5, + 8,7,2,9,16,212,60,220,178,63,8,1,93,192,49,182,0,6,7,6,3,2,9,0,16,212,180,63,2,95,2,2,93,176,17,75,80,88,204,27, + 192,89,204,204,178,63,7,1,93,17,57,48,177,6,3,73,177,7,6,73,80,88,179,5,64,6,64,56,56,89,1,16,35,53,22,53,35,53,51,2, + 120,242,134,133,241,5,205,254,245,103,3,157,158,0,0,0,255,255,0,182,5,29,3,74,6,55,16,6,2,158,0,0,255,255,0,182,5,70,3,74, + 7,109,16,39,22,187,4,0,1,132,18,6,0,106,0,0,255,255,0,186,254,86,4,100,6,102,16,38,10,93,0,0,16,7,3,22,255,56,0,0, + 255,255,0,186,254,86,4,100,4,123,16,38,3,75,0,0,16,7,3,22,255,56,0,0,255,255,0,186,254,86,4,100,6,102,16,38,3,66,0,0, + 16,7,3,22,255,56,0,0,255,255,0,186,254,86,4,100,6,55,16,38,3,75,0,0,16,7,10,166,0,144,0,0,255,255,0,186,254,86,4,100, + 6,55,16,38,10,171,0,0,16,7,3,22,255,56,0,0,255,255,255,252,0,0,5,237,6,102,16,39,3,42,1,98,0,0,16,7,10,209,255,82, + 0,0,0,0,255,255,255,231,0,0,5,117,6,102,16,6,3,31,0,0,255,255,255,252,0,0,6,169,6,102,16,39,3,44,1,110,0,0,16,7, + 10,209,255,82,0,0,0,0,255,255,255,243,0,0,6,31,6,102,16,6,3,32,0,0,255,255,0,201,254,86,5,59,5,213,16,38,3,44,0,0, + 16,7,10,164,0,255,0,0,255,255,0,137,4,194,3,146,6,102,16,39,10,165,255,3,0,0,16,7,10,209,1,9,0,0,0,0,255,255,0,180, + 4,194,3,148,6,102,16,39,10,165,255,46,0,0,16,6,10,220,66,0,255,255,0,182,4,194,3,74,7,109,16,39,22,187,4,0,1,132,16,6, + 10,165,0,0,255,255,255,235,0,0,2,110,6,72,16,38,3,77,0,0,16,7,2,154,255,36,0,0,255,255,255,227,0,0,2,110,5,246,16,38, + 3,77,0,0,16,7,0,113,255,14,0,0,255,255,255,216,0,0,2,110,7,210,16,38,3,77,0,0,16,7,10,207,255,46,0,0,255,255,0,5, + 0,0,2,128,7,210,16,6,3,37,0,0,255,255,255,228,0,0,2,120,6,55,16,38,3,77,0,0,16,7,10,166,255,46,0,0,255,255,255,230, + 0,0,2,122,7,109,16,38,3,77,0,0,16,7,10,167,255,48,0,0,255,255,255,245,0,0,2,103,7,109,16,38,3,46,0,0,16,7,22,192, + 3,46,1,117,255,255,0,3,0,0,2,89,7,49,16,38,3,46,0,0,16,7,0,113,255,46,1,59,255,255,255,252,0,0,3,4,6,102,16,39, + 3,46,1,113,0,0,16,7,10,209,255,82,0,0,0,0,255,255,255,237,0,0,2,125,6,102,16,6,3,33,0,0,255,255,0,126,4,194,3,139, + 6,102,16,39,10,221,254,248,0,0,16,7,10,209,1,2,0,0,0,0,255,255,0,149,4,194,3,177,6,102,16,39,10,221,255,15,0,0,16,6, + 10,220,95,0,255,255,0,182,4,194,3,74,7,109,16,39,22,187,4,0,1,132,16,6,10,221,0,0,255,255,0,149,255,227,4,42,6,72,16,38, + 3,89,0,0,16,6,2,154,39,0,0,0,255,255,0,149,255,227,4,42,5,246,16,38,3,89,0,0,16,6,0,113,36,0,0,0,255,255,0,149, + 255,227,4,42,7,210,16,38,3,89,0,0,16,6,10,207,27,0,0,0,255,255,0,149,255,227,4,42,7,210,16,6,3,68,0,0,255,255,0,186, + 254,86,4,164,6,97,16,38,3,85,0,0,16,7,10,165,0,187,0,0,255,255,0,186,254,86,4,164,6,97,16,38,3,85,0,0,16,7,10,221, + 0,177,0,0,255,255,0,149,255,227,4,42,6,55,16,38,3,89,0,0,16,6,10,166,39,0,0,0,255,255,0,149,255,227,4,42,7,109,16,38, + 3,89,0,0,16,6,10,167,26,0,0,0,255,255,255,252,0,0,4,231,7,109,16,38,3,57,0,0,16,7,22,192,4,118,1,117,255,255,255,252, + 0,0,4,231,7,49,16,38,3,57,0,0,16,7,0,113,0,128,1,59,255,255,255,252,0,0,6,199,6,102,16,39,3,57,1,224,0,0,16,7, + 10,209,255,82,0,0,0,0,255,255,255,225,0,0,6,145,6,102,16,6,3,35,0,0,255,255,0,7,0,0,5,53,6,97,16,39,3,54,0,168, + 0,0,16,7,10,221,254,129,0,0,0,0,255,255,0,170,5,70,3,41,7,210,18,38,0,106,0,0,16,7,10,209,0,0,1,108,255,255,0,215, + 5,70,3,82,7,210,16,6,3,28,0,0,255,255,0,170,4,240,2,137,6,102,16,6,0,67,0,0,255,255,0,135,254,86,6,39,6,102,16,38, + 10,101,0,0,16,7,3,22,1,89,0,0,255,255,0,135,254,86,6,39,4,96,16,38,3,93,0,0,16,7,3,22,1,89,0,0,255,255,0,135, + 254,86,6,39,6,102,16,38,3,98,0,0,16,7,3,22,1,89,0,0,255,255,0,135,255,227,6,39,6,55,16,38,3,93,0,0,16,7,10,166, + 1,79,0,0,255,255,0,135,254,86,6,39,6,55,16,38,10,213,0,0,16,7,3,22,1,89,0,0,255,255,255,252,255,227,7,20,6,102,16,39, + 3,52,1,59,0,0,16,7,10,209,255,82,0,0,0,0,255,255,255,242,255,227,6,1,6,102,16,6,3,34,0,0,255,255,255,252,0,0,7,19, + 6,102,16,39,3,61,1,68,0,0,16,7,10,209,255,82,0,0,0,0,255,255,255,219,0,0,6,5,6,102,16,6,3,36,0,0,255,255,0,78, + 254,86,5,207,5,231,16,38,3,61,0,0,16,7,10,164,1,14,0,0,255,255,1,115,4,238,3,82,6,102,16,6,0,118,0,0,0,1,1,134, + 4,194,2,120,6,97,0,8,0,72,180,2,7,4,0,9,16,212,192,220,178,63,7,1,93,60,49,182,0,3,2,3,6,7,9,0,16,212,180,63, + 7,95,7,2,93,176,17,75,80,88,204,27,192,89,204,204,178,63,2,1,93,17,57,48,177,3,6,73,177,2,3,73,80,88,179,3,64,4,64,56, + 56,89,1,53,51,21,35,20,55,21,34,1,134,242,134,134,242,5,205,148,158,157,3,103,0,1,0,100,1,223,2,127,2,131,0,3,0,17,182,0, + 156,2,4,1,0,4,16,220,204,49,0,16,212,236,48,19,33,21,33,100,2,27,253,229,2,131,164,0,255,255,0,100,1,223,2,127,2,131,18,6, + 10,238,0,0,0,1,0,100,1,233,4,179,2,121,0,3,0,16,182,2,169,0,233,4,1,0,47,198,49,0,16,252,236,48,19,33,21,33,100,4, + 79,251,177,2,121,144,0,0,0,1,0,100,1,233,3,156,2,121,0,3,0,16,182,2,169,0,233,4,1,0,47,198,49,0,16,252,236,48,19,33, + 21,33,100,3,56,252,200,2,121,144,0,0,0,1,0,100,1,233,7,156,2,121,0,3,0,15,181,2,169,0,4,1,0,47,204,49,0,16,212,236, + 48,19,33,21,33,100,7,56,248,200,2,121,144,0,0,0,0,1,0,0,1,233,8,0,2,121,0,3,0,15,181,2,169,0,4,1,0,47,204,49, + 0,16,212,236,48,17,33,21,33,8,0,248,0,2,121,144,255,255,1,4,254,29,2,248,6,29,16,38,0,95,0,0,16,7,0,95,1,74,0,0, + 255,255,255,236,254,29,4,20,255,238,16,38,0,66,0,0,16,7,0,66,0,0,1,66,0,1,0,174,3,233,1,211,5,213,0,5,0,24,64,11, + 0,158,3,129,6,3,4,0,25,1,6,16,220,252,212,204,49,0,16,244,236,48,1,35,53,19,51,3,1,129,211,164,129,82,3,233,173,1,63,254, + 193,0,0,0,0,1,0,178,3,254,1,215,5,213,0,5,0,24,64,11,3,158,0,129,6,3,4,1,25,0,6,16,220,236,212,204,49,0,16,244, + 236,48,1,51,21,3,35,19,1,4,211,164,129,82,5,213,152,254,193,1,63,0,0,0,0,1,0,174,255,18,1,211,0,254,0,5,0,24,64,11, + 3,158,0,131,6,3,4,1,25,0,6,16,212,236,212,204,49,0,16,252,236,48,37,51,21,3,35,19,1,0,211,164,129,82,254,172,254,192,1,64, + 0,1,0,178,3,254,1,215,5,213,0,5,0,0,1,21,19,35,3,53,1,133,82,129,164,5,213,152,254,193,1,63,152,0,0,0,0,2,0,174, + 3,233,3,109,5,213,0,5,0,11,0,39,64,19,6,0,158,9,3,129,12,9,10,6,25,7,3,4,7,0,25,1,12,16,220,252,204,212,204,16, + 254,212,206,49,0,16,244,60,236,50,48,1,35,53,19,51,3,5,35,53,19,51,3,1,129,211,164,129,82,1,154,211,164,129,82,3,233,173,1,63, + 254,193,173,173,1,63,254,193,0,2,0,174,3,233,3,109,5,213,0,5,0,11,0,39,64,19,9,3,158,6,0,129,12,9,10,7,25,6,1,3, + 4,1,25,0,12,16,220,236,212,204,16,220,238,212,206,49,0,16,244,60,236,50,48,1,51,21,3,35,19,37,51,21,3,35,19,1,0,211,164,129, + 82,1,154,211,164,129,82,5,213,172,254,192,1,64,172,172,254,192,1,64,0,2,0,174,255,18,3,109,0,254,0,5,0,11,0,39,64,19,9,3, + 158,6,0,131,12,3,4,1,25,0,7,9,10,7,25,6,12,16,220,236,212,204,16,220,238,212,206,49,0,16,252,60,236,50,48,37,51,21,3,35, + 19,37,51,21,3,35,19,2,154,211,164,129,82,254,102,211,164,129,82,254,172,254,192,1,64,172,172,254,192,1,64,0,0,2,0,174,3,233,3,109, + 5,213,0,5,0,11,0,0,1,21,19,35,3,53,33,21,19,35,3,53,1,129,82,129,164,2,109,82,129,164,5,213,173,254,193,1,63,173,173,254, + 193,1,63,173,0,1,0,57,255,59,3,199,5,213,0,11,0,39,64,20,8,4,185,10,2,0,129,6,194,12,3,89,5,1,87,9,89,7,0,12, + 16,212,60,236,252,60,236,49,0,16,228,244,212,60,236,50,48,1,51,17,33,21,33,17,35,17,33,53,33,1,168,176,1,111,254,145,176,254,145,1, + 111,5,213,254,92,153,251,163,4,93,153,0,0,1,0,57,255,59,3,199,5,213,0,19,0,62,64,32,18,6,185,0,16,8,185,10,4,0,2,14, + 10,12,129,2,194,20,15,0,89,17,13,1,87,9,5,89,11,7,3,20,16,212,60,60,236,50,252,60,60,236,50,49,0,16,228,244,196,50,16,196, + 50,16,238,50,16,238,50,48,37,33,17,35,17,33,53,33,17,33,53,33,17,51,17,33,21,33,17,33,3,199,254,145,176,254,145,1,111,254,145,1, + 111,176,1,111,254,145,1,111,223,254,92,1,164,154,2,31,153,1,164,254,92,153,253,225,0,1,1,51,1,209,3,133,4,33,0,11,0,18,183,9, + 199,3,12,6,92,0,12,16,212,236,49,0,16,212,236,48,1,52,54,51,50,22,21,20,6,35,34,38,1,51,173,126,124,171,172,125,125,172,2,250, + 124,171,171,124,125,172,172,0,0,1,1,51,1,129,3,213,4,113,0,2,0,0,1,17,1,1,51,2,162,1,129,2,240,254,136,0,0,1,0,236, + 0,0,1,193,0,254,0,3,0,17,179,1,25,0,4,16,212,236,49,0,178,0,131,2,47,236,48,55,51,21,35,236,213,213,254,254,0,2,0,236, + 0,0,4,107,0,254,0,3,0,7,0,26,182,0,25,1,5,25,4,8,16,212,252,212,236,49,0,180,4,0,131,6,2,47,60,236,50,48,37,51, + 21,35,37,51,21,35,3,150,213,213,253,86,213,213,254,254,254,254,0,0,0,3,0,236,0,0,7,20,0,254,0,3,0,7,0,11,0,35,64,17, + 8,4,0,131,10,6,2,4,25,5,0,25,1,9,25,8,12,16,212,252,212,236,212,236,49,0,47,60,60,236,50,50,48,37,51,21,35,37,51,21, + 35,37,51,21,35,3,150,212,212,2,169,213,213,250,173,213,213,254,254,254,254,254,254,0,0,1,0,220,2,107,1,175,3,105,0,3,0,0,19,51, + 21,35,220,211,211,3,105,254,0,7,0,113,255,227,10,76,5,240,0,11,0,23,0,35,0,39,0,51,0,63,0,75,0,174,64,68,36,15,37,38, + 37,38,15,39,36,39,66,64,0,146,12,46,146,30,141,40,146,24,70,6,146,52,12,141,58,38,18,140,36,24,145,76,37,73,67,39,49,43,67,13, + 61,9,13,15,14,3,13,21,49,13,27,61,14,73,13,21,55,43,13,27,14,33,11,76,16,252,228,236,212,196,236,228,16,238,16,238,246,238,16,238, + 17,18,57,17,18,57,49,0,16,228,50,244,60,60,228,50,236,50,16,238,246,238,16,238,50,48,75,83,88,7,16,5,237,7,16,5,237,89,34,1, + 75,176,20,84,75,176,9,84,91,75,176,11,84,91,75,176,12,84,91,75,176,13,84,91,75,176,14,84,91,88,189,0,76,0,64,0,1,0,76,0, + 76,255,192,56,17,55,56,89,1,34,6,21,20,22,51,50,54,53,52,38,39,50,22,21,20,6,35,34,38,53,52,54,1,50,22,21,20,6,35,34, + 38,53,52,54,33,51,1,35,19,34,6,21,20,22,51,50,54,53,52,38,1,50,22,21,20,6,35,34,38,53,52,54,23,34,6,21,20,22,51,50, + 54,53,52,38,8,244,87,100,100,87,85,99,99,85,158,186,187,157,160,186,187,249,116,158,188,187,159,159,185,186,4,37,160,252,90,160,31,86,99,98, + 87,87,99,100,3,178,158,186,187,157,160,186,187,159,87,99,99,87,85,99,99,2,145,148,132,130,149,149,130,131,149,127,220,187,187,219,219,187,188,219, + 2,224,219,187,189,218,219,188,186,220,249,243,5,142,149,130,132,148,148,132,129,150,253,159,220,187,187,219,219,187,188,219,127,148,132,130,149,149,130,131, + 149,0,0,0,0,9,0,113,255,227,13,114,5,240,0,11,0,22,0,34,0,45,0,55,0,59,0,69,0,80,0,92,0,0,1,34,6,21,20,22, + 51,50,54,53,52,38,39,50,22,16,6,35,34,38,53,52,54,5,34,6,21,20,22,51,50,54,53,52,38,39,50,22,16,6,35,34,38,53,52,54, + 0,32,22,21,20,6,32,38,53,52,37,51,1,35,18,34,6,21,20,22,50,54,53,52,1,50,22,16,6,35,34,38,53,52,54,23,34,6,21,20, + 22,51,50,54,53,52,38,12,26,87,100,100,87,85,99,99,85,158,186,187,157,160,186,187,253,121,87,100,100,87,85,99,99,85,158,186,187,157,160,186, + 187,248,214,1,60,188,187,254,194,185,4,223,160,252,90,160,117,172,99,98,174,99,3,78,158,186,187,157,160,186,187,159,87,99,99,87,85,99,99,2, + 145,148,132,130,149,149,130,131,149,127,220,254,138,219,219,187,188,219,127,148,132,130,149,149,130,131,149,127,220,254,138,219,219,187,188,219,2,224,219,187, + 189,218,219,188,186,220,249,243,5,142,149,130,132,148,148,132,129,254,53,220,254,138,219,219,187,188,219,127,148,132,130,149,149,130,131,149,0,1,0,40, + 4,96,1,160,5,213,0,3,0,0,27,1,51,1,40,173,203,254,223,4,96,1,117,254,139,0,0,0,255,255,0,40,4,96,2,204,5,213,16,38, + 11,16,0,0,16,7,11,16,1,44,0,0,255,255,0,40,4,96,3,248,5,213,16,39,11,16,1,44,0,0,16,38,11,16,0,0,16,7,11,16, + 2,88,0,0,0,1,0,40,4,96,1,160,5,213,0,3,0,0,1,35,1,51,1,160,87,254,223,203,4,96,1,117,255,255,0,40,4,96,2,204, + 5,213,16,38,11,19,0,0,16,7,11,19,1,44,0,0,255,255,0,40,4,96,3,248,5,213,16,38,11,19,0,0,16,39,11,19,2,88,0,0, + 16,7,11,19,1,44,0,0,0,1,0,11,254,29,2,171,255,195,0,5,0,0,1,35,39,7,35,1,2,171,148,187,188,149,1,82,254,29,249,249, + 1,166,0,0,0,1,0,158,0,141,2,115,4,35,0,6,0,71,64,37,3,232,4,5,4,2,232,1,2,5,5,4,2,232,3,2,6,0,6,1, + 232,0,6,66,2,4,231,0,166,7,2,3,0,111,5,110,7,16,252,236,50,57,49,0,16,244,236,57,48,75,83,88,7,4,237,7,16,8,237,7, + 16,8,237,7,16,4,237,89,34,1,21,9,1,21,1,53,2,115,254,211,1,45,254,43,4,35,191,254,244,254,244,191,1,162,82,0,0,1,0,193, + 0,141,2,150,4,35,0,6,0,73,64,38,5,232,6,5,2,3,2,4,232,3,3,2,6,232,0,1,0,5,232,4,5,1,1,0,66,5,3,231, + 0,166,7,5,1,111,3,0,112,7,16,252,60,236,57,49,0,16,244,236,57,48,75,83,88,7,16,8,237,7,16,4,237,7,16,4,237,7,16,8, + 237,89,34,19,1,21,1,53,9,1,193,1,213,254,43,1,45,254,211,4,35,254,94,82,254,94,191,1,12,1,12,0,255,255,0,195,0,4,5,235, + 5,204,18,38,0,153,0,75,16,39,0,17,255,232,2,78,16,39,0,17,2,22,0,4,16,39,0,17,4,61,2,78,16,7,0,17,2,22,4,206, + 255,255,0,147,0,0,3,79,5,213,16,39,0,4,255,94,0,0,16,7,0,4,1,79,0,0,0,0,0,3,0,147,0,0,3,176,5,240,0,23, + 0,27,0,36,0,0,1,35,17,6,7,6,7,53,62,1,51,50,22,21,20,6,15,1,14,1,7,14,1,21,3,51,21,35,19,17,55,62,1,53, + 52,39,38,2,76,191,31,32,90,97,94,193,103,184,223,72,90,88,47,39,8,6,6,197,203,203,197,45,57,51,65,37,1,145,3,173,8,13,35,67, + 188,57,56,194,159,76,137,86,86,47,53,25,21,60,52,254,242,254,5,66,254,82,45,53,94,49,89,55,31,0,0,0,255,255,255,236,5,124,4,20, + 6,11,16,7,0,66,0,0,7,95,0,0,0,1,255,167,254,27,6,199,255,133,0,13,0,37,179,4,15,10,14,16,196,212,196,179,7,0,15,14, + 17,18,57,57,49,64,7,11,3,10,4,7,0,14,0,16,212,220,220,60,204,50,48,1,50,36,55,21,6,4,35,34,36,39,53,22,4,3,54,231, + 1,197,229,235,254,58,224,223,254,60,236,230,1,194,254,181,104,104,126,118,118,117,119,126,105,103,0,0,0,1,255,167,6,4,6,199,7,110,0,13, + 0,37,179,4,15,10,14,16,196,212,196,179,7,0,15,14,17,18,57,57,49,64,7,10,4,11,3,0,7,14,0,16,212,220,220,60,204,50,48,1, + 50,4,23,21,38,36,35,34,4,7,53,54,36,3,54,224,1,198,235,229,254,59,231,231,254,62,230,236,1,196,7,110,118,118,126,104,104,103,105,126, + 119,117,0,0,0,1,255,170,254,29,2,73,1,213,0,7,0,0,1,51,9,1,35,11,1,35,1,231,98,254,226,1,30,98,237,237,99,1,213,254, + 36,254,36,1,138,254,118,0,255,255,0,61,255,197,7,195,6,131,16,39,0,13,0,0,253,123,16,39,0,13,4,0,253,123,16,7,0,13,2,0, + 0,147,0,0,0,1,0,221,2,129,3,51,3,95,0,3,0,0,19,33,21,33,221,2,86,253,170,3,95,222,0,0,0,1,254,137,255,227,2,205, + 5,240,0,3,0,43,64,19,0,15,1,2,1,2,15,3,0,3,66,2,140,0,145,4,1,3,4,16,212,204,49,0,16,228,228,48,75,83,88,7, + 16,5,237,7,16,5,237,89,34,1,51,1,35,2,45,160,252,92,160,5,240,249,243,0,0,1,0,176,254,242,2,88,6,20,0,11,0,0,1,17, + 51,21,33,17,33,21,35,17,51,21,1,104,240,254,88,1,168,240,240,2,94,253,35,143,7,34,143,253,35,74,0,0,0,1,0,176,254,242,2,88, + 6,20,0,11,0,0,19,53,51,17,35,53,33,17,33,53,51,17,176,240,240,1,168,254,88,240,2,94,74,2,221,143,248,222,143,2,221,0,0,0, + 255,255,0,74,0,0,7,23,5,240,16,38,0,34,183,0,16,7,0,34,3,103,0,0,255,255,0,147,0,0,5,74,5,240,16,38,0,34,0,0, + 16,7,0,4,3,74,0,0,255,255,0,147,0,0,5,74,5,240,16,39,0,4,255,94,0,0,16,7,0,34,1,154,0,0,0,0,0,1,0,100, + 255,5,3,150,4,93,0,11,0,55,183,5,6,7,8,4,4,0,12,16,220,212,23,57,49,0,64,10,66,11,8,169,2,4,0,188,6,12,16,204, + 244,60,196,236,50,48,75,83,88,183,8,17,5,7,17,6,5,6,7,5,16,236,16,236,89,19,22,51,50,55,7,1,35,1,6,32,39,100,154,234, + 251,179,8,254,224,152,1,8,117,254,195,200,4,93,16,16,128,251,40,4,174,15,15,0,0,1,0,236,255,59,4,135,5,213,0,13,0,0,1,50, + 4,21,20,6,7,17,35,17,35,17,35,17,2,172,215,1,4,235,215,142,190,141,5,213,232,190,184,221,17,252,178,6,31,249,225,6,154,0,0,0, + 0,2,0,216,1,194,3,40,4,18,0,3,0,11,0,0,1,51,17,7,43,1,34,38,53,52,54,51,2,121,175,175,118,2,125,172,173,126,4,18, + 253,177,1,172,125,124,171,0,0,2,0,216,1,194,3,40,4,18,0,3,0,11,0,0,1,39,17,59,1,50,22,21,20,6,43,1,1,135,175,175, + 118,126,173,172,125,2,1,194,1,2,79,171,124,125,172,0,255,255,0,61,255,197,3,195,3,107,18,7,0,13,0,0,253,123,0,0,0,2,1,29, + 255,18,2,66,4,35,0,3,0,9,0,0,1,21,35,53,19,21,19,35,3,53,1,240,211,211,82,129,164,4,35,254,254,252,219,172,254,192,1,64, + 172,0,0,0,255,255,255,167,254,27,6,199,7,110,16,38,11,29,0,0,16,6,11,30,0,0,0,0,255,255,0,61,255,242,3,195,7,111,18,39, + 0,13,0,0,253,168,16,7,0,13,0,0,1,127,0,0,255,255,0,145,255,66,3,67,5,213,16,39,0,18,0,145,0,0,16,39,0,17,1,142, + 0,0,16,7,0,17,255,217,4,72,0,0,0,1,0,100,1,211,7,156,3,49,0,29,0,0,1,21,14,1,35,34,39,38,39,38,39,38,35,34, + 6,7,53,62,1,51,50,23,22,23,22,23,22,51,50,54,7,156,158,230,146,148,236,16,8,10,23,233,140,132,220,148,158,230,146,176,210,14,8,12, + 21,233,140,130,215,3,49,178,79,68,59,4,2,2,6,62,77,83,178,79,69,60,4,2,3,5,62,76,255,255,255,167,254,20,6,199,255,126,16,7, + 11,30,0,0,248,16,0,0,0,1,1,56,0,200,5,124,5,13,0,23,0,0,1,17,35,17,7,39,55,33,53,33,39,55,23,17,51,17,55,23, + 7,33,21,33,23,7,3,170,160,249,113,249,254,159,1,97,250,113,250,160,250,113,250,1,97,254,159,250,113,2,41,254,159,1,96,249,114,249,160,250, + 114,251,1,98,254,158,250,113,250,160,249,114,0,3,0,250,1,50,3,182,4,182,0,3,0,7,0,11,0,0,19,53,51,21,1,53,51,21,3,53, + 51,21,250,200,1,44,200,200,200,2,144,200,200,254,162,200,200,2,188,200,200,0,0,0,255,255,0,40,4,96,5,36,5,213,16,39,11,16,1,44, + 0,0,16,38,11,16,0,0,16,39,11,16,3,132,0,0,16,7,11,16,2,88,0,0,0,4,1,102,1,0,5,78,4,232,0,3,0,7,0,11, + 0,15,0,0,1,53,51,21,33,53,51,21,1,53,51,21,3,53,51,21,1,102,200,2,88,200,253,168,200,200,200,2,144,200,200,200,200,254,112,200, + 200,3,32,200,200,0,0,0,0,5,1,102,0,246,5,78,4,222,0,3,0,7,0,11,0,15,0,19,0,0,1,53,51,21,19,53,51,21,3,53, + 51,21,1,53,51,21,3,53,51,21,2,246,200,200,200,200,200,252,44,200,220,200,2,134,200,200,254,112,200,200,3,32,200,200,252,244,200,200,3,12, + 200,200,0,0,0,2,0,219,0,0,1,174,5,213,0,3,0,7,0,0,19,51,21,35,17,51,21,35,219,211,211,211,211,5,213,254,252,39,254,0, + 0,4,0,100,254,229,5,253,6,239,0,3,0,7,0,11,0,15,0,0,19,51,21,35,37,51,21,35,1,51,21,35,17,51,21,35,100,211,211,4, + 198,211,211,253,157,211,211,211,211,3,105,254,254,254,4,132,254,249,242,254,0,5,0,112,0,0,6,68,5,213,0,3,0,7,0,11,0,15,0,27, + 0,0,37,53,51,21,3,53,51,21,1,53,51,21,3,53,51,21,1,17,35,17,33,53,33,17,51,17,33,21,4,134,200,200,200,252,44,200,220,200, + 1,124,160,253,102,2,154,160,2,154,246,200,200,3,32,200,200,252,244,200,200,3,12,200,200,254,132,253,102,2,154,160,2,155,253,101,160,0,0,0, + 0,3,0,219,0,80,1,174,5,62,0,3,0,7,0,11,0,0,19,51,21,35,17,51,21,35,17,51,21,35,219,211,211,211,211,211,211,5,62,254, + 253,14,254,2,246,254,0,0,0,4,0,219,0,17,1,174,5,119,0,3,0,7,0,11,0,15,0,0,19,51,21,35,17,51,21,35,17,51,21,35, + 17,51,21,35,219,211,211,211,211,211,211,211,211,2,137,254,3,236,254,252,150,254,3,240,254,0,0,0,0,2,0,87,2,141,2,238,5,240,0,13, + 0,25,0,0,0,34,7,6,21,20,23,22,50,55,54,53,52,47,1,50,22,21,20,6,35,34,38,53,52,54,2,8,202,50,51,51,50,202,50,51, + 51,151,161,170,170,161,162,170,170,5,151,86,86,172,173,86,86,86,86,173,172,86,175,222,211,212,222,222,212,211,222,0,0,2,0,122,2,156,0,238, + 6,3,0,3,0,7,0,31,64,6,9,5,1,4,0,8,16,220,60,220,60,204,49,0,64,6,4,7,0,3,0,8,16,212,196,16,220,204,48,19, + 51,17,35,17,51,21,35,122,116,116,116,116,5,15,253,141,3,103,130,0,0,2,0,63,2,156,2,244,5,223,0,2,0,13,0,212,64,22,0,3, + 11,7,221,5,1,9,247,3,145,14,1,12,10,0,93,6,8,4,12,14,16,220,212,60,196,236,50,17,57,49,0,16,244,252,212,60,236,50,18,57, + 48,1,75,176,14,84,75,176,15,84,91,75,176,16,84,91,75,176,17,84,91,75,176,11,84,91,75,176,10,84,91,88,189,0,14,0,64,0,1,0, + 14,0,14,255,192,56,17,55,56,89,0,75,176,17,84,75,176,14,84,91,88,189,0,14,255,192,0,1,0,14,0,14,0,64,56,17,55,56,89,64, + 84,11,1,29,1,47,1,57,1,73,1,70,3,89,3,105,3,139,3,171,3,187,3,11,1,0,15,1,15,2,15,5,15,6,15,7,15,8,15,11, + 15,12,15,13,19,0,31,1,31,2,31,5,31,6,31,7,31,8,31,11,31,12,31,13,34,0,53,0,71,0,75,13,83,0,91,13,101,0,132,0, + 165,0,181,0,30,93,1,93,9,1,33,3,51,17,51,21,35,21,35,53,33,53,1,221,254,203,1,53,22,166,135,135,144,254,98,5,102,254,93,2, + 28,253,228,109,186,186,121,0,0,1,0,102,2,141,2,211,5,223,0,32,0,0,19,33,21,33,21,54,55,54,51,50,23,22,21,20,7,6,35,34, + 38,39,53,22,23,22,51,50,54,52,38,35,34,6,7,142,1,254,254,121,28,29,28,28,161,94,94,97,96,176,60,126,66,57,62,62,69,111,130,130, + 111,52,104,54,5,223,95,204,9,4,4,77,76,131,135,75,74,18,18,113,27,14,13,102,174,102,20,21,0,2,0,92,2,141,2,243,5,240,0,15, + 0,47,0,0,1,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,19,21,38,39,38,35,34,7,6,7,54,55,54,51,50,23,22,21,20,7, + 6,35,34,38,53,52,55,54,51,50,23,22,1,179,88,51,51,51,51,88,87,51,51,51,51,171,49,50,50,49,128,68,68,10,38,57,58,68,145,84, + 84,88,87,145,167,176,108,108,182,49,50,50,4,109,52,53,91,90,52,53,53,52,90,91,53,52,1,98,103,20,10,11,75,76,153,49,26,26,76,77, + 132,127,79,78,222,212,198,117,118,8,9,0,0,1,0,108,2,156,2,213,5,223,0,6,0,0,19,33,21,1,35,1,33,108,2,105,254,164,136,1, + 72,254,51,5,223,48,252,237,2,228,0,0,0,3,0,89,2,141,2,236,5,240,0,12,0,42,0,58,0,0,0,34,7,6,21,20,22,51,50,55, + 54,52,39,37,38,39,38,53,52,54,32,23,22,21,20,7,6,7,22,23,22,21,20,7,6,35,34,39,38,53,52,55,54,55,20,23,22,51,50,55, + 54,53,52,39,38,35,34,7,6,2,0,186,53,53,106,93,92,54,53,53,254,236,84,46,47,164,1,30,82,81,46,47,83,90,56,53,85,86,158,159, + 85,86,53,54,45,47,46,85,81,49,48,48,47,83,83,48,47,4,42,44,43,75,76,86,44,43,150,43,93,18,49,50,72,100,116,58,58,100,74,48, + 49,18,18,58,55,80,121,65,65,65,65,121,78,57,56,198,63,38,37,37,36,65,63,38,37,37,36,0,0,2,0,83,2,141,2,233,5,240,0,31, + 0,46,0,0,19,53,22,23,22,51,50,55,54,55,6,7,6,35,34,38,53,52,55,54,51,50,23,22,21,20,7,6,35,34,39,38,19,50,54,53, + 52,39,38,35,34,7,6,21,20,23,22,145,49,50,50,48,129,68,67,10,35,60,57,69,144,168,87,88,145,167,87,88,107,108,182,49,50,50,204,88, + 102,51,51,88,85,53,52,52,51,2,174,103,20,11,10,75,75,154,47,27,26,152,132,129,77,78,111,111,212,198,117,118,8,9,1,114,104,92,90,52, + 53,53,52,90,92,52,52,0,0,1,0,137,2,156,3,176,5,107,0,11,0,0,1,17,33,21,33,17,35,17,33,53,33,17,2,81,1,95,254,161, + 105,254,161,1,95,5,107,254,200,95,254,200,1,56,95,1,56,0,0,0,0,1,0,137,3,212,3,176,4,51,0,3,0,0,19,33,21,33,137,3, + 39,252,217,4,51,95,0,0,0,2,0,137,3,97,3,176,4,165,0,3,0,7,0,0,19,33,21,33,21,33,21,33,137,3,39,252,217,3,39,252, + 217,4,165,94,135,95,0,0,0,1,0,111,2,5,1,144,6,2,0,13,0,0,1,14,1,16,22,23,35,38,39,38,52,55,54,55,1,144,84,82, + 82,84,101,94,47,47,47,46,95,6,2,129,252,254,254,254,128,131,128,127,250,127,126,132,0,1,0,103,2,5,1,136,6,2,0,15,0,0,19,51, + 22,23,22,20,7,6,7,35,54,55,54,16,39,38,103,101,95,47,46,46,47,95,101,84,41,42,42,41,6,2,132,126,127,250,127,128,131,128,127,127, + 1,2,126,126,0,1,0,117,2,156,2,196,5,30,0,19,0,48,64,7,21,0,3,14,10,11,20,16,212,220,60,47,204,204,75,176,13,81,88,177, + 21,64,56,89,49,178,127,21,1,93,0,64,6,6,17,12,2,11,20,16,212,60,196,212,204,48,1,17,35,17,52,38,35,34,6,21,17,35,17,51, + 21,62,1,51,50,22,2,196,116,78,78,94,108,117,117,41,113,74,121,125,4,23,254,133,1,119,89,89,107,92,254,158,2,115,97,56,56,134,0,0, + 255,255,0,87,255,241,2,238,3,84,18,7,11,73,0,0,253,100,0,0,255,255,0,137,0,0,2,197,3,67,18,7,0,123,0,0,253,100,0,0, + 255,255,0,94,0,0,2,180,3,84,18,7,0,116,0,0,253,100,0,0,255,255,0,98,255,241,2,205,3,84,18,7,0,117,0,0,253,100,0,0, + 255,255,0,63,0,0,2,244,3,67,18,7,11,75,0,0,253,100,0,0,255,255,0,102,255,241,2,211,3,67,18,7,11,76,0,0,253,100,0,0, + 255,255,0,92,255,241,2,243,3,84,18,7,11,77,0,0,253,100,0,0,255,255,0,108,0,0,2,213,3,67,18,7,11,78,0,0,253,100,0,0, + 255,255,0,89,255,241,2,236,3,84,18,7,11,79,0,0,253,100,0,0,255,255,0,83,255,241,2,233,3,84,18,7,11,80,0,0,253,100,0,0, + 255,255,0,137,0,0,3,176,2,207,18,7,11,81,0,0,253,100,0,0,255,255,0,137,1,56,3,176,1,151,18,7,11,82,0,0,253,100,0,0, + 255,255,0,137,0,197,3,176,2,9,18,7,11,83,0,0,253,100,0,0,255,255,0,111,255,105,1,144,3,102,18,7,11,84,0,0,253,100,0,0, + 255,255,0,103,255,105,1,136,3,102,18,7,11,85,0,0,253,100,0,0,255,255,0,77,255,240,2,161,2,130,18,7,8,162,0,0,253,100,0,0, + 255,255,0,71,255,240,2,213,2,130,18,7,8,168,0,0,253,100,0,0,255,255,0,71,255,240,2,207,2,130,18,7,8,177,0,0,253,100,0,0, + 255,255,0,117,0,0,3,33,2,115,18,7,2,165,0,0,253,100,0,0,255,255,0,71,255,240,2,213,2,130,18,7,8,169,0,0,253,100,0,0, + 255,255,0,117,0,0,2,196,3,103,18,7,2,114,0,0,253,100,0,0,255,255,0,117,0,0,2,231,3,103,18,7,8,174,0,0,253,100,0,0, + 255,255,0,122,0,0,0,238,3,103,18,7,2,163,0,0,253,100,0,0,255,255,0,117,0,0,4,123,2,130,18,7,8,175,0,0,253,100,0,0, + 255,255,0,117,0,0,2,196,2,130,18,7,11,86,0,0,253,100,0,0,255,255,0,117,255,17,2,236,2,130,18,7,8,181,0,0,253,100,0,0, + 255,255,0,117,0,0,2,144,2,147,18,7,2,164,0,0,253,100,0,0,255,255,0,35,0,0,1,219,3,37,18,7,8,182,0,0,253,100,0,0, + 0,1,0,86,0,0,6,174,5,214,0,35,0,0,1,14,1,35,34,0,16,0,51,50,22,23,21,46,1,35,34,6,16,22,51,50,54,55,17,33, + 21,33,17,33,21,33,17,33,21,33,3,221,79,178,99,254,254,219,1,37,254,101,177,78,76,173,98,192,204,204,192,98,173,76,2,196,253,211,2,22, + 253,234,2,58,253,47,1,184,54,54,1,55,2,28,1,55,53,54,159,71,70,234,254,68,234,70,71,2,10,128,254,181,128,254,107,128,0,3,0,115, + 255,166,4,190,6,57,0,39,0,46,0,52,0,0,1,22,23,55,51,7,22,23,21,38,39,1,51,50,54,55,21,14,1,35,34,39,7,35,55,38, + 39,7,35,55,38,39,38,17,16,55,54,37,55,51,7,6,7,6,17,20,23,1,38,39,1,22,23,3,104,65,62,30,155,47,40,37,58,64,254,193, + 18,119,211,93,97,216,121,27,26,18,155,25,65,57,38,155,65,19,17,178,178,160,1,8,21,156,227,145,88,125,82,2,52,62,67,254,193,53,65,5, + 235,8,19,105,165,22,28,213,60,41,251,151,94,95,211,72,72,2,63,87,18,30,135,230,18,21,207,1,103,1,104,208,185,20,75,252,31,112,157,254, + 216,238,148,3,203,19,4,251,149,40,21,0,0,1,0,96,255,228,4,179,5,240,0,44,0,0,37,54,55,54,55,21,14,1,35,32,0,17,16,0, + 33,50,22,23,21,46,1,35,34,2,17,16,23,22,23,17,51,21,62,1,51,50,22,31,1,46,1,35,34,6,21,3,46,97,88,106,93,97,217,121, + 254,202,254,155,1,101,1,54,123,217,95,93,212,119,234,249,124,94,153,152,48,154,110,15,38,23,1,26,60,36,128,139,138,7,39,47,95,211,72,71, + 1,158,1,103,1,104,1,159,71,71,213,95,94,254,199,254,216,254,217,156,117,30,3,93,157,92,89,4,5,170,16,15,182,171,0,0,0,1,0,133, + 0,0,4,203,5,213,0,17,0,0,1,17,33,21,33,17,33,21,33,17,51,21,35,17,35,17,35,53,1,113,3,90,253,112,2,80,253,176,250,250, + 202,236,1,126,4,87,170,254,72,170,254,181,69,254,199,1,57,69,0,0,0,1,0,129,0,0,4,98,5,240,0,35,0,0,1,17,33,21,33,53, + 51,17,35,53,51,53,35,53,51,53,16,54,51,50,22,23,21,46,1,35,34,6,29,1,33,21,33,21,33,21,2,53,2,45,252,31,236,191,191,199, + 199,214,232,61,151,79,76,136,61,148,116,1,135,254,121,1,143,1,236,254,190,170,170,1,66,143,143,143,95,1,5,243,31,29,182,41,41,155,212,72, + 143,143,143,0,0,1,0,186,255,66,7,29,5,30,0,43,0,0,5,35,1,38,39,38,35,34,7,6,21,17,35,17,51,21,54,55,54,51,50,23, + 22,23,19,51,7,54,51,50,22,21,17,35,17,52,38,35,34,6,21,17,35,17,2,204,170,1,109,5,52,57,119,141,83,83,185,185,62,89,88,121, + 122,85,54,37,133,170,88,92,120,175,190,185,114,117,143,166,185,190,3,120,141,71,77,95,97,162,253,135,4,96,174,102,50,49,62,38,62,1,69,214, + 51,246,225,253,92,2,158,161,156,190,164,253,135,1,29,0,0,5,0,117,0,0,5,135,5,213,0,2,0,6,0,34,0,38,0,41,0,0,1,39, + 21,19,39,35,21,3,33,19,51,17,51,17,51,21,35,21,51,21,35,17,33,3,35,17,35,17,35,53,51,53,35,53,51,5,23,51,53,3,23,53, + 2,75,79,182,56,126,196,1,16,211,229,196,195,195,195,195,254,240,211,229,196,195,195,195,195,2,18,56,126,79,79,3,175,206,206,254,242,147,147,3, + 52,253,218,2,38,253,218,123,147,123,253,218,2,38,253,218,2,38,123,147,123,123,147,147,254,242,206,206,0,2,0,201,255,227,9,206,5,213,0,8, + 0,80,0,0,1,17,51,50,54,53,52,38,35,1,6,7,6,43,1,17,35,17,33,50,23,22,23,51,17,51,17,33,21,33,17,20,22,59,1,53, + 30,1,51,50,54,53,52,38,47,1,46,1,53,52,54,51,50,22,23,21,46,1,35,34,6,21,20,22,31,1,30,1,21,20,6,35,34,38,39,53, + 35,34,38,53,17,1,135,239,133,145,145,133,1,221,6,113,122,236,239,190,1,173,236,122,87,24,81,174,1,101,254,155,71,108,171,96,187,91,122,132, + 95,161,60,161,143,211,194,96,169,72,74,158,85,129,129,93,139,59,185,155,233,203,85,183,102,171,201,152,5,47,253,207,146,135,134,146,254,204,200,106, + 113,253,168,5,213,113,82,136,1,62,254,194,143,253,160,137,78,35,53,53,89,81,75,80,37,15,36,149,130,158,172,30,30,174,40,40,84,84,64,73, + 33,14,42,153,137,156,182,35,35,1,159,210,2,96,0,0,0,2,0,201,255,227,8,51,5,213,0,7,0,69,0,0,1,17,51,50,54,16,38,35, + 1,23,35,3,46,1,43,1,17,35,17,33,32,22,21,20,6,7,30,1,31,1,22,23,22,51,50,54,53,52,38,47,1,46,1,53,52,54,51,50, + 22,23,21,46,1,35,34,6,21,20,22,31,1,30,1,21,20,6,35,34,39,38,1,147,254,146,149,149,146,2,191,4,217,191,74,139,120,220,202,1, + 200,1,0,252,131,125,65,123,62,91,98,96,99,97,130,140,101,171,64,171,152,224,206,102,180,76,78,168,90,137,137,98,148,63,196,165,247,216,90,97, + 44,5,47,253,238,135,1,6,133,250,216,7,1,127,150,98,253,137,5,213,214,216,141,186,36,22,144,126,180,51,25,27,89,81,75,80,37,15,36,149, + 130,158,172,30,30,174,40,40,84,84,64,73,33,14,42,153,137,156,182,18,8,0,0,0,0,6,0,59,0,0,7,174,5,213,0,31,0,34,0,38, + 0,41,0,45,0,49,0,0,19,39,35,53,51,39,51,23,33,55,51,23,33,55,51,7,51,21,35,7,51,21,35,3,35,3,35,3,35,3,35,53, + 5,27,1,1,23,33,55,1,27,2,7,51,39,33,23,33,55,182,30,93,58,49,204,48,2,19,48,227,48,2,19,48,205,49,57,93,29,122,158,225, + 254,218,195,220,254,224,159,4,192,165,165,254,117,29,1,145,29,251,32,165,165,229,29,125,28,253,76,29,1,145,29,4,15,117,143,194,194,194,194,194, + 194,143,117,143,252,128,3,128,252,128,3,128,143,143,253,103,2,153,1,4,117,117,254,252,253,103,2,153,1,4,117,117,117,117,0,0,0,2,0,95, + 255,227,5,241,5,213,0,13,0,27,0,0,19,37,32,0,25,1,35,17,52,38,35,33,17,35,41,1,34,0,25,1,51,17,20,22,51,33,3,51, + 95,2,7,0,255,1,6,184,157,176,254,177,184,5,142,253,253,255,254,250,184,157,176,1,83,4,184,5,210,3,254,214,254,220,254,145,1,86,240,211, + 250,178,1,42,1,36,1,111,254,170,240,211,5,78,0,0,255,255,0,113,254,192,4,244,6,20,16,38,0,211,0,0,16,7,2,143,0,138,0,0, + 0,1,0,0,255,227,4,143,5,240,0,49,1,28,64,58,32,18,211,34,16,43,7,211,9,25,161,26,174,22,149,29,1,161,0,174,4,149,47,145, + 29,140,41,9,50,43,34,33,41,35,38,18,16,10,3,13,9,17,8,44,32,38,19,7,17,8,17,13,28,25,0,38,42,33,47,60,212,196,50,252, + 196,196,18,57,57,18,57,57,17,18,57,17,23,57,18,57,57,17,57,57,49,0,16,196,50,228,244,236,244,236,16,238,246,238,16,238,50,221,60,238, + 50,48,1,75,176,9,84,75,176,12,84,91,75,176,13,84,91,75,176,15,84,91,75,176,23,84,91,75,176,24,84,91,88,189,0,50,255,192,0,1, + 0,50,0,50,0,64,56,17,55,56,89,64,122,14,0,14,1,11,2,11,49,84,20,105,12,108,14,110,15,111,16,111,17,111,18,111,19,105,20,107, + 31,111,32,111,33,111,34,111,35,110,36,108,37,105,39,105,45,159,7,159,8,159,9,159,10,159,11,159,12,159,13,159,14,159,15,159,16,159,17,159, + 18,159,19,150,31,159,32,159,33,159,34,159,35,159,36,159,37,159,38,159,39,159,40,159,41,159,42,159,43,159,44,157,45,50,0,8,0,9,16,8, + 16,9,32,8,32,9,85,21,83,30,106,21,103,31,10,93,0,93,1,21,46,1,35,34,6,7,33,7,33,14,1,21,20,22,23,33,7,33,30,1, + 51,50,54,55,21,14,1,35,34,0,3,35,55,51,52,38,53,52,54,53,35,55,51,18,0,51,50,22,4,143,91,169,102,157,202,32,2,65,55,253, + 230,2,1,1,2,1,190,56,254,138,32,202,157,102,169,91,89,185,96,237,254,203,40,211,55,139,1,1,194,55,156,40,1,54,236,98,185,5,98,213, + 105,90,200,187,123,24,46,35,32,46,24,123,187,202,90,105,211,72,72,1,34,1,3,123,23,47,32,35,47,23,123,1,1,1,34,71,0,1,0,40, + 0,0,5,22,5,213,0,17,0,0,19,17,51,17,1,51,1,33,21,33,1,35,1,17,35,17,35,53,191,189,2,117,243,253,128,1,170,254,88,2, + 176,249,253,95,189,151,3,84,2,129,253,137,2,119,253,127,115,253,31,2,207,253,49,2,225,115,0,0,0,1,0,20,0,0,5,3,5,213,0,23, + 0,0,1,17,33,53,33,21,33,17,55,23,5,21,55,23,5,17,35,17,7,39,37,53,7,39,2,38,253,238,4,239,253,238,229,80,254,203,230,80, + 254,202,203,231,77,1,52,232,77,3,141,1,158,170,170,254,241,161,111,216,136,162,111,217,253,184,1,186,161,110,217,136,162,110,0,0,0,5,0,208, + 254,57,9,164,5,240,0,22,0,45,0,98,0,119,0,131,0,0,1,39,19,54,55,62,1,51,50,22,23,22,21,20,7,6,7,6,35,34,39,38, + 39,19,34,7,6,7,6,21,20,23,22,51,50,54,55,54,55,54,53,52,39,38,39,38,5,54,55,19,6,7,6,7,6,7,39,62,1,55,54,51, + 50,4,23,30,1,21,20,7,6,7,14,1,7,6,7,6,35,34,39,46,1,39,38,47,1,6,7,6,35,34,39,38,53,52,54,51,50,1,3,6, + 7,23,22,23,22,51,50,54,55,54,55,54,53,52,39,38,39,38,1,38,35,34,7,6,21,20,23,22,51,50,7,8,185,162,34,62,49,150,97,74, + 123,37,65,48,49,81,91,87,55,62,47,30,247,87,49,12,16,10,23,32,62,36,60,24,20,19,17,29,12,24,20,249,185,12,11,180,46,32,35,24, + 21,17,174,26,100,67,119,175,203,1,45,94,85,82,28,26,66,36,96,62,68,76,95,75,62,46,51,98,32,64,15,15,18,21,78,92,117,76,77,132, + 105,73,1,228,177,25,21,40,83,51,57,53,108,154,57,44,28,24,30,31,56,132,253,71,40,47,38,14,13,23,23,32,45,254,57,41,2,208,151,105, + 82,109,58,51,88,146,119,100,103,55,63,32,23,50,1,248,106,26,55,35,61,53,40,54,36,32,27,54,50,57,84,47,20,12,11,183,40,50,3,77, + 10,20,22,33,29,58,53,83,125,36,64,123,109,98,245,129,113,140,130,126,69,115,47,52,24,29,9,10,45,19,38,10,10,34,23,84,65,66,96,93, + 133,3,146,252,155,124,64,27,56,22,25,134,110,82,128,107,99,100,93,97,67,156,251,160,34,14,14,15,24,15,14,0,0,2,0,46,255,227,4,142, + 5,240,0,41,0,53,0,0,19,39,54,51,50,23,22,51,50,55,38,53,52,55,54,51,50,23,22,21,20,7,22,21,20,7,6,35,53,50,55,54, + 53,52,39,6,35,34,39,38,35,34,37,54,53,52,39,38,35,34,7,6,21,20,185,139,147,111,124,64,88,34,48,55,227,80,89,136,116,97,84,107, + 181,126,106,252,134,91,73,119,137,109,113,74,50,53,51,2,48,68,27,35,50,52,33,25,2,4,96,240,78,107,66,177,254,172,88,96,96,83,177,227, + 171,163,191,194,134,113,162,74,60,147,88,114,126,104,70,217,108,175,86,49,63,63,48,87,166,0,0,0,0,4,0,68,0,0,4,162,5,213,0,29, + 0,36,0,43,0,49,0,0,19,53,35,53,51,17,33,50,23,22,23,51,21,35,22,20,7,51,21,35,6,7,6,43,1,17,35,17,35,53,5,33, + 21,51,50,55,54,1,33,38,39,38,43,1,5,33,21,33,54,52,151,82,82,1,200,251,129,76,31,92,72,1,1,71,90,31,77,129,251,254,202,83, + 3,28,254,1,254,141,77,23,254,17,1,255,16,23,77,141,254,2,35,253,221,2,35,2,3,236,86,116,1,31,113,68,106,116,21,44,21,116,107,68, + 113,253,168,3,120,116,116,122,73,22,1,89,27,21,73,237,86,21,44,0,0,2,0,93,255,91,4,177,6,120,0,36,0,45,0,0,5,35,53,38, + 39,38,17,16,55,54,55,53,51,21,22,23,22,23,21,38,39,38,39,17,54,55,54,55,17,35,53,33,17,6,7,6,7,39,17,6,7,6,17,16, + 23,22,2,249,140,223,137,168,168,137,223,140,105,96,112,94,95,107,98,107,78,63,72,57,120,1,34,99,120,104,117,140,133,79,111,111,79,165,143,31, + 167,204,1,109,1,110,205,166,31,143,137,4,31,36,70,215,95,48,44,4,251,63,2,17,18,39,1,145,166,253,127,83,42,37,5,178,4,167,32,108, + 153,254,209,254,210,153,108,0,0,3,0,16,0,0,5,5,5,213,0,23,0,27,0,30,0,0,19,53,33,19,51,19,33,21,33,23,51,21,35,19, + 35,3,33,3,35,19,35,53,51,55,51,7,33,47,1,51,3,51,1,49,181,229,181,1,48,254,251,71,190,147,181,210,170,254,6,170,213,181,146,189, + 73,193,67,1,169,68,250,210,105,3,82,123,2,8,253,248,123,207,123,253,248,2,8,253,248,2,8,123,207,207,207,123,1,65,0,0,0,1,0,117, + 255,227,5,188,5,240,0,54,0,0,1,54,55,54,55,33,53,33,54,55,54,53,52,38,35,34,6,7,53,62,1,51,50,4,21,20,7,51,21,33, + 6,15,1,33,21,33,6,21,20,22,51,50,54,55,21,14,1,35,32,36,53,52,55,35,53,1,92,4,22,74,128,254,53,3,146,12,13,59,179,165, + 95,204,115,114,218,105,245,1,23,25,175,254,253,103,216,67,2,133,252,83,49,188,173,114,236,123,128,239,106,254,231,254,221,18,168,2,161,7,22,74, + 44,123,8,9,43,107,118,128,54,55,197,38,38,228,198,85,66,123,92,42,13,123,59,94,126,136,70,69,208,47,48,224,217,75,63,123,0,2,0,165, + 254,211,4,114,6,20,0,31,0,42,0,0,1,21,46,1,35,17,50,54,55,21,6,7,6,7,17,35,17,38,39,38,19,53,16,55,54,55,53,51, + 21,22,23,22,1,3,6,7,6,7,6,23,22,23,22,4,114,92,168,101,101,168,92,90,92,88,91,100,185,116,212,1,212,121,178,101,93,88,92,254, + 139,1,91,67,118,15,14,14,25,108,67,4,164,213,105,90,251,241,90,105,211,72,36,34,2,254,240,1,21,22,118,214,1,57,17,1,66,203,116,23, + 232,226,2,34,36,251,164,3,249,22,67,117,170,161,102,180,108,67,0,0,0,2,0,20,0,0,5,3,5,213,0,3,0,11,0,0,19,33,21,33, + 21,33,21,33,17,35,17,33,20,4,239,251,17,4,239,253,238,203,253,238,5,213,170,120,170,251,247,4,9,0,0,0,0,1,0,106,0,0,4,175, + 5,213,0,38,0,0,19,55,33,7,33,22,23,33,7,35,6,7,6,7,22,23,22,23,19,35,3,38,39,38,43,1,53,51,50,55,54,55,33,55, + 33,38,39,38,35,106,55,4,14,55,254,158,79,21,1,53,55,246,5,61,65,125,65,61,59,65,205,217,191,75,68,70,120,220,254,146,74,68,6,253, + 190,55,2,0,18,45,74,146,5,90,123,123,78,129,123,126,85,93,36,22,72,68,130,254,104,1,127,151,48,49,166,67,62,114,123,67,52,88,0,0, + 0,1,0,10,0,5,5,50,5,218,0,27,0,0,1,16,7,6,33,35,17,7,39,37,53,7,39,37,17,51,17,55,23,5,21,55,23,5,17,32, + 0,17,5,50,204,204,254,80,172,230,78,1,52,232,76,1,52,202,230,80,254,202,232,80,254,200,1,53,1,31,2,241,254,126,181,181,2,30,161,110, + 216,137,162,110,217,1,228,254,170,162,111,217,136,163,111,218,253,251,1,24,1,46,0,0,0,1,252,18,5,21,255,203,6,20,0,5,0,0,1,19, + 51,7,33,21,252,18,218,126,132,2,229,5,21,0,255,155,100,0,0,0,0,1,252,61,5,21,255,246,6,20,0,5,0,0,3,33,53,33,39,51, + 10,252,71,2,229,132,126,5,21,100,155,0,0,1,252,61,4,122,255,203,6,20,0,8,0,0,3,33,23,35,39,55,51,7,33,53,253,27,132,126, + 175,175,126,132,2,229,5,21,155,205,205,155,0,1,252,61,4,122,255,203,6,20,0,8,0,0,1,53,33,39,51,23,7,35,55,252,61,2,229,132, + 126,175,175,126,132,5,21,100,155,205,205,155,0,4,252,19,4,123,255,236,6,16,0,3,0,7,0,11,0,12,0,0,1,51,21,35,37,51,21,35, + 37,51,21,35,23,252,19,203,203,3,14,203,203,254,121,203,203,102,6,16,202,202,202,202,202,203,0,0,0,5,251,80,4,123,0,176,6,16,0,3, + 0,7,0,11,0,15,0,16,0,0,3,51,21,35,37,51,21,35,37,51,21,35,37,51,21,35,5,27,203,203,251,107,203,203,3,14,203,203,254,121, + 203,203,1,41,6,16,202,202,202,202,202,202,202,203,0,0,0,1,252,61,4,122,255,203,6,20,0,13,0,0,1,23,35,39,55,51,7,33,39,51, + 23,7,35,55,252,230,132,126,175,175,126,132,2,60,132,126,175,175,126,132,5,21,155,205,205,155,155,205,205,155,0,0,0,4,0,67,255,207,7,216, + 6,4,0,10,0,36,0,40,0,66,0,0,1,34,6,21,20,22,51,50,54,61,1,55,17,35,53,14,1,35,34,38,53,52,54,51,23,52,38,35, + 34,6,7,53,62,1,51,50,22,37,51,1,35,1,21,46,1,35,34,6,21,20,22,51,50,54,55,21,14,1,35,34,38,53,52,54,51,50,22,2, + 15,160,112,83,72,102,127,188,188,3,153,109,141,166,205,198,169,111,103,68,129,99,92,148,71,194,193,2,176,216,252,68,216,5,169,94,111,56,121,137, + 137,121,56,111,94,73,130,73,202,236,238,209,67,128,3,246,66,82,67,73,148,130,10,77,254,13,62,5,79,158,129,150,155,6,87,92,32,55,178,36, + 30,202,250,249,203,3,132,178,52,30,156,148,147,157,31,52,177,34,27,250,209,212,249,27,0,4,0,67,255,207,7,254,6,4,0,32,0,43,0,69, + 0,73,0,0,1,46,1,52,54,4,23,21,39,38,35,34,21,20,22,31,1,30,1,20,6,35,38,39,53,23,22,51,50,53,52,38,39,1,34,6, + 21,20,22,51,50,54,61,1,55,17,35,53,14,1,35,34,38,53,52,54,51,23,52,38,35,34,6,7,53,62,1,51,50,22,37,51,1,35,6,86, + 135,127,185,1,78,122,36,112,129,180,59,105,48,153,137,202,170,175,145,37,147,139,177,61,123,251,137,160,112,83,72,102,127,188,188,3,153,109,141,166, + 205,198,169,111,103,68,129,99,92,148,71,194,193,2,176,216,252,68,216,1,125,28,124,239,142,1,52,188,18,57,100,36,44,24,10,33,127,243,149,6, + 53,202,19,76,102,44,49,27,2,132,66,82,67,73,148,130,10,77,254,13,62,5,79,158,129,150,155,6,87,92,32,55,178,36,30,202,250,249,203,0, + 0,2,0,115,255,227,5,39,5,240,0,24,0,33,0,0,1,21,46,1,35,34,7,17,22,51,50,54,55,21,14,1,35,32,0,17,16,0,33,50, + 22,1,17,6,7,6,17,16,23,22,5,39,89,232,151,163,121,121,163,151,232,89,106,237,132,254,173,254,122,1,134,1,83,134,237,253,11,35,31,157, + 157,31,5,98,118,65,90,52,251,45,52,90,66,117,72,72,1,159,1,103,1,104,1,159,71,251,19,4,91,27,33,172,254,186,254,187,172,33,0,0, + 255,255,0,195,255,227,8,109,5,240,16,38,0,114,0,0,16,7,0,38,3,70,0,0,0,2,255,214,0,0,5,24,5,213,0,8,0,43,0,153, + 184,0,44,47,184,0,45,47,184,0,21,220,184,0,0,220,184,0,44,16,184,0,40,208,184,0,40,47,184,0,4,220,65,27,0,22,0,4,0,38, + 0,4,0,54,0,4,0,70,0,4,0,86,0,4,0,102,0,4,0,118,0,4,0,134,0,4,0,150,0,4,0,166,0,4,0,182,0,4,0,198, + 0,4,0,214,0,4,0,13,93,65,5,0,229,0,4,0,245,0,4,0,2,93,184,0,0,16,184,0,9,208,184,0,21,16,184,0,11,208,184,0, + 21,16,184,0,31,208,184,0,0,16,184,0,35,208,0,184,0,10,47,186,0,33,0,34,0,3,43,184,0,33,16,48,49,1,6,7,6,21,20,23, + 22,23,17,53,51,21,22,23,22,23,21,38,39,38,39,17,54,55,54,55,21,6,7,6,7,21,33,21,33,53,38,39,38,17,16,55,54,1,119,73, + 51,99,99,51,73,202,56,54,81,76,78,78,55,56,56,55,78,78,77,82,52,56,2,215,252,95,161,107,149,151,105,4,179,29,58,114,205,205,113,59, + 29,3,212,122,110,4,11,18,35,172,43,22,15,4,252,164,4,16,21,43,170,36,18,11,4,42,170,222,32,114,159,1,14,1,18,157,110,0,0,0, + 0,4,0,60,255,207,7,229,6,4,0,25,0,29,0,40,0,50,0,0,1,21,46,1,35,34,6,21,20,22,51,50,54,55,21,14,1,35,34,38, + 53,52,54,51,50,22,37,51,1,35,1,34,6,21,20,22,51,50,54,16,38,36,32,22,21,20,6,32,38,53,52,3,6,94,111,56,121,137,137,121, + 56,111,94,73,130,73,202,236,238,209,67,128,2,221,216,252,68,216,4,107,97,118,118,97,96,119,119,254,223,1,130,218,218,254,126,217,5,151,178,52, + 30,156,148,147,157,31,52,177,34,29,252,209,212,249,27,75,249,203,3,4,158,146,145,159,160,1,32,160,157,248,213,212,248,248,212,213,0,3,0,60, + 255,207,8,77,6,4,0,19,0,45,0,49,0,0,1,17,51,17,20,22,51,50,54,53,17,51,17,35,53,14,1,35,34,38,1,21,46,1,35,34, + 6,21,20,22,51,50,54,55,21,14,1,35,34,38,53,52,54,51,50,22,37,51,1,35,5,92,188,81,80,99,117,188,188,6,144,96,158,161,253,170, + 94,111,56,121,137,137,121,56,111,94,73,130,73,202,236,238,209,67,128,2,221,216,252,68,216,1,76,2,16,253,245,114,105,129,117,1,240,252,144,68, + 9,80,193,4,255,178,52,30,156,148,147,157,31,52,177,34,29,252,209,212,249,27,75,249,203,0,0,0,255,255,0,164,255,227,4,123,5,240,16,6, + 1,82,0,0,255,255,0,111,254,214,5,35,4,227,16,7,3,193,0,0,254,243,0,0,255,255,0,195,0,0,7,38,5,240,16,38,0,114,0,0, + 16,7,0,41,3,3,0,0,0,1,0,73,255,227,7,140,5,251,0,111,0,0,1,15,1,17,33,54,55,54,55,54,51,50,23,22,21,20,7,6, + 35,34,39,38,35,34,7,6,7,6,7,6,17,20,23,22,23,22,51,50,55,54,55,23,6,7,6,35,34,39,38,39,38,53,52,55,33,20,7,6, + 7,6,35,34,39,38,53,52,54,51,50,23,22,23,22,23,22,51,50,55,54,55,54,25,1,34,7,6,7,6,21,20,23,22,31,1,20,7,6,35, + 34,39,38,39,38,53,52,55,54,55,54,51,50,22,3,191,2,108,1,248,40,57,66,75,99,123,61,20,38,27,37,20,22,29,37,48,51,33,40,26, + 22,26,40,26,33,44,22,55,29,51,57,31,37,55,29,96,108,71,59,55,29,28,13,254,19,50,53,93,173,185,104,66,52,44,39,53,15,18,11,22, + 9,39,66,91,81,70,36,37,136,93,99,39,71,9,2,9,9,18,37,33,24,29,20,9,8,125,75,114,126,147,44,167,5,234,31,49,253,188,209,140, + 152,73,103,20,41,29,42,26,33,28,38,33,40,68,59,119,214,254,189,165,130,125,44,22,55,53,59,33,95,39,93,55,58,121,125,169,91,180,207,158, + 163,92,174,64,52,62,35,44,15,18,33,44,11,39,81,70,170,167,0,255,2,106,22,26,40,74,71,31,52,16,36,36,44,16,42,29,18,41,47,57, + 132,121,75,35,37,6,0,0,0,1,0,2,254,249,5,139,5,217,0,80,0,0,5,55,22,51,50,55,54,55,54,55,54,53,52,39,38,39,38,35, + 34,6,7,22,23,22,7,2,7,38,39,38,34,7,39,54,51,50,23,54,53,52,39,38,39,38,53,52,55,54,55,22,23,22,55,54,55,21,14,2, + 35,34,39,38,39,6,7,6,21,20,23,54,55,50,23,22,21,16,7,0,35,34,3,42,105,40,88,37,31,35,27,26,18,13,27,28,49,70,130,83, + 176,69,47,11,13,24,203,79,46,53,53,70,117,22,189,80,85,91,81,70,91,48,48,114,108,211,126,156,27,34,5,145,75,73,125,33,59,73,70,115, + 59,31,31,110,161,237,242,157,59,95,254,233,84,94,205,140,81,31,31,55,57,125,119,178,150,94,108,46,71,137,121,114,92,91,52,254,250,79,57,37, + 35,105,35,222,94,77,88,59,128,165,121,118,64,99,141,132,147,125,7,1,26,2,101,46,73,68,92,26,22,55,73,59,62,50,86,231,167,137,117,211, + 176,254,162,211,254,254,0,0,0,3,0,201,0,0,6,3,5,213,0,3,0,7,0,19,0,0,1,17,51,17,33,17,51,17,37,33,17,33,17,33, + 17,33,17,33,17,33,4,213,202,251,142,202,254,210,1,146,2,22,1,146,254,110,253,234,254,110,5,113,250,243,5,13,250,243,5,13,100,253,136,2, + 120,250,43,2,219,253,37,0,0,1,0,72,0,0,4,135,6,20,0,25,0,0,1,3,35,19,62,1,53,52,38,35,34,6,7,3,35,1,51,3, + 62,1,51,50,22,21,20,6,4,117,131,185,131,9,10,106,95,148,217,32,121,184,1,47,184,119,70,218,120,148,163,9,2,164,253,92,2,157,47,72, + 21,84,94,200,166,253,147,6,20,253,156,94,109,160,145,36,82,0,0,0,0,1,0,90,0,0,4,135,6,20,0,25,0,0,1,51,7,37,23,5, + 3,54,51,50,22,7,3,35,19,18,35,34,6,7,3,35,19,7,39,55,1,136,185,45,1,141,14,254,80,52,170,231,193,151,45,131,184,130,62,248, + 149,209,32,123,185,223,209,14,245,6,20,234,124,97,136,254,245,201,239,232,253,92,2,158,1,61,190,164,253,135,4,127,66,99,76,0,0,1,0,59, + 255,225,3,116,5,240,0,57,0,0,1,15,1,17,16,7,6,35,34,39,38,53,52,55,54,51,50,23,22,23,22,23,22,51,50,55,54,55,54,53, + 17,34,7,6,7,6,21,20,23,20,22,21,20,7,6,35,34,39,38,53,52,55,54,55,54,51,50,22,3,116,30,104,193,130,143,110,60,55,16,26, + 35,27,31,8,11,11,27,20,59,75,81,62,33,31,124,90,97,44,52,6,20,31,22,24,26,22,40,88,77,139,149,181,33,125,5,227,44,22,252,254, + 254,134,194,130,60,55,68,57,15,27,35,7,55,46,27,19,77,61,134,132,190,3,17,26,29,46,49,63,27,22,4,64,9,39,31,18,22,40,77,127, + 88,73,40,39,13,0,0,0,0,2,0,106,255,227,5,70,5,240,0,33,0,50,0,0,63,1,54,51,50,23,22,51,50,55,54,53,52,39,38,53, + 52,63,1,6,21,20,23,22,21,20,7,6,35,34,39,38,35,34,19,54,51,50,23,22,51,50,55,7,6,35,34,38,35,34,7,106,140,111,117,57, + 132,144,33,121,100,71,62,80,80,213,80,80,53,202,186,242,54,129,133,56,94,110,109,141,123,127,122,128,125,125,200,139,111,143,214,143,122,128,90,165, + 39,80,86,137,97,75,126,112,146,109,100,160,140,139,121,107,148,98,188,94,242,222,79,80,5,54,56,49,47,58,170,58,98,58,0,0,0,1,0,68, + 255,227,5,110,5,242,0,74,0,0,1,5,22,23,22,51,50,55,54,53,52,39,55,22,21,20,7,6,35,34,39,38,39,36,35,53,34,7,6,7, + 39,52,55,54,55,54,55,54,19,54,55,54,55,54,51,50,23,22,21,20,7,6,35,34,39,38,39,38,39,38,35,34,7,14,1,7,6,7,6,7, + 6,7,23,51,50,1,219,1,2,110,90,83,60,103,86,66,9,44,24,110,121,121,52,102,88,143,254,251,82,68,55,53,13,53,73,26,49,37,48,55, + 11,5,35,33,64,99,209,114,71,66,14,41,31,44,29,13,11,7,41,51,57,75,46,35,36,4,4,20,22,38,55,66,3,15,62,1,95,110,48,24, + 25,86,66,154,82,30,14,132,14,228,110,121,35,31,72,137,8,66,63,132,24,193,88,33,36,24,57,66,1,127,169,132,128,77,119,62,55,108,26,16, + 46,27,11,59,55,37,44,59,40,211,167,189,117,121,44,68,48,3,0,0,0,2,255,228,255,227,2,210,5,240,0,28,0,38,0,0,1,22,51,50, + 55,51,6,7,6,35,34,39,7,35,54,55,38,53,52,55,18,55,54,51,50,21,6,7,2,1,18,19,54,53,52,35,6,3,6,1,48,41,87,58, + 75,133,60,70,76,70,156,63,75,156,108,80,10,31,117,104,72,123,125,1,18,72,254,184,187,57,30,25,109,97,27,1,12,200,115,102,53,57,139,110, + 147,137,78,85,152,152,2,59,117,81,173,78,93,254,131,254,247,1,92,1,22,147,38,69,87,253,250,145,0,2,0,32,255,227,6,27,6,20,0,31, + 0,39,0,0,19,51,21,51,53,51,21,33,21,33,17,62,1,51,50,0,16,2,35,34,38,39,21,35,17,35,17,35,17,35,53,51,0,16,38,32, + 6,16,22,32,193,184,184,185,2,177,253,79,58,177,123,204,0,255,255,204,123,177,58,185,184,184,161,161,4,155,167,254,220,167,167,1,36,6,20,147, + 147,147,125,254,178,100,97,254,188,253,240,254,188,97,100,168,5,4,250,252,5,4,125,251,227,1,150,231,231,254,106,231,0,2,0,198,0,0,5,162, + 5,213,0,3,0,13,0,0,37,1,35,9,1,33,1,17,51,17,33,1,17,35,5,32,253,22,238,2,234,252,148,1,168,2,208,100,254,88,253,48, + 100,100,5,13,250,243,5,113,251,31,4,225,250,43,4,225,251,31,0,0,0,4,0,54,0,0,7,193,5,213,0,19,0,31,0,43,0,47,2,22, + 177,146,151,66,176,147,176,152,66,0,176,0,47,179,14,15,44,47,176,4,23,60,177,1,149,237,176,0,176,45,221,176,46,60,176,45,176,29,222,176, + 35,205,16,16,177,4,129,63,177,5,10,176,2,23,60,177,11,149,237,176,35,17,176,11,18,176,23,57,176,23,32,70,104,72,176,23,16,176,41,176, + 35,176,29,35,73,105,59,177,128,2,66,177,129,0,66,61,176,29,176,23,35,73,176,128,98,105,176,29,70,96,176,20,70,97,176,146,67,176,1,96, + 35,66,176,146,67,176,1,96,67,176,0,85,88,176,20,176,146,67,176,1,96,67,56,89,176,20,16,178,26,38,32,176,3,23,60,177,128,0,66,177, + 129,0,66,24,48,1,176,48,16,177,3,4,254,176,4,60,176,0,196,176,3,177,17,28,253,176,16,60,16,176,3,177,13,54,252,176,14,60,176,13, + 177,6,28,253,176,7,60,176,15,57,176,15,32,70,104,72,16,176,13,176,10,176,0,176,3,35,73,104,59,176,11,60,16,176,13,176,20,214,176,20, + 176,32,221,176,44,57,176,44,32,70,104,72,176,32,176,38,214,176,38,176,26,176,20,176,32,35,73,105,59,176,47,176,44,176,20,35,73,104,58,16, + 16,16,16,16,176,26,176,49,35,73,176,146,67,176,1,96,35,66,176,146,67,176,1,96,67,176,0,80,88,181,38,26,20,32,44,47,176,146,67,176, + 1,96,67,176,6,23,56,75,176,10,82,88,176,13,176,20,35,73,176,146,67,176,1,96,35,66,176,146,67,176,1,96,67,176,64,80,88,176,146,67, + 176,1,96,67,176,64,97,176,146,67,176,1,96,35,66,180,6,7,13,14,15,176,146,67,176,1,96,67,176,5,23,56,89,89,89,177,128,2,66,177, + 129,0,66,61,176,20,176,26,35,73,176,128,98,105,176,20,70,96,176,23,70,97,176,146,67,176,1,96,35,66,176,146,67,176,1,96,67,176,0,85, + 88,176,23,176,146,67,176,1,96,67,56,89,176,23,16,178,29,35,41,176,3,23,60,177,128,0,66,177,129,0,66,24,49,176,4,176,7,35,73,176, + 0,82,88,12,177,16,15,7,176,15,16,177,6,17,237,176,16,16,177,5,17,253,10,12,2,13,177,5,6,8,176,4,16,176,5,60,11,10,12,3, + 13,177,5,6,8,176,7,16,176,6,60,11,10,89,51,53,50,53,17,33,1,17,52,54,51,21,34,21,17,33,1,17,20,6,1,52,54,51,50,22, + 21,20,6,35,34,38,55,20,22,51,50,54,53,52,38,35,34,6,3,53,33,21,54,147,1,16,2,150,157,186,147,254,240,253,106,157,4,227,144,103, + 103,144,144,103,103,144,140,57,50,50,57,57,50,50,57,140,1,238,170,107,4,192,251,31,3,204,128,149,170,107,251,64,4,225,252,52,128,149,2,110, + 138,191,191,138,138,191,191,138,78,103,103,78,78,103,103,253,68,123,123,0,0,4,1,27,0,0,6,229,5,202,0,12,0,25,0,34,0,45,0,0, + 1,22,17,16,0,33,32,0,3,16,0,33,32,6,33,32,0,17,18,0,33,32,0,17,16,39,5,17,51,50,54,53,52,38,35,37,33,50,22,21, + 20,6,43,1,17,35,6,11,218,254,74,254,209,254,207,254,82,6,1,180,1,49,1,50,41,254,247,254,250,254,134,5,1,117,1,6,1,7,1,121, + 187,253,211,178,99,107,107,99,254,193,1,63,176,180,180,176,178,141,4,241,219,254,206,254,208,254,76,1,180,1,48,1,48,1,182,101,254,133,254,249, + 254,251,254,135,1,121,1,5,1,9,187,119,254,175,88,81,80,88,100,137,131,133,135,254,152,0,0,0,0,2,0,110,254,59,5,67,3,246,0,48, + 0,60,0,0,1,6,21,20,23,54,55,54,51,50,23,22,21,20,7,6,35,34,39,54,55,22,51,50,55,54,53,52,39,38,35,34,1,18,21,20, + 7,6,35,34,39,38,53,16,55,38,53,52,55,3,6,21,20,23,22,23,50,55,54,53,52,2,53,136,31,91,171,219,132,131,70,73,156,121,174,101, + 76,18,9,41,113,122,93,69,38,32,74,189,254,159,135,69,89,131,113,58,63,223,46,232,148,129,31,48,46,65,28,32,3,198,130,190,77,107,101,148, + 189,76,80,171,218,215,167,60,43,29,40,140,104,195,124,72,61,254,121,254,222,124,157,110,142,61,66,134,1,11,252,158,127,238,164,252,239,198,123,117, + 46,70,1,47,52,95,78,0,0,4,0,200,0,0,5,84,5,213,0,3,0,11,0,22,0,31,0,0,1,17,51,17,51,17,33,50,55,17,38,35, + 37,33,50,4,21,20,4,43,1,17,33,1,17,54,55,54,53,52,39,38,1,44,202,100,1,46,24,23,23,24,253,64,2,145,250,1,1,254,255,251, + 254,254,110,3,88,60,45,93,92,44,5,113,250,243,5,13,253,106,2,2,146,2,100,219,211,213,218,253,136,5,90,253,153,22,41,86,159,158,86,41, + 0,4,0,115,254,248,5,217,5,240,0,17,0,25,0,33,0,41,0,0,37,1,35,39,7,6,35,32,0,17,16,0,33,32,0,17,16,2,37,22, + 32,55,17,38,32,7,3,17,6,7,6,16,23,22,1,17,54,55,54,16,39,38,4,66,1,10,244,221,51,17,16,254,197,254,135,1,121,1,59,1, + 58,1,120,209,253,43,108,1,16,108,108,254,240,108,105,36,32,155,155,32,2,222,35,31,155,155,31,27,254,221,239,3,1,1,165,1,97,1,98,1, + 165,254,91,254,158,254,252,254,142,11,50,50,4,215,50,50,251,106,4,84,29,37,182,253,156,181,37,4,53,251,175,29,36,182,2,99,182,36,0,0, + 0,2,0,66,255,238,6,28,6,50,0,12,0,95,0,0,1,17,22,51,50,55,54,53,52,39,38,39,38,19,3,39,6,7,6,7,6,35,34,39, + 38,53,52,55,54,51,50,23,22,23,22,23,22,51,50,55,54,55,54,53,17,34,7,6,21,20,23,30,1,21,20,7,6,34,39,38,53,52,55,54, + 33,54,63,1,21,50,23,22,23,22,21,20,7,6,7,23,22,23,22,51,50,55,54,55,23,6,7,6,35,34,39,38,3,66,31,61,143,93,105,83, + 27,92,90,151,206,86,31,51,48,70,159,185,110,55,59,26,25,35,26,22,27,17,22,16,26,70,102,83,57,33,33,231,129,60,9,2,16,29,35,53, + 29,44,104,189,1,34,29,59,60,182,137,132,50,88,110,103,154,90,82,123,26,44,29,31,35,17,31,35,57,62,59,75,33,81,5,161,253,73,7,97, + 103,194,163,83,27,20,15,251,22,1,230,9,192,136,137,68,163,53,64,55,42,26,24,22,26,31,39,16,26,83,58,121,125,158,3,42,130,55,72,25, + 48,9,53,15,35,33,31,24,44,73,145,108,187,13,29,28,64,28,31,51,88,167,191,110,104,48,222,205,123,31,31,40,50,24,114,58,61,31,79,0, + 0,2,0,83,255,227,6,108,5,241,0,73,0,88,0,0,5,38,53,52,39,38,35,34,15,1,21,20,7,6,35,34,39,38,53,22,23,20,23,22, + 50,55,54,53,17,52,39,38,35,34,7,6,20,23,22,51,23,34,39,38,53,52,55,54,51,50,23,22,23,55,54,51,50,23,22,21,20,7,6,7, + 50,23,22,23,22,21,20,23,55,23,1,22,21,17,55,54,55,54,53,52,39,38,35,34,7,5,2,82,22,40,79,42,92,120,103,103,140,141,102,103, + 45,46,64,64,144,63,64,64,63,92,81,65,64,64,64,83,54,151,102,103,103,102,151,162,101,30,16,211,187,112,47,36,126,65,66,125,58,49,36,27, + 32,45,144,42,252,164,21,154,144,77,74,74,24,31,64,102,29,183,159,140,91,166,43,56,199,206,118,117,117,118,176,12,12,122,86,87,87,87,150,2, + 155,149,88,87,87,86,202,86,87,92,117,118,156,157,117,117,117,35,32,98,87,14,49,177,87,123,124,94,49,36,104,123,131,128,118,67,91,4,83,75, + 92,254,149,71,67,104,102,121,151,32,10,47,0,5,0,200,0,0,6,50,5,213,0,9,0,30,0,38,0,46,0,50,0,0,1,38,39,38,43,1, + 22,23,19,51,1,30,1,23,19,33,3,46,1,43,1,17,33,17,33,32,22,21,20,7,6,1,17,33,50,55,17,38,35,23,17,54,55,54,16,39, + 38,37,17,51,17,4,251,76,68,69,120,45,77,101,143,199,254,248,53,113,62,205,254,72,191,74,139,120,20,254,110,2,167,1,0,252,117,49,253,149, + 1,69,24,23,23,24,152,65,43,90,89,42,252,178,202,1,127,151,48,49,47,201,254,229,2,79,25,132,126,254,104,1,127,150,98,253,137,5,213,214, + 216,208,98,41,2,165,253,106,2,2,146,2,23,253,153,22,41,86,1,62,85,41,45,250,243,5,13,0,0,2,0,169,0,0,6,131,5,213,0,8, + 0,31,0,167,184,0,32,47,184,0,33,47,184,0,32,16,184,0,14,208,184,0,14,47,184,0,13,220,184,0,0,208,184,0,33,16,184,0,19,220, + 184,0,5,220,65,5,0,234,0,5,0,250,0,5,0,2,93,65,27,0,25,0,5,0,41,0,5,0,57,0,5,0,73,0,5,0,89,0,5,0, + 105,0,5,0,121,0,5,0,137,0,5,0,153,0,5,0,169,0,5,0,185,0,5,0,201,0,5,0,217,0,5,0,13,93,184,0,9,208,184,0, + 9,47,186,0,30,0,14,0,19,17,18,57,0,184,0,13,47,184,0,26,47,184,0,29,47,186,0,15,0,0,0,3,43,184,0,15,16,186,0,2, + 0,11,0,3,43,184,0,2,16,48,49,1,17,51,50,54,53,52,38,35,1,6,43,1,17,35,17,33,50,4,21,20,7,23,55,51,9,1,35,11, + 1,35,1,1,115,254,141,154,154,141,1,32,115,173,254,202,1,200,251,1,1,78,174,190,232,254,205,1,67,233,207,212,232,1,73,5,47,253,207,146, + 135,134,146,253,95,54,253,168,5,213,227,219,172,107,219,234,254,134,254,107,1,4,254,252,1,149,0,0,0,4,0,201,255,37,5,84,6,199,0,5, + 0,36,0,43,0,46,0,0,1,17,51,19,38,35,19,22,23,22,23,19,35,3,38,39,38,39,1,39,55,35,17,33,50,23,55,37,55,5,7,22, + 23,22,21,20,6,11,1,54,55,54,53,52,1,19,35,1,147,209,200,63,92,252,65,62,58,65,205,217,191,75,69,54,84,254,174,111,70,94,1,200, + 126,95,11,254,186,44,1,182,56,27,23,126,131,124,167,84,51,74,253,219,143,143,5,47,253,238,1,248,26,253,141,22,72,68,130,254,104,1,127,151, + 48,38,9,252,176,44,175,5,213,26,27,130,111,174,140,16,19,107,216,141,186,1,231,254,93,15,45,68,131,98,252,135,1,103,0,0,0,2,1,3, + 3,139,6,40,5,216,0,39,0,52,0,0,1,21,46,1,35,34,6,21,20,22,31,1,30,1,21,20,6,35,34,38,39,53,30,1,51,50,54,53, + 52,38,47,1,46,1,53,52,54,51,50,22,55,51,27,1,51,17,35,17,3,35,3,17,35,2,230,85,87,39,65,71,47,69,56,112,105,144,140,52, + 115,71,91,100,47,69,75,55,63,56,112,99,138,124,51,105,208,184,161,162,184,138,140,135,141,137,5,183,89,34,19,42,47,40,32,11,9,18,86,65, + 79,91,19,21,96,42,24,44,50,44,42,10,9,18,77,61,72,92,15,5,254,172,1,84,253,200,1,148,254,216,1,40,254,108,0,0,0,3,255,252, + 0,0,8,48,4,96,0,7,0,19,0,25,0,0,3,33,21,33,17,35,17,33,5,33,21,33,17,33,21,33,17,33,21,33,1,51,17,33,21,33, + 4,3,179,254,114,152,254,115,2,224,2,111,254,22,1,213,254,43,1,246,253,133,2,239,133,1,224,253,155,4,96,128,252,32,3,224,96,102,254,247, + 102,254,187,102,3,128,252,230,102,0,0,0,0,2,1,39,3,147,6,70,5,213,0,12,0,20,0,62,64,33,1,6,7,16,10,4,18,14,9,3, + 6,201,13,2,0,129,21,1,9,5,98,3,9,98,11,13,99,15,98,19,99,17,21,16,212,228,252,228,212,236,212,236,17,57,49,0,16,244,60,60, + 236,23,50,212,60,60,196,17,57,48,1,27,1,51,17,35,17,3,35,3,17,35,17,35,21,35,17,35,17,35,53,4,74,174,164,170,113,195,55,203, + 114,113,203,114,201,5,213,255,0,1,0,253,190,1,228,254,209,1,47,254,28,2,66,94,254,28,1,228,94,0,0,0,0,1,0,16,255,34,5,104, + 6,196,0,16,0,0,9,1,37,55,5,1,19,1,51,1,35,11,1,39,9,1,51,1,215,1,1,254,186,44,1,182,254,162,166,1,218,210,253,199, + 229,158,253,111,1,45,254,163,211,3,77,2,134,130,111,174,252,144,254,70,4,233,250,43,1,158,253,132,44,2,245,3,146,0,0,0,0,2,0,92, + 0,0,5,153,5,213,0,3,0,13,0,0,37,1,35,1,3,33,21,1,33,21,33,53,1,33,1,200,3,56,234,252,200,107,5,15,252,200,3,79, + 250,195,3,56,252,223,100,5,13,250,243,5,113,100,250,243,100,100,5,13,0,1,0,88,254,76,4,47,6,20,0,31,0,0,23,22,32,54,53,52, + 38,35,33,53,1,33,53,1,33,53,33,21,1,33,21,1,50,30,1,21,16,7,6,33,34,39,88,170,1,163,193,185,165,254,240,1,247,254,9,1, + 247,253,196,3,36,254,39,1,217,254,39,172,223,166,141,185,254,254,187,212,167,99,163,204,134,147,166,1,101,147,1,101,147,168,254,176,168,254,176,97, + 212,138,254,211,102,134,74,0,255,255,0,78,0,0,5,207,5,231,16,6,3,61,0,0,255,255,0,78,255,227,5,207,5,202,16,6,1,115,0,0, + 0,1,0,24,254,206,4,149,6,68,0,85,0,0,1,55,54,55,54,53,52,39,38,35,34,7,6,35,34,39,38,53,55,51,6,23,22,51,50,55, + 50,54,51,50,22,23,22,21,20,7,6,7,23,54,51,50,23,22,21,16,3,6,33,34,39,52,39,38,39,38,35,34,7,39,54,55,54,51,50,23, + 22,21,20,23,22,51,50,55,54,55,54,53,52,39,38,39,38,35,34,7,1,142,95,125,121,106,35,49,81,24,128,150,26,92,36,24,152,35,35,35, + 35,130,44,84,17,71,17,71,92,24,60,130,132,108,2,71,50,251,101,36,176,242,254,215,115,97,2,4,16,24,35,48,69,24,75,88,81,60,77,17, + 11,25,30,64,152,117,74,38,39,17,20,33,103,176,108,93,2,168,138,9,121,106,141,46,35,46,11,11,35,25,33,211,60,35,33,5,6,22,24,59, + 71,163,129,132,66,3,14,152,119,128,254,235,254,250,200,24,135,28,44,16,24,60,36,61,44,35,35,22,119,85,25,30,116,75,121,121,152,86,63,64, + 33,106,46,0,0,1,0,68,0,0,2,10,4,96,0,13,0,0,33,17,52,39,38,43,1,53,51,50,23,22,21,17,1,78,34,36,108,88,110,182, + 80,82,2,213,145,46,48,156,96,98,212,253,54,0,0,0,255,255,0,201,0,0,5,106,5,213,16,6,0,46,0,0,255,255,0,16,0,0,5,104, + 7,109,16,6,0,135,0,0,0,3,0,92,0,0,5,223,6,46,0,50,0,63,0,82,0,0,1,23,50,23,22,21,20,7,6,41,1,55,50,55, + 54,55,54,53,17,34,7,6,21,20,23,20,22,21,20,7,6,35,34,39,38,53,52,55,54,37,55,23,50,23,22,23,22,21,20,7,6,5,50,55, + 54,53,52,39,38,39,38,35,17,20,1,5,50,55,54,55,54,53,52,39,38,39,38,35,34,7,6,7,6,4,113,7,169,95,95,121,220,254,179,253, + 115,59,150,134,57,29,31,185,130,77,11,13,19,33,44,25,17,38,113,160,1,8,152,9,198,145,143,48,73,103,75,254,138,204,113,83,70,42,101,108, + 134,254,232,1,92,136,108,104,48,88,86,46,84,77,118,75,73,31,46,88,3,84,16,97,94,128,174,125,218,117,134,59,139,132,211,2,131,130,73,77, + 11,61,5,44,13,51,19,33,22,35,86,134,116,159,39,73,64,28,31,51,72,108,154,104,74,51,112,82,129,117,70,42,27,24,253,194,29,253,40,2, + 26,29,48,88,185,114,86,44,24,24,6,236,110,206,0,0,0,1,0,130,255,232,5,55,5,240,0,61,0,0,1,23,54,37,30,1,23,22,23,22, + 55,21,6,7,38,39,6,7,6,21,20,23,22,23,30,1,21,20,7,6,7,39,54,55,54,53,52,39,38,55,34,7,6,21,16,23,22,45,1,21, + 6,7,6,36,39,38,39,38,53,52,55,54,2,75,71,152,1,47,11,40,11,17,16,22,105,140,104,59,117,41,29,24,11,3,15,15,15,70,115,198, + 26,90,73,35,46,33,19,125,73,105,176,222,1,107,1,1,215,101,192,254,143,130,93,46,48,94,192,5,53,35,108,114,28,119,31,40,15,22,33,46, + 68,14,36,187,13,34,28,57,66,71,22,51,50,75,37,141,70,110,31,35,22,73,35,116,51,185,116,82,93,134,218,254,185,176,225,38,127,57,136,75, + 40,86,130,92,143,145,181,209,189,147,0,0,0,2,0,125,255,231,6,89,5,45,0,26,0,41,0,0,37,22,23,22,32,55,54,55,51,6,7,6, + 32,36,2,53,52,18,36,51,50,4,18,21,33,34,21,53,20,51,33,50,53,17,38,39,38,35,34,7,6,7,1,144,67,93,150,1,74,152,106,77, + 111,95,142,179,254,122,254,155,198,201,1,103,190,189,1,103,202,251,74,19,19,3,144,20,70,95,152,159,160,152,95,68,228,77,51,84,84,60,96,120, + 71,90,179,1,65,175,176,1,69,174,174,254,187,176,19,73,19,19,1,112,80,51,82,81,52,79,0,0,0,2,0,87,255,227,4,96,4,68,0,28, + 0,37,0,0,1,6,21,20,23,22,51,50,55,54,55,51,6,7,6,32,39,38,53,52,55,54,0,51,32,17,20,7,6,55,54,53,52,35,34,6, + 3,32,1,44,4,34,59,158,116,57,102,24,135,40,149,104,254,100,111,78,15,49,1,82,240,1,135,205,209,107,112,227,134,186,57,1,65,1,152,38, + 34,94,62,110,35,63,81,127,89,62,153,107,155,68,77,253,1,52,254,235,199,103,105,224,77,113,171,204,254,237,0,0,0,1,0,162,255,227,4,134, + 5,240,0,69,0,0,1,23,6,7,6,35,34,39,38,39,38,53,52,55,54,63,1,38,39,38,53,52,55,54,51,50,23,22,21,20,7,6,35,34, + 39,38,53,52,55,54,53,52,39,38,35,34,7,6,21,20,23,22,23,22,51,21,34,7,6,7,6,21,20,23,22,51,50,55,54,55,4,39,95,31, + 16,178,251,143,105,108,69,95,134,109,178,2,108,61,79,99,123,241,136,84,51,45,50,34,41,23,13,28,26,37,43,102,97,64,97,80,47,90,95,124, + 171,123,119,58,109,97,90,194,129,117,62,13,1,73,104,65,17,172,34,37,64,95,169,174,138,108,24,21,36,61,80,148,139,99,122,83,50,86,78,45, + 50,22,14,33,28,36,43,31,37,36,43,64,101,151,125,78,48,23,26,54,30,29,57,110,153,166,97,91,117,62,95,0,0,1,0,84,255,223,6,17, + 6,11,0,77,0,0,1,23,7,6,35,34,39,38,39,17,33,7,35,21,20,7,6,7,6,33,34,39,38,53,52,55,54,51,50,23,22,23,22,23, + 22,51,50,55,54,55,54,61,1,33,55,33,17,38,35,34,7,6,21,20,31,1,20,7,6,35,34,39,38,53,52,55,54,33,50,23,55,21,22,23, + 22,51,50,55,5,238,35,88,39,58,39,55,225,63,1,60,61,255,42,42,77,198,254,244,128,95,52,30,27,46,31,13,18,22,19,27,66,94,108,123, + 62,29,33,254,151,39,1,66,97,62,193,110,71,7,20,25,35,26,38,35,31,119,167,1,52,36,66,154,187,143,48,22,48,33,5,242,19,163,75,20, + 61,25,253,220,68,99,152,132,128,75,202,95,52,66,40,31,26,11,20,48,51,26,66,123,62,99,101,130,185,68,2,73,24,110,70,84,61,31,73,44, + 26,31,31,31,70,180,119,167,8,55,75,46,22,9,48,0,0,1,0,201,0,0,4,35,5,213,0,9,0,0,41,1,53,33,17,33,53,33,17,51, + 4,35,252,166,2,144,253,176,2,80,202,170,1,184,170,2,201,0,0,0,0,1,0,57,255,199,8,66,6,2,0,107,0,0,1,17,20,23,22,23, + 22,51,50,55,54,55,23,6,7,6,34,39,38,39,38,17,52,2,55,6,3,2,3,7,39,2,3,38,39,38,39,17,20,7,6,7,6,35,34,39, + 38,53,52,55,54,51,50,23,22,51,50,54,55,54,53,17,38,35,34,7,6,15,1,54,55,54,55,54,51,50,23,51,22,19,18,19,23,18,55,18, + 55,54,51,50,23,22,21,20,7,6,35,34,39,38,39,38,39,38,35,34,7,6,6,215,22,22,44,27,28,53,40,46,39,42,39,69,96,159,57,55, + 18,6,7,5,174,121,123,55,97,20,59,102,55,59,62,70,51,46,94,80,101,77,68,42,29,24,35,55,29,28,64,44,106,33,28,72,104,72,60,61, + 20,46,15,24,27,37,95,121,143,105,7,165,112,112,51,11,84,125,128,156,152,178,66,39,29,18,30,44,36,8,22,7,11,4,25,26,29,26,42,5, + 29,253,53,220,128,129,47,22,44,44,64,33,59,68,97,57,55,158,84,2,1,30,1,145,31,179,254,196,254,201,254,86,77,15,1,230,1,59,169,110, + 119,70,254,15,237,187,179,94,79,63,47,44,37,33,24,59,62,106,121,116,159,2,214,88,60,59,125,3,102,63,69,39,95,110,165,254,250,254,244,254, + 177,11,1,72,244,1,2,151,152,39,29,29,39,16,35,9,22,13,29,4,24,22,46,0,0,2,0,104,255,231,3,74,3,41,0,11,0,23,0,0, + 1,52,38,35,34,2,21,20,22,51,50,18,3,50,22,21,20,2,35,34,38,53,52,18,2,169,87,79,109,141,86,80,109,141,194,152,203,221,162,152, + 203,221,1,247,116,125,254,254,207,116,123,1,4,1,253,216,163,198,254,255,216,163,198,1,1,0,0,0,0,1,0,103,255,227,5,178,5,240,0,52, + 0,0,9,1,22,21,20,7,52,39,1,7,6,31,1,22,20,7,6,43,1,53,54,53,52,47,1,38,52,63,1,39,38,53,52,55,20,23,9,1, + 39,38,53,52,55,20,31,1,22,21,20,7,52,47,1,3,196,1,139,99,144,50,252,251,155,62,66,172,100,61,86,69,245,196,47,98,53,140,154,241, + 99,144,50,2,108,1,25,116,99,144,50,182,99,144,50,18,2,208,254,117,99,49,130,76,83,50,3,5,156,63,66,172,100,214,44,62,56,63,93,29, + 47,99,54,188,141,155,241,99,49,130,76,83,50,253,150,1,25,116,99,49,130,76,83,50,182,99,49,130,76,83,50,18,0,1,255,251,255,227,5,57, + 5,241,0,48,0,0,1,17,51,22,21,20,15,1,14,1,35,33,34,46,1,53,52,63,1,62,1,51,33,17,52,39,46,1,35,33,34,46,3,53, + 52,62,1,51,50,23,30,2,51,33,50,22,4,190,79,44,30,135,17,20,34,251,244,22,24,24,34,133,17,20,36,3,132,20,20,37,64,253,127,59, + 53,72,29,22,4,16,20,25,12,12,42,31,28,2,214,89,91,4,182,252,35,4,36,20,27,135,18,6,2,20,18,16,34,134,16,6,3,120,50,13, + 16,6,4,24,49,91,71,40,32,20,32,30,31,4,87,0,0,1,0,27,255,184,3,65,5,240,0,44,0,0,1,33,50,23,22,20,14,1,7,30, + 1,18,16,7,6,35,34,38,47,1,14,1,35,33,34,53,52,63,1,62,1,51,33,17,33,34,38,53,52,54,50,23,22,23,22,1,84,1,80,108, + 30,19,12,48,37,2,2,61,10,24,45,22,18,6,14,100,18,44,254,109,70,34,133,17,20,36,1,133,254,186,109,71,20,45,12,23,46,16,5,143, + 55,35,42,40,47,10,26,130,253,36,254,251,34,83,30,31,97,101,14,40,16,33,135,16,6,3,205,113,126,66,25,30,59,6,2,0,0,1,0,86, + 255,184,4,186,5,240,0,38,0,0,1,33,34,38,53,52,62,1,51,50,23,30,2,51,33,50,30,2,21,20,14,1,7,30,1,23,18,21,20,7, + 6,35,34,38,39,38,53,4,10,253,0,109,71,4,16,20,25,12,12,42,31,28,3,10,53,71,26,6,12,48,37,2,2,4,57,10,23,46,24,17, + 12,12,4,166,113,126,40,31,20,31,30,32,4,31,48,26,11,16,40,47,10,26,130,38,253,74,147,115,33,83,39,68,81,73,0,0,0,2,0,70, + 0,0,2,215,6,20,0,11,0,21,0,0,19,52,54,51,50,22,21,20,6,35,34,38,1,51,21,33,53,51,17,35,53,33,188,112,81,79,111,111, + 79,81,112,1,131,152,253,111,151,151,1,249,5,84,81,111,111,81,79,111,110,251,117,121,121,3,53,121,0,2,0,90,255,213,7,82,5,59,0,9, + 0,27,0,0,18,16,0,33,32,0,16,0,33,32,5,1,21,7,30,1,21,16,0,33,32,0,17,16,0,33,32,4,254,1,72,1,27,1,26,1, + 72,254,184,254,230,254,229,3,233,1,35,239,2,2,254,91,254,159,254,158,254,91,1,165,1,98,1,4,1,114,3,101,254,72,254,253,1,3,1,184, + 1,1,194,1,10,244,221,33,35,16,254,197,254,135,1,121,1,59,1,58,1,120,209,0,0,4,0,151,0,0,9,76,4,96,0,9,0,12,0,20, + 0,32,0,0,19,33,21,33,17,33,21,33,17,35,1,3,33,1,51,1,35,39,33,7,35,1,51,27,1,51,9,1,35,9,1,35,1,151,2,131, + 254,20,1,188,254,68,151,3,131,181,1,106,255,0,151,1,119,138,90,254,68,90,140,3,214,143,245,246,144,254,195,1,82,144,254,235,254,233,144,1, + 96,4,96,128,254,182,127,253,233,3,8,254,67,2,53,252,128,230,230,3,128,254,179,1,77,254,82,254,46,1,125,254,131,1,222,0,0,3,0,36, + 255,240,5,122,4,96,0,15,0,45,0,49,0,0,37,53,34,39,38,39,38,53,17,35,17,20,22,23,22,50,3,22,51,50,55,21,6,35,34,39, + 38,53,17,35,17,33,17,35,34,6,21,35,52,54,51,33,21,35,17,20,1,51,17,35,5,22,137,44,26,9,14,134,23,20,57,225,89,8,108,40, + 72,116,132,253,42,21,167,254,178,61,90,50,100,114,165,4,15,182,253,33,134,134,90,52,64,39,33,56,162,2,12,253,214,166,122,25,69,1,66,175, + 10,241,16,202,98,253,1,227,252,4,3,252,76,115,168,123,100,254,18,89,254,175,3,152,0,2,0,0,254,115,5,90,4,123,0,8,0,29,0,0, + 1,22,19,18,17,51,16,3,2,3,16,3,2,35,34,7,35,52,55,54,51,32,19,18,19,51,2,3,2,17,1,215,174,85,69,130,69,108,52,70, + 140,197,169,24,100,71,81,245,1,180,137,110,160,130,203,67,70,4,29,193,254,92,254,167,254,120,1,159,1,66,1,253,250,190,2,27,1,42,2,87, + 159,98,79,90,253,61,1,154,1,14,254,143,254,201,254,190,253,253,0,0,0,2,0,200,0,0,5,48,5,213,0,3,0,9,0,0,1,17,51,17, + 37,21,33,17,33,17,1,44,202,3,58,253,42,254,110,5,113,250,243,5,13,100,100,250,143,5,213,0,0,3,0,201,0,0,6,1,5,213,0,3, + 0,7,0,15,0,0,1,17,51,17,33,17,51,17,1,33,17,33,17,33,17,33,4,211,202,251,144,202,4,10,254,110,253,236,254,110,5,56,5,113, + 250,243,5,13,250,243,5,13,250,143,5,113,250,143,5,213,0,2,0,25,254,119,6,83,5,193,0,5,0,17,0,0,9,2,33,9,2,21,33,9, + 1,33,21,33,53,9,1,53,1,166,3,16,253,6,254,252,2,250,252,240,5,151,252,25,2,250,252,240,4,23,249,198,3,7,253,23,254,218,3,89, + 3,42,252,214,252,167,6,231,100,252,214,252,167,99,99,3,83,3,21,127,0,1,0,163,255,227,5,187,5,240,0,29,0,0,1,17,33,21,33,17, + 54,36,51,32,0,17,16,0,33,34,36,39,53,30,1,51,32,0,17,16,0,33,34,6,1,107,1,74,253,238,117,1,26,160,1,94,1,139,254,117, + 254,162,146,254,249,111,112,252,139,1,18,1,19,254,237,254,238,107,168,4,254,254,111,166,2,129,83,85,254,103,254,147,254,146,254,103,72,70,215,95, + 96,1,50,1,47,1,46,1,50,37,0,0,0,1,0,8,0,0,3,169,5,213,0,5,0,23,181,2,28,0,58,3,6,16,220,252,236,49,0,180, + 3,149,4,129,1,47,244,236,48,33,35,17,33,53,33,3,169,202,253,41,3,161,5,43,170,0,0,0,0,1,0,7,0,0,3,168,5,213,0,5, + 0,23,181,4,28,1,58,3,6,16,220,252,236,49,0,180,3,149,0,129,2,47,228,236,48,1,17,33,53,33,17,3,168,252,95,2,215,5,213,250, + 43,170,5,43,0,1,255,252,0,0,4,231,5,213,0,8,0,0,33,35,9,1,35,1,17,51,17,4,231,217,254,98,254,101,217,2,16,203,2,102, + 253,154,3,14,2,199,253,57,0,4,0,87,0,0,6,74,5,213,0,11,0,19,0,23,0,34,0,0,1,32,23,22,21,20,7,2,0,41,1,1, + 5,3,51,50,55,19,38,35,33,3,51,19,5,3,54,55,54,19,54,53,52,39,38,3,124,1,178,168,116,23,75,254,34,254,80,253,253,1,34,1, + 127,251,99,245,173,226,147,246,254,111,251,202,251,2,175,205,27,25,208,65,20,102,18,5,213,181,124,223,99,118,254,126,254,150,5,213,100,250,243,65, + 4,139,65,250,243,5,13,120,251,227,16,19,157,1,80,102,85,194,109,19,0,4,0,90,255,227,5,173,6,20,0,10,0,31,0,35,0,50,0,0, + 19,6,21,20,23,22,23,19,6,7,6,1,33,55,6,7,6,35,34,2,53,52,55,54,0,51,50,23,22,23,19,33,7,1,51,9,1,3,22,51, + 50,55,54,55,54,53,52,39,38,35,34,231,31,42,32,54,175,66,56,119,3,120,254,178,33,78,98,98,124,203,158,34,35,1,62,203,124,79,79,39, + 118,1,78,254,254,247,134,1,9,253,50,189,24,26,165,119,120,31,31,56,55,165,26,2,116,158,75,115,79,61,32,3,134,32,61,130,252,237,168,100, + 48,49,1,12,148,80,178,178,1,68,49,48,100,2,94,100,250,172,5,84,254,100,252,54,3,130,130,159,158,74,116,104,105,0,0,0,0,3,0,91, + 255,227,4,147,4,123,0,10,0,40,0,50,0,0,19,6,21,20,23,22,23,19,6,7,6,19,22,51,50,55,54,55,7,6,7,6,35,32,39,38, + 53,52,55,18,55,54,51,50,23,22,21,20,15,1,33,55,33,54,53,52,39,38,35,34,7,218,12,78,22,30,161,38,35,160,168,71,95,121,127,90, + 92,23,107,108,109,107,254,244,125,90,15,53,181,179,252,228,102,70,16,18,253,143,20,2,1,10,57,78,169,74,67,2,48,60,55,141,104,29,22,3, + 58,21,28,130,253,74,21,31,22,40,117,42,22,22,156,111,166,68,77,1,19,162,161,145,99,147,70,80,90,100,56,50,118,82,115,17,0,3,0,79, + 0,0,2,129,6,20,0,3,0,7,0,11,0,0,1,51,7,35,3,51,19,35,19,33,19,33,1,201,184,46,184,212,134,178,134,36,254,178,218,1, + 78,6,20,233,251,57,3,152,252,4,4,96,0,3,255,22,254,86,2,129,6,20,0,3,0,12,0,26,0,0,1,51,7,35,3,19,35,3,6,7, + 54,55,54,5,35,55,51,50,55,54,55,19,33,3,6,7,6,1,201,184,46,184,102,202,134,208,35,53,72,50,75,254,220,220,20,49,105,48,47,29, + 233,1,78,222,41,100,101,6,20,233,250,191,4,18,251,208,181,84,15,48,72,244,100,48,49,153,4,172,251,140,214,96,96,0,0,0,0,2,0,59, + 255,227,5,184,5,240,0,38,0,48,0,0,9,1,14,1,21,35,52,18,55,1,51,23,62,1,51,50,0,21,20,6,7,30,1,21,20,6,35,34, + 38,39,53,30,1,51,50,54,53,52,38,55,62,1,53,52,38,35,34,6,7,3,186,254,4,59,72,186,116,93,254,233,252,143,104,228,131,241,1,50, + 134,134,48,50,222,184,83,165,85,87,158,68,105,131,59,50,91,85,212,160,95,166,73,2,64,2,8,89,203,114,132,1,2,126,1,31,149,89,87,254, + 237,215,128,225,99,63,125,60,162,197,36,36,182,47,49,111,88,51,103,206,81,161,88,146,194,63,64,0,0,1,0,81,0,0,3,136,4,96,0,9, + 0,36,64,9,5,9,8,11,70,0,6,2,10,16,196,196,212,236,236,50,49,0,64,8,7,135,6,3,135,0,188,2,47,228,236,212,236,48,1,17, + 33,53,33,17,33,53,33,17,3,136,252,201,2,127,254,7,1,249,4,96,251,160,147,1,111,147,1,203,255,255,0,137,255,227,7,96,5,240,16,39, + 11,34,3,53,0,0,16,38,0,123,0,0,16,7,11,78,4,139,253,100,255,255,0,137,255,227,7,116,5,240,16,39,11,34,3,53,0,0,16,38, + 0,123,0,0,16,7,11,80,4,139,253,100,255,255,0,137,255,227,10,174,5,240,16,39,11,34,3,53,0,0,16,38,0,123,0,0,16,39,0,123, + 4,139,253,100,16,7,11,73,7,192,253,100,255,255,0,137,255,227,7,88,5,240,16,38,0,123,0,0,16,39,11,34,3,53,0,0,16,7,0,117, + 4,139,253,100,255,255,0,94,255,227,7,88,5,240,16,38,0,116,0,0,16,39,11,34,3,53,0,0,16,7,0,117,4,139,253,100,255,255,0,137, + 255,227,7,94,5,240,16,38,0,123,0,0,16,39,11,34,3,53,0,0,16,7,11,76,4,139,253,100,255,255,0,94,255,227,7,94,5,240,16,38, + 0,116,0,0,16,39,11,34,3,53,0,0,16,7,11,76,4,139,253,100,255,255,0,98,255,227,7,94,5,240,16,38,0,117,0,0,16,39,11,34, + 3,53,0,0,16,7,11,76,4,139,253,100,255,255,0,63,255,227,7,94,5,240,16,38,11,75,0,0,16,39,11,34,3,53,0,0,16,7,11,76, + 4,139,253,100,255,255,0,137,255,227,7,126,5,240,16,38,0,123,0,0,16,39,11,34,3,53,0,0,16,7,11,77,4,139,253,100,255,255,0,102, + 255,227,7,126,5,240,16,38,11,76,0,0,16,39,11,34,3,53,0,0,16,7,11,77,4,139,253,100,255,255,0,137,255,227,7,119,5,240,16,38, + 0,123,0,0,16,39,11,34,3,53,0,0,16,7,11,79,4,139,253,100,255,255,0,98,255,227,7,119,5,240,16,38,0,117,0,0,16,39,11,34, + 3,53,0,0,16,7,11,79,4,139,253,100,255,255,0,102,255,227,7,119,5,240,16,38,11,76,0,0,16,39,11,34,3,53,0,0,16,7,11,79, + 4,139,253,100,255,255,0,108,255,227,7,119,5,240,16,38,11,78,0,0,16,39,11,34,3,53,0,0,16,7,11,79,4,139,253,100,255,255,0,137, + 255,227,6,2,5,240,16,38,0,123,0,0,16,7,11,34,3,53,0,0,255,255,0,201,0,0,1,147,5,213,16,6,0,44,0,0,255,255,0,201, + 0,0,3,39,5,213,16,38,0,44,0,0,16,7,0,44,1,148,0,0,255,255,0,201,0,0,4,187,5,213,16,38,0,44,0,0,16,39,0,44, + 1,148,0,0,16,7,0,44,3,40,0,0,255,255,0,201,0,0,7,81,5,213,16,38,0,44,0,0,16,7,0,57,1,233,0,0,255,255,0,16, + 0,0,5,104,5,213,16,6,0,57,0,0,255,255,0,16,0,0,6,152,5,213,16,38,0,57,0,0,16,7,0,44,5,5,0,0,255,255,0,16, + 0,0,8,44,5,213,16,38,0,57,0,0,16,39,0,44,5,5,0,0,16,7,0,44,6,153,0,0,255,255,0,16,0,0,9,192,5,213,16,38, + 0,57,0,0,16,39,0,44,5,5,0,0,16,39,0,44,6,153,0,0,16,7,0,44,8,45,0,0,255,255,0,201,0,0,7,23,5,213,16,38, + 0,44,0,0,16,7,0,59,1,220,0,0,255,255,0,61,0,0,5,59,5,213,16,6,0,59,0,0,255,255,0,61,0,0,6,174,5,213,16,38, + 0,59,0,0,16,7,0,44,5,27,0,0,255,255,0,61,0,0,8,66,5,213,16,38,0,59,0,0,16,39,0,44,5,27,0,0,16,7,0,44, + 6,175,0,0,255,255,0,201,0,0,4,106,5,213,16,6,0,47,0,0,255,255,0,115,255,227,5,39,5,240,16,6,0,38,0,0,255,255,0,201, + 0,0,5,176,5,213,16,6,0,39,0,0,255,255,0,201,0,0,6,31,5,213,16,6,0,48,0,0,255,255,0,193,0,0,1,121,6,20,16,6, + 0,76,0,0,255,255,0,193,0,0,2,233,6,20,16,38,0,76,0,0,16,7,0,76,1,112,0,0,255,255,0,193,0,0,4,89,6,20,16,38, + 0,76,0,0,16,39,0,76,1,112,0,0,16,7,0,76,2,224,0,0,255,255,0,193,0,0,6,65,6,20,16,38,0,76,0,0,16,7,0,89, + 1,194,0,0,255,255,0,61,0,0,4,127,4,96,16,6,0,89,0,0,255,255,0,61,0,0,5,189,6,20,16,38,0,89,0,0,16,7,0,76, + 4,68,0,0,255,255,0,61,0,0,7,45,6,20,16,38,0,89,0,0,16,39,0,76,4,68,0,0,16,7,0,76,5,180,0,0,255,255,0,61, + 0,0,8,157,6,20,16,38,0,89,0,0,16,39,0,76,4,68,0,0,16,39,0,76,5,180,0,0,16,7,0,76,7,36,0,0,255,255,0,193, + 0,0,6,74,6,20,16,38,0,76,0,0,16,7,0,91,1,209,0,0,255,255,0,59,0,0,4,121,4,96,16,6,0,91,0,0,255,255,0,59, + 0,0,5,212,6,20,16,38,0,91,0,0,16,7,0,76,4,91,0,0,255,255,0,59,0,0,7,68,6,20,16,38,0,91,0,0,16,39,0,76, + 4,91,0,0,16,7,0,76,5,203,0,0,255,255,0,193,0,0,1,121,6,20,16,6,0,79,0,0,255,255,0,113,255,227,3,231,4,123,16,6, + 0,70,0,0,255,255,0,113,255,227,4,90,6,20,16,6,0,71,0,0,255,255,0,186,0,0,7,29,4,123,16,6,0,80,0,0,0,3,0,121, + 0,0,9,125,5,213,0,13,0,22,0,31,0,0,1,32,0,17,16,0,41,1,32,0,17,16,0,33,1,51,32,0,17,16,0,33,35,3,17,35, + 32,0,17,16,0,33,6,53,1,178,1,150,254,104,254,80,253,140,254,80,254,104,1,150,1,178,1,159,244,1,53,1,31,254,225,254,203,244,202,244, + 254,203,254,225,1,31,1,53,5,213,254,151,254,128,254,126,254,150,1,106,1,130,1,128,1,105,250,209,1,24,1,46,1,44,1,23,251,119,4,137, + 254,233,254,212,254,210,254,232,0,3,0,201,0,0,5,176,5,213,0,17,0,26,0,35,0,251,186,0,9,0,27,0,3,43,184,0,9,16,186,0, + 14,0,23,0,3,43,184,0,14,16,186,0,31,0,5,0,3,43,184,0,31,16,184,0,9,16,184,0,0,208,65,5,0,234,0,5,0,250,0,5, + 0,2,93,65,27,0,25,0,5,0,41,0,5,0,57,0,5,0,73,0,5,0,89,0,5,0,105,0,5,0,121,0,5,0,137,0,5,0,153,0, + 5,0,169,0,5,0,185,0,5,0,201,0,5,0,217,0,5,0,13,93,184,0,9,16,184,0,18,208,65,5,0,234,0,23,0,250,0,23,0,2, + 93,65,27,0,25,0,23,0,41,0,23,0,57,0,23,0,73,0,23,0,89,0,23,0,105,0,23,0,121,0,23,0,137,0,23,0,153,0,23,0, + 169,0,23,0,185,0,23,0,201,0,23,0,217,0,23,0,13,93,184,0,31,16,184,0,37,220,0,186,0,2,0,34,0,3,43,184,0,2,16,186, + 0,28,0,8,0,3,43,184,0,28,16,186,0,19,0,0,0,3,43,184,0,19,16,186,0,10,0,18,0,3,43,184,0,10,16,48,49,1,21,51, + 32,0,17,16,0,33,35,21,51,32,22,21,20,6,35,3,17,51,50,54,53,52,38,35,1,33,32,0,17,16,0,41,1,1,147,244,1,53,1,31, + 254,225,254,203,244,72,1,0,240,241,255,72,78,159,147,147,159,254,232,1,159,1,178,1,150,254,104,254,80,254,97,1,89,179,1,24,1,46,1,44, + 1,23,178,194,207,208,195,2,158,253,232,129,140,138,129,1,222,254,151,254,128,254,126,254,150,0,0,0,0,5,0,121,0,0,9,125,5,213,0,17, + 0,26,0,40,0,49,0,67,0,0,1,21,51,32,22,21,20,6,43,1,21,51,32,0,17,16,0,33,3,51,50,54,53,52,38,43,1,19,33,32, + 0,17,16,0,41,1,32,0,17,16,0,1,17,35,34,6,21,20,22,51,19,53,35,32,0,17,16,0,33,51,53,35,34,38,53,52,54,33,5,96, + 72,1,0,240,241,255,72,244,1,53,1,31,254,225,254,203,244,78,159,147,147,159,78,213,253,140,254,80,254,104,1,150,1,178,2,116,1,178,1,150, + 254,104,252,177,78,159,147,147,159,78,244,254,203,254,225,1,31,1,53,244,72,255,241,240,1,0,5,47,178,194,207,208,195,179,1,24,1,46,1,44, + 1,23,252,176,129,140,138,129,252,9,1,106,1,130,1,128,1,105,254,151,254,128,254,126,254,150,1,223,2,24,129,138,140,129,2,158,178,254,233,254, + 212,254,210,254,232,179,195,208,207,194,0,0,255,255,0,115,255,227,5,39,5,240,16,6,1,72,0,0,255,255,0,127,255,227,3,245,4,123,16,6, + 2,22,0,0,0,1,0,115,254,86,5,39,5,240,0,28,0,0,1,21,46,1,35,32,0,17,16,0,33,50,54,55,17,35,17,6,7,6,35,32, + 0,17,16,0,33,50,22,5,39,102,231,130,255,0,254,240,1,16,1,0,130,231,102,201,12,12,118,132,254,173,254,122,1,134,1,83,134,237,5,98, + 213,95,94,254,199,254,216,254,217,254,199,94,95,253,16,1,185,4,4,36,1,159,1,103,1,104,1,159,71,0,0,0,255,255,0,87,255,227,7,88, + 5,240,16,39,11,34,3,53,0,0,16,39,0,117,4,139,253,100,16,6,11,73,0,0,0,1,0,100,0,204,6,63,4,56,0,9,0,129,180,2, + 9,6,0,10,16,212,212,204,50,64,9,64,2,64,9,48,2,48,9,4,93,49,64,10,2,5,9,1,0,6,5,156,6,10,0,16,212,236,17,57, + 57,204,16,204,48,64,12,8,9,9,0,8,7,8,7,156,0,9,0,7,5,16,252,60,8,6,16,60,64,12,3,2,2,1,3,4,3,4,156,1, + 2,1,7,5,16,252,60,8,6,16,60,176,16,75,83,88,0,179,3,2,8,9,16,60,16,60,180,8,156,9,9,0,7,5,16,236,180,3,156,2, + 2,1,7,5,16,236,89,19,53,1,23,7,33,21,33,23,7,100,1,137,120,233,4,195,251,61,233,120,2,85,90,1,137,120,233,170,233,120,0,0, + 0,1,1,163,0,0,5,15,5,220,0,9,0,129,64,10,2,5,9,1,0,6,5,156,6,10,16,212,236,17,57,57,204,16,204,49,0,180,2,9, + 6,0,10,16,212,212,204,50,64,9,79,2,79,9,63,2,63,9,4,93,48,64,12,8,9,9,0,8,7,8,7,156,0,9,0,7,4,16,252,60, + 8,6,16,60,64,12,3,2,2,1,3,4,3,4,156,1,2,1,7,4,16,252,60,8,6,16,60,176,16,75,83,88,1,179,3,2,8,9,16,60, + 16,60,180,8,156,9,9,0,7,4,16,236,180,3,156,2,2,1,7,4,16,236,89,1,51,1,7,39,17,35,17,7,39,3,45,90,1,136,120,232, + 170,234,120,5,220,254,118,120,234,251,60,4,196,234,120,0,0,1,0,117,0,204,6,80,4,56,0,9,0,129,180,2,9,0,6,10,16,212,212,204, + 50,64,9,79,2,79,9,95,2,95,9,4,93,49,64,10,9,6,2,1,0,5,6,156,5,10,0,16,212,236,17,57,57,204,16,204,48,64,12,8, + 9,9,0,8,7,8,7,156,0,9,0,7,5,16,252,60,8,6,16,60,64,12,3,2,2,1,3,4,3,4,156,1,2,1,7,5,16,252,60,8, + 6,16,60,176,16,75,83,88,0,179,3,2,8,9,16,60,16,60,180,8,156,9,9,0,7,5,16,236,180,3,156,2,2,1,7,5,16,236,89,1, + 21,1,39,55,33,53,33,39,55,6,80,254,119,120,233,251,61,4,195,233,120,2,175,90,254,119,120,233,170,233,120,0,0,1,1,163,255,249,5,15, + 5,213,0,9,0,129,64,10,9,6,2,1,0,5,6,156,5,10,16,212,236,17,57,57,204,16,204,49,0,180,2,9,0,6,10,16,212,212,204,50, + 64,9,64,2,64,9,80,2,80,9,4,93,48,64,12,8,9,9,0,8,7,8,7,156,0,9,0,7,4,16,252,60,8,6,16,60,64,12,3,2, + 2,1,3,4,3,4,156,1,2,1,7,4,16,252,60,8,6,16,60,176,16,75,83,88,1,179,3,2,8,9,16,60,16,60,180,8,156,9,9,0, + 7,4,16,236,180,3,156,2,2,1,7,4,16,236,89,5,35,1,55,23,17,51,17,55,23,3,135,90,254,118,120,234,170,232,120,7,1,138,120,234, + 4,196,251,60,234,120,0,0,0,1,0,100,0,204,6,80,4,56,0,15,0,218,182,7,10,9,2,15,0,16,16,212,204,50,212,204,50,64,13,80, + 2,80,15,95,10,95,7,79,10,79,7,6,93,49,0,64,15,7,2,4,10,15,0,1,8,9,4,13,4,156,13,16,16,212,236,17,23,57,204,50, + 16,204,50,48,64,12,14,15,15,0,14,13,14,13,156,0,15,0,7,5,16,252,60,8,6,16,60,64,12,3,2,2,1,3,4,3,4,156,1,2, + 1,7,5,16,252,60,8,6,16,60,64,12,11,10,10,9,11,12,11,12,156,9,9,10,7,5,16,252,60,8,6,16,60,64,12,6,7,7,8,6, + 5,6,5,156,8,7,8,7,5,16,252,60,8,6,16,60,176,16,75,83,88,0,183,11,10,6,7,3,2,14,15,16,60,16,60,16,60,16,60,180, + 14,156,15,15,0,7,5,16,236,180,3,156,2,2,1,7,5,16,236,180,11,156,10,10,9,7,5,16,236,180,6,156,7,7,8,7,5,16,236,89, + 19,53,1,23,7,33,39,55,1,21,1,39,55,33,23,7,100,1,137,120,233,3,188,233,120,1,137,254,119,120,233,252,68,233,120,2,85,90,1,137, + 120,233,233,120,254,119,90,254,119,120,233,233,120,0,0,0,0,1,1,163,255,239,5,15,5,220,0,15,0,222,64,15,7,2,4,10,15,0,1,8, + 9,4,13,4,156,13,16,16,212,236,17,23,57,204,50,16,204,50,49,0,182,7,10,9,2,15,0,16,16,212,204,50,212,204,50,64,17,95,2,95, + 15,80,10,80,7,79,2,79,15,64,10,64,7,8,93,48,64,12,14,15,15,0,14,13,14,13,156,0,15,0,7,4,16,252,60,8,6,16,60,64, + 12,3,2,2,1,3,4,3,4,156,1,2,1,7,4,16,252,60,8,6,16,60,64,12,11,10,10,9,11,12,11,12,156,9,9,10,7,4,16,252, + 60,8,6,16,60,64,12,6,7,7,8,6,5,6,5,156,8,7,8,7,4,16,252,60,8,6,16,60,176,16,75,83,88,1,183,11,10,6,7,3, + 2,14,15,16,60,16,60,16,60,16,60,180,14,156,15,15,0,7,4,16,236,180,3,156,2,2,1,7,4,16,236,180,11,156,10,10,9,7,4,16, + 236,180,6,156,7,7,8,7,4,16,236,89,1,51,1,7,39,17,55,23,1,35,1,55,23,17,7,39,3,45,90,1,136,120,232,232,120,254,120,90, + 254,118,120,234,234,120,5,220,254,118,120,234,252,67,234,120,254,118,1,138,120,234,3,189,234,120,0,0,0,1,1,32,0,52,5,159,4,179,0,9, + 0,0,1,55,33,21,33,1,7,1,17,35,1,32,63,2,44,254,182,3,94,120,252,162,169,4,116,63,169,252,162,120,3,94,254,182,0,1,1,32, + 0,52,5,159,4,179,0,9,0,0,1,23,17,35,17,1,39,1,33,53,5,96,63,169,252,162,120,3,94,254,182,4,179,63,253,212,1,74,252,162, + 120,3,94,169,0,1,1,32,0,52,5,159,4,179,0,9,0,0,37,7,33,53,33,1,55,1,17,51,5,159,63,253,212,1,74,252,162,120,3,94, + 169,115,63,169,3,94,120,252,162,1,74,0,0,1,1,32,0,52,5,159,4,179,0,9,0,0,37,39,17,51,17,1,23,1,33,21,1,95,63,169, + 3,94,120,252,162,1,74,52,63,2,44,254,182,3,94,120,252,162,169,0,0,1,0,100,0,204,6,63,4,56,0,17,0,0,1,3,39,19,33,23, + 7,1,53,1,23,7,33,19,23,3,33,21,4,66,200,148,151,253,255,233,120,254,119,1,137,120,233,2,100,200,148,151,1,154,2,45,254,165,85,1, + 6,233,120,1,137,90,1,137,120,233,1,91,85,254,250,170,0,1,0,117,0,204,6,80,4,56,0,17,0,0,1,19,23,3,33,39,55,1,21,1, + 39,55,33,3,39,19,33,53,2,114,200,148,151,2,1,233,120,1,137,254,119,120,233,253,156,200,148,151,254,102,2,215,1,91,85,254,250,233,120,254, + 119,90,254,119,120,233,254,165,85,1,6,170,0,1,0,44,0,211,6,158,3,80,0,52,0,0,1,22,23,22,51,50,55,62,1,55,54,55,54,55, + 54,51,50,23,22,23,22,23,7,38,39,38,39,38,35,34,7,6,7,6,7,6,7,6,7,6,35,34,39,38,47,1,17,35,17,55,33,21,5,1, + 237,35,47,41,56,53,44,48,70,21,34,60,59,78,74,88,91,71,82,55,60,34,157,21,35,33,50,41,56,53,44,47,36,35,21,31,63,50,87,71, + 91,88,74,78,59,160,169,63,2,44,254,182,1,244,33,21,19,19,21,70,48,79,60,58,34,32,32,37,55,60,79,65,48,35,33,23,19,19,20,36, + 35,48,73,66,53,39,32,32,34,58,160,254,182,2,44,63,169,1,0,0,0,1,0,22,0,211,6,136,3,80,0,52,0,0,1,55,37,53,33,23, + 17,35,17,7,6,7,6,35,34,39,38,39,38,39,38,39,38,39,38,35,34,7,6,7,6,7,39,54,55,54,55,54,51,50,23,22,23,22,23,30, + 1,23,22,51,50,55,54,4,199,160,254,182,2,44,63,169,160,59,78,74,88,91,71,87,50,63,31,21,35,36,47,44,53,56,41,50,33,35,21,157, + 34,60,55,82,71,91,88,74,78,59,60,34,21,70,48,44,53,56,41,47,1,244,160,1,169,63,253,212,1,74,160,58,34,32,32,39,53,66,73,48, + 35,36,20,19,19,23,33,35,48,65,79,60,55,37,32,32,34,58,60,79,48,70,21,19,19,21,0,0,0,1,0,100,0,204,6,63,4,56,0,17, + 0,0,19,1,23,7,51,1,23,7,33,21,33,23,7,1,35,23,7,1,100,1,137,120,233,240,1,97,120,233,2,227,253,29,233,120,254,159,240,233, + 120,254,119,2,175,1,137,120,233,1,97,120,233,170,233,120,1,97,233,120,1,137,0,0,0,1,1,165,0,0,5,17,5,220,0,17,0,0,9,1, + 7,39,21,1,7,39,17,35,17,7,39,1,53,7,39,1,3,135,1,138,120,234,1,98,120,234,170,232,120,1,96,232,120,1,136,5,220,254,118,120, + 234,240,254,158,120,234,253,28,2,228,234,120,1,98,240,234,120,1,138,0,0,1,0,117,0,204,6,80,4,56,0,17,0,0,9,1,39,55,35,1, + 39,55,33,53,33,39,55,1,51,39,55,1,6,80,254,119,120,233,240,254,159,120,233,253,29,2,227,233,120,1,97,240,233,120,1,137,2,85,254,119, + 120,233,254,159,120,233,170,233,120,254,159,233,120,254,119,0,0,1,1,165,255,249,5,17,5,213,0,17,0,0,5,1,55,23,53,1,55,23,17,51, + 17,55,23,1,21,55,23,1,3,47,254,118,120,234,254,158,120,234,170,232,120,254,160,232,120,254,120,7,1,138,120,234,240,1,98,120,234,2,228,253, + 28,234,120,254,158,240,234,120,254,118,0,0,0,1,0,100,0,204,6,63,4,56,0,14,0,0,19,53,1,23,7,33,1,23,9,1,7,1,33,23, + 7,100,1,137,120,233,2,234,1,97,120,254,194,1,62,120,254,159,253,22,233,120,2,85,90,1,137,120,233,1,97,120,254,194,254,194,120,1,97,233, + 120,0,0,0,0,1,0,117,0,204,6,80,4,56,0,14,0,0,9,1,39,55,33,1,39,9,1,55,1,33,39,55,1,6,80,254,119,120,233,253, + 22,254,159,120,1,62,254,194,120,1,97,2,234,233,120,1,137,2,85,254,119,120,233,254,159,120,1,62,1,62,120,254,159,233,120,254,119,0,0,0, + 0,1,0,100,0,204,6,63,4,56,0,13,0,0,1,33,23,7,1,53,1,23,7,33,17,51,17,35,5,149,251,231,233,120,254,119,1,137,120,233, + 4,25,170,170,2,45,233,120,1,137,90,1,137,120,233,1,89,252,164,0,0,1,1,165,0,0,5,15,5,220,0,13,0,0,37,17,7,39,1,51, + 1,7,39,17,33,21,33,53,3,5,232,120,1,136,90,1,136,120,232,1,90,252,164,170,4,26,234,120,1,138,254,118,120,234,251,230,170,170,0,0, + 0,1,0,117,0,204,6,80,4,56,0,13,0,134,183,12,9,10,6,2,156,4,14,16,212,236,50,212,204,50,64,9,79,9,79,12,95,9,95,12, + 4,93,49,64,10,9,5,11,10,6,156,12,3,1,14,0,16,212,204,204,252,57,57,204,204,48,64,12,8,9,9,10,8,7,8,7,156,10,9,10, + 7,5,16,252,60,8,6,16,60,64,12,13,12,12,11,13,0,13,0,156,11,12,11,7,5,16,252,60,8,6,16,60,176,16,75,83,88,0,179,13, + 12,8,9,16,60,16,60,180,8,156,9,9,10,7,5,16,236,180,13,156,12,12,11,7,5,16,236,89,1,33,17,35,17,51,17,33,39,55,1,21, + 1,39,5,56,251,231,170,170,4,25,233,120,1,137,254,119,120,2,45,254,167,3,92,254,167,233,120,254,119,90,254,119,120,0,0,0,0,1,1,165, + 255,249,5,15,5,213,0,13,0,0,1,33,53,33,21,33,17,55,23,1,35,1,55,23,3,5,254,168,3,92,254,166,232,120,254,120,90,254,120,120, + 232,5,43,170,170,251,230,234,120,254,118,1,138,120,234,0,0,1,1,165,0,0,5,15,5,220,0,19,0,0,1,55,23,1,33,21,33,53,33,1, + 55,23,17,7,39,1,51,1,7,39,3,175,232,120,254,120,1,130,252,164,1,128,254,120,120,232,232,120,1,136,90,1,136,120,232,1,194,234,120,254, + 118,170,170,1,138,120,234,3,2,234,120,1,138,254,118,120,234,0,0,0,0,1,0,100,0,204,6,62,4,134,0,37,0,0,1,53,50,23,22,23, + 30,1,21,20,6,7,6,7,6,35,33,23,7,1,53,1,23,7,33,32,55,54,55,62,1,53,52,38,39,38,39,38,5,19,62,52,50,47,43,45, + 43,45,39,58,49,32,252,72,233,120,254,119,1,137,120,233,1,217,1,217,22,24,19,18,20,19,19,19,24,22,3,220,170,22,21,45,41,111,61,60, + 106,46,40,26,22,233,120,1,137,90,1,137,120,233,10,10,18,17,49,26,27,46,20,18,10,10,0,0,0,1,0,118,0,204,6,80,4,134,0,41, + 0,0,1,34,7,6,7,6,7,6,21,20,23,22,23,22,23,22,51,33,39,55,1,21,1,39,55,33,34,39,38,39,38,39,38,53,52,55,54,55, + 54,55,54,51,1,161,27,22,24,19,18,10,10,10,12,16,19,24,22,27,3,151,233,120,1,137,254,119,120,233,252,105,65,49,58,39,45,21,22,22, + 23,43,47,50,52,62,3,220,10,10,18,17,26,23,27,26,23,28,15,18,10,10,233,120,254,119,90,254,119,120,233,22,26,40,46,52,54,60,61,54, + 57,41,45,21,22,0,0,0,0,2,0,100,0,204,6,62,4,134,0,24,0,62,0,0,1,51,50,55,54,55,54,55,54,53,52,39,38,39,38,39, + 38,34,7,6,7,6,7,6,21,7,53,52,55,54,55,54,55,54,51,50,23,22,23,22,23,22,21,20,7,6,7,6,7,6,43,1,21,35,53,33, + 23,7,1,53,1,23,7,4,145,130,27,22,24,19,18,10,10,10,10,18,19,24,22,54,22,24,19,16,12,10,169,22,23,43,47,50,52,62,65,49, + 58,39,45,21,22,22,23,43,47,50,52,62,130,169,253,148,233,120,254,119,1,137,120,233,2,215,10,10,18,17,26,23,26,27,23,26,17,18,10,10, + 10,10,18,15,28,23,27,130,130,61,54,57,41,45,21,22,22,26,40,46,52,54,61,60,54,57,41,45,21,22,220,220,233,120,1,137,90,1,137,120, + 233,0,0,0,0,2,0,118,0,204,6,80,4,134,0,24,0,62,0,0,1,53,52,39,38,39,38,39,38,34,7,6,7,6,7,6,21,20,23,22, + 23,22,23,22,51,41,1,39,55,1,21,1,39,55,33,21,35,53,35,34,39,38,39,38,39,38,53,52,55,54,55,54,55,54,51,50,23,22,23,22, + 23,22,21,2,35,10,12,16,19,24,22,54,22,24,19,18,10,10,10,10,18,19,24,22,27,1,43,2,108,233,120,1,137,254,119,120,233,253,148,169, + 130,62,52,50,47,43,23,22,22,21,45,39,58,49,65,62,52,50,47,43,23,22,2,215,130,27,23,28,15,18,10,10,10,10,18,17,26,23,27,26, + 23,26,17,18,10,10,233,120,254,119,90,254,119,120,233,220,220,22,21,45,41,57,54,60,61,54,52,46,40,26,22,22,21,45,41,57,54,61,0,0, + 0,1,0,100,0,204,6,80,4,56,0,88,0,0,1,35,23,7,1,53,1,23,7,51,50,23,22,23,30,1,50,54,55,54,55,54,55,54,55,54, + 51,50,23,22,23,22,23,22,23,30,1,50,54,55,54,55,54,59,1,39,55,1,21,1,39,55,35,34,7,6,7,6,7,6,34,39,38,39,38,39, + 38,39,38,39,38,34,7,6,7,6,7,6,7,6,7,6,34,39,38,39,38,39,38,1,134,10,233,120,254,119,1,137,120,233,10,48,36,35,36,10, + 24,27,24,10,10,5,16,32,34,37,39,45,48,36,39,32,33,15,5,10,10,24,27,24,10,39,32,39,45,10,233,120,1,137,254,119,120,233,10,14, + 11,13,10,31,40,39,90,38,40,31,34,15,4,10,10,13,11,28,11,13,10,9,5,15,34,31,40,38,90,39,40,31,10,13,11,2,45,233,120,1, + 137,90,1,137,120,233,18,18,36,10,12,12,10,12,13,45,35,37,17,18,18,20,34,38,42,13,12,10,12,12,10,39,15,18,233,120,254,119,90,254, + 119,120,233,6,6,10,34,20,18,18,20,34,38,42,13,12,10,6,6,6,6,10,9,16,42,38,34,20,18,18,20,34,10,6,6,0,0,1,0,100, + 0,190,6,80,4,70,0,23,0,0,37,39,19,33,23,7,1,53,1,23,7,33,19,23,3,33,39,55,1,21,1,39,55,33,3,16,160,112,254,156, + 233,120,254,119,1,137,120,233,1,162,134,160,112,1,100,233,120,1,137,254,119,120,233,254,94,190,58,1,53,233,120,1,137,90,1,137,120,233,1,111, + 58,254,203,233,120,254,119,90,254,119,120,233,0,1,1,42,255,252,5,157,5,216,0,13,0,0,9,1,19,23,3,1,3,37,23,1,39,1,55,19, + 4,9,253,33,157,167,94,2,223,193,1,13,98,254,57,89,254,193,139,190,4,8,254,88,3,120,29,253,238,1,168,251,184,190,139,254,192,16,1,200, + 98,254,241,0,0,1,1,90,0,0,5,9,5,242,0,11,0,0,1,17,35,17,33,23,7,1,53,1,23,7,5,9,170,254,19,233,120,254,119,1, + 137,120,233,4,145,251,111,3,231,233,120,1,137,90,1,137,120,233,0,0,0,1,1,172,0,0,5,91,5,242,0,11,0,0,1,33,39,55,1,21, + 1,39,55,33,17,35,1,172,2,151,233,120,1,137,254,119,120,233,254,19,170,4,145,233,120,254,119,90,254,119,120,233,252,25,0,0,0,1,1,90, + 255,227,5,9,5,213,0,11,0,0,1,33,23,7,1,53,1,23,7,33,17,51,5,9,253,105,233,120,254,119,1,137,120,233,1,237,170,1,68,233, + 120,1,137,90,1,137,120,233,3,231,0,0,0,1,1,172,255,227,5,91,5,213,0,11,0,0,1,17,51,17,33,39,55,1,21,1,39,55,1,172, + 170,1,237,233,120,1,137,254,119,120,233,1,68,4,145,252,25,233,120,254,119,90,254,119,120,233,0,0,0,1,1,221,255,249,6,20,4,212,0,11, + 0,0,1,17,55,23,1,35,1,55,23,17,33,53,4,179,233,120,254,119,90,254,119,120,233,253,212,4,212,252,61,233,120,254,119,1,137,120,233,3, + 25,170,0,0,0,1,0,100,0,204,5,63,5,3,0,11,0,0,1,33,23,7,1,53,1,23,7,33,17,51,5,63,252,61,233,120,254,119,1,137, + 120,233,3,25,170,2,45,233,120,1,137,90,1,137,120,233,2,44,0,0,0,1,0,45,1,160,6,101,5,88,0,38,0,0,1,55,23,1,35,1, + 55,23,53,52,55,54,55,54,55,54,32,23,22,23,22,23,22,21,35,52,38,39,38,39,38,34,7,6,7,6,7,6,21,2,57,232,120,254,120,90, + 254,118,120,234,46,45,92,90,110,108,1,0,108,110,90,92,45,46,170,66,66,60,86,74,190,78,82,64,64,35,33,2,184,234,120,254,118,1,138,120, + 234,50,127,112,107,95,86,49,46,46,49,86,95,107,112,127,93,162,66,59,39,33,33,35,63,64,83,81,93,0,0,0,0,1,0,79,1,160,6,135, + 5,88,0,38,0,0,1,53,52,39,38,39,38,39,38,34,7,6,7,14,1,21,35,52,55,54,55,54,55,54,32,23,22,23,22,23,22,29,1,55, + 23,1,35,1,55,4,123,33,35,64,64,82,78,190,74,86,60,66,66,170,46,45,92,90,110,108,1,0,108,110,90,92,45,46,234,120,254,118,90,254, + 120,120,2,184,50,93,81,83,64,63,35,33,33,39,59,66,162,93,127,112,107,95,86,49,46,46,49,86,95,107,112,127,50,234,120,254,118,1,138,120, + 0,2,0,222,0,52,6,77,5,213,0,3,0,13,0,0,19,53,33,21,5,55,33,21,33,1,7,1,17,35,222,5,111,250,211,63,2,44,254,182, + 3,94,120,252,162,169,5,114,99,99,254,63,169,252,162,120,3,94,254,182,0,2,0,112,255,161,6,68,5,99,0,13,0,27,0,0,19,53,33,39, + 55,1,17,51,17,35,17,1,39,55,1,33,23,7,1,17,35,17,51,17,1,23,7,33,112,4,18,234,120,1,138,170,170,254,118,120,234,1,194,251, + 238,234,120,254,118,170,170,1,138,120,234,4,18,1,1,170,232,120,254,120,1,78,253,8,1,80,254,120,120,232,2,88,232,120,1,136,254,176,2,248, + 254,178,1,136,120,232,0,0,0,1,0,211,0,127,6,25,5,112,0,54,0,0,1,6,7,6,21,20,22,23,22,23,22,50,55,54,55,62,1,53, + 52,39,38,47,1,17,35,17,55,33,21,33,23,22,23,22,21,20,7,6,7,6,7,6,35,34,39,38,39,38,39,38,53,52,55,54,55,2,2,68, + 32,33,66,66,60,86,74,190,78,82,64,66,66,33,34,66,35,170,64,2,44,254,182,35,90,47,46,46,48,89,84,116,103,133,128,108,112,88,89,48, + 46,46,45,92,4,43,66,81,81,93,90,162,66,59,39,33,33,35,63,66,162,90,93,81,81,66,35,254,182,2,44,64,170,35,90,112,112,127,124,112, + 113,89,83,52,46,46,48,87,89,113,112,124,127,112,107,95,0,1,0,157,0,127,5,227,5,112,0,54,0,0,1,55,22,23,22,21,20,7,6,7, + 6,7,6,35,34,39,38,39,38,39,38,53,52,55,54,63,1,33,53,33,23,17,35,17,7,6,7,6,21,20,22,23,22,23,22,50,55,54,55,62, + 1,53,52,39,38,4,180,120,92,45,46,46,48,89,88,112,108,128,133,103,116,84,89,48,46,46,47,90,35,254,182,2,44,64,170,35,66,34,33,66, + 66,64,82,78,190,74,86,60,66,66,33,32,4,43,120,95,107,112,127,124,112,113,89,87,48,46,46,52,83,89,113,112,124,127,112,112,90,35,170,64, + 253,212,1,74,35,66,81,81,93,90,162,66,63,35,33,33,39,59,66,162,90,93,81,81,0,1,0,100,2,45,6,63,4,56,0,6,0,75,179,2, + 6,0,7,16,212,204,204,180,64,5,80,5,2,93,49,181,2,1,5,156,6,7,0,16,212,252,57,204,48,64,12,3,2,2,1,3,4,3,4,156, + 1,2,1,7,5,16,252,60,8,6,16,60,176,16,75,83,88,0,182,3,156,2,2,1,3,2,16,60,7,5,16,236,89,19,53,1,23,7,33,21, + 100,1,137,120,233,4,195,2,45,130,1,137,120,233,170,0,0,1,0,100,0,204,6,63,2,215,0,6,0,75,179,5,2,0,7,16,212,204,204,180, + 64,5,80,5,2,93,49,181,5,6,1,156,2,7,0,16,212,236,57,204,48,64,12,4,5,5,6,4,3,4,3,156,6,5,6,7,5,16,252,60, + 8,6,16,60,176,16,75,83,88,0,182,4,156,5,5,6,4,5,16,60,7,5,16,236,89,19,33,21,33,23,7,1,100,5,219,251,61,233,120,254, + 119,2,215,170,233,120,1,137,0,1,3,5,0,0,5,15,5,220,0,6,0,0,1,51,1,7,39,17,35,3,5,130,1,136,120,232,170,5,220,254, + 118,120,234,251,60,0,0,0,0,1,1,163,0,0,3,175,5,220,0,6,0,0,1,17,35,17,7,39,1,3,175,170,234,120,1,138,5,220,250,36, + 4,196,234,120,1,138,0,0,0,1,0,117,2,45,6,80,4,56,0,6,0,75,179,5,6,2,7,16,212,212,204,180,79,5,95,5,2,93,49,181, + 5,6,2,156,1,7,0,16,212,252,57,204,48,64,12,4,5,5,6,4,3,4,3,156,6,5,6,7,5,16,252,60,8,6,16,60,176,16,75,83, + 88,0,182,4,156,5,5,6,4,5,16,60,7,5,16,236,89,1,33,53,33,39,55,1,6,80,250,37,4,195,233,120,1,137,2,45,170,233,120,254, + 119,0,0,0,0,1,0,117,0,204,6,80,2,215,0,6,0,75,179,2,0,6,7,16,212,212,204,180,79,5,95,5,2,93,49,181,2,1,6,156, + 5,7,0,16,212,236,57,204,48,64,12,3,2,2,1,3,4,3,4,156,1,2,1,7,5,16,252,60,9,7,16,60,176,16,75,83,88,0,182,3, + 156,2,2,1,3,2,16,60,7,5,16,236,89,1,21,1,39,55,33,53,6,80,254,119,120,233,251,61,2,215,130,254,119,120,233,170,0,1,3,5, + 0,0,5,15,5,220,0,6,0,0,33,17,51,17,55,23,1,3,5,170,232,120,254,120,5,220,251,60,234,120,254,118,0,1,1,163,0,0,3,175, + 5,220,0,6,0,0,33,35,1,55,23,17,51,3,175,130,254,118,120,234,170,1,138,120,234,4,196,0,255,255,0,100,255,160,6,80,5,100,16,39, + 12,21,0,0,254,212,16,7,12,23,0,0,1,44,0,0,255,255,0,119,255,249,6,59,5,220,16,39,12,24,1,44,0,0,16,7,12,22,254,212, + 0,0,0,0,255,255,0,100,255,160,6,80,5,100,16,39,12,23,0,0,254,212,16,7,12,21,0,0,1,44,0,0,0,1,0,100,255,160,6,63, + 5,100,0,17,0,0,1,3,53,1,23,7,33,21,33,23,7,33,21,33,23,7,1,53,1,99,255,1,137,120,233,4,195,251,61,215,215,4,195,251, + 61,233,120,254,119,2,130,0,255,90,1,137,120,233,170,215,215,170,233,120,1,137,90,0,0,1,0,120,0,0,6,60,5,220,0,17,0,0,1,19, + 51,1,7,39,17,35,17,7,39,17,35,17,7,39,1,51,3,90,254,90,1,138,120,234,170,214,216,170,232,120,1,136,90,4,220,1,0,254,118,120, + 234,251,60,4,196,216,216,251,60,4,196,234,120,1,138,0,0,1,0,118,255,160,6,81,5,100,0,17,0,0,1,5,21,1,39,55,33,53,33,39, + 55,33,53,33,39,55,1,21,5,82,0,255,254,119,120,233,251,61,4,195,215,215,251,61,4,195,233,120,1,137,2,130,255,90,254,119,120,233,170,215, + 215,170,233,120,254,119,90,0,0,1,0,120,255,249,6,60,5,213,0,17,0,0,37,1,35,1,55,23,17,51,17,55,23,17,51,17,55,23,1,35, + 3,90,255,0,90,254,120,120,232,170,216,214,170,234,120,254,118,90,249,255,0,1,138,120,234,4,196,251,60,216,216,4,196,251,60,234,120,254,118,0, + 255,255,0,100,0,14,6,80,4,246,16,39,12,70,0,0,255,66,16,7,12,65,0,0,0,190,0,0,255,255,0,100,0,14,6,80,4,246,16,39, + 12,66,0,0,255,66,16,7,12,69,0,0,0,190,0,0,0,2,0,100,0,204,6,63,4,56,0,4,0,26,0,0,1,33,7,23,33,37,7,33, + 21,33,7,39,55,33,23,7,1,53,1,23,7,33,55,23,7,33,21,3,247,253,153,105,105,1,238,1,38,121,2,20,253,167,117,130,73,254,208,93, + 120,254,119,1,137,120,93,2,52,117,130,73,1,85,2,235,105,105,210,210,120,202,75,127,93,120,1,137,90,1,137,120,93,202,75,127,120,0,0,0, + 0,3,0,100,0,193,6,80,4,67,0,23,0,28,0,33,0,0,37,39,55,35,23,7,1,53,1,23,7,33,55,23,7,51,39,55,1,21,1,39, + 55,33,19,7,33,55,39,41,1,7,23,33,3,7,141,62,176,93,120,254,119,1,137,120,93,1,84,81,141,62,176,93,120,1,137,254,119,120,93,254, + 172,120,76,1,160,105,105,254,12,254,96,105,105,1,84,193,52,172,93,120,1,137,90,1,137,120,93,224,52,172,93,120,254,119,90,254,119,120,93,1, + 74,210,105,105,105,105,0,0,0,2,0,117,0,204,6,80,4,56,0,4,0,26,0,0,1,33,55,39,33,5,55,33,53,33,55,23,7,33,39,55, + 1,21,1,39,55,33,7,39,55,33,53,2,189,2,103,105,105,254,18,254,218,121,253,236,2,89,117,130,73,1,48,93,120,1,137,254,119,120,93,253, + 204,117,130,73,254,171,2,25,105,105,210,210,120,202,75,127,93,120,254,119,90,254,119,120,93,202,75,127,120,0,0,0,0,1,0,100,0,204,6,63, + 4,56,0,14,0,0,1,33,21,33,23,7,1,53,1,23,7,33,21,33,7,1,144,4,175,251,201,93,120,254,119,1,137,120,93,4,55,251,81,105, + 2,25,120,93,120,1,137,90,1,137,120,93,120,105,0,0,0,1,1,165,0,0,5,17,5,220,0,14,0,0,1,17,35,17,7,39,1,51,1,7, + 39,17,35,17,39,2,241,120,92,120,1,136,90,1,138,120,94,120,104,4,176,251,80,4,56,94,120,1,138,254,118,120,94,251,200,4,176,104,0,0, + 0,1,0,117,0,204,6,80,4,56,0,14,0,0,1,55,39,33,53,33,39,55,1,21,1,39,55,33,53,5,36,105,105,251,81,4,55,93,120,1, + 137,254,119,120,93,251,201,2,25,105,105,120,93,120,254,119,90,254,119,120,93,120,0,0,0,1,1,165,255,249,5,17,5,213,0,14,0,0,1,23, + 55,17,51,17,55,23,1,35,1,55,23,17,51,2,241,106,104,120,94,120,254,118,90,254,120,120,92,120,1,37,104,104,4,176,251,200,94,120,254,118, + 1,138,120,94,4,56,0,0,0,2,0,100,0,204,6,80,4,56,0,5,0,21,0,0,1,33,55,39,33,7,5,33,23,7,1,53,1,23,7,33, + 39,55,1,21,1,39,1,144,3,148,105,105,252,108,105,3,133,253,92,93,120,254,119,1,137,120,93,2,164,93,120,1,137,254,119,120,2,25,105,105, + 105,225,93,120,1,137,90,1,137,120,93,93,120,254,119,90,254,119,120,0,0,2,1,164,255,240,5,16,5,220,0,5,0,21,0,0,1,17,23,55, + 17,39,3,17,7,39,1,51,1,7,39,17,55,23,1,35,1,55,2,241,105,105,105,225,93,120,1,137,90,1,137,120,93,93,120,254,119,90,254,119, + 120,4,176,252,108,105,105,3,148,105,252,123,2,164,93,120,1,137,254,119,120,93,253,92,93,120,254,119,1,137,120,0,0,1,1,32,255,209,6,3, + 4,179,0,14,0,0,9,1,7,1,21,35,17,55,33,21,35,1,7,1,35,1,201,3,80,85,253,5,169,63,2,44,131,2,251,85,252,176,149,3, + 118,252,176,85,2,251,132,2,44,63,169,253,5,85,3,80,0,1,0,188,255,209,5,159,4,179,0,14,0,0,1,53,35,1,39,1,35,53,33,23, + 17,35,53,1,39,4,246,149,252,176,85,2,251,131,2,44,63,169,253,5,85,3,118,148,252,176,85,2,251,169,63,253,212,132,253,5,85,0,0,0, + 0,1,0,188,0,52,5,159,5,22,0,14,0,0,9,1,55,1,53,51,17,7,33,53,51,1,55,1,51,4,246,252,176,85,2,251,169,63,253,212, + 131,253,5,85,3,80,149,1,113,3,80,85,253,5,132,253,212,63,169,2,251,85,252,176,0,1,1,32,0,52,6,3,5,22,0,14,0,0,1,21, + 51,1,23,1,51,21,33,39,17,51,21,1,23,1,201,149,3,80,85,253,5,131,253,212,63,169,2,251,85,1,113,148,3,80,85,253,5,169,63,2, + 44,132,2,251,85,0,0,0,0,1,0,100,0,204,6,63,4,56,0,15,0,0,1,33,21,33,23,33,21,33,7,1,53,1,23,33,21,33,1,99, + 4,220,251,36,138,4,82,252,38,120,254,119,1,137,120,3,218,251,174,2,190,120,138,120,120,1,137,90,1,137,120,120,0,1,0,117,0,204,6,80, + 4,56,0,15,0,0,1,33,53,33,39,33,53,33,55,1,21,1,39,33,53,33,5,81,251,36,4,220,138,251,174,3,218,120,1,137,254,119,120,252, + 38,4,82,2,70,120,138,120,120,254,119,90,254,119,120,120,0,1,0,100,0,204,6,63,4,56,0,24,0,0,1,35,39,7,39,7,39,7,39,35, + 23,7,1,53,1,23,7,51,23,55,23,55,23,55,23,6,63,40,70,180,180,180,180,180,110,99,233,120,254,119,1,137,120,233,139,70,180,180,180,180, + 180,110,2,45,70,180,180,180,180,180,110,233,120,1,137,90,1,137,120,233,70,180,180,180,180,180,110,0,0,1,0,117,0,204,6,80,4,56,0,24, + 0,0,19,53,55,23,55,23,55,23,55,51,39,55,1,21,1,39,55,35,7,39,7,39,7,39,7,117,110,180,180,180,180,180,70,139,233,120,1,137, + 254,119,120,233,99,110,180,180,180,180,180,70,2,45,170,110,180,180,180,180,180,70,233,120,254,119,90,254,119,120,233,110,180,180,180,180,180,70,0,0, + 0,1,1,163,0,0,5,15,5,220,0,25,0,0,1,51,1,7,39,17,33,21,33,21,33,21,33,17,35,17,33,53,33,53,33,53,33,17,7,39, + 3,45,90,1,136,120,232,1,40,254,216,1,40,254,216,170,254,218,1,38,254,218,1,38,234,120,5,220,254,118,120,234,254,142,170,170,170,254,172,1, + 84,170,170,170,1,114,234,120,0,1,1,163,255,249,5,15,5,213,0,25,0,0,5,35,1,55,23,17,33,53,33,53,33,53,33,17,51,17,33,21, + 33,21,33,21,33,17,55,23,3,133,90,254,120,120,232,254,216,1,40,254,216,1,40,170,1,38,254,218,1,38,254,218,234,120,7,1,138,120,234,1, + 114,170,170,170,1,84,254,172,170,170,170,254,142,234,120,0,0,3,0,100,0,204,6,63,4,56,0,9,0,13,0,17,0,0,19,53,1,23,7,33, + 21,33,23,7,1,53,33,21,51,53,33,21,100,1,137,120,233,1,113,254,143,233,120,1,170,0,255,170,0,255,2,85,90,1,137,120,233,170,233,120, + 1,97,170,170,170,170,0,0,0,3,1,163,0,0,5,17,5,220,0,9,0,13,0,17,0,0,1,51,1,7,39,17,35,17,7,39,1,51,21,35, + 21,51,17,35,3,45,90,1,138,120,234,170,234,120,1,98,170,170,170,170,5,220,254,118,120,234,254,142,1,114,234,120,254,86,254,170,255,0,0,0, + 0,3,0,117,0,204,6,80,4,56,0,9,0,13,0,17,0,0,9,1,39,55,33,53,33,39,55,1,37,33,21,35,39,21,35,53,6,80,254,119, + 120,233,254,143,1,113,233,120,1,137,251,206,0,255,255,170,255,2,85,254,119,120,233,170,233,120,254,119,40,170,170,170,170,0,0,0,0,3,1,163, + 255,249,5,17,5,213,0,9,0,13,0,17,0,0,5,1,55,23,17,51,17,55,23,1,3,53,51,21,3,17,51,17,3,45,254,118,120,234,170,234, + 120,254,118,130,170,170,170,7,1,138,120,234,1,114,254,142,234,120,254,118,3,52,254,254,1,168,1,0,255,0,0,0,0,1,0,107,0,203,6,63, + 4,57,0,13,0,0,1,21,33,23,7,1,17,35,17,51,17,1,23,7,6,63,251,238,234,120,254,118,170,170,1,138,120,234,2,215,170,234,120,1, + 138,254,126,3,92,254,128,1,138,120,234,0,0,1,0,117,0,203,6,73,4,57,0,13,0,0,19,33,39,55,1,17,51,17,35,17,1,39,55,33, + 117,4,18,234,120,1,138,170,170,254,118,120,234,251,238,2,215,234,120,254,118,1,128,252,164,1,130,254,118,120,234,0,0,2,0,55,0,134,6,63, + 4,126,0,6,0,13,0,0,9,2,53,33,17,33,19,9,1,17,33,17,33,1,207,254,246,1,10,4,12,251,244,100,254,4,1,252,4,12,251,244, + 3,140,254,246,254,246,131,1,14,253,125,1,252,1,252,254,239,254,42,0,0,2,1,94,0,0,5,86,6,8,0,6,0,13,0,0,9,2,51,17, + 33,17,5,9,1,33,17,33,17,4,100,254,246,254,246,131,1,14,253,125,1,252,1,252,254,239,254,42,4,112,1,10,254,246,251,244,4,12,100,1, + 252,254,4,251,244,4,12,0,0,2,0,72,0,134,6,80,4,126,0,6,0,13,0,0,1,21,33,17,33,21,9,1,17,33,17,33,17,1,4,184, + 251,244,4,12,1,10,254,146,251,244,4,12,1,252,3,140,131,254,242,131,1,10,254,4,1,17,1,214,1,17,254,4,0,2,1,94,255,205,5,86, + 5,213,0,6,0,13,0,0,1,35,17,33,17,35,9,1,33,17,33,17,33,1,4,100,131,254,242,131,1,10,254,4,1,17,1,214,1,17,254,4, + 1,101,4,12,251,244,254,246,1,110,4,12,251,244,254,4,0,4,1,94,0,0,5,86,6,8,0,6,0,13,0,17,0,21,0,0,1,33,17,33, + 9,1,33,3,17,51,9,1,51,17,1,17,33,17,5,33,21,33,4,69,254,42,254,239,1,252,1,252,254,239,100,131,254,246,254,246,131,1,114,254, + 42,1,114,254,242,1,14,2,36,1,232,1,252,254,4,254,124,1,232,1,10,254,246,254,24,254,212,254,164,1,92,100,148,0,0,0,0,2,1,94, + 0,0,5,86,6,8,0,10,0,21,0,0,41,1,17,51,17,33,9,1,33,17,51,5,35,21,33,53,35,17,51,9,1,51,5,13,252,154,200,254, + 239,1,252,1,252,254,239,200,253,198,200,2,158,200,131,254,246,254,246,131,1,92,2,176,1,252,254,4,253,80,100,148,148,3,120,1,10,254,246,0, + 0,3,1,64,0,0,5,116,6,8,0,11,0,22,0,25,0,0,37,35,21,33,53,35,17,51,39,33,7,51,1,33,17,51,17,33,9,1,33,17, + 51,1,51,39,2,211,200,2,158,200,161,100,254,120,100,161,2,58,252,154,200,254,209,2,26,2,26,254,209,200,253,217,232,116,248,148,148,3,90,100, + 100,251,174,1,92,2,146,2,26,253,230,253,110,3,170,116,0,3,1,94,0,0,5,86,6,8,0,6,0,17,0,24,0,0,37,35,21,33,17,7, + 51,1,33,17,51,17,33,9,1,33,17,51,1,17,33,53,35,17,51,2,196,185,1,29,216,116,2,73,252,154,185,254,254,1,252,1,252,254,254,185, + 254,127,1,29,185,116,248,148,4,228,216,251,144,1,92,2,176,1,252,254,4,253,80,3,236,251,28,148,3,120,0,0,0,3,1,94,0,0,5,86, + 6,8,0,6,0,17,0,23,0,0,37,17,51,9,1,51,17,5,33,17,33,1,33,9,1,33,1,33,3,51,9,1,51,55,3,225,131,254,246,254, + 246,131,1,114,254,42,254,239,1,24,254,232,1,252,1,252,254,232,1,24,254,239,107,138,254,246,254,246,138,128,100,2,244,1,10,254,246,253,12,100, + 2,244,1,24,1,252,254,4,254,232,1,124,1,10,254,246,128,0,0,0,0,3,1,94,0,0,5,86,6,8,0,10,0,25,0,31,0,0,37,35, + 21,33,53,35,17,51,9,1,51,1,33,17,51,17,33,1,33,9,1,33,1,33,17,51,1,51,9,1,51,55,2,211,200,2,158,200,131,254,246,254, + 246,131,2,58,252,154,200,254,239,1,24,254,232,1,252,1,252,254,232,1,24,254,239,200,254,205,138,254,246,254,246,138,128,248,148,148,2,96,1,10, + 254,246,252,168,1,92,1,152,1,24,1,252,254,4,254,232,254,104,3,20,1,10,254,246,128,0,0,0,0,2,0,117,0,134,6,125,4,126,0,10, + 0,21,0,0,55,17,33,21,33,17,9,1,17,33,21,3,53,35,17,51,53,33,21,9,1,21,117,1,92,2,176,1,252,254,4,253,80,100,148,148, + 3,120,1,10,254,246,207,3,102,200,1,17,254,4,254,4,1,17,200,2,58,200,253,98,200,131,1,10,1,10,131,0,0,2,0,122,0,0,6,77, + 5,213,0,5,0,15,0,0,1,21,33,17,35,17,1,55,33,21,33,1,7,1,17,35,6,77,250,144,99,1,34,63,2,44,254,182,3,94,120,252, + 162,169,5,213,99,250,142,5,213,254,159,63,169,252,162,120,3,94,254,182,0,2,0,122,0,0,6,77,5,213,0,5,0,15,0,0,51,53,33,17, + 51,17,1,7,33,53,33,1,55,1,17,51,122,5,112,99,254,222,63,253,212,1,74,252,162,120,3,94,169,99,5,114,250,43,1,97,63,169,3,94, + 120,252,162,1,74,0,0,0,0,2,1,94,255,205,5,86,6,8,0,9,0,19,0,0,1,17,51,9,1,51,17,35,9,1,39,33,9,1,33,17, + 33,9,1,33,3,225,131,254,246,254,246,131,131,1,10,1,10,31,1,17,254,4,254,4,1,17,254,239,1,252,1,252,254,239,1,101,3,11,1,10, + 254,246,252,245,254,246,1,10,100,254,4,1,252,2,67,1,252,254,4,0,0,3,0,117,0,204,6,80,4,56,0,41,0,53,0,65,0,0,9,1, + 39,55,33,6,7,6,7,6,7,6,34,39,38,39,38,39,38,39,35,53,51,54,55,54,55,54,55,54,50,23,22,23,22,23,22,23,33,39,55,1, + 36,34,7,6,7,6,7,33,38,39,38,39,19,33,22,23,22,23,22,50,55,54,55,54,6,80,254,119,120,233,254,161,6,10,27,50,49,64,61,147, + 58,67,46,50,27,10,6,190,190,6,10,27,50,49,64,61,147,58,67,46,50,27,10,6,1,95,233,120,1,137,252,95,82,35,41,24,26,15,1,108, + 17,24,29,36,104,254,152,14,25,29,36,35,82,35,36,29,25,2,85,254,119,120,233,24,24,64,50,49,27,26,26,30,46,50,64,24,24,170,26,25, + 64,50,49,27,26,26,30,46,50,64,25,26,233,120,254,119,157,15,18,26,28,30,35,23,28,16,254,240,29,26,28,16,15,15,16,28,26,0,0,0, + 255,255,0,119,255,249,6,59,5,220,16,39,12,22,1,44,0,0,16,7,12,24,254,212,0,0,0,0,0,1,0,117,254,116,6,80,6,144,0,25, + 0,0,1,7,5,21,1,39,55,33,53,33,39,55,33,53,33,39,55,33,53,33,39,55,1,21,7,5,6,80,255,0,255,254,119,120,233,251,61,4, + 195,215,215,251,61,4,195,215,215,251,61,4,195,233,120,1,137,255,0,255,2,85,255,255,90,254,119,120,233,170,215,215,170,215,215,170,233,120,254,119, + 90,255,255,0,0,1,0,100,0,192,6,63,4,68,0,17,0,0,19,53,1,23,7,33,17,51,17,33,21,33,17,35,17,33,23,7,100,1,137,120, + 233,2,51,170,1,230,254,26,170,253,205,233,120,2,85,90,1,137,120,233,1,109,254,147,170,254,147,1,109,233,120,0,0,1,0,117,0,192,6,80, + 4,68,0,17,0,0,9,1,39,55,33,17,35,17,33,53,33,17,51,17,33,39,55,1,6,80,254,119,120,233,253,205,170,254,26,1,230,170,2,51, + 233,120,1,137,2,85,254,119,120,233,254,147,1,109,170,1,109,254,147,233,120,254,119,0,0,1,0,100,0,192,6,80,4,68,0,23,0,0,1,17, + 51,17,33,39,55,1,21,1,39,55,33,17,35,17,33,23,7,1,53,1,23,7,3,5,170,1,137,233,120,1,137,254,119,120,233,254,119,170,254,119, + 233,120,254,119,1,137,120,233,2,215,1,109,254,147,233,120,254,119,90,254,119,120,233,254,147,1,109,233,120,1,137,90,1,137,120,233,0,1,0,100, + 0,192,6,63,4,68,0,25,0,0,19,53,1,23,7,33,17,51,17,51,17,51,17,33,21,33,17,35,17,35,17,35,17,33,23,7,100,1,137,120, + 233,1,167,170,170,170,1,30,254,226,170,170,170,254,89,233,120,2,85,90,1,137,120,233,1,109,254,147,1,109,254,147,170,254,147,1,109,254,147,1, + 109,233,120,0,0,1,0,117,0,192,6,80,4,68,0,25,0,0,9,1,39,55,33,17,35,17,35,17,35,17,33,53,33,17,51,17,51,17,51,17, + 33,39,55,1,6,80,254,119,120,233,254,89,170,170,170,254,226,1,30,170,170,170,1,167,233,120,1,137,2,85,254,119,120,233,254,147,1,109,254,147, + 1,109,170,1,109,254,147,1,109,254,147,233,120,254,119,0,0,1,0,100,0,192,6,80,4,68,0,31,0,0,1,17,51,17,51,17,51,17,33,39, + 55,1,21,1,39,55,33,17,35,17,35,17,35,17,33,23,7,1,53,1,23,7,2,156,140,100,140,1,32,233,120,1,137,254,119,120,233,254,224,140, + 100,140,254,224,233,120,254,119,1,137,120,233,2,215,1,109,254,147,1,109,254,147,233,120,254,119,90,254,119,120,233,254,147,1,109,254,147,1,109,233, + 120,1,137,90,1,137,120,233,0,2,0,55,0,196,6,63,4,64,0,2,0,9,0,0,1,17,7,5,17,9,1,17,33,21,1,165,250,1,74,254, + 66,1,190,4,74,1,136,1,244,250,65,254,131,1,190,1,190,254,131,130,0,2,0,117,0,196,6,125,4,64,0,2,0,9,0,0,1,55,39,3, + 33,53,33,17,9,1,5,15,250,250,80,251,182,4,74,1,190,254,66,1,136,250,250,254,197,130,1,125,254,66,254,66,0,3,0,55,0,196,6,125, + 4,64,0,2,0,5,0,15,0,0,1,55,39,1,17,7,5,33,17,9,1,17,33,17,9,1,5,15,250,250,252,150,250,4,20,253,54,254,66,1, + 190,2,202,1,190,254,66,1,136,250,250,254,12,1,244,250,65,254,131,1,190,1,190,254,131,1,125,254,66,254,66,0,0,2,0,16,0,0,5,104, + 5,213,0,2,0,10,0,0,37,1,33,19,1,51,19,33,19,51,1,2,188,1,19,253,219,160,253,198,213,136,2,161,136,210,253,199,199,2,231,252, + 82,5,213,254,129,1,127,250,43,0,0,0,0,1,0,135,255,227,4,110,5,240,0,29,0,109,186,0,15,0,0,0,3,43,184,0,15,16,65,27, + 0,22,0,15,0,38,0,15,0,54,0,15,0,70,0,15,0,86,0,15,0,102,0,15,0,118,0,15,0,134,0,15,0,150,0,15,0,166,0,15, + 0,182,0,15,0,198,0,15,0,214,0,15,0,13,93,65,5,0,229,0,15,0,245,0,15,0,2,93,0,186,0,18,0,27,0,3,43,184,0,18, + 16,186,0,3,0,12,0,3,43,184,0,3,16,48,49,19,16,0,51,50,23,22,23,35,38,39,38,35,34,2,17,16,18,51,50,55,54,55,51,6, + 7,6,35,34,0,135,1,9,251,251,133,66,33,202,18,27,79,157,156,157,157,156,157,79,27,18,202,33,66,133,251,251,254,247,2,233,1,122,1,141, + 198,99,144,73,55,153,254,205,254,204,254,204,254,205,153,55,73,144,99,197,1,140,0,0,0,2,0,95,255,227,3,196,5,76,0,32,0,48,0,0, + 5,34,39,38,53,52,55,54,51,50,23,22,23,54,53,52,39,38,35,34,7,53,54,51,32,23,22,21,20,7,2,7,6,1,20,23,22,51,50,55, + 54,55,54,55,38,35,34,7,6,1,181,141,92,109,96,99,178,117,92,54,37,13,32,71,188,71,110,116,104,1,12,114,53,25,63,163,128,254,193,44, + 47,72,64,51,72,53,44,22,89,154,132,58,36,29,85,101,183,190,148,152,73,43,72,81,92,135,78,173,44,168,31,246,116,173,113,131,254,184,156,122, + 1,83,100,54,57,45,62,101,83,89,215,174,108,0,0,0,0,1,0,201,0,0,4,139,5,213,0,11,0,0,1,17,33,53,33,17,33,53,33,17, + 33,53,4,139,252,62,2,248,253,8,2,248,253,8,5,213,250,43,170,1,236,170,1,235,170,0,0,0,0,3,0,201,255,162,4,139,6,53,0,19, + 0,23,0,27,0,0,1,17,33,7,35,55,35,53,51,19,33,53,33,19,33,53,33,55,51,15,1,3,51,17,1,3,33,17,4,139,253,75,29,170, + 29,99,152,152,254,208,1,100,152,254,4,2,48,30,170,30,52,152,234,254,226,152,1,182,5,213,250,43,94,94,170,1,236,170,1,235,170,96,96,170, + 254,21,1,235,253,107,254,20,1,236,0,0,0,3,0,155,255,236,6,93,5,174,0,27,0,40,0,54,0,0,1,55,51,7,22,23,22,16,2,4, + 35,34,39,38,39,7,35,55,38,39,38,16,18,36,51,50,23,22,9,1,39,38,35,34,4,7,6,7,22,23,22,9,1,22,23,22,51,50,36,55, + 54,55,38,39,38,5,8,89,106,128,105,69,100,200,254,160,185,187,176,56,48,126,105,170,63,47,99,198,1,96,187,185,176,18,252,201,2,244,14,145, + 153,154,254,221,82,81,1,1,81,36,3,103,253,5,39,45,145,154,153,1,34,83,82,1,1,82,58,5,59,110,157,83,122,178,254,128,254,157,190,95, + 30,39,156,210,66,84,177,1,128,1,99,190,95,10,251,233,3,165,8,78,157,147,145,155,155,145,64,3,68,252,82,31,24,79,157,147,145,155,155,145, + 103,0,0,0,0,2,255,250,0,0,5,96,5,193,0,2,0,6,0,56,64,15,0,3,1,3,5,4,3,2,1,0,5,7,5,6,7,16,212,204, + 17,23,57,49,0,47,196,204,17,57,48,64,20,99,1,109,2,112,1,120,2,127,2,121,5,118,6,7,110,0,127,0,2,93,1,93,9,1,33,1, + 51,1,33,2,172,254,94,3,68,253,239,224,2,67,250,154,4,238,251,196,5,15,250,63,0,2,255,250,0,0,5,96,5,193,0,2,0,6,0,0, + 37,1,33,9,1,33,1,2,172,1,162,252,188,1,51,253,189,5,102,253,189,211,4,60,250,241,5,193,250,63,0,0,0,1,0,175,255,236,6,73, + 5,174,0,28,0,0,1,22,23,22,23,22,23,33,21,33,34,36,2,53,52,18,36,51,33,21,33,6,7,6,7,6,7,33,21,1,87,7,63,74, + 140,137,148,2,185,253,71,192,254,157,190,190,1,99,192,2,185,253,71,148,137,139,75,64,9,4,245,2,115,74,120,139,78,76,1,159,198,1,96,187, + 185,1,96,200,159,1,77,79,138,120,93,160,0,3,0,175,254,229,6,73,6,175,0,30,0,38,0,47,0,0,1,23,7,33,21,33,3,33,21,33, + 3,22,51,33,21,33,34,39,3,39,19,38,39,38,2,53,52,18,36,59,1,1,20,23,22,23,22,23,19,55,19,35,34,7,6,7,6,21,4,216, + 150,73,1,36,254,162,185,2,23,253,175,176,36,36,2,185,253,71,65,63,100,150,96,44,44,177,190,190,1,99,192,234,252,221,70,85,129,29,29,160, + 59,184,176,147,138,125,89,73,6,175,55,202,159,254,4,160,254,29,5,159,11,254,238,55,1,8,19,24,99,1,96,187,185,1,96,200,252,197,74,120, + 145,72,16,13,1,184,160,1,252,78,71,146,120,93,0,0,0,1,0,217,0,155,4,229,4,103,0,22,0,0,37,32,36,53,52,36,41,1,21,5, + 6,7,6,7,33,21,33,22,23,22,51,33,21,3,43,254,216,254,214,1,42,1,40,1,186,254,70,232,105,78,29,3,118,252,138,37,70,114,223,1, + 186,155,246,240,240,246,142,1,1,79,58,133,142,145,48,81,142,0,0,0,0,1,0,175,255,236,6,73,5,174,0,28,0,0,1,38,39,38,39,38, + 39,33,53,33,50,4,18,21,20,2,4,35,33,53,33,54,55,54,55,54,55,33,53,5,161,7,63,74,140,137,148,253,71,2,185,192,1,99,190,190, + 254,157,192,253,71,2,185,148,137,139,75,64,9,251,11,3,39,74,120,139,78,76,1,159,198,254,160,187,185,254,160,200,159,1,77,79,138,120,93,160, + 0,3,0,175,254,229,6,73,6,175,0,30,0,38,0,47,0,0,1,39,55,33,53,33,19,33,53,33,19,38,35,33,53,33,50,23,19,23,3,22, + 23,22,18,21,20,2,4,43,1,1,52,39,38,39,38,39,3,7,3,51,50,55,54,55,54,53,2,32,150,73,254,220,1,94,185,253,233,2,81,176, + 36,36,253,71,2,185,65,63,100,150,96,44,44,177,190,190,254,157,192,234,3,35,70,84,130,29,29,160,59,184,176,147,138,125,89,73,254,229,55,202, + 159,1,252,160,1,227,5,159,11,1,18,55,254,248,19,24,99,254,160,187,185,254,160,200,3,59,74,120,145,72,16,13,254,72,160,254,4,78,71,146, + 120,93,0,0,0,1,0,217,0,155,4,229,4,103,0,22,0,0,1,32,4,21,20,4,41,1,53,37,50,55,54,55,33,53,5,38,39,38,7,33, + 53,2,147,1,40,1,42,254,214,254,216,254,70,1,186,232,105,78,29,252,138,3,118,37,70,116,221,254,70,4,103,246,241,239,246,142,1,80,58,133, + 142,1,145,49,82,1,142,0,0,1,1,44,0,0,3,235,3,226,0,3,0,11,0,184,0,1,47,184,0,0,47,48,49,33,17,33,17,1,44,2, + 191,3,226,252,30,0,0,0,0,1,0,156,254,119,5,113,5,193,0,7,0,30,64,15,6,2,215,4,214,0,175,8,3,103,1,5,103,0,8,16, + 212,236,212,236,49,0,16,252,236,236,50,48,19,33,17,35,17,33,17,35,156,4,213,240,253,10,239,5,193,248,182,6,125,249,131,0,0,1,0,156, + 254,119,5,113,5,193,0,7,0,30,64,15,3,214,7,215,5,1,175,8,5,103,7,3,103,1,8,16,212,236,212,236,49,0,16,252,60,252,252,48, + 19,17,51,17,33,17,51,17,156,239,2,246,240,254,119,7,74,249,131,6,125,248,182,0,0,1,0,25,254,119,5,59,5,193,0,11,0,93,64,20, + 10,4,12,2,5,7,2,0,7,12,10,5,4,3,1,0,6,6,8,12,16,212,196,23,57,49,0,16,196,212,204,16,206,17,18,57,57,48,64,48, + 81,3,86,5,80,5,90,10,115,3,112,3,118,4,117,5,112,5,122,10,128,3,128,5,12,90,9,127,2,127,3,112,5,112,6,123,9,116,11,143, + 2,143,3,128,5,128,6,11,93,1,93,19,33,21,33,9,1,33,21,33,53,9,1,55,4,234,252,65,2,160,253,74,3,239,250,222,2,213,253,73, + 5,193,193,253,51,253,4,192,149,3,33,2,227,0,0,0,0,1,0,217,2,45,5,219,2,215,0,3,0,17,182,0,156,2,4,1,0,4,16,212, + 196,49,0,16,212,236,48,19,33,21,33,217,5,2,250,254,2,215,170,0,0,2,0,217,0,0,5,219,5,4,0,11,0,15,0,0,33,35,17,33, + 53,33,17,51,17,33,21,33,1,53,33,21,3,174,168,253,211,2,45,168,2,45,253,211,253,43,5,2,1,131,170,1,131,254,125,170,2,215,170,170, + 0,2,0,217,0,0,5,219,5,213,0,11,0,15,0,87,186,0,5,0,6,0,3,43,184,0,5,16,184,0,0,208,184,0,6,16,184,0,10,208, + 184,0,6,16,184,0,12,208,184,0,5,16,184,0,13,208,0,184,0,5,47,186,0,13,0,14,0,3,43,184,0,13,16,186,0,2,0,3,0,3, + 43,184,0,2,16,184,0,3,16,184,0,7,208,184,0,2,16,184,0,9,208,48,49,1,17,33,21,33,17,35,17,33,53,33,25,1,51,21,35,3, + 174,2,45,253,211,168,253,211,2,45,168,168,4,160,254,5,170,254,5,1,251,170,1,251,1,53,204,0,255,255,0,0,255,66,2,178,5,213,16,6, + 0,18,0,0,255,255,1,138,255,146,4,60,6,37,16,7,0,63,1,138,0,80,0,0,0,1,1,5,0,0,5,175,5,4,0,17,0,0,1,37, + 55,5,17,51,17,37,23,13,1,7,37,17,35,17,5,39,2,177,254,84,85,1,172,168,1,172,85,254,84,1,172,85,254,84,168,254,84,85,2,130, + 247,147,247,1,239,254,17,247,147,247,247,147,247,254,17,1,239,247,147,0,255,255,1,68,1,71,3,190,3,194,16,7,0,114,0,129,253,210,0,0, + 255,255,1,88,1,89,3,170,3,169,16,6,11,0,37,136,0,1,0,61,255,215,5,25,6,125,0,10,0,42,64,24,10,9,8,7,6,5,11,2, + 4,2,0,11,10,9,7,6,5,4,3,0,8,1,8,11,16,212,204,23,57,49,0,16,212,204,196,17,18,23,57,48,1,51,21,35,1,35,1,7, + 39,37,1,4,92,189,115,253,174,66,254,193,125,25,1,27,1,0,6,125,96,249,186,3,115,45,80,98,253,59,0,0,255,255,0,61,255,215,5,25, + 7,118,18,38,12,159,0,0,16,7,0,117,0,115,1,134,255,255,0,61,255,215,5,25,7,101,18,38,12,159,0,0,16,7,11,75,0,115,1,134, + 0,2,0,220,0,229,4,219,3,229,0,11,0,49,0,0,1,50,55,2,35,34,7,6,21,20,23,22,5,21,35,34,39,38,39,38,39,6,7,6, + 35,34,39,38,53,52,55,54,51,50,23,22,23,22,23,54,55,54,59,1,21,35,34,7,18,51,2,15,165,99,127,137,100,51,54,54,56,3,43,77, + 73,54,54,52,31,49,67,59,73,116,135,89,94,94,83,143,73,54,63,43,40,40,67,59,73,116,75,64,148,116,127,137,1,107,240,1,6,72,77,102, + 112,69,70,2,132,30,27,63,36,84,120,53,64,101,106,175,168,114,101,30,33,57,51,69,120,53,64,131,240,254,250,0,0,3,0,220,0,229,5,206, + 3,229,0,35,0,47,0,59,0,0,1,38,39,6,7,6,35,34,39,38,53,52,55,54,51,50,23,22,23,22,23,54,55,54,51,50,23,22,21,20, + 7,6,35,34,39,38,37,50,55,2,35,34,7,6,21,20,23,22,1,34,7,18,51,50,55,54,53,52,39,38,3,165,31,49,67,59,74,115,135,89, + 94,94,84,142,73,54,63,43,40,40,67,59,74,115,135,89,94,94,84,142,73,54,54,254,54,165,99,127,137,100,51,55,55,56,2,235,149,115,126,138, + 100,51,55,55,56,1,93,36,84,120,53,64,101,106,175,168,114,101,30,33,57,51,69,120,53,64,101,106,175,168,114,101,30,27,77,240,1,6,72,77, + 102,112,69,70,1,244,240,254,250,72,77,102,112,69,70,0,0,1,1,27,0,203,5,153,5,73,0,5,0,0,37,33,17,51,17,33,5,153,251,130, + 170,3,212,203,4,126,252,44,0,1,0,175,0,0,6,73,5,213,0,5,0,0,37,21,33,1,51,1,6,73,250,102,3,185,242,252,203,202,202,5, + 213,250,245,0,0,2,0,175,255,148,6,73,5,213,0,5,0,27,0,65,0,184,0,7,47,184,0,18,47,186,0,14,0,15,0,3,43,184,0,14, + 16,184,0,0,208,186,0,4,0,18,0,7,17,18,57,186,0,5,0,18,0,7,17,18,57,184,0,15,16,184,0,21,208,186,0,22,0,18,0,7, + 17,18,57,48,49,37,38,39,38,39,1,19,1,51,1,22,23,22,23,33,21,33,22,21,35,52,39,33,1,38,39,55,22,4,96,39,74,65,87,254, + 206,227,1,96,242,254,76,113,82,93,43,1,88,254,201,4,140,5,252,42,2,13,30,31,80,29,202,139,134,115,94,254,30,2,227,2,40,253,82,115, + 147,167,176,202,53,55,55,53,3,54,21,20,117,19,0,0,0,2,0,237,255,250,5,220,5,209,0,23,0,29,0,53,186,0,13,0,28,0,3,43, + 184,0,13,16,0,184,0,9,47,184,0,18,47,186,0,5,0,18,0,9,17,18,57,186,0,22,0,18,0,9,17,18,57,186,0,25,0,18,0,9, + 17,18,57,48,49,9,1,55,1,38,39,55,22,23,37,21,5,22,7,21,6,7,5,21,37,6,7,39,54,19,9,1,54,55,54,3,114,253,123,2, + 2,142,25,29,139,29,25,1,212,254,138,69,6,7,71,1,133,254,37,28,30,134,31,121,253,221,2,26,52,4,7,1,52,1,82,192,1,87,33,30, + 76,33,36,238,210,190,179,198,9,161,147,191,210,241,38,33,76,32,2,233,254,231,254,240,123,129,158,0,0,1,1,176,254,74,2,80,6,43,0,3, + 0,0,1,51,17,35,1,176,160,160,6,43,248,31,0,0,0,1,0,102,254,74,3,155,6,43,0,11,0,55,186,0,6,0,0,0,3,43,184,0, + 6,16,184,0,2,208,184,0,0,16,184,0,8,208,0,184,0,1,47,184,0,7,47,186,0,3,0,7,0,1,17,18,57,186,0,9,0,7,0,1, + 17,18,57,48,49,1,17,51,17,55,23,5,17,35,17,7,39,1,176,160,251,80,254,181,160,253,77,2,86,3,213,252,156,176,111,231,252,41,3,103, + 177,110,0,0,0,2,1,16,254,74,2,240,6,43,0,3,0,7,0,0,1,51,17,35,1,51,17,35,1,16,160,160,1,64,160,160,6,43,248,31, + 7,225,248,31,0,1,0,102,254,74,3,155,6,43,0,19,0,123,184,0,20,47,184,0,21,47,184,0,20,16,184,0,0,208,184,0,0,47,184,0, + 14,220,184,0,2,208,184,0,21,16,184,0,10,220,184,0,4,220,184,0,10,16,184,0,6,208,184,0,4,16,184,0,12,208,184,0,0,16,184,0, + 16,208,0,184,0,1,47,184,0,5,47,184,0,11,47,184,0,15,47,186,0,3,0,11,0,1,17,18,57,186,0,7,0,11,0,1,17,18,57,186, + 0,13,0,11,0,1,17,18,57,186,0,17,0,11,0,1,17,18,57,48,49,1,17,51,17,55,17,51,17,55,23,7,17,35,17,7,17,35,17,7, + 39,1,16,160,160,160,91,80,171,160,160,160,93,77,1,230,4,69,252,43,113,3,100,253,12,64,111,120,251,186,3,215,112,252,153,2,247,65,110,0, + 0,1,1,8,0,0,4,211,4,162,0,6,0,0,33,1,51,1,35,9,1,1,8,1,105,250,1,104,195,254,222,254,221,4,162,251,94,3,172,252, + 84,0,0,0,0,1,1,8,0,0,4,211,4,162,0,6,0,0,1,51,9,1,51,1,35,1,8,195,1,35,1,34,195,254,152,250,4,162,252,84, + 3,172,251,94,0,1,1,8,0,0,4,211,4,162,0,17,0,0,1,16,18,51,50,18,25,1,35,17,52,38,35,34,6,21,17,35,1,8,245,241, + 240,245,172,148,165,166,148,172,2,80,1,40,1,42,254,214,254,216,253,176,2,55,244,211,211,244,253,201,0,1,1,8,0,0,4,211,4,162,0,17, + 0,0,1,17,51,17,20,22,51,50,54,53,17,51,17,16,2,35,34,2,1,8,172,148,166,165,148,172,245,240,241,245,2,82,2,80,253,201,244,211, + 211,244,2,55,253,176,254,216,254,214,1,42,0,1,0,117,254,77,3,182,6,14,0,21,0,0,1,62,1,50,22,23,7,38,35,34,7,3,14,1, + 34,38,39,55,22,51,50,55,1,227,8,162,151,126,20,148,17,57,71,8,65,8,162,151,126,20,148,17,57,71,8,4,226,167,133,125,140,15,130,175, + 250,176,167,133,125,140,15,130,175,0,0,0,255,255,0,117,254,77,5,219,6,14,16,38,12,176,0,0,16,7,12,176,2,37,0,0,255,255,0,117, + 254,77,8,0,6,14,16,38,12,176,0,0,16,39,12,176,2,37,0,0,16,7,12,176,4,74,0,0,0,3,0,117,254,77,3,182,6,14,0,45, + 0,54,0,63,0,0,1,54,55,54,51,50,23,22,23,7,38,35,34,7,3,22,23,22,21,20,7,6,7,3,6,7,6,35,34,39,38,39,55,22, + 51,50,55,19,38,39,38,53,52,55,54,55,19,54,55,54,53,52,39,38,39,3,19,6,7,6,21,20,23,22,1,227,8,83,79,74,77,71,55,20, + 148,17,57,71,8,14,99,66,110,110,86,115,15,8,83,79,74,77,71,55,20,148,17,57,71,8,15,93,73,110,111,83,117,138,61,44,69,71,37,44, + 189,22,61,44,72,75,37,4,226,167,68,65,70,55,140,15,130,175,254,214,24,75,124,146,156,111,85,19,254,190,167,68,65,70,55,140,15,130,175,1, + 49,24,73,111,155,156,115,86,19,253,155,16,47,72,103,106,71,36,18,254,52,1,214,17,46,74,104,103,72,36,0,0,0,4,0,117,254,77,5,219, + 6,14,0,77,0,81,0,90,0,99,0,0,1,54,55,54,51,50,23,22,23,7,38,35,34,7,3,33,19,54,55,54,51,50,23,22,23,7,38,35, + 34,7,3,22,23,22,21,20,7,6,7,3,6,7,6,35,34,39,38,39,55,22,51,50,55,19,33,3,6,7,6,35,34,39,38,39,55,22,51,50, + 55,19,38,39,38,53,52,55,54,55,19,33,19,33,3,19,6,7,6,21,20,23,22,1,3,54,55,54,53,52,39,38,1,227,8,83,79,74,77,71, + 55,20,148,17,57,71,8,14,1,126,15,8,83,79,74,77,71,55,20,148,17,57,71,8,14,99,66,110,110,86,115,15,8,83,79,74,77,71,55,20, + 148,17,57,71,8,14,254,130,15,8,83,79,74,77,71,55,20,148,17,57,71,8,15,93,73,110,111,83,117,137,1,126,24,254,130,190,22,61,44,72, + 75,37,3,13,22,61,44,69,71,37,4,226,167,68,65,70,55,140,15,130,175,254,226,1,55,167,68,65,70,55,140,15,130,175,254,214,24,75,124,146, + 156,111,85,19,254,190,167,68,65,70,55,140,15,130,175,1,36,254,195,167,68,65,70,55,140,15,130,175,1,48,25,73,111,155,156,115,86,19,253,146, + 1,241,254,33,1,214,17,46,74,104,103,72,36,1,186,254,43,16,47,72,103,106,71,36,0,5,0,117,254,77,8,0,6,14,0,109,0,113,0,117, + 0,126,0,135,0,0,1,54,55,54,51,50,23,22,23,7,38,35,34,7,3,33,19,54,55,54,51,50,23,22,23,7,38,35,34,7,3,33,19,54, + 55,54,51,50,23,22,23,7,38,35,34,7,3,22,23,22,21,20,7,6,7,3,6,7,6,35,34,39,38,39,55,22,51,50,55,19,33,3,6,7, + 6,35,34,39,38,39,55,22,51,50,55,19,33,3,6,7,6,35,34,39,38,39,55,22,51,50,55,19,38,39,38,53,52,55,54,55,1,19,33,3, + 41,1,19,33,3,19,6,7,6,21,20,23,22,1,3,54,55,54,53,52,39,38,1,227,8,83,79,74,77,71,55,20,148,17,57,71,8,14,1,126, + 15,8,83,79,74,77,71,55,20,148,17,57,71,8,14,1,126,15,8,83,79,74,77,71,55,20,148,17,57,71,8,14,99,66,110,110,86,115,15,8, + 83,79,74,77,71,55,20,148,17,57,71,8,14,254,130,15,8,83,79,74,77,71,55,20,148,17,57,71,8,14,254,130,15,8,83,79,74,77,71,55, + 20,148,17,57,71,8,15,93,73,110,111,83,117,4,44,24,254,130,24,253,219,1,126,24,254,130,190,22,61,44,72,75,37,5,50,22,61,44,69,71, + 37,4,226,167,68,65,70,55,140,15,130,175,254,226,1,55,167,68,65,70,55,140,15,130,175,254,226,1,55,167,68,65,70,55,140,15,130,175,254,214, + 24,75,124,146,156,111,85,19,254,190,167,68,65,70,55,140,15,130,175,1,36,254,195,167,68,65,70,55,140,15,130,175,1,36,254,195,167,68,65,70, + 55,140,15,130,175,1,48,25,73,111,155,156,115,86,19,253,146,1,241,254,15,1,241,254,33,1,214,17,46,74,104,103,72,36,1,186,254,43,16,47, + 72,103,106,71,36,0,0,0,0,1,0,117,254,76,4,46,6,15,0,51,0,0,1,38,35,34,7,3,22,23,22,29,1,55,23,7,35,39,55,23, + 53,52,39,38,39,3,14,1,35,34,38,39,55,22,51,50,55,19,6,7,6,21,35,52,55,54,55,19,62,1,51,50,22,23,3,34,17,59,69,8, + 16,89,63,119,94,72,190,54,188,72,92,79,51,44,44,8,160,72,79,128,20,148,17,59,69,8,43,64,47,86,102,109,86,109,17,8,160,72,79,128, + 20,4,246,130,175,254,179,24,63,117,156,30,93,72,189,189,72,93,30,115,77,51,11,252,103,165,135,122,143,15,130,175,3,136,16,46,86,114,155,109, + 86,17,1,95,165,135,122,143,0,3,0,117,254,77,4,29,6,14,0,8,0,17,0,60,0,0,1,19,6,7,6,21,20,23,22,37,52,39,3,62, + 1,55,39,55,19,38,35,34,7,3,22,23,22,21,55,23,7,6,7,6,7,3,14,1,34,38,39,55,22,51,50,55,19,38,39,38,53,52,55,54, + 55,19,62,1,50,22,23,1,183,22,61,44,72,75,37,1,128,152,22,61,81,9,135,72,108,17,59,69,8,14,89,76,109,72,72,167,26,60,86,115, + 15,8,159,152,128,20,148,17,59,69,8,15,93,73,110,111,83,117,15,8,159,152,128,20,1,74,1,214,17,46,74,103,104,72,36,230,153,59,254,43, + 16,101,19,136,72,2,93,130,175,254,214,22,77,111,124,72,72,167,67,63,90,19,254,190,165,135,122,143,15,130,175,1,49,24,73,111,155,156,115,86, + 19,1,60,164,136,122,143,0,0,3,0,117,254,77,4,31,6,14,0,8,0,18,0,59,0,0,1,19,6,7,6,21,20,23,22,1,46,1,39,3, + 62,1,55,7,39,19,38,35,34,7,3,30,1,31,1,7,39,20,6,7,3,14,1,34,38,39,55,22,51,50,55,19,38,39,38,53,52,55,54,55, + 19,62,1,50,22,23,1,183,22,61,44,72,75,37,1,109,35,54,44,22,61,105,7,83,72,178,17,59,69,8,14,99,139,18,164,72,75,194,115,15, + 8,159,152,128,20,148,17,59,69,8,15,93,73,110,111,83,117,15,8,159,152,128,20,1,74,1,214,17,46,74,103,104,72,36,1,54,66,48,18,254, + 43,16,130,64,84,72,2,239,130,175,254,214,24,157,63,164,72,75,124,192,19,254,190,165,135,122,143,15,130,175,1,49,24,73,111,155,156,115,86,19, + 1,60,164,136,122,143,0,0,255,255,0,121,0,205,4,158,4,213,16,39,13,74,255,158,254,133,16,39,13,74,2,240,254,133,16,7,13,74,1,71, + 1,143,0,0,255,255,0,121,0,205,4,158,4,213,16,39,13,74,1,71,254,133,16,39,13,74,2,240,1,143,16,7,13,74,255,158,1,143,0,0, + 255,255,0,161,0,205,1,116,4,214,16,39,13,74,255,198,1,144,16,7,13,74,255,198,254,133,0,0,255,255,0,121,0,205,4,158,4,213,16,39, + 13,74,2,240,1,143,16,39,13,74,255,158,1,143,16,39,13,74,2,240,254,133,16,7,13,74,255,158,254,133,0,0,255,255,0,217,2,45,5,219, + 4,106,16,39,13,74,2,20,1,36,16,6,12,151,0,0,0,3,0,217,0,159,5,220,4,106,0,3,0,7,0,11,0,0,1,51,21,35,19,51, + 21,35,5,33,21,33,5,8,211,211,1,211,211,251,208,3,88,252,168,1,157,254,3,203,254,149,170,0,255,255,0,216,0,159,5,220,4,106,16,38, + 12,151,0,0,16,39,13,74,255,253,254,87,16,39,13,74,255,254,1,36,16,39,13,74,4,45,254,87,16,7,13,74,4,46,1,36,255,255,0,217, + 0,159,5,219,4,106,16,38,12,193,0,0,16,39,13,74,2,19,254,87,16,7,13,74,2,20,1,36,0,1,0,217,1,211,5,219,3,50,0,29, + 0,0,1,21,14,1,35,34,39,38,39,38,39,38,35,34,6,7,53,62,1,51,50,23,22,23,22,23,22,51,50,54,5,219,105,179,97,110,146,10, + 7,6,15,155,94,88,172,98,105,179,97,110,147,11,5,6,15,155,94,86,169,3,50,179,78,69,59,4,3,2,6,61,76,84,179,78,69,59,5,2, + 2,6,61,75,0,1,0,217,1,211,5,219,3,50,0,29,0,0,19,30,1,51,50,55,54,55,54,55,54,51,50,22,23,21,46,1,35,34,7,6, + 7,6,7,6,35,34,38,39,217,103,169,86,94,155,15,6,5,11,147,110,97,179,105,98,172,88,94,155,15,6,7,10,146,110,97,179,105,3,50,85, + 75,61,6,2,2,5,59,69,78,179,84,76,61,6,2,3,4,59,69,78,0,1,0,162,1,49,6,18,3,212,0,41,0,0,1,46,1,35,34,6, + 21,30,1,51,7,34,46,1,53,52,62,1,51,50,22,23,30,1,51,50,54,53,46,1,35,55,50,30,1,21,20,14,1,35,34,38,3,58,81,159, + 72,82,100,2,104,78,1,105,156,92,100,142,110,120,194,62,64,176,72,82,100,2,104,78,1,105,156,92,100,142,110,120,196,2,46,116,116,108,72,61, + 89,155,79,154,72,76,162,92,125,88,91,141,108,72,61,89,155,79,154,72,76,162,92,125,0,1,0,217,0,87,5,219,4,173,0,17,0,0,1,2, + 35,34,3,2,39,34,3,35,18,51,50,19,18,23,50,19,5,219,123,251,230,100,102,102,116,88,170,123,251,230,100,102,102,116,88,2,215,253,128,1, + 214,1,220,1,254,35,2,128,254,42,254,36,1,1,221,0,0,1,0,208,0,0,2,48,5,2,0,29,0,0,33,35,46,1,53,52,55,54,55,54, + 55,54,53,52,38,39,51,30,1,21,20,7,6,7,6,7,6,21,20,22,2,48,180,78,68,58,4,4,2,6,60,76,84,180,78,68,58,6,2,2, + 6,60,74,104,180,96,110,146,10,8,6,14,156,94,88,172,98,106,178,98,110,146,12,4,6,16,154,94,86,170,0,0,0,1,0,217,0,157,5,219, + 4,108,0,27,0,0,1,38,35,34,6,7,53,62,1,51,50,23,19,23,3,22,51,50,54,55,21,14,1,35,34,39,3,39,2,230,99,68,88,172, + 98,105,179,97,93,121,172,155,168,101,69,86,169,103,105,179,97,96,121,171,155,2,83,32,76,84,179,78,69,43,1,126,70,254,140,32,75,85,179,78, + 69,44,254,133,70,0,0,0,0,2,0,217,1,16,5,219,3,162,0,28,0,32,0,0,1,21,14,1,35,34,47,1,38,39,38,35,34,6,7,53, + 62,1,51,50,23,22,23,22,23,22,51,50,54,1,33,21,33,5,219,105,179,97,110,146,17,6,15,155,94,88,172,98,105,179,97,110,147,11,5,6, + 15,155,94,86,169,251,101,5,2,250,254,2,111,179,78,69,59,7,2,6,61,76,84,179,78,69,59,5,2,2,6,61,75,1,136,168,0,2,0,217, + 1,96,5,219,3,244,0,26,0,30,0,0,1,21,14,1,35,34,47,1,38,39,38,35,34,6,7,53,62,1,51,50,31,2,22,51,50,54,1,33, + 21,33,5,219,105,179,97,110,146,17,6,15,155,94,88,172,98,105,179,97,110,147,15,22,155,94,86,169,251,101,5,2,250,254,3,244,178,79,69,59, + 7,2,6,61,76,83,178,78,69,59,6,9,61,75,254,107,170,0,0,0,0,2,0,217,0,98,5,219,4,211,0,37,0,38,0,0,1,3,22,51, + 50,55,54,55,21,14,1,35,34,39,7,33,21,33,7,39,55,33,53,33,55,38,35,34,6,7,53,62,1,51,50,31,1,19,1,5,3,203,31,37, + 72,92,175,12,105,179,97,66,80,144,2,159,252,239,185,137,108,254,229,1,153,184,145,90,88,172,98,105,179,97,110,147,51,239,253,125,4,111,254,233, + 11,45,88,34,178,79,69,22,186,170,254,100,154,170,243,56,76,83,178,78,69,59,22,1,73,252,141,0,0,3,0,217,0,184,5,219,4,193,0,26, + 0,30,0,34,0,0,1,21,14,1,35,34,47,1,38,39,38,35,34,6,7,53,62,1,51,50,31,2,22,51,50,54,1,33,21,33,21,33,21,33, + 5,219,105,179,97,110,146,17,6,15,155,94,88,172,98,105,179,97,110,147,15,22,155,94,86,169,251,101,5,2,250,254,5,2,250,254,4,193,178,79, + 69,59,7,2,6,61,76,83,178,78,69,59,6,7,63,75,254,107,170,203,170,0,0,0,0,2,0,217,0,24,5,219,4,193,0,26,0,46,0,0, + 1,21,14,1,35,34,47,1,38,39,38,35,34,6,7,53,62,1,51,50,31,2,22,51,50,54,1,35,53,33,55,33,53,33,55,23,7,33,21,33, + 7,33,21,33,7,39,5,219,105,179,97,110,146,17,6,15,155,94,88,172,98,105,179,97,110,147,15,22,155,94,86,169,252,76,231,1,149,209,253,154, + 3,25,140,111,19,1,1,254,75,208,2,133,252,201,166,111,4,193,178,79,69,59,7,2,6,61,76,83,178,78,69,59,6,7,63,75,252,76,170,203, + 170,138,115,23,170,203,170,160,115,0,0,0,0,1,0,217,255,246,5,219,5,66,0,46,0,0,1,22,51,50,55,54,55,21,14,1,35,34,39,7, + 33,21,33,7,33,21,33,7,39,55,35,53,33,55,33,53,33,55,39,38,35,34,6,7,53,62,1,51,50,31,1,55,23,4,98,10,9,75,96,74, + 113,105,179,97,39,43,92,2,43,253,122,108,2,242,252,179,104,146,62,249,1,84,109,254,63,2,28,117,50,155,94,88,172,98,105,179,97,110,147,99, + 134,146,4,34,1,37,30,93,178,79,69,7,171,170,203,170,194,78,116,170,203,170,218,20,61,76,83,178,78,69,59,37,250,78,0,0,0,2,0,217, + 1,16,5,219,3,244,0,29,0,59,0,63,64,31,46,31,57,42,0,45,34,19,1,16,27,12,30,42,156,49,57,156,34,4,156,27,12,156,19,60, + 30,0,45,15,60,16,212,60,196,50,49,0,16,212,236,212,236,220,252,212,236,192,17,18,57,57,17,18,57,57,17,18,57,57,48,1,21,14,1,35, + 34,39,38,39,38,39,38,35,34,6,7,53,62,1,51,50,23,22,23,22,23,22,51,50,54,19,21,14,1,35,34,39,38,39,38,39,38,35,34,6, + 7,53,62,1,51,50,23,22,23,22,23,22,51,50,54,5,219,105,179,97,110,146,10,7,6,15,155,94,88,172,98,105,179,97,110,147,11,5,6,15, + 155,94,86,169,103,105,179,97,110,146,10,7,6,15,155,94,88,172,98,105,179,97,110,147,10,5,7,15,155,94,86,169,2,111,179,78,69,59,4,3, + 2,6,61,76,84,179,78,69,59,5,2,2,6,61,75,1,218,178,79,69,59,4,3,2,6,61,76,83,178,78,69,59,4,2,3,6,61,75,0,0, + 0,1,0,217,0,5,5,219,4,255,0,52,0,0,1,22,51,50,54,55,21,14,1,35,34,39,7,22,51,50,54,55,21,14,1,35,34,47,1,3, + 39,19,38,35,34,6,7,53,62,1,51,50,23,55,38,35,34,6,7,53,62,1,50,31,1,19,23,4,17,57,43,86,169,103,105,179,97,64,76,74, + 147,90,86,169,103,105,179,97,131,125,19,141,164,137,57,43,88,172,98,105,179,97,64,77,72,146,90,88,172,98,105,179,194,160,18,141,164,3,97,13, + 75,85,178,79,69,20,187,56,75,85,179,78,69,59,9,254,152,64,1,94,13,76,84,179,78,69,20,187,56,76,83,178,78,69,59,7,1,102,64,0, + 0,3,0,217,0,184,5,219,4,201,0,26,0,53,0,57,0,0,1,21,14,1,35,34,47,1,38,39,38,35,34,6,7,53,62,1,51,50,31,2, + 22,51,50,54,19,21,14,1,35,34,47,1,38,39,38,35,34,6,7,53,62,1,51,50,31,2,22,51,50,54,1,33,21,33,5,219,105,179,97,110, + 146,17,6,15,155,94,88,172,98,105,179,97,110,147,15,22,155,94,86,169,103,105,179,97,113,143,17,6,15,155,94,88,172,98,105,179,97,110,147,15, + 22,198,51,86,169,251,101,5,2,250,254,3,76,178,79,69,59,7,2,6,61,76,83,178,78,69,59,6,7,63,75,1,210,178,79,69,59,7,2,6, + 61,76,83,178,78,69,59,6,7,63,75,252,238,170,0,0,0,3,0,217,0,121,5,219,4,209,0,26,0,53,0,80,0,0,1,21,14,1,35,34, + 47,1,38,39,38,35,34,6,7,53,62,1,51,50,31,2,22,51,50,54,19,21,14,1,35,34,47,1,38,39,38,35,34,6,7,53,62,1,51,50, + 31,2,22,51,50,54,19,21,14,1,35,34,47,1,38,39,38,35,34,6,7,53,62,1,51,50,31,2,22,51,50,54,5,219,105,179,97,110,146,17, + 6,15,155,94,88,172,98,105,179,97,110,147,15,22,155,94,86,169,103,105,179,97,110,146,17,6,15,155,94,88,172,98,105,179,97,110,147,15,22,155, + 94,86,169,103,105,179,97,113,143,17,6,15,155,94,88,172,98,105,179,97,110,147,15,22,198,51,86,169,1,215,178,79,69,59,7,2,6,61,76,83, + 178,78,69,59,6,7,63,75,1,210,178,79,69,59,7,2,6,61,76,83,178,78,69,59,6,7,63,75,1,210,178,79,69,59,7,2,6,61,76,83, + 178,78,69,59,6,7,63,75,0,3,0,217,0,184,5,219,4,193,0,26,0,30,0,34,0,0,19,30,1,51,50,63,2,54,51,50,22,23,21,46, + 1,35,34,7,6,15,1,6,35,34,38,39,1,21,33,53,1,21,33,53,217,103,169,86,94,155,22,15,147,110,97,179,105,98,172,88,94,155,15,6, + 17,146,110,97,179,105,5,2,250,254,5,2,250,254,4,193,85,75,63,7,6,59,69,78,178,83,76,61,6,2,7,59,69,79,254,200,170,170,254,139, + 170,170,0,0,0,2,0,216,0,215,5,219,4,43,0,9,0,19,0,0,1,32,37,53,4,5,32,37,21,4,5,32,5,21,36,37,4,5,53,36, + 3,91,254,225,254,156,1,103,1,28,1,38,1,89,254,162,254,224,1,37,1,90,254,163,254,222,254,224,254,157,1,104,2,211,166,178,149,17,166,178, + 151,179,166,178,151,15,2,164,178,151,0,0,0,2,0,217,0,54,5,219,4,206,0,28,0,57,0,0,37,54,55,54,55,54,55,33,21,33,6,7, + 6,7,6,34,39,38,39,38,39,33,53,33,22,23,22,23,22,19,6,7,6,7,6,7,33,53,33,54,55,54,55,54,50,23,22,23,22,23,33,21, + 33,38,39,38,39,38,3,91,67,45,56,30,27,4,1,155,254,246,14,28,55,86,89,206,89,87,54,30,12,254,246,1,156,4,27,30,56,46,67,67, + 46,56,30,27,4,254,100,1,10,12,30,54,87,89,206,89,86,55,28,14,1,10,254,101,4,27,30,56,45,217,4,30,44,67,69,91,168,60,48,91, + 50,51,51,50,91,51,57,168,92,68,68,43,30,3,78,4,30,43,68,68,92,168,57,51,91,50,51,51,50,91,48,60,168,91,69,67,44,30,0,0, + 0,2,0,217,1,96,5,219,4,206,0,28,0,32,0,0,1,6,7,6,7,6,7,33,53,33,54,55,54,55,54,50,23,22,23,22,23,33,21,33, + 38,39,38,39,38,1,33,21,33,3,91,67,46,56,30,27,4,254,100,1,10,12,30,54,87,89,206,89,86,55,28,14,1,10,254,101,4,27,30,56, + 45,253,59,5,2,250,254,4,43,4,30,43,68,68,92,168,57,51,91,50,51,51,50,91,48,60,168,91,69,67,44,30,253,227,170,0,255,255,0,217, + 1,96,5,219,4,255,16,39,13,74,2,21,1,185,16,6,0,32,0,0,255,255,0,217,0,2,5,219,4,255,16,39,13,74,2,19,253,186,16,38, + 0,32,0,0,16,7,13,74,2,20,1,185,255,255,0,217,0,5,5,222,4,255,16,39,13,74,255,254,1,185,16,38,0,32,0,0,16,7,13,74, + 4,48,253,189,255,255,0,217,0,5,5,221,4,255,16,39,13,74,255,254,253,189,16,38,0,32,2,0,16,7,13,74,4,46,1,185,255,255,0,207, + 1,54,7,50,3,207,16,39,13,74,255,244,254,238,16,39,13,74,255,244,0,137,16,7,0,32,1,87,0,0,0,0,255,255,0,205,1,54,7,51, + 3,204,16,38,0,32,244,0,16,39,13,74,5,133,0,134,16,7,13,74,5,133,254,238,0,2,0,217,1,96,5,219,3,162,0,9,0,27,0,0, + 1,6,21,20,23,51,54,53,52,39,23,33,21,33,53,33,38,53,52,55,33,53,33,21,33,22,23,20,2,230,52,52,242,51,52,141,1,119,250,254, + 1,126,25,27,254,128,5,2,254,137,26,1,2,250,48,73,71,48,48,71,71,50,240,170,170,63,56,62,59,168,168,26,95,56,0,0,0,4,0,217, + 1,96,5,219,6,21,0,3,0,7,0,17,0,32,0,0,19,33,21,33,21,33,21,33,1,34,6,21,20,22,50,54,52,38,39,50,22,23,30,1, + 21,20,6,35,34,38,53,52,54,217,5,2,250,254,5,2,250,254,2,133,72,100,100,145,100,101,72,59,107,39,42,42,168,122,123,164,167,3,162,168, + 240,170,4,68,98,70,69,96,96,139,98,113,43,40,40,100,58,115,161,158,118,118,163,0,0,3,0,217,1,96,5,219,5,75,0,3,0,7,0,17, + 0,0,19,33,21,33,21,33,21,33,1,32,23,21,38,33,6,7,53,54,217,5,2,250,254,5,2,250,254,2,130,1,0,225,224,254,255,254,230,233, + 3,162,168,240,170,3,235,151,178,151,2,149,178,151,0,0,0,3,0,217,1,96,5,219,6,127,0,3,0,7,0,14,0,0,19,33,21,33,21,33, + 21,33,9,1,51,1,35,11,1,217,5,2,250,254,5,2,250,254,1,36,1,4,180,1,3,159,190,184,3,162,168,240,170,2,130,2,157,253,99,1, + 217,254,39,0,0,3,0,217,1,96,5,219,6,127,0,3,0,7,0,14,0,0,19,33,21,33,21,33,21,33,1,51,27,1,51,1,35,217,5,2, + 250,254,5,2,250,254,1,36,166,184,190,159,254,253,180,3,162,168,240,170,5,31,254,39,1,217,253,99,0,3,0,217,1,96,5,219,6,202,0,3, + 0,7,0,17,0,0,19,33,21,33,21,33,21,33,19,33,27,1,33,7,19,39,7,19,217,5,2,250,254,5,2,250,254,250,1,43,93,94,1,42, + 242,94,244,243,93,3,162,168,240,170,4,78,1,28,254,228,176,254,228,176,176,1,28,0,0,4,0,217,1,96,5,219,6,212,0,3,0,7,0,10, + 0,14,0,0,19,33,21,33,21,33,21,33,1,3,33,3,51,1,33,217,5,2,250,254,5,2,250,254,2,130,166,1,78,223,112,1,33,253,78,3, + 162,168,240,170,4,192,254,78,2,102,253,31,0,7,0,217,1,96,5,219,6,28,0,3,0,7,0,27,0,48,0,55,0,71,0,79,0,0,19,33, + 21,33,21,33,21,33,1,21,35,34,6,29,1,51,21,35,17,35,17,35,53,51,53,52,54,51,3,21,33,20,22,51,50,54,55,21,14,1,35,34, + 38,53,52,54,51,50,22,7,52,38,35,34,6,21,39,53,51,17,35,53,14,1,35,34,38,52,54,51,50,22,6,20,22,50,54,52,38,34,217,5, + 2,250,254,5,2,250,254,4,164,63,36,27,109,109,67,63,63,63,68,237,254,207,78,66,38,72,35,36,74,39,96,113,107,91,81,95,67,60,49,55, + 72,198,66,66,21,64,44,73,92,92,73,44,64,205,60,105,61,61,105,3,162,168,240,170,4,188,55,30,36,36,51,254,160,1,96,51,28,68,61,254, + 170,32,68,72,19,18,62,15,16,112,96,99,116,105,71,54,66,63,57,105,218,253,208,61,36,35,116,190,117,35,103,147,83,83,147,83,0,3,0,217, + 1,96,5,219,6,20,0,3,0,7,0,42,0,0,19,33,21,33,21,33,21,33,1,62,1,51,50,22,21,17,35,17,52,38,35,34,6,21,17,35, + 17,52,38,35,34,6,21,17,35,17,51,21,62,1,51,50,22,217,5,2,250,254,5,2,250,254,2,159,33,93,63,85,92,90,55,57,69,80,90,55, + 58,68,80,90,90,30,86,58,59,83,3,162,168,240,170,4,61,61,58,120,111,254,181,1,72,79,77,93,81,254,202,1,72,80,76,94,80,254,202,2, + 37,85,50,48,61,0,0,0,0,4,0,217,1,96,5,219,6,218,0,3,0,7,0,11,0,44,0,0,19,33,21,33,21,33,21,33,1,51,21,35, + 55,35,53,52,54,63,1,62,1,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,6,15,1,14,1,7,14,1,21,217,5,2,250,254,5,2, + 250,254,2,52,101,101,98,95,28,45,45,28,26,66,54,39,90,48,47,96,52,92,111,36,45,44,23,20,4,3,3,3,162,168,240,170,3,1,127,200, + 78,50,65,43,44,27,47,24,45,55,35,33,94,28,28,97,79,38,69,43,43,23,27,13,10,30,26,0,0,1,0,217,0,39,5,219,4,221,0,19, + 0,62,64,34,13,12,10,3,2,207,4,0,156,6,12,207,14,10,156,18,6,16,8,20,18,14,13,12,8,4,3,2,8,9,5,15,0,20,16,220, + 60,196,50,23,57,49,0,16,212,60,204,50,252,60,236,16,254,60,236,57,17,18,57,48,19,33,1,23,7,33,21,33,7,33,21,33,1,39,55,33, + 53,33,55,33,217,3,4,1,0,125,174,1,47,254,72,195,2,123,252,250,254,254,125,174,254,213,1,182,195,253,135,3,162,1,59,102,213,168,240,170, + 254,199,102,211,170,240,0,0,0,3,0,217,0,184,5,219,4,76,0,3,0,7,0,11,0,33,64,14,4,6,0,2,8,10,12,10,6,2,8,4, + 0,12,16,220,60,60,220,60,60,49,0,16,212,220,220,220,220,220,48,19,33,21,33,17,33,21,33,17,33,21,33,217,5,2,250,254,5,2,250,254, + 5,2,250,254,2,215,170,2,31,170,253,192,170,0,0,0,0,1,0,217,255,206,5,219,5,52,0,27,0,0,1,33,53,33,55,23,7,33,21,33, + 7,33,21,33,7,33,21,33,7,39,55,33,53,33,55,33,53,33,3,149,253,68,3,24,128,153,81,1,34,254,129,114,1,241,253,181,110,2,185,252, + 233,129,153,82,254,221,1,129,111,254,16,2,76,3,162,170,232,84,148,170,203,170,203,170,234,84,150,170,203,170,0,0,0,4,0,217,0,0,5,219, + 5,9,0,3,0,7,0,11,0,15,0,41,64,20,4,6,0,2,12,14,8,10,16,14,10,6,3,2,12,8,4,3,0,16,16,220,23,60,220,23, + 60,49,0,16,212,220,220,220,220,220,220,220,48,19,33,21,33,17,33,21,33,17,33,21,33,17,33,21,33,217,5,2,250,254,5,2,250,254,5,2, + 250,254,5,2,250,254,3,148,170,2,31,170,252,75,170,2,31,170,0,0,0,2,0,217,0,0,5,219,4,168,0,6,0,10,0,84,64,46,2,156, + 3,4,3,1,156,0,1,4,4,3,1,156,2,1,5,6,5,0,156,6,5,66,5,4,2,1,0,5,3,209,6,167,7,156,9,1,8,2,0,36, + 7,4,35,11,16,252,60,236,50,50,57,49,0,47,236,244,236,23,57,48,75,83,88,7,4,237,7,16,8,237,7,16,8,237,7,16,4,237,89,34, + 9,2,21,1,53,9,1,33,21,33,5,219,252,64,3,192,250,254,5,2,250,254,5,2,250,254,3,248,254,235,254,238,178,1,112,170,1,111,252,2, + 170,0,0,0,0,2,0,217,0,0,5,219,4,168,0,6,0,10,0,86,64,47,6,156,0,6,3,4,3,5,156,4,4,3,0,156,1,2,1,6, + 156,5,6,2,2,1,66,6,5,3,2,0,5,4,209,1,167,7,156,8,6,7,2,36,9,4,0,35,11,16,252,60,60,236,50,57,49,0,47,236, + 244,236,23,57,48,75,83,88,7,16,8,237,7,16,4,237,7,16,4,237,7,16,8,237,89,34,19,53,1,21,1,53,9,1,21,33,53,217,5,2, + 250,254,3,193,1,65,250,254,3,248,176,254,145,170,254,144,178,1,18,253,199,170,170,0,0,3,0,218,255,86,5,220,5,27,0,3,0,10,0,14, + 0,0,51,33,21,33,9,2,21,1,53,9,1,33,21,33,218,5,2,250,254,5,2,252,64,3,192,250,254,5,2,250,254,5,2,250,254,170,5,21, + 254,235,254,238,178,1,112,170,1,111,252,2,170,0,0,0,0,3,0,218,255,86,5,220,5,27,0,3,0,10,0,14,0,0,33,21,33,53,17,53, + 1,21,1,53,9,1,21,33,53,5,220,250,254,5,2,250,254,3,192,1,66,250,254,170,170,4,107,176,254,145,170,254,144,178,1,18,253,199,170,170, + 0,2,0,218,254,177,5,220,5,27,0,19,0,26,0,0,5,33,53,33,55,33,53,33,55,23,7,33,21,33,7,33,21,33,7,39,9,2,21,1, + 53,1,2,39,254,179,1,218,96,253,198,2,200,137,138,41,1,80,254,34,95,2,61,253,54,138,138,3,222,252,64,3,192,250,254,5,2,170,170,115, + 170,164,115,49,170,115,170,165,116,5,70,254,235,254,238,178,1,112,170,1,111,0,0,0,0,2,0,218,254,177,5,220,5,27,0,19,0,26,0,0, + 5,33,53,33,55,33,53,33,55,23,7,33,21,33,7,33,21,33,7,39,1,53,1,21,1,53,1,2,39,254,179,1,218,96,253,198,2,200,137,138, + 41,1,80,254,34,95,2,61,253,54,138,138,254,220,5,2,250,254,3,192,170,170,115,170,164,115,49,170,115,170,165,116,5,70,176,254,145,170,254,144, + 178,1,18,0,0,2,0,148,0,46,7,204,4,223,0,6,0,13,0,0,9,2,21,1,53,1,5,9,1,21,1,53,1,7,204,252,198,3,58,251, + 202,4,54,252,254,252,198,3,58,251,202,4,54,4,17,254,112,254,114,197,2,8,159,2,10,206,254,112,254,114,197,2,8,159,2,10,0,2,0,148, + 0,46,7,204,4,223,0,6,0,13,0,0,19,53,1,21,1,53,1,3,53,1,21,1,53,1,148,4,54,251,202,3,58,56,4,54,251,202,3,58, + 4,17,206,253,246,159,253,248,197,1,142,1,144,206,253,246,159,253,248,197,1,142,0,0,0,2,0,176,254,242,3,6,6,18,0,25,0,39,0,0, + 1,6,7,22,23,22,21,20,7,6,7,22,23,33,54,55,38,39,38,53,52,55,54,55,38,39,19,54,55,54,16,39,38,39,6,7,6,16,23,22, + 2,123,41,35,89,52,74,74,52,89,35,41,254,192,41,35,89,52,74,74,52,89,35,41,160,22,17,65,65,17,22,22,17,65,65,17,6,18,71,70, + 163,158,226,223,224,227,158,162,71,71,71,71,162,158,227,224,223,226,158,163,70,71,250,50,59,59,226,1,206,225,59,60,60,59,225,254,50,226,59,0, + 0,1,0,216,0,26,5,220,4,232,0,27,0,0,1,6,7,53,36,63,1,36,37,53,4,37,19,23,7,54,55,21,4,15,1,4,5,21,36,5, + 3,39,2,87,180,201,1,9,223,101,254,246,254,187,1,178,1,0,196,148,135,183,200,254,251,228,100,1,16,1,63,254,78,255,0,196,148,1,93,41, + 93,178,111,38,182,14,151,178,175,10,1,98,82,244,41,96,178,113,37,181,13,152,178,175,11,254,159,82,0,2,0,217,0,5,5,219,5,100,0,15, + 0,18,0,0,1,5,21,37,3,39,19,37,53,1,19,23,7,37,21,5,7,13,1,3,157,2,62,253,122,153,135,147,254,17,3,27,173,136,109,1, + 31,254,122,200,254,70,1,60,1,223,203,182,234,254,189,64,1,54,180,166,1,32,1,111,64,230,104,182,139,71,157,112,0,2,0,217,255,160,5,219, + 4,255,0,15,0,18,0,0,1,37,53,5,19,23,3,5,21,1,3,39,55,5,53,37,55,45,1,3,23,253,194,2,134,153,135,147,1,239,252,229, + 173,136,109,254,225,1,134,200,1,186,254,196,3,37,203,182,234,1,67,64,254,202,180,166,254,224,254,145,64,230,104,182,139,71,157,112,0,2,0,217, + 255,47,5,219,5,86,0,2,0,26,0,0,1,13,1,3,33,53,33,19,37,53,37,19,23,7,37,21,5,3,5,21,37,3,33,21,33,7,39,3, + 146,254,137,1,47,244,254,131,1,189,120,253,203,3,3,118,164,72,1,45,254,137,114,1,233,253,219,102,2,139,253,53,76,164,3,79,108,85,253,114, + 170,1,67,162,170,221,1,64,61,199,86,176,108,254,209,140,178,158,254,237,170,209,61,0,0,2,0,217,255,47,5,219,5,86,0,2,0,26,0,0, + 1,37,39,1,33,53,33,55,5,53,37,55,37,53,5,19,23,3,5,21,5,3,33,21,33,7,39,3,145,1,9,214,254,29,254,248,1,71,87,254, + 98,1,232,91,253,189,2,127,132,164,127,1,218,253,109,109,3,0,252,193,78,164,2,151,76,62,252,223,170,236,119,178,139,245,167,176,183,1,101,61, + 254,168,136,170,189,254,216,170,209,61,0,0,0,2,0,217,255,144,5,220,4,168,0,29,0,36,0,0,37,21,14,1,35,34,39,38,39,38,39,38, + 35,34,6,7,53,62,1,51,50,23,22,23,22,23,22,51,50,54,19,9,1,21,1,53,1,5,220,106,178,98,110,146,10,6,6,16,154,94,88,172, + 98,104,180,96,110,148,10,6,6,14,156,94,86,168,103,252,64,3,192,250,254,5,2,240,180,78,68,58,4,4,2,6,60,76,84,180,78,68,58,6, + 2,2,6,60,74,3,94,254,235,254,238,178,1,112,170,1,111,0,0,0,0,2,0,218,255,176,5,220,4,168,0,27,0,34,0,0,1,21,14,1, + 35,34,39,46,1,39,38,35,34,6,7,53,62,1,51,50,23,30,1,23,22,51,50,54,1,53,1,21,1,53,1,5,220,106,178,98,110,146,10,12, + 16,154,94,88,172,98,104,180,96,110,148,10,12,14,156,94,86,168,251,102,5,2,250,254,3,193,1,14,178,78,70,60,4,4,6,62,76,84,178,78, + 70,60,4,4,6,62,76,3,62,176,254,145,170,254,144,178,1,18,0,0,0,2,0,217,255,41,5,220,5,80,0,49,0,52,0,0,37,38,35,34, + 6,7,53,62,1,51,50,23,19,37,53,37,19,23,7,37,21,5,3,5,21,37,3,23,22,23,22,23,22,51,50,54,55,21,14,1,35,34,39,38, + 39,38,47,1,7,39,1,13,1,2,107,30,13,88,172,98,104,180,96,39,43,107,253,198,3,8,117,165,69,1,37,254,143,115,1,228,253,225,107,7, + 10,6,6,14,156,94,86,168,104,106,178,98,110,146,10,6,6,16,34,80,165,1,118,254,132,1,49,45,3,76,84,180,78,68,7,1,29,163,170,222, + 1,57,65,187,84,176,106,254,205,138,178,156,254,227,2,6,2,2,6,60,74,86,180,78,68,58,4,4,2,6,13,216,60,3,236,110,87,0,0,0, + 0,2,0,217,255,47,5,220,5,86,0,49,0,52,0,0,1,5,21,5,7,22,23,22,23,22,23,22,51,50,54,55,21,14,1,35,34,39,38,39, + 38,39,38,39,3,39,55,6,7,6,7,53,54,55,54,63,1,5,53,37,55,37,53,5,19,23,3,37,39,4,8,1,211,253,117,94,48,54,10,6, + 6,14,156,94,86,168,104,106,178,98,110,146,10,6,6,16,71,59,104,164,86,56,54,86,98,104,90,77,83,60,254,97,1,233,94,253,185,2,131,128, + 164,232,1,2,206,3,191,134,170,187,247,13,22,4,2,2,6,62,76,84,178,78,70,60,4,2,2,6,29,15,254,241,61,223,9,24,38,84,178,78, + 35,30,4,161,119,178,139,244,168,176,184,1,102,61,253,128,74,59,0,0,0,2,0,208,255,78,5,220,5,125,0,6,0,13,0,0,19,53,1,21, + 1,53,9,3,21,1,53,1,218,5,2,250,254,3,192,1,56,252,64,3,192,250,254,5,2,2,39,176,254,145,170,254,144,178,1,18,3,187,254,235, + 254,238,178,1,112,170,1,111,0,2,0,208,255,78,5,220,5,125,0,6,0,13,0,0,9,2,21,1,53,9,1,53,1,21,1,53,1,5,210,252, + 64,3,192,250,254,5,2,251,8,5,2,250,254,3,192,2,39,254,235,254,238,178,1,112,170,1,111,1,246,176,254,145,170,254,144,178,1,18,0,0, + 0,3,0,208,254,109,5,220,6,96,0,2,0,30,0,33,0,0,45,2,3,37,53,37,19,23,3,37,21,5,3,5,21,37,7,5,21,5,3,39, + 19,5,53,37,19,37,53,5,19,13,1,3,77,1,77,254,220,96,253,186,2,194,90,166,68,1,132,254,79,65,1,242,253,232,30,2,64,253,70,90, + 166,68,254,116,1,184,64,254,8,2,31,109,254,172,1,42,179,95,84,1,87,167,170,202,1,136,38,254,212,111,176,125,254,228,142,178,154,129,165,170, + 200,254,119,38,1,45,114,178,126,1,24,145,176,155,1,222,98,85,0,0,0,3,0,208,254,109,5,220,6,96,0,2,0,5,0,33,0,0,1,7, + 23,1,55,47,1,37,53,5,19,23,3,5,21,5,7,37,21,5,7,5,21,37,3,39,19,37,53,37,55,5,53,37,2,192,174,152,1,74,166,146, + 164,253,118,2,177,97,166,100,1,174,253,236,34,2,44,253,169,44,2,131,253,86,96,166,98,254,76,2,28,34,253,204,2,95,1,68,50,44,2,163, + 47,42,47,188,176,197,1,168,38,254,79,123,170,152,148,159,176,173,194,184,178,196,254,91,38,1,174,125,170,154,148,162,178,173,0,0,0,1,0,217, + 255,178,5,219,5,80,0,10,0,0,1,0,5,4,1,21,0,37,53,36,1,5,219,254,114,253,243,2,9,1,146,254,111,252,143,3,115,1,143,4, + 97,254,129,97,94,254,126,239,2,0,124,166,124,2,0,0,0,1,0,217,255,178,5,219,5,80,0,10,0,0,19,53,0,5,21,4,1,53,0,37, + 36,217,1,143,3,115,252,143,254,111,1,146,2,9,253,243,4,97,239,254,0,124,166,124,254,0,239,1,130,94,97,0,0,2,0,217,255,41,5,219, + 5,87,0,5,0,16,0,0,33,21,0,37,53,4,1,0,5,4,1,21,0,37,53,36,1,5,219,254,103,252,151,3,86,1,172,254,129,254,36,1, + 220,1,127,254,129,252,125,3,131,1,127,215,1,190,145,174,133,2,223,254,229,93,93,254,229,215,1,120,132,166,124,1,128,0,0,0,0,2,0,217, + 255,41,5,219,5,87,0,5,0,16,0,0,51,0,37,21,4,1,17,53,0,5,21,4,1,53,0,37,36,217,1,172,3,86,252,151,254,103,1,127, + 3,131,252,125,254,129,1,127,1,220,254,36,1,161,133,174,145,254,66,5,87,215,254,128,124,166,132,254,136,215,1,27,93,93,0,0,0,2,0,217, + 255,82,5,219,5,87,0,29,0,40,0,0,37,21,14,1,35,34,39,38,39,38,39,38,35,34,6,7,53,62,1,51,50,23,22,23,22,23,22,51, + 50,54,19,0,5,4,1,21,0,37,53,36,1,5,219,105,179,97,110,146,10,7,6,15,155,94,88,172,98,105,179,97,110,147,11,5,6,15,155,94, + 86,169,103,254,129,254,36,1,220,1,127,254,129,252,125,3,131,1,127,177,179,78,69,59,4,3,2,6,61,76,84,179,78,69,59,5,2,2,6,61, + 75,4,36,254,229,93,93,254,229,215,1,120,132,166,124,1,128,0,0,0,0,2,0,217,255,82,5,219,5,87,0,29,0,40,0,0,37,21,14,1, + 35,34,39,38,39,38,39,38,35,34,6,7,53,62,1,51,50,23,22,23,22,23,22,51,50,54,1,53,0,5,21,4,1,53,0,37,36,5,219,105, + 179,97,110,146,10,7,6,15,155,94,88,172,98,105,179,97,110,147,11,5,6,15,155,94,86,169,251,101,1,127,3,131,252,125,254,129,1,127,1,220, + 254,36,177,179,78,69,59,4,3,2,6,61,76,84,179,78,69,59,5,2,2,6,61,75,4,36,215,254,128,124,166,132,254,136,215,1,27,93,93,0, + 0,2,0,217,255,131,5,219,6,29,0,21,0,26,0,0,1,38,37,53,36,37,1,23,3,54,55,21,6,7,3,4,23,21,2,37,3,39,1,6, + 7,22,23,2,238,240,254,219,1,195,1,69,1,30,131,185,158,116,186,214,139,1,36,247,227,254,130,235,130,1,107,151,161,125,117,1,176,85,41,166, + 63,165,2,101,75,254,116,117,149,239,179,117,254,212,127,237,239,1,34,166,254,9,75,3,10,57,30,23,39,0,0,0,0,2,0,217,254,229,5,219, + 5,127,0,21,0,26,0,0,1,22,5,21,4,5,1,39,19,6,7,53,54,55,19,36,39,53,18,5,19,23,1,54,55,38,39,3,198,240,1,37, + 254,61,254,187,254,226,131,185,158,116,186,214,139,254,220,247,227,1,126,235,130,254,149,151,161,125,117,3,82,85,41,166,63,165,253,155,75,1,140,117, + 149,239,179,117,1,44,127,237,239,254,222,166,1,247,75,252,246,57,30,23,39,0,0,0,0,1,0,204,0,163,5,232,4,95,0,19,0,0,37,33, + 34,0,53,52,55,54,51,33,21,33,34,6,21,20,23,22,51,33,5,232,252,194,202,254,236,138,138,200,3,64,252,192,136,190,94,96,136,3,64,163, + 1,22,200,198,141,139,150,192,136,138,94,96,0,1,0,204,0,163,5,232,4,95,0,19,0,0,55,53,33,50,55,54,53,52,38,35,33,53,33,50, + 23,22,21,20,0,35,204,3,64,136,96,94,190,136,252,192,3,64,200,138,138,254,236,202,163,150,96,94,138,136,192,150,139,141,198,200,254,234,0,0, + 0,2,0,204,255,59,5,232,5,207,0,9,0,30,0,0,1,35,34,6,21,20,23,22,59,1,27,1,51,3,33,21,33,3,33,21,33,3,35,19, + 34,0,53,52,55,54,51,3,162,250,136,190,94,96,136,48,248,114,170,114,1,110,254,100,202,2,102,253,108,112,170,112,200,254,234,138,138,200,3,201, + 192,136,138,94,96,3,38,1,112,254,144,150,253,112,150,254,152,1,104,1,22,200,198,141,139,0,0,0,0,2,0,204,255,51,5,232,5,199,0,9, + 0,30,0,0,1,51,50,54,53,52,39,38,43,1,11,1,35,19,33,53,33,19,33,53,33,19,51,3,50,0,21,20,7,6,35,3,18,250,136,190, + 94,96,136,48,248,114,170,114,254,146,1,156,202,253,154,2,148,112,170,112,200,1,22,138,138,200,1,57,192,136,138,94,96,252,218,254,144,1,112,150, + 2,144,150,1,104,254,152,254,234,200,198,141,139,0,0,0,0,2,0,190,0,0,5,219,4,232,0,3,0,24,0,0,55,33,21,33,1,33,34,39, + 38,53,52,55,54,51,33,21,33,34,6,21,20,23,22,51,33,242,4,233,251,23,4,233,252,193,201,138,139,139,138,200,3,64,252,192,137,190,95,96, + 136,3,64,150,150,1,44,139,139,200,198,141,139,150,192,136,138,94,96,0,0,2,0,217,0,0,5,246,4,232,0,3,0,24,0,0,55,33,21,33, + 17,53,33,50,55,54,53,52,38,35,33,53,33,50,23,22,21,20,7,6,35,217,4,233,251,23,3,64,136,96,95,190,137,252,192,3,64,200,138,139, + 139,138,201,150,150,1,44,150,96,94,138,136,192,150,139,141,198,200,139,139,0,2,0,190,255,19,5,219,5,215,0,9,0,39,0,0,1,33,34,6, + 21,20,23,22,59,2,33,21,33,7,33,21,33,7,39,55,33,53,33,55,38,39,38,53,52,55,54,51,33,55,23,7,33,21,33,3,209,254,202,137, + 190,95,96,136,39,156,2,125,253,69,61,2,248,252,201,97,134,76,254,233,1,84,62,185,130,139,139,138,200,1,115,99,134,76,1,48,254,146,4,82, + 192,136,138,94,96,150,150,150,237,53,184,150,150,8,131,139,200,198,141,139,239,55,184,150,0,2,0,217,255,19,5,246,5,215,0,9,0,39,0,0, + 1,51,50,55,54,53,52,39,38,47,1,33,53,33,55,23,7,22,23,22,21,20,7,6,43,1,7,33,21,33,7,39,55,33,53,33,55,33,53,33, + 3,94,187,136,96,95,95,66,86,153,253,9,3,53,99,134,84,112,88,139,139,138,201,247,63,2,224,252,227,98,134,76,254,208,1,109,62,254,85,1, + 233,1,194,96,94,138,136,96,67,20,9,150,239,55,203,32,88,141,198,200,139,139,150,150,237,53,184,150,150,150,0,0,0,2,0,190,255,106,5,219, + 4,233,0,11,0,32,0,0,41,1,53,33,55,23,7,33,21,33,7,39,1,33,34,39,38,53,52,55,54,51,33,21,33,34,6,21,20,23,22,51, + 33,2,196,254,46,2,66,113,120,45,1,235,253,165,113,120,3,68,252,193,201,138,139,139,138,200,3,64,252,192,137,190,95,96,136,3,64,150,150,90, + 60,150,150,90,1,105,139,139,200,198,141,139,150,192,136,138,94,96,0,0,0,2,0,190,255,106,5,219,4,233,0,11,0,32,0,0,41,1,53,33, + 55,23,7,33,21,33,7,39,1,53,33,50,55,54,53,52,38,35,33,53,33,50,23,22,21,20,7,6,35,2,196,254,46,2,66,113,120,45,1,235, + 253,165,113,120,254,39,3,64,136,96,95,190,137,252,192,3,64,200,138,139,139,138,201,150,150,90,60,150,150,90,1,105,150,96,94,138,136,192,150,139, + 141,198,200,139,139,0,0,0,0,2,1,8,0,0,4,211,4,162,0,17,0,27,0,0,1,17,51,17,20,22,51,50,54,53,17,51,17,16,2,35, + 34,2,55,53,55,23,7,33,21,33,23,7,1,8,172,148,166,165,148,172,245,240,241,245,238,196,60,116,1,99,254,157,116,60,2,82,2,80,253,201, + 244,211,211,244,2,55,253,176,254,216,254,214,1,42,202,45,197,60,117,85,116,60,0,0,255,255,1,8,0,0,4,211,4,162,16,38,12,175,0,0, + 16,7,13,74,1,169,255,51,0,2,1,8,0,5,4,211,4,167,0,17,0,29,0,0,1,17,51,17,20,22,51,50,54,53,17,51,17,16,2,35, + 34,2,1,21,51,21,35,21,35,53,35,53,51,53,1,8,172,148,166,165,148,172,245,240,241,245,2,24,170,170,101,170,170,2,87,2,80,253,201,244, + 211,211,244,2,55,253,176,254,216,254,214,1,42,1,225,171,100,171,171,100,171,0,0,0,0,1,0,217,0,0,5,219,4,139,0,7,0,27,64,5, + 1,5,3,7,8,16,220,220,220,60,49,0,64,5,1,3,5,7,8,16,212,220,220,220,48,19,33,21,33,17,33,21,33,217,5,2,251,168,4,88, + 250,254,4,139,170,252,201,170,0,1,0,217,0,0,5,219,4,139,0,7,0,27,64,5,1,5,3,7,8,16,220,60,220,220,49,0,64,5,7,5, + 3,1,8,16,212,220,220,220,48,1,17,33,53,33,17,33,53,5,219,250,254,4,88,251,168,4,139,251,117,170,3,55,170,0,0,0,0,2,0,217, + 255,86,5,219,5,11,0,7,0,11,0,0,19,33,21,33,17,33,21,33,21,33,21,33,217,5,2,251,168,4,88,250,254,5,2,250,254,5,11,170, + 252,201,170,128,170,0,0,0,0,2,0,217,255,86,5,219,5,11,0,7,0,11,0,0,1,17,33,53,33,17,33,53,1,21,33,53,5,219,250,254, + 4,88,251,168,5,2,250,254,5,11,251,117,170,3,55,170,250,245,170,170,0,1,0,217,0,0,5,101,5,2,0,7,0,0,1,17,35,17,33,17, + 35,17,5,101,170,252,200,170,5,2,250,254,4,88,251,168,5,2,0,0,0,1,0,217,0,0,5,101,5,2,0,7,0,0,51,17,51,17,33,17, + 51,17,217,170,3,56,170,5,2,251,168,4,88,250,254,0,0,3,0,187,255,227,5,249,5,36,0,25,0,51,0,63,0,0,0,34,7,6,7,14, + 1,21,20,22,23,22,23,22,50,55,54,55,62,1,53,52,38,39,38,39,36,32,22,23,22,23,22,21,20,7,6,7,14,1,32,38,39,38,39,38, + 53,52,55,54,55,54,5,17,33,21,33,17,35,17,33,53,33,17,3,197,214,93,92,76,77,76,76,77,76,92,93,214,93,92,76,77,76,76,77,76, + 92,254,174,1,20,238,98,99,49,49,49,49,99,98,238,254,236,238,98,99,49,49,49,49,99,98,1,205,1,100,254,156,170,254,156,1,100,4,142,39, + 39,76,77,184,109,106,184,77,76,39,39,39,39,76,77,184,106,109,184,77,76,39,189,100,98,99,119,118,140,137,119,118,99,98,100,100,98,99,118,119, + 137,140,118,119,99,98,132,254,155,170,254,155,1,101,170,1,101,0,0,0,0,3,0,187,255,227,5,249,5,36,0,3,0,29,0,55,0,0,1,33, + 21,33,0,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1,53,52,38,39,38,39,36,32,22,23,22,23,22,21,20,7,6,7, + 14,1,32,38,39,38,39,38,53,52,55,54,55,54,1,161,3,114,252,142,2,36,214,93,92,76,77,76,76,77,76,92,93,214,93,92,76,77,76,76, + 77,76,92,254,174,1,20,238,98,99,49,49,49,49,99,98,238,254,236,238,98,99,49,49,49,49,99,98,2,215,170,2,97,39,39,76,77,184,109,106, + 184,77,76,39,39,39,39,76,77,184,106,109,184,77,76,39,189,100,98,99,119,118,140,137,119,118,99,98,100,100,98,99,118,119,137,140,118,119,99,98, + 0,3,0,187,255,227,5,249,5,36,0,25,0,51,0,63,0,0,0,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1,53,52, + 38,39,38,39,36,32,22,23,22,23,22,21,20,7,6,7,14,1,32,38,39,38,39,38,53,52,55,54,55,54,1,7,23,7,39,7,39,55,39,55, + 23,55,3,197,214,93,92,76,77,76,76,77,76,92,93,214,93,92,76,77,76,76,77,76,92,254,174,1,20,238,98,99,49,49,49,49,99,98,238,254, + 236,238,98,99,49,49,49,49,99,98,2,237,253,252,120,252,252,121,253,252,120,252,252,4,142,39,39,76,77,184,109,106,184,77,76,39,39,39,39,76, + 77,184,106,109,184,77,76,39,189,100,98,99,119,118,140,137,119,118,99,98,100,100,98,99,118,119,137,140,118,119,99,98,254,190,252,252,120,252,253,121, + 252,252,120,252,253,0,0,0,0,3,0,187,255,227,5,249,5,36,0,3,0,29,0,55,0,0,9,1,23,1,0,34,7,6,7,14,1,21,20,22, + 23,22,23,22,50,55,54,55,62,1,53,52,38,39,38,39,36,32,22,23,22,23,22,21,20,7,6,7,14,1,32,38,39,38,39,38,53,52,55,54, + 55,54,1,230,2,112,120,253,144,1,103,214,93,92,76,77,76,76,77,76,92,93,214,93,92,76,77,76,76,77,76,92,254,174,1,20,238,98,99,49, + 49,49,49,99,98,238,254,236,238,98,99,49,49,49,49,99,98,1,134,2,112,120,253,144,3,128,39,39,76,77,184,109,106,184,77,76,39,39,39,39, + 76,77,184,106,109,184,77,76,39,189,100,98,99,119,118,140,137,119,118,99,98,100,100,98,99,118,119,137,140,118,119,99,98,0,0,0,0,3,0,187, + 255,227,5,249,5,36,0,3,0,29,0,55,0,0,1,51,21,35,18,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1,53,52, + 38,39,38,39,36,32,22,23,22,23,22,21,20,7,6,7,14,1,32,38,39,38,39,38,53,52,55,54,55,54,2,240,212,212,213,214,93,92,76,77, + 76,76,77,76,92,93,214,93,92,76,77,76,76,77,76,92,254,174,1,20,238,98,99,49,49,49,49,99,98,238,254,236,238,98,99,49,49,49,49,99, + 98,3,1,254,2,139,39,39,76,77,184,109,106,184,77,76,39,39,39,39,76,77,184,106,109,184,77,76,39,189,100,98,99,119,118,140,137,119,118,99, + 98,100,100,98,99,118,119,137,140,118,119,99,98,0,0,0,0,4,0,187,255,227,5,249,5,36,0,9,0,24,0,50,0,76,0,0,1,34,6,21, + 20,22,50,54,52,38,39,50,22,23,30,1,21,20,6,35,34,38,53,52,62,1,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62, + 1,53,52,38,39,38,39,36,32,22,23,22,23,22,21,20,7,6,7,14,1,32,38,39,38,39,38,53,52,55,54,55,54,3,90,80,110,110,160,110, + 111,79,64,118,43,46,46,185,134,135,180,184,240,214,93,92,76,77,76,76,77,76,92,93,214,93,92,76,77,76,76,77,76,92,254,174,1,20,238,98, + 99,49,49,49,49,99,98,238,254,236,238,98,99,49,49,49,49,99,98,3,65,111,80,79,109,109,158,112,129,49,46,45,114,66,132,183,180,135,134,186, + 204,39,39,76,77,184,109,106,184,77,76,39,39,39,39,76,77,184,106,109,184,77,76,39,189,100,98,99,119,118,140,137,119,118,99,98,100,100,98,99, + 118,119,137,140,118,119,99,98,0,3,0,187,255,227,5,249,5,36,0,17,0,43,0,69,0,0,1,13,1,7,37,17,35,17,5,39,45,1,55,5, + 17,51,17,37,2,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1,53,52,38,39,38,39,36,32,22,23,22,23,22,21,20,7, + 6,7,14,1,32,38,39,38,39,38,53,52,55,54,55,54,4,240,254,189,1,67,52,254,209,102,254,209,52,1,67,254,189,52,1,47,102,1,47,247, + 214,93,92,76,77,76,76,77,76,92,93,214,93,92,76,77,76,76,77,76,92,254,174,1,20,238,98,99,49,49,49,49,99,98,238,254,236,238,98,99, + 49,49,49,49,99,98,3,49,175,176,88,183,254,173,1,83,183,88,176,175,89,183,1,83,254,173,183,1,4,39,39,76,77,184,109,106,184,77,76,39, + 39,39,39,76,77,184,106,109,184,77,76,39,189,100,98,99,119,118,140,137,119,118,99,98,100,100,98,99,118,119,137,140,118,119,99,98,0,4,0,187, + 255,227,5,249,5,36,0,3,0,7,0,33,0,59,0,0,1,33,21,33,21,33,21,33,0,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55, + 54,55,62,1,53,52,38,39,38,39,36,32,22,23,22,23,22,21,20,7,6,7,14,1,32,38,39,38,39,38,53,52,55,54,55,54,2,26,2,128, + 253,128,2,128,253,128,1,171,214,93,92,76,77,76,76,77,76,92,93,214,93,92,76,77,76,76,77,76,92,254,174,1,20,238,98,99,49,49,49,49, + 99,98,238,254,236,238,98,99,49,49,49,49,99,98,3,106,136,192,136,2,244,39,39,76,77,184,109,106,184,77,76,39,39,39,39,76,77,184,106,109, + 184,77,76,39,189,100,98,99,119,118,140,137,119,118,99,98,100,100,98,99,118,119,137,140,118,119,99,98,0,3,0,187,255,227,5,249,5,36,0,25, + 0,51,0,55,0,0,0,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1,53,52,38,39,38,39,36,32,22,23,22,23,22,21, + 20,7,6,7,14,1,32,38,39,38,39,38,53,52,55,54,55,54,19,33,21,33,3,197,214,93,92,76,77,76,76,77,76,92,93,214,93,92,76,77, + 76,76,77,76,92,254,174,1,20,238,98,99,49,49,49,49,99,98,238,254,236,238,98,99,49,49,49,49,99,98,56,2,128,253,128,4,142,39,39,76, + 77,184,109,106,184,77,76,39,39,39,39,76,77,184,106,109,184,77,76,39,189,100,98,99,119,118,140,137,119,118,99,98,100,100,98,99,118,119,137,140, + 118,119,99,98,254,23,170,0,0,3,0,187,255,227,5,249,5,36,0,3,0,7,0,19,0,0,1,17,33,17,37,33,17,33,1,17,33,21,33,17, + 35,17,33,53,33,17,1,81,4,18,251,88,5,62,250,194,2,244,1,100,254,156,170,254,156,1,100,4,137,251,240,4,16,155,250,191,4,89,254,155, + 170,254,155,1,101,170,1,101,0,3,0,187,255,227,5,249,5,36,0,3,0,7,0,11,0,0,1,33,21,33,3,17,33,17,37,33,17,33,1,161, + 3,114,252,142,80,4,18,251,88,5,62,250,194,2,215,170,2,92,251,240,4,16,155,250,191,0,0,0,0,3,0,187,255,227,5,249,5,36,0,11, + 0,15,0,19,0,0,9,2,7,9,1,39,9,1,55,9,1,37,17,33,17,37,33,17,33,5,61,254,149,1,107,121,254,150,254,150,121,1,107,254, + 149,121,1,106,1,106,252,141,4,18,251,88,5,62,250,194,3,236,254,150,254,150,120,1,106,254,149,121,1,106,1,106,121,254,149,1,107,36,251,240, + 4,16,155,250,191,0,0,0,0,3,0,187,255,227,5,249,5,36,0,3,0,7,0,11,0,0,1,51,21,35,1,17,33,17,37,33,17,33,2,240, + 212,212,254,97,4,18,251,88,5,62,250,194,3,1,254,2,134,251,240,4,16,155,250,191,0,1,0,175,0,0,6,74,5,154,0,7,0,25,64,10, + 2,4,6,0,8,4,6,2,0,8,16,220,220,60,220,49,0,16,60,220,220,220,48,51,17,51,17,33,21,33,17,175,127,5,28,250,228,5,154,253, + 117,127,253,112,0,1,0,175,0,0,6,74,5,154,0,7,0,0,33,35,17,33,53,33,17,51,6,74,127,250,228,5,28,127,2,144,127,2,139,0, + 0,1,0,175,0,0,6,73,5,154,0,7,0,0,1,21,33,17,35,17,33,53,6,73,253,115,128,253,115,5,154,127,250,229,5,27,127,0,0,0, + 0,1,0,175,0,0,6,73,5,154,0,7,0,0,51,53,33,17,51,17,33,21,175,2,141,128,2,141,127,5,27,250,229,127,0,0,0,1,0,175, + 0,0,3,124,5,154,0,7,0,0,51,17,51,17,33,21,33,17,175,127,2,78,253,178,5,154,253,117,127,253,112,0,0,1,0,175,0,0,3,124, + 5,154,0,11,0,0,33,35,17,51,17,33,21,33,21,33,21,33,1,46,127,127,2,78,253,178,2,78,253,178,5,154,254,36,127,228,127,0,0,0, + 0,1,0,175,0,0,6,74,5,154,0,11,0,0,33,35,17,51,17,33,21,33,21,33,21,33,1,46,127,127,5,28,250,228,5,28,250,228,5,154, + 254,36,127,228,127,0,0,0,0,2,0,175,0,0,6,74,5,154,0,7,0,11,0,0,33,17,51,17,33,21,33,17,33,35,17,51,2,18,127,3, + 185,252,71,254,157,127,127,5,154,253,117,127,253,112,5,154,0,3,0,175,0,0,6,74,5,154,0,3,0,11,0,15,0,0,33,35,17,51,1,17, + 51,17,33,21,33,17,33,35,17,51,1,46,127,127,2,71,127,2,86,253,170,254,157,127,127,5,154,250,102,5,154,253,117,127,253,112,5,154,0,0, + 0,2,0,175,0,0,6,74,5,154,0,3,0,15,0,0,33,35,17,51,1,35,17,51,17,33,21,33,21,33,21,33,1,46,127,127,1,99,127,127, + 3,185,252,71,3,185,252,71,5,154,250,102,5,154,254,36,127,228,127,0,0,1,0,175,255,175,6,74,5,235,0,15,0,0,51,17,51,17,33,1, + 23,1,33,21,33,1,39,1,33,17,175,127,2,39,1,83,115,254,197,2,106,253,92,254,170,115,1,61,254,20,5,154,253,117,2,220,53,253,89,127, + 253,31,54,2,171,253,112,0,0,2,0,175,255,175,6,74,5,235,0,19,0,23,0,0,1,23,3,33,21,33,7,33,21,33,1,39,19,33,17,35, + 17,51,17,33,3,55,33,21,4,168,115,234,2,25,253,173,106,2,189,253,8,254,254,115,233,254,104,127,127,2,120,165,106,253,195,5,235,53,254,8, + 127,228,127,253,211,54,1,247,254,36,5,154,254,36,254,157,228,228,0,0,0,2,0,175,255,175,6,74,5,235,0,15,0,19,0,0,1,23,1,33, + 21,33,1,39,1,33,17,35,17,51,17,33,1,35,17,51,5,130,115,254,197,1,144,254,54,254,170,115,1,61,254,157,127,127,1,158,252,255,127,127, + 5,235,53,253,89,127,253,31,54,2,171,253,112,5,154,253,117,252,241,5,154,0,0,0,0,3,0,175,255,175,6,74,5,235,0,19,0,23,0,27, + 0,0,33,35,17,51,17,33,1,23,3,33,21,33,7,33,21,33,1,39,19,33,1,35,17,51,1,55,33,21,2,145,127,127,1,244,1,2,115,234, + 1,58,254,140,106,1,222,253,231,254,254,115,233,254,236,254,157,127,127,2,178,106,254,71,5,154,254,36,2,45,53,254,8,127,228,127,253,211,54,1, + 247,254,36,5,154,252,193,228,228,0,0,0,0,1,0,217,255,167,5,203,5,93,0,42,0,0,19,53,36,37,54,55,54,53,52,38,35,34,7,39, + 54,51,50,22,21,20,7,6,5,4,23,22,21,20,6,35,34,39,55,22,51,50,54,53,52,39,38,39,36,217,1,155,1,64,200,101,61,77,62,80, + 55,115,90,160,136,176,148,227,254,137,1,119,227,148,176,136,160,90,115,55,80,62,77,61,101,200,254,192,2,46,168,40,89,55,79,48,60,48,58,62, + 126,106,160,121,159,91,140,60,60,140,91,159,121,160,106,126,62,58,48,60,48,79,55,89,0,1,0,217,255,167,5,203,5,93,0,42,0,0,1,4, + 5,6,7,6,21,20,22,51,50,55,23,6,35,34,38,53,52,55,54,37,36,39,38,53,52,54,51,50,23,7,38,35,34,6,21,20,23,22,23,4, + 5,5,203,254,101,254,192,200,101,61,77,62,80,55,115,90,160,136,176,148,227,1,119,254,137,227,148,176,136,160,90,115,55,80,62,77,61,101,200,1, + 64,1,155,2,46,40,89,55,79,48,60,48,58,62,126,106,160,121,159,91,140,60,60,140,91,159,121,160,106,126,62,58,48,60,48,79,55,89,40,0, + 0,2,0,217,0,30,5,219,4,230,0,2,0,6,0,0,1,17,9,2,53,1,5,49,252,162,4,8,250,254,5,2,1,32,2,196,254,158,253,156, + 2,17,166,2,17,0,0,0,0,2,0,217,0,30,5,219,4,230,0,2,0,6,0,0,9,2,3,17,1,21,1,131,3,94,252,162,170,5,2,1, + 32,1,98,1,98,252,58,4,200,253,239,166,0,3,0,217,255,158,5,219,5,100,0,3,0,6,0,10,0,0,23,53,33,21,3,17,9,2,53,1, + 217,5,2,170,252,162,4,8,250,254,5,2,98,170,170,2,0,2,196,254,158,253,156,2,17,166,2,17,0,3,0,217,255,158,5,219,5,100,0,3, + 0,6,0,10,0,0,23,53,33,21,9,2,3,17,1,21,217,5,2,251,168,3,94,252,162,170,5,2,98,170,170,2,0,1,98,1,98,252,58,4, + 200,253,239,166,0,2,0,121,1,103,7,135,3,162,0,23,0,31,0,0,1,54,50,22,20,6,34,39,38,39,33,6,7,6,34,38,52,54,50,23, + 22,23,33,54,4,34,6,20,22,50,54,52,5,159,83,235,170,167,242,81,51,19,253,81,20,51,84,242,162,166,235,87,52,19,2,175,20,252,100,114, + 79,79,115,79,3,79,83,168,239,164,81,51,67,66,51,82,162,242,167,85,52,67,68,14,80,114,79,79,113,0,0,0,0,2,0,121,1,103,7,135, + 3,162,0,23,0,31,0,0,1,6,34,38,52,54,50,23,22,23,33,54,55,54,50,22,20,6,34,39,38,39,33,6,36,50,54,52,38,34,6,20, + 2,97,83,235,170,167,242,81,51,19,2,175,20,51,84,242,162,166,235,87,52,19,253,81,20,3,156,114,79,79,115,79,1,186,83,168,239,164,81,51, + 67,66,51,82,162,242,167,85,52,67,68,14,80,114,79,79,113,0,0,0,0,2,0,98,1,103,6,82,3,162,0,13,0,21,0,0,19,55,33,54, + 55,54,50,22,20,6,34,39,38,39,36,38,34,6,20,22,50,54,98,1,3,192,19,49,91,235,165,162,242,83,52,19,1,154,79,115,80,79,116,79, + 2,46,168,68,47,89,167,242,162,82,51,66,142,80,81,113,79,79,0,0,0,4,0,121,255,160,6,59,5,100,0,3,0,7,0,11,0,15,0,0, + 1,51,17,35,5,33,21,33,3,35,17,51,37,33,53,33,3,6,168,168,1,40,2,13,253,243,128,168,168,254,216,253,243,2,13,5,100,253,243,128, + 170,253,115,2,13,128,170,0,0,1,0,238,0,0,3,60,5,155,0,7,0,0,33,35,17,35,53,33,21,35,2,84,126,232,2,78,232,5,28,127, + 127,0,0,0,0,2,0,200,0,0,5,19,5,236,0,3,0,10,0,0,51,53,33,21,1,51,9,1,51,1,35,200,4,75,251,245,195,1,35,1, + 34,195,254,152,250,170,170,5,236,252,84,3,172,251,94,0,0,2,0,200,0,0,5,19,5,236,0,3,0,10,0,0,19,33,21,33,19,1,51,1, + 35,9,1,200,4,75,251,181,64,1,105,250,1,104,195,254,222,254,221,5,236,170,250,190,4,162,251,94,3,172,252,84,0,2,0,200,0,0,5,19, + 5,236,0,3,0,10,0,0,19,33,21,33,23,51,9,1,51,1,35,200,4,75,251,181,64,195,1,35,1,34,195,254,152,250,5,236,170,160,252,84, + 3,172,251,94,0,2,1,27,0,0,5,153,4,126,0,12,0,21,0,0,41,1,17,51,17,22,23,30,1,23,22,23,33,1,17,33,38,39,46,1, + 39,38,5,153,251,130,170,90,86,165,238,70,37,18,1,20,252,44,2,69,15,27,61,206,143,63,4,126,254,235,18,37,70,238,164,86,90,2,68,253, + 188,65,63,143,206,61,27,0,0,2,1,27,0,0,5,153,4,126,0,2,0,7,0,0,9,1,33,5,53,1,51,17,4,239,252,214,3,42,252,44, + 3,212,170,3,212,252,214,170,170,3,212,251,130,0,0,0,0,1,255,250,254,119,6,150,5,193,0,6,0,0,9,1,35,9,1,35,1,3,183,2, + 223,203,253,125,253,125,203,2,221,5,193,248,182,6,119,249,137,7,74,0,0,1,255,250,254,119,6,150,5,193,0,6,0,0,9,1,51,9,1,51, + 1,2,217,253,33,203,2,131,2,131,203,253,35,254,119,7,74,249,137,6,119,248,182,0,0,1,0,140,254,119,6,4,5,193,0,16,0,29,64,6, + 12,14,18,5,3,17,16,220,220,16,220,220,49,0,64,5,13,18,8,0,17,16,220,204,16,204,48,1,34,4,21,17,35,17,16,0,32,0,25,1, + 35,17,52,36,3,72,219,254,204,173,1,189,1,254,1,189,173,254,207,5,29,227,252,251,57,4,224,1,66,1,40,254,216,254,190,251,32,4,199,250, + 229,0,0,0,0,1,0,140,254,119,6,4,5,193,0,16,0,29,64,6,12,14,17,5,3,18,16,220,220,16,220,220,49,0,64,5,13,18,8,0, + 17,16,220,204,16,204,48,5,50,36,53,17,51,17,16,0,32,0,25,1,51,17,20,4,3,72,219,1,52,173,254,67,254,2,254,67,173,1,49,229, + 227,252,4,199,251,32,254,190,254,216,1,40,1,66,4,224,251,57,250,229,255,255,0,6,254,35,3,238,6,117,18,6,14,156,0,0,0,1,0,219, + 2,72,1,174,3,70,0,3,0,18,183,2,131,0,4,1,25,0,4,16,212,236,49,0,16,212,236,48,19,51,21,35,219,211,211,3,70,254,0,0, + 0,1,0,249,1,49,4,9,4,25,0,9,0,0,19,33,27,1,33,7,19,39,7,19,249,1,43,93,94,1,42,242,94,244,243,93,2,253,1,28, + 254,228,176,254,228,176,176,1,28,0,0,0,0,3,0,217,0,30,5,219,4,231,0,3,0,7,0,25,0,0,1,51,21,35,17,51,21,35,3,33, + 53,33,1,55,9,1,23,1,33,21,33,1,7,9,1,39,2,223,246,246,246,246,82,254,76,1,180,254,139,120,1,202,1,202,120,254,139,1,180,254, + 76,1,117,120,254,54,254,54,120,1,19,245,4,201,246,254,60,170,1,117,120,254,54,1,202,120,254,139,170,254,139,120,1,202,254,54,120,0,0,0, + 0,3,0,217,255,194,7,39,5,66,0,5,0,8,0,11,0,0,23,17,9,1,17,1,39,1,17,9,1,17,217,3,39,3,39,252,217,155,254,30, + 3,24,1,226,62,5,128,253,176,2,80,250,128,2,78,113,1,94,253,68,1,94,254,162,2,198,0,0,0,2,0,217,255,194,7,39,5,66,0,8, + 0,11,0,0,37,21,9,1,17,9,1,21,1,33,1,17,7,39,252,217,252,217,3,39,3,39,253,116,254,202,254,30,162,224,2,78,253,178,5,128, + 253,176,2,80,221,254,28,1,94,253,68,0,0,2,0,217,255,194,7,39,5,66,0,8,0,11,0,0,19,53,9,1,17,9,1,53,1,33,1,17, + 217,3,39,3,39,252,217,252,217,2,140,1,54,1,226,4,98,224,253,178,2,78,250,128,2,80,253,176,221,1,228,254,162,2,188,0,0,1,0,217, + 255,194,7,39,5,66,0,7,0,0,23,53,9,1,53,1,21,1,217,2,140,253,116,6,78,252,217,62,224,1,225,1,226,221,251,93,221,2,80,0, + 0,1,0,217,255,194,7,39,5,66,0,7,0,0,5,9,1,53,1,21,9,1,7,39,252,217,252,217,6,78,253,116,2,140,62,2,80,253,176,221, + 4,163,221,254,30,254,31,0,0,2,0,217,1,96,5,219,3,244,0,26,0,30,0,0,19,30,1,51,50,63,2,54,51,50,22,23,21,46,1,35, + 34,7,6,15,1,6,35,34,38,39,1,21,33,53,217,103,169,86,94,155,22,15,147,110,97,179,105,98,172,88,94,155,15,6,17,146,110,97,179,105, + 5,2,250,254,3,244,85,75,61,9,6,59,69,78,178,83,76,61,6,2,7,59,69,79,254,200,170,170,0,1,0,99,0,0,5,121,4,162,0,10, + 0,0,19,51,0,19,18,1,51,0,3,35,2,99,215,1,117,63,73,1,107,215,254,56,102,186,102,4,162,254,144,254,37,1,218,1,113,254,129,252, + 221,3,35,0,0,1,0,99,0,0,5,121,4,162,0,10,0,0,51,0,19,51,18,1,35,0,3,2,1,99,1,200,102,186,102,1,200,215,254,149, + 73,63,254,139,1,127,3,35,252,221,254,129,1,113,1,218,254,37,254,144,0,2,0,190,255,250,5,219,5,10,0,19,0,41,0,0,1,33,34,7, + 6,21,20,22,51,33,21,33,34,39,38,53,52,54,51,33,17,33,32,39,38,17,16,55,54,41,1,21,33,34,7,6,21,20,23,22,51,33,5,219, + 253,107,58,40,40,80,58,2,149,253,106,128,90,89,178,129,2,150,253,107,254,241,188,189,189,186,1,15,2,151,253,106,200,138,139,139,138,201,2,149, + 3,12,40,41,57,58,80,170,90,88,130,128,180,252,68,189,190,1,13,1,12,191,189,170,139,141,198,200,139,139,0,0,0,2,0,217,255,250,5,246, + 5,10,0,19,0,41,0,0,19,53,33,50,22,21,20,7,6,35,33,53,33,50,54,53,52,39,38,35,1,53,33,50,55,54,53,52,39,38,35,33, + 53,33,32,23,22,17,16,7,6,33,217,2,150,129,178,89,90,128,253,106,2,149,58,80,40,40,58,253,107,2,149,201,138,139,139,138,200,253,106,2, + 151,1,15,186,189,189,188,254,241,3,12,170,180,128,130,88,90,170,80,58,57,41,40,252,238,170,139,139,200,198,141,139,170,189,191,254,244,254,243,190, + 189,0,0,0,0,2,0,210,0,0,5,226,5,78,0,17,0,36,0,0,33,17,52,38,34,6,21,17,35,17,52,55,54,51,50,22,21,17,33,17, + 16,0,32,23,22,25,1,35,17,52,39,38,32,7,6,21,17,3,228,80,116,80,170,90,88,130,128,180,252,68,1,124,2,24,192,188,170,138,140,254, + 112,138,140,2,198,58,80,80,58,253,58,2,200,128,90,88,178,128,253,56,2,198,1,16,1,120,188,186,254,240,253,56,2,200,200,138,138,138,138,202, + 253,58,0,0,0,2,0,210,255,227,5,226,5,49,0,17,0,36,0,0,1,17,20,22,50,54,53,17,51,17,20,7,6,35,34,38,53,17,33,17, + 16,0,32,39,38,25,1,51,17,20,23,22,32,55,54,53,17,2,208,80,116,80,170,90,88,130,128,180,3,188,254,132,253,232,192,188,170,138,140,1, + 144,138,140,5,49,253,58,58,80,80,58,2,198,253,56,128,90,88,178,128,2,200,253,58,254,240,254,136,188,186,1,16,2,200,253,56,200,138,138,138, + 138,202,2,198,0,1,1,124,0,0,5,56,5,213,0,27,0,0,1,52,39,38,39,17,35,17,6,7,6,21,17,35,17,52,55,54,55,17,51,17, + 22,23,22,21,17,35,4,142,90,58,75,170,75,58,90,170,140,108,145,170,147,108,138,170,2,159,128,89,58,20,252,58,3,198,19,58,90,128,253,97, + 2,157,200,140,108,23,1,97,254,159,23,108,138,200,253,97,0,2,0,217,255,52,5,219,5,213,0,27,0,31,0,0,5,35,17,35,17,35,17,33, + 53,33,53,33,53,33,17,51,17,51,17,51,17,33,21,33,21,33,21,33,39,53,35,21,4,89,170,170,170,254,126,1,130,254,126,1,130,170,170,170, + 1,130,254,126,1,130,254,126,170,170,204,2,44,253,212,2,44,170,240,168,2,51,253,205,2,51,253,205,168,240,170,170,240,240,0,0,0,2,0,217, + 0,94,5,219,4,166,0,3,0,10,0,0,1,51,21,35,9,2,21,1,53,1,4,164,211,211,1,55,251,248,4,8,250,254,5,2,3,0,254,1, + 238,254,145,254,147,182,1,209,166,1,209,0,0,2,0,217,0,94,5,219,4,166,0,3,0,10,0,0,1,51,21,35,3,53,1,21,1,53,1,1, + 61,211,211,100,5,2,250,254,4,6,3,0,254,1,238,182,254,47,166,254,47,182,1,109,0,3,0,148,0,46,10,204,4,223,0,6,0,13,0,20, + 0,0,9,2,21,1,53,1,5,9,1,21,1,53,1,5,9,1,21,1,53,1,10,204,252,198,3,58,251,202,4,54,253,0,252,198,3,58,251,202, + 4,54,252,254,252,198,3,58,251,202,4,54,4,17,254,112,254,114,197,2,8,159,2,10,206,254,112,254,114,197,2,8,159,2,10,206,254,112,254,114, + 197,2,8,159,2,10,0,0,0,3,0,148,0,46,10,204,4,223,0,6,0,13,0,20,0,0,19,53,1,21,1,53,1,3,53,1,21,1,53,1, + 3,53,1,21,1,53,1,148,4,54,251,202,3,58,56,4,54,251,202,3,58,58,4,54,251,202,3,58,4,17,206,253,246,159,253,248,197,1,142,1, + 144,206,253,246,159,253,248,197,1,142,1,144,206,253,246,159,253,248,197,1,142,0,0,0,0,3,0,217,254,46,5,219,6,212,0,6,0,10,0,17, + 0,0,19,9,1,53,1,21,9,1,33,53,33,17,9,1,21,1,53,1,217,3,193,252,63,5,2,250,254,5,2,250,254,5,2,252,64,3,192,250, + 254,5,2,254,222,1,21,1,18,178,254,144,170,254,145,3,254,170,3,78,254,235,254,238,178,1,112,170,1,111,0,0,0,3,0,217,254,46,5,219, + 6,212,0,6,0,10,0,17,0,0,1,21,1,53,1,21,9,1,53,33,21,1,53,1,21,1,53,1,5,219,250,254,5,2,252,63,254,191,5,2, + 250,254,5,2,250,254,3,192,254,222,176,1,111,170,1,112,178,254,238,2,57,170,170,3,248,176,254,145,170,254,144,178,1,18,0,0,0,2,0,217, + 0,0,5,219,4,168,0,6,0,10,0,0,37,21,1,53,1,21,9,1,53,33,21,5,219,250,254,5,2,252,64,254,190,5,2,176,176,1,111,170, + 1,112,178,254,238,2,57,170,170,0,0,0,0,2,0,217,0,0,5,219,4,168,0,6,0,10,0,0,55,9,1,53,1,21,9,1,33,53,33,217, + 3,193,252,63,5,2,250,254,5,2,250,254,5,2,176,1,21,1,18,178,254,144,170,254,145,3,254,170,0,2,0,217,255,41,5,219,5,87,0,5, + 0,16,0,0,1,0,5,53,36,1,17,21,0,37,53,36,1,21,0,5,4,5,219,254,84,252,170,3,105,1,153,254,129,252,125,3,131,1,127,254, + 129,254,36,1,220,4,128,254,95,133,174,145,1,190,250,169,215,1,128,124,166,132,1,120,215,254,229,93,93,0,0,0,0,2,0,217,255,41,5,219, + 5,87,0,5,0,16,0,0,19,53,0,5,21,36,1,0,37,36,1,53,0,5,21,4,1,217,1,153,3,105,252,170,254,84,1,127,1,220,254,36, + 254,129,1,127,3,131,252,125,254,129,4,128,215,254,66,145,174,133,253,33,1,27,93,93,1,27,215,254,136,132,166,124,254,128,0,0,0,2,0,217, + 254,147,5,219,6,29,0,33,0,38,0,0,33,21,0,37,1,39,1,38,39,53,4,23,55,38,37,53,36,37,19,23,3,54,55,21,6,15,1,4, + 23,21,38,37,7,4,1,55,6,7,22,5,219,254,243,254,42,254,227,130,1,15,186,213,0,255,218,63,240,254,216,1,181,1,59,246,131,166,189,130, + 200,226,105,1,29,246,218,254,128,64,1,154,254,93,48,113,119,94,215,1,37,164,253,161,75,2,65,54,35,174,40,65,135,70,43,166,60,122,2,12, + 75,254,159,100,130,215,148,96,223,103,182,215,214,135,136,148,1,226,102,35,23,18,0,0,0,2,0,217,254,147,5,219,6,29,0,33,0,38,0,0, + 19,53,22,5,1,23,1,22,23,21,4,5,7,36,37,21,4,5,3,39,19,6,7,53,54,63,1,4,7,53,36,37,55,36,5,7,54,55,38,217, + 250,1,216,1,20,131,254,252,191,222,254,184,254,252,88,1,39,1,125,254,56,254,182,238,130,143,154,117,166,230,99,254,204,187,1,18,1,66,56,254, + 158,1,246,13,35,37,30,4,128,215,251,140,2,77,75,253,214,46,31,166,48,81,189,116,59,174,76,158,254,5,75,1,49,103,127,215,162,118,213,125, + 183,215,203,105,119,105,144,27,8,7,6,0,0,2,0,217,254,223,5,219,6,35,0,23,0,27,0,0,1,23,7,33,21,33,3,33,21,33,7,33, + 21,33,3,39,55,33,53,33,55,33,17,33,1,19,33,17,4,77,160,88,1,70,254,125,221,2,96,253,99,46,2,203,252,248,109,160,88,254,187,1, + 130,46,254,80,3,7,254,230,221,253,224,6,35,58,245,170,253,152,170,128,170,254,209,58,245,170,128,3,188,252,238,2,104,253,152,0,0,2,0,217, + 254,223,5,219,6,35,0,23,0,27,0,0,1,23,7,33,17,33,7,33,21,33,3,39,55,33,53,33,55,33,53,33,19,33,53,33,23,3,33,17, + 4,77,160,88,1,70,253,99,46,2,203,252,248,109,160,88,254,187,1,130,46,254,80,1,237,221,253,54,3,7,120,221,1,182,6,35,58,245,252,68, + 128,170,254,209,58,245,170,128,170,2,104,170,170,253,152,2,104,0,0,0,0,1,0,217,255,63,5,219,4,244,0,20,0,0,19,33,21,33,17,33, + 21,33,23,7,33,21,33,7,39,55,33,53,33,55,33,217,5,2,251,168,4,88,254,85,27,77,1,221,253,171,146,139,77,254,35,2,85,90,253,81, + 4,244,170,253,152,170,19,109,170,207,98,109,170,128,0,0,0,1,0,217,255,63,5,219,4,244,0,20,0,0,37,21,33,7,39,55,33,53,33,55, + 33,53,33,17,33,53,33,17,33,23,7,5,219,253,171,146,139,77,254,35,2,85,90,253,81,4,88,251,168,5,2,254,85,27,77,184,170,207,98,109, + 170,128,170,2,104,170,252,68,19,109,0,0,0,2,0,217,254,229,5,220,4,168,0,27,0,34,0,0,37,38,35,34,6,7,53,62,1,51,50,23, + 55,23,7,22,51,50,54,55,21,14,1,35,34,39,7,39,9,2,21,1,53,1,2,230,99,67,88,172,98,104,180,96,94,120,110,155,105,101,69,86, + 168,104,106,178,98,95,122,108,155,3,93,252,64,3,192,250,254,5,2,17,31,76,84,180,78,68,42,243,70,233,32,74,86,180,78,68,43,240,70,4, + 205,254,235,254,238,178,1,112,170,1,111,0,0,2,0,217,254,229,5,220,4,168,0,27,0,34,0,0,37,38,35,34,6,7,53,62,1,51,50,23, + 55,23,7,22,51,50,54,55,21,14,1,35,34,39,7,39,1,53,1,21,1,53,1,2,230,99,67,88,172,98,104,180,96,94,120,110,155,105,101,69, + 86,168,104,106,178,98,95,122,108,155,254,91,5,2,250,254,3,192,17,31,76,84,180,78,68,42,243,70,233,32,74,86,180,78,68,43,240,70,4,205, + 176,254,145,170,254,144,178,1,18,0,0,0,0,2,0,217,254,166,5,219,5,87,0,27,0,38,0,0,5,38,35,34,6,7,53,62,1,51,50,23, + 55,23,7,22,51,50,54,55,21,14,1,35,34,39,7,39,1,0,5,4,1,21,0,37,53,36,1,2,230,99,68,88,172,98,105,179,97,93,121,109, + 155,105,101,69,86,169,103,105,179,97,96,121,108,155,3,93,254,129,254,36,1,220,1,127,254,129,252,125,3,131,1,127,46,32,76,84,179,78,69,43, + 243,70,233,32,75,85,179,78,69,44,241,70,5,148,254,229,93,93,254,229,215,1,120,132,166,124,1,128,0,2,0,225,254,162,5,227,5,87,0,27, + 0,38,0,0,5,38,35,34,6,7,53,62,1,51,50,23,55,23,7,22,51,50,54,55,21,14,1,35,34,39,7,39,1,53,0,5,21,4,1,53, + 0,37,36,2,238,99,68,88,172,98,105,179,97,93,121,109,155,105,101,69,86,169,103,105,179,97,96,121,108,155,254,91,1,127,3,131,252,125,254,129, + 1,127,1,220,254,36,51,32,76,84,179,78,69,43,244,70,234,32,75,85,179,78,69,44,240,70,5,152,215,254,128,124,166,132,254,136,215,1,27,93, + 93,0,0,0,0,3,0,217,254,246,5,219,6,12,0,11,0,15,0,18,0,0,1,23,3,55,17,37,3,39,19,37,53,9,1,17,7,3,39,19, + 5,4,231,158,131,217,253,185,219,158,220,253,226,3,76,1,12,139,208,158,145,254,10,6,12,64,254,193,89,251,56,240,253,232,64,2,25,224,166,1, + 92,252,239,2,196,57,254,4,64,1,97,206,0,3,0,217,254,246,5,219,6,12,0,11,0,15,0,18,0,0,1,39,19,7,17,5,19,23,3,5, + 21,9,1,17,55,19,23,3,37,1,205,158,131,217,2,71,219,158,220,2,30,252,180,254,244,139,208,158,145,1,246,254,246,64,1,63,89,4,200,240, + 2,24,64,253,231,224,166,254,164,3,17,253,60,57,1,252,64,254,159,206,0,3,0,217,254,125,5,219,6,133,0,3,0,23,0,26,0,0,1,17, + 7,3,1,53,33,19,37,53,1,19,23,3,55,17,37,3,33,21,33,3,39,55,1,19,5,5,49,142,207,253,5,1,124,160,253,228,3,73,193,158, + 129,219,253,183,133,2,206,252,236,118,158,92,1,39,144,254,13,1,158,2,196,58,254,5,253,113,170,1,134,223,166,1,91,1,215,64,254,197,90,251, + 56,241,254,187,170,254,223,64,225,2,208,1,95,205,0,0,0,3,0,213,254,125,5,215,6,133,0,19,0,23,0,26,0,0,55,17,1,19,23,3, + 5,21,1,3,33,21,33,3,39,55,35,53,33,55,1,37,17,37,1,3,37,213,2,165,233,158,233,1,191,253,57,131,3,74,252,112,118,158,92,186, + 1,0,93,1,7,254,70,1,16,1,71,106,1,113,156,4,200,254,233,2,56,64,253,199,185,166,254,219,254,192,170,254,223,64,225,170,228,2,129,181, + 253,60,112,1,94,254,252,152,255,255,3,150,255,66,4,105,5,184,16,39,13,74,2,187,252,250,16,39,13,74,2,187,2,114,16,7,13,74,2,187, + 255,182,0,0,255,255,0,236,1,254,7,19,2,252,16,38,13,74,17,182,16,39,13,74,2,187,255,182,16,7,13,74,5,101,255,182,255,255,0,236, + 255,66,7,19,5,184,16,39,13,74,0,17,252,250,16,39,13,74,5,101,2,114,16,7,13,74,2,187,255,182,0,0,255,255,0,236,255,66,7,19, + 5,184,16,39,13,74,5,101,252,250,16,39,13,74,0,17,2,114,16,7,13,74,2,187,255,182,0,0,0,1,0,88,255,236,7,168,5,174,0,33, + 0,0,1,33,53,33,54,55,54,36,51,33,21,33,6,7,6,7,6,7,33,21,33,22,23,22,23,22,23,33,21,33,34,36,39,38,2,20,254,68, + 1,186,15,77,94,1,100,192,2,184,253,71,147,138,138,75,65,8,4,244,251,14,7,64,74,139,138,147,2,185,253,72,192,254,156,94,72,2,115,160, + 148,143,176,200,159,1,77,79,138,120,93,160,74,120,139,78,76,1,159,198,176,133,0,0,0,1,0,175,255,236,6,73,5,174,0,27,0,0,1,22, + 18,4,23,33,21,33,34,36,2,16,18,36,51,33,21,33,6,4,2,7,33,17,51,17,35,17,1,87,7,137,1,22,147,2,185,253,71,192,254,157, + 190,190,1,99,192,2,185,253,71,147,254,235,139,9,4,85,160,160,2,115,74,254,253,154,1,159,198,1,96,1,116,1,96,200,159,1,156,254,254,93, + 1,16,253,64,1,16,0,0,0,1,0,217,0,155,4,229,4,103,0,25,0,0,37,32,36,16,36,41,1,21,33,34,7,6,7,33,53,51,17,35, + 53,33,22,23,22,51,33,21,3,43,254,216,254,214,1,42,1,40,1,186,254,70,230,107,78,29,2,232,142,142,253,24,37,70,114,223,1,186,155,246, + 1,224,246,142,81,59,132,172,254,26,172,145,48,81,142,0,255,255,0,175,255,236,6,73,7,72,16,38,12,141,0,0,16,7,13,74,2,56,4,2, + 0,2,0,175,255,236,6,73,6,210,0,28,0,32,0,0,1,22,23,22,23,22,23,33,21,33,34,36,2,53,52,18,36,51,33,21,33,6,7,6, + 7,6,7,33,21,17,33,53,33,1,87,7,63,74,140,137,148,2,185,253,71,192,254,157,190,190,1,99,192,2,185,253,71,148,137,139,75,64,9,4, + 245,250,165,5,91,2,115,74,120,139,78,76,1,159,198,1,96,187,185,1,96,200,159,1,77,79,138,120,93,160,3,191,160,0,0,0,0,2,0,217, + 0,155,4,229,5,125,0,22,0,26,0,0,37,32,36,53,52,36,41,1,21,5,6,7,6,7,33,21,33,22,23,22,51,33,21,17,33,53,33,3, + 43,254,216,254,214,1,42,1,40,1,186,254,70,232,105,78,29,3,118,252,138,37,70,114,223,1,186,252,27,3,229,155,246,240,240,246,142,1,1,79, + 58,133,142,145,48,81,142,4,86,140,0,0,0,2,0,175,254,218,6,73,5,174,0,28,0,32,0,0,1,22,23,22,23,22,23,33,21,33,34,36, + 2,53,52,18,36,51,33,21,33,6,7,6,7,6,7,33,21,17,33,53,33,1,87,7,63,74,140,137,148,2,185,253,71,192,254,157,190,190,1,99, + 192,2,185,253,71,148,137,139,75,64,9,4,245,250,165,5,91,2,115,74,120,139,78,76,1,159,198,1,96,187,185,1,96,200,159,1,77,79,138,120, + 93,160,252,103,160,0,0,0,0,1,0,175,255,236,6,73,5,174,0,31,0,0,1,33,21,33,23,22,23,22,23,33,21,33,34,36,2,53,52,18, + 36,51,33,21,33,6,7,6,7,6,7,33,21,33,1,87,4,242,251,67,17,74,140,138,147,2,185,253,71,192,254,157,190,190,1,99,192,2,185,253, + 71,147,138,139,75,14,12,4,198,251,14,2,115,160,34,139,78,76,1,159,198,1,96,187,185,1,96,200,159,1,77,79,138,27,26,160,0,1,0,88, + 255,236,7,168,5,174,0,33,0,0,1,33,21,33,6,7,6,4,35,33,53,33,54,55,54,55,54,55,33,53,33,38,39,38,39,38,39,33,53,33, + 50,4,23,22,5,236,1,188,254,70,15,77,94,254,156,192,253,72,2,185,147,138,138,75,65,8,251,12,4,242,7,64,74,139,138,147,253,71,2,184, + 192,1,100,94,72,3,39,160,148,143,176,200,159,1,77,79,138,120,93,160,74,120,139,78,76,1,159,198,176,133,0,0,0,1,0,175,255,236,6,73, + 5,174,0,27,0,0,1,38,2,36,39,33,53,33,50,4,18,16,2,4,35,33,53,33,54,36,18,55,33,17,35,17,51,17,5,161,7,137,254,234, + 147,253,71,2,185,192,1,99,190,190,254,157,192,253,71,2,185,147,1,21,139,9,251,171,160,160,3,39,74,1,3,154,1,159,198,254,160,254,140,254, + 160,200,159,1,156,1,2,93,254,240,2,192,254,240,0,0,0,1,0,217,0,155,4,229,4,103,0,25,0,0,1,32,4,16,4,41,1,53,33,50, + 55,54,55,33,21,35,17,51,21,33,38,39,38,35,37,53,2,147,1,40,1,42,254,214,254,216,254,70,1,186,230,107,78,29,253,24,142,142,2,232, + 37,70,114,223,254,70,4,103,246,254,32,246,142,81,58,133,172,1,230,172,145,48,80,1,142,0,0,0,0,2,0,175,255,236,6,73,6,210,0,28, + 0,32,0,0,1,38,39,38,39,38,39,33,53,33,50,4,18,21,20,2,4,35,33,53,33,54,55,54,55,54,55,33,53,1,33,53,33,5,161,7, + 63,74,140,137,148,253,71,2,185,192,1,99,190,190,254,157,192,253,71,2,185,148,137,139,75,64,9,251,11,5,91,250,165,5,91,3,39,74,120,139, + 78,76,1,159,198,254,160,187,185,254,160,200,159,1,77,79,138,120,93,160,3,11,160,0,0,2,0,217,0,155,4,229,5,125,0,22,0,26,0,0, + 1,32,4,21,20,4,41,1,53,37,50,55,54,55,33,53,5,38,39,38,7,33,53,37,33,53,33,2,147,1,40,1,42,254,214,254,216,254,70,1, + 186,232,105,78,29,252,138,3,118,37,70,116,221,254,70,3,229,252,27,3,229,4,103,246,241,239,246,142,1,80,58,133,142,1,145,49,82,1,142,138, + 140,0,0,0,0,1,0,217,0,0,6,31,5,194,0,11,0,0,1,33,17,33,21,33,17,33,21,33,17,33,6,31,251,100,4,156,250,186,5,70, + 251,100,4,156,2,130,254,40,170,5,194,170,254,20,0,0,0,3,0,74,255,220,4,137,4,28,0,19,0,27,0,35,0,0,1,50,23,55,23,7, + 22,21,20,0,35,34,39,7,39,55,38,53,52,0,5,38,35,34,6,21,20,31,1,22,51,50,54,53,52,39,2,104,186,143,117,99,118,110,254,196, + 221,184,141,118,99,117,111,1,60,1,192,100,128,162,233,71,99,99,126,163,233,69,4,23,113,118,99,118,141,186,221,254,196,111,118,99,118,141,186,223, + 1,60,213,72,233,165,128,99,98,71,233,163,128,98,0,0,0,1,0,114,1,76,4,82,3,140,0,7,0,0,1,17,1,53,5,17,1,21,2,162, + 253,208,1,176,2,48,2,122,254,210,1,74,194,250,1,46,254,182,194,0,0,2,0,146,0,0,4,130,4,196,0,4,0,9,0,0,51,17,9,1, + 17,37,33,17,9,1,146,1,248,1,248,252,182,2,164,254,174,254,174,2,160,2,36,253,220,253,96,170,1,213,1,121,254,135,0,0,0,1,1,163, + 3,218,5,15,5,220,0,7,0,0,9,1,39,1,51,1,7,1,3,45,254,238,120,1,138,90,1,136,120,254,240,4,234,254,240,120,1,138,254,118, + 120,1,16,0,0,1,1,163,0,0,5,15,2,2,0,7,0,0,37,51,1,23,1,35,1,55,3,45,90,1,16,120,254,120,90,254,118,120,242,1, + 16,120,254,118,1,138,120,0,255,255,1,163,0,0,5,15,3,63,16,38,23,23,0,0,16,7,13,136,0,0,252,38,255,255,1,163,0,0,5,15, + 4,27,16,39,23,23,0,0,0,220,16,38,23,23,0,215,16,7,13,136,0,0,252,38,0,1,1,59,255,197,2,173,6,78,0,25,0,0,1,23, + 6,20,23,22,20,7,6,20,23,22,20,7,39,54,52,39,38,52,55,54,52,39,38,52,1,183,122,76,76,124,124,76,76,124,124,122,76,76,124,124, + 76,76,124,6,78,118,79,112,80,129,248,129,80,111,80,129,249,129,118,79,112,80,129,248,129,80,112,80,129,248,0,0,0,1,0,176,254,242,2,88, + 6,20,0,5,0,0,19,33,21,35,17,35,176,1,168,240,184,6,20,143,249,109,0,0,0,1,0,199,254,242,2,111,6,20,0,5,0,0,1,17, + 35,17,35,53,2,111,184,240,6,20,248,222,6,147,143,0,0,1,0,176,254,242,2,88,6,20,0,5,0,0,19,17,51,17,51,21,176,184,240,254, + 242,7,34,249,109,143,0,0,0,1,0,199,254,242,2,111,6,20,0,5,0,0,1,33,53,51,17,51,2,111,254,88,240,184,254,242,143,6,147,0, + 0,2,2,244,255,98,6,19,2,130,0,3,0,7,0,0,1,51,17,35,19,53,33,21,2,244,144,144,200,2,87,1,186,253,168,2,144,144,144,0, + 0,2,0,100,255,98,3,132,2,130,0,3,0,7,0,0,1,21,33,53,5,51,17,35,2,188,253,168,2,144,144,144,2,130,144,144,200,253,168,0, + 0,2,2,244,1,242,6,19,5,18,0,3,0,7,0,0,1,53,33,21,37,35,17,51,3,188,2,87,253,113,144,144,1,242,144,144,200,2,88,0, + 0,2,0,100,1,242,3,132,5,18,0,3,0,7,0,0,1,21,33,53,37,35,17,51,2,188,253,168,3,32,144,144,2,130,144,144,56,2,88,0, + 0,1,0,217,1,31,5,219,3,94,0,5,0,0,1,21,33,17,35,17,5,219,251,166,168,3,94,170,254,107,2,63,0,2,0,6,1,2,4,21, + 5,18,0,7,0,15,0,0,19,36,5,2,19,4,37,18,1,18,3,4,37,2,19,36,140,1,129,1,129,137,137,254,127,254,127,137,254,241,184,184, + 2,7,2,8,184,184,253,248,1,138,137,137,1,128,1,130,138,138,254,126,253,248,1,244,2,28,177,177,254,12,253,229,177,0,0,0,0,6,0,247, + 0,1,7,9,6,19,0,3,0,49,0,59,0,70,0,79,0,89,0,0,1,33,17,33,17,21,20,6,32,38,53,52,54,59,1,17,35,34,38,53, + 52,54,32,22,29,1,33,53,52,54,51,50,22,21,20,6,43,1,17,51,50,22,21,20,6,35,34,38,61,1,1,53,52,38,35,34,6,20,22,51, + 19,35,34,6,21,20,22,51,50,54,53,1,51,50,54,52,38,34,6,21,17,21,20,22,50,54,53,52,38,35,3,108,1,40,254,216,185,254,252,184, + 184,127,170,170,127,184,184,1,4,185,1,40,185,130,131,183,183,128,170,170,128,183,183,131,130,185,254,68,98,69,68,98,98,69,166,166,69,98,98,69, + 68,98,2,80,167,68,98,97,138,98,98,138,97,98,68,2,118,1,40,254,68,170,128,183,184,131,128,186,1,40,186,129,130,184,183,128,170,170,128,183, + 184,130,129,186,254,216,186,128,131,184,183,128,170,2,80,167,69,97,97,138,98,253,176,98,68,69,98,98,68,2,247,98,138,97,97,69,253,9,167,68, + 98,98,69,68,98,0,0,0,0,1,0,217,1,31,5,219,3,94,0,5,0,0,1,33,17,51,17,33,5,219,250,254,168,4,90,1,31,2,63,254, + 107,0,0,0,0,1,0,176,3,103,3,58,6,20,0,5,0,0,1,33,17,35,17,33,3,58,254,6,144,2,138,5,132,253,227,2,173,0,0,0, + 0,1,0,134,3,103,3,16,6,20,0,5,0,0,19,53,33,17,35,17,134,2,138,144,5,132,144,253,83,2,29,0,0,1,0,176,255,112,3,58, + 2,29,0,5,0,0,33,21,33,17,51,17,3,58,253,118,144,144,2,173,253,227,0,0,0,1,0,134,255,112,3,16,2,29,0,5,0,0,51,33, + 17,51,17,33,134,1,250,144,253,118,2,29,253,83,0,0,0,1,1,175,254,0,3,250,7,108,0,25,0,0,1,17,52,55,26,1,51,50,22,21, + 20,6,35,34,39,38,39,46,1,35,34,3,2,21,48,17,1,175,3,12,190,202,80,100,64,55,43,28,24,15,6,9,16,104,17,8,254,0,5,8, + 36,129,2,3,1,188,84,65,54,63,19,16,38,15,72,253,149,254,211,2,250,152,0,0,0,1,0,42,254,26,2,117,7,137,0,25,0,0,1,17, + 20,7,10,1,35,34,38,53,52,54,51,50,23,22,23,30,1,51,50,19,18,53,48,17,2,117,3,12,190,202,80,100,64,55,43,28,24,15,6,9, + 16,104,17,8,7,137,250,245,36,129,253,253,254,68,84,65,54,63,19,16,38,15,72,2,107,1,45,2,5,107,0,0,0,3,0,156,1,208,8,156, + 4,154,0,7,0,11,0,15,0,0,9,1,39,1,51,1,7,1,37,33,53,41,2,21,33,4,111,254,38,120,2,82,90,2,80,120,254,40,254,141, + 253,70,2,186,2,138,2,188,253,68,3,168,254,40,120,2,82,253,174,120,1,216,72,170,170,0,0,0,0,2,0,156,0,0,8,156,4,154,0,7, + 0,11,0,0,19,33,1,33,21,33,1,33,37,33,21,33,156,2,186,2,228,2,98,253,70,253,28,253,158,5,68,2,188,253,68,4,154,252,16,170, + 3,240,170,170,0,5,0,156,0,0,11,79,6,20,0,4,0,9,0,12,0,15,0,21,0,0,51,17,33,9,2,17,51,9,1,41,1,9,1,33, + 9,3,51,9,1,156,7,169,3,10,252,246,248,235,141,2,118,253,138,4,237,251,230,2,13,253,243,4,26,253,243,2,221,253,138,2,118,142,2,118, + 253,138,6,20,252,246,252,246,5,128,251,20,2,118,2,118,253,243,253,33,2,13,2,223,253,138,253,138,2,116,2,120,0,5,0,156,0,0,8,156, + 6,20,0,3,0,8,0,11,0,14,0,19,0,0,51,17,33,17,1,17,51,9,1,41,1,9,1,33,9,3,51,17,156,8,0,248,148,141,2,118, + 253,138,4,237,251,230,2,13,253,243,4,26,253,243,2,221,253,138,2,118,142,6,20,249,236,5,128,251,20,2,118,2,118,253,243,253,33,2,13,2, + 223,253,138,253,138,4,236,0,0,43,0,120,0,0,11,20,5,213,0,11,0,23,0,35,0,47,0,59,0,71,0,83,0,95,0,107,0,119,0,131, + 0,143,0,155,0,167,0,179,0,191,0,203,0,215,0,227,0,239,0,251,1,7,1,19,1,31,1,43,1,55,1,67,1,79,1,91,1,103,1,115, + 1,127,1,139,1,151,1,163,1,175,1,187,1,199,1,211,1,228,1,240,1,252,2,8,0,0,1,33,50,21,17,20,35,33,34,53,17,52,23,17, + 20,51,33,50,53,17,52,35,33,34,1,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,37,21,20,43,1,34, + 61,1,52,59,1,50,5,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,5,21,20,43,1,34,61,1,52,59, + 1,50,23,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,23,21, + 20,43,1,34,61,1,52,59,1,50,5,21,20,43,1,34,61,1,52,59,1,50,37,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34, + 61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59, + 1,50,23,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,39,21, + 20,43,1,34,61,1,52,59,1,50,7,21,20,43,1,34,61,1,52,59,1,50,7,21,20,43,1,34,61,1,52,59,1,50,7,21,20,43,1,34, + 61,1,52,59,1,50,7,21,20,43,1,34,61,1,52,59,1,50,7,21,20,43,1,34,61,1,52,59,1,50,7,21,20,43,1,34,61,1,52,59, + 1,50,7,21,20,43,1,34,61,1,52,59,1,50,39,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,23,21, + 20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34, + 61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,23,21,20,43,1,34,61,1,52,59, + 1,50,5,21,20,43,1,34,61,1,52,59,1,50,7,50,21,17,20,43,1,34,61,1,52,35,34,61,1,52,51,19,21,20,43,1,34,61,1,52, + 59,1,50,23,21,20,43,1,34,61,1,52,59,1,50,5,34,61,1,52,51,33,50,29,1,20,35,1,85,8,226,221,221,247,30,221,147,74,8,226, + 73,73,247,30,74,1,3,37,74,37,37,74,37,223,37,75,36,36,75,37,1,74,37,74,37,37,74,37,254,70,37,74,37,37,74,37,221,37,74,37, + 37,74,37,1,185,37,74,37,37,74,37,221,37,74,37,37,74,37,221,37,74,37,37,74,37,221,37,74,37,37,74,37,221,37,74,37,37,74,37,1, + 142,37,251,37,37,251,37,248,67,37,74,37,37,74,37,221,37,74,37,37,74,37,221,37,74,37,37,74,37,220,37,74,37,37,74,37,221,37,74,37, + 37,74,37,221,37,74,37,37,74,37,221,37,74,37,37,74,37,221,37,74,37,37,74,37,36,37,74,37,37,74,37,221,37,74,37,37,74,37,221,37, + 74,37,37,74,37,221,37,74,37,37,74,37,220,37,74,37,37,74,37,221,37,74,37,37,74,37,221,37,74,37,37,74,37,221,37,74,37,37,74,37, + 36,37,74,37,37,74,37,221,37,74,37,37,74,37,221,37,74,37,37,74,37,221,37,74,37,37,74,37,220,37,74,37,37,74,37,221,37,74,37,37, + 74,37,221,37,74,37,37,74,37,221,37,74,37,37,74,37,221,37,74,37,37,74,37,1,30,37,139,37,37,139,37,37,37,37,246,42,36,37,37,148, + 37,74,37,37,74,37,223,37,75,36,36,75,37,249,165,37,37,4,4,37,37,5,213,221,251,229,221,221,4,27,221,221,251,229,74,74,4,27,74,252, + 28,73,37,37,73,38,37,74,37,37,74,37,183,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37, + 74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,183,74,37,37,74,37,37,74,37,37,74,37,37,74, + 37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,183,74,37,37,74,37, + 37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37, + 74,37,180,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74, + 37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,37,74,37,219,37,254,222,37,37,149,32,37,73,37,253,72,74,37,37,74,37, + 37,74,37,37,74,37,148,37,74,37,37,74,37,0,0,0,0,5,0,1,0,0,10,180,6,20,0,4,0,9,0,12,0,15,0,21,0,0,41,1, + 9,1,33,7,35,9,1,51,9,2,17,9,1,3,35,9,1,51,1,10,180,248,87,252,246,3,10,7,169,148,141,253,138,2,118,141,250,134,2,13, + 2,13,253,243,253,243,208,142,253,138,2,118,142,2,118,3,10,3,10,148,253,138,253,138,4,236,253,243,2,13,251,20,2,13,253,243,4,236,253,136, + 253,140,2,118,0,5,0,150,255,70,6,102,5,252,0,5,0,11,0,15,0,19,0,23,0,0,9,2,17,9,1,3,17,9,1,17,1,3,55,1, + 7,17,23,1,39,1,51,17,35,1,8,2,118,2,118,253,138,253,138,114,2,232,2,232,253,24,38,57,1,222,57,57,254,34,57,254,34,114,114,1, + 53,254,149,1,107,2,216,1,107,254,149,252,230,3,92,1,173,254,83,252,164,254,83,5,65,99,254,236,99,254,92,99,254,236,99,2,250,253,216,0, + 255,255,0,166,0,0,2,110,4,96,16,6,3,77,0,0,255,255,0,186,254,86,4,164,4,123,16,6,3,85,0,0,255,255,0,135,255,227,6,39, + 4,96,16,6,3,93,0,0,255,255,0,113,255,231,4,228,4,121,16,6,3,69,0,0,0,1,0,26,254,46,5,245,0,208,0,11,0,0,1,33, + 17,33,21,35,17,33,17,35,53,33,1,184,2,160,1,157,245,252,16,246,1,158,254,216,1,248,170,254,8,1,248,170,0,2,0,156,0,0,8,197, + 5,251,0,13,0,17,0,0,1,33,39,55,1,21,1,39,55,33,1,33,53,33,5,53,33,21,5,226,1,203,233,120,1,137,254,119,120,233,254,141, + 253,28,253,70,2,98,2,226,2,188,4,154,233,120,254,119,90,254,119,120,233,252,16,170,170,170,170,0,0,2,0,35,0,0,6,217,5,208,0,5, + 0,11,0,0,37,33,9,1,33,9,3,33,9,1,2,18,2,216,1,108,254,148,253,40,254,148,1,43,254,82,1,173,3,91,1,174,254,83,114,2, + 118,2,118,253,138,253,24,2,232,2,232,253,24,253,24,0,0,1,0,176,253,252,3,80,7,146,0,11,0,0,1,35,53,16,19,18,19,51,0,3, + 2,17,1,115,195,160,186,166,160,254,252,90,127,253,252,234,3,151,1,226,2,48,1,3,253,243,254,134,253,238,252,237,0,1,0,176,253,252,1,115, + 7,137,0,3,0,0,19,51,17,35,176,195,195,7,137,246,115,0,0,0,0,1,0,176,254,20,3,80,7,137,0,11,0,0,1,21,16,19,18,19, + 35,2,3,2,17,53,1,115,127,147,203,160,208,144,160,7,137,234,252,165,254,87,254,20,254,101,1,69,1,238,2,38,3,50,234,0,0,1,0,176, + 253,252,3,80,7,146,0,11,0,0,1,53,16,3,2,1,51,18,19,18,17,21,2,141,127,90,254,252,160,166,186,160,253,252,234,3,19,2,18,1, + 121,2,14,254,253,253,208,254,30,252,105,234,0,1,2,141,253,252,3,80,7,137,0,4,0,0,1,17,35,17,48,3,80,195,7,137,246,115,9,141, + 0,1,0,176,254,20,3,80,7,137,0,11,0,0,1,51,21,16,3,2,3,35,18,19,18,17,2,141,195,160,144,208,160,203,147,127,7,137,234,252, + 205,253,219,254,18,254,187,1,155,1,236,1,169,3,91,0,0,1,0,176,253,252,3,80,7,109,0,5,0,0,1,35,17,33,21,33,1,115,195,2, + 160,254,35,253,252,9,113,195,0,1,0,176,253,252,1,115,7,137,0,3,0,0,19,51,17,35,176,195,195,7,137,246,115,0,0,0,0,1,0,176, + 254,20,3,80,7,137,0,5,0,0,1,17,33,21,33,17,1,115,1,221,253,96,7,137,247,78,195,9,117,0,0,0,0,1,0,176,253,252,3,80, + 7,109,0,5,0,0,1,17,33,53,33,17,2,141,254,35,2,160,253,252,8,174,195,246,143,0,0,0,0,1,2,141,253,252,3,80,7,122,0,3, + 0,0,1,51,17,35,2,141,195,195,7,122,246,130,0,0,0,1,0,176,254,20,3,80,7,122,0,5,0,0,1,51,17,33,53,33,2,141,195,253, + 96,1,221,7,122,246,154,195,0,1,2,163,253,234,5,88,7,109,0,13,0,0,1,35,17,52,55,54,51,33,21,33,34,7,6,21,3,93,186,111, + 121,186,1,19,254,231,101,68,57,253,234,7,117,223,145,158,176,102,87,153,0,1,0,168,253,252,3,93,7,134,0,24,0,0,1,22,23,22,25,1, + 35,17,16,39,38,37,39,53,51,32,55,54,25,1,51,17,16,7,6,2,148,58,42,101,186,110,75,254,251,61,61,1,3,77,110,186,101,40,2,193, + 32,61,147,254,67,253,232,2,12,1,183,95,65,4,1,187,69,99,1,179,2,12,253,232,254,72,152,60,0,1,2,163,254,20,5,88,7,134,0,13, + 0,0,1,17,20,23,22,51,33,21,33,34,39,38,53,17,3,93,57,68,101,1,25,254,237,184,123,111,7,134,248,148,154,86,102,176,158,143,225,7, + 100,0,0,0,0,1,2,163,253,244,3,93,7,140,0,3,0,0,1,35,17,51,3,93,186,186,253,244,9,152,0,0,0,1,0,168,253,234,3,93, + 7,109,0,13,0,0,1,17,52,39,38,35,33,53,33,50,23,22,21,17,2,163,57,68,101,254,231,1,19,186,121,111,253,234,7,125,153,87,102,176, + 158,145,223,248,139,0,0,0,0,1,2,163,253,252,5,88,7,134,0,24,0,0,1,38,39,38,25,1,51,17,16,23,22,33,51,21,7,4,7,6, + 25,1,35,17,16,55,54,3,108,60,40,101,186,110,77,1,3,61,61,254,251,75,110,186,101,42,2,193,33,60,152,1,184,2,24,253,244,254,77,99, + 69,187,1,4,65,95,254,73,253,244,2,24,1,189,147,61,0,1,0,168,254,20,3,93,7,134,0,13,0,0,1,51,17,20,7,6,35,33,53,33, + 50,55,54,53,2,163,186,111,123,184,254,237,1,25,101,68,57,7,134,248,156,225,143,158,176,102,86,154,0,1,1,175,254,0,2,117,7,137,0,3, + 0,0,1,17,51,17,1,175,198,254,0,9,137,246,119,0,0,2,0,55,0,134,6,64,5,213,0,8,0,17,0,0,37,9,1,17,33,17,33,3, + 33,3,53,9,1,53,33,19,33,3,2,51,254,4,1,252,2,55,1,214,1,251,244,100,254,246,1,10,4,12,1,254,242,1,134,1,252,1,252,254, + 239,2,104,251,194,1,114,131,254,246,254,246,131,3,118,253,152,0,0,0,0,2,0,186,0,0,6,213,4,196,0,2,0,6,0,0,1,33,9,1, + 33,17,33,6,213,249,229,3,13,3,14,249,229,6,27,2,160,2,36,251,60,1,248,0,0,4,0,150,255,70,6,102,5,252,0,5,0,11,0,31, + 0,43,0,0,9,2,17,9,1,3,17,9,1,17,1,0,20,23,22,23,22,50,55,54,55,54,52,39,38,39,38,34,7,6,7,2,16,62,1,32, + 30,1,16,14,1,32,38,1,8,2,118,2,118,253,138,253,138,114,2,232,2,232,253,24,254,110,54,54,92,93,218,93,92,54,54,54,54,92,93,218, + 93,92,54,168,138,238,1,24,238,138,138,238,254,232,238,1,53,254,149,1,107,2,216,1,107,254,149,252,230,3,92,1,173,254,83,252,164,254,83,3, + 200,218,93,92,54,54,54,54,92,93,218,93,92,54,54,54,54,92,254,170,1,24,238,138,138,238,254,232,238,138,138,0,255,255,0,6,0,154,6,33, + 3,142,16,6,14,131,0,0,0,3,0,89,254,247,4,207,2,90,0,13,0,25,0,32,0,0,0,34,7,6,21,20,23,22,50,55,54,53,52,47, + 1,50,22,21,20,6,35,34,38,53,52,54,1,17,7,53,55,51,17,3,233,202,50,51,51,50,202,50,51,51,151,161,170,170,161,162,170,170,254,86, + 223,230,137,2,1,86,86,172,173,86,86,86,86,173,172,86,175,222,211,212,222,222,212,211,222,252,172,2,209,41,116,39,252,189,0,0,0,2,255,130, + 255,227,4,164,6,20,0,23,0,31,0,0,1,62,1,51,50,0,16,2,35,34,38,39,21,35,17,5,39,37,53,51,21,37,23,5,0,16,38,32, + 6,16,22,32,1,115,58,177,123,204,0,255,255,204,123,177,58,185,254,233,33,1,56,185,1,35,33,254,188,2,114,167,254,220,167,167,1,36,3,182, + 100,97,254,188,253,240,254,188,97,100,168,4,230,93,99,104,192,131,97,97,109,252,64,1,150,231,231,254,106,231,0,0,0,1,0,146,254,46,4,130, + 0,208,0,7,0,0,1,33,17,51,17,33,17,51,1,58,2,160,168,252,16,168,254,216,1,248,253,94,2,162,0,0,0,3,0,152,255,236,6,148, + 5,232,0,13,0,27,0,38,0,219,186,0,14,0,6,0,3,43,184,0,14,16,186,0,35,0,29,0,3,43,184,0,35,16,186,0,0,0,20,0, + 3,43,184,0,0,16,65,27,0,22,0,14,0,38,0,14,0,54,0,14,0,70,0,14,0,86,0,14,0,102,0,14,0,118,0,14,0,134,0,14, + 0,150,0,14,0,166,0,14,0,182,0,14,0,198,0,14,0,214,0,14,0,13,93,65,5,0,229,0,14,0,245,0,14,0,2,93,65,5,0,234, + 0,20,0,250,0,20,0,2,93,65,27,0,25,0,20,0,41,0,20,0,57,0,20,0,73,0,20,0,89,0,20,0,105,0,20,0,121,0,20,0, + 137,0,20,0,153,0,20,0,169,0,20,0,185,0,20,0,201,0,20,0,217,0,20,0,13,93,0,186,0,17,0,3,0,3,43,184,0,17,16,186, + 0,10,0,24,0,3,43,184,0,10,16,186,0,36,0,37,0,3,43,184,0,36,16,184,0,28,208,48,49,1,16,0,33,32,0,17,52,18,36,51, + 50,4,18,5,16,0,33,32,0,17,52,2,36,35,34,4,2,1,51,17,7,53,37,51,17,51,21,33,6,148,254,63,254,194,254,196,254,63,206,1, + 113,190,193,1,113,205,250,87,1,143,1,28,1,28,1,143,182,254,184,173,173,254,184,182,1,124,217,236,1,1,161,218,253,151,2,234,254,193,254,65, + 1,191,1,63,198,1,114,198,198,254,144,200,254,228,254,112,1,144,1,28,179,1,71,177,177,254,185,253,255,2,126,43,152,47,252,230,142,0,0,0, + 0,3,0,152,255,236,6,148,5,232,0,13,0,27,0,56,1,63,186,0,14,0,6,0,3,43,184,0,14,16,186,0,51,0,38,0,3,43,184,0, + 51,16,186,0,0,0,20,0,3,43,184,0,0,16,65,27,0,22,0,14,0,38,0,14,0,54,0,14,0,70,0,14,0,86,0,14,0,102,0,14, + 0,118,0,14,0,134,0,14,0,150,0,14,0,166,0,14,0,182,0,14,0,198,0,14,0,214,0,14,0,13,93,65,5,0,229,0,14,0,245,0, + 14,0,2,93,65,5,0,234,0,20,0,250,0,20,0,2,93,65,27,0,25,0,20,0,41,0,20,0,57,0,20,0,73,0,20,0,89,0,20,0, + 105,0,20,0,121,0,20,0,137,0,20,0,153,0,20,0,169,0,20,0,185,0,20,0,201,0,20,0,217,0,20,0,13,93,184,0,51,16,184,0, + 29,208,184,0,29,47,65,5,0,234,0,38,0,250,0,38,0,2,93,65,27,0,25,0,38,0,41,0,38,0,57,0,38,0,73,0,38,0,89,0, + 38,0,105,0,38,0,121,0,38,0,137,0,38,0,153,0,38,0,169,0,38,0,185,0,38,0,201,0,38,0,217,0,38,0,13,93,186,0,44,0, + 6,0,0,17,18,57,0,186,0,17,0,3,0,3,43,184,0,17,16,186,0,10,0,24,0,3,43,184,0,10,16,186,0,29,0,30,0,3,43,184, + 0,29,16,186,0,48,0,41,0,3,43,184,0,48,16,48,49,1,16,0,33,32,0,17,52,18,36,51,50,4,18,5,16,0,33,32,0,17,52,2, + 36,35,34,4,2,1,33,21,33,53,54,36,55,62,1,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,6,7,14,1,6,148,254,63,254,194, + 254,196,254,63,206,1,113,190,193,1,113,205,250,87,1,143,1,28,1,28,1,143,182,254,184,173,173,254,184,182,2,79,1,180,253,92,82,1,6,33, + 62,47,95,78,59,132,115,97,145,61,163,197,48,62,17,178,2,234,254,193,254,65,1,191,1,63,198,1,114,198,198,254,144,200,254,228,254,112,1,144, + 1,28,179,1,71,177,177,254,185,253,255,142,129,77,241,34,63,85,40,63,78,38,58,171,36,31,151,125,58,105,70,18,167,0,0,0,0,3,0,152, + 255,236,6,148,5,232,0,13,0,27,0,68,1,181,186,0,14,0,6,0,3,43,184,0,14,16,186,0,66,0,53,0,3,43,184,0,66,16,186,0, + 0,0,20,0,3,43,184,0,0,16,65,27,0,22,0,14,0,38,0,14,0,54,0,14,0,70,0,14,0,86,0,14,0,102,0,14,0,118,0,14, + 0,134,0,14,0,150,0,14,0,166,0,14,0,182,0,14,0,198,0,14,0,214,0,14,0,13,93,65,5,0,229,0,14,0,245,0,14,0,2,93, + 65,5,0,234,0,20,0,250,0,20,0,2,93,65,27,0,25,0,20,0,41,0,20,0,57,0,20,0,73,0,20,0,89,0,20,0,105,0,20,0, + 121,0,20,0,137,0,20,0,153,0,20,0,169,0,20,0,185,0,20,0,201,0,20,0,217,0,20,0,13,93,65,5,0,234,0,53,0,250,0,53, + 0,2,93,65,27,0,25,0,53,0,41,0,53,0,57,0,53,0,73,0,53,0,89,0,53,0,105,0,53,0,121,0,53,0,137,0,53,0,153,0, + 53,0,169,0,53,0,185,0,53,0,201,0,53,0,217,0,53,0,13,93,186,0,28,0,53,0,66,17,18,57,186,0,44,0,53,0,66,17,18,57, + 184,0,44,47,65,5,0,234,0,44,0,250,0,44,0,2,93,65,27,0,25,0,44,0,41,0,44,0,57,0,44,0,73,0,44,0,89,0,44,0, + 105,0,44,0,121,0,44,0,137,0,44,0,153,0,44,0,169,0,44,0,185,0,44,0,201,0,44,0,217,0,44,0,13,93,184,0,31,220,186,0, + 38,0,6,0,0,17,18,57,186,0,59,0,6,0,0,17,18,57,0,186,0,17,0,3,0,3,43,184,0,17,16,186,0,10,0,24,0,3,43,184, + 0,10,16,186,0,41,0,34,0,3,43,184,0,41,16,186,0,63,0,56,0,3,43,184,0,63,16,186,0,50,0,47,0,3,43,184,0,50,16,186, + 0,28,0,47,0,50,17,18,57,48,49,1,16,0,33,32,0,17,52,18,36,51,50,4,18,5,16,0,33,32,0,17,52,2,36,35,34,4,2,5, + 30,1,21,20,6,35,34,38,39,53,30,1,51,50,54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,6, + 6,148,254,63,254,194,254,196,254,63,206,1,113,190,193,1,113,205,250,87,1,143,1,28,1,28,1,143,182,254,184,173,173,254,184,182,3,185,13,118, + 216,195,64,136,88,91,125,68,117,115,107,99,140,145,90,88,92,91,52,121,107,95,136,61,161,193,104,2,234,254,193,254,65,1,191,1,63,198,1,114, + 198,198,254,144,200,254,228,254,112,1,144,1,28,179,1,71,177,177,254,185,150,3,129,93,141,156,23,27,168,48,28,79,76,71,78,140,60,58,60,63, + 21,32,151,24,20,137,115,81,114,0,0,0,0,4,0,152,255,236,6,148,5,232,0,13,0,27,0,30,0,41,0,243,186,0,14,0,6,0,3,43, + 184,0,14,16,186,0,32,0,28,0,3,43,184,0,32,16,186,0,0,0,20,0,3,43,184,0,0,16,65,27,0,22,0,14,0,38,0,14,0,54, + 0,14,0,70,0,14,0,86,0,14,0,102,0,14,0,118,0,14,0,134,0,14,0,150,0,14,0,166,0,14,0,182,0,14,0,198,0,14,0,214, + 0,14,0,13,93,65,5,0,229,0,14,0,245,0,14,0,2,93,65,5,0,234,0,20,0,250,0,20,0,2,93,65,27,0,25,0,20,0,41,0, + 20,0,57,0,20,0,73,0,20,0,89,0,20,0,105,0,20,0,121,0,20,0,137,0,20,0,153,0,20,0,169,0,20,0,185,0,20,0,201,0, + 20,0,217,0,20,0,13,93,184,0,32,16,184,0,36,208,184,0,28,16,184,0,38,208,0,186,0,17,0,3,0,3,43,184,0,17,16,186,0,10, + 0,24,0,3,43,184,0,10,16,186,0,34,0,35,0,3,43,184,0,34,16,184,0,29,208,184,0,35,16,184,0,39,208,48,49,1,16,0,33,32, + 0,17,52,18,36,51,50,4,18,5,16,0,33,32,0,17,52,2,36,35,34,4,2,37,1,33,3,51,17,51,21,35,21,35,53,33,53,6,148,254, + 63,254,194,254,196,254,63,206,1,113,190,193,1,113,205,250,87,1,143,1,28,1,28,1,143,182,254,184,173,173,254,184,182,2,191,254,243,1,13,24, + 206,141,141,182,254,67,2,234,254,193,254,65,1,191,1,63,198,1,114,198,198,254,144,200,254,228,254,112,1,144,1,28,179,1,71,177,177,254,185,79, + 254,130,2,72,253,184,141,211,211,142,0,0,0,3,0,152,255,236,6,148,5,232,0,13,0,27,0,57,1,75,186,0,14,0,6,0,3,43,184,0, + 14,16,186,0,31,0,28,0,3,43,184,0,31,16,186,0,38,0,51,0,3,43,184,0,38,16,186,0,0,0,20,0,3,43,184,0,0,16,65,27, + 0,22,0,14,0,38,0,14,0,54,0,14,0,70,0,14,0,86,0,14,0,102,0,14,0,118,0,14,0,134,0,14,0,150,0,14,0,166,0,14, + 0,182,0,14,0,198,0,14,0,214,0,14,0,13,93,65,5,0,229,0,14,0,245,0,14,0,2,93,65,5,0,234,0,20,0,250,0,20,0,2, + 93,65,27,0,25,0,20,0,41,0,20,0,57,0,20,0,73,0,20,0,89,0,20,0,105,0,20,0,121,0,20,0,137,0,20,0,153,0,20,0, + 169,0,20,0,185,0,20,0,201,0,20,0,217,0,20,0,13,93,186,0,45,0,6,0,0,17,18,57,65,5,0,234,0,51,0,250,0,51,0,2, + 93,65,27,0,25,0,51,0,41,0,51,0,57,0,51,0,73,0,51,0,89,0,51,0,105,0,51,0,121,0,51,0,137,0,51,0,153,0,51,0, + 169,0,51,0,185,0,51,0,201,0,51,0,217,0,51,0,13,93,0,186,0,17,0,3,0,3,43,184,0,17,16,186,0,10,0,24,0,3,43,184, + 0,10,16,186,0,48,0,41,0,3,43,184,0,48,16,186,0,29,0,30,0,3,43,184,0,29,16,186,0,35,0,54,0,3,43,184,0,35,16,48, + 49,1,16,0,33,32,0,17,52,18,36,51,50,4,18,5,16,0,33,32,0,17,52,2,36,35,34,4,2,1,33,21,33,21,6,54,51,50,22,21, + 20,6,35,34,38,39,53,30,1,51,50,54,53,52,38,35,34,6,7,6,148,254,63,254,194,254,196,254,63,206,1,113,190,193,1,113,205,250,87,1, + 143,1,28,1,28,1,143,182,254,184,173,173,254,184,182,1,152,2,61,254,111,3,63,31,176,207,213,190,64,133,88,95,119,68,104,118,118,104,50,101, + 89,2,234,254,193,254,65,1,191,1,63,198,1,114,198,198,254,144,200,254,228,254,112,1,144,1,28,179,1,71,177,177,254,185,1,25,142,171,1,10, + 176,149,152,172,20,24,172,47,27,97,85,86,97,20,37,0,0,4,0,152,255,236,6,148,5,232,0,13,0,27,0,39,0,64,1,145,186,0,14,0, + 6,0,3,43,184,0,14,16,186,0,31,0,59,0,3,43,184,0,31,16,186,0,53,0,37,0,3,43,184,0,53,16,186,0,0,0,20,0,3,43, + 184,0,0,16,65,27,0,22,0,14,0,38,0,14,0,54,0,14,0,70,0,14,0,86,0,14,0,102,0,14,0,118,0,14,0,134,0,14,0,150, + 0,14,0,166,0,14,0,182,0,14,0,198,0,14,0,214,0,14,0,13,93,65,5,0,229,0,14,0,245,0,14,0,2,93,65,5,0,234,0,20, + 0,250,0,20,0,2,93,65,27,0,25,0,20,0,41,0,20,0,57,0,20,0,73,0,20,0,89,0,20,0,105,0,20,0,121,0,20,0,137,0, + 20,0,153,0,20,0,169,0,20,0,185,0,20,0,201,0,20,0,217,0,20,0,13,93,65,27,0,22,0,31,0,38,0,31,0,54,0,31,0,70, + 0,31,0,86,0,31,0,102,0,31,0,118,0,31,0,134,0,31,0,150,0,31,0,166,0,31,0,182,0,31,0,198,0,31,0,214,0,31,0,13, + 93,65,5,0,229,0,31,0,245,0,31,0,2,93,65,5,0,234,0,37,0,250,0,37,0,2,93,65,27,0,25,0,37,0,41,0,37,0,57,0, + 37,0,73,0,37,0,89,0,37,0,105,0,37,0,121,0,37,0,137,0,37,0,153,0,37,0,169,0,37,0,185,0,37,0,201,0,37,0,217,0, + 37,0,13,93,186,0,41,0,37,0,53,17,18,57,0,186,0,17,0,3,0,3,43,184,0,17,16,186,0,10,0,24,0,3,43,184,0,10,16,186, + 0,34,0,56,0,3,43,184,0,34,16,186,0,62,0,44,0,3,43,184,0,62,16,186,0,50,0,28,0,3,43,184,0,50,16,48,49,1,16,0, + 33,32,0,17,52,18,36,51,50,4,18,5,16,0,33,32,0,17,52,2,36,35,34,4,2,5,34,6,21,20,22,51,50,54,53,52,38,19,21,46, + 1,35,34,6,7,6,54,51,50,22,21,20,6,35,34,38,53,52,18,51,50,22,6,148,254,63,254,194,254,196,254,63,206,1,113,190,193,1,113,205, + 250,87,1,143,1,28,1,28,1,143,182,254,184,173,173,254,184,182,2,161,78,92,92,78,78,92,92,212,84,97,47,119,127,5,9,128,78,160,186,194, + 160,185,192,234,200,53,106,2,234,254,193,254,65,1,191,1,63,198,1,114,198,198,254,144,200,254,228,254,112,1,144,1,28,179,1,71,177,177,254,185, + 159,98,91,90,98,98,90,91,98,1,157,156,35,22,148,80,11,61,177,148,145,179,253,231,218,1,11,19,0,3,0,152,255,236,6,148,5,232,0,13, + 0,27,0,34,0,235,184,0,35,47,184,0,36,47,184,0,0,220,184,0,35,16,184,0,6,208,184,0,6,47,184,0,14,220,65,27,0,22,0,14, + 0,38,0,14,0,54,0,14,0,70,0,14,0,86,0,14,0,102,0,14,0,118,0,14,0,134,0,14,0,150,0,14,0,166,0,14,0,182,0,14, + 0,198,0,14,0,214,0,14,0,13,93,65,5,0,229,0,14,0,245,0,14,0,2,93,184,0,0,16,184,0,20,220,65,5,0,234,0,20,0,250, + 0,20,0,2,93,65,27,0,25,0,20,0,41,0,20,0,57,0,20,0,73,0,20,0,89,0,20,0,105,0,20,0,121,0,20,0,137,0,20,0, + 153,0,20,0,169,0,20,0,185,0,20,0,201,0,20,0,217,0,20,0,13,93,186,0,32,0,6,0,0,17,18,57,186,0,33,0,6,0,0,17, + 18,57,0,186,0,17,0,3,0,3,43,184,0,17,16,186,0,10,0,24,0,3,43,184,0,10,16,186,0,29,0,33,0,3,43,184,0,29,16,48, + 49,1,16,0,33,32,0,17,52,18,36,51,50,4,18,5,16,0,33,32,0,17,52,2,36,35,34,4,2,1,33,21,1,35,1,33,6,148,254,63, + 254,194,254,196,254,63,206,1,113,190,193,1,113,205,250,87,1,143,1,28,1,28,1,143,182,254,184,173,173,254,184,182,1,107,2,171,254,148,193,1, + 81,254,49,2,234,254,193,254,65,1,191,1,63,198,1,114,198,198,254,144,200,254,228,254,112,1,144,1,28,179,1,71,177,177,254,185,1,25,75,252, + 163,3,26,0,0,5,0,152,255,236,6,148,5,232,0,13,0,27,0,39,0,63,0,75,2,13,186,0,14,0,6,0,3,43,184,0,14,16,186,0, + 31,0,61,0,3,43,184,0,31,16,186,0,49,0,70,0,3,43,184,0,49,16,186,0,0,0,20,0,3,43,184,0,0,16,65,27,0,22,0,14, + 0,38,0,14,0,54,0,14,0,70,0,14,0,86,0,14,0,102,0,14,0,118,0,14,0,134,0,14,0,150,0,14,0,166,0,14,0,182,0,14, + 0,198,0,14,0,214,0,14,0,13,93,65,5,0,229,0,14,0,245,0,14,0,2,93,65,5,0,234,0,20,0,250,0,20,0,2,93,65,27,0, + 25,0,20,0,41,0,20,0,57,0,20,0,73,0,20,0,89,0,20,0,105,0,20,0,121,0,20,0,137,0,20,0,153,0,20,0,169,0,20,0, + 185,0,20,0,201,0,20,0,217,0,20,0,13,93,65,27,0,22,0,31,0,38,0,31,0,54,0,31,0,70,0,31,0,86,0,31,0,102,0,31, + 0,118,0,31,0,134,0,31,0,150,0,31,0,166,0,31,0,182,0,31,0,198,0,31,0,214,0,31,0,13,93,65,5,0,229,0,31,0,245,0, + 31,0,2,93,65,5,0,234,0,70,0,250,0,70,0,2,93,65,27,0,25,0,70,0,41,0,70,0,57,0,70,0,73,0,70,0,89,0,70,0, + 105,0,70,0,121,0,70,0,137,0,70,0,153,0,70,0,169,0,70,0,185,0,70,0,201,0,70,0,217,0,70,0,13,93,186,0,37,0,70,0, + 49,17,18,57,184,0,37,47,65,5,0,234,0,37,0,250,0,37,0,2,93,65,27,0,25,0,37,0,41,0,37,0,57,0,37,0,73,0,37,0, + 89,0,37,0,105,0,37,0,121,0,37,0,137,0,37,0,153,0,37,0,169,0,37,0,185,0,37,0,201,0,37,0,217,0,37,0,13,93,186,0, + 43,0,61,0,31,17,18,57,184,0,43,47,186,0,52,0,70,0,49,17,18,57,184,0,37,16,184,0,55,220,184,0,43,16,184,0,64,220,0,186, + 0,17,0,3,0,3,43,184,0,17,16,186,0,10,0,24,0,3,43,184,0,10,16,186,0,34,0,58,0,3,43,184,0,34,16,186,0,46,0,73, + 0,3,43,184,0,46,16,186,0,67,0,28,0,3,43,184,0,67,16,186,0,52,0,28,0,67,17,18,57,48,49,1,16,0,33,32,0,17,52,18, + 36,51,50,4,18,5,16,0,33,32,0,17,52,2,36,35,34,4,2,5,34,6,21,20,22,51,50,54,53,52,38,37,46,1,53,52,54,51,50,22, + 21,20,6,7,30,1,21,20,6,35,34,38,53,52,54,55,20,22,51,50,54,53,52,38,35,34,6,6,148,254,63,254,194,254,196,254,63,206,1,113, + 190,193,1,113,205,250,87,1,143,1,28,1,28,1,143,182,254,184,173,173,254,184,182,2,175,84,95,95,84,84,95,95,254,198,4,106,183,157,157,182, + 105,4,15,118,190,173,173,190,118,87,81,77,75,82,82,75,77,81,2,234,254,193,254,65,1,191,1,63,198,1,114,198,198,254,144,200,254,228,254,112, + 1,144,1,28,179,1,71,177,177,254,185,230,80,73,73,80,81,72,73,80,73,1,118,83,116,136,136,116,83,118,1,3,131,92,138,151,151,138,92,131, + 193,61,66,66,61,62,66,66,0,4,0,152,255,236,6,148,5,232,0,13,0,27,0,52,0,64,1,145,186,0,14,0,6,0,3,43,184,0,14,16, + 186,0,62,0,41,0,3,43,184,0,62,16,186,0,0,0,20,0,3,43,184,0,0,16,186,0,47,0,56,0,3,43,184,0,47,16,65,27,0,22, + 0,14,0,38,0,14,0,54,0,14,0,70,0,14,0,86,0,14,0,102,0,14,0,118,0,14,0,134,0,14,0,150,0,14,0,166,0,14,0,182, + 0,14,0,198,0,14,0,214,0,14,0,13,93,65,5,0,229,0,14,0,245,0,14,0,2,93,65,5,0,234,0,20,0,250,0,20,0,2,93,65, + 27,0,25,0,20,0,41,0,20,0,57,0,20,0,73,0,20,0,89,0,20,0,105,0,20,0,121,0,20,0,137,0,20,0,153,0,20,0,169,0, + 20,0,185,0,20,0,201,0,20,0,217,0,20,0,13,93,65,27,0,22,0,62,0,38,0,62,0,54,0,62,0,70,0,62,0,86,0,62,0,102, + 0,62,0,118,0,62,0,134,0,62,0,150,0,62,0,166,0,62,0,182,0,62,0,198,0,62,0,214,0,62,0,13,93,65,5,0,229,0,62,0, + 245,0,62,0,2,93,186,0,29,0,41,0,62,17,18,57,65,5,0,234,0,56,0,250,0,56,0,2,93,65,27,0,25,0,56,0,41,0,56,0, + 57,0,56,0,73,0,56,0,89,0,56,0,105,0,56,0,121,0,56,0,137,0,56,0,153,0,56,0,169,0,56,0,185,0,56,0,201,0,56,0, + 217,0,56,0,13,93,0,186,0,17,0,3,0,3,43,184,0,17,16,186,0,10,0,24,0,3,43,184,0,10,16,186,0,32,0,50,0,3,43,184, + 0,32,16,186,0,44,0,59,0,3,43,184,0,44,16,186,0,53,0,38,0,3,43,184,0,53,16,48,49,1,16,0,33,32,0,17,52,18,36,51, + 50,4,18,5,16,0,33,32,0,17,52,2,36,35,34,4,2,1,53,30,1,51,50,54,55,54,6,35,34,38,53,52,54,51,50,22,21,20,2,35, + 34,38,19,50,54,53,52,38,35,34,6,21,20,22,6,148,254,63,254,194,254,196,254,63,206,1,113,190,193,1,113,205,250,87,1,143,1,28,1,28, + 1,143,182,254,184,173,173,254,184,182,1,144,85,97,46,119,127,5,10,128,79,159,186,194,160,185,191,233,200,53,107,217,78,91,91,78,78,92,92,2, + 234,254,193,254,65,1,191,1,63,198,1,114,198,198,254,144,200,254,228,254,112,1,144,1,28,179,1,71,177,177,254,185,253,139,156,36,21,147,79,13, + 60,175,148,145,180,253,232,218,254,246,19,1,180,98,91,91,98,98,91,91,98,0,0,0,0,5,0,152,255,236,6,148,5,232,0,13,0,27,0,38, + 0,50,0,62,1,155,186,0,14,0,6,0,3,43,184,0,14,16,186,0,35,0,29,0,3,43,184,0,35,16,186,0,42,0,60,0,3,43,184,0, + 42,16,186,0,54,0,48,0,3,43,184,0,54,16,186,0,0,0,20,0,3,43,184,0,0,16,65,27,0,22,0,14,0,38,0,14,0,54,0,14, + 0,70,0,14,0,86,0,14,0,102,0,14,0,118,0,14,0,134,0,14,0,150,0,14,0,166,0,14,0,182,0,14,0,198,0,14,0,214,0,14, + 0,13,93,65,5,0,229,0,14,0,245,0,14,0,2,93,65,5,0,234,0,20,0,250,0,20,0,2,93,65,27,0,25,0,20,0,41,0,20,0, + 57,0,20,0,73,0,20,0,89,0,20,0,105,0,20,0,121,0,20,0,137,0,20,0,153,0,20,0,169,0,20,0,185,0,20,0,201,0,20,0, + 217,0,20,0,13,93,65,5,0,234,0,48,0,250,0,48,0,2,93,65,27,0,25,0,48,0,41,0,48,0,57,0,48,0,73,0,48,0,89,0, + 48,0,105,0,48,0,121,0,48,0,137,0,48,0,153,0,48,0,169,0,48,0,185,0,48,0,201,0,48,0,217,0,48,0,13,93,65,5,0,234, + 0,60,0,250,0,60,0,2,93,65,27,0,25,0,60,0,41,0,60,0,57,0,60,0,73,0,60,0,89,0,60,0,105,0,60,0,121,0,60,0, + 137,0,60,0,153,0,60,0,169,0,60,0,185,0,60,0,201,0,60,0,217,0,60,0,13,93,0,186,0,17,0,3,0,3,43,184,0,17,16,186, + 0,10,0,24,0,3,43,184,0,10,16,186,0,45,0,57,0,3,43,184,0,45,16,186,0,36,0,37,0,3,43,184,0,36,16,186,0,51,0,39, + 0,3,43,184,0,51,16,184,0,36,16,184,0,28,208,48,49,1,16,0,33,32,0,17,52,18,36,51,50,4,18,5,16,0,33,32,0,17,52,2, + 36,35,34,4,2,19,51,17,7,53,55,51,17,51,21,33,1,34,6,21,20,22,51,50,54,53,52,38,39,50,22,21,20,6,35,34,38,53,52,54, + 6,148,254,63,254,194,254,196,254,63,206,1,113,190,193,1,113,205,250,87,1,143,1,28,1,28,1,143,182,254,184,173,173,254,184,182,205,158,172,188, + 117,159,254,62,3,4,64,69,69,64,63,70,70,63,130,136,136,130,131,136,136,2,234,254,193,254,65,1,191,1,63,198,1,114,198,198,254,144,200,254, + 228,254,112,1,144,1,28,179,1,71,177,177,254,185,254,62,2,62,39,137,42,253,54,128,2,222,151,163,162,151,151,162,163,151,123,228,209,208,228,228, + 208,209,228,0,0,1,255,236,1,240,4,229,2,156,0,3,0,0,3,53,33,21,20,4,249,1,240,172,172,0,0,0,0,1,255,236,1,154,4,229, + 2,242,0,3,0,0,3,17,33,17,20,4,249,1,154,1,88,254,168,0,0,1,2,24,253,150,2,184,7,200,0,3,0,0,1,17,51,17,2,24, + 160,253,150,10,50,245,206,0,0,1,1,200,253,150,3,8,7,200,0,3,0,0,1,17,33,17,1,200,1,64,253,150,10,50,245,206,0,3,255,236, + 1,240,4,229,2,156,0,3,0,7,0,11,0,0,1,53,33,21,33,53,33,21,33,53,33,21,3,177,1,52,252,239,1,41,252,239,1,52,1,240, + 172,172,172,172,172,172,0,0,0,3,255,236,1,154,4,229,2,242,0,3,0,7,0,11,0,0,1,17,33,17,33,17,33,17,33,17,33,17,3,177, + 1,52,252,239,1,41,252,239,1,52,1,154,1,88,254,168,1,88,254,168,1,88,254,168,0,3,2,24,253,150,2,184,7,200,0,3,0,7,0,11, + 0,0,1,17,51,17,3,17,51,17,3,17,51,17,2,24,160,160,160,160,160,253,150,3,12,252,244,3,192,2,178,253,78,3,102,3,12,252,244,0, + 0,3,1,200,253,150,3,8,7,200,0,3,0,7,0,11,0,0,1,17,33,17,1,17,33,17,1,17,33,17,1,200,1,64,254,192,1,64,254,192, + 1,64,253,150,3,12,252,244,3,192,2,178,253,78,3,102,3,12,252,244,0,4,255,235,1,240,4,229,2,156,0,3,0,7,0,11,0,15,0,0, + 3,53,51,21,51,53,51,21,51,53,51,21,51,53,51,21,21,188,180,179,180,178,180,189,1,240,172,172,172,172,172,172,172,172,0,0,0,4,255,236, + 1,154,4,230,2,242,0,3,0,7,0,11,0,15,0,0,3,17,51,17,51,17,51,17,51,17,51,17,51,17,51,17,20,188,180,179,180,178,180,189, + 1,154,1,88,254,168,1,88,254,168,1,88,254,168,1,88,254,168,0,0,0,4,2,24,253,150,2,184,7,200,0,3,0,7,0,11,0,15,0,0, + 1,17,51,17,3,17,51,17,3,17,51,17,3,17,51,17,2,24,160,160,160,160,160,160,160,5,150,2,50,253,206,248,0,2,50,253,206,5,115,1, + 217,254,39,253,115,1,217,254,39,0,0,0,0,4,1,200,253,150,3,8,7,200,0,3,0,7,0,11,0,15,0,0,1,17,33,17,1,17,33,17, + 1,17,33,17,1,17,33,17,1,200,1,64,254,192,1,64,254,192,1,64,254,192,1,64,5,150,2,50,253,206,248,0,2,50,253,206,5,115,1,217, + 254,39,253,115,1,217,254,39,0,1,2,24,253,150,4,229,2,156,0,5,0,0,1,17,33,21,33,17,2,24,2,205,253,211,253,150,5,6,172,251, + 166,0,0,0,0,1,2,24,253,150,4,229,2,242,0,5,0,0,1,17,33,17,33,17,2,24,2,205,253,211,253,150,5,92,254,168,251,252,0,0, + 0,1,1,200,253,150,4,229,2,156,0,5,0,0,1,17,33,21,33,17,1,200,3,29,254,35,253,150,5,6,172,251,166,0,0,0,0,1,1,200, + 253,150,4,229,2,242,0,5,0,0,1,17,33,17,33,17,1,200,3,29,254,35,253,150,5,92,254,168,251,252,0,0,0,1,255,236,253,150,2,184, + 2,156,0,5,0,0,1,17,33,53,33,17,2,24,253,212,2,204,253,150,4,90,172,250,250,0,0,0,0,1,255,236,253,150,2,184,2,242,0,5, + 0,0,1,17,33,17,33,17,2,24,253,212,2,204,253,150,4,4,1,88,250,164,0,0,0,1,255,236,253,150,3,8,2,156,0,5,0,0,1,17, + 33,53,33,17,1,200,254,36,3,28,253,150,4,90,172,250,250,0,0,0,0,1,255,236,253,150,3,8,2,242,0,5,0,0,1,17,33,17,33,17, + 1,200,254,36,3,28,253,150,4,4,1,88,250,164,0,0,0,1,2,24,1,240,4,229,7,200,0,5,0,0,1,17,51,17,33,21,2,24,160,2, + 45,1,240,5,216,250,212,172,0,1,2,24,1,154,4,229,7,200,0,5,0,0,1,17,51,17,33,17,2,24,160,2,45,1,154,6,46,251,42,254, + 168,0,0,0,0,1,1,200,1,240,4,229,7,200,0,5,0,0,1,17,33,17,33,21,1,200,1,64,1,221,1,240,5,216,250,212,172,0,0,0, + 0,1,1,200,1,154,4,229,7,200,0,5,0,0,1,17,33,17,33,17,1,200,1,64,1,221,1,154,6,46,251,42,254,168,0,0,0,1,255,236, + 1,240,2,184,7,200,0,5,0,0,3,53,33,17,51,17,20,2,44,160,1,240,172,5,44,250,40,0,0,1,255,236,1,154,2,184,7,200,0,5, + 0,0,3,17,33,17,51,17,20,2,44,160,1,154,1,88,4,214,249,210,0,1,255,236,1,240,3,8,7,200,0,5,0,0,3,53,33,17,33,17, + 20,1,220,1,64,1,240,172,5,44,250,40,0,1,255,236,1,154,3,8,7,200,0,5,0,0,3,17,33,17,33,17,20,1,220,1,64,1,154,1, + 88,4,214,249,210,0,0,0,0,1,2,24,253,150,4,229,7,200,0,7,0,0,1,17,51,17,33,21,33,17,2,24,160,2,45,253,211,253,150,10, + 50,250,212,172,251,166,0,0,0,1,2,24,253,150,4,229,7,200,0,7,0,0,1,17,51,17,33,17,33,17,2,24,160,2,45,253,211,253,150,10, + 50,251,42,254,168,251,252,0,0,1,1,200,253,150,4,229,7,200,0,9,0,0,1,17,35,17,33,17,33,21,33,17,2,24,80,1,64,1,221,253, + 211,253,150,4,90,5,216,250,212,172,251,166,0,1,1,200,253,150,4,229,7,200,0,9,0,0,1,17,51,17,51,17,33,21,33,17,1,200,80,160, + 2,45,254,35,253,150,5,6,5,44,250,212,172,251,166,0,0,1,1,200,253,150,4,229,7,200,0,7,0,0,1,17,33,17,33,21,33,17,1,200, + 1,64,1,221,254,35,253,150,10,50,250,212,172,251,166,0,0,1,1,200,253,150,4,229,7,200,0,9,0,0,1,17,35,17,33,17,33,17,33,17, + 2,24,80,1,64,1,221,253,211,253,150,4,4,6,46,251,42,254,168,251,252,0,0,0,0,1,1,200,253,150,4,229,7,200,0,9,0,0,1,17, + 51,17,51,17,33,17,33,17,1,200,80,160,2,45,254,35,253,150,5,92,4,214,251,42,254,168,251,252,0,1,1,200,253,150,4,229,7,200,0,7, + 0,0,1,17,33,17,33,17,33,17,1,200,1,64,1,221,254,35,253,150,10,50,251,42,254,168,251,252,0,1,255,236,253,150,2,184,7,200,0,7, + 0,0,1,17,33,53,33,17,51,17,2,24,253,212,2,44,160,253,150,4,90,172,5,44,245,206,0,0,0,1,255,236,253,150,2,184,7,200,0,7, + 0,0,1,17,33,17,33,17,51,17,2,24,253,212,2,44,160,253,150,4,4,1,88,4,214,245,206,0,0,1,255,236,253,150,3,8,7,200,0,9, + 0,0,1,17,33,53,33,17,33,17,35,17,2,24,253,212,1,220,1,64,80,253,150,4,90,172,5,44,250,40,251,166,0,1,255,236,253,150,3,8, + 7,200,0,9,0,0,1,17,33,53,33,17,51,17,51,17,1,200,254,36,2,44,160,80,253,150,4,90,172,5,44,250,212,250,250,0,0,1,255,236, + 253,150,3,8,7,200,0,7,0,0,1,17,33,53,33,17,33,17,1,200,254,36,1,220,1,64,253,150,4,90,172,5,44,245,206,0,0,1,255,236, + 253,150,3,8,7,200,0,9,0,0,1,17,33,17,33,17,33,17,35,17,2,24,253,212,1,220,1,64,80,253,150,4,4,1,88,4,214,249,210,251, + 252,0,0,0,0,1,255,236,253,150,3,8,7,200,0,9,0,0,1,17,33,17,33,17,51,17,51,17,1,200,254,36,2,44,160,80,253,150,4,4, + 1,88,4,214,251,42,250,164,0,1,255,236,253,150,3,8,7,200,0,7,0,0,1,17,33,17,33,17,33,17,1,200,254,36,1,220,1,64,253,150, + 4,4,1,88,4,214,245,206,0,1,255,236,253,150,4,229,2,156,0,7,0,0,1,17,33,53,33,21,33,17,2,24,253,212,4,249,253,211,253,150, + 4,90,172,172,251,166,0,0,0,1,255,236,253,150,4,229,2,242,0,9,0,0,1,17,33,17,33,21,33,21,33,17,2,24,253,212,2,204,2,45, + 253,211,253,150,4,4,1,88,86,172,251,166,0,1,255,236,253,150,4,229,2,242,0,9,0,0,1,17,33,53,33,53,33,17,33,17,2,24,253,212, + 2,44,2,205,253,211,253,150,4,90,172,86,254,168,251,252,0,1,255,236,253,150,4,229,2,242,0,7,0,0,1,17,33,17,33,17,33,17,2,24, + 253,212,4,249,253,211,253,150,4,4,1,88,254,168,251,252,0,1,255,236,253,150,4,229,2,156,0,7,0,0,1,17,33,53,33,21,33,17,1,200, + 254,36,4,249,254,35,253,150,4,90,172,172,251,166,0,0,0,1,255,236,253,150,4,229,2,242,0,9,0,0,1,17,33,17,33,21,33,21,33,17, + 1,200,254,36,3,28,1,221,254,35,253,150,4,4,1,88,86,172,251,166,0,1,255,236,253,150,4,229,2,242,0,9,0,0,1,17,33,53,33,53, + 33,17,33,17,1,200,254,36,1,220,3,29,254,35,253,150,4,90,172,86,254,168,251,252,0,1,255,236,253,150,4,229,2,242,0,7,0,0,1,17, + 33,17,33,17,33,17,1,200,254,36,4,249,254,35,253,150,4,4,1,88,254,168,251,252,0,1,255,236,1,240,4,229,7,200,0,7,0,0,3,53, + 33,17,51,17,33,21,20,2,44,160,2,45,1,240,172,5,44,250,212,172,0,1,255,236,1,154,4,229,7,200,0,9,0,0,3,17,33,17,51,17, + 33,21,33,21,20,2,44,160,2,45,253,211,1,154,1,88,4,214,250,212,172,86,0,0,0,1,255,236,1,154,4,229,7,200,0,9,0,0,3,53, + 33,17,51,17,33,17,33,53,20,2,44,160,2,45,253,51,1,240,172,5,44,251,42,254,168,86,0,0,0,1,255,236,1,154,4,229,7,200,0,7, + 0,0,3,17,33,17,51,17,33,17,20,2,44,160,2,45,1,154,1,88,4,214,251,42,254,168,0,0,0,1,255,236,1,240,4,229,7,200,0,7, + 0,0,3,53,33,17,33,17,33,21,20,1,220,1,64,1,221,1,240,172,5,44,250,212,172,0,0,0,0,1,255,236,1,154,4,229,7,200,0,9, + 0,0,3,17,33,17,33,17,33,21,33,21,20,1,220,1,64,1,221,254,35,1,154,1,88,4,214,250,212,172,86,0,0,1,255,236,1,154,4,229, + 7,200,0,9,0,0,3,53,33,17,33,17,33,17,33,53,20,1,220,1,64,1,221,252,227,1,240,172,5,44,251,42,254,168,86,0,0,1,255,236, + 1,154,4,229,7,200,0,7,0,0,3,17,33,17,33,17,33,17,20,1,220,1,64,1,221,1,154,1,88,4,214,251,42,254,168,0,0,1,255,236, + 253,150,4,229,7,200,0,11,0,0,1,17,35,17,33,53,33,17,51,17,33,21,2,184,160,253,212,2,44,160,2,45,1,240,251,166,4,90,172,5, + 44,250,212,172,0,1,255,236,253,150,4,229,7,200,0,11,0,0,1,17,33,17,33,17,51,17,33,21,33,17,2,24,253,212,2,44,160,2,45,253, + 211,253,150,4,4,1,88,4,214,250,212,172,251,166,0,0,0,1,255,236,253,150,4,229,7,200,0,11,0,0,1,17,33,53,33,17,51,17,33,17, + 33,17,2,24,253,212,2,44,160,2,45,253,211,253,150,4,90,172,5,44,251,42,254,168,251,252,0,0,0,1,255,236,253,150,4,229,7,200,0,11, + 0,0,1,17,33,17,33,17,51,17,33,17,33,17,2,24,253,212,2,44,160,2,45,253,211,253,150,4,4,1,88,4,214,251,42,254,168,251,252,0, + 0,1,255,236,253,150,4,229,7,200,0,11,0,0,1,17,33,53,33,17,33,17,33,21,33,17,2,24,253,212,1,220,1,64,1,221,253,211,253,150, + 4,90,172,5,44,250,212,172,251,166,0,0,0,1,255,236,253,150,4,229,7,200,0,11,0,0,1,17,33,53,33,17,51,17,33,21,33,17,1,200, + 254,36,2,44,160,2,45,254,35,253,150,4,90,172,5,44,250,212,172,251,166,0,0,0,0,1,255,236,253,150,4,229,7,200,0,11,0,0,1,17, + 33,53,33,17,33,17,33,21,33,17,1,200,254,36,1,220,1,64,1,221,254,35,253,150,4,90,172,5,44,250,212,172,251,166,0,0,0,1,255,236, + 253,150,4,229,7,200,0,13,0,0,1,17,33,17,33,17,33,17,33,21,33,21,35,17,2,24,253,212,1,220,1,64,1,221,254,35,80,253,150,4, + 4,1,88,4,214,250,212,172,86,251,252,0,0,1,255,236,253,150,4,229,7,200,0,13,0,0,1,17,35,53,33,53,33,17,33,17,33,17,33,17, + 2,24,80,254,36,1,220,1,64,1,221,253,211,253,150,4,4,86,172,5,44,251,42,254,168,251,252,0,0,1,255,236,253,150,4,229,7,200,0,13, + 0,0,1,17,33,17,33,17,51,17,51,21,33,21,33,17,1,200,254,36,2,44,160,80,1,221,254,35,253,150,4,4,1,88,4,214,251,42,86,172, + 251,166,0,0,0,1,255,236,253,150,4,229,7,200,0,13,0,0,1,17,33,53,33,53,51,17,51,17,33,17,33,17,1,200,254,36,1,220,80,160, + 2,45,254,35,253,150,4,90,172,86,4,214,251,42,254,168,251,252,0,0,0,1,255,236,253,150,4,229,7,200,0,11,0,0,1,17,33,17,33,17, + 33,17,33,17,33,17,2,24,253,212,1,220,1,64,1,221,253,211,253,150,4,4,1,88,4,214,251,42,254,168,251,252,0,1,255,236,253,150,4,229, + 7,200,0,11,0,0,1,17,33,17,33,17,51,17,33,17,33,17,1,200,254,36,2,44,160,2,45,254,35,253,150,4,4,1,88,4,214,251,42,254, + 168,251,252,0,0,1,255,236,253,150,4,229,7,200,0,11,0,0,1,17,33,17,33,17,33,17,33,21,33,17,1,200,254,36,1,220,1,64,1,221, + 254,35,253,150,4,4,1,88,4,214,250,212,172,251,166,0,0,1,255,236,253,150,4,229,7,200,0,11,0,0,1,17,33,53,33,17,33,17,33,17, + 33,17,1,200,254,36,1,220,1,64,1,221,254,35,253,150,4,90,172,5,44,251,42,254,168,251,252,0,0,1,255,236,253,150,4,229,7,200,0,11, + 0,0,1,17,33,17,33,17,33,17,33,17,33,17,1,200,254,36,1,220,1,64,1,221,254,35,253,150,4,4,1,88,4,214,251,42,254,168,251,252, + 0,2,255,236,1,240,4,229,2,156,0,3,0,7,0,0,3,53,33,21,51,53,33,21,20,2,44,160,2,45,1,240,172,172,172,172,0,2,255,236, + 1,154,4,229,2,242,0,3,0,7,0,0,1,17,33,17,33,17,33,17,2,184,2,45,251,7,2,44,1,154,1,88,254,168,1,88,254,168,0,0, + 0,2,2,24,253,150,2,184,7,200,0,3,0,7,0,0,1,17,51,17,3,17,51,17,2,24,160,160,160,2,242,4,214,251,42,250,164,4,4,251, + 252,0,0,0,0,2,1,200,253,150,3,8,7,200,0,3,0,7,0,0,1,17,33,17,1,17,33,17,1,200,1,64,254,192,1,64,2,242,4,214, + 251,42,250,164,4,4,251,252,0,2,255,236,1,68,4,229,3,72,0,3,0,7,0,0,3,53,33,21,1,53,33,21,20,4,249,251,7,4,249,2, + 156,172,172,254,168,172,172,0,0,2,1,120,253,150,3,88,7,200,0,3,0,7,0,0,1,17,51,17,51,17,51,17,1,120,160,160,160,253,150,10, + 50,245,206,10,50,245,206,0,0,1,2,24,253,150,4,229,3,72,0,9,0,0,1,17,33,21,33,21,33,21,33,17,2,24,2,205,253,211,2,45, + 253,211,253,150,5,178,172,172,172,252,82,0,0,1,1,120,253,150,4,229,2,156,0,9,0,0,1,17,33,21,33,17,35,17,35,17,1,120,3,109, + 254,115,160,160,253,150,5,6,172,251,166,4,90,251,166,0,0,2,1,120,253,150,4,229,3,72,0,5,0,11,0,0,1,17,33,21,33,17,51,17, + 33,21,33,17,1,120,3,109,253,51,160,2,45,254,115,253,150,5,178,172,250,250,4,90,172,252,82,0,0,1,255,236,253,150,2,184,3,72,0,9, + 0,0,1,17,33,53,33,53,33,53,33,17,2,24,253,212,2,44,253,212,2,204,253,150,3,174,172,172,172,250,78,0,0,1,255,236,253,150,3,88, + 2,156,0,9,0,0,3,53,33,17,35,17,35,17,35,17,20,3,108,160,160,160,1,240,172,250,250,4,90,251,166,4,90,0,0,0,0,2,255,236, + 253,150,3,88,3,72,0,5,0,11,0,0,1,17,33,53,33,17,33,17,33,53,33,17,2,184,253,52,3,108,254,32,254,116,2,44,253,150,5,6, + 172,250,78,3,174,172,251,166,0,1,2,24,1,68,4,229,7,200,0,9,0,0,1,17,51,17,33,21,33,21,33,21,2,24,160,2,45,253,211,2, + 45,1,68,6,132,251,128,172,172,172,0,0,0,1,1,120,1,240,4,229,7,200,0,9,0,0,1,17,51,17,51,17,51,17,33,21,1,120,160,160, + 160,1,141,1,240,5,216,250,212,5,44,250,212,172,0,0,0,2,1,120,1,68,4,229,7,200,0,5,0,11,0,0,1,17,51,17,33,21,1,17, + 51,17,33,21,2,184,160,1,141,252,147,160,2,205,2,156,5,44,251,128,172,254,168,6,132,250,40,172,0,1,255,236,1,68,2,184,7,200,0,9, + 0,0,3,53,33,53,33,53,33,17,51,17,20,2,44,253,212,2,44,160,1,68,172,172,172,4,128,249,124,0,0,0,0,1,255,236,1,240,3,88, + 7,200,0,9,0,0,3,53,33,17,51,17,51,17,51,17,20,1,140,160,160,160,1,240,172,5,44,250,212,5,44,250,40,0,0,0,0,2,255,236, + 1,68,3,88,7,200,0,5,0,11,0,0,3,53,33,17,51,17,1,53,33,17,51,17,20,1,140,160,253,212,2,204,160,2,156,172,4,128,250,212, + 254,168,172,5,216,249,124,0,0,1,2,24,253,150,4,229,7,200,0,11,0,0,1,17,51,17,33,21,33,21,33,21,33,17,2,24,160,2,45,253, + 211,2,45,253,211,253,150,10,50,251,128,172,172,172,252,82,0,2,1,120,253,150,4,229,7,200,0,3,0,11,0,0,1,17,51,17,51,17,51,17, + 33,21,33,17,1,120,160,160,160,1,141,254,115,253,150,10,50,245,206,10,50,250,212,172,251,166,0,0,0,3,1,120,253,150,4,229,7,200,0,5, + 0,9,0,15,0,0,1,17,51,17,33,21,1,17,51,17,51,17,33,21,33,17,2,184,160,1,141,252,147,160,160,2,45,254,115,2,156,5,44,251, + 128,172,250,250,10,50,245,206,4,90,172,252,82,0,0,0,0,1,255,236,253,150,2,184,7,200,0,11,0,0,1,17,33,53,33,53,33,53,33,17, + 51,17,2,24,253,212,2,44,253,212,2,44,160,253,150,3,174,172,172,172,4,128,245,206,0,2,255,236,253,150,3,88,7,200,0,7,0,11,0,0, + 1,17,33,53,33,17,51,17,51,17,51,17,1,120,254,116,1,140,160,160,160,253,150,4,90,172,5,44,245,206,10,50,245,206,0,0,0,3,255,236, + 253,150,3,88,7,200,0,5,0,11,0,15,0,0,3,53,33,17,51,17,3,17,33,53,33,17,51,17,51,17,20,1,140,160,160,254,116,2,44,160, + 160,2,156,172,4,128,250,212,250,250,3,174,172,251,166,10,50,245,206,0,0,2,255,236,253,150,4,229,3,72,0,7,0,11,0,0,1,17,33,53, + 33,21,33,17,1,53,33,21,2,24,253,212,4,249,253,211,253,52,4,249,253,150,3,174,172,172,252,82,5,6,172,172,0,1,255,236,253,150,4,229, + 2,156,0,11,0,0,3,53,33,21,33,17,35,17,35,17,35,17,20,4,249,254,115,160,160,160,1,240,172,172,251,166,4,90,251,166,4,90,0,0, + 0,3,255,236,253,150,4,229,3,72,0,3,0,9,0,15,0,0,3,53,33,21,1,17,33,53,33,17,51,17,33,21,33,17,20,4,249,252,147,254, + 116,2,44,160,2,45,254,115,2,156,172,172,250,250,3,174,172,251,166,4,90,172,252,82,0,2,255,236,1,68,4,229,7,200,0,3,0,11,0,0, + 3,53,33,21,1,53,33,17,51,17,33,21,20,4,249,251,7,2,44,160,2,45,1,68,172,172,1,88,172,4,128,251,128,172,0,0,0,1,255,236, + 1,240,4,229,7,200,0,11,0,0,3,53,33,17,51,17,51,17,51,17,33,21,20,1,140,160,160,160,1,141,1,240,172,5,44,250,212,5,44,250, + 212,172,0,0,0,3,255,236,1,68,4,229,7,200,0,3,0,9,0,15,0,0,3,53,33,21,1,53,33,17,51,17,51,17,51,17,33,21,20,4, + 249,251,7,1,140,160,160,160,1,141,1,68,172,172,1,88,172,4,128,250,212,5,44,251,128,172,0,0,0,1,255,236,253,150,4,229,7,200,0,19, + 0,0,1,17,33,53,33,53,33,53,33,17,51,17,33,21,33,21,33,21,33,17,2,24,253,212,2,44,253,212,2,44,160,2,45,253,211,2,45,253, + 211,253,150,3,174,172,172,172,4,128,251,128,172,172,172,252,82,0,0,0,0,1,255,236,253,150,4,229,7,200,0,19,0,0,3,53,33,17,51,17, + 51,17,51,17,33,21,33,17,35,17,35,17,35,17,20,1,140,160,160,160,1,141,254,115,160,160,160,1,240,172,5,44,250,212,5,44,250,212,172,251, + 166,4,90,251,166,4,90,0,0,4,255,236,253,150,4,229,7,200,0,5,0,11,0,17,0,23,0,0,1,17,33,21,33,17,33,17,33,53,33,17, + 1,53,33,17,51,17,51,17,51,17,33,21,2,184,2,45,254,115,254,32,254,116,2,44,253,212,1,140,160,160,160,1,141,253,150,4,90,172,252,82, + 3,174,172,251,166,5,6,172,4,128,250,212,5,44,251,128,172,0,0,0,0,1,2,24,253,150,4,229,2,156,0,12,0,0,1,17,52,55,54,51, + 33,21,33,34,6,21,17,2,24,81,91,168,1,121,254,135,89,91,253,150,3,96,161,127,134,172,126,124,252,160,0,0,0,1,255,236,253,150,2,184, + 2,156,0,13,0,0,1,17,52,39,38,35,33,53,33,50,23,22,21,17,2,24,46,45,89,254,136,1,120,168,91,81,253,150,3,96,126,61,63,172, + 134,120,168,252,160,0,0,0,0,1,255,236,1,240,2,184,7,200,0,12,0,0,3,53,33,50,54,53,17,51,17,20,7,6,35,20,1,120,89,91, + 160,81,91,168,1,240,172,126,124,4,50,251,206,168,120,134,0,1,2,24,1,240,4,229,7,200,0,12,0,0,1,33,34,39,38,53,17,51,17,20, + 22,51,33,4,229,254,135,168,91,81,160,91,89,1,121,1,240,134,120,168,4,50,251,206,124,126,0,0,0,1,255,147,253,150,5,62,7,200,0,3, + 0,0,3,1,51,1,109,4,249,178,251,7,253,150,10,50,245,206,0,0,0,1,255,147,253,150,5,62,7,200,0,3,0,0,1,35,1,51,5,62, + 178,251,7,178,253,150,10,50,0,1,255,147,253,150,5,62,7,200,0,11,0,0,1,35,9,1,35,9,1,51,9,1,51,1,5,62,178,253,220,253, + 221,178,2,125,253,131,178,2,35,2,36,178,253,132,253,150,4,99,251,157,5,25,5,25,251,157,4,99,250,231,0,0,0,1,255,236,1,240,2,124, + 2,156,0,3,0,0,3,53,33,21,20,2,144,1,240,172,172,0,0,0,0,1,2,24,2,70,2,184,7,200,0,3,0,0,1,17,51,17,2,24, + 160,2,70,5,130,250,126,0,0,1,2,124,1,240,4,229,2,156,0,3,0,0,1,53,33,21,2,124,2,105,1,240,172,172,0,0,0,1,2,24, + 253,150,2,184,2,70,0,3,0,0,1,17,51,17,2,24,160,253,150,4,176,251,80,0,0,1,255,236,1,154,2,124,2,242,0,3,0,0,3,17, + 33,17,20,2,144,1,154,1,88,254,168,0,0,1,1,200,2,70,3,8,7,200,0,3,0,0,1,17,33,17,1,200,1,64,2,70,5,130,250,126, + 0,1,2,124,1,154,4,229,2,242,0,3,0,0,1,17,33,17,2,124,2,105,1,154,1,88,254,168,0,1,1,200,253,150,3,8,2,70,0,3, + 0,0,1,17,33,17,1,200,1,64,253,150,4,176,251,80,0,1,255,236,1,154,4,229,2,242,0,7,0,0,3,53,33,53,33,17,33,53,20,2, + 144,2,105,253,151,1,240,172,86,254,168,86,0,1,1,200,253,150,3,8,7,200,0,7,0,0,1,17,51,17,51,17,51,17,1,200,80,160,80,253, + 150,4,176,5,130,250,126,251,80,0,0,0,0,1,255,236,1,154,4,229,2,242,0,7,0,0,3,17,33,21,33,21,33,21,20,2,144,2,105,253, + 151,1,154,1,88,86,172,86,0,1,1,200,253,150,3,8,7,200,0,7,0,0,1,17,35,17,33,17,35,17,2,24,80,1,64,80,253,150,4,176, + 5,130,250,126,251,80,0,0,255,255,255,236,2,20,6,59,6,40,16,7,14,86,0,0,4,20,0,0,0,1,255,236,254,0,6,59,255,5,0,3, + 0,0,3,17,33,17,20,6,79,254,0,1,5,254,251,0,0,1,255,236,254,0,6,59,255,246,0,3,0,0,3,17,33,17,20,6,79,254,0,1, + 246,254,10,0,0,1,255,236,254,0,6,59,1,15,0,3,0,0,3,17,33,17,20,6,79,254,0,3,15,252,241,0,0,1,255,236,254,0,6,59, + 2,20,0,3,0,0,3,17,33,17,20,6,79,254,0,4,20,251,236,0,0,1,255,236,254,0,6,59,3,25,0,3,0,0,3,17,33,17,20,6, + 79,254,0,5,25,250,231,0,0,1,255,236,254,0,6,59,4,30,0,3,0,0,3,17,33,17,20,6,79,254,0,6,30,249,226,0,0,1,255,236, + 254,0,6,59,5,35,0,3,0,0,3,17,33,17,20,6,79,254,0,7,35,248,221,0,0,1,255,236,254,0,6,59,6,40,0,3,0,0,3,17, + 33,17,20,6,79,254,0,8,40,247,216,0,0,1,255,236,254,0,5,113,6,40,0,3,0,0,3,17,33,17,20,5,133,254,0,8,40,247,216,0, + 0,1,255,236,254,0,4,167,6,40,0,3,0,0,3,17,33,17,20,4,187,254,0,8,40,247,216,0,0,1,255,236,254,0,3,221,6,40,0,3, + 0,0,3,17,33,17,20,3,241,254,0,8,40,247,216,0,0,1,255,236,254,0,3,19,6,40,0,3,0,0,3,17,33,17,20,3,39,254,0,8, + 40,247,216,0,0,1,255,236,254,0,2,73,6,40,0,3,0,0,3,17,33,17,20,2,93,254,0,8,40,247,216,0,0,1,255,236,254,0,1,127, + 6,40,0,3,0,0,3,17,33,17,20,1,147,254,0,8,40,247,216,0,0,1,255,236,254,0,0,181,6,40,0,3,0,0,3,17,51,17,20,201, + 254,0,8,40,247,216,0,0,255,255,3,19,254,0,6,58,6,40,16,7,14,94,3,39,0,0,0,0,0,12,255,236,254,0,5,113,6,40,0,3, + 0,7,0,11,0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,0,1,17,51,17,33,17,51,17,19,17,51,17,33,17,51,17, + 1,17,51,17,33,17,51,17,19,17,51,17,33,17,51,17,1,17,51,17,33,17,51,17,19,17,51,17,33,17,51,17,4,167,202,252,14,202,202,202, + 252,15,201,3,242,202,252,14,202,202,202,252,15,201,3,242,202,252,14,202,202,202,252,15,201,254,0,1,5,254,251,1,5,254,251,1,109,1,5,254, + 251,1,5,254,251,1,110,1,5,254,251,1,5,254,251,1,109,1,5,254,251,1,5,254,251,1,110,1,5,254,251,1,5,254,251,1,109,1,5,254, + 251,1,5,254,251,0,0,0,0,32,255,236,254,0,6,52,6,40,0,7,0,15,0,23,0,31,0,39,0,47,0,55,0,63,0,71,0,79,0,87, + 0,95,0,103,0,111,0,119,0,127,0,135,0,143,0,151,0,159,0,167,0,175,0,183,0,191,0,199,0,207,0,215,0,223,0,231,0,239,0,247, + 0,255,0,0,19,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,1,7,35,39, + 53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,1,7,35,39,53,55,51,23,5,7,35,39, + 53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,1,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39, + 53,55,51,23,5,7,35,39,53,55,51,23,1,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39, + 53,55,51,23,1,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,1,7,35,39, + 53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,1,7,35,39,53,55,51,23,5,7,35,39, + 53,55,51,23,5,7,35,39,53,55,51,23,5,7,35,39,53,55,51,23,181,5,191,5,5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5, + 5,191,5,1,146,5,191,5,5,191,5,252,19,5,191,5,5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5, + 5,191,5,250,129,5,191,5,5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5,5,191,5,252,19,5,191,5, + 5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5,5,191,5,250,129,5,191,5,5,191,5,1,146,5,191,5, + 5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5,5,191,5,252,19,5,191,5,5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5, + 5,191,5,1,146,5,191,5,5,191,5,250,129,5,191,5,5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5, + 5,191,5,252,19,5,191,5,5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5,5,191,5,1,146,5,191,5,5,191,5,5,40,5,5,251, + 5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,254,0,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251, + 5,5,251,5,5,254,0,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,254,0,5,5,251,5,5,251,5,5, + 251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,254,0,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5, + 254,0,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,254,0,5,5,251,5,5,251,5,5,251,5,5,251,5, + 5,251,5,5,251,5,5,251,5,5,254,0,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,251,5,5,0,0,7,255,236, + 254,0,6,59,6,40,0,25,0,29,0,33,0,37,0,41,0,45,0,49,0,0,3,17,51,17,35,17,51,17,35,17,51,17,33,17,51,17,33,17, + 35,17,35,17,33,17,35,25,1,51,17,35,1,51,17,35,1,51,17,35,1,51,17,35,1,51,17,35,1,51,17,35,20,201,201,201,201,201,2,94, + 202,2,94,202,202,253,162,202,202,202,3,40,202,202,254,108,202,202,254,108,202,202,3,40,202,202,254,108,202,202,254,0,1,109,1,5,1,214,1,5, + 1,214,1,5,254,251,1,5,247,216,1,5,254,251,1,5,254,251,5,182,1,5,254,251,1,5,253,141,1,5,253,142,1,5,254,251,1,5,253,141, + 1,5,0,0,255,255,255,236,5,35,6,59,6,40,16,7,14,83,0,0,7,35,0,0,255,255,5,113,254,0,6,58,6,40,16,7,14,97,5,133, + 0,0,0,0,0,1,255,236,254,0,3,20,2,20,0,3,0,0,3,17,33,17,20,3,40,254,0,4,20,251,236,0,0,1,3,19,254,0,6,59, + 2,20,0,3,0,0,1,17,33,17,3,19,3,40,254,0,4,20,251,236,0,1,255,236,2,20,3,20,6,40,0,3,0,0,3,17,33,17,20,3, + 40,2,20,4,20,251,236,0,0,1,255,236,254,0,6,59,6,40,0,5,0,0,1,33,17,33,17,33,6,59,249,177,3,40,3,39,254,0,8,40, + 251,236,0,0,0,1,255,236,254,0,6,59,6,40,0,7,0,0,3,17,33,17,33,17,33,17,20,3,40,3,39,252,216,2,20,4,20,251,236,251, + 236,4,20,0,0,1,255,236,254,0,6,59,6,40,0,5,0,0,1,17,33,17,33,17,6,59,252,217,252,216,6,40,251,236,251,236,8,40,0,0, + 0,1,255,236,254,0,6,59,6,40,0,5,0,0,3,33,17,33,17,33,20,6,79,252,216,252,217,6,40,247,216,4,20,0,0,0,0,1,3,19, + 2,20,6,59,6,40,0,3,0,0,1,17,33,17,3,19,3,40,2,20,4,20,251,236,0,1,255,236,254,0,6,59,6,40,0,7,0,0,3,33, + 17,33,17,33,17,33,20,3,39,3,40,252,217,252,216,2,20,4,20,251,236,251,236,0,0,1,255,236,254,0,6,59,6,40,0,5,0,0,3,17, + 33,17,33,17,20,3,39,3,40,254,0,4,20,4,20,247,216,0,0,0,0,1,0,186,255,4,6,213,5,36,0,3,0,0,23,17,33,17,186,6, + 27,252,6,32,249,224,0,0,0,2,0,186,255,4,6,213,5,36,0,3,0,7,0,0,5,33,17,33,3,17,33,17,1,44,5,55,250,201,114,6, + 27,138,5,60,250,82,6,32,249,224,0,0,0,2,0,186,255,4,6,213,5,36,0,11,0,23,0,0,37,20,51,33,50,53,17,52,35,33,34,21, + 3,17,16,41,1,32,25,1,16,41,1,32,1,44,228,3,111,228,228,252,145,228,114,1,86,3,111,1,86,254,170,252,145,254,170,90,228,228,3,116, + 228,228,252,140,3,116,1,86,254,170,252,140,254,170,0,0,255,255,0,186,255,4,6,213,5,36,16,39,14,124,1,17,0,0,16,6,14,115,0,0, + 0,6,0,186,255,4,6,213,5,36,0,3,0,7,0,11,0,15,0,19,0,23,0,0,23,17,33,17,37,33,53,33,53,33,53,33,53,33,53,33, + 53,33,53,33,53,33,53,33,186,6,27,250,87,5,55,250,201,5,55,250,201,5,55,250,201,5,55,250,201,5,55,250,201,252,6,32,249,224,114,176, + 114,178,114,176,114,178,114,176,0,6,0,186,255,4,6,213,5,36,0,3,0,7,0,11,0,15,0,19,0,23,0,0,23,17,33,17,37,51,17,35, + 1,51,17,35,1,51,17,35,1,51,17,35,1,51,17,35,186,6,27,254,225,176,176,254,220,178,178,254,222,176,176,254,220,178,178,254,222,176,176,252, + 6,32,249,224,116,5,56,250,200,5,56,250,200,5,56,250,200,5,56,250,200,5,56,0,0,26,0,186,255,4,6,213,5,36,0,3,0,7,0,11, + 0,15,0,19,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,75,0,79,0,83,0,87,0,91, + 0,95,0,99,0,103,0,0,5,51,53,35,5,51,53,35,5,51,53,35,1,51,53,35,17,51,53,35,17,51,53,35,17,51,53,35,17,51,53,35, + 1,51,53,35,17,51,53,35,17,51,53,35,17,51,53,35,1,51,53,35,17,51,53,35,17,51,53,35,17,51,53,35,1,51,53,35,17,51,53,35, + 17,51,53,35,17,51,53,35,1,51,53,35,17,51,53,35,17,51,53,35,17,51,53,35,17,51,53,35,1,17,33,17,2,76,178,178,1,36,176,176, + 1,34,178,178,252,154,174,174,174,174,174,174,174,174,174,174,1,32,178,178,178,178,178,178,178,178,1,36,176,176,176,176,176,176,176,176,1,34,178,178, + 178,178,178,178,178,178,1,36,173,173,173,173,173,173,173,173,173,173,251,4,6,27,136,174,174,174,174,174,3,220,174,254,46,178,254,44,176,254,44,178, + 254,46,174,3,220,174,254,46,178,254,44,176,254,44,178,2,184,174,254,46,178,254,44,176,254,44,178,2,184,174,254,46,178,254,44,176,254,44,178,2, + 184,174,254,46,178,254,44,176,254,44,178,254,46,174,254,222,6,32,249,224,0,8,0,186,255,4,6,213,5,36,0,3,0,6,0,10,0,14,0,20, + 0,24,0,28,0,31,0,0,23,17,33,17,1,21,51,3,21,1,51,1,21,1,55,1,21,1,55,53,1,51,1,53,1,51,1,53,1,51,23,53, + 186,6,27,250,87,226,226,1,132,251,253,129,3,33,251,251,228,4,190,121,251,66,162,4,28,252,223,162,2,127,254,124,162,226,252,6,32,249,224,1, + 84,226,2,127,252,254,125,4,28,252,252,223,1,5,60,127,251,66,1,127,4,189,251,228,252,3,32,253,129,252,1,131,226,226,0,0,0,8,0,186, + 255,4,6,213,5,36,0,3,0,6,0,10,0,14,0,20,0,24,0,28,0,31,0,0,23,17,33,17,37,51,53,5,51,1,53,1,23,1,53,1, + 23,1,53,35,1,53,1,35,1,53,1,35,1,53,55,35,186,6,27,254,172,226,253,129,251,1,132,251,228,251,3,33,250,201,121,4,190,121,251,66, + 4,28,251,252,223,2,127,251,254,124,226,226,252,6,32,249,224,114,226,226,1,131,252,253,129,1,3,33,252,251,228,1,4,190,127,251,67,161,4,28, + 252,224,161,2,127,254,125,161,226,0,0,0,0,26,0,186,255,4,6,213,5,36,0,4,0,9,0,14,0,18,0,23,0,28,0,32,0,36,0,40, + 0,45,0,49,0,53,0,57,0,61,0,65,0,70,0,75,0,79,0,83,0,87,0,92,0,97,0,101,0,106,0,111,0,115,0,0,1,23,55,39, + 35,17,23,55,39,7,1,23,55,39,35,1,23,55,39,3,23,55,39,7,1,23,55,39,35,1,23,55,39,1,23,55,39,1,23,55,39,1,23,55, + 53,35,1,23,55,39,1,23,55,39,1,23,55,39,1,23,55,39,1,23,55,39,1,51,55,39,7,1,23,55,53,39,1,23,55,39,1,23,55,39, + 1,23,55,39,1,23,51,55,39,1,23,55,53,39,1,23,55,39,1,23,51,55,39,5,23,51,53,39,1,17,33,17,1,44,50,124,53,121,50,126, + 126,50,1,79,126,126,53,146,254,254,126,124,126,254,50,126,126,50,2,236,126,126,53,146,254,253,126,125,125,254,181,125,125,126,254,181,126,126,126,3, + 137,125,49,121,254,253,124,126,124,254,179,124,126,124,254,181,125,124,124,254,181,124,126,124,254,179,125,125,124,255,0,122,52,124,50,4,136,126,49,50, + 254,180,126,126,126,254,181,126,124,126,254,182,126,126,126,254,179,53,147,52,126,2,187,125,50,50,254,181,126,125,126,254,181,52,147,53,126,1,31,52, + 122,50,250,137,6,27,4,51,49,124,52,253,228,50,126,126,49,1,79,126,126,52,254,255,126,124,126,252,204,49,126,125,49,2,236,126,126,52,254,253, + 125,125,126,254,181,126,125,125,254,182,126,126,126,1,236,124,49,127,254,253,124,126,124,254,180,125,126,124,254,182,124,124,124,254,181,124,126,124,254,180, + 124,125,125,254,129,52,124,49,2,237,126,50,153,49,254,180,126,126,126,254,181,126,124,126,254,181,126,126,126,254,180,52,52,126,1,30,126,49,153,49, + 254,181,125,124,126,254,181,52,52,126,126,52,127,49,254,222,6,32,249,224,0,1,0,186,0,22,4,178,4,18,0,3,0,0,55,17,33,17,186,3, + 248,22,3,252,252,4,0,0,0,2,0,186,0,22,4,178,4,18,0,3,0,7,0,0,37,33,17,33,3,17,33,17,1,44,3,20,252,236,114,3, + 248,136,3,24,252,118,3,252,252,4,0,0,0,1,0,186,0,154,6,213,3,142,0,3,0,0,37,33,17,33,6,213,249,229,6,27,154,2,244,0, + 0,2,0,186,0,154,6,213,3,142,0,3,0,7,0,0,1,17,33,17,5,33,17,33,6,99,250,201,5,169,249,229,6,27,1,12,2,16,253,240, + 114,2,244,0,0,1,0,186,255,6,3,173,5,34,0,3,0,0,23,17,33,17,186,2,243,250,6,28,249,228,0,0,0,2,0,186,255,6,3,173, + 5,34,0,3,0,7,0,0,5,33,17,33,3,17,33,17,1,44,2,15,253,241,114,2,243,136,5,56,250,86,6,28,249,228,0,0,0,1,0,6, + 0,154,6,33,3,142,0,3,0,0,37,33,1,33,4,152,251,110,1,138,4,145,154,2,244,0,0,0,0,2,0,6,0,154,6,33,3,142,0,3, + 0,7,0,0,9,1,33,1,5,33,1,33,4,98,1,16,252,83,254,239,3,228,251,110,1,138,4,145,1,12,2,16,253,240,114,2,244,0,0,0, + 0,1,0,6,255,4,6,33,5,36,0,2,0,0,23,9,1,6,3,13,3,14,252,6,32,249,224,0,0,2,0,6,255,4,6,33,5,36,0,2, + 0,5,0,0,23,33,9,3,177,4,197,253,157,252,243,3,13,3,14,138,4,202,250,196,6,32,249,224,0,1,0,6,0,22,3,254,4,18,0,2, + 0,0,55,9,1,6,1,252,1,252,22,3,252,252,4,0,0,2,0,6,0,22,3,254,4,18,0,2,0,5,0,0,55,33,9,3,177,2,162,254, + 175,254,4,1,252,1,252,136,2,166,252,232,3,252,252,4,0,1,0,6,255,4,6,33,5,36,0,2,0,0,23,17,1,6,6,27,252,6,32,252, + 240,0,0,0,0,2,0,6,255,4,6,33,5,36,0,2,0,5,0,0,23,9,1,3,17,1,120,4,197,251,59,114,6,27,82,2,102,2,102,250, + 138,6,32,252,240,0,0,0,0,1,0,6,0,22,3,254,4,18,0,2,0,0,55,17,1,6,3,248,22,3,252,254,2,0,0,0,0,2,0,6, + 0,22,3,254,4,18,0,2,0,5,0,0,55,9,1,3,17,1,120,2,162,253,94,114,3,248,193,1,83,1,83,252,175,3,252,254,2,0,0,0, + 0,1,0,6,0,22,6,33,4,18,0,2,0,0,55,17,1,6,6,27,22,3,252,254,2,0,0,0,0,2,0,6,0,22,6,33,4,18,0,2, + 0,5,0,0,55,9,1,3,17,1,120,4,140,251,116,114,6,27,193,1,83,1,83,252,175,3,252,254,2,0,0,0,0,1,0,6,255,4,6,33, + 5,36,0,2,0,0,19,33,1,6,6,27,252,242,5,36,249,224,0,0,0,2,0,6,255,4,6,33,5,36,0,2,0,5,0,0,19,9,1,37, + 33,1,177,2,98,2,99,250,144,6,27,252,242,4,178,251,54,4,202,114,249,224,0,0,0,1,0,6,0,22,3,254,4,18,0,2,0,0,19,33, + 1,6,3,248,254,4,4,18,252,4,0,0,0,2,0,6,0,22,3,254,4,18,0,2,0,5,0,0,19,9,1,37,33,1,177,1,81,1,81,252, + 179,3,248,254,4,3,160,253,90,2,166,114,252,4,0,0,0,1,0,6,255,4,6,33,5,36,0,2,0,0,19,1,17,6,6,27,2,20,3,16, + 249,224,0,0,0,2,0,6,255,4,6,33,5,36,0,2,0,5,0,0,19,1,17,9,1,17,234,4,197,250,87,6,27,2,20,253,154,4,204,253, + 154,3,16,249,224,0,0,0,0,1,0,6,0,22,3,254,4,18,0,2,0,0,19,1,17,6,3,248,2,20,1,254,252,4,0,0,0,2,0,6, + 0,22,3,254,4,18,0,2,0,5,0,0,19,1,17,9,1,17,234,2,162,252,122,3,248,2,20,254,173,2,166,254,173,1,254,252,4,0,0,0, + 0,1,0,6,0,22,6,33,4,18,0,2,0,0,19,1,17,6,6,27,2,20,1,254,252,4,0,0,0,2,0,6,0,22,6,33,4,18,0,2, + 0,5,0,0,9,1,17,9,1,17,1,35,4,140,250,87,6,27,2,20,254,173,2,166,254,173,1,254,252,4,0,0,0,1,0,6,255,4,6,33, + 5,36,0,3,0,0,19,9,2,6,3,13,3,14,252,242,2,20,3,16,252,240,252,240,0,2,0,6,255,4,6,33,5,36,0,3,0,7,0,0, + 19,9,6,158,2,117,2,118,253,138,252,243,3,13,3,14,252,242,2,20,253,136,2,120,2,120,253,136,3,16,252,240,252,240,0,0,0,3,0,6, + 255,4,6,33,5,36,0,3,0,7,0,11,0,0,9,11,1,62,1,213,1,213,254,43,253,139,2,117,2,118,253,138,252,243,3,13,3,14,252,242, + 2,20,1,215,254,41,254,41,1,215,253,136,2,120,2,120,253,136,3,16,252,240,252,240,0,3,0,112,254,255,6,139,5,41,0,13,0,27,0,41, + 0,0,36,16,55,54,51,50,23,22,16,7,6,35,34,39,0,16,5,22,51,50,55,36,16,37,38,35,34,7,0,16,37,54,51,50,23,4,16,5, + 6,35,34,39,1,130,254,126,127,128,126,254,254,126,128,127,126,254,101,1,77,165,166,167,165,1,77,254,179,165,167,166,165,254,62,1,135,195,195,196, + 195,1,135,254,121,195,196,195,195,239,2,74,146,74,74,146,253,182,146,74,74,3,54,253,2,192,96,96,192,2,254,192,96,96,251,255,3,132,226,113, + 113,226,252,124,226,113,113,0,0,2,0,6,254,35,3,238,6,117,0,3,0,7,0,34,64,17,2,6,0,8,4,6,8,6,4,3,2,1,0,6, + 5,7,8,16,212,204,23,57,49,0,16,212,204,17,57,18,57,48,9,7,1,250,254,127,1,129,1,129,254,127,1,244,254,12,254,12,5,129,252,207, + 252,199,3,57,4,37,251,219,251,211,4,45,0,2,0,112,254,255,6,139,5,41,0,13,0,27,0,0,18,16,5,22,51,50,55,36,16,37,38,35, + 34,7,0,16,37,54,51,50,23,4,16,5,6,35,34,39,229,1,77,165,166,167,165,1,77,254,179,165,167,166,165,254,62,1,135,195,195,196,195,1, + 135,254,121,195,196,195,195,3,147,253,2,192,96,96,192,2,254,192,96,96,251,255,3,132,226,113,113,226,252,124,226,113,113,0,0,0,0,8,0,114, + 255,1,6,137,5,39,0,9,0,19,0,29,0,39,0,47,0,55,0,63,0,71,0,0,37,22,23,22,23,7,38,39,38,39,5,54,55,54,55,23, + 6,7,6,7,19,38,39,38,39,55,22,23,22,23,37,6,7,6,7,39,54,55,54,55,19,22,50,55,23,6,34,39,1,54,52,39,55,22,20,7, + 1,38,34,7,39,54,50,23,1,6,20,23,7,38,52,55,1,92,43,59,46,56,49,70,57,75,53,3,218,56,46,52,50,100,59,69,57,71,156,44, + 58,46,56,48,71,57,74,54,252,38,56,46,59,43,100,49,79,57,70,237,76,154,76,38,95,192,96,3,74,16,16,110,20,20,253,161,76,154,76,39, + 96,192,95,252,184,16,16,110,20,20,143,60,49,38,32,106,40,48,61,74,117,32,38,44,65,61,78,58,48,40,4,39,60,49,38,32,106,40,48,61, + 74,117,32,38,49,60,62,69,66,48,40,250,212,22,22,110,27,27,2,95,73,160,73,39,91,202,91,3,74,22,22,110,27,27,253,161,73,160,73,39, + 91,202,91,0,0,6,0,112,254,255,6,139,5,41,0,13,0,23,0,27,0,37,0,47,0,51,0,0,54,16,37,54,51,50,23,4,16,5,6,35, + 34,39,19,17,22,23,22,23,17,6,7,6,7,6,16,23,1,17,22,51,50,55,17,38,35,34,23,17,54,55,54,55,17,38,39,38,23,17,54,16, + 112,1,135,195,195,196,195,1,135,254,121,195,196,195,195,11,23,25,65,65,65,65,25,137,171,171,1,150,44,43,45,44,44,45,43,246,65,64,26,23, + 23,26,64,227,170,82,3,132,226,113,113,226,252,124,226,113,113,4,197,251,190,15,15,37,23,4,246,23,37,15,109,177,253,220,177,4,91,250,208,7, + 7,5,48,7,36,251,10,23,37,15,16,4,64,16,15,37,162,252,124,177,2,34,0,0,0,4,0,112,254,255,6,139,5,41,0,13,0,27,0,41, + 0,55,0,0,0,16,23,22,51,50,55,54,16,39,38,35,34,7,2,16,55,54,51,50,23,22,16,7,6,35,34,39,0,16,5,22,51,50,55,36, + 16,37,38,35,34,7,0,16,37,54,51,50,23,4,16,5,6,35,34,39,2,153,114,57,57,58,57,114,114,57,58,57,57,237,176,88,87,88,88,176, + 176,88,88,87,88,254,23,1,77,165,166,167,165,1,77,254,179,165,167,166,165,254,62,1,135,195,195,196,195,1,135,254,121,195,196,195,195,2,152,254, + 248,66,33,33,66,1,8,66,33,33,254,111,1,150,101,51,51,101,254,106,101,51,51,2,175,253,2,192,96,96,192,2,254,192,96,96,251,255,3,132, + 226,113,113,226,252,124,226,113,113,0,0,0,0,1,0,112,255,4,6,139,5,32,0,23,0,19,64,7,6,18,24,25,12,0,24,16,220,212,204,49, + 0,16,212,196,48,19,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,112,105,104,182,181,210,209,181,182,104,105, + 105,104,182,181,209,210,181,182,104,105,2,18,209,182,181,105,105,105,105,181,182,209,209,182,181,105,105,105,105,181,182,0,0,2,0,112,255,4,6,139, + 5,32,0,13,0,21,0,0,18,16,18,36,51,50,4,18,16,2,4,35,34,36,5,50,55,36,16,37,38,35,112,209,1,107,210,209,1,107,209,209, + 254,149,209,210,254,149,2,60,167,165,1,77,254,179,165,167,1,65,1,162,1,107,210,210,254,149,254,94,254,149,210,210,97,96,192,2,254,192,96,0, + 0,2,0,112,255,4,6,139,5,32,0,13,0,21,0,0,18,16,18,36,51,50,4,18,16,2,4,35,34,36,1,34,7,4,16,5,22,51,112,209, + 1,107,210,209,1,107,209,209,254,149,209,210,254,149,2,60,166,165,254,179,1,77,165,166,1,65,1,162,1,107,210,210,254,149,254,94,254,149,210,210, + 4,221,96,192,253,2,192,96,0,2,0,112,255,4,6,139,5,32,0,13,0,22,0,0,18,16,18,36,51,50,4,18,16,2,4,35,34,36,1,16, + 37,38,35,34,7,4,17,112,209,1,107,210,209,1,107,209,209,254,149,209,210,254,149,4,213,254,179,165,167,166,165,254,179,1,65,1,162,1,107,210, + 210,254,149,254,94,254,149,210,210,2,62,1,127,192,96,96,192,254,129,0,0,2,0,112,255,4,6,139,5,32,0,13,0,22,0,0,18,16,18,36, + 51,50,4,18,16,2,4,35,34,36,3,16,5,22,51,50,55,36,17,112,209,1,107,210,209,1,107,209,209,254,149,209,210,254,149,92,1,77,165,166, + 167,165,1,77,1,65,1,162,1,107,210,210,254,149,254,94,254,149,210,210,2,62,254,129,192,96,96,192,1,127,0,0,0,2,0,112,255,4,6,139, + 5,32,0,11,0,24,0,0,18,16,18,36,32,4,18,16,2,4,32,36,1,34,7,4,16,5,22,51,50,55,36,17,33,112,209,1,107,1,163,1, + 107,209,209,254,149,254,93,254,149,2,60,166,165,254,179,1,77,165,166,167,165,1,77,253,103,1,65,1,162,1,107,210,210,254,149,254,94,254,149,210, + 210,4,221,96,192,253,2,192,96,96,192,1,127,0,0,0,0,2,0,112,255,4,6,139,5,32,0,11,0,17,0,0,18,16,18,36,32,4,18,16, + 2,4,32,36,1,34,7,4,17,33,112,209,1,107,1,163,1,107,209,209,254,149,254,93,254,149,2,60,166,165,254,179,2,152,1,65,1,162,1,107, + 210,210,254,149,254,94,254,149,210,210,4,221,96,192,254,129,0,1,0,112,254,255,3,125,5,41,0,7,0,0,54,16,37,54,51,17,34,39,112,1, + 135,195,195,195,195,82,3,132,226,113,249,214,113,0,0,0,0,1,0,186,254,255,3,199,5,41,0,7,0,0,0,16,5,6,35,17,50,23,3,199, + 254,121,195,195,195,195,3,214,252,124,226,113,6,42,113,0,0,2,0,186,255,236,5,154,6,40,0,10,0,14,0,0,1,20,22,50,54,53,52,38, + 35,34,6,1,17,33,17,2,1,172,250,172,171,124,126,173,254,185,4,224,2,250,125,172,172,125,124,171,171,252,118,6,60,249,196,0,0,3,0,186, + 254,0,7,9,6,40,0,13,0,27,0,31,0,0,36,16,37,54,51,50,23,4,16,5,6,35,34,39,0,16,5,22,51,50,55,36,16,37,38,35, + 34,7,1,17,33,17,1,73,1,77,165,166,167,165,1,77,254,179,165,167,166,165,254,62,1,135,195,195,196,195,1,135,254,121,195,196,195,195,254,95, + 6,79,149,2,254,192,96,96,192,253,2,192,96,96,4,1,252,124,226,113,113,226,3,132,226,113,113,249,72,8,40,247,216,0,0,0,0,2,0,186, + 2,20,7,9,6,40,0,12,0,21,0,0,19,17,33,17,35,16,37,38,35,34,7,4,17,41,1,16,37,54,51,50,23,4,186,6,79,26,254,121, + 195,196,195,195,254,121,5,166,250,207,1,77,166,165,166,166,1,77,2,20,4,20,251,236,1,194,226,113,113,226,254,62,1,126,193,96,96,193,0,0, + 0,2,0,186,254,0,7,9,2,20,0,12,0,21,0,0,19,17,51,16,5,22,51,50,55,36,17,51,17,1,33,16,5,6,35,34,39,36,186,26, + 1,135,195,195,196,195,1,135,26,250,64,5,49,254,179,166,166,165,166,254,179,254,0,4,20,254,62,226,113,113,226,1,194,251,236,4,20,254,130,193, + 96,96,193,0,0,1,0,6,2,20,3,19,5,41,0,9,0,0,19,16,37,54,51,21,34,7,4,17,6,1,135,195,195,166,165,254,179,2,20,1, + 194,226,113,118,96,192,254,129,0,1,0,6,2,20,3,19,5,41,0,9,0,0,19,50,23,4,17,35,16,37,38,35,6,195,195,1,135,117,254,179, + 165,166,5,41,113,226,254,62,1,127,192,96,0,1,0,6,254,255,3,19,2,20,0,9,0,0,19,53,50,55,36,17,51,16,5,6,6,166,165,1, + 77,117,254,121,195,254,255,118,96,192,1,127,254,62,226,113,0,1,0,6,254,255,3,19,2,20,0,9,0,0,1,34,39,36,17,51,16,5,22,51, + 3,19,195,195,254,121,117,1,77,165,166,254,255,113,226,1,194,254,129,192,96,0,0,0,0,1,0,112,2,20,6,139,5,41,0,17,0,0,19,16, + 37,54,51,50,23,4,17,35,16,37,38,35,34,7,4,17,112,1,135,195,195,196,195,1,135,117,254,179,165,167,166,165,254,179,2,20,1,194,226,113, + 113,226,254,62,1,127,192,96,96,192,254,129,0,1,0,112,254,255,6,139,2,20,0,18,0,0,19,48,51,16,5,22,51,50,55,36,17,51,16,5, + 6,35,34,39,36,112,117,1,77,165,166,167,165,1,77,117,254,121,195,196,195,195,254,121,2,20,254,129,192,96,96,192,1,127,254,62,226,113,113,226, + 0,1,0,6,255,4,6,33,5,36,0,2,0,0,23,1,17,6,6,27,252,6,32,249,224,0,0,0,0,1,0,6,255,4,6,33,5,36,0,2, + 0,0,23,17,1,6,6,27,252,6,32,249,224,0,0,0,0,1,0,6,255,4,6,33,5,36,0,2,0,0,23,17,33,6,6,27,252,6,32,0, + 0,1,0,6,255,4,6,33,5,36,0,2,0,0,19,33,17,6,6,27,5,36,249,224,0,2,1,51,1,209,3,133,4,33,0,10,0,21,0,0, + 1,20,22,50,54,53,52,38,35,34,6,7,52,54,51,50,22,21,20,6,34,38,1,110,138,200,138,137,99,101,139,59,173,126,124,171,172,250,172,2, + 250,100,138,138,100,99,137,137,99,124,171,171,124,125,172,172,0,2,0,186,255,4,6,213,5,36,0,3,0,7,0,0,23,17,33,17,37,33,17,33, + 186,6,27,252,242,2,156,253,100,252,6,32,249,224,114,5,60,0,0,0,0,2,0,186,255,4,6,213,5,36,0,3,0,7,0,0,23,17,33,17, + 37,33,17,33,186,6,27,250,87,2,155,253,101,252,6,32,249,224,114,5,60,0,0,0,0,2,0,186,255,4,6,213,5,36,0,3,0,6,0,0, + 23,17,33,17,37,33,17,186,6,27,250,87,5,55,252,6,32,249,224,114,5,60,0,0,0,2,0,186,255,4,6,213,5,36,0,3,0,6,0,0, + 23,17,33,17,37,1,33,186,6,27,250,87,5,55,250,201,252,6,32,249,224,114,5,60,0,3,0,186,255,4,6,213,5,36,0,3,0,7,0,11, + 0,0,23,17,33,17,37,33,17,33,1,33,17,33,186,6,27,253,43,2,99,253,157,253,44,2,98,253,158,252,6,32,249,224,114,5,60,250,196,5, + 60,0,0,0,0,3,0,6,255,4,6,33,5,36,0,7,0,10,0,13,0,0,0,52,54,50,22,20,6,34,1,33,9,3,2,127,87,124,86,86, + 125,253,220,4,197,253,157,252,243,3,13,3,14,1,44,124,86,86,124,86,254,160,4,202,250,196,6,32,249,224,0,0,0,2,0,6,255,4,6,33, + 5,36,0,2,0,5,0,0,5,33,9,3,3,19,2,99,253,157,252,243,3,13,3,14,138,4,202,250,196,6,32,249,224,0,0,0,0,2,0,6, + 255,4,6,33,5,36,0,2,0,5,0,0,23,33,17,9,2,177,2,98,252,243,3,13,3,14,138,4,202,250,196,6,32,249,224,0,0,2,0,112, + 254,0,8,132,6,40,0,11,0,23,0,0,18,16,1,22,32,55,0,16,1,38,32,7,0,16,1,36,32,5,0,16,1,4,32,37,241,1,197,226, + 1,196,226,1,197,254,59,226,254,60,226,253,186,2,5,1,3,2,4,1,3,2,5,253,251,254,253,253,252,254,253,4,30,251,236,254,251,131,131,1, + 5,4,20,1,5,131,131,250,157,4,168,1,42,150,150,254,214,251,88,254,214,150,150,0,0,3,0,186,255,4,6,213,5,36,0,5,0,9,0,13, + 0,0,5,33,17,33,17,33,3,17,33,17,1,33,17,33,1,44,5,55,253,157,253,44,114,6,27,250,87,2,98,253,158,138,5,60,253,41,253,41, + 6,32,249,224,3,73,2,101,0,3,0,186,255,4,6,213,5,36,0,5,0,9,0,13,0,0,1,33,17,33,17,33,3,17,33,17,37,33,17,33, + 1,44,2,212,2,99,250,201,114,6,27,250,87,2,98,253,158,2,77,253,41,5,60,250,82,6,32,249,224,114,2,101,0,3,0,186,255,4,6,213, + 5,36,0,5,0,9,0,13,0,0,5,33,17,33,17,33,3,17,33,17,37,33,17,33,1,44,2,98,2,213,250,201,114,6,27,253,43,2,99,253, + 157,138,2,215,2,101,250,82,6,32,249,224,114,2,101,0,0,3,0,186,255,4,6,213,5,36,0,5,0,9,0,13,0,0,5,33,17,33,17,33, + 3,17,33,17,1,33,17,33,1,44,5,55,253,43,253,158,114,6,27,253,43,2,99,253,157,138,2,101,2,215,250,82,6,32,249,224,3,73,2,101, + 0,3,0,112,255,4,6,139,5,32,0,13,0,19,0,32,0,0,18,16,18,36,51,50,4,18,16,2,4,35,34,36,1,6,7,4,3,33,5,18, + 5,22,51,50,55,36,16,37,38,39,17,112,209,1,107,210,209,1,107,209,209,254,149,209,210,254,149,2,3,137,137,254,204,23,2,93,253,163,23,1, + 52,166,165,166,166,1,77,254,179,137,138,1,65,1,162,1,107,210,210,254,149,254,94,254,149,210,210,4,218,14,79,178,254,172,114,254,172,178,96,96, + 193,2,252,193,79,14,253,43,0,3,0,112,255,4,6,139,5,32,0,13,0,26,0,32,0,0,18,16,18,36,51,50,4,18,16,2,4,35,34,36, + 5,54,55,36,16,37,38,35,34,7,4,3,33,5,18,5,22,23,17,112,209,1,107,210,209,1,107,209,209,254,149,209,210,254,149,2,117,138,137,1, + 77,254,179,166,166,165,166,254,204,23,2,207,253,49,23,1,52,137,137,1,65,1,162,1,107,210,210,254,149,254,94,254,149,210,210,94,14,79,193,2, + 252,193,96,96,178,254,172,114,254,172,178,79,14,2,99,0,0,3,0,112,255,4,6,139,5,32,0,13,0,26,0,32,0,0,18,16,18,36,51,50, + 4,18,16,2,4,35,34,36,2,16,5,22,23,17,33,2,37,38,35,34,7,1,54,55,36,19,33,112,209,1,107,210,209,1,107,209,209,254,149,209, + 210,254,149,92,1,77,137,137,2,208,23,254,204,166,166,165,166,1,132,138,137,1,52,23,253,162,1,65,1,162,1,107,210,210,254,149,254,94,254,149, + 210,210,3,188,253,4,193,79,14,2,213,1,84,178,96,96,251,37,14,79,178,1,84,0,0,3,0,112,255,4,6,139,5,32,0,13,0,26,0,32, + 0,0,18,16,18,36,51,50,4,18,16,2,4,35,34,36,2,16,5,22,51,50,55,36,19,33,17,6,7,1,2,37,38,39,17,112,209,1,107,210, + 209,1,107,209,209,254,149,209,210,254,149,92,1,77,166,165,166,166,1,52,23,253,48,137,137,3,226,23,254,204,137,138,1,65,1,162,1,107,210,210, + 254,149,254,94,254,149,210,210,3,188,253,4,193,96,96,178,1,84,2,213,14,79,253,250,1,84,178,79,14,253,157,0,0,2,0,6,255,4,6,33, + 5,36,0,2,0,5,0,0,55,1,33,3,17,33,120,4,140,251,116,114,6,27,32,4,146,250,82,6,32,0,0,0,0,2,0,6,255,4,6,33, + 5,36,0,2,0,5,0,0,9,1,17,37,33,17,1,35,4,140,250,87,6,27,4,178,251,110,4,146,114,249,224,0,0,2,0,6,255,4,6,33, + 5,36,0,2,0,5,0,0,23,33,1,3,17,1,120,4,140,251,116,114,6,27,138,4,146,250,252,6,32,249,224,0,0,2,0,186,255,121,5,234, + 4,175,0,3,0,7,0,0,5,33,17,33,3,17,33,17,1,44,4,76,251,180,114,5,48,21,4,82,251,60,5,54,250,202,0,0,0,1,0,186, + 255,121,5,234,4,175,0,3,0,0,23,17,33,17,186,5,48,135,5,54,250,202,0,0,0,2,0,186,255,221,5,34,4,75,0,3,0,7,0,0, + 37,33,17,33,3,17,33,17,1,44,3,132,252,124,114,4,104,79,3,138,252,4,4,110,251,146,0,0,0,1,0,186,255,221,5,34,4,75,0,3, + 0,0,23,17,33,17,186,4,104,35,4,110,251,146,0,0,0,2,0,6,255,4,6,33,5,36,0,2,0,5,0,0,5,33,17,9,1,17,1,35, + 4,140,250,87,6,27,138,4,146,250,252,6,32,249,224,0,0,9,0,171,0,0,6,128,5,213,0,7,0,12,0,19,0,34,0,42,0,50,0,58, + 0,65,0,73,0,0,1,51,23,17,7,35,39,17,5,23,21,7,39,37,23,7,35,38,39,53,5,50,31,1,20,7,6,35,34,39,38,53,52,55, + 54,1,33,23,21,7,33,39,53,37,33,23,21,7,33,39,53,3,51,22,23,21,7,39,53,37,51,23,21,7,39,53,37,51,23,17,7,35,39,17, + 3,115,77,6,6,77,6,2,55,58,248,61,252,253,252,61,3,200,45,2,48,208,89,13,190,71,46,175,98,35,183,67,253,75,1,83,6,6,254,173, + 6,4,117,1,89,7,7,254,167,6,71,3,134,114,61,248,253,181,3,59,246,62,2,27,77,6,6,77,6,5,213,6,254,162,6,6,1,94,155,63, + 3,254,63,238,254,64,199,55,4,181,225,96,189,100,23,167,63,92,181,103,27,254,237,6,79,6,6,79,6,6,79,6,6,79,254,232,130,121,3,62, + 253,4,42,60,3,254,63,4,118,6,254,162,6,6,1,94,0,1,0,104,255,251,7,151,2,225,0,34,0,0,1,51,50,31,1,54,51,22,21,20, + 7,22,29,1,6,35,33,53,50,55,54,59,1,39,52,63,1,23,39,52,63,1,50,23,54,4,245,22,217,117,21,39,54,135,34,103,18,80,249,51, + 57,134,46,52,33,12,160,39,42,5,204,67,48,46,120,2,225,232,86,35,27,109,49,52,23,72,26,101,9,174,39,49,108,49,4,4,12,147,90,8, + 43,100,0,0,0,1,0,100,0,0,6,200,5,213,0,63,0,0,1,51,23,21,51,32,1,22,29,1,35,38,39,38,43,1,34,7,21,20,7,39, + 38,35,17,20,15,1,34,47,1,53,55,51,23,21,22,59,1,50,63,1,17,34,7,6,35,39,53,55,35,38,39,35,34,15,1,35,53,54,55,54, + 33,53,3,139,58,6,2,1,184,1,24,43,2,22,19,35,57,44,150,112,8,33,151,136,106,30,91,37,2,6,43,5,11,62,10,55,20,6,211,86, + 17,14,7,7,4,67,197,67,99,34,20,3,58,192,239,1,56,5,213,6,125,254,26,86,13,8,15,46,24,101,51,15,2,66,61,253,83,101,24,2, + 96,28,26,6,6,12,101,57,42,2,164,61,57,6,12,51,64,27,61,18,2,144,218,223,125,0,0,0,0,26,0,170,255,255,6,130,7,107,0,13, + 0,21,0,29,0,37,0,67,0,96,0,140,0,183,0,227,1,14,1,58,1,100,1,144,1,187,1,230,2,15,2,59,2,101,2,109,2,117,2,125, + 2,169,2,211,2,253,3,39,3,83,0,0,1,22,51,50,55,51,6,7,38,39,51,22,51,50,55,38,39,54,55,22,23,6,5,38,39,54,55,22, + 23,6,3,38,39,54,55,22,23,6,39,6,21,20,22,51,50,54,53,52,39,38,39,50,51,50,55,54,53,52,38,35,34,6,21,20,23,22,51,6, + 19,54,55,50,31,1,22,20,7,6,7,22,23,22,21,20,4,32,36,53,52,55,54,55,38,39,38,52,55,1,23,39,38,51,50,15,1,55,54,51, + 50,21,20,15,1,23,22,21,20,35,34,47,1,23,22,35,34,53,55,7,6,35,34,53,52,63,1,39,38,53,52,51,50,1,23,39,38,50,15,1, + 55,54,51,50,21,20,15,1,23,22,21,20,35,34,47,1,23,22,35,34,53,55,7,6,35,34,53,52,63,1,39,38,53,52,51,50,5,23,39,38, + 51,50,15,1,55,54,51,50,21,20,15,1,23,22,21,20,35,34,47,1,23,22,35,34,53,55,7,6,35,34,53,52,63,1,39,38,53,52,51,50, + 19,23,39,38,50,15,1,55,54,51,50,21,20,15,1,23,22,21,20,35,34,47,1,23,22,35,34,53,55,7,6,35,34,53,52,63,1,39,38,53, + 52,51,50,1,23,39,38,51,50,15,1,55,54,51,50,21,20,15,1,23,22,21,20,35,34,47,1,23,20,35,34,53,55,7,6,35,34,53,52,63, + 1,39,38,53,52,51,50,1,23,39,38,50,15,1,55,54,51,50,21,20,15,1,23,22,21,20,35,34,47,1,23,20,34,53,55,7,6,35,34,53, + 52,63,1,39,38,53,52,51,50,5,23,39,52,51,50,21,7,55,54,51,50,21,20,15,1,23,22,21,20,35,34,47,1,23,22,35,34,53,55,7, + 6,35,34,53,52,63,1,39,38,53,52,51,50,3,23,39,38,50,15,1,55,54,51,50,21,20,15,1,23,22,21,20,35,34,47,1,23,22,35,34, + 53,55,7,6,35,34,53,52,63,1,39,38,53,52,51,50,5,23,39,38,50,15,1,55,54,51,50,21,20,15,1,23,22,21,20,35,34,47,1,23, + 22,35,34,53,55,7,6,35,34,53,52,63,1,39,38,53,52,51,50,31,1,39,38,50,15,1,55,54,51,50,21,20,15,1,23,22,20,35,34,47, + 1,23,20,35,34,53,55,7,6,35,34,52,63,1,39,38,53,52,51,50,55,23,39,52,51,50,15,1,55,54,51,50,21,20,15,1,23,22,21,20, + 35,34,47,1,23,22,35,34,53,55,7,6,35,34,53,52,63,1,39,38,53,52,51,50,55,23,39,38,50,15,1,55,54,51,50,21,20,15,1,23, + 22,21,20,35,34,47,1,23,22,34,53,55,7,6,35,34,53,52,63,1,39,38,53,52,51,50,19,38,39,54,55,22,23,6,5,38,39,54,55,22, + 23,6,23,38,39,54,55,22,23,6,1,23,39,38,51,50,15,1,55,54,51,50,21,20,15,1,23,22,21,20,35,34,47,1,23,22,35,34,53,55, + 7,6,35,34,53,52,63,1,39,38,53,52,51,50,1,23,39,38,50,15,1,55,54,51,50,21,20,15,1,23,22,21,20,35,34,47,1,23,20,34, + 53,55,7,6,35,34,53,52,63,1,39,38,53,52,51,50,5,23,39,38,50,15,1,55,54,51,50,21,20,15,1,23,22,21,20,35,34,47,1,23, + 22,34,53,55,7,6,35,34,53,52,63,1,39,38,53,52,51,50,1,23,39,38,50,15,1,55,54,51,50,21,20,15,1,23,22,21,20,35,34,47, + 1,23,22,34,53,55,7,6,35,34,53,52,63,1,39,38,53,52,51,50,1,23,39,38,51,50,15,1,55,54,51,50,21,20,15,1,23,22,21,20, + 35,34,47,1,23,22,35,34,53,55,7,6,35,34,53,52,63,1,39,38,53,52,51,50,3,252,8,8,66,25,25,5,128,126,9,24,37,60,7,122, + 42,1,3,43,39,3,3,254,235,41,3,3,43,40,3,3,64,38,2,3,39,36,2,2,202,124,247,175,174,248,124,101,139,2,3,60,45,65,125,93, + 92,138,66,45,55,144,21,26,147,132,49,2,83,76,20,24,111,87,142,254,228,254,106,254,227,143,92,118,21,19,76,76,253,169,41,6,1,15,17,2, + 6,40,4,4,16,8,48,47,9,16,4,4,40,6,1,16,14,5,40,3,5,14,9,46,49,7,15,5,1,40,37,6,2,30,2,6,37,4,4,14, + 7,44,42,7,12,5,3,35,4,1,14,13,5,36,3,4,13,8,41,42,8,14,4,3,102,36,5,2,14,16,2,6,37,3,5,13,7,43,41,8, + 12,6,2,36,5,1,15,12,4,35,4,3,14,8,42,43,8,15,3,102,37,6,2,30,2,6,37,4,4,14,7,44,42,7,12,6,2,36,5,1, + 14,13,5,36,3,4,13,8,41,42,8,14,4,251,203,19,2,1,7,8,1,3,20,1,2,8,3,24,23,4,8,2,1,19,2,7,6,2,19,2, + 3,6,4,23,24,3,8,1,3,23,21,3,1,18,1,4,22,2,2,9,4,26,24,5,8,2,2,22,4,16,3,21,2,2,8,4,25,26,4,9, + 2,252,187,19,4,7,8,4,19,3,2,8,5,22,22,4,7,2,3,19,3,1,8,7,4,19,3,2,7,4,22,22,5,8,2,92,20,4,1,16, + 1,3,19,3,2,7,4,23,22,5,7,2,3,19,3,1,8,7,3,19,2,2,8,5,22,22,5,8,2,1,28,19,2,1,16,1,3,19,1,3, + 8,4,23,22,5,8,3,1,19,3,1,8,7,2,19,2,1,8,5,22,23,4,8,1,111,19,2,2,16,1,3,20,1,2,8,4,23,23,4,8, + 2,1,19,2,7,6,2,19,2,3,6,4,22,23,3,6,3,247,21,3,7,9,1,3,22,1,4,8,5,26,25,6,8,4,2,20,2,1,9,7, + 3,21,3,2,8,5,24,25,4,8,2,91,22,3,1,18,1,4,22,2,2,8,3,26,24,5,8,2,2,22,3,1,16,2,21,1,3,8,5,25, + 26,4,9,2,174,37,2,2,41,35,3,3,254,183,38,2,3,39,37,1,1,252,38,2,2,41,35,3,3,1,96,35,5,1,14,15,1,6,36,3, + 5,13,7,42,41,8,13,5,3,36,4,2,14,13,5,35,4,4,14,8,43,44,7,14,4,252,85,21,3,1,18,1,4,21,3,2,9,5,25,24, + 5,8,2,3,21,4,16,3,21,2,2,8,4,25,26,4,9,2,254,81,23,4,1,18,1,3,21,2,2,8,3,26,25,4,8,2,2,21,2,1, + 16,4,23,1,2,9,6,24,26,4,9,2,4,48,23,4,1,18,1,3,21,2,2,8,3,26,25,4,8,2,2,21,2,1,16,3,22,1,3,8, + 6,24,25,5,9,2,252,69,37,5,2,14,16,3,5,37,3,5,13,7,43,41,8,12,6,2,36,4,2,15,12,4,36,3,3,14,8,42,43,8, + 15,3,3,137,1,38,69,5,7,67,38,86,2,42,44,3,3,41,45,4,2,41,45,3,3,42,44,254,18,2,37,38,2,2,37,38,158,102,147,145, + 208,208,145,147,102,85,32,51,72,104,102,101,101,102,104,72,50,30,1,217,112,24,117,19,94,232,81,24,16,28,70,115,165,163,230,230,163,165,115,75, + 26,15,22,81,232,71,253,104,33,57,15,15,57,33,4,17,11,3,21,22,3,12,15,2,33,55,16,16,55,33,2,15,12,3,22,21,3,11,17,1, + 209,31,52,13,13,52,31,3,16,7,5,20,19,3,9,14,2,30,50,15,15,50,30,2,14,9,3,19,20,5,7,16,75,31,52,14,14,52,31,3, + 16,7,3,21,19,4,9,14,2,30,50,14,14,50,30,2,14,9,4,19,21,3,7,16,1,27,30,50,14,14,50,30,2,14,9,4,19,20,3,9, + 15,3,29,49,14,14,49,29,3,15,9,3,20,19,4,9,14,2,154,16,28,6,6,28,16,1,7,6,2,9,11,2,4,8,2,14,25,7,7,25, + 14,2,8,4,2,11,9,2,6,7,254,227,17,29,10,10,29,17,3,10,5,1,13,10,3,6,7,1,17,30,7,7,30,17,1,7,6,3,10,13, + 1,5,10,168,16,28,7,7,28,16,2,7,6,2,9,11,2,5,8,2,15,26,8,8,26,15,2,8,5,2,11,9,2,6,7,1,24,16,28,6, + 6,28,16,2,8,4,3,10,10,2,5,7,1,15,25,8,8,25,15,1,7,5,2,10,10,3,4,8,24,15,27,7,7,27,15,2,8,5,1,10, + 11,1,6,7,1,16,27,8,8,27,16,1,7,6,1,11,10,1,6,7,161,15,27,7,7,27,15,1,7,4,1,12,10,1,12,1,15,27,7,7, + 27,15,1,12,1,10,12,1,4,7,55,18,31,7,7,31,18,1,8,5,2,12,12,2,5,8,1,18,29,10,10,29,18,1,8,5,2,12,12,2, + 5,8,217,18,31,7,7,31,18,1,8,5,2,11,12,2,5,10,3,16,28,9,9,28,16,3,10,5,2,12,11,2,6,7,250,224,2,37,38,2, + 2,37,38,226,2,37,39,2,3,37,38,2,2,37,39,2,3,37,38,1,129,29,50,14,14,50,29,3,15,9,3,19,20,3,10,14,4,27,47,15, + 15,47,27,4,14,10,3,20,19,3,9,15,2,103,18,30,8,8,30,18,1,10,4,2,11,12,2,6,8,2,17,29,9,9,29,17,2,8,6,2, + 12,11,2,4,10,251,18,31,7,7,31,18,1,8,5,3,11,12,2,5,9,1,18,28,10,10,28,18,1,9,5,2,12,11,3,5,8,1,130,17, + 30,8,8,30,17,2,8,7,1,11,12,2,5,9,1,17,28,9,9,28,17,1,9,5,2,12,11,1,7,8,253,127,31,52,14,14,52,31,3,16, + 7,4,20,19,3,10,14,3,29,50,14,14,50,29,3,14,10,3,19,20,4,7,16,0,0,15,0,131,0,0,6,169,7,11,0,23,0,45,0,62, + 0,79,0,96,0,113,0,130,0,147,0,164,0,181,0,198,0,215,0,232,0,249,1,10,0,0,1,22,21,20,7,6,15,1,6,43,1,38,39,38, + 53,52,63,2,54,51,50,51,22,5,6,21,20,23,22,31,1,22,51,50,63,1,54,53,52,47,1,38,35,34,7,19,50,23,22,29,1,20,7,6, + 35,34,47,1,53,52,55,54,19,50,23,22,29,1,20,7,6,35,34,47,1,53,52,55,54,19,50,23,22,29,1,20,7,6,35,34,47,1,53,52, + 55,54,19,50,23,22,29,1,20,7,6,35,34,47,1,53,52,55,54,19,50,23,22,29,1,20,7,6,35,34,47,1,53,52,55,54,3,50,23,22, + 29,1,20,7,6,35,34,47,1,53,52,55,54,1,50,23,22,29,1,20,7,6,35,34,47,1,53,52,55,54,55,50,23,22,29,1,20,7,6,35, + 34,47,1,53,52,55,54,19,50,23,22,29,1,20,7,6,35,34,47,1,53,52,55,54,1,50,23,22,29,1,20,7,6,35,34,47,1,53,52,55, + 54,37,50,23,22,29,1,20,7,6,35,34,47,1,53,52,55,54,37,50,23,22,29,1,20,7,6,35,34,47,1,53,52,55,54,37,50,23,22,29, + 1,20,7,6,35,34,47,1,53,52,55,54,2,68,46,26,20,50,21,96,123,22,52,38,47,60,41,12,101,136,4,3,62,254,250,79,9,5,14,14, + 30,44,52,72,51,82,4,32,32,48,55,75,247,29,15,7,26,11,13,36,13,1,26,13,168,29,15,7,26,11,13,36,13,1,26,13,138,28,15,7, + 26,10,14,35,14,1,26,13,155,28,15,7,26,10,14,35,14,1,26,13,3,28,15,7,26,10,14,35,14,1,26,13,189,29,15,7,26,11,13,36, + 13,1,26,13,1,138,28,15,7,26,10,14,35,14,1,26,13,194,29,15,7,26,11,13,36,13,1,26,13,194,29,15,7,26,11,13,36,13,1,26, + 13,253,85,29,15,7,26,11,13,36,13,1,26,13,1,18,28,15,7,26,10,14,35,14,1,26,13,1,34,29,15,7,26,11,13,36,13,1,26,13, + 1,3,28,15,7,26,10,14,35,14,1,26,13,2,32,55,81,61,75,71,60,26,115,7,45,56,80,90,121,57,14,122,12,128,95,101,34,34,22,16, + 18,35,47,50,100,116,26,27,48,38,50,1,106,31,12,15,6,31,18,7,44,14,3,31,20,8,1,58,30,12,15,7,30,19,8,46,12,5,30,20, + 8,1,52,31,12,14,7,30,20,7,46,12,5,30,20,8,1,61,31,12,15,6,31,18,7,44,13,4,31,20,8,253,2,31,12,15,6,31,18,7, + 44,14,3,32,19,8,254,252,31,12,14,6,32,18,7,45,13,4,31,19,8,2,7,30,12,15,7,30,19,7,45,12,5,30,21,7,250,30,12,15, + 7,30,19,7,45,12,5,30,21,7,1,4,32,12,14,6,31,18,8,45,13,4,31,19,9,251,12,30,12,15,7,30,19,8,46,12,5,30,20,8, + 211,30,12,14,7,30,20,7,46,12,5,30,20,7,231,31,12,14,6,32,18,7,44,14,3,32,19,8,202,31,12,14,6,32,18,7,45,13,3,32, + 19,8,0,0,0,1,0,133,255,247,6,167,5,201,0,9,0,0,19,33,27,1,33,1,19,9,1,19,133,2,87,186,187,2,86,254,28,186,254,25, + 254,26,185,3,144,2,57,253,199,254,159,253,200,1,96,254,160,2,56,0,0,2,0,133,255,247,6,167,5,201,0,9,0,19,0,0,19,33,27,1, + 33,1,19,9,1,19,55,3,9,1,3,1,33,11,1,33,133,2,87,186,187,2,86,254,28,186,254,25,254,26,185,68,140,1,117,1,128,152,1,143, + 254,26,145,142,254,24,3,144,2,57,253,199,254,159,253,200,1,96,254,160,2,56,21,254,78,1,12,254,230,1,194,1,24,1,183,254,73,0,0,0, + 0,1,0,170,0,4,3,235,5,213,0,17,0,0,1,22,23,20,7,9,1,55,19,37,55,1,38,53,52,55,1,54,3,176,57,2,9,253,125,1, + 238,86,38,254,55,224,253,221,19,65,2,147,11,5,213,2,54,36,12,253,133,253,244,230,254,56,39,94,2,52,23,23,27,63,2,134,10,0,0,0, + 0,1,0,170,0,0,6,129,5,217,0,25,0,0,19,33,50,21,20,7,9,1,55,19,37,55,1,38,53,52,55,1,33,17,6,7,38,39,17,54, + 237,5,73,64,27,253,193,1,231,89,37,254,49,231,253,239,15,52,1,229,251,168,1,72,70,1,1,5,217,83,34,27,253,197,254,27,213,254,61,34, + 108,2,22,16,45,28,50,1,223,250,252,68,1,1,67,5,91,57,0,0,0,3,0,170,0,0,6,130,5,216,0,13,0,25,0,38,0,0,1,16, + 0,33,32,0,17,52,18,36,51,50,4,18,5,16,0,32,0,17,52,2,36,32,4,2,5,20,6,35,34,38,53,52,62,1,50,30,1,6,130,254, + 74,254,201,254,203,254,74,201,1,104,186,189,1,104,200,250,113,1,138,2,48,1,138,180,254,188,254,172,254,188,180,3,94,109,78,77,110,50,90,94, + 90,50,2,236,254,201,254,75,1,181,1,55,194,1,105,193,193,254,153,196,254,232,254,119,1,137,1,24,177,1,66,174,174,254,190,177,78,109,109,78, + 49,90,48,48,90,0,0,0,0,3,0,125,0,0,6,159,5,209,0,10,0,22,0,67,0,0,0,34,6,21,20,22,51,50,54,53,52,37,34,6, + 21,20,22,51,50,54,53,52,38,37,22,23,22,21,20,6,35,34,38,53,52,55,54,55,54,53,52,36,32,4,21,20,23,22,23,22,16,6,35,34, + 38,16,55,54,55,38,53,52,0,33,32,0,21,20,5,177,148,103,103,74,73,104,251,156,73,104,104,73,74,103,103,4,23,25,22,91,182,130,129,182, + 90,81,111,121,254,177,254,32,254,177,121,125,87,90,182,130,128,183,91,18,19,122,1,192,1,65,1,68,1,192,1,233,103,74,73,103,103,73,74,103, + 103,74,73,104,104,73,74,103,85,17,22,92,130,129,183,183,129,130,92,81,9,115,153,180,253,253,180,153,114,4,87,92,254,252,183,183,1,4,92,17, + 15,142,182,248,1,94,254,162,248,177,0,0,0,3,0,125,0,0,6,159,5,201,0,10,0,22,0,65,0,0,1,52,38,35,34,6,21,20,22,50, + 54,37,52,38,35,34,6,21,20,22,51,50,54,1,20,0,33,32,0,53,52,55,38,39,38,16,54,51,50,22,16,7,6,7,6,21,20,4,32,36, + 53,52,39,38,39,38,16,54,51,50,22,16,7,6,7,22,6,24,104,73,74,103,103,148,103,252,77,103,74,73,104,104,73,74,103,4,35,254,64,254, + 188,254,191,254,64,122,19,18,91,183,128,130,182,90,87,125,121,1,79,1,224,1,79,121,111,81,90,182,129,130,182,91,22,25,115,4,145,73,104,104, + 73,74,103,103,74,74,103,103,74,73,103,103,254,12,247,254,163,1,93,247,180,141,15,18,91,1,2,182,182,254,254,91,88,3,114,151,180,251,251,180, + 152,113,9,81,92,1,2,182,182,254,254,92,22,17,139,0,0,2,0,125,255,253,4,226,5,198,0,11,0,27,0,0,1,34,6,21,20,22,51,50, + 54,53,52,38,55,22,23,22,16,0,35,34,0,16,0,51,50,23,1,23,2,134,143,201,201,143,142,201,199,190,19,18,152,254,206,217,215,254,206,1, + 47,218,96,84,1,14,154,3,95,200,144,142,201,201,142,144,200,59,16,19,153,254,80,254,207,1,49,1,176,1,50,29,1,211,89,0,0,3,0,125, + 0,1,7,158,5,201,0,8,0,17,0,49,0,0,1,34,6,20,22,50,54,52,38,0,34,6,20,22,51,50,54,52,1,22,21,20,0,35,34,0, + 53,52,0,51,50,23,22,23,55,38,53,52,0,51,50,0,21,20,0,35,34,39,38,39,2,51,120,169,169,240,169,168,3,179,242,168,168,121,120,169, + 252,190,38,254,255,183,181,254,255,0,255,183,185,128,2,2,220,28,0,255,183,184,1,0,254,255,183,181,129,11,11,2,218,169,240,169,169,240,169,2, + 90,169,240,169,169,240,253,228,84,100,181,254,255,1,1,181,183,1,1,128,3,2,137,73,85,183,1,1,254,255,183,181,254,255,129,11,12,0,0,0, + 0,14,0,140,0,0,9,107,5,213,0,35,0,53,0,65,0,77,0,89,0,101,0,114,0,128,0,141,0,154,0,167,0,181,0,197,0,217,0,0, + 1,51,4,5,4,21,6,35,34,39,37,38,53,52,55,54,53,52,39,33,6,21,20,23,22,21,20,7,5,6,35,34,39,52,37,36,1,53,51,21, + 20,23,22,25,1,33,17,16,55,54,61,1,51,21,3,20,22,51,50,54,53,52,38,35,34,6,5,20,6,35,34,38,53,52,54,51,50,22,39,20, + 6,35,34,38,53,52,54,51,50,22,17,20,6,35,34,38,53,52,54,51,50,22,2,22,6,7,6,38,39,38,54,55,54,51,50,1,22,6,7,6, + 35,34,38,39,38,54,55,54,22,1,30,1,14,1,39,46,1,53,52,55,62,1,4,30,1,21,20,7,14,1,39,46,1,55,54,36,54,22,23,22, + 6,7,6,38,39,38,53,52,37,54,22,23,22,21,20,6,7,6,38,39,38,54,1,62,1,23,30,1,7,14,1,35,34,39,46,1,53,52,1,62, + 1,51,50,23,30,1,21,20,7,14,1,35,34,39,46,1,53,52,4,247,9,2,91,1,1,1,15,36,103,6,7,254,105,60,12,68,34,251,156,34, + 68,12,61,254,105,7,6,102,37,1,16,1,0,3,76,144,241,231,249,87,232,240,145,171,236,165,168,234,233,169,167,234,2,114,131,94,93,131,131,93, + 94,131,159,32,24,23,33,33,23,24,32,32,24,23,33,33,23,24,32,209,26,6,19,19,46,14,14,8,19,15,17,5,1,155,15,7,20,15,17,5, + 27,15,13,7,19,19,46,254,12,24,20,14,42,22,22,18,3,8,41,2,88,44,17,3,8,41,22,22,21,7,8,253,175,44,42,7,7,20,22,24, + 41,8,3,2,127,22,41,8,3,17,22,22,43,6,7,21,254,21,14,46,19,19,8,15,13,28,5,17,15,19,5,1,125,15,27,5,17,15,20,4, + 12,13,27,5,18,15,19,4,5,213,17,155,164,170,153,1,140,18,43,19,25,71,32,23,3,3,23,32,71,24,20,43,18,140,1,153,170,164,153,254, + 118,75,152,75,57,95,254,226,254,22,1,234,1,30,95,57,75,152,75,253,221,167,234,234,167,166,236,236,165,93,132,132,93,95,131,131,222,22,34,34, + 22,24,34,34,253,115,24,33,33,24,23,34,34,2,87,38,46,13,15,7,19,20,45,15,10,253,236,19,46,15,10,4,20,19,45,14,13,6,1,97, + 8,41,44,21,6,7,34,13,9,9,22,21,195,14,34,13,8,9,22,21,8,7,41,23,22,6,14,20,22,24,41,8,6,21,22,9,8,13,236,7, + 21,22,9,8,13,33,8,7,21,22,22,41,254,148,18,7,13,14,47,17,20,4,10,15,28,5,17,2,12,19,4,10,15,27,4,18,16,19,4,12, + 13,28,5,17,0,16,0,145,0,0,9,112,5,213,0,17,0,29,0,37,0,45,0,53,0,65,0,77,0,89,0,100,0,112,0,124,0,136,0,148, + 0,166,0,202,0,240,0,0,1,53,35,21,6,7,6,21,17,33,17,52,39,38,39,53,35,21,5,50,22,21,20,6,35,34,38,53,52,54,4,34, + 6,20,22,50,54,52,2,34,6,20,22,50,54,52,2,34,6,20,22,50,54,52,1,14,1,23,30,1,55,62,1,39,46,1,1,14,1,23,30,1, + 55,62,1,39,46,1,1,6,22,23,22,54,55,54,38,39,38,6,5,6,22,23,22,62,1,38,39,38,6,5,30,1,55,62,1,39,46,1,7,14, + 1,37,30,1,55,62,1,39,46,1,7,14,1,1,22,54,55,54,38,39,38,6,7,6,22,1,22,54,55,54,38,39,38,6,7,6,22,19,53,51, + 21,20,23,22,25,1,33,17,16,55,54,61,1,51,21,37,6,21,20,23,22,21,20,7,5,35,34,39,54,55,54,37,22,50,55,4,23,22,23,6, + 43,1,37,38,53,52,55,54,53,52,39,55,22,21,20,7,6,21,20,23,5,22,51,50,55,38,39,36,37,39,21,35,4,5,6,7,22,51,50,55, + 37,54,53,52,39,38,53,52,55,3,236,49,15,203,195,5,157,196,202,8,56,254,250,166,229,230,165,163,231,230,1,0,184,129,129,184,129,188,46,32, + 32,46,32,32,46,32,32,46,32,254,242,18,8,13,15,45,19,18,6,13,13,45,1,89,19,7,13,14,45,19,19,7,14,13,45,253,252,7,22,21, + 22,41,7,7,20,23,22,41,2,71,7,20,22,21,41,14,20,22,21,41,253,171,7,41,23,22,20,7,7,41,22,21,22,2,85,6,42,21,22,20, + 7,7,41,21,22,20,254,62,19,45,13,15,8,18,19,45,15,13,8,1,126,19,45,13,14,7,19,19,45,14,13,7,86,134,225,216,249,201,216,225, + 134,254,169,26,75,28,59,254,138,10,121,65,13,248,248,2,67,24,48,24,2,66,248,248,13,65,120,10,254,137,59,28,75,25,25,39,54,31,31,1, + 70,15,15,74,62,10,236,254,199,254,36,48,54,254,35,254,199,235,10,62,74,15,15,1,70,31,31,54,38,3,194,64,142,64,49,65,241,254,101,1, + 155,241,65,49,64,142,64,72,231,163,164,230,230,164,163,231,173,129,184,128,128,184,1,20,32,46,32,32,46,253,181,32,46,32,32,46,2,69,13,45, + 19,18,8,13,15,45,19,17,7,253,255,14,45,19,19,7,15,13,44,19,19,7,1,49,22,41,7,7,20,23,22,41,7,7,22,213,21,41,7,7, + 21,44,40,8,7,20,57,23,20,7,7,41,21,22,22,7,8,40,169,21,22,7,7,41,22,21,22,7,7,41,254,117,15,7,19,19,45,13,14,7, + 19,19,44,1,230,13,8,18,19,45,13,15,8,18,19,45,1,32,71,156,55,55,87,254,245,254,54,1,202,1,11,87,55,55,156,71,229,6,18,32, + 68,38,26,38,11,165,203,199,101,139,17,1,1,17,139,101,199,203,165,11,38,26,38,68,32,18,6,28,18,34,40,61,22,21,20,19,136,6,151,157, + 112,129,25,1,1,25,129,112,157,151,6,136,19,20,21,22,61,40,34,18,0,2,0,184,0,0,6,117,5,213,0,7,0,11,0,0,19,33,23,17, + 7,33,39,17,23,17,33,17,190,5,176,7,7,250,80,6,110,4,224,5,213,7,250,56,6,6,5,200,104,251,8,4,248,0,0,0,0,3,0,183, + 0,0,6,118,5,213,0,7,0,11,0,34,0,0,19,33,23,17,7,33,39,17,23,17,33,17,7,21,6,7,0,3,6,35,6,35,2,43,1,53, + 55,50,23,51,54,55,54,55,54,189,5,179,6,6,250,77,6,111,4,224,135,76,41,254,185,62,6,16,117,13,101,205,23,162,151,73,6,51,63,98, + 155,97,5,213,6,250,56,7,7,5,200,104,251,8,4,248,158,6,65,58,254,70,254,189,59,47,1,2,7,73,131,166,116,179,187,120,0,3,0,183, + 0,0,6,118,5,213,0,7,0,11,0,26,0,0,19,33,23,17,7,33,39,17,23,17,33,17,5,9,1,23,9,1,21,7,1,35,1,35,39,9, + 1,189,5,179,6,6,250,77,6,111,4,224,251,247,1,155,1,151,95,254,104,1,152,91,254,101,4,254,105,4,91,1,151,254,105,5,213,6,250,56, + 7,7,5,200,104,251,8,4,248,134,254,105,1,151,91,254,101,254,102,3,91,1,151,254,108,91,1,154,1,155,0,0,0,1,0,154,0,160,3,167, + 5,64,0,20,0,0,19,51,1,54,1,50,55,51,23,9,1,21,7,1,35,1,35,39,1,0,53,241,5,1,41,11,1,26,4,6,4,85,254,210, + 1,46,87,254,212,2,254,210,3,87,1,49,254,207,5,64,254,11,8,1,222,15,85,254,4,254,7,3,83,1,247,254,11,86,1,249,1,245,7,0, + 0,8,0,100,0,0,6,245,7,118,0,8,0,17,0,26,0,35,0,44,0,53,0,62,0,126,0,0,1,51,6,43,1,38,61,1,52,1,51,6, + 43,1,38,61,1,52,37,51,6,43,1,38,61,1,52,23,51,6,43,1,38,61,1,52,1,51,6,43,1,38,61,1,52,5,51,6,43,1,38,61, + 1,52,23,51,6,43,1,38,61,1,52,37,51,23,21,51,32,1,22,29,1,35,38,39,38,43,1,34,7,21,20,7,39,38,35,17,20,15,1,34, + 47,1,53,55,51,23,21,22,59,1,50,63,1,17,34,7,6,35,39,53,55,35,38,39,35,34,15,1,35,53,54,55,54,33,53,1,214,3,30,92, + 6,58,2,86,2,29,92,7,57,2,30,3,30,92,6,58,247,4,30,92,6,58,2,30,3,29,93,6,58,1,38,2,28,93,7,57,91,3,30,92, + 6,58,253,171,58,6,2,1,184,1,24,43,2,22,19,35,57,44,150,112,8,33,151,136,106,30,91,37,2,6,43,5,11,62,10,55,20,6,211,86, + 17,14,7,7,4,67,197,67,99,34,20,3,58,192,239,1,56,6,1,207,10,35,2,56,1,100,207,8,35,3,55,227,207,8,36,3,54,185,207,8, + 36,2,56,1,59,206,7,36,3,55,105,207,7,36,3,55,235,207,9,35,2,57,154,5,112,254,80,76,12,7,13,41,22,90,46,13,2,59,54,253, + 159,90,21,2,86,24,23,6,6,10,90,51,37,2,89,54,51,5,11,46,56,25,55,16,2,128,194,198,112,0,0,0,0,9,0,152,0,0,6,147, + 5,217,0,11,0,17,0,28,0,51,0,68,0,77,0,121,0,127,0,143,0,0,1,20,21,20,23,33,54,55,52,35,33,6,19,22,23,33,54,63, + 1,6,7,54,55,54,53,52,53,38,35,39,6,7,51,50,21,20,7,6,7,6,7,51,50,55,54,55,54,55,54,53,52,35,1,51,20,6,7,20, + 22,23,35,38,39,38,39,52,53,52,54,1,22,51,50,55,54,55,33,22,5,54,55,50,23,21,20,5,7,23,20,7,33,38,61,1,55,53,36,47, + 1,53,54,51,22,23,38,17,52,51,33,22,21,51,50,21,20,7,6,7,6,43,1,39,1,22,23,33,54,55,1,6,7,6,7,35,62,1,53,52, + 38,53,51,30,1,21,1,35,15,4,129,11,3,30,251,160,28,63,5,16,3,244,13,9,73,9,58,87,48,29,1,32,57,2,1,54,59,69,44,81, + 32,50,7,58,38,19,108,54,29,24,120,253,48,9,98,1,136,4,8,19,109,33,10,111,254,219,184,189,174,177,34,92,252,62,37,3,69,254,102,18, + 6,254,153,126,2,16,253,241,17,4,254,101,50,3,4,18,85,214,201,54,4,103,33,54,143,86,35,112,53,67,7,17,252,43,6,10,4,67,11,4, + 254,152,6,19,63,11,6,3,80,57,5,10,64,2,180,6,7,55,72,52,88,22,4,254,205,26,18,22,22,199,109,134,1,77,55,82,6,5,17,86, + 28,32,47,130,77,40,1,61,72,58,13,31,44,113,76,85,68,3,41,56,136,87,113,107,177,146,101,45,80,5,6,101,120,250,243,13,11,16,151,78, + 87,24,10,10,10,16,61,36,10,15,8,7,16,6,2,2,85,18,13,4,11,9,20,254,1,47,48,2,24,99,155,153,41,22,72,4,1,63,26,18, + 19,25,1,245,50,28,64,91,110,68,70,56,84,36,46,74,63,0,0,0,0,2,0,172,0,1,6,129,5,217,0,7,0,12,0,0,9,1,19,7, + 33,39,19,9,1,3,33,3,1,3,158,2,143,84,3,250,52,6,88,2,151,253,205,75,4,243,71,253,207,5,217,254,119,251,180,3,6,4,76,1, + 134,254,53,252,95,3,161,1,75,0,0,0,0,1,0,172,0,0,6,129,5,208,0,9,0,0,9,1,19,23,7,33,39,19,0,55,3,155,2,140, + 87,3,3,250,52,6,90,2,126,20,5,208,254,119,251,191,3,3,6,4,68,1,128,6,0,1,0,159,0,0,6,141,5,212,0,83,0,0,1,3, + 38,53,52,55,54,51,50,22,50,54,51,50,23,22,21,20,7,3,37,54,51,50,23,22,23,22,21,20,7,14,1,21,20,22,21,20,7,6,7,6, + 35,34,39,38,39,3,22,21,16,7,35,54,17,52,39,3,6,7,6,35,34,39,38,39,38,53,52,54,53,52,38,39,38,53,52,55,54,55,54,51, + 50,23,3,120,216,74,88,37,38,88,65,44,66,58,92,56,13,91,199,1,69,77,72,57,53,35,35,70,7,18,108,37,12,11,33,57,64,33,35,106, + 76,207,9,112,95,146,7,206,77,105,35,34,63,56,34,12,11,37,108,18,7,70,35,35,53,56,72,78,3,8,1,52,104,111,107,64,22,82,82,114, + 42,37,127,116,254,235,101,28,17,12,27,66,66,21,21,57,39,29,17,55,42,31,36,37,27,41,12,34,102,1,22,88,83,254,221,231,242,1,53,69, + 73,254,234,102,34,12,41,27,37,35,30,44,55,17,29,39,57,21,20,67,66,27,12,17,28,0,0,0,0,2,0,171,1,30,6,129,4,152,0,62, + 0,69,0,0,1,22,23,20,7,6,7,4,19,51,23,7,35,6,7,34,39,52,51,22,51,50,51,50,55,36,39,35,34,7,22,21,6,5,36,3, + 52,55,22,23,21,7,20,23,50,55,18,37,22,29,1,20,7,54,55,50,53,54,55,54,53,52,38,3,6,21,20,23,53,38,5,167,111,20,74,176, + 20,1,0,55,27,19,46,3,17,152,98,25,20,16,57,2,1,77,13,254,250,7,3,131,68,134,9,254,178,253,153,44,66,51,8,13,113,89,13,53, + 1,42,196,42,93,100,61,72,78,57,37,135,1,229,32,4,152,5,115,87,25,36,44,27,254,240,74,13,174,9,93,84,45,77,77,241,109,64,101,246, + 16,3,1,100,58,9,3,44,23,39,90,12,77,1,222,20,6,160,8,39,99,77,20,38,84,41,36,36,13,60,254,165,8,9,132,73,3,181,0,0, + 0,1,0,172,0,231,6,129,4,141,0,50,0,0,37,33,34,38,53,52,54,55,54,55,51,55,35,38,39,38,53,52,62,1,59,1,55,33,34,38, + 53,52,54,55,54,55,33,55,33,34,38,53,52,62,1,51,33,54,55,54,51,33,50,22,21,6,54,253,80,43,61,28,25,18,19,54,4,136,47,25, + 31,29,50,26,180,1,254,255,68,62,29,25,20,22,1,82,2,253,3,43,62,29,50,26,3,44,8,16,31,43,1,118,42,62,231,62,43,27,50,13, + 10,3,12,2,26,30,44,27,50,28,10,61,44,26,50,14,11,2,10,61,44,27,51,26,22,17,31,62,44,0,0,0,0,1,0,172,0,231,6,129, + 4,141,0,50,0,0,19,52,54,51,33,50,23,22,23,33,50,30,1,21,20,6,35,33,23,33,22,23,30,1,21,20,6,35,33,23,51,50,30,1, + 21,20,7,6,7,35,23,51,22,23,30,1,21,20,6,35,33,172,62,42,1,118,43,30,17,8,3,44,26,49,30,62,43,253,3,2,1,82,22,20, + 25,28,61,68,254,255,1,179,27,50,28,30,25,48,135,4,54,19,18,24,29,61,43,253,80,4,35,44,62,31,17,22,26,51,27,44,61,10,2,11, + 14,50,26,44,61,10,28,50,27,44,30,26,2,12,3,10,13,50,27,43,62,0,0,0,0,2,0,178,0,212,6,123,4,141,0,34,0,68,0,0, + 37,19,52,38,35,33,34,7,33,48,35,34,20,51,33,7,33,34,21,20,51,33,7,35,34,21,20,59,1,7,35,34,21,20,51,7,38,39,54,55, + 51,55,35,38,39,54,55,51,55,33,34,39,54,55,33,55,33,38,39,54,51,33,54,55,33,50,22,21,3,6,8,73,48,33,254,159,54,23,252,217, + 4,79,83,2,255,13,254,158,83,83,1,58,9,221,83,83,174,19,62,83,83,28,93,1,1,93,74,4,171,93,1,1,93,228,2,254,198,93,1,1, + 93,1,104,4,253,4,92,1,1,92,3,44,32,66,1,118,42,62,75,241,3,21,37,51,57,146,76,75,73,79,75,72,76,75,73,29,1,104,103,1, + 14,1,104,103,1,19,104,103,1,15,1,104,103,69,2,63,45,252,179,0,0,2,0,147,0,0,4,76,5,202,0,33,0,68,0,0,55,5,50,54, + 53,17,52,39,17,54,35,34,21,17,39,17,52,35,34,21,17,39,53,52,35,34,29,1,39,53,52,35,34,21,39,54,55,22,23,21,23,53,54,55, + 22,23,21,23,17,52,55,22,23,17,23,17,54,55,22,21,17,22,23,17,20,6,35,37,19,177,3,21,36,52,58,2,74,73,76,76,72,79,75,72, + 76,75,73,29,1,104,103,1,14,1,104,103,1,18,105,103,1,15,1,104,103,68,2,62,45,252,178,1,115,74,49,32,1,98,54,22,3,39,83,83, + 253,2,13,1,99,82,82,254,196,9,223,83,83,174,18,63,83,83,28,92,1,1,92,75,4,172,92,1,1,92,228,3,1,59,92,1,1,92,254,150, + 4,2,253,93,1,1,93,252,212,33,65,254,138,42,62,75,2,155,0,0,0,2,0,177,0,211,6,123,4,141,0,33,0,67,0,0,37,50,53,52, + 43,1,39,51,50,53,52,43,1,39,33,50,53,52,35,33,39,33,50,52,43,1,33,38,35,33,34,6,21,19,7,3,52,54,51,33,22,23,33,50, + 23,6,7,33,23,33,22,23,6,35,33,23,51,22,23,6,7,35,23,51,22,23,6,7,3,193,83,83,63,18,174,83,83,223,9,1,60,82,82,254, + 157,13,2,254,83,79,4,252,217,22,54,254,158,32,49,74,40,75,62,42,1,118,65,33,3,44,93,1,1,93,253,3,4,1,106,92,1,1,92,254, + 197,3,228,92,1,1,92,172,4,75,92,1,1,92,241,73,75,76,72,75,79,73,75,76,146,57,51,37,252,235,30,3,78,45,63,2,69,103,104,1, + 15,1,103,104,19,1,103,104,1,14,1,103,105,1,0,0,0,2,0,147,255,249,4,76,5,194,0,33,0,67,0,0,19,20,51,50,61,1,55,21, + 20,51,50,61,1,55,17,20,51,50,53,17,55,17,20,51,50,39,17,54,53,17,52,38,35,5,39,37,50,22,21,17,6,7,17,20,7,38,39,17, + 7,17,6,7,38,53,17,7,21,6,7,38,39,53,7,21,6,7,38,39,177,73,75,76,72,75,79,72,76,76,73,74,2,58,52,36,252,235,30,3, + 78,45,62,2,68,103,104,1,15,1,103,105,18,1,103,104,1,14,1,103,104,1,2,179,83,83,61,20,174,83,83,221,9,254,198,83,83,1,98,13, + 253,1,83,83,3,39,23,54,1,97,33,48,74,41,75,62,42,254,138,66,32,252,212,92,1,1,92,2,252,4,254,152,93,1,1,93,1,58,2,228, + 93,1,1,93,171,4,74,93,1,1,93,0,0,29,0,125,0,0,6,175,5,216,0,79,0,128,0,139,0,149,0,164,0,179,0,186,0,193,0,214, + 0,220,0,227,0,231,0,235,0,239,0,243,0,247,0,251,0,255,1,3,1,7,1,11,1,26,1,38,1,42,1,46,1,50,1,54,1,58,1,62, + 0,0,1,32,23,22,29,1,20,7,23,21,20,7,51,54,53,54,59,1,50,21,22,29,1,6,35,39,6,7,21,23,55,22,21,20,7,20,43,1, + 34,47,1,6,35,34,39,6,21,6,43,1,34,53,38,53,52,55,23,55,53,37,7,34,39,53,52,55,54,59,1,50,31,1,53,39,55,38,53,54, + 37,54,1,20,23,51,53,38,53,54,59,1,23,7,23,21,7,21,20,23,22,29,1,23,51,55,52,55,54,53,39,55,53,39,55,22,29,1,7,23, + 54,61,1,52,39,38,43,1,32,7,6,5,22,21,20,7,6,43,1,34,39,52,33,22,23,6,35,34,39,52,53,52,19,51,36,51,23,54,53,38, + 53,38,35,6,7,6,21,37,6,35,6,21,23,55,22,23,53,52,39,38,53,38,5,23,21,7,38,53,52,55,22,21,20,7,39,53,1,22,51,54, + 55,38,53,52,55,6,7,6,43,1,38,39,38,39,22,21,20,55,22,23,51,53,38,5,21,50,63,1,34,7,5,21,23,53,37,21,55,53,5,21, + 23,53,51,21,55,39,7,21,55,39,7,21,51,53,51,21,51,53,7,21,23,53,23,21,51,53,7,21,51,53,5,39,7,21,22,21,22,51,50,55, + 54,55,38,53,6,37,7,22,21,20,23,50,63,1,38,35,7,37,7,23,53,7,21,23,53,39,21,23,53,23,21,55,53,55,21,55,53,55,21,55, + 53,3,167,1,49,146,58,101,6,25,6,160,44,36,8,63,70,26,63,89,248,62,234,70,95,76,65,6,51,69,190,76,172,175,72,209,51,44,14,56, + 76,89,76,228,254,208,108,69,7,70,4,39,33,48,60,133,25,12,107,35,1,7,103,254,154,70,7,31,11,13,13,19,13,32,19,153,69,101,89,127, + 196,33,26,33,13,31,25,31,6,71,224,128,112,38,254,173,105,20,1,113,46,2,56,90,6,78,36,1,207,203,6,37,96,66,67,235,6,1,24,24, + 102,32,70,7,20,28,52,249,252,34,17,14,52,46,95,63,241,101,203,25,2,101,14,51,38,123,69,40,49,254,245,45,214,217,43,1,28,36,28,75, + 116,56,191,12,7,45,22,16,20,25,6,9,1,135,15,3,25,13,24,254,150,18,1,36,26,254,214,25,204,27,2,71,23,3,115,32,20,25,165,25, + 115,25,77,32,253,249,114,7,69,6,14,19,70,155,34,19,186,3,15,18,227,50,21,12,62,6,31,95,253,163,3,29,25,25,112,25,204,27,15,25, + 20,26,5,216,193,108,84,69,114,102,94,6,53,46,62,61,57,124,53,34,24,45,7,108,41,18,100,13,18,44,38,62,118,118,93,99,99,99,25,87, + 112,67,45,43,13,13,100,18,149,7,56,13,27,66,112,112,62,6,87,93,111,216,230,97,29,254,120,118,117,80,112,56,50,19,44,142,68,168,12,94, + 30,56,44,24,13,26,94,66,36,75,187,156,18,43,20,11,34,49,174,24,82,91,43,210,101,42,241,59,208,13,50,11,13,155,155,87,10,81,151,155, + 3,2,80,254,18,130,5,8,10,73,38,63,9,103,112,19,235,111,37,25,11,5,18,119,13,94,25,83,65,36,13,7,159,50,12,57,105,45,53,110, + 48,8,50,162,254,134,199,14,191,10,12,65,105,38,174,73,22,89,94,80,93,68,19,155,37,136,92,63,63,92,79,87,67,13,44,5,44,5,49,10, + 47,15,50,5,49,49,8,47,6,61,2,59,6,55,55,55,55,61,51,5,50,14,49,56,7,49,49,123,5,5,19,57,48,56,104,78,29,37,30,98, + 92,68,104,44,15,41,104,63,18,5,204,49,6,55,73,50,6,49,33,49,7,50,24,50,6,50,4,50,5,51,10,50,7,49,0,0,0,1,0,172, + 0,0,6,129,5,216,0,38,0,0,1,50,23,22,21,20,7,1,7,20,23,37,50,23,21,20,35,5,34,39,38,61,1,52,55,0,55,54,53,52, + 39,35,5,34,39,53,52,55,51,4,66,143,113,52,124,253,108,11,97,3,110,78,9,105,252,161,161,108,27,139,2,109,20,11,98,11,252,181,57,11, + 98,14,5,216,141,77,79,138,98,253,160,62,89,26,209,97,3,89,198,174,53,56,24,138,108,2,55,27,27,22,80,32,204,80,30,64,12,0,0,0, + 0,6,0,170,0,0,6,130,5,216,0,17,0,36,0,48,0,60,0,70,0,88,0,0,1,32,1,22,21,16,5,6,43,1,32,1,38,61,1,16, + 1,54,5,38,35,32,3,6,21,16,5,22,51,32,19,54,61,1,2,37,38,1,35,34,39,19,22,59,1,50,55,19,6,1,6,29,1,33,53,16, + 37,54,55,19,6,37,22,23,33,38,39,38,39,19,22,1,50,23,22,21,20,7,6,43,1,34,39,38,61,1,52,55,54,3,137,1,127,1,8,114, + 254,195,194,212,32,254,132,254,250,99,1,82,185,2,30,166,167,254,212,235,126,1,23,178,223,1,85,234,89,1,254,173,5,254,212,28,168,141,209,48, + 56,8,50,46,212,141,254,224,95,254,87,1,31,18,19,210,7,2,134,95,3,254,86,1,31,34,43,210,125,254,73,82,56,25,68,41,46,7,80,57, + 20,72,39,5,216,254,141,175,214,254,176,253,147,1,131,174,178,28,1,83,1,2,132,172,93,254,217,177,194,254,196,226,138,1,90,150,166,15,1,89, + 224,4,251,72,89,1,111,31,29,254,146,88,3,40,73,95,5,16,1,32,219,13,12,254,146,4,143,145,176,59,46,50,25,1,108,79,254,207,80,37, + 46,71,54,31,82,37,38,5,73,56,28,0,0,6,0,100,0,0,6,200,5,216,0,15,0,29,0,41,0,78,0,108,0,141,0,0,1,62,1,53, + 52,39,54,55,22,21,20,6,7,38,53,52,3,38,35,34,6,7,38,39,54,51,50,22,23,6,1,20,22,23,6,7,46,1,53,52,55,22,1,6, + 35,34,39,38,39,7,6,7,6,35,34,39,22,51,50,54,55,54,53,52,39,55,22,51,50,55,23,6,21,20,23,30,1,51,50,1,22,23,22,21, + 20,7,51,22,23,22,17,21,46,1,35,6,7,39,54,53,52,39,53,54,55,54,53,52,38,1,38,53,52,55,54,59,1,39,38,39,18,37,14,1, + 21,20,23,22,31,1,6,21,20,23,7,38,43,1,34,35,34,6,4,56,68,72,1,36,36,2,121,85,10,14,63,76,7,91,62,33,21,87,116,7, + 133,74,25,254,40,91,70,3,16,104,111,2,42,3,193,109,166,46,50,164,92,1,61,119,92,96,124,128,85,80,55,184,58,47,27,69,34,32,31,29, + 64,26,55,63,160,69,80,254,166,162,93,16,69,4,105,120,195,13,210,112,183,130,70,1,64,182,84,53,24,251,134,4,121,109,180,18,2,44,2,17, + 1,20,177,34,38,101,191,1,66,2,64,113,166,14,3,4,128,178,1,145,40,139,65,12,12,14,5,19,18,95,195,37,24,25,14,2,13,35,4,43, + 22,28,66,5,55,33,254,234,78,143,32,38,34,46,203,79,16,15,6,253,178,83,6,36,170,2,88,69,47,75,40,65,97,93,100,76,80,42,24,23, + 39,70,67,97,89,114,61,5,160,67,217,52,52,109,111,10,67,130,254,255,10,157,182,10,147,40,7,7,70,25,75,31,156,87,89,26,142,252,70,24, + 25,149,161,118,2,98,137,1,14,112,104,180,39,85,68,152,39,82,29,60,9,10,36,136,147,0,0,0,0,23,0,100,255,252,4,246,5,209,0,7, + 0,29,0,35,0,43,0,63,0,86,0,109,0,131,0,162,0,173,0,178,0,183,0,188,0,193,0,201,0,208,0,213,0,218,0,223,0,229,0,237, + 0,244,1,35,0,0,1,6,21,20,51,50,55,38,23,34,7,6,35,34,39,55,39,54,51,50,23,22,23,6,7,38,39,36,53,52,1,6,7,35, + 38,55,3,22,51,50,53,52,39,38,19,21,6,35,34,39,53,38,53,54,55,22,23,6,21,20,4,7,35,38,39,21,39,53,36,39,54,55,22,23, + 6,21,20,4,21,20,7,39,54,53,52,39,54,3,21,39,53,36,39,54,55,22,23,6,21,20,23,6,4,23,6,7,39,54,53,52,7,36,39,54, + 55,22,23,6,21,20,4,23,6,7,38,39,54,53,52,39,21,39,19,21,39,53,36,53,54,55,51,50,23,7,23,6,35,34,39,38,35,34,21,20, + 4,23,6,7,38,39,36,39,54,1,20,30,1,51,38,52,55,34,14,1,5,22,23,55,38,39,22,23,55,38,39,22,23,55,38,39,22,7,55,38, + 39,20,21,20,7,23,53,52,39,6,7,23,54,53,52,5,23,54,55,6,7,23,54,55,6,7,23,54,55,6,31,1,53,52,55,6,23,55,38,53, + 52,53,6,21,63,1,38,39,6,21,20,23,21,39,53,38,35,34,7,32,39,54,37,22,23,22,51,53,38,39,46,1,53,52,62,1,50,30,1,21, + 20,6,7,6,7,51,20,35,21,54,55,4,23,6,33,38,35,34,3,87,4,11,12,25,10,79,7,8,66,55,25,22,91,108,35,62,11,13,204,13, + 2,141,70,157,1,18,254,136,95,31,15,1,86,104,27,13,10,5,34,239,11,26,34,3,174,4,64,46,44,61,1,54,2,15,26,116,74,254,232,4, + 2,128,52,86,174,1,182,112,49,69,2,1,81,74,254,147,3,5,113,77,105,206,1,10,2,118,2,5,150,104,163,253,254,243,5,1,112,72,73,163, + 2,21,3,4,174,33,58,175,189,74,74,74,254,129,13,205,8,61,52,109,92,23,24,56,66,8,7,42,2,210,6,7,174,63,111,1,7,2,12,254, + 118,18,33,18,15,15,17,34,18,1,186,116,44,27,96,151,115,38,42,95,126,80,17,49,62,129,53,1,61,39,103,22,61,62,50,52,60,43,253,19, + 27,45,115,91,44,42,38,115,100,20,49,17,80,84,16,62,51,74,64,61,22,39,104,60,52,50,1,229,74,45,72,35,42,254,245,89,84,1,95,23, + 89,2,1,3,2,20,23,23,41,42,41,23,22,20,3,3,1,1,88,24,1,94,84,89,254,245,42,36,68,4,32,8,4,9,10,20,63,2,24,5, + 23,25,62,2,4,125,62,32,17,9,20,42,48,252,116,34,60,72,35,3,166,11,8,5,9,9,252,45,56,26,56,41,30,54,49,24,13,6,21,21, + 41,54,102,56,173,90,13,92,43,72,68,32,19,9,26,39,42,62,74,46,14,11,17,29,5,5,23,1,153,140,13,137,38,98,53,22,20,7,15,29, + 2,2,52,67,85,69,32,27,39,26,39,164,33,96,57,30,12,7,33,44,40,77,84,69,21,15,11,30,42,33,29,133,12,2,4,127,8,125,21,113, + 126,4,61,24,23,5,24,2,47,43,41,102,91,20,16,15,28,52,31,2,102,18,32,17,33,66,34,17,32,60,64,48,38,57,21,99,63,34,86,43, + 128,71,19,111,77,147,75,8,126,97,17,15,132,63,11,12,125,98,137,57,25,101,92,13,80,38,48,64,17,107,34,63,99,42,137,19,71,128,69,137, + 8,6,74,142,88,141,11,63,132,15,17,101,125,4,25,57,137,13,13,92,171,206,6,194,52,12,165,92,6,54,30,1,24,1,2,10,39,22,21,39, + 22,22,39,21,22,39,10,2,1,1,22,30,54,6,92,165,13,0,0,0,0,2,0,170,0,0,5,78,5,217,0,8,0,40,0,0,1,38,39,6, + 7,22,23,54,53,3,38,39,54,55,22,23,21,20,7,51,50,55,17,38,43,2,17,20,23,33,54,53,17,43,1,34,7,17,22,51,3,121,2,121, + 121,2,8,115,123,197,119,12,3,202,202,3,131,163,181,174,169,179,6,164,99,254,166,99,168,6,179,169,174,181,4,222,177,2,2,177,142,113,88,159, + 254,241,101,184,243,2,2,243,14,183,88,99,254,247,54,254,12,181,174,174,181,1,244,54,1,9,99,0,0,3,0,170,255,253,4,136,5,217,0,3, + 0,32,0,44,0,0,1,21,51,53,39,53,51,21,51,21,35,21,51,5,21,33,17,23,21,39,3,35,3,39,53,23,17,33,53,33,53,35,53,19, + 51,17,33,53,33,53,35,21,33,21,33,2,45,202,183,171,125,125,9,1,148,254,99,143,136,1,177,1,134,134,254,107,1,150,118,164,71,1,12,254, + 244,71,254,245,1,11,5,64,60,60,51,102,102,162,88,1,175,253,232,139,156,133,254,238,1,188,134,155,130,1,113,176,88,162,252,207,1,187,71,99, + 99,71,0,0,0,2,0,170,0,0,5,155,7,74,0,7,0,32,0,0,1,17,51,50,54,16,38,35,1,17,33,50,22,21,20,6,43,1,17,55, + 51,9,1,35,3,17,35,17,3,35,9,1,51,3,40,209,116,127,127,116,254,138,1,118,206,212,212,206,209,218,220,254,103,1,174,219,239,166,254,219, + 1,183,254,110,220,6,167,253,216,144,1,8,144,252,4,4,159,223,216,217,222,254,205,237,254,66,254,40,1,6,254,250,1,23,254,233,1,225,1,181, + 0,1,0,170,0,0,3,178,5,215,0,31,0,0,1,51,23,21,51,23,21,7,35,21,33,23,21,7,33,17,7,35,39,17,33,39,53,55,33,53, + 35,39,53,55,51,53,1,215,171,6,165,5,5,165,1,36,6,6,254,220,6,171,6,254,222,5,5,1,34,163,5,5,163,5,215,5,155,6,148,6, + 113,6,152,5,252,130,5,5,3,126,5,152,6,113,6,148,6,155,0,0,0,1,0,170,255,253,6,130,5,213,0,43,0,0,1,33,23,21,7,35, + 17,33,53,55,51,23,17,7,35,39,53,33,17,51,23,21,7,33,39,53,55,51,17,33,21,7,35,39,17,55,51,23,21,33,17,35,39,53,2,187, + 1,182,6,6,160,2,59,6,106,6,6,106,6,253,197,160,6,6,254,74,6,6,170,253,196,6,115,6,6,115,6,2,60,170,6,5,213,6,119,6, + 253,209,161,6,6,254,73,6,6,158,253,200,6,106,6,6,106,6,2,56,158,6,6,1,183,6,6,161,2,47,6,119,0,2,0,178,0,0,6,123, + 5,216,0,27,0,44,0,0,1,51,50,23,35,39,32,3,6,21,16,5,22,51,37,21,6,7,6,43,1,32,3,38,53,16,37,54,1,51,50,23, + 51,21,7,22,21,39,7,35,53,55,39,53,51,3,156,21,221,210,6,239,254,169,209,94,1,86,136,156,1,1,160,138,81,54,28,254,145,238,132,1, + 134,172,2,127,3,6,62,209,168,65,177,169,3,66,172,213,5,216,146,54,254,202,158,185,254,146,214,71,50,6,107,26,11,1,62,192,233,1,170,238, + 89,254,51,201,3,126,187,17,124,124,3,201,126,3,0,0,0,4,0,170,0,0,6,131,5,217,0,22,0,79,0,98,0,115,0,0,1,22,51,50, + 55,22,51,50,55,53,51,23,21,20,15,1,34,39,6,35,34,39,52,23,51,22,23,50,21,3,51,36,17,52,39,53,22,17,21,16,7,6,7,21, + 22,59,1,21,6,43,1,34,7,39,35,34,39,53,51,50,55,53,39,38,39,38,53,16,63,1,21,6,21,16,5,53,3,53,55,50,37,21,6,7, + 6,21,20,23,21,35,38,39,38,53,16,37,54,51,52,37,22,23,22,29,1,20,7,6,7,52,55,54,61,1,16,37,2,234,27,64,46,33,37,44, + 66,21,5,2,69,30,44,35,33,45,81,16,178,2,50,34,8,10,2,1,36,110,222,224,76,47,80,165,26,117,72,129,22,69,68,144,56,136,60,121, + 86,88,125,36,99,199,33,117,1,38,18,3,35,255,0,95,65,134,146,2,158,93,38,1,12,121,35,2,123,132,130,176,166,89,31,54,92,254,214,5, + 217,75,48,48,68,7,40,5,59,27,4,44,44,101,34,135,64,11,5,252,32,228,1,112,194,207,3,215,254,235,36,254,241,221,66,22,5,40,5,33, + 99,99,28,5,42,3,64,114,74,177,177,1,1,230,31,5,192,226,254,167,245,2,3,38,22,169,42,6,69,99,204,239,233,214,2,74,233,107,103,1, + 12,205,70,4,2,30,112,183,216,47,212,182,81,6,7,82,175,191,2,1,109,244,0,0,0,3,0,170,0,0,5,5,5,217,0,91,0,102,0,110, + 0,0,1,50,23,15,1,22,23,22,21,20,7,23,35,21,50,55,54,53,52,39,55,51,22,17,16,3,38,35,34,21,20,23,22,21,20,21,6,35, + 6,35,34,39,38,39,21,20,21,20,23,20,35,34,53,54,61,1,6,21,6,43,1,34,39,52,54,53,52,35,34,7,2,17,52,55,51,23,6,21, + 20,23,22,23,53,35,53,38,53,52,55,47,1,54,3,20,23,51,54,53,52,39,6,7,6,37,6,21,20,23,54,53,52,2,216,66,82,19,15,127, + 51,56,205,1,120,121,142,135,125,21,5,234,149,120,79,56,120,30,13,42,12,9,44,6,59,94,80,104,111,80,154,7,57,6,41,14,150,46,82,116, + 154,228,5,21,125,214,63,121,119,204,238,24,16,87,206,135,4,70,29,89,51,40,1,112,34,65,144,5,217,75,15,124,46,80,81,85,199,98,75,120, + 129,157,198,176,114,19,165,254,254,254,224,254,201,174,45,28,147,38,42,2,3,59,2,34,238,49,150,3,4,70,113,59,60,116,77,146,93,191,35,59, + 64,164,34,43,173,1,33,1,77,233,166,19,121,174,251,163,47,18,120,75,92,204,190,103,124,18,72,253,255,146,74,105,139,83,126,25,74,63,162,115, + 99,137,102,61,168,152,0,0,0,1,0,171,0,0,6,129,5,215,0,50,0,0,1,50,23,22,21,20,7,23,7,35,39,6,35,34,39,21,1,35, + 38,39,54,1,54,51,22,51,50,55,39,7,35,38,39,19,4,21,7,22,23,53,54,61,1,52,39,38,43,1,34,7,54,3,232,237,209,150,125,194, + 140,3,185,165,217,170,143,254,252,3,204,4,26,1,89,24,7,113,158,191,151,217,108,6,187,9,233,1,27,126,230,29,66,251,137,119,37,98,120,170, + 5,215,189,155,215,201,138,148,131,170,110,88,3,254,49,141,7,25,1,152,29,85,104,198,115,116,12,1,2,14,5,159,175,14,2,90,124,36,254,101, + 69,55,143,0,0,5,0,170,0,0,6,130,5,216,0,11,0,18,0,22,0,26,0,33,0,0,19,16,0,33,32,0,17,16,0,33,32,0,19,20, + 23,1,3,6,0,19,22,23,27,1,54,55,9,1,54,53,52,0,39,17,170,1,182,1,54,1,55,1,181,254,75,254,201,254,202,254,74,152,121,1, + 170,2,196,254,163,173,176,192,2,95,205,170,254,137,1,187,113,254,161,211,2,234,1,55,1,183,254,73,254,201,254,202,254,76,1,180,1,54,229,120, + 1,245,1,194,4,254,163,253,98,177,6,2,104,253,150,8,164,1,182,254,151,112,245,249,1,93,4,254,66,0,0,0,0,4,0,170,0,0,6,130, + 5,216,0,18,0,30,0,40,0,52,0,0,1,21,30,1,51,50,54,53,16,0,33,32,0,3,62,1,51,50,22,5,20,6,35,34,38,53,52,54, + 51,50,22,5,52,38,34,6,21,20,22,50,54,37,16,0,33,32,0,17,16,0,33,32,0,3,150,10,197,144,146,201,254,98,254,228,254,222,254,123, + 20,24,177,149,143,198,1,202,61,38,42,60,60,42,40,59,253,69,59,82,58,58,82,59,3,229,254,75,254,201,254,202,254,74,1,182,1,54,1,55, + 1,181,2,248,26,142,193,207,154,1,22,1,152,254,123,254,201,172,178,192,158,41,58,58,41,42,60,60,42,42,60,60,42,41,58,60,39,254,202,254, + 76,1,180,1,54,1,55,1,183,254,73,0,255,255,0,170,0,0,6,130,5,213,18,38,15,92,0,0,16,39,15,92,0,0,2,134,16,7,15,92, + 0,0,5,13,255,255,0,170,0,0,6,131,5,212,18,38,15,92,0,0,16,39,15,92,0,1,2,133,16,7,15,93,0,0,5,12,255,255,0,170, + 0,0,6,130,5,213,18,38,15,92,0,0,16,39,15,93,0,0,2,133,16,7,15,92,0,0,5,13,255,255,0,170,0,0,6,130,5,213,18,38, + 15,92,0,0,16,39,15,93,0,0,2,133,16,7,15,93,0,0,5,13,255,255,0,170,0,0,6,130,5,213,18,38,15,93,0,0,16,39,15,92, + 0,0,2,133,16,7,15,92,0,0,5,13,255,255,0,170,0,0,6,130,5,213,18,38,15,93,0,0,16,39,15,92,0,0,2,133,16,7,15,93, + 0,0,5,13,255,255,0,170,0,0,6,130,5,213,18,38,15,93,0,0,16,39,15,93,0,0,2,133,16,7,15,92,0,0,5,13,255,255,0,170, + 0,0,6,130,5,213,18,38,15,93,0,0,16,39,15,93,0,0,2,133,16,7,15,93,0,0,5,13,0,10,0,135,255,234,6,165,5,225,0,12, + 0,64,0,70,0,76,0,82,0,88,0,94,0,100,0,106,0,112,0,0,0,20,23,22,51,50,54,52,39,38,35,34,7,5,38,52,55,51,54,55, + 39,54,55,23,54,55,53,54,50,23,21,22,23,55,22,23,7,22,23,51,22,20,7,35,6,7,23,6,7,39,6,7,21,6,35,39,53,38,39,7, + 38,39,55,38,39,1,54,55,3,6,7,5,22,23,55,38,39,1,54,55,39,6,7,37,22,23,37,38,39,1,38,39,5,22,23,37,6,7,23,54, + 55,5,6,7,19,54,55,37,38,39,7,22,23,2,244,48,47,67,66,94,48,47,65,67,47,253,127,28,28,112,27,107,84,15,99,82,124,194,39,78, + 40,182,137,79,102,17,85,105,28,112,28,28,112,20,113,85,17,102,79,138,182,39,39,78,181,138,81,97,17,81,104,27,1,251,33,36,12,142,98,1, + 128,41,29,183,100,140,254,175,8,22,203,76,23,2,247,24,6,1,18,19,81,253,107,20,10,254,240,22,75,2,180,8,22,204,82,17,254,116,33,37, + 12,141,99,254,127,29,39,184,100,141,3,38,132,47,47,94,132,48,48,48,195,39,78,39,183,124,80,95,16,80,102,30,112,28,28,112,22,111,81,15, + 96,81,121,185,39,78,39,176,131,80,92,11,81,103,29,112,28,28,112,23,109,81,11,92,80,121,186,1,44,19,10,1,13,22,77,170,10,19,198,78, + 21,254,62,38,26,171,96,130,55,30,34,10,127,98,254,75,30,42,17,140,86,244,38,34,172,103,123,137,18,11,254,240,30,77,165,9,20,194,77,30, + 0,5,0,170,255,106,7,173,6,110,0,10,0,21,0,33,0,45,0,61,0,0,1,52,54,51,50,22,20,6,35,34,38,37,52,54,50,22,21,20, + 6,35,34,38,5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,19,54,55,54,32,23,22,23,7,38,39,38, + 32,7,6,7,2,130,81,59,58,82,82,58,59,81,2,66,82,116,83,83,58,59,81,251,230,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253, + 242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,236,36,51,182,2,4,182,50,37,115,29,39,142,254,108,142,40,28,3,253,59,81, + 81,118,82,83,58,59,81,81,59,58,83,83,217,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1, + 192,254,64,253,37,56,51,181,181,51,56,72,44,39,142,141,40,43,0,0,0,5,0,170,255,106,7,173,6,110,0,10,0,21,0,33,0,45,0,61, + 0,0,1,52,54,51,50,22,20,6,35,34,38,37,52,54,50,22,21,20,6,35,34,38,5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33, + 32,0,17,16,0,33,32,0,19,55,22,23,22,32,55,54,55,23,6,7,6,32,39,38,2,130,81,59,58,82,82,58,59,81,2,66,82,116,83,83, + 58,59,81,251,230,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,236,115, + 28,40,142,1,148,142,39,29,115,37,50,182,253,252,182,51,3,253,59,81,81,118,82,83,58,59,81,81,59,58,83,83,217,1,117,2,15,253,241,254, + 139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,253,170,71,43,39,142,142,39,44,72,56,51,181,181,51,0,0, + 0,4,0,170,255,106,7,173,6,110,0,10,0,21,0,33,0,49,0,0,1,20,22,51,50,54,52,38,35,34,6,5,20,22,51,50,54,53,52,38, + 34,6,1,16,0,33,32,0,17,16,0,33,32,0,37,22,23,22,32,55,54,55,39,6,7,6,32,39,38,39,2,130,81,59,58,82,82,58,59,81, + 2,66,81,59,58,83,83,116,82,251,230,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,1,115,36,51,182,2,4,182,50,37,115,29,39, + 142,254,108,142,40,28,3,253,58,83,82,118,81,81,59,58,83,83,58,59,81,81,254,178,1,117,2,15,253,241,254,139,254,140,253,244,2,12,91,56, + 51,181,181,51,56,72,44,39,142,142,39,43,0,10,0,170,0,0,6,130,5,216,0,7,0,12,0,19,0,34,0,42,0,50,0,58,0,65,0,73, + 0,88,0,0,1,51,23,17,7,35,39,17,5,23,21,7,39,37,23,7,35,38,39,53,5,50,31,1,20,7,6,35,34,39,38,53,52,55,54,1, + 33,23,21,7,33,39,53,37,33,23,21,7,33,39,53,3,51,22,23,21,7,39,53,37,51,23,21,7,39,53,37,51,23,17,7,35,39,17,3,6, + 21,20,23,22,51,50,55,54,53,39,38,35,34,3,115,78,6,6,78,6,2,57,57,248,61,252,251,253,62,3,200,45,2,49,215,92,13,196,72,48, + 181,101,37,189,70,253,75,1,83,6,6,254,173,6,4,119,1,90,7,7,254,166,6,71,3,134,114,61,248,253,180,3,59,247,61,2,27,78,6,6, + 78,6,36,130,25,69,124,32,49,134,9,63,146,39,5,216,6,254,161,6,6,1,95,156,62,3,255,63,238,254,64,199,55,4,181,226,96,189,100,24, + 168,64,92,180,104,27,254,237,6,80,6,6,80,6,6,80,6,6,80,254,231,130,121,3,63,253,4,43,60,3,254,62,4,119,6,254,161,6,6,1, + 95,2,86,71,123,63,44,114,17,67,130,65,154,0,0,0,0,2,2,221,0,0,6,131,5,215,0,23,0,43,0,0,1,32,1,22,21,16,1,6, + 43,1,34,39,53,36,55,54,17,16,37,38,39,53,52,55,23,21,4,17,16,5,7,21,51,50,55,54,55,54,61,1,16,1,38,35,3,126,1,139, + 1,16,106,254,116,179,176,49,47,81,1,21,125,155,254,178,136,93,149,40,1,201,254,175,43,6,86,158,233,82,29,254,165,163,158,5,215,254,135,173, + 198,254,120,254,255,98,15,6,79,177,202,1,12,1,144,224,80,16,3,11,14,62,3,197,254,20,254,110,232,24,4,83,152,244,93,93,9,1,61,1, + 5,102,0,0,0,2,0,170,0,0,4,80,5,216,0,23,0,43,0,0,33,32,1,38,53,16,1,54,59,1,50,23,21,4,7,6,17,16,5,22, + 23,21,20,7,39,53,36,17,16,37,55,53,35,34,7,6,7,6,29,1,16,1,22,51,3,175,254,117,254,239,105,1,140,179,177,49,46,80,254,236, + 126,154,1,78,136,93,149,40,254,55,1,80,44,6,86,159,232,83,28,1,90,164,158,1,121,173,198,1,136,1,1,99,15,7,79,177,203,254,245,254, + 112,225,79,16,4,10,14,62,3,197,1,237,1,145,232,24,3,83,150,245,92,94,9,254,194,254,252,102,0,2,0,175,255,48,4,58,5,219,0,49, + 0,62,0,0,1,22,23,22,21,20,7,6,7,21,55,21,7,23,35,39,35,53,51,39,38,39,38,53,52,55,54,55,38,39,38,61,1,51,21,20, + 23,22,23,51,54,55,54,61,1,51,21,20,7,6,5,35,6,7,6,16,22,51,50,54,16,39,38,3,105,40,36,133,132,108,143,216,220,1,129,1, + 202,202,2,147,109,133,133,36,40,40,36,133,142,91,85,117,38,116,85,91,142,133,36,254,247,38,117,85,91,183,130,127,183,91,85,4,86,26,36,131, + 189,188,124,100,14,209,2,100,1,202,203,98,209,13,101,124,188,189,131,36,26,25,37,131,188,8,10,130,90,83,7,7,83,90,130,10,8,188,131,37, + 95,6,84,89,254,252,170,170,1,4,89,84,0,2,0,175,254,255,5,45,5,218,0,11,0,35,0,0,1,34,6,21,20,22,51,50,54,53,52,38, + 1,38,53,52,0,51,50,0,16,7,6,7,17,33,21,33,17,35,17,33,53,33,17,38,2,238,164,231,231,164,161,234,234,253,201,169,1,80,239,236, + 1,83,169,136,180,1,16,254,240,180,254,240,1,16,181,5,39,228,164,163,216,216,163,164,228,252,237,157,238,239,1,76,254,180,254,34,156,126,18,254, + 248,124,254,255,1,1,124,1,9,17,0,0,0,2,0,175,255,227,5,45,6,190,0,11,0,35,0,0,37,50,54,53,52,38,35,34,6,21,20,22, + 1,22,21,20,0,35,34,0,16,55,54,55,17,33,53,33,17,51,17,33,21,33,17,22,2,238,164,231,231,164,161,234,234,2,55,169,254,176,239,236, + 254,173,169,136,180,254,241,1,15,180,1,16,254,240,181,150,228,164,163,216,216,163,164,228,3,19,157,238,239,254,180,1,76,1,222,156,126,18,1,8, + 124,1,1,254,255,124,254,247,17,0,0,0,0,2,0,162,255,227,6,165,5,195,0,9,0,30,0,0,1,34,6,16,22,51,50,54,16,38,19,6, + 35,34,0,16,0,23,22,23,1,33,55,33,17,7,17,1,22,21,20,2,225,164,231,231,164,161,234,234,251,168,244,235,254,172,1,89,230,228,112,1, + 105,254,141,140,1,238,143,254,154,112,3,150,228,254,184,216,216,1,72,228,252,241,164,1,61,1,220,1,85,9,8,103,1,92,142,254,20,143,1,117, + 254,164,146,193,232,0,0,0,0,1,1,83,0,0,5,215,5,216,0,27,0,0,1,53,50,54,52,38,35,34,6,29,1,35,52,0,51,50,0,21, + 20,7,51,17,51,17,35,17,33,53,3,13,122,170,169,123,121,171,150,1,2,184,187,1,2,109,227,151,151,252,19,2,19,1,171,242,171,171,121,2, + 185,1,4,254,252,185,168,123,3,197,250,40,1,124,151,0,0,1,1,192,0,0,5,106,5,216,0,31,0,0,1,35,53,51,53,51,21,51,21,35, + 17,54,51,50,18,21,20,6,29,1,35,52,54,53,52,38,35,34,6,21,17,35,2,42,106,106,152,178,178,111,152,178,239,140,151,141,155,111,110,154, + 152,4,141,151,180,180,151,254,125,109,254,254,187,90,229,121,2,132,238,72,123,169,170,122,254,70,0,0,0,2,0,248,0,0,6,50,5,216,0,10, + 0,49,0,0,0,34,6,21,20,22,51,50,54,53,52,39,22,23,22,20,6,35,34,38,52,55,54,55,17,33,17,33,53,51,17,35,53,33,17,33, + 17,51,17,33,17,33,21,35,17,51,21,33,17,33,3,205,112,79,79,56,55,79,58,61,48,76,152,109,107,153,76,47,62,254,224,254,206,155,155,1, + 50,1,32,151,1,32,1,49,153,153,254,207,254,224,1,140,79,55,57,78,78,57,55,194,18,48,76,216,153,153,216,76,49,17,1,140,254,75,151,2, + 211,152,254,74,1,182,254,74,1,182,152,253,45,151,1,181,0,1,1,4,0,0,6,39,5,216,0,60,0,0,37,21,35,53,35,53,51,53,38,39, + 38,39,53,7,39,55,51,23,21,39,21,51,21,35,22,23,22,23,17,7,39,55,51,23,21,39,17,54,55,54,61,1,51,53,7,39,55,51,23,21, + 39,21,51,21,6,7,6,7,21,51,21,3,226,151,176,176,165,122,150,1,144,1,145,152,144,144,2,2,1,104,78,103,145,1,146,151,145,145,101,77, + 106,1,144,1,145,152,144,144,1,1,150,122,165,175,187,187,187,151,139,22,122,150,215,84,142,140,153,153,140,142,84,2,151,104,79,20,2,202,141,139, + 154,154,139,141,253,55,20,78,106,150,1,89,142,140,153,153,140,142,89,4,211,150,121,23,139,151,0,0,0,2,1,236,0,0,5,63,5,216,0,18, + 0,29,0,0,1,33,32,23,22,21,16,7,6,35,33,17,33,23,21,7,33,39,17,23,17,33,50,55,54,55,52,39,38,35,1,244,1,153,1,46, + 100,32,251,59,54,254,170,2,122,8,8,252,253,8,145,1,70,130,72,16,8,162,37,81,5,216,208,77,95,254,246,92,17,253,173,8,130,8,8,5, + 199,131,254,36,130,26,80,164,60,16,0,0,0,1,0,93,0,0,6,206,5,218,0,36,0,0,33,16,0,35,34,6,21,20,23,35,38,53,52,54, + 51,32,19,22,23,54,55,18,33,50,22,21,20,7,35,54,53,52,38,35,34,0,17,3,86,254,226,169,129,34,84,134,93,163,146,1,116,131,8,5, + 4,8,132,1,115,147,162,93,134,85,34,130,168,254,226,2,88,3,5,197,34,128,128,132,161,132,187,252,251,49,40,40,49,3,5,187,132,161,132,128, + 129,34,196,252,251,253,168,0,0,2,0,183,0,0,6,117,5,216,0,8,0,46,0,0,1,34,6,16,22,32,54,16,38,39,54,55,62,2,51,21, + 34,2,7,6,7,22,23,22,21,20,0,35,34,0,53,52,55,54,55,38,39,38,2,35,53,50,30,1,23,22,3,149,147,206,206,1,38,207,205,149, + 131,76,86,97,161,185,123,167,131,21,23,46,43,146,254,217,211,208,254,216,148,41,48,24,21,129,171,122,185,186,72,85,77,3,92,207,254,218,206,206, + 1,38,207,150,5,61,66,180,174,108,254,200,108,19,15,30,41,149,210,209,254,217,1,39,209,210,149,42,30,14,19,108,1,56,108,174,180,66,61,0, + 0,2,0,192,0,0,6,106,5,218,0,19,0,27,0,0,1,38,39,53,4,32,37,21,6,7,17,22,23,21,36,32,5,53,54,63,1,54,51,23, + 17,6,35,39,2,18,168,170,1,91,2,248,1,87,176,166,166,176,254,169,253,8,254,165,170,168,152,116,117,233,116,117,233,4,252,22,52,148,90,90, + 151,47,24,251,226,23,47,152,91,91,148,53,21,12,13,13,4,7,13,13,0,4,0,231,0,64,6,69,5,111,0,8,0,29,0,38,0,60,0,0, + 0,34,6,20,22,51,50,54,52,1,44,1,39,53,22,4,51,50,39,38,53,52,54,51,50,22,16,7,14,1,1,50,54,52,38,34,6,20,22,1, + 12,1,23,21,38,36,35,34,23,22,21,20,6,35,34,38,53,52,55,62,1,5,66,190,132,132,95,94,133,254,94,254,200,254,148,153,253,1,108,59, + 130,8,131,205,147,149,206,104,73,246,253,171,94,133,133,188,134,133,1,29,1,57,1,108,153,253,254,150,58,133,8,131,205,147,149,206,104,73,245,2, + 184,132,190,133,133,190,254,12,2,40,43,124,84,22,26,108,167,147,207,207,254,218,103,77,76,2,182,132,190,132,132,190,132,2,120,2,41,43,123,84, + 21,26,108,166,148,207,207,148,146,103,77,77,0,2,1,30,0,0,6,13,5,216,0,19,0,77,0,0,1,62,1,53,52,39,46,1,35,34,7,14, + 1,21,20,23,30,1,51,50,19,52,54,51,50,22,21,20,0,21,22,23,50,55,23,6,35,34,38,53,52,0,53,52,38,35,34,6,21,20,22,23, + 30,1,21,20,7,6,7,6,35,34,38,39,38,53,52,55,54,55,54,51,50,23,50,53,52,38,2,148,75,50,14,29,113,39,36,35,75,49,14,30, + 111,39,35,48,223,180,172,218,254,222,4,134,71,100,65,127,111,99,144,1,31,164,132,127,150,46,25,37,9,32,51,116,56,56,60,173,47,22,27,51, + 117,55,55,76,74,8,77,1,140,29,113,39,35,35,75,50,14,30,111,39,35,36,76,49,2,240,161,201,221,176,187,254,10,180,124,3,88,72,119,121, + 111,199,1,225,194,134,165,155,129,60,145,62,98,128,17,87,68,115,45,22,75,120,54,56,60,60,114,46,21,41,13,26,184,0,0,0,0,2,0,109, + 254,143,6,190,5,216,0,58,0,68,0,0,1,50,22,21,62,1,51,50,22,29,1,62,1,51,50,22,17,16,1,22,23,35,38,39,6,7,53,54, + 55,39,17,52,53,16,39,14,1,7,17,35,17,16,38,43,2,34,6,7,17,35,17,52,39,51,22,23,62,1,1,17,36,19,52,38,43,1,34,6, + 2,168,63,119,40,198,75,62,82,48,131,68,60,100,254,131,1,146,168,46,74,167,175,191,124,9,46,58,133,63,151,31,35,1,1,41,179,19,149,152, + 142,118,36,23,183,2,196,1,2,24,45,28,4,30,143,5,216,198,128,119,207,167,219,202,125,119,232,254,239,254,104,254,191,94,193,41,161,101,7,116, + 28,87,217,3,87,18,17,1,25,1,1,217,200,252,97,3,154,1,65,106,226,215,252,116,4,65,190,191,79,176,93,188,252,146,253,208,250,1,82,193, + 139,206,0,0,0,2,0,171,0,107,6,129,5,57,0,3,0,35,0,0,19,33,21,33,1,33,53,33,38,53,52,0,51,50,0,21,20,7,33,21, + 33,53,35,54,55,54,53,52,38,34,6,21,20,23,22,23,171,5,214,250,42,2,45,253,211,1,98,67,1,1,185,186,1,3,68,1,132,253,175,1, + 18,17,86,170,244,170,85,16,19,1,3,152,1,143,152,104,131,185,1,3,254,253,185,131,104,152,152,13,17,85,121,122,170,170,122,121,85,17,13,0, + 0,1,0,69,255,60,6,232,5,216,0,56,0,0,1,20,22,23,51,53,51,23,7,39,53,35,34,39,38,39,3,52,53,16,39,14,1,7,17,35, + 17,16,38,43,2,34,6,7,17,35,17,52,39,51,22,23,62,1,51,50,22,21,62,1,51,50,22,29,1,19,5,0,103,89,89,4,203,203,4,89, + 203,68,44,8,21,46,58,133,63,151,31,35,1,1,41,179,19,149,152,142,118,36,23,183,69,63,119,40,198,75,62,82,1,1,15,111,125,1,118,173, + 175,4,118,120,74,118,3,22,18,17,1,25,1,1,217,200,252,97,3,154,1,65,106,226,215,252,116,4,65,190,191,79,176,93,188,198,128,119,207,167, + 219,202,253,132,0,1,0,169,255,255,6,130,5,216,0,20,0,0,1,17,9,1,7,9,1,47,2,9,1,63,2,9,1,33,53,33,17,5,234,253, + 63,1,61,108,254,195,254,88,1,106,1,1,168,254,195,1,106,1,1,61,2,193,254,4,3,0,2,216,1,252,253,63,254,195,108,1,61,254,88,1, + 106,1,1,168,1,61,1,106,1,254,195,2,193,152,253,0,0,2,0,192,0,0,6,106,5,216,0,41,0,49,0,0,1,50,18,55,54,51,50,22, + 21,20,6,35,34,39,14,1,7,35,53,55,54,19,38,2,35,34,2,21,20,21,7,52,2,39,53,50,22,19,54,55,62,1,1,22,51,50,55,38, + 39,34,3,83,107,81,25,109,195,121,153,143,142,155,122,44,126,138,168,154,122,105,50,64,58,36,154,158,141,132,147,161,40,46,45,41,122,1,87,93, + 130,161,9,7,159,152,5,216,252,158,4,221,190,103,145,171,133,160,215,4,118,1,4,1,120,16,3,21,254,45,195,15,14,2,253,1,240,6,97,222, + 254,237,201,88,91,150,252,38,145,197,157,19,0,2,0,176,1,57,6,123,4,162,0,39,0,81,0,0,19,0,51,50,23,22,50,54,51,50,23,22, + 50,55,54,51,50,19,7,38,35,34,7,6,34,39,38,35,34,7,6,35,34,39,38,35,34,4,35,39,17,0,51,50,23,22,51,50,55,54,50,23, + 22,51,50,55,54,51,50,19,7,38,35,34,7,6,35,34,39,38,35,34,7,6,35,34,39,38,34,4,35,39,176,1,69,115,45,13,24,112,172,56, + 54,24,26,114,86,43,41,124,109,94,63,95,51,60,86,112,25,28,59,55,83,87,55,56,25,24,54,55,254,254,5,53,1,68,116,44,14,24,56,55, + 86,87,110,23,27,56,57,86,43,41,125,109,94,63,95,51,60,87,55,56,26,27,59,55,84,86,56,55,25,24,110,254,255,5,53,1,157,1,15,40, + 71,142,71,71,71,36,254,196,51,185,53,76,75,78,67,71,72,70,213,98,1,217,1,13,39,70,70,72,72,70,70,35,254,197,50,185,54,77,76,78, + 68,71,72,72,213,97,0,0,0,1,1,65,0,0,5,234,5,216,0,28,0,0,1,7,2,1,7,0,19,33,53,33,2,1,23,0,19,51,18,1, + 55,0,3,33,7,33,18,1,39,0,3,4,14,241,32,254,234,165,1,51,27,254,216,1,40,28,254,205,166,1,22,32,242,31,1,23,165,254,205,27, + 1,39,1,254,216,29,1,51,166,254,233,31,2,153,3,254,174,254,191,3,1,95,1,55,172,1,54,1,96,3,254,192,254,173,1,83,1,64,3,254, + 160,254,202,172,254,201,254,161,3,1,65,1,82,0,0,0,0,5,0,201,0,0,6,99,5,216,0,15,0,32,0,36,0,84,0,100,0,0,1,54, + 55,38,39,38,34,14,1,21,20,22,23,22,23,33,51,33,54,55,62,1,53,52,46,1,35,34,7,6,7,22,23,1,17,33,17,1,17,38,39,46, + 1,53,52,62,1,51,50,23,53,52,54,55,54,55,53,35,53,51,53,51,21,51,21,35,21,22,23,30,1,29,1,54,51,50,30,1,21,20,6,7, + 6,7,17,1,20,30,1,51,50,62,1,53,52,46,1,35,34,14,1,3,80,1,2,35,51,74,156,147,84,82,74,22,23,1,87,141,1,86,24,22, + 74,81,83,147,79,77,74,52,34,2,1,254,63,2,245,252,185,42,38,69,108,110,198,104,80,76,36,32,13,16,108,108,105,108,108,16,13,31,37,76, + 79,104,198,110,108,68,39,41,253,214,25,45,23,24,45,24,24,45,24,23,45,25,3,199,3,3,43,28,41,81,149,80,81,146,40,14,8,8,14,40, + 146,81,80,149,81,41,28,43,3,3,253,184,254,209,1,47,254,129,1,127,13,22,54,196,107,108,197,106,31,2,36,63,18,7,4,54,70,87,87,70, + 54,4,7,18,63,36,2,31,106,197,108,107,196,54,22,13,254,129,4,125,25,43,25,25,43,25,24,45,23,23,45,0,0,8,0,226,0,0,6,74, + 5,216,0,72,0,78,0,82,0,104,0,124,0,144,0,165,0,187,0,0,1,38,39,52,62,1,51,50,30,1,21,6,7,19,3,34,39,52,62,1, + 51,50,30,1,21,6,7,27,1,38,39,52,62,1,51,50,30,1,21,6,7,27,1,38,53,52,62,1,51,50,30,1,21,6,7,3,1,38,53,52, + 62,1,51,50,30,1,21,6,35,3,17,33,17,1,53,7,33,39,29,2,33,53,1,23,3,54,55,62,1,53,52,46,1,35,34,14,1,21,20,30, + 1,51,50,55,1,23,3,54,55,62,1,52,46,1,35,34,14,1,20,30,1,51,50,55,1,55,19,22,51,50,62,1,52,46,1,35,34,14,1,20, + 22,23,22,23,1,51,3,50,55,62,1,53,52,46,1,35,34,14,1,21,20,22,23,22,23,1,55,19,22,51,50,62,1,53,52,46,1,35,34,14, + 1,21,20,22,23,22,23,1,77,95,12,29,54,29,28,54,28,4,57,239,52,83,18,29,53,31,28,53,29,2,46,189,43,67,2,30,53,27,29,53, + 30,3,67,38,185,46,29,54,27,30,54,29,11,86,92,1,1,43,29,53,28,30,53,29,13,99,160,252,163,3,36,181,254,149,183,2,215,252,255,77, + 231,7,7,18,20,20,35,20,18,35,21,20,36,18,7,9,1,54,136,187,6,5,17,19,19,36,18,19,35,20,19,36,19,7,8,1,173,115,96,5, + 5,19,37,19,21,35,19,18,36,20,20,18,8,7,254,154,100,48,19,16,17,21,22,34,19,18,37,19,19,19,14,15,1,41,104,166,11,11,19,35, + 20,21,34,19,20,35,19,19,18,4,3,3,251,2,95,28,51,28,28,51,28,64,22,254,6,2,190,93,28,50,28,28,50,28,45,34,253,20,3,52, + 30,48,28,52,26,26,52,28,54,24,252,202,2,228,47,42,27,51,28,28,51,27,85,16,253,74,2,3,34,43,28,51,27,27,51,28,94,254,49,253, + 209,2,47,254,223,225,75,61,211,48,164,164,1,84,42,2,14,3,4,10,35,19,20,35,20,20,35,20,19,35,20,1,253,248,32,2,249,2,3,10, + 35,38,36,19,19,36,38,35,20,1,253,19,27,2,209,1,20,35,38,36,19,19,36,38,35,10,5,2,253,10,3,66,10,10,35,20,19,35,20,20, + 35,19,20,35,10,8,2,252,218,42,1,234,3,21,34,20,19,36,19,19,36,19,20,34,11,2,2,0,0,5,1,85,255,254,5,214,5,214,0,29, + 0,33,0,39,0,45,0,50,0,0,1,33,21,51,53,33,21,35,21,7,17,23,21,51,21,33,53,51,53,55,51,17,35,39,53,35,53,33,21,51, + 1,53,33,21,1,55,53,33,21,23,17,7,21,33,53,39,53,17,55,33,17,3,8,1,21,171,1,14,115,92,92,115,251,127,115,93,1,1,93,115, + 1,9,170,2,151,251,238,3,74,82,252,218,82,73,3,20,74,1,253,126,5,214,155,155,162,144,150,253,183,149,143,163,163,143,152,2,69,151,144,162, + 155,250,251,55,55,3,234,131,95,95,131,253,118,116,128,128,116,52,2,33,2,253,221,0,0,4,1,182,0,0,5,118,5,216,0,55,0,67,0,81, + 0,94,0,0,1,38,53,52,55,54,55,38,39,38,39,53,54,55,54,55,54,55,38,39,38,53,52,62,1,51,50,30,1,21,20,7,6,7,22,23, + 22,23,22,23,21,6,7,6,7,22,23,22,21,20,7,6,7,1,33,9,1,53,51,53,35,53,35,21,35,21,51,21,19,54,53,52,46,1,34,14, + 1,21,20,23,3,33,0,20,30,1,50,62,1,52,46,1,35,34,6,2,203,31,32,8,11,60,36,41,1,1,41,43,78,28,30,26,17,22,45,78, + 42,41,78,45,21,16,26,28,29,77,44,42,1,1,42,37,58,11,8,31,32,2,2,1,26,252,64,1,15,1,12,172,172,118,172,172,162,60,45,77, + 84,77,45,63,222,2,138,254,75,29,53,58,54,29,30,54,28,29,52,1,148,53,57,60,53,17,14,38,63,72,80,4,80,73,75,42,14,10,18,29, + 39,41,43,75,42,42,75,43,41,39,29,19,9,14,42,75,73,80,4,80,72,62,38,15,17,53,60,58,54,3,4,254,117,1,148,1,78,124,108,124, + 124,108,124,254,178,45,73,43,78,41,41,78,43,64,54,254,172,5,25,58,53,28,28,53,58,53,27,27,0,4,1,81,0,0,5,219,5,216,0,41, + 0,53,0,62,0,111,0,0,1,54,53,52,38,53,52,55,22,21,20,7,0,19,33,38,53,52,0,61,1,6,7,6,7,39,7,38,39,54,53,52, + 39,54,55,46,1,53,52,55,22,23,3,54,59,1,6,21,20,43,1,34,39,53,3,23,20,7,35,34,61,1,54,19,38,39,6,21,20,22,21,20, + 7,6,7,22,21,20,7,22,23,55,7,54,55,54,55,22,21,20,0,21,20,23,37,2,1,50,53,35,54,53,52,38,39,6,21,20,22,21,20,7, + 3,30,4,22,70,122,8,1,234,45,252,54,13,1,138,90,56,46,158,9,44,139,31,78,2,48,72,21,7,33,104,54,162,37,96,6,43,69,21,8, + 4,6,7,72,10,28,41,216,35,77,25,29,11,59,44,4,74,25,103,97,35,135,29,105,82,11,254,130,12,3,107,39,254,18,1,4,31,13,77,31, + 18,8,4,232,8,11,21,43,14,49,94,104,103,26,27,254,189,252,111,56,58,160,1,40,64,6,115,3,142,18,22,30,46,80,249,192,30,28,109,122, + 32,19,5,27,110,27,120,254,235,63,46,35,49,30,15,254,112,35,52,15,30,23,49,2,167,96,38,62,37,27,33,18,16,15,97,99,44,44,197,192, + 76,24,72,74,10,144,4,173,30,30,120,254,236,125,54,52,1,3,55,1,124,1,10,43,12,79,74,74,41,19,33,19,17,15,0,0,0,4,1,48, + 255,255,5,251,5,215,0,13,0,29,0,80,0,91,0,0,0,20,30,1,51,50,62,1,52,46,1,35,34,6,19,20,30,1,51,50,62,1,53,52, + 46,1,35,34,14,1,1,21,33,53,7,38,53,52,18,55,54,55,38,39,38,53,52,54,55,54,55,38,39,38,52,62,1,51,50,30,1,20,7,6, + 7,22,23,30,1,21,20,7,6,7,22,23,22,18,21,20,7,39,38,39,46,1,35,34,6,7,6,7,2,191,58,101,55,57,101,56,57,102,55,54, + 101,96,16,28,15,16,28,16,16,29,15,14,29,16,2,91,251,217,83,11,165,146,38,40,30,21,42,85,77,27,29,26,15,23,44,78,41,40,78,45, + 21,17,25,27,30,75,86,41,22,30,38,38,147,166,12,92,4,64,69,245,128,129,245,67,65,4,3,193,112,100,56,56,100,112,103,54,54,1,14,16, + 27,15,15,27,16,15,28,16,16,28,250,187,1,1,1,57,58,160,1,37,78,21,15,29,38,75,82,83,151,42,14,10,19,29,39,84,77,42,42,77, + 84,39,29,20,9,14,42,151,83,82,75,38,29,16,20,78,254,219,160,58,57,132,125,113,121,131,131,121,113,125,0,0,0,8,0,201,0,0,6,99, + 5,216,0,15,0,32,0,36,0,84,0,100,0,104,0,121,0,138,0,0,1,54,55,38,39,38,34,14,1,21,20,22,23,22,23,33,51,33,54,55, + 62,1,53,52,46,1,35,34,7,6,7,22,23,1,17,33,17,1,17,38,39,46,1,53,52,62,1,51,50,23,53,52,54,55,54,55,53,35,53,51, + 53,51,21,51,21,35,21,22,23,30,1,29,1,54,51,50,30,1,21,20,6,7,6,7,17,1,20,30,1,51,50,62,1,53,52,46,1,35,34,14, + 1,1,21,33,53,55,33,38,39,46,1,53,52,62,1,51,50,23,22,23,6,21,51,52,39,54,55,54,51,50,30,1,21,20,6,7,6,7,33,3, + 80,1,2,35,51,74,156,147,84,82,74,22,23,1,87,141,1,86,24,22,74,81,83,147,79,77,74,52,34,2,1,254,63,2,245,252,185,42,38,69, + 108,110,198,104,80,76,36,32,13,16,108,108,105,108,108,16,13,31,37,76,79,104,198,110,108,68,39,41,253,214,25,45,23,24,45,24,24,45,24,23, + 45,25,1,164,253,115,206,254,232,18,17,61,66,68,119,64,62,61,41,29,2,241,2,29,41,61,61,65,119,68,66,61,18,18,254,233,3,199,3,3, + 43,28,41,81,149,80,81,146,40,14,8,8,14,40,146,81,80,149,81,41,28,43,3,3,253,184,254,209,1,47,254,129,1,127,13,22,54,196,107,108, + 197,106,31,2,36,63,18,7,4,54,70,87,87,70,54,4,7,18,63,36,2,31,106,197,108,107,196,54,22,13,254,129,4,125,25,43,25,25,43,25, + 24,45,23,23,45,252,182,200,200,206,7,12,33,121,67,66,123,67,33,23,36,3,2,2,3,36,23,33,67,123,66,67,121,33,12,7,0,3,0,226, + 0,0,6,74,5,216,0,72,0,76,0,80,0,0,1,38,39,52,62,1,51,50,30,1,21,6,7,19,3,34,39,52,62,1,51,50,30,1,21,6, + 7,27,1,38,39,52,62,1,51,50,30,1,21,6,7,27,1,38,53,52,62,1,51,50,30,1,21,6,7,3,1,38,53,52,62,1,51,50,30,1, + 21,6,35,3,17,33,17,5,53,33,21,1,53,33,21,1,77,95,12,29,54,29,28,54,28,4,57,239,52,83,18,29,53,31,28,53,29,2,46,189, + 43,67,2,30,53,27,29,53,30,3,67,38,185,46,29,54,27,30,54,29,11,86,92,1,1,43,29,53,28,30,53,29,13,99,160,252,163,3,36,253, + 41,2,215,253,41,3,251,2,95,28,51,28,28,51,28,64,22,254,6,2,190,93,28,50,28,28,50,28,45,34,253,20,3,52,30,48,28,52,26,26, + 52,28,54,24,252,202,2,228,47,42,27,51,28,28,51,27,85,16,253,74,2,3,34,43,28,51,27,27,51,28,94,254,49,253,209,2,47,203,78,78, + 254,214,79,79,0,4,1,85,255,254,5,214,5,214,0,3,0,7,0,37,0,41,0,0,1,53,33,21,1,53,33,21,19,33,21,51,53,33,21,35, + 21,7,17,23,21,51,21,33,53,51,53,55,51,17,35,39,53,35,53,33,21,51,1,53,33,21,4,214,253,128,2,202,252,236,252,1,21,171,1,14, + 115,92,92,115,251,127,115,93,1,1,93,115,1,9,170,2,151,251,238,4,132,94,94,252,47,111,111,5,35,155,155,162,144,150,253,183,149,143,163,163, + 143,152,2,69,151,144,162,155,250,251,55,55,0,2,1,182,0,0,5,118,5,216,0,52,0,64,0,0,1,52,55,54,55,38,39,38,39,53,54,55, + 54,55,54,55,38,39,38,53,52,62,1,51,50,30,1,21,20,7,6,7,22,23,22,23,22,23,21,6,7,6,7,22,23,22,21,20,7,1,33,1, + 38,1,53,51,53,35,53,35,21,35,21,51,21,2,172,32,8,11,60,36,41,1,1,41,43,78,28,30,26,17,22,45,78,42,41,78,45,21,16,26, + 28,29,77,44,42,1,1,42,37,58,11,8,31,32,1,22,252,64,1,15,25,1,37,172,172,118,172,172,2,2,60,53,17,14,38,63,72,80,4,80, + 73,75,42,14,10,18,29,39,41,43,75,42,42,75,43,41,39,29,19,9,14,42,75,73,80,4,80,72,62,38,15,17,53,60,58,54,254,110,1,148, + 53,1,25,124,108,124,124,108,124,0,0,0,0,4,1,76,0,0,5,224,5,216,0,51,0,63,0,72,0,78,0,0,1,54,53,52,38,53,52,55, + 30,1,21,20,7,51,20,35,0,19,33,38,53,52,0,53,52,39,6,43,1,6,35,34,35,55,7,38,39,54,53,52,39,54,55,54,53,52,38,53, + 52,55,22,23,7,21,22,59,1,50,53,52,55,35,34,7,3,21,20,59,1,54,53,39,34,1,23,0,19,51,2,3,22,37,30,58,85,15,34,4, + 2,2,24,45,252,54,13,1,149,1,66,117,10,90,103,4,3,48,107,114,27,88,2,48,99,3,45,20,104,56,170,4,8,21,69,43,6,96,37,115, + 28,10,72,7,62,1,201,52,1,119,6,77,45,4,230,23,39,25,57,22,46,30,81,89,13,47,12,1,254,172,252,111,56,58,160,1,27,113,8,7, + 167,146,104,80,28,83,229,190,27,26,109,104,10,9,28,26,35,37,66,27,122,255,16,30,49,34,48,64,254,41,24,29,15,53,34,2,64,89,254,243, + 253,4,3,82,0,1,1,48,255,255,5,251,5,215,0,46,0,0,5,38,53,52,18,55,54,55,38,39,38,53,52,54,55,54,55,38,39,38,52,62, + 1,51,50,30,1,20,7,6,7,22,23,30,1,21,20,7,6,7,22,23,22,18,21,20,7,1,59,11,165,146,38,40,30,21,42,85,77,27,29,26, + 15,23,44,78,41,40,78,45,21,17,25,27,30,75,86,41,22,30,38,38,147,166,12,1,57,58,160,1,37,78,21,15,29,38,75,82,83,151,42,14, + 10,19,29,39,84,77,42,42,77,84,39,29,20,9,14,42,151,83,82,75,38,29,16,20,78,254,219,160,58,57,0,0,0,1,1,67,0,0,5,232, + 5,212,0,35,0,0,1,22,19,18,23,22,29,1,20,7,6,35,34,39,35,21,16,23,35,53,54,17,39,35,7,6,35,34,47,1,53,52,55,0, + 63,1,3,152,94,216,237,6,39,162,53,64,154,95,42,83,215,85,3,38,47,85,127,187,76,9,187,1,59,89,3,5,212,167,254,236,254,234,57,85, + 80,40,167,96,22,221,12,254,229,150,6,151,1,29,3,88,133,209,73,46,183,203,1,130,165,3,0,0,0,2,0,185,0,1,6,115,5,209,0,24, + 0,50,0,0,1,50,19,22,21,50,55,18,51,50,23,22,29,1,16,7,0,7,35,1,38,53,52,55,54,3,21,20,23,1,51,1,54,61,1,52, + 39,38,35,32,3,6,21,35,52,39,38,35,34,7,6,2,42,218,116,28,6,13,112,235,209,122,38,221,254,61,60,6,253,160,120,199,81,229,208,1, + 219,3,2,62,104,189,71,58,254,248,86,10,6,72,101,189,174,107,37,5,209,254,237,80,24,70,1,53,211,78,80,13,254,254,231,253,217,66,2,237, + 178,182,210,124,45,254,143,16,219,228,253,188,2,187,161,151,38,172,112,28,254,65,38,26,78,209,224,177,70,0,0,0,0,2,1,88,0,0,5,210, + 5,212,0,8,0,13,0,0,9,1,21,0,7,38,1,38,53,9,4,3,150,2,60,253,227,31,15,254,23,70,2,58,254,3,2,1,2,1,254,94, + 5,212,253,26,7,253,59,34,11,2,128,86,13,2,150,253,103,253,100,2,156,2,30,0,0,1,0,228,0,0,6,71,5,212,0,55,0,0,1,50, + 23,22,23,20,15,1,51,54,59,1,50,23,22,21,20,7,6,7,34,3,35,21,16,23,21,35,39,54,17,53,35,2,35,34,39,38,53,52,55,54, + 59,1,50,23,51,53,38,39,38,61,1,52,55,54,3,151,214,101,13,3,120,60,3,74,84,19,238,96,23,209,40,71,242,101,3,82,208,6,85,3, + 100,245,191,102,25,246,66,51,9,86,78,3,84,29,60,215,71,5,212,227,52,56,117,160,60,28,202,66,60,205,104,12,6,1,18,9,254,169,109,6, + 6,128,1,77,3,254,235,201,68,58,233,83,12,28,3,71,69,110,81,14,201,104,19,0,0,3,1,66,0,1,5,234,5,213,0,34,0,60,0,66, + 0,0,1,22,1,22,29,1,20,7,6,43,1,34,39,35,21,16,23,35,53,54,17,35,7,6,43,1,34,39,38,53,55,53,52,55,0,55,6,1, + 6,21,22,23,22,59,1,50,55,51,50,23,22,59,1,50,55,54,61,1,52,39,2,3,51,38,39,34,7,3,151,126,1,127,86,181,34,48,22,145, + 98,42,83,215,86,42,56,85,105,22,160,81,25,3,206,1,34,95,124,254,174,81,10,148,22,41,16,119,96,183,7,31,83,103,19,137,65,10,203,230, + 142,63,13,15,6,16,5,213,225,254,54,139,134,3,209,78,16,218,13,254,232,155,6,151,1,35,101,117,174,66,63,13,3,200,212,1,103,73,199,254, + 111,130,133,187,53,9,218,70,148,167,40,30,31,176,207,1,31,251,112,23,90,82,0,0,0,1,0,182,0,0,6,119,5,212,0,23,0,0,1,50, + 23,22,23,51,54,55,54,51,50,23,22,21,20,7,1,35,1,38,53,52,55,54,2,40,203,116,42,2,3,35,92,108,135,209,126,32,208,253,239,6, + 253,206,168,199,84,5,212,235,93,49,162,107,108,224,83,73,250,227,253,133,2,177,205,218,211,124,45,0,0,1,1,88,0,0,5,210,5,212,0,8, + 0,0,9,1,22,21,1,38,1,52,55,3,150,1,247,69,253,196,12,253,206,111,5,212,253,115,85,13,253,27,8,2,221,14,138,0,0,3,0,228, + 0,0,6,72,5,220,0,50,0,96,0,103,0,0,1,50,23,22,21,20,15,1,54,59,1,50,23,22,21,20,7,6,7,34,3,35,21,16,23,21, + 35,39,54,17,53,35,2,35,34,39,38,53,52,55,54,59,1,50,23,38,39,53,52,55,54,3,20,31,1,21,38,43,1,34,15,1,20,23,22,51, + 50,19,54,55,51,22,23,22,51,50,55,54,61,1,52,47,1,35,34,7,53,54,55,54,53,52,39,38,35,34,7,1,20,7,51,53,38,53,3,155, + 203,104,25,114,22,31,61,41,248,92,16,210,34,73,241,102,3,82,209,6,85,3,100,246,192,103,25,247,67,51,38,61,31,99,28,216,71,240,169,12, + 107,118,9,243,61,7,136,61,78,210,114,16,22,7,37,83,90,158,168,85,12,253,54,6,118,107,129,32,26,187,54,41,184,83,1,7,28,60,28,5, + 220,206,70,57,132,166,23,6,215,56,58,211,100,12,7,1,20,9,254,167,109,6,6,128,1,79,4,254,232,203,69,58,235,82,12,6,112,177,38,203, + 105,19,254,179,155,204,12,3,9,212,67,148,93,38,1,39,27,65,120,134,133,190,46,43,6,222,48,3,9,3,137,110,77,44,182,87,16,200,251,206, + 28,96,3,99,22,0,0,0,0,4,0,216,255,254,6,84,5,212,0,16,0,33,0,49,0,77,0,0,1,51,20,6,7,20,22,23,35,38,39,38, + 39,48,53,52,54,37,51,20,6,7,20,22,19,35,38,39,38,39,52,53,52,54,5,51,20,6,7,20,22,23,35,38,39,38,39,53,52,54,19,30, + 1,21,20,6,4,32,36,38,53,52,54,55,51,6,7,6,20,22,4,32,36,54,52,39,38,39,2,118,13,145,2,204,7,13,29,163,48,15,165,1, + 65,13,146,2,205,6,13,29,162,49,15,166,1,89,13,146,2,205,6,13,28,163,49,15,166,44,168,190,185,254,177,254,148,254,177,185,189,168,3,131, + 75,86,167,1,46,1,74,1,47,166,86,76,131,5,57,63,155,99,130,121,201,166,116,51,90,14,114,136,237,96,237,151,197,187,254,206,251,178,78,139, + 8,9,177,209,91,79,196,125,161,154,253,208,145,66,114,14,145,173,254,30,49,177,97,96,176,98,98,176,96,97,177,49,41,69,77,168,152,85,85,152, + 168,77,69,41,0,1,0,172,255,246,2,183,5,213,0,17,0,0,1,51,23,17,20,15,1,35,34,47,1,52,63,1,50,23,51,17,2,104,72,7, + 196,48,35,212,28,4,211,33,99,90,4,5,213,8,250,253,163,45,4,133,31,130,24,5,64,4,212,0,0,1,0,172,255,246,4,111,5,213,0,29, + 0,0,1,51,23,21,22,23,22,21,20,7,35,39,54,53,52,39,38,39,17,20,7,35,34,53,52,55,51,50,23,17,2,88,87,8,27,173,240,122, + 4,30,61,228,92,25,224,57,242,212,23,96,89,5,213,7,39,54,63,70,138,146,96,32,49,84,70,71,42,26,251,214,153,45,168,131,23,64,4,214, + 0,1,1,120,255,47,5,179,5,213,0,30,0,0,1,5,23,17,20,7,35,34,61,1,52,63,1,50,23,17,37,17,20,15,1,35,34,61,1,52, + 63,1,50,23,17,2,253,2,179,3,192,54,213,177,39,86,81,253,220,150,67,26,216,170,43,89,80,5,213,202,4,250,237,155,42,164,4,126,22,3, + 58,4,11,169,251,219,137,56,8,155,7,122,34,4,67,4,211,0,0,0,0,2,0,188,255,246,6,111,5,213,0,24,0,28,0,0,1,23,17,20, + 5,34,39,52,55,50,23,51,17,33,17,6,7,35,32,53,52,55,50,23,17,23,21,33,53,6,107,4,254,251,233,18,233,109,79,3,252,165,8,242, + 4,254,254,236,100,88,88,3,91,5,213,4,251,18,213,21,164,138,14,59,2,149,253,90,207,36,177,125,16,64,4,225,207,156,156,0,0,2,0,181, + 255,250,3,34,5,217,0,12,0,21,0,0,19,51,23,17,51,54,51,22,19,2,5,39,17,19,17,36,17,54,53,52,39,34,187,45,5,3,170,145, + 227,20,29,253,179,3,56,1,162,1,149,119,5,217,6,252,63,237,3,254,255,254,87,88,3,5,214,251,212,254,157,99,1,49,13,12,148,8,0,0, + 0,2,0,172,0,0,2,48,5,217,0,13,0,19,0,0,19,51,23,17,37,23,17,7,35,39,17,5,35,17,19,17,51,37,17,35,177,41,6,1, + 78,2,4,40,5,254,175,2,52,2,1,29,2,5,217,5,254,47,161,2,251,99,5,5,1,229,160,4,138,253,153,254,125,144,1,127,0,2,0,173, + 0,0,3,52,5,217,0,40,0,44,0,0,1,51,23,17,55,23,21,6,7,17,55,21,6,7,17,7,35,39,17,5,17,7,35,39,17,7,53,52, + 55,17,35,7,53,55,17,55,51,23,17,37,17,1,17,37,17,2,135,46,5,119,3,3,119,122,1,121,5,46,5,254,224,5,42,5,129,129,2,127, + 129,5,42,5,1,32,254,224,1,32,5,217,5,254,208,60,2,141,7,60,254,139,55,135,4,67,254,215,4,4,1,17,140,254,166,4,4,1,65,60, + 142,6,60,1,123,56,139,65,1,31,4,4,254,250,134,1,77,253,150,254,135,139,1,116,0,1,0,172,0,0,5,80,5,217,0,72,0,0,1,35, + 48,35,34,7,35,34,39,53,54,53,52,39,53,54,55,51,22,59,1,53,52,39,53,54,55,51,22,50,55,51,22,23,21,6,29,1,51,50,55,51, + 22,23,21,6,21,20,23,21,6,43,1,38,43,2,17,20,23,21,6,7,35,38,34,7,35,38,39,53,54,53,2,182,168,4,179,80,56,24,11,99, + 99,2,32,57,83,181,167,131,3,29,58,45,140,45,58,29,3,131,163,181,83,56,33,2,99,99,11,25,55,80,179,4,164,131,3,29,58,45,140,45, + 58,29,3,131,3,17,90,35,59,49,55,70,45,58,29,3,131,175,181,83,56,33,2,99,99,2,33,56,83,181,175,131,3,29,58,45,70,55,49,59, + 35,90,254,82,181,83,57,32,2,99,99,2,32,57,83,181,0,6,0,132,0,0,5,156,5,217,0,6,0,13,0,20,0,27,0,59,0,71,0,0, + 1,6,7,22,23,55,53,5,21,23,54,55,38,39,1,38,39,6,7,23,51,3,35,7,22,23,54,55,3,51,55,22,23,6,7,39,35,17,23,6, + 7,38,39,55,17,35,7,38,39,54,55,23,51,53,39,54,55,22,23,15,1,21,35,21,51,17,51,17,51,53,35,53,1,59,22,48,47,23,95,2, + 237,94,23,47,47,23,254,134,44,47,44,45,68,45,1,45,67,45,44,46,45,7,228,208,10,122,122,10,208,228,126,106,105,104,104,126,228,208,11,122, + 122,11,208,228,126,104,105,104,106,126,110,116,116,54,116,116,3,180,45,46,44,45,67,46,1,46,67,46,44,46,45,1,110,23,47,47,23,95,252,82, + 95,23,47,47,23,2,247,126,105,106,104,104,126,254,78,208,11,121,121,11,208,1,178,126,104,105,105,105,126,214,209,11,122,122,11,209,115,159,46,254, + 128,1,128,46,159,0,0,0,0,12,0,172,0,0,6,129,5,172,0,20,0,35,0,46,0,54,0,67,0,77,0,104,0,119,0,140,0,151,0,166, + 0,175,0,0,1,33,50,31,1,55,51,50,21,3,33,39,53,54,55,53,2,39,38,61,1,7,51,50,23,22,21,2,7,35,36,39,53,18,55,54, + 5,21,19,7,21,51,55,7,38,47,1,1,23,19,38,43,1,34,7,1,22,19,23,21,20,7,6,43,1,38,3,53,23,19,51,50,63,1,52,47, + 1,6,37,51,50,23,22,21,7,35,39,2,15,1,23,7,35,38,3,38,61,1,52,63,1,35,39,53,55,23,21,23,51,21,20,7,21,22,23,19, + 51,23,53,39,1,51,23,21,33,50,55,51,23,21,6,3,6,43,1,21,7,35,2,61,1,39,23,17,7,33,34,47,1,53,52,55,5,7,23,51, + 53,52,59,1,50,63,1,33,38,61,1,5,6,7,21,20,31,1,33,17,3,40,1,139,58,29,77,98,8,5,173,254,164,5,18,82,187,16,46,113, + 23,112,55,30,176,16,3,254,211,4,158,17,44,1,18,202,22,202,95,28,113,16,20,253,30,240,160,62,77,28,84,44,3,155,18,149,5,80,23,36, + 146,12,180,54,156,133,54,36,2,48,95,228,253,19,20,9,117,51,5,5,100,180,15,3,5,7,3,22,173,20,85,20,2,100,5,128,18,3,116,1, + 156,200,2,28,95,2,125,5,5,1,115,42,36,2,5,6,196,25,34,195,5,8,172,82,8,5,254,214,116,48,6,88,2,88,95,95,5,8,231,22, + 47,105,254,107,8,253,184,61,6,90,30,1,14,5,172,71,134,56,7,254,212,5,5,17,42,5,1,70,20,22,4,5,13,128,49,10,254,198,17,172, + 8,2,1,26,8,46,23,2,254,157,15,3,173,13,197,13,5,254,209,138,1,23,144,102,254,245,17,254,239,41,20,77,67,18,11,1,61,5,15,254, + 234,103,26,57,69,162,129,107,215,79,13,5,57,254,203,33,21,40,5,27,1,45,26,31,7,28,131,41,59,5,5,38,5,13,2,8,198,10,26,254, + 1,93,8,3,172,254,212,5,116,33,5,2,21,254,177,29,121,5,1,34,13,3,179,7,254,165,5,134,38,13,50,124,12,172,170,8,28,98,179,1, + 20,8,29,97,36,10,85,43,6,1,21,0,0,4,0,156,0,32,6,143,5,217,0,10,0,35,0,56,0,77,0,0,1,51,17,7,53,55,51,17, + 51,21,33,5,38,53,52,63,1,39,55,19,39,7,6,21,20,23,22,51,50,55,33,21,33,34,39,38,37,6,7,35,21,39,55,21,51,54,55,54, + 53,52,39,3,55,19,22,21,20,1,22,31,1,55,3,39,55,39,38,35,34,7,6,7,3,39,19,54,55,54,2,213,171,186,202,127,171,254,27,253, + 243,44,38,84,62,235,24,61,99,7,23,35,93,15,16,1,150,254,28,75,57,46,5,139,85,175,167,210,210,198,58,25,7,49,202,136,243,37,252,230, + 169,96,84,63,25,234,60,99,34,52,7,7,63,53,204,136,241,39,56,47,1,234,1,154,26,97,30,254,1,92,184,77,79,72,75,146,36,107,254,255, + 36,172,20,19,35,32,44,1,159,33,27,97,147,10,73,151,149,70,11,55,17,19,52,72,1,96,79,254,93,66,65,54,4,158,1,146,145,36,254,255, + 107,35,172,40,1,9,107,254,161,78,1,164,65,33,27,0,0,4,0,156,0,32,6,143,5,217,0,28,0,53,0,74,0,95,0,0,1,33,21,33, + 53,62,1,55,62,1,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,6,7,14,1,1,38,53,52,63,1,39,55,19,39,7,6,21,20,23, + 22,51,50,55,33,21,33,34,39,38,37,6,7,35,21,39,55,21,51,54,55,54,53,52,39,3,55,19,22,21,20,1,22,31,1,55,3,39,55,39, + 38,35,34,7,6,7,3,39,19,54,55,54,3,93,1,84,253,241,64,205,25,49,36,74,60,47,103,89,76,112,48,127,154,38,48,14,139,253,10,44, + 38,84,62,235,24,61,99,7,23,35,93,15,16,1,150,254,28,75,57,46,5,139,85,175,167,210,210,198,58,25,7,49,202,136,243,37,252,230,169,96, + 84,63,25,234,60,99,34,52,7,7,63,53,204,136,241,39,56,47,1,210,93,85,49,158,21,41,56,26,40,51,24,38,110,25,20,99,81,38,68,45, + 13,109,254,186,77,79,72,75,146,36,107,254,255,36,172,20,19,35,32,44,1,159,33,27,97,147,10,73,151,149,70,11,55,17,19,52,72,1,96,79, + 254,93,66,65,54,4,158,1,146,145,36,254,255,107,35,172,40,1,9,107,254,161,78,1,164,65,33,27,0,4,0,156,0,32,6,143,5,217,0,40, + 0,65,0,86,0,107,0,0,1,30,1,21,20,6,35,34,38,39,53,30,1,51,50,54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,7, + 53,62,1,51,50,22,21,20,6,1,38,53,52,63,1,39,55,19,39,7,6,21,20,23,22,51,50,55,33,21,33,34,39,38,37,6,7,35,21,39, + 55,21,51,54,55,54,53,52,39,3,55,19,22,21,20,1,22,31,1,55,3,39,55,39,38,35,34,7,6,7,3,39,19,54,55,54,4,90,11,95, + 173,157,51,108,70,72,101,53,94,92,86,79,111,115,72,71,74,73,41,96,86,75,109,49,129,154,83,252,106,44,38,84,62,235,24,61,99,7,23,35, + 93,15,16,1,150,254,28,75,57,46,5,139,85,175,167,210,210,198,58,25,7,49,202,136,243,37,252,230,169,96,84,63,25,234,60,99,34,52,7,7, + 63,53,204,136,241,39,56,47,2,190,2,83,60,92,101,14,18,108,30,18,50,51,45,50,91,39,38,39,41,14,20,98,15,13,89,75,52,74,254,24, + 77,79,72,75,146,36,107,254,255,36,172,20,19,35,32,44,1,159,33,27,97,147,10,73,151,149,70,11,55,17,19,52,72,1,96,79,254,93,66,65, + 54,4,158,1,146,145,36,254,255,107,35,172,40,1,9,107,254,161,78,1,164,65,33,27,0,5,0,156,0,32,6,143,5,217,0,2,0,13,0,38, + 0,59,0,80,0,0,1,3,51,3,51,17,51,21,35,21,35,53,33,53,1,38,53,52,63,1,39,55,19,39,7,6,21,20,23,22,51,50,55,33, + 21,33,34,39,38,37,6,7,35,21,39,55,21,51,54,55,54,53,52,39,3,55,19,22,21,20,1,22,31,1,55,3,39,55,39,38,35,34,7,6, + 7,3,39,19,54,55,54,3,182,230,230,20,177,121,121,157,254,130,254,144,44,38,84,62,235,24,61,99,7,23,35,93,15,16,1,150,254,28,75,57, + 46,5,139,85,175,167,210,210,198,58,25,7,49,202,136,243,37,252,230,169,96,84,63,25,234,60,99,34,52,7,7,63,53,204,136,241,39,56,47,3, + 82,254,255,1,138,254,118,95,142,142,96,254,132,77,79,72,75,146,36,107,254,255,36,172,20,19,35,32,44,1,159,33,27,97,147,10,73,151,149,70, + 11,55,17,19,52,72,1,96,79,254,93,66,65,54,4,158,1,146,145,36,254,255,107,35,172,40,1,9,107,254,161,78,1,164,65,33,27,0,0,0, + 0,4,0,156,0,32,6,143,5,217,0,29,0,54,0,75,0,96,0,0,1,33,21,33,21,6,54,51,50,22,21,20,6,35,34,38,39,53,30,1, + 51,50,54,53,52,38,35,34,6,7,1,38,53,52,63,1,39,55,19,39,7,6,21,20,23,22,51,50,55,33,21,33,34,39,38,37,6,7,35,21, + 39,55,21,51,54,55,54,53,52,39,3,55,19,22,21,20,1,22,31,1,55,3,39,55,39,38,35,34,7,6,7,3,39,19,54,55,54,2,187,1, + 195,254,197,2,49,24,139,162,167,150,50,104,70,76,93,53,82,93,93,82,39,80,70,254,13,44,38,84,62,235,24,61,99,7,23,35,93,15,16,1, + 150,254,28,75,57,46,5,139,85,175,167,210,210,198,58,25,7,49,202,136,243,37,252,230,169,96,84,63,25,234,60,99,34,52,7,7,63,53,204,136, + 241,39,56,47,3,208,95,112,1,7,116,99,100,114,14,15,114,31,18,64,56,57,64,13,25,254,83,77,79,72,75,146,36,107,254,255,36,172,20,19, + 35,32,44,1,159,33,27,97,147,10,73,151,149,70,11,55,17,19,52,72,1,96,79,254,93,66,65,54,4,158,1,146,145,36,254,255,107,35,172,40, + 1,9,107,254,161,78,1,164,65,33,27,0,0,5,0,156,0,32,6,143,5,217,0,9,0,34,0,59,0,80,0,101,0,0,1,34,6,20,22,51, + 50,54,52,38,19,21,46,1,35,34,6,7,6,54,51,50,22,21,20,6,35,34,38,53,52,54,51,50,22,1,38,53,52,63,1,39,55,19,39,7, + 6,21,20,23,22,51,50,55,33,21,33,34,39,38,37,6,7,35,21,39,55,21,51,54,55,54,53,52,39,3,55,19,22,21,20,1,22,31,1,55, + 3,39,55,39,38,35,34,7,6,7,3,39,19,54,55,54,3,134,55,68,68,55,58,66,66,153,61,70,34,87,92,3,7,93,56,117,135,141,117,133, + 140,169,146,38,77,252,165,44,38,84,62,235,24,61,99,7,23,35,93,15,16,1,150,254,28,75,57,46,5,139,85,175,167,210,210,198,58,25,7,49, + 202,136,243,37,252,230,169,96,84,63,25,234,60,99,34,52,7,7,63,53,204,136,241,39,56,47,2,188,65,118,64,64,118,65,1,14,102,22,14,96, + 53,7,40,115,97,95,116,165,150,143,174,12,252,253,77,79,72,75,146,36,107,254,255,36,172,20,19,35,32,44,1,159,33,27,97,147,10,73,151,149, + 70,11,55,17,19,52,72,1,96,79,254,93,66,65,54,4,158,1,146,145,36,254,255,107,35,172,40,1,9,107,254,161,78,1,164,65,33,27,0,0, + 0,4,0,156,0,32,6,143,5,217,0,6,0,31,0,52,0,73,0,0,1,33,21,1,35,19,33,1,38,53,52,63,1,39,55,19,39,7,6,21, + 20,23,22,51,50,55,33,21,33,34,39,38,37,6,7,35,21,39,55,21,51,54,55,54,53,52,39,3,55,19,22,21,20,1,22,31,1,55,3,39, + 55,39,38,35,34,7,6,7,3,39,19,54,55,54,2,162,2,2,254,240,147,254,254,163,254,38,44,38,84,62,235,24,61,99,7,23,35,93,15,16, + 1,150,254,28,75,57,46,5,139,85,175,167,210,210,198,58,25,7,49,202,136,243,37,252,230,169,96,84,63,25,234,60,99,34,52,7,7,63,53,204, + 136,241,39,56,47,3,186,50,253,185,2,26,253,123,77,79,72,75,146,36,107,254,255,36,172,20,19,35,32,44,1,159,33,27,97,147,10,73,151,149, + 70,11,55,17,19,52,72,1,96,79,254,93,66,65,54,4,158,1,146,145,36,254,255,107,35,172,40,1,9,107,254,161,78,1,164,65,33,27,0,0, + 0,3,0,156,0,32,6,143,5,217,0,24,0,45,0,66,0,0,55,38,53,52,63,1,39,55,19,39,7,6,21,20,23,22,51,50,55,33,21,33, + 34,39,38,37,6,7,35,21,39,55,21,51,54,55,54,53,52,39,3,55,19,22,21,20,1,22,31,1,55,3,39,55,39,38,35,34,7,6,7,3, + 39,19,54,55,54,200,44,38,84,62,235,24,61,99,7,23,35,93,15,16,1,150,254,28,75,57,46,5,139,85,175,167,210,210,198,58,25,7,49,202, + 136,243,37,252,230,169,96,84,63,25,234,60,99,34,52,7,7,63,53,204,136,241,39,56,47,214,77,79,72,75,146,36,107,254,255,36,172,20,19,35, + 32,44,1,159,33,27,97,147,10,73,151,149,70,11,55,17,19,52,72,1,96,79,254,93,66,65,54,4,158,1,146,145,36,254,255,107,35,172,40,1, + 9,107,254,161,78,1,164,65,33,27,0,0,0,6,0,172,0,0,6,127,5,161,0,16,0,26,0,39,0,57,0,72,0,82,0,0,1,33,50,31, + 1,55,51,21,2,7,33,53,54,55,3,38,35,7,50,31,1,3,36,39,18,55,54,1,18,21,23,20,7,6,43,1,38,3,54,55,5,18,23,39, + 2,15,1,23,35,3,39,54,55,54,53,39,53,51,1,51,21,33,50,55,51,20,3,6,43,1,21,35,3,39,23,17,7,33,34,47,1,52,55,3, + 42,1,134,58,33,74,99,6,157,16,254,169,97,5,198,35,13,102,105,42,49,193,254,245,27,149,22,49,3,90,166,2,97,15,40,125,14,175,24,201, + 252,121,171,2,112,192,4,3,5,5,201,8,4,80,26,100,228,2,216,2,1,138,33,30,3,201,24,31,204,5,168,94,5,5,254,222,116,47,5,84, + 5,161,84,125,55,2,254,237,21,5,53,9,1,98,26,5,92,86,254,182,154,19,1,4,28,47,254,86,254,234,23,39,102,58,8,15,1,58,23,112, + 27,254,224,13,63,254,182,16,41,29,1,92,32,31,128,41,11,57,3,254,165,115,26,9,254,164,23,115,1,37,176,6,254,169,5,128,48,48,130,0, + 0,7,0,170,0,0,6,131,5,217,0,19,0,37,0,50,0,60,0,74,0,92,0,101,0,0,1,51,32,19,22,29,1,16,5,6,43,1,32,3, + 38,61,1,16,37,54,23,21,50,31,1,21,6,7,21,33,54,55,35,7,38,39,38,35,1,22,51,54,19,38,35,38,35,34,7,6,7,5,21,19, + 51,50,55,52,47,1,34,5,23,6,7,20,31,1,51,52,63,1,51,23,39,1,7,22,23,51,53,55,51,50,63,1,53,35,6,35,33,39,53,5, + 6,29,1,20,31,1,51,17,3,137,27,1,139,243,97,254,111,163,183,3,254,80,232,83,1,60,190,137,38,51,121,27,58,1,24,10,132,3,83,79, + 18,21,26,253,136,242,9,4,149,66,23,29,50,95,53,78,13,2,129,153,118,98,26,101,41,14,251,205,80,75,11,139,29,3,27,142,9,76,139,1, + 249,135,6,129,3,6,172,36,61,106,3,22,34,254,196,6,253,234,65,106,26,252,5,217,254,146,174,207,6,254,79,235,76,1,134,168,163,53,1,95, + 241,131,147,3,107,206,3,22,31,3,8,240,44,137,22,12,254,223,139,15,1,1,126,18,121,125,31,222,3,254,244,138,47,157,77,60,52,123,49,22, + 232,59,67,25,248,44,241,254,229,251,3,236,91,6,128,177,3,16,6,95,101,105,39,12,91,41,4,1,36,0,0,0,0,8,0,170,0,0,6,131, + 5,217,0,15,0,32,0,47,0,58,0,66,0,82,0,96,0,106,0,0,1,32,19,22,21,16,5,6,35,32,3,38,53,16,37,54,1,16,5,22, + 59,1,32,19,54,53,16,37,38,35,32,3,6,1,33,50,31,1,55,21,6,7,33,53,55,38,47,1,35,50,31,1,3,35,38,39,54,55,54,1, + 22,29,1,6,43,1,3,37,33,23,7,35,39,35,2,7,21,38,3,39,52,55,39,1,51,21,33,50,55,21,3,7,35,7,21,35,39,37,33,23, + 17,7,35,34,47,1,54,3,152,1,151,237,103,254,132,164,209,254,94,231,95,1,136,170,253,249,1,98,157,170,48,1,104,229,92,254,150,160,184,254, + 123,223,92,2,91,1,58,53,24,58,81,109,27,254,240,77,146,26,27,77,91,30,45,154,3,227,18,119,28,44,2,163,137,21,108,100,156,252,216,1, + 20,145,3,3,78,3,166,6,12,156,2,86,78,2,253,6,1,71,20,24,173,23,169,6,6,135,254,138,1,43,6,6,245,81,39,6,1,5,217,254, + 151,178,212,254,88,233,89,1,116,162,219,1,169,235,84,253,18,254,112,216,88,1,89,165,197,1,140,224,83,254,166,159,1,109,69,98,44,3,204,35, + 3,52,254,39,12,70,86,254,254,127,16,213,26,32,254,167,226,33,23,130,1,9,89,244,3,49,254,234,21,26,11,1,18,17,28,141,49,254,236,95, + 20,6,254,220,9,6,85,238,140,5,254,235,5,103,44,49,0,5,0,170,0,0,6,131,5,217,0,7,0,23,0,31,0,65,0,82,0,0,1,22, + 23,50,55,38,39,6,1,32,19,22,21,16,5,6,35,32,3,38,53,16,37,54,1,6,7,22,51,54,55,38,1,21,35,6,43,1,46,1,53,52, + 55,52,53,52,54,55,50,23,54,51,30,1,21,20,21,22,21,20,6,7,35,34,39,35,37,16,5,22,59,1,32,19,54,53,16,37,38,35,32,3, + 6,1,194,2,183,144,97,87,162,175,1,212,1,151,237,103,254,132,164,209,254,94,231,95,1,136,170,1,225,162,87,97,144,183,2,2,254,43,3,118, + 178,14,140,122,1,155,135,157,127,128,158,135,155,1,122,140,14,178,119,2,253,60,1,98,157,170,48,1,104,229,92,254,150,160,184,254,123,223,92,2, + 244,205,2,203,194,4,3,2,38,254,151,178,212,254,88,233,89,1,116,162,219,1,169,235,84,253,221,4,194,203,2,205,191,254,243,28,189,15,185,80, + 7,8,4,5,116,153,1,170,170,1,153,116,5,4,8,7,80,185,15,189,97,254,112,216,88,1,89,165,197,1,140,224,83,254,166,159,0,2,1,49, + 0,2,5,250,5,217,0,24,0,46,0,0,1,50,21,6,7,23,33,50,23,7,33,23,33,22,19,55,23,6,5,38,3,33,34,3,52,1,6,35, + 34,46,1,53,52,55,54,55,23,6,7,20,30,1,50,54,55,23,6,2,154,153,1,128,24,1,19,12,16,4,254,237,12,1,189,12,141,134,48,5, + 254,238,16,149,254,35,12,85,1,248,113,123,124,226,125,64,33,47,40,25,2,83,152,166,151,42,69,46,5,217,142,163,2,230,146,4,101,6,254,114, + 40,141,8,89,24,1,173,3,36,133,250,104,63,125,225,125,124,114,60,46,217,60,67,83,152,83,83,76,169,50,0,0,0,3,0,150,0,0,6,96, + 5,205,0,22,0,26,0,30,0,0,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,17,33,17,37,33,17, + 33,2,239,19,20,31,27,43,42,28,30,21,19,19,20,31,28,84,28,30,21,19,253,167,5,202,250,219,4,128,251,128,2,233,42,28,30,21,19,19, + 20,31,27,43,42,28,30,21,19,19,20,31,27,253,66,5,205,250,51,165,4,131,0,0,0,4,0,150,0,0,6,96,5,205,0,22,0,45,0,49, + 0,53,0,0,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,21, + 20,7,6,7,6,34,39,38,39,38,1,17,33,17,37,33,17,33,1,185,19,20,31,28,84,28,30,21,19,19,20,31,27,43,42,28,30,21,19,2, + 108,19,20,31,27,43,42,28,30,21,19,19,20,31,28,84,28,30,21,19,252,113,5,202,250,219,4,128,251,128,1,174,42,28,30,21,19,19,20,31, + 27,43,42,28,30,21,19,19,20,31,27,2,156,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,252,12,5,205,250,51,165,4, + 131,0,0,0,0,5,0,150,0,0,6,96,5,205,0,22,0,45,0,68,0,72,0,76,0,0,1,52,55,54,55,54,50,23,22,23,22,21,20,7, + 6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,52,55,54,55,54,51,50, + 23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,17,33,17,37,33,17,33,1,185,19,20,31,28,84,28,30,21,19,19,20,31,27,43,42, + 28,30,21,19,1,54,19,20,31,27,43,42,28,30,21,19,19,20,31,28,84,28,30,21,19,1,54,19,20,31,27,43,42,28,30,21,19,19,20,31, + 28,84,28,30,21,19,252,113,5,202,250,219,4,128,251,128,1,174,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,1,102,42, + 28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,1,97,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,252, + 12,5,205,250,51,165,4,131,0,6,0,150,0,0,6,96,5,205,0,22,0,45,0,68,0,91,0,95,0,99,0,0,1,52,55,54,55,54,50,23, + 22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,37,52, + 55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34, + 39,38,39,38,1,17,33,17,37,33,17,33,1,185,19,20,31,28,84,28,30,21,19,19,20,31,27,43,42,28,30,21,19,2,108,19,20,31,27,43, + 42,28,30,21,19,19,20,31,28,84,28,30,21,19,253,148,19,20,31,28,84,28,30,21,19,19,20,31,27,43,42,28,30,21,19,2,108,19,20,31, + 27,43,42,28,30,21,19,19,20,31,28,84,28,30,21,19,252,113,5,202,250,219,4,128,251,128,4,31,42,28,30,21,19,19,20,31,27,43,42,28, + 30,21,19,19,20,31,27,253,186,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,43,42, + 28,30,21,19,19,20,31,27,2,156,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,252,12,5,205,250,51,165,4,131,0,0, + 0,7,0,150,0,0,6,96,5,205,0,22,0,45,0,68,0,91,0,114,0,118,0,122,0,0,1,52,55,54,55,54,50,23,22,23,22,21,20,7, + 6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,54,50,23, + 22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,52, + 55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,17,33,17,37,33,17,33,1,185,19,20,31,28,84,28,30,21,19, + 19,20,31,27,43,42,28,30,21,19,2,108,19,20,31,27,43,42,28,30,21,19,19,20,31,28,84,28,30,21,19,253,148,19,20,31,28,84,28,30, + 21,19,19,20,31,27,43,42,28,30,21,19,2,108,19,20,31,27,43,42,28,30,21,19,19,20,31,28,84,28,30,21,19,254,202,19,20,31,27,43, + 42,28,30,21,19,19,20,31,28,84,28,30,21,19,253,167,5,202,250,219,4,128,251,128,4,31,42,28,30,21,19,19,20,31,27,43,42,28,30,21, + 19,19,20,31,27,253,186,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,43,42,28,30, + 21,19,19,20,31,27,2,156,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,254,245,42,28,30,21,19,19,20,31,27,43,42, + 28,30,21,19,19,20,31,27,253,66,5,205,250,51,165,4,131,0,0,0,0,8,0,150,0,0,6,96,5,205,0,23,0,47,0,70,0,93,0,116, + 0,139,0,143,0,147,0,0,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,37,52,55,54,55,54,51,50, + 23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,17,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1, + 52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35, + 34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,17,33,17,37,33,17,33,4,36,19,20, + 31,27,43,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,253,149,19,20,31,27,43,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19, + 19,20,31,28,84,28,30,21,19,19,20,31,27,43,42,28,30,21,19,2,108,19,20,31,27,43,42,28,30,21,19,19,20,31,28,84,28,30,21,19, + 253,148,19,20,31,28,84,28,30,21,19,19,20,31,27,43,42,28,30,21,19,2,108,19,20,31,27,43,42,28,30,21,19,19,20,31,28,84,28,30, + 21,19,252,113,5,202,250,219,4,128,251,128,2,233,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19, + 20,31,27,43,42,28,30,21,19,19,20,31,27,1,147,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,253,86,42,28,30,21, + 19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,3,0,42,28,30, + 21,19,19,20,31,27,43,42,28,30,21,19,19,20,31,27,251,218,5,205,250,51,165,4,131,0,0,0,0,3,0,170,0,1,6,130,5,217,0,12, + 0,27,0,41,0,0,1,50,4,18,16,2,4,32,36,2,16,18,36,1,20,18,4,32,36,18,53,52,2,36,35,34,4,2,4,52,62,1,51,50, + 30,1,20,14,1,35,34,38,3,150,188,1,101,203,197,254,155,254,124,254,155,197,201,1,101,254,40,174,1,60,1,88,1,60,174,179,254,196,167,168, + 254,195,177,3,147,34,60,33,32,60,34,35,60,31,33,59,5,217,193,254,152,254,122,254,157,198,198,1,99,1,134,1,104,193,253,20,173,254,197,174, + 174,1,59,173,172,1,63,171,171,254,193,205,66,60,33,33,60,66,61,32,32,0,0,0,0,4,0,170,0,1,6,130,5,217,0,12,0,27,0,41, + 0,54,0,0,1,50,4,18,16,2,4,32,36,2,16,18,36,1,20,18,4,32,36,18,53,52,2,36,35,34,4,2,4,52,62,1,51,50,30,1, + 20,14,1,35,34,38,36,50,30,1,20,14,1,35,34,46,1,52,54,3,150,188,1,101,203,197,254,155,254,124,254,155,197,201,1,101,254,40,174,1, + 60,1,88,1,60,174,179,254,196,167,168,254,195,177,3,147,34,60,33,32,60,34,35,60,31,33,59,253,62,64,60,35,34,60,33,32,60,34,35,5, + 217,193,254,152,254,122,254,157,198,198,1,99,1,134,1,104,193,253,20,173,254,197,174,174,1,59,173,172,1,63,171,171,254,193,205,66,60,33,33,60, + 66,61,32,32,220,32,61,66,60,33,33,60,66,61,0,0,0,2,0,170,0,1,6,130,5,217,0,12,0,26,0,0,1,50,4,18,16,2,4,32, + 36,2,16,18,36,1,50,62,1,52,46,1,35,34,14,1,20,30,1,3,150,188,1,101,203,197,254,155,254,124,254,155,197,201,1,101,2,58,31,60, + 35,34,60,32,33,60,34,35,59,5,217,193,254,152,254,122,254,157,198,198,1,99,1,134,1,104,193,252,150,32,61,66,60,33,33,60,66,61,32,0, + 0,3,0,170,0,1,6,130,5,217,0,12,0,26,0,39,0,0,1,50,4,18,16,2,4,32,36,2,16,18,36,1,50,62,1,52,46,1,35,34, + 14,1,20,30,1,36,20,30,1,51,50,62,1,52,46,1,34,6,3,150,188,1,101,203,197,254,155,254,124,254,155,197,201,1,101,2,58,31,60,35, + 34,60,32,33,60,34,35,59,252,165,34,60,32,33,60,34,35,60,64,59,5,217,193,254,152,254,122,254,157,198,198,1,99,1,134,1,104,193,252,150, + 32,61,66,60,33,33,60,66,61,32,159,66,60,33,33,60,66,61,32,32,0,1,0,170,0,0,6,130,0,200,0,3,0,0,55,33,21,33,170,5, + 216,250,40,200,200,0,0,0,0,2,0,170,0,0,6,130,0,200,0,3,0,7,0,0,55,33,21,33,37,33,21,33,170,2,96,253,160,3,120,2, + 96,253,160,200,200,200,200,0,255,255,0,170,0,0,6,130,3,77,18,38,15,92,0,0,16,7,15,92,0,0,2,133,255,255,0,170,0,0,6,130, + 3,77,18,38,15,92,0,0,16,7,15,93,0,0,2,133,255,255,0,170,0,0,6,130,3,78,18,38,15,93,0,0,16,7,15,92,0,0,2,134, + 255,255,0,170,0,0,6,130,3,78,18,38,15,93,0,0,16,7,15,93,0,0,2,134,0,2,1,88,0,6,5,210,5,217,0,17,0,42,0,0, + 1,54,51,50,4,51,50,55,17,6,35,34,39,38,35,34,7,47,1,35,39,33,21,35,21,54,51,50,23,22,51,50,55,17,6,35,34,36,35,34, + 7,17,35,2,7,52,60,128,1,78,187,70,72,52,53,167,177,139,191,50,54,20,99,75,1,1,14,76,53,51,194,171,169,161,78,75,106,102,171,254, + 195,128,80,70,96,2,159,17,163,12,2,98,10,95,126,9,2,93,53,53,26,8,120,92,21,253,13,28,154,30,253,198,0,1,1,88,0,6,5,210, + 5,217,0,24,0,0,1,35,39,33,21,35,21,54,51,50,23,22,51,50,55,17,6,35,34,36,35,34,7,17,35,1,164,75,1,1,14,76,53,51, + 194,171,169,161,78,75,106,102,171,254,195,128,80,70,96,5,164,53,53,26,8,120,92,21,253,13,28,154,30,253,198,0,0,1,0,106,0,1,6,193, + 5,218,0,31,0,0,9,1,7,39,55,39,55,23,55,23,7,9,1,39,55,23,55,23,7,22,19,9,1,23,1,7,1,39,7,1,39,1,3,54, + 254,179,185,198,186,46,138,43,185,197,184,1,77,1,77,184,198,184,44,136,44,69,35,254,211,254,179,178,1,63,185,254,242,179,178,254,242,184,1,61, + 2,126,1,81,187,199,187,44,138,44,186,200,186,254,176,1,79,187,200,187,45,138,44,113,254,116,1,53,254,175,179,254,240,185,1,64,180,180,254,192, + 185,1,16,0,0,2,0,198,255,236,6,101,5,219,0,15,0,82,0,0,1,20,30,1,51,50,62,1,53,52,46,1,35,34,14,1,19,21,35,6, + 35,34,39,53,35,21,35,34,36,39,38,39,7,3,5,7,48,23,22,23,22,23,17,33,53,33,53,38,39,46,1,52,62,1,51,50,30,1,20,6, + 7,6,7,21,33,21,33,17,54,55,54,55,54,55,39,37,3,39,6,7,6,7,6,3,16,39,72,38,40,71,40,41,71,39,37,72,40,227,8,37, + 39,3,3,7,7,169,254,203,86,16,13,87,29,1,51,87,6,73,132,109,117,254,137,1,119,26,25,62,68,69,125,65,66,124,71,69,61,27,26,1, + 109,254,147,100,94,132,74,2,3,87,1,52,30,87,12,17,86,155,115,4,214,39,72,39,39,72,39,40,72,39,39,72,250,242,1,3,1,2,2,96, + 88,17,16,65,1,75,124,64,6,88,49,40,7,2,212,129,51,8,14,34,124,136,125,68,68,125,136,124,34,14,9,50,129,253,47,10,34,49,88,3, + 3,64,124,254,181,65,16,17,88,49,35,0,0,1,1,13,0,0,6,31,5,214,0,47,0,0,9,1,54,55,51,6,7,23,22,23,14,1,7,38, + 47,1,6,7,39,54,55,11,1,22,23,7,38,39,7,6,7,34,38,39,54,63,1,38,39,51,22,23,9,1,39,9,1,7,3,226,1,22,75,27, + 91,25,93,156,62,2,6,60,43,71,4,157,103,91,39,102,66,244,242,66,101,38,92,104,156,1,63,40,75,4,1,63,156,93,26,92,27,75,1,22, + 253,227,32,2,136,2,138,33,2,189,254,208,59,60,117,73,182,3,64,42,34,1,4,79,168,56,8,66,17,49,1,34,254,222,49,17,66,8,56,168, + 72,11,29,36,76,3,182,73,117,60,59,1,48,2,132,149,253,58,2,198,149,0,0,0,0,5,0,125,255,236,3,213,5,219,0,7,0,26,0,46, + 0,79,0,96,0,0,1,22,51,50,53,52,39,38,19,21,6,35,34,39,53,38,53,52,55,23,6,21,20,4,7,35,38,3,36,53,52,37,21,6, + 21,20,4,23,6,5,39,54,53,52,39,17,39,19,17,39,17,36,39,54,55,50,51,50,23,7,23,6,35,34,39,38,35,34,21,20,4,23,6,5, + 53,36,39,54,53,52,37,39,3,46,1,53,52,62,1,51,50,30,1,21,20,6,7,1,84,28,13,11,5,36,249,12,27,35,3,181,164,1,65,1, + 67,2,15,28,197,254,226,1,14,171,2,44,3,4,254,237,1,182,197,77,77,77,254,118,4,13,213,4,3,65,53,112,95,24,26,57,68,8,7,45, + 2,239,6,7,254,150,1,18,2,1,254,227,77,5,21,24,24,42,22,23,42,24,23,21,4,164,12,9,6,10,11,251,148,66,29,64,48,34,64,82, + 26,47,24,24,47,62,119,65,1,183,38,111,99,47,68,38,51,46,89,97,81,47,53,34,49,39,34,254,180,19,3,1,254,129,16,1,117,19,138,144, + 5,69,30,25,6,27,2,54,50,47,117,138,16,61,32,61,1,2,33,109,7,1,45,11,46,24,25,46,24,24,46,25,24,46,11,0,0,3,0,121, + 255,236,6,178,5,219,0,4,0,9,0,55,0,0,37,9,1,22,32,37,9,1,22,32,1,51,50,29,1,20,43,1,1,6,7,14,1,35,34,46, + 1,61,1,1,33,1,21,20,14,1,34,38,39,38,39,1,35,38,61,1,52,59,1,55,23,51,27,1,51,55,6,95,254,236,254,236,139,1,20,253, + 37,254,237,254,236,138,1,20,3,9,214,56,41,194,1,20,2,48,47,173,95,94,171,94,1,16,253,77,1,18,94,172,188,173,49,47,1,1,19,204, + 32,57,215,53,51,252,129,129,252,52,237,3,60,252,196,38,38,3,60,252,196,38,3,209,42,25,40,252,199,68,62,63,71,71,122,66,8,3,54,252, + 202,6,67,123,71,71,63,62,68,3,57,17,28,15,47,155,155,1,67,254,189,155,0,0,0,2,0,125,0,0,6,174,5,219,0,26,0,38,0,0, + 1,54,51,50,23,22,23,22,21,20,7,6,7,6,35,34,38,39,46,1,35,34,7,6,3,39,18,1,19,35,3,33,17,35,3,33,3,35,19,2, + 210,184,158,54,50,201,75,35,17,43,126,75,70,48,157,82,33,57,39,47,78,163,199,120,229,4,237,95,127,84,254,226,138,1,254,227,86,127,95,5, + 135,84,9,39,166,78,81,57,59,141,58,35,56,179,72,76,34,67,254,223,68,1,153,253,124,253,166,1,215,254,41,1,215,254,41,2,90,0,0,0, + 0,2,1,41,0,0,6,1,5,219,0,13,0,53,0,0,0,20,30,1,51,50,62,1,52,46,1,35,34,6,19,21,59,1,50,54,55,20,4,7, + 6,7,35,38,61,1,38,36,3,30,1,51,50,55,51,53,38,39,46,1,52,62,1,50,30,1,20,6,7,6,2,230,50,91,48,50,91,50,52,90, + 49,47,91,187,6,3,150,225,173,254,41,39,53,2,42,43,5,254,15,88,199,235,129,13,14,6,65,60,78,87,88,157,166,158,90,88,78,57,4,196, + 100,89,50,50,89,100,91,48,48,254,45,156,191,38,231,154,151,136,245,168,154,20,132,143,1,49,2,233,1,155,7,35,43,156,172,158,85,85,158,172, + 156,43,32,0,0,3,0,194,255,221,6,106,5,208,0,63,0,71,0,79,0,0,0,50,31,1,22,23,55,22,23,7,22,23,55,22,23,7,22,20, + 7,23,6,7,39,6,7,23,6,7,39,6,15,1,6,34,47,1,38,39,7,38,39,55,38,39,7,38,39,55,38,52,55,39,54,55,23,54,55,39, + 54,55,23,54,63,1,0,32,0,16,0,32,0,16,4,20,6,34,38,52,54,50,3,106,88,43,26,67,64,126,76,64,84,47,33,165,37,16,148,4, + 4,148,16,37,165,33,47,84,64,76,126,64,67,26,43,88,43,26,67,64,126,76,64,84,47,33,165,37,16,148,4,4,148,16,37,165,33,47,84,64, + 76,126,64,67,26,1,13,254,148,254,254,1,2,1,108,1,2,254,227,91,128,91,91,128,5,208,5,187,13,30,132,45,64,156,50,60,31,84,92,69, + 35,68,35,70,91,84,31,60,51,155,64,46,132,29,14,186,6,6,186,14,29,132,46,64,155,50,61,31,84,91,70,35,68,35,69,92,84,31,60,51, + 155,64,45,131,29,13,187,254,196,254,253,254,149,254,254,1,2,1,107,117,128,91,91,128,91,0,0,0,0,15,1,6,255,237,6,37,5,221,0,9, + 0,14,0,19,0,24,0,29,0,37,0,44,0,49,0,54,0,59,0,64,0,72,0,79,0,91,0,159,0,0,0,20,30,1,51,38,52,55,34,6, + 5,22,23,55,38,39,22,23,55,38,39,22,23,55,38,39,22,7,55,38,39,20,21,20,7,23,53,52,39,6,7,23,54,53,52,5,23,54,55,6, + 7,23,54,55,6,7,23,54,55,6,31,1,38,55,6,23,55,38,53,52,55,6,21,63,1,38,39,6,21,20,5,34,6,21,20,22,51,50,54,53, + 52,38,39,53,38,39,46,1,52,62,1,51,50,30,1,20,6,7,6,7,51,20,35,21,22,23,22,23,54,55,4,23,6,35,38,34,7,22,21,20, + 7,6,7,3,21,6,35,34,47,1,3,38,39,38,53,52,55,38,35,34,7,34,39,54,37,22,23,54,55,54,3,86,17,31,18,14,14,17,32,1, + 243,110,42,26,91,145,110,37,39,90,120,76,16,48,60,123,50,1,59,38,98,21,59,60,47,50,58,40,252,115,26,42,110,87,41,39,36,111,96,20, + 48,16,76,80,15,59,1,50,70,60,59,22,1,38,99,58,50,47,1,1,28,55,76,76,55,53,77,76,90,3,2,19,21,21,39,21,20,38,22,21, + 19,2,3,1,1,52,41,3,3,80,22,1,78,80,85,254,40,68,28,4,52,40,52,1,11,23,25,8,1,2,51,40,52,3,31,41,34,40,254,85, + 80,1,78,21,82,7,9,40,5,160,34,31,18,32,66,34,17,118,62,48,38,56,20,97,62,33,85,42,126,69,19,109,76,145,75,8,125,96,17,16, + 129,63,10,12,123,97,136,55,26,99,91,13,79,38,48,62,16,106,33,62,97,41,134,19,69,126,67,136,8,75,145,87,139,10,61,123,20,21,100,123, + 3,26,55,136,14,13,91,43,77,53,55,76,76,55,53,77,45,90,1,2,10,39,42,39,21,21,39,42,39,10,2,1,1,89,9,40,3,4,128,53, + 6,91,163,12,12,20,21,74,53,40,9,252,214,92,22,28,100,3,28,9,40,53,74,18,17,17,12,163,91,6,52,140,10,9,39,0,0,15,1,5, + 0,0,6,39,5,211,0,15,0,31,0,47,0,55,0,79,0,95,0,159,0,171,0,179,0,187,0,203,0,211,0,219,0,227,0,239,0,0,1,50, + 30,1,21,20,14,1,35,34,46,1,53,52,62,1,7,38,39,6,7,6,21,20,23,22,51,50,51,54,55,38,37,6,7,22,23,50,51,50,55,54, + 53,52,39,38,39,6,39,22,21,20,7,54,55,38,39,38,39,38,39,6,7,6,7,6,21,20,23,22,23,22,23,54,55,54,55,54,53,52,19,22, + 23,22,23,54,55,54,53,52,39,38,35,34,7,6,5,55,62,1,51,50,22,23,21,54,51,50,51,22,23,22,21,20,7,6,7,23,22,23,22,21, + 20,7,14,1,35,34,39,35,6,7,6,35,34,39,38,39,6,35,34,38,39,38,53,52,55,54,55,38,39,38,53,52,55,54,55,50,51,50,5,38, + 39,38,35,34,7,6,7,22,23,54,23,6,7,22,23,22,23,38,37,6,7,54,55,54,55,38,39,38,39,38,35,34,7,6,21,20,23,22,23,54, + 55,54,7,6,7,22,23,38,53,52,23,22,23,54,55,38,39,38,23,22,23,54,55,6,7,6,7,6,7,22,23,22,51,50,55,54,55,38,3,150, + 19,36,20,20,36,19,20,36,20,20,36,225,79,71,127,51,37,8,23,86,8,9,99,152,14,1,226,6,14,153,99,9,8,86,23,8,37,52,127,71, + 76,2,2,57,52,52,109,47,49,50,50,49,48,50,47,2,2,46,51,48,51,49,49,50,46,3,25,15,6,79,70,125,54,38,8,23,86,9,11,101, + 253,180,1,34,119,63,62,118,34,164,112,3,4,116,32,12,35,56,136,1,138,55,33,12,31,118,6,110,164,1,34,58,59,64,65,60,58,34,162,110, + 6,120,31,11,33,54,138,136,54,35,11,32,115,4,3,112,2,37,27,46,47,49,51,47,46,27,85,86,84,92,60,62,34,36,33,33,5,254,149,9, + 5,33,34,35,34,62,107,149,99,11,9,86,22,9,38,54,124,70,79,6,9,57,51,51,57,1,57,5,9,60,62,35,34,35,214,62,60,9,5,32, + 34,36,90,84,85,26,46,47,52,51,46,46,26,86,3,53,19,36,21,20,35,20,20,35,20,21,36,19,217,53,57,103,84,59,38,18,14,39,4,57, + 90,94,94,90,57,4,39,14,18,39,58,84,103,57,167,39,40,39,39,38,40,41,73,30,28,28,26,26,28,28,30,56,58,57,56,30,28,29,26,26, + 29,28,30,56,57,58,1,12,90,95,53,57,101,85,59,39,19,14,40,1,5,9,2,179,192,192,179,2,58,2,56,20,27,46,62,101,117,1,118,99, + 62,45,27,20,55,3,58,176,98,99,99,98,176,59,4,55,20,26,45,63,99,119,117,100,63,47,26,20,56,2,75,162,87,90,90,87,162,32,42,42, + 16,25,29,18,20,21,20,68,64,64,68,20,21,20,18,29,43,56,5,1,40,15,19,39,58,84,101,57,53,94,157,38,41,40,38,39,39,40,214,68, + 65,25,29,18,20,20,58,29,25,65,68,21,20,20,46,42,33,158,89,91,91,89,158,33,0,7,1,5,0,0,6,38,5,214,0,11,0,20,0,33, + 0,45,0,120,0,134,0,148,0,0,1,20,23,54,55,38,39,54,55,38,39,6,5,52,38,21,6,21,22,23,54,37,6,21,20,23,54,55,46,1, + 39,6,21,20,37,52,39,6,7,22,23,6,7,22,23,54,1,38,35,34,7,6,7,38,39,54,55,22,23,54,55,38,53,52,63,1,21,22,21,20, + 7,30,1,23,54,55,22,23,6,7,38,39,38,35,34,7,22,23,22,20,7,6,7,22,23,6,35,38,39,6,7,6,7,35,38,39,53,38,39,6, + 7,34,39,54,55,38,39,38,52,55,54,6,20,30,1,51,50,62,1,52,46,1,35,34,6,37,50,30,1,20,14,1,35,34,46,1,52,62,1,3, + 206,39,55,44,51,9,3,51,37,47,48,254,220,41,44,8,55,21,1,223,1,17,61,3,3,42,1,35,254,215,48,42,43,51,3,14,46,50,50,39, + 254,247,56,32,14,9,32,89,102,2,2,183,169,84,44,49,39,165,1,164,39,41,46,5,85,168,184,1,2,102,89,32,6,14,29,62,26,20,57,56, + 24,32,34,50,1,13,66,50,59,70,95,25,32,32,88,66,63,50,67,13,1,51,34,32,23,56,57,20,52,105,188,104,103,188,105,107,190,99,101,189, + 1,34,83,159,91,88,159,86,87,159,88,90,159,2,132,163,167,15,35,101,141,170,106,28,15,112,205,77,99,1,78,84,118,74,75,114,27,25,90,49, + 86,108,76,87,2,77,73,9,17,169,112,13,30,106,170,133,107,37,15,167,1,110,65,13,86,2,2,123,119,2,6,119,25,17,91,49,135,244,1,1, + 244,135,49,91,13,26,3,119,6,2,119,123,2,2,86,13,64,30,35,102,220,100,45,35,74,77,12,55,66,47,21,34,137,137,34,1,20,48,67,55, + 12,78,75,34,44,100,220,102,35,136,206,189,104,104,189,206,191,103,103,81,85,160,174,157,88,88,157,174,160,85,0,0,0,4,0,100,0,0,6,200, + 5,212,0,7,0,13,0,21,0,37,0,0,1,51,1,21,33,39,35,0,23,1,21,33,53,0,7,50,21,2,35,34,3,54,19,50,30,1,21,20, + 14,1,35,34,46,1,53,52,62,1,3,159,7,3,34,249,173,8,9,3,27,23,253,104,5,57,253,124,20,77,52,25,23,54,25,51,19,37,21,20, + 38,19,20,36,21,21,36,5,212,250,53,9,9,5,170,155,251,79,17,9,4,157,194,68,253,155,2,110,59,253,13,20,36,21,20,36,20,20,36,20, + 21,36,20,0,0,1,0,170,0,4,4,244,5,216,0,19,0,0,1,51,23,21,1,20,51,4,21,23,1,39,53,0,53,52,35,36,47,1,4,209, + 14,21,253,142,91,1,131,7,252,81,14,2,135,119,254,147,16,7,5,216,21,7,253,226,71,83,14,71,253,85,21,7,2,87,13,71,74,17,71,0, + 0,5,0,175,254,255,7,90,5,218,0,30,0,42,0,49,0,61,0,67,0,0,1,38,16,0,51,50,23,54,51,50,0,16,7,6,7,17,33,21, + 33,17,35,17,33,17,35,17,33,53,33,17,38,1,34,6,16,22,51,50,55,38,16,55,38,19,6,7,17,33,17,38,55,22,51,50,54,16,38,35, + 34,7,22,16,5,54,16,39,6,16,1,88,169,1,80,239,153,125,125,155,236,1,82,168,136,180,1,16,254,240,180,254,134,180,254,240,1,16,181,1, + 15,164,231,231,164,63,57,138,139,57,215,88,101,1,122,102,72,57,63,160,234,234,160,65,58,140,254,215,117,117,116,2,20,157,1,221,1,76,70,70, + 254,180,254,34,156,126,18,254,248,124,254,255,1,1,254,255,1,1,124,1,9,17,3,145,228,254,185,216,17,149,1,174,157,18,252,148,45,10,254,248, + 1,9,10,165,16,216,1,71,228,18,157,254,80,56,108,1,71,114,114,254,185,0,0,0,0,5,0,162,254,91,8,48,5,195,0,11,0,36,0,44, + 0,56,0,62,0,0,1,38,32,6,16,23,22,23,54,0,55,38,1,20,0,32,39,38,39,38,39,38,16,0,4,23,1,33,55,33,17,33,17,7, + 17,1,22,3,1,22,23,22,23,1,33,3,6,0,7,22,23,22,32,54,16,39,38,1,50,54,53,34,6,3,247,117,254,187,231,116,46,55,16,1, + 55,204,28,2,133,254,181,254,33,170,117,36,134,108,170,1,89,1,203,111,1,105,254,141,140,1,238,1,139,143,254,154,112,149,254,154,64,27,113,68, + 1,105,254,237,247,14,254,208,222,29,52,116,1,69,234,117,46,253,141,161,234,164,227,3,36,114,228,254,184,108,44,26,206,1,51,7,54,253,144,232, + 254,189,159,108,146,37,101,158,1,220,1,85,17,103,1,92,142,254,120,254,20,143,1,117,254,164,146,3,118,254,164,83,99,27,63,1,92,254,55,204, + 254,215,11,61,49,108,216,1,72,114,45,254,201,216,164,224,0,4,0,175,254,131,8,223,6,217,0,5,0,45,0,57,0,69,0,0,0,2,23,54, + 16,39,1,20,0,35,34,39,6,7,17,33,21,33,17,35,17,33,53,33,17,38,39,38,16,0,51,50,23,54,23,22,23,1,33,55,33,17,7,17, + 1,22,37,34,6,16,22,51,50,55,38,16,55,38,1,22,51,50,54,16,38,35,34,7,22,16,3,146,1,115,117,117,3,87,254,179,243,154,126,87, + 100,1,16,254,240,180,254,240,1,16,181,135,169,1,80,239,151,124,128,154,229,111,1,106,254,140,140,1,238,142,254,154,112,251,147,164,231,231,164,63, + 57,137,139,58,1,118,56,63,162,234,234,162,65,58,141,3,200,254,184,108,108,1,71,114,254,235,231,254,188,69,44,10,254,248,124,254,255,1,1,124, + 1,9,17,126,157,1,221,1,76,68,74,6,8,103,1,92,142,254,20,143,1,117,254,164,146,198,228,254,185,216,17,149,1,172,159,18,253,13,16,216, + 1,72,228,18,157,254,79,0,0,2,0,175,254,255,6,178,7,85,0,7,0,40,0,0,0,38,32,6,16,22,32,54,5,38,16,0,51,50,23,1, + 33,55,33,17,7,17,1,22,21,20,7,6,7,17,33,21,33,17,35,17,33,53,33,17,38,4,121,234,254,187,231,231,1,69,234,252,223,169,1,80, + 239,192,149,1,104,254,141,140,1,238,143,254,154,112,169,136,180,1,16,254,240,180,254,240,1,16,181,4,67,228,228,254,185,216,216,232,157,1,221,1, + 76,110,1,91,142,254,20,143,1,117,254,164,146,194,239,156,126,18,254,248,124,254,255,1,1,124,1,9,17,0,0,0,0,2,1,13,255,227,5,208, + 6,244,0,43,0,68,0,0,1,7,22,23,22,23,22,20,7,14,1,7,6,35,34,39,38,39,38,39,38,52,55,62,1,55,54,51,50,23,55,39, + 55,23,19,7,39,37,19,7,39,3,23,7,1,22,50,55,62,1,55,54,52,39,38,39,46,1,34,7,14,1,7,6,20,23,22,23,22,4,40,70, + 51,34,68,34,38,37,35,125,98,86,96,90,90,94,59,68,34,38,38,36,131,91,88,93,58,51,71,254,57,254,134,225,58,1,206,192,139,93,134,254, + 58,253,70,61,126,61,60,90,26,25,25,23,47,42,126,122,63,60,89,27,25,24,24,46,40,4,0,170,33,36,72,83,92,180,91,86,131,42,37,37, + 39,62,72,83,93,179,94,88,130,38,37,12,171,105,138,105,1,68,94,139,191,254,50,57,225,254,189,105,139,252,252,26,25,25,92,61,60,128,60,57, + 50,45,49,25,25,88,63,58,132,60,57,49,42,0,0,0,0,2,0,207,254,163,5,238,7,18,0,61,0,88,0,0,1,54,50,23,19,7,39,37, + 19,7,39,3,22,23,30,1,21,20,6,7,6,7,6,7,21,33,21,33,21,35,53,33,53,33,53,38,39,38,39,46,1,53,52,54,55,54,55,39, + 7,39,55,39,7,39,19,5,7,39,23,55,23,7,23,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1,53,52,38,39,38,39, + 38,2,238,52,112,54,179,226,57,1,206,192,140,93,179,46,40,69,71,71,69,64,90,45,60,1,19,254,237,150,254,237,1,19,56,49,86,68,69,71, + 70,70,39,49,31,254,57,254,84,93,140,192,1,206,57,226,84,254,58,254,138,71,53,62,43,46,49,49,46,47,58,57,138,53,62,43,46,49,49,46, + 47,58,57,4,135,12,12,1,158,92,138,191,254,50,58,226,254,97,29,40,69,171,98,95,171,69,64,40,20,10,184,150,240,240,150,184,9,21,37,67, + 69,171,95,98,169,71,40,30,72,105,138,106,203,226,58,1,206,191,138,92,203,105,138,106,211,24,28,43,46,119,66,65,119,46,47,24,24,24,28,43, + 46,119,65,66,119,46,47,24,24,0,0,0,0,2,1,128,255,227,5,52,6,244,0,43,0,70,0,0,1,17,33,21,33,21,22,23,22,23,30,1, + 21,20,6,7,6,7,6,35,34,39,38,39,46,1,53,52,54,55,54,55,54,55,53,33,53,33,17,7,39,9,1,7,3,50,55,54,55,62,1,53, + 52,38,39,38,39,38,34,7,6,7,14,1,21,20,22,23,22,23,22,3,165,1,19,254,237,60,45,90,64,69,71,71,69,68,86,82,98,102,78,90, + 64,69,71,71,69,68,86,49,56,254,237,1,19,172,107,1,98,1,98,106,248,67,57,58,47,46,49,49,46,43,62,53,138,57,58,47,46,49,49,46, + 43,62,53,5,213,254,231,150,145,10,20,40,64,69,171,95,98,171,69,67,37,35,35,40,64,69,171,98,95,171,69,67,37,21,9,145,150,1,25,173, + 107,1,97,254,159,106,251,80,24,24,47,46,119,66,65,119,46,43,28,24,24,24,47,46,119,65,66,119,46,43,28,24,0,2,0,9,1,16,6,161, + 4,196,0,43,0,70,0,0,1,35,17,35,17,35,6,7,6,7,14,1,35,34,38,39,38,39,38,53,52,55,54,55,62,1,51,50,22,23,22,23, + 22,23,51,17,51,17,51,39,55,9,1,39,37,20,23,22,23,30,1,51,50,54,55,54,55,54,52,39,38,39,46,1,35,34,6,7,6,7,6,5, + 130,220,150,85,10,20,40,64,69,171,95,98,171,69,67,37,35,35,40,64,69,171,98,95,171,69,67,37,21,9,85,150,220,173,107,1,97,254,159,106, + 251,201,24,24,47,46,119,66,65,119,46,43,28,24,24,24,47,46,119,65,66,119,46,43,28,24,2,159,254,237,1,19,60,45,90,64,69,71,71,69, + 68,86,82,98,102,78,90,64,69,71,71,69,68,86,49,56,1,19,254,237,172,107,254,158,254,158,106,248,67,57,58,47,46,49,49,46,43,62,53,138, + 57,58,47,46,49,49,46,43,62,53,0,0,0,2,1,127,1,16,5,53,4,197,0,11,0,23,0,31,64,15,21,18,3,15,18,9,24,25,18,18, + 6,12,18,0,24,16,220,236,212,236,196,49,0,16,212,236,212,236,48,1,52,0,51,50,0,21,20,0,35,34,0,55,20,22,51,50,54,53,52,38, + 35,34,6,1,127,1,23,196,196,1,23,254,233,196,196,254,233,153,189,133,133,189,189,133,133,189,2,235,196,1,22,254,234,196,197,254,234,1,22,194, + 133,189,189,133,134,189,189,0,0,1,1,127,1,16,5,53,4,197,0,11,0,19,64,7,3,9,12,13,6,0,12,16,220,212,204,49,0,16,212,196, + 48,1,52,0,51,50,0,21,20,0,35,34,0,1,127,1,23,196,196,1,23,254,233,196,196,254,233,2,235,196,1,22,254,234,196,197,254,234,1,22, + 0,2,1,250,1,141,4,186,4,75,0,11,0,23,0,43,64,15,21,107,3,15,107,9,24,25,18,107,6,12,107,0,24,16,220,236,212,75,176,16, + 84,88,185,0,6,255,192,56,89,236,196,49,0,16,212,236,212,236,48,1,52,54,51,50,22,21,20,6,35,34,38,55,20,22,51,50,54,53,52,38, + 35,34,6,1,250,207,145,145,207,207,145,145,207,152,117,83,83,117,117,83,83,117,2,236,146,205,205,146,145,206,206,144,83,117,117,83,83,118,118,0, + 0,4,1,100,1,141,5,80,4,75,0,19,0,33,0,41,0,55,0,101,75,176,11,82,88,64,31,3,7,13,17,29,42,25,46,8,27,44,15,38, + 34,5,4,40,36,10,107,51,44,107,40,36,107,27,20,107,0,56,16,212,236,212,236,212,236,212,236,17,18,23,57,17,18,23,57,49,0,64,21,38, + 34,23,31,5,3,31,15,23,17,31,54,107,7,3,48,23,107,13,17,56,16,212,60,236,50,212,60,236,50,17,18,57,17,18,57,17,18,57,57,48, + 89,1,52,54,51,50,23,54,51,50,22,21,20,6,35,34,39,6,35,34,38,55,20,22,51,50,51,38,53,52,55,38,35,34,6,37,6,21,20,23, + 54,53,52,55,22,21,20,7,50,51,50,54,53,52,38,35,34,1,100,207,145,82,68,68,82,145,207,207,145,82,68,68,82,145,207,152,117,83,6,5, + 63,62,5,5,83,117,1,94,50,50,50,90,62,63,5,6,83,117,117,83,5,2,236,146,205,32,32,205,146,145,206,33,33,206,144,83,117,88,113,112, + 87,1,118,50,56,77,76,56,56,76,77,123,87,112,113,88,117,83,83,118,0,5,0,84,1,90,6,96,4,122,0,3,0,29,0,56,0,82,0,109, + 0,0,1,51,17,35,0,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1,53,52,38,39,38,47,1,50,23,22,23,30,1,21, + 20,6,7,6,7,6,34,39,38,39,46,1,53,52,54,55,54,55,54,4,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1,53, + 52,38,39,38,47,1,50,23,22,23,30,1,21,20,6,7,6,7,6,34,39,38,39,46,1,53,52,54,55,54,55,54,3,15,150,150,2,29,82,35, + 41,24,29,30,31,28,29,36,35,82,35,36,29,29,30,32,27,29,36,76,75,58,67,46,50,53,53,50,49,64,61,147,58,67,46,50,53,53,50,49, + 64,61,253,31,82,35,41,24,29,30,31,28,29,36,35,82,35,36,29,29,30,32,27,29,36,76,75,58,67,46,50,53,53,50,49,64,61,147,58,67, + 46,50,53,53,50,49,64,61,4,122,252,224,2,90,15,18,26,31,70,41,40,74,27,28,16,15,15,16,28,30,71,40,41,75,26,28,16,165,26,30, + 46,50,127,73,70,127,50,49,27,26,26,30,46,50,127,70,73,127,50,49,27,26,150,15,18,26,31,70,41,40,74,27,28,16,15,15,16,28,30,71, + 40,41,75,26,28,16,165,26,30,46,50,127,73,70,127,50,49,27,26,26,30,46,50,127,70,73,127,50,49,27,26,0,0,3,0,10,1,141,6,170, + 4,74,0,55,0,81,0,107,0,0,1,62,1,55,54,55,54,51,50,23,22,23,30,1,21,20,6,7,6,7,6,34,39,38,39,46,1,39,33,14, + 1,7,6,7,6,34,39,38,39,46,1,53,52,54,55,54,55,54,51,50,23,22,23,30,1,23,36,34,7,6,7,14,1,21,20,22,23,22,23,22, + 50,55,54,55,62,1,53,52,38,39,38,39,36,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1,53,52,38,39,38,39,3,247, + 7,35,54,49,64,61,72,75,58,67,46,50,53,53,50,49,64,61,147,58,67,46,53,37,6,254,197,6,39,50,49,64,61,147,58,67,46,50,53,53, + 50,49,64,61,72,75,58,67,46,54,35,7,2,185,82,35,36,29,29,30,30,29,29,36,35,82,35,36,29,29,30,30,29,29,36,251,247,82,35,41, + 24,29,30,31,28,29,36,35,82,35,36,29,29,30,32,27,29,36,3,53,31,91,53,49,27,26,26,30,46,50,127,73,70,127,50,49,27,26,26,30, + 46,52,96,24,29,93,50,49,27,26,26,30,46,50,127,70,73,127,50,49,27,26,26,30,46,53,91,31,127,15,16,28,31,70,41,40,71,30,28,16, + 15,15,16,28,30,71,40,41,70,31,28,16,15,15,18,26,31,70,41,40,74,27,28,16,15,15,16,28,30,71,40,41,75,26,28,16,0,2,0,210, + 1,230,6,14,4,82,0,5,0,11,0,0,1,53,37,7,21,23,1,37,5,17,5,37,5,120,252,204,220,220,254,142,1,114,3,202,252,54,254,142, + 2,215,138,101,77,186,77,1,94,130,120,254,132,120,130,0,0,2,1,177,0,86,5,3,5,150,0,21,0,41,0,0,1,55,54,53,52,39,38,39, + 53,55,53,35,21,23,21,6,7,6,21,20,31,2,33,3,38,53,52,55,54,55,39,53,33,21,7,22,23,22,21,20,7,3,115,95,118,82,36,78, + 58,200,58,78,36,82,118,95,163,254,236,164,123,97,84,44,88,2,64,88,44,84,97,123,1,17,180,223,52,98,92,41,49,162,37,61,61,37,162,49, + 41,92,98,52,223,180,187,1,58,234,96,190,92,75,25,68,250,250,68,25,75,92,190,96,234,0,0,0,0,2,0,175,254,255,5,45,5,218,0,7, + 0,21,0,0,0,38,32,6,16,22,32,54,5,38,16,0,32,0,16,7,6,7,17,35,17,38,4,121,234,254,187,231,231,1,69,234,252,223,169,1, + 80,1,219,1,83,169,136,180,180,181,4,67,228,228,254,185,216,216,232,157,1,221,1,76,254,180,254,34,156,126,18,253,123,2,134,17,0,1,1,89, + 254,255,5,44,5,218,0,26,0,0,33,17,35,17,33,53,33,17,22,51,50,54,16,38,32,7,39,54,32,0,16,7,6,7,17,33,21,3,73,181, + 254,240,1,16,40,52,161,232,232,254,187,126,117,168,1,219,1,80,167,137,179,1,15,254,255,1,1,124,1,178,7,216,1,71,228,106,116,166,254,180, + 254,32,154,126,18,254,248,124,0,2,0,176,254,255,5,44,5,218,0,19,0,23,0,0,19,9,2,17,50,51,21,34,35,17,34,35,17,34,35,53, + 50,51,17,55,9,2,176,2,62,2,62,254,33,135,136,136,135,91,90,136,136,136,136,86,1,76,254,180,254,180,3,159,2,59,253,197,253,233,254,244, + 124,254,255,1,1,124,1,12,168,1,111,1,74,254,182,0,0,1,0,176,254,255,5,44,5,218,0,31,0,0,1,55,23,17,51,17,55,23,1,33, + 21,33,1,7,39,17,33,21,33,17,35,17,33,53,33,17,7,39,1,33,53,33,1,29,123,253,179,252,123,254,228,1,137,254,126,1,21,122,253,1, + 16,254,240,180,254,240,1,16,253,122,1,21,254,126,1,137,4,249,122,253,1,100,254,157,252,122,254,228,124,254,235,123,253,253,174,124,254,255,1,1, + 124,2,82,253,123,1,21,124,0,3,0,120,255,15,6,84,5,37,0,9,0,13,0,23,0,0,1,21,33,9,1,33,53,33,9,1,3,17,35,17, + 1,33,23,55,33,21,35,9,1,35,6,84,254,211,254,63,254,63,254,211,1,162,1,76,1,76,241,172,254,119,1,4,214,214,1,4,142,254,180,254, + 180,142,1,74,124,254,65,1,191,124,254,182,1,74,3,219,253,166,2,90,253,116,213,213,124,254,182,1,74,0,0,0,0,2,1,142,255,44,4,194, + 5,175,0,7,0,28,0,0,36,20,22,50,54,52,38,34,2,38,16,55,54,55,17,51,17,37,23,13,1,7,37,17,22,23,22,16,6,2,38,117, + 166,117,117,166,62,207,104,72,93,172,1,37,86,254,153,1,103,86,254,219,89,70,104,207,221,166,117,117,166,118,253,217,206,1,35,103,71,22,3,206, + 254,206,173,148,209,210,148,174,254,210,22,69,103,254,221,206,0,1,1,68,254,255,4,88,5,218,0,30,0,0,33,17,35,17,33,53,33,17,38,39, + 38,53,16,37,54,55,54,23,6,7,6,21,16,23,22,23,6,39,21,33,21,3,72,180,254,240,1,16,156,102,78,1,41,93,174,72,59,203,98,116, + 250,87,85,74,110,1,16,254,255,1,1,124,1,51,76,152,117,161,1,46,185,58,16,7,23,59,133,157,196,254,205,162,56,15,37,19,255,124,0,0, + 0,3,0,86,0,8,6,94,4,109,0,15,0,29,0,51,0,0,19,21,20,23,22,32,55,54,61,1,6,7,6,32,39,38,0,32,7,6,21,20, + 23,22,32,55,54,53,52,39,55,30,1,21,17,20,6,7,6,33,32,39,46,1,53,17,52,54,55,54,33,32,186,171,206,2,78,206,171,46,56,240, + 253,108,237,63,3,157,253,178,206,171,171,206,2,78,206,171,171,44,115,112,112,112,230,254,194,254,199,232,115,112,112,112,230,1,62,1,57,2,29,147, + 96,86,104,104,86,96,146,34,28,120,120,32,2,11,104,86,99,96,86,104,104,86,96,99,86,89,57,136,81,254,162,78,136,57,115,115,57,136,78,1, + 94,81,136,57,115,0,0,0,0,4,0,86,0,8,6,94,5,203,0,13,0,29,0,45,0,69,0,0,0,32,7,6,21,20,23,22,32,55,54,53, + 52,39,1,21,20,23,22,32,55,54,61,1,6,7,6,32,39,38,3,21,20,23,22,32,55,54,61,1,6,7,6,32,39,38,1,30,1,21,25,1, + 20,6,7,6,33,32,39,46,1,53,25,1,52,54,55,54,33,32,4,129,253,178,206,171,171,206,2,78,206,171,171,251,107,171,206,2,78,206,171,46, + 56,240,253,108,237,63,42,171,206,2,78,206,171,46,56,240,253,108,237,63,4,151,115,112,112,112,230,254,194,254,199,232,115,112,112,112,230,1,62,1, + 57,5,103,104,86,99,96,86,104,104,86,96,99,86,254,124,147,96,86,104,104,86,96,146,34,28,120,120,32,254,193,147,96,86,104,104,86,96,146,34, + 28,120,120,32,3,90,57,136,81,254,162,254,162,78,136,57,115,115,57,136,78,1,94,1,94,81,136,57,115,0,0,0,0,5,0,86,0,8,6,94, + 4,109,0,11,0,33,0,49,0,63,0,85,0,0,1,6,7,6,33,32,39,38,39,22,33,32,0,32,23,22,23,22,21,6,7,6,7,6,32,39, + 38,39,38,55,54,55,54,55,3,21,20,23,22,32,55,54,61,1,6,7,6,32,39,38,0,32,7,6,21,20,23,22,32,55,54,53,52,39,55,30, + 1,21,17,20,6,7,6,33,32,39,46,1,53,17,52,54,55,54,33,32,5,120,31,56,184,254,241,254,239,182,59,30,236,1,52,1,49,253,192,2, + 32,182,58,31,28,2,26,31,58,184,253,224,182,59,30,29,1,1,27,32,57,217,171,206,2,78,206,171,46,56,240,253,108,237,63,3,157,253,178,206, + 171,171,206,2,78,206,171,171,44,115,112,112,112,230,254,194,254,199,232,115,112,112,112,230,1,62,1,57,1,100,27,28,93,93,30,26,99,2,163,93, + 29,28,25,14,14,22,28,29,93,93,30,27,24,12,15,24,28,29,254,213,147,96,86,104,104,86,96,146,34,28,120,120,32,2,11,104,86,99,96,86, + 104,104,86,96,99,86,89,57,136,81,254,162,78,136,57,115,115,57,136,78,1,94,81,136,57,115,0,0,0,7,0,86,0,8,6,94,5,203,0,21, + 0,33,0,45,0,59,0,75,0,91,0,115,0,0,0,32,23,22,23,22,21,6,7,6,7,6,32,39,38,39,38,55,54,55,54,55,1,6,7,6, + 33,32,39,38,39,22,33,32,23,6,7,6,33,32,39,38,39,22,33,32,2,32,7,6,21,20,23,22,32,55,54,53,52,39,1,21,20,23,22,32, + 55,54,61,1,6,7,6,32,39,38,3,21,20,23,22,32,55,54,61,1,6,7,6,32,39,38,1,30,1,21,25,1,20,6,7,6,33,32,39,46, + 1,53,25,1,52,54,55,54,33,32,2,75,2,32,182,58,31,28,2,26,31,58,184,253,224,182,59,30,29,1,1,27,32,57,3,229,31,56,184,254, + 241,254,239,182,59,30,236,1,52,1,49,237,31,56,184,254,241,254,239,182,59,30,236,1,52,1,49,10,253,178,206,171,171,206,2,78,206,171,171,251, + 107,171,206,2,78,206,171,46,56,240,253,108,237,63,42,171,206,2,78,206,171,46,56,240,253,108,237,63,4,151,115,112,112,112,230,254,194,254,199,232, + 115,112,112,112,230,1,62,1,57,5,3,93,29,28,25,14,14,22,28,29,93,93,30,27,24,12,15,24,28,29,254,28,27,28,93,93,30,26,99,252, + 27,28,93,93,30,26,99,4,101,104,86,99,96,86,104,104,86,96,99,86,254,124,147,96,86,104,104,86,96,146,34,28,120,120,32,254,193,147,96,86, + 104,104,86,96,146,34,28,120,120,32,3,90,57,136,81,254,162,254,162,78,136,57,115,115,57,136,78,1,94,1,94,81,136,57,115,0,0,3,0,175, + 255,227,5,45,6,190,0,11,0,32,0,44,0,0,1,34,38,53,52,54,51,50,22,21,20,6,19,22,23,22,21,20,0,35,34,0,16,55,54,55, + 3,1,39,9,1,21,1,3,50,54,53,52,38,35,34,6,21,20,22,2,238,64,97,94,67,70,91,94,23,181,135,169,254,176,239,236,254,173,169,136, + 180,1,254,249,1,1,99,1,99,254,247,90,164,231,231,164,161,234,234,1,125,91,68,62,88,85,65,66,93,2,187,17,126,157,238,239,254,180,1,76, + 1,222,156,126,18,1,103,254,250,199,1,93,254,163,199,1,5,250,247,228,164,163,216,216,163,164,228,0,0,3,0,22,1,133,6,108,5,20,0,80, + 0,106,0,133,0,0,1,39,35,34,39,38,7,6,20,7,14,1,7,6,35,34,39,38,39,38,39,38,52,55,62,1,55,54,51,50,31,1,22,51, + 50,55,62,1,55,54,38,39,38,39,38,47,1,38,39,38,39,38,52,55,62,1,55,54,50,22,23,22,23,22,20,7,14,1,7,6,23,22,31,1, + 33,50,23,22,23,33,23,37,22,51,50,55,62,1,55,54,52,39,38,39,46,1,35,34,7,14,1,7,6,20,23,30,1,1,38,35,34,7,14,1, + 7,6,20,23,22,23,30,1,51,50,55,62,1,55,54,52,39,38,39,38,3,205,214,115,174,28,42,3,2,9,13,48,36,28,43,36,36,36,26,21, + 23,18,12,13,49,35,29,42,35,9,90,97,90,37,14,22,37,3,3,7,13,12,22,78,84,49,50,25,28,15,19,12,13,52,32,35,72,72,26,31, + 13,18,12,9,30,3,5,34,41,109,82,1,139,232,79,101,17,253,98,213,252,13,21,20,24,16,21,29,5,5,12,10,15,17,44,17,20,20,21,26, + 7,6,13,10,30,1,48,18,23,28,12,21,30,4,5,12,10,15,15,43,20,23,17,21,28,5,6,13,10,15,11,1,133,205,6,8,13,8,41,23, + 32,46,13,11,15,14,25,21,36,29,74,30,32,46,13,11,3,37,39,3,5,28,7,8,46,19,19,19,68,34,20,20,24,27,30,38,66,29,32,49, + 10,11,30,24,30,28,36,67,30,23,29,7,13,22,26,109,82,32,41,75,207,121,9,5,7,24,16,17,31,23,18,13,16,16,6,6,23,17,17,32, + 22,18,28,2,181,9,5,7,25,15,17,33,21,18,14,13,18,5,7,25,14,18,32,22,18,14,9,0,0,3,0,86,1,33,6,69,4,181,0,21, + 0,100,0,122,0,0,18,50,54,55,62,1,53,52,38,39,46,1,34,6,7,14,1,21,20,22,23,22,1,5,6,35,34,39,37,7,14,1,21,20, + 22,21,20,6,7,6,7,6,34,39,38,39,46,1,53,52,54,55,54,55,54,59,1,50,55,62,2,52,46,1,39,38,43,1,34,39,38,39,46,1, + 53,52,54,55,54,55,54,50,23,22,23,30,1,21,20,6,21,20,22,31,1,37,54,51,50,23,36,34,6,7,14,1,21,20,22,23,30,1,50,54, + 55,62,1,53,52,38,39,38,253,46,38,16,17,16,16,17,16,38,46,38,16,17,16,16,17,16,3,1,2,109,44,109,81,219,254,145,106,150,80,17, + 28,28,22,40,33,78,33,34,28,26,30,28,28,22,40,33,9,97,86,102,27,38,24,24,38,27,98,90,53,53,33,40,22,28,28,30,26,28,34,33, + 78,33,40,22,28,28,17,80,150,106,1,111,219,81,109,44,250,230,46,38,16,17,16,16,17,16,38,46,38,16,17,16,16,17,16,1,113,14,13,14, + 31,19,18,31,14,13,14,14,13,14,31,18,19,31,14,13,1,108,252,63,87,146,44,62,14,14,8,38,25,35,60,26,21,16,13,13,14,23,21,65, + 35,34,60,26,21,16,13,34,9,26,40,16,40,26,9,34,13,16,21,26,60,34,35,65,21,23,14,13,13,16,21,26,60,35,25,38,8,14,14,62, + 44,146,87,63,126,14,13,14,31,19,18,31,14,13,14,14,13,14,31,18,19,31,14,13,0,3,0,22,0,192,6,108,4,79,0,79,0,106,0,133, + 0,0,1,51,7,33,6,7,6,35,33,7,6,7,6,21,20,22,23,22,20,7,6,7,14,1,34,39,46,1,39,38,52,55,54,55,54,63,1,54, + 55,54,55,62,1,39,46,1,39,38,35,34,15,1,6,35,34,39,46,1,39,38,52,55,62,1,55,54,51,50,23,30,1,23,22,20,23,22,55,54, + 59,1,37,6,7,6,7,6,20,23,30,1,23,22,51,50,54,55,54,55,54,52,39,46,1,39,38,35,34,1,54,55,54,55,54,52,39,46,1,39, + 38,35,34,6,7,6,7,6,20,23,30,1,23,22,51,50,3,205,214,213,2,158,17,101,79,232,254,117,82,100,50,29,33,9,12,18,13,31,26,72, + 72,35,32,55,10,12,19,12,31,25,9,90,84,78,22,12,13,7,3,3,29,30,8,43,90,97,50,49,35,43,28,36,48,13,12,18,18,52,36,36, + 36,43,28,36,48,13,9,2,6,39,25,177,115,253,185,21,15,9,16,13,6,7,23,24,17,23,21,42,15,15,10,13,6,7,22,26,17,23,20,1, + 6,21,15,9,16,13,6,7,28,19,18,22,21,42,15,15,10,12,5,7,30,18,20,20,14,4,79,207,75,41,32,82,100,35,20,15,6,30,23,33, + 62,38,28,30,24,30,11,10,51,30,34,57,42,27,30,24,4,36,34,68,19,19,19,46,8,7,22,11,3,39,20,20,11,14,45,32,32,68,33,32, + 50,14,15,11,13,46,32,23,44,5,14,9,6,84,8,14,8,24,19,37,15,17,21,8,6,18,14,13,18,22,35,14,18,21,8,5,253,58,9,13, + 8,24,19,38,15,16,25,5,5,18,13,14,18,19,40,12,17,25,5,5,0,9,0,73,0,244,6,152,4,232,0,90,0,120,0,150,0,180,0,210, + 0,254,1,45,1,52,1,72,0,0,1,54,55,38,39,38,39,38,43,1,34,39,38,39,38,39,38,52,55,54,55,54,55,54,51,50,23,22,23,22, + 23,22,21,20,7,22,31,1,37,54,51,50,23,22,21,20,7,13,1,22,21,20,7,6,35,34,39,37,7,6,7,22,21,20,7,6,7,6,7,6, + 35,34,39,38,39,38,39,38,53,52,55,54,55,54,55,54,59,1,50,55,54,0,50,55,54,55,54,55,54,53,52,39,38,39,38,39,38,34,7,6, + 7,6,7,6,21,20,23,22,23,22,23,18,50,55,54,55,54,55,54,53,52,39,38,39,38,39,38,34,7,6,7,6,7,6,21,20,23,22,23,22, + 23,18,34,39,38,39,38,39,38,53,52,55,54,55,54,55,54,50,23,22,23,22,23,22,21,20,7,6,7,6,7,2,34,39,38,39,38,39,38,53, + 52,55,54,55,54,55,54,50,23,22,23,22,23,22,21,20,7,6,7,6,7,5,39,38,39,38,39,38,53,52,55,54,53,52,39,38,39,38,39,38, + 34,7,6,7,6,7,6,21,20,23,22,23,22,23,22,59,1,50,23,22,23,22,23,55,54,3,45,1,38,35,34,7,5,6,7,6,7,6,7,6, + 43,1,34,7,6,7,6,7,6,21,20,23,22,23,22,23,22,50,55,54,55,54,55,54,53,52,39,38,53,52,55,54,37,5,22,51,50,55,37,38, + 20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,50,23,22,23,2,73,11,7,7,11,9,25,81,92,67,45,45,37,40,34,19,18,18,16,40, + 27,47,42,48,46,44,43,34,40,13,18,6,47,142,88,1,93,226,92,136,57,8,30,254,2,1,254,30,8,60,133,92,226,254,163,88,142,47,6,18, + 19,34,36,41,48,42,51,39,41,34,42,13,18,18,16,37,28,49,42,48,67,82,91,23,254,235,28,11,12,9,10,3,3,3,3,10,9,12,11,28, + 11,12,9,10,3,3,3,3,10,9,12,11,28,11,12,9,10,3,3,3,3,10,9,12,11,28,11,12,9,10,3,3,3,3,10,9,12,50,50,21, + 21,17,19,9,9,9,9,19,17,21,21,50,21,21,17,19,9,9,9,9,19,17,21,21,50,21,21,17,19,9,9,9,9,19,17,21,21,50,21,21, + 17,19,9,9,9,9,19,17,21,1,134,37,149,39,22,11,16,11,6,13,13,27,20,38,31,74,31,32,27,24,15,13,13,13,27,20,38,31,37,67, + 92,100,30,18,23,7,35,28,189,1,237,2,95,42,93,79,217,254,145,148,18,17,23,20,28,104,88,67,37,31,38,20,27,13,13,13,15,24,27,32, + 31,74,31,38,20,27,13,13,6,11,16,12,1,147,1,31,217,79,93,42,253,221,217,5,6,9,9,22,9,9,6,5,5,6,9,9,22,9,9,6, + 2,217,8,13,14,7,6,10,32,16,13,34,28,41,38,96,38,34,39,26,18,16,16,16,31,36,34,47,39,29,18,9,60,37,139,90,83,13,17,31, + 12,207,207,12,37,13,11,83,90,139,37,60,9,24,23,47,39,42,29,32,14,16,16,17,28,34,37,53,34,45,40,36,35,27,19,16,32,9,254,210, + 4,5,8,7,7,4,8,7,5,6,8,7,5,4,4,5,8,7,7,4,7,8,5,6,8,7,5,2,59,4,5,8,7,7,4,7,8,5,6,8, + 7,5,4,4,5,8,7,7,4,8,7,5,6,8,7,5,253,130,7,8,14,16,17,18,22,21,18,17,16,14,8,7,7,8,14,16,17,18,21,22, + 18,17,16,14,8,2,56,7,8,14,16,17,18,21,22,18,17,16,14,8,7,7,8,14,16,17,18,22,21,18,17,16,14,8,92,15,61,7,4,6, + 8,14,10,24,14,23,33,28,27,25,19,16,12,12,14,22,19,32,28,33,32,28,27,25,19,16,12,34,10,14,17,8,24,17,254,242,194,247,47,86, + 146,67,30,30,15,14,10,34,12,16,19,25,27,28,32,33,28,32,19,22,14,12,12,16,19,25,27,28,33,23,13,25,10,20,2,2,91,117,86,47, + 225,43,22,9,9,6,5,5,6,9,9,22,9,9,6,5,5,6,9,0,0,3,0,86,255,227,6,94,5,240,0,97,0,117,0,135,0,0,1,14, + 1,21,20,22,23,22,23,22,32,55,54,55,62,1,53,52,38,39,38,39,38,35,34,7,6,7,14,1,21,20,22,23,21,38,2,53,52,18,55,54, + 55,54,51,50,23,22,23,22,18,21,20,2,7,6,7,6,32,39,46,2,53,52,54,55,38,53,52,55,18,51,50,23,22,21,20,7,6,35,34,7, + 6,7,6,21,20,23,22,21,20,7,6,7,6,35,34,23,54,55,54,55,54,55,22,23,22,7,6,7,6,7,6,35,34,39,38,1,22,23,22,21, + 20,7,6,7,6,35,34,39,54,55,54,53,52,2,19,3,12,21,19,20,24,111,1,27,122,119,98,100,97,95,102,95,122,120,138,134,124,119,98,100, + 97,77,44,107,114,110,117,108,141,140,156,154,142,134,115,112,115,110,117,110,139,141,254,199,138,42,68,36,32,28,4,108,181,169,81,6,16,36,34,9, + 54,42,31,68,63,16,18,22,34,53,39,18,16,75,24,40,50,25,23,3,45,6,18,2,10,19,27,35,32,19,3,3,27,1,158,62,22,16,21,13, + 30,10,28,10,58,17,29,30,1,55,6,30,27,28,50,18,19,11,51,51,49,99,100,237,136,141,232,105,96,52,51,51,49,99,100,237,141,135,188,62, + 152,109,1,16,156,157,1,16,119,110,60,59,59,56,114,111,254,236,161,152,254,240,119,112,58,59,59,18,66,86,48,47,77,31,16,15,205,239,1,144, + 8,20,56,58,68,64,42,31,124,115,97,32,22,27,30,9,45,70,40,28,55,12,34,42,61,56,25,38,8,21,15,48,33,50,29,28,1,6,4,32, + 22,17,12,49,45,53,36,38,12,10,18,54,58,66,52,0,0,6,0,86,255,227,6,94,5,240,0,13,0,26,0,40,0,66,0,92,0,119,0,0, + 1,46,1,39,37,6,21,20,22,23,22,23,22,23,19,38,39,38,34,7,6,7,19,54,51,50,23,19,5,14,1,7,37,54,55,54,55,62,1,53, + 52,36,50,23,22,23,30,1,21,20,6,7,6,7,6,34,39,38,39,46,1,53,52,54,55,54,55,19,34,7,6,7,14,1,21,20,22,23,30,1, + 32,55,54,55,62,1,53,52,38,39,38,39,38,39,50,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,54, + 1,169,63,39,5,1,42,8,38,36,32,49,20,8,243,36,45,43,104,43,45,36,70,51,55,56,50,136,1,42,2,42,63,254,146,14,14,49,32,36, + 38,254,231,62,26,27,22,22,22,22,22,22,27,26,62,26,27,22,22,22,22,22,22,27,57,134,124,119,98,100,97,98,99,96,242,1,17,122,119,98, + 100,97,95,102,95,122,120,138,154,142,134,115,112,115,110,117,110,139,141,254,203,142,134,115,112,115,110,117,108,141,140,1,119,73,95,15,253,30,34,50, + 91,36,32,22,9,1,1,163,34,20,19,19,20,34,1,131,9,9,254,11,253,7,103,73,131,4,6,22,32,36,91,50,33,118,11,12,21,23,53,31, + 30,53,23,21,12,11,11,12,21,23,53,30,31,53,23,21,12,2,21,51,49,99,100,237,141,133,241,99,97,102,51,49,99,100,237,136,141,232,105,96, + 52,51,100,59,56,114,111,254,236,161,152,254,240,119,112,58,59,59,56,114,111,1,20,156,157,1,16,119,110,60,59,0,0,1,0,120,0,44,6,65, + 5,170,0,45,0,0,19,53,55,39,51,23,54,37,2,3,51,23,51,21,35,23,51,21,35,23,33,50,23,22,20,7,6,35,33,7,51,21,35,7, + 51,21,35,7,35,18,19,36,39,7,35,55,148,36,64,100,146,146,1,30,53,171,123,115,148,86,100,154,93,152,1,8,70,48,32,32,48,70,254,248, + 152,93,154,100,86,148,115,123,171,53,254,226,146,146,100,64,2,215,40,5,218,201,13,10,1,20,1,106,150,80,130,80,198,26,17,44,17,26,198,80, + 130,80,150,1,96,1,30,11,12,201,218,0,0,5,0,132,0,220,6,48,4,249,0,13,0,20,0,34,0,41,0,45,0,0,9,1,33,1,54,55, + 54,55,54,50,23,22,23,22,23,1,17,1,22,21,20,5,1,33,1,6,7,6,7,6,34,39,38,39,38,39,1,17,1,38,53,52,1,17,33,17, + 3,246,1,184,251,88,1,184,7,8,29,36,35,82,35,43,22,8,47,1,174,254,82,3,254,159,254,70,4,168,254,70,6,7,29,36,35,82,35,36, + 29,7,49,254,83,1,173,3,253,242,5,172,3,104,1,44,254,212,9,8,28,16,15,15,19,25,9,170,254,222,2,141,254,221,17,18,19,107,254,211, + 1,45,8,7,28,16,15,15,16,28,7,170,1,34,253,115,1,33,19,19,18,253,223,4,29,251,227,0,0,4,1,179,0,0,4,124,5,239,0,80, + 0,208,0,227,0,243,0,0,1,52,55,54,63,1,54,55,54,51,23,38,39,38,39,38,53,52,55,54,51,50,23,22,23,22,31,1,22,23,54,55, + 54,55,54,55,54,53,52,39,38,53,52,55,54,51,50,23,22,23,22,21,20,7,3,20,21,20,31,1,22,21,20,7,23,22,7,6,29,1,33,53, + 52,39,38,39,38,53,52,39,38,1,38,35,34,15,1,6,15,1,6,15,1,39,38,47,1,38,39,38,39,38,35,34,7,6,21,20,23,22,31,2, + 22,23,22,21,20,7,6,35,34,39,38,39,38,47,1,38,39,38,35,34,7,6,7,22,23,22,23,22,23,22,23,20,7,6,7,21,20,23,22,23, + 22,23,22,21,20,7,38,39,38,39,38,63,1,54,39,38,39,6,35,34,39,38,39,38,35,34,23,22,23,22,31,1,22,21,7,33,39,52,55,54, + 61,1,39,54,53,52,39,38,53,52,53,19,52,53,52,39,1,7,22,23,22,23,22,23,22,51,50,55,54,53,52,39,38,39,38,7,6,7,22,23, + 22,51,50,55,54,53,52,39,38,47,1,1,179,37,23,17,52,14,45,2,2,4,26,41,30,20,34,23,27,36,16,18,48,17,74,75,38,15,14,18, + 7,5,10,5,12,5,1,1,31,27,41,55,29,13,1,10,1,9,2,2,4,1,3,1,22,3,253,223,5,9,37,48,27,18,2,135,3,39,35,4, + 5,1,10,35,5,22,54,25,9,43,17,45,76,26,20,17,14,17,8,7,29,13,19,95,136,95,94,4,20,5,4,22,18,6,3,47,115,52,7,42, + 30,19,12,7,5,3,8,49,40,13,8,46,50,1,21,15,1,54,23,24,54,9,3,28,124,47,6,7,14,2,7,2,7,7,15,28,40,14,15,24, + 17,49,9,4,2,10,7,4,10,92,1,1,1,171,1,12,13,2,3,9,5,12,2,253,254,17,35,58,55,17,4,1,17,10,11,4,2,12,5,6, + 108,128,15,3,83,38,15,11,16,8,4,12,8,11,120,2,235,55,49,7,31,93,24,23,1,1,47,126,91,35,60,36,28,27,32,5,12,26,111,187, + 95,37,21,16,64,44,31,16,134,58,6,11,10,6,6,36,34,30,59,26,18,118,82,21,18,254,212,7,9,24,29,22,36,88,36,43,124,25,137,19, + 141,137,182,18,33,53,68,88,38,80,89,59,2,182,57,68,111,30,54,194,29,6,15,11,13,98,39,110,149,50,15,12,11,6,11,31,56,26,51,254, + 101,70,93,12,8,19,4,1,20,6,7,52,84,38,3,31,22,10,7,12,22,38,32,18,12,47,53,48,36,63,45,32,2,49,64,27,17,38,17,6, + 5,16,9,51,108,15,10,23,23,75,15,11,10,5,25,3,5,13,67,4,34,80,49,22,214,9,11,159,183,58,48,51,60,8,68,58,53,88,73,46, + 41,6,7,1,68,4,7,19,38,254,91,20,43,45,49,58,13,12,17,16,9,9,21,23,9,5,113,18,20,47,65,56,9,18,10,10,18,17,11,6, + 103,0,0,0,0,8,0,43,0,169,6,106,5,108,0,6,0,57,0,76,0,112,0,123,0,127,0,137,0,141,0,0,19,22,55,54,53,52,39,1, + 34,39,38,35,34,7,6,43,1,34,39,7,5,19,38,53,52,63,1,54,55,54,55,54,55,54,51,50,23,55,54,51,50,23,22,21,7,23,22,51, + 50,55,51,22,21,20,7,35,53,6,37,54,55,54,55,1,39,38,35,34,7,6,15,1,22,21,20,7,54,1,34,47,1,7,20,7,54,55,22,21, + 20,7,6,35,34,7,22,21,20,7,50,55,54,51,50,23,22,51,50,55,54,53,52,39,6,55,22,21,20,7,21,51,54,53,52,39,5,54,55,15, + 1,6,21,20,23,22,23,54,53,52,5,7,55,38,216,27,20,15,16,3,112,47,108,48,29,38,150,74,33,99,83,37,89,254,248,129,6,14,69,28, + 25,93,123,64,67,34,36,52,62,153,45,59,37,30,13,190,204,44,40,54,6,225,89,62,248,109,252,188,33,30,8,5,1,78,36,17,31,88,236,54, + 34,20,47,44,40,3,171,52,25,242,115,83,63,88,15,36,85,129,62,24,34,20,115,74,63,75,40,96,46,47,52,137,43,50,25,75,50,46,158,48, + 62,252,176,83,13,162,90,112,48,31,43,23,254,160,49,94,7,1,240,3,39,31,31,32,16,254,199,14,5,16,8,59,99,115,1,12,18,32,26,47, + 232,94,34,124,89,47,26,13,52,171,50,56,25,29,219,135,29,30,131,180,207,149,108,37,233,37,111,29,15,1,116,30,14,233,53,111,65,61,39,89, + 36,9,1,97,16,157,133,163,84,2,42,13,22,18,16,39,1,39,71,43,45,13,11,12,6,37,95,107,106,126,7,29,114,141,125,106,76,96,208,134, + 124,239,92,103,195,75,26,64,47,30,20,3,46,56,53,150,99,40,36,0,0,7,0,182,0,154,5,203,5,175,0,19,0,25,0,32,0,40,0,50, + 0,76,0,83,0,0,1,62,1,53,52,47,1,6,35,20,7,6,35,20,7,23,22,51,50,54,1,63,1,15,2,19,37,1,19,37,1,19,5,1, + 51,50,53,52,39,1,0,54,53,52,39,1,7,1,22,51,1,62,1,55,54,51,50,22,21,20,7,14,1,7,14,1,7,6,35,34,38,53,52,55, + 62,1,23,7,1,22,51,50,39,5,37,8,12,2,59,23,30,54,54,73,22,237,8,7,10,26,252,128,153,13,146,153,13,131,1,9,2,125,184,253, + 103,253,132,17,1,189,2,13,2,63,2,253,194,1,164,54,6,253,251,113,2,5,17,15,253,110,13,31,16,13,10,14,17,5,6,19,14,14,29,17, + 14,9,14,16,4,5,20,45,127,2,62,11,10,57,1,1,64,8,28,10,5,8,238,23,72,54,55,28,24,59,2,11,2,249,152,146,13,152,146,1, + 122,18,253,131,253,104,184,2,124,1,9,20,253,243,56,10,12,2,62,252,182,54,33,15,17,2,6,113,253,250,6,2,234,13,21,5,4,17,13,10, + 14,16,31,13,14,20,5,4,14,16,11,13,16,30,244,14,253,194,2,66,0,7,0,53,1,150,6,142,4,62,0,17,0,23,0,30,0,37,0,43, + 0,63,0,70,0,0,0,52,38,39,38,47,1,20,7,22,20,7,22,21,55,54,55,54,5,53,39,7,21,23,3,55,33,9,1,33,39,1,33,54, + 53,52,39,33,0,52,39,33,21,33,36,52,54,55,62,1,50,22,23,30,1,20,6,7,14,1,34,38,39,38,23,7,33,54,53,52,39,5,163,7, + 7,5,10,210,21,51,51,21,210,10,5,7,251,166,94,94,94,175,175,3,82,2,88,253,168,252,174,175,1,73,2,180,25,35,253,6,3,74,50,253, + 86,2,170,252,108,7,8,7,18,20,18,7,8,7,7,8,7,18,20,18,7,8,197,80,2,250,35,25,2,222,24,21,9,7,6,126,33,20,56,144, + 56,20,33,126,6,7,9,75,216,112,112,216,112,1,104,200,254,172,254,172,200,1,44,25,23,27,25,254,196,112,24,160,60,40,35,15,14,16,16,14, + 15,35,40,35,15,14,16,16,14,15,105,100,25,27,23,25,0,7,0,182,0,154,5,203,5,175,0,19,0,25,0,32,0,40,0,50,0,76,0,83, + 0,0,1,46,1,35,34,15,1,22,21,50,23,22,21,50,23,55,54,53,52,38,1,39,31,2,39,7,39,3,1,37,3,1,39,23,1,54,53,52, + 43,1,46,1,35,34,7,1,23,1,54,53,1,46,1,39,38,53,52,54,51,50,23,30,1,23,30,1,23,22,21,20,6,35,34,39,46,1,19,1, + 54,35,34,7,1,5,37,9,26,10,7,8,237,22,73,54,54,30,23,59,2,12,252,111,146,13,153,146,13,168,198,17,2,124,2,153,184,253,131,18, + 14,2,62,2,63,2,37,54,33,15,17,253,251,113,2,5,6,253,23,14,20,5,4,16,14,9,14,17,29,14,14,19,6,5,17,14,10,13,16,31, + 18,2,12,1,57,10,11,253,194,5,9,9,11,2,59,24,28,55,54,72,23,238,8,5,10,28,253,24,13,146,152,13,146,213,198,1,9,2,124,184, + 253,104,253,131,236,127,2,62,12,10,56,136,54,6,253,250,113,2,6,17,15,253,109,14,30,16,13,11,16,14,4,5,20,14,13,31,16,14,10,13, + 17,4,5,21,1,15,2,12,66,2,253,194,0,2,0,88,1,123,6,14,4,91,0,37,0,71,0,0,18,16,39,50,51,32,37,1,21,37,46,1, + 39,38,34,7,6,7,14,1,20,22,23,22,23,22,50,55,62,1,55,37,21,1,36,33,34,35,18,20,7,50,51,50,5,37,5,6,7,6,34,39, + 38,39,46,1,52,54,55,54,55,54,50,23,22,23,5,37,4,35,34,35,138,50,8,7,1,37,2,23,2,107,253,191,5,14,18,13,30,13,14,11, + 10,12,14,8,11,14,13,30,13,18,14,5,2,65,253,149,253,233,254,219,7,8,153,23,4,5,177,2,15,1,183,254,156,22,27,26,62,26,27,22, + 22,22,22,22,22,27,26,62,26,27,22,1,100,254,73,253,241,177,5,4,2,73,1,68,96,110,254,237,83,28,8,16,8,6,6,6,10,9,29,32, + 31,7,10,6,6,6,8,16,8,28,83,254,237,110,1,71,138,89,110,185,24,21,12,11,11,12,21,23,53,62,53,23,21,12,11,11,12,21,24,185, + 110,0,0,0,0,1,0,138,1,173,6,14,4,41,0,40,0,0,1,37,21,1,36,35,34,35,54,52,39,50,51,50,37,1,21,37,38,39,38,39, + 38,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,54,3,232,2,38,253,149,253,236,248,7,6,50,50,6,7,248,2,20,2,107,253, + 218,7,15,14,18,17,42,17,18,14,15,15,15,15,14,18,17,42,17,18,14,15,2,197,28,33,254,237,110,96,224,96,110,254,237,33,29,17,15,14, + 8,8,8,8,14,15,35,21,20,35,15,14,8,8,8,8,14,15,0,0,0,1,1,51,0,198,5,87,5,10,0,28,0,0,1,50,23,22,51,50, + 55,0,19,54,51,50,22,21,20,7,0,1,6,35,34,39,38,39,38,53,52,55,54,1,197,39,20,40,17,13,14,1,25,239,62,135,32,22,33,254, + 126,254,182,23,71,72,13,34,46,52,70,43,2,142,64,120,20,1,194,1,22,72,12,9,14,41,254,48,253,252,36,6,15,138,153,39,42,39,24,0, + 0,1,0,237,0,178,5,197,5,12,0,30,0,0,1,50,23,22,51,50,55,0,55,54,51,50,23,22,21,20,7,0,7,6,35,34,39,38,39,38, + 53,52,55,54,51,1,197,39,20,40,17,13,14,1,25,239,101,96,127,26,11,23,253,125,123,42,152,50,55,23,57,72,70,96,48,3,26,64,120,20, + 1,157,175,74,8,3,22,18,27,253,30,222,76,26,12,141,178,134,49,32,44,0,0,0,0,1,1,3,0,148,5,177,5,65,0,11,0,0,9,1, + 7,9,1,39,9,1,55,9,1,23,3,231,1,201,142,254,56,254,55,142,1,201,254,55,142,1,201,1,201,142,2,234,254,55,141,1,201,254,55,141, + 1,201,1,201,141,254,56,1,201,141,0,0,0,1,0,175,0,63,6,5,5,150,0,11,0,0,9,11,4,145,1,116,254,201,254,140,254,140,254,201, + 1,116,254,140,1,55,1,116,1,116,1,55,2,234,254,140,254,201,1,116,254,140,1,55,1,116,1,116,1,55,254,140,1,117,254,201,0,1,0,241, + 255,238,5,156,5,220,0,66,0,0,1,50,23,22,23,54,51,50,23,22,21,20,7,6,3,22,23,22,21,20,15,1,22,21,20,7,6,35,34,39, + 38,39,6,3,6,35,34,39,38,53,52,55,54,55,18,19,2,39,38,53,52,55,54,51,50,23,54,55,54,51,50,23,22,23,54,55,54,4,248,10, + 16,17,18,29,17,15,26,16,22,208,196,81,143,12,30,32,4,22,26,12,26,20,120,128,172,222,32,76,36,4,51,11,5,27,204,228,122,40,9,18, + 19,16,15,23,9,13,18,28,32,10,54,88,142,204,24,5,220,16,16,26,51,27,17,21,27,23,226,254,241,198,239,20,12,23,25,22,12,20,30,16, + 18,26,154,208,224,254,138,54,42,28,61,80,31,14,42,1,62,1,10,1,34,157,35,10,14,26,26,29,17,12,16,30,168,152,184,204,24,0,0,0, + 0,1,0,252,0,0,6,8,5,234,0,82,0,0,1,50,23,22,23,54,23,22,23,22,21,20,7,6,3,22,23,22,21,20,7,6,7,6,7,6, + 35,34,39,6,7,6,35,34,39,38,39,2,7,6,43,1,34,39,38,39,6,35,34,39,38,53,52,55,38,39,38,53,52,55,54,55,38,3,38,53, + 52,55,54,51,50,23,54,55,54,51,50,23,22,23,18,55,54,5,84,29,27,20,8,26,10,32,14,14,16,241,235,148,148,17,30,20,37,2,14,24, + 32,36,30,8,14,36,27,23,26,89,121,230,88,17,21,2,18,17,15,2,20,18,25,29,36,30,9,9,18,24,130,196,122,99,22,23,16,22,26,48, + 1,11,23,17,43,13,106,150,231,249,12,5,234,30,22,58,1,5,12,14,13,21,40,16,219,254,199,204,162,18,24,49,26,17,2,17,35,58,24,18, + 11,27,28,95,191,254,251,135,26,36,31,13,12,30,35,17,27,45,3,13,24,24,21,31,176,212,189,1,11,61,28,26,49,32,39,14,25,50,26,196, + 186,1,8,218,12,0,0,0,0,3,0,112,0,0,6,68,5,213,0,11,0,23,0,35,0,0,1,17,33,17,33,17,33,17,33,17,33,17,37,33, + 17,33,17,33,17,33,17,33,17,33,3,33,21,33,17,35,17,33,53,33,17,51,4,54,254,72,254,86,1,170,1,184,1,170,254,166,1,190,254,66, + 253,168,254,66,1,190,2,88,200,1,190,254,66,200,254,66,1,190,200,3,198,1,171,254,85,254,72,254,86,1,170,1,184,80,253,168,254,66,1,190, + 2,88,1,191,253,121,200,254,66,1,190,200,1,191,0,0,0,1,0,112,0,0,6,68,5,213,0,11,0,0,1,33,17,33,17,33,17,33,17,33, + 17,33,4,34,2,34,253,222,254,112,253,222,2,34,1,144,3,178,254,112,253,222,2,34,1,144,2,35,0,2,0,112,0,0,6,68,5,213,0,3, + 0,15,0,0,1,51,53,35,55,33,21,33,17,35,17,33,53,33,17,51,2,227,238,238,239,2,114,253,142,240,253,142,2,114,240,2,115,238,1,240, + 253,142,2,114,240,2,115,0,0,2,0,112,0,0,6,68,5,213,0,3,0,15,0,0,1,33,17,33,37,33,17,33,17,33,17,33,17,33,17,33, + 2,147,1,142,254,114,1,143,2,34,253,222,254,112,253,222,2,34,1,144,2,35,1,142,1,254,112,253,222,2,34,1,144,2,35,0,0,1,1,82, + 0,0,5,98,5,213,0,11,0,0,1,33,21,33,17,35,17,33,53,33,17,51,3,210,1,144,254,112,240,254,112,1,144,240,4,69,240,252,171,3, + 85,240,1,144,0,2,1,12,0,0,5,108,5,213,0,15,0,27,0,0,1,51,23,17,33,17,33,39,17,35,39,17,33,17,33,23,7,17,35,17, + 33,21,33,17,51,17,33,53,4,64,150,150,254,212,254,142,150,150,150,1,44,1,114,150,200,220,254,212,1,44,220,1,44,4,169,150,254,142,253,95, + 150,2,11,150,1,114,1,44,150,250,1,44,254,212,220,253,95,2,161,220,0,3,1,62,0,0,5,118,5,213,0,11,0,23,0,35,0,0,1,17, + 33,17,33,17,33,17,33,17,33,17,39,33,17,33,17,33,17,33,17,33,17,33,3,33,21,33,17,35,17,33,53,33,17,51,4,14,254,152,254,232, + 1,24,1,104,1,24,200,1,24,254,232,253,248,254,232,1,24,2,8,160,1,24,254,232,200,254,232,1,24,200,4,109,1,24,254,232,254,132,253,95, + 2,161,1,124,80,253,228,253,95,2,161,2,28,1,24,254,72,220,253,95,2,161,220,1,24,0,0,0,0,1,0,112,0,0,6,68,5,213,0,75, + 0,0,1,35,34,6,7,6,7,6,21,7,17,23,22,23,22,23,30,1,59,1,53,52,38,39,38,39,38,35,39,33,7,6,7,6,7,14,1,29, + 1,51,50,54,55,54,55,54,53,55,17,39,38,39,38,39,46,1,43,1,21,20,22,23,22,23,22,51,23,33,55,54,55,54,55,62,1,53,3,15, + 123,100,179,73,66,44,36,50,25,25,36,42,68,69,179,104,123,76,71,67,95,82,27,81,4,124,54,54,82,95,67,73,74,123,104,179,69,68,42,36, + 50,25,25,36,44,66,70,182,100,123,76,71,67,95,82,27,81,251,132,54,54,82,95,67,73,74,2,160,75,73,66,96,79,27,84,4,124,56,55,79, + 92,70,71,75,122,100,182,71,66,43,37,50,25,25,37,43,66,73,180,100,122,75,71,70,92,79,27,84,251,132,56,55,79,96,66,72,76,123,100,182, + 71,66,43,37,50,25,25,37,43,66,73,180,100,0,0,0,0,8,0,187,255,229,5,249,5,243,0,11,0,17,0,20,0,23,0,26,0,29,0,32, + 0,35,0,0,1,19,33,3,19,33,11,1,33,19,3,33,23,3,19,33,19,11,1,7,51,31,1,55,3,7,51,5,35,23,1,39,7,19,55,35, + 3,90,224,1,191,224,224,254,65,224,224,254,65,224,224,1,191,58,166,166,1,76,166,166,166,108,216,173,109,108,108,109,217,254,122,216,108,254,231,109, + 108,108,109,217,5,243,254,124,254,125,254,125,254,124,1,132,1,131,1,131,100,254,225,254,224,1,32,1,31,1,31,187,100,187,187,254,125,188,99,188, + 1,31,188,188,1,132,187,0,0,1,0,84,255,227,6,96,5,240,0,67,0,0,1,53,52,39,38,53,52,55,54,50,23,22,21,20,7,6,29,1, + 51,50,55,54,51,50,23,22,20,7,6,35,34,39,38,43,1,21,20,23,22,21,20,7,6,34,39,38,53,52,55,54,61,1,35,34,7,6,35,34, + 39,38,52,55,54,51,50,23,22,51,3,40,76,44,54,56,120,56,54,44,76,32,186,122,70,118,100,48,48,48,48,100,118,70,122,186,32,76,44,54, + 56,120,56,54,44,76,32,186,122,70,118,100,48,48,48,48,100,118,70,122,186,3,28,32,186,122,70,118,100,48,48,48,48,100,118,70,122,186,32,76, + 44,54,56,120,56,54,44,76,32,187,121,70,118,100,48,49,49,48,100,118,70,121,187,32,76,44,54,56,120,56,54,44,76,0,0,0,0,1,0,86, + 255,231,6,94,5,240,0,131,0,0,1,38,39,35,6,7,6,7,14,1,35,34,38,39,38,39,38,52,55,54,55,62,1,51,50,22,23,22,23,22, + 23,51,54,55,54,55,53,38,39,38,39,46,1,53,52,54,55,54,55,54,50,23,22,23,30,1,21,20,6,7,6,7,6,7,21,22,23,22,23,51, + 54,55,54,55,62,1,51,50,22,23,22,23,22,20,7,6,7,14,1,35,34,38,39,38,39,38,39,35,6,7,6,7,21,22,23,22,23,30,1,21, + 20,6,7,6,7,6,34,39,38,39,46,1,53,52,54,55,54,55,54,55,53,38,3,2,16,10,212,2,10,20,29,32,82,46,45,82,32,31,18,17, + 17,18,31,32,82,45,46,82,32,34,15,9,3,212,10,16,17,21,16,20,42,30,33,34,34,33,32,40,40,92,40,40,32,33,34,34,33,35,37,23, + 13,21,17,16,10,212,3,9,15,34,32,82,46,45,82,32,31,18,17,17,18,31,32,82,45,46,82,32,29,20,10,2,212,10,16,17,21,13,23,37, + 35,33,34,34,33,32,40,40,92,40,40,32,33,34,34,33,30,42,20,16,21,2,147,17,21,16,20,42,30,33,34,34,33,32,40,40,92,40,40,32, + 33,34,34,33,35,37,23,13,21,17,16,10,213,2,10,20,29,32,82,46,45,82,32,31,18,17,17,18,31,32,82,45,46,82,32,34,15,9,3,213, + 10,16,17,21,13,23,37,35,33,34,34,33,32,40,40,92,40,40,32,33,34,34,33,30,42,20,16,21,17,16,10,212,3,9,15,34,32,82,46,45, + 82,32,31,18,17,17,18,31,32,82,45,46,82,32,29,20,10,2,212,10,0,1,0,83,255,227,6,97,5,240,0,131,0,0,1,52,38,39,38,39, + 38,39,46,1,53,52,54,55,54,55,54,50,23,22,23,30,1,21,20,6,7,6,7,6,7,14,1,21,50,54,55,54,55,54,55,62,1,51,50,22, + 23,22,23,22,20,7,6,7,14,1,35,34,38,39,38,39,38,39,46,1,35,20,22,23,22,23,22,23,30,1,21,20,6,7,6,7,6,34,39,38, + 39,46,1,53,52,54,55,54,55,54,55,62,1,53,34,6,7,6,7,6,7,14,1,35,34,38,39,38,39,38,52,55,54,55,62,1,51,50,22,23, + 22,23,22,23,30,1,3,40,44,36,14,16,24,10,40,40,42,38,32,58,46,114,48,54,36,38,42,42,38,10,26,8,20,41,39,68,101,33,13,12, + 18,10,39,100,56,58,98,38,36,24,21,21,24,36,38,98,58,56,100,39,10,18,12,13,41,97,64,47,33,13,16,25,10,39,41,42,38,36,54,47, + 114,47,54,36,38,42,41,39,10,25,16,13,39,41,63,99,39,14,12,18,10,38,100,56,58,98,38,33,27,22,22,24,36,38,98,58,61,95,38,10, + 18,6,20,40,98,3,28,67,99,34,14,12,18,10,38,100,56,58,98,38,32,28,22,22,24,36,38,98,58,61,95,38,10,18,6,20,40,97,63,47, + 33,13,16,25,10,39,41,42,38,36,54,47,114,47,54,36,38,42,41,39,10,25,16,13,39,41,68,101,33,13,12,18,10,39,100,56,58,98,38,36, + 24,21,21,24,36,38,98,58,56,100,39,10,18,12,13,41,97,64,41,39,14,16,24,10,40,40,42,38,32,58,46,114,48,54,36,38,42,42,38,10, + 26,8,20,40,40,0,0,0,0,1,0,84,255,229,6,96,5,242,1,48,0,0,1,50,23,22,23,22,23,22,21,20,7,6,7,54,55,54,51,50, + 23,22,23,22,23,22,21,20,7,14,1,7,6,35,34,39,38,39,38,39,17,33,38,39,38,39,38,53,52,54,55,54,55,54,51,50,23,22,23,22, + 23,22,21,20,7,6,7,54,55,54,51,50,23,22,23,22,23,22,21,20,7,6,7,6,7,6,35,34,39,38,39,22,23,22,21,20,6,7,6,7, + 6,35,34,39,38,39,38,39,38,53,52,55,54,55,54,55,33,17,54,55,54,55,54,51,50,23,22,23,22,23,22,21,20,7,6,7,6,7,6,35, + 34,39,38,39,22,23,22,21,20,7,6,7,6,7,6,34,39,38,39,38,39,38,53,52,55,54,55,6,7,6,35,34,39,38,39,38,39,38,53,52, + 55,54,55,54,55,54,51,50,22,23,22,23,17,33,22,23,22,23,22,21,20,7,6,7,6,7,6,35,34,39,38,39,38,39,38,53,52,55,54,55, + 6,7,6,35,34,39,38,39,38,39,38,52,55,54,55,54,55,54,51,50,23,22,23,38,39,38,53,52,55,54,55,54,55,54,51,50,23,22,23,22, + 23,22,21,20,7,6,7,6,7,33,17,6,7,6,7,6,35,34,39,46,1,39,38,53,52,55,54,55,54,55,54,51,50,23,22,23,38,39,38,53, + 52,55,54,55,54,55,54,3,90,30,23,27,18,20,11,10,10,11,20,11,20,25,28,30,24,26,19,20,11,10,10,11,40,25,25,29,30,23,25,20, + 14,10,1,38,17,14,19,11,11,22,19,20,26,25,28,29,25,26,20,19,11,11,11,8,9,20,25,25,28,32,23,25,20,19,12,10,10,12,19,22, + 23,26,29,28,25,25,20,9,8,11,22,19,17,29,25,29,24,29,26,20,19,11,11,11,11,19,14,17,254,219,9,14,17,29,23,30,29,24,26,19, + 20,11,10,10,11,20,18,27,23,30,25,28,20,11,19,11,11,11,11,20,18,27,23,60,23,27,18,20,11,11,11,11,19,11,20,24,29,30,23,27, + 18,20,11,10,10,11,20,19,26,24,29,27,52,20,14,9,254,219,17,13,22,9,10,10,11,20,22,23,26,27,30,25,25,20,19,12,10,10,8,10, + 22,23,26,28,29,25,26,20,18,12,10,10,12,18,17,29,25,29,28,26,25,20,10,8,10,10,12,19,19,26,25,30,27,26,25,20,20,11,10,10, + 12,19,13,17,1,37,10,14,20,25,23,30,29,24,26,40,10,11,11,10,20,19,27,23,30,29,24,20,11,20,11,10,10,11,20,19,26,23,5,242, + 11,12,18,20,26,25,29,28,25,26,20,10,8,10,10,12,18,20,26,25,29,31,23,25,40,11,10,10,12,19,13,17,254,219,10,14,20,25,23,30, + 29,50,20,20,11,10,10,11,20,19,26,24,30,28,25,20,11,20,11,10,10,11,20,18,27,24,29,30,24,27,18,22,9,10,10,11,20,11,20,25, + 28,26,54,19,17,13,11,11,10,20,20,26,24,29,30,23,25,20,14,10,254,218,18,13,16,14,11,11,11,19,20,26,25,28,29,25,26,20,18,12, + 11,11,8,9,19,26,25,28,29,26,25,20,19,12,10,10,12,19,20,25,26,29,28,25,26,19,9,8,11,11,12,18,20,26,25,29,28,25,26,20, + 19,11,11,22,19,13,18,1,37,9,14,23,22,24,30,28,25,26,19,22,9,10,10,11,20,18,27,23,30,29,25,19,12,22,9,10,10,11,20,18, + 27,23,60,23,27,19,17,13,11,11,10,20,11,20,24,29,30,23,27,18,20,11,11,11,11,20,19,26,24,29,30,23,26,19,14,10,1,37,17,13, + 19,12,10,10,11,40,25,26,28,25,29,26,20,18,12,10,10,8,10,20,26,25,28,29,25,26,20,18,12,11,0,0,0,1,0,87,255,227,6,95, + 5,245,0,27,0,0,19,50,55,54,55,54,18,53,20,18,23,22,23,22,51,34,7,6,7,6,2,21,52,2,39,38,39,38,87,155,141,134,115,112, + 115,110,117,108,141,140,156,156,140,141,108,117,110,115,112,115,134,141,2,236,59,56,114,111,1,20,161,157,254,240,119,110,60,59,59,60,110,119,254,240, + 157,161,1,20,111,114,56,59,0,2,0,87,255,227,6,95,5,245,0,27,0,55,0,0,1,50,23,22,23,30,1,21,52,54,55,54,55,54,51,34, + 39,38,39,46,1,53,20,6,7,6,7,6,33,50,55,54,55,54,18,53,20,18,23,22,23,22,51,34,7,6,7,6,2,21,52,2,39,38,39,38, + 1,101,101,92,87,74,73,75,71,77,70,91,91,102,102,91,91,70,77,71,75,73,74,87,92,254,141,155,141,134,115,112,115,110,117,108,141,140,156,156, + 140,141,108,117,110,115,112,115,134,141,2,236,38,37,74,72,179,105,102,177,77,72,39,38,38,39,72,77,177,102,105,179,72,74,37,38,59,56,114,111, + 1,20,161,157,254,240,119,110,60,59,59,60,110,119,254,240,157,161,1,20,111,114,56,59,0,2,0,47,255,236,6,133,5,243,0,9,0,19,0,0, + 19,37,9,1,5,1,19,37,5,19,1,3,33,1,3,9,1,3,1,33,47,2,13,1,30,1,30,2,13,254,166,37,254,10,254,10,37,1,209,191, + 253,149,1,244,191,1,245,1,245,191,1,244,253,149,3,165,131,1,203,254,53,131,254,97,253,230,202,202,2,26,3,236,253,179,254,148,253,180,1,108, + 254,148,2,76,1,108,0,0,0,2,0,86,255,227,6,94,5,240,0,9,0,36,0,0,1,3,33,1,3,9,1,3,1,33,3,50,23,22,23,22, + 18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,54,3,90,172,253,211,1,194,172,1,195,1,195,172,1,194,253,211,172,154, + 142,134,115,112,115,110,117,110,139,141,254,203,142,134,115,112,115,110,117,108,141,140,5,234,253,238,254,184,253,239,1,72,254,184,2,17,1,72,2,24, + 59,56,114,111,254,236,161,152,254,240,119,112,58,59,59,56,114,111,1,20,156,157,1,16,119,110,60,59,0,2,0,48,255,237,6,132,5,242,0,29, + 0,39,0,0,0,34,7,6,7,6,7,6,21,20,23,22,23,22,23,22,50,55,54,55,54,55,54,53,52,39,38,39,38,39,3,19,33,1,19,9, + 1,19,1,33,3,157,134,57,57,48,48,23,24,24,23,48,48,57,57,134,57,57,48,48,23,24,24,23,48,48,57,124,191,2,107,254,12,191,254,11, + 254,11,191,254,12,2,107,3,228,24,26,45,50,56,59,66,65,59,56,50,45,26,24,24,26,45,50,56,59,65,66,59,56,50,45,26,2,38,253,179, + 254,148,253,180,1,107,254,149,2,76,1,108,0,3,0,47,255,236,6,133,5,243,0,9,0,39,0,49,0,0,19,37,9,1,5,1,19,37,5,19, + 0,50,23,22,23,22,23,22,21,20,7,6,7,6,7,6,34,39,38,39,38,39,38,53,52,55,54,55,54,55,19,3,33,1,3,9,1,3,1,33, + 47,2,13,1,30,1,30,2,13,254,166,37,254,10,254,10,37,1,142,134,57,57,48,48,23,24,24,23,48,48,57,57,134,57,57,48,48,23,24,24, + 23,48,48,57,124,191,253,149,1,244,191,1,245,1,245,191,1,244,253,149,3,165,131,1,203,254,53,131,254,97,253,230,202,202,2,26,1,222,24,26, + 45,50,56,59,66,65,59,56,50,45,26,24,24,26,45,50,56,59,65,66,59,56,50,45,26,2,38,253,179,254,148,253,180,1,107,254,149,2,76,1, + 108,0,0,0,0,3,0,48,255,237,6,132,5,242,0,9,0,19,0,29,0,0,1,19,33,7,19,39,7,19,39,33,19,3,33,1,3,9,1,3, + 1,33,3,19,33,1,19,9,1,19,1,33,3,90,96,1,53,250,95,250,250,95,250,1,53,96,143,254,47,1,120,144,1,120,1,120,144,1,120,254, + 47,143,191,2,107,254,12,191,254,11,254,11,191,254,12,2,107,4,73,254,217,182,254,218,182,182,1,38,182,1,251,254,71,254,239,254,71,1,17,254, + 239,1,185,1,17,2,142,253,179,254,148,253,180,1,108,254,148,2,76,1,108,0,0,0,0,3,0,48,255,237,6,132,5,242,0,9,0,19,0,29, + 0,0,1,23,51,7,23,39,7,55,39,51,27,1,33,1,19,9,1,19,1,33,55,3,33,5,3,37,5,3,37,33,3,90,38,124,100,38,100,100, + 38,100,124,38,191,2,107,254,12,191,254,11,254,11,191,254,12,2,107,191,115,254,138,1,47,117,1,47,1,47,117,1,47,254,138,3,73,118,73,118, + 73,73,118,73,3,31,253,179,254,148,253,180,1,108,254,148,2,76,1,108,251,254,157,219,254,157,219,219,1,99,219,0,0,6,0,48,255,237,6,132, + 5,242,0,2,0,5,0,8,0,11,0,14,0,24,0,0,37,1,53,37,1,55,1,3,39,37,33,7,11,1,23,17,19,33,1,19,9,1,19,1, + 33,1,225,1,120,253,160,1,120,232,1,122,144,232,2,96,254,47,143,1,143,143,191,2,107,254,12,191,254,11,254,11,191,254,12,2,107,153,1,17, + 243,199,254,239,75,253,251,1,185,75,199,198,2,128,254,71,198,3,83,253,179,254,148,253,180,1,108,254,148,2,76,1,108,0,0,0,0,2,0,50, + 0,24,6,134,5,183,0,13,0,23,0,0,9,1,19,39,37,1,39,19,1,33,19,23,19,33,1,3,33,5,3,1,5,3,1,33,6,134,254,62, + 172,162,254,178,254,106,162,172,254,62,2,45,172,162,155,1,156,253,39,134,254,79,1,94,134,1,95,1,95,134,1,94,254,79,3,113,254,184,253,239, + 52,243,254,217,52,2,17,1,72,2,18,52,254,34,1,104,254,100,255,254,100,0,255,255,1,156,0,255,0,1,0,132,0,0,6,48,5,213,0,17, + 0,0,1,17,33,17,37,19,13,1,3,37,17,33,17,5,3,45,1,19,2,186,1,64,1,150,160,254,106,1,150,160,254,106,254,192,254,106,160,1, + 149,254,107,160,4,0,1,213,254,42,235,254,235,234,235,254,235,235,254,42,1,214,235,1,21,235,234,1,21,0,0,0,0,2,0,152,0,0,6,28, + 5,213,0,5,0,23,0,0,1,7,23,51,55,39,5,1,55,1,17,51,17,1,23,9,1,7,1,17,35,17,1,39,2,227,120,120,238,120,120,254, + 153,254,46,120,1,210,240,1,210,120,254,46,1,210,120,254,46,240,254,46,120,3,185,206,208,208,206,206,1,13,208,254,242,2,27,253,229,1,14,208, + 254,243,254,242,208,1,13,253,230,2,26,254,243,208,0,0,0,1,0,112,0,0,6,68,5,213,0,23,0,0,9,1,7,1,17,35,17,1,39,1, + 33,53,33,1,55,1,17,51,17,1,23,1,33,21,3,212,1,185,71,254,70,100,254,70,71,1,186,253,143,2,114,254,69,71,1,186,100,1,186,71, + 254,69,2,114,2,184,254,70,71,1,187,253,142,2,113,254,70,71,1,186,100,1,187,71,254,70,2,113,253,143,1,186,71,254,69,100,0,1,0,64, + 255,227,6,76,5,240,0,15,0,0,1,19,9,1,13,1,9,1,11,1,9,1,45,1,9,1,3,70,79,1,212,254,157,2,70,253,186,1,99,254, + 44,79,79,254,44,1,99,253,186,2,70,254,157,1,212,5,240,253,185,1,100,254,44,80,79,254,44,1,100,253,185,2,71,254,156,1,212,79,80,1, + 212,254,156,0,0,9,0,84,255,227,6,96,5,240,0,2,0,5,0,8,0,11,0,14,0,17,0,20,0,23,0,39,0,0,1,5,3,5,37,5, + 1,3,37,3,19,3,1,37,19,37,5,37,1,19,5,19,3,19,17,19,37,3,13,1,19,37,11,1,5,19,45,1,3,5,4,245,254,221,119,2, + 68,254,219,254,225,1,154,123,254,225,1,119,119,254,101,1,35,119,253,188,1,37,1,31,254,102,123,1,31,1,119,119,159,1,132,164,1,135,254,121, + 164,254,124,159,159,254,124,164,254,121,1,135,164,1,132,4,133,123,254,224,1,120,120,254,101,1,35,119,253,188,1,37,1,31,254,102,123,1,31,1, + 119,119,1,156,254,221,120,2,69,254,219,254,224,3,6,254,121,164,254,124,160,159,254,124,164,254,121,1,135,164,1,132,159,160,1,132,164,0,0,0, + 0,1,0,187,255,227,5,249,5,240,0,11,0,0,1,19,37,9,1,37,11,1,5,9,1,5,3,90,112,2,47,254,65,1,191,253,209,112,112,253, + 209,1,191,254,65,2,47,5,240,253,188,193,254,125,254,125,193,253,187,2,69,193,1,131,1,131,193,0,0,1,0,84,255,227,6,96,5,240,0,15, + 0,0,1,19,9,1,13,1,9,1,11,1,9,1,45,1,9,1,3,90,113,1,178,254,239,1,244,254,12,1,17,254,78,113,113,254,78,1,17,254, + 12,1,244,254,239,1,178,5,240,254,11,1,18,254,78,114,113,254,78,1,18,254,11,1,245,254,238,1,178,113,114,1,178,254,238,0,0,1,0,84, + 255,227,6,96,5,240,0,15,0,0,1,19,37,3,13,1,19,37,11,1,5,19,45,1,3,5,3,90,170,1,121,137,1,108,254,148,137,254,135,170, + 170,254,135,137,254,148,1,108,137,1,121,5,240,254,148,137,254,135,171,170,254,135,137,254,148,1,108,137,1,121,170,171,1,121,137,0,0,1,0,84, + 255,227,6,96,5,240,0,23,0,0,1,19,37,3,37,3,13,1,19,37,19,37,11,1,5,19,5,19,45,1,3,5,3,5,3,90,116,1,15,71, + 1,99,239,1,86,254,170,239,254,157,71,254,241,116,116,254,241,71,254,157,239,254,170,1,86,239,1,99,71,1,15,5,240,254,169,239,254,157,71,254, + 241,115,116,254,241,71,254,157,239,254,169,1,87,239,1,99,71,1,15,116,115,1,15,71,1,99,239,0,0,1,0,112,0,0,6,68,5,213,0,47, + 0,0,1,17,51,17,19,23,3,1,23,1,37,23,5,33,21,33,5,7,37,1,7,1,19,7,3,17,35,17,3,39,19,1,39,1,5,39,37,33, + 53,33,37,55,5,1,55,1,3,55,3,30,120,170,111,170,1,58,85,254,197,1,156,46,254,99,1,190,254,70,1,153,46,254,100,1,59,85,254,199, + 169,111,170,120,170,111,170,254,198,85,1,58,254,101,46,1,154,254,69,1,190,254,99,46,1,153,254,200,85,1,57,169,111,4,23,1,190,254,69,1, + 153,46,254,102,1,58,85,254,197,171,111,171,120,170,111,172,254,196,85,1,57,254,103,46,1,152,254,70,1,188,254,102,46,1,155,254,197,85,1,58, + 170,111,170,120,171,111,169,1,57,85,254,199,1,153,46,0,0,1,0,167,255,227,6,13,5,240,0,155,0,0,1,53,52,39,38,53,52,55,54,50, + 23,22,21,20,7,6,29,1,23,22,23,55,54,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,43,1,34,35,34,15,1,22,21,20,7, + 23,22,51,50,59,1,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,47,1,6,15,1,21,20,23,22,21,20,7,6,34,39,38,53, + 52,55,54,61,1,38,39,38,39,7,6,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,54,59,1,50,51,50,63,1,38,53,52,55,39,38, + 35,34,43,1,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22,31,1,54,55,54,3,39,75,44,54,56,120,56,54,44,76,16,31,24, + 10,113,65,39,67,60,52,22,21,71,30,20,5,14,87,62,76,12,11,10,131,100,12,4,5,12,102,130,11,10,12,76,62,87,14,5,20,30,71,21, + 22,52,60,67,39,67,110,14,27,25,16,76,44,54,56,120,56,54,44,77,9,8,29,23,14,110,67,39,67,60,52,22,21,71,30,20,5,14,87,62, + 76,12,11,10,132,100,12,5,4,12,100,131,10,11,12,76,62,87,14,5,20,30,71,21,22,52,60,67,39,69,108,11,26,29,8,3,148,12,128,119, + 70,78,100,48,49,49,48,100,78,70,121,126,12,6,14,23,6,68,122,73,39,35,7,24,52,35,44,22,24,71,50,36,58,7,19,20,21,20,7,59, + 36,50,71,24,22,44,35,52,24,7,35,39,73,126,63,8,25,9,6,15,127,121,70,78,100,48,49,49,48,100,78,70,121,127,15,3,3,13,21,8, + 63,126,73,39,35,7,24,52,35,44,22,24,71,50,36,58,7,20,22,20,19,7,58,36,50,71,24,22,44,35,52,24,7,35,39,73,130,59,6,25, + 11,3,0,0,0,2,0,167,255,227,6,13,5,240,0,25,0,181,0,0,0,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1, + 53,52,38,39,38,47,1,53,52,39,38,53,52,55,54,50,23,22,21,20,7,6,29,1,23,22,23,55,54,55,54,55,54,51,50,23,22,23,22,21, + 20,7,6,7,6,43,1,34,35,34,15,1,22,21,20,7,23,22,51,50,59,1,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,47, + 1,6,15,1,21,20,23,22,21,20,7,6,34,39,38,53,52,55,54,61,1,38,39,38,39,7,6,7,6,7,6,35,34,39,38,39,38,53,52,55, + 54,55,54,59,1,50,51,50,63,1,38,53,52,55,39,38,35,34,43,1,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22,31,1,54, + 55,54,3,111,42,17,18,14,15,15,15,15,14,18,17,42,17,18,14,15,15,15,15,14,18,89,75,44,54,56,120,56,54,44,76,16,31,24,10,113, + 65,39,67,60,52,22,21,71,30,20,5,14,87,62,76,12,11,10,131,100,12,4,5,12,102,130,11,10,12,76,62,87,14,5,20,30,71,21,22,52, + 60,67,39,67,110,14,27,25,16,76,44,54,56,120,56,54,44,77,9,8,29,23,14,110,67,39,67,60,52,22,21,71,30,20,5,14,87,62,76,12, + 11,10,132,100,12,5,4,12,100,131,10,11,12,76,62,87,14,5,20,30,71,21,22,52,60,67,39,69,108,11,26,29,8,3,80,8,8,14,15,35, + 21,20,35,15,14,8,8,8,8,14,15,35,20,21,35,15,14,8,76,12,128,119,70,78,100,48,49,49,48,100,78,70,121,126,12,6,14,23,6,68, + 122,73,39,35,7,24,52,35,44,22,24,71,50,36,58,7,19,20,21,20,7,59,36,50,71,24,22,44,35,52,24,7,35,39,73,126,63,8,25,9, + 6,15,127,121,70,78,100,48,49,49,48,100,78,70,121,127,15,3,3,13,21,8,63,126,73,39,35,7,24,52,35,44,22,24,71,50,36,58,7,20, + 22,20,19,7,58,36,50,71,24,22,44,35,52,24,7,35,39,73,130,59,6,25,11,3,0,1,0,161,255,227,6,18,5,240,0,104,0,0,1,23, + 50,63,1,39,38,35,7,34,38,39,38,52,55,54,55,54,50,22,23,22,31,1,53,52,39,38,52,55,54,50,23,22,20,7,6,29,1,55,54,55, + 62,1,50,23,22,21,20,7,14,1,35,39,34,15,1,23,22,51,55,50,22,23,22,20,7,6,7,6,34,39,38,39,38,47,1,21,20,23,22,20, + 7,6,34,39,38,52,55,54,61,1,7,6,7,14,1,34,39,38,53,52,55,62,1,1,181,159,81,33,47,47,31,86,150,90,162,18,11,25,42,110, + 20,78,153,43,71,56,48,106,64,54,82,168,82,54,64,106,48,47,80,49,147,78,20,177,11,18,162,84,158,80,35,48,48,31,86,150,90,162,18,11, + 25,44,108,21,79,64,87,43,71,56,48,106,64,54,82,172,78,54,64,106,48,51,76,47,149,78,20,178,12,19,161,2,196,10,20,28,27,18,7,93, + 72,44,96,44,72,32,6,89,99,162,33,28,55,55,153,92,202,52,79,79,52,208,86,143,65,55,28,28,167,103,85,6,51,154,39,44,72,94,10,20, + 27,28,18,7,93,72,44,96,44,76,28,6,38,51,99,162,33,28,55,55,153,92,202,52,79,79,55,205,86,143,65,55,28,30,165,102,86,6,52,154, + 38,44,72,94,0,4,0,161,255,227,6,18,5,240,0,14,0,153,0,177,0,201,0,0,1,54,55,54,53,52,39,38,34,7,6,21,20,23,22,19, + 23,22,51,50,55,54,51,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,47,1,21,20,23,22,21,20,7,6,35,34,39,38,53,52, + 55,54,61,1,7,6,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,51,50,63,1,39,38,35,34,7,6,35,34,39,38, + 39,38,53,52,55,54,55,54,51,50,23,22,23,22,31,1,53,52,39,38,53,52,55,54,50,23,22,21,20,7,6,29,1,55,54,55,54,55,54,51, + 50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,35,34,7,5,6,35,34,39,38,35,34,7,6,7,6,21,20,23,22,23,22,51,50,55,54, + 55,54,37,22,23,22,23,22,51,50,55,54,55,54,53,52,39,38,39,38,35,34,7,6,35,34,3,90,28,56,37,30,49,84,49,30,37,56,168,18, + 53,101,32,37,18,16,90,70,92,18,11,25,43,109,20,22,56,66,83,47,63,74,18,86,64,54,82,84,88,78,54,64,86,18,71,66,49,81,66,56, + 22,20,110,42,25,11,18,92,70,90,16,18,37,32,101,53,18,18,51,101,33,38,18,16,90,70,90,20,12,26,42,110,20,22,56,66,83,47,63,74, + 18,86,64,54,82,168,82,54,64,86,18,71,66,49,81,66,56,22,20,109,43,25,11,18,92,70,90,16,18,38,33,101,51,254,152,68,65,30,29,9, + 10,53,60,59,7,5,13,21,62,10,12,31,43,70,25,36,1,220,72,36,25,70,43,31,12,10,62,21,13,5,7,59,60,53,10,9,29,30,65,3, + 211,99,74,50,81,68,26,43,43,26,68,81,50,74,254,180,11,32,3,1,40,53,72,44,39,57,44,74,30,6,38,48,102,137,41,10,20,84,124,92, + 96,106,52,79,79,55,103,96,92,124,84,20,10,39,139,103,47,38,6,32,72,44,57,39,44,73,52,40,1,3,32,11,11,31,3,1,40,51,74,44, + 38,57,45,72,32,6,38,48,102,137,41,10,20,84,124,92,96,106,52,79,79,52,106,96,92,124,84,20,10,39,139,103,47,38,6,30,74,44,57,39, + 44,72,53,40,1,3,31,128,18,4,1,34,34,39,24,21,33,23,36,21,4,25,40,58,85,74,74,85,58,40,25,4,21,36,23,33,21,24,39,34, + 34,1,4,0,0,2,0,110,0,0,6,70,5,173,0,25,0,119,0,0,0,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1, + 53,52,38,39,38,39,55,54,55,54,51,50,23,22,23,30,1,21,20,6,7,6,7,6,34,39,22,23,30,1,21,20,6,7,6,7,6,34,39,38, + 39,46,1,39,14,1,7,6,7,6,34,39,38,39,46,1,53,52,54,55,54,55,6,34,39,38,39,46,1,53,52,54,55,54,55,54,51,50,23,22, + 23,46,1,53,52,54,55,54,55,54,51,50,23,22,23,30,1,21,20,6,3,162,144,61,62,51,52,51,51,52,51,62,61,144,61,62,51,52,51,51, + 52,51,62,120,62,37,56,53,54,55,48,45,41,44,40,45,37,56,47,91,27,48,33,45,40,44,41,45,48,50,121,47,56,37,48,29,5,5,37,41, + 45,48,50,121,47,56,37,45,40,46,39,38,36,23,87,47,58,35,45,40,44,41,45,48,50,59,62,47,59,41,8,27,44,41,45,48,50,59,62,47, + 56,37,45,40,27,4,11,26,28,48,54,123,73,70,123,54,48,28,26,26,28,48,54,123,70,73,123,54,48,28,19,53,16,23,23,20,43,39,103,62, + 58,99,46,38,25,21,5,23,34,46,99,59,61,103,39,43,20,21,21,25,38,49,78,37,38,87,39,43,20,21,21,25,38,46,99,58,62,107,35,34, + 21,4,21,27,36,46,99,58,62,103,39,43,20,21,21,25,44,14,66,58,62,103,39,43,20,21,21,25,38,46,99,59,61,63,0,0,0,6,0,110, + 0,0,6,70,5,173,0,92,0,118,0,141,0,166,0,189,0,214,0,0,37,14,1,7,6,7,6,34,39,38,39,46,1,53,52,54,55,54,55,6, + 34,39,38,39,46,1,53,52,54,55,54,55,54,51,50,23,22,23,46,1,53,52,54,55,54,55,54,50,23,22,23,30,1,21,20,6,7,54,55,54, + 51,50,23,22,23,30,1,21,20,6,7,6,7,6,34,39,22,23,30,1,21,20,6,7,6,7,6,34,39,38,39,46,1,2,50,23,22,23,55,54, + 53,52,38,39,38,39,38,34,7,6,7,14,1,21,20,31,1,54,55,19,38,39,38,39,38,39,7,14,1,21,20,22,23,22,23,22,50,55,54,55, + 54,55,3,38,53,52,54,55,39,38,39,38,35,34,7,6,7,14,1,21,20,22,23,22,23,22,51,1,23,22,23,22,23,22,50,55,54,55,62,1, + 53,52,38,47,1,6,7,6,7,6,19,55,54,55,54,55,62,1,53,52,38,39,38,39,38,35,34,7,6,15,1,30,1,21,20,3,90,5,29,48, + 37,56,47,121,50,48,45,41,44,40,45,33,48,27,91,47,56,37,45,40,44,41,48,45,60,49,58,51,37,62,7,27,40,45,37,56,47,124,47,56, + 37,45,40,27,7,62,37,56,53,54,55,48,45,41,44,40,45,37,56,47,91,27,48,33,45,40,44,41,45,48,50,121,47,56,37,48,29,77,144,61, + 8,7,14,13,25,27,25,32,30,72,30,32,25,27,25,3,24,7,8,67,35,32,66,47,30,27,103,24,28,25,27,25,32,30,72,30,32,25,24,4, + 214,3,47,42,120,8,7,35,31,36,30,32,25,24,28,25,27,25,32,21,4,2,56,35,35,24,25,32,30,72,30,32,25,27,25,28,24,103,27,30, + 47,66,32,245,80,80,21,32,25,27,25,28,24,25,32,30,36,31,35,7,8,120,42,47,248,37,78,49,38,25,21,21,20,43,39,103,61,59,99,46, + 34,23,5,21,25,38,46,99,58,62,103,39,46,17,23,23,16,53,13,63,61,59,99,46,38,25,21,21,25,38,46,99,59,61,63,13,53,16,23,23, + 20,43,39,103,62,58,99,46,38,25,21,5,23,34,46,99,59,61,103,39,43,20,21,21,25,38,49,78,3,56,26,3,4,71,71,20,36,62,27,24, + 14,13,13,14,24,27,62,36,20,12,130,4,3,253,99,6,14,30,46,30,44,98,23,66,36,35,62,27,24,14,13,13,14,24,24,9,1,186,22,23, + 73,114,48,67,4,3,13,13,14,24,24,62,39,35,62,27,24,14,9,254,194,76,77,24,24,14,13,13,14,24,27,62,35,36,66,23,98,44,30,46, + 30,14,1,36,10,10,9,14,24,27,62,35,39,62,24,24,14,13,13,3,4,67,48,114,73,23,0,0,0,10,0,84,255,227,6,96,5,240,0,41, + 0,84,0,189,0,230,1,17,1,58,1,101,1,127,1,169,1,211,0,0,1,38,39,7,6,35,34,38,39,38,39,38,52,55,54,55,62,1,51,50, + 31,1,54,55,39,38,35,34,6,7,6,7,6,20,23,22,23,30,1,51,50,55,37,6,7,23,22,51,50,54,55,54,55,54,52,39,38,39,46,1, + 35,34,15,1,22,23,55,54,51,50,22,23,22,23,22,21,20,7,6,7,14,1,35,34,35,1,46,1,52,55,54,55,54,55,54,51,50,22,23,52, + 54,55,54,55,54,50,23,22,23,30,1,21,62,1,51,50,23,22,23,22,23,22,21,20,6,7,50,22,23,22,23,22,21,20,7,6,7,14,1,35, + 30,1,21,20,7,14,1,7,6,35,34,38,39,20,6,7,6,7,6,34,39,38,39,46,1,53,14,1,35,34,39,46,1,39,38,52,54,55,34,38, + 39,38,39,38,52,55,54,55,62,1,1,38,39,7,6,7,14,1,7,38,39,46,1,39,38,39,62,1,55,54,63,1,38,39,7,6,7,14,1,21, + 22,23,30,2,51,50,54,55,54,55,1,22,23,55,54,55,62,1,53,38,39,38,39,46,1,35,34,6,7,6,15,1,22,23,55,54,55,62,1,55, + 22,23,22,23,22,23,22,23,14,1,7,6,7,3,6,7,23,22,23,30,1,23,6,7,14,1,7,6,7,46,1,39,38,47,1,6,7,23,22,23, + 30,1,51,50,62,1,55,54,55,52,38,39,38,39,1,54,55,39,38,39,46,1,35,34,6,7,6,7,6,7,20,22,23,22,31,1,54,55,39,38, + 39,46,1,39,54,55,54,55,54,55,54,55,30,1,23,22,23,4,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1,53,52,38, + 39,38,39,19,6,7,23,22,21,20,6,7,6,7,6,34,39,38,39,46,1,53,52,63,1,38,39,7,6,21,20,22,23,22,23,22,50,55,54,55, + 62,1,53,52,39,3,22,23,55,54,53,52,38,39,38,39,38,34,7,6,7,14,1,21,20,31,1,54,55,39,38,53,52,54,55,54,55,54,50,23, + 22,23,30,1,21,20,7,2,58,6,2,228,17,9,10,26,10,8,6,4,4,6,8,10,24,12,9,17,228,2,6,206,36,20,28,52,22,20,12,10, + 10,12,20,22,52,28,20,36,3,26,2,6,119,119,18,30,52,22,20,12,10,10,12,20,22,52,30,18,9,229,6,2,120,121,7,16,22,10,8,6, + 4,4,6,8,12,24,12,7,5,251,202,37,34,17,16,32,33,40,41,45,43,85,36,34,33,32,40,40,92,40,40,32,33,34,38,83,43,45,41,40, + 33,28,20,17,32,39,55,77,34,35,15,16,16,18,32,28,86,50,37,32,17,16,65,40,41,45,46,82,36,34,33,32,40,40,92,40,40,32,33,34, + 40,79,45,44,42,40,65,16,17,34,35,50,80,34,35,15,16,16,18,32,34,77,1,193,20,16,142,11,6,7,25,14,13,11,12,19,5,4,1,1, + 9,9,6,14,180,14,11,184,33,14,21,21,1,10,10,42,52,29,32,50,21,14,19,1,235,15,10,107,107,13,22,21,1,10,10,21,21,52,29,32, + 50,22,13,5,117,20,17,75,75,5,10,23,14,13,11,12,10,9,5,4,1,1,11,8,5,3,166,11,14,180,14,6,7,11,1,1,4,5,19,12, + 11,13,14,23,9,6,11,142,17,19,105,19,14,21,50,32,29,52,42,10,10,1,21,21,14,33,253,137,18,19,61,61,13,22,50,32,29,52,21,21, + 10,10,1,21,22,13,9,205,11,14,96,95,5,10,9,1,1,4,5,9,10,12,11,13,17,22,8,5,3,1,119,82,35,36,29,29,30,30,29,29, + 36,35,82,35,36,29,29,30,30,29,29,36,3,22,21,27,2,10,9,10,11,12,26,12,11,10,9,10,2,27,22,21,56,10,21,22,21,26,25,60, + 25,26,21,22,21,10,99,23,21,32,33,21,22,21,26,25,60,25,26,21,22,21,3,62,22,22,14,15,10,9,10,11,12,26,12,11,10,11,8,1, + 2,154,22,22,28,2,10,10,10,10,12,26,12,12,10,8,10,2,26,22,20,56,10,20,22,22,26,24,60,26,26,20,22,22,10,100,24,20,33,33, + 22,22,20,26,26,60,24,26,22,22,20,2,62,23,21,14,14,10,8,10,12,12,12,14,12,10,10,12,8,1,34,37,85,86,42,41,32,33,16,16, + 33,36,51,82,32,31,18,17,17,18,31,32,82,51,38,31,16,16,33,28,45,40,45,37,90,38,32,34,35,37,40,46,50,36,40,32,30,38,38,83, + 43,44,41,41,65,16,16,33,36,51,82,32,31,18,17,17,18,31,32,82,51,39,30,16,16,65,41,41,88,84,36,34,34,35,37,40,96,36,40,32, + 34,32,254,28,11,13,180,13,6,8,10,1,1,4,5,18,12,12,13,13,24,9,6,10,142,17,19,105,19,14,20,51,31,29,27,25,43,20,21,20, + 14,33,2,120,18,19,61,61,13,21,51,31,29,27,25,22,21,20,21,21,13,9,205,12,14,95,96,5,11,8,1,1,4,5,9,9,12,12,13,16, + 22,9,5,2,254,29,19,17,142,10,6,8,25,13,13,12,12,18,5,4,1,1,9,9,6,13,180,14,10,185,33,14,20,21,20,43,25,27,29,31, + 51,20,14,19,1,235,15,11,107,107,13,21,21,20,21,22,25,27,29,31,51,21,13,5,117,19,18,75,74,5,11,23,13,13,12,12,9,9,5,4, + 1,1,10,9,5,3,223,15,16,28,31,70,41,40,71,30,28,16,15,15,16,28,30,71,40,41,70,31,28,16,254,36,6,2,228,17,8,11,25,10, + 9,5,5,5,5,9,10,23,13,8,17,228,2,6,205,37,19,29,51,22,20,12,11,11,12,20,22,51,29,19,37,3,26,2,6,119,119,18,30,51, + 22,20,12,11,11,12,20,22,51,30,18,9,229,6,2,120,121,7,15,22,10,9,5,5,5,5,9,12,23,12,7,5,0,4,0,86,255,227,6,94, + 5,240,0,25,0,51,0,78,0,94,0,0,0,34,7,6,7,14,1,21,20,22,23,22,23,22,50,55,54,55,62,1,53,52,38,39,38,47,1,50, + 23,22,23,30,1,21,20,6,7,6,7,6,34,39,38,39,46,1,52,54,55,54,55,54,19,50,23,22,23,22,18,21,20,2,7,6,7,6,32,39, + 38,39,38,2,53,52,18,55,54,55,54,23,3,37,19,13,1,3,37,27,1,5,3,45,1,19,5,3,151,122,51,53,43,43,43,43,43,43,53,51, + 122,51,53,43,43,43,43,43,43,53,112,87,68,77,54,57,63,61,59,57,74,72,170,68,77,54,57,63,61,59,57,74,72,83,154,142,134,115,112,115, + 110,117,110,139,141,254,203,142,134,115,112,115,110,117,108,141,140,156,157,254,127,163,254,125,1,131,163,1,129,157,157,1,129,163,1,131,254,125,163,254, + 127,4,19,22,24,40,46,104,60,59,104,46,40,24,22,22,24,40,46,104,59,60,104,46,40,24,134,31,34,54,56,150,84,78,150,59,57,31,31,31, + 34,54,56,150,162,150,59,57,31,31,1,109,59,56,114,111,254,236,161,152,254,240,119,112,58,59,59,56,114,111,1,20,156,157,1,16,119,110,60,59, + 8,254,125,163,254,127,158,157,254,127,163,254,125,1,131,163,1,129,157,158,1,129,163,0,0,7,0,161,255,227,6,18,5,240,0,8,0,147,0,156, + 0,167,0,178,0,193,0,208,0,0,1,17,34,7,6,21,20,23,22,19,23,22,51,50,55,54,51,50,23,22,23,22,21,20,7,6,7,6,35,34, + 39,38,39,38,47,1,21,20,23,22,21,20,7,6,35,34,39,38,53,52,55,54,61,1,7,6,7,6,7,6,35,34,39,38,39,38,53,52,55,54, + 55,54,51,50,23,22,51,50,63,1,39,38,35,34,7,6,35,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22,31,1,53,52,39,38, + 53,52,55,54,50,23,22,21,20,7,6,29,1,55,54,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,35,34,15,1,17, + 50,55,54,53,52,39,38,19,37,38,39,38,35,34,7,6,7,6,1,5,22,23,22,51,50,55,54,55,54,19,37,6,21,20,23,22,23,22,51,50, + 55,54,51,50,13,1,54,53,52,39,38,39,38,35,34,7,6,35,34,3,90,42,49,30,37,56,168,18,53,101,32,37,18,16,90,70,92,18,11,25, + 43,109,20,22,56,66,83,47,63,74,18,86,64,54,82,84,88,78,54,64,86,18,71,66,49,81,66,56,22,20,110,42,25,11,18,92,70,90,16,18, + 37,32,101,53,18,18,51,101,33,38,18,16,90,70,90,20,12,26,42,110,20,22,56,66,83,47,63,74,18,86,64,54,82,168,82,54,64,86,18,71, + 66,49,81,66,56,22,20,109,43,25,11,18,92,70,90,16,18,38,33,101,51,158,42,49,30,37,56,174,1,126,21,62,10,12,31,43,70,25,36,254, + 36,254,130,21,62,10,12,31,43,70,25,36,72,254,130,13,5,7,59,60,53,10,9,29,30,65,1,216,1,126,13,5,7,59,60,53,10,9,29,30, + 65,3,211,1,185,43,26,68,81,50,74,254,180,11,32,3,1,40,53,72,44,39,57,44,74,30,6,38,48,102,137,41,10,20,84,124,92,96,106,52, + 79,79,55,103,96,92,124,84,20,10,39,139,103,47,38,6,32,72,44,57,39,44,73,52,40,1,3,32,11,11,31,3,1,40,51,74,44,38,57,45, + 72,32,6,38,48,102,137,41,10,20,84,124,92,96,106,52,79,79,52,106,96,92,124,84,20,10,39,139,103,47,38,6,30,74,44,57,39,44,72,53, + 40,1,3,31,245,254,71,43,26,68,81,50,74,1,193,221,36,21,4,25,40,58,85,254,205,221,36,21,4,25,40,58,85,1,51,221,23,33,21,24, + 39,34,34,1,4,251,221,23,33,21,24,39,34,34,1,4,0,1,0,182,0,0,5,254,5,213,0,65,0,0,1,39,7,39,55,39,55,23,53,51, + 21,23,17,39,55,23,53,51,21,55,23,7,17,55,53,51,21,55,23,7,23,7,39,7,23,55,23,7,23,7,39,21,35,53,39,17,23,7,39,21, + 35,53,7,39,55,17,7,21,35,53,7,39,55,39,55,23,2,226,240,194,60,134,196,60,196,120,240,194,60,134,120,134,60,194,240,120,196,60,196,134, + 60,194,240,240,194,60,134,196,60,196,120,240,194,60,134,120,134,60,194,240,120,196,60,196,134,60,194,2,235,138,112,104,77,114,104,114,155,224,139,1, + 22,111,104,77,227,227,77,104,111,254,235,138,224,155,114,104,114,77,104,112,138,139,112,104,77,114,104,114,155,224,139,254,234,111,104,77,227,227,77,104, + 111,1,22,139,224,155,114,104,114,77,104,112,0,7,0,156,0,0,6,24,5,213,0,29,0,33,0,37,0,41,0,45,0,49,0,53,0,0,1,51, + 17,37,17,37,23,13,3,7,37,17,37,17,35,17,5,17,5,39,45,3,55,5,17,5,7,21,23,53,37,7,21,55,5,7,23,55,37,7,23,55, + 5,7,21,63,1,21,23,53,3,30,120,1,35,1,9,60,254,246,1,36,254,221,1,9,60,254,247,254,221,120,254,221,254,247,60,1,9,254,221,1, + 36,254,246,60,1,9,1,35,171,171,1,35,171,171,253,247,172,171,171,1,154,170,171,171,253,246,171,171,120,171,5,213,254,204,169,254,176,154,104,154, + 168,168,153,104,154,254,175,169,254,205,1,51,169,1,81,154,104,153,168,168,154,104,154,1,80,169,39,197,99,197,99,99,197,99,104,99,98,98,99,99, + 98,98,103,99,198,99,198,198,99,198,0,0,0,1,0,130,0,4,6,48,5,213,0,65,0,0,1,51,21,55,23,7,17,37,17,51,21,55,23,7, + 23,7,39,13,1,55,23,7,23,7,39,21,35,17,37,17,23,7,39,21,35,53,7,39,55,17,5,17,35,53,7,39,55,39,55,23,45,1,7,39, + 55,39,55,23,53,51,17,5,17,39,55,23,3,30,120,140,100,240,1,12,200,88,60,91,140,100,240,254,246,1,11,240,100,140,89,60,92,200,254,249, + 240,100,140,120,140,100,240,254,247,200,91,60,88,140,100,240,1,11,254,247,240,100,140,92,60,89,200,1,13,240,100,140,5,213,104,81,173,139,254,206, + 155,1,21,162,52,104,53,81,173,138,153,155,139,173,81,52,104,53,161,1,21,152,254,208,139,173,81,104,101,81,173,139,1,53,153,254,235,161,53,104, + 51,81,174,139,154,153,139,173,81,53,104,51,161,254,235,155,1,54,139,173,81,0,0,0,0,1,0,161,255,229,6,19,5,240,0,135,0,0,1,22, + 21,20,7,6,7,6,35,34,39,38,39,7,23,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,53,52,55,39,17,22, + 23,30,1,20,14,1,34,46,1,52,54,55,54,55,17,7,22,21,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,55, + 39,6,7,6,35,34,46,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,23,17,38,39,46,1,52,54,55,54,51,50,30,1,20,6,7,6, + 7,17,55,38,53,52,55,54,55,54,51,50,23,22,5,248,27,27,27,46,47,53,54,46,19,17,241,241,17,19,46,54,53,47,46,27,27,27,28,45, + 47,53,51,49,47,27,26,4,241,21,19,46,54,54,92,108,92,54,54,46,19,21,241,4,26,27,47,47,53,54,46,46,27,27,27,27,46,47,106,47, + 19,17,241,241,16,20,49,51,54,92,54,27,27,46,47,53,51,49,47,27,26,4,241,21,19,46,54,54,46,47,53,54,92,54,54,46,19,21,241,4, + 26,26,48,46,54,53,47,51,4,109,54,46,53,47,46,27,27,27,11,15,139,140,15,11,27,27,27,46,47,53,52,47,47,27,27,27,26,47,46,54, + 22,21,140,254,233,7,11,27,92,108,92,54,54,92,108,92,27,11,7,1,23,140,21,22,54,46,47,26,27,27,26,47,46,54,53,47,46,27,27,27, + 11,15,140,139,15,11,27,54,92,108,46,47,26,27,27,26,47,46,54,22,21,140,1,23,7,11,27,92,108,92,27,27,54,92,108,92,27,11,7,254, + 233,140,21,22,54,46,45,28,27,27,30,0,0,9,0,97,255,229,6,83,5,215,0,7,0,11,0,15,0,19,0,23,0,46,0,69,0,92,0,115, + 0,0,0,20,6,34,38,52,54,50,9,1,55,9,2,55,9,2,39,9,2,39,1,19,38,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22, + 21,20,7,6,7,6,3,22,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,3,6,7,6,7,6,35,34,39,38,39, + 38,52,55,54,55,54,51,50,23,22,23,22,5,54,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,3,240,88,124,88, + 88,124,1,167,254,125,85,1,131,253,13,254,127,85,1,129,2,158,254,125,85,1,131,253,183,254,127,85,1,129,185,57,15,23,4,1,2,3,15,23, + 114,23,15,3,2,1,4,23,15,57,57,15,23,4,1,2,3,15,23,114,23,15,3,2,1,4,23,15,159,60,24,37,68,29,82,69,30,65,32,49, + 49,32,65,30,69,82,29,68,37,24,1,236,60,24,37,68,29,82,69,30,65,32,49,49,32,65,30,69,82,29,68,37,24,3,44,124,88,88,124,88, + 253,46,1,132,85,254,124,2,74,1,129,85,254,126,1,45,254,124,85,1,132,253,13,254,126,85,1,129,1,46,60,24,37,68,29,82,69,30,65,32, + 49,49,32,65,30,69,82,29,68,37,24,254,20,60,24,37,68,29,82,69,30,65,32,49,49,32,65,30,69,82,29,68,37,24,1,20,57,15,23,4, + 1,2,3,15,23,114,23,15,3,2,1,4,23,15,57,57,15,23,4,1,2,3,15,23,114,23,15,3,2,1,4,23,15,0,0,0,0,9,0,97, + 255,229,6,83,5,215,0,7,0,11,0,15,0,19,0,23,0,43,0,63,0,83,0,103,0,0,0,20,6,34,38,52,54,50,9,1,23,9,2,23, + 9,2,7,9,2,7,1,2,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,50,23,22,23,18,20,7,6,7,6,34,39,38,39,38,52,55, + 54,55,54,50,23,22,23,0,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,52,55,54,55,36,50,23,22,23,22,20,7,6,7,6,34,39, + 38,39,38,52,55,54,55,4,59,132,186,132,132,186,253,105,1,41,85,254,215,2,161,1,41,85,254,215,253,10,1,41,85,254,215,3,75,1,41,85, + 254,215,8,19,21,39,46,110,46,39,21,19,19,21,39,46,110,46,39,21,19,19,21,39,46,110,46,39,21,19,19,21,39,46,110,46,39,21,253,25, + 112,49,55,35,40,40,35,55,49,112,49,55,35,40,40,35,55,4,77,112,49,55,35,40,40,35,55,49,112,49,55,35,40,40,35,55,3,75,186,132, + 132,186,132,253,56,1,41,85,254,215,3,76,1,41,85,254,215,1,126,254,215,85,1,41,253,94,254,215,85,1,41,3,73,112,49,55,35,40,40,35, + 55,49,112,49,55,35,40,40,35,55,251,179,112,49,55,35,40,40,35,55,49,112,49,55,35,40,40,35,55,2,89,19,21,39,46,110,46,39,21,19, + 19,21,39,46,110,46,39,21,19,19,21,39,46,110,46,39,21,19,19,21,39,46,110,46,39,21,0,0,0,9,0,84,255,229,6,96,5,242,0,12, + 0,24,0,37,0,50,0,63,0,75,0,87,0,95,0,107,0,0,1,20,7,6,43,1,37,53,37,51,50,23,22,5,52,54,59,1,5,21,5,35, + 34,39,38,1,22,21,20,15,1,1,39,1,55,54,51,50,1,38,53,52,63,1,1,23,1,7,6,35,34,3,54,51,50,31,1,1,7,1,39,38, + 53,52,1,6,34,47,1,1,55,1,23,22,21,20,0,50,23,22,29,1,3,35,3,53,52,55,18,20,6,34,38,52,54,50,2,34,39,38,61,1, + 19,51,19,21,20,7,6,96,28,28,40,10,254,96,1,160,10,38,30,28,249,244,56,40,10,1,160,254,96,10,38,30,28,5,42,29,27,7,254,183, + 71,1,2,7,28,41,42,251,213,29,27,7,1,73,71,254,254,7,28,41,40,31,29,42,40,29,7,1,2,71,254,183,7,27,4,101,30,82,28,7, + 254,254,71,1,73,7,27,253,150,82,30,29,50,100,50,29,221,88,124,88,88,124,21,82,30,29,50,100,50,29,2,236,42,30,28,50,100,50,30,30, + 40,40,60,50,100,50,28,30,2,77,29,42,39,29,7,254,254,70,1,73,7,28,251,155,29,42,39,29,7,1,2,70,254,183,7,28,4,101,30,28, + 7,254,183,70,1,2,7,27,41,42,251,214,30,28,7,1,73,70,254,254,7,27,41,42,5,13,29,28,40,10,254,97,1,159,10,39,29,253,85,124, + 88,88,124,88,252,99,29,28,40,10,1,159,254,97,10,39,29,0,0,0,0,1,0,84,255,229,6,96,5,242,0,108,0,0,1,50,23,22,21,20, + 7,3,1,54,55,54,51,50,23,22,21,20,7,6,7,1,37,54,51,50,23,22,20,7,6,35,34,39,37,1,22,23,22,21,20,7,6,35,34,39, + 38,39,1,19,22,21,20,7,6,34,39,38,53,52,55,19,1,6,7,6,35,34,39,38,53,52,55,54,55,1,5,6,35,34,39,38,52,55,54,51, + 50,23,5,1,38,39,38,53,52,55,54,51,22,23,22,23,1,3,38,53,52,55,54,3,90,43,47,35,5,78,1,28,21,2,52,50,66,31,30,52, + 10,25,254,123,1,223,25,12,76,34,46,46,36,74,7,37,254,40,1,138,28,2,52,30,31,66,43,59,10,18,254,233,78,5,35,47,86,47,35,5, + 78,254,233,18,10,52,50,66,31,30,52,2,28,1,138,254,40,37,7,74,36,46,46,34,76,12,25,1,223,254,123,25,10,52,30,31,66,36,66,2, + 21,1,28,78,5,35,46,5,242,47,35,74,7,31,254,34,1,137,29,1,53,31,30,67,55,47,9,18,254,233,78,4,34,46,88,46,36,6,77,254, + 229,22,1,53,49,67,30,31,53,9,25,1,133,254,34,31,7,74,35,47,47,35,74,14,30,1,216,254,123,25,9,53,31,30,67,76,26,1,22,1, + 27,77,6,36,46,88,46,34,4,78,1,23,18,9,53,49,67,30,31,20,33,1,29,254,119,1,216,30,14,74,35,47,0,2,0,102,255,236,6,198, + 5,232,0,13,0,35,0,231,186,0,0,0,19,0,3,43,186,0,31,0,6,0,3,43,184,0,31,16,65,27,0,22,0,0,0,38,0,0,0,54, + 0,0,0,70,0,0,0,86,0,0,0,102,0,0,0,118,0,0,0,134,0,0,0,150,0,0,0,166,0,0,0,182,0,0,0,198,0,0,0,214, + 0,0,0,13,93,65,5,0,229,0,0,0,245,0,0,0,2,93,65,5,0,234,0,6,0,250,0,6,0,2,93,65,27,0,25,0,6,0,41,0, + 6,0,57,0,6,0,73,0,6,0,89,0,6,0,105,0,6,0,121,0,6,0,137,0,6,0,153,0,6,0,169,0,6,0,185,0,6,0,201,0, + 6,0,217,0,6,0,13,93,184,0,37,220,0,186,0,3,0,16,0,3,43,184,0,3,16,186,0,23,0,10,0,3,43,184,0,23,16,184,0,16, + 16,184,0,14,208,184,0,14,47,184,0,23,16,184,0,25,208,184,0,25,47,184,0,23,16,184,0,27,208,184,0,16,16,184,0,34,208,48,49,19, + 16,0,33,32,0,17,52,2,36,35,34,4,2,1,6,35,32,0,17,52,18,36,51,50,23,54,51,50,4,18,21,16,0,33,34,185,1,143,1,28, + 1,28,1,143,182,254,184,173,173,254,184,182,2,220,25,25,254,196,254,63,206,1,113,190,25,25,25,25,193,1,113,205,254,63,254,194,25,2,234,254, + 228,254,112,1,144,1,28,179,1,71,177,177,254,185,252,81,2,1,191,1,63,198,1,114,198,2,2,198,254,144,200,254,193,254,65,0,0,2,0,122, + 255,156,6,178,5,212,0,3,0,11,0,55,186,0,3,0,5,0,3,43,184,0,3,16,186,0,10,0,0,0,3,43,184,0,10,16,184,0,13,220, + 0,186,0,0,0,10,0,3,43,184,0,0,16,186,0,7,0,1,0,3,43,184,0,7,16,48,49,37,17,33,17,23,35,17,33,21,51,17,33,5, + 251,250,210,17,100,5,212,100,250,44,83,5,46,250,210,83,5,212,100,250,44,0,0,0,0,2,0,122,0,0,6,178,6,56,0,3,0,11,0,55, + 186,0,3,0,6,0,3,43,184,0,3,16,186,0,11,0,0,0,3,43,184,0,11,16,184,0,13,220,0,186,0,0,0,5,0,3,43,184,0,0, + 16,186,0,10,0,1,0,3,43,184,0,10,16,48,49,37,17,33,17,37,21,33,17,51,53,33,17,5,251,250,210,5,129,250,44,100,5,212,83,5, + 46,250,210,17,100,5,212,100,250,44,0,0,0,2,0,122,255,156,6,178,5,212,0,3,0,9,0,55,186,0,3,0,4,0,3,43,184,0,3,16, + 186,0,8,0,0,0,3,43,184,0,8,16,184,0,11,220,0,186,0,0,0,8,0,3,43,184,0,0,16,186,0,6,0,1,0,3,43,184,0,6, + 16,48,49,37,17,33,17,7,17,33,23,17,33,5,251,250,210,83,5,212,100,250,74,83,5,46,250,210,83,5,212,130,250,74,0,0,0,2,0,122, + 0,0,6,178,6,56,0,3,0,9,0,55,186,0,3,0,5,0,3,43,184,0,3,16,186,0,9,0,0,0,3,43,184,0,9,16,184,0,11,220, + 0,186,0,0,0,4,0,3,43,184,0,0,16,186,0,8,0,1,0,3,43,184,0,8,16,48,49,37,17,33,17,5,33,17,55,33,17,5,251,250, + 210,5,129,250,44,130,5,182,83,5,46,250,210,83,5,212,100,250,74,0,0,4,0,170,255,251,6,130,5,211,0,3,0,7,0,11,0,15,0,11, + 0,184,0,9,47,184,0,15,47,48,49,19,9,14,170,1,83,1,83,254,173,1,223,1,84,1,82,254,174,253,21,1,83,1,83,254,173,254,173,1, + 83,1,83,254,173,2,233,1,83,254,173,254,173,1,83,1,82,254,174,254,171,2,234,1,85,254,171,254,174,254,34,1,83,254,173,254,173,0,0,0, + 0,1,3,5,254,20,3,175,6,20,0,3,0,0,1,17,35,17,3,175,170,6,20,248,0,8,0,0,0,1,2,176,254,20,4,4,6,20,0,3, + 0,0,1,17,33,17,4,4,254,172,6,20,248,0,8,0,0,1,2,6,254,20,4,174,6,20,0,3,0,0,1,17,33,17,4,174,253,88,6,20, + 248,0,8,0,0,1,0,174,3,40,2,28,5,213,0,6,0,27,186,0,0,0,1,0,3,43,0,184,0,3,47,186,0,6,0,0,0,3,43,184, + 0,6,16,48,49,1,33,17,19,51,3,51,2,28,254,146,164,129,82,155,3,40,1,110,1,63,254,193,0,1,0,120,3,40,1,230,5,213,0,6, + 0,39,186,0,1,0,0,0,3,43,184,0,1,16,0,184,0,3,47,186,0,1,0,2,0,3,43,184,0,1,16,184,0,2,16,184,0,5,208,48, + 49,19,33,17,3,35,19,35,120,1,110,164,129,82,155,5,213,254,146,254,193,1,63,0,255,255,0,174,3,40,3,214,5,213,16,38,15,221,0,0, + 16,7,15,221,1,186,0,0,255,255,0,120,3,40,3,160,5,213,16,38,15,222,0,0,16,7,15,222,1,186,0,0,0,2,1,62,255,66,6,45, + 6,207,0,68,0,72,0,0,1,50,23,22,23,30,1,21,20,6,7,6,7,6,35,34,7,6,7,14,1,20,22,23,22,23,22,50,55,54,55,62, + 1,53,17,33,34,38,53,52,36,51,33,53,55,21,33,7,35,17,20,6,7,6,7,6,34,39,38,39,46,1,53,52,54,55,54,55,54,1,17,35, + 17,2,221,31,26,27,22,21,23,23,21,22,27,26,26,28,19,19,16,17,16,19,16,20,16,24,95,62,73,45,55,52,254,205,222,253,1,4,215,1, + 51,141,1,84,140,200,80,62,67,80,78,177,68,71,45,50,46,49,47,38,68,57,1,168,190,1,208,11,12,21,20,56,31,30,56,20,21,12,11,9, + 8,16,16,39,46,42,14,18,6,9,27,33,45,56,129,68,1,95,238,184,190,232,200,50,250,123,251,219,106,183,64,70,39,37,25,26,46,51,114,64, + 77,100,55,43,29,24,1,52,2,86,253,170,0,2,1,158,255,221,5,22,5,240,0,21,0,47,0,0,1,50,23,22,23,30,1,21,20,7,6,7, + 38,39,38,53,52,54,55,54,55,54,18,50,23,22,23,30,1,21,20,6,7,6,7,6,34,39,38,39,46,1,53,52,54,55,54,55,3,90,160,121, + 42,44,38,39,136,178,130,134,174,136,39,38,37,49,93,126,124,52,53,44,45,43,43,45,44,53,52,124,52,53,44,45,43,43,45,44,53,5,240,40, + 14,43,38,97,52,124,100,131,206,206,131,102,122,52,97,38,36,21,40,252,70,22,24,42,46,106,61,60,106,46,42,24,22,22,24,42,46,106,60,61, + 106,46,42,24,0,2,1,78,255,221,5,102,5,240,0,33,0,59,0,0,1,38,37,38,53,52,54,55,54,55,54,50,23,22,23,30,1,21,52,54, + 55,54,55,54,50,23,22,23,30,1,21,20,7,4,2,50,23,22,23,30,1,21,20,6,7,6,7,6,34,39,38,39,46,1,53,52,54,55,54,55, + 3,90,123,254,247,136,39,38,37,49,45,108,46,47,38,37,40,40,37,38,47,46,108,45,49,37,38,39,136,254,246,184,124,52,53,44,45,43,43,45, + 44,53,52,124,52,53,44,45,43,43,45,44,53,2,173,196,161,83,131,52,97,38,36,21,20,20,20,37,37,96,54,54,96,37,37,20,20,20,21,36, + 38,97,52,132,82,161,254,197,22,24,42,46,106,61,60,106,46,42,24,22,22,24,42,46,106,60,61,106,46,42,24,0,0,1,0,110,0,171,6,70, + 5,40,0,33,0,0,37,38,37,38,53,52,54,55,54,55,54,50,23,22,23,30,1,21,52,54,55,54,55,54,50,23,22,23,30,1,21,20,7,4, + 3,90,137,254,95,194,55,55,53,69,65,154,65,68,54,53,57,57,53,54,68,65,154,65,69,53,55,55,194,254,95,171,239,242,113,178,75,138,54,52, + 30,28,28,29,53,52,137,78,78,137,52,53,29,28,28,30,52,54,138,75,180,111,242,0,0,1,1,88,255,254,5,212,5,214,0,35,0,0,1,6, + 3,6,35,34,38,39,38,39,38,53,52,55,54,55,62,1,51,34,38,39,38,39,38,53,52,55,54,55,62,1,51,50,23,18,5,212,238,242,114,178, + 74,138,54,52,30,28,28,28,54,52,136,78,78,136,52,54,28,28,28,30,52,54,138,74,180,112,242,2,234,138,254,96,194,54,56,52,70,64,78,76, + 66,68,54,52,58,56,54,54,68,64,78,76,66,68,54,54,56,194,254,94,0,2,0,126,0,42,5,203,5,158,0,13,0,105,0,0,1,54,53,52, + 39,38,35,34,7,6,21,20,23,22,23,6,7,54,51,50,23,22,21,20,5,6,21,20,51,50,55,54,51,50,21,20,33,34,39,38,53,16,33,50, + 23,54,55,38,39,38,35,34,7,6,21,20,22,21,20,7,6,35,34,39,38,53,52,55,54,51,50,31,1,52,55,54,51,50,23,22,21,20,7,22, + 51,50,55,54,53,52,39,38,53,52,55,54,51,50,23,22,21,20,7,6,35,34,3,151,10,29,24,54,30,22,19,43,74,111,21,46,94,86,124,59, + 45,254,203,153,105,116,16,51,54,63,254,197,204,186,198,1,5,102,81,77,16,101,230,69,74,83,63,40,42,26,36,20,32,25,14,115,93,118,104,50, + 75,41,42,78,76,49,51,16,60,86,76,42,45,21,42,21,31,56,65,42,20,143,95,120,65,4,103,48,44,63,41,33,18,15,27,58,34,57,140,74, + 79,67,81,62,94,218,118,58,77,99,42,132,90,156,153,163,254,1,101,141,151,67,48,170,51,78,51,53,37,38,29,23,20,28,45,25,75,116,92,75, + 37,57,83,31,32,62,66,87,78,61,17,33,36,31,63,18,36,21,56,28,40,70,33,53,123,94,63,0,0,2,0,160,1,90,6,19,4,132,0,9, + 0,81,0,0,1,6,7,6,7,54,55,54,53,52,1,32,53,52,55,38,39,38,43,1,22,7,6,7,22,51,50,55,22,21,20,35,34,39,35,53, + 51,54,55,54,55,38,39,38,39,38,53,52,51,6,21,20,23,22,23,50,23,22,23,38,53,52,55,54,51,50,19,22,51,50,53,52,39,38,53,52, + 51,50,21,20,7,6,1,223,63,45,66,27,79,62,61,1,254,254,139,118,48,54,38,37,4,2,75,96,100,25,67,43,40,8,145,107,20,36,39,30, + 101,77,63,15,36,35,61,72,98,12,143,66,4,61,41,43,56,31,61,46,109,216,57,24,101,98,12,11,80,66,247,176,3,62,14,36,51,103,29,58, + 56,52,4,254,33,254,69,66,55,28,20,87,80,102,15,71,43,30,49,75,171,72,142,80,60,2,18,18,18,14,17,70,102,29,35,38,84,39,25,19, + 20,48,80,43,65,39,29,254,147,154,60,30,18,17,27,60,81,173,98,70,0,1,1,145,254,228,5,47,6,39,0,32,0,0,1,34,39,38,39,38, + 39,38,53,52,55,54,55,54,55,54,51,21,34,7,6,2,7,6,21,20,23,22,23,22,23,22,51,5,47,186,169,161,138,134,70,68,68,64,140,132, + 167,169,186,109,104,96,166,40,40,40,40,83,78,101,99,114,254,228,71,67,137,133,167,164,187,189,169,157,143,134,70,71,47,67,62,254,250,155,156,184, + 177,156,155,131,125,68,67,0,0,1,1,145,254,228,5,47,6,39,0,34,0,0,1,48,53,50,55,54,55,54,55,54,53,52,39,38,2,39,38,35, + 48,53,50,23,22,23,22,23,22,21,20,7,6,7,6,7,6,1,145,114,99,101,78,83,40,40,40,40,166,96,104,109,186,169,167,132,140,64,68,68, + 70,134,138,161,169,254,228,47,67,68,125,131,155,156,177,184,156,155,1,6,62,67,47,71,70,134,143,157,169,189,187,164,167,133,137,67,71,0,0,0, + 0,1,2,29,254,241,4,152,6,17,0,12,0,0,1,6,2,16,18,23,33,38,2,53,52,18,55,4,152,134,130,131,133,254,176,150,149,148,151,6, + 17,230,254,62,254,50,254,59,229,235,1,198,224,223,1,196,236,0,0,0,0,1,2,29,254,241,4,152,6,17,0,13,0,0,1,48,33,22,18,21, + 20,2,7,33,54,18,16,2,2,29,1,80,151,148,149,150,254,176,133,131,130,6,17,236,254,60,223,224,254,58,235,229,1,197,1,206,1,194,0,0, + 0,1,1,185,254,20,4,219,6,20,0,5,0,0,1,33,9,1,33,1,4,219,254,220,254,2,1,254,1,36,254,0,254,20,4,0,4,0,252,0, + 0,1,1,219,254,20,4,252,6,20,0,5,0,0,9,2,33,9,1,1,219,1,255,254,2,1,34,1,254,254,2,254,20,4,0,4,0,252,0,252, + 0,0,0,0,0,1,1,35,254,20,5,123,6,20,0,5,0,0,1,33,9,1,33,1,5,123,254,60,253,108,2,148,1,196,253,96,254,20,4,0, + 4,0,252,0,0,1,1,57,254,20,5,145,6,20,0,5,0,0,9,2,33,9,1,1,57,2,160,253,96,1,196,2,148,253,108,254,20,4,0,4, + 0,252,0,252,0,0,0,0,0,1,1,85,254,20,5,63,6,20,0,5,0,0,1,33,9,1,33,1,5,63,254,20,254,2,1,254,1,236,254,0, + 254,20,4,0,4,0,252,0,0,1,1,119,254,20,5,96,6,20,0,5,0,0,9,2,33,9,1,1,119,1,255,254,2,1,234,1,254,254,2,254, + 20,4,0,4,0,252,0,252,0,0,0,0,0,1,2,196,254,19,4,72,6,20,0,7,0,0,5,23,7,1,17,1,23,7,3,90,238,106,254,230, + 1,26,106,238,149,238,106,1,26,5,205,1,26,106,238,0,0,1,2,108,254,19,3,240,6,20,0,7,0,0,1,39,55,1,17,1,39,55,3,90, + 238,106,1,26,254,230,106,238,4,188,238,106,254,230,250,51,254,230,106,238,0,1,1,102,254,178,5,19,6,20,0,36,0,0,5,21,35,34,38,61, + 1,52,38,43,1,53,51,50,54,61,1,52,54,59,1,21,35,34,6,29,1,20,6,7,30,1,29,1,20,22,51,5,19,212,249,169,108,142,61,61, + 143,107,169,249,212,68,141,86,91,110,111,90,86,141,190,144,148,221,239,151,116,143,115,149,240,221,147,143,88,141,248,157,142,25,27,142,156,248,141,88, + 0,1,1,161,254,178,5,78,6,20,0,36,0,0,5,51,50,54,61,1,52,54,55,46,1,61,1,52,38,43,1,53,51,50,22,29,1,20,22,59, + 1,21,35,34,6,29,1,20,6,43,1,1,161,68,141,86,90,111,110,91,86,141,68,212,249,169,107,143,61,61,142,108,169,249,212,190,88,141,248,156, + 142,27,25,142,157,248,141,88,143,147,221,240,149,115,143,116,151,239,221,148,0,2,0,152,255,236,6,148,5,232,0,13,0,24,0,27,0,186,0,14, + 0,3,0,3,43,184,0,14,16,186,0,10,0,19,0,3,43,184,0,10,16,48,49,1,16,0,33,32,0,17,52,18,36,51,50,4,18,1,33,53, + 35,17,35,5,21,55,17,35,6,148,254,63,254,194,254,196,254,63,206,1,113,190,193,1,113,205,251,211,2,105,218,161,254,255,236,217,2,234,254,193, + 254,65,1,191,1,63,198,1,114,198,198,254,144,253,92,142,3,26,47,152,43,253,130,0,0,2,0,152,255,236,6,148,5,232,0,13,0,42,0,27, + 0,186,0,37,0,3,0,3,43,184,0,37,16,186,0,10,0,20,0,3,43,184,0,10,16,48,49,1,16,0,33,32,0,17,52,18,36,51,50,4, + 18,5,62,1,53,52,38,35,34,6,7,21,62,1,51,50,22,21,20,6,7,6,4,7,21,33,53,33,62,1,6,148,254,63,254,194,254,196,254,63, + 206,1,113,190,193,1,113,205,253,230,62,48,197,163,61,145,97,115,132,59,78,95,47,62,33,254,250,82,2,164,254,76,125,178,2,234,254,193,254,65, + 1,191,1,63,198,1,114,198,198,254,144,233,70,105,58,125,151,31,36,171,58,38,78,63,40,85,63,34,241,77,129,142,116,167,0,0,0,2,0,152, + 255,236,6,148,5,232,0,13,0,54,0,153,186,0,0,0,14,0,3,43,65,5,0,234,0,14,0,250,0,14,0,2,93,65,27,0,25,0,14,0, + 41,0,14,0,57,0,14,0,73,0,14,0,89,0,14,0,105,0,14,0,121,0,14,0,137,0,14,0,153,0,14,0,169,0,14,0,185,0,14,0, + 201,0,14,0,217,0,14,0,13,93,184,0,49,220,0,186,0,46,0,3,0,3,43,184,0,46,16,186,0,10,0,17,0,3,43,184,0,10,16,186, + 0,33,0,39,0,3,43,184,0,33,16,186,0,24,0,30,0,3,43,184,0,24,16,186,0,21,0,30,0,24,17,18,57,186,0,42,0,39,0,33, + 17,18,57,48,49,1,16,0,33,32,0,17,52,18,36,51,50,4,18,37,52,38,35,34,6,7,21,62,1,51,50,22,21,20,6,43,1,21,51,50, + 22,21,20,6,35,34,38,39,21,30,1,51,50,54,53,52,38,39,50,54,6,148,254,63,254,194,254,196,254,63,206,1,113,190,193,1,113,205,254,124, + 193,161,61,136,95,107,121,52,91,92,88,90,145,140,99,107,115,117,68,125,91,88,136,64,195,216,118,13,4,104,2,234,254,193,254,65,1,191,1,63, + 198,1,114,198,198,254,144,24,115,137,20,24,151,32,21,63,60,58,60,140,78,71,76,79,28,48,168,27,23,156,141,93,129,3,114,0,0,3,0,152, + 255,236,6,148,5,232,0,13,0,16,0,27,0,27,0,186,0,20,0,3,0,3,43,184,0,20,16,186,0,10,0,27,0,3,43,184,0,10,16,48, + 49,1,16,0,33,32,0,17,52,18,36,51,50,4,18,1,33,9,1,21,33,21,51,53,51,53,35,17,35,6,148,254,63,254,194,254,196,254,63,206, + 1,113,190,193,1,113,205,253,22,254,243,1,13,254,67,1,189,182,141,141,206,2,234,254,193,254,65,1,191,1,63,198,1,114,198,198,254,144,254,188, + 1,126,254,131,142,211,211,141,2,72,0,0,0,2,0,152,255,236,6,148,5,232,0,13,0,43,0,139,186,0,0,0,33,0,3,43,65,5,0,234, + 0,33,0,250,0,33,0,2,93,65,27,0,25,0,33,0,41,0,33,0,57,0,33,0,73,0,33,0,89,0,33,0,105,0,33,0,121,0,33,0, + 137,0,33,0,153,0,33,0,169,0,33,0,185,0,33,0,201,0,33,0,217,0,33,0,13,93,0,186,0,30,0,3,0,3,43,184,0,30,16,186, + 0,10,0,43,0,3,43,184,0,10,16,186,0,17,0,23,0,3,43,184,0,17,16,186,0,40,0,36,0,3,43,184,0,40,16,186,0,26,0,23, + 0,17,17,18,57,48,49,1,16,0,33,32,0,17,52,18,36,51,50,4,18,5,62,1,51,50,22,21,20,6,35,34,38,39,21,30,1,51,50,54, + 53,52,38,35,34,6,55,53,33,53,33,6,148,254,63,254,194,254,196,254,63,206,1,113,190,193,1,113,205,251,239,89,101,50,104,118,118,104,68,119, + 95,88,133,64,190,213,207,176,31,63,3,1,145,253,195,2,234,254,193,254,65,1,191,1,63,198,1,114,198,198,254,144,243,37,20,97,86,85,97,27, + 47,172,24,20,172,152,149,176,10,1,171,142,0,3,0,152,255,236,6,148,5,232,0,13,0,25,0,50,0,241,184,0,51,47,184,0,52,47,184,0, + 51,16,184,0,6,208,184,0,6,47,184,0,52,16,184,0,14,220,184,0,20,220,65,5,0,234,0,20,0,250,0,20,0,2,93,65,27,0,25,0, + 20,0,41,0,20,0,57,0,20,0,73,0,20,0,89,0,20,0,105,0,20,0,121,0,20,0,137,0,20,0,153,0,20,0,169,0,20,0,185,0, + 20,0,201,0,20,0,217,0,20,0,13,93,184,0,6,16,184,0,29,220,65,27,0,22,0,29,0,38,0,29,0,54,0,29,0,70,0,29,0,86, + 0,29,0,102,0,29,0,118,0,29,0,134,0,29,0,150,0,29,0,166,0,29,0,182,0,29,0,198,0,29,0,214,0,29,0,13,93,65,5,0, + 229,0,29,0,245,0,29,0,2,93,0,186,0,32,0,3,0,3,43,184,0,32,16,186,0,10,0,26,0,3,43,184,0,10,16,186,0,23,0,17, + 0,3,43,184,0,23,16,186,0,44,0,38,0,3,43,184,0,44,16,186,0,47,0,38,0,44,17,18,57,48,49,1,16,0,33,32,0,17,52,18, + 36,51,50,4,18,1,20,6,35,34,38,53,52,54,51,50,22,3,34,2,21,20,22,51,50,54,53,52,38,35,34,6,55,62,1,51,50,22,23,53, + 46,1,6,148,254,63,254,194,254,196,254,63,206,1,113,190,193,1,113,205,253,162,92,78,78,92,92,78,78,92,113,200,234,192,185,160,194,186,160,78, + 128,9,5,127,119,47,97,84,74,106,2,234,254,193,254,65,1,191,1,63,198,1,114,198,198,254,144,254,143,90,98,98,90,91,98,98,2,42,254,245, + 218,231,253,179,145,148,177,61,11,80,148,22,35,156,24,19,0,2,0,152,255,236,6,148,5,232,0,13,0,20,0,27,0,186,0,17,0,3,0,3, + 43,184,0,17,16,186,0,10,0,20,0,3,43,184,0,10,16,48,49,1,16,0,33,32,0,17,52,18,36,51,50,4,18,37,33,1,51,1,53,33, + 6,148,254,63,254,194,254,196,254,63,206,1,113,190,193,1,113,205,251,194,1,207,254,175,193,1,108,253,85,2,234,254,193,254,65,1,191,1,63,198, + 1,114,198,198,254,144,118,252,230,3,93,75,0,4,0,152,255,236,6,148,5,232,0,13,0,25,0,49,0,61,1,139,186,0,26,0,6,0,3,43, + 184,0,26,16,186,0,14,0,20,0,3,43,184,0,14,16,186,0,0,0,32,0,3,43,184,0,0,16,65,5,0,234,0,20,0,250,0,20,0,2, + 93,65,27,0,25,0,20,0,41,0,20,0,57,0,20,0,73,0,20,0,89,0,20,0,105,0,20,0,121,0,20,0,137,0,20,0,153,0,20,0, + 169,0,20,0,185,0,20,0,201,0,20,0,217,0,20,0,13,93,65,27,0,22,0,26,0,38,0,26,0,54,0,26,0,70,0,26,0,86,0,26, + 0,102,0,26,0,118,0,26,0,134,0,26,0,150,0,26,0,166,0,26,0,182,0,26,0,198,0,26,0,214,0,26,0,13,93,65,5,0,229,0, + 26,0,245,0,26,0,2,93,65,5,0,234,0,32,0,250,0,32,0,2,93,65,27,0,25,0,32,0,41,0,32,0,57,0,32,0,73,0,32,0, + 89,0,32,0,105,0,32,0,121,0,32,0,137,0,32,0,153,0,32,0,169,0,32,0,185,0,32,0,201,0,32,0,217,0,32,0,13,93,186,0, + 47,0,6,0,0,17,18,57,186,0,59,0,20,0,14,17,18,57,184,0,59,47,65,5,0,234,0,59,0,250,0,59,0,2,93,65,27,0,25,0, + 59,0,41,0,59,0,57,0,59,0,73,0,59,0,89,0,59,0,105,0,59,0,121,0,59,0,137,0,59,0,153,0,59,0,169,0,59,0,185,0, + 59,0,201,0,59,0,217,0,59,0,13,93,184,0,53,220,0,186,0,29,0,3,0,3,43,184,0,29,16,186,0,10,0,41,0,3,43,184,0,10, + 16,186,0,23,0,17,0,3,43,184,0,23,16,186,0,50,0,56,0,3,43,184,0,50,16,48,49,1,16,0,33,32,0,17,52,18,36,51,50,4, + 18,1,20,6,35,34,38,53,52,54,51,50,22,5,20,22,51,50,54,53,52,38,39,62,1,53,52,38,35,34,6,21,20,22,23,14,1,1,50,22, + 21,20,6,35,34,38,53,52,54,6,148,254,63,254,194,254,196,254,63,206,1,113,190,193,1,113,205,253,185,95,84,84,95,95,84,84,95,253,226,190, + 173,173,190,118,15,4,105,182,157,157,183,106,4,15,118,1,107,75,82,82,75,77,81,81,2,234,254,193,254,65,1,191,1,63,198,1,114,198,198,254, + 144,254,108,72,81,80,73,73,80,80,73,138,151,151,138,92,131,3,1,118,83,116,136,136,116,83,118,1,3,131,1,196,66,62,61,66,66,61,62,66, + 0,3,0,152,255,236,6,148,5,232,0,13,0,38,0,50,0,233,184,0,51,47,184,0,52,47,184,0,0,220,184,0,17,220,65,5,0,234,0,17, + 0,250,0,17,0,2,93,65,27,0,25,0,17,0,41,0,17,0,57,0,17,0,73,0,17,0,89,0,17,0,105,0,17,0,121,0,17,0,137,0, + 17,0,153,0,17,0,169,0,17,0,185,0,17,0,201,0,17,0,217,0,17,0,13,93,184,0,51,16,184,0,39,208,184,0,39,47,184,0,45,220, + 65,27,0,22,0,45,0,38,0,45,0,54,0,45,0,70,0,45,0,86,0,45,0,102,0,45,0,118,0,45,0,134,0,45,0,150,0,45,0,166, + 0,45,0,182,0,45,0,198,0,45,0,214,0,45,0,13,93,65,5,0,229,0,45,0,245,0,45,0,2,93,0,186,0,14,0,3,0,3,43,184, + 0,14,16,186,0,10,0,20,0,3,43,184,0,10,16,186,0,26,0,32,0,3,43,184,0,26,16,186,0,42,0,48,0,3,43,184,0,42,16,186, + 0,35,0,32,0,26,17,18,57,48,49,1,16,0,33,32,0,17,52,18,36,51,50,4,18,1,50,18,53,52,38,35,34,6,21,20,22,51,50,54, + 7,14,1,35,34,38,39,21,30,1,3,52,54,51,50,22,21,20,6,35,34,38,6,148,254,63,254,194,254,196,254,63,206,1,113,190,193,1,113,205, + 252,209,200,233,191,185,160,194,186,159,79,128,10,5,127,119,46,97,85,74,107,60,92,78,78,91,91,78,78,92,2,234,254,193,254,65,1,191,1,63, + 198,1,114,198,198,254,144,253,75,1,10,218,232,253,180,145,148,175,60,13,79,147,21,36,156,24,19,2,132,91,98,98,91,91,98,98,0,4,0,152, + 255,236,6,148,5,232,0,13,0,24,0,36,0,48,0,211,186,0,37,0,17,0,3,43,184,0,37,16,186,0,25,0,31,0,3,43,184,0,25,16, + 186,0,0,0,43,0,3,43,184,0,0,16,65,5,0,234,0,31,0,250,0,31,0,2,93,65,27,0,25,0,31,0,41,0,31,0,57,0,31,0, + 73,0,31,0,89,0,31,0,105,0,31,0,121,0,31,0,137,0,31,0,153,0,31,0,169,0,31,0,185,0,31,0,201,0,31,0,217,0,31,0, + 13,93,65,5,0,234,0,43,0,250,0,43,0,2,93,65,27,0,25,0,43,0,41,0,43,0,57,0,43,0,73,0,43,0,89,0,43,0,105,0, + 43,0,121,0,43,0,137,0,43,0,153,0,43,0,169,0,43,0,185,0,43,0,201,0,43,0,217,0,43,0,13,93,0,186,0,15,0,3,0,3, + 43,184,0,15,16,186,0,10,0,46,0,3,43,184,0,10,16,184,0,3,16,184,0,40,220,48,49,1,16,0,33,32,0,17,52,18,36,51,50,4, + 18,1,33,53,35,17,35,7,21,55,17,35,1,20,6,35,34,38,53,52,54,51,50,22,5,20,22,51,50,54,53,52,38,35,34,6,6,148,254,63, + 254,194,254,196,254,63,206,1,113,190,193,1,113,205,251,36,1,194,159,117,188,172,158,3,137,70,63,64,69,69,64,63,70,254,112,136,131,130,136,136, + 130,131,136,2,234,254,193,254,65,1,191,1,63,198,1,114,198,198,254,144,253,169,128,2,202,42,137,39,253,194,1,36,162,151,151,162,163,151,151,163, + 208,228,228,208,209,228,228,0,0,3,0,9,255,150,6,171,6,61,0,25,0,36,0,62,0,0,0,32,7,6,7,6,2,21,20,18,23,22,23,22, + 32,55,54,55,54,18,53,52,2,39,38,39,1,33,17,5,53,37,51,17,33,21,33,18,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38, + 39,38,2,53,52,18,55,54,55,3,244,254,204,134,132,109,111,109,109,111,109,132,134,1,52,134,132,109,111,109,109,111,109,132,253,165,1,8,254,225, + 1,30,161,1,8,253,80,141,1,92,152,150,124,126,123,123,126,124,150,152,254,164,152,150,124,126,123,123,126,124,150,5,217,57,54,111,111,254,247,156, + 151,254,247,111,111,54,57,57,54,111,111,1,9,151,156,1,9,111,111,54,251,125,3,143,57,147,58,251,221,136,5,168,64,62,125,126,254,212,177,172, + 254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,3,0,9,255,150,6,171,6,61,0,25,0,54,0,80,0,0,0,32, + 7,6,7,6,2,21,20,18,23,22,23,22,32,55,54,55,54,18,53,52,2,39,38,39,1,33,21,33,53,54,0,55,62,1,53,52,38,35,34,6, + 7,53,62,1,51,50,22,21,20,6,7,14,1,2,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,3, + 244,254,204,134,132,109,111,109,109,111,109,132,134,1,52,134,132,109,111,109,109,111,109,132,254,41,2,52,253,10,92,1,61,41,78,61,133,107,80,165, + 96,97,170,70,186,221,55,73,20,215,186,1,92,152,150,124,126,123,123,126,124,150,152,254,164,152,150,124,126,123,123,126,124,150,5,217,57,54,111,111, + 254,247,156,151,254,247,111,111,54,57,57,54,111,111,1,9,151,156,1,9,111,111,54,251,128,136,136,95,1,65,46,88,120,59,95,120,53,53,163,39, + 40,186,155,73,132,90,23,222,4,86,64,62,125,126,254,212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,0, + 0,3,0,9,255,150,6,171,6,61,0,25,0,66,0,92,0,0,0,32,7,6,7,6,2,21,20,18,23,22,23,22,32,55,54,55,54,18,53,52, + 2,39,38,39,3,30,1,21,20,6,35,34,38,39,53,30,1,51,50,54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,7,53,62,1,51, + 50,22,21,20,6,0,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,3,244,254,204,134,132,109,111,109, + 109,111,109,132,134,1,52,134,132,109,111,109,109,111,109,132,116,116,131,243,224,76,159,85,68,160,87,152,159,148,132,139,145,120,126,130,122,66,152,92, + 82,171,71,186,213,114,254,61,1,92,152,150,124,126,123,123,126,124,150,152,254,164,152,150,124,126,123,123,126,124,150,5,217,57,54,111,111,254,247,156, + 151,254,247,111,111,54,57,57,54,111,111,1,9,151,156,1,9,111,111,54,253,121,25,156,116,176,194,30,29,156,39,40,120,114,106,119,133,95,90,92, + 98,29,30,144,23,28,167,142,100,136,3,9,64,62,125,126,254,212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0, + 0,4,0,9,255,150,6,171,6,61,0,25,0,28,0,39,0,65,0,0,0,32,7,6,7,6,2,21,20,18,23,22,23,22,32,55,54,55,54,18, + 53,52,2,39,38,39,7,1,33,3,51,17,51,21,35,17,35,17,33,53,0,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2, + 53,52,18,55,54,55,3,244,254,204,134,132,109,111,109,109,111,109,132,134,1,52,134,132,109,111,109,109,111,109,132,222,254,104,1,152,42,203,170,170, + 161,253,229,1,43,1,92,152,150,124,126,123,123,126,124,150,152,254,164,152,150,124,126,123,123,126,124,150,5,217,57,54,111,111,254,247,156,151,254,247, + 111,111,54,57,57,54,111,111,1,9,151,156,1,9,111,111,54,237,253,130,3,11,252,245,134,254,230,1,26,156,3,242,64,62,125,126,254,212,177,172, + 254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,3,0,9,255,150,6,171,6,61,0,25,0,55,0,81,0,0,0,32, + 7,6,7,6,2,21,20,18,23,22,23,22,32,55,54,55,54,18,53,52,2,39,38,39,5,33,21,33,17,62,1,51,50,22,21,20,6,35,34,38, + 39,53,30,1,51,50,54,53,52,38,35,34,6,7,18,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55, + 3,244,254,204,134,132,109,111,109,109,111,109,132,134,1,52,134,132,109,111,109,109,111,109,132,253,163,2,122,254,26,35,71,35,200,233,240,218,75,156, + 83,76,149,86,138,162,162,138,65,129,67,143,1,92,152,150,124,126,123,123,126,124,150,152,254,164,152,150,124,126,123,123,126,124,150,5,217,57,54,111, + 111,254,247,156,151,254,247,111,111,54,57,57,54,111,111,1,9,151,156,1,9,111,111,54,99,136,254,219,12,12,219,187,193,214,26,25,163,41,37,146, + 125,124,146,29,30,3,88,64,62,125,126,254,212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,0,4,0,9, + 255,150,6,171,6,61,0,25,0,37,0,62,0,88,0,0,0,32,7,6,7,6,2,21,20,18,23,22,23,22,32,55,54,55,54,18,53,52,2,39, + 38,39,1,34,6,21,20,22,51,50,54,53,52,38,19,21,46,1,35,34,6,7,62,1,51,50,22,21,20,6,35,34,2,17,16,0,51,50,22,0, + 32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,3,244,254,204,134,132,109,111,109,109,111,109,132,134,1, + 52,134,132,109,111,109,109,111,109,132,254,214,108,128,128,108,109,127,127,212,61,124,60,160,169,12,47,142,86,180,209,218,181,207,219,1,13,226,61,124, + 254,94,1,92,152,150,124,126,123,123,126,124,150,152,254,164,152,150,124,126,123,123,126,124,150,5,217,57,54,111,111,254,247,156,151,254,247,111,111,54, + 57,57,54,111,111,1,9,151,156,1,9,111,111,54,253,139,149,130,128,150,150,128,130,149,1,250,147,29,30,216,218,69,75,219,188,184,222,1,62,1, + 45,1,29,1,79,24,1,0,64,62,125,126,254,212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,3,0,9, + 255,150,6,171,6,61,0,25,0,32,0,58,0,0,0,32,7,6,7,6,2,21,20,18,23,22,23,22,32,55,54,55,54,18,53,52,2,39,38,39, + 5,33,21,1,35,1,33,18,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,3,244,254,204,134,132,109, + 111,109,109,111,109,132,134,1,52,134,132,109,111,109,109,111,109,132,253,92,3,0,254,78,168,1,152,253,194,214,1,92,152,150,124,126,123,123,126,124, + 150,152,254,164,152,150,124,126,123,123,126,124,150,5,217,57,54,111,111,254,247,156,151,254,247,111,111,54,57,57,54,111,111,1,9,151,156,1,9,111, + 111,54,96,69,251,154,4,35,1,133,64,62,125,126,254,212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,0, + 0,5,0,9,255,150,6,171,6,61,0,25,0,35,0,57,0,69,0,95,0,0,0,32,7,6,7,6,2,21,20,18,23,22,23,22,32,55,54,55, + 54,18,53,52,2,39,38,39,1,34,6,20,22,50,54,53,52,38,37,46,1,53,52,54,32,22,21,20,6,7,30,1,21,20,6,32,38,53,52,54, + 19,20,22,51,50,54,53,52,38,35,34,6,18,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,3,244, + 254,204,134,132,109,111,109,109,111,109,132,134,1,52,134,132,109,111,109,109,111,109,132,254,223,115,132,132,230,133,132,254,234,104,116,204,1,100,204,116, + 104,117,131,212,254,116,212,132,57,116,105,104,118,118,104,105,116,48,1,92,152,150,124,126,123,123,126,124,150,152,254,164,152,150,124,126,123,123,126,124, + 150,5,217,57,54,111,111,254,247,156,151,254,247,111,111,54,57,57,54,111,111,1,9,151,156,1,9,111,111,54,253,44,123,216,123,124,107,108,123,69, + 26,142,103,143,166,166,143,103,142,26,27,158,115,173,186,186,173,115,158,1,26,92,104,104,92,93,104,104,1,208,64,62,125,126,254,212,177,172,254,212, + 126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,0,0,4,0,9,255,150,6,171,6,61,0,25,0,50,0,62,0,88,0,0, + 0,32,7,6,7,6,2,21,20,18,23,22,23,22,32,55,54,55,54,18,53,52,2,39,38,39,1,53,30,1,51,50,54,55,14,1,35,34,38,53, + 52,54,51,50,18,17,16,0,35,34,38,19,50,54,53,52,38,35,34,6,21,20,22,2,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38, + 39,38,2,53,52,18,55,54,55,3,244,254,204,134,132,109,111,109,109,111,109,132,134,1,52,134,132,109,111,109,109,111,109,132,253,167,61,124,60,160, + 169,12,46,143,86,181,207,218,180,208,218,254,244,226,61,125,254,109,127,127,109,108,128,128,74,1,92,152,150,124,126,123,123,126,124,150,152,254,164,152, + 150,124,126,123,123,126,124,150,5,217,57,54,111,111,254,247,156,151,254,247,111,111,54,57,57,54,111,111,1,9,151,156,1,9,111,111,54,251,14,147, + 29,30,215,219,68,74,217,188,184,222,254,195,254,209,254,230,254,175,24,2,18,149,130,129,149,149,129,130,149,3,149,64,62,125,126,254,212,177,172,254, + 212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,0,5,0,9,255,150,6,171,6,61,0,29,0,43,0,56,0,67,0,97, + 0,0,0,32,7,6,7,6,7,6,21,20,23,22,23,22,23,22,32,55,54,55,54,55,54,53,52,39,38,39,38,39,7,34,7,6,21,20,22,51, + 50,54,53,52,39,46,1,32,23,22,17,16,7,6,32,2,17,16,55,1,51,17,7,53,55,51,17,51,21,33,0,32,23,22,23,22,23,22,21,20, + 7,6,7,6,7,6,32,39,38,39,38,39,38,53,52,55,54,55,54,55,3,244,254,204,134,132,109,111,53,56,56,53,111,109,132,134,1,52,134,132, + 109,111,53,56,56,53,111,109,132,29,84,44,43,86,85,86,86,43,43,239,1,50,81,80,80,81,254,206,160,80,254,51,141,150,149,129,131,254,112,1, + 5,1,92,152,150,124,126,60,63,63,60,126,124,150,152,254,164,152,150,124,126,60,63,63,60,126,124,150,5,217,57,54,111,111,131,134,156,151,134,131, + 111,111,54,57,57,54,111,111,131,134,151,156,134,131,111,111,54,203,123,122,247,245,246,246,245,243,126,123,128,159,158,254,209,254,211,159,159,1,62,1, + 45,1,44,161,252,103,3,143,37,147,38,251,221,136,5,168,64,62,125,126,149,151,177,172,151,149,126,125,62,64,64,62,125,126,149,151,172,177,151,149, + 126,125,62,0,0,2,0,9,255,150,6,171,6,61,0,10,0,36,0,0,1,21,33,53,33,17,35,5,21,37,17,2,32,23,22,23,22,18,21,20, + 2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,2,31,2,176,254,248,161,254,226,1,31,123,1,92,152,150,124,126,123,123,126,124,150, + 152,254,164,152,150,124,126,123,123,126,124,150,1,29,136,136,4,35,58,147,57,252,113,5,32,64,62,125,126,254,212,177,172,254,212,126,125,62,64,64, + 62,125,126,1,44,172,177,1,44,126,125,62,0,2,0,9,255,150,6,171,6,61,0,28,0,54,0,0,1,62,1,55,62,1,53,52,38,35,34,6, + 7,21,62,1,51,50,22,21,20,6,7,6,0,7,21,33,53,0,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18, + 55,54,55,2,163,195,215,20,73,55,221,186,70,170,97,96,169,76,107,133,61,78,41,254,195,92,2,246,253,213,1,92,152,150,124,126,123,123,126,124, + 150,152,254,164,152,150,124,126,123,123,126,124,150,1,32,199,222,23,90,132,73,155,186,40,39,163,53,53,120,95,59,120,88,46,254,191,95,136,136,5, + 29,64,62,125,126,254,212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,2,0,9,255,150,6,171,6,61,0,40, + 0,66,0,0,1,62,1,53,52,38,35,34,6,7,21,62,1,51,50,22,21,20,6,43,1,21,51,50,22,21,20,6,35,34,38,39,21,30,1,51, + 50,54,53,52,38,0,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,4,6,105,114,215,184,71,161,92, + 92,152,66,122,130,126,120,145,139,132,148,159,152,87,160,68,85,159,76,224,243,131,254,50,1,92,152,150,124,126,123,123,126,124,150,152,254,164,152,150, + 124,126,123,123,126,124,150,3,25,27,136,100,142,167,25,26,144,30,29,98,92,90,95,133,119,106,114,120,40,39,156,29,30,194,176,116,156,3,61,64, + 62,125,126,254,212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,0,3,0,9,255,150,6,171,6,61,0,2, + 0,13,0,39,0,0,1,17,33,9,1,21,33,17,51,17,51,53,35,17,36,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2, + 53,52,18,55,54,55,3,156,254,104,1,110,254,15,2,27,161,170,170,254,111,1,92,152,150,124,126,123,123,126,124,150,152,254,164,152,150,124,126,123, + 123,126,124,150,4,179,253,130,3,11,253,11,156,254,230,1,26,134,3,11,253,64,62,125,126,254,212,177,172,254,212,126,125,62,64,64,62,125,126,1, + 44,172,177,1,44,126,125,62,0,2,0,9,255,150,6,171,6,61,0,29,0,55,0,0,1,17,62,1,51,50,22,21,20,6,35,34,38,39,21,30, + 1,51,50,54,53,52,38,35,34,6,7,17,33,53,0,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55, + 2,29,67,129,65,138,162,162,138,86,153,72,83,156,75,218,240,233,200,35,71,35,1,230,254,21,1,92,152,150,124,126,123,123,126,124,150,152,254,164, + 152,150,124,126,123,123,126,124,150,5,61,253,168,30,29,146,124,125,146,39,39,163,25,26,214,193,187,219,12,12,1,37,136,1,0,64,62,125,126,254, + 212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,0,3,0,9,255,150,6,171,6,61,0,11,0,36,0,62, + 0,0,1,50,22,21,20,6,35,34,38,53,52,54,1,46,1,35,34,0,17,16,18,51,50,54,53,52,38,35,34,6,7,62,1,51,50,22,23,0, + 32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,3,80,109,127,127,109,108,128,128,1,173,67,124,61,226, + 254,243,219,207,181,218,209,180,86,142,47,12,169,160,60,124,61,254,27,1,92,152,150,124,126,123,123,126,124,150,152,254,164,152,150,124,126,123,123,126, + 124,150,3,43,149,130,128,150,150,128,130,149,1,250,24,24,254,175,254,229,254,211,254,194,222,184,188,219,75,69,218,216,30,29,1,171,64,62,125,126, + 254,212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,2,0,9,255,150,6,171,6,61,0,6,0,32,0,0, + 1,21,33,1,51,1,53,36,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,1,214,2,62,254,104,168, + 1,178,253,214,1,92,152,150,124,126,123,123,126,124,150,152,254,164,152,150,124,126,123,123,126,124,150,5,64,136,251,221,4,102,69,253,64,62,125,126, + 254,212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,4,0,9,255,150,6,171,6,61,0,9,0,31,0,43, + 0,69,0,0,1,50,22,21,20,6,34,38,52,54,39,14,1,21,20,22,32,54,53,52,38,39,62,1,53,52,38,32,6,21,20,22,55,52,54,51, + 50,22,21,20,6,35,34,38,18,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,3,89,116,132,133,230, + 132,132,47,116,132,212,1,140,212,131,117,104,116,204,254,156,204,116,45,116,105,104,118,118,104,105,116,48,1,92,152,150,124,126,123,123,126,124,150,152, + 254,164,152,150,124,126,123,123,126,124,150,2,204,123,108,107,124,123,216,123,69,27,158,115,173,186,186,173,115,158,27,26,142,103,143,166,166,143,103,142, + 229,93,104,104,93,92,104,104,2,137,64,62,125,126,254,212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,0, + 0,3,0,9,255,150,6,171,6,61,0,24,0,36,0,62,0,0,37,30,1,51,50,0,17,16,2,35,34,6,21,20,22,51,50,54,55,14,1,35, + 34,38,39,1,34,38,53,52,54,51,50,22,21,20,6,0,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54, + 55,2,33,67,125,61,226,1,12,218,208,180,218,209,179,86,143,46,12,169,160,60,124,61,1,65,108,128,128,108,109,127,127,254,221,1,92,152,150,124, + 126,123,123,126,124,150,152,254,164,152,150,124,126,123,123,126,124,150,174,24,24,1,81,1,26,1,47,1,61,222,184,188,217,74,68,219,215,30,29,1, + 103,149,130,129,149,149,129,130,149,3,149,64,62,125,126,254,212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0, + 0,4,0,9,255,150,6,171,6,61,0,11,0,21,0,32,0,58,0,0,1,50,22,21,20,6,35,34,38,53,52,54,36,32,2,17,16,18,32,18, + 17,16,1,21,33,53,35,17,35,7,21,55,17,18,32,23,22,23,22,18,21,20,2,7,6,7,6,32,39,38,39,38,2,53,52,18,55,54,55,4, + 153,101,100,100,101,100,100,100,1,5,254,190,169,169,1,66,170,251,145,1,194,161,129,179,180,150,1,92,152,150,124,126,123,123,126,124,150,152,254,164, + 152,150,124,126,123,123,126,124,150,4,213,245,247,245,246,246,245,247,245,128,254,195,254,209,254,211,254,194,1,62,1,45,1,47,253,5,136,136,4,35, + 38,147,37,252,113,5,32,64,62,125,126,254,212,177,172,254,212,126,125,62,64,64,62,125,126,1,44,172,177,1,44,126,125,62,0,0,0,1,0,117, + 0,154,6,80,4,106,0,8,0,0,9,1,33,1,33,53,33,1,33,6,80,254,24,254,192,1,112,251,221,4,35,254,144,1,64,2,130,254,24,1, + 112,240,1,112,0,1,0,252,0,112,5,116,4,233,0,6,0,0,9,1,55,1,27,1,37,3,247,253,5,169,2,181,212,70,253,78,1,139,2,180, + 170,253,5,1,52,253,78,71,0,1,0,117,0,204,6,80,4,56,0,6,0,0,1,5,53,5,3,9,1,4,122,251,251,4,5,68,2,26,253,230, + 2,60,50,240,50,1,112,254,74,254,74,0,0,1,0,252,0,27,5,116,4,148,0,6,0,0,9,1,39,1,45,1,3,4,90,253,75,169,2,251, + 254,203,2,178,70,3,22,253,5,170,2,180,212,71,253,78,0,1,0,117,1,8,6,80,3,252,0,8,0,0,19,33,3,4,5,4,5,19,33,117, + 2,187,168,1,92,2,108,253,148,254,164,168,253,69,2,190,1,62,252,126,126,252,1,62,0,1,0,117,0,117,6,29,4,143,0,43,0,0,0,20, + 6,7,1,6,7,6,34,38,39,46,1,53,52,54,63,1,33,34,46,2,52,62,2,51,33,39,46,1,53,52,54,55,62,1,50,23,22,23,1,22, + 6,29,20,17,254,112,16,24,22,52,44,18,18,19,20,17,186,252,128,26,44,36,19,19,36,44,26,3,128,186,17,20,19,18,18,44,52,22,24,16, + 1,144,19,2,155,50,46,17,254,112,16,11,10,20,17,19,44,25,26,46,17,186,20,34,46,50,46,34,20,186,17,46,26,25,44,19,17,20,10,11, + 16,254,112,19,0,1,0,117,0,204,6,80,4,56,0,6,0,0,1,33,53,33,17,9,1,4,154,251,219,4,37,1,182,254,74,2,90,80,1,142, + 254,74,254,74,0,1,0,117,0,204,6,80,4,56,0,6,0,0,1,33,53,33,17,9,1,4,154,251,219,4,37,1,182,254,74,2,20,220,1,72, + 254,74,254,74,0,4,0,117,0,204,6,80,4,56,0,3,0,7,0,11,0,18,0,0,1,35,17,51,1,35,17,51,3,35,17,51,1,33,17,33, + 53,9,1,2,185,240,240,254,192,120,120,200,60,60,3,233,254,111,1,145,1,182,254,74,1,186,1,144,254,112,1,144,254,112,1,144,254,112,1,144, + 238,254,74,254,74,0,0,0,0,4,0,117,0,204,6,80,4,56,0,8,0,12,0,16,0,20,0,0,1,53,18,23,6,3,53,33,17,3,35,17, + 51,1,35,17,51,3,35,17,51,4,154,184,254,254,184,254,111,80,240,240,254,192,120,120,200,60,60,3,174,138,254,206,132,132,254,206,138,2,88,253, + 168,2,88,253,168,2,88,253,168,2,88,0,0,1,0,117,0,134,6,125,4,126,0,6,0,0,9,2,17,33,17,33,4,129,1,252,254,4,251,244, + 4,12,4,126,254,4,254,4,1,17,1,214,0,2,0,228,0,192,6,80,4,68,0,2,0,6,0,0,1,33,1,19,9,2,3,30,2,54,252,188, + 150,254,62,5,108,250,148,2,130,1,15,254,241,1,194,254,62,254,62,0,0,2,0,228,0,192,6,80,4,68,0,2,0,6,0,0,9,2,33,9, + 2,3,30,254,242,3,68,253,82,254,62,5,108,250,148,2,130,254,241,1,15,1,194,254,62,254,62,0,0,1,0,228,255,248,6,80,5,12,0,3, + 0,0,9,3,2,66,254,162,5,108,250,148,2,130,2,138,253,118,253,118,0,1,0,117,0,204,6,80,4,98,0,20,0,0,19,17,20,22,23,22, + 23,22,51,33,53,9,1,53,33,32,39,38,39,46,1,117,36,35,35,43,42,12,3,90,1,182,254,74,254,77,254,77,42,43,35,35,36,2,130,1, + 224,48,85,37,33,19,18,198,254,74,254,74,198,18,19,33,37,85,0,0,0,1,0,117,0,162,6,80,4,56,0,20,0,0,19,52,54,55,54,55, + 54,51,33,53,9,1,53,33,32,7,6,7,14,1,21,117,36,35,35,43,42,12,3,90,1,182,254,74,254,77,254,77,42,43,35,35,36,2,130,48, + 85,37,33,19,18,198,254,74,254,74,198,18,19,33,37,85,48,0,0,0,0,1,1,236,255,241,4,217,5,19,0,6,0,0,1,33,17,33,17,9, + 1,3,94,254,142,1,114,1,123,254,133,1,86,2,88,1,101,253,111,253,111,0,0,0,0,1,0,117,0,204,6,80,4,56,0,8,0,0,1,53, + 18,5,4,3,53,33,17,4,4,144,1,188,254,68,144,252,113,3,154,158,254,206,132,132,254,206,158,2,48,0,0,0,0,2,0,117,0,154,6,30, + 4,106,0,8,0,15,0,0,37,53,33,17,33,53,51,9,1,3,21,9,1,21,33,17,3,60,253,57,2,199,250,1,232,254,24,170,1,152,254,104, + 253,57,154,238,1,244,238,254,24,254,24,1,62,238,1,152,1,152,238,254,172,0,0,0,0,2,0,117,0,154,6,30,4,106,0,8,0,15,0,0, + 37,53,33,17,33,53,51,9,1,3,21,9,1,21,33,17,3,60,253,57,2,199,250,1,232,254,24,20,1,152,254,104,253,57,154,238,1,244,238,254, + 24,254,24,1,62,238,1,152,1,152,238,254,172,0,0,0,0,2,0,43,0,24,6,90,4,176,0,11,0,18,0,0,19,1,33,55,51,19,21,1, + 35,53,55,33,1,7,1,3,7,33,3,43,1,32,3,73,138,100,216,253,38,150,22,253,43,3,209,138,2,132,172,138,252,183,196,1,206,1,244,238, + 253,254,200,254,50,200,38,1,24,238,1,152,1,152,238,254,172,0,0,0,0,2,0,43,0,24,6,90,4,176,0,11,0,18,0,0,19,53,33,39, + 53,51,1,21,3,35,39,33,1,33,19,33,23,19,1,43,2,213,22,150,2,218,216,100,138,252,183,2,177,252,183,196,3,73,138,172,253,124,2,250, + 200,38,200,254,50,200,253,254,238,1,164,254,172,238,1,152,1,152,0,0,0,2,1,21,0,0,6,50,4,152,0,10,0,17,0,0,33,39,33,39, + 17,33,53,51,1,23,1,3,21,9,1,21,33,17,3,220,79,253,236,100,2,99,110,1,232,100,254,24,130,1,152,254,104,253,157,158,200,2,148,158, + 254,24,200,254,24,1,182,158,1,152,1,152,158,254,12,0,0,2,1,21,0,0,6,50,4,152,0,10,0,17,0,0,1,51,1,7,1,35,53,33, + 17,55,33,19,33,17,33,21,9,1,3,220,110,1,232,100,254,24,110,253,157,100,2,20,59,253,157,2,99,1,152,254,104,4,152,254,24,200,254,24, + 158,2,148,200,254,232,254,12,158,1,152,1,152,0,0,0,0,2,0,127,0,100,6,100,4,152,0,12,0,20,0,0,1,3,33,53,51,1,23,1, + 35,39,53,33,39,19,7,33,21,9,1,21,33,1,21,150,3,93,110,1,232,50,254,24,110,50,252,213,50,242,114,3,45,1,152,254,104,252,211,2, + 176,1,74,158,254,24,100,254,24,99,59,100,1,74,250,158,1,152,1,152,158,0,0,0,0,2,0,127,0,100,6,100,4,152,0,12,0,20,0,0, + 1,3,55,33,53,55,51,1,7,1,35,53,33,19,7,33,21,9,1,21,33,1,21,150,50,3,43,50,110,1,232,50,254,24,110,252,163,242,114,3, + 45,1,152,254,104,252,211,2,76,1,74,100,59,99,254,24,100,254,24,158,1,74,250,158,1,152,1,152,158,0,0,0,0,1,1,60,255,216,5,196, + 4,175,0,30,0,0,1,54,55,54,55,54,51,50,23,22,23,30,1,21,20,6,7,6,7,6,34,39,38,39,38,39,33,21,9,1,21,1,60,39, + 67,90,109,111,126,121,116,105,94,90,92,88,94,86,113,111,247,116,105,94,63,41,2,88,1,202,254,54,3,110,71,67,90,46,47,47,43,93,89,221, + 128,122,218,95,88,48,47,47,43,93,62,73,158,1,202,1,202,158,0,0,0,9,0,130,1,66,6,80,3,194,0,3,0,7,0,11,0,15,0,30, + 0,34,0,38,0,42,0,46,0,0,1,7,51,55,35,7,51,55,35,7,51,55,35,7,51,55,35,53,3,33,19,33,17,22,23,6,7,17,33,3, + 33,1,51,39,35,23,51,39,35,23,51,39,35,23,51,39,35,2,225,160,60,160,180,160,60,160,180,160,60,160,180,160,60,160,120,187,2,28,187,1, + 135,173,195,195,173,254,121,187,253,228,2,95,60,160,60,40,60,160,60,40,60,160,60,40,60,160,60,2,90,240,240,240,240,240,240,240,240,80,1,24, + 254,232,1,22,188,130,130,188,1,22,254,232,1,104,240,240,240,240,240,240,240,0,0,0,0,3,0,165,0,112,5,116,5,62,0,12,0,16,0,20, + 0,0,1,55,6,21,20,23,38,35,34,7,55,39,55,9,1,33,1,37,17,1,17,4,162,175,7,42,142,164,66,70,175,254,56,254,29,1,169,254, + 229,254,87,1,85,1,168,1,123,176,70,67,163,143,42,7,176,254,57,1,111,254,88,1,168,58,1,27,254,87,254,230,0,3,0,117,1,98,6,80, + 3,162,0,8,0,12,0,16,0,0,1,53,22,23,6,7,53,33,53,5,33,7,33,19,39,33,23,4,254,154,184,184,154,254,152,253,167,2,88,200, + 253,168,200,200,2,88,200,2,170,248,188,100,100,188,248,80,82,200,1,26,200,200,0,0,0,3,0,167,255,197,5,116,4,148,0,12,0,16,0,20, + 0,0,1,39,22,51,50,55,6,21,20,23,39,7,39,9,1,17,1,3,33,1,33,4,105,175,70,66,164,142,42,7,175,255,56,254,145,1,168,254, + 88,58,254,229,1,168,1,27,3,193,176,7,42,144,162,67,70,176,255,57,254,29,1,168,254,229,254,88,1,85,1,168,0,1,0,167,0,112,5,116, + 5,62,0,42,0,0,37,38,35,34,7,62,1,55,39,38,39,38,34,6,7,1,62,1,51,50,31,1,55,38,53,52,54,55,1,14,1,21,20,23, + 22,23,1,62,1,55,6,21,20,5,116,143,165,66,69,72,128,24,166,166,35,38,78,75,28,254,88,36,87,47,44,48,21,5,19,36,34,1,168,32, + 25,14,15,7,1,68,4,53,72,7,112,42,7,71,54,3,166,166,14,15,30,28,1,168,36,34,18,8,33,48,44,48,89,34,254,87,33,70,38,39, + 38,35,7,254,187,23,129,71,71,67,163,0,0,1,0,117,1,97,6,80,3,163,0,39,0,0,1,6,7,52,54,55,35,34,7,6,7,14,1,21, + 33,52,54,55,54,63,1,39,38,39,46,1,53,33,20,22,23,22,23,22,51,33,46,1,53,22,6,80,183,155,53,14,235,234,35,36,29,28,31,253, + 168,37,34,31,47,21,21,47,31,34,37,2,88,31,28,29,36,35,10,1,203,14,53,155,2,130,101,188,101,129,19,15,16,28,27,74,40,48,89,33, + 31,21,9,27,21,31,34,88,48,40,74,27,28,16,15,19,129,101,188,0,0,1,0,167,255,198,5,116,4,148,0,42,0,0,1,6,21,20,23,46, + 1,39,7,6,7,6,21,20,22,23,1,46,1,53,52,63,1,39,6,35,34,38,39,1,30,1,50,55,54,55,1,46,1,39,22,51,50,5,116,41, + 7,72,53,4,167,167,12,14,29,28,254,88,34,36,19,9,35,48,44,48,88,34,1,168,28,75,78,38,35,7,1,69,24,128,72,69,66,165,4,148, + 142,163,67,71,71,129,23,168,168,31,38,39,38,75,28,254,87,34,89,48,44,48,21,4,18,36,34,1,168,28,30,15,14,7,1,69,3,54,71,7, + 0,3,0,115,0,172,6,80,4,88,0,20,0,39,0,60,0,0,1,54,37,6,3,6,7,6,7,6,34,39,38,39,46,1,53,52,54,55,54,36, + 52,54,55,54,55,54,50,23,4,5,4,5,6,34,39,38,39,38,1,38,39,46,1,53,52,54,55,54,55,54,50,23,22,23,22,23,18,23,36,4, + 47,246,1,43,227,122,12,21,22,27,26,62,26,27,22,21,23,23,21,22,252,95,32,27,29,36,35,82,35,1,97,3,102,252,130,254,183,35,82,35, + 41,24,29,3,158,27,22,21,23,23,21,22,27,26,62,26,27,22,18,15,120,229,254,148,1,206,98,81,117,254,253,29,20,21,12,11,11,12,21,20, + 56,31,30,56,20,21,151,82,75,26,28,16,15,14,133,54,56,131,14,15,18,26,31,1,35,12,21,20,56,30,31,56,20,21,12,11,11,12,21,17, + 32,254,254,118,99,0,0,0,0,2,0,150,1,31,6,60,3,229,0,26,0,42,0,0,19,54,55,54,55,54,55,54,51,50,23,22,23,22,5,4, + 7,14,1,35,34,39,38,39,38,39,38,37,46,1,53,52,54,55,22,23,6,7,46,1,53,52,54,150,65,30,32,20,39,39,43,47,53,52,60,51, + 162,1,145,254,111,162,56,110,50,51,39,57,21,29,23,29,4,6,37,37,37,37,98,252,252,98,37,37,37,2,130,38,58,63,19,36,18,19,19,22, + 32,102,76,76,102,35,38,19,29,25,35,47,58,38,39,88,50,51,88,39,241,114,114,241,39,88,51,50,88,0,0,0,0,1,0,162,1,86,6,50, + 3,174,0,99,0,0,0,20,6,15,1,6,7,6,34,39,38,39,46,1,53,52,63,1,54,53,52,38,39,38,39,38,35,33,34,7,6,7,6,15, + 1,6,7,6,7,6,35,33,34,46,2,52,63,1,54,52,47,1,38,52,54,55,54,55,54,51,33,50,23,22,23,22,31,1,22,23,22,23,22,51, + 33,50,55,54,55,62,1,53,52,47,1,38,53,52,54,55,54,55,54,50,23,22,31,1,22,6,50,6,6,240,4,9,7,16,7,7,6,6,6,3, + 27,3,6,6,5,8,8,7,254,230,8,7,7,6,5,4,90,5,3,6,8,6,8,253,156,8,14,12,6,3,59,58,1,116,3,6,6,6,7,7, + 8,2,100,8,6,9,5,3,5,90,4,5,6,7,7,8,1,26,7,8,8,5,6,6,3,27,3,6,6,6,7,7,16,7,9,4,240,6,2,139, + 18,14,6,240,4,5,3,3,4,5,6,14,9,4,11,99,11,5,7,15,6,5,3,4,3,4,5,5,8,180,10,3,5,4,3,6,12,14,18,6, + 117,117,20,2,232,6,18,14,6,5,4,3,3,3,6,3,10,180,8,5,5,4,3,4,3,5,6,15,7,5,11,99,11,4,9,14,6,5,4,3, + 3,5,4,240,6,0,0,0,0,1,0,162,0,241,6,50,4,19,0,99,0,0,0,20,6,7,1,6,7,6,34,39,38,39,46,1,53,52,63,1, + 54,53,52,38,39,38,39,38,43,1,34,7,6,7,6,15,1,6,7,6,7,6,35,33,34,46,2,52,63,1,54,52,39,3,38,52,54,55,54,55, + 54,51,33,50,23,22,23,22,23,19,22,23,22,23,22,59,1,50,55,54,55,62,1,53,52,47,1,38,53,52,54,55,54,55,54,50,23,22,23,1, + 22,6,50,6,6,254,112,5,8,7,16,7,7,6,6,6,3,87,3,6,6,5,8,8,7,92,8,7,7,6,5,4,120,5,3,6,8,6,8,253, + 106,8,14,12,6,3,73,74,1,156,3,6,6,6,7,7,8,2,150,8,6,9,5,3,5,130,4,5,6,7,7,8,92,7,8,8,5,6,6,3, + 87,3,6,6,6,7,7,16,7,8,5,1,144,6,2,139,18,15,5,254,152,5,4,3,3,4,5,6,14,9,7,8,219,8,8,7,15,6,5,3, + 4,3,4,5,5,8,240,10,3,5,4,3,6,12,14,18,6,147,147,20,2,1,56,6,18,14,6,5,4,3,3,3,6,3,10,254,252,8,5,5, + 4,3,4,3,5,6,15,7,8,8,219,8,7,9,14,6,5,4,3,3,4,5,254,152,5,0,0,0,0,3,0,117,0,166,6,80,4,94,0,19, + 0,29,0,39,0,0,1,6,7,6,7,35,55,54,55,54,55,38,39,38,47,1,51,22,23,22,1,35,62,1,55,33,53,33,14,1,3,30,1,23, + 33,53,33,46,1,39,6,80,136,83,140,74,108,46,46,160,38,71,71,38,160,21,71,108,72,142,83,253,204,105,19,55,42,252,214,3,229,110,75,13, + 13,75,110,252,27,3,42,42,55,19,2,130,79,85,143,169,110,109,164,39,54,54,39,164,49,170,164,148,85,253,213,61,133,72,100,142,183,3,143,41, + 183,142,100,72,133,61,0,0,0,1,0,110,254,178,2,208,6,38,0,25,0,0,1,42,1,39,36,3,38,0,39,38,35,34,7,39,54,55,54,21, + 20,0,7,6,5,22,54,55,2,208,9,104,55,254,72,2,1,1,109,4,3,94,58,45,136,51,213,222,254,176,7,12,1,28,82,69,20,254,178,11, + 83,1,82,174,3,245,81,79,137,49,216,1,1,204,161,252,76,143,220,72,21,1,2,0,0,1,0,79,254,178,2,177,6,38,0,25,0,0,19,53, + 30,1,55,36,39,38,0,53,52,23,22,23,7,38,35,34,7,6,0,7,2,5,6,34,79,20,69,82,1,28,12,7,254,176,222,213,51,136,45,58, + 94,3,4,1,109,1,2,254,72,55,104,254,178,143,2,1,21,72,220,143,3,180,161,204,1,1,216,49,137,79,81,252,11,174,254,174,83,11,0,0, + 0,3,0,6,254,35,3,238,6,117,0,3,0,6,0,9,0,0,9,5,33,9,1,33,1,249,1,245,254,11,254,13,1,243,254,152,2,210,254,150, + 1,106,253,46,6,117,251,219,251,211,4,45,3,49,253,8,252,142,3,0,0,2,0,176,254,242,3,48,6,20,0,3,0,11,0,0,1,17,51,17, + 37,33,21,35,17,51,21,33,1,20,200,254,212,2,128,240,240,253,128,5,176,249,166,6,90,100,100,249,166,100,0,0,0,2,0,175,254,242,3,47, + 6,20,0,3,0,11,0,0,1,35,17,51,19,17,33,53,51,17,35,53,2,203,200,200,100,253,128,240,240,5,176,249,166,6,190,248,222,100,6,90, + 100,0,0,0,0,1,0,183,254,242,2,123,6,18,0,5,0,0,19,1,51,9,1,35,183,1,26,170,254,230,1,26,170,2,130,3,144,252,112,252, + 112,0,0,0,0,1,0,164,254,242,2,104,6,18,0,5,0,0,9,1,35,9,1,51,2,104,254,230,170,1,26,254,230,170,2,130,252,112,3,144, + 3,144,0,0,255,255,0,183,254,242,3,207,6,18,16,38,16,64,0,0,16,7,16,64,1,84,0,0,255,255,0,164,254,242,3,188,6,18,16,38, + 16,65,0,0,16,7,16,65,1,84,0,0,0,1,0,91,0,0,6,91,5,220,0,22,0,0,9,1,7,39,17,35,17,39,17,35,17,39,7,17, + 35,17,7,17,35,17,7,39,1,3,137,2,210,120,92,120,210,120,106,106,120,210,120,92,120,2,210,5,220,253,44,120,92,253,20,3,101,211,251,200, + 4,176,104,104,251,80,4,56,211,252,155,2,236,92,120,2,212,0,0,0,0,1,0,89,255,249,6,89,5,213,0,22,0,0,5,1,55,23,17,51, + 17,23,17,51,17,23,55,17,51,17,55,17,51,17,55,23,1,3,43,253,46,120,92,120,210,120,106,106,120,210,120,92,120,253,46,7,2,212,120,92, + 2,236,252,155,211,4,56,251,80,104,104,4,176,251,200,211,3,101,253,20,92,120,253,44,0,1,0,79,0,108,6,132,5,68,0,61,0,0,1,48, + 55,22,23,22,50,55,54,55,62,1,53,52,39,38,39,38,39,38,34,7,6,7,6,7,6,7,55,23,1,35,1,55,23,54,55,54,55,54,55,54, + 51,50,23,22,23,22,23,22,21,20,7,6,7,6,7,6,35,34,39,38,2,101,119,64,82,78,190,74,86,60,66,66,33,35,64,64,82,78,190,74, + 86,60,66,33,23,7,232,120,254,120,90,254,118,120,233,8,36,48,89,84,116,103,133,128,108,113,87,90,47,46,46,47,90,83,117,103,133,128,108,106, + 1,33,120,63,35,33,33,39,59,66,162,93,89,81,83,64,63,35,33,33,39,59,66,81,57,63,234,120,254,118,1,138,120,233,96,88,113,89,83,52, + 46,46,48,87,89,113,112,123,127,112,113,89,83,52,46,46,45,0,0,0,0,1,0,79,0,124,6,132,5,84,0,60,0,0,1,6,7,6,35,34, + 39,38,39,38,39,38,53,52,55,54,55,54,55,54,51,50,23,22,23,22,23,22,23,55,23,1,35,1,55,23,38,39,38,39,38,39,38,34,7,6, + 7,6,7,6,21,20,22,23,22,23,22,50,55,54,55,4,110,94,106,108,128,133,103,116,84,89,48,46,46,48,89,88,112,108,128,133,103,116,84,89, + 48,36,8,233,120,254,118,90,254,120,120,232,7,23,33,66,60,86,74,190,78,82,64,64,35,33,66,66,60,86,74,190,78,82,64,1,49,90,45,46, + 46,52,83,89,113,112,127,123,112,113,89,87,48,46,46,52,83,89,113,88,96,233,120,254,118,1,138,120,234,63,57,81,66,59,39,33,33,35,63,64, + 83,81,89,93,162,66,59,39,33,33,35,63,0,3,0,117,255,227,8,222,5,36,0,37,0,57,0,77,0,0,1,21,1,39,55,33,6,7,6,7, + 14,1,32,38,39,38,39,38,39,35,53,51,54,55,54,55,62,1,32,22,23,22,23,22,23,33,39,55,36,34,7,6,7,6,7,6,7,33,17,51, + 17,33,38,39,38,39,38,39,1,33,17,35,17,33,22,23,22,23,22,23,22,50,55,54,55,54,55,54,8,222,254,119,120,233,254,160,11,33,49,99, + 98,238,254,236,238,98,99,49,33,11,189,189,10,34,49,99,98,238,1,20,238,98,99,49,34,10,1,96,233,120,252,226,214,93,92,76,77,38,23,9, + 1,174,170,1,174,9,23,38,77,76,92,1,59,254,82,170,254,82,10,22,38,77,76,92,93,214,93,92,76,77,38,22,2,175,90,254,119,120,233,90, + 81,118,99,98,100,100,98,99,118,81,90,170,91,82,119,99,98,100,100,98,99,119,82,91,233,120,86,39,39,76,77,92,55,61,1,101,254,155,61,55, + 92,77,76,39,253,198,254,155,1,101,59,54,92,77,76,39,39,39,39,76,77,92,54,0,0,1,0,100,0,204,11,3,4,56,0,9,0,129,180,2, + 9,6,0,10,16,212,212,204,50,64,9,64,2,64,9,48,2,48,9,4,93,49,64,10,2,5,9,1,0,6,5,156,6,10,0,16,212,236,17,57, + 57,204,16,204,48,64,12,8,9,9,0,8,7,8,7,156,0,9,0,7,5,16,252,60,8,6,16,60,64,12,3,2,2,1,3,4,3,4,156,1, + 2,1,7,5,16,252,60,8,6,16,60,176,16,75,83,88,0,179,3,2,8,9,16,60,16,60,180,8,156,9,9,0,7,5,16,236,180,3,156,2, + 2,1,7,5,16,236,89,19,53,1,23,7,33,21,33,23,7,100,1,137,120,233,9,135,246,121,233,120,2,85,90,1,137,120,233,170,233,120,0,0, + 0,1,0,117,0,204,11,20,4,56,0,9,0,129,180,2,9,0,6,10,16,212,212,204,50,64,9,79,2,79,9,95,2,95,9,4,93,49,64,10, + 9,6,2,1,0,5,6,156,5,10,0,16,212,236,17,57,57,204,16,204,48,64,12,8,9,9,0,8,7,8,7,156,0,9,0,7,5,16,252,60, + 8,6,16,60,64,12,3,2,2,1,3,4,3,4,156,1,2,1,7,5,16,252,60,8,6,16,60,176,16,75,83,88,0,179,3,2,8,9,16,60, + 16,60,180,8,156,9,9,0,7,5,16,236,180,3,156,2,2,1,7,5,16,236,89,1,21,1,39,55,33,53,33,39,55,11,20,254,119,120,233,246, + 121,9,135,233,120,2,175,90,254,119,120,233,170,233,120,0,0,1,0,100,0,204,11,20,4,56,0,15,0,218,182,7,10,9,2,15,0,16,16,212, + 204,50,212,204,50,64,13,80,2,80,15,95,10,95,7,79,10,79,7,6,93,49,0,64,15,7,2,4,10,15,0,1,8,9,4,13,4,156,13,16, + 16,212,236,17,23,57,204,50,16,204,50,48,64,12,14,15,15,0,14,13,14,13,156,0,15,0,7,5,16,252,60,8,6,16,60,64,12,3,2,2, + 1,3,4,3,4,156,1,2,1,7,5,16,252,60,8,6,16,60,64,12,11,10,10,9,11,12,11,12,156,9,9,10,7,5,16,252,60,8,6,16, + 60,64,12,6,7,7,8,6,5,6,5,156,8,7,8,7,5,16,252,60,8,6,16,60,176,16,75,83,88,0,183,11,10,6,7,3,2,14,15,16, + 60,16,60,16,60,16,60,180,14,156,15,15,0,7,5,16,236,180,3,156,2,2,1,7,5,16,236,180,11,156,10,10,9,7,5,16,236,180,6,156, + 7,7,8,7,5,16,236,89,19,53,1,23,7,33,39,55,1,21,1,39,55,33,23,7,100,1,137,120,233,8,128,233,120,1,137,254,119,120,233,247, + 128,233,120,2,85,90,1,137,120,233,233,120,254,119,90,254,119,120,233,233,120,0,0,0,0,1,0,100,0,204,11,3,4,56,0,14,0,0,1,33, + 21,33,23,7,1,53,1,23,7,33,21,33,7,1,144,9,115,247,5,93,120,254,119,1,137,120,93,8,251,246,141,105,2,25,120,93,120,1,137,90, + 1,137,120,93,120,105,0,0,0,1,0,117,0,204,11,20,4,56,0,14,0,0,1,55,39,33,53,33,39,55,1,21,1,39,55,33,53,9,232,105, + 105,246,141,8,251,93,120,1,137,254,119,120,93,247,5,2,25,105,105,120,93,120,254,119,90,254,119,120,93,120,0,0,0,2,0,100,0,204,11,20, + 4,56,0,5,0,21,0,0,1,33,55,39,33,7,5,33,23,7,1,53,1,23,7,33,39,55,1,21,1,39,1,144,8,88,105,105,247,168,105,8, + 73,248,152,93,120,254,119,1,137,120,93,7,104,93,120,1,137,254,119,120,2,25,105,105,105,225,93,120,1,137,90,1,137,120,93,93,120,254,119,90, + 254,119,120,0,0,1,0,100,0,204,11,3,4,56,0,13,0,0,1,33,23,7,1,53,1,23,7,33,17,51,17,35,10,89,247,35,233,120,254,119, + 1,137,120,233,8,221,170,170,2,45,233,120,1,137,90,1,137,120,233,1,89,252,164,0,0,1,0,117,0,204,11,20,4,56,0,13,0,0,1,17, + 35,17,51,17,33,39,55,1,21,1,39,55,1,31,170,170,8,221,233,120,1,137,254,119,120,233,2,45,254,167,3,92,254,167,233,120,254,119,90,254, + 119,120,233,0,0,2,0,100,0,204,11,3,4,56,0,13,0,18,0,0,1,33,23,7,1,53,1,23,7,33,53,51,17,35,17,53,33,7,23,10, + 89,247,175,93,120,254,119,1,137,120,93,8,81,170,170,247,55,105,105,1,161,93,120,1,137,90,1,137,120,93,205,252,164,1,69,210,105,105,0,0, + 0,2,0,117,0,204,11,20,4,56,0,13,0,18,0,0,1,33,39,55,1,21,1,39,55,33,21,35,17,51,17,21,33,55,39,1,31,8,81,93, + 120,1,137,254,119,120,93,247,175,170,170,8,201,105,105,3,99,93,120,254,119,90,254,119,120,93,205,3,92,254,187,210,105,105,0,0,0,1,0,117, + 0,204,11,20,4,56,0,37,0,0,19,23,55,23,55,23,55,23,55,23,55,23,55,23,55,51,39,55,1,21,1,39,55,35,7,39,7,39,7,39, + 7,39,7,39,7,39,7,39,117,70,180,180,180,180,180,180,180,180,180,180,180,180,70,139,233,120,1,137,254,119,120,233,99,110,180,180,180,180,180,180, + 180,180,180,180,180,180,70,2,215,70,180,180,180,180,180,180,180,180,180,180,180,180,70,233,120,254,119,90,254,119,120,233,110,180,180,180,180,180,180,180, + 180,180,180,180,180,70,0,0,255,255,1,44,5,20,2,88,6,64,16,7,23,1,1,44,5,20,0,0,255,255,1,44,2,221,2,88,4,9,16,7, + 23,1,1,44,2,221,0,0,255,255,1,44,2,221,2,88,6,64,16,39,23,1,1,44,5,20,16,7,23,1,1,44,2,221,0,0,255,255,1,44, + 0,167,2,88,1,211,16,7,23,1,1,44,0,167,0,0,255,255,1,44,0,167,2,88,6,64,16,39,23,1,1,44,5,20,16,7,23,1,1,44, + 0,167,0,0,255,255,1,44,0,167,2,88,4,9,16,39,23,1,1,44,2,221,16,7,23,1,1,44,0,167,0,0,255,255,1,44,0,167,2,88, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,7,23,1,1,44,0,167,0,0,255,255,3,132,5,20,4,176,6,64,16,7, + 23,1,3,132,5,20,0,0,255,255,1,44,5,20,4,176,6,64,16,39,23,1,1,44,5,20,16,7,23,1,3,132,5,20,0,0,255,255,1,44, + 2,221,4,176,6,64,16,39,23,1,1,44,2,221,16,7,23,1,3,132,5,20,0,0,255,255,1,44,2,221,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,2,221,16,7,23,1,3,132,5,20,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,0,167,16,7, + 23,1,3,132,5,20,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,7,23,1,3,132, + 5,20,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,7,23,1,3,132,5,20,0,0, + 255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,7,23,1,3,132, + 5,20,0,0,255,255,3,132,2,221,4,176,4,9,16,7,23,1,3,132,2,221,0,0,255,255,1,44,2,221,4,176,6,64,16,39,23,1,1,44, + 5,20,16,7,23,1,3,132,2,221,0,0,255,255,1,44,2,221,4,176,4,9,16,39,23,1,1,44,2,221,16,7,23,1,3,132,2,221,0,0, + 255,255,1,44,2,221,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,7,23,1,3,132,2,221,0,0,255,255,1,44, + 0,167,4,176,4,9,16,39,23,1,1,44,0,167,16,7,23,1,3,132,2,221,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,0,167,16,7,23,1,3,132,2,221,0,0,255,255,1,44,0,167,4,176,4,9,16,39,23,1,1,44,2,221,16,39, + 23,1,1,44,0,167,16,7,23,1,3,132,2,221,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,39,23,1,1,44,0,167,16,7,23,1,3,132,2,221,0,0,255,255,3,132,2,221,4,176,6,64,16,39,23,1,3,132,5,20,16,7, + 23,1,3,132,2,221,0,0,255,255,1,44,2,221,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,5,20,16,7,23,1,3,132, + 2,221,0,0,255,255,1,44,2,221,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,7,23,1,3,132,2,221,0,0, + 255,255,1,44,2,221,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,7,23,1,3,132, + 2,221,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,7,23,1,3,132,2,221,0,0, + 255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,7,23,1,3,132, + 2,221,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,7, + 23,1,3,132,2,221,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,5,20,16,7,23,1,3,132,2,221,0,0,255,255,3,132,0,167,4,176,1,211,16,7,23,1,3,132,0,167,0,0, + 255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,4,9,16,39, + 23,1,1,44,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,1,211,16,39,23,1,1,44,0,167,16,7,23,1,3,132,0,167,0,0, + 255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,7,23,1,3,132,0,167,0,0,255,255,1,44, + 0,167,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,7,23,1,3,132,0,167,0,0,255,255,3,132, + 0,167,4,176,6,64,16,39,23,1,3,132,5,20,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,3,132,5,20,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,2,221,16,39, + 23,1,3,132,5,20,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,39,23,1,3,132,5,20,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,0,167,16,39, + 23,1,3,132,5,20,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,5,20,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,2,221,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,7,23,1,3,132,0,167,0,0,255,255,3,132, + 0,167,4,176,4,9,16,39,23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,4,9,16,39,23,1,1,44,2,221,16,39, + 23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,39,23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,4,9,16,39,23,1,1,44,0,167,16,39, + 23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,4,9,16,39,23,1,1,44,2,221,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,3,132, + 0,167,4,176,6,64,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44, + 0,167,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0, + 255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132, + 2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39, + 23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,0,167,4,176,6,64,16,39, + 23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0, + 255,255,1,44,0,167,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132, + 5,20,16,39,23,1,3,132,2,221,16,7,23,1,3,132,0,167,0,0,255,255,1,44,254,112,2,88,255,156,16,7,23,1,1,44,254,112,0,0, + 255,255,1,44,254,112,2,88,6,64,16,39,23,1,1,44,5,20,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,2,88,4,9,16,39, + 23,1,1,44,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,2,88,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,2,88,1,211,16,39,23,1,1,44,0,167,16,7,23,1,1,44,254,112,0,0, + 255,255,1,44,254,112,2,88,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44, + 254,112,2,88,4,9,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,2,88, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44, + 254,112,4,176,6,64,16,39,23,1,3,132,5,20,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,3,132,5,20,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39, + 23,1,3,132,5,20,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,39,23,1,3,132,5,20,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,0,167,16,39, + 23,1,3,132,5,20,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,5,20,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,7,23,1,1,44,254,112,0,0,255,255,1,44, + 254,112,4,176,4,9,16,39,23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39, + 23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,39,23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,0,167,16,39, + 23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44, + 254,112,4,176,6,64,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44, + 254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132, + 2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39, + 23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39, + 23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132, + 5,20,16,39,23,1,3,132,2,221,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,1,211,16,39,23,1,3,132,0,167,16,7, + 23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,0,167,16,7,23,1,1,44, + 254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44, + 254,112,0,0,255,255,1,44,254,112,4,176,1,211,16,39,23,1,1,44,0,167,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,0,167,16,7,23,1,1,44, + 254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,0,167,16,7, + 23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,3,132,5,20,16,39, + 23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132, + 5,20,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39, + 23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44, + 254,112,4,176,6,64,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132, + 0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39, + 23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,7,23,1,1,44, + 254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44, + 254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7, + 23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132, + 2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,0,167,16,39, + 23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44, + 254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7, + 23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39, + 23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44, + 254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39, + 23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44, + 254,112,4,176,6,64,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7, + 23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132, + 5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39, + 23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7, + 23,1,1,44,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,1,44,254,112,0,0,255,255,3,132, + 254,112,4,176,255,156,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,7,23,1,3,132, + 254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,1,211,16,39, + 23,1,1,44,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,7, + 23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44, + 0,167,16,7,23,1,3,132,254,112,0,0,255,255,3,132,254,112,4,176,6,64,16,39,23,1,3,132,5,20,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,5,20,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,6,64,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132, + 5,20,16,7,23,1,3,132,254,112,0,0,255,255,3,132,254,112,4,176,4,9,16,39,23,1,3,132,2,221,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,2,221,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,3,132,2,221,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,2,221,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,4,9,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132, + 2,221,16,7,23,1,3,132,254,112,0,0,255,255,3,132,254,112,4,176,6,64,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7, + 23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,5,20,16,39,23,1,3,132, + 2,221,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39, + 23,1,3,132,2,221,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,3,132, + 254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39, + 23,1,3,132,2,221,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,7,23,1,3,132,254,112,0,0,255,255,3,132, + 254,112,4,176,1,211,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39, + 23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,1,211,16,39,23,1,1,44,0,167,16,39, + 23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,3,132, + 254,112,4,176,6,64,16,39,23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132, + 0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39, + 23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39, + 23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132, + 5,20,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,3,132,254,112,4,176,4,9,16,39,23,1,3,132,2,221,16,39, + 23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132, + 2,221,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39, + 23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,4,9,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,39,23,1,3,132, + 0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39, + 23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,3,132, + 254,112,0,0,255,255,3,132,254,112,4,176,6,64,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7, + 23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,5,20,16,39,23,1,3,132, + 2,221,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39, + 23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132, + 0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39, + 23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,3,132, + 254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39, + 23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132, + 0,167,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,255,156,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,1,211,16,39,23,1,1,44,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,1,44, + 254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,3,132,5,20,16,39,23,1,1,44,254,112,16,7, + 23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,5,20,16,39,23,1,1,44, + 254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39, + 23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,39,23,1,3,132,5,20,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,1,44,254,112,16,7,23,1,3,132, + 254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39, + 23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,4,9,16,39,23,1,3,132,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,3,132,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,2,221,16,39,23,1,1,44, + 254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,39, + 23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44, + 0,167,16,39,23,1,3,132,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39, + 23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132, + 2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,3,132,5,20,16,39, + 23,1,3,132,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,1,44,254,112,16,7, + 23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132, + 5,20,16,39,23,1,3,132,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132, + 2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132, + 5,20,16,39,23,1,3,132,2,221,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,1,211,16,39, + 23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39, + 23,1,1,44,2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132, + 254,112,0,0,255,255,1,44,254,112,4,176,1,211,16,39,23,1,1,44,0,167,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7, + 23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132, + 0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,0,167,16,39,23,1,1,44, + 254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,39, + 23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132, + 5,20,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39, + 23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132, + 0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,0,167,16,39, + 23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,39,23,1,1,44, + 254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39, + 23,1,3,132,5,20,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176, + 6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132, + 0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,3,132,2,221,16,39, + 23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7, + 23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132, + 2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,39,23,1,3,132, + 0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,4,9,16,39,23,1,1,44,2,221,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132, + 2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39, + 23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132, + 0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39, + 23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0, + 255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,2,221,16,39,23,1,3,132,5,20,16,39,23,1,3,132, + 2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39, + 23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7, + 23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44,5,20,16,39,23,1,1,44,0,167,16,39,23,1,3,132, + 5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44, + 254,112,4,176,6,64,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39, + 23,1,3,132,0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,255,255,1,44,254,112,4,176,6,64,16,39,23,1,1,44, + 5,20,16,39,23,1,1,44,2,221,16,39,23,1,1,44,0,167,16,39,23,1,3,132,5,20,16,39,23,1,3,132,2,221,16,39,23,1,3,132, + 0,167,16,39,23,1,1,44,254,112,16,7,23,1,3,132,254,112,0,0,0,2,0,100,0,204,6,63,4,56,0,13,0,18,0,0,1,33,23,7, + 1,53,1,23,7,33,53,51,17,35,17,53,33,7,23,5,149,252,115,93,120,254,119,1,137,120,93,3,141,170,170,251,251,105,105,1,161,93,120,1, + 137,90,1,137,120,93,205,252,164,1,69,210,105,105,0,0,0,2,0,117,0,204,6,80,4,56,0,13,0,18,0,0,1,33,39,55,1,21,1,39, + 55,33,21,35,17,51,17,21,33,55,39,1,31,3,141,93,120,1,137,254,119,120,93,252,115,170,170,4,5,105,105,3,99,93,120,254,119,90,254,119, + 120,93,205,3,92,254,187,210,105,105,0,0,0,1,1,0,0,0,5,180,5,220,0,17,0,0,9,1,51,1,7,39,17,35,17,39,17,35,17,7, + 17,35,17,7,1,0,2,45,90,2,45,120,92,120,210,120,210,120,92,3,174,2,46,253,210,120,92,252,110,4,10,211,251,35,4,221,211,251,246,3, + 146,92,0,0,0,1,1,0,255,249,5,180,5,213,0,17,0,0,1,55,23,17,51,17,23,17,51,17,55,17,51,17,55,23,1,35,1,0,120,92, + 120,210,120,210,120,92,120,253,211,90,2,39,120,92,3,146,251,246,211,4,221,251,35,211,4,10,252,110,92,120,253,210,0,2,0,79,0,128,5,39, + 6,181,0,30,0,61,0,0,37,34,39,38,39,38,39,38,16,55,54,55,54,55,1,23,7,22,23,22,23,22,23,22,16,7,6,7,6,7,6,3, + 48,23,7,1,6,7,6,7,6,20,23,22,23,30,1,51,50,55,54,55,54,55,54,52,39,38,39,38,39,38,2,189,127,112,107,95,86,49,46,46, + 49,86,98,114,1,137,120,233,96,88,107,95,86,49,46,46,49,86,95,107,112,73,234,120,254,184,88,69,63,35,33,33,39,59,66,162,93,89,81,83, + 64,63,35,33,33,39,59,66,81,57,128,46,45,92,90,110,108,1,0,108,110,90,95,46,1,137,120,233,8,36,45,92,90,110,108,255,0,108,110,90, + 92,45,46,4,41,232,120,1,70,33,70,64,82,78,190,74,86,60,66,66,33,35,64,64,82,78,190,74,86,60,66,33,23,0,0,0,0,2,0,79, + 0,128,5,39,6,181,0,30,0,60,0,0,37,34,39,38,39,38,39,38,16,55,54,55,54,55,54,55,39,55,1,22,23,22,23,22,16,7,6,7, + 6,7,6,3,6,7,6,7,6,7,6,20,23,22,23,22,23,22,51,50,54,55,54,55,54,52,39,38,39,38,39,1,39,2,185,123,112,107,95,86, + 49,46,46,49,86,95,107,88,96,233,120,1,137,114,98,86,49,46,46,49,86,95,107,112,177,63,57,81,66,59,39,33,33,35,63,64,83,81,89,93, + 162,66,59,39,33,33,35,63,69,88,254,184,120,128,46,45,92,90,110,108,1,0,108,110,90,92,45,36,8,233,120,254,119,46,95,90,110,108,255,0, + 108,110,90,92,45,46,4,41,7,23,33,66,60,86,74,190,78,82,64,64,35,33,66,66,60,86,74,190,78,82,64,70,33,254,186,120,0,2,1,0, + 254,178,4,223,6,20,0,16,0,46,0,92,64,18,46,29,32,19,26,17,27,22,6,13,0,39,36,15,37,43,32,47,16,220,178,0,32,1,93,75, + 176,12,84,88,185,0,32,0,64,56,89,60,204,57,57,57,204,50,220,180,15,6,31,6,2,93,220,204,50,57,57,17,57,57,49,0,64,14,15,39, + 169,37,4,26,28,192,37,9,19,17,177,47,16,244,204,50,196,244,204,50,16,236,57,48,1,21,20,22,23,38,53,17,52,55,14,1,29,1,16,7, + 22,1,21,35,34,6,21,17,20,22,59,1,21,33,34,38,61,1,52,38,43,1,53,51,50,54,61,1,52,54,51,2,156,75,176,50,48,176,73,173, + 173,2,67,53,140,85,85,140,53,254,249,249,167,108,142,62,62,142,108,167,249,1,18,239,152,109,7,71,157,4,208,161,66,7,107,152,240,254,238,62, + 68,3,244,100,87,142,251,48,141,88,100,148,221,239,151,116,143,115,149,240,221,147,0,0,0,2,1,0,254,178,4,223,6,20,0,16,0,46,0,87, + 64,18,18,35,46,28,25,2,27,22,32,5,0,10,45,38,46,37,41,47,16,220,75,176,10,84,88,185,0,41,255,192,56,89,204,50,57,57,204,220, + 180,15,0,31,0,2,93,60,220,60,204,57,57,57,17,57,57,49,0,64,14,2,25,169,27,13,38,36,192,27,8,45,17,177,47,16,244,204,50,196, + 244,204,50,16,236,57,48,1,16,55,38,17,53,52,38,39,22,21,17,20,7,62,1,53,1,33,50,22,29,1,20,22,59,1,21,35,34,6,29,1, + 20,6,35,33,53,51,50,54,53,17,52,38,43,1,3,67,173,173,73,176,48,50,176,75,253,189,1,7,249,167,108,142,62,62,142,108,167,249,254,249, + 53,140,85,85,140,53,1,18,1,14,68,62,1,18,240,152,107,7,66,161,251,48,157,71,7,109,152,5,241,147,221,240,149,115,143,116,151,239,221,148, + 100,88,141,4,208,142,87,0,0,4,0,217,254,50,5,219,5,249,0,2,0,6,0,9,0,13,0,0,5,17,9,2,53,1,5,9,1,3,17,1, + 21,5,49,252,170,4,0,250,254,5,2,251,168,3,86,252,170,170,5,2,204,2,100,254,206,253,204,1,225,166,1,225,7,1,50,1,50,252,154,4, + 104,254,31,166,0,3,0,217,0,30,7,39,4,230,0,3,0,6,0,10,0,0,37,35,17,51,1,17,9,2,53,1,7,39,170,170,254,10,252,162, + 4,8,250,254,5,2,30,4,200,252,58,2,196,254,158,253,156,2,17,166,2,17,0,0,0,3,0,217,0,30,7,39,4,230,0,3,0,6,0,10, + 0,0,55,17,51,17,9,2,3,17,1,21,217,170,1,76,3,94,252,162,170,5,2,30,4,200,251,56,1,2,1,98,1,98,252,58,4,200,253,239, + 166,0,0,0,0,2,0,217,255,194,7,39,5,66,0,5,0,8,0,0,23,17,9,1,17,1,55,1,17,217,3,39,3,39,252,217,155,1,226,62, + 5,128,253,176,2,80,250,128,2,78,113,254,162,2,198,0,0,2,0,217,255,194,7,39,5,66,0,5,0,8,0,0,23,17,9,1,17,1,39,1, + 17,217,3,39,3,39,252,217,155,254,30,62,5,128,253,176,2,80,250,128,2,78,113,1,94,253,68,0,0,1,0,217,255,194,7,39,5,66,0,5, + 0,0,23,17,9,1,17,1,217,3,39,3,39,252,217,62,5,128,253,176,2,80,250,128,2,78,0,0,0,1,0,217,255,194,7,39,5,66,0,8, + 0,0,37,21,9,1,17,9,1,21,1,7,39,252,217,252,217,3,39,3,39,253,116,162,224,2,78,253,178,5,128,253,176,2,80,221,254,28,0,0, + 0,1,0,217,255,194,7,39,5,66,0,8,0,0,19,53,9,1,17,9,1,53,1,217,3,39,3,39,252,217,252,217,2,140,4,98,224,253,178,2, + 78,250,128,2,80,253,176,221,1,228,0,0,0,1,0,6,254,35,3,238,6,117,0,3,0,0,9,3,1,250,1,244,254,12,254,12,6,117,251,219, + 251,211,4,45,0,1,0,217,0,0,5,219,5,4,0,19,0,0,1,17,51,17,33,17,51,17,33,21,33,17,35,17,33,17,35,17,33,53,2,12, + 168,1,76,168,1,51,254,205,168,254,180,168,254,205,2,215,2,45,253,211,2,45,253,211,170,253,211,2,45,253,211,2,45,170,0,0,0,1,0,217, + 0,0,5,219,5,4,0,27,0,0,1,17,51,17,51,17,51,17,51,17,51,17,51,21,35,17,35,17,35,17,35,17,35,17,35,17,35,53,1,168, + 168,182,168,182,168,207,207,168,182,168,182,168,207,2,215,2,45,253,211,2,45,253,211,2,45,253,211,170,253,211,2,45,253,211,2,45,253,211,2,45, + 170,0,0,0,0,3,0,58,254,107,7,198,5,251,0,3,0,29,0,55,0,0,1,33,17,33,0,32,7,6,7,6,2,21,20,18,23,22,23,22, + 32,55,54,55,54,18,53,52,2,39,38,39,36,32,4,23,22,23,22,21,20,7,6,7,6,4,32,36,39,38,39,38,53,52,55,54,55,54,3,104, + 1,48,254,208,1,56,254,192,140,137,114,116,114,114,116,114,137,140,1,64,140,137,114,116,114,114,116,114,137,254,13,1,142,1,86,142,142,71,70,70, + 71,142,142,254,170,254,114,254,170,142,142,71,70,70,71,142,142,2,232,254,146,3,200,59,58,114,115,254,236,163,159,254,236,115,114,58,59,59,58,114, + 115,1,20,159,163,1,20,115,114,58,244,144,141,142,172,170,201,197,172,170,142,141,144,144,141,142,170,172,197,201,170,172,142,141,0,0,0,3,0,58, + 254,107,7,198,5,251,0,25,0,51,0,63,0,0,0,32,7,6,7,6,2,21,20,18,23,22,23,22,32,55,54,55,54,18,53,52,2,39,38,39, + 36,32,4,23,22,23,22,21,20,7,6,7,6,4,32,36,39,38,39,38,53,52,55,54,55,54,5,17,33,21,33,17,35,17,33,53,33,17,4,160, + 254,192,140,137,114,116,114,114,116,114,137,140,1,64,140,137,114,116,114,114,116,114,137,254,13,1,142,1,86,142,142,71,70,70,71,142,142,254,170,254, + 114,254,170,142,142,71,70,70,71,142,128,2,127,2,141,253,115,168,253,115,2,141,5,66,59,58,114,115,254,236,163,159,254,236,115,114,58,59,59,58, + 114,115,1,20,159,163,1,20,115,114,58,244,144,141,142,172,170,201,197,172,170,142,141,144,144,141,142,170,172,197,201,170,172,142,128,75,253,115,170,253, + 115,2,141,170,2,141,0,0,0,3,0,58,254,107,7,198,5,251,0,25,0,51,0,63,0,0,0,32,7,6,7,6,2,21,20,18,23,22,23,22, + 32,55,54,55,54,18,53,52,2,39,38,39,36,32,4,23,22,23,22,21,20,7,6,7,6,4,32,36,39,38,39,38,53,52,55,54,55,54,23,9, + 1,23,9,1,7,9,1,39,9,1,4,160,254,192,140,137,114,116,114,114,116,114,137,140,1,64,140,137,114,116,114,114,116,114,137,254,13,1,142,1, + 86,142,142,71,70,70,71,142,142,254,170,254,114,254,170,142,142,71,70,70,71,142,128,93,1,205,1,206,120,254,51,1,205,119,254,51,254,50,120,1, + 205,254,51,5,66,59,58,114,115,254,236,163,159,254,236,115,114,58,59,59,58,114,115,1,20,159,163,1,20,115,114,58,244,144,141,142,172,170,201,197, + 172,170,142,141,144,144,141,142,170,172,197,201,170,172,142,128,232,254,51,1,205,120,254,50,254,51,119,1,205,254,51,120,1,206,1,205,255,255,0,117, + 254,77,10,37,6,14,16,39,12,176,6,111,0,0,16,38,12,176,0,0,16,39,12,176,2,37,0,0,16,7,12,176,4,74,0,0,0,1,0,117, + 254,77,3,182,6,14,0,29,0,0,5,22,51,50,55,19,33,53,33,19,62,1,50,22,23,7,38,35,34,7,3,33,21,33,3,14,1,34,38,39, + 1,9,17,59,69,8,32,254,238,1,26,25,8,159,152,128,20,148,16,60,69,8,24,1,18,254,230,33,8,159,152,128,20,155,130,175,2,154,170,2, + 12,165,135,122,143,15,130,175,254,13,170,253,77,165,135,122,143,0,0,0,0,1,0,117,254,77,3,182,6,14,0,37,0,0,5,22,51,50,55,19, + 33,53,33,55,33,53,33,19,62,1,50,22,23,7,38,35,34,7,3,33,21,33,7,33,21,33,3,14,1,34,38,39,1,9,17,59,69,8,22,254, + 248,1,16,12,254,228,1,36,15,8,159,152,128,20,148,17,59,69,8,14,1,8,254,240,12,1,28,254,220,23,8,159,152,128,20,155,130,175,1,206, + 170,240,168,1,64,165,135,122,143,15,130,175,254,217,168,240,170,254,25,165,135,122,143,0,0,1,0,117,254,77,3,182,6,14,0,29,0,0,1,38, + 35,34,7,3,37,21,5,3,14,1,34,38,39,55,22,51,50,55,19,5,53,37,19,62,1,50,22,23,3,34,17,59,69,8,26,1,67,254,181,31, + 8,159,152,128,20,148,17,59,69,8,26,254,190,1,74,31,8,159,152,128,20,4,246,130,175,253,231,182,160,186,253,109,165,135,122,143,15,130,175,2, + 25,182,160,186,2,147,165,135,122,143,0,0,0,2,0,117,254,77,3,182,6,14,0,42,0,51,0,0,1,38,35,34,7,3,22,23,7,38,39,3, + 54,55,23,6,7,3,14,1,34,38,39,55,22,51,50,55,19,38,39,38,53,52,55,54,55,19,62,1,50,22,23,1,19,6,7,6,21,20,23,22, + 3,34,17,59,69,8,14,153,73,113,40,80,22,32,21,62,54,68,15,8,159,152,128,20,148,17,59,69,8,15,93,73,110,111,83,117,15,8,159,152, + 128,20,254,1,22,61,44,72,75,37,4,246,130,175,254,214,41,136,65,72,33,254,43,6,17,112,36,9,254,190,165,135,122,143,15,130,175,1,49,24, + 73,111,155,156,115,86,19,1,60,164,136,122,143,252,69,1,214,17,46,74,103,104,72,36,0,1,0,117,254,77,4,45,6,14,0,50,0,0,1,38, + 35,34,7,3,54,55,54,61,1,7,39,55,51,23,7,39,21,20,7,6,7,3,14,1,34,38,39,55,22,51,50,55,19,38,39,38,53,51,20,23, + 22,23,19,62,1,50,23,22,23,3,34,17,59,69,8,43,64,47,86,93,72,189,54,188,72,92,110,85,109,17,8,160,151,128,20,148,17,59,68,9, + 16,91,62,119,102,80,51,44,44,8,160,151,73,54,21,4,246,130,175,252,120,16,47,85,114,30,93,72,189,189,72,93,30,156,108,86,17,254,161,165, + 135,122,143,15,130,175,1,77,25,62,119,154,114,78,51,11,3,153,165,135,70,52,143,0,0,2,0,117,254,77,3,182,6,14,0,3,0,33,0,0, + 1,51,21,35,3,19,33,17,33,19,62,1,50,22,23,7,38,35,34,7,3,33,17,33,3,14,1,34,38,39,55,22,51,50,1,178,211,211,16,17, + 1,119,254,165,20,8,162,151,126,20,148,17,57,70,9,14,1,57,254,161,13,8,169,145,125,20,148,17,57,71,2,166,254,253,234,1,114,2,48,1, + 174,167,133,125,140,15,130,175,254,245,252,188,254,255,173,127,125,140,15,130,0,2,0,117,254,77,3,182,6,14,0,3,0,43,0,0,1,51,21,35, + 19,6,7,19,62,1,50,22,23,7,38,35,34,7,3,22,23,22,16,7,6,7,3,14,1,34,38,39,55,22,51,50,55,19,22,51,50,54,52,38, + 1,178,211,211,99,41,31,22,8,162,151,126,20,148,17,57,71,8,14,99,66,110,110,86,115,15,8,162,151,126,20,148,17,57,70,9,22,40,54,111, + 135,148,2,166,254,1,126,2,5,1,195,167,133,124,141,15,130,175,254,214,24,75,124,254,210,111,85,19,254,190,167,133,125,140,15,130,175,1,182,16, + 147,216,127,0,0,2,0,117,254,77,4,112,6,14,0,3,0,46,0,0,1,51,21,35,1,22,51,50,55,19,22,23,22,50,54,52,38,35,34,7, + 19,62,1,50,22,23,7,38,35,34,7,3,54,51,50,22,16,6,35,34,39,3,14,1,34,38,39,2,143,211,211,254,122,17,59,69,8,27,45,56, + 112,198,150,138,113,213,83,24,6,162,151,128,20,148,17,59,69,8,15,59,68,169,206,220,155,87,73,17,8,160,151,128,20,2,174,254,253,181,130,175, + 2,51,62,28,54,145,209,143,161,2,93,164,136,122,143,15,130,175,254,203,19,233,254,210,219,33,254,163,165,135,122,143,0,3,0,117,254,77,3,182, + 6,14,0,3,0,11,0,49,0,0,1,51,21,35,22,54,52,38,34,6,20,22,3,22,51,50,55,19,38,39,38,16,55,54,55,19,62,1,50,22, + 23,7,38,35,34,7,3,22,23,22,16,7,6,7,3,14,1,34,38,39,1,173,211,211,203,148,138,214,144,143,162,17,59,69,8,15,93,73,110,111, + 83,117,15,8,159,152,128,20,148,17,59,69,8,14,99,66,110,110,86,115,15,8,159,152,128,20,2,176,254,122,144,209,143,145,207,144,254,45,130,175, + 1,49,24,73,111,1,55,115,86,19,1,60,164,136,122,143,15,130,175,254,214,24,75,124,254,210,111,85,19,254,190,165,135,122,143,0,0,3,0,117, + 254,77,3,182,6,14,0,29,0,33,0,37,0,0,55,17,33,19,62,1,50,22,23,7,38,35,34,7,3,33,17,33,3,14,1,34,38,39,55,22, + 51,50,55,27,1,3,51,17,33,35,17,51,152,1,59,16,8,162,151,126,20,148,17,57,71,8,15,1,24,254,196,14,8,169,143,127,20,148,17,57, + 71,8,13,197,24,172,254,197,171,147,155,2,254,1,73,167,133,125,140,15,130,175,254,208,253,2,254,222,173,127,123,142,15,130,175,1,9,2,116,254, + 22,1,234,254,22,0,0,0,0,1,255,190,254,77,4,109,6,14,0,45,0,0,1,38,35,34,7,3,33,50,22,20,6,35,53,54,55,38,39,33, + 3,14,1,34,38,39,55,22,51,50,55,19,33,23,7,1,53,1,23,7,33,19,62,1,50,23,22,23,3,34,17,59,69,8,25,1,14,100,139,144, + 95,96,8,8,96,254,235,33,8,159,152,128,20,148,17,59,68,9,32,254,220,187,96,254,197,1,59,96,187,1,42,27,8,159,152,73,54,21,4,246, + 130,175,253,239,143,198,140,136,4,101,98,6,253,73,165,135,122,143,15,130,175,2,158,186,96,1,58,72,1,58,96,186,2,42,165,135,70,52,143,0, + 0,1,0,117,254,77,3,182,6,14,0,35,0,0,1,38,35,34,7,3,55,23,7,23,7,39,3,14,1,34,38,39,55,22,51,50,55,19,7,39, + 55,39,55,23,19,62,1,50,22,23,3,34,17,59,69,8,20,157,120,252,252,120,177,25,8,159,152,128,20,148,17,59,69,8,23,159,122,254,252,120, + 178,23,8,159,152,128,20,4,246,130,175,254,88,157,121,252,252,120,176,253,244,165,135,122,143,15,130,175,1,226,160,121,252,252,120,179,1,216,165,135, + 122,143,0,0,0,1,0,117,254,77,3,182,6,14,0,42,0,0,5,22,51,50,55,19,6,7,6,21,17,35,17,52,54,55,19,62,1,50,22,23, + 7,38,35,34,7,3,22,23,22,21,17,35,17,52,39,3,14,1,34,38,39,1,9,17,59,69,8,45,65,32,52,121,155,121,14,8,159,152,128,20, + 148,17,59,69,8,13,90,62,86,121,124,45,8,159,152,128,20,155,130,175,3,166,16,50,80,156,254,200,1,73,207,188,17,1,43,165,135,122,143,15, + 130,175,254,230,24,69,97,214,254,183,1,56,243,50,252,74,165,135,122,143,0,1,0,117,254,77,3,182,6,14,0,39,0,0,1,38,35,34,7,3, + 54,25,1,51,17,16,5,3,14,1,34,38,39,55,22,51,50,55,19,38,39,38,53,17,51,17,20,23,19,62,1,50,22,23,3,34,17,59,69,8, + 42,146,121,254,239,17,8,159,152,128,20,148,17,59,69,8,16,92,63,86,121,126,43,8,159,152,128,20,4,246,130,175,252,141,38,1,7,1,56,254, + 183,254,140,39,254,162,165,135,122,143,15,130,175,1,76,23,70,97,214,1,73,254,200,245,49,3,133,165,135,122,143,0,0,2,0,117,254,77,3,192, + 6,249,0,23,0,27,0,0,1,62,1,51,50,22,23,7,38,35,34,7,3,14,1,35,34,38,39,55,22,51,50,55,1,21,33,53,1,227,8,162, + 75,76,126,20,148,17,57,71,8,65,8,162,76,75,126,20,148,17,57,71,8,2,30,252,239,4,226,167,133,125,140,15,130,175,250,176,167,133,125,140, + 15,130,175,7,103,160,160,0,0,2,0,107,253,98,3,182,6,14,0,23,0,27,0,0,1,62,1,51,50,22,23,7,38,35,34,7,3,14,1,35, + 34,38,39,55,22,51,50,55,1,53,33,21,1,227,8,162,75,76,126,20,148,17,57,71,8,65,8,162,76,75,126,20,148,17,57,71,8,254,201,3, + 17,4,226,167,133,125,140,15,130,175,250,176,167,133,125,140,15,130,175,253,208,160,160,0,255,255,1,25,0,63,5,156,4,197,16,6,0,153,0,0, + 255,255,0,217,1,211,5,219,4,106,16,38,12,193,0,0,16,7,13,74,2,20,1,36,255,255,0,217,0,159,5,219,4,106,16,38,12,193,0,0, + 16,39,13,74,0,231,254,87,16,7,13,74,3,64,1,36,0,2,0,217,255,4,5,219,4,166,0,3,0,10,0,0,5,21,1,53,9,2,21,1, + 53,1,5,219,250,254,5,2,251,248,4,8,250,254,5,2,70,182,1,209,182,2,101,254,145,254,147,182,1,209,166,1,209,0,0,0,0,2,0,217, + 255,4,5,219,4,166,0,3,0,10,0,0,23,1,21,1,17,53,1,21,1,53,1,217,5,2,250,254,5,2,250,254,4,8,70,1,209,182,254,47, + 4,236,182,254,47,166,254,47,182,1,109,0,255,255,0,217,255,4,5,221,4,166,16,39,13,74,4,47,255,187,16,6,17,126,0,0,255,255,0,217, + 255,4,5,219,4,166,16,38,13,74,254,187,16,6,17,127,0,0,0,0,255,255,0,217,255,4,5,219,5,39,16,39,13,74,1,15,1,225,16,6, + 17,126,0,0,255,255,0,217,255,4,5,219,5,39,16,39,13,74,3,29,1,225,16,6,17,127,0,0,255,255,0,217,255,4,5,221,6,18,16,39, + 13,74,4,47,2,204,16,6,17,126,0,0,255,255,0,217,255,4,5,219,6,13,16,39,13,74,255,254,2,199,16,6,17,127,0,0,0,3,0,217, + 254,241,5,220,5,78,0,28,0,58,0,65,0,0,37,21,14,1,35,34,39,38,39,38,39,38,35,34,6,7,53,62,1,51,50,23,30,1,23,22, + 51,50,54,19,21,14,1,35,34,39,38,39,38,39,38,35,34,6,7,53,62,1,51,50,23,22,23,22,23,22,51,50,54,19,9,1,21,1,53,1, + 5,220,106,178,98,110,146,10,6,6,16,154,94,88,172,98,104,180,96,110,148,10,12,14,156,94,86,168,104,106,178,98,110,146,10,6,6,16,154,94, + 88,172,98,104,180,96,110,148,10,4,8,14,156,94,86,168,103,252,64,3,192,250,254,5,2,80,179,78,69,59,4,3,2,6,61,76,84,179,78,69, + 59,5,4,6,61,75,1,155,178,80,68,58,4,4,2,6,60,76,82,178,78,68,58,4,2,4,6,60,74,3,94,254,235,254,238,178,1,112,170,1, + 111,0,0,0,0,3,0,217,254,241,5,220,5,78,0,28,0,58,0,65,0,0,37,21,14,1,35,34,39,38,39,38,39,38,35,34,6,7,53,62, + 1,51,50,23,30,1,23,22,51,50,54,19,21,14,1,35,34,39,38,39,38,39,38,35,34,6,7,53,62,1,51,50,23,22,23,22,23,22,51,50, + 54,1,53,1,21,1,53,1,5,220,106,178,98,110,146,10,6,6,16,154,94,88,172,98,104,180,96,110,148,10,12,14,156,94,86,168,104,106,178,98, + 110,146,10,6,6,16,154,94,88,172,98,104,180,96,110,148,10,4,8,14,156,94,86,168,251,101,5,2,250,254,3,192,80,179,78,69,59,4,3,2, + 6,61,76,84,179,78,69,59,5,4,6,61,75,1,155,178,80,68,58,4,4,2,6,60,76,82,178,78,68,58,4,2,4,6,60,74,3,94,176,254, + 145,170,254,144,178,1,18,0,0,2,0,217,255,8,5,219,4,168,0,11,0,18,0,0,1,23,7,33,21,33,7,39,55,33,53,33,9,2,21,1, + 53,1,3,172,150,90,1,243,253,178,133,150,90,254,13,2,78,2,180,252,64,3,192,250,254,5,2,1,162,80,168,170,248,80,168,170,3,78,254,235, + 254,238,178,1,112,170,1,111,0,2,0,217,255,8,5,219,4,168,0,11,0,18,0,0,1,23,7,33,21,33,7,39,55,33,53,33,1,53,1,21, + 1,53,1,3,172,150,90,1,243,253,178,133,150,90,254,13,2,78,253,178,5,2,250,254,3,192,1,162,80,168,170,248,80,168,170,3,78,176,254,145, + 170,254,144,178,1,18,0,0,0,2,0,217,254,95,5,220,5,78,0,54,0,61,0,0,1,21,14,1,35,34,39,7,22,51,50,54,55,21,14,1, + 35,34,47,1,7,39,55,38,35,34,6,7,53,62,1,51,50,23,55,38,35,34,6,7,53,54,55,54,23,22,31,1,55,23,7,22,51,50,54,19, + 9,1,21,1,53,1,5,220,106,178,98,68,83,52,140,87,86,168,104,106,178,98,109,147,8,92,164,89,64,47,88,172,98,104,180,96,69,83,51,139, + 86,88,172,98,104,90,109,77,146,112,7,91,164,89,64,49,86,168,103,252,64,3,192,250,254,5,2,1,150,178,80,68,23,131,52,75,85,179,78,69, + 59,3,233,64,226,16,76,84,179,78,69,23,130,52,76,82,178,78,34,42,8,14,44,3,233,64,227,15,74,3,94,254,235,254,238,178,1,112,170,1, + 111,0,0,0,0,2,0,217,254,95,5,220,5,78,0,53,0,60,0,0,1,21,14,1,35,34,39,7,22,51,50,54,55,21,14,1,35,34,47,1, + 7,39,55,38,35,34,6,7,53,62,1,51,50,23,55,38,35,34,6,7,53,62,1,51,50,31,1,55,23,7,22,51,50,54,1,53,1,21,1,53, + 1,5,220,106,178,98,68,83,52,140,87,86,168,104,106,178,98,109,147,8,92,164,89,64,47,88,172,98,104,180,96,69,83,51,139,86,88,172,98,104, + 180,96,110,148,7,91,164,89,64,49,86,168,251,101,5,2,250,254,3,192,1,150,178,80,68,23,131,52,75,85,179,78,69,59,3,233,64,226,16,76, + 84,179,78,69,23,130,52,76,82,178,78,68,58,3,233,64,227,15,74,3,94,176,254,145,170,254,144,178,1,18,0,0,0,4,0,217,253,132,5,219, + 6,84,0,6,0,10,0,17,0,21,0,0,1,21,1,53,1,21,5,1,33,53,33,1,45,1,53,1,21,9,1,33,53,33,5,219,250,254,5,2, + 252,139,3,117,250,254,5,2,250,254,3,117,252,139,5,2,250,254,5,2,250,254,5,2,3,251,176,1,47,170,1,48,178,210,253,92,170,251,94,213, + 210,178,254,208,170,254,209,3,126,170,0,0,0,4,0,217,253,132,5,219,6,84,0,6,0,10,0,17,0,21,0,0,19,45,1,53,1,21,1,17, + 53,33,21,17,21,1,53,1,21,5,1,53,33,21,217,3,117,252,139,5,2,250,254,5,2,250,254,5,2,252,139,254,115,5,2,3,251,213,210,178, + 254,208,170,254,209,254,225,170,170,252,8,176,1,47,170,1,48,178,210,1,249,170,170,0,0,3,0,217,255,2,5,220,5,78,0,26,0,30,0,37, + 0,0,1,21,14,1,35,34,47,1,38,39,38,35,34,6,7,53,62,1,51,50,31,2,22,51,50,54,1,33,21,33,9,2,21,1,53,1,5,220, + 106,179,97,110,146,16,6,16,154,94,88,172,98,104,180,96,110,148,14,22,156,94,86,168,251,102,5,2,250,254,5,1,252,64,3,192,250,254,5,2, + 1,150,178,80,68,58,8,2,6,60,75,83,178,78,68,58,6,10,60,74,254,108,170,5,156,254,235,254,238,178,1,112,170,1,111,0,0,3,0,217, + 255,2,5,220,5,78,0,26,0,30,0,37,0,0,1,21,14,1,35,34,47,1,38,39,38,35,34,6,7,53,62,1,51,50,31,2,22,51,50,54, + 1,33,21,33,3,53,1,21,1,53,1,5,220,106,179,97,110,146,16,6,16,154,94,88,172,98,104,180,96,110,148,14,22,156,94,86,168,251,102,5, + 2,250,254,1,5,2,250,254,3,192,1,150,178,80,68,58,8,2,6,60,75,83,178,78,68,58,6,10,60,74,254,108,170,5,156,176,254,145,170,254, + 144,178,1,18,0,3,0,217,254,18,5,219,6,12,0,26,0,33,0,40,0,0,1,21,14,1,35,34,47,1,38,39,38,35,34,6,7,53,62,1, + 51,50,31,2,22,51,50,54,19,21,1,53,1,21,5,1,45,1,53,1,21,1,5,219,105,179,97,110,146,17,6,15,155,94,88,172,98,105,179,97, + 110,147,15,22,155,94,86,169,103,250,254,5,2,252,139,254,115,3,117,252,139,5,2,250,254,2,190,178,79,69,59,7,2,6,61,76,83,178,78,69, + 59,6,9,61,75,1,74,176,1,47,170,1,48,178,210,250,58,213,210,178,254,208,170,254,209,0,0,0,0,3,0,217,254,18,5,219,6,12,0,26, + 0,33,0,40,0,0,1,21,14,1,35,34,47,1,38,39,38,35,34,6,7,53,62,1,51,50,31,2,22,51,50,54,1,45,1,53,1,21,9,1, + 21,1,53,1,21,5,5,219,105,179,97,110,146,17,6,15,155,94,88,172,98,105,179,97,110,147,15,22,155,94,86,169,251,101,3,117,252,139,5,2, + 250,254,5,2,250,254,5,2,252,139,2,190,178,79,69,59,7,2,6,61,76,83,178,78,69,59,6,9,61,75,1,74,213,210,178,254,208,170,254,209, + 251,191,176,1,47,170,1,48,178,210,0,0,0,4,0,217,254,44,5,219,5,215,0,6,0,10,0,17,0,21,0,0,19,45,1,53,1,21,1,17, + 53,33,21,17,21,1,53,1,21,5,1,53,33,21,217,3,117,252,139,5,2,250,254,5,2,250,254,5,2,252,139,254,115,5,2,1,37,213,210,178, + 254,208,170,254,209,254,225,170,170,4,40,176,1,47,170,1,48,178,210,249,217,170,170,0,0,4,0,217,254,44,5,219,5,215,0,6,0,10,0,17, + 0,21,0,0,1,21,1,53,1,21,5,1,33,53,33,1,45,1,53,1,21,9,1,33,53,33,5,219,250,254,5,2,252,139,3,117,250,254,5,2, + 250,254,3,117,252,139,5,2,250,254,5,2,250,254,5,2,1,37,176,1,47,170,1,48,178,210,253,92,170,3,126,213,210,178,254,208,170,254,209,251, + 94,170,0,0,0,4,0,217,254,54,5,219,5,238,0,6,0,10,0,17,0,21,0,0,1,21,1,53,1,21,5,9,1,53,9,1,45,1,53,1, + 21,1,17,53,1,21,5,219,250,254,5,2,252,139,3,117,250,254,5,2,250,254,3,117,252,139,5,2,250,254,5,2,3,149,176,1,47,170,1,48, + 178,210,253,86,1,47,176,254,209,253,166,213,210,178,254,208,170,254,209,254,208,176,1,47,176,0,0,0,0,4,0,217,254,54,5,219,5,238,0,6, + 0,10,0,17,0,21,0,0,19,45,1,53,1,21,1,17,53,1,21,17,21,1,53,1,21,5,9,1,53,1,217,3,117,252,139,5,2,250,254,5, + 2,250,254,5,2,252,139,3,117,250,254,5,2,3,149,213,210,178,254,208,170,254,209,254,219,176,1,47,176,253,39,176,1,47,170,1,48,178,210,253, + 75,1,47,176,254,209,0,0,0,2,0,217,255,132,5,219,5,38,0,3,0,10,0,0,9,1,53,1,17,21,1,53,1,21,1,5,219,250,254,5, + 2,250,254,5,2,251,248,4,112,254,47,182,1,209,251,20,182,1,209,166,1,209,182,254,147,0,0,0,0,2,0,217,255,132,5,219,5,38,0,3, + 0,10,0,0,19,53,1,21,9,2,53,1,21,1,217,5,2,250,254,4,8,251,248,5,2,250,254,4,112,182,254,47,182,253,155,1,111,1,109,182, + 254,47,166,254,47,0,0,0,255,255,0,217,255,132,5,221,5,38,16,39,13,74,4,47,254,238,16,6,17,150,0,0,255,255,0,217,255,132,5,219, + 5,38,16,39,13,74,255,254,254,228,16,6,17,151,0,0,0,3,0,218,255,182,5,220,5,123,0,3,0,10,0,14,0,0,19,53,33,21,17,21, + 1,53,1,21,9,1,53,33,21,218,5,2,250,254,5,2,252,64,254,190,5,2,4,209,170,170,251,149,176,1,111,170,1,112,178,254,238,2,57,170, + 170,0,0,0,0,3,0,218,255,182,5,220,5,123,0,3,0,10,0,14,0,0,1,33,53,33,9,2,53,1,21,9,1,33,53,33,5,220,250,254, + 5,2,250,254,3,192,252,64,5,2,250,254,5,2,250,254,5,2,4,209,170,250,235,1,21,1,18,178,254,144,170,254,145,3,254,170,0,3,0,217, + 255,192,5,219,5,205,0,3,0,7,0,14,0,0,19,53,1,21,1,53,1,21,17,21,1,53,1,21,1,217,5,2,250,254,5,2,250,254,5,2, + 252,64,3,171,178,1,112,178,253,78,178,1,112,178,252,151,176,1,111,170,1,112,178,254,238,0,0,0,0,3,0,217,255,192,5,219,5,205,0,3, + 0,7,0,14,0,0,9,1,53,1,17,1,53,9,3,53,1,21,1,5,219,250,254,5,2,250,254,5,2,250,254,3,192,252,64,5,2,250,254,3, + 171,1,112,178,254,144,254,12,1,112,178,254,144,253,85,1,21,1,18,178,254,144,170,254,145,0,0,0,0,2,0,217,0,17,5,220,5,40,0,27, + 0,34,0,0,1,46,1,35,34,7,14,1,7,6,35,34,38,39,53,30,1,51,50,55,62,1,55,54,51,50,22,23,3,21,1,53,1,21,1,5, + 220,104,168,86,94,156,14,12,10,148,110,96,180,104,98,172,88,94,154,16,12,10,146,110,98,178,106,1,250,254,5,2,252,64,3,202,84,76,62,6, + 4,4,60,70,78,178,84,76,62,6,4,4,60,70,78,252,69,176,1,111,170,1,112,178,254,238,0,0,0,2,0,217,0,48,5,220,5,40,0,27, + 0,34,0,0,1,46,1,35,34,7,14,1,7,6,35,34,38,39,53,30,1,51,50,55,62,1,55,54,51,50,22,23,9,2,53,1,21,1,5,220, + 104,168,86,94,156,14,12,10,148,110,96,180,104,98,172,88,94,154,16,12,10,146,110,98,178,106,250,253,3,193,252,63,5,2,250,254,3,202,84,76, + 62,6,4,4,60,70,78,178,84,76,62,6,4,4,60,70,78,252,100,1,21,1,18,178,254,144,170,254,145,0,0,0,0,4,0,217,254,152,5,220, + 5,212,0,3,0,7,0,36,0,43,0,0,23,53,33,21,1,53,33,21,19,46,1,35,34,7,14,1,7,6,35,34,38,39,53,30,1,51,50,55, + 54,55,54,55,54,51,50,22,23,3,21,1,53,1,21,1,217,5,2,250,254,5,2,1,104,168,86,94,156,14,12,10,148,110,96,180,104,98,172,88, + 94,154,16,6,6,10,146,110,98,178,106,1,250,254,5,2,252,64,62,170,170,254,214,170,170,5,220,86,74,60,6,4,6,58,68,78,180,84,76,60, + 6,2,4,4,58,68,78,252,68,176,1,111,170,1,112,178,254,238,0,0,0,4,0,217,254,152,5,220,5,212,0,3,0,7,0,36,0,43,0,0, + 23,53,33,21,1,53,33,21,19,46,1,35,34,7,14,1,7,6,35,34,38,39,53,30,1,51,50,55,54,55,54,55,54,51,50,22,23,9,2,53, + 1,21,1,217,5,2,250,254,5,2,1,104,168,86,94,156,14,12,10,148,110,96,180,104,98,172,88,94,154,16,6,6,10,146,110,98,178,106,250,253, + 3,192,252,64,5,2,250,254,62,170,170,254,214,170,170,5,220,86,74,60,6,4,6,58,68,78,180,84,76,60,6,2,4,4,58,68,78,252,68,1, + 21,1,18,178,254,144,170,254,145,0,0,0,0,3,0,217,0,102,5,219,4,206,0,3,0,32,0,36,0,0,19,33,21,33,1,6,7,6,7,6, + 7,33,53,33,54,55,54,55,54,50,23,22,23,22,23,33,21,33,38,39,38,39,38,1,33,21,33,217,5,2,250,254,2,130,67,46,56,30,27,4, + 254,100,1,10,12,30,54,87,89,206,89,86,55,28,14,1,10,254,101,4,27,30,56,45,253,59,5,2,250,254,2,90,170,2,123,4,30,43,68,68, + 92,168,57,51,91,50,51,51,50,91,48,60,168,91,69,67,44,30,252,233,170,0,0,0,0,2,0,217,255,207,5,219,5,87,0,3,0,14,0,0, + 55,33,21,33,1,0,5,4,1,21,0,37,53,36,1,217,5,2,250,254,5,2,254,129,254,36,1,220,1,127,254,129,252,125,3,131,1,127,121,170, + 4,177,254,229,93,93,254,229,215,1,120,132,166,124,1,128,0,2,0,217,255,207,5,219,5,87,0,3,0,15,0,0,37,21,33,53,17,53,0,5, + 48,21,4,1,53,0,37,36,5,219,250,254,1,127,3,131,252,125,254,129,1,127,1,220,254,36,121,170,170,4,7,215,254,128,124,166,132,254,136,215, + 1,27,93,93,0,2,0,217,254,215,5,219,5,87,0,11,0,22,0,0,1,23,7,33,21,33,7,39,55,33,53,33,1,0,5,4,1,21,0,37, + 53,36,1,3,172,150,90,1,243,253,178,133,150,90,254,13,2,78,2,180,254,129,254,36,1,220,1,127,254,129,252,125,3,131,1,127,1,113,80,168, + 170,248,80,168,170,4,7,254,229,93,93,254,229,215,1,120,132,166,124,1,128,0,0,0,0,2,0,217,254,215,5,219,5,87,0,11,0,22,0,0, + 1,23,7,33,21,33,7,39,55,33,53,33,1,53,0,5,21,4,1,53,0,37,36,3,172,150,90,1,243,253,178,133,150,90,254,13,2,78,253,178, + 1,127,3,131,252,125,254,129,1,127,1,220,254,36,1,113,80,168,170,248,80,168,170,4,7,215,254,128,124,166,132,254,136,215,1,27,93,93,0,0, + 0,3,0,217,255,9,5,219,5,75,0,3,0,7,0,18,0,0,55,53,33,21,1,53,33,21,17,0,5,4,5,21,0,37,53,36,1,217,5,2, + 250,254,5,2,254,205,253,216,2,33,1,58,254,163,252,91,3,165,1,93,51,170,170,254,214,170,170,5,107,254,229,45,81,247,215,1,116,88,166,86, + 1,118,0,0,0,3,0,217,255,9,5,219,5,75,0,3,0,7,0,18,0,0,55,53,33,21,1,53,33,21,1,53,0,5,21,4,1,53,36,37, + 36,217,5,2,250,254,5,2,250,254,1,93,3,165,252,91,254,163,1,58,2,33,253,216,51,170,170,254,214,170,170,5,107,215,254,138,86,166,88,254, + 140,215,247,81,45,0,0,0,0,2,0,217,254,113,5,219,5,75,0,19,0,30,0,0,5,33,53,33,55,33,53,33,55,23,7,33,21,33,7,33, + 21,33,7,39,1,0,5,4,5,21,0,37,53,36,1,2,38,254,179,1,218,96,253,198,2,200,137,138,41,1,80,254,34,95,2,61,253,54,138,138, + 3,222,254,205,253,216,2,33,1,58,254,163,252,91,3,165,1,93,234,170,115,170,164,115,49,170,115,170,165,116,5,143,254,229,45,81,247,215,1,116, + 88,166,86,1,118,0,0,0,0,2,0,217,254,113,5,219,5,75,0,19,0,30,0,0,5,33,53,33,55,33,53,33,55,23,7,33,21,33,7,33, + 21,33,7,39,1,53,0,5,21,4,1,53,36,37,36,2,38,254,179,1,218,96,253,198,2,200,137,138,41,1,80,254,34,95,2,61,253,54,138,138, + 254,220,1,93,3,165,252,91,254,163,1,58,2,33,253,216,234,170,115,170,164,115,49,170,115,170,165,116,5,143,215,254,138,86,166,88,254,140,215,247, + 81,45,0,0,0,3,0,217,254,121,5,219,5,139,0,29,0,58,0,69,0,0,5,21,14,1,35,34,39,38,39,38,39,38,35,34,6,7,53,62, + 1,55,54,23,22,23,22,23,22,51,50,54,19,21,14,1,35,34,39,38,39,38,39,38,35,34,6,7,53,62,1,51,50,23,22,23,22,23,22,62, + 1,19,0,5,4,5,21,0,37,53,36,1,5,219,105,179,97,110,146,10,7,6,15,155,94,88,172,98,105,178,98,96,161,11,5,6,15,155,94,86, + 169,103,105,179,97,110,146,10,7,6,15,155,94,88,172,98,105,179,97,110,147,10,5,7,15,170,158,176,103,254,205,253,216,2,33,1,58,254,163,252, + 91,3,165,1,93,40,179,78,69,59,4,3,2,6,61,76,84,179,78,57,12,6,65,5,2,2,6,61,75,1,154,178,79,69,59,4,3,2,6,61, + 76,83,178,78,69,59,4,2,3,6,67,12,69,3,236,254,229,45,81,247,215,1,116,88,166,86,1,118,0,3,0,217,254,121,5,219,5,139,0,29, + 0,58,0,69,0,0,5,21,14,1,35,34,39,38,39,38,39,38,35,34,6,7,53,62,1,55,54,23,22,23,22,23,22,51,50,54,19,21,14,1, + 35,34,39,38,39,38,39,38,35,34,6,7,53,62,1,51,50,23,22,23,22,23,22,62,1,1,53,0,5,21,4,1,53,36,37,36,5,219,105,179, + 97,110,146,10,7,6,15,155,94,88,172,98,105,178,98,96,161,11,5,6,15,155,94,86,169,103,105,179,97,110,146,10,7,6,15,155,94,88,172,98, + 105,179,97,110,147,10,5,7,15,170,158,176,251,101,1,93,3,165,252,91,254,163,1,58,2,33,253,216,40,179,78,69,59,4,3,2,6,61,76,84, + 179,78,57,12,6,65,5,2,2,6,61,75,1,154,178,79,69,59,4,3,2,6,61,76,83,178,78,69,59,4,2,3,6,67,12,69,3,236,215,254, + 138,86,166,88,254,140,215,247,81,45,0,0,0,2,0,217,253,237,5,220,5,139,0,54,0,65,0,0,1,21,14,1,35,34,39,7,22,51,50,54, + 55,21,14,1,35,34,47,1,7,39,55,38,35,34,6,7,53,62,1,51,50,23,55,38,35,34,6,7,53,54,55,54,23,22,31,1,55,23,7,22, + 51,50,54,19,0,5,4,5,21,0,37,53,36,1,5,220,106,178,98,68,83,52,140,87,86,168,104,106,178,98,109,147,8,92,164,89,64,47,88,172, + 98,104,180,96,69,83,51,139,86,88,172,98,104,90,109,77,146,112,7,91,164,89,64,49,86,168,103,254,205,253,216,2,33,1,58,254,163,252,91,3, + 165,1,93,1,36,178,80,68,23,131,52,75,85,179,78,69,59,3,233,64,226,16,76,84,179,78,69,23,130,52,76,82,178,78,34,42,8,14,44,3, + 233,64,227,15,74,3,230,254,229,45,81,247,215,1,116,88,166,86,1,118,0,2,0,217,253,237,5,220,5,139,0,54,0,65,0,0,1,21,14,1, + 35,34,39,7,22,51,50,54,55,21,14,1,35,34,47,1,7,39,55,38,35,34,6,7,53,62,1,51,50,23,55,38,35,34,6,7,53,54,55,54, + 23,22,31,1,55,23,7,22,51,50,54,1,53,0,5,21,4,1,53,36,37,36,5,220,106,178,98,68,83,52,140,87,86,168,104,106,178,98,109,147, + 8,92,164,89,64,47,88,172,98,104,180,96,69,83,51,139,86,88,172,98,104,90,109,77,146,112,7,91,164,89,64,49,86,168,251,101,1,93,3,165, + 252,91,254,163,1,58,2,33,253,216,1,36,178,80,68,23,131,52,75,85,179,78,69,59,3,233,64,226,16,76,84,179,78,69,23,130,52,76,82,178, + 78,34,42,8,14,44,3,233,64,227,15,74,3,230,215,254,138,86,166,88,254,140,215,247,81,45,0,0,0,3,0,217,254,161,5,219,4,174,0,3, + 0,7,0,14,0,0,55,1,21,1,17,1,21,9,3,21,1,53,1,217,5,2,250,254,5,2,250,254,5,2,252,64,3,192,250,254,5,2,195,254, + 144,178,1,112,1,244,254,144,178,1,112,2,171,254,235,254,238,178,1,112,170,1,111,0,0,3,0,217,254,161,5,219,4,174,0,3,0,7,0,14, + 0,0,37,21,1,53,1,21,1,53,17,53,1,21,1,53,1,5,219,250,254,5,2,250,254,5,2,250,254,3,192,195,178,254,144,178,2,178,178,254, + 144,178,3,105,176,254,145,170,254,144,178,1,18,0,0,0,0,2,0,181,255,201,5,159,4,179,0,6,0,13,0,0,1,23,1,23,1,23,17,19, + 39,9,2,39,33,3,194,93,253,35,191,2,221,92,101,193,253,35,254,180,2,221,194,2,207,4,78,92,253,35,191,2,221,93,1,120,253,150,194,253, + 35,1,76,2,221,193,0,0,0,2,1,32,255,201,6,10,4,179,0,6,0,13,0,0,1,33,17,55,1,55,9,1,17,33,7,9,2,2,253,254, + 136,92,2,221,191,253,35,254,128,2,207,194,2,221,254,180,253,35,4,78,254,136,93,253,35,191,2,221,253,242,2,207,193,253,35,254,180,2,221,0, + 0,2,0,181,0,52,5,159,5,30,0,6,0,13,0,0,1,7,1,7,1,7,33,5,55,9,2,55,17,5,58,92,253,35,191,2,221,93,1,120, + 253,150,194,253,35,1,76,2,221,193,2,17,93,2,221,191,253,35,92,101,193,2,221,1,76,253,35,194,253,49,0,0,0,2,1,32,0,52,6,10, + 5,30,0,6,0,13,0,0,37,39,1,39,1,39,17,3,23,9,2,23,33,2,253,93,2,221,191,253,35,92,101,193,2,221,1,76,253,35,194,253, + 49,153,92,2,221,191,253,35,93,254,136,2,106,194,2,221,254,180,253,35,193,0,0,0,0,2,0,55,0,134,6,80,4,126,0,9,0,19,0,0, + 37,9,1,17,33,17,9,1,17,33,1,21,33,53,9,1,53,33,21,1,2,51,254,4,1,252,2,33,1,252,254,4,253,223,2,133,253,23,254,246, + 1,10,2,233,1,10,134,1,252,1,252,254,239,1,17,254,4,254,4,1,17,1,245,131,131,254,246,254,246,131,131,1,10,0,0,0,0,1,0,55, + 0,134,6,63,4,126,0,6,0,0,37,9,1,17,33,17,33,2,51,254,4,1,252,4,12,251,244,134,1,252,1,252,254,239,254,42,0,1,1,94, + 0,0,5,86,6,8,0,6,0,0,9,2,33,17,33,17,1,94,1,252,1,252,254,239,254,42,4,12,1,252,254,4,251,244,4,12,0,1,1,94, + 255,205,5,86,5,213,0,6,0,0,1,33,17,33,17,33,1,1,94,1,17,1,214,1,17,254,4,1,201,4,12,251,244,254,4,0,0,1,0,181, + 255,201,5,159,4,179,0,6,0,0,1,39,9,2,39,33,5,159,193,253,35,254,180,2,221,194,2,207,1,228,194,253,35,1,76,2,221,193,0,0, + 0,1,1,32,255,201,6,10,4,179,0,6,0,0,1,17,33,7,9,2,1,32,2,207,194,2,221,254,180,253,35,1,228,2,207,193,253,35,254,180, + 2,221,0,0,0,1,0,181,0,52,5,159,5,30,0,6,0,0,37,55,9,2,55,17,2,208,194,253,35,1,76,2,221,193,52,193,2,221,1,76, + 253,35,194,253,49,0,0,0,0,1,1,32,0,52,6,10,5,30,0,6,0,0,1,23,9,2,23,33,1,32,193,2,221,1,76,253,35,194,253,49, + 3,3,194,2,221,254,180,253,35,193,0,0,0,1,0,55,0,134,6,80,4,126,0,9,0,0,37,9,1,17,33,17,9,1,17,33,2,51,254,4, + 1,252,2,33,1,252,254,4,253,223,134,1,252,1,252,254,239,1,17,254,4,254,4,1,17,0,0,0,0,1,1,94,255,205,5,86,6,8,0,9, + 0,0,1,33,9,1,33,17,33,9,1,33,4,69,1,17,254,4,254,4,1,17,254,239,1,252,1,252,254,239,1,201,254,4,1,252,2,67,1,252, + 254,4,0,0,0,1,0,117,255,249,6,82,2,215,0,11,0,0,5,35,1,55,23,17,33,53,33,17,55,23,4,200,90,254,120,120,232,252,47,4, + 123,234,120,7,1,138,120,234,1,28,170,254,58,234,120,0,0,1,0,117,2,45,6,82,5,11,0,11,0,0,9,1,7,39,17,33,53,33,17,7, + 39,1,4,200,1,138,120,234,251,133,3,209,232,120,1,136,5,11,254,118,120,234,254,58,170,1,28,234,120,1,138,0,0,1,0,72,255,249,6,37, + 2,215,0,11,0,0,5,1,55,23,17,33,21,33,17,55,23,1,1,210,254,118,120,234,4,123,252,47,232,120,254,120,7,1,138,120,234,1,198,170, + 254,228,234,120,254,118,0,0,0,1,0,72,2,45,6,37,5,11,0,11,0,0,1,51,1,7,39,17,33,21,33,17,7,39,1,210,90,1,136,120, + 232,3,209,251,133,234,120,5,11,254,118,120,234,254,228,170,1,198,234,120,0,2,0,186,255,4,6,213,5,36,0,3,0,7,0,0,23,17,33,17, + 37,33,17,33,186,6,27,250,87,5,55,250,201,252,6,32,249,224,114,2,158,0,0,0,0,2,0,186,255,4,6,213,5,36,0,3,0,7,0,0, + 23,17,33,17,1,33,17,33,186,6,27,250,87,5,55,250,201,252,6,32,249,224,3,16,2,158,0,0,0,2,0,186,255,4,6,213,5,36,0,2, + 0,6,0,0,5,33,1,3,17,33,17,1,44,5,55,250,201,114,6,27,138,5,60,250,82,6,32,249,224,0,0,0,0,2,0,186,255,4,6,213, + 5,36,0,2,0,6,0,0,5,17,33,3,17,33,17,6,99,250,201,114,6,27,138,5,60,250,82,6,32,249,224,0,0,2,0,6,255,4,6,33, + 5,36,0,2,0,6,0,0,5,9,5,3,19,2,118,253,138,252,243,3,13,3,14,252,242,100,2,120,2,120,253,136,3,16,252,240,252,240,0,0, + 0,2,0,6,255,4,6,33,5,36,0,2,0,6,0,0,19,1,17,9,3,158,2,117,252,243,3,13,3,14,252,242,2,20,253,136,4,240,253,136, + 3,16,252,240,252,240,0,0,0,2,0,6,255,4,6,33,5,36,0,2,0,6,0,0,19,9,1,33,9,2,158,2,117,2,118,250,125,3,13,3, + 14,252,242,2,20,253,136,2,120,3,16,252,240,252,240,0,0,2,0,6,255,4,6,33,5,36,0,2,0,6,0,0,19,33,9,4,158,4,235,253, + 138,252,243,3,13,3,14,252,242,2,20,2,120,253,136,3,16,252,240,252,240,0,0,0,0,12,0,186,255,4,6,213,5,36,0,5,0,9,0,13, + 0,17,0,21,0,27,0,31,0,35,0,41,0,45,0,49,0,55,0,0,5,21,35,53,51,53,19,21,35,53,19,21,35,53,1,21,35,53,35,21, + 35,53,1,21,35,53,35,53,35,21,35,53,35,21,35,53,1,21,51,21,35,53,19,21,35,53,19,21,35,53,19,21,35,21,35,53,6,213,227,113, + 114,114,114,114,254,165,204,234,202,4,77,114,113,234,204,234,202,254,164,114,228,114,114,114,114,228,114,114,22,230,116,114,1,182,204,204,1,180,202,202, + 252,36,116,116,116,116,5,172,230,114,116,116,116,116,116,250,198,114,116,230,1,182,204,204,1,180,202,202,1,208,116,114,230,0,0,0,0,1,0,36, + 255,202,6,208,6,35,0,4,0,0,19,9,2,33,36,3,86,3,86,254,186,251,224,3,182,2,109,253,147,252,20,0,0,2,0,36,255,202,6,208, + 6,35,0,4,0,9,0,0,19,1,33,9,5,33,170,1,19,3,122,1,19,253,48,252,170,3,86,3,86,254,186,251,224,3,139,252,177,3,79,2, + 12,254,31,2,109,253,147,252,20,0,0,0,0,2,0,150,255,70,6,102,5,252,0,5,0,11,0,0,9,2,17,9,1,3,17,9,1,17,1,1, + 8,2,118,2,118,253,138,253,138,114,2,232,2,232,253,24,1,53,254,149,1,107,2,216,1,107,254,149,252,230,3,92,1,173,254,83,252,164,254,83, + 0,1,0,150,255,70,6,102,5,252,0,5,0,0,55,17,9,1,17,1,150,2,232,2,232,253,24,243,3,92,1,173,254,83,252,164,254,83,0,0, + 0,1,0,34,255,185,6,217,5,137,0,5,0,0,5,9,1,33,9,1,1,208,254,82,1,174,3,91,1,174,254,82,71,2,232,2,232,253,24,253, + 24,0,0,0,0,1,0,112,254,0,8,132,6,40,0,11,0,0,22,16,1,36,32,5,0,16,1,4,32,37,112,2,5,1,3,2,4,1,3,2, + 5,253,251,254,253,253,252,254,253,64,4,168,1,42,150,150,254,214,251,88,254,214,150,150,0,1,0,77,255,160,6,167,6,77,0,4,0,0,9,3, + 17,4,58,2,108,253,148,252,20,6,76,252,170,252,170,1,70,4,32,0,0,2,0,77,255,160,6,167,6,77,0,4,0,9,0,0,9,1,17,9, + 5,17,4,14,252,178,3,78,2,12,254,32,2,108,253,148,252,20,5,198,254,238,252,134,254,236,2,208,3,86,252,170,252,170,1,70,4,32,0,0, + 0,1,0,10,0,0,4,106,5,213,0,21,0,0,19,51,17,33,21,33,21,33,21,33,17,33,21,33,17,35,53,51,53,35,53,51,201,202,1,91, + 254,165,1,91,254,165,2,215,252,95,191,191,191,191,5,213,254,7,144,144,144,254,126,170,2,44,144,144,144,0,0,0,0,1,0,10,0,0,2,42, + 6,20,0,19,0,0,1,51,21,35,17,35,17,35,53,51,53,35,53,51,17,51,17,51,21,35,1,121,177,177,184,183,183,183,183,184,177,177,2,188, + 144,253,212,2,44,144,144,144,2,56,253,200,144,0,0,0,0,1,255,215,0,0,4,106,5,213,0,35,0,0,19,51,17,22,23,22,51,50,55,54, + 55,51,14,1,35,34,39,17,33,21,33,17,38,39,38,35,34,7,6,7,35,62,1,51,50,23,201,202,2,1,17,13,38,18,18,2,125,2,102,91, + 20,19,2,215,252,95,6,5,17,13,38,18,18,2,125,2,102,91,25,22,5,213,253,44,1,1,9,37,36,82,134,148,4,254,47,170,3,2,4,3, + 9,37,36,82,134,148,6,0,0,2,0,10,0,0,4,141,5,213,0,16,0,29,0,0,19,33,50,23,22,21,20,7,6,43,1,17,35,17,35,53, + 51,23,21,51,50,54,53,52,38,43,1,21,33,21,201,1,200,251,128,129,129,128,251,254,202,191,191,202,254,141,154,154,141,254,1,91,5,213,113,114, + 219,221,113,113,253,168,3,207,144,144,209,146,135,134,146,208,144,0,0,0,0,2,0,201,254,102,5,84,5,213,0,27,0,36,0,199,64,26,17,14, + 15,11,5,6,3,25,9,0,36,30,22,5,10,33,25,4,25,63,28,10,28,20,4,37,16,252,236,50,252,196,236,17,23,57,17,57,57,57,16,204, + 57,57,49,0,64,38,9,8,7,3,10,6,17,3,4,3,5,17,4,4,3,66,20,11,10,14,149,17,176,4,6,4,0,29,3,4,29,149,9,36, + 149,21,129,4,47,244,236,212,236,18,57,18,57,18,57,16,244,236,17,57,57,48,75,83,88,7,16,5,237,7,16,5,237,17,23,57,89,34,178,64, + 38,1,1,93,64,66,122,27,1,5,0,5,1,5,2,6,3,7,4,21,0,21,1,20,2,22,3,23,4,37,0,37,1,37,2,38,3,39,6,38, + 7,38,8,38,9,32,38,54,1,54,2,70,1,70,2,104,5,117,4,117,5,119,27,136,6,136,7,152,6,152,7,31,93,0,93,1,30,1,23,19, + 35,3,46,1,43,1,17,20,22,59,1,21,35,34,38,25,1,33,32,22,21,20,6,1,17,51,50,54,53,52,38,35,3,141,65,123,62,205,217,191, + 74,139,120,220,110,134,63,77,227,205,1,200,1,0,252,131,253,137,254,146,149,149,146,2,188,22,144,126,254,104,1,127,150,98,253,241,194,150,170,244, + 1,14,5,109,214,216,141,186,2,79,253,238,135,131,131,133,0,4,0,72,255,162,4,156,4,188,0,35,0,40,0,48,0,55,0,0,1,17,35,53, + 14,1,35,34,39,7,39,55,38,53,52,54,59,1,55,38,39,38,35,34,6,7,53,62,1,51,50,23,55,23,7,22,15,1,51,53,52,7,1,22, + 51,50,54,61,1,1,19,6,7,6,21,20,4,45,184,63,188,136,135,92,103,96,110,59,253,251,41,158,11,13,84,151,96,182,84,101,190,90,231,120, + 148,95,168,57,187,53,56,175,254,188,62,99,153,185,253,197,229,99,51,86,2,127,253,129,170,102,97,60,125,78,133,86,123,189,192,191,12,12,69,46, + 46,170,39,39,114,179,79,203,115,43,65,18,24,186,254,120,46,217,180,41,254,226,1,21,12,30,51,123,32,0,0,0,0,1,255,232,255,66,3,18, + 6,147,0,28,0,0,1,17,51,19,51,3,51,21,35,3,21,20,22,59,1,21,35,34,39,38,39,3,35,19,17,35,53,51,17,1,119,49,192,170, + 192,160,209,170,75,115,189,189,213,81,13,10,102,170,214,135,135,5,158,254,194,2,51,253,205,143,254,15,111,137,78,154,80,12,16,254,214,2,114,2, + 29,143,1,62,255,255,0,201,254,191,6,4,5,213,16,6,4,54,0,0,0,1,0,186,254,229,5,28,6,20,0,25,0,0,33,35,17,52,38,35, + 34,6,21,17,35,17,51,17,54,55,54,51,50,23,22,21,17,51,17,35,4,100,184,124,124,149,172,185,185,66,89,90,117,193,99,99,184,184,2,158, + 159,158,190,164,253,135,6,20,253,158,101,50,50,119,120,232,253,245,254,76,0,1,0,201,254,191,5,106,5,213,0,14,0,0,37,51,17,35,17,35, + 1,17,35,17,51,17,1,33,1,4,193,169,197,69,253,51,202,202,2,158,1,4,253,27,170,254,21,1,65,2,207,253,49,5,213,253,137,2,119,253, + 72,0,0,0,0,1,0,186,254,229,4,156,6,20,0,14,0,0,19,51,17,1,51,9,1,51,17,35,17,35,1,17,35,186,185,2,37,235,253,174, + 1,204,159,184,56,253,199,185,6,20,252,105,1,227,253,244,254,69,254,76,1,27,2,35,253,221,0,0,0,1,0,92,254,191,5,232,5,213,0,11, + 0,0,19,33,21,1,33,17,35,17,33,53,1,33,115,4,149,252,80,4,144,201,251,61,3,176,252,103,5,213,154,251,111,254,21,1,65,154,4,145, + 0,1,0,88,254,229,4,147,4,96,0,11,0,0,19,33,21,1,33,17,35,17,33,53,1,33,113,3,106,253,76,3,108,184,252,125,2,180,253,101, + 4,96,168,252,219,254,82,1,27,168,3,37,0,2,0,115,255,227,5,119,5,241,0,16,0,28,0,45,64,24,26,149,0,14,20,149,5,8,140,14, + 145,1,175,3,23,4,0,28,2,17,25,11,16,29,16,252,236,212,236,50,50,49,0,47,236,228,244,196,236,16,196,238,48,1,53,51,17,35,53,14, + 1,35,32,0,17,16,0,33,50,22,1,16,18,51,50,18,17,16,2,35,34,2,4,179,196,196,77,236,165,254,242,254,172,1,84,1,14,165,236,252, + 223,234,204,205,235,235,205,204,234,4,237,232,250,43,231,132,128,1,171,1,92,1,92,1,171,128,253,120,254,227,254,187,1,69,1,29,1,29,1,69, + 254,187,0,0,0,1,0,201,254,102,6,31,5,213,0,20,0,0,19,33,9,1,33,17,16,6,43,1,53,51,50,54,53,17,1,35,1,17,35,201, + 1,45,1,125,1,127,1,45,205,227,77,68,134,110,254,127,203,254,127,196,5,213,252,8,3,248,250,147,254,242,244,170,150,194,4,183,252,0,4,0, + 250,225,0,0,0,2,0,16,0,0,5,104,5,213,0,2,0,10,0,0,37,1,33,1,35,1,51,19,33,19,51,2,188,1,18,253,219,1,133,229, + 253,199,210,136,2,161,136,213,199,2,231,252,82,5,213,254,129,1,127,0,0,2,0,115,255,227,5,119,5,241,0,15,0,24,0,0,37,21,35,17, + 51,21,62,1,51,32,0,16,0,33,34,38,0,16,2,35,34,2,16,18,32,1,55,196,196,77,236,165,1,14,1,84,254,172,254,242,165,236,3,33, + 234,204,205,235,235,1,154,231,232,5,213,231,132,128,254,85,253,72,254,85,128,1,107,2,58,1,69,254,187,253,198,254,187,0,0,0,0,1,0,61, + 0,0,5,224,4,123,0,20,0,0,1,48,1,35,1,51,9,1,54,51,50,22,29,1,35,53,52,38,34,7,6,4,36,254,183,250,254,92,195,1, + 94,1,20,84,222,131,185,178,81,114,41,21,3,109,252,147,4,96,252,84,2,230,225,191,134,114,114,58,84,42,21,0,0,1,0,68,0,0,9,6, + 5,240,0,29,0,0,9,1,35,9,1,35,1,51,9,1,51,9,1,54,55,54,51,50,23,22,29,1,35,53,52,38,35,34,7,6,7,102,254,201, + 254,254,197,254,194,254,254,138,204,1,58,1,57,227,1,58,1,7,18,60,86,137,136,85,85,170,81,46,42,40,28,4,225,251,31,5,16,250,240,5, + 213,251,18,4,238,251,18,4,38,71,64,92,92,91,110,131,121,54,80,40,28,0,0,0,0,1,0,86,0,0,7,177,4,123,0,27,0,0,1,54, + 55,54,51,50,22,29,1,35,53,52,38,34,7,6,7,3,35,11,1,35,1,51,27,1,51,19,5,70,23,57,91,132,131,185,178,81,114,41,24,6, + 229,217,241,242,217,254,219,184,230,229,217,230,3,136,86,61,96,191,134,114,114,58,84,42,25,20,252,147,3,150,252,106,4,96,252,150,3,106,252,150, + 0,2,0,104,0,0,4,127,4,179,0,19,0,27,0,0,19,16,37,54,51,50,21,20,15,1,19,1,51,1,35,3,7,53,54,63,1,54,53,38, + 35,34,21,20,200,1,84,20,18,168,184,127,171,1,94,195,254,92,250,209,168,49,60,165,216,1,45,175,3,77,1,50,49,3,248,153,93,64,254,47, + 3,172,251,160,2,50,85,196,20,28,80,110,52,52,160,37,0,1,0,201,0,0,4,113,5,213,0,7,0,0,1,33,17,35,17,51,17,33,4,113, + 253,34,202,202,2,222,2,199,253,57,5,213,253,156,0,0,0,1,0,193,0,0,3,208,4,96,0,7,0,0,1,33,17,35,17,51,17,33,3,208, + 253,169,184,184,2,87,2,4,253,252,4,96,254,51,0,0,0,2,0,112,255,231,4,209,4,104,0,10,0,39,0,0,1,34,21,17,50,55,54,53, + 52,39,38,39,50,23,22,17,16,7,6,35,7,34,39,38,17,16,55,54,55,21,6,7,6,21,20,23,22,51,17,16,3,61,65,95,95,85,86,70, + 54,139,128,137,137,129,203,183,200,133,136,136,101,167,66,58,86,86,77,112,3,203,145,253,82,104,93,223,208,112,91,157,132,141,254,217,254,241,161,152, + 1,153,156,1,19,1,30,146,109,28,163,23,78,115,190,202,115,103,2,175,1,46,0,0,0,1,0,0,255,229,2,144,6,20,0,23,0,0,33,53, + 6,33,34,47,1,22,51,50,54,53,17,52,38,43,1,53,51,50,23,22,21,17,1,215,114,254,249,37,56,1,60,88,156,167,77,105,231,254,183,79, + 82,174,201,10,189,35,203,190,2,108,153,97,156,96,98,212,251,130,0,0,0,3,0,113,255,227,4,117,4,123,0,7,0,15,0,32,0,0,0,38, + 34,6,20,22,50,54,8,1,32,0,16,0,32,8,1,38,32,6,21,20,23,54,55,54,51,50,23,22,23,54,53,3,22,94,135,93,93,136,93,253, + 91,1,17,1,225,1,18,254,238,254,31,254,239,3,65,172,254,217,172,20,22,55,92,133,136,89,51,23,18,1,97,95,94,135,92,92,2,104,1,56, + 254,200,253,217,254,199,1,57,1,218,233,231,201,96,77,71,56,93,95,50,66,73,91,0,0,1,0,98,0,0,3,51,4,96,0,11,0,0,1,17, + 33,53,33,17,33,53,33,17,33,53,3,51,253,47,2,23,254,13,1,243,253,246,4,96,251,160,147,1,120,148,1,45,148,0,0,0,255,255,255,233, + 255,17,0,238,3,103,18,7,2,116,0,0,253,100,0,0,0,1,0,10,2,156,3,104,5,224,0,6,0,0,9,1,51,9,1,51,1,1,113,254, + 153,133,1,42,1,43,132,254,153,2,156,3,68,253,64,2,192,252,188,0,0,1,0,135,254,16,4,200,5,240,0,58,0,0,1,21,46,1,35,34, + 6,21,20,23,22,31,1,22,23,22,21,20,7,6,7,23,30,1,59,1,21,35,34,46,2,47,1,38,39,38,39,38,39,53,30,1,51,50,54,53, + 52,38,47,1,46,1,53,52,36,51,50,22,4,72,115,204,95,165,179,60,54,171,122,230,103,108,146,115,201,135,124,147,70,24,63,34,78,103,123,60, + 223,49,14,50,39,119,128,123,236,114,173,188,135,154,123,226,202,1,23,245,105,218,5,164,197,55,54,128,118,99,51,46,35,25,47,105,108,182,217,112, + 89,18,119,110,73,170,16,39,79,56,206,45,10,33,7,24,47,208,69,70,136,126,110,124,31,24,45,192,171,198,228,38,0,1,0,92,254,16,5,31, + 5,213,0,24,0,0,1,51,21,35,34,46,2,39,37,38,43,1,53,1,33,53,33,21,1,22,31,1,30,1,4,179,108,147,39,89,118,140,69,254, + 211,78,113,125,3,176,252,103,4,149,252,85,114,117,252,136,159,254,186,170,16,39,79,56,243,63,154,4,145,170,154,251,111,13,95,205,110,73,0,0, + 0,1,0,123,255,126,4,91,4,96,0,31,0,0,1,35,55,54,35,34,5,3,6,51,50,54,51,50,3,7,35,55,54,35,14,1,35,34,27,1, + 51,7,36,51,50,7,4,56,192,19,25,106,144,254,214,69,27,115,128,220,90,183,43,18,191,18,19,52,89,245,150,192,42,116,191,24,1,122,146,210, + 25,2,173,129,172,172,254,4,174,154,254,226,130,130,132,1,131,1,49,3,47,177,177,177,0,1,0,50,254,30,4,114,4,95,0,32,0,0,1,6, + 22,7,6,4,35,32,36,55,51,6,22,51,62,1,55,54,38,55,4,35,34,55,19,51,3,6,51,22,37,19,51,3,250,15,104,26,27,254,244,210, + 254,255,254,221,22,186,11,147,217,107,192,25,19,106,8,254,119,148,211,25,152,188,132,24,114,157,1,16,113,191,1,45,120,209,158,135,161,171,150,68, + 124,1,72,118,96,211,81,176,175,3,126,253,5,174,2,176,2,251,0,0,0,1,0,80,254,30,4,72,4,95,0,35,0,0,1,6,22,21,20,4, + 35,34,36,39,53,51,21,30,1,51,50,54,53,52,38,55,19,54,35,34,7,3,35,19,51,7,36,51,50,7,3,168,31,191,254,190,210,176,254,216, + 12,187,7,159,148,149,183,199,36,90,25,104,145,252,57,190,100,189,23,1,82,143,212,24,1,153,141,182,176,189,203,159,172,89,80,91,121,129,131,132, + 232,184,1,102,174,174,253,227,3,80,176,176,176,0,0,0,0,2,0,127,255,235,4,148,6,117,0,9,0,46,0,0,1,54,7,4,7,3,6,51, + 32,63,1,6,7,6,35,32,27,1,54,37,19,14,1,35,34,63,1,51,7,6,51,50,55,54,51,50,29,1,35,53,38,15,1,19,55,36,3,3, + 170,27,249,254,212,39,69,27,158,1,139,32,194,24,219,219,172,254,156,57,57,32,1,133,4,90,133,46,164,2,10,196,10,10,73,66,202,209,97,161, + 117,2,121,164,7,104,1,36,52,3,81,180,24,32,202,254,40,188,215,12,160,100,99,1,142,1,127,225,90,1,101,20,21,126,136,80,65,52,53,71, + 120,61,37,19,39,254,148,9,27,254,131,0,0,1,0,105,254,30,4,75,4,95,0,17,0,0,1,35,3,19,54,35,34,5,3,35,19,51,7,36, + 51,50,7,3,4,52,209,82,104,25,105,135,254,209,70,196,117,191,25,1,126,143,210,24,117,254,30,2,102,2,168,174,174,253,131,3,176,176,176,176, + 252,213,0,0,0,1,0,80,254,29,6,229,4,95,0,28,0,0,1,35,3,19,54,35,34,5,3,35,19,51,7,36,51,50,7,36,51,50,7,3, + 35,19,54,35,34,5,3,4,18,203,85,108,25,104,146,254,226,81,190,116,192,20,1,120,141,202,23,1,108,147,213,23,158,193,137,25,111,145,254,236, + 107,254,29,2,103,2,168,174,174,252,212,4,95,176,176,176,176,176,252,81,3,44,174,174,253,88,0,0,0,2,0,0,255,239,4,154,6,135,0,11, + 0,36,0,0,1,54,35,34,5,3,6,55,50,55,54,55,23,6,5,4,35,34,55,27,1,35,34,39,53,51,21,22,59,1,55,51,3,36,51,50, + 7,3,201,25,105,144,254,217,79,21,95,212,123,107,20,191,39,254,205,254,248,136,211,24,106,104,182,176,17,198,9,106,87,15,176,122,1,123,144,211, + 25,3,43,174,174,253,206,134,1,56,66,126,3,247,66,65,175,2,214,1,68,230,233,253,107,54,254,89,177,177,0,0,0,2,0,108,0,0,7,52, + 4,95,0,9,0,34,0,0,1,54,35,34,5,3,6,51,22,37,1,36,51,50,7,3,35,19,54,35,34,5,3,35,55,4,35,34,55,19,51,7, + 36,51,50,3,169,28,101,143,254,187,82,26,114,141,1,59,1,39,1,105,142,212,24,155,190,135,24,104,144,254,236,130,184,30,254,123,171,218,36,144, + 191,27,1,153,143,214,3,44,174,178,254,10,174,2,176,2,125,176,176,252,81,3,44,174,174,252,212,200,200,175,3,176,180,180,0,0,0,1,0,142, + 0,0,4,87,4,95,0,15,0,0,33,35,19,54,35,34,5,3,35,19,51,7,36,51,50,7,3,190,191,136,25,104,147,254,220,53,190,94,192,23, + 1,129,137,216,32,3,44,174,174,254,145,2,162,176,176,192,0,2,0,104,254,30,4,115,6,135,0,9,0,26,0,0,1,54,35,34,5,3,6,51, + 50,37,23,19,35,3,4,35,34,55,19,3,51,19,7,36,51,50,7,3,161,31,111,144,254,199,78,24,113,175,1,22,170,109,205,93,254,138,172,211, + 24,144,73,211,52,29,1,146,141,211,24,3,44,174,174,253,245,174,191,157,253,137,2,145,192,175,3,227,2,6,253,239,199,176,176,0,0,2,0,80, + 0,0,7,57,4,95,0,9,0,34,0,0,1,54,35,34,5,3,6,51,50,37,19,35,55,4,35,34,55,19,54,35,6,5,3,35,19,51,7,36, + 51,50,7,36,51,54,7,6,101,25,111,130,254,180,78,26,109,136,1,73,144,193,28,254,121,187,183,24,91,25,102,121,254,184,95,191,136,193,25,1, + 144,142,200,23,1,150,176,194,30,3,44,174,157,253,245,174,174,254,206,191,191,175,2,125,174,2,172,252,212,4,95,176,176,179,179,1,177,0,0,0, + 0,2,0,109,255,239,4,195,6,135,0,9,0,41,0,0,1,4,7,3,6,51,50,55,54,55,1,3,6,7,6,7,36,55,19,54,37,3,38,35, + 34,6,35,34,61,1,51,21,20,51,50,54,51,50,23,19,51,21,3,162,253,239,20,69,29,182,115,121,120,13,1,31,99,24,192,187,210,254,183,29, + 86,25,2,207,38,20,74,93,213,122,129,195,55,83,178,114,172,35,49,88,3,219,45,131,254,27,245,59,61,109,2,164,253,59,160,64,64,6,6,251, + 2,93,166,107,1,1,114,129,149,162,119,63,124,192,254,211,134,0,0,0,0,1,0,80,0,0,4,91,6,135,0,27,0,0,33,35,19,54,35,34, + 5,3,35,19,39,16,33,32,23,21,35,53,38,35,34,21,19,7,36,51,54,7,3,182,192,147,24,105,144,254,218,115,191,153,34,1,160,1,133,2, + 188,2,173,254,32,17,1,126,142,219,32,3,44,174,174,252,212,4,56,211,1,124,161,123,97,65,163,254,185,116,176,1,177,0,0,0,0,1,0,104, + 0,0,7,25,4,95,0,26,0,0,37,4,35,34,55,19,51,3,6,51,50,37,19,51,3,6,51,50,37,19,51,3,35,55,4,35,34,3,44,254, + 146,156,210,24,166,190,147,26,114,157,1,7,135,192,138,21,92,157,1,26,105,192,147,193,25,254,128,138,190,175,175,175,3,176,252,211,174,174,3,45, + 252,211,174,174,3,45,251,161,175,175,0,0,0,1,0,104,0,0,4,114,4,95,0,15,0,0,37,4,35,34,55,19,51,3,6,51,50,37,19,51, + 3,35,3,44,254,146,156,210,24,154,192,137,26,114,157,1,17,115,192,156,194,175,175,175,3,176,252,211,174,174,3,45,251,161,0,0,0,1,0,142, + 254,30,6,35,6,135,0,30,0,0,1,35,3,55,4,35,34,55,19,4,35,34,55,19,51,3,6,51,50,55,51,3,6,51,50,37,19,3,51,19, + 3,6,2,210,76,15,254,189,144,202,28,66,254,236,127,169,22,92,206,78,30,116,50,214,190,81,13,66,127,1,23,105,122,204,104,127,254,30,2,24, + 78,132,193,1,186,136,151,1,215,254,186,143,115,253,227,94,121,2,220,2,174,253,39,252,142,0,0,0,0,1,0,104,0,0,7,11,6,135,0,29, + 0,0,1,19,3,51,19,7,36,51,50,7,3,35,19,54,35,34,5,3,35,55,4,35,34,55,19,51,3,6,51,50,3,53,109,84,205,64,12,1, + 114,141,213,24,156,190,135,24,104,144,254,230,115,192,23,254,156,156,210,24,152,195,138,26,114,157,1,50,3,0,2,85,253,161,121,176,176,252,81,3, + 44,174,174,252,212,175,175,175,3,176,252,211,174,0,0,0,0,1,0,104,0,0,4,93,6,135,0,17,0,0,19,3,51,19,3,6,51,50,37,19, + 51,3,35,55,4,35,34,55,237,77,220,55,112,26,104,157,1,7,94,202,136,202,23,254,156,156,210,24,4,97,2,38,253,215,252,212,174,174,3,45, + 251,161,175,175,175,0,0,0,0,2,0,102,254,30,4,74,4,95,0,7,0,28,0,0,1,54,35,34,5,3,36,55,23,6,5,6,22,51,50,55, + 23,6,33,32,2,27,1,51,7,36,51,54,3,3,136,27,106,143,254,217,101,1,252,23,188,33,253,68,27,117,152,142,206,99,194,254,224,254,250,165, + 50,138,189,21,1,120,145,214,45,3,43,174,174,253,57,75,158,27,236,70,155,198,186,133,182,1,70,1,52,3,199,177,177,1,254,203,0,1,0,104, + 254,30,7,19,5,74,0,29,0,0,37,4,35,34,55,4,35,34,55,19,51,3,6,51,50,37,19,51,3,6,51,50,37,19,39,51,19,3,19,35, + 5,222,254,128,138,200,22,254,156,156,210,24,164,192,147,26,114,157,1,7,135,192,138,21,92,157,1,26,104,36,203,20,120,109,208,175,175,175,175,175, + 3,176,252,211,174,174,3,45,252,211,174,174,3,44,236,254,231,252,105,253,132,0,0,0,0,3,0,123,254,30,7,34,4,95,0,9,0,19,0,45, + 0,0,1,54,7,38,5,3,6,51,50,37,1,54,35,6,5,3,6,23,50,37,19,35,55,4,35,39,7,19,35,3,55,4,33,34,27,1,51,7, + 36,51,50,7,36,51,50,3,3,157,14,111,158,254,231,71,26,112,175,1,10,3,21,25,125,89,254,175,72,24,141,149,1,3,149,183,26,254,214,150, + 116,9,85,206,64,26,254,253,254,241,212,44,116,191,24,1,83,212,192,24,1,80,215,195,45,3,109,110,2,1,176,254,7,173,174,1,250,175,1,175, + 254,6,174,1,175,254,207,175,175,45,59,254,44,1,204,197,175,1,49,3,46,177,177,177,177,254,205,0,0,1,0,100,254,30,6,69,6,135,0,23, + 0,0,37,19,35,3,19,5,7,35,19,51,3,37,19,3,51,19,3,37,55,51,3,35,19,5,3,109,103,206,81,54,254,90,29,196,123,199,79,1, + 166,66,85,194,69,51,1,160,28,203,123,204,80,254,92,111,253,175,2,82,1,132,123,237,3,111,253,248,134,1,187,2,83,253,123,254,171,120,192,252, + 159,2,28,126,0,1,0,80,0,0,4,92,4,95,0,15,0,0,1,36,51,50,7,3,35,19,54,35,34,5,3,35,19,51,1,150,1,123,142,213, + 24,155,201,135,24,94,144,254,217,113,193,158,191,3,175,176,176,252,81,3,44,174,174,252,212,4,95,0,0,1,0,104,254,30,4,114,4,96,0,16, + 0,0,37,4,35,34,55,19,51,3,6,51,50,55,19,51,3,19,35,3,14,254,175,155,210,24,148,190,129,26,114,157,243,136,201,156,131,218,175,175, + 175,3,176,252,211,174,174,3,46,252,64,253,126,0,0,0,0,1,0,104,254,30,4,104,4,95,0,22,0,0,37,4,35,34,55,19,51,3,6,51, + 50,37,19,51,3,2,0,33,35,53,51,50,36,3,31,254,156,153,210,24,152,194,137,26,114,157,1,17,105,192,114,59,254,46,254,219,85,73,231,1, + 89,165,165,175,3,176,252,211,174,174,3,45,252,145,254,87,254,215,139,223,0,1,0,80,254,30,4,84,6,135,0,19,0,0,1,3,19,35,3,19, + 3,51,19,7,36,51,50,7,3,35,19,54,35,34,1,124,106,99,218,75,151,74,196,61,15,1,123,141,213,24,139,189,116,24,104,144,3,44,253,26, + 253,216,2,21,4,56,2,28,253,179,139,176,176,252,81,3,44,174,0,0,0,1,0,86,254,30,4,65,4,96,0,25,0,0,1,50,55,23,6,35, + 6,0,55,19,51,7,36,51,50,11,1,35,19,54,35,34,5,3,6,22,2,91,119,203,88,208,218,251,254,226,36,146,189,27,1,40,230,212,43,130, + 190,126,25,163,115,254,247,101,30,161,254,157,173,122,178,2,1,51,246,4,27,177,176,254,205,253,26,2,230,174,174,253,25,206,218,0,0,2,0,122, + 255,238,4,197,6,135,0,7,0,21,0,0,1,4,7,3,6,51,32,55,1,35,3,2,5,32,27,1,18,37,3,51,19,51,3,150,253,252,24,67, + 31,205,1,56,25,1,143,105,100,44,253,219,254,169,42,62,39,2,194,106,210,75,112,3,240,39,181,254,50,214,178,2,183,253,92,254,230,45,1,88, + 1,186,1,27,67,2,41,253,217,0,0,0,0,1,0,80,254,30,6,246,4,96,0,28,0,0,33,19,54,35,34,5,3,19,35,3,19,51,7,36, + 51,50,7,36,51,50,7,3,35,19,54,35,34,5,3,2,244,115,27,95,145,254,224,96,92,218,68,136,192,20,1,117,144,201,22,1,105,150,209,22, + 155,194,137,27,113,144,254,235,116,3,44,174,174,252,245,253,253,1,226,4,96,177,177,177,177,177,252,81,3,44,174,174,252,212,0,0,0,1,0,60, + 254,30,4,92,4,95,0,32,0,0,1,35,19,54,35,34,5,3,54,23,32,17,16,37,6,39,55,22,51,32,17,38,33,34,7,35,19,51,7,36, + 23,54,3,4,34,192,41,21,103,144,254,220,93,234,151,1,179,253,180,233,235,30,221,229,1,160,7,254,216,179,197,197,157,198,29,1,44,223,208,42, + 2,35,1,8,174,177,253,151,115,1,254,141,254,94,2,1,81,190,122,1,20,223,110,4,40,177,178,1,1,254,203,0,0,1,0,96,254,30,4,97, + 4,95,0,14,0,0,1,4,27,1,51,3,32,55,19,51,3,2,5,2,33,2,200,253,56,96,148,190,139,2,5,33,84,192,94,36,253,57,55,1, + 231,254,30,1,2,67,3,255,252,37,240,2,235,252,211,254,255,29,254,139,0,1,0,70,254,30,4,96,4,137,0,30,0,0,1,22,23,36,19,4, + 35,32,47,1,51,23,22,51,32,55,51,2,1,22,23,7,36,39,6,19,35,18,37,38,39,1,82,36,119,1,173,1,254,203,242,254,232,16,6,216, + 8,6,161,1,97,145,161,21,253,245,214,176,59,254,255,185,203,34,194,2,1,20,155,44,2,131,171,216,220,1,210,100,237,82,109,81,148,253,114,254, + 190,174,60,137,122,176,190,254,150,1,215,191,203,248,0,0,0,1,0,80,0,0,7,0,4,95,0,27,0,0,33,35,55,4,35,34,27,1,54,35, + 34,5,3,35,19,51,7,36,51,50,7,3,6,51,50,37,19,51,6,120,194,24,254,150,159,202,44,73,23,107,131,254,224,102,195,142,191,22,1,32, + 228,208,25,90,24,103,105,1,67,94,191,175,175,1,50,1,249,174,174,252,214,4,94,177,177,177,253,132,174,174,3,45,0,1,0,100,254,30,4,91, + 6,135,0,23,0,0,1,54,35,34,5,3,1,35,1,19,18,33,51,21,35,34,7,3,36,55,22,7,3,35,3,136,27,105,124,254,198,93,2,2, + 246,254,49,179,42,1,112,174,234,145,27,50,1,120,154,203,25,94,192,3,44,174,170,253,127,253,111,2,102,4,192,1,67,138,185,254,120,163,1,2, + 175,253,224,0,0,1,0,122,0,0,4,78,5,2,0,24,0,0,1,2,33,32,27,1,51,3,6,51,32,55,19,54,4,55,53,51,21,6,55,54, + 51,50,7,3,255,44,253,172,254,209,42,35,203,38,26,197,1,56,27,79,22,253,124,1,208,2,134,133,134,241,36,1,50,254,206,1,50,1,8,254, + 247,173,185,2,50,154,194,231,212,164,118,59,60,252,0,0,0,1,0,124,254,30,4,109,6,135,0,19,0,0,37,19,35,3,55,4,35,34,27,1, + 51,3,6,51,22,37,19,3,51,19,3,227,110,220,79,2,254,144,155,205,44,138,190,140,23,135,104,1,42,115,78,211,59,132,253,154,2,37,108,175, + 1,49,3,46,252,210,173,2,175,3,33,2,53,253,205,0,0,1,0,104,254,30,4,210,4,95,0,19,0,0,37,35,55,7,19,35,3,6,35,34, + 55,19,51,3,6,51,50,37,19,51,4,69,189,8,212,109,203,74,197,64,191,24,144,194,134,20,143,127,1,114,111,195,70,95,69,253,190,2,21,51, + 175,3,176,252,180,143,153,3,66,0,0,0,0,2,0,122,255,239,6,187,6,136,0,7,0,37,0,0,1,4,7,3,6,51,32,55,5,35,19,54, + 7,5,3,2,33,32,27,1,54,37,17,2,33,4,23,21,35,53,38,7,34,23,17,37,32,3,3,149,253,254,26,66,24,171,1,71,28,3,23,189, + 115,28,101,254,159,102,41,253,185,254,214,42,73,28,2,196,2,1,141,1,87,1,202,1,169,192,2,1,94,1,51,42,3,217,43,189,254,48,178,178, + 179,2,189,202,9,21,253,74,254,206,1,50,2,25,193,57,1,82,1,2,2,190,77,63,91,1,150,254,186,39,254,224,0,2,0,113,255,227,4,187, + 3,11,0,11,0,23,0,36,64,10,25,69,9,18,15,3,18,21,69,24,16,252,236,212,236,236,49,0,64,8,0,185,12,6,185,18,140,24,16,244, + 236,212,236,48,1,34,6,21,20,22,51,50,54,53,52,38,39,50,4,21,20,4,35,34,36,53,52,36,2,150,153,183,183,153,153,183,183,153,249,1, + 44,254,212,249,249,254,212,1,44,2,103,125,115,115,125,125,115,115,125,164,211,193,193,211,211,193,193,211,0,3,0,115,255,227,6,167,5,240,0,19, + 0,31,0,43,0,50,64,13,45,16,33,20,25,10,145,32,21,25,0,16,44,16,252,236,50,244,236,50,236,49,0,64,14,21,149,32,173,26,149,15, + 38,149,5,145,15,140,44,16,228,244,236,16,236,244,236,48,19,52,18,54,36,51,50,4,22,18,21,20,2,6,4,35,34,36,38,2,37,33,22,23, + 30,1,51,50,55,54,55,54,37,33,38,39,46,1,35,34,7,6,7,6,115,126,212,1,38,162,162,1,38,212,126,126,212,254,218,162,162,254,218,212, + 126,5,89,251,129,27,138,78,214,119,119,107,216,93,30,251,140,4,126,26,138,78,214,119,119,107,216,93,30,2,234,157,1,30,209,122,122,209,254,226, + 157,158,254,226,209,122,122,209,1,30,73,202,145,83,96,48,97,228,74,249,201,146,82,96,48,97,229,73,0,5,0,115,255,227,6,167,5,240,0,19, + 0,24,0,29,0,34,0,39,0,73,64,21,26,34,149,24,36,36,30,35,41,16,30,25,25,10,145,35,20,25,0,16,40,16,252,236,50,244,236,50, + 236,17,18,57,47,60,236,50,49,0,64,18,26,20,149,34,35,173,27,23,149,15,33,37,149,5,145,15,140,40,16,228,244,236,50,16,236,50,244,60, + 236,50,48,19,52,18,54,36,51,50,4,22,18,21,20,2,6,4,35,34,36,38,2,55,22,0,23,17,41,1,17,54,0,19,38,0,39,17,41,1, + 17,6,0,115,126,212,1,38,162,162,1,38,212,126,126,212,254,218,162,162,254,218,212,126,219,26,1,11,181,2,164,254,38,181,1,11,26,26,254,245, + 181,253,92,1,218,181,254,245,2,234,157,1,30,209,122,122,209,254,226,157,158,254,226,209,122,122,209,1,30,73,201,254,230,33,2,4,253,251,33,1, + 26,1,116,201,1,26,33,253,252,2,4,33,254,230,0,0,0,2,0,64,0,0,5,53,5,213,0,10,0,13,0,99,64,13,3,0,12,149,1,129, + 6,9,3,5,0,9,14,16,220,196,212,196,49,0,47,60,244,236,57,57,48,64,21,13,17,0,6,0,6,17,5,13,5,12,17,3,8,3,8,17, + 9,10,9,66,75,83,88,7,16,1,237,7,16,1,237,7,16,1,237,7,16,1,237,64,20,11,9,12,13,5,10,9,12,0,6,7,0,6,8,3, + 4,3,8,13,5,15,15,15,15,89,34,19,53,33,21,9,1,35,9,1,35,1,55,1,33,118,4,149,254,40,2,2,240,254,118,254,117,240,2,2, + 121,1,84,253,87,5,43,170,154,253,127,253,70,2,23,253,233,2,186,163,1,206,0,0,0,2,0,67,0,0,5,56,5,213,0,10,0,13,0,99, + 64,13,3,0,12,149,7,5,129,2,0,7,3,5,14,16,220,196,212,196,49,0,47,228,50,236,57,57,48,64,21,13,17,0,6,0,6,17,5,13, + 5,12,17,3,8,3,8,17,9,10,9,66,75,83,88,7,16,1,237,7,16,1,237,7,16,1,237,7,16,1,237,64,20,11,9,12,13,5,10,9, + 12,0,6,7,0,6,8,3,4,3,8,13,5,15,15,15,15,89,34,37,21,33,53,9,1,51,9,1,51,1,7,1,33,5,14,251,107,1,204,253, + 254,240,1,139,1,138,240,253,254,120,254,171,2,169,154,154,170,2,113,2,186,253,233,2,23,253,70,163,254,50,0,0,0,3,0,64,0,0,4,213, + 5,213,0,2,0,5,0,15,0,106,64,17,12,15,1,149,13,129,10,7,3,149,9,17,15,7,10,12,16,16,220,60,212,60,204,49,0,47,236,57, + 57,244,236,57,57,48,64,21,0,17,15,3,15,1,17,12,4,12,4,17,7,1,7,3,17,10,0,10,66,75,83,88,7,16,1,237,7,16,1,237, + 7,16,1,237,7,16,1,237,64,20,2,1,7,10,0,6,1,7,15,3,5,3,15,4,12,11,12,4,10,0,15,15,15,15,89,34,1,33,9,1, + 33,1,55,1,21,33,53,9,1,53,33,21,3,217,253,87,1,88,254,180,2,169,254,168,119,1,209,251,107,1,209,254,47,4,149,5,43,254,87,253, + 40,1,169,150,253,193,170,160,2,76,2,63,170,160,0,0,0,3,0,150,0,0,3,232,5,213,0,3,0,7,0,11,0,35,64,17,3,7,0,8, + 4,145,11,1,28,0,9,28,8,5,28,4,12,16,220,252,220,252,220,236,49,0,47,244,60,60,204,50,48,1,51,21,35,1,51,21,35,1,51,17, + 35,3,28,204,204,253,122,204,204,1,68,202,202,5,213,255,0,255,255,0,255,250,43,0,255,255,0,16,0,0,5,104,5,213,16,6,3,48,0,0, + 255,255,0,16,0,0,5,104,5,213,16,6,0,57,0,0,255,255,0,201,0,0,4,139,5,213,16,6,0,40,0,0,255,255,0,131,0,0,4,69, + 5,213,16,6,1,80,0,0,0,5,0,150,255,227,4,224,5,240,0,11,0,23,0,35,0,47,0,51,0,72,64,16,53,69,49,3,27,18,21,45, + 48,9,33,18,15,39,69,52,16,252,60,236,50,196,212,60,236,50,196,236,49,0,64,22,51,185,48,48,42,12,0,185,12,6,185,18,145,52,30,185, + 42,24,185,36,140,52,16,244,236,212,236,16,244,236,212,236,17,18,57,47,236,48,1,50,54,53,52,38,35,34,6,21,20,22,23,34,36,53,52,36, + 51,50,4,21,20,4,3,50,54,53,52,38,35,34,6,21,20,22,23,34,36,53,52,36,51,50,4,21,20,4,1,33,21,33,2,187,153,185,185,153, + 153,185,185,153,249,254,212,1,44,249,249,1,44,254,212,249,153,185,185,153,153,185,185,153,249,254,212,1,44,249,249,1,44,254,212,253,55,3,160,252, + 96,4,115,57,52,52,56,56,52,52,57,164,142,131,130,142,142,130,131,142,252,184,57,52,52,56,56,52,52,57,164,142,131,130,142,142,130,131,142,3, + 92,170,0,0,0,1,0,219,0,0,6,125,5,213,0,19,0,58,64,13,5,9,12,3,28,7,13,2,28,0,16,18,20,16,220,204,50,236,50,220, + 236,50,204,50,49,0,64,16,7,18,149,0,13,149,2,173,0,4,145,17,8,149,11,15,47,60,236,50,228,50,244,236,16,236,50,48,19,33,17,33, + 17,33,21,33,17,33,21,33,17,33,17,33,53,33,17,33,219,2,11,1,139,2,11,254,191,1,65,253,245,254,117,253,245,1,65,254,191,5,213,253, + 156,2,100,170,251,127,170,2,199,253,57,170,4,129,0,0,0,2,0,92,0,0,5,82,5,213,0,8,0,11,0,84,64,16,11,149,2,129,7,0, + 10,2,4,6,0,11,28,2,4,12,16,244,236,50,212,196,17,57,49,0,47,60,244,236,48,64,25,5,17,0,4,8,7,8,9,17,0,4,0,7, + 17,6,5,6,5,8,10,17,4,0,4,66,75,83,88,7,16,5,237,60,60,7,16,5,237,0,7,16,4,237,7,16,8,237,89,34,33,35,17,33, + 21,9,1,35,1,5,1,33,1,38,202,4,172,254,30,2,44,239,254,80,254,115,2,230,253,26,5,213,154,253,118,253,79,2,23,211,3,231,0,0, + 0,3,0,150,0,0,3,126,5,213,0,3,0,7,0,11,0,45,64,19,11,149,8,175,7,3,149,0,173,4,149,7,1,0,9,5,8,4,12,16, + 220,60,204,50,220,204,180,63,13,63,1,2,93,49,0,47,236,252,236,16,252,236,48,1,51,21,35,1,51,21,35,17,51,21,35,2,128,254,254,254, + 22,254,254,254,254,3,81,205,254,73,205,5,213,205,0,0,0,2,0,92,0,0,5,82,5,213,0,8,0,11,0,84,64,16,0,6,129,11,149,5, + 11,6,4,1,7,10,28,6,4,12,16,244,236,50,212,196,17,57,49,0,47,236,244,60,48,64,25,2,17,7,3,8,0,8,9,17,7,3,7,0, + 17,1,2,1,2,8,11,17,3,7,3,66,75,83,88,7,16,5,237,60,60,7,16,5,237,0,7,16,4,237,7,16,8,237,89,34,1,51,9,1, + 21,33,17,51,1,37,17,33,4,99,239,253,212,1,226,251,84,202,1,141,254,115,2,230,5,213,253,79,253,118,154,5,213,253,233,211,252,25,0,0, + 0,3,0,115,255,227,6,167,5,240,0,19,0,31,0,43,0,55,64,17,32,149,27,27,20,38,45,16,38,25,10,145,20,25,0,16,44,16,252,236, + 244,236,236,17,18,57,47,236,49,0,64,12,26,33,149,15,27,32,149,5,145,15,140,44,16,228,244,236,50,16,236,50,48,19,52,18,54,36,51,50, + 4,22,18,21,20,2,6,4,35,34,36,38,2,55,20,23,22,23,22,23,17,6,7,14,1,1,17,54,55,62,1,53,52,39,38,39,38,115,126,212, + 1,38,162,162,1,38,212,126,126,212,254,218,162,162,254,218,212,126,213,46,93,216,61,64,181,129,78,92,2,170,181,129,78,92,46,93,216,61,2,234, + 157,1,30,209,122,122,209,254,226,157,158,254,226,209,122,122,209,1,30,158,125,113,228,97,27,12,4,179,33,136,83,225,1,221,251,77,33,137,82,225, + 125,124,112,229,97,27,0,0,0,3,0,115,255,149,6,167,6,63,0,25,0,35,0,45,0,110,64,30,22,46,21,23,0,26,10,8,13,28,29,39, + 38,7,20,6,26,36,9,47,16,36,25,13,145,26,25,0,16,46,16,252,236,244,236,236,196,17,18,23,57,18,57,57,17,18,57,57,17,57,49,0, + 64,30,7,9,5,31,22,46,28,29,39,38,4,31,20,18,10,23,31,41,21,10,41,149,18,31,149,5,145,18,140,46,16,228,244,236,16,236,47,196, + 17,18,57,57,18,57,18,23,57,18,57,17,18,57,57,48,19,52,18,54,36,51,50,23,55,23,7,22,18,21,20,2,6,4,35,34,39,7,39,55, + 38,2,55,20,23,1,38,35,34,14,2,5,52,39,1,22,51,50,62,2,115,126,212,1,38,162,227,196,160,130,157,110,128,126,212,254,218,162,228,196, + 160,129,156,110,127,213,145,2,234,143,167,119,214,156,92,4,138,145,253,21,144,167,119,214,156,92,2,234,157,1,30,209,122,118,196,105,194,106,254,222, + 157,158,254,226,209,122,119,197,107,193,106,1,33,158,230,174,3,152,94,96,165,225,124,229,175,252,103,94,96,165,225,0,0,4,0,150,0,0,1,148, + 5,213,0,3,0,7,0,11,0,15,0,46,64,23,7,149,4,3,149,0,8,149,11,12,149,0,175,15,13,9,5,1,12,8,4,0,16,16,220,60, + 60,60,204,50,50,50,49,0,47,228,236,220,236,16,236,220,236,48,19,51,21,35,21,51,21,35,21,51,21,35,21,51,21,35,150,254,254,254,254,254, + 254,254,254,5,213,205,223,205,225,205,225,205,0,1,0,41,0,0,4,225,5,213,0,7,0,58,64,9,7,175,1,5,9,7,1,5,8,16,220,220, + 196,204,49,0,47,60,228,48,64,20,3,17,0,7,4,2,17,1,0,1,0,3,7,17,6,4,17,5,6,5,7,1,16,237,16,237,50,50,7,16, + 237,8,16,237,9,1,35,9,1,35,1,51,2,178,2,46,232,254,93,254,186,230,3,127,232,2,186,253,70,2,30,253,226,5,213,0,0,1,0,201, + 0,0,5,59,5,213,0,11,0,45,64,13,13,4,3,28,6,2,28,11,7,28,10,4,12,16,252,252,220,252,220,252,252,49,0,64,10,0,145,5, + 7,149,2,11,173,9,5,47,60,244,60,236,16,228,48,1,51,17,33,17,35,17,33,17,35,17,33,2,157,202,1,212,202,253,34,202,1,212,5,213, + 253,156,252,143,2,199,253,57,3,113,0,0,0,1,0,62,0,0,5,60,5,213,0,14,0,129,64,12,3,28,4,4,7,0,15,7,9,0,13,15, + 16,212,196,220,196,196,17,18,57,47,236,49,180,128,0,127,13,2,93,0,64,6,6,3,0,175,12,9,47,60,236,50,50,48,75,176,66,80,88,64, + 20,10,17,9,8,9,12,17,13,14,13,6,17,7,8,7,1,17,0,14,0,5,7,16,236,7,16,236,7,16,236,7,16,236,64,15,8,1,9,12, + 7,11,12,7,10,0,14,13,6,0,10,15,15,15,64,10,5,17,8,8,7,2,17,14,0,14,7,0,16,237,7,0,16,237,89,19,51,1,17,51, + 17,1,51,9,1,35,9,1,35,1,130,218,1,19,202,1,11,216,254,32,2,0,216,254,92,254,88,218,2,22,5,213,254,100,1,156,254,115,1,141, + 253,51,252,248,2,123,253,133,3,29,0,0,0,4,0,150,0,0,3,162,5,213,0,3,0,7,0,11,0,15,0,49,64,20,15,7,149,12,4,175, + 8,0,149,11,3,5,1,4,0,13,9,12,8,16,16,220,60,204,50,220,60,204,50,180,63,5,63,1,2,93,49,0,47,60,236,50,244,60,236,50, + 48,37,51,21,35,17,51,21,35,1,51,21,35,17,51,21,35,2,164,254,254,254,254,253,242,254,254,254,254,205,205,5,213,205,251,197,205,5,213,205, + 0,2,0,92,0,0,5,8,5,213,0,2,0,9,0,55,64,16,2,149,5,129,8,149,4,1,5,9,6,0,28,5,4,10,16,244,236,212,196,17, + 57,49,0,47,236,244,236,48,64,9,0,17,8,1,17,7,8,7,66,75,83,88,7,16,5,237,4,16,237,89,34,9,1,33,1,33,17,33,21,1, + 33,1,38,2,230,253,26,3,226,251,84,4,172,252,156,3,100,1,68,3,231,250,213,5,213,154,251,111,0,3,0,150,2,104,4,146,3,104,0,3, + 0,7,0,11,0,36,64,17,3,7,11,0,4,8,13,1,28,0,5,28,4,9,28,8,12,16,220,236,220,236,220,236,204,49,0,47,60,60,204,50, + 50,48,1,51,17,35,1,51,17,35,1,51,17,35,3,198,204,204,254,104,204,204,254,104,204,204,3,104,255,0,1,0,255,0,1,0,255,0,0,0, + 255,255,0,201,0,0,4,139,5,213,16,6,3,55,0,0,0,1,0,111,0,0,3,150,5,213,0,11,0,33,64,16,11,3,149,0,175,4,8,149, + 7,5,1,3,28,0,8,9,47,204,50,252,204,50,49,0,47,236,50,244,236,50,48,19,33,21,33,17,33,21,33,53,33,17,33,111,3,38,254,211, + 1,46,252,218,1,45,254,210,5,213,170,251,127,170,170,4,129,0,0,0,0,1,0,111,255,226,7,49,5,240,0,47,0,44,64,22,15,33,149,20, + 28,145,9,39,149,44,4,140,48,49,30,42,36,25,12,18,6,48,16,204,50,220,236,220,50,204,49,0,16,228,50,236,50,244,60,236,50,48,1,6, + 7,6,33,34,39,53,22,51,32,0,17,16,0,33,34,7,53,54,51,32,23,22,23,54,55,54,33,50,23,21,38,35,32,0,17,16,0,33,50,55, + 21,6,35,32,39,38,3,208,37,52,194,254,172,128,114,109,121,1,0,1,16,254,240,255,0,121,109,114,128,1,79,199,52,37,37,52,194,1,84,128, + 114,109,121,255,0,254,240,1,16,1,0,121,109,114,128,254,178,200,52,1,42,66,54,208,33,175,42,1,58,1,39,1,40,1,56,41,175,32,207,54, + 65,66,54,207,32,175,41,254,200,254,216,254,217,254,198,42,175,33,208,54,0,2,0,111,0,0,5,204,5,213,0,27,0,31,0,80,64,19,11,7, + 9,13,5,28,16,31,4,17,29,1,28,22,26,24,20,0,32,16,212,60,60,204,50,236,50,50,212,60,60,252,60,60,204,50,49,0,64,20,9,28, + 24,149,6,2,27,0,10,29,23,149,13,17,20,4,0,175,15,19,47,60,228,50,220,60,60,236,50,50,16,220,60,60,236,50,50,48,1,51,17,33, + 17,51,17,33,21,33,17,33,21,33,17,35,17,33,17,35,17,33,53,33,17,33,53,33,23,17,33,17,1,145,202,1,146,202,1,21,254,235,1,21, + 254,235,202,254,110,202,254,222,1,34,254,222,1,34,202,1,146,5,213,254,120,1,136,254,120,170,254,142,170,254,121,1,135,254,121,1,135,170,1,114, + 170,170,254,142,1,114,0,0,255,255,0,201,0,0,5,51,5,213,16,6,3,172,0,0,0,1,0,204,0,0,4,136,5,213,0,7,0,28,64,14, + 4,149,1,175,5,149,0,6,2,5,28,0,4,8,16,252,236,196,50,49,0,47,236,252,236,48,51,17,33,21,33,17,33,21,204,3,188,253,14,2, + 242,5,213,170,251,127,170,0,255,255,0,201,0,0,1,147,5,213,16,6,0,44,0,0,0,1,0,111,0,0,5,204,5,213,0,19,0,55,64,12, + 7,3,5,9,1,28,18,14,12,16,0,20,16,47,60,60,204,50,252,60,60,204,50,49,0,64,14,16,5,149,2,19,0,6,15,149,9,12,0,175, + 11,47,228,220,60,236,50,16,220,60,236,50,48,1,51,17,33,21,33,17,33,21,33,17,35,17,33,53,33,17,33,53,33,2,191,202,2,67,253,189, + 2,67,253,189,202,253,176,2,80,253,176,2,80,5,213,254,120,170,254,142,170,254,121,1,135,170,1,114,170,0,0,0,0,2,0,201,0,0,1,149, + 5,213,0,3,0,7,0,55,64,12,7,0,4,175,2,5,1,28,4,0,4,8,16,252,75,176,16,84,88,185,0,0,0,64,56,89,50,236,50,49, + 0,47,236,204,204,48,1,64,13,48,9,64,9,80,9,96,9,143,9,159,9,6,93,55,51,21,35,19,51,17,35,201,204,204,2,202,202,205,205,5, + 213,251,166,0,0,1,0,159,255,227,5,164,5,213,0,28,0,62,64,24,21,15,149,26,4,149,7,145,26,140,29,20,25,21,18,25,7,23,12,25, + 6,0,16,29,16,252,196,236,212,196,236,212,236,49,0,16,228,244,236,16,236,196,48,64,6,4,17,8,9,8,66,75,83,88,7,16,1,237,89,34, + 19,52,18,55,1,33,53,33,21,1,14,1,21,20,22,51,50,54,53,52,39,51,22,21,20,4,33,32,36,159,190,187,2,16,252,164,4,172,253,120, + 183,197,219,201,226,213,203,191,225,254,187,254,185,254,206,254,185,1,195,159,1,4,119,1,78,170,170,254,101,116,228,119,150,164,136,136,179,206,224,161, + 206,230,249,0,0,4,0,99,255,227,4,173,5,240,0,11,0,23,0,35,0,47,0,57,64,14,49,69,3,27,18,21,45,9,33,18,15,39,69,48, + 16,252,60,236,50,212,60,236,50,236,49,0,64,16,0,185,12,6,185,18,145,48,30,185,42,24,185,36,140,48,16,244,236,212,236,16,244,236,212,236, + 48,1,50,54,53,52,38,35,34,6,21,20,22,23,34,36,53,52,36,51,50,4,21,20,4,3,50,54,53,52,38,35,34,6,21,20,22,23,34,36, + 53,52,36,51,50,4,21,20,4,2,136,153,183,183,153,153,183,183,153,249,254,212,1,44,249,249,1,44,254,212,249,153,183,183,153,153,183,183,153,249, + 254,212,1,44,249,249,1,44,254,212,4,26,80,73,73,80,80,73,73,80,164,165,152,151,166,166,151,152,165,253,17,80,73,73,80,80,73,73,80,164, + 166,151,152,165,165,152,151,166,0,2,0,115,255,227,6,167,5,240,0,19,0,39,0,40,64,11,41,16,30,25,10,145,20,25,0,16,40,16,252,236, + 244,236,236,49,0,64,10,25,149,15,35,149,5,145,15,140,40,16,228,244,236,16,236,48,19,52,18,54,36,51,50,4,22,18,21,20,2,6,4,35, + 34,36,38,2,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2,115,126,212,1,38,162,162,1,38,212,126,126,212,254,218,162,162,254,218,212, + 126,213,92,156,214,119,119,214,156,92,92,156,214,119,119,214,156,92,2,234,157,1,30,209,122,122,209,254,226,157,158,254,226,209,122,122,209,1,30,158, + 125,225,165,96,96,165,225,125,124,225,165,96,96,165,225,0,0,2,0,115,255,145,6,167,5,240,0,22,0,44,0,80,64,24,15,14,10,31,32,33, + 30,13,16,6,23,35,14,46,16,35,25,10,145,23,25,0,16,45,16,252,236,244,236,236,196,17,18,23,57,18,57,57,49,0,64,22,15,18,32,31, + 33,30,16,13,6,40,28,15,28,149,18,40,149,5,145,18,140,45,16,228,244,236,16,236,192,17,18,23,57,18,57,48,19,52,18,54,36,51,50,4, + 22,18,21,20,2,7,23,7,39,6,35,34,36,38,2,55,20,30,2,51,50,55,1,55,1,54,53,52,46,2,35,34,14,2,115,126,212,1,38,162, + 162,1,38,212,126,127,108,162,129,167,196,229,162,254,218,212,126,213,92,156,214,119,167,144,254,145,131,1,106,144,92,156,214,119,119,214,156,92,2,234, + 158,1,30,208,122,122,208,254,226,158,158,254,224,105,199,107,202,119,122,208,1,30,158,124,226,164,96,94,1,190,106,254,73,174,229,124,226,164,96,96, + 164,226,0,0,0,1,0,201,0,0,5,59,5,213,0,11,0,45,64,13,13,4,6,28,4,8,28,11,2,28,0,4,12,16,252,252,220,252,220,252, + 252,49,0,64,10,5,1,145,10,11,8,149,3,173,10,47,244,236,50,16,228,50,48,19,17,51,17,33,17,51,17,33,17,35,17,201,202,2,222,202, + 254,44,202,2,100,3,113,253,57,2,199,252,143,253,156,2,100,0,0,0,0,3,0,201,0,0,1,199,5,213,0,3,0,7,0,11,0,40,64,20, + 11,149,8,175,7,3,149,0,173,4,149,7,13,9,1,5,0,4,8,12,16,220,60,60,220,60,60,204,49,0,47,236,252,236,16,252,236,48,19,51, + 21,35,17,51,21,35,17,51,21,35,201,254,254,254,254,254,254,3,81,205,254,73,205,5,213,205,0,0,0,5,0,150,0,0,5,104,5,213,0,3, + 0,7,0,11,0,15,0,19,0,63,64,27,19,1,149,2,16,175,15,11,149,8,173,12,6,149,5,15,3,7,2,6,9,8,13,17,12,16,20,16, + 220,60,204,50,220,204,220,60,204,50,182,63,7,63,3,63,9,3,93,49,0,47,60,236,50,252,236,16,252,60,236,50,48,1,35,53,51,17,35,53, + 51,1,51,21,35,1,51,21,35,17,51,21,35,5,104,254,254,254,254,253,24,254,254,254,22,254,254,254,254,5,8,205,250,43,205,2,132,205,254,73, + 205,5,213,205,0,3,0,115,255,227,6,167,5,240,0,19,0,39,0,43,0,62,64,16,45,16,10,41,40,40,20,30,25,10,145,20,25,0,16,44, + 16,252,236,244,236,17,57,47,204,16,236,178,47,41,1,93,49,0,64,14,43,206,40,173,25,149,15,35,149,5,145,15,140,44,16,228,244,236,16,236, + 244,236,48,1,19,52,18,54,36,51,50,4,22,18,21,20,2,6,4,35,34,36,38,2,55,20,30,2,51,50,62,2,53,52,46,2,35,34,14,2, + 5,51,21,35,115,126,212,1,38,162,162,1,38,212,126,126,212,254,218,162,162,254,218,212,126,213,92,156,214,119,119,214,156,92,92,156,214,119,119,214, + 156,92,1,198,254,254,2,234,157,1,30,209,122,122,209,254,226,157,158,254,226,209,122,122,209,1,30,158,125,225,165,96,96,165,225,125,124,225,165,96, + 96,165,225,21,205,0,0,0,0,2,0,115,255,228,6,167,6,62,0,22,0,44,0,80,64,24,9,8,13,37,36,35,38,10,7,6,23,33,8,46, + 16,33,25,13,145,23,25,0,16,45,16,252,236,244,236,236,196,17,18,23,57,18,57,57,49,0,64,22,8,5,10,7,35,38,36,37,6,40,28,8, + 28,149,18,40,149,5,145,18,140,45,16,228,244,236,16,236,196,17,18,23,57,18,57,48,19,52,18,54,36,51,50,23,55,23,7,22,18,21,20,2, + 6,4,35,34,36,38,2,55,20,30,2,51,50,62,2,53,52,39,1,39,1,38,35,34,14,2,115,126,212,1,38,162,228,196,160,131,158,110,127,126, + 212,254,218,162,162,254,218,212,126,213,92,156,214,119,119,214,156,92,144,254,148,130,1,112,144,167,119,214,156,92,2,234,158,1,30,208,122,118,196,105, + 194,107,254,224,158,158,254,226,208,122,122,208,1,30,158,124,226,164,96,96,164,226,124,229,174,254,63,108,1,198,94,96,164,226,0,0,0,3,0,115, + 255,227,5,114,5,239,0,37,0,49,0,61,0,71,64,16,56,38,25,14,24,30,8,25,44,50,48,19,25,0,16,62,16,252,236,244,60,236,50,220, + 60,236,50,49,0,64,23,47,149,27,59,149,11,53,11,27,41,4,22,16,22,149,35,16,149,3,145,35,140,62,16,228,244,236,16,236,17,18,23,57, + 47,236,47,236,48,19,16,0,33,32,23,30,1,21,20,6,35,34,38,53,52,55,32,0,17,16,0,33,38,53,52,54,51,50,22,21,20,6,7,6, + 33,32,0,5,20,22,51,50,54,53,52,38,35,34,6,19,52,38,35,34,6,21,20,22,51,50,54,115,1,134,1,83,1,147,95,32,20,153,133,132, + 153,24,254,254,254,251,1,5,1,2,24,153,132,133,153,20,32,95,254,109,254,173,254,122,3,153,44,28,28,44,44,28,28,44,144,44,28,28,44,44, + 28,28,44,2,233,1,103,1,159,115,39,79,59,129,145,145,129,72,54,254,190,254,226,254,226,254,190,54,72,129,145,145,129,59,79,39,115,1,159,122, + 60,49,49,60,59,50,50,3,135,60,49,49,60,59,47,47,0,1,0,100,0,0,5,192,5,213,0,11,0,35,64,17,5,8,149,2,11,173,0,175, + 7,3,5,2,28,10,8,11,12,16,212,60,196,252,60,196,49,0,47,228,244,60,236,50,48,1,51,17,33,21,33,17,35,17,33,53,33,2,173,202, + 2,73,253,183,202,253,183,2,73,5,213,253,106,170,253,107,2,149,170,0,255,255,0,61,0,0,5,59,5,213,16,6,0,59,0,0,0,3,0,115, + 255,227,5,114,5,239,0,51,0,63,0,75,0,102,64,25,25,24,27,149,21,30,30,31,70,52,25,14,37,43,8,25,54,58,48,31,20,25,0,16, + 76,16,252,236,50,244,60,236,50,220,60,236,50,17,57,47,60,252,60,204,49,0,64,31,23,28,20,24,149,30,26,61,149,40,73,149,11,26,67,11, + 40,55,5,35,16,35,149,49,16,149,3,145,49,140,76,16,228,244,236,16,236,17,18,23,57,47,236,47,236,47,60,236,50,204,196,48,19,16,0,33, + 32,23,30,1,21,20,6,35,34,38,53,52,55,34,7,6,21,51,17,51,21,51,21,35,21,35,17,35,20,23,22,51,38,53,52,54,51,50,22,21, + 20,14,1,7,6,33,32,0,5,20,22,51,50,54,53,52,38,35,34,6,19,52,38,35,34,6,21,20,22,51,50,54,115,1,134,1,83,1,147,95, + 32,20,153,133,132,153,24,238,151,127,187,204,233,233,204,187,127,151,238,24,153,132,133,153,20,65,59,133,254,239,254,173,254,122,3,153,44,28,28,44, + 44,28,28,44,144,44,28,28,44,44,28,28,44,2,233,1,103,1,159,115,39,79,59,129,145,145,129,72,54,162,138,223,0,255,255,170,255,0,255,223, + 138,162,54,72,129,145,145,129,59,79,79,23,52,1,159,122,60,49,49,60,59,50,50,3,135,60,49,49,60,59,47,47,0,1,0,201,0,0,4,139, + 5,213,0,19,0,59,64,28,14,11,149,4,2,149,0,129,16,149,8,4,173,18,5,14,149,11,8,9,1,17,15,3,28,0,4,20,16,252,236,50, + 212,196,196,220,60,236,50,49,0,47,236,50,236,244,236,16,238,50,48,178,31,20,1,1,93,19,33,21,33,17,33,17,51,21,51,21,35,21,35,17, + 33,17,33,21,33,201,3,176,253,26,1,17,204,234,234,204,254,239,2,248,252,62,5,213,170,254,70,0,255,255,170,255,0,255,253,227,170,0,0,0, + 255,255,0,16,0,0,5,104,5,213,16,6,3,41,0,0,0,1,0,201,0,0,5,59,5,213,0,7,0,31,64,16,6,2,129,4,149,0,9,4, + 5,28,0,4,28,1,4,8,16,252,236,212,236,236,49,0,47,236,244,60,48,41,1,17,51,17,33,17,51,5,59,251,142,202,2,222,202,5,213,250, + 213,5,43,0,0,1,0,201,0,0,4,121,5,213,0,8,0,61,64,12,66,7,3,149,4,129,1,5,1,4,4,9,16,252,60,212,49,0,47,244, + 236,50,48,75,83,88,64,18,8,17,2,2,1,7,17,3,3,2,8,17,2,0,17,1,2,1,5,7,16,236,16,236,7,16,236,8,16,236,89,33, + 35,9,1,53,33,21,33,1,1,177,232,1,223,254,33,3,176,253,56,1,223,2,192,2,107,170,170,253,154,0,0,0,0,1,0,115,0,0,5,219, + 5,213,0,35,0,79,64,22,37,16,6,15,25,7,14,2,36,16,33,24,25,32,25,19,10,2,28,20,29,1,47,60,60,236,50,50,212,60,236,50, + 236,16,212,60,236,50,236,49,0,64,18,0,3,149,29,10,32,1,6,129,15,21,18,149,28,11,25,20,15,47,60,60,212,60,236,50,16,244,60,60, + 212,60,236,50,48,1,17,51,17,50,54,53,51,16,0,35,17,50,0,17,35,52,38,35,17,35,17,34,6,21,35,16,0,51,17,34,0,17,51,20, + 22,2,194,202,138,242,211,254,135,214,214,1,121,211,242,138,202,138,242,211,1,121,214,214,254,135,211,242,4,43,1,170,254,86,226,200,254,238,254,186, + 254,219,254,186,254,238,200,226,254,86,1,170,226,200,1,18,1,70,1,37,1,70,1,18,200,226,0,0,0,1,0,201,0,0,3,246,5,213,0,6, + 0,46,64,11,3,0,175,6,1,3,4,28,0,4,7,16,252,75,176,16,84,88,185,0,0,0,64,56,89,236,196,196,49,0,47,236,196,48,180,2, + 17,3,3,4,7,1,16,237,19,33,1,35,1,17,35,201,1,26,2,19,222,254,117,196,5,213,253,45,2,29,250,225,0,1,0,115,0,0,5,219, + 5,213,0,43,0,102,64,26,22,45,16,29,16,25,28,17,12,44,16,1,7,38,25,6,39,32,24,20,12,28,35,43,3,11,47,60,60,60,236,50, + 50,50,212,60,236,50,196,236,16,212,60,236,50,236,196,49,0,64,26,24,43,185,21,1,1,42,3,13,10,149,20,3,16,11,6,129,29,32,35,149, + 25,42,39,34,29,47,60,60,212,60,236,50,16,244,60,60,212,60,236,50,17,18,57,47,60,236,50,48,1,53,33,53,34,0,17,51,20,22,51,17, + 51,17,50,54,53,51,16,0,35,21,33,21,33,21,50,0,17,35,52,38,35,17,35,17,34,6,21,35,16,0,51,53,1,1,1,193,214,254,135,211, + 242,138,202,138,242,211,254,135,214,1,191,254,65,214,1,121,211,242,138,202,138,242,211,1,121,214,2,149,170,62,1,70,1,18,200,226,1,170,254,86, + 226,200,254,238,254,186,62,170,61,254,186,254,238,200,226,254,86,1,170,226,200,1,18,1,70,61,0,0,0,1,0,54,4,45,3,233,5,213,0,7, + 0,23,64,9,6,2,4,1,0,5,4,1,8,16,220,204,220,204,49,0,47,204,196,50,48,1,33,17,51,17,33,17,51,3,233,252,77,143,2,149, + 143,4,45,1,168,254,251,1,5,0,0,0,0,3,0,143,255,227,3,172,5,211,0,23,0,27,0,36,0,0,1,51,17,54,55,54,55,21,14,1, + 35,34,38,53,52,54,63,1,62,1,55,62,1,53,19,35,53,51,3,17,7,14,1,21,20,23,22,1,243,191,31,33,89,97,94,193,103,184,223,72, + 90,88,47,39,8,6,6,197,203,203,197,45,57,51,66,36,4,66,252,83,8,13,35,67,188,57,56,194,159,76,137,86,86,47,53,25,21,60,52,1, + 14,254,250,190,1,173,44,53,94,49,89,55,31,0,0,0,255,255,0,217,0,159,5,219,3,50,16,38,12,193,0,0,16,7,13,74,2,19,254,87, + 0,1,0,176,3,58,2,88,6,20,0,5,0,0,19,33,21,35,17,35,176,1,168,240,184,6,20,143,253,181,0,0,0,1,0,199,3,58,2,111, + 6,20,0,5,0,0,1,35,53,33,17,35,1,182,239,1,168,185,5,133,143,253,38,0,0,1,0,176,254,242,2,88,1,204,0,5,0,0,5,51, + 21,33,17,51,1,104,240,254,88,184,127,143,2,218,0,0,0,1,0,199,254,242,2,111,1,204,0,5,0,0,1,33,53,51,17,51,2,111,254,88, + 239,185,254,242,143,2,75,0,255,255,0,147,0,0,3,176,5,240,16,6,5,77,0,0,255,255,0,170,254,188,6,130,5,213,16,39,23,123,0,0, + 252,54,16,6,23,123,0,0,255,255,0,170,254,188,6,130,5,213,16,39,23,130,0,0,252,54,16,6,23,130,0,0,255,255,0,170,254,188,6,130, + 5,213,16,39,23,126,0,0,252,54,16,6,23,128,0,0,255,255,0,170,254,188,6,130,5,213,16,39,23,128,0,0,252,54,16,6,23,129,0,0, + 255,255,0,170,254,188,6,130,5,213,16,39,23,123,0,0,252,54,16,6,23,128,0,0,255,255,0,170,254,188,6,130,5,213,16,38,23,123,0,0, + 16,7,23,128,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,39,23,128,0,0,252,54,16,6,23,130,0,0,255,255,0,170,254,188,6,130, + 5,213,16,38,23,128,0,0,16,7,23,130,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,39,23,123,0,0,252,54,16,6,23,127,0,0, + 255,255,0,170,254,188,6,131,5,213,16,38,23,123,0,0,16,7,23,124,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,130,0,0, + 16,7,23,123,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,39,23,130,0,0,252,54,16,6,23,123,0,0,255,255,0,170,254,188,6,130, + 5,213,16,38,23,123,0,0,16,7,23,125,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,39,23,123,0,0,252,54,16,6,23,125,0,0, + 255,255,0,170,254,188,6,130,5,213,16,38,23,130,0,0,16,7,23,129,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,126,0,0, + 16,7,23,130,0,0,252,54,255,255,0,170,254,188,6,131,5,213,16,39,23,126,0,0,252,54,16,6,23,124,0,0,255,255,0,170,254,188,6,130, + 5,213,16,39,23,127,0,0,252,54,16,6,23,129,0,0,255,255,0,170,254,188,6,131,5,213,16,39,23,124,0,0,252,54,16,6,23,130,0,0, + 255,255,0,170,254,188,6,130,5,213,16,38,23,127,0,0,16,7,23,130,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,39,23,126,0,0, + 252,54,16,6,23,125,0,0,255,255,0,170,254,188,6,130,5,213,16,38,23,129,0,0,16,7,23,125,0,0,252,54,255,255,0,170,254,188,6,130, + 5,213,16,38,23,129,0,0,16,7,23,130,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,39,23,126,0,0,252,54,16,6,23,130,0,0, + 255,255,0,170,254,188,6,130,5,213,16,39,23,126,0,0,252,54,16,6,23,123,0,0,255,255,0,170,254,188,6,130,5,213,16,38,23,129,0,0, + 16,7,23,123,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,129,0,0,16,7,23,126,0,0,252,54,255,255,0,170,254,188,6,131, + 5,213,16,38,23,124,0,0,16,7,23,127,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,128,0,0,16,7,23,128,0,0,252,54, + 255,255,0,170,254,188,6,130,5,213,16,38,23,125,0,0,16,7,23,125,0,0,252,54,255,255,0,170,254,188,6,131,5,213,16,38,23,124,0,0, + 16,7,23,129,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,126,0,0,16,7,23,127,0,0,252,54,255,255,0,170,254,188,6,130, + 5,213,16,39,23,129,0,0,252,54,16,6,23,123,0,0,255,255,0,170,254,188,6,130,5,213,16,38,23,126,0,0,16,7,23,123,0,0,252,54, + 255,255,0,170,254,188,6,130,5,213,16,39,23,130,0,0,252,54,16,6,23,125,0,0,255,255,0,170,254,188,6,130,5,213,16,38,23,130,0,0, + 16,7,23,125,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,127,0,0,16,7,23,125,0,0,252,54,255,255,0,170,254,188,6,131, + 5,213,16,38,23,125,0,0,16,7,23,124,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,128,0,0,16,7,23,129,0,0,252,54, + 255,255,0,170,254,188,6,130,5,213,16,39,23,128,0,0,252,54,16,6,23,126,0,0,255,255,0,170,254,188,6,131,5,213,16,38,23,129,0,0, + 16,7,23,124,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,127,0,0,16,7,23,126,0,0,252,54,255,255,0,170,254,188,6,131, + 5,213,16,38,23,124,0,0,16,7,23,123,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,123,0,0,16,7,23,127,0,0,252,54, + 255,255,0,170,254,188,6,131,5,213,16,38,23,124,0,0,16,7,23,130,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,130,0,0, + 16,7,23,127,0,0,252,54,255,255,0,170,254,188,6,131,5,213,16,39,23,128,0,0,252,54,16,6,23,124,0,0,255,255,0,170,254,188,6,130, + 5,213,16,38,23,128,0,0,16,7,23,127,0,0,252,54,255,255,0,170,254,188,6,131,5,213,16,38,23,124,0,0,16,7,23,125,0,0,252,54, + 255,255,0,170,254,188,6,130,5,213,16,38,23,125,0,0,16,7,23,127,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,126,0,0, + 16,7,23,126,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,129,0,0,16,7,23,129,0,0,252,54,255,255,0,170,254,188,6,130, + 5,213,16,38,23,127,0,0,16,7,23,129,0,0,252,54,255,255,0,170,254,188,6,131,5,213,16,38,23,126,0,0,16,7,23,124,0,0,252,54, + 255,255,0,170,254,188,6,130,5,213,16,38,23,126,0,0,16,7,23,125,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,125,0,0, + 16,7,23,129,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,127,0,0,16,7,23,127,0,0,252,54,255,255,0,170,254,188,6,131, + 5,213,16,38,23,124,0,0,16,7,23,124,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,127,0,0,16,7,23,128,0,0,252,54, + 255,255,0,170,254,188,6,131,5,213,16,38,23,128,0,0,16,7,23,124,0,0,252,54,255,255,0,170,254,188,6,131,5,213,16,38,23,127,0,0, + 16,7,23,124,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,38,23,126,0,0,16,7,23,129,0,0,252,54,255,255,0,170,254,188,6,130, + 5,213,16,38,23,128,0,0,16,7,23,125,0,0,252,54,255,255,0,170,254,188,6,130,5,213,16,39,23,128,0,0,252,54,16,6,23,125,0,0, + 255,255,0,201,0,0,4,236,5,213,18,6,0,37,0,0,255,255,0,201,0,0,4,141,5,213,18,6,0,51,0,0,0,2,0,70,0,0,4,10, + 5,213,0,8,0,19,0,0,37,17,35,34,6,21,20,22,51,5,33,34,36,53,52,36,59,1,17,51,3,64,254,141,154,154,141,1,200,254,56,251, + 254,255,1,1,251,254,202,166,2,49,146,135,134,146,166,227,219,221,226,2,88,0,0,0,255,255,0,201,0,0,5,176,5,213,18,6,0,39,0,0, + 255,255,255,250,0,0,4,233,5,213,18,6,0,55,0,0,0,1,255,250,0,0,4,233,5,213,0,7,0,0,41,1,53,33,17,51,17,33,4,233, + 251,17,2,18,203,2,18,170,5,43,250,213,255,255,0,115,255,227,5,139,5,240,18,6,0,42,0,0,255,255,0,201,0,0,5,106,5,213,18,6, + 0,46,0,0,0,1,255,213,0,0,4,118,5,213,0,10,0,0,33,35,17,1,33,9,1,33,1,17,51,4,118,202,253,98,254,252,2,229,252,230, + 1,10,2,205,202,2,119,253,137,2,184,3,29,253,49,2,207,0,0,0,255,255,0,0,255,227,3,79,5,213,18,6,23,2,0,0,255,255,0,115, + 255,227,5,39,5,240,18,6,0,38,0,0,255,255,0,115,255,227,5,39,5,240,18,6,1,72,0,0,255,255,0,92,0,0,5,31,5,213,18,6, + 0,61,0,0,255,255,0,201,0,0,4,35,5,213,18,6,0,41,0,0,255,255,0,201,0,0,4,35,5,213,18,6,11,196,0,0,255,255,0,201, + 0,0,6,31,5,213,18,6,0,48,0,0,255,255,0,201,0,0,5,51,5,213,18,6,0,49,0,0,255,255,0,201,0,0,4,106,5,213,18,6, + 0,47,0,0,255,255,0,135,255,227,4,162,5,240,18,6,0,54,0,0,255,255,0,201,0,0,5,84,5,213,18,6,0,53,0,0,0,2,0,59, + 0,0,4,198,5,213,0,19,0,27,0,0,1,46,1,39,3,51,19,30,1,59,1,17,51,17,33,32,38,53,52,54,1,17,35,34,6,16,22,51, + 2,2,65,123,62,205,217,191,74,139,120,220,202,254,56,255,0,252,131,2,119,254,146,149,149,146,3,25,22,144,126,1,152,254,129,150,98,2,119,250, + 43,214,216,141,186,253,177,2,18,135,254,250,133,0,0,0,255,255,0,16,0,0,5,104,5,213,18,6,2,7,0,0,255,255,0,16,0,0,5,104, + 5,213,18,6,0,57,0,0,255,255,0,201,0,0,5,59,5,213,18,6,0,43,0,0,255,255,0,163,255,227,5,187,5,240,18,6,11,211,0,0, + 0,1,0,201,0,0,4,24,5,242,0,15,0,0,1,21,46,1,35,34,6,21,17,35,17,16,54,51,50,22,4,24,91,194,104,143,113,202,211,247, + 96,190,5,152,236,81,81,149,203,252,18,3,238,1,26,234,44,0,0,0,255,255,0,68,0,0,7,166,5,213,18,6,0,58,0,0,255,255,0,61, + 0,0,5,59,5,213,18,6,0,59,0,0,255,255,255,252,0,0,4,231,5,213,18,6,0,60,0,0,0,3,0,145,0,0,4,180,5,213,0,8, + 0,17,0,32,0,0,1,17,33,34,6,21,20,22,51,1,17,33,34,6,21,20,22,51,5,33,34,38,53,52,54,55,46,1,53,52,36,51,33,3, + 234,254,188,163,157,157,163,1,68,254,213,148,145,145,148,1,245,253,252,231,250,128,124,149,165,1,16,251,2,24,3,12,2,35,135,139,140,133,253,154, + 1,194,111,114,113,112,166,192,177,137,162,20,32,203,152,200,218,0,0,0,255,255,0,16,0,0,5,104,5,213,18,6,0,36,0,0,255,255,0,16, + 0,0,5,104,5,213,18,6,17,227,0,0,255,255,0,201,0,0,4,139,5,213,18,6,0,40,0,0,0,1,0,131,0,0,4,69,5,213,0,11, + 0,0,41,1,53,33,17,33,53,33,17,33,53,33,4,69,252,80,2,230,253,57,2,199,253,8,3,194,170,1,186,170,2,29,170,0,255,255,0,201, + 0,0,1,147,5,213,18,6,0,44,0,0,255,255,0,115,255,227,5,217,5,240,18,6,0,50,0,0,255,255,0,178,255,227,5,41,5,213,18,6, + 0,56,0,0,0,1,0,178,0,0,5,41,5,242,0,17,0,42,64,9,10,28,8,56,17,28,0,65,18,16,252,75,176,16,84,88,185,0,0,255, + 192,56,89,236,252,236,49,0,181,13,149,4,145,9,0,47,60,244,236,48,51,17,16,0,33,32,0,25,1,35,17,52,38,35,34,6,21,17,178,1, + 33,1,27,1,26,1,33,203,174,194,195,174,3,164,1,36,1,42,254,214,254,220,252,92,3,139,240,211,211,240,252,117,255,255,0,8,0,0,3,169, + 5,213,18,6,11,212,0,0,0,2,0,115,0,0,5,90,5,213,0,8,0,17,0,31,64,9,0,28,10,50,4,25,14,16,18,16,252,236,244,236, + 49,0,182,0,149,9,129,7,149,11,47,236,244,236,48,1,35,32,0,17,16,0,33,51,19,17,33,32,0,17,16,0,33,4,144,244,254,203,254,225, + 1,31,1,53,244,202,254,97,254,80,254,104,1,150,1,178,5,47,254,233,254,212,254,210,254,232,5,47,250,43,1,106,1,130,1,128,1,105,0,0, + 0,1,0,175,0,0,1,183,1,62,0,3,0,0,19,33,17,33,175,1,8,254,248,1,62,254,194,0,0,1,0,146,254,192,1,183,1,62,0,6, + 0,0,19,33,17,3,35,19,35,175,1,8,164,129,164,135,1,62,254,194,254,192,1,64,255,255,0,175,0,0,4,22,1,62,16,39,18,191,2,95, + 0,0,16,6,18,191,0,0,255,255,0,175,254,192,4,22,1,62,16,39,18,192,2,95,0,0,16,6,18,191,0,0,0,2,0,146,254,192,1,183, + 4,35,0,6,0,10,0,0,19,33,17,3,35,19,35,17,33,17,33,175,1,8,164,129,164,135,1,8,254,248,1,62,254,194,254,192,1,64,4,35, + 254,194,0,0,0,2,0,175,0,0,1,183,4,35,0,3,0,7,0,0,19,33,17,33,17,33,17,33,175,1,8,254,248,1,8,254,248,1,62,254, + 194,4,35,254,194,0,0,0,0,2,0,175,0,0,4,5,2,214,0,3,0,7,0,0,1,33,17,33,1,33,21,33,2,253,1,8,254,248,253,178, + 3,86,252,170,1,62,254,194,2,214,168,0,0,2,0,175,1,96,4,5,3,162,0,3,0,7,0,0,19,33,21,33,21,33,21,33,175,3,86,252, + 170,3,86,252,170,3,162,168,240,170,0,0,255,255,0,114,255,227,4,141,5,240,16,6,1,105,0,0,255,255,0,100,255,227,3,188,4,123,16,6, + 1,106,0,0,255,255,0,201,0,0,2,198,5,213,16,6,1,88,0,0,255,255,0,166,0,0,2,110,4,96,16,6,2,43,0,0,0,1,0,118, + 255,227,8,250,5,41,0,52,0,62,64,21,48,49,44,28,0,24,23,4,10,15,42,36,30,6,0,54,28,28,19,69,53,16,252,236,204,204,23,57, + 212,204,16,236,212,204,49,0,64,12,36,149,10,42,30,149,4,15,140,48,23,53,16,204,50,244,50,236,50,220,236,48,1,20,7,6,35,34,39,38, + 39,38,35,34,15,1,6,35,34,39,38,53,52,55,54,55,51,6,7,6,21,16,33,50,55,54,55,54,51,50,23,22,23,22,51,32,17,52,39,38, + 39,51,22,23,22,8,250,102,116,234,91,110,97,96,122,120,122,123,194,110,91,234,116,102,67,71,111,249,126,91,85,1,0,138,93,76,75,102,157,155, + 100,75,74,93,138,1,0,85,91,126,250,111,70,67,1,254,242,139,158,68,64,64,68,68,128,68,157,139,242,198,226,236,152,107,243,226,182,254,186,54, + 51,51,54,54,51,51,54,1,70,182,226,243,107,152,236,226,0,1,0,152,255,227,7,161,3,197,0,33,0,60,64,19,33,0,31,8,2,14,13,4, + 9,29,18,4,2,35,16,8,11,69,34,16,252,236,204,204,23,57,212,204,16,236,212,204,49,0,64,12,23,169,7,29,18,169,4,9,140,33,13,34, + 16,204,50,244,50,236,50,220,236,48,1,18,17,16,33,34,36,34,4,35,32,17,16,19,51,2,21,16,51,50,55,54,55,54,50,23,22,23,22,51, + 50,17,52,3,7,23,138,254,114,84,254,213,240,254,212,82,254,114,138,198,146,208,62,73,120,21,100,252,100,20,121,73,63,208,146,3,197,254,227,254, + 235,254,80,226,226,1,177,1,20,1,29,254,185,250,254,251,56,91,12,55,55,12,91,56,1,7,248,1,71,0,0,0,255,255,0,60,0,0,7,114, + 5,213,16,38,3,190,0,0,16,7,0,44,5,223,0,0,255,255,0,62,0,0,6,138,4,123,16,38,3,222,0,0,16,7,0,243,5,17,0,0, + 0,2,0,115,255,227,7,208,5,240,0,9,0,28,0,0,0,32,0,17,16,0,32,0,17,16,23,33,17,51,17,35,17,33,2,0,33,32,0,17, + 16,0,33,32,0,4,1,254,72,254,255,1,1,1,184,1,3,210,1,48,202,202,254,208,14,254,152,254,197,254,198,254,136,1,120,1,58,1,59,1, + 104,5,76,254,184,254,229,254,230,254,184,1,72,1,26,1,27,197,2,150,250,43,2,149,254,232,254,102,1,165,1,97,1,98,1,165,254,103,0,0, + 0,2,0,112,255,227,5,251,4,123,0,10,0,28,0,0,1,34,6,21,20,22,51,50,54,16,38,1,51,17,51,17,35,17,35,6,0,35,34,0, + 17,16,0,32,18,2,114,147,172,172,147,149,171,172,1,104,213,184,184,208,9,254,249,241,240,254,238,1,18,1,224,249,3,223,233,199,200,232,231,1, + 146,231,254,194,1,191,251,160,2,9,248,254,210,1,57,1,19,1,20,1,56,254,228,0,0,2,0,211,0,0,7,191,5,213,0,15,0,18,0,0, + 1,51,1,35,3,33,3,35,19,33,17,35,17,51,17,33,9,1,33,4,161,229,2,57,210,136,253,95,136,213,252,254,58,202,202,2,7,1,111,254, + 238,2,37,5,213,250,43,1,127,254,129,2,149,253,107,5,213,253,106,1,207,253,25,0,0,2,0,193,255,227,6,4,4,123,0,34,0,45,0,0, + 1,17,35,53,14,1,35,34,38,53,52,55,33,17,35,17,51,17,33,54,51,33,53,52,38,35,34,6,7,53,62,1,51,50,22,1,34,6,21,20, + 22,51,50,54,61,1,6,4,184,63,188,136,172,203,47,254,248,184,184,1,210,106,149,1,2,167,151,96,182,84,101,190,90,243,240,254,145,223,172,129, + 111,153,185,2,127,253,129,170,102,97,193,162,115,80,253,247,4,96,254,65,34,18,127,139,46,46,170,39,39,252,254,180,102,123,98,115,217,180,41,0, + 0,2,0,101,254,191,8,8,5,213,0,18,0,26,0,0,55,54,55,18,25,1,33,21,33,17,51,17,35,17,35,33,17,35,17,1,33,21,16,3, + 6,7,33,172,134,38,97,6,79,253,41,170,170,202,252,168,170,4,2,254,27,112,23,40,2,148,170,63,120,1,52,2,38,1,26,170,251,127,254,21, + 1,65,254,191,1,235,4,129,212,254,13,254,181,68,43,0,0,2,0,107,254,229,6,231,4,96,0,18,0,25,0,0,55,54,55,54,17,53,33,21, + 33,17,51,17,35,17,35,33,17,35,17,1,33,21,16,15,1,33,176,91,40,98,5,82,253,163,147,147,185,253,45,147,3,102,254,125,118,29,2,22, + 147,40,85,211,1,169,212,147,252,198,254,82,1,27,254,229,1,174,3,58,140,254,100,220,54,0,0,0,0,1,0,84,0,0,8,17,5,213,0,17, + 0,0,51,53,54,55,54,17,53,33,21,33,17,35,17,33,21,16,3,6,84,221,58,87,6,79,253,41,202,254,27,102,98,170,48,163,246,2,100,254, + 170,250,213,5,43,184,253,202,254,248,253,0,0,1,0,76,0,0,6,209,4,96,0,18,0,0,51,53,54,55,54,17,53,33,21,33,17,43,1,17, + 33,21,16,7,6,76,187,51,68,5,83,253,163,1,184,254,123,88,94,153,29,125,166,1,208,183,147,252,51,3,205,111,254,80,194,207,0,1,0,201, + 0,0,8,246,5,213,0,15,0,0,19,33,9,1,33,21,33,17,43,1,17,1,35,1,17,35,201,1,45,1,125,1,127,4,4,253,41,197,5,254, + 132,203,254,127,196,5,213,252,8,3,248,170,250,213,5,18,252,13,4,0,250,225,0,0,0,1,0,186,0,0,7,172,4,96,0,14,0,0,19,33, + 9,1,33,21,33,17,35,17,1,35,1,17,35,186,1,13,1,62,1,63,3,104,253,163,185,254,203,184,254,202,185,4,96,253,18,2,238,147,252,51, + 3,176,253,39,2,217,252,80,255,255,0,115,255,227,5,217,5,240,16,39,0,121,1,226,0,0,16,6,0,50,0,0,255,255,0,113,255,227,4,117, + 4,123,16,38,0,82,0,0,16,7,0,121,1,46,255,132,0,4,0,115,255,227,6,101,5,240,0,3,0,7,0,19,0,29,0,0,1,51,21,35, + 37,51,21,35,18,32,39,38,16,55,54,32,23,22,16,7,0,32,0,17,16,0,32,0,17,16,2,49,211,211,1,164,211,211,241,253,76,208,207,207, + 208,2,180,208,207,207,254,200,254,26,254,224,1,32,1,230,1,32,3,70,254,254,254,253,155,210,210,2,196,211,210,210,211,253,60,210,4,151,254,184, + 254,229,254,230,254,184,1,72,1,26,1,27,0,4,0,113,255,227,5,67,4,123,0,3,0,7,0,18,0,30,0,0,1,51,21,35,37,51,21,35, + 3,34,6,16,22,51,50,54,53,52,38,39,32,0,17,16,0,33,32,0,17,16,0,1,188,211,211,1,104,211,211,74,195,227,225,197,194,227,227,194, + 1,32,1,73,254,183,254,224,254,223,254,184,1,72,2,202,254,254,254,2,19,231,254,110,231,232,200,199,233,156,254,200,254,236,254,237,254,199,1,57, + 1,19,1,20,1,56,0,0,255,255,0,115,255,227,10,106,5,240,16,38,19,28,0,0,16,39,0,121,6,114,0,0,16,7,0,121,1,226,0,0, + 255,255,0,113,255,227,7,182,4,123,16,39,0,121,4,111,255,132,16,39,0,121,1,46,255,132,16,6,19,29,0,0,0,15,0,58,254,87,6,206, + 5,241,0,3,0,7,0,11,0,15,0,19,0,23,0,31,0,39,0,47,0,55,0,63,0,71,0,79,0,128,0,132,0,0,37,51,21,35,37,51, + 21,35,1,51,21,35,37,51,21,35,1,51,21,35,37,51,21,35,0,34,6,20,22,50,54,52,18,34,6,20,22,50,54,52,36,34,6,20,22,50, + 54,52,18,34,6,20,22,50,54,52,36,34,6,20,22,50,54,52,0,34,6,20,22,50,54,52,36,34,6,20,22,50,54,52,19,50,22,21,20,6, + 43,1,22,21,20,6,32,39,38,39,6,7,6,32,38,53,52,55,34,35,34,38,53,52,54,59,1,38,53,52,54,32,23,22,23,54,55,54,32,22, + 21,20,7,1,51,21,35,4,74,134,134,253,239,134,134,2,17,134,134,253,239,134,134,254,248,134,134,4,34,134,134,252,123,180,105,105,180,104,160,180, + 105,105,180,104,1,169,180,105,105,180,104,161,180,105,105,180,104,253,134,180,105,105,180,104,254,144,180,105,105,180,104,1,169,180,105,105,180,104,71,141, + 171,171,141,4,52,171,254,227,85,22,15,15,21,85,254,226,169,51,2,1,143,171,171,143,2,50,169,1,30,85,21,15,15,22,85,1,29,171,52,253, + 175,134,134,22,156,156,156,5,73,156,156,156,254,70,156,156,156,1,93,142,247,142,142,247,2,228,143,246,142,142,246,143,143,246,142,142,246,254,57,142, + 247,142,142,247,142,142,247,142,142,247,254,55,142,247,142,142,247,142,142,247,142,142,247,3,82,204,172,169,204,92,133,171,203,100,27,29,29,25,102,202, + 172,133,92,202,171,172,204,90,133,171,204,101,26,29,29,26,101,204,171,133,90,254,210,156,0,1,255,250,254,102,6,16,5,213,0,29,0,0,3,33, + 21,33,17,33,50,23,22,21,17,16,6,43,1,53,51,50,55,54,53,17,52,38,35,33,17,35,17,33,6,4,239,253,238,1,161,186,113,109,204,228, + 76,62,134,56,55,124,124,254,136,203,253,238,5,213,170,254,70,119,114,238,254,206,254,242,244,170,75,75,194,1,34,159,158,253,57,5,43,0,0,0, + 0,1,0,60,254,86,5,72,4,96,0,31,0,0,19,33,21,33,17,51,32,23,22,21,17,20,7,6,43,1,53,51,50,55,54,53,17,52,39,38, + 35,33,17,35,17,33,60,4,49,254,66,250,1,7,70,82,82,81,181,193,172,110,33,38,38,44,139,254,252,181,254,66,4,96,147,254,170,71,81,229, + 254,242,213,97,96,156,48,55,147,1,8,166,36,41,254,25,3,205,0,0,0,1,255,250,0,0,4,233,5,213,0,15,0,0,3,33,21,33,17,20, + 22,59,1,21,35,34,38,25,1,33,6,4,239,253,238,109,134,63,77,227,205,253,238,5,213,170,252,215,194,150,170,244,1,14,3,41,0,1,0,60, + 0,0,4,109,4,96,0,17,0,0,19,33,21,33,17,20,23,22,59,1,21,35,34,39,38,53,17,33,60,4,49,254,70,35,35,109,88,110,182,80, + 83,254,69,4,96,147,253,190,145,46,48,156,96,98,212,2,55,0,0,0,0,1,0,175,0,0,4,179,5,213,0,23,0,42,64,11,25,8,28,6, + 19,12,0,28,15,4,24,16,252,236,50,204,212,236,204,49,0,64,10,2,149,11,173,21,149,18,129,7,14,47,60,244,236,244,236,48,1,21,33,50, + 22,21,17,35,17,52,38,35,33,17,35,17,52,54,51,33,21,35,34,6,1,122,1,161,186,222,201,124,124,254,136,203,163,181,1,9,224,105,77,4, + 63,206,233,238,254,102,1,138,159,158,253,57,4,63,214,192,156,97,0,0,255,255,0,186,0,0,4,100,6,20,16,6,2,40,0,0,0,2,0,214, + 0,0,3,29,5,88,0,3,0,7,0,0,19,51,21,35,1,17,51,17,214,170,170,1,191,136,5,88,136,251,48,5,88,250,168,0,0,2,0,214, + 0,0,3,29,5,88,0,3,0,7,0,0,19,51,21,35,1,17,51,17,214,170,170,1,191,136,4,36,136,252,100,5,88,250,168,0,0,2,0,214, + 0,0,3,29,5,88,0,3,0,7,0,0,19,51,21,35,1,17,51,17,214,170,170,1,191,136,2,240,136,253,152,5,88,250,168,0,0,2,0,214, + 0,0,3,29,5,88,0,3,0,7,0,0,19,51,21,35,1,17,51,17,214,170,170,1,191,136,1,188,136,254,204,5,88,250,168,0,0,2,0,214, + 0,0,3,29,5,88,0,3,0,7,0,0,55,51,21,35,1,51,17,35,214,170,170,1,191,136,136,136,136,5,88,250,168,0,0,0,0,2,0,214, + 0,0,3,29,5,88,0,3,0,7,0,0,1,51,21,35,1,35,17,51,2,115,170,170,254,235,136,136,5,88,136,251,48,5,88,0,0,2,0,214, + 0,0,3,29,5,88,0,3,0,7,0,0,1,51,21,35,1,35,17,51,2,115,170,170,254,235,136,136,4,36,136,252,100,5,88,0,0,2,0,214, + 0,0,3,29,5,88,0,3,0,7,0,0,1,51,21,35,1,35,17,51,2,115,170,170,254,235,136,136,2,240,136,253,152,5,88,0,0,2,0,214, + 0,0,3,29,5,88,0,3,0,7,0,0,1,51,21,35,1,35,17,51,2,115,170,170,254,235,136,136,1,188,136,254,204,5,88,0,0,2,0,214, + 0,0,3,29,5,88,0,3,0,7,0,0,37,51,21,35,33,35,17,51,2,115,170,170,254,235,136,136,136,136,5,88,0,1,0,214,0,0,3,29, + 5,88,0,5,0,0,33,35,17,33,21,33,1,94,136,2,71,254,65,5,88,136,0,0,0,1,0,214,0,0,3,29,5,88,0,7,0,0,33,35, + 17,51,17,33,21,33,1,94,136,136,1,191,254,65,5,88,254,204,136,0,0,1,0,214,0,0,3,29,5,88,0,7,0,0,33,35,17,51,17,33, + 21,33,1,94,136,136,1,191,254,65,5,88,253,152,136,0,0,1,0,214,0,0,3,29,5,88,0,7,0,0,33,35,17,51,17,33,21,33,1,94, + 136,136,1,191,254,65,5,88,252,100,136,0,0,1,0,214,0,0,3,29,5,88,0,5,0,0,37,33,21,33,17,51,1,94,1,191,253,185,136,136, + 136,5,88,0,0,1,0,102,2,156,2,142,5,228,0,9,0,0,1,51,23,7,39,17,35,17,7,39,1,94,57,247,76,146,107,147,76,5,228,221, + 67,131,253,85,2,171,131,67,0,1,0,102,2,152,2,142,5,224,0,9,0,0,1,35,39,55,23,17,51,17,55,23,1,151,57,248,76,147,107,146, + 76,2,152,221,67,131,2,171,253,85,131,67,0,2,0,195,2,156,1,67,5,224,0,3,0,9,0,0,19,51,21,35,17,51,17,7,35,39,195,128, + 128,128,13,102,13,3,42,142,3,68,254,145,200,200,0,0,0,2,0,195,2,156,1,67,5,224,0,3,0,9,0,0,1,35,53,51,17,35,17,55, + 51,23,1,67,128,128,128,12,102,14,5,82,142,252,188,1,111,200,200,0,255,255,0,195,0,0,1,67,3,68,16,7,18,248,0,0,253,100,0,0, + 0,1,0,137,0,0,2,205,5,212,0,16,0,0,51,53,32,2,33,53,32,2,33,53,32,19,22,7,22,19,18,207,1,74,20,254,182,1,74,30, + 254,162,2,29,14,9,174,184,6,10,163,2,39,163,1,197,162,254,140,229,99,109,254,251,254,90,0,0,0,1,0,137,0,0,2,145,4,96,0,16, + 0,0,51,53,32,2,33,53,32,2,33,53,32,19,22,7,22,23,18,187,1,44,20,254,212,1,44,30,254,212,1,225,14,8,132,143,6,10,153,1, + 124,153,1,26,152,254,232,158,77,89,188,254,184,0,0,0,0,1,0,115,1,203,3,74,5,240,0,9,0,0,1,16,23,7,2,53,16,33,21,32, + 1,45,117,164,139,2,215,253,227,3,205,254,254,210,46,1,49,212,2,32,219,0,0,0,0,1,0,115,0,86,3,74,4,123,0,9,0,0,1,16, + 23,7,2,53,16,33,21,32,1,45,117,164,139,2,215,253,227,2,88,254,254,210,46,1,49,212,2,32,189,0,0,0,0,1,0,201,254,102,5,59, + 5,213,0,19,0,0,19,51,17,33,17,51,17,16,6,43,1,53,51,50,54,53,17,33,17,35,201,202,2,222,202,205,227,77,63,134,110,253,34,202, + 5,213,253,156,2,100,250,147,254,242,244,170,150,194,2,95,253,57,0,0,0,1,0,186,254,86,4,100,6,20,0,28,0,0,1,52,38,35,34,6, + 21,17,35,17,51,17,62,1,51,50,22,21,17,20,6,43,1,53,51,50,55,54,53,3,172,124,124,149,172,185,185,66,179,117,193,198,163,181,70,49, + 110,33,38,2,158,159,158,190,164,253,135,6,20,253,158,101,100,239,232,253,72,214,192,156,48,56,146,0,0,1,255,250,254,76,6,141,5,213,0,42, + 0,0,3,33,21,33,21,33,21,1,50,23,22,23,22,21,20,7,6,33,34,39,38,39,53,22,23,22,51,50,55,54,53,52,39,38,43,1,53,1, + 33,17,35,17,33,6,4,239,253,238,3,94,254,101,105,129,99,85,81,152,152,254,232,115,129,130,130,106,127,126,137,192,99,100,92,93,165,174,1,129, + 253,158,203,253,238,5,213,170,203,154,254,22,56,43,108,104,138,220,122,121,19,19,36,195,49,25,25,75,75,143,134,73,74,152,1,234,252,74,5,43, + 0,1,0,55,254,76,5,52,5,158,0,48,0,0,1,50,23,22,23,22,21,20,4,33,34,39,38,39,53,30,1,51,50,55,54,53,52,39,38,43, + 1,53,1,33,17,20,22,59,1,21,35,34,38,53,17,35,53,51,17,51,17,33,21,3,65,105,129,99,85,81,254,208,254,232,94,99,100,106,84,200, + 109,190,99,100,92,91,167,174,1,174,253,106,75,115,189,189,213,162,135,135,185,3,101,1,220,56,43,108,104,138,221,242,18,19,37,195,49,50,75,75, + 143,132,75,74,166,1,243,253,164,137,78,154,159,210,2,96,143,1,62,254,194,168,0,0,255,255,0,164,255,227,4,123,5,240,16,6,1,82,0,0, + 0,1,0,133,254,103,3,200,4,124,0,49,0,0,1,38,39,38,53,52,55,54,51,50,22,23,21,38,39,38,35,34,7,6,21,20,23,22,59,1, + 21,35,34,7,6,21,20,23,22,51,50,55,54,55,21,6,7,6,35,34,36,53,52,54,1,139,112,60,60,114,113,196,76,170,98,97,80,81,71,129, + 59,70,68,67,116,155,148,137,72,78,84,85,151,97,81,85,71,90,84,85,80,238,254,254,138,1,172,32,86,85,123,186,104,104,26,38,182,45,20,21, + 62,72,109,109,70,69,152,77,85,133,136,85,85,28,28,56,190,37,19,18,240,229,143,193,0,1,0,186,0,0,3,126,4,96,0,9,0,0,19,33, + 21,33,17,33,21,33,17,35,186,2,196,253,246,1,213,254,43,186,4,96,148,254,211,148,253,245,0,0,255,255,0,111,255,227,3,199,4,123,16,6, + 0,86,0,0,0,3,0,16,0,0,9,238,5,213,0,15,0,18,0,21,0,0,1,51,9,1,51,1,35,3,33,3,43,1,3,33,3,35,9,1, + 33,9,1,33,2,74,229,1,208,1,209,229,2,57,210,136,253,95,136,3,210,136,253,95,136,213,2,172,254,238,2,37,3,115,254,238,2,37,5,213, + 251,62,4,194,250,43,1,127,254,129,1,127,254,129,5,14,253,25,2,231,253,25,0,0,0,4,0,123,255,227,7,39,4,123,0,10,0,53,0,64, + 0,77,0,0,1,34,6,21,20,22,51,50,54,61,1,37,17,35,53,14,1,35,34,39,21,35,53,14,1,35,34,38,53,52,54,51,33,53,52,38, + 35,34,6,7,53,62,1,51,50,23,48,23,53,62,1,51,50,22,1,34,6,21,20,22,51,50,54,61,1,1,22,23,54,51,33,53,52,38,35,34, + 7,6,2,190,223,172,129,111,153,185,3,178,184,63,188,136,110,81,184,63,188,136,172,203,253,251,1,2,167,151,96,182,84,101,190,90,243,120,18,101, + 190,90,243,240,254,145,223,172,129,111,153,185,253,136,53,1,121,199,1,2,167,151,96,91,65,2,51,102,123,98,115,217,180,41,76,253,129,170,102,97, + 39,10,170,102,97,193,162,189,192,18,127,139,46,46,170,39,39,126,20,68,39,39,252,254,180,102,123,98,115,217,180,41,1,104,110,166,60,18,127,139, + 23,16,0,0,0,3,0,16,255,227,9,45,5,240,0,19,0,22,0,32,0,0,1,51,19,54,55,54,33,32,0,17,16,0,33,32,39,38,39,33, + 3,35,9,1,33,0,32,0,17,16,0,32,0,17,16,2,74,229,184,45,112,188,1,59,1,58,1,120,254,136,254,198,254,197,188,80,46,253,103,136, + 213,2,172,254,238,2,37,3,136,254,72,254,253,1,3,1,184,1,1,5,213,254,30,174,125,210,254,91,254,158,254,159,254,91,210,88,114,254,129,5, + 14,253,25,3,37,254,184,254,229,254,230,254,184,1,72,1,26,1,27,0,0,3,0,123,255,227,7,123,4,123,0,34,0,45,0,56,0,0,1,50, + 0,17,16,0,32,39,38,39,14,2,35,34,38,53,52,54,51,33,53,52,38,35,34,6,7,53,62,1,51,32,23,54,1,34,6,21,20,22,51,50, + 54,61,1,1,34,6,16,22,51,50,54,53,52,38,5,121,240,1,18,254,238,254,31,136,55,33,18,96,140,178,177,204,253,251,1,2,167,151,96,182, + 84,101,190,90,1,42,113,138,254,79,223,172,129,111,153,185,2,4,148,172,171,149,147,172,172,4,123,254,200,254,236,254,237,254,199,157,62,82,69,135, + 97,193,162,189,192,18,127,139,46,46,170,39,39,189,189,253,184,102,123,98,115,217,180,41,1,172,231,254,110,231,232,200,199,233,0,0,0,2,0,16, + 255,227,8,113,5,213,0,2,0,22,0,0,9,1,33,1,51,1,22,33,50,54,53,17,51,17,16,0,33,32,3,39,33,3,35,2,188,254,238,2, + 37,254,123,229,1,188,74,1,1,194,174,203,254,223,254,230,254,115,118,37,253,95,136,213,5,14,253,25,3,174,251,114,192,211,240,3,139,252,92,254, + 220,254,214,1,52,104,254,129,0,2,0,123,255,227,7,31,4,123,0,40,0,51,0,0,37,14,1,35,34,38,53,52,54,51,33,53,52,38,35,34, + 6,7,53,62,1,51,50,22,17,21,20,22,51,50,54,53,17,51,17,35,53,14,1,35,32,1,34,6,21,20,22,51,50,54,61,1,3,147,72,162, + 178,177,203,253,251,1,2,167,151,96,182,84,101,190,90,243,240,124,124,149,173,184,184,67,177,117,254,229,254,219,223,172,129,111,153,185,223,141,111,193, + 162,189,192,18,127,139,46,46,170,39,39,252,255,0,190,159,159,190,164,2,123,251,160,172,102,99,2,80,102,123,98,115,217,180,41,0,0,2,0,16, + 0,0,7,180,5,213,0,2,0,13,0,0,9,1,33,19,3,33,3,35,1,51,9,1,51,1,2,188,254,238,2,37,199,136,253,95,136,213,2,58, + 229,1,220,1,215,210,253,199,5,14,253,25,253,217,1,127,254,129,5,213,251,31,4,225,250,43,0,0,0,2,0,123,255,227,6,78,4,123,0,10, + 0,40,0,0,1,34,6,21,20,22,51,50,54,61,1,17,53,14,1,35,34,38,53,52,54,51,33,53,52,38,35,34,6,7,53,62,1,51,50,22, + 25,1,1,51,1,2,190,223,172,129,111,153,185,63,188,136,172,203,253,251,1,2,167,151,96,182,84,101,190,90,243,240,1,94,195,254,92,2,51,102, + 123,98,115,217,180,41,253,205,170,102,97,193,162,189,192,18,127,139,46,46,170,39,39,252,255,0,254,53,3,172,251,160,0,3,0,16,0,0,7,180, + 5,213,0,2,0,18,0,21,0,0,9,1,41,2,21,33,3,35,3,33,3,35,1,51,1,51,1,51,1,35,23,2,188,254,238,2,37,2,126,1, + 103,254,89,146,229,136,253,95,136,213,2,58,229,1,103,233,1,99,210,253,139,105,53,5,14,253,25,168,254,129,1,127,254,129,5,213,252,82,3,174, + 251,170,139,0,0,3,0,123,255,227,6,78,4,123,0,34,0,45,0,48,0,0,33,53,14,1,35,34,38,53,52,54,51,33,53,52,38,35,34,6, + 7,53,62,1,51,50,23,22,23,51,19,51,3,51,21,35,3,1,34,6,21,20,22,51,50,54,61,1,33,35,17,3,117,63,188,136,172,203,253,251, + 1,2,167,151,96,182,84,101,190,90,243,120,103,15,198,154,195,155,155,209,211,254,20,223,172,129,111,153,185,1,71,143,170,102,97,193,162,189,192,18, + 127,139,46,46,170,39,39,126,109,205,1,157,254,99,144,253,205,2,51,102,123,98,115,217,180,41,254,129,0,2,0,16,254,86,7,155,5,213,0,2, + 0,24,0,0,9,1,33,1,6,7,6,43,1,53,51,50,55,54,63,1,3,33,3,35,1,51,9,1,51,2,188,254,238,2,37,1,108,75,77,74, + 124,216,171,76,42,43,50,19,136,253,95,136,213,2,58,229,1,207,1,203,210,5,14,253,25,253,113,198,63,61,170,36,37,133,50,1,127,254,129,5, + 213,251,64,4,192,0,0,0,0,2,0,123,254,86,6,78,4,123,0,39,0,50,0,0,33,53,14,1,35,34,38,53,52,54,51,33,53,52,38,35, + 34,6,7,53,62,1,51,50,22,25,1,1,51,1,14,1,43,1,53,51,50,54,63,1,1,34,6,21,20,22,51,50,54,61,1,3,117,63,188,136, + 172,203,253,251,1,2,167,151,96,182,84,101,190,90,243,240,1,94,195,254,20,78,148,124,147,108,76,84,51,26,254,244,223,172,129,111,153,185,170,102, + 97,193,162,189,192,18,127,139,46,46,170,39,39,252,255,0,254,119,3,106,251,56,200,122,154,72,134,66,2,51,102,123,98,115,217,180,41,0,0,0, + 255,255,0,115,255,227,5,39,5,240,16,6,3,147,0,0,255,255,0,127,255,227,3,245,4,123,16,6,3,25,0,0,0,1,0,10,0,0,5,106, + 5,213,0,18,0,0,19,51,21,51,21,35,17,1,33,9,1,33,1,17,35,17,35,53,51,201,202,191,191,2,158,1,4,253,27,3,26,254,246,253, + 51,202,191,191,5,213,185,170,254,236,2,119,253,72,252,227,2,207,253,49,4,114,170,0,0,1,0,14,0,0,4,164,6,20,0,18,0,0,19,51, + 21,33,21,33,17,1,51,9,1,35,1,17,35,17,35,53,51,194,185,1,34,254,222,2,37,235,253,174,2,107,240,253,199,185,180,180,6,20,172,164, + 253,185,1,227,253,244,253,172,2,35,253,221,4,196,164,0,0,1,0,201,0,0,5,102,5,213,0,9,0,0,19,17,51,17,55,17,33,21,33,17, + 201,202,252,2,215,252,95,2,173,3,40,253,94,77,253,42,170,2,250,0,0,1,0,193,0,0,2,99,6,20,0,7,0,0,19,17,51,17,55,17, + 35,17,193,184,234,184,2,156,3,120,253,5,73,252,158,2,229,0,0,0,0,1,0,83,0,0,4,156,5,213,0,13,0,0,19,51,21,51,21,35, + 17,33,21,33,17,35,53,51,251,202,168,168,2,215,252,95,168,168,5,213,224,164,252,89,170,4,81,164,0,1,0,120,0,0,2,242,6,20,0,11, + 0,0,1,51,17,51,21,35,17,35,17,35,53,51,1,89,184,225,225,184,225,225,6,20,254,226,164,251,174,4,82,164,0,3,0,10,255,227,6,106, + 5,240,0,21,0,29,0,37,0,0,1,32,23,22,19,51,21,35,2,7,6,33,32,39,38,3,35,53,51,18,55,54,4,32,7,6,7,33,38,39, + 19,33,22,23,22,32,55,54,3,59,1,58,188,161,23,129,126,11,176,188,254,198,254,197,188,177,11,126,129,23,162,188,2,23,254,72,129,106,20,3, + 180,19,105,127,252,70,10,119,129,1,184,129,118,5,240,210,181,254,227,144,254,190,196,211,210,196,1,67,144,1,29,181,210,164,164,134,214,214,134,254, + 20,250,151,164,164,151,0,0,0,3,0,10,255,227,5,142,4,123,0,21,0,30,0,39,0,0,1,50,23,22,23,51,21,35,6,7,6,35,34,39, + 38,39,35,53,51,54,55,54,23,34,7,6,7,33,38,39,38,19,33,22,23,22,51,50,55,54,2,205,240,137,111,21,196,192,10,126,137,240,241,136, + 126,10,194,198,21,111,136,241,148,86,63,17,2,115,17,63,86,171,253,131,8,76,86,149,147,86,77,4,123,156,126,205,144,244,144,157,157,144,244,144, + 205,126,156,156,115,85,131,129,85,117,254,37,171,103,115,116,103,0,0,0,0,3,0,115,255,227,10,106,5,240,0,26,0,36,0,46,0,0,1,32, + 23,22,23,54,55,54,33,32,0,17,16,0,33,32,39,38,39,6,7,6,33,32,0,16,0,4,32,0,17,16,0,32,0,17,16,0,32,0,17,16, + 0,32,0,17,16,3,39,1,58,188,47,35,35,46,189,1,59,1,58,1,120,254,136,254,198,254,197,189,46,36,35,46,188,254,198,254,197,254,135,1, + 121,2,23,254,72,254,253,1,3,1,184,1,1,3,144,254,72,254,253,1,3,1,184,1,1,5,240,210,53,61,61,53,210,254,91,254,158,254,159,254, + 91,210,52,61,60,52,211,1,164,2,196,1,165,164,254,184,254,229,254,230,254,184,1,72,1,26,1,27,1,72,254,184,254,229,254,230,254,184,1,72, + 1,26,1,27,0,3,0,113,255,227,7,182,4,123,0,10,0,21,0,49,0,0,1,34,6,16,22,51,50,54,53,52,38,33,34,6,16,22,51,50, + 54,53,52,38,39,50,23,22,23,54,55,54,51,50,0,17,16,0,35,34,39,38,39,6,7,6,35,34,0,17,16,0,5,180,148,172,171,149,147,172, + 172,252,44,148,172,171,149,147,172,172,147,240,137,21,18,18,21,137,241,240,1,18,254,238,240,241,137,21,18,18,21,137,240,241,254,239,1,17,3,223, + 231,254,110,231,232,200,199,233,231,254,110,231,232,200,199,233,156,156,24,27,27,24,156,254,200,254,236,254,237,254,199,157,24,27,27,24,157,1,57,1, + 19,1,20,1,56,0,0,0,0,2,0,10,0,0,4,141,5,213,0,8,0,29,0,0,1,17,51,50,54,53,52,38,35,37,33,50,23,22,21,20, + 7,6,43,1,21,51,21,35,17,35,17,35,53,51,1,147,254,141,154,154,141,254,56,1,200,251,128,129,129,128,251,254,237,237,202,191,191,5,47,253, + 207,146,135,134,146,166,113,114,219,221,113,113,196,144,254,252,1,4,144,0,0,2,255,251,254,86,4,164,4,123,0,7,0,31,0,0,0,16,38,32, + 6,16,22,32,1,53,51,17,51,21,62,1,51,50,0,16,2,35,34,38,39,17,51,21,35,21,35,53,3,229,167,254,220,167,167,1,36,252,189,191, + 185,58,177,123,204,0,255,255,204,123,177,58,254,254,185,1,100,1,150,231,231,254,106,231,254,103,144,4,236,170,100,97,254,188,253,240,254,188,97,100, + 254,204,144,142,142,0,0,0,0,2,0,50,0,0,5,153,5,213,0,30,0,39,0,0,1,33,50,4,21,20,4,43,1,17,35,17,35,34,7,6, + 21,22,23,22,23,7,38,39,38,53,52,55,54,59,3,50,54,53,52,38,43,1,1,213,1,200,251,1,1,254,255,251,254,202,45,92,48,58,1,26, + 23,60,68,79,69,70,127,97,162,33,202,254,141,154,154,141,254,5,213,227,219,221,226,253,168,2,88,24,31,61,53,39,32,24,148,23,73,75,125,147, + 76,59,146,135,134,146,0,0,0,2,0,50,254,86,5,194,4,123,0,12,0,49,0,0,1,23,22,51,50,55,54,53,52,38,32,6,21,3,38,35, + 34,7,6,21,20,23,22,23,7,38,39,38,53,52,55,54,51,50,23,17,51,21,62,1,51,50,0,16,2,35,34,39,17,35,2,145,10,157,146,142, + 88,83,167,254,220,167,185,51,41,44,52,58,27,23,60,68,79,69,70,127,84,103,53,55,185,58,177,123,204,0,255,255,202,192,168,185,1,50,11,170, + 115,112,207,203,231,231,203,254,227,25,24,27,65,52,40,32,24,148,23,73,75,125,134,89,59,23,2,166,170,100,97,254,188,253,240,254,188,162,253,209, + 0,2,0,115,254,148,5,217,5,240,0,9,0,35,0,0,0,32,0,17,16,0,32,0,17,16,1,39,55,39,7,6,35,32,0,17,16,0,33,32, + 0,17,16,2,7,23,55,23,7,23,35,39,4,3,254,72,254,253,1,3,1,184,1,1,254,128,72,170,107,51,18,15,254,197,254,135,1,121,1,59, + 1,58,1,120,209,198,69,215,72,188,98,244,14,5,76,254,184,254,229,254,230,254,184,1,72,1,26,1,27,250,144,125,98,116,3,1,1,165,1,97, + 1,98,1,165,254,91,254,158,254,252,254,142,88,75,124,125,108,107,15,0,0,2,0,113,254,86,5,25,4,123,0,23,0,31,0,0,37,14,1,35, + 34,2,16,0,51,50,22,23,53,51,17,51,21,35,21,35,53,35,53,33,0,16,22,32,54,16,38,32,3,162,58,177,124,203,255,0,255,203,124,177, + 58,184,191,191,184,255,0,255,253,141,167,1,36,168,168,254,220,168,100,97,1,68,2,16,1,68,97,100,170,251,20,144,142,142,144,3,134,254,106,231, + 231,1,150,231,0,2,0,10,0,0,4,141,5,213,0,7,0,27,0,0,1,17,51,50,54,16,38,35,1,51,21,51,21,35,21,51,50,4,16,4, + 43,1,17,35,17,35,53,51,1,147,254,141,154,153,142,254,56,202,237,237,254,251,1,1,254,255,251,254,202,191,191,4,39,253,209,146,1,12,145,1, + 174,45,144,75,225,254,72,226,254,174,5,24,144,0,0,0,0,2,255,251,254,86,4,164,6,20,0,7,0,31,0,0,0,16,38,32,6,16,22,32, + 37,17,35,17,35,53,51,53,51,21,51,21,35,17,62,1,51,50,0,16,2,35,34,38,3,229,167,254,220,167,167,1,36,254,53,185,191,191,185,254, + 254,58,177,123,204,0,255,255,204,123,177,1,100,1,150,231,231,254,106,231,43,253,174,6,155,144,147,147,144,254,197,100,97,254,188,253,240,254,188,97, + 0,2,0,10,0,0,4,141,5,213,0,7,0,27,0,0,1,17,51,50,54,16,38,35,1,51,17,51,50,4,16,4,43,1,21,51,21,35,21,35, + 53,35,53,51,1,147,254,141,154,153,142,254,56,202,254,251,1,1,254,255,251,254,237,237,202,191,191,4,39,253,209,146,1,12,145,1,174,254,248,225, + 254,72,226,94,144,100,100,144,0,2,255,251,254,86,4,164,6,20,0,7,0,31,0,0,0,16,38,32,6,16,22,32,1,53,51,17,51,17,62,1, + 51,50,0,16,2,35,34,38,39,17,51,21,35,21,35,53,3,229,167,254,220,167,167,1,36,252,189,191,185,58,177,123,204,0,255,255,204,123,177,58, + 254,254,185,1,100,1,150,231,231,254,106,231,254,103,144,6,160,253,162,100,97,254,188,253,240,254,188,97,100,254,204,144,142,142,0,0,0,1,0,11, + 0,0,3,172,5,213,0,5,0,0,33,35,17,33,53,33,3,172,202,253,41,3,161,5,43,170,0,0,0,2,0,193,254,86,1,121,4,123,0,0, + 0,4,0,0,1,7,51,17,35,1,29,92,184,184,4,123,27,249,246,0,0,1,0,201,254,86,5,25,5,240,0,20,0,0,1,52,38,35,34,6, + 21,17,35,17,51,21,54,55,54,51,50,18,25,1,35,4,80,154,153,179,215,202,202,81,102,101,158,227,233,201,3,127,215,213,255,222,251,8,7,127, + 241,135,67,66,254,193,254,204,252,131,0,0,0,1,0,186,254,86,4,100,4,123,0,19,0,0,1,17,35,17,52,38,35,34,6,21,17,35,17,51, + 21,62,1,51,50,22,4,100,184,124,124,149,172,185,185,66,179,117,193,198,2,164,253,92,2,158,159,158,190,164,251,221,6,10,174,101,100,239,0,0, + 255,255,0,240,0,0,1,195,4,35,18,6,0,29,0,0,0,2,0,160,1,73,2,98,3,11,0,3,0,7,0,0,1,33,53,33,53,33,53,33, + 2,98,254,62,1,194,254,62,1,194,1,73,150,150,150,0,0,1,1,53,1,225,2,0,5,213,0,5,0,58,64,11,3,0,129,6,4,3,1,3, + 0,0,6,16,252,75,176,11,84,88,185,0,0,255,192,56,89,236,57,57,49,0,16,228,204,64,9,32,3,95,3,176,3,239,3,4,93,48,1,182, + 0,7,32,7,80,7,3,93,1,51,17,3,35,3,1,53,203,20,162,21,5,213,253,113,254,155,1,101,0,1,0,197,3,170,1,111,5,213,0,3, + 0,55,64,10,1,132,0,129,4,0,5,2,4,4,16,252,75,176,18,84,75,176,19,84,91,88,185,0,2,255,192,56,89,236,49,0,16,244,236,48, + 1,64,13,64,5,80,5,96,5,112,5,144,5,160,5,6,93,1,17,35,17,1,111,170,5,213,253,213,2,43,0,0,255,255,0,175,0,0,4,179, + 5,213,18,6,3,187,0,0,0,2,0,77,254,86,3,84,6,20,0,6,0,31,0,0,1,38,35,34,7,20,51,55,17,51,17,51,21,35,17,20, + 22,59,1,21,35,34,38,53,48,3,35,32,55,54,51,50,1,146,23,55,77,1,92,80,184,250,250,61,120,49,70,191,153,2,60,254,232,1,1,245, + 53,3,18,132,75,57,250,2,8,252,254,160,253,112,124,116,156,204,202,2,134,189,246,0,0,1,0,201,254,191,5,221,5,213,0,13,0,0,19,33, + 1,17,51,17,51,17,35,17,33,1,17,35,201,1,16,2,150,196,170,170,254,240,253,106,196,5,213,251,31,4,225,250,213,254,21,1,65,4,225,251, + 31,0,0,0,0,1,0,186,254,229,4,247,4,123,0,23,0,0,1,17,51,17,35,17,35,17,52,38,35,34,6,21,17,35,17,51,21,62,1,51, + 50,22,4,100,147,147,184,124,124,149,172,185,185,66,179,117,193,198,2,164,253,239,254,82,1,27,2,158,159,158,190,164,253,135,4,96,174,101,100,239, + 0,1,0,4,255,227,6,57,5,240,0,40,0,0,37,17,33,53,33,17,6,4,35,36,39,38,39,7,39,55,38,53,16,0,33,50,4,23,21,46, + 1,35,32,7,6,3,1,23,1,22,23,22,33,50,54,4,195,254,182,2,18,117,254,230,160,254,162,198,141,40,84,43,112,1,1,139,1,94,146,1, + 7,111,112,252,139,254,239,138,135,3,4,198,43,251,22,25,106,138,1,17,107,168,213,1,145,166,253,127,83,85,1,204,146,226,28,127,37,30,31,1, + 110,1,153,72,70,215,95,96,153,151,254,217,1,149,127,254,95,207,119,153,37,0,0,0,0,3,0,4,254,86,5,16,4,123,0,38,0,48,0,58, + 0,0,37,16,2,33,34,38,39,53,30,1,51,50,54,61,1,14,1,35,34,39,38,39,7,39,55,38,53,16,18,51,50,22,23,53,51,17,55,23, + 15,1,5,22,23,22,51,50,54,53,52,39,38,39,38,35,34,6,21,20,23,4,90,254,254,250,97,172,81,81,158,82,181,180,57,178,124,206,126,67, + 31,104,33,116,7,252,206,124,178,57,184,149,33,182,185,253,159,20,46,82,148,149,165,13,19,50,82,150,148,165,2,139,254,226,254,233,29,30,179,44, + 42,189,191,91,99,98,157,83,112,35,99,39,56,62,1,4,1,58,98,99,170,254,177,50,99,61,61,203,87,60,110,220,199,21,126,98,65,110,220,200, + 29,28,0,0,0,2,0,4,0,0,5,106,5,213,0,19,0,22,0,0,19,51,17,1,33,1,23,37,23,5,1,33,1,7,17,35,17,7,39,55, + 37,39,21,201,202,2,158,1,4,253,27,121,2,82,43,253,237,2,55,254,246,254,11,216,202,154,43,197,1,56,110,5,213,253,137,2,119,253,72,122, + 197,127,176,253,199,1,247,72,254,81,1,108,51,127,65,104,110,147,0,0,0,2,0,4,0,0,4,158,6,20,0,19,0,22,0,0,19,51,17,1, + 51,1,23,37,23,5,1,35,1,7,17,35,53,7,39,55,37,39,21,186,185,2,37,235,253,174,94,1,238,33,254,70,1,184,240,254,133,190,185,149, + 33,182,1,34,105,6,20,252,105,1,227,253,244,91,164,98,147,254,88,1,108,63,254,211,240,50,99,60,97,101,136,0,0,3,0,4,0,0,5,248, + 5,213,0,19,0,22,0,25,0,0,19,33,1,37,17,51,17,55,23,7,17,33,1,5,17,35,17,7,39,55,37,3,17,37,19,17,201,1,16,1, + 94,1,56,196,154,43,197,254,240,254,166,254,196,196,154,43,197,1,192,252,1,234,248,5,213,253,107,103,2,46,254,19,51,127,65,252,165,2,142,105, + 253,219,1,228,51,127,65,149,1,219,253,209,22,254,44,2,38,0,0,0,0,2,0,4,0,0,5,16,4,123,0,23,0,32,0,0,1,17,35,17, + 5,17,35,17,7,39,55,17,51,21,62,1,51,54,23,22,23,55,23,7,39,38,39,38,35,34,6,29,1,4,100,184,253,199,185,149,33,182,185,66, + 179,117,193,99,74,19,145,33,172,186,9,51,62,124,149,172,2,164,253,92,2,106,190,254,84,1,111,50,99,61,2,131,174,101,100,1,120,89,153,49, + 99,57,48,117,64,79,190,164,95,0,0,0,0,3,0,4,0,0,5,139,5,213,0,29,0,36,0,43,0,0,1,30,1,23,19,35,3,46,1,43, + 1,17,35,17,7,39,55,17,33,32,23,22,23,55,23,7,22,21,20,6,45,1,38,39,38,39,35,17,21,51,22,55,54,55,3,141,65,123,62,205, + 217,191,74,139,120,220,202,154,43,197,1,200,1,0,126,73,31,233,43,255,1,131,253,137,2,25,18,44,74,147,254,254,147,74,61,11,2,188,22,144, + 126,254,104,1,127,150,98,253,137,3,1,51,127,66,2,70,107,62,100,78,127,85,13,14,141,186,242,179,63,40,66,1,254,22,40,1,68,56,99,0, + 0,1,0,4,0,0,3,74,4,123,0,25,0,0,1,46,1,35,34,6,29,1,37,23,5,17,35,17,7,39,55,17,51,21,62,1,51,50,22,23, + 3,74,31,73,44,156,167,1,178,33,254,45,185,149,33,182,185,58,186,133,19,46,28,3,180,18,17,203,190,52,144,98,156,254,84,1,111,50,99,60, + 2,132,174,102,99,5,5,0,0,1,0,4,255,227,5,16,5,240,0,47,0,0,1,21,46,1,35,34,6,21,20,22,31,1,37,23,5,22,23,22, + 21,20,4,33,34,38,39,53,30,1,51,50,54,53,52,38,47,1,5,39,37,38,39,38,53,52,36,51,50,22,4,72,115,204,95,165,179,119,166,84, + 2,34,43,254,153,87,54,108,254,221,254,231,106,239,128,123,236,114,173,188,135,154,97,253,226,43,1,101,77,48,101,1,23,245,105,218,5,164,197,55, + 54,128,118,99,101,31,17,181,127,119,39,56,108,182,217,224,48,47,208,69,70,136,126,110,124,31,19,180,127,119,34,46,96,171,198,228,38,0,0,0, + 0,1,0,4,255,227,4,39,4,123,0,47,0,0,1,21,46,1,35,34,6,21,20,22,31,1,37,23,5,22,23,22,23,20,6,35,34,38,39,53, + 30,1,51,50,54,53,52,38,47,1,5,39,37,38,39,38,53,52,54,51,50,22,3,139,78,168,90,137,137,98,148,45,1,186,33,254,214,75,44,82, + 1,247,216,90,195,108,102,198,97,130,140,101,171,36,254,79,33,1,35,62,38,76,224,206,102,180,4,63,174,40,40,84,84,64,73,33,10,147,99,99, + 32,40,76,137,156,182,35,35,190,53,53,89,81,75,80,37,8,144,99,97,27,38,74,131,158,172,30,0,0,1,255,151,0,0,5,159,5,213,0,20, + 0,0,1,14,1,29,1,35,53,52,54,59,1,17,33,17,51,17,35,17,33,17,35,1,45,132,118,156,192,214,202,2,222,202,202,253,34,202,5,48, + 1,94,105,49,70,181,163,253,156,2,100,250,43,2,199,253,57,0,0,0,255,255,0,186,0,0,6,152,4,96,18,6,3,220,0,0,0,1,0,119, + 0,0,3,209,5,213,0,9,0,0,1,17,35,17,33,53,33,17,33,53,3,209,202,253,176,2,80,253,112,5,213,250,43,2,201,170,1,184,170,0, + 0,2,0,70,0,0,4,10,5,213,0,8,0,19,0,0,1,35,34,6,21,20,22,59,1,19,17,35,17,35,34,36,53,52,36,51,3,64,254,141, + 154,154,141,254,202,202,254,251,254,255,1,1,251,5,47,146,134,135,146,2,215,250,43,2,88,226,221,219,227,0,0,0,0,1,0,201,0,0,6,31, + 5,213,0,12,0,0,51,17,51,17,1,51,1,17,51,17,33,9,1,201,196,1,129,203,1,129,197,254,211,254,129,254,131,5,213,250,225,4,0,252, + 0,5,31,250,43,3,248,252,8,0,0,0,0,1,0,201,0,0,1,147,7,109,0,3,0,0,19,51,17,35,201,202,202,7,109,248,147,0,0,0, + 0,1,0,68,0,0,9,85,5,213,0,15,0,0,37,1,51,9,1,51,1,35,9,1,35,9,1,35,1,51,3,244,1,62,227,1,58,1,57,205, + 254,137,254,254,197,254,194,227,254,198,254,199,205,1,119,254,197,5,16,251,18,4,238,250,43,5,16,250,240,4,238,251,18,5,213,0,0,1,0,194, + 4,208,2,149,5,88,0,3,0,17,182,1,169,2,4,3,1,4,16,196,212,49,0,16,212,236,48,1,33,53,33,2,149,254,45,1,211,4,208,136, + 0,1,0,141,3,156,2,189,5,88,0,4,0,0,19,39,1,51,21,214,73,2,8,40,3,156,115,1,73,136,0,0,0,1,0,110,2,104,2,228, + 5,88,0,5,0,0,1,35,1,39,1,51,2,228,16,254,2,104,2,39,79,4,208,253,152,87,2,153,0,1,0,96,1,52,2,242,5,88,0,5, + 0,0,1,35,1,39,1,51,2,242,14,253,242,118,2,53,93,4,208,252,100,68,3,224,0,1,0,90,0,0,2,249,5,88,0,5,0,0,1,35, + 1,39,1,51,2,249,11,253,232,124,2,59,100,4,208,251,48,55,5,33,0,1,0,141,3,156,2,189,5,88,0,4,0,0,19,1,21,35,1,214, + 1,231,40,253,248,5,88,254,204,136,1,73,255,255,0,194,3,156,2,149,4,36,16,7,19,69,0,0,254,204,0,0,255,255,0,141,2,104,2,189, + 4,36,16,7,19,70,0,0,254,204,0,0,255,255,0,110,1,52,2,228,4,36,16,7,19,71,0,0,254,204,0,0,255,255,0,96,0,0,2,242, + 4,36,16,7,19,72,0,0,254,204,0,0,0,1,0,110,2,104,2,228,5,88,0,5,0,0,1,21,35,1,55,1,2,228,79,253,217,104,1,254, + 2,240,136,2,153,87,253,152,255,255,0,141,2,104,2,189,4,36,16,7,19,74,0,0,254,204,0,0,255,255,0,194,2,104,2,149,2,240,16,7, + 19,69,0,0,253,152,0,0,255,255,0,141,1,52,2,189,2,240,16,7,19,70,0,0,253,152,0,0,255,255,0,110,0,0,2,228,2,240,16,7, + 19,71,0,0,253,152,0,0,0,1,0,96,1,52,2,242,5,88,0,5,0,0,1,21,35,1,55,1,2,242,93,253,203,118,2,14,1,188,136,3, + 224,68,252,100,255,255,0,110,1,52,2,228,4,36,16,7,19,79,0,0,254,204,0,0,255,255,0,141,1,52,2,189,2,240,16,7,19,74,0,0, + 253,152,0,0,255,255,0,194,1,52,2,149,1,188,16,7,19,69,0,0,252,100,0,0,255,255,0,141,0,0,2,189,1,188,16,7,19,70,0,0, + 252,100,0,0,0,1,0,90,0,0,2,249,5,88,0,5,0,0,37,21,35,1,55,1,2,249,100,253,197,124,2,24,136,136,5,33,55,251,48,0, + 255,255,0,96,0,0,2,242,4,36,16,7,19,84,0,0,254,204,0,0,255,255,0,110,0,0,2,228,2,240,16,7,19,79,0,0,253,152,0,0, + 255,255,0,141,0,0,2,189,1,188,16,7,19,74,0,0,252,100,0,0,255,255,0,194,0,0,2,149,0,136,17,7,19,69,0,0,251,48,0,7, + 177,0,4,0,16,60,48,0,0,1,0,214,0,0,1,94,5,88,0,3,0,14,181,2,1,0,8,3,4,16,212,236,49,0,196,196,51,17,51,17, + 214,136,5,88,250,168,0,0,0,14,0,150,0,0,7,58,5,220,0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43, + 0,47,0,51,0,55,1,218,183,47,36,48,40,55,44,52,56,16,220,60,220,60,60,60,60,182,31,35,43,32,51,28,39,220,60,60,60,60,220,60, + 182,20,12,27,19,8,16,24,220,60,220,60,60,60,60,182,3,7,15,4,23,0,11,220,60,60,60,60,220,60,176,57,204,176,88,75,82,88,176,56, + 16,75,176,10,98,102,32,176,0,84,88,177,51,48,60,60,89,32,176,64,84,88,64,10,51,48,47,44,55,52,43,40,39,36,60,60,60,60,60,60, + 60,60,60,60,89,32,176,128,84,88,179,35,32,47,44,60,60,60,60,89,32,176,192,84,88,179,55,52,47,44,60,60,60,60,89,32,184,1,0,84, + 88,181,43,40,39,36,55,52,60,60,60,60,60,60,89,32,184,1,64,84,88,179,55,52,31,28,60,60,60,60,89,32,184,1,128,84,88,177,31,28, + 60,60,89,32,184,1,192,84,88,183,43,40,51,48,55,52,47,44,60,60,60,60,60,60,60,60,89,184,16,0,98,184,2,128,99,75,35,97,32,176, + 0,84,88,177,23,20,60,60,89,32,176,1,84,88,64,10,15,12,27,24,23,20,19,16,11,8,60,60,60,60,60,60,60,60,60,60,89,32,176,2, + 84,88,179,7,4,19,16,60,60,60,60,89,32,176,3,84,88,179,19,16,27,24,60,60,60,60,89,32,176,4,84,88,181,27,24,11,8,15,12,60, + 60,60,60,60,60,89,32,176,5,84,88,179,3,0,27,24,60,60,60,60,89,32,176,6,84,88,177,3,0,60,60,89,32,176,7,84,88,183,19,16, + 23,20,27,24,15,12,60,60,60,60,60,60,60,60,89,176,9,84,88,177,27,24,60,60,89,27,182,15,12,43,40,39,36,56,16,60,60,60,60,60, + 60,183,7,4,3,0,11,8,23,20,60,60,60,60,60,60,60,60,89,49,0,183,4,13,24,32,52,41,12,40,47,60,220,60,60,60,60,60,181,5, + 20,25,33,48,53,220,60,60,60,60,60,181,0,21,16,28,49,44,220,60,60,60,60,60,183,9,37,1,8,17,29,36,45,220,60,60,60,60,60,220, + 60,48,1,17,51,17,3,17,51,17,1,53,33,21,1,53,33,21,1,17,51,17,21,53,33,21,1,17,51,17,1,17,51,17,3,17,51,17,1,53, + 33,21,1,53,33,21,1,17,51,17,21,53,33,21,1,17,51,17,6,214,100,100,100,253,118,2,38,253,218,2,38,253,118,100,2,38,253,118,100,254, + 112,100,100,100,253,118,2,38,253,218,2,38,253,118,100,2,38,253,118,100,3,37,2,78,253,178,253,68,2,78,253,178,5,15,100,100,250,136,100,100, + 3,37,2,78,253,178,105,100,100,253,173,2,78,253,178,2,188,2,78,253,178,253,68,2,78,253,178,5,15,100,100,250,136,100,100,3,37,2,78,253, + 178,105,100,100,253,173,2,78,253,178,0,0,0,14,0,150,0,0,7,58,5,220,0,3,0,7,0,11,0,15,0,19,0,23,0,27,0,31,0,35, + 0,39,0,43,0,47,0,51,0,55,1,224,183,47,36,48,40,55,44,52,56,16,220,60,220,60,60,60,60,182,31,35,43,32,51,28,39,220,60,60, + 60,60,220,60,182,20,12,27,19,8,16,24,220,60,220,60,60,60,60,182,3,7,15,4,23,0,11,220,60,60,60,60,220,60,176,57,204,176,88,0, + 75,1,82,88,176,56,16,0,75,1,176,10,98,102,32,176,0,84,88,177,51,48,60,60,89,32,176,64,84,88,64,10,51,48,47,44,55,52,43,40, + 39,36,60,60,60,60,60,60,60,60,60,60,89,32,176,128,84,88,179,35,32,47,44,60,60,60,60,89,32,176,192,84,88,179,55,52,47,44,60,60, + 60,60,89,32,184,1,0,84,88,181,43,40,39,36,55,52,60,60,60,60,60,60,89,32,184,1,64,84,88,179,55,52,31,28,60,60,60,60,89,32, + 184,1,128,84,88,177,31,28,60,60,89,32,184,1,192,84,88,183,43,40,51,48,55,52,47,44,60,60,60,60,60,60,60,60,89,184,16,0,98,184, + 2,128,99,0,75,1,35,97,32,176,0,84,88,177,23,20,60,60,89,32,176,1,84,88,64,10,15,12,27,24,23,20,19,16,11,8,60,60,60,60, + 60,60,60,60,60,60,89,32,176,2,84,88,179,7,4,19,16,60,60,60,60,89,32,176,3,84,88,179,19,16,27,24,60,60,60,60,89,32,176,4, + 84,88,181,27,24,11,8,15,12,60,60,60,60,60,60,89,32,176,5,84,88,179,3,0,27,24,60,60,60,60,89,32,176,6,84,88,177,3,0,60, + 60,89,32,176,7,84,88,183,19,16,23,20,27,24,15,12,60,60,60,60,60,60,60,60,89,176,9,84,88,177,27,24,60,60,89,27,182,15,12,43, + 40,39,36,56,16,60,60,60,60,60,60,183,7,4,3,0,11,8,23,20,60,60,60,60,60,60,60,60,89,49,0,183,4,13,24,32,52,41,12,40, + 47,60,220,60,60,60,60,60,181,5,20,25,33,48,53,220,60,60,60,60,60,181,0,21,16,28,49,44,220,60,60,60,60,60,183,9,37,1,8,17, + 29,36,45,220,60,60,60,60,60,220,60,48,1,17,51,17,3,17,51,17,1,53,33,21,1,53,33,21,1,17,51,17,21,53,33,21,1,17,51,17, + 1,17,51,17,3,17,51,17,1,53,33,21,1,53,33,21,1,17,51,17,21,53,33,21,1,17,51,17,6,214,100,100,100,253,118,2,38,253,218,2, + 38,253,118,100,2,38,253,118,100,254,112,100,100,100,253,118,2,38,253,218,2,38,253,118,100,2,38,253,118,100,3,27,2,88,253,168,253,68,2,88, + 253,168,5,25,100,100,250,136,100,100,3,27,2,88,253,168,95,100,100,253,163,2,88,253,168,2,188,2,88,253,168,253,68,2,88,253,168,5,25,100, + 100,250,136,100,100,3,27,2,88,253,168,95,100,100,253,163,2,88,253,168,0,14,0,150,0,0,7,58,5,220,0,3,0,7,0,11,0,15,0,19, + 0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,1,218,183,47,36,48,40,55,44,52,56,16,220,60,220,60,60,60,60,182,31,35, + 43,32,51,28,39,220,60,60,60,60,220,60,182,20,12,27,19,8,16,24,220,60,220,60,60,60,60,182,3,7,15,4,23,0,11,220,60,60,60,60, + 220,60,176,57,204,176,88,76,82,88,176,56,16,76,176,10,98,102,32,176,0,84,88,177,51,48,60,60,89,32,176,64,84,88,64,10,51,48,47,44, + 55,52,43,40,39,36,60,60,60,60,60,60,60,60,60,60,89,32,176,128,84,88,179,35,32,47,44,60,60,60,60,89,32,176,192,84,88,179,55,52, + 47,44,60,60,60,60,89,32,184,1,0,84,88,181,43,40,39,36,55,52,60,60,60,60,60,60,89,32,184,1,64,84,88,179,55,52,31,28,60,60, + 60,60,89,32,184,1,128,84,88,177,31,28,60,60,89,32,184,1,192,84,88,183,43,40,51,48,55,52,47,44,60,60,60,60,60,60,60,60,89,184, + 16,0,98,184,2,128,99,76,35,97,32,176,0,84,88,177,23,20,60,60,89,32,176,1,84,88,64,10,15,12,27,24,23,20,19,16,11,8,60,60, + 60,60,60,60,60,60,60,60,89,32,176,2,84,88,179,7,4,19,16,60,60,60,60,89,32,176,3,84,88,179,19,16,27,24,60,60,60,60,89,32, + 176,4,84,88,181,27,24,11,8,15,12,60,60,60,60,60,60,89,32,176,5,84,88,179,3,0,27,24,60,60,60,60,89,32,176,6,84,88,177,3, + 0,60,60,89,32,176,7,84,88,183,19,16,23,20,27,24,15,12,60,60,60,60,60,60,60,60,89,176,9,84,88,177,27,24,60,60,89,27,182,15, + 12,43,40,39,36,56,16,60,60,60,60,60,60,183,7,4,3,0,11,8,23,20,60,60,60,60,60,60,60,60,89,49,0,183,4,13,24,32,52,41, + 12,40,47,60,220,60,60,60,60,60,181,5,20,25,33,48,53,220,60,60,60,60,60,181,0,21,16,28,49,44,220,60,60,60,60,60,183,9,37,1, + 8,17,29,36,45,220,60,60,60,60,60,220,60,48,1,17,51,17,3,17,51,17,1,53,33,21,1,53,33,21,1,17,51,17,21,53,33,21,1,17, + 51,17,1,17,51,17,3,17,51,17,1,53,33,21,1,53,33,21,1,17,51,17,21,53,33,21,1,17,51,17,6,214,100,100,100,253,118,2,38,253, + 218,2,38,253,118,100,2,38,253,118,100,254,112,100,100,100,253,118,2,38,253,218,2,38,253,118,100,2,38,253,118,100,3,37,2,78,253,178,253,68, + 2,78,253,178,5,15,100,100,250,136,100,100,3,37,2,78,253,178,105,100,100,253,173,2,78,253,178,2,188,2,78,253,178,253,68,2,78,253,178,5, + 15,100,100,250,136,100,100,3,37,2,78,253,178,105,100,100,253,173,2,78,253,178,0,0,0,14,0,150,0,0,7,58,5,220,0,3,0,7,0,11, + 0,15,0,19,0,23,0,27,0,31,0,35,0,39,0,43,0,47,0,51,0,55,1,224,183,47,36,48,40,55,44,52,56,16,220,60,220,60,60,60, + 60,182,31,35,43,32,51,28,39,220,60,60,60,60,220,60,182,20,12,27,19,8,16,24,220,60,220,60,60,60,60,182,3,7,15,4,23,0,11,220, + 60,60,60,60,220,60,176,57,204,176,88,0,76,1,82,88,176,56,16,0,76,1,176,10,98,102,32,176,0,84,88,177,51,48,60,60,89,32,176,64, + 84,88,64,10,51,48,47,44,55,52,43,40,39,36,60,60,60,60,60,60,60,60,60,60,89,32,176,128,84,88,179,35,32,47,44,60,60,60,60,89, + 32,176,192,84,88,179,55,52,47,44,60,60,60,60,89,32,184,1,0,84,88,181,43,40,39,36,55,52,60,60,60,60,60,60,89,32,184,1,64,84, + 88,179,55,52,31,28,60,60,60,60,89,32,184,1,128,84,88,177,31,28,60,60,89,32,184,1,192,84,88,183,43,40,51,48,55,52,47,44,60,60, + 60,60,60,60,60,60,89,184,16,0,98,184,2,128,99,0,76,1,35,97,32,176,0,84,88,177,23,20,60,60,89,32,176,1,84,88,64,10,15,12, + 27,24,23,20,19,16,11,8,60,60,60,60,60,60,60,60,60,60,89,32,176,2,84,88,179,7,4,19,16,60,60,60,60,89,32,176,3,84,88,179, + 19,16,27,24,60,60,60,60,89,32,176,4,84,88,181,27,24,11,8,15,12,60,60,60,60,60,60,89,32,176,5,84,88,179,3,0,27,24,60,60, + 60,60,89,32,176,6,84,88,177,3,0,60,60,89,32,176,7,84,88,183,19,16,23,20,27,24,15,12,60,60,60,60,60,60,60,60,89,176,9,84, + 88,177,27,24,60,60,89,27,182,15,12,43,40,39,36,56,16,60,60,60,60,60,60,183,7,4,3,0,11,8,23,20,60,60,60,60,60,60,60,60, + 89,49,0,183,4,13,24,32,52,41,12,40,47,60,220,60,60,60,60,60,181,5,20,25,33,48,53,220,60,60,60,60,60,181,0,21,16,28,49,44, + 220,60,60,60,60,60,183,9,37,1,8,17,29,36,45,220,60,60,60,60,60,220,60,48,1,17,51,17,3,17,51,17,1,53,33,21,1,53,33,21, + 1,17,51,17,21,53,33,21,1,17,51,17,1,17,51,17,3,17,51,17,1,53,33,21,1,53,33,21,1,17,51,17,21,53,33,21,1,17,51,17, + 6,214,100,100,100,253,118,2,38,253,218,2,38,253,118,100,2,38,253,118,100,254,112,100,100,100,253,118,2,38,253,218,2,38,253,118,100,2,38,253, + 118,100,3,27,2,88,253,168,253,68,2,88,253,168,5,25,100,100,250,136,100,100,3,27,2,88,253,168,95,100,100,253,163,2,88,253,168,2,188,2, + 88,253,168,253,68,2,88,253,168,5,25,100,100,250,136,100,100,3,27,2,88,253,168,95,100,100,253,163,2,88,253,168,0,1,0,110,255,226,4,54, + 6,159,0,21,0,0,1,21,16,33,32,17,53,19,51,3,21,16,33,32,17,53,52,0,17,51,22,0,4,54,254,38,254,18,59,200,69,1,48,1, + 38,254,15,181,1,1,239,2,161,159,253,224,2,37,139,1,9,254,218,115,254,128,1,138,184,249,1,203,1,23,197,254,7,0,0,0,0,2,0,110, + 255,226,4,54,6,159,0,9,0,28,0,0,1,18,37,4,3,21,16,33,32,17,55,21,16,32,17,53,16,37,51,54,39,38,39,51,20,22,7,51, + 4,3,130,1,254,201,254,225,1,1,38,1,48,180,252,56,1,147,20,52,134,133,2,207,218,37,20,1,96,2,157,1,103,11,8,254,130,85,254,78, + 1,173,75,55,253,159,2,97,60,1,235,61,163,81,82,178,108,158,243,69,0,2,0,110,255,226,4,143,6,179,0,9,0,33,0,0,1,16,33,32, + 17,21,16,33,32,17,55,21,16,33,32,17,53,16,37,51,54,39,54,35,34,21,35,16,33,32,3,6,7,4,3,210,254,183,254,163,1,88,1,78, + 189,253,241,253,238,2,7,94,77,2,1,190,182,164,1,87,1,92,1,12,68,1,38,2,126,1,164,254,98,95,254,93,1,163,97,87,253,179,2,62, + 120,1,214,78,92,97,154,196,1,100,254,193,139,85,114,0,0,2,0,110,0,0,6,175,6,179,0,36,0,46,0,0,37,54,55,0,17,53,16,33, + 50,23,54,33,32,17,21,16,5,36,17,53,52,55,38,35,32,17,21,16,1,23,4,23,33,38,39,36,7,1,16,33,32,3,21,2,5,36,19,1, + 13,99,127,254,127,1,185,169,159,101,1,2,1,217,254,39,254,52,39,84,173,254,251,1,168,212,1,135,56,254,248,13,238,254,254,245,4,133,254,229, + 254,239,1,1,1,19,1,26,1,195,78,33,1,86,1,198,109,1,248,179,169,253,255,149,253,210,30,28,2,48,119,95,140,154,254,183,99,254,45,254, + 177,24,83,214,82,64,64,180,4,93,1,143,254,158,154,254,119,29,28,1,108,0,0,0,0,1,0,111,255,226,4,54,6,179,0,23,0,0,1,16, + 33,32,27,1,51,3,16,33,4,25,1,52,33,34,17,23,35,3,16,33,32,17,4,54,254,22,254,34,1,90,208,110,1,39,1,58,254,228,243,83, + 190,69,1,178,1,183,1,200,254,26,1,233,1,47,254,209,254,183,1,1,79,3,115,209,254,255,246,1,13,1,137,254,139,0,0,0,0,1,0,110, + 255,226,4,54,6,179,0,33,0,0,1,6,7,22,29,1,16,32,17,19,51,3,16,33,32,17,53,52,39,35,53,51,54,3,52,35,4,7,23,35, + 39,16,33,32,4,14,5,205,250,252,56,53,196,60,1,39,1,48,190,170,91,220,2,252,254,254,3,37,186,25,1,179,1,187,5,27,230,124,115,254, + 125,254,23,2,1,1,23,254,224,254,168,1,78,115,205,40,169,80,1,10,218,1,245,154,158,1,144,0,0,3,0,110,255,226,4,203,6,179,0,9, + 0,19,0,38,0,0,1,18,7,34,21,20,23,54,55,51,1,16,33,32,17,21,16,33,32,17,55,21,16,33,32,17,53,52,55,38,53,16,33,32, + 17,20,7,51,4,2,209,2,214,209,104,102,192,18,1,61,254,200,254,180,1,71,1,61,194,253,255,253,253,101,190,1,133,1,145,12,11,1,72,4, + 222,1,54,1,223,180,95,99,9,253,229,1,136,254,118,75,254,93,1,155,88,75,253,184,2,82,70,141,188,148,206,1,142,254,46,37,64,127,0,0, + 0,2,0,110,255,226,6,160,6,179,0,9,0,34,0,0,1,16,33,32,25,1,16,33,32,17,37,2,3,33,36,19,17,16,35,34,3,17,16,33, + 32,25,1,16,33,54,23,54,51,32,19,3,73,254,243,254,237,1,19,1,13,3,87,10,204,254,247,1,8,23,242,215,19,254,46,254,60,1,206,224, + 149,115,247,1,131,2,4,146,1,130,254,126,253,147,254,92,1,164,155,254,70,254,250,229,1,219,1,210,1,121,254,237,253,45,253,189,2,67,2,109, + 2,33,2,230,218,253,233,0,0,1,0,110,0,0,4,3,6,179,0,21,0,0,1,16,3,35,18,25,1,16,35,32,25,1,16,19,35,2,25,1, + 16,33,32,17,4,3,155,198,164,245,254,219,174,200,164,1,227,1,178,2,251,254,138,254,123,1,67,1,184,1,154,1,126,254,130,254,102,254,83,254, + 178,1,121,1,130,1,154,2,30,253,226,0,0,1,0,110,255,226,4,54,6,160,0,28,0,0,1,2,33,32,17,19,51,3,16,5,32,17,53,16, + 43,1,53,51,36,53,52,39,33,22,21,16,7,22,17,4,54,1,254,29,254,28,43,206,60,1,39,1,48,210,220,175,0,255,200,1,24,100,250,250, + 1,198,254,28,1,243,1,36,254,220,254,174,1,1,68,120,1,60,168,129,175,149,185,190,109,254,247,100,99,254,158,0,0,1,0,110,0,0,8,235, + 6,179,0,53,0,0,37,54,55,36,3,53,16,33,50,23,54,32,23,54,51,32,17,21,20,3,35,18,61,1,18,35,32,21,17,35,17,16,35,6, + 21,17,35,17,38,33,34,17,21,18,5,54,23,4,1,33,38,37,36,1,1,93,115,145,254,61,48,1,183,232,112,100,1,158,109,94,243,1,174,223, + 205,252,1,253,255,0,172,227,219,173,2,254,254,248,45,1,178,122,144,2,14,1,18,254,208,40,254,153,254,155,254,201,166,120,67,243,1,240,123,1, + 235,178,187,187,178,254,31,103,186,254,100,1,177,200,63,1,71,231,254,90,1,166,1,0,2,254,254,90,1,166,231,254,183,121,254,65,233,23,11,35, + 254,118,165,92,91,254,195,0,0,2,0,110,255,226,4,52,6,179,0,9,0,30,0,0,1,17,38,39,32,17,21,16,5,32,19,16,33,32,17,53, + 16,37,50,23,53,52,33,34,6,7,35,16,33,32,17,3,139,106,184,254,195,1,58,1,37,169,254,50,254,8,1,227,158,157,254,225,153,123,1,178, + 1,186,1,212,1,218,1,203,63,1,254,193,184,254,149,1,1,98,253,254,2,2,174,1,238,20,74,209,249,113,108,1,124,254,99,0,0,2,0,130, + 255,226,4,74,6,160,0,9,0,27,0,0,1,16,33,34,7,17,16,33,32,17,55,21,16,33,32,25,1,16,41,1,21,33,34,29,1,54,51,32, + 3,150,254,201,168,129,1,53,1,43,180,254,21,254,35,1,81,2,3,254,2,172,169,140,1,233,2,171,1,79,75,254,38,254,173,1,68,254,250,254, + 24,1,232,3,84,1,130,160,230,199,85,0,0,1,0,110,0,0,6,134,6,179,0,32,0,0,1,16,1,35,0,25,1,16,33,34,25,1,35,17, + 16,33,34,25,1,16,1,35,0,25,1,16,33,50,23,54,51,32,17,6,134,254,199,224,1,94,254,242,229,183,254,247,235,1,62,215,254,218,1,190, + 222,120,130,185,1,201,2,194,254,102,254,216,1,110,1,85,1,207,1,131,254,207,253,130,2,135,1,40,254,125,254,49,254,167,254,150,1,40,1,155, + 1,207,2,33,240,240,253,223,0,1,0,110,255,226,4,54,6,159,0,30,0,0,1,21,16,33,32,17,55,51,7,16,33,32,17,53,52,39,35,53, + 51,36,53,52,36,53,51,20,4,21,20,7,4,4,54,254,48,254,8,20,199,29,1,53,1,33,176,218,115,1,3,254,93,220,1,123,235,0,255,1, + 215,37,254,48,1,223,179,179,254,193,1,63,67,192,45,182,63,176,163,114,244,150,142,221,178,121,110,0,0,1,0,110,255,226,4,53,6,193,0,22, + 0,0,1,16,37,32,17,51,16,33,32,25,1,5,4,21,16,37,53,4,39,54,37,53,37,4,53,254,24,254,33,190,1,33,1,51,253,215,1,96, + 253,184,1,162,1,2,254,93,3,198,1,209,254,15,2,2,74,254,86,1,79,4,59,50,120,214,254,125,2,178,2,206,176,95,167,130,0,1,0,110, + 0,0,6,225,6,179,0,38,0,0,1,21,16,1,35,0,17,53,16,37,32,3,17,35,17,16,33,32,17,21,16,1,35,0,17,53,16,37,36,33, + 21,36,3,55,32,23,54,51,32,6,225,254,162,239,1,135,254,251,254,245,1,192,254,230,254,252,1,148,235,254,153,1,20,1,21,2,202,252,242,176, + 125,1,10,138,117,219,1,220,3,30,124,254,98,254,252,1,98,1,73,140,1,75,2,254,215,254,162,1,94,1,40,254,180,149,254,193,254,157,1,4, + 1,158,119,1,163,252,251,160,1,254,216,52,244,244,0,0,0,1,0,130,255,226,4,74,6,159,0,21,0,0,1,21,16,33,32,25,1,51,17,16, + 33,32,17,53,52,2,39,55,51,7,20,0,4,74,254,21,254,35,180,1,43,1,53,252,3,45,200,74,1,8,2,7,45,254,8,2,82,4,107,251, + 109,254,118,1,73,75,179,1,38,153,217,230,124,254,251,0,0,1,0,110,255,226,5,106,6,179,0,36,0,0,1,14,1,7,17,22,18,51,50,18, + 53,17,52,2,39,35,19,35,19,53,51,21,51,4,18,7,17,22,0,33,32,0,53,17,52,18,55,2,10,132,88,2,1,209,241,239,205,214,146,18, + 20,187,20,147,18,1,46,250,1,1,254,215,254,169,254,188,254,199,192,220,5,167,47,240,179,254,189,152,254,136,1,119,153,1,64,182,1,68,2,252, + 237,3,17,231,68,92,254,117,177,254,182,209,254,38,1,214,213,1,73,176,1,141,82,0,0,1,0,50,255,225,4,39,6,179,0,30,0,0,1,18, + 33,32,3,19,51,3,16,33,32,25,1,38,35,34,23,17,35,17,38,39,35,53,51,50,23,54,51,32,17,4,39,1,254,52,254,8,4,56,203,68, + 1,66,1,29,1,194,167,2,159,20,158,147,140,155,75,105,169,1,113,1,238,253,243,1,234,1,46,254,215,254,178,1,53,3,180,169,84,254,104,1, + 77,140,19,159,159,159,254,134,0,2,0,110,255,226,6,140,6,179,0,9,0,55,0,0,1,16,33,32,17,21,16,33,32,17,1,6,0,33,35,34, + 36,53,51,20,22,59,1,50,54,53,16,43,1,53,55,54,53,16,33,34,7,22,7,21,16,37,4,17,53,16,33,50,23,54,51,32,17,16,7,22, + 3,70,254,239,254,247,1,22,1,4,3,50,1,254,191,254,233,100,207,254,181,203,218,130,74,198,232,127,124,59,212,254,247,133,111,38,3,254,73,254, + 43,1,195,253,109,140,187,1,170,236,216,4,158,1,118,254,143,139,254,121,1,135,253,192,212,254,222,217,129,59,128,205,137,1,1,151,2,137,223,1, + 53,128,112,148,114,253,215,1,1,2,41,139,2,16,199,193,254,90,254,229,146,123,0,0,0,1,0,110,255,226,4,53,6,159,0,25,0,0,1,16, + 33,32,17,55,51,7,16,33,32,25,1,2,39,6,7,19,35,39,16,5,50,19,17,51,4,53,254,22,254,35,55,204,69,1,33,1,63,208,180,196, + 1,66,179,60,1,109,172,221,169,1,202,254,24,1,232,221,220,254,183,1,78,2,36,1,178,2,1,168,254,255,249,1,94,2,254,170,1,162,0,0, + 0,1,0,110,255,226,6,187,6,179,0,42,0,0,55,54,55,0,17,53,16,33,50,19,18,51,32,19,21,6,3,35,18,61,1,16,33,32,25,1, + 35,17,16,32,19,21,2,1,22,23,4,23,33,38,39,36,5,252,120,154,254,96,1,198,217,137,120,230,1,198,1,2,175,229,214,254,253,254,241,171, + 253,236,2,1,1,179,118,83,1,165,56,254,248,3,253,254,239,254,223,177,98,34,1,28,2,32,75,1,247,254,249,1,7,254,32,97,235,254,148,1, + 96,242,84,1,84,254,114,254,192,1,64,1,141,254,168,109,254,77,254,173,4,18,112,225,82,99,69,190,0,1,0,110,255,226,4,52,6,161,0,29, + 0,0,1,16,33,32,17,19,51,3,16,33,32,25,1,6,7,4,17,53,52,55,51,6,29,1,16,5,54,55,17,51,4,52,254,25,254,33,30,194, + 34,1,33,1,63,165,144,254,53,144,225,179,1,3,164,155,168,1,197,254,29,1,187,1,9,254,243,254,233,1,68,1,248,99,11,2,1,185,40,169, + 201,212,148,40,254,218,1,10,116,2,57,0,0,2,0,110,255,226,4,52,6,179,0,8,0,35,0,0,1,17,38,35,32,17,21,2,32,19,16,33, + 32,17,53,18,33,22,23,17,52,35,34,29,1,35,53,52,33,53,32,23,54,51,32,17,3,140,115,199,254,219,1,2,96,168,254,49,254,9,1,1, + 227,136,178,174,179,164,254,231,1,28,54,85,212,1,75,1,203,1,198,73,254,144,114,254,138,1,93,254,3,2,12,144,1,249,2,61,1,96,124,180, + 58,58,180,159,192,192,254,179,0,1,0,131,0,0,4,74,6,179,0,29,0,0,1,55,52,35,34,17,21,54,23,4,3,21,16,3,35,18,61,1, + 16,5,38,7,17,35,17,2,33,32,19,7,2,143,16,165,196,174,155,1,204,1,192,220,232,254,218,129,185,179,1,1,85,1,127,1,20,5,14,146, + 117,254,230,225,104,4,1,254,61,94,254,253,254,167,1,117,176,174,1,19,1,1,98,252,124,4,240,1,195,254,237,146,0,1,0,112,255,226,4,195, + 6,160,0,35,0,0,1,22,7,4,17,16,0,32,0,25,1,2,19,51,2,21,17,26,1,23,50,18,53,38,43,1,53,51,36,53,52,36,55,51, + 20,4,4,145,2,248,1,40,254,229,254,2,254,198,2,114,215,134,1,204,171,175,172,3,192,210,90,1,9,254,227,1,184,1,36,5,7,174,140,123, + 254,246,254,226,254,184,1,72,1,112,1,157,1,44,1,61,254,139,244,254,99,254,246,254,242,1,1,15,173,251,163,101,194,129,145,140,84,136,0,0, + 0,2,0,110,255,226,4,52,6,159,0,9,0,21,0,0,1,17,38,35,32,17,21,16,33,32,19,16,33,32,17,53,16,33,54,23,17,51,3,140, + 122,202,254,228,1,28,1,68,168,254,30,254,28,1,228,166,148,168,2,7,1,163,80,254,112,89,254,113,1,108,253,244,2,62,74,2,61,1,82,2, + 73,0,0,0,0,2,0,131,255,226,4,73,6,179,0,26,0,36,0,0,19,16,33,50,23,54,33,21,32,29,1,35,53,52,35,34,21,17,54,55, + 32,19,21,16,33,32,19,51,16,33,32,17,53,16,33,34,7,131,1,91,200,96,37,1,30,254,231,164,167,175,166,138,1,225,2,254,9,254,48,2, + 179,1,23,1,73,254,207,137,166,5,121,1,58,189,189,159,160,68,68,160,155,254,158,85,1,254,17,119,253,219,2,27,254,133,1,113,139,1,82,96, + 0,2,0,110,255,226,4,92,6,160,0,28,0,35,0,0,1,35,19,51,21,35,19,16,33,32,17,55,51,7,16,33,32,17,3,35,32,17,16,33, + 51,39,51,23,51,1,20,59,1,3,35,34,4,91,220,63,158,126,87,254,22,254,35,59,204,72,1,32,1,53,94,225,254,103,1,156,94,37,200,34, + 242,252,238,242,213,68,142,245,5,105,254,185,141,254,53,254,24,1,232,221,220,254,183,1,78,1,197,1,45,1,54,168,168,254,207,165,1,71,0,0, + 0,2,0,130,255,226,4,74,6,159,0,9,0,21,0,0,1,16,33,6,7,17,16,33,32,17,55,21,16,33,32,25,1,51,17,54,51,4,3,150, + 254,203,162,136,1,57,1,38,180,254,38,254,18,181,161,137,1,233,2,141,1,127,3,85,254,88,254,118,1,128,110,95,253,209,2,37,4,152,253,188, + 78,1,0,0,0,1,0,50,255,226,3,239,6,179,0,33,0,0,1,7,37,3,4,23,6,4,33,53,32,54,53,38,37,39,19,37,55,5,55,54, + 52,38,35,7,53,51,50,23,22,20,15,1,3,239,77,254,167,145,1,80,1,1,254,201,254,153,1,23,201,1,254,250,115,233,254,121,80,1,129,106, + 19,74,64,130,156,132,74,75,30,112,3,204,138,171,254,235,110,220,198,230,160,127,122,192,40,69,1,149,190,140,197,194,28,83,56,19,155,75,74,178, + 55,196,0,0,0,1,0,110,255,226,4,53,6,179,0,38,0,0,1,16,33,32,17,51,16,33,32,17,52,43,1,53,51,50,53,52,39,35,53,51, + 50,53,52,33,35,53,51,32,17,20,7,51,22,21,22,7,22,4,53,254,24,254,33,190,1,33,1,45,154,231,211,154,154,231,231,131,254,109,118,118, + 2,81,151,2,169,1,131,150,1,153,254,73,2,4,254,156,1,23,197,179,132,121,1,181,153,184,158,254,170,155,97,78,135,148,71,110,0,1,0,120, + 255,226,4,62,6,178,0,38,0,0,5,32,25,1,51,17,16,33,32,17,52,39,35,53,51,50,55,38,43,1,53,51,54,53,52,33,53,32,17,6, + 7,35,22,23,6,7,22,21,16,2,92,254,28,181,1,48,1,39,131,169,169,108,5,5,131,166,166,111,254,215,1,231,1,159,2,182,1,1,173,192, + 30,1,230,4,77,251,179,254,186,1,18,224,2,177,131,125,183,1,180,129,158,254,210,165,83,103,126,128,92,86,225,254,78,0,0,0,0,2,0,110, + 255,95,4,54,6,179,0,9,0,31,0,0,1,16,5,36,25,1,16,33,32,17,3,50,55,35,0,25,1,16,33,32,25,1,16,1,22,51,21,34, + 37,35,4,39,1,44,1,36,1,42,254,215,254,219,190,217,63,2,254,234,1,226,1,228,254,229,46,239,195,254,231,21,254,238,197,2,210,254,104,120, + 120,1,152,1,162,1,160,254,96,251,169,83,1,4,1,94,1,166,2,59,253,193,254,94,254,162,254,248,79,190,230,231,1,0,0,0,0,1,0,110, + 255,226,4,52,6,181,0,28,0,0,1,16,33,32,17,53,51,21,16,33,32,17,53,16,43,1,53,51,36,17,5,21,35,17,37,16,5,4,17,4, + 52,254,23,254,37,189,1,37,1,40,242,228,123,1,91,253,181,193,3,198,254,186,1,70,1,150,254,76,1,212,211,221,254,214,1,20,155,1,26,164, + 173,1,120,23,236,1,143,21,253,191,158,113,254,210,0,0,0,1,0,110,255,226,4,66,6,180,0,32,0,0,1,16,33,32,17,53,51,21,16,33, + 32,17,16,33,35,53,51,36,3,6,35,4,17,51,20,33,50,55,51,21,2,5,4,4,53,254,24,254,33,191,1,32,1,45,254,234,192,110,1,103, + 2,167,131,254,33,190,1,33,222,125,154,11,254,213,1,41,1,200,254,26,1,230,142,142,254,186,1,70,1,96,173,30,1,187,111,2,1,119,198,197, + 225,254,128,166,156,0,0,0,0,3,0,110,255,226,4,193,6,179,0,7,0,15,0,37,0,0,1,33,36,17,16,33,32,53,1,16,41,1,17,52, + 33,32,1,21,16,33,32,17,16,37,35,36,17,16,33,32,17,21,51,21,35,17,51,21,3,132,254,199,254,225,1,38,1,50,253,168,1,31,1,57, + 254,206,254,218,3,9,254,22,254,35,1,12,1,254,245,1,228,1,227,140,140,140,2,222,2,254,206,254,212,244,3,98,254,186,1,159,227,251,218,120, + 254,108,1,204,1,33,106,96,1,63,1,219,254,126,151,190,254,202,184,0,0,2,0,110,255,226,7,54,6,180,0,10,0,44,0,0,1,17,52,38, + 35,32,19,17,16,5,32,19,16,33,34,39,21,16,33,53,32,53,17,16,33,34,6,29,1,16,33,21,32,3,53,16,36,55,32,23,54,33,4,18, + 21,6,124,129,166,254,222,2,1,32,1,39,186,254,24,128,154,254,47,1,20,254,218,139,153,1,37,254,29,1,1,24,203,1,4,137,118,1,1,1, + 39,186,3,181,1,3,195,154,254,217,254,107,254,212,1,1,132,253,221,135,158,254,108,160,244,3,120,1,39,155,194,253,254,175,165,1,246,253,1,1, + 250,1,216,216,1,254,196,191,0,3,0,122,254,30,6,249,6,135,0,7,0,15,0,35,0,0,1,4,7,3,6,51,50,37,23,36,55,19,54,35, + 34,5,1,6,5,19,35,3,4,35,34,27,1,54,37,3,51,19,36,51,50,3,3,154,253,252,27,66,23,112,114,1,46,171,2,4,14,72,27,143, + 90,254,227,2,100,32,253,68,93,207,93,254,199,169,211,42,72,36,2,188,79,190,72,1,53,193,212,42,3,252,78,168,254,44,174,174,174,70,104,1, + 250,174,73,253,161,224,40,253,244,2,145,175,1,50,1,249,250,58,2,40,253,106,110,254,205,0,0,0,0,2,0,100,254,40,6,19,6,211,0,48, + 0,60,0,0,1,22,0,21,20,7,4,17,2,5,36,3,52,55,39,38,39,6,17,16,5,4,23,35,38,37,6,7,39,54,55,36,17,16,37,38, + 53,55,23,7,20,22,51,50,54,53,38,0,53,1,16,35,34,7,6,7,6,21,18,5,54,3,107,1,1,86,30,1,111,21,254,114,254,98,20,60, + 70,106,85,221,1,101,2,43,5,219,11,254,124,150,116,122,107,156,254,158,1,58,36,38,160,24,151,97,111,128,1,254,172,2,165,239,31,27,54,88, + 67,10,1,1,229,6,211,164,254,230,171,102,69,20,254,44,254,32,20,20,1,235,102,142,10,9,92,55,254,185,254,172,173,192,222,168,89,3,152,108, + 103,47,233,1,66,1,191,56,77,117,177,56,121,142,144,137,139,122,1,27,212,251,14,1,82,5,52,26,93,161,254,149,10,10,0,0,0,2,0,100, + 255,226,3,172,6,30,0,3,0,22,0,0,19,33,21,33,1,16,33,32,17,55,51,7,16,51,50,17,38,36,53,51,22,23,22,217,2,86,253,170, + 2,211,254,91,254,93,39,176,35,242,239,1,254,122,187,2,190,191,6,30,148,252,32,254,56,1,190,208,208,254,206,1,60,221,254,221,173,126,126,0, + 0,3,0,100,255,226,3,172,6,56,0,3,0,7,0,26,0,0,1,51,21,35,37,51,21,35,1,16,33,32,17,55,51,7,16,51,50,17,38,36, + 53,51,22,23,22,2,76,203,203,254,121,203,203,2,231,254,91,254,93,39,176,35,242,239,1,254,122,187,2,190,191,6,56,202,202,202,252,60,254,56, + 1,190,208,208,254,206,1,60,221,254,221,173,126,126,0,0,0,4,0,100,255,226,3,172,7,0,0,18,0,22,0,26,0,30,0,0,1,16,33,32, + 17,55,51,7,16,51,50,17,38,36,53,51,22,23,22,1,33,21,33,1,51,21,35,37,51,21,35,3,172,254,91,254,93,39,176,35,242,239,1,254, + 122,187,2,190,191,253,13,2,86,253,170,1,137,203,203,254,121,203,203,1,170,254,56,1,190,208,208,254,206,1,60,221,254,221,173,126,126,2,182,148, + 2,37,202,202,202,0,0,0,0,2,0,100,255,226,3,172,6,140,0,3,0,22,0,0,1,51,1,35,1,16,33,32,17,55,51,7,16,51,50,17, + 38,36,53,51,22,23,22,2,39,235,254,254,173,2,73,254,91,254,93,39,176,35,242,239,1,254,122,187,2,190,191,6,140,254,248,252,38,254,56,1, + 190,208,208,254,206,1,60,221,254,221,173,126,126,0,0,0,0,3,0,100,255,226,3,172,7,24,0,3,0,7,0,26,0,0,1,51,3,35,7,33, + 21,33,1,16,33,32,17,55,51,7,16,51,50,17,38,36,53,51,22,23,22,2,39,185,228,153,150,2,86,253,170,2,223,254,91,254,93,39,176,35, + 242,239,1,254,122,187,2,190,191,7,24,254,248,121,148,252,167,254,56,1,190,208,208,254,206,1,60,221,254,221,173,126,126,0,0,0,0,2,0,100, + 255,226,3,172,6,121,0,8,0,27,0,0,1,2,32,3,51,22,51,50,55,19,16,33,32,17,55,51,7,16,51,50,17,38,36,53,51,22,23,22, + 3,40,19,253,180,19,118,25,170,172,23,250,254,91,254,93,39,176,35,242,239,1,254,122,187,2,190,191,6,121,254,225,1,31,150,150,251,49,254,56, + 1,190,208,208,254,206,1,60,221,254,221,173,126,126,0,0,0,2,0,100,254,29,3,152,6,30,0,3,0,27,0,0,1,33,21,33,1,16,33,32, + 17,55,51,7,16,51,50,25,1,16,35,34,21,23,35,39,16,33,32,17,1,11,2,86,253,170,2,141,254,116,254,88,33,172,25,244,226,225,200,55, + 172,49,1,110,1,139,6,30,148,250,55,254,92,1,166,225,227,254,232,1,22,3,19,1,2,244,226,220,1,134,254,111,0,2,0,100,254,29,3,152, + 6,100,0,3,0,27,0,0,1,51,1,35,1,16,33,32,17,55,51,7,16,51,50,25,1,16,35,34,21,23,35,39,16,33,32,17,2,109,235,254, + 254,173,1,239,254,116,254,88,33,172,25,244,226,225,200,55,172,49,1,110,1,139,6,100,254,248,250,101,254,92,1,166,225,227,254,232,1,22,3,19, + 1,2,244,226,220,1,134,254,111,0,0,0,0,3,0,100,254,29,3,152,7,54,0,3,0,7,0,31,0,0,1,51,3,35,7,33,21,33,1,16, + 33,32,17,55,51,7,16,51,50,25,1,16,35,34,21,23,35,39,16,33,32,17,2,89,215,228,183,150,2,86,253,170,2,153,254,116,254,88,33,172, + 25,244,226,225,200,55,172,49,1,110,1,139,7,54,254,248,121,148,250,160,254,92,1,166,225,227,254,232,1,22,3,19,1,2,244,226,220,1,134,254, + 111,0,0,0,0,2,0,100,254,29,3,152,6,121,0,8,0,32,0,0,1,2,32,3,51,22,51,50,55,19,16,33,32,17,55,51,7,16,51,50, + 25,1,16,35,34,21,23,35,39,16,33,32,17,3,80,19,253,180,19,118,25,170,172,23,190,254,116,254,88,33,172,25,244,226,225,200,55,172,49,1, + 110,1,139,6,121,254,225,1,31,150,150,249,72,254,92,1,166,225,227,254,232,1,22,3,19,1,2,244,226,220,1,134,254,111,0,0,0,2,0,100, + 0,0,3,192,6,30,0,17,0,21,0,0,1,16,3,35,18,17,16,35,34,17,16,19,35,2,17,16,33,32,1,33,21,33,3,192,153,173,146,246, + 254,145,174,151,1,178,1,170,253,55,2,86,253,170,2,68,254,244,254,200,1,33,1,35,1,144,254,109,254,224,254,223,1,58,1,13,2,25,1,190, + 148,0,0,0,0,2,0,100,0,0,3,192,6,100,0,17,0,21,0,0,1,16,3,35,18,17,16,35,34,17,16,19,35,2,17,16,33,32,1,51, + 1,35,3,192,153,173,146,246,254,145,174,151,1,178,1,170,254,183,225,254,254,163,2,68,254,244,254,201,1,32,1,35,1,144,254,109,254,224,254,223, + 1,58,1,13,2,25,2,4,254,248,0,0,0,2,0,100,0,0,3,192,6,121,0,17,0,26,0,0,1,16,3,35,18,17,16,35,34,17,16,19, + 35,2,17,16,33,32,3,2,32,3,51,22,51,50,55,3,192,153,173,146,246,254,145,174,151,1,178,1,170,112,19,253,180,19,118,25,170,172,23,2, + 68,254,244,254,201,1,32,1,35,1,144,254,109,254,224,254,223,1,58,1,13,2,25,2,25,254,225,1,31,150,150,0,0,2,0,100,255,255,5,230, + 6,30,0,28,0,32,0,0,1,18,1,35,0,17,2,35,34,17,21,35,53,16,35,34,17,2,1,35,0,17,16,33,50,23,54,51,32,1,33,21, + 33,5,230,1,254,237,209,1,47,1,210,231,166,231,211,1,1,56,209,254,230,1,136,225,87,98,220,1,133,252,20,2,86,253,170,2,86,254,209,254, + 217,1,22,1,64,1,126,254,167,210,210,1,89,254,130,254,205,254,220,1,36,1,51,2,10,227,227,1,190,148,0,0,0,3,0,100,255,255,5,230, + 6,56,0,28,0,32,0,36,0,0,1,18,1,35,0,17,2,35,34,17,21,35,53,16,35,34,17,2,1,35,0,17,16,33,50,23,54,51,32,1, + 51,21,35,37,51,21,35,5,230,1,254,237,209,1,47,1,210,231,166,231,211,1,1,56,209,254,230,1,136,225,87,98,220,1,133,253,155,203,203,254, + 121,203,203,2,86,254,209,254,217,1,22,1,64,1,126,254,167,210,210,1,89,254,130,254,205,254,220,1,36,1,51,2,10,227,227,1,216,202,202,202, + 0,4,0,100,255,255,5,230,7,40,0,28,0,32,0,36,0,40,0,0,1,18,1,35,0,17,2,35,34,17,21,35,53,16,35,34,17,2,1,35, + 0,17,16,33,50,23,54,51,32,1,33,21,33,1,51,21,35,37,51,21,35,5,230,1,254,237,209,1,47,1,210,231,166,231,211,1,1,56,209,254, + 230,1,136,225,87,98,220,1,133,252,18,2,86,253,170,1,137,203,203,254,121,203,203,2,86,254,209,254,217,1,22,1,64,1,126,254,167,210,210,1, + 89,254,130,254,205,254,220,1,36,1,51,2,10,227,227,1,55,148,2,37,202,202,202,0,0,2,0,100,255,255,5,230,6,100,0,28,0,32,0,0, + 1,18,1,35,0,17,2,35,34,17,21,35,53,16,35,34,17,2,1,35,0,17,16,33,50,23,54,51,32,1,51,1,35,5,230,1,254,237,209,1, + 47,1,210,231,166,231,211,1,1,56,209,254,230,1,136,225,87,98,220,1,133,253,118,225,254,254,163,2,86,254,209,254,217,1,22,1,64,1,126,254, + 167,210,210,1,89,254,130,254,205,254,220,1,36,1,51,2,10,227,227,2,4,254,248,0,0,2,0,100,255,255,5,230,6,121,0,28,0,37,0,0, + 1,18,1,35,0,17,2,35,34,17,21,35,53,16,35,34,17,2,1,35,0,17,16,33,50,23,54,51,32,1,2,32,3,51,22,51,50,55,5,230, + 1,254,237,209,1,47,1,210,231,166,231,211,1,1,56,209,254,230,1,136,225,87,98,220,1,133,254,139,19,253,180,19,118,25,170,172,23,2,86,254, + 209,254,217,1,22,1,64,1,126,254,167,210,210,1,89,254,130,254,205,254,220,1,36,1,51,2,10,227,227,2,25,254,225,1,31,150,150,0,0,0, + 0,2,0,60,254,29,3,232,6,30,0,3,0,36,0,0,19,33,21,33,1,16,33,32,17,55,51,7,16,33,50,25,1,38,35,34,21,3,35,3, + 52,43,1,39,55,23,51,50,23,54,51,32,17,237,2,86,253,170,2,251,254,110,254,71,25,178,23,1,5,232,2,135,123,10,143,10,156,82,109,20, + 87,80,143,79,67,160,1,48,6,30,148,250,54,254,93,1,163,227,227,254,233,1,23,3,103,182,140,254,165,1,91,120,40,161,50,187,187,254,199,0, + 0,3,0,60,254,29,3,232,6,56,0,3,0,7,0,40,0,0,1,51,21,35,37,51,21,35,1,16,33,32,17,55,51,7,16,33,50,25,1,38, + 35,34,21,3,35,3,52,43,1,39,55,23,51,50,23,54,51,32,17,2,116,203,203,254,121,203,203,2,251,254,110,254,71,25,178,23,1,5,232,2, + 135,123,10,143,10,156,82,109,20,87,80,143,79,67,160,1,48,6,56,202,202,202,250,82,254,93,1,163,227,227,254,233,1,23,3,103,182,140,254,165, + 1,91,120,40,161,50,187,187,254,199,0,0,0,4,0,60,254,29,3,232,7,60,0,3,0,7,0,11,0,44,0,0,19,33,21,33,1,51,21,35, + 37,51,21,35,1,16,33,32,17,55,51,7,16,33,50,25,1,38,35,34,21,3,35,3,52,43,1,39,55,23,51,50,23,54,51,32,17,235,2,86, + 253,170,1,137,203,203,254,121,203,203,2,251,254,110,254,71,25,178,23,1,5,232,2,135,123,10,143,10,156,82,109,20,87,80,143,79,67,160,1,48, + 5,171,148,2,37,202,202,202,249,78,254,93,1,163,227,227,254,233,1,23,3,103,182,140,254,165,1,91,120,40,161,50,187,187,254,199,0,2,0,60, + 254,29,3,232,6,100,0,3,0,36,0,0,1,51,3,35,1,16,33,32,17,55,51,7,16,33,50,25,1,38,35,34,21,3,35,3,52,43,1,39, + 55,23,51,50,23,54,51,32,17,2,89,215,248,163,2,83,254,110,254,71,25,178,23,1,5,232,2,135,123,10,143,10,156,82,109,20,87,80,143,79, + 67,160,1,48,6,100,254,248,250,100,254,93,1,163,227,227,254,233,1,23,3,103,182,140,254,165,1,91,120,40,161,50,187,187,254,199,0,2,0,60, + 254,29,3,232,6,121,0,8,0,41,0,0,1,2,32,3,51,22,51,50,55,1,16,33,32,17,55,51,7,16,33,50,25,1,38,35,34,21,3,35, + 3,52,43,1,39,55,23,51,50,23,54,51,32,17,3,70,19,253,180,19,118,25,170,172,23,1,24,254,110,254,71,25,178,23,1,5,232,2,135,123, + 10,143,10,156,82,109,20,87,80,143,79,67,160,1,48,6,121,254,225,1,31,150,150,249,71,254,93,1,163,227,227,254,233,1,23,3,103,182,140,254, + 165,1,91,120,40,161,50,187,187,254,199,0,0,2,0,60,254,29,3,232,6,209,0,6,0,39,0,0,1,19,35,39,7,35,19,1,16,33,32,17, + 55,51,7,16,33,50,25,1,38,35,34,21,3,35,3,52,43,1,39,55,23,51,50,23,54,51,32,17,2,88,245,139,180,180,139,245,2,36,254,110, + 254,71,25,178,23,1,5,232,2,135,123,10,143,10,156,82,109,20,87,80,143,79,67,160,1,48,6,209,254,136,245,245,1,120,248,239,254,93,1,163, + 227,227,254,233,1,23,3,103,182,140,254,165,1,91,120,40,161,50,187,187,254,199,0,0,0,2,0,113,255,227,4,117,6,20,0,9,0,32,0,0, + 1,34,6,16,22,32,54,53,52,38,1,16,55,46,1,53,52,54,51,33,21,33,34,21,20,22,51,50,0,16,0,32,0,2,114,147,172,171,1,40, + 172,172,253,107,195,79,65,194,158,1,252,254,40,188,117,146,237,1,21,254,237,254,32,254,239,3,223,231,254,110,231,232,199,200,233,254,80,1,77,155, + 47,141,49,124,148,147,137,73,52,254,200,253,218,254,198,1,57,0,0,0,0,1,0,47,0,0,5,170,6,20,0,36,0,72,64,19,38,0,7,9, + 5,8,12,33,24,13,30,8,17,12,33,16,20,76,37,16,252,60,196,50,196,252,60,196,16,60,252,60,196,196,196,49,0,64,17,9,13,17,169,18, + 2,26,135,0,24,151,6,31,18,188,11,15,47,60,230,50,50,254,60,238,50,16,238,50,50,48,1,21,35,34,6,29,1,33,21,33,17,35,17,33, + 17,35,17,35,53,51,53,52,54,59,1,21,35,34,7,6,29,1,33,53,52,54,51,5,170,176,99,77,1,47,254,209,185,254,7,185,176,176,174,189, + 174,176,99,39,38,1,249,174,189,6,20,153,80,104,99,143,252,47,3,209,252,47,3,209,143,78,187,171,153,40,40,104,99,78,187,171,0,2,0,47, + 0,0,4,74,6,20,0,21,0,25,0,82,64,17,27,70,0,23,8,22,15,20,4,8,8,3,22,10,6,76,26,16,252,60,196,50,196,252,60,196, + 16,254,60,236,49,0,64,18,8,3,169,0,16,135,14,24,190,22,177,14,151,9,0,188,5,1,47,60,230,50,238,254,238,16,238,16,238,50,48,64, + 11,255,27,160,27,144,27,128,27,16,27,5,1,93,1,17,35,17,33,17,35,17,35,53,51,53,52,54,59,1,21,35,34,6,29,1,1,51,21,35, + 4,74,185,254,7,185,176,176,173,179,185,176,99,77,1,249,185,185,4,96,251,160,3,209,252,47,3,209,143,78,183,175,153,80,104,99,1,178,233,0, + 0,1,0,47,0,0,4,74,6,20,0,21,0,55,64,15,23,70,1,8,4,10,12,8,8,16,4,18,14,76,22,16,252,60,196,196,252,60,196,16, + 254,236,49,0,64,13,15,11,169,9,4,135,0,151,17,9,188,13,2,47,60,230,50,254,238,16,238,50,48,1,33,17,35,17,33,34,6,29,1,33, + 21,33,17,35,17,35,53,51,53,52,54,2,74,2,0,185,254,183,99,77,1,47,254,209,185,176,176,174,6,20,249,236,5,123,80,104,99,143,252,47, + 3,209,143,78,187,171,0,0,0,2,0,47,0,0,6,252,6,20,0,41,0,45,0,90,64,24,47,70,23,43,8,42,16,27,21,8,26,42,9,0, + 31,6,8,36,30,9,34,38,76,46,16,252,60,196,50,196,252,60,196,16,196,50,252,60,196,16,252,60,236,49,0,64,23,27,31,35,169,36,17,1, + 135,0,45,190,42,177,16,0,151,22,7,36,188,25,29,33,47,60,60,228,50,50,228,50,244,236,16,236,50,16,236,50,50,48,1,21,35,34,7,6, + 29,1,33,53,52,55,54,55,54,59,1,21,35,34,6,29,1,33,17,35,17,33,17,35,17,33,17,35,17,35,53,51,53,52,54,51,5,51,21,35, + 2,248,176,99,39,38,1,249,87,28,39,78,131,174,176,99,77,2,178,185,254,7,185,254,7,185,176,176,174,189,3,249,185,185,6,20,153,40,40,104, + 99,78,187,85,28,19,39,153,80,104,99,251,160,3,209,252,47,3,209,252,47,3,209,143,78,187,171,2,233,0,0,0,0,1,0,47,0,0,6,252, + 6,20,0,38,0,78,64,22,40,70,13,8,16,22,24,20,8,16,9,0,28,6,8,33,27,9,31,35,76,39,16,252,60,196,50,196,252,60,196,16, + 196,252,60,196,16,252,236,49,0,64,18,24,28,32,169,33,17,2,135,12,38,151,21,7,33,188,15,26,30,47,60,60,228,50,50,244,60,236,50,16, + 236,50,50,48,1,21,35,34,7,6,29,1,33,53,52,54,51,33,17,35,17,33,34,6,29,1,33,21,33,17,35,17,33,17,35,17,35,53,51,53, + 52,54,51,2,248,176,99,39,38,1,249,174,189,2,0,185,254,183,99,77,1,47,254,209,185,254,7,185,176,176,174,189,6,20,153,40,40,104,99,78, + 187,171,249,236,5,123,80,104,99,143,252,47,3,209,252,47,3,209,143,78,187,171,0,0,0,1,0,47,0,0,5,76,6,20,0,45,0,0,1,53, + 52,39,38,43,1,34,7,6,21,17,35,17,35,53,51,53,52,55,54,59,1,50,23,22,29,1,33,21,33,17,20,23,22,59,1,21,35,34,39,38, + 53,17,35,53,3,24,36,37,101,34,99,39,38,185,176,176,87,87,189,30,189,87,85,1,123,254,133,37,38,115,189,189,213,81,81,135,4,96,99,104, + 40,40,40,40,104,251,61,3,209,143,78,187,85,86,86,83,189,78,143,253,160,137,39,39,154,80,79,210,2,96,143,0,0,1,0,111,255,227,6,178, + 5,240,0,89,0,0,1,21,38,39,38,35,34,7,6,21,20,23,22,31,1,30,1,21,20,7,6,35,34,39,38,39,53,22,23,22,51,50,55,54, + 53,52,39,38,47,1,38,39,38,53,52,55,54,51,50,23,38,53,52,55,54,55,50,23,22,29,1,33,21,33,17,20,23,22,59,1,21,35,34,39, + 38,53,17,35,53,51,53,52,39,38,7,34,7,6,21,20,3,81,86,73,84,70,117,63,59,49,49,148,63,195,166,123,124,216,96,92,97,108,102,99, + 99,97,130,70,70,50,45,177,64,171,76,76,102,112,181,72,77,5,92,91,162,140,98,94,1,123,254,133,37,38,115,189,189,213,81,81,135,135,48,54, + 68,69,54,52,4,63,174,43,17,20,42,39,87,64,37,36,33,14,43,152,137,156,91,91,17,18,35,190,53,26,27,45,44,81,75,40,35,42,15,36, + 74,75,130,166,78,86,11,29,31,135,95,93,1,96,92,136,76,143,253,160,137,39,39,154,80,79,210,2,96,143,78,65,43,50,1,49,48,64,61,0, + 0,1,0,171,255,227,8,227,6,20,0,75,0,0,1,22,21,17,35,53,14,1,35,34,38,53,17,51,17,20,22,51,50,54,53,17,52,39,33,34, + 39,38,53,52,55,54,59,1,21,35,34,21,20,51,33,39,38,53,52,55,54,59,1,21,35,34,21,20,31,1,33,3,20,22,51,50,54,53,17,51, + 17,35,53,14,1,35,34,38,53,17,4,79,9,184,67,177,117,193,200,184,124,124,149,173,5,254,83,152,91,80,90,119,114,89,89,131,131,1,108,23, + 54,9,55,209,236,222,96,14,59,1,221,1,124,124,149,173,184,184,67,177,117,193,200,3,182,37,33,252,144,172,102,99,240,231,1,102,254,161,159,159, + 190,164,1,145,36,28,94,83,145,131,66,87,175,123,138,56,131,75,31,21,122,175,43,41,32,145,253,97,160,158,190,164,2,123,251,160,172,102,99,240, + 231,1,252,0,0,1,0,174,255,227,8,227,6,20,0,58,0,0,1,33,38,21,20,31,1,22,21,17,35,53,14,1,35,34,38,53,17,51,17,20, + 22,51,50,54,53,17,52,47,1,38,55,54,51,33,17,33,21,33,17,20,22,51,50,55,54,53,17,51,17,35,53,14,1,35,34,38,53,5,57,254, + 243,96,14,77,49,184,67,177,117,193,200,184,124,124,149,173,16,77,77,32,55,209,1,211,2,242,253,14,124,124,152,83,87,184,184,67,177,117,193,200, + 5,101,1,44,39,34,188,120,77,252,144,172,102,99,240,231,2,166,253,97,159,159,190,164,1,145,63,39,188,187,71,122,254,76,170,254,11,159,159,95, + 98,161,1,59,252,224,172,102,99,240,231,0,0,1,0,174,254,86,8,227,6,20,0,53,0,0,1,33,38,21,20,31,1,22,21,17,35,53,14,1, + 35,34,38,53,17,51,17,20,22,51,50,54,53,17,52,47,1,38,55,54,51,33,17,62,1,51,50,22,21,17,35,17,52,38,35,34,6,21,17,35, + 5,57,254,243,96,14,77,49,184,67,177,117,193,200,184,124,124,149,173,16,77,77,32,55,209,1,212,66,179,117,193,198,184,124,124,149,172,185,5,101, + 1,44,39,34,188,120,77,252,144,172,102,99,240,231,2,166,253,97,159,159,190,164,1,145,63,39,188,187,71,122,253,158,101,100,239,232,253,92,2,158, + 159,158,190,164,251,221,0,0,0,2,0,174,254,86,8,227,6,20,0,53,0,60,0,0,1,33,34,39,38,55,54,55,54,51,33,17,33,17,20,22, + 51,50,54,53,17,51,17,35,53,14,1,35,34,38,53,17,35,17,51,21,33,17,14,1,35,34,38,53,17,51,17,20,22,51,50,55,54,53,25,1, + 33,34,21,20,51,3,160,254,219,149,94,83,3,3,87,115,118,1,221,1,153,124,124,149,173,184,184,67,177,117,193,200,225,213,254,115,67,177,117,193, + 200,184,124,124,149,87,86,254,219,131,131,3,182,94,83,145,131,66,87,254,76,253,97,159,159,190,164,2,123,251,160,172,102,99,240,231,1,252,251,66, + 162,2,86,102,99,240,231,1,102,254,161,159,159,95,95,164,2,123,1,5,123,138,0,0,0,1,0,174,254,86,11,155,6,20,0,72,0,0,1,33, + 38,21,20,31,1,22,21,17,35,53,14,1,35,34,38,53,17,51,17,20,22,51,50,54,53,17,52,47,1,38,55,54,51,33,17,54,55,54,51,50, + 22,29,1,20,23,22,51,50,54,53,17,51,17,35,53,14,1,35,34,39,38,61,1,52,38,35,34,6,21,17,35,5,57,254,243,96,14,77,49,184, + 67,177,117,193,200,184,124,124,149,173,16,77,77,32,55,209,1,212,99,37,90,107,193,198,62,56,110,140,173,184,184,67,177,108,175,98,100,124,124,120, + 172,185,5,101,1,44,39,34,188,120,77,252,144,172,102,99,240,231,2,166,253,97,159,159,190,164,1,145,63,39,188,187,71,122,253,158,129,22,50,239, + 232,227,151,88,79,190,164,2,123,251,160,172,102,99,120,123,228,228,159,158,190,164,251,221,255,255,0,136,0,91,1,66,4,96,18,38,5,47,0,0, + 16,7,5,20,254,78,1,160,0,1,1,86,5,0,3,200,6,31,0,12,0,0,1,51,30,1,51,50,54,55,51,14,1,32,38,1,86,118,11,97, + 87,86,96,13,118,10,158,254,222,158,6,31,75,75,74,76,143,144,144,0,255,255,0,74,0,91,2,162,4,96,18,38,5,67,0,0,16,7,5,23, + 254,231,1,160,0,1,0,78,0,0,4,126,4,96,0,22,0,0,1,19,50,55,54,55,54,61,1,51,17,20,14,5,35,33,53,33,3,1,99,193, + 250,92,64,8,2,186,14,38,64,101,139,190,120,254,106,1,20,193,4,96,252,81,163,113,242,60,118,247,254,214,116,182,176,129,111,69,39,177,3,175, + 0,1,0,174,0,0,6,45,4,96,0,32,0,0,9,1,35,1,14,3,21,17,35,17,52,62,2,55,1,51,1,62,3,53,17,51,21,20,14,3, + 4,179,1,122,237,253,75,45,98,91,59,184,73,119,122,63,254,135,237,2,180,45,98,92,59,184,50,78,104,96,1,105,254,151,2,151,6,56,94,151, + 88,254,244,1,10,100,173,119,78,22,1,106,253,105,6,56,94,151,88,1,12,246,86,154,110,90,55,0,0,1,0,88,0,0,5,189,4,96,0,7, + 0,0,1,35,17,35,17,33,53,33,5,189,202,186,252,31,5,101,3,209,252,47,3,209,143,0,0,0,0,2,0,186,0,0,6,29,4,96,0,19, + 0,23,0,0,1,17,35,17,52,46,4,35,33,53,33,50,30,4,37,17,35,17,6,29,185,13,39,62,110,140,105,253,43,2,213,133,196,148,94,59, + 24,251,107,185,1,237,254,19,1,237,106,139,116,64,44,15,143,26,63,93,145,178,69,253,84,2,96,0,0,1,0,88,0,0,5,187,4,96,0,27, + 0,0,19,33,50,30,3,20,14,3,35,33,53,33,50,62,3,52,46,3,35,33,88,2,215,150,232,143,92,35,35,92,143,231,150,253,40,2,216,113, + 168,102,61,22,22,61,102,168,113,253,40,4,96,65,105,149,153,176,153,149,105,65,142,42,72,110,117,154,117,110,72,42,0,1,0,88,0,0,5,187, + 6,20,0,8,0,0,33,1,33,17,51,17,33,21,1,2,160,2,92,251,92,187,4,168,253,164,3,209,2,67,254,76,132,252,36,0,0,2,0,186, + 0,0,6,29,4,96,0,8,0,19,0,0,41,1,17,33,50,30,2,21,1,17,33,17,52,46,4,35,6,29,250,157,3,53,163,211,131,53,251,87, + 3,239,12,33,51,87,109,79,4,96,60,144,217,167,1,189,252,190,1,133,94,130,104,61,41,15,0,0,0,1,0,88,0,0,5,187,4,96,0,15, + 0,0,1,17,35,17,52,46,2,35,33,53,33,50,30,2,5,187,186,29,84,140,116,252,200,3,55,162,211,130,53,2,20,253,236,2,20,134,161,109, + 41,143,60,144,217,0,0,0,0,1,0,96,255,248,5,186,4,96,0,30,0,0,1,17,35,17,52,46,3,35,33,17,20,6,35,34,39,53,22,51, + 50,54,53,17,35,53,33,50,30,2,5,186,186,10,36,64,112,80,254,36,123,152,53,78,65,38,71,46,173,3,67,143,193,108,44,2,94,253,162,2, + 96,74,99,101,58,37,253,205,214,208,16,143,14,114,163,2,51,143,67,138,180,0,0,0,0,1,0,217,2,45,5,219,5,4,0,7,0,0,1,33, + 53,33,17,51,17,33,5,219,250,254,2,45,168,2,45,2,45,170,2,45,253,211,0,0,255,255,0,88,0,0,5,83,5,150,16,38,5,33,161,0, + 18,6,5,63,0,0,0,0,255,255,0,78,0,0,5,83,5,150,16,38,5,25,78,0,18,6,5,63,0,0,0,0,255,255,0,88,0,0,5,83, + 5,150,16,39,5,25,2,88,252,15,16,38,5,33,151,0,18,6,5,63,0,0,0,0,255,255,0,88,0,0,5,83,5,150,16,39,5,25,2,88, + 252,15,16,39,5,33,251,76,0,0,18,6,5,63,0,0,255,255,0,186,254,187,4,159,4,96,16,38,5,23,0,0,18,6,5,38,0,0,0,0, + 255,255,0,186,254,117,4,159,4,96,16,38,5,24,0,0,18,6,5,38,0,0,0,0,255,255,0,186,254,187,4,159,4,96,16,38,5,20,0,0, + 18,6,5,38,0,0,0,0,255,255,0,88,0,0,4,72,4,96,16,39,5,28,254,225,0,0,18,6,5,39,0,0,255,255,0,88,255,246,3,17, + 4,96,16,39,5,28,254,33,0,0,18,6,5,40,0,0,255,255,0,88,0,0,4,23,4,96,16,39,5,28,254,129,0,0,18,6,5,41,0,0, + 255,255,0,186,0,0,4,128,4,96,16,38,5,28,0,0,18,6,5,42,0,0,0,0,255,255,0,89,0,0,2,30,4,96,16,39,5,28,254,11, + 0,0,16,7,5,43,0,170,0,0,0,0,255,255,0,89,0,0,2,231,4,96,16,39,5,28,254,11,0,0,16,6,5,44,122,0,255,255,0,185, + 255,227,4,191,4,107,16,38,5,28,0,0,18,6,5,46,0,0,0,0,255,255,0,89,1,162,2,28,4,96,16,39,5,28,254,11,0,160,16,7, + 5,47,0,218,0,0,0,0,255,255,0,88,254,86,3,146,4,96,16,39,5,28,254,177,0,0,18,6,5,48,0,0,255,255,0,88,0,0,3,202, + 4,96,16,39,5,28,254,177,0,0,18,6,5,49,0,0,255,255,0,88,0,0,3,240,5,213,16,39,5,28,254,81,0,0,18,6,5,50,0,0, + 255,255,0,88,0,0,4,181,4,112,16,38,5,28,48,0,18,6,5,52,0,0,0,0,255,255,0,88,0,0,2,120,4,96,16,39,5,28,254,33, + 0,0,16,6,5,54,0,0,255,255,0,185,255,227,4,191,4,96,16,38,5,28,0,0,18,6,5,55,0,0,0,0,255,255,0,186,254,86,4,100, + 4,96,16,38,5,28,113,0,18,6,5,57,0,0,0,0,255,255,0,186,0,0,4,142,4,96,16,38,5,28,124,0,18,6,5,58,0,0,0,0, + 255,255,0,88,0,0,4,5,4,96,16,39,5,28,254,81,0,0,18,6,5,60,0,0,255,255,0,186,254,86,5,17,4,95,16,38,5,28,209,0, + 18,6,5,61,0,0,0,0,255,255,0,88,0,0,3,202,4,96,16,39,5,28,254,177,0,0,18,6,5,62,0,0,255,255,0,88,0,0,5,83, + 4,96,16,39,5,25,2,57,252,13,18,6,5,63,0,0,255,255,0,20,255,248,4,136,4,96,16,38,5,28,0,0,18,6,5,64,0,0,0,0, + 255,255,0,186,0,0,1,116,5,150,16,39,5,33,251,180,0,0,18,6,5,43,0,0,255,255,0,88,0,0,4,72,5,150,16,39,5,31,255,113, + 0,0,18,6,5,39,0,0,255,255,0,88,0,0,3,202,5,150,16,39,5,31,255,65,0,0,18,6,5,49,0,0,255,255,0,186,0,0,4,142, + 5,150,16,38,5,31,0,0,18,6,5,58,0,0,0,0,0,1,0,88,0,0,4,145,6,20,0,44,0,0,9,1,35,1,14,4,21,17,35,53, + 52,62,5,55,3,35,17,51,17,51,7,1,62,4,53,17,51,21,20,14,5,3,114,1,29,217,254,96,28,35,56,33,26,184,20,31,50,45,65,44, + 31,186,184,187,120,2,1,158,27,35,56,34,26,184,20,31,50,46,64,44,1,155,254,101,2,88,14,21,53,65,110,69,254,244,185,81,138,96,81,50, + 44,21,13,1,13,2,66,254,76,3,253,171,13,21,54,65,110,69,1,12,185,82,137,97,81,49,44,21,255,255,0,130,254,12,6,235,2,157,16,39, + 22,200,3,57,255,6,16,6,5,142,0,0,255,255,0,130,254,12,7,239,2,157,16,39,22,200,3,57,255,6,16,6,22,202,0,0,255,255,255,236, + 254,12,1,135,2,88,16,38,22,203,0,0,16,7,22,200,0,224,255,6,255,255,255,236,254,12,2,126,2,88,16,39,22,200,0,224,255,6,16,6, + 22,204,0,0,255,255,0,130,254,12,6,235,2,157,16,39,22,199,2,188,255,6,16,6,5,142,0,0,255,255,0,130,254,12,7,239,2,157,16,39, + 22,199,2,188,255,6,16,6,22,202,0,0,255,255,255,236,254,12,1,243,2,88,16,38,22,203,0,0,16,7,22,199,0,99,255,6,255,255,255,236, + 254,12,2,126,2,88,16,38,22,204,0,0,16,7,22,199,0,99,255,6,255,255,0,130,254,12,6,235,2,157,16,39,22,201,2,188,255,6,16,6, + 5,142,0,0,255,255,0,130,254,12,7,239,2,157,16,39,22,201,2,188,255,6,16,6,22,202,0,0,255,255,255,236,254,12,1,243,2,88,16,38, + 22,203,0,0,16,7,22,201,0,99,255,6,255,255,255,236,254,12,2,126,2,88,16,38,22,204,0,0,16,7,22,201,0,99,255,6,255,255,0,130, + 255,236,6,235,4,26,16,39,22,200,3,57,3,132,16,6,5,142,0,0,255,255,0,130,255,236,7,239,4,26,16,39,22,200,3,57,3,132,16,6, + 22,202,0,0,255,255,255,236,0,0,1,135,4,226,16,38,22,203,0,0,16,7,22,200,0,224,4,76,255,255,255,236,0,0,2,126,4,226,16,38, + 22,204,0,0,16,7,22,200,0,224,4,76,255,255,0,130,255,236,6,235,4,26,16,39,22,201,2,188,3,132,16,6,5,142,0,0,255,255,0,130, + 255,236,7,239,4,26,16,38,22,202,0,0,16,7,22,201,2,188,3,132,255,255,255,236,0,0,1,243,4,226,16,38,22,203,0,0,16,7,22,201, + 0,99,4,76,255,255,255,236,0,0,2,126,4,226,16,38,22,204,0,0,16,7,22,201,0,99,4,76,255,255,0,130,255,236,6,235,4,153,16,39, + 5,75,1,132,253,168,16,6,5,142,0,0,255,255,0,130,255,236,7,239,4,153,16,38,22,202,0,0,16,7,5,75,1,132,253,168,255,255,255,236, + 0,0,2,48,5,97,16,38,22,203,0,0,16,7,5,75,255,43,254,112,255,255,255,236,0,0,2,126,5,97,16,38,22,204,0,0,16,7,5,75, + 255,43,254,112,255,255,0,130,255,164,7,158,6,14,16,39,22,198,5,120,4,126,16,6,5,186,0,0,255,255,0,130,255,165,8,92,5,70,16,38, + 22,205,0,0,16,7,22,198,5,120,3,182,255,255,255,236,0,0,3,63,6,14,16,38,22,206,0,0,16,7,22,198,1,44,4,126,255,255,255,236, + 0,0,4,32,5,120,16,38,22,207,0,0,16,7,22,198,1,62,3,232,255,255,0,130,255,164,7,158,6,14,16,39,22,201,5,120,5,120,16,6, + 5,186,0,0,255,255,0,130,255,165,8,92,5,70,16,38,22,205,0,0,16,7,22,201,5,120,4,176,255,255,255,236,0,0,3,63,6,14,16,38, + 22,206,0,0,16,7,22,201,1,44,5,120,255,255,255,236,0,0,4,32,5,120,16,38,22,207,0,0,16,7,22,201,1,62,4,226,255,255,0,157, + 254,12,5,40,3,102,16,39,22,200,3,7,0,175,16,6,5,90,0,0,255,255,0,157,254,12,5,62,3,102,16,39,22,200,2,163,0,125,16,6, + 20,134,0,0,255,255,255,236,254,62,4,92,3,47,16,38,20,135,0,0,16,7,22,200,2,13,255,56,255,255,255,236,254,62,5,62,3,47,16,38, + 20,136,0,0,16,7,22,200,2,13,255,56,255,255,0,157,254,12,5,40,3,102,16,39,22,197,2,138,0,25,16,6,5,90,0,0,255,255,0,157, + 254,12,5,62,3,102,16,39,22,197,2,38,255,231,16,6,20,134,0,0,255,255,255,236,255,56,4,92,3,47,16,38,20,135,0,0,16,7,22,197, + 1,144,255,56,255,255,255,236,255,56,5,62,3,47,16,38,20,136,0,0,16,7,22,197,1,144,255,56,255,255,0,157,254,12,5,40,3,102,16,39, + 22,199,2,150,0,150,16,6,5,90,0,0,255,255,0,157,254,12,5,62,3,102,16,39,22,199,2,25,0,50,16,6,20,134,0,0,255,255,255,236, + 254,62,4,92,3,47,16,38,20,135,0,0,16,7,22,199,1,144,255,56,255,255,255,236,254,62,5,62,3,47,16,38,20,136,0,0,16,7,22,199, + 1,144,255,56,255,255,0,157,254,12,5,40,3,102,16,39,22,201,2,150,0,175,16,6,5,90,0,0,255,255,0,157,254,12,5,62,3,102,16,39, + 22,201,2,25,0,50,16,6,20,134,0,0,255,255,255,236,254,62,4,92,3,47,16,38,20,135,0,0,16,7,22,201,1,144,255,56,255,255,255,236, + 254,62,5,62,3,47,16,38,20,136,0,0,16,7,22,201,1,144,255,56,255,255,0,125,254,212,3,27,3,82,16,39,22,197,1,43,254,212,16,6, + 5,92,0,0,255,255,0,125,254,212,4,71,3,82,16,39,22,197,1,43,254,212,16,6,20,142,0,0,255,255,0,125,255,218,3,27,4,176,16,39, + 22,197,0,250,4,26,16,6,5,92,0,0,255,255,0,125,255,218,4,71,4,176,16,39,22,197,0,250,4,26,16,6,20,142,0,0,255,255,0,125, + 255,218,3,27,5,170,16,39,22,198,0,250,4,26,16,6,5,92,0,0,255,255,0,125,255,218,4,71,5,170,16,39,22,198,0,250,4,26,16,6, + 20,142,0,0,255,255,0,125,255,218,3,27,5,247,16,39,5,75,255,194,255,6,16,6,5,92,0,0,255,255,0,125,255,218,4,71,5,247,16,39, + 5,75,255,194,255,6,16,6,20,142,0,0,255,255,255,171,254,12,3,132,4,176,16,39,22,198,1,244,3,32,16,6,5,94,0,0,255,255,255,171, + 254,12,4,126,4,176,16,38,20,146,0,0,16,7,22,198,1,244,3,32,255,255,255,171,254,12,3,193,5,47,16,38,5,94,0,0,16,7,5,75, + 0,188,254,62,255,255,255,171,254,12,4,126,5,47,16,38,20,146,0,0,16,7,5,75,0,188,254,62,255,255,0,130,255,167,7,41,6,20,16,6, + 5,194,0,0,0,1,0,130,255,167,7,217,6,20,0,55,0,0,37,6,7,6,35,34,39,36,17,52,55,51,6,21,20,23,22,51,50,55,54,55, + 54,53,52,39,1,38,53,52,55,54,55,1,21,5,6,7,6,21,20,23,1,22,23,22,59,1,21,35,34,39,38,47,1,6,5,156,99,169,205,183, + 192,128,254,182,63,184,65,203,104,151,184,194,158,35,16,54,254,202,50,10,35,100,2,233,253,173,71,21,6,31,2,71,22,38,43,64,88,132,65,58, + 103,33,97,25,120,76,60,73,38,98,1,11,138,92,94,136,126,66,34,80,65,55,26,46,69,66,1,124,61,81,35,33,119,42,1,54,186,250,30,40, + 11,25,32,37,253,63,26,14,16,184,24,43,41,120,64,0,255,255,255,236,0,0,3,207,6,20,16,6,20,191,0,0,255,255,255,236,0,0,4,127, + 6,20,16,6,20,192,0,0,255,255,0,130,255,167,7,41,7,43,16,39,22,232,3,202,0,0,16,6,5,194,0,0,255,255,0,130,255,167,7,217, + 7,43,16,38,20,28,0,0,16,7,22,232,3,202,0,0,255,255,255,236,0,0,3,207,7,43,16,38,20,29,0,0,16,6,22,232,112,0,0,0, + 255,255,255,236,0,0,4,127,7,43,16,38,20,30,0,0,16,6,22,232,112,0,0,0,255,255,0,130,253,168,7,41,7,43,16,39,22,200,2,213, + 254,162,16,6,5,200,0,0,255,255,0,130,253,168,7,217,7,43,16,38,20,32,0,0,16,7,22,200,2,213,254,162,255,255,255,236,253,218,3,207, + 7,43,16,38,20,33,0,0,16,7,22,200,1,69,254,212,255,255,255,236,253,218,4,127,7,43,16,38,20,34,0,0,16,7,22,200,1,69,254,212, + 255,255,0,130,255,167,7,41,7,58,16,39,22,197,3,132,6,164,16,6,5,200,0,0,255,255,0,130,255,167,7,217,7,58,16,38,20,32,0,0, + 16,7,22,197,3,132,6,164,255,255,255,236,0,0,3,207,7,58,16,38,20,33,0,0,16,7,22,197,0,75,6,164,255,255,255,236,0,0,4,127, + 7,58,16,38,20,34,0,0,16,7,22,197,0,75,6,164,255,255,0,147,254,181,5,72,2,238,16,6,5,211,0,0,0,1,0,147,254,12,6,43, + 2,69,0,38,0,0,1,22,23,22,23,22,59,1,21,35,34,39,6,7,6,7,6,35,34,39,36,17,52,55,51,6,21,20,23,22,51,50,55,54, + 55,54,53,52,39,4,224,44,27,22,50,53,60,75,130,71,34,3,89,120,239,97,92,116,113,254,184,47,184,49,201,90,76,88,79,194,75,33,101,2, + 69,97,96,80,60,64,184,48,109,147,199,66,27,37,107,1,99,175,141,137,179,236,53,24,20,48,227,101,112,184,203,0,255,255,0,147,254,181,5,72, + 5,22,16,39,5,75,0,200,254,37,16,6,5,211,0,0,255,255,0,147,254,12,6,43,4,28,16,38,20,44,0,0,16,7,5,75,0,200,253,43, + 255,255,255,236,0,0,2,48,5,97,16,38,22,203,0,0,16,7,5,75,255,43,254,112,255,255,255,236,0,0,2,126,5,97,16,38,22,204,0,0, + 16,7,5,75,255,43,254,112,255,255,0,144,255,189,5,27,3,229,16,6,5,215,0,0,0,3,0,144,254,13,5,34,2,171,0,9,0,43,0,54, + 0,0,37,62,1,53,52,35,34,7,6,21,37,52,55,51,6,21,20,22,51,48,51,53,16,55,54,32,23,22,21,6,7,33,21,33,22,20,7,6, + 32,38,53,34,39,38,5,20,23,22,51,50,53,52,38,39,6,2,177,63,208,84,75,74,38,253,223,16,184,14,124,20,31,138,116,1,4,68,46,21, + 94,1,40,254,168,163,46,69,254,244,242,58,113,193,2,33,38,80,69,84,191,42,19,159,27,164,52,112,141,72,117,26,74,54,62,40,69,38,55,1, + 9,127,107,99,67,114,121,98,184,108,226,66,99,222,223,31,53,47,105,67,141,112,52,151,12,7,0,0,255,255,255,236,255,189,3,189,3,229,16,6, + 20,207,0,0,255,255,255,236,254,13,3,196,2,171,16,6,20,208,0,0,255,255,0,144,255,201,5,199,6,214,16,39,22,198,2,113,5,70,16,6, + 5,107,0,0,255,255,0,144,255,201,6,210,6,214,16,38,20,190,0,0,16,7,22,198,2,113,5,70,255,255,255,236,0,0,3,207,7,108,16,38, + 20,191,0,0,16,7,22,198,0,75,5,220,255,255,255,236,0,0,4,127,7,108,16,38,20,192,0,0,16,7,22,198,0,75,5,220,255,255,255,171, + 254,12,3,64,4,114,16,39,5,127,255,244,254,62,16,6,5,112,0,0,255,255,255,171,254,12,4,54,4,114,16,39,5,127,255,244,254,62,16,6, + 20,210,0,0,0,1,255,236,0,0,1,135,2,88,0,13,0,0,37,6,43,1,53,51,50,55,54,61,1,51,21,20,1,43,72,157,90,35,99,44, + 49,184,86,86,184,44,49,106,217,217,187,0,0,1,255,236,0,0,2,126,2,88,0,20,0,0,37,6,43,1,53,51,50,55,54,61,1,51,21,20, + 23,22,59,1,21,35,34,1,43,77,152,90,35,99,44,49,184,49,44,99,55,110,150,86,86,184,44,49,106,217,217,106,49,44,184,0,255,255,0,130, + 254,243,5,192,3,74,16,6,5,113,0,0,255,255,0,130,254,240,6,191,2,2,16,6,20,212,0,0,255,255,255,236,254,212,1,243,2,88,16,38, + 20,59,0,0,16,7,22,197,0,99,254,212,255,255,255,236,254,212,2,126,2,88,16,38,20,60,0,0,16,7,22,197,0,99,254,212,0,1,252,112, + 6,4,0,0,7,110,0,7,0,0,17,34,4,7,53,54,36,51,231,254,61,230,236,1,197,223,6,212,103,105,126,119,117,0,0,0,0,1,0,0, + 6,4,3,144,7,110,0,7,0,0,17,53,50,4,23,21,38,36,223,1,197,236,230,254,61,6,212,154,117,119,126,105,103,0,0,0,0,1,253,42, + 6,13,0,0,7,39,0,19,0,0,17,47,1,38,39,38,35,34,7,6,7,35,54,55,54,51,50,23,22,23,4,144,28,79,44,36,101,53,70,5, + 162,4,113,112,200,91,63,56,87,6,72,2,55,11,18,10,36,48,71,135,74,73,14,13,32,0,0,0,0,1,0,0,6,13,2,214,7,39,0,19, + 0,0,17,31,1,22,23,22,51,50,55,54,55,51,6,7,6,35,34,39,38,39,4,144,28,79,44,36,97,57,71,4,162,4,113,112,200,91,63,56, + 87,6,236,2,55,11,18,10,36,44,75,135,74,73,14,13,32,0,0,0,255,255,0,8,4,186,2,80,6,154,16,7,5,115,255,44,0,0,0,0, + 255,255,255,236,0,0,2,108,6,154,16,38,5,104,0,0,16,7,5,115,255,44,0,0,255,255,0,8,4,186,2,80,6,253,16,7,5,116,255,44, + 0,0,0,0,0,1,0,105,0,0,2,44,1,107,0,13,0,0,1,20,23,22,59,1,21,35,34,39,38,61,1,51,1,33,49,44,99,75,130,142, + 92,87,184,1,76,55,49,44,184,92,87,141,43,0,0,0,255,255,0,8,254,22,2,80,255,246,16,7,5,117,255,44,0,0,0,0,255,255,0,8, + 4,186,2,80,5,170,16,7,5,118,255,44,0,0,0,0,255,255,255,236,0,0,2,108,5,170,16,39,5,118,255,44,0,0,16,6,5,104,0,0, + 255,255,0,8,4,185,2,80,6,253,16,7,5,119,255,44,0,0,0,0,255,255,255,236,0,0,2,108,6,253,16,39,5,119,255,44,0,0,16,6, + 5,104,0,0,255,255,0,8,254,232,2,80,255,216,16,7,5,120,255,44,0,0,0,0,255,255,255,236,254,232,2,108,0,184,16,39,5,120,255,44, + 0,0,16,6,5,104,0,0,255,255,255,244,4,203,2,100,6,244,16,7,5,121,255,44,0,0,0,0,255,255,255,236,0,0,2,108,6,244,16,39, + 5,121,255,44,0,0,16,6,5,104,0,0,255,255,0,24,4,225,2,60,7,6,16,7,5,122,255,44,0,0,0,0,255,255,255,236,0,0,2,108, + 7,6,16,38,5,104,0,0,16,7,5,122,255,44,0,0,255,255,0,163,0,85,3,30,3,222,16,6,5,78,0,0,255,255,255,181,0,0,2,133, + 7,131,16,39,5,123,255,29,1,194,16,6,5,84,0,0,255,255,255,181,0,0,2,133,7,131,16,38,20,114,0,0,16,7,5,123,255,29,1,194, + 255,255,0,108,0,0,1,195,8,57,16,39,5,124,255,29,1,194,16,6,5,84,0,0,255,255,0,108,0,0,2,132,8,57,16,38,20,114,0,0, + 16,7,5,124,255,29,1,194,255,255,255,171,254,12,3,64,4,181,16,39,5,124,255,194,254,62,16,6,5,112,0,0,255,255,255,171,254,12,4,54, + 4,181,16,38,20,210,0,0,16,7,5,124,255,194,254,62,255,255,0,108,254,12,1,195,6,20,16,39,5,125,255,29,0,0,16,6,5,84,0,0, + 255,255,0,108,254,12,2,132,6,20,16,38,20,114,0,0,16,7,5,125,255,29,0,0,255,255,0,130,254,243,5,192,4,181,16,39,5,124,255,244, + 254,62,16,6,5,113,0,0,255,255,0,130,254,240,6,191,3,187,16,38,20,212,0,0,16,7,5,124,0,88,253,68,255,255,255,236,0,0,1,209, + 4,231,16,38,20,59,0,0,16,7,5,124,255,43,254,112,255,255,255,236,0,0,2,126,4,231,16,38,20,60,0,0,16,7,5,124,255,43,254,112, + 255,255,0,193,0,0,1,121,6,20,16,6,5,84,0,0,0,1,0,193,0,0,2,132,6,20,0,13,0,0,19,17,51,17,20,23,22,59,1,21, + 35,34,39,38,193,184,49,44,99,75,130,154,80,87,1,115,4,161,251,107,106,49,44,184,92,101,0,0,255,255,0,130,254,162,6,235,2,157,16,39, + 22,196,3,57,254,162,16,6,5,142,0,0,255,255,0,130,254,162,7,239,2,157,16,38,22,202,0,0,16,7,22,196,3,57,254,162,255,255,255,236, + 254,212,1,135,2,88,16,38,22,203,0,0,16,7,22,196,0,224,254,212,255,255,255,236,254,212,2,126,2,88,16,38,22,204,0,0,16,7,22,196, + 0,224,254,212,255,255,0,139,255,198,3,160,4,26,16,39,22,197,0,250,3,132,16,6,5,111,0,0,255,255,0,145,0,0,4,94,4,26,16,38, + 20,206,0,0,16,7,22,197,1,94,3,132,255,255,0,130,255,236,6,235,3,32,16,39,22,197,2,188,2,138,16,6,5,142,0,0,255,255,0,130, + 255,236,7,239,3,32,16,38,22,202,0,0,16,7,22,197,2,188,2,138,255,255,255,236,0,0,1,243,3,232,16,38,22,203,0,0,16,7,22,197, + 0,99,3,82,255,255,255,236,0,0,2,126,3,232,16,38,22,204,0,0,16,7,22,197,0,99,3,82,255,255,0,130,255,236,6,235,4,26,16,39, + 22,198,2,188,2,138,16,6,5,142,0,0,255,255,0,130,255,236,7,239,4,26,16,38,22,202,0,0,16,7,22,198,2,188,2,138,255,255,255,236, + 0,0,1,243,4,226,16,38,22,203,0,0,16,7,22,198,0,99,3,82,255,255,255,236,0,0,2,126,4,226,16,38,22,204,0,0,16,7,22,198, + 0,99,3,82,255,255,0,157,254,12,5,40,3,102,16,39,22,196,3,7,0,25,16,6,5,90,0,0,255,255,0,157,254,12,5,62,3,102,16,38, + 20,134,0,0,16,7,22,196,2,188,255,206,255,255,255,236,254,212,4,92,3,47,16,38,20,135,0,0,16,7,22,196,2,13,254,212,255,255,255,236, + 254,212,5,62,3,47,16,38,20,136,0,0,16,7,22,196,2,13,254,212,255,255,0,157,254,12,5,40,3,102,16,6,5,90,0,0,0,1,0,157, + 254,12,5,62,3,102,0,48,0,0,37,51,21,35,34,39,38,39,38,39,6,7,6,21,20,23,22,33,50,55,21,6,35,32,39,38,53,16,55,54, + 55,34,35,34,7,6,7,53,36,51,32,23,21,34,7,23,22,23,22,5,22,40,49,129,123,82,61,6,73,114,98,224,74,129,1,73,193,212,150,250, + 254,94,169,131,212,96,137,12,13,95,140,135,95,1,16,193,1,38,200,109,31,29,51,72,90,184,184,150,100,156,15,178,24,80,183,252,137,94,164,118, + 184,99,194,150,224,1,2,223,101,52,19,19,41,184,63,54,154,13,91,160,95,119,0,0,0,1,255,236,0,0,4,92,3,47,0,30,0,0,1,38, + 39,38,39,38,7,53,54,55,50,23,4,23,21,6,7,6,7,6,7,6,43,1,53,51,50,55,54,55,54,3,83,83,103,85,180,82,161,72,75,162, + 172,1,2,220,76,88,166,74,145,75,221,163,128,100,227,129,104,116,94,2,29,23,23,19,16,7,6,184,7,1,35,52,98,154,24,52,98,66,129,27, + 80,184,72,58,106,86,0,0,0,1,255,236,0,0,5,62,3,47,0,41,0,0,1,4,23,21,6,7,22,23,22,59,1,21,35,34,39,38,39,6, + 7,6,7,6,43,1,53,51,50,55,54,55,54,55,38,39,38,39,38,7,53,54,55,50,2,126,1,2,220,65,73,50,30,104,114,66,86,209,126,40, + 59,69,41,145,75,221,163,128,100,227,129,104,116,94,101,83,103,85,180,82,161,72,75,162,3,12,52,98,154,20,41,78,34,119,184,168,54,97,46,37, + 129,27,80,184,72,58,106,86,35,23,23,19,16,7,6,184,7,1,0,0,255,255,0,157,254,12,5,40,4,176,16,39,22,196,2,63,4,26,16,6, + 5,90,0,0,255,255,0,157,254,12,5,62,4,176,16,38,20,134,0,0,16,7,22,196,2,63,4,26,255,255,255,236,0,0,4,92,4,76,16,38, + 20,135,0,0,16,7,22,196,2,13,3,182,255,255,255,236,0,0,5,62,4,76,16,38,20,136,0,0,16,7,22,196,2,13,3,182,255,255,0,125, + 255,218,3,27,3,82,16,6,5,92,0,0,0,1,0,125,255,218,4,71,3,82,0,32,0,0,1,38,39,51,22,23,22,21,20,23,22,59,1,21, + 35,34,39,6,7,6,35,34,39,53,22,51,50,55,54,55,54,53,52,2,34,57,182,227,97,82,81,83,44,99,75,130,147,97,93,207,46,45,102,103, + 115,84,33,34,172,35,8,2,63,122,153,78,137,134,117,73,83,44,184,130,128,33,7,38,184,42,9,49,112,27,42,68,255,255,0,125,255,218,3,27, + 4,176,16,39,22,196,1,69,4,26,16,6,5,92,0,0,255,255,0,125,255,218,4,71,4,176,16,38,20,142,0,0,16,7,22,196,1,69,4,26, + 255,255,255,171,254,12,3,98,2,38,16,6,5,94,0,0,0,1,255,171,254,12,4,126,2,38,0,24,0,0,1,51,22,23,22,23,22,59,1,21, + 35,34,39,2,7,4,33,53,32,55,54,55,54,53,52,2,120,184,30,3,10,73,42,101,75,130,130,50,68,251,254,228,254,190,1,48,203,218,35,10, + 2,38,112,30,103,77,44,184,62,254,234,133,151,184,128,138,208,58,72,126,255,255,255,171,254,12,3,98,3,182,16,39,22,196,2,113,3,32,16,6, + 5,94,0,0,255,255,255,171,254,12,4,126,3,182,16,38,20,146,0,0,16,7,22,196,2,113,3,32,255,255,0,130,254,12,9,26,2,238,16,6, + 5,96,0,0,0,1,0,130,254,12,10,71,2,238,0,70,0,0,37,22,55,54,53,51,20,23,22,51,50,25,1,51,17,20,23,22,59,1,21,35, + 34,39,6,7,6,35,34,39,38,39,6,7,6,39,38,39,6,7,6,7,6,35,38,39,36,17,52,55,51,6,23,22,23,22,51,50,55,54,55,54, + 39,38,47,1,51,23,22,23,22,5,184,78,48,37,184,19,64,110,142,184,83,44,99,75,130,145,118,68,109,37,32,73,48,138,17,49,95,64,56,137, + 39,24,84,133,193,80,120,128,109,254,237,105,184,108,1,1,147,95,81,98,95,121,94,64,1,1,16,64,184,36,16,28,58,181,2,124,95,202,205,50, + 169,1,24,1,38,254,170,97,83,44,184,96,91,25,9,25,70,123,159,30,20,2,2,60,179,107,170,62,26,1,28,71,1,72,246,180,206,220,179,38, + 24,37,48,158,108,142,125,61,234,156,74,60,126,0,0,0,0,1,255,236,255,227,6,10,2,238,0,49,0,0,37,6,7,6,43,1,53,51,50,55, + 54,61,1,51,21,20,23,22,51,50,55,54,53,51,20,23,22,55,54,25,1,51,17,20,7,6,7,6,35,34,39,38,39,6,7,6,35,34,39,38, + 1,128,43,56,76,99,130,75,99,44,80,184,44,43,104,109,44,37,184,19,64,110,142,184,92,75,102,37,35,63,55,137,18,48,96,68,65,98,72,60, + 138,59,33,46,184,44,80,100,192,156,64,100,99,122,103,194,205,50,170,1,2,1,22,1,38,254,170,199,113,92,24,9,25,61,132,156,33,24,49,40, + 0,1,255,236,255,227,7,55,2,238,0,56,0,0,5,6,35,34,39,38,39,6,7,6,35,34,39,38,39,6,7,6,43,1,53,51,50,55,54,61, + 1,51,21,20,23,22,51,50,55,54,53,51,20,23,22,55,54,25,1,51,17,20,23,22,59,1,21,35,34,39,6,4,253,37,35,63,55,137,18,48, + 96,68,65,98,72,60,41,43,56,76,99,130,75,99,44,80,184,44,43,104,109,44,37,184,19,64,110,142,184,83,44,99,75,130,145,118,68,20,9,25, + 61,132,156,33,24,49,40,73,59,33,46,184,44,80,100,192,156,64,100,99,122,103,194,205,50,170,1,2,1,22,1,38,254,170,97,83,44,184,96,90, + 255,255,0,130,254,12,9,26,4,176,16,39,22,198,4,226,3,32,16,6,5,96,0,0,255,255,0,130,254,12,10,71,4,176,16,38,20,150,0,0, + 16,7,22,198,4,226,3,32,255,255,255,236,255,227,6,10,4,176,16,38,20,151,0,0,16,7,22,198,2,138,3,32,255,255,255,236,255,227,7,55, + 4,176,16,38,20,152,0,0,16,7,22,198,2,138,3,32,255,255,0,130,254,12,9,19,2,229,16,6,5,98,0,0,0,2,0,130,254,12,9,225, + 2,229,0,60,0,73,0,0,41,1,34,39,38,53,20,7,6,7,6,35,38,39,36,17,52,55,51,6,23,22,23,22,51,50,55,54,55,54,53,52, + 39,51,6,23,22,23,54,55,54,55,54,23,22,23,22,21,20,7,22,23,22,59,1,21,35,34,47,1,6,3,34,7,6,7,51,50,55,54,39,38, + 39,38,6,117,254,236,38,52,45,74,88,238,80,120,128,109,254,237,105,184,108,1,1,147,95,81,102,91,162,43,33,39,171,1,14,10,40,115,123,108, + 147,72,88,125,97,186,42,14,16,61,82,75,130,131,103,28,204,18,76,126,168,145,187,237,129,187,1,2,137,37,30,26,16,186,128,155,77,26,1,28, + 71,1,72,246,180,206,220,179,38,24,37,68,138,108,127,147,138,15,55,40,50,146,108,94,70,34,1,2,37,71,233,77,70,12,11,44,184,92,26,118, + 2,55,81,108,194,63,91,70,135,19,5,0,0,2,255,236,0,0,6,50,2,229,0,12,0,46,0,0,1,6,7,51,50,55,54,53,52,39,38,35, + 34,3,33,34,39,38,39,6,43,1,53,51,50,55,54,61,1,51,21,20,22,23,54,55,54,55,54,51,50,23,22,21,20,7,6,3,208,168,145,187, + 237,129,186,139,37,48,76,186,254,236,74,78,65,39,102,172,130,75,99,44,80,184,18,45,101,95,153,144,75,85,115,107,186,184,202,1,230,108,194,63, + 91,70,135,19,5,253,201,42,35,61,138,184,44,80,100,114,78,24,80,50,134,84,137,63,33,39,68,236,169,109,120,0,0,2,255,236,0,0,7,4, + 2,229,0,43,0,56,0,0,41,1,34,39,38,39,6,43,1,53,51,50,55,54,61,1,51,21,20,22,23,54,55,54,55,54,51,50,23,22,21,20, + 7,22,23,22,59,1,21,35,34,47,1,6,3,6,7,51,50,55,54,53,52,39,38,35,34,3,152,254,232,74,78,65,39,102,172,130,75,99,44,80, + 184,18,45,101,95,153,144,75,85,113,109,190,42,14,16,61,82,75,130,131,103,28,204,224,168,145,187,237,129,186,139,37,48,76,42,35,61,138,184,44, + 80,100,114,78,24,80,50,134,84,137,63,33,39,68,236,75,72,12,11,44,184,92,26,118,1,230,108,194,63,91,70,135,19,5,0,0,255,255,0,130, + 254,12,9,19,3,182,16,39,22,196,4,251,3,32,16,6,5,98,0,0,255,255,0,130,254,12,9,225,3,182,16,38,20,158,0,0,16,7,22,196, + 4,251,3,32,255,255,255,236,0,0,6,50,3,182,16,38,20,159,0,0,16,7,22,196,1,219,3,32,255,255,255,236,0,0,7,4,3,182,16,38, + 20,160,0,0,16,7,22,196,1,219,3,32,255,255,0,144,0,0,6,220,6,20,16,6,5,100,0,0,0,2,0,144,0,0,7,172,6,20,0,28, + 0,41,0,0,41,2,53,33,17,51,17,18,37,54,51,50,23,22,21,20,7,22,23,22,59,1,21,35,34,47,1,6,37,51,50,55,54,39,38,39, + 38,35,34,7,6,4,64,253,191,254,145,1,111,184,217,1,20,92,68,117,105,188,42,14,16,61,82,75,130,131,103,28,204,253,233,187,237,129,187,1, + 2,137,37,48,80,122,177,184,5,92,251,14,1,63,99,33,39,69,235,77,70,12,11,44,184,92,26,118,184,63,93,68,135,19,5,81,120,0,0,0, + 0,2,255,236,0,0,5,212,6,20,0,12,0,31,0,0,37,51,50,55,54,39,38,39,38,35,34,7,6,19,41,1,53,33,17,51,17,18,37,54, + 51,50,23,22,21,20,7,6,2,57,187,237,129,187,1,2,137,37,48,80,122,177,117,253,193,254,245,1,11,184,217,1,20,92,68,117,105,186,184,202, + 184,63,93,68,135,19,5,81,120,254,146,184,5,92,251,14,1,63,99,33,39,69,235,169,109,120,0,0,0,2,255,236,0,0,6,164,6,20,0,28, + 0,41,0,0,41,2,53,33,17,51,17,18,37,54,51,50,23,22,21,20,7,22,23,22,59,1,21,35,34,47,1,6,37,51,50,55,54,39,38,39, + 38,35,34,7,6,3,56,253,191,254,245,1,11,184,217,1,20,92,68,117,105,188,42,14,16,61,82,75,130,131,103,28,204,253,233,187,237,129,187,1, + 2,137,37,48,80,122,177,184,5,92,251,14,1,63,99,33,39,69,235,77,70,12,11,44,184,92,26,118,184,63,93,68,135,19,5,81,120,0,0,0, + 255,255,0,144,0,0,6,220,6,20,16,39,22,196,3,207,3,82,16,6,5,100,0,0,255,255,0,144,0,0,7,172,6,20,16,38,20,166,0,0, + 16,7,22,196,3,207,3,82,255,255,255,236,0,0,5,212,6,20,16,38,20,167,0,0,16,7,22,196,2,199,3,82,255,255,255,236,0,0,6,164, + 6,20,16,38,20,168,0,0,16,7,22,196,2,199,3,82,255,255,0,117,254,12,4,178,4,42,16,6,5,102,0,0,0,2,0,117,254,12,4,178, + 3,14,0,37,0,43,0,0,1,6,33,32,39,38,16,55,46,1,53,52,55,54,50,23,22,21,20,7,6,7,30,1,59,1,21,35,32,39,6,21, + 20,23,22,33,50,55,1,54,52,34,21,20,4,178,152,254,255,254,91,157,98,187,61,68,125,97,238,95,127,91,57,94,68,182,85,160,144,254,246,248, + 154,41,107,1,95,193,212,253,49,136,206,254,111,99,188,122,1,146,140,50,116,42,110,64,48,48,64,112,91,67,43,32,64,77,184,228,129,107,108,61, + 158,118,2,150,56,96,51,36,0,1,255,236,0,0,3,248,4,42,0,26,0,0,55,50,55,38,39,38,53,16,55,54,51,21,34,6,20,23,22,51, + 50,55,37,21,5,4,43,1,53,60,161,202,75,52,88,204,125,251,218,186,62,83,70,55,74,1,32,254,92,254,162,178,88,184,93,24,59,100,140,1, + 8,125,77,169,137,255,52,70,33,129,184,197,164,184,0,0,0,2,255,236,0,0,3,240,3,14,0,36,0,47,0,0,37,6,43,1,53,51,50,55, + 54,55,38,39,38,53,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,22,23,22,59,1,21,35,34,2,34,7,6,21,20,23,54,53,52,39, + 1,238,194,202,118,96,107,66,59,40,97,68,30,13,16,104,89,238,89,104,16,13,30,77,88,31,68,61,112,96,118,202,168,52,30,47,103,103,47,185, + 185,184,40,36,39,85,90,39,45,31,41,55,52,45,45,52,55,41,31,45,39,98,77,31,44,40,184,2,85,7,12,32,29,95,95,29,32,12,0,0, + 255,255,0,117,254,12,4,178,5,70,16,39,22,196,1,119,4,176,16,6,5,102,0,0,255,255,0,117,254,12,4,178,4,76,16,38,20,174,0,0, + 16,7,22,196,1,169,3,182,255,255,255,236,0,0,3,248,5,70,16,38,20,175,0,0,16,7,22,196,1,119,4,176,255,255,255,236,0,0,3,240, + 4,76,16,38,20,176,0,0,16,7,22,196,1,163,3,182,255,255,0,130,255,164,7,158,5,20,16,39,22,196,5,245,4,126,16,6,5,186,0,0, + 255,255,0,130,255,165,8,92,4,76,16,38,22,205,0,0,16,7,22,196,5,245,3,182,255,255,255,236,0,0,3,63,5,20,16,38,22,206,0,0, + 16,7,22,196,1,169,4,126,255,255,255,236,0,0,4,32,4,126,16,38,22,207,0,0,16,7,22,196,1,187,3,232,255,255,0,107,254,72,5,155, + 5,20,16,39,22,197,3,82,4,126,16,6,5,143,0,0,255,255,0,107,254,12,6,192,4,1,16,38,22,208,0,0,16,7,22,197,3,132,3,107, + 255,255,255,236,0,0,3,63,5,20,16,38,22,209,0,0,16,7,22,197,1,44,4,126,255,255,255,236,0,0,4,32,4,126,16,38,22,210,0,0, + 16,7,22,197,1,56,3,232,255,255,0,144,255,201,5,199,6,20,16,6,5,107,0,0,0,2,0,144,255,201,6,210,6,20,0,33,0,68,0,0, + 1,21,6,7,6,21,20,23,22,23,22,21,20,7,6,35,34,39,53,22,51,50,55,54,53,52,39,38,39,38,55,54,55,54,19,6,39,38,39,36, + 53,52,55,51,6,21,22,23,22,51,50,55,54,55,54,25,1,51,17,20,23,22,59,1,21,35,34,39,6,3,208,74,38,80,14,12,68,102,88,82, + 78,66,56,68,45,60,57,60,78,74,18,32,1,2,75,85,138,109,145,207,101,254,219,16,184,14,2,160,121,127,140,89,152,98,76,184,49,44,99,75, + 130,153,113,158,4,111,82,4,14,30,33,28,18,16,10,15,88,110,42,39,11,88,10,26,26,30,38,17,16,28,47,46,81,38,43,251,112,20,2,2, + 30,88,195,75,53,58,44,92,46,35,27,47,94,73,1,1,3,177,251,107,106,49,44,184,123,126,0,0,0,1,255,236,0,0,3,207,6,20,0,31, + 0,0,41,1,53,33,50,55,54,53,52,39,1,38,53,52,55,54,55,1,21,5,6,7,6,21,20,23,1,22,21,20,7,6,1,54,254,182,1,54, + 148,45,16,54,254,202,50,10,31,104,2,233,253,173,71,21,6,31,1,19,102,62,95,184,104,36,36,69,66,1,124,61,81,35,33,118,43,1,54,186, + 250,30,40,11,25,32,37,254,182,123,123,113,101,155,0,0,0,1,255,236,0,0,4,127,6,20,0,41,0,0,41,1,53,33,50,55,54,53,52,39, + 1,38,53,52,55,54,55,1,21,5,6,7,6,21,20,23,1,22,23,22,59,1,21,35,34,39,38,47,1,6,7,6,1,54,254,182,1,54,148,45, + 16,54,254,202,50,10,31,104,2,233,253,173,71,21,6,31,2,71,22,38,43,64,88,132,65,58,103,33,97,21,17,95,184,104,36,36,69,66,1,124, + 61,81,35,33,118,43,1,54,186,250,30,40,11,25,32,37,253,63,26,14,16,184,24,43,41,120,46,27,155,0,0,0,255,255,0,144,254,200,5,24, + 6,20,16,6,5,108,0,0,0,1,0,144,254,200,6,35,6,20,0,36,0,0,37,54,53,17,51,17,20,23,22,59,1,21,35,34,39,6,7,6, + 5,6,35,34,39,36,3,38,55,51,6,21,20,23,22,51,50,55,54,4,18,78,184,49,44,99,75,130,112,78,18,27,121,254,251,134,85,99,69,254, + 220,1,1,64,184,65,166,40,73,80,109,174,73,126,227,4,106,251,107,106,49,44,184,51,46,40,177,66,34,22,91,1,18,138,92,115,115,126,66,16, + 34,53,0,0,0,1,255,236,0,0,1,175,6,20,0,13,0,0,1,20,7,6,43,1,53,51,50,55,54,53,17,51,1,175,87,80,154,130,75,99, + 44,49,184,1,115,178,101,92,184,44,49,106,4,149,0,0,0,1,255,236,0,0,2,186,6,20,0,20,0,0,37,6,43,1,53,51,50,55,54,53, + 17,51,17,20,23,22,59,1,21,35,34,1,83,77,152,130,75,99,44,49,184,49,44,99,75,130,150,86,86,184,44,49,106,4,149,251,107,106,49,44, + 184,0,0,0,255,255,0,140,254,20,4,94,2,243,16,6,5,109,0,0,0,2,0,140,254,20,5,103,2,116,0,17,0,53,0,0,37,22,51,50, + 55,54,53,52,39,38,39,38,35,34,7,6,21,20,5,6,7,6,35,34,39,38,7,6,21,17,35,17,52,55,54,51,38,53,52,55,54,51,50,23, + 22,23,22,23,22,59,1,21,35,34,2,98,122,76,44,21,53,6,21,59,40,46,59,27,68,1,192,15,13,133,75,181,141,50,75,25,200,120,65,90, + 2,162,77,92,72,84,170,40,15,40,38,105,75,130,175,168,42,22,57,58,24,20,88,17,12,27,68,68,40,169,14,8,80,78,28,78,26,79,254,147, + 1,109,173,102,55,42,40,148,132,63,36,71,179,67,44,44,184,0,0,0,0,2,255,236,255,205,3,166,2,109,0,21,0,36,0,0,37,6,35,34, + 39,6,43,1,53,51,50,54,55,54,55,54,51,50,23,22,21,20,37,22,51,50,55,54,53,52,39,38,35,34,6,7,6,3,100,97,147,206,110,64, + 104,160,116,52,87,5,20,135,94,81,176,91,97,253,240,62,159,47,19,52,40,42,88,46,91,15,7,52,102,98,48,184,71,49,181,80,56,84,89,184, + 143,78,69,18,53,69,75,38,41,60,97,37,0,2,255,236,255,206,4,180,2,109,0,29,0,47,0,0,37,6,35,34,39,6,43,1,53,51,50,55, + 54,55,54,55,54,51,50,23,22,23,22,23,22,59,1,21,35,34,37,22,51,50,55,54,53,52,39,38,39,38,35,34,7,6,7,6,3,100,97,139, + 214,110,64,104,160,116,52,44,43,5,20,135,94,93,72,66,193,17,5,51,36,107,75,130,176,254,20,62,159,47,19,52,5,22,58,39,39,53,41,50, + 15,7,52,102,98,48,184,36,35,49,181,80,56,29,83,167,49,62,44,184,196,69,18,53,69,19,18,88,17,12,27,33,97,37,0,0,255,255,0,147, + 254,181,5,72,3,182,16,39,22,196,2,63,3,32,16,6,5,211,0,0,255,255,0,147,254,12,6,43,2,188,16,38,20,44,0,0,16,7,22,196, + 2,63,2,38,255,255,255,236,0,0,1,135,3,232,16,39,22,196,0,224,3,82,16,6,22,203,0,0,255,255,255,236,0,0,2,126,3,232,16,39, + 22,196,0,224,3,82,16,6,22,204,0,0,255,255,0,139,255,198,3,160,2,222,16,6,5,111,0,0,0,2,0,145,0,0,4,94,2,238,0,10, + 0,36,0,0,1,38,39,38,39,6,7,6,23,30,1,19,38,39,51,22,23,22,23,22,59,1,21,35,34,39,38,39,6,35,34,39,38,53,52,55, + 54,2,164,15,13,13,12,120,82,111,2,1,180,116,4,3,184,1,36,21,56,31,112,75,130,90,73,45,38,138,156,56,58,189,204,109,1,26,42,49, + 50,101,12,67,89,62,41,50,1,209,39,43,168,174,101,79,44,184,51,31,59,73,15,48,154,173,127,68,0,3,255,236,255,189,3,189,3,229,0,15, + 0,45,0,61,0,0,1,54,55,54,53,52,39,38,35,34,7,6,21,20,23,22,7,50,55,38,39,38,53,52,55,54,23,38,39,53,22,23,4,23, + 22,21,20,7,6,35,34,39,6,43,1,53,1,22,21,20,7,6,7,22,51,50,55,54,53,52,39,38,1,148,36,34,39,15,22,58,65,23,22,7, + 21,249,52,78,45,15,18,45,48,77,44,81,223,216,1,0,64,14,40,74,175,131,154,120,146,137,2,171,6,98,12,17,52,49,125,17,7,33,29,1, + 13,27,64,72,61,46,37,52,45,43,35,30,37,118,136,11,105,69,78,64,84,83,90,9,39,14,185,68,179,209,222,52,57,103,61,113,108,41,184,1, + 68,37,39,147,105,14,19,46,67,30,33,60,78,69,0,0,0,3,255,236,254,13,3,196,2,171,0,10,0,36,0,47,0,0,37,51,50,55,54,53, + 52,35,34,7,6,7,18,55,54,51,50,23,22,21,20,7,33,21,33,22,21,20,7,6,35,34,39,38,3,35,53,5,20,23,22,51,50,53,52,39, + 38,35,1,83,19,42,96,114,84,75,74,38,184,9,129,108,129,138,69,46,163,1,88,254,168,163,46,69,138,129,108,129,9,175,1,103,38,74,75,84, + 114,96,42,184,76,90,52,112,141,72,117,1,10,126,107,99,67,114,111,108,184,108,111,114,67,99,107,128,1,8,184,184,117,72,141,112,52,90,76,0, + 255,255,255,171,254,12,3,64,2,134,16,6,5,112,0,0,0,2,255,171,254,12,4,54,2,134,0,11,0,44,0,0,37,52,39,38,39,38,7,6, + 7,6,23,22,5,51,21,35,39,6,7,6,7,6,33,53,32,55,54,55,38,39,38,39,38,39,38,55,54,55,54,23,22,23,22,23,22,2,141,16, + 24,46,60,60,67,13,17,64,47,1,115,246,194,70,25,129,83,105,192,254,147,1,105,132,168,62,118,45,139,51,106,10,2,10,27,176,59,65,87,69, + 133,22,13,184,76,57,80,30,41,26,29,56,75,54,40,4,184,1,156,129,83,47,86,184,76,95,148,3,7,24,43,89,135,31,57,155,75,25,1,2, + 49,92,141,83,255,255,0,130,254,243,5,192,3,74,16,6,5,113,0,0,0,1,0,130,254,240,6,191,2,2,0,55,0,0,5,54,53,38,39,38, + 39,38,53,52,55,54,55,54,51,50,23,22,59,1,21,35,34,39,38,35,34,7,6,21,20,23,22,23,22,7,6,7,6,35,34,39,36,17,52,55, + 51,6,21,20,23,22,51,50,55,54,4,76,91,1,47,29,30,44,52,80,84,30,42,117,87,128,32,35,35,114,112,108,26,36,15,45,65,73,3,3, + 113,128,218,89,104,188,117,254,219,63,184,65,166,66,179,91,77,149,33,51,33,43,13,8,40,59,61,65,60,94,14,6,134,196,184,172,165,6,17,35, + 48,27,30,123,98,86,96,31,12,41,103,1,6,153,90,90,153,114,78,31,8,15,0,0,255,255,0,130,254,12,5,192,3,74,16,39,22,197,1,244, + 254,12,16,6,5,113,0,0,255,255,0,130,254,12,6,191,2,2,16,39,22,197,1,244,254,12,16,6,20,212,0,0,255,255,255,236,254,212,1,243, + 2,88,16,38,20,59,0,0,16,7,22,197,0,99,254,212,255,255,255,236,254,212,2,126,2,88,16,38,20,60,0,0,16,7,22,197,0,99,254,212, + 255,255,255,46,255,236,3,191,6,237,16,38,20,223,0,0,16,7,5,123,254,150,1,44,255,255,255,46,255,236,4,218,6,237,16,38,20,224,0,0, + 16,7,5,123,254,150,1,44,255,255,255,229,255,236,3,191,7,163,16,38,20,223,0,0,16,7,5,124,254,150,1,44,255,255,255,229,255,236,4,218, + 7,163,16,38,20,224,0,0,16,7,5,124,254,150,1,44,255,255,0,23,254,12,3,191,6,20,16,38,20,223,0,0,16,7,5,125,254,200,0,0, + 255,255,0,23,254,12,4,218,6,20,16,38,20,224,0,0,16,7,5,125,254,200,0,0,0,1,0,84,255,236,3,191,6,20,0,22,0,0,1,16, + 7,6,7,6,35,34,39,53,22,51,50,55,1,51,1,54,55,54,53,17,51,3,191,139,55,77,205,158,106,75,96,85,113,136,254,22,179,1,170,29, + 20,37,184,3,66,254,212,218,85,71,180,32,184,32,152,4,70,252,65,43,55,137,184,2,174,0,0,0,0,1,0,84,255,236,4,218,6,20,0,31, + 0,0,1,6,7,6,35,34,39,53,22,51,50,55,1,51,1,54,55,54,53,17,51,17,20,23,22,59,1,21,35,34,39,38,3,52,59,73,202,161, + 106,75,96,85,113,136,254,22,179,1,170,29,20,37,184,34,64,80,105,129,175,102,17,1,60,91,65,180,32,184,32,152,4,70,252,65,43,55,137,184, + 2,174,252,68,174,84,158,184,243,41,0,0,0,3,0,30,255,84,8,22,7,76,0,3,0,7,0,42,0,0,9,4,21,51,53,39,53,52,54,55, + 54,55,54,63,1,54,55,54,53,52,38,35,34,6,7,21,62,1,51,50,22,21,20,6,15,1,14,1,29,1,4,26,3,252,252,4,252,4,3,150, + 203,6,6,6,8,19,23,44,88,92,34,36,223,184,103,193,94,97,179,79,108,131,51,57,90,90,56,7,76,252,4,252,4,3,252,253,174,254,254,147, + 123,52,60,21,25,26,31,43,86,90,64,69,76,159,194,56,57,188,67,70,110,89,49,94,53,89,86,130,101,154,0,0,0,2,0,100,255,227,5,170, + 5,213,0,7,0,10,0,0,55,1,51,1,7,3,33,3,1,33,3,100,2,48,230,2,48,168,193,253,140,193,1,6,1,234,245,35,5,178,250,78, + 64,1,246,254,10,2,170,2,124,0,0,0,0,3,0,200,255,237,4,20,5,232,0,9,0,26,0,36,0,0,1,17,51,50,55,54,53,52,38,35, + 1,54,51,50,23,22,21,20,7,22,21,20,7,6,33,34,39,19,17,51,50,55,54,53,52,38,35,1,124,52,251,119,61,198,175,254,222,136,100,240, + 162,206,215,214,117,171,254,189,100,132,180,111,234,94,44,236,191,2,126,254,35,114,59,66,89,149,3,87,19,97,123,208,213,122,122,228,142,112,164,19, + 5,52,254,21,128,61,56,104,142,0,0,0,0,1,0,100,255,227,3,234,5,243,0,5,0,0,5,9,1,23,9,1,3,107,252,249,3,7,127,253, + 120,2,136,29,3,8,3,8,127,253,119,253,119,0,0,0,0,2,0,200,0,0,4,6,5,210,0,12,0,21,0,0,51,17,51,32,23,22,23,22, + 16,7,6,4,33,55,62,2,16,39,46,1,39,200,90,1,132,158,159,25,10,39,56,254,185,254,194,90,206,199,65,10,18,188,254,5,210,120,122,249, + 101,254,98,127,184,173,192,8,99,212,1,122,92,172,145,10,0,1,0,200,0,0,3,156,5,242,0,13,0,0,1,17,35,17,5,7,37,17,5,7, + 37,17,5,7,1,124,180,2,212,28,253,252,2,32,28,253,252,2,32,28,1,54,254,202,5,242,117,178,83,254,195,88,178,83,254,195,88,178,0,0, + 0,1,0,200,0,0,3,156,5,242,0,9,0,0,1,17,35,17,5,7,37,17,5,7,1,124,180,2,212,28,253,252,2,32,28,3,42,252,214,5, + 242,117,178,83,254,195,88,178,0,1,0,150,0,0,2,238,5,213,0,11,0,0,19,33,21,35,17,51,21,33,53,51,17,35,150,2,88,210,210,253, + 168,210,210,5,213,180,251,147,180,180,4,109,0,3,0,200,0,0,4,56,5,213,0,3,0,7,0,11,0,0,19,33,17,33,1,17,33,17,5,33, + 17,33,200,3,112,252,144,2,188,253,248,2,8,253,248,2,8,5,213,250,43,3,69,1,220,254,36,180,254,35,0,0,0,5,0,150,255,227,6,164, + 5,243,0,15,0,20,0,25,0,30,0,35,0,0,0,2,6,4,32,36,38,2,16,18,54,36,32,4,22,18,1,54,0,55,33,3,17,33,22,0, + 1,33,17,6,0,1,17,33,38,0,6,164,122,208,254,224,254,198,254,224,208,122,122,208,1,32,1,58,1,32,208,122,253,83,194,1,18,30,254,14, + 180,254,14,30,1,18,254,208,1,242,194,254,238,2,136,1,242,30,254,238,2,78,254,224,208,123,123,208,1,32,1,58,1,32,208,123,123,208,254,224, + 253,22,30,1,18,195,254,13,1,243,195,254,238,2,137,1,243,30,254,238,1,48,254,13,195,1,18,0,0,1,0,200,0,0,1,124,5,213,0,3, + 0,0,19,51,17,35,200,180,180,5,213,250,43,0,0,0,0,1,0,200,255,227,4,131,5,243,0,10,0,0,33,35,17,51,17,1,23,9,1,7, + 1,1,124,180,180,2,136,120,253,46,2,217,120,253,113,5,213,253,225,2,61,134,253,129,253,123,134,2,67,0,0,0,0,1,0,200,0,0,3,251, + 5,213,0,6,0,0,9,1,23,1,35,17,51,1,124,1,255,128,253,77,128,180,1,51,2,0,128,253,77,5,213,0,0,1,0,200,0,0,10,212, + 5,243,0,12,0,0,19,51,9,3,23,9,3,17,35,200,116,2,131,2,56,2,47,2,46,128,253,82,253,210,253,209,253,179,180,5,213,253,229,2, + 57,253,209,2,47,128,253,83,2,46,253,210,1,238,251,76,0,1,0,200,0,0,6,119,5,243,0,8,0,0,19,51,9,1,23,9,1,17,35,200, + 116,2,131,2,56,128,253,82,253,179,180,5,213,253,229,2,57,128,253,83,1,238,251,76,0,5,0,200,0,0,6,156,5,213,0,3,0,7,0,11, + 0,15,0,19,0,0,1,17,33,17,1,33,17,33,1,17,33,17,33,17,33,17,19,17,33,17,1,124,1,220,253,112,5,212,250,44,3,68,1,220, + 251,148,1,220,180,1,220,2,144,254,36,1,220,3,69,250,43,5,33,254,36,1,220,254,36,1,220,253,111,254,36,1,220,0,0,0,0,3,0,150, + 255,227,6,164,5,243,0,15,0,31,0,39,0,0,0,54,52,46,2,34,14,2,20,30,2,50,54,0,2,6,4,32,36,38,2,16,18,54,36,32, + 4,22,18,4,6,34,38,52,54,50,22,5,146,94,94,159,222,240,222,159,94,94,159,222,240,222,1,177,122,208,254,224,254,198,254,224,208,122,122,208, + 1,32,1,58,1,32,208,122,253,133,82,116,82,82,116,82,1,148,223,240,223,158,95,95,158,223,240,223,158,95,95,1,88,254,224,208,123,123,208,1, + 32,1,58,1,32,208,123,123,208,254,224,215,82,82,116,82,82,0,0,0,0,1,0,200,0,0,4,231,5,232,0,17,0,0,1,36,53,52,36,33, + 34,7,17,35,17,54,51,32,0,17,16,5,3,40,1,11,254,211,254,226,53,55,180,162,126,1,98,1,157,254,129,2,89,102,212,182,249,6,250,196, + 5,212,20,254,191,254,236,254,176,146,0,0,0,1,0,200,0,0,6,42,5,213,0,11,0,0,51,17,51,9,1,51,17,35,17,9,1,17,200,180, + 1,253,1,253,180,180,254,3,254,3,5,213,253,162,2,94,250,43,4,189,253,161,2,95,251,67,0,0,0,2,0,150,0,0,4,26,5,242,0,11, + 0,29,0,0,0,52,46,1,34,14,1,20,30,1,50,62,1,6,7,6,7,17,35,17,38,39,46,1,52,62,1,50,30,1,3,102,72,125,146,125, + 72,72,125,146,125,252,122,102,64,72,180,71,65,104,120,121,207,244,207,121,3,231,147,124,72,72,124,147,125,72,72,76,209,59,37,14,253,137,2,119, + 14,37,60,208,244,207,121,121,207,0,0,0,0,2,0,200,0,0,4,68,5,233,0,12,0,23,0,0,8,1,21,20,2,7,6,35,17,35,17,54, + 51,3,32,55,54,53,52,39,38,35,34,7,2,216,1,108,200,255,118,139,180,162,126,108,1,9,133,134,139,114,190,43,46,5,233,254,229,252,141,254, + 209,78,36,254,92,5,213,20,252,111,115,114,150,158,108,88,4,0,0,0,0,1,0,150,255,242,2,242,5,234,0,9,0,0,9,3,7,9,3,23, + 1,148,1,94,254,162,1,31,128,254,99,1,94,254,162,1,157,128,4,76,254,162,254,162,254,226,128,1,158,1,94,1,94,1,158,128,0,1,0,100, + 0,0,4,252,5,242,0,7,0,0,1,7,37,17,35,17,37,55,4,252,56,254,50,180,254,34,56,4,138,172,149,251,141,4,173,153,172,0,0,0, + 0,1,0,200,0,0,4,180,5,234,0,7,0,0,1,23,1,17,35,17,51,17,4,52,128,252,200,180,180,5,234,128,252,201,253,205,5,213,253,92, + 0,1,0,150,255,227,4,231,5,242,0,11,0,0,9,1,55,9,1,23,9,1,7,9,1,39,2,81,254,69,150,1,146,1,147,150,254,69,1,187, + 150,254,109,254,110,150,2,237,2,163,98,253,161,2,95,98,253,93,253,88,98,2,100,253,156,98,0,0,0,3,0,150,0,0,4,226,5,213,0,19, + 0,27,0,36,0,0,33,35,53,38,39,38,16,55,54,55,53,51,21,22,23,22,16,7,6,7,25,1,54,55,54,16,39,38,1,17,6,7,6,21, + 20,23,22,3,22,180,170,129,161,161,128,171,180,170,129,161,161,128,171,96,75,109,109,75,254,236,96,75,109,109,75,204,26,128,161,1,199,162,128,26, + 203,203,26,128,161,254,57,162,128,26,3,135,253,48,23,76,108,1,50,108,75,253,72,2,208,23,76,110,152,150,110,76,0,1,0,100,0,0,6,22, + 5,242,0,11,0,0,33,35,17,1,55,1,17,51,17,1,23,1,3,151,180,253,129,128,1,255,180,1,255,128,253,129,2,244,2,126,128,254,0,1, + 227,254,29,2,0,128,253,130,0,3,0,150,255,241,3,162,5,185,0,7,0,29,0,37,0,0,0,52,38,34,6,20,22,50,36,6,32,38,16,55, + 54,55,38,39,38,16,54,32,22,16,7,6,7,22,23,22,2,52,38,34,6,20,22,50,2,238,123,174,123,123,174,1,47,229,254,190,229,114,47,55, + 55,47,114,229,1,66,229,114,47,55,55,47,114,180,123,174,123,123,174,1,32,174,123,123,174,123,49,229,229,1,66,115,47,27,28,46,114,1,67,229, + 229,254,190,115,47,27,28,46,114,1,195,174,123,123,174,123,0,2,0,200,0,0,3,224,5,232,0,10,0,19,0,0,51,17,54,51,50,4,21,20, + 4,33,25,1,50,54,53,52,38,35,34,7,200,132,129,243,1,32,254,169,254,243,202,230,180,162,42,48,5,213,19,230,189,208,220,253,103,3,78,127, + 118,99,156,6,0,2,0,200,255,237,3,224,5,213,0,10,0,20,0,0,19,51,17,32,4,21,20,4,35,34,39,19,48,17,22,51,50,54,53,52, + 38,200,180,1,13,1,87,254,224,243,129,132,180,48,42,162,180,230,5,213,253,103,220,208,189,230,19,2,135,254,18,6,156,99,118,127,0,1,0,100, + 0,0,2,188,5,213,0,7,0,0,19,53,33,17,51,17,35,17,100,1,164,180,180,2,145,180,2,144,250,43,2,145,0,2,0,100,0,0,5,170, + 5,242,0,6,0,14,0,0,9,1,35,1,55,9,1,0,6,34,38,52,54,50,22,5,170,253,208,230,253,208,168,1,251,1,251,254,145,82,116,82, + 82,116,82,5,178,250,78,5,178,64,250,218,5,38,253,216,82,82,116,82,82,0,0,0,255,255,0,200,0,0,1,124,5,213,18,6,20,240,0,0, + 0,1,0,100,255,227,5,170,5,213,0,6,0,0,55,1,51,1,7,9,1,100,2,48,230,2,48,168,254,5,254,5,35,5,178,250,78,64,5,38, + 250,218,0,0,255,255,0,150,255,227,4,231,5,242,18,6,20,254,0,0,0,1,0,100,0,0,6,39,5,243,0,8,0,0,19,9,1,7,1,17, + 35,17,1,100,2,200,2,251,122,253,219,180,254,16,3,44,2,199,253,59,132,1,254,251,88,4,157,254,15,0,0,0,0,3,0,170,1,224,6,130, + 2,168,0,3,0,7,0,11,0,0,1,33,53,33,5,53,33,21,41,1,53,33,1,253,254,173,1,83,3,50,1,83,253,189,254,174,1,82,1,224, + 200,200,200,200,200,0,0,0,255,255,0,170,1,55,6,130,4,14,16,39,21,10,0,0,255,88,16,7,15,93,0,0,3,70,0,0,255,255,0,170, + 1,58,6,130,4,10,16,39,21,10,0,0,1,98,16,7,15,92,0,0,1,58,0,0,255,255,0,170,1,61,6,130,4,11,16,39,21,10,0,0, + 255,93,16,7,15,92,0,0,3,67,0,0,255,255,0,170,1,59,6,130,4,10,16,39,15,93,0,0,1,60,16,7,21,10,0,0,1,98,0,0, + 255,255,0,170,1,61,6,130,4,10,16,39,21,10,0,0,255,93,16,7,21,10,0,0,1,98,0,0,255,255,0,170,0,0,6,130,5,72,16,39, + 15,92,0,0,4,128,16,38,15,92,0,0,16,39,15,92,0,0,1,128,16,7,15,92,0,0,3,0,255,255,0,170,0,0,6,130,5,72,16,39, + 15,92,0,0,4,128,16,39,15,92,0,0,1,128,16,39,15,92,0,0,3,0,16,6,15,93,0,0,255,255,0,170,0,0,6,130,5,72,16,39, + 21,10,0,0,254,32,16,39,15,92,0,0,4,128,16,39,15,92,0,0,1,128,16,7,15,92,0,0,3,0,0,0,255,255,0,170,0,0,6,130, + 5,72,16,39,15,92,0,0,4,128,16,38,15,92,0,0,16,39,15,92,0,0,3,0,16,7,15,93,0,0,1,128,255,255,0,170,0,0,6,130, + 5,72,16,39,15,93,0,0,1,128,16,39,15,92,0,0,4,128,16,39,15,92,0,0,3,0,16,6,15,93,0,0,255,255,0,170,0,0,6,130, + 5,72,16,39,15,93,0,0,1,128,16,39,15,92,0,0,3,0,16,39,15,92,0,0,4,128,16,7,21,10,0,0,254,32,0,0,255,255,0,170, + 0,0,6,130,5,72,16,38,15,92,0,0,16,38,21,10,0,160,16,39,15,92,0,0,4,128,16,7,15,92,0,0,3,0,0,0,255,255,0,170, + 0,0,6,130,5,72,16,38,15,93,0,0,16,38,21,10,0,160,16,39,15,92,0,0,4,128,16,7,15,92,0,0,3,0,0,0,255,255,0,170, + 0,0,6,130,5,72,16,39,21,10,0,0,254,32,16,39,15,92,0,0,3,0,16,39,15,92,0,0,4,128,16,6,21,10,0,160,255,255,0,170, + 0,0,6,130,5,72,16,39,15,93,0,0,3,0,16,39,15,92,0,0,1,128,16,38,15,92,0,0,16,7,15,92,0,0,4,128,255,255,0,170, + 0,0,6,130,5,72,16,39,15,93,0,0,3,0,16,39,15,92,0,0,4,128,16,39,15,92,0,0,1,128,16,6,15,93,0,0,255,255,0,170, + 0,0,6,130,5,72,16,39,21,10,0,0,254,32,16,39,15,92,0,0,1,128,16,39,15,92,0,0,4,128,16,7,15,93,0,0,3,0,0,0, + 255,255,0,170,0,0,6,130,5,72,16,38,15,92,0,0,16,39,15,93,0,0,1,128,16,39,15,93,0,0,3,0,16,7,15,92,0,0,4,128, + 255,255,0,170,0,0,6,130,5,72,16,38,15,93,0,0,16,39,15,92,0,0,4,128,16,39,15,93,0,0,3,0,16,7,15,93,0,0,1,128, + 255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,254,32,16,39,15,93,0,0,1,128,16,39,15,93,0,0,3,0,16,7,15,92,0,0, + 4,128,0,0,255,255,0,170,0,0,6,130,5,72,16,38,21,10,0,160,16,39,15,92,0,0,4,128,16,39,15,93,0,0,3,0,16,6,15,92, + 0,0,0,0,255,255,0,170,0,0,6,130,5,72,16,38,21,10,0,160,16,38,15,93,0,0,16,39,15,92,0,0,4,128,16,7,15,93,0,0, + 3,0,0,0,255,255,0,170,0,0,6,130,5,72,16,38,21,10,0,160,16,39,15,92,0,0,4,128,16,39,15,93,0,0,3,0,16,7,21,10, + 0,0,254,32,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,1,32,16,39,15,92,0,0,1,128,16,38,15,92,0,0,16,7,15,92, + 0,0,4,128,255,255,0,170,0,0,6,130,5,72,16,38,15,93,0,0,16,39,15,92,0,0,4,128,16,39,15,92,0,0,1,128,16,7,21,10, + 0,0,1,32,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,254,32,16,39,21,10,0,0,1,32,16,39,15,92,0,0,1,128,16,7, + 15,92,0,0,4,128,0,0,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,1,128,16,39,15,92,0,0,4,128,16,38,15,92,0,0, + 16,7,21,10,0,0,1,32,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,1,32,16,38,15,93,0,0,16,39,15,92,0,0,4,128, + 16,7,15,93,0,0,1,128,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,1,32,16,39,21,10,0,0,254,32,16,39,15,92,0,0, + 4,128,16,7,15,93,0,0,1,128,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,1,32,16,39,15,92,0,0,4,128,16,38, + 21,10,0,160,16,6,15,92,0,0,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,1,32,16,39,15,92,0,0,4,128,16,38, + 21,10,0,160,16,6,15,93,0,0,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,1,32,16,38,21,10,0,160,16,39,15,92, + 0,0,4,128,16,7,21,10,0,0,254,32,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,39,15,92,0,0,3,0,16,39, + 15,92,0,0,1,128,16,6,15,92,0,0,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,38,15,93,0,0,16,39,15,92, + 0,0,3,0,16,7,15,92,0,0,1,128,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,39,15,92,0,0,3,0,16,39, + 15,92,0,0,1,128,16,7,21,10,0,0,254,32,0,0,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,39,15,93,0,0, + 1,128,16,39,15,92,0,0,3,0,16,6,15,92,0,0,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,38,15,93,0,0, + 16,39,15,92,0,0,3,0,16,7,15,93,0,0,1,128,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,39,21,10,0,0, + 254,32,16,39,15,92,0,0,3,0,16,7,15,93,0,0,1,128,0,0,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,39, + 15,92,0,0,3,0,16,38,21,10,0,160,16,6,15,92,0,0,0,0,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,39, + 15,92,0,0,3,0,16,38,21,10,0,160,16,6,15,93,0,0,0,0,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,38, + 21,10,0,160,16,39,15,92,0,0,3,0,16,7,21,10,0,0,254,32,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,38, + 15,92,0,0,16,39,15,92,0,0,1,128,16,7,15,93,0,0,3,0,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,38, + 15,93,0,0,16,39,15,92,0,0,1,128,16,7,15,93,0,0,3,0,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,39, + 15,93,0,0,3,0,16,39,15,92,0,0,1,128,16,7,21,10,0,0,254,32,0,0,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0, + 4,128,16,39,15,93,0,0,3,0,16,39,15,93,0,0,1,128,16,6,15,92,0,0,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0, + 4,128,16,39,15,93,0,0,1,128,16,39,15,93,0,0,3,0,16,6,15,93,0,0,255,255,0,170,0,0,6,130,5,72,16,39,15,93,0,0, + 4,128,16,39,15,93,0,0,3,0,16,39,15,93,0,0,1,128,16,7,21,10,0,0,254,32,0,0,255,255,0,170,0,0,6,130,5,72,16,39, + 15,93,0,0,4,128,16,38,15,92,0,0,16,39,15,93,0,0,3,0,16,6,21,10,0,160,0,0,255,255,0,170,0,0,6,130,5,72,16,39, + 15,93,0,0,4,128,16,39,15,93,0,0,3,0,16,38,15,93,0,0,16,6,21,10,0,160,0,0,255,255,0,170,0,0,6,130,5,72,16,39, + 15,93,0,0,4,128,16,39,21,10,0,0,254,32,16,39,15,93,0,0,3,0,16,6,21,10,0,160,255,255,0,170,0,0,6,130,5,72,16,39, + 15,93,0,0,4,128,16,38,15,92,0,0,16,39,15,92,0,0,1,128,16,7,21,10,0,0,1,32,255,255,0,170,0,0,6,130,5,72,16,39, + 15,93,0,0,4,128,16,39,21,10,0,0,1,32,16,39,15,92,0,0,1,128,16,6,15,93,0,0,255,255,0,170,0,0,6,130,5,72,16,39, + 15,93,0,0,4,128,16,39,15,92,0,0,1,128,16,39,21,10,0,0,1,32,16,7,21,10,0,0,254,32,0,0,255,255,0,170,0,0,6,130, + 5,72,16,39,15,93,0,0,4,128,16,39,21,10,0,0,1,32,16,38,15,92,0,0,16,7,15,93,0,0,1,128,255,255,0,170,0,0,6,130, + 5,72,16,39,15,93,0,0,4,128,16,39,15,93,0,0,1,128,16,38,15,93,0,0,16,7,21,10,0,0,1,32,255,255,0,170,0,0,6,130, + 5,72,16,39,15,93,0,0,4,128,16,39,15,93,0,0,1,128,16,39,21,10,0,0,254,32,16,7,21,10,0,0,1,32,0,0,255,255,0,170, + 0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,38,15,92,0,0,16,38,21,10,0,160,16,7,21,10,0,0,1,32,0,0,255,255,0,170, + 0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,38,15,93,0,0,16,38,21,10,0,160,16,7,21,10,0,0,1,32,0,0,255,255,0,170, + 0,0,6,130,5,72,16,39,15,93,0,0,4,128,16,39,21,10,0,0,254,32,16,38,21,10,0,160,16,7,21,10,0,0,1,32,255,255,0,170, + 0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,38,15,92,0,0,16,39,15,92,0,0,1,128,16,7,15,92,0,0,3,0,255,255,0,170, + 0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,15,92,0,0,1,128,16,39,15,92,0,0,3,0,16,6,15,93,0,0,255,255,0,170, + 0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,21,10,0,0,254,32,16,39,15,92,0,0,1,128,16,7,15,92,0,0,3,0,0,0, + 255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,38,15,92,0,0,16,39,15,92,0,0,3,0,16,7,15,93,0,0,1,128, + 255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,15,93,0,0,1,128,16,39,15,92,0,0,3,0,16,6,15,93,0,0, + 255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,15,93,0,0,1,128,16,39,15,92,0,0,3,0,16,7,21,10,0,0, + 254,32,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,38,15,92,0,0,16,38,21,10,0,160,16,7,15,92,0,0, + 3,0,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,38,15,93,0,0,16,38,21,10,0,160,16,7,15,92,0,0, + 3,0,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,21,10,0,0,254,32,16,39,15,92,0,0,3,0,16,6, + 21,10,0,160,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,15,93,0,0,3,0,16,39,15,92,0,0,1,128,16,6, + 15,92,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,15,93,0,0,3,0,16,39,15,92,0,0,1,128,16,6, + 15,93,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,21,10,0,0,254,32,16,39,15,92,0,0,1,128,16,7, + 15,93,0,0,3,0,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,38,15,92,0,0,16,39,15,93,0,0,1,128, + 16,7,15,93,0,0,3,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,38,15,93,0,0,16,39,15,93,0,0,3,0, + 16,7,15,93,0,0,1,128,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,21,10,0,0,254,32,16,39,15,93,0,0, + 1,128,16,7,15,93,0,0,3,0,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,38,21,10,0,160,16,39,15,93, + 0,0,3,0,16,6,15,92,0,0,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,38,21,10,0,160,16,38,15,93, + 0,0,16,7,15,93,0,0,3,0,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,38,21,10,0,160,16,39,15,93, + 0,0,3,0,16,7,21,10,0,0,254,32,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,21,10,0,0,1,32,16,39, + 15,92,0,0,1,128,16,6,15,92,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,38,15,93,0,0,16,39,15,92, + 0,0,1,128,16,7,21,10,0,0,1,32,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,21,10,0,0,254,32,16,39, + 21,10,0,0,1,32,16,7,15,92,0,0,1,128,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,15,93,0,0, + 1,128,16,38,15,92,0,0,16,7,21,10,0,0,1,32,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,21,10,0,0, + 1,32,16,38,15,93,0,0,16,7,15,93,0,0,1,128,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39,21,10,0,0, + 1,32,16,39,21,10,0,0,254,32,16,7,15,93,0,0,1,128,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39, + 21,10,0,0,1,32,16,38,21,10,0,160,16,6,15,92,0,0,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39, + 21,10,0,0,1,32,16,38,21,10,0,160,16,6,15,93,0,0,0,0,255,255,0,170,0,0,6,130,5,72,16,39,21,10,0,0,2,160,16,39, + 21,10,0,0,1,32,16,38,21,10,0,160,16,7,21,10,0,0,254,32,0,3,0,16,0,0,5,220,5,213,0,3,0,11,0,14,0,0,1,35, + 1,51,9,1,33,3,33,3,35,1,23,1,33,3,93,205,1,238,205,254,87,2,58,254,92,152,253,128,153,119,2,57,24,254,227,2,56,5,113,250, + 243,5,113,250,43,1,161,254,95,5,213,199,252,247,0,0,0,6,0,201,0,0,5,78,5,213,0,12,0,20,0,28,0,32,0,37,0,42,0,0, + 19,33,50,22,21,20,7,22,17,20,4,35,33,1,17,51,50,55,17,38,35,3,17,51,54,51,17,38,35,33,17,51,17,1,54,53,52,47,1,54, + 53,52,39,201,2,102,231,250,192,254,254,240,251,253,134,1,144,234,59,51,51,59,234,214,36,32,32,36,253,254,202,2,35,208,208,62,208,208,5,213, + 192,177,229,93,97,254,225,200,218,2,233,253,123,7,2,119,7,2,136,253,220,3,2,31,2,250,243,5,13,251,17,68,220,229,68,150,54,205,196,54, + 0,4,0,232,0,0,6,51,5,213,0,8,0,16,0,20,0,25,0,0,19,33,32,0,17,16,0,41,1,1,19,51,50,55,17,38,35,33,17,51, + 3,1,54,17,16,39,232,2,3,1,178,1,150,254,104,254,80,253,253,1,146,1,99,245,160,160,246,254,112,202,1,2,198,223,223,5,213,254,151,254, + 128,254,126,254,150,5,113,250,243,65,4,139,65,250,243,5,13,251,107,149,1,123,1,113,156,0,0,0,0,2,0,201,0,0,5,83,5,213,0,3, + 0,15,0,0,1,17,51,17,37,33,21,33,17,33,21,33,17,33,21,33,1,45,202,254,210,4,120,253,26,2,199,253,57,2,248,251,118,5,113,250, + 243,5,13,100,100,253,228,100,253,115,100,0,0,2,0,201,0,0,4,236,5,213,0,9,0,13,0,0,19,33,21,33,17,33,21,33,17,33,1,35, + 17,51,201,4,35,253,111,2,81,253,175,254,110,1,46,202,202,5,213,100,253,228,100,253,15,5,113,250,243,0,0,0,0,2,0,115,255,227,5,139, + 5,240,0,29,0,38,0,0,1,38,36,35,34,7,17,22,51,50,55,54,55,17,33,53,33,17,6,4,35,32,0,17,16,0,33,50,4,23,1,17, + 6,7,6,17,16,23,22,5,100,127,254,252,133,187,135,135,187,145,127,101,86,254,82,2,18,117,254,230,160,254,162,254,117,1,139,1,94,146,1,7, + 111,252,82,28,26,169,169,26,4,228,97,71,64,251,59,64,38,31,53,1,231,100,253,127,83,85,1,153,1,109,1,110,1,153,72,70,251,99,4,73, + 22,26,175,254,186,254,187,175,26,0,0,0,0,2,0,102,0,0,2,190,5,213,0,3,0,15,0,0,1,17,51,17,37,33,21,35,17,51,21,33, + 53,51,17,35,1,46,202,254,110,2,88,100,100,253,168,100,100,5,113,250,243,5,13,100,100,250,243,100,100,5,13,0,0,2,255,150,254,102,2,89, + 5,213,0,8,0,20,0,0,1,17,20,7,54,55,54,53,17,37,33,17,16,6,35,33,53,51,50,54,53,1,45,86,144,63,79,254,212,1,144,205, + 227,254,237,63,134,110,5,113,250,177,242,100,10,74,94,234,5,9,100,250,147,254,242,244,100,150,194,0,0,2,0,201,0,0,6,48,5,213,0,10, + 0,14,0,0,19,33,17,1,51,9,1,35,1,17,33,19,17,51,17,201,1,144,3,3,159,252,163,3,146,153,252,194,254,112,100,202,5,213,253,137, + 2,119,253,64,252,235,2,207,253,49,5,113,250,243,5,13,0,2,0,201,0,0,5,50,5,213,0,5,0,9,0,0,19,33,17,33,21,33,19,17, + 51,17,201,1,146,2,215,251,151,100,202,5,213,250,143,100,5,111,250,243,5,13,0,0,0,3,0,196,0,0,7,111,5,213,0,12,0,16,0,20, + 0,0,33,17,1,35,1,3,33,17,33,9,1,33,17,1,17,51,17,33,17,51,17,5,221,254,95,71,254,98,1,254,110,1,216,1,125,1,127,1, + 215,254,210,202,250,29,202,5,113,251,174,4,82,250,143,5,213,252,8,3,248,250,43,5,113,250,243,5,13,250,243,5,13,0,0,0,0,5,0,114, + 255,227,5,218,5,240,0,15,0,23,0,31,0,39,0,40,0,0,1,32,23,22,17,16,7,6,33,32,39,38,17,16,55,54,19,22,32,55,17,38, + 32,7,3,17,6,7,6,16,23,22,1,17,54,55,54,16,39,38,1,3,38,1,58,188,190,189,189,254,198,254,197,188,189,189,188,71,108,1,16,108, + 108,254,240,108,105,36,32,155,155,32,2,222,35,31,155,155,31,251,204,5,240,210,213,254,160,254,161,212,211,211,210,1,97,1,98,211,210,250,142,50, + 50,4,215,50,50,251,106,4,84,29,37,182,253,156,181,37,4,53,251,175,29,36,182,2,99,182,36,253,244,0,0,0,0,2,0,136,255,220,4,159, + 5,246,0,17,0,45,0,0,1,6,16,22,31,1,30,1,16,7,54,16,38,47,1,46,1,52,37,21,38,32,6,20,22,31,1,30,1,16,4,32, + 37,53,22,32,54,52,38,47,1,46,1,16,36,32,1,80,100,136,172,111,169,168,38,129,156,170,110,176,158,3,15,206,254,197,162,109,148,110,202,201, + 254,224,254,19,254,251,223,1,103,169,122,138,111,202,183,1,22,1,198,5,45,91,254,202,154,41,26,39,185,254,255,78,88,1,100,187,39,27,39,157, + 227,180,112,117,137,233,105,36,27,50,235,254,88,238,102,124,149,146,253,134,32,26,47,207,1,140,244,0,0,2,255,250,0,0,5,176,5,213,0,3, + 0,11,0,0,1,17,51,17,37,33,21,33,17,33,17,33,2,114,200,252,192,5,182,253,238,254,112,253,236,5,113,250,243,5,13,100,100,250,143,5, + 113,0,0,0,0,3,0,177,255,227,5,243,5,213,0,6,0,13,0,29,0,0,1,17,16,7,36,25,1,33,17,16,5,38,19,17,37,33,17,20, + 22,32,54,53,17,33,17,16,0,32,0,17,4,198,88,1,33,251,134,1,33,89,1,254,211,1,145,128,1,32,128,1,145,254,172,253,102,254,172,5, + 113,252,153,254,230,130,98,1,97,3,64,252,192,254,158,96,124,1,31,3,103,100,252,53,240,211,211,240,3,203,252,92,254,220,254,214,1,42,1,36, + 0,2,0,16,0,0,5,183,5,213,0,3,0,10,0,0,19,1,51,1,37,33,9,1,51,1,33,154,1,238,200,254,18,254,174,1,144,1,217,1, + 218,100,253,199,254,204,5,113,250,243,5,13,100,251,23,4,233,250,43,0,0,3,0,68,0,0,8,174,5,213,0,3,0,7,0,20,0,0,9,1, + 51,1,33,1,51,1,37,33,9,1,33,9,1,51,1,33,9,1,33,4,196,1,68,200,254,188,251,53,1,68,200,254,188,254,187,1,144,1,58,1, + 57,1,144,1,58,1,57,100,254,137,254,124,254,197,254,194,254,128,5,113,250,243,5,13,250,243,5,13,100,251,18,4,238,251,18,4,238,250,43,5, + 16,250,240,0,0,2,0,108,0,0,6,6,5,213,0,3,0,15,0,0,9,1,51,1,37,33,9,1,51,9,1,33,9,1,35,1,1,40,3,92, + 198,252,164,254,126,1,184,1,118,1,132,98,254,76,2,58,254,72,254,138,254,124,100,1,182,5,113,250,243,5,13,100,253,206,2,50,253,132,252,167, + 2,50,253,206,2,123,0,0,0,2,255,252,0,0,5,172,5,213,0,8,0,14,0,0,9,1,51,1,17,33,17,1,33,9,1,35,1,17,51,3, + 110,1,218,100,253,240,254,112,253,240,1,148,1,170,254,50,200,1,204,202,3,19,2,194,252,242,253,57,2,199,3,14,252,242,2,170,253,86,253,157, + 0,4,0,123,255,227,4,147,4,123,0,7,0,34,0,44,0,51,0,0,1,52,38,39,22,21,17,51,19,17,33,53,14,1,35,34,38,53,52,54, + 59,1,53,52,38,35,34,6,7,53,62,1,51,32,4,1,53,35,34,7,17,62,1,55,54,5,17,14,1,21,20,22,4,47,150,61,75,136,100,254, + 176,63,188,86,172,203,253,251,208,117,151,96,182,84,119,223,56,1,30,1,26,254,176,208,54,47,94,98,59,58,254,103,67,136,122,2,127,211,134,24, + 93,136,253,89,2,27,253,129,170,102,97,193,162,189,192,72,127,139,46,46,116,39,39,252,254,139,85,4,253,237,4,78,72,71,220,1,253,18,103,139, + 119,116,0,0,0,4,0,148,255,227,5,19,6,20,0,15,0,26,0,30,0,45,0,0,19,33,17,62,1,51,50,0,16,2,35,34,38,39,21,33, + 1,52,39,38,39,17,54,55,54,55,54,1,17,51,17,1,38,35,34,7,6,7,6,21,20,23,22,51,50,55,148,1,78,58,177,124,203,0,255,255, + 203,124,177,58,254,178,4,18,94,44,60,60,44,57,22,15,252,82,134,1,249,25,26,165,75,77,22,14,95,93,165,26,25,6,20,253,162,100,97,254, + 188,253,240,254,188,97,100,168,2,116,159,130,61,32,252,122,32,61,79,115,75,3,218,250,172,5,84,254,100,3,105,104,116,74,158,159,130,130,3,0, + 0,2,0,113,255,227,3,231,4,123,0,26,0,35,0,0,37,21,14,1,35,34,0,17,16,0,33,50,22,23,21,38,39,38,35,34,7,17,22,51, + 50,55,54,37,17,6,7,6,21,20,23,22,3,231,77,165,93,253,254,214,1,45,1,6,85,162,76,69,109,71,74,88,72,67,81,82,72,86,254,24, + 44,36,123,122,36,143,100,36,36,1,62,1,14,1,18,1,58,35,35,100,31,24,15,20,252,87,19,16,19,27,3,83,26,37,128,234,230,131,38,0, + 0,4,0,148,255,227,5,19,6,20,0,15,0,26,0,30,0,45,0,0,1,17,33,17,33,53,14,1,35,34,2,16,0,51,50,22,1,20,23,22, + 23,22,23,17,6,7,6,1,17,51,17,1,17,22,51,50,55,54,53,52,39,38,39,38,35,34,3,197,1,78,254,178,58,177,124,203,255,0,255,203, + 124,177,253,118,15,22,57,44,60,60,44,94,3,40,134,253,129,25,26,165,93,95,14,22,77,75,165,26,3,182,2,94,249,236,168,100,97,1,68,2, + 16,1,68,97,254,90,158,75,115,79,61,32,3,134,32,61,130,2,157,250,172,5,84,254,100,252,54,3,130,130,159,158,74,116,104,105,0,3,0,111, + 255,227,4,125,4,123,0,19,0,24,0,31,0,0,1,33,19,22,51,50,55,21,14,1,35,32,0,17,16,0,51,50,0,21,1,6,17,18,23,19, + 33,46,1,35,34,7,4,125,253,139,1,75,95,217,195,109,195,107,254,244,254,199,1,41,252,229,1,4,253,35,198,1,197,105,2,1,3,204,169,74, + 64,2,4,254,98,21,93,117,45,41,1,56,1,10,1,19,1,67,254,218,247,1,113,122,254,219,254,243,142,1,211,190,231,17,0,0,0,2,0,47, + 0,0,3,227,6,20,0,10,0,32,0,0,1,6,7,6,21,17,51,17,52,55,54,37,21,35,34,7,6,29,1,33,21,33,17,33,17,35,53,51, + 53,52,55,54,51,2,17,103,46,57,135,22,18,1,241,174,148,58,57,1,132,254,124,254,177,176,176,87,88,188,5,174,10,45,56,145,251,182,4,74, + 95,68,56,139,100,57,55,146,100,100,252,26,3,230,100,100,188,84,86,0,0,4,0,113,254,86,4,240,4,123,0,7,0,35,0,46,0,61,0,0, + 1,17,20,7,22,54,25,1,1,53,30,1,51,50,54,61,1,14,1,35,34,2,16,0,51,50,22,23,53,33,17,16,0,33,34,38,3,20,23,22, + 23,17,6,7,6,7,6,1,22,51,50,55,54,55,54,53,52,39,38,35,34,7,4,6,106,5,235,252,108,81,158,82,181,180,58,177,124,203,255,0, + 255,203,124,177,58,1,78,254,214,254,205,114,202,121,94,44,60,60,44,57,22,15,1,47,25,26,165,75,77,22,14,95,93,165,26,25,3,250,252,61, + 202,140,5,157,1,18,3,111,250,151,128,44,42,189,191,113,100,97,1,68,2,16,1,68,97,100,168,252,45,254,226,254,233,29,3,119,159,130,61,32, + 3,134,32,61,79,115,75,253,194,3,105,104,116,74,158,159,130,130,3,0,0,3,0,186,0,0,5,72,6,20,0,10,0,14,0,34,0,0,1,22, + 23,22,21,17,51,17,52,39,38,1,17,51,17,39,33,17,62,1,51,50,22,21,17,33,17,52,38,35,34,6,21,17,33,4,0,9,8,71,140,83, + 53,252,194,135,235,1,79,73,198,129,212,219,254,172,107,107,128,149,254,177,4,13,11,12,104,190,253,148,2,64,193,91,58,1,182,250,180,5,76,100, + 253,158,101,100,239,232,253,92,2,208,159,158,190,164,253,85,0,3,0,230,0,0,2,53,6,20,0,3,0,7,0,11,0,0,1,17,51,17,3,51, + 21,35,7,33,17,33,1,74,135,160,185,185,75,1,79,254,177,3,252,252,104,3,152,2,24,233,203,251,160,0,0,0,0,3,255,215,254,86,2,12, + 6,20,0,8,0,22,0,26,0,0,5,17,35,17,20,7,54,55,54,7,35,53,51,50,55,54,53,17,33,17,20,7,6,3,51,21,35,1,168,135, + 37,71,40,61,244,221,49,108,36,37,1,79,81,82,97,184,184,22,4,18,251,208,181,84,15,48,72,244,100,48,49,153,4,172,251,140,214,96,96,7, + 190,233,0,0,0,2,0,186,0,0,5,50,6,20,0,10,0,14,0,0,19,33,17,1,51,9,1,35,1,17,33,19,17,51,17,186,1,79,2,132, + 140,253,72,2,209,150,253,109,254,177,100,135,6,20,252,105,1,227,253,246,253,170,2,35,253,221,5,176,250,180,5,76,0,2,0,230,0,0,2,234, + 6,20,0,8,0,20,0,0,1,20,23,22,23,38,53,17,35,19,34,39,38,53,17,33,17,20,22,51,21,1,74,61,40,71,37,135,245,182,82,81, + 1,79,76,105,1,148,160,72,48,15,84,181,4,48,250,90,96,96,214,4,126,251,74,156,94,100,0,0,0,4,0,186,0,0,8,135,4,123,0,34, + 0,38,0,49,0,60,0,0,19,33,21,62,1,51,50,22,23,62,1,51,50,22,21,17,33,17,52,38,35,34,6,21,17,33,17,52,38,35,34,6, + 21,17,33,19,17,51,17,37,22,23,22,21,17,51,17,52,39,38,37,22,23,22,21,17,51,17,52,39,38,186,1,79,73,198,129,212,157,27,84,222, + 129,212,219,254,172,107,107,128,149,254,172,107,107,128,149,254,177,100,135,2,91,9,8,71,140,83,53,2,227,9,8,71,140,83,53,4,96,174,101,100, + 172,74,128,118,239,232,253,92,2,208,159,158,190,171,253,92,2,208,159,158,190,164,253,85,3,252,252,104,3,152,17,11,12,104,190,253,148,2,64,193, + 91,58,19,11,12,104,190,253,148,2,64,193,91,58,0,0,0,3,0,186,0,0,5,72,4,123,0,10,0,14,0,34,0,0,1,22,23,22,21,17, + 51,17,52,39,38,37,17,51,17,39,33,21,62,1,51,50,22,21,17,33,17,52,38,35,34,6,21,17,33,4,0,9,8,71,140,83,53,252,194,135, + 235,1,79,73,198,129,212,219,254,172,107,107,128,149,254,177,4,13,11,12,104,190,253,148,2,64,193,91,58,2,252,104,3,152,100,174,101,100,239,232, + 253,92,2,208,159,158,190,164,253,85,0,0,0,4,0,113,255,227,4,117,4,123,0,11,0,19,0,27,0,35,0,0,1,50,0,17,16,0,35,34, + 0,17,16,0,19,22,50,55,17,38,34,7,3,17,6,7,6,16,23,22,1,17,54,55,54,16,39,38,2,115,240,1,18,254,238,240,241,254,239,1, + 17,130,51,120,51,51,120,51,100,52,39,112,112,39,1,218,51,40,112,112,40,4,123,254,200,254,236,254,237,254,199,1,57,1,19,1,20,1,56,251, + 215,11,11,3,186,11,11,252,107,3,112,29,45,128,254,36,128,45,3,82,252,146,28,45,129,1,219,128,45,0,0,0,0,4,0,113,254,86,4,240, + 4,123,0,15,0,26,0,30,0,45,0,0,37,17,33,17,33,21,62,1,51,50,0,16,2,35,34,38,1,52,39,38,39,38,39,17,54,55,54,1, + 17,35,17,1,17,38,35,34,7,6,21,20,23,22,23,22,51,50,1,191,254,178,1,78,58,177,124,203,0,255,255,203,124,177,2,138,15,22,57,44, + 60,60,44,94,252,216,134,2,127,25,26,165,93,95,14,22,77,75,165,26,168,253,174,6,8,168,100,97,254,188,253,240,254,188,97,1,166,158,75,115, + 79,61,32,252,122,32,61,130,253,111,5,72,250,184,1,144,3,202,3,130,130,159,158,74,116,104,105,0,0,4,0,113,254,86,4,240,4,123,0,15, + 0,26,0,30,0,45,0,0,37,14,1,35,34,2,16,0,51,50,22,23,53,33,17,33,1,20,23,22,23,17,6,7,6,7,6,1,51,17,35,1, + 22,51,50,55,54,55,54,53,52,39,38,35,34,7,3,162,58,177,124,203,255,0,255,203,124,177,58,1,78,254,178,253,60,94,44,60,60,44,57,22, + 15,3,40,134,134,254,7,25,26,165,75,77,22,14,95,93,165,26,25,168,100,97,1,68,2,16,1,68,97,100,168,249,248,3,148,159,130,61,32,3, + 134,32,61,79,115,75,252,50,5,72,252,72,3,105,104,116,74,158,159,130,130,3,0,0,0,2,0,186,0,0,3,223,4,123,0,3,0,21,0,0, + 1,17,51,17,39,33,21,62,1,51,50,31,1,21,46,1,35,34,6,21,17,33,1,30,134,234,1,78,58,186,133,27,15,52,31,73,44,156,167,254, + 178,3,252,252,104,3,152,100,174,102,99,3,7,133,18,17,203,190,253,122,0,2,0,111,255,227,3,199,4,123,0,29,0,69,0,0,1,6,7,6, + 21,20,23,22,31,1,22,23,22,21,20,7,54,55,54,53,52,39,38,47,1,38,39,38,53,52,3,30,1,51,50,54,53,52,38,47,1,46,1,53, + 52,54,51,50,22,23,21,46,1,35,34,6,21,20,22,31,1,30,1,21,20,6,35,34,38,39,1,105,39,28,75,38,39,113,52,165,61,66,37,37, + 29,85,43,46,132,51,144,57,71,211,83,160,79,106,113,76,145,52,143,118,224,206,102,180,76,74,92,95,111,112,80,120,51,161,132,247,216,90,195,108, + 3,249,15,23,61,118,102,48,51,34,16,51,59,64,123,82,63,16,23,66,115,108,51,55,39,15,42,55,67,111,84,252,254,55,56,94,85,78,79,44, + 16,44,151,136,166,181,32,31,122,49,36,89,88,68,76,35,15,47,158,144,164,192,37,37,0,2,0,55,0,0,3,136,5,158,0,7,0,27,0,0, + 37,38,55,17,35,17,6,22,19,17,33,21,33,17,20,22,59,1,21,33,34,38,53,17,35,53,51,17,1,208,42,3,135,1,92,144,1,123,254,133, + 75,115,189,254,173,213,162,135,135,106,85,124,3,255,252,55,173,78,5,40,254,172,100,253,85,137,78,100,159,210,2,117,100,1,84,0,0,3,0,177, + 255,229,5,68,4,96,0,10,0,14,0,34,0,0,37,38,39,38,53,17,35,17,20,23,22,5,17,35,17,23,33,53,14,1,35,34,38,53,17,33, + 17,20,22,51,50,54,53,17,33,1,249,9,8,71,140,83,53,3,67,135,235,254,172,73,198,129,212,219,1,84,107,107,128,149,1,84,83,11,12,104, + 190,2,108,253,192,193,91,58,2,3,152,252,104,100,174,101,100,239,232,2,164,253,48,159,158,190,164,2,171,0,0,0,0,2,0,61,0,0,4,177, + 4,96,0,3,0,10,0,0,19,1,51,1,37,33,9,1,51,1,33,205,1,89,131,254,163,254,241,1,84,1,94,1,94,100,254,92,254,212,3,252, + 252,104,3,152,100,252,84,3,172,251,160,0,0,3,0,86,0,0,6,242,4,96,0,3,0,7,0,20,0,0,1,19,51,3,33,19,51,3,37,33, + 27,1,33,27,1,51,1,33,11,1,33,3,241,240,135,242,252,98,240,135,242,254,249,1,84,230,229,1,78,230,229,100,254,219,254,202,241,242,254,199, + 3,252,252,104,3,152,252,104,3,152,100,252,150,3,106,252,150,3,106,251,160,3,150,252,106,0,0,0,0,2,0,76,0,0,5,28,4,96,0,3, + 0,15,0,0,9,1,51,1,37,33,9,1,51,9,1,33,9,1,35,1,1,19,2,171,151,253,85,254,162,1,144,1,29,1,29,124,254,165,1,229, + 254,112,254,227,254,227,124,1,91,3,252,252,104,3,152,100,254,129,1,127,254,45,253,115,1,127,254,129,1,211,0,0,0,2,0,61,254,86,4,195, + 4,96,0,3,0,18,0,0,19,1,55,1,37,33,9,1,51,1,14,1,43,1,53,51,50,54,55,210,1,178,62,254,149,254,230,1,94,1,93,1, + 95,108,254,20,80,146,124,147,147,88,81,43,3,252,251,219,153,3,140,100,252,151,3,105,251,56,199,123,100,67,89,0,0,2,0,88,0,0,4,98, + 4,96,0,3,0,13,0,0,9,1,51,1,37,33,21,1,33,21,33,53,1,33,3,92,253,118,140,2,138,252,137,3,241,253,119,2,137,251,246,2, + 137,253,144,3,252,252,104,3,152,100,100,252,104,100,100,3,152,0,0,0,255,255,0,16,0,0,5,104,5,213,16,6,0,36,0,0,255,255,0,201, + 0,0,4,236,5,213,16,6,0,37,0,0,255,255,0,115,255,227,5,39,5,240,16,6,0,38,0,0,255,255,0,201,0,0,5,176,5,213,16,6, + 0,39,0,0,255,255,0,201,0,0,4,139,5,213,16,6,0,40,0,0,255,255,0,201,0,0,4,35,5,213,16,6,0,41,0,0,255,255,0,115, + 255,227,5,139,5,240,16,6,0,42,0,0,255,255,0,201,0,0,5,59,5,213,16,6,0,43,0,0,255,255,0,151,0,0,2,246,5,213,16,6, + 23,22,0,0,255,255,255,150,254,102,1,147,5,213,16,6,0,45,0,0,255,255,0,201,0,0,5,106,5,213,16,6,0,46,0,0,255,255,0,201, + 0,0,4,106,5,213,16,6,0,47,0,0,255,255,0,201,0,0,6,31,5,213,16,6,0,48,0,0,255,255,0,201,0,0,5,51,5,213,16,6, + 0,49,0,0,255,255,0,115,255,227,5,217,5,240,16,6,0,50,0,0,255,255,0,201,0,0,4,141,5,213,16,6,0,51,0,0,255,255,0,115, + 254,248,5,217,5,240,16,6,0,52,0,0,255,255,0,201,0,0,5,84,5,213,16,6,0,53,0,0,255,255,0,135,255,227,4,162,5,240,16,6, + 0,54,0,0,255,255,255,250,0,0,4,233,5,213,16,6,0,55,0,0,255,255,0,178,255,227,5,41,5,213,16,6,0,56,0,0,255,255,0,16, + 0,0,5,104,5,213,16,6,0,57,0,0,255,255,0,68,0,0,7,166,5,213,16,6,0,58,0,0,255,255,0,61,0,0,5,59,5,213,16,6, + 0,59,0,0,255,255,255,252,0,0,4,231,5,213,16,6,0,60,0,0,255,255,0,92,0,0,5,31,5,213,16,6,0,61,0,0,255,255,0,123, + 255,227,4,45,4,123,16,6,0,68,0,0,255,255,0,186,255,227,4,164,6,20,16,6,0,69,0,0,255,255,0,113,255,227,3,231,4,123,16,6, + 0,70,0,0,255,255,0,113,255,227,4,90,6,20,16,6,0,71,0,0,255,255,0,113,255,227,4,127,4,123,16,6,0,72,0,0,255,255,0,47, + 0,0,2,248,6,20,16,6,0,73,0,0,255,255,0,113,254,86,4,90,4,123,16,6,0,74,0,0,255,255,0,186,0,0,4,100,6,20,16,6, + 0,75,0,0,255,255,0,193,0,0,1,121,6,20,16,6,0,76,0,0,255,255,255,219,254,86,1,121,6,20,16,6,0,77,0,0,255,255,0,186, + 0,0,4,156,6,20,16,6,0,78,0,0,255,255,0,193,0,0,2,57,6,20,16,6,23,12,0,0,255,255,0,186,0,0,7,29,4,123,16,6, + 0,80,0,0,255,255,0,186,0,0,4,100,4,123,16,6,0,81,0,0,255,255,0,113,255,227,4,117,4,123,16,6,0,82,0,0,255,255,0,186, + 254,86,4,164,4,123,16,6,0,83,0,0,255,255,0,113,254,86,4,90,4,123,16,6,0,84,0,0,255,255,0,186,0,0,3,74,4,123,16,6, + 0,85,0,0,255,255,0,111,255,227,3,199,4,123,16,6,0,86,0,0,255,255,0,55,0,0,2,242,5,158,16,6,0,87,0,0,255,255,0,174, + 255,227,4,88,4,123,16,6,0,88,0,0,255,255,0,61,0,0,4,127,4,96,16,6,0,89,0,0,255,255,0,86,0,0,6,53,4,96,16,6, + 0,90,0,0,255,255,0,59,0,0,4,121,4,96,16,6,0,91,0,0,255,255,0,61,254,86,4,127,4,96,16,6,0,92,0,0,255,255,0,88, + 0,0,3,219,4,96,16,6,0,93,0,0,0,4,0,136,255,227,4,144,5,240,0,7,0,12,0,20,0,25,0,0,0,32,0,16,0,32,0,16, + 1,54,17,16,47,1,38,34,7,17,22,50,55,1,6,17,16,23,1,144,1,246,1,10,254,246,254,10,254,248,2,216,204,204,100,51,123,52,52,123, + 51,254,186,202,202,5,240,254,115,253,13,254,115,1,141,2,243,252,35,143,1,212,1,213,143,48,15,15,250,217,15,15,4,247,144,254,44,254,45,144, + 0,2,0,107,0,0,4,172,5,213,0,3,0,14,0,0,1,17,51,17,55,17,33,21,33,53,33,17,5,53,37,2,54,202,98,1,74,251,220,1, + 74,254,153,1,103,5,113,250,243,5,13,100,250,143,100,100,5,13,72,100,72,0,0,0,0,2,0,130,0,0,4,154,5,240,0,16,0,40,0,0, + 55,33,1,54,55,54,16,39,38,39,23,22,21,20,14,1,3,1,36,51,50,4,21,20,14,1,7,1,33,21,33,55,54,0,55,54,16,38,35,34, + 7,251,1,0,1,41,96,34,76,108,68,98,3,90,69,130,209,254,231,1,3,181,243,1,31,48,81,93,254,250,2,40,251,232,1,2,1,158,61,121, + 135,109,152,193,100,1,205,149,64,143,1,57,92,57,24,4,112,168,100,186,207,254,221,4,57,104,244,204,98,172,150,145,254,105,100,100,5,2,65,98, + 191,1,25,168,149,0,0,0,0,3,0,156,255,227,4,115,5,240,0,36,0,42,0,48,0,0,5,34,39,53,23,22,51,50,55,17,38,43,1,53, + 51,50,55,17,38,35,34,15,1,53,54,51,50,4,21,20,6,7,30,1,21,20,4,53,54,53,52,38,39,25,1,62,1,53,52,2,43,187,212,33, + 196,170,101,79,54,63,204,212,59,50,58,76,156,217,27,230,175,230,1,12,141,128,142,162,254,208,204,117,87,69,100,29,74,106,12,68,16,2,149,10, + 100,8,2,32,10,60,8,104,64,209,178,124,170,33,31,197,144,221,242,146,85,232,108,141,36,2,150,254,26,29,121,88,172,0,0,0,0,3,0,90, + 0,0,4,184,5,213,0,3,0,6,0,17,0,0,1,35,19,51,9,1,33,3,33,17,51,21,35,17,33,17,33,53,3,167,203,3,200,254,212,254, + 81,1,175,3,1,147,173,173,254,112,253,223,5,113,250,243,4,193,252,227,3,205,252,51,100,254,92,1,164,127,0,0,0,3,0,148,255,227,4,140, + 5,213,0,4,0,8,0,30,0,0,1,17,35,17,54,1,54,16,39,3,17,38,35,34,7,17,33,21,33,17,12,1,16,4,33,34,39,53,22,51, + 50,1,255,200,103,1,182,204,204,100,49,106,180,206,3,75,254,69,1,17,1,24,254,212,254,189,185,208,189,220,129,3,145,1,224,253,253,27,252,230, + 92,1,220,96,253,73,2,215,10,75,2,239,100,254,35,9,245,254,70,249,60,136,100,0,0,4,0,113,255,227,4,170,5,240,0,4,0,9,0,17, + 0,37,0,0,37,54,17,16,39,1,6,17,16,31,1,22,50,55,17,38,34,7,19,50,23,21,39,38,32,7,17,54,51,50,0,16,0,35,32,0, + 16,0,3,124,202,202,254,38,205,205,100,58,171,45,40,171,63,244,167,168,34,153,254,214,94,66,104,245,1,5,254,240,246,254,223,254,238,1,80,112, + 99,1,12,1,24,92,1,202,179,254,145,254,35,149,50,16,8,3,34,6,19,2,140,60,106,12,54,45,254,102,22,254,239,254,47,254,234,1,141,2, + 219,1,165,0,0,2,0,65,0,0,4,214,5,213,0,3,0,10,0,0,9,1,51,1,37,33,21,1,33,1,33,3,149,254,13,214,1,243,251,214, + 4,149,253,231,254,83,2,26,253,23,5,113,250,243,5,13,100,100,250,143,5,113,0,0,0,7,0,139,255,227,4,139,5,240,0,4,0,12,0,36, + 0,41,0,49,0,57,0,65,0,0,37,54,39,38,39,0,16,23,22,23,17,6,7,19,53,46,1,53,52,36,32,22,21,20,6,7,21,30,1,21, + 20,4,32,36,53,52,54,19,17,6,7,6,5,22,50,55,17,38,34,7,25,1,22,50,55,17,38,34,5,17,54,55,54,16,39,38,3,88,209,7, + 7,195,253,186,95,33,44,44,32,76,128,144,0,255,1,189,254,144,128,145,162,254,247,254,18,254,247,163,144,195,7,7,1,53,49,112,49,49,112,49, + 48,114,48,48,114,1,6,44,32,96,95,33,100,74,234,228,78,2,39,254,248,77,27,18,1,252,18,27,253,220,2,32,177,128,179,208,208,179,128,177, + 32,1,35,197,143,217,232,232,217,143,197,253,108,2,102,78,228,234,97,6,6,2,150,7,7,2,162,253,208,7,7,2,48,7,33,254,4,18,27,77, + 1,8,77,27,0,4,0,106,255,227,4,163,5,240,0,4,0,9,0,17,0,37,0,0,1,6,17,16,23,1,54,17,16,47,1,38,34,7,17,22, + 50,55,3,34,39,53,23,22,32,55,17,6,35,34,0,16,0,51,32,0,16,0,1,152,202,202,1,218,205,205,100,58,171,45,40,171,63,244,167,168, + 34,153,1,42,94,66,104,245,254,251,1,16,246,1,33,1,18,254,176,5,99,99,254,244,254,232,92,254,54,179,1,111,1,221,149,50,16,8,252,222, + 6,19,253,116,60,106,12,54,45,1,154,22,1,17,1,209,1,22,254,115,253,37,254,91,255,255,0,135,255,227,4,143,5,240,16,6,0,19,0,0, + 255,255,0,225,0,0,4,90,5,213,16,6,0,20,0,0,255,255,0,150,0,0,4,74,5,240,16,6,0,21,0,0,255,255,0,156,255,227,4,115, + 5,240,16,6,0,22,0,0,255,255,0,100,0,0,4,164,5,213,16,6,0,23,0,0,255,255,0,158,255,227,4,100,5,213,16,6,0,24,0,0, + 255,255,0,143,255,227,4,150,5,240,16,6,0,25,0,0,255,255,0,168,0,0,4,104,5,213,16,6,0,26,0,0,255,255,0,139,255,227,4,139, + 5,240,16,6,0,27,0,0,255,255,0,129,255,227,4,135,5,240,16,6,0,28,0,0,0,2,0,200,0,70,10,33,5,59,0,3,0,7,0,0, + 1,51,17,35,1,17,33,17,5,46,141,141,251,154,9,89,1,95,2,195,252,36,4,245,251,11,0,0,0,3,0,200,0,70,10,33,5,59,0,3, + 0,7,0,11,0,0,55,17,33,17,39,17,33,17,37,17,51,17,200,9,89,141,247,193,3,217,141,70,4,245,251,11,141,3,219,252,37,140,2,195, + 253,61,0,0,0,4,0,200,0,70,10,33,5,59,0,22,0,26,0,30,0,34,0,0,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6, + 7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,7,48,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16, + 249,152,9,89,141,247,193,3,217,141,2,195,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219, + 252,37,140,2,195,253,61,0,0,5,0,200,0,70,10,33,5,59,0,22,0,44,0,48,0,52,0,56,0,0,1,34,39,38,39,38,52,55,54,55, + 54,51,50,23,22,23,22,21,20,7,6,7,6,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,17,33,17,39, + 17,33,17,37,17,51,17,8,177,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,197,36,24,26,18,15,15,17,27,23,37, + 36,24,26,18,16,16,17,27,23,250,8,9,89,141,247,193,3,217,141,1,63,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16, + 2,17,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,6,0,200, + 0,70,10,33,5,59,0,22,0,43,0,65,0,69,0,73,0,77,0,0,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7, + 6,7,6,1,34,39,38,39,38,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23, + 22,20,7,6,7,6,1,17,33,17,39,17,33,17,37,17,51,17,8,177,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254, + 206,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,254,210,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23, + 250,8,9,89,141,247,193,3,217,141,1,63,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,1,9,15,17,27,23,74,23,26, + 18,16,16,17,27,23,72,25,26,18,15,1,8,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219, + 252,37,140,2,195,253,61,0,0,7,0,200,0,70,10,33,5,59,0,21,0,43,0,65,0,87,0,91,0,95,0,99,0,0,1,52,55,54,55,54, + 50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52, + 55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38, + 39,38,1,17,33,17,39,17,33,17,37,17,51,17,6,39,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,2,18,16,17,27, + 23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,2,2,16,17,27, + 23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,248,143,9,89,141,247,193,3,217,141,3,204,36,24,26,17,16,16,16,27,23,74,23,25, + 19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26, + 17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,252,159,4,245,251,11,141,3,219,252,37,140,2,195,253, + 61,0,0,0,0,8,0,200,0,70,10,33,5,59,0,21,0,43,0,65,0,87,0,110,0,114,0,118,0,122,0,0,1,52,55,54,55,54,50,23, + 22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54, + 55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38, + 5,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,6,39,16,17,26, + 24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17, + 26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,254,247,16, + 17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,249,152,9,89,141,247,193,3,217,141,3,204,36,24,26,17,16,16,16,27,23,74, + 23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36, + 24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24, + 25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,0,9,0,200,0,70,10,33,5,59,0,20,0,42,0,64, + 0,85,0,105,0,127,0,131,0,135,0,139,0,0,1,34,39,38,39,38,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39, + 38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,32,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,23,20,7,6,7,0, + 34,39,38,39,38,39,52,55,54,55,54,50,23,22,23,22,20,7,6,7,2,34,39,38,39,46,1,55,54,55,54,50,23,22,23,22,20,7,6,7, + 0,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,1,17,33,17,39,17,33,17,37,17,51,17,7,164,36,23,26,19, + 16,16,17,28,23,72,24,26,18,16,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,254,205,74,24,25,18,16, + 16,17,26,23,38,36,23,26,17,16,1,17,17,26,2,85,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,23,74,22,26,18,16, + 1,17,17,27,23,72,24,26,18,15,15,17,27,253,126,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,250,28,9,89,141,247, + 193,3,217,141,3,82,16,17,28,23,72,24,26,18,15,15,17,27,23,74,22,26,19,16,253,239,16,17,27,23,37,36,23,26,19,16,16,17,28,23, + 72,24,26,18,16,16,17,27,24,71,24,26,19,16,16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72, + 24,25,19,253,222,16,17,27,24,71,24,26,19,16,16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24, + 25,19,252,227,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,0,0,4,0,200,0,70,10,33,5,59,0,21,0,25,0,29,0,33,0,0, + 1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,2,202,16,17,26,23, + 74,24,25,18,16,16,17,26,24,72,25,26,17,16,253,254,9,89,141,247,193,3,217,141,2,195,36,23,26,18,16,16,16,28,23,36,37,24,25,18, + 16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,0,0,0,5,0,200,0,70,10,33,5,59,0,21,0,44,0,48, + 0,52,0,56,0,0,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,54,51,50,23,22,23,22, + 21,20,7,6,7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,2,204,16,16,27,23,74,23,25,19,16,16,17,27,24,72,24, + 26,17,16,4,100,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,249,152,9,89,141,247,193,3,217,141,2,195,36,23,26,18, + 16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,37,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251, + 11,141,3,219,252,37,140,2,195,253,61,0,0,6,0,200,0,70,10,33,5,59,0,21,0,44,0,66,0,70,0,74,0,78,0,0,1,52,55,54, + 55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7, + 6,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,17,33,17,39,17,33,17,37,17,51,17,2,202,16,17,26, + 23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,5,231,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,197,36,24, + 26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,250,8,9,89,141,247,193,3,217,141,2,195,36,23,26,18,16,16,16,28,23,36,37, + 24,25,18,16,16,17,26,24,254,161,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,2,17,16,17,28,23,72,24,26,18,16, + 16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,0,0,0,7,0,200,0,70,10,33,5,59,0,21, + 0,44,0,65,0,87,0,91,0,95,0,99,0,0,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,34,39,38, + 39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,1,34,39,38,39,38,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6, + 1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,17,33,17,39,17,33,17,37,17,51,17,2,202,16,17,26,23, + 74,24,25,18,16,16,17,26,24,72,25,26,17,16,5,231,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,206,36,23,26, + 19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,254,210,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,250,8,9,89, + 141,247,193,3,217,141,2,195,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,161,16,16,27,24,72,24,25,19,16,16,17, + 27,23,37,36,24,26,17,16,1,9,15,17,27,23,74,23,26,18,16,16,17,27,23,72,25,26,18,15,1,8,16,17,28,23,72,24,26,18,16,16, + 17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,8,0,200,0,70,10,33,5,59,0,21,0,43,0,65, + 0,87,0,109,0,113,0,117,0,121,0,0,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,52,55,54,55,54, + 50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52, + 55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38, + 39,38,1,17,33,17,39,17,33,17,37,17,51,17,2,202,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,3,93,16,17,26,24, + 72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26, + 24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,248,143,9,89, + 141,247,193,3,217,141,2,195,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,1,46,36,24,26,17,16,16,16,27,23,74,23, + 25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24, + 26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,252,159,4,245,251,11,141,3,219,252,37,140,2,195, + 253,61,0,0,0,9,0,200,0,70,10,33,5,59,0,21,0,43,0,65,0,87,0,109,0,132,0,136,0,140,0,144,0,0,1,52,55,54,55,54, + 50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52, + 55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39, + 38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,5,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6, + 7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,2,202,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,3, + 93,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18, + 253,222,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18, + 16,254,247,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,249,152,9,89,141,247,193,3,217,141,2,195,36,23,26,18,16,16, + 16,28,23,36,37,24,25,18,16,16,17,26,24,1,46,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16, + 16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16, + 16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3, + 219,252,37,140,2,195,253,61,0,10,0,200,0,70,10,33,5,59,0,21,0,42,0,64,0,86,0,107,0,127,0,149,0,153,0,157,0,161,0,0, + 1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,37,34,39,38,39,38,52,55,54,55,54,50,23,22,23,22,20,7, + 6,7,6,3,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,32,34,39,38,39,38,52,55,54,55,54,51,50,23,22, + 23,22,23,20,7,6,7,0,34,39,38,39,38,39,52,55,54,55,54,50,23,22,23,22,20,7,6,7,2,34,39,38,39,46,1,55,54,55,54,50, + 23,22,23,22,20,7,6,7,0,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,1,17,33,17,39,17,33,17,37,17, + 51,17,2,202,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,4,218,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17, + 27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,254,205,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17, + 17,26,2,85,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,23,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17, + 27,253,126,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,250,28,9,89,141,247,193,3,217,141,2,195,36,23,26,18,16,16, + 16,28,23,36,37,24,25,18,16,16,17,26,24,180,16,17,28,23,72,24,26,18,15,15,17,27,23,74,22,26,19,16,253,239,16,17,27,23,37,36, + 23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37,36,24, + 26,17,16,16,16,27,24,72,24,25,19,253,222,16,17,27,24,71,24,26,19,16,16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36,24,26, + 17,16,16,16,27,24,72,24,25,19,252,227,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,0,0,5,0,200,0,70,10,33,5,59,0,21, + 0,43,0,47,0,51,0,55,0,0,0,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,1,34,39,38,39,38,53,52, + 55,54,55,54,50,23,22,23,22,20,7,6,7,6,1,17,33,17,39,17,33,17,37,17,51,17,4,114,74,23,25,19,16,16,17,27,23,37,36,24, + 26,17,16,16,17,26,253,173,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,254,109,9,89,141,247,193,3,217,141,1,64,16,17, + 26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,252,244,4, + 245,251,11,141,3,219,252,37,140,2,195,253,61,0,0,0,0,6,0,200,0,70,10,33,5,59,0,22,0,26,0,30,0,34,0,56,0,78,0,0, + 1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,4,34,39,38,39, + 38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,1,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,7, + 48,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,249,152,9,89,141,247,193,3,217,141,254,183,74,23,25,19,16,16,17,27, + 23,37,36,24,26,17,16,16,17,26,253,173,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,2,195,36,23,26,18,16,16,16,28, + 23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,31,16,17,26,24,72,24,26,18,16,16,17,27, + 23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,0,0,7,0,200,0,70,10,33,5,59,0,22, + 0,44,0,48,0,52,0,56,0,78,0,100,0,0,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,1,34,39, + 38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,17,33,17,39,17,33,17,37,17,51,17,4,34,39,38,39,38,52,55,54, + 55,54,51,50,23,22,23,22,21,20,7,6,7,1,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,8,177,36,23,26, + 18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,197,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,250,8,9, + 89,141,247,193,3,217,141,254,183,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,253,173,36,24,26,17,16,16,16,27,23,74,23, + 25,19,16,16,17,27,23,1,63,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,2,17,16,17,28,23,72,24,26,18,16,16, + 17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,31,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37, + 24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,0,8,0,200,0,70,10,33,5,59,0,22,0,43,0,65, + 0,69,0,73,0,77,0,99,0,121,0,0,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,1,34,39,38,39, + 38,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,17, + 33,17,39,17,33,17,37,17,51,17,4,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,1,34,39,38,39,38,53,52, + 55,54,55,54,50,23,22,23,22,20,7,6,7,6,8,177,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,206,36,23,26, + 19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,254,210,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,250,8,9,89, + 141,247,193,3,217,141,254,183,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,253,173,36,24,26,17,16,16,16,27,23,74,23,25, + 19,16,16,17,27,23,1,63,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,1,9,15,17,27,23,74,23,26,18,16,16,17, + 27,23,72,25,26,18,15,1,8,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2, + 195,253,61,31,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24, + 26,18,16,0,0,9,0,200,0,70,10,33,5,59,0,20,0,41,0,62,0,83,0,87,0,91,0,95,0,116,0,137,0,0,1,52,55,54,55,54, + 50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,0,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54, + 55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,17, + 33,17,39,17,33,17,37,17,51,17,4,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,1,34,39,38,39,38,52,55,54, + 55,54,50,23,22,23,22,20,7,6,7,6,6,39,16,17,26,24,72,24,26,18,16,16,16,28,23,73,24,25,18,16,2,18,16,17,27,23,73,24, + 25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,16,28,23,73,24,25,18,2,2,16,17,27,23,73,24,25,18, + 16,16,17,26,24,72,24,26,18,16,248,143,9,89,141,247,193,3,217,141,254,183,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26, + 253,173,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,3,204,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23, + 253,233,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2, + 83,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,252,159,4,245,251,11,141,3,219,252,37,140,2,195,253,61,31,16,17,26,24, + 72,24,26,18,16,16,17,27,23,73,24,25,18,2,2,16,17,27,23,73,24,25,18,16,16,17,26,24,72,24,26,18,16,0,0,0,0,10,0,200, + 0,70,10,33,5,59,0,21,0,43,0,65,0,87,0,110,0,114,0,118,0,122,0,144,0,166,0,0,1,52,55,54,55,54,50,23,22,23,22,20, + 7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23, + 22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,5,52,55,54, + 55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,4,34,39,38,39,38,52,55,54, + 55,54,51,50,23,22,23,22,21,20,7,6,7,1,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,6,39,16,17,26, + 24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17, + 26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,254,247,16, + 17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,249,152,9,89,141,247,193,3,217,141,254,183,74,23,25,19,16,16,17,27,23,37, + 36,24,26,17,16,16,17,26,253,173,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,3,204,36,24,26,17,16,16,16,27,23,74, + 23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36, + 24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24, + 25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,31,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24, + 25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,0,0,11,0,200,0,70,10,33,5,59,0,20,0,42,0,64, + 0,85,0,105,0,127,0,131,0,135,0,139,0,161,0,183,0,0,1,34,39,38,39,38,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,3, + 34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,32,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,23,20, + 7,6,7,0,34,39,38,39,38,39,52,55,54,55,54,50,23,22,23,22,20,7,6,7,2,34,39,38,39,46,1,55,54,55,54,50,23,22,23,22, + 20,7,6,7,0,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,1,17,33,17,39,17,33,17,37,17,51,17,4,34, + 39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,1,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6, + 7,6,7,164,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27, + 23,254,205,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,2,85,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15, + 17,27,23,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,253,126,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17, + 17,26,250,28,9,89,141,247,193,3,217,141,254,183,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,253,173,36,24,26,17,16,16, + 16,27,23,74,23,25,19,16,16,17,27,23,3,82,16,17,28,23,72,24,26,18,15,15,17,27,23,74,22,26,19,16,253,239,16,17,27,23,37,36, + 23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37,36,24, + 26,17,16,16,16,27,24,72,24,25,19,253,222,16,17,27,24,71,24,26,19,16,16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36,24,26, + 17,16,16,16,27,24,72,24,25,19,252,227,4,245,251,11,141,3,219,252,37,140,2,195,253,61,31,16,17,26,24,72,24,26,18,16,16,17,27,23, + 36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,0,0,0,6,0,200,0,70,10,33,5,59,0,21, + 0,43,0,65,0,69,0,73,0,77,0,0,0,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,37,34,39,38,39,38, + 52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,1,17, + 33,17,39,17,33,17,37,17,51,17,4,114,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,254,182,36,23,26,18,16,16,16,28, + 23,36,37,24,25,18,16,16,17,26,24,254,210,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,254,109,9,89,141,247,193,3,217, + 141,1,64,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,249,16,17,26,23,74,24,26,17,16,16,17,26,24,73,24,25,18,16, + 1,9,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,252,244,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,0,0, + 0,7,0,200,0,70,10,33,5,59,0,21,0,43,0,65,0,88,0,92,0,96,0,100,0,0,0,34,39,38,39,38,52,55,54,55,54,51,50,23, + 22,23,22,21,20,7,6,7,37,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,34,39,38,39,38,53,52,55,54, + 55,54,50,23,22,23,22,20,7,6,7,6,5,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,17,33,17,39, + 17,33,17,37,17,51,17,4,114,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,254,182,36,23,26,18,16,16,16,28,23,36,37, + 24,25,18,16,16,17,26,24,254,210,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,4,213,16,17,26,23,38,36,24,26,17,16, + 16,17,26,24,73,24,25,18,16,249,152,9,89,141,247,193,3,217,141,1,64,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,249, + 16,17,26,23,74,24,26,17,16,16,17,26,24,73,24,25,18,16,1,9,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,143, + 36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,0,8,0,200, + 0,70,10,33,5,59,0,21,0,43,0,65,0,88,0,110,0,114,0,118,0,122,0,0,0,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23, + 22,21,20,7,6,7,37,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,34,39,38,39,38,53,52,55,54,55,54, + 50,23,22,23,22,20,7,6,7,6,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,1,34,39,38,39,38,52, + 55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,17,33,17,39,17,33,17,37,17,51,17,4,114,74,23,25,19,16,16,17,27,23,37,36, + 24,26,17,16,16,17,26,254,182,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,210,36,24,26,17,16,16,16,27,23,74, + 23,25,19,16,16,17,27,23,6,86,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,197,36,24,26,18,15,15,17,27,23, + 37,36,24,26,18,16,16,17,27,23,250,8,9,89,141,247,193,3,217,141,1,64,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18, + 249,16,17,26,23,74,24,26,17,16,16,17,26,24,73,24,25,18,16,1,9,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16, + 253,237,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,2,17,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19, + 16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,0,0,0,9,0,200,0,70,10,33,5,59,0,21,0,43,0,65,0,88,0,109, + 0,131,0,135,0,139,0,143,0,0,0,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,37,34,39,38,39,38,52,55, + 54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,1,34,39,38, + 39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,1,34,39,38,39,38,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6, + 1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,17,33,17,39,17,33,17,37,17,51,17,4,114,74,23,25,19, + 16,16,17,27,23,37,36,24,26,17,16,16,17,26,254,182,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,210,36,24,26, + 17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,6,86,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,206,36,23, + 26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,254,210,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,250,8,9, + 89,141,247,193,3,217,141,1,64,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,249,16,17,26,23,74,24,26,17,16,16,17,26, + 24,73,24,25,18,16,1,9,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,253,237,16,16,27,24,72,24,25,19,16,16,17, + 27,23,37,36,24,26,17,16,1,9,15,17,27,23,74,23,26,18,16,16,17,27,23,72,25,26,18,15,1,8,16,17,28,23,72,24,26,18,16,16, + 17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,10,0,200,0,70,10,33,5,59,0,21,0,43,0,65, + 0,87,0,109,0,131,0,153,0,157,0,161,0,165,0,0,0,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,37,34, + 39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6, + 7,6,37,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6, + 7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22, + 20,7,6,7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,4,114,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16, + 17,26,254,182,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,210,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16, + 17,27,23,3,204,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24, + 72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24, + 72,24,26,18,16,248,143,9,89,141,247,193,3,217,141,1,64,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,249,16,17,26,23, + 74,24,26,17,16,16,17,26,24,73,24,25,18,16,1,9,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,122,36,24,26,17, + 16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16, + 16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,252,159,4,245,251,11,141, + 3,219,252,37,140,2,195,253,61,0,0,0,0,11,0,200,0,70,10,33,5,59,0,21,0,43,0,65,0,87,0,109,0,131,0,153,0,176,0,180, + 0,184,0,188,0,0,0,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,37,34,39,38,39,38,52,55,54,55,54,51, + 50,23,22,23,22,20,7,6,7,6,1,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,37,52,55,54,55,54,50,23, + 22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54, + 55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38, + 5,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,4,114,74,23,25, + 19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,254,182,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,210,36,24, + 26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,3,204,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,2,18,16, + 17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,2,2,16, + 17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,254,247,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,249, + 152,9,89,141,247,193,3,217,141,1,64,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,249,16,17,26,23,74,24,26,17,16,16, + 17,26,24,73,24,25,18,16,1,9,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,122,36,24,26,17,16,16,16,27,23,74, + 23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36, + 24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24, + 25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,0,12,0,200,0,70,10,33,5,59,0,21,0,43,0,65, + 0,86,0,108,0,130,0,151,0,171,0,193,0,197,0,201,0,205,0,0,0,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7, + 6,7,37,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23, + 22,20,7,6,7,6,33,34,39,38,39,38,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39,38,53,52,55,54,55,54,50, + 23,22,23,22,20,7,6,7,6,32,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,23,20,7,6,7,0,34,39,38,39,38,39,52,55, + 54,55,54,50,23,22,23,22,20,7,6,7,2,34,39,38,39,46,1,55,54,55,54,50,23,22,23,22,20,7,6,7,0,34,39,38,39,38,53,52, + 55,54,55,54,51,50,23,22,23,30,1,7,6,7,1,17,33,17,39,17,33,17,37,17,51,17,4,114,74,23,25,19,16,16,17,27,23,37,36,24, + 26,17,16,16,17,26,254,182,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,210,36,24,26,17,16,16,16,27,23,74,23, + 25,19,16,16,17,27,23,5,73,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26, + 18,16,16,17,27,23,254,205,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,2,85,74,22,26,18,16,1,17,17,27,23,72, + 24,26,18,15,15,17,27,23,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,253,126,74,24,25,18,16,16,17,26,23,38,36,23, + 26,17,16,1,17,17,26,250,28,9,89,141,247,193,3,217,141,1,64,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,249,16,17, + 26,23,74,24,26,17,16,16,17,26,24,73,24,25,18,16,1,9,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,16,17,28, + 23,72,24,26,18,15,15,17,27,23,74,22,26,19,16,253,239,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,24, + 71,24,26,19,16,16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,253,222,16,17,27,24, + 71,24,26,19,16,16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,252,227,4,245,251,11,141, + 3,219,252,37,140,2,195,253,61,0,0,0,0,7,0,200,0,70,10,33,5,59,0,20,0,41,0,62,0,83,0,87,0,91,0,95,0,0,1,52, + 55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,0,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39, + 36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39,38, + 39,38,1,17,33,17,39,17,33,17,37,17,51,17,1,193,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,16,2,18,16,16,28,23, + 73,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,2,2,16,16,28,23,73,24, + 25,18,16,16,17,26,24,72,24,26,18,16,252,245,9,89,141,247,193,3,217,141,3,204,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17, + 27,23,253,233,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16, + 27,2,83,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,252,159,4,245,251,11,141,3,219,252,37,140,2,195,253,61,0,0,0, + 0,8,0,200,0,70,10,33,5,59,0,21,0,25,0,29,0,33,0,54,0,75,0,96,0,117,0,0,1,52,55,54,55,54,51,50,23,22,23,22, + 20,7,6,7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39, + 38,39,38,0,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7, + 6,34,39,38,39,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,7,48,16,17,26,23,38,36,24,26,17,16,16,17, + 26,24,73,24,25,18,16,249,152,9,89,141,247,193,3,217,141,252,6,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,16,2,18,16, + 16,28,23,73,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,2,2,16,16,28, + 23,73,24,25,18,16,16,17,26,24,72,24,26,18,16,2,195,36,23,26,18,16,16,16,28,23,73,24,25,18,16,16,17,26,24,253,168,4,245,251, + 11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,253,233,73,24,25,19,16,16,17, + 27,23,37,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27, + 23,73,24,25,19,16,16,17,27,23,0,0,0,9,0,200,0,70,10,33,5,59,0,22,0,44,0,48,0,52,0,56,0,78,0,100,0,122,0,144, + 0,0,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22, + 23,22,20,7,6,7,6,1,17,33,17,39,17,33,17,37,17,51,17,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39, + 38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6, + 35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,8,177,36,23,26,18,16,16,16,28,23,36,37, + 24,25,18,16,16,17,26,24,253,197,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,250,8,9,89,141,247,193,3,217,141,252, + 6,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18, + 253,222,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18, + 16,1,63,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,2,17,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26, + 19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233, + 74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36, + 24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,0,0,0,0,10,0,200,0,70,10,33,5,59,0,22,0,43,0,65,0,69,0,73, + 0,77,0,99,0,121,0,143,0,165,0,0,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,1,34,39,38,39, + 38,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,17, + 33,17,39,17,33,17,37,17,51,17,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50, + 23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54, + 55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,8,177,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254, + 206,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,254,210,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23, + 250,8,9,89,141,247,193,3,217,141,252,6,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,16,28,23,36,37,24, + 25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,16,28,23,36,37,24, + 25,18,16,16,17,26,24,72,24,26,18,16,1,63,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,1,9,15,17,27,23,74, + 23,26,18,16,16,17,27,23,72,25,26,18,15,1,8,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141, + 3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23, + 37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74, + 23,25,19,16,16,17,27,23,0,11,0,200,0,70,10,33,5,59,0,21,0,43,0,65,0,87,0,91,0,95,0,99,0,121,0,143,0,165,0,187, + 0,0,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6, + 7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22, + 20,7,6,7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34, + 39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7, + 6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,6,39,16,17,26,24,72,24,26,18, + 16,16,16,28,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26, + 18,16,16,16,28,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,248,143,9,89,141,247,193,3, + 217,141,252,6,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72, + 24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72, + 24,26,18,16,3,204,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17, + 16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16, + 17,27,23,252,159,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253, + 233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83, + 36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,0,0,0,12,0,200,0,70,10,33,5,59,0,21,0,43,0,65,0,87,0,110, + 0,114,0,118,0,122,0,144,0,166,0,188,0,210,0,0,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52, + 55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39, + 38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,5,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6, + 7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39, + 38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6, + 35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,6,39,16,17,26,24,72,24,26,18,16,16,16, + 28,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16, + 16,28,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,254,247,16,17,26,23,38,36,24,26,17, + 16,16,17,26,24,73,24,25,18,16,249,152,9,89,141,247,193,3,217,141,252,6,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18, + 16,2,18,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25, + 18,2,2,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,3,204,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17, + 27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16, + 27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26, + 24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74, + 23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24, + 26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,0,13,0,200,0,70,10,33,5,59,0,20,0,42,0,64,0,85,0,105,0,127,0,131, + 0,135,0,139,0,161,0,183,0,205,0,227,0,0,1,34,39,38,39,38,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39, + 38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,32,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,23,20,7,6,7,0, + 34,39,38,39,38,39,52,55,54,55,54,50,23,22,23,22,20,7,6,7,2,34,39,38,39,46,1,55,54,55,54,50,23,22,23,22,20,7,6,7, + 0,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,1,17,33,17,39,17,33,17,37,17,51,17,1,52,55,54,55,54, + 50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52, + 55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38, + 39,38,7,164,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27, + 23,254,205,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,2,85,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15, + 17,27,23,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,253,126,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17, + 17,26,250,28,9,89,141,247,193,3,217,141,252,6,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,16,28,23,36, + 37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,16,28,23,36, + 37,24,25,18,16,16,17,26,24,72,24,26,18,16,3,82,16,17,28,23,72,24,26,18,15,15,17,27,23,74,22,26,19,16,253,239,16,17,27,23, + 37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37, + 36,24,26,17,16,16,16,27,24,72,24,25,19,253,222,16,17,27,24,71,24,26,19,16,16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36, + 24,26,17,16,16,16,27,24,72,24,25,19,252,227,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74, + 23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36, + 24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,0,0,8,0,200,0,70,10,33,5,59,0,3, + 0,7,0,11,0,33,0,55,0,77,0,99,0,121,0,0,55,17,33,17,39,17,33,17,37,17,51,17,1,52,55,54,55,54,50,23,22,23,22,20, + 7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23, + 22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,5,52,55,54, + 55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,200,9,89,141,247,193,3,217,141,252,6,16,17,26,24,72,24,26,18,16,16,17, + 27,23,36,37,24,25,18,16,2,18,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16, + 17,27,23,36,37,24,25,18,2,2,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,254,247,16,17,26,23,74,24,25,18,16, + 16,17,26,24,72,25,26,17,16,70,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23,25,19,16, + 16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16, + 16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16, + 17,26,24,0,0,9,0,200,0,70,10,33,5,59,0,22,0,26,0,30,0,34,0,56,0,78,0,100,0,122,0,144,0,0,1,52,55,54,55,54, + 51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,1,52,55,54,55,54,50,23,22,23,22, + 20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50, + 23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,5,52,55, + 54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,7,48,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16, + 249,152,9,89,141,247,193,3,217,141,252,6,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,16,28,23,36,37,24, + 25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,16,28,23,36,37,24, + 25,18,16,16,17,26,24,72,24,26,18,16,254,247,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,2,195,36,23,26,18,16,16, + 16,28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23, + 74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37, + 36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37, + 24,25,18,16,16,17,26,24,0,10,0,200,0,70,10,33,5,59,0,22,0,44,0,48,0,52,0,56,0,78,0,100,0,122,0,144,0,166,0,0, + 1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22, + 20,7,6,7,6,1,17,33,17,39,17,33,17,37,17,51,17,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0, + 52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34, + 39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,5,52,55,54,55,54,50,23,22,23,22,21,20,7,6, + 7,6,34,39,38,39,38,8,177,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,197,36,24,26,18,15,15,17,27,23,37, + 36,24,26,18,16,16,17,27,23,250,8,9,89,141,247,193,3,217,141,252,6,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16, + 2,18,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18, + 2,2,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,254,247,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17, + 16,1,63,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,2,17,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26, + 19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233, + 74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36, + 24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,0,0,0, + 0,11,0,200,0,70,10,33,5,59,0,22,0,43,0,65,0,69,0,73,0,77,0,99,0,121,0,143,0,165,0,187,0,0,1,34,39,38,39,38, + 52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,1,34,39,38,39,38,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,1,34, + 39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,17,33,17,39,17,33,17,37,17,51,17,1,52,55,54,55,54,50,23, + 22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54, + 55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38, + 5,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,8,177,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16, + 17,26,24,254,206,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,254,210,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16, + 16,17,27,23,250,8,9,89,141,247,193,3,217,141,252,6,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,16,28, + 23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,16,28, + 23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,254,247,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,1,63,16,16, + 27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,1,9,15,17,27,23,74,23,26,18,16,16,17,27,23,72,25,26,18,15,1,8,16, + 17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16, + 16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16, + 17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16, + 28,23,36,37,24,25,18,16,16,17,26,24,0,12,0,200,0,70,10,33,5,59,0,21,0,43,0,65,0,87,0,91,0,95,0,99,0,121,0,143, + 0,165,0,187,0,209,0,0,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22, + 23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54, + 51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,1,52,55,54,55,54,50,23,22,23,22,20, + 7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23, + 22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,5,52,55,54, + 55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,6,39,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,2, + 18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,2, + 2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,248,143,9,89,141,247,193,3,217,141,252,6,16,17,26,24,72,24,26,18, + 16,16,17,27,23,36,37,24,25,18,16,2,18,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26, + 18,16,16,17,27,23,36,37,24,25,18,2,2,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,254,247,16,17,26,23,74,24, + 25,18,16,16,17,26,24,72,25,26,17,16,3,204,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16, + 17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16, + 27,23,74,23,25,19,16,16,17,27,23,252,159,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23, + 25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24, + 26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25, + 18,16,16,17,26,24,0,0,0,13,0,200,0,70,10,33,5,59,0,21,0,43,0,65,0,87,0,110,0,114,0,118,0,122,0,144,0,166,0,188, + 0,210,0,232,0,0,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22, + 21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50, + 23,22,23,22,20,7,6,7,6,34,39,38,39,38,5,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,17,33, + 17,39,17,33,17,37,17,51,17,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23, + 22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55, + 54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,5,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,6, + 39,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18, + 253,222,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18, + 16,254,247,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,249,152,9,89,141,247,193,3,217,141,252,6,16,17,26,24,72,24, + 26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72, + 24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,254,247,16,17,26,23, + 74,24,25,18,16,16,17,26,24,72,25,26,17,16,3,204,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19, + 16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16, + 16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141, + 3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23, + 37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74, + 23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,0,14,0,200,0,70,10,33,5,59,0,20, + 0,42,0,64,0,85,0,105,0,127,0,131,0,135,0,139,0,161,0,183,0,205,0,227,0,249,0,0,1,34,39,38,39,38,52,55,54,55,54,50, + 23,22,23,22,20,7,6,7,6,3,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,32,34,39,38,39,38,52,55,54, + 55,54,51,50,23,22,23,22,23,20,7,6,7,0,34,39,38,39,38,39,52,55,54,55,54,50,23,22,23,22,20,7,6,7,2,34,39,38,39,46, + 1,55,54,55,54,50,23,22,23,22,20,7,6,7,0,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,1,17,33,17, + 39,17,33,17,37,17,51,17,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22, + 23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54, + 51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,5,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,7,164, + 36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,254,205,74, + 24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,2,85,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,23,74, + 22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,253,126,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,250,28, + 9,89,141,247,193,3,217,141,252,6,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,16,28,23,36,37,24,25,18, + 16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,16,28,23,36,37,24,25,18, + 16,16,17,26,24,72,24,26,18,16,254,247,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,3,82,16,17,28,23,72,24,26,18, + 15,15,17,27,23,74,22,26,19,16,253,239,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16, + 16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,253,222,16,17,27,24,71,24,26,19,16, + 16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,252,227,4,245,251,11,141,3,219,252,37,140, + 2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17, + 16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16, + 17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,0,0,9,0,200,0,70,10,33,5,59,0,3,0,7,0,11, + 0,34,0,58,0,80,0,102,0,124,0,146,0,0,55,17,33,17,39,17,33,17,37,17,51,17,1,34,39,38,39,38,53,52,55,54,55,54,51,50, + 23,22,23,22,20,7,6,7,6,3,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,32,34,39,38,39,38,52, + 55,54,55,54,51,50,23,22,23,22,23,20,7,6,7,1,34,39,38,39,38,39,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,3,34,39, + 38,39,46,1,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,0,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,30,1,7,6, + 7,200,9,89,141,247,193,3,217,141,253,132,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,37,36,23,26,18,16,16,16,28, + 23,36,37,24,25,18,16,16,17,26,24,254,205,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,2,48,36,23,26,18,16,1, + 17,17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,253,149,74,23,26,18,16, + 16,17,27,23,37,36,23,26,17,16,1,17,16,27,70,4,245,251,11,141,3,219,252,37,140,2,195,253,61,1,242,16,17,27,23,37,36,24,26,17, + 16,16,17,26,23,74,23,25,19,16,253,239,16,17,26,23,38,36,23,26,18,16,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18, + 16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,253,238,16,17,26,24,72,24,26, + 18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,0,10,0,200,0,70,10,33, + 5,59,0,22,0,26,0,30,0,34,0,57,0,81,0,103,0,125,0,147,0,169,0,0,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6, + 7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,1,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22,20,7,6, + 7,6,3,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,32,34,39,38,39,38,52,55,54,55,54,51,50,23, + 22,23,22,23,20,7,6,7,1,34,39,38,39,38,39,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39,46,1,55,54,55, + 54,50,23,22,23,22,21,20,7,6,7,6,0,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,7,48,16,17,26,23, + 38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,249,152,9,89,141,247,193,3,217,141,253,132,36,23,26,18,16,16,16,28,23,36,37,24,25, + 18,16,16,17,26,24,37,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,205,74,23,26,18,16,16,17,27,23,37,36,23, + 26,17,16,1,17,16,27,2,48,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26,18,16,1,17,17,27,23,72, + 24,26,18,16,16,17,27,23,253,149,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,2,195,36,23,26,18,16,16,16,28,23, + 36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,1,242,16,17,27,23,37,36,24,26,17,16,16,17, + 26,23,74,23,25,19,16,253,239,16,17,26,23,38,36,23,26,18,16,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,16,17, + 27,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,253,238,16,17,26,24,72,24,26,18,16,16, + 17,27,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,0,0,0,0,11,0,200,0,70,10,33, + 5,59,0,22,0,44,0,48,0,52,0,56,0,79,0,103,0,125,0,147,0,169,0,191,0,0,1,34,39,38,39,38,52,55,54,55,54,51,50,23, + 22,23,22,21,20,7,6,7,6,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,17,33,17,39,17,33,17,37, + 17,51,17,1,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39,38,53,52,55,54,55,54,51,50, + 23,22,23,22,21,20,7,6,7,6,32,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,23,20,7,6,7,1,34,39,38,39,38,39,52, + 55,54,55,54,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39,46,1,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,0,34,39,38, + 39,38,53,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,8,177,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253, + 197,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,250,8,9,89,141,247,193,3,217,141,253,132,36,23,26,18,16,16,16,28, + 23,36,37,24,25,18,16,16,17,26,24,37,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,205,74,23,26,18,16,16,17, + 27,23,37,36,23,26,17,16,1,17,16,27,2,48,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26,18,16,1, + 17,17,27,23,72,24,26,18,16,16,17,27,23,253,149,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,1,63,16,16,27,24, + 72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,2,17,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251, + 11,141,3,219,252,37,140,2,195,253,61,1,242,16,17,27,23,37,36,24,26,17,16,16,17,26,23,74,23,25,19,16,253,239,16,17,26,23,38,36, + 23,26,18,16,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37, + 24,25,18,16,16,17,26,24,72,24,26,18,16,253,238,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,17,27,23, + 36,37,24,25,18,16,16,17,26,24,72,24,26,18,0,0,0,12,0,200,0,70,10,33,5,59,0,22,0,43,0,65,0,69,0,73,0,77,0,100, + 0,124,0,146,0,168,0,190,0,212,0,0,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,1,34,39,38,39, + 38,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,1,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,1,17, + 33,17,39,17,33,17,37,17,51,17,1,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39,38,53, + 52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,32,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,23,20,7,6,7,1, + 34,39,38,39,38,39,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39,46,1,55,54,55,54,50,23,22,23,22,21,20,7, + 6,7,6,0,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,8,177,36,23,26,18,16,16,16,28,23,36,37,24,25, + 18,16,16,17,26,24,254,206,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,254,210,36,24,26,18,15,15,17,27,23,37,36,24, + 26,18,16,16,17,27,23,250,8,9,89,141,247,193,3,217,141,253,132,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,37,36, + 23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,205,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,2, + 48,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23, + 253,149,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,1,63,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26, + 17,16,1,9,15,17,27,23,74,23,26,18,16,16,17,27,23,72,25,26,18,15,1,8,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26, + 19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,1,242,16,17,27,23,37,36,24,26,17,16,16,17,26,23,74,23,25,19,16,253, + 239,16,17,26,23,38,36,23,26,18,16,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2, + 2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,253,238,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18, + 16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,0,0,0,0,13,0,200,0,70,10,33,5,59,0,21,0,43,0,65, + 0,87,0,91,0,95,0,99,0,122,0,146,0,168,0,190,0,212,0,234,0,0,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34, + 39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7, + 6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,17,33,17,39,17,33,17,37,17, + 51,17,1,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39,38,53,52,55,54,55,54,51,50,23, + 22,23,22,21,20,7,6,7,6,32,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,23,20,7,6,7,1,34,39,38,39,38,39,52,55, + 54,55,54,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39,46,1,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,0,34,39,38,39, + 38,53,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,6,39,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,2,18, + 16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,2,2, + 16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,248,143,9,89,141,247,193,3,217,141,253,132,36,23,26,18,16,16,16,28,23, + 36,37,24,25,18,16,16,17,26,24,37,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,205,74,23,26,18,16,16,17,27, + 23,37,36,23,26,17,16,1,17,16,27,2,48,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26,18,16,1,17, + 17,27,23,72,24,26,18,16,16,17,27,23,253,149,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,3,204,36,24,26,17,16, + 16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16, + 17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,252,159,4,245,251,11,141,3, + 219,252,37,140,2,195,253,61,1,242,16,17,27,23,37,36,24,26,17,16,16,17,26,23,74,23,25,19,16,253,239,16,17,26,23,38,36,23,26,18, + 16,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18, + 16,16,17,26,24,72,24,26,18,16,253,238,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24, + 25,18,16,16,17,26,24,72,24,26,18,0,0,14,0,200,0,70,10,33,5,59,0,21,0,43,0,65,0,87,0,110,0,114,0,118,0,122,0,145, + 0,169,0,191,0,213,0,235,1,1,0,0,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54, + 51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,36,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52, + 55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,5,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39, + 38,39,38,1,17,33,17,39,17,33,17,37,17,51,17,1,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,3,34, + 39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,32,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,22,23, + 20,7,6,7,1,34,39,38,39,38,39,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39,46,1,55,54,55,54,50,23,22, + 23,22,21,20,7,6,7,6,0,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,6,39,16,17,26,24,72,24,26,18, + 16,16,16,28,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,253,222,16,17,26,24,72,24,26, + 18,16,16,16,28,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,254,247,16,17,26,23,38,36, + 24,26,17,16,16,17,26,24,73,24,25,18,16,249,152,9,89,141,247,193,3,217,141,253,132,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16, + 16,17,26,24,37,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,205,74,23,26,18,16,16,17,27,23,37,36,23,26,17, + 16,1,17,16,27,2,48,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26,18,16,1,17,17,27,23,72,24,26, + 18,16,16,17,27,23,253,149,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,3,204,36,24,26,17,16,16,16,27,23,74,23, + 25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24, + 26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25, + 18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,1,242,16,17,27,23,37,36,24,26,17,16,16,17,26,23,74,23, + 25,19,16,253,239,16,17,26,23,38,36,23,26,18,16,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37, + 24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,253,238,16,17,26,24,72,24,26,18,16,16,17,27,23,36, + 37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,0,0,0,0,15,0,200,0,70,10,33,5,59,0,20, + 0,42,0,64,0,85,0,105,0,127,0,131,0,135,0,139,0,161,0,183,0,204,0,225,0,246,1,11,0,0,1,34,39,38,39,38,52,55,54,55, + 54,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,32,34,39,38,39,38,52, + 55,54,55,54,51,50,23,22,23,22,23,20,7,6,7,0,34,39,38,39,38,39,52,55,54,55,54,50,23,22,23,22,20,7,6,7,2,34,39,38, + 39,46,1,55,54,55,54,50,23,22,23,22,20,7,6,7,0,34,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,1,17, + 33,17,39,17,33,17,37,17,51,17,1,34,39,38,39,38,53,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39,38,53,52, + 55,54,55,54,50,23,22,23,22,20,7,6,7,6,32,34,39,38,39,38,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,1,34,39,38,39, + 46,1,55,54,55,54,50,23,22,23,22,20,7,6,7,6,3,34,39,38,39,46,1,55,54,55,54,50,23,22,23,22,20,7,6,7,6,0,34,39, + 38,39,38,52,55,54,55,54,51,50,23,22,23,30,1,7,6,7,7,164,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,37,36, + 23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,254,204,73,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,2,85, + 73,23,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,23,73,23,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,253,125,73, + 24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,250,28,9,89,141,247,193,3,217,141,253,132,36,23,26,18,16,16,16,28,23,73, + 24,25,18,16,16,17,26,24,37,36,23,26,18,16,16,16,28,23,73,24,25,18,16,16,17,26,24,254,204,73,23,26,18,16,16,17,27,23,37,36, + 23,26,17,16,1,17,16,27,2,48,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26,18,16,1,17,17,27,23, + 72,24,26,18,16,16,17,27,23,253,148,73,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,3,82,16,17,28,23,72,24,26,18, + 15,15,17,27,23,73,23,26,19,16,253,239,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16, + 16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,253,222,16,17,27,24,71,24,26,19,16, + 16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,252,227,4,245,251,11,141,3,219,252,37,140, + 2,195,253,61,1,242,16,17,27,23,37,36,24,26,17,16,16,17,26,23,73,24,25,19,16,253,239,16,17,26,23,38,36,23,26,18,16,16,17,27, + 23,73,24,25,18,16,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,2,2,16,17,27,23,73,24,25,18,16,16,17,26,24,72,24, + 26,18,16,253,238,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,16,2,18,16,17,27,23,73,24,25,18,16,16,17,26,24,72,24, + 26,18,0,0,0,2,0,200,254,20,5,189,7,109,0,3,0,7,0,0,1,21,33,53,1,33,17,33,1,225,2,195,252,36,4,245,251,11,3,7, + 141,141,4,102,246,167,0,0,0,3,0,200,254,20,5,189,7,109,0,3,0,7,0,11,0,0,19,33,17,33,55,33,17,33,19,33,21,33,200,4, + 245,251,11,141,3,219,252,37,140,2,195,253,61,7,109,246,167,141,8,63,252,39,141,0,0,4,0,200,254,20,5,189,7,109,0,22,0,26,0,30, + 0,34,0,0,1,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,3, + 69,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,1,5,16,17, + 26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,6,104,246,167,141,8,63,252,39,141,0,0,5,0,200,254,20,5,189,7,109,0,21, + 0,43,0,47,0,51,0,55,0,0,5,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,50,23, + 22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,33,17,33,55,33,17,33,19,33,21,33,1,193,16,16,27,24,72,24,25,19,16,16,17,27, + 23,37,36,24,26,17,16,2,17,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2, + 195,253,61,124,36,23,26,18,16,16,16,28,23,73,24,25,18,16,16,17,26,24,2,59,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16, + 17,27,23,5,248,246,167,141,8,63,252,39,141,0,0,0,0,6,0,200,254,20,5,189,7,109,0,22,0,43,0,65,0,69,0,73,0,77,0,0, + 5,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34, + 39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,33,17,33,55,33,17,33,19,33,21,33,1,193, + 16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,1,9,15,17,27,23,74,23,26,18,16,16,17,27,23,72,25,26,18,15,1, + 8,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,124,36,23,26,18, + 16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,1,50,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,1,46,36,24,26, + 18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,5,248,246,167,141,8,63,252,39,141,0,0,0,7,0,200,254,20,5,189,7,109,0,21, + 0,43,0,65,0,87,0,91,0,95,0,99,0,0,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22, + 23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55, + 1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,4,78,36,24,26,17, + 16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16, + 16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,252,159,4,245,251,11,141, + 3,219,252,37,140,2,195,253,61,2,14,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,253,238,16,17,27,23,36,37,24,25, + 18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,253,254,16,17,27,23,36,37,24,25, + 18,16,16,17,26,24,72,24,26,18,16,7,113,246,167,141,8,63,252,39,141,0,0,0,0,8,0,200,254,20,5,189,7,109,0,21,0,43,0,65, + 0,87,0,110,0,114,0,118,0,122,0,0,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22, + 21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50, + 23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,3,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55, + 54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,4,78,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25, + 19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17, + 16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11, + 141,3,219,252,37,140,2,195,253,61,2,14,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,253,238,16,17,27,23,36,37,24, + 25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,253,254,16,17,27,23,36,37,24, + 25,18,16,16,17,26,24,72,24,26,18,16,1,9,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,6,104,246,167,141,8,63, + 252,39,141,0,0,9,0,200,254,20,5,189,7,109,0,20,0,42,0,64,0,85,0,105,0,127,0,131,0,135,0,139,0,0,37,52,55,54,55,54, + 50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,16,52,55, + 54,55,54,50,23,22,23,22,21,20,7,6,7,6,7,34,39,38,39,0,52,55,54,55,54,55,50,23,22,23,22,20,7,6,7,6,34,39,38,39, + 36,52,55,54,55,62,1,23,22,23,22,20,7,6,7,6,34,39,38,39,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,14,1,39, + 38,39,1,33,17,33,55,33,17,33,19,33,21,33,3,212,16,17,28,23,72,24,26,18,15,15,17,27,23,74,22,26,19,16,253,239,16,17,27,23, + 37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37, + 36,24,26,17,16,16,16,27,24,72,24,25,19,253,222,16,17,27,24,71,24,26,19,16,16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36, + 24,26,17,16,16,16,27,24,72,24,25,19,252,227,4,245,251,11,141,3,219,252,37,140,2,195,253,61,145,36,23,26,19,16,16,17,28,23,72,24, + 26,18,16,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,1,51,74,24,25,18,16,16,17,26,23,38,36,23, + 26,17,16,1,17,17,26,253,171,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,23,74,22,26,18,16,1,17,17,27,23,72,24, + 26,18,15,15,17,27,2,130,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,5,228,246,167,141,8,63,252,39,141,0,0,0, + 0,4,0,200,254,20,5,189,7,109,0,21,0,25,0,29,0,33,0,0,1,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54, + 55,54,1,33,17,33,55,33,17,33,19,33,21,33,3,69,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251, + 11,141,3,219,252,37,140,2,195,253,61,5,107,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,2,2,246,167,141,8,63,252,39, + 141,0,0,0,0,5,0,200,254,20,5,189,7,109,0,21,0,44,0,48,0,52,0,56,0,0,1,50,23,22,23,22,20,7,6,7,6,35,34,39, + 38,39,38,52,55,54,55,54,19,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19, + 33,21,33,3,69,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,37,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16, + 16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,5,105,16,16,27,23,74,23,25,19,16,16,17,27,24,72,24,26,17,16, + 251,156,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,6,104,246,167,141,8,63,252,39,141,0,0,6,0,200,254,20,5,189, + 7,109,0,21,0,44,0,66,0,70,0,74,0,78,0,0,1,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,1,52, + 55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39, + 38,39,38,1,33,17,33,55,33,17,33,19,33,21,33,3,69,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,161,16,16, + 27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,2,17,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4, + 245,251,11,141,3,219,252,37,140,2,195,253,61,5,107,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,250,25,36,23,26,18,16, + 16,16,28,23,36,37,24,25,18,16,16,17,26,24,2,59,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,5,248,246,167,141, + 8,63,252,39,141,0,0,0,0,7,0,200,254,20,5,189,7,109,0,21,0,44,0,65,0,87,0,91,0,95,0,99,0,0,1,50,23,22,23,22, + 20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1, + 52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38, + 39,38,1,33,17,33,55,33,17,33,19,33,21,33,3,69,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,254,161,16,16,27, + 24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,1,9,15,17,27,23,74,23,26,18,16,16,17,27,23,72,25,26,18,15,1,8,16,17, + 28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,5,107,16,17,26,23,74,24, + 25,18,16,16,17,26,24,72,25,26,17,16,250,25,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,1,50,36,23,26,19,16, + 16,17,28,23,72,24,26,18,16,16,17,27,23,1,46,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,5,248,246,167,141,8, + 63,252,39,141,0,8,0,200,254,20,5,189,7,109,0,21,0,43,0,65,0,87,0,109,0,113,0,117,0,121,0,0,1,50,23,22,23,22,20,7, + 6,7,6,35,34,39,38,39,38,52,55,54,55,54,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22, + 23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55, + 1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,3,69,36,23,26,18, + 16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,1,46,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25, + 19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17, + 16,16,16,27,23,74,23,25,19,16,16,17,27,23,252,159,4,245,251,11,141,3,219,252,37,140,2,195,253,61,5,107,16,17,26,23,74,24,25,18, + 16,16,17,26,24,72,25,26,17,16,252,163,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,253,238,16,17,27,23,36,37,24, + 25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,253,254,16,17,27,23,36,37,24, + 25,18,16,16,17,26,24,72,24,26,18,16,7,113,246,167,141,8,63,252,39,141,0,0,0,9,0,200,254,20,5,189,7,109,0,21,0,43,0,65, + 0,87,0,109,0,132,0,136,0,140,0,144,0,0,1,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,1,50,23,22, + 23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55, + 18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52, + 55,54,55,54,3,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,3, + 69,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,1,46,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23, + 253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2, + 83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253, + 168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,5,107,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,252,163,16,17,26, + 24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,253,238,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17, + 26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,253,254,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,1,9,16, + 17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,6,104,246,167,141,8,63,252,39,141,0,10,0,200,254,20,5,189,7,109,0,21, + 0,42,0,64,0,86,0,107,0,127,0,149,0,153,0,157,0,161,0,0,1,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54, + 55,54,19,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6, + 34,39,38,39,38,16,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,7,34,39,38,39,0,52,55,54,55,54,55,50,23,22,23,22,20, + 7,6,7,6,34,39,38,39,36,52,55,54,55,62,1,23,22,23,22,20,7,6,7,6,34,39,38,39,0,52,55,54,55,54,51,50,23,22,23,22, + 21,20,7,6,7,14,1,39,38,39,1,33,17,33,55,33,17,33,19,33,21,33,3,69,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16, + 17,26,24,180,16,17,28,23,72,24,26,18,15,15,17,27,23,74,22,26,19,16,253,239,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24, + 26,18,16,16,17,27,24,71,24,26,19,16,16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25, + 19,253,222,16,17,27,24,71,24,26,19,16,16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19, + 252,227,4,245,251,11,141,3,219,252,37,140,2,195,253,61,5,107,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,251,38,36,23, + 26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,1,51,74,24,25, + 18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,253,171,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,23,74,22,26, + 18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,2,130,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,5,228,246,167, + 141,8,63,252,39,141,0,0,0,5,0,200,254,20,5,189,7,109,0,21,0,43,0,47,0,51,0,55,0,0,0,52,55,54,55,54,50,23,22,23, + 22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,33,17,33,55,33, + 17,33,19,33,21,33,1,194,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17, + 26,24,72,24,26,18,16,252,244,4,245,251,11,141,3,219,252,37,140,2,195,253,61,3,195,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16, + 16,17,26,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,1,147,246,167,141,8,63,252,39,141,0,0,0,0,6,0,200, + 254,20,5,189,7,109,0,22,0,26,0,30,0,34,0,56,0,78,0,0,1,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55, + 54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,2,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55, + 54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,3,69,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24, + 253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,31,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,17,27, + 23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,1,5,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,6,104,246, + 167,141,8,63,252,39,141,1,73,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,2,83,36,24,26,17,16,16,16,27,23,74,23, + 25,19,16,16,17,27,23,0,0,7,0,200,254,20,5,189,7,109,0,22,0,44,0,48,0,52,0,56,0,78,0,100,0,0,5,52,55,54,55,54, + 50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1, + 33,17,33,55,33,17,33,19,33,21,33,2,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51, + 50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,193,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,2,17,16,17, + 28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,31,16,17,26,24,72,24,26, + 18,16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,124,36,23,26,18,16,16,16, + 28,23,36,37,24,25,18,16,16,17,26,24,2,59,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,5,248,246,167,141,8,63, + 252,39,141,1,73,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16, + 17,27,23,0,0,8,0,200,254,20,5,189,7,109,0,22,0,43,0,65,0,69,0,73,0,77,0,99,0,121,0,0,5,52,55,54,55,54,50,23, + 22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,52,55,54, + 55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,33,17,33,55,33,17,33,19,33,21,33,2,52,55,54,55,54,50,23,22,23, + 22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,193,16,16,27,24, + 72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,1,9,15,17,27,23,74,23,26,18,16,16,17,27,23,72,25,26,18,15,1,8,16,17,28, + 23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,31,16,17,26,24,72,24,26,18, + 16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,124,36,23,26,18,16,16,16,28, + 23,36,37,24,25,18,16,16,17,26,24,1,50,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,1,46,36,24,26,18,15,15,17, + 27,23,37,36,24,26,18,16,16,17,27,23,5,248,246,167,141,8,63,252,39,141,1,73,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16, + 17,26,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,0,0,0,9,0,200,254,20,5,189,7,109,0,21,0,43,0,65, + 0,87,0,91,0,95,0,99,0,121,0,143,0,0,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22, + 23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55, + 1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,2,52,55,54,55,54, + 50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,4,78, + 36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74, + 23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,252,159,4, + 245,251,11,141,3,219,252,37,140,2,195,253,61,31,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37, + 24,25,18,16,16,17,26,24,72,24,26,18,16,2,14,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,253,238,16,17,27,23, + 36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,253,254,16,17,27,23, + 36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,7,113,246,167,141,8,63,252,39,141,1,73,74,23,25,19,16,16,17,27,23,37,36,24,26, + 17,16,16,17,26,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,0,0,0,0,10,0,200,254,20,5,189,7,109,0,21, + 0,43,0,65,0,87,0,110,0,114,0,118,0,122,0,144,0,166,0,0,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54, + 55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39, + 38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,3,50,23,22,23,22,21,20,7,6,7,6, + 35,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,2,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6, + 35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,4,78,36,24,26,17,16,16,16,27,23,74,23, + 25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24, + 26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25, + 18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,31,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25, + 18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,2,14,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24, + 25,18,16,253,238,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37, + 24,25,18,253,254,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,1,9,16,17,26,23,38,36,24,26,17,16,16,17,26,24, + 73,24,25,18,16,6,104,246,167,141,8,63,252,39,141,1,73,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,2,83,36,24,26, + 17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,0,0,11,0,200,254,20,5,189,7,109,0,20,0,42,0,64,0,85,0,105,0,127,0,131, + 0,135,0,139,0,161,0,183,0,0,37,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,54,51,50,23, + 22,23,22,20,7,6,7,6,34,39,38,39,38,16,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,7,34,39,38,39,0,52,55,54,55, + 54,55,50,23,22,23,22,20,7,6,7,6,34,39,38,39,36,52,55,54,55,62,1,23,22,23,22,20,7,6,7,6,34,39,38,39,0,52,55,54, + 55,54,51,50,23,22,23,22,21,20,7,6,7,14,1,39,38,39,1,33,17,33,55,33,17,33,19,33,21,33,2,52,55,54,55,54,50,23,22,23, + 22,21,20,7,6,7,6,35,34,39,38,39,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,3,212,16,17,28,23, + 72,24,26,18,15,15,17,27,23,74,22,26,19,16,253,239,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,24,71, + 24,26,19,16,16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,253,222,16,17,27,24,71, + 24,26,19,16,16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,252,227,4,245,251,11,141,3, + 219,252,37,140,2,195,253,61,31,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16, + 17,26,24,72,24,26,18,16,145,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26, + 18,16,16,17,27,23,1,51,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,253,171,74,22,26,18,16,1,17,17,27,23,72, + 24,26,18,15,15,17,27,23,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,2,130,74,24,25,18,16,16,17,26,23,38,36,23, + 26,17,16,1,17,17,26,5,228,246,167,141,8,63,252,39,141,1,73,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,2,83,36, + 24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,0,0,0,0,6,0,200,254,20,5,189,7,109,0,21,0,43,0,65,0,69,0,73, + 0,77,0,0,0,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,19,52,55,54,55,54,50,23,22,23,22,21,20,7, + 6,7,6,34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,33,17,33,55,33,17,33,19,33, + 21,33,1,194,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,249,16,17,26,23,74,24,26,17,16,16,17,26,24,73,24,25,18, + 16,1,9,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,252,244,4,245,251,11,141,3,219,252,37,140,2,195,253,61,3,195, + 74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,1,74,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,1, + 46,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,1,147,246,167,141,8,63,252,39,141,0,0,0,0,7,0,200,254,20,5,189, + 7,109,0,21,0,43,0,65,0,88,0,92,0,96,0,100,0,0,0,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39, + 19,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34, + 39,38,39,38,3,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,1, + 194,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,249,16,17,26,23,74,24,26,17,16,16,17,26,24,73,24,25,18,16,1,9, + 16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,143,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253, + 168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,3,195,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,1,74,36,23,26, + 18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,1,46,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,251,43,16,17, + 26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,6,104,246,167,141,8,63,252,39,141,0,0,8,0,200,254,20,5,189,7,109,0,21, + 0,43,0,65,0,88,0,110,0,114,0,118,0,122,0,0,0,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,19,52, + 55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38, + 39,38,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6, + 7,6,34,39,38,39,38,1,33,17,33,55,33,17,33,19,33,21,33,1,194,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,249, + 16,17,26,23,74,24,26,17,16,16,17,26,24,73,24,25,18,16,1,9,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,253, + 237,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,2,17,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16, + 252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,3,195,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,1,74,36,23, + 26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,1,46,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,249,170,36, + 23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,2,59,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,5, + 248,246,167,141,8,63,252,39,141,0,0,0,0,9,0,200,254,20,5,189,7,109,0,21,0,43,0,65,0,88,0,109,0,131,0,135,0,139,0,143, + 0,0,0,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,19,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7, + 6,34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,21, + 20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,52,55,54,55,54,50,23, + 22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,33,17,33,55,33,17,33,19,33,21,33,1,194,16,17,26,24,72,24,26,18,16,16,17,27, + 23,36,37,24,25,18,249,16,17,26,23,74,24,26,17,16,16,17,26,24,73,24,25,18,16,1,9,16,17,27,23,36,37,24,25,18,16,16,17,26, + 24,72,24,26,18,16,253,237,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,1,9,15,17,27,23,74,23,26,18,16,16,17, + 27,23,72,25,26,18,15,1,8,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2, + 195,253,61,3,195,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,1,74,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16, + 16,17,26,24,1,46,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,249,170,36,23,26,18,16,16,16,28,23,36,37,24,25,18, + 16,16,17,26,24,1,50,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,1,46,36,24,26,18,15,15,17,27,23,37,36,24,26, + 18,16,16,17,27,23,5,248,246,167,141,8,63,252,39,141,0,10,0,200,254,20,5,189,7,109,0,21,0,43,0,65,0,87,0,109,0,131,0,153, + 0,157,0,161,0,165,0,0,0,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,19,52,55,54,55,54,50,23,22,23, + 22,21,20,7,6,7,6,34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,19,50,23,22,23,22, + 20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50, + 23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54, + 55,54,1,33,17,33,55,33,17,33,19,33,21,33,1,194,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,249,16,17,26,23,74, + 24,26,17,16,16,17,26,24,73,24,25,18,16,1,9,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,122,36,24,26,17,16, + 16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16, + 17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,252,159,4,245,251,11,141,3, + 219,252,37,140,2,195,253,61,3,195,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,1,74,36,23,26,18,16,16,16,28,23,36, + 37,24,25,18,16,16,17,26,24,1,46,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,252,52,16,17,26,24,72,24,26,18,16, + 16,16,28,23,36,37,24,25,18,16,253,238,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18, + 16,16,16,28,23,36,37,24,25,18,253,254,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,7,113,246,167,141,8,63,252,39, + 141,0,0,0,0,11,0,200,254,20,5,189,7,109,0,21,0,43,0,65,0,87,0,109,0,131,0,153,0,176,0,180,0,184,0,188,0,0,0,52, + 55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,19,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38, + 39,38,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,19,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38, + 53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35, + 34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,3,50,23,22,23,22,21,20, + 7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,1,194,16,17,26,24,72,24,26,18,16,16,17, + 27,23,36,37,24,25,18,249,16,17,26,23,74,24,26,17,16,16,17,26,24,73,24,25,18,16,1,9,16,17,27,23,36,37,24,25,18,16,16,17, + 26,24,72,24,26,18,16,122,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24, + 26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19, + 16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253, + 61,3,195,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,1,74,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17, + 26,24,1,46,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,252,52,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24, + 25,18,16,253,238,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37, + 24,25,18,253,254,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,1,9,16,17,26,23,38,36,24,26,17,16,16,17,26,24, + 73,24,25,18,16,6,104,246,167,141,8,63,252,39,141,0,0,12,0,200,254,20,5,189,7,109,0,21,0,43,0,65,0,86,0,108,0,130,0,151, + 0,171,0,193,0,197,0,201,0,205,0,0,0,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,19,52,55,54,55,54, + 50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,17,52, + 55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39, + 38,16,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,7,34,39,38,39,0,52,55,54,55,54,55,50,23,22,23,22,20,7,6,7,6, + 34,39,38,39,36,52,55,54,55,62,1,23,22,23,22,20,7,6,7,6,34,39,38,39,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6, + 7,14,1,39,38,39,1,33,17,33,55,33,17,33,19,33,21,33,1,194,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,249,16, + 17,26,23,74,24,26,17,16,16,17,26,24,73,24,25,18,16,1,9,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,16,17, + 28,23,72,24,26,18,15,15,17,27,23,74,22,26,19,16,253,239,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27, + 24,71,24,26,19,16,16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,253,222,16,17,27, + 24,71,24,26,19,16,16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,252,227,4,245,251,11, + 141,3,219,252,37,140,2,195,253,61,3,195,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,17,26,1,74,36,23,26,18,16,16,16,28, + 23,36,37,24,25,18,16,16,17,26,24,1,46,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,250,183,36,23,26,19,16,16,17, + 28,23,72,24,26,18,16,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,1,51,74,24,25,18,16,16,17,26, + 23,38,36,23,26,17,16,1,17,17,26,253,171,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,23,74,22,26,18,16,1,17,17, + 27,23,72,24,26,18,15,15,17,27,2,130,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,5,228,246,167,141,8,63,252,39, + 141,0,0,0,0,7,0,200,254,20,5,189,7,109,0,20,0,41,0,62,0,83,0,87,0,91,0,95,0,0,1,50,23,22,23,22,20,7,6,7, + 6,34,39,38,39,38,52,55,54,55,54,0,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7, + 6,7,6,35,34,39,38,39,38,52,55,54,55,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33, + 17,33,19,33,21,33,4,78,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,253,233,73,24,25,19,16,16,17,27,23,37,36,24, + 26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,73,24,25,19, + 16,16,17,27,23,252,159,4,245,251,11,141,3,219,252,37,140,2,195,253,61,6,116,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18, + 16,253,238,16,16,28,23,73,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,253, + 254,16,16,28,23,73,24,25,18,16,16,17,26,24,72,24,26,18,16,3,11,246,167,141,8,63,252,39,141,0,0,0,0,8,0,200,254,20,5,189, + 7,109,0,21,0,25,0,29,0,33,0,54,0,75,0,96,0,117,0,0,1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54, + 55,54,1,33,17,33,55,33,17,33,19,33,21,33,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,0,50,23,22,23, + 22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,1,50,23, + 22,23,22,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,3,69,36,23,26,18,16,16,16,28,23,73,24,25,18,16,16,17,26,24,253,168, + 4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,253,233,73,24,25,19, + 16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16, + 16,16,27,23,73,24,25,19,16,16,17,27,23,1,5,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,6,104,246,167,141,8, + 63,252,39,141,3,250,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,16,253,238,16,16,28,23,73,24,25,18,16,16,17,26,24,72, + 24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,253,254,16,16,28,23,73,24,25,18,16,16,17,26,24,72,24,26, + 18,16,0,0,0,9,0,200,254,20,5,189,7,109,0,22,0,44,0,48,0,52,0,56,0,78,0,100,0,122,0,144,0,0,5,52,55,54,55,54, + 50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1, + 33,17,33,55,33,17,33,19,33,21,33,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21, + 20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23, + 22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,1,193,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16, + 2,17,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24, + 26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25, + 19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,124,36,23,26,18, + 16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,2,59,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,5,248,246,167, + 141,8,63,252,39,141,3,250,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,253,238,16,16,28,23,36,37,24,25,18,16,16, + 17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,253,254,16,16,28,23,36,37,24,25,18,16,16, + 17,26,24,72,24,26,18,16,0,10,0,200,254,20,5,189,7,109,0,22,0,43,0,65,0,69,0,73,0,77,0,99,0,121,0,143,0,165,0,0, + 5,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34, + 39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,33,17,33,55,33,17,33,19,33,21,33,1,50, + 23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55, + 54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39, + 38,52,55,54,55,54,1,193,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,1,9,15,17,27,23,74,23,26,18,16,16,17, + 27,23,72,25,26,18,15,1,8,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2, + 195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16, + 16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17, + 27,23,124,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,1,50,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17, + 27,23,1,46,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,5,248,246,167,141,8,63,252,39,141,3,250,16,17,26,24,72, + 24,26,18,16,16,17,27,23,36,37,24,25,18,16,253,238,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24, + 72,24,26,18,16,16,17,27,23,36,37,24,25,18,253,254,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,0,0,11,0,200, + 254,20,5,189,7,109,0,21,0,43,0,65,0,87,0,91,0,95,0,99,0,121,0,143,0,165,0,187,0,0,1,50,23,22,23,22,20,7,6,7, + 6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22, + 20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,1,33, + 17,33,55,33,17,33,19,33,21,33,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20, + 7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22, + 23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,4,78,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233, + 74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36, + 24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,252,159,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16, + 16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16, + 17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,2,14,16,17,26,24,72,24, + 26,18,16,16,16,28,23,36,37,24,25,18,16,253,238,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72, + 24,26,18,16,16,16,28,23,36,37,24,25,18,253,254,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,7,113,246,167,141,8, + 63,252,39,141,3,250,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,253,238,16,16,28,23,36,37,24,25,18,16,16,17,26, + 24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,253,254,16,16,28,23,36,37,24,25,18,16,16,17,26, + 24,72,24,26,18,16,0,0,0,12,0,200,254,20,5,189,7,109,0,20,0,41,0,62,0,83,0,105,0,109,0,113,0,117,0,138,0,159,0,180, + 0,201,0,0,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,0,50,23,22,23,22,20,7,6,7,6,35,34,39,38, + 39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,1,50,23,22,23,22,20,7,6,7,6,34,39, + 38,39,38,52,55,54,55,54,3,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33, + 21,33,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,0,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38, + 52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39, + 38,52,55,54,55,54,4,78,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,253,233,73,24,25,19,16,16,17,27,23,37,36,24, + 26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,73,24,25,19, + 16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,73,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61, + 2,109,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,253,233,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27, + 23,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,2, + 14,16,17,26,24,72,24,26,18,16,16,16,28,23,73,24,25,18,16,253,238,16,17,27,23,73,24,25,18,16,16,17,26,24,72,24,26,18,2,34, + 16,17,26,24,72,24,26,18,16,16,16,28,23,73,24,25,18,253,254,16,17,27,23,73,24,25,18,16,16,17,26,24,72,24,26,18,16,1,9,16, + 17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,6,104,246,167,141,8,63,252,39,141,3,250,16,17,26,24,72,24,26,18,16,16, + 17,27,23,73,24,25,18,16,253,238,16,16,28,23,73,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,17, + 27,23,73,24,25,18,253,254,16,16,28,23,73,24,25,18,16,16,17,26,24,72,24,26,18,16,0,0,0,13,0,200,254,20,5,189,7,109,0,20, + 0,42,0,64,0,85,0,105,0,127,0,131,0,135,0,139,0,161,0,183,0,205,0,227,0,0,37,52,55,54,55,54,50,23,22,23,22,20,7,6, + 7,6,34,39,38,39,38,37,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,16,52,55,54,55,54,50,23,22,23,22, + 21,20,7,6,7,6,7,34,39,38,39,0,52,55,54,55,54,55,50,23,22,23,22,20,7,6,7,6,34,39,38,39,36,52,55,54,55,62,1,23, + 22,23,22,20,7,6,7,6,34,39,38,39,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,14,1,39,38,39,1,33,17,33,55,33, + 17,33,19,33,21,33,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6, + 35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20, + 7,6,7,6,34,39,38,39,38,52,55,54,55,54,3,212,16,17,28,23,72,24,26,18,15,15,17,27,23,74,22,26,19,16,253,239,16,17,27,23, + 37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37, + 36,24,26,17,16,16,16,27,24,72,24,25,19,253,222,16,17,27,24,71,24,26,19,16,16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36, + 24,26,17,16,16,16,27,24,72,24,25,19,252,227,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74, + 23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36, + 24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,145,36,23,26,19,16,16,17,28,23,72,24,26, + 18,16,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,1,51,74,24,25,18,16,16,17,26,23,38,36,23,26, + 17,16,1,17,17,26,253,171,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,23,74,22,26,18,16,1,17,17,27,23,72,24,26, + 18,15,15,17,27,2,130,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,5,228,246,167,141,8,63,252,39,141,3,250,16,17, + 26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,253,238,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16, + 17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,253,254,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,0,0, + 0,8,0,200,254,20,5,189,7,109,0,3,0,7,0,11,0,33,0,55,0,77,0,99,0,121,0,0,19,33,17,33,55,33,17,33,19,33,21,33, + 1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38, + 52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6,7,6,34,39, + 38,39,38,52,55,54,55,54,3,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,200,4,245,251,11,141,3,219,252,37, + 140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26, + 17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16, + 16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,7,109,246,167,141,8,63,252,39,141,3,250,16,17,26,24, + 72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,253,238,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26, + 24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,253,254,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,1,9,16,17, + 26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,0,9,0,200,254,20,5,189,7,109,0,22,0,26,0,30,0,34,0,56,0,78,0,100, + 0,122,0,144,0,0,1,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33,21, + 33,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39, + 38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6,7,6,34, + 39,38,39,38,52,55,54,55,54,3,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,3,69,36,23,26,18,16,16,16, + 28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74, + 23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36, + 24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24, + 25,18,16,16,17,26,24,1,5,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,6,104,246,167,141,8,63,252,39,141,3,250, + 16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,253,238,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2, + 34,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,253,254,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16, + 1,9,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,0,10,0,200,254,20,5,189,7,109,0,21,0,43,0,47,0,51,0,55, + 0,76,0,97,0,118,0,139,0,160,0,0,5,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54, + 50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,33,17,33,55,33,17,33,19,33,21,33,1,50,23,22,23,22,20,7,6,7,6,34, + 39,38,39,38,52,55,54,55,54,0,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7, + 6,35,34,39,38,39,38,52,55,54,55,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,3,50,23,22,23,22,20,7, + 6,7,6,34,39,38,39,38,52,55,54,55,54,1,193,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,2,17,16,17,28,23, + 72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27, + 23,73,24,25,19,16,16,17,27,23,253,233,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23, + 37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,73, + 24,25,18,16,16,17,26,24,124,36,23,26,18,16,16,16,28,23,73,24,25,18,16,16,17,26,24,2,59,36,24,26,18,15,15,17,27,23,37,36, + 24,26,18,16,16,17,27,23,5,248,246,167,141,8,63,252,39,141,3,250,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,16,253,238, + 16,16,28,23,73,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,253,254,16,16, + 28,23,73,24,25,18,16,16,17,26,24,72,24,26,18,16,1,9,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,0,11,0,200, + 254,20,5,189,7,109,0,22,0,43,0,65,0,69,0,73,0,77,0,99,0,121,0,143,0,165,0,187,0,0,5,52,55,54,55,54,50,23,22,23, + 22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,52,55,54,55,54, + 50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,33,17,33,55,33,17,33,19,33,21,33,1,50,23,22,23,22,20,7,6,7,6,34, + 39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7, + 6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,3,50,23,22, + 23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,1,193,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,1, + 9,15,17,27,23,74,23,26,18,16,16,17,27,23,72,25,26,18,15,1,8,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252, + 246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25, + 19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17, + 16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,124,36,23,26,18,16, + 16,16,28,23,36,37,24,25,18,16,16,17,26,24,1,50,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,1,46,36,24,26,18, + 15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,5,248,246,167,141,8,63,252,39,141,3,250,16,17,26,24,72,24,26,18,16,16,17,27,23, + 36,37,24,25,18,16,253,238,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,17,27, + 23,36,37,24,25,18,253,254,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,1,9,16,17,26,23,74,24,25,18,16,16,17, + 26,24,72,25,26,17,16,0,0,12,0,200,254,20,5,189,7,109,0,21,0,43,0,65,0,87,0,91,0,95,0,99,0,121,0,143,0,165,0,187, + 0,209,0,0,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34, + 39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6, + 7,6,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38, + 53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35, + 34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,3,50,23,22,23,22,20,7, + 6,7,6,35,34,39,38,39,38,52,55,54,55,54,4,78,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19, + 16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16, + 16,16,27,23,74,23,25,19,16,16,17,27,23,252,159,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23, + 74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37, + 36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37, + 24,25,18,16,16,17,26,24,2,14,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,253,238,16,17,27,23,36,37,24,25,18, + 16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,253,254,16,17,27,23,36,37,24,25,18, + 16,16,17,26,24,72,24,26,18,16,7,113,246,167,141,8,63,252,39,141,3,250,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18, + 16,253,238,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25, + 18,253,254,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,1,9,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26, + 17,16,0,0,0,13,0,200,254,20,5,189,7,109,0,21,0,43,0,65,0,87,0,110,0,114,0,118,0,122,0,144,0,166,0,188,0,210,0,232, + 0,0,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38, + 39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6,7,6, + 34,39,38,39,38,52,55,54,55,54,3,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17, + 33,19,33,21,33,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35, + 34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7, + 6,7,6,34,39,38,39,38,52,55,54,55,54,3,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,4,78,36,24,26, + 17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19, + 16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16, + 16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27, + 23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23, + 37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36, + 37,24,25,18,16,16,17,26,24,2,14,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,16,253,238,16,17,27,23,36,37,24,25, + 18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,16,28,23,36,37,24,25,18,253,254,16,17,27,23,36,37,24,25, + 18,16,16,17,26,24,72,24,26,18,16,1,9,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,6,104,246,167,141,8,63,252, + 39,141,3,250,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,253,238,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72, + 24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,253,254,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72, + 24,26,18,16,1,9,16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,0,14,0,200,254,20,5,189,7,109,0,20,0,42,0,64, + 0,85,0,105,0,127,0,131,0,135,0,139,0,161,0,183,0,205,0,227,0,249,0,0,37,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6, + 34,39,38,39,38,37,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,16,52,55,54,55,54,50,23,22,23,22,21,20, + 7,6,7,6,7,34,39,38,39,0,52,55,54,55,54,55,50,23,22,23,22,20,7,6,7,6,34,39,38,39,36,52,55,54,55,62,1,23,22,23, + 22,20,7,6,7,6,34,39,38,39,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,14,1,39,38,39,1,33,17,33,55,33,17,33, + 19,33,21,33,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54,0,50,23,22,23,22,21,20,7,6,7,6,35,34, + 39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53,52,55,54,55,1,50,23,22,23,22,21,20,7,6, + 7,6,34,39,38,39,38,52,55,54,55,54,3,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,54,3,212,16,17,28,23, + 72,24,26,18,15,15,17,27,23,74,22,26,19,16,253,239,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,24,71, + 24,26,19,16,16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,253,222,16,17,27,24,71, + 24,26,19,16,16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,252,227,4,245,251,11,141,3, + 219,252,37,140,2,195,253,61,2,109,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16,16,17,27,23,37, + 36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16,16,27,23,74,23, + 25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,145,36,23,26,19,16,16,17,28,23,72,24,26, + 18,16,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,1,51,74,24,25,18,16,16,17,26,23,38,36,23,26, + 17,16,1,17,17,26,253,171,74,22,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,23,74,22,26,18,16,1,17,17,27,23,72,24,26, + 18,15,15,17,27,2,130,74,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,5,228,246,167,141,8,63,252,39,141,3,250,16,17, + 26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,253,238,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16, + 17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,253,254,16,16,28,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,1,9, + 16,17,26,23,74,24,25,18,16,16,17,26,24,72,25,26,17,16,0,0,0,9,0,200,254,20,5,189,7,109,0,3,0,7,0,11,0,34,0,58, + 0,80,0,102,0,124,0,146,0,0,19,33,17,33,55,33,17,33,19,33,21,33,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6, + 34,39,38,39,38,37,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,16,52,55,54,55,54,50,23,22,23,22, + 21,20,7,6,7,6,7,34,39,38,39,1,52,55,54,55,54,55,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,62,1, + 23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,14,1,39,38,39,200,4,245, + 251,11,141,3,219,252,37,140,2,195,253,61,1,242,16,17,27,23,37,36,24,26,17,16,16,17,26,23,74,23,25,19,16,253,239,16,17,26,23,38, + 36,23,26,18,16,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36, + 37,24,25,18,16,16,17,26,24,72,24,26,18,16,253,238,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,17,27, + 23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,7,109,246,167,141,8,63,252,39,141,2,124,36,23,26,18,16,16,16,28,23,36,37,24,25, + 18,16,16,17,26,24,37,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,1,51,74,23,26,18,16,16,17,27,23,37,36,23, + 26,17,16,1,17,16,27,253,208,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26,18,16,1,17,17,27,23,72, + 24,26,18,16,16,17,27,23,2,107,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,0,0,0,0,10,0,200,254,20,5,189, + 7,109,0,22,0,26,0,30,0,34,0,57,0,81,0,103,0,125,0,147,0,169,0,0,1,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38, + 39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38, + 39,38,37,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,16,52,55,54,55,54,50,23,22,23,22,21,20,7, + 6,7,6,7,34,39,38,39,1,52,55,54,55,54,55,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,62,1,23,22,23, + 22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,14,1,39,38,39,3,69,36,23,26,18, + 16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3,219,252,37,140,2,195,253,61,1,242,16,17,27,23,37,36,24, + 26,17,16,16,17,26,23,74,23,25,19,16,253,239,16,17,26,23,38,36,23,26,18,16,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24, + 26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,253,238,16,17,26,24,72, + 24,26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,1,5,16,17,26,23, + 38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,6,104,246,167,141,8,63,252,39,141,2,124,36,23,26,18,16,16,16,28,23,36,37,24,25, + 18,16,16,17,26,24,37,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,1,51,74,23,26,18,16,16,17,27,23,37,36,23, + 26,17,16,1,17,16,27,253,208,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26,18,16,1,17,17,27,23,72, + 24,26,18,16,16,17,27,23,2,107,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,0,0,0,0,11,0,200,254,20,5,189, + 7,109,0,22,0,44,0,48,0,52,0,56,0,79,0,103,0,125,0,147,0,169,0,191,0,0,5,52,55,54,55,54,50,23,22,23,22,21,20,7, + 6,7,6,35,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,33,17,33,55,33,17,33,19, + 33,21,33,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,54,51,50,23,22,23,22,21,20, + 7,6,7,6,35,34,39,38,39,38,16,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,7,34,39,38,39,1,52,55,54,55,54,55,50, + 23,22,23,22,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,62,1,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54, + 55,54,51,50,23,22,23,22,21,20,7,6,7,14,1,39,38,39,1,193,16,16,27,24,72,24,25,19,16,16,17,27,23,37,36,24,26,17,16,2, + 17,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,1,242,16,17,27, + 23,37,36,24,26,17,16,16,17,26,23,74,23,25,19,16,253,239,16,17,26,23,38,36,23,26,18,16,16,17,27,23,36,37,24,25,18,16,16,17, + 26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,253,238,16, + 17,26,24,72,24,26,18,16,16,17,27,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,124,36, + 23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,2,59,36,24,26,18,15,15,17,27,23,37,36,24,26,18,16,16,17,27,23,5, + 248,246,167,141,8,63,252,39,141,2,124,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,37,36,23,26,18,16,16,16,28,23, + 36,37,24,25,18,16,16,17,26,24,1,51,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,253,208,36,23,26,18,16,1,17, + 17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,2,107,74,23,26,18,16,16, + 17,27,23,37,36,23,26,17,16,1,17,16,27,0,0,0,0,12,0,200,254,20,5,189,7,109,0,22,0,43,0,65,0,69,0,73,0,77,0,100, + 0,124,0,146,0,168,0,190,0,212,0,0,5,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,1,52,55,54,55, + 54,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,1,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,1,33, + 17,33,55,33,17,33,19,33,21,33,1,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,54,51, + 50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,16,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,7,34,39,38,39,1, + 52,55,54,55,54,55,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,62,1,23,22,23,22,20,7,6,7,6,35,34,39, + 38,39,38,0,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,14,1,39,38,39,1,193,16,16,27,24,72,24,25,19,16,16,17,27,23, + 37,36,24,26,17,16,1,9,15,17,27,23,74,23,26,18,16,16,17,27,23,72,25,26,18,15,1,8,16,17,28,23,72,24,26,18,16,16,17,27, + 24,71,24,26,19,16,252,246,4,245,251,11,141,3,219,252,37,140,2,195,253,61,1,242,16,17,27,23,37,36,24,26,17,16,16,17,26,23,74,23, + 25,19,16,253,239,16,17,26,23,38,36,23,26,18,16,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,16,17,27,23,36,37, + 24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,253,238,16,17,26,24,72,24,26,18,16,16,17,27,23,36, + 37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,124,36,23,26,18,16,16,16,28,23,36,37,24,25,18, + 16,16,17,26,24,1,50,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,1,46,36,24,26,18,15,15,17,27,23,37,36,24,26, + 18,16,16,17,27,23,5,248,246,167,141,8,63,252,39,141,2,124,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,37,36,23, + 26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,1,51,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,253,208, + 36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,2, + 107,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,0,13,0,200,254,20,5,189,7,109,0,21,0,43,0,65,0,87,0,91, + 0,95,0,99,0,122,0,146,0,168,0,190,0,212,0,234,0,0,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,53,52,55,54,55,54, + 0,50,23,22,23,22,21,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,53, + 52,55,54,55,1,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33,17,33,19,33,21,33,1,52, + 55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,35, + 34,39,38,39,38,16,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,7,34,39,38,39,1,52,55,54,55,54,55,50,23,22,23,22,20, + 7,6,7,6,34,39,38,39,38,37,52,55,54,55,62,1,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,0,52,55,54,55,54,51,50,23, + 22,23,22,21,20,7,6,7,14,1,39,38,39,4,78,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,253,233,74,23,25,19,16, + 16,17,27,23,37,36,24,26,17,16,16,16,27,23,74,23,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16,16, + 16,27,23,74,23,25,19,16,16,17,27,23,252,159,4,245,251,11,141,3,219,252,37,140,2,195,253,61,1,242,16,17,27,23,37,36,24,26,17,16, + 16,17,26,23,74,23,25,19,16,253,239,16,17,26,23,38,36,23,26,18,16,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16, + 16,17,27,23,36,37,24,25,18,2,2,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,253,238,16,17,26,24,72,24,26,18, + 16,16,17,27,23,36,37,24,25,18,16,2,18,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,14,16,17,26,24,72,24,26, + 18,16,16,16,28,23,36,37,24,25,18,16,253,238,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,2,34,16,17,26,24,72,24, + 26,18,16,16,16,28,23,36,37,24,25,18,253,254,16,17,27,23,36,37,24,25,18,16,16,17,26,24,72,24,26,18,16,7,113,246,167,141,8,63, + 252,39,141,2,124,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16,16,17,26,24,37,36,23,26,18,16,16,16,28,23,36,37,24,25,18,16, + 16,17,26,24,1,51,74,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,253,208,36,23,26,18,16,1,17,17,27,23,72,24,26, + 18,16,16,17,27,23,37,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,2,107,74,23,26,18,16,16,17,27,23,37,36,23, + 26,17,16,1,17,16,27,0,0,14,0,200,254,20,5,189,7,109,0,20,0,41,0,62,0,83,0,105,0,109,0,113,0,117,0,139,0,161,0,182, + 0,203,0,224,0,245,0,0,1,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,0,50,23,22,23,22,20,7,6,7,6, + 35,34,39,38,39,38,52,55,54,55,18,50,23,22,23,22,20,7,6,7,6,35,34,39,38,39,38,52,55,54,55,1,50,23,22,23,22,20,7,6, + 7,6,34,39,38,39,38,52,55,54,55,54,3,50,23,22,23,22,21,20,7,6,7,6,34,39,38,39,38,52,55,54,55,54,1,33,17,33,55,33, + 17,33,19,33,21,33,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,54,51,50,23,22,23,22, + 20,7,6,7,6,34,39,38,39,38,16,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,14,1,39,38,39,1,52,55,54,55,62,1,23,22, + 23,22,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,62,1,23,22,23,22,20,7,6,7,6,34,39,38,39,38,0,52,55,54,55,54,50, + 23,22,23,22,21,20,7,6,7,14,1,39,38,39,4,78,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,253,233,73,24,25,19, + 16,16,17,27,23,37,36,24,26,17,16,16,16,27,23,73,24,25,19,16,16,17,27,23,37,36,24,26,17,16,16,16,27,2,83,36,24,26,17,16, + 16,16,27,23,73,24,25,19,16,16,17,27,23,228,36,23,26,18,16,16,16,28,23,73,24,25,18,16,16,17,26,24,253,168,4,245,251,11,141,3, + 219,252,37,140,2,195,253,61,1,242,16,17,27,23,37,36,24,26,17,16,16,17,26,23,73,24,25,19,16,253,239,16,17,26,23,38,36,23,26,18, + 16,16,17,27,23,73,24,25,18,16,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,2,2,16,17,27,23,73,24,25,18,16,16,17, + 26,24,72,24,26,18,16,253,238,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,16,2,18,16,17,27,23,73,24,25,18,16,16,17, + 26,24,72,24,26,18,2,14,16,17,26,24,72,24,26,18,16,16,16,28,23,73,24,25,18,16,253,238,16,17,27,23,73,24,25,18,16,16,17,26, + 24,72,24,26,18,2,34,16,17,26,24,72,24,26,18,16,16,16,28,23,73,24,25,18,253,254,16,17,27,23,73,24,25,18,16,16,17,26,24,72, + 24,26,18,16,1,9,16,17,26,23,38,36,24,26,17,16,16,17,26,24,73,24,25,18,16,6,104,246,167,141,8,63,252,39,141,2,124,36,23,26, + 18,16,16,16,28,23,73,24,25,18,16,16,17,26,24,37,36,23,26,18,16,16,16,28,23,73,24,25,18,16,16,17,26,24,1,52,73,23,26,18, + 16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,253,208,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26, + 18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,2,108,73,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,0,0,0, + 0,15,0,200,254,20,5,189,7,109,0,20,0,42,0,64,0,85,0,105,0,127,0,131,0,135,0,139,0,161,0,183,0,204,0,225,0,246,1,11, + 0,0,37,52,55,54,55,54,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6, + 34,39,38,39,38,16,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,6,7,34,39,38,39,0,52,55,54,55,54,55,50,23,22,23,22,20, + 7,6,7,6,34,39,38,39,36,52,55,54,55,62,1,23,22,23,22,20,7,6,7,6,34,39,38,39,0,52,55,54,55,54,51,50,23,22,23,22, + 21,20,7,6,7,14,1,39,38,39,1,33,17,33,55,33,17,33,19,33,21,33,1,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34, + 39,38,39,38,37,52,55,54,55,54,51,50,23,22,23,22,20,7,6,7,6,34,39,38,39,38,16,52,55,54,55,54,50,23,22,23,22,21,20,7, + 6,7,14,1,39,38,39,1,52,55,54,55,62,1,23,22,23,22,20,7,6,7,6,34,39,38,39,38,37,52,55,54,55,62,1,23,22,23,22,20, + 7,6,7,6,34,39,38,39,38,0,52,55,54,55,54,50,23,22,23,22,21,20,7,6,7,14,1,39,38,39,3,212,16,17,28,23,72,24,26,18, + 15,15,17,27,23,73,23,26,19,16,253,239,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,24,71,24,26,19,16, + 16,17,28,23,36,36,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,253,222,16,17,27,24,71,24,26,19,16, + 16,17,28,23,72,24,26,18,2,2,16,17,27,23,37,36,24,26,17,16,16,16,27,24,72,24,25,19,252,227,4,245,251,11,141,3,219,252,37,140, + 2,195,253,61,1,242,16,17,27,23,37,36,24,26,17,16,16,17,26,23,73,24,25,19,16,253,239,16,17,26,23,38,36,23,26,18,16,16,17,27, + 23,73,24,25,18,16,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,2,2,16,17,27,23,73,24,25,18,16,16,17,26,24,72,24, + 26,18,16,253,238,16,17,26,24,72,24,26,18,16,16,17,27,23,73,24,25,18,16,2,18,16,17,27,23,73,24,25,18,16,16,17,26,24,72,24, + 26,18,145,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23,37,36,23,26,19,16,16,17,28,23,72,24,26,18,16,16,17,27,23, + 1,52,73,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17,26,253,171,73,23,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17, + 27,23,73,23,26,18,16,1,17,17,27,23,72,24,26,18,15,15,17,27,2,131,73,24,25,18,16,16,17,26,23,38,36,23,26,17,16,1,17,17, + 26,5,228,246,167,141,8,63,252,39,141,2,124,36,23,26,18,16,16,16,28,23,73,24,25,18,16,16,17,26,24,37,36,23,26,18,16,16,16,28, + 23,73,24,25,18,16,16,17,26,24,1,52,73,23,26,18,16,16,17,27,23,37,36,23,26,17,16,1,17,16,27,253,208,36,23,26,18,16,1,17, + 17,27,23,72,24,26,18,16,16,17,27,23,37,36,23,26,18,16,1,17,17,27,23,72,24,26,18,16,16,17,27,23,2,108,73,23,26,18,16,16, + 17,27,23,37,36,23,26,17,16,1,17,16,27,0,0,0,0,3,0,200,254,20,7,103,7,109,0,11,0,23,0,27,0,0,1,34,21,17,20,51, + 33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,17,33,17,1,184,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,1, + 44,4,71,6,245,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,247,211,7,1,248,255,0,5,0,200,254,20,7,103,7,109,0,24, + 0,36,0,48,0,51,0,59,0,0,1,22,0,23,22,21,20,35,34,39,35,20,23,35,54,53,35,6,35,34,53,52,55,54,0,1,34,21,17,20, + 51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,3,33,3,51,1,35,39,33,7,35,4,215,65,1,59,9,27,195,108,66, + 30,59,152,59,30,66,108,195,27,9,1,59,253,34,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,75,134,1,12,210,154,1,32,132,68, + 254,182,68,132,3,24,121,254,126,38,37,78,228,155,204,107,107,204,155,228,78,37,38,1,130,4,86,120,248,135,120,120,7,121,120,120,240,248,135,240, + 240,7,121,240,254,172,254,85,2,15,252,188,218,218,0,0,0,4,0,200,254,20,7,103,7,109,0,24,0,36,0,48,0,73,0,0,1,22,0,23, + 22,21,20,35,34,39,35,20,23,35,54,53,35,6,35,34,53,52,55,54,0,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35, + 33,34,53,17,52,1,33,21,33,53,54,55,0,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,1,6,4,215,65,1,59,9,27,195,108,66, + 30,59,152,59,30,66,108,195,27,9,1,59,253,34,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,1,158,1,168,253,170,34,63,1,88,104, + 85,52,122,72,77,133,57,145,174,254,181,56,3,24,121,254,126,38,37,78,228,155,204,107,107,204,155,228,78,37,38,1,130,4,86,120,248,135,120,120, + 7,121,120,120,240,248,135,240,240,7,121,240,252,63,114,110,31,56,1,49,94,66,81,35,35,123,28,28,132,108,139,254,228,48,0,0,0,4,0,200, + 254,20,7,103,7,109,0,24,0,36,0,48,0,89,0,0,1,22,0,23,22,21,20,35,34,39,35,20,23,35,54,53,35,6,35,34,53,52,55,54, + 0,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,30,1,21,20,6,35,34,38,39,53,30,1,51,50, + 54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,6,4,215,65,1,59,9,27,195,108,66,30,59,152,59, + 30,66,108,195,27,9,1,59,253,34,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,154,92,101,190,177,57,125,70,52,119,67,109,120,111, + 108,86,94,94,97,100,95,40,102,81,73,128,55,144,169,90,3,24,121,254,126,38,37,78,228,155,204,107,107,204,155,228,78,37,38,1,130,4,86,120, + 248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,253,145,18,109,82,124,134,21,20,121,27,26,79,70,74,76,108,63,60,58,61,18,23,115, + 17,18,118,99,69,96,0,0,0,5,0,200,254,20,7,103,7,109,0,24,0,36,0,48,0,51,0,62,0,0,1,22,0,23,22,21,20,35,34,39, + 35,20,23,35,54,53,35,6,35,34,53,52,55,54,0,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,9, + 1,33,3,51,17,51,21,35,21,35,53,33,53,4,215,65,1,59,9,27,195,108,66,30,59,152,59,30,66,108,195,27,9,1,59,253,34,120,120,4, + 191,120,120,251,65,4,191,240,240,251,65,240,2,142,254,203,1,53,22,166,135,135,144,254,98,3,24,121,254,126,38,37,78,228,155,204,107,107,204,155, + 228,78,37,38,1,130,4,86,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,254,151,254,93,2,28,253,228,109,186,186,121,0,0,0, + 0,4,0,200,254,20,7,103,7,109,0,24,0,36,0,48,0,81,0,0,1,22,0,23,22,21,20,35,34,39,35,20,23,35,54,53,35,6,35,34, + 53,52,55,54,0,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,5,33,21,33,21,54,55,54,51,50,23, + 22,21,20,7,6,35,34,38,39,53,22,23,22,51,50,54,52,38,35,34,6,7,4,215,65,1,59,9,27,195,108,66,30,59,152,59,30,66,108,195, + 27,9,1,59,253,34,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,1,24,1,254,254,121,28,29,28,28,161,94,94,97,96,176,60,126,66, + 57,62,62,69,111,130,130,111,52,104,54,3,24,121,254,126,38,37,78,228,155,204,107,107,204,155,228,78,37,38,1,130,4,86,120,248,135,120,120,7, + 121,120,120,240,248,135,240,240,7,121,240,240,95,204,9,4,4,77,76,131,135,75,74,18,18,113,27,14,13,102,174,102,20,21,0,0,0,5,0,200, + 254,20,7,103,7,109,0,24,0,36,0,48,0,64,0,96,0,0,1,22,0,23,22,21,20,35,34,39,35,20,23,35,54,53,35,6,35,34,53,52, + 55,54,0,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,34,7,6,21,20,23,22,51,50,55,54,53, + 52,39,38,19,21,38,39,38,35,34,7,6,7,54,55,54,51,50,23,22,21,20,7,6,35,34,38,53,52,55,54,51,50,23,22,4,215,65,1,59, + 9,27,195,108,66,30,59,152,59,30,66,108,195,27,9,1,59,253,34,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,71,88,51,51,51, + 51,88,87,51,51,51,51,171,49,50,50,49,128,68,68,10,38,57,58,68,145,84,84,88,87,145,167,176,108,108,182,49,50,50,3,24,121,254,126,38, + 37,78,228,155,204,107,107,204,155,228,78,37,38,1,130,4,86,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,253,158,52,53,91,90, + 52,53,53,52,90,91,53,52,1,98,103,20,10,11,75,76,153,49,26,26,76,77,132,127,79,78,222,212,198,117,118,8,9,0,0,0,0,4,0,200, + 254,20,7,103,7,109,0,24,0,36,0,48,0,55,0,0,1,22,0,23,22,21,20,35,34,39,35,20,23,35,54,53,35,6,35,34,53,52,55,54, + 0,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,23,33,21,1,35,1,33,4,215,65,1,59,9,27,195, + 108,66,30,59,152,59,30,66,108,195,27,9,1,59,253,34,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,240,2,105,254,164,136,1,72,254, + 51,3,24,121,254,126,38,37,78,228,155,204,107,107,204,155,228,78,37,38,1,130,4,86,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121, + 240,240,48,252,237,2,228,0,0,6,0,200,254,20,7,103,7,109,0,24,0,36,0,48,0,61,0,91,0,106,0,0,1,22,0,23,22,21,20,35, + 34,39,35,20,23,35,54,53,35,6,35,34,53,52,55,54,0,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17, + 52,0,34,7,6,21,20,22,51,50,55,54,52,39,37,38,39,38,53,52,54,32,23,22,21,20,7,6,7,22,23,22,21,20,7,6,35,34,39,38, + 53,52,55,54,55,20,23,22,51,50,55,54,53,52,39,38,34,7,6,4,215,65,1,59,9,27,195,108,66,30,59,152,59,30,66,108,195,27,9,1, + 59,253,34,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,151,186,53,53,106,93,92,54,53,53,254,236,84,46,47,164,1,30,82,81,46, + 47,83,90,56,53,85,86,158,159,85,86,53,54,45,47,46,85,81,49,48,48,47,166,48,47,3,24,121,254,126,38,37,78,228,155,204,107,107,204,155, + 228,78,37,38,1,130,4,86,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,253,91,44,43,75,76,86,44,43,150,43,93,18,49,50, + 72,100,116,58,58,100,74,48,49,18,18,58,55,80,121,65,65,65,65,121,78,57,56,198,63,38,37,37,36,65,63,38,37,37,36,0,0,5,0,200, + 254,20,7,103,7,109,0,24,0,36,0,48,0,80,0,95,0,0,1,22,0,23,22,21,20,35,34,39,35,20,23,35,54,53,35,6,35,34,53,52, + 55,54,0,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,53,22,23,22,51,50,55,54,55,6,7,6, + 35,34,38,53,52,55,54,51,50,23,22,21,20,7,6,35,34,39,38,19,50,54,53,52,39,38,35,34,7,6,21,20,23,22,4,215,65,1,59,9, + 27,195,108,66,30,59,152,59,30,66,108,195,27,9,1,59,253,34,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,1,46,49,50,50,48,129, + 68,67,10,35,60,57,69,144,168,87,88,145,167,87,88,107,108,182,49,50,50,204,88,102,51,51,88,85,53,52,52,51,3,24,121,254,126,38,37,78, + 228,155,204,107,107,204,155,228,78,37,38,1,130,4,86,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,251,223,103,20,11,10,75,75, + 154,47,27,26,152,132,129,77,78,111,111,212,198,117,118,8,9,1,114,104,92,90,52,53,53,52,90,92,52,52,0,0,0,6,0,200,254,20,7,103, + 7,109,0,24,0,36,0,48,0,62,0,74,0,81,0,0,1,22,0,23,22,21,20,35,34,39,35,20,23,35,54,53,35,6,35,34,53,52,55,54, + 0,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,0,34,7,6,21,20,23,22,50,55,54,53,52,47,1, + 50,22,21,20,6,35,34,38,53,52,54,1,17,7,53,55,51,17,4,215,65,1,59,9,27,195,108,66,30,59,152,59,30,66,108,195,27,9,1,59, + 253,34,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,3,234,142,50,51,51,50,142,50,51,51,121,131,170,170,131,162,140,140,254,116,133,140, + 137,3,24,121,254,126,38,37,78,228,155,204,107,107,204,155,228,78,37,38,1,130,4,86,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121, + 240,254,200,86,86,172,173,86,86,86,86,173,172,86,175,222,211,212,222,222,212,211,222,252,172,2,209,41,116,39,252,189,0,4,0,200,254,20,7,103, + 7,109,0,24,0,36,0,48,0,61,0,0,1,22,0,23,22,21,20,35,34,39,35,20,23,35,54,53,35,6,35,34,53,52,55,54,0,1,34,21, + 17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,5,51,17,20,7,6,43,1,53,51,50,54,53,4,215,65,1,59,9, + 27,195,108,66,30,59,152,59,30,66,108,195,27,9,1,59,253,34,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,1,178,127,65,64,143,49, + 40,84,70,3,24,121,254,126,38,37,78,228,155,204,107,107,204,155,228,78,37,38,1,130,4,86,120,248,135,120,120,7,121,120,120,240,248,135,240,240, + 7,121,240,240,253,220,149,70,69,96,84,108,0,4,0,200,254,20,7,103,7,109,0,24,0,36,0,48,0,74,0,0,1,22,0,23,22,21,20,35, + 34,39,35,20,23,35,54,53,35,6,35,34,53,52,55,54,0,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17, + 52,1,14,1,35,34,38,53,52,54,51,50,22,23,21,46,1,35,34,6,21,20,22,51,50,54,55,4,215,65,1,59,9,27,195,108,66,30,59,152, + 59,30,66,108,195,27,9,1,59,253,34,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,3,60,49,101,57,181,200,201,180,57,102,48,47,106, + 54,124,124,123,125,55,106,46,3,24,121,254,126,38,37,78,228,155,204,107,107,204,155,228,78,37,38,1,130,4,86,120,248,135,120,120,7,121,120,120, + 240,248,135,240,240,7,121,240,251,235,23,22,227,206,205,229,23,23,116,34,36,170,172,171,171,36,34,0,0,5,0,200,254,20,7,103,7,109,0,17, + 0,27,0,52,0,64,0,76,0,0,1,34,6,35,34,38,53,52,54,51,50,22,21,20,6,7,23,7,18,16,38,35,34,6,16,22,51,50,5,22, + 0,23,22,21,20,35,34,39,35,20,23,35,54,53,35,6,35,34,53,52,55,54,0,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17, + 20,35,33,34,53,17,52,2,251,4,17,5,158,155,156,158,159,156,86,88,126,95,10,85,97,96,85,85,96,97,1,148,65,1,59,9,27,195,108,66, + 30,59,152,59,30,66,108,195,27,9,1,59,253,34,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,3,44,1,215,218,219,215,215,219,165,201, + 40,106,56,1,128,1,112,158,158,254,144,158,110,121,254,126,38,37,78,228,155,204,107,107,204,155,228,78,37,38,1,130,4,86,120,248,135,120,120,7, + 121,120,120,240,248,135,240,240,7,121,240,0,0,4,0,200,254,20,7,103,7,109,0,24,0,36,0,48,0,59,0,0,1,22,0,23,22,21,20,35, + 34,39,35,20,23,35,54,53,35,6,35,34,53,52,55,54,0,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17, + 52,23,51,17,1,51,9,1,35,1,17,35,4,215,65,1,59,9,27,195,108,66,30,59,152,59,30,66,108,195,27,9,1,59,253,34,120,120,4,191, + 120,120,251,65,4,191,240,240,251,65,240,240,127,1,106,164,254,105,1,184,167,254,120,127,3,24,121,254,126,38,37,78,228,155,204,107,107,204,155,228, + 78,37,38,1,130,4,86,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,240,254,159,1,97,254,122,254,66,1,147,254,109,0,0,0, + 0,5,0,200,254,20,7,103,7,109,0,21,0,33,0,45,0,48,0,56,0,0,1,54,55,54,51,50,23,22,21,20,7,9,1,38,53,52,55,54, + 51,50,23,22,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,3,33,3,51,1,35,39,33,7,35,4, + 204,22,55,62,84,139,62,19,125,254,196,254,192,125,19,63,138,86,60,55,253,2,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,75,134, + 1,12,210,154,1,32,132,68,254,182,68,132,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45,149,71,65,4,204,120,248,135,120,120, + 7,121,120,120,240,248,135,240,240,7,121,240,254,172,254,85,2,15,252,188,218,218,0,0,0,4,0,200,254,20,7,103,7,109,0,21,0,33,0,45, + 0,70,0,0,1,54,55,54,51,50,23,22,21,20,7,9,1,38,53,52,55,54,51,50,23,22,1,34,21,17,20,51,33,50,53,17,52,35,37,33, + 50,21,17,20,35,33,34,53,17,52,1,33,21,33,53,54,55,0,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,1,6,4,204,22,55,62, + 84,139,62,19,125,254,196,254,192,125,19,63,138,86,60,55,253,2,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,1,158,1,168,253,170,34, + 63,1,88,104,85,52,122,72,77,133,57,145,174,254,181,56,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45,149,71,65,4,204,120, + 248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,252,63,114,110,31,56,1,49,94,66,81,35,35,123,28,28,132,108,139,254,228,48,0,0, + 0,4,0,200,254,20,7,103,7,109,0,21,0,33,0,45,0,86,0,0,1,54,55,54,51,50,23,22,21,20,7,9,1,38,53,52,55,54,51,50, + 23,22,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,30,1,21,20,6,35,34,38,39,53,30,1,51, + 50,54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,6,4,204,22,55,62,84,139,62,19,125,254,196,254, + 192,125,19,63,138,86,60,55,253,2,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,154,92,101,190,177,57,125,70,52,119,67,109,120,111, + 108,86,94,94,97,100,95,40,102,81,73,128,55,144,169,90,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45,149,71,65,4,204,120, + 248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,253,145,18,109,82,124,134,21,20,121,27,26,79,70,74,76,108,63,60,58,61,18,23,115, + 17,18,118,99,69,96,0,0,0,5,0,200,254,20,7,103,7,109,0,21,0,33,0,45,0,48,0,59,0,0,1,54,55,54,51,50,23,22,21,20, + 7,9,1,38,53,52,55,54,51,50,23,22,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,9,1,33,3, + 51,17,51,21,35,21,35,53,33,53,4,204,22,55,62,84,139,62,19,125,254,196,254,192,125,19,63,138,86,60,55,253,2,120,120,4,191,120,120,251, + 65,4,191,240,240,251,65,240,2,142,254,203,1,53,22,166,135,135,144,254,98,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45,149, + 71,65,4,204,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,254,151,254,93,2,28,253,228,109,186,186,121,0,0,0,0,4,0,200, + 254,20,7,103,7,109,0,21,0,33,0,45,0,78,0,0,1,54,55,54,51,50,23,22,21,20,7,9,1,38,53,52,55,54,51,50,23,22,1,34, + 21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,5,33,21,33,21,54,55,54,51,50,23,22,21,20,7,6,35,34, + 38,39,53,22,23,22,51,50,54,52,38,35,34,6,7,4,204,22,55,62,84,139,62,19,125,254,196,254,192,125,19,63,138,86,60,55,253,2,120,120, + 4,191,120,120,251,65,4,191,240,240,251,65,240,1,24,1,254,254,121,28,29,28,28,161,94,94,97,96,176,60,126,66,57,62,62,69,111,130,130,111, + 52,104,54,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45,149,71,65,4,204,120,248,135,120,120,7,121,120,120,240,248,135,240,240, + 7,121,240,240,95,204,9,4,4,77,76,131,135,75,74,18,18,113,27,14,13,102,174,102,20,21,0,0,0,5,0,200,254,20,7,103,7,109,0,21, + 0,33,0,45,0,61,0,93,0,0,1,54,55,54,51,50,23,22,21,20,7,9,1,38,53,52,55,54,51,50,23,22,1,34,21,17,20,51,33,50, + 53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,19,21,38,39,38,35,34,7, + 6,7,54,55,54,51,50,23,22,21,20,7,6,35,34,38,53,52,55,54,51,50,23,22,4,204,22,55,62,84,139,62,19,125,254,196,254,192,125,19, + 63,138,86,60,55,253,2,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,71,88,51,51,51,51,88,87,51,51,51,51,171,49,50,50,49, + 128,68,68,10,38,57,58,68,145,84,84,88,87,145,167,176,108,108,182,49,50,50,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45, + 149,71,65,4,204,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,253,158,52,53,91,90,52,53,53,52,90,91,53,52,1,98,103,20, + 10,11,75,76,153,49,26,26,76,77,132,127,79,78,222,212,198,117,118,8,9,0,0,0,0,4,0,200,254,20,7,103,7,109,0,21,0,33,0,45, + 0,52,0,0,1,54,55,54,51,50,23,22,21,20,7,9,1,38,53,52,55,54,51,50,23,22,1,34,21,17,20,51,33,50,53,17,52,35,37,33, + 50,21,17,20,35,33,34,53,17,52,23,33,21,1,35,1,33,4,204,22,55,62,84,139,62,19,125,254,196,254,192,125,19,63,138,86,60,55,253,2, + 120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,240,2,105,254,164,136,1,72,254,51,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157, + 160,59,45,149,71,65,4,204,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,240,48,252,237,2,228,0,0,6,0,200,254,20,7,103, + 7,109,0,21,0,33,0,45,0,58,0,88,0,103,0,0,1,54,55,54,51,50,23,22,21,20,7,9,1,38,53,52,55,54,51,50,23,22,1,34, + 21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,0,34,7,6,21,20,22,51,50,55,54,52,39,37,38,39,38,53, + 52,54,32,23,22,21,20,7,6,7,22,23,22,21,20,7,6,35,34,39,38,53,52,55,54,55,20,23,22,51,50,55,54,53,52,39,38,34,7,6, + 4,204,22,55,62,84,139,62,19,125,254,196,254,192,125,19,63,138,86,60,55,253,2,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,151, + 186,53,53,106,93,92,54,53,53,254,236,84,46,47,164,1,30,82,81,46,47,83,90,56,53,85,86,158,159,85,86,53,54,45,47,46,85,81,49,48, + 48,47,166,48,47,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45,149,71,65,4,204,120,248,135,120,120,7,121,120,120,240,248,135, + 240,240,7,121,240,253,91,44,43,75,76,86,44,43,150,43,93,18,49,50,72,100,116,58,58,100,74,48,49,18,18,58,55,80,121,65,65,65,65,121, + 78,57,56,198,63,38,37,37,36,65,63,38,37,37,36,0,0,5,0,200,254,20,7,103,7,109,0,21,0,33,0,45,0,77,0,92,0,0,1,54, + 55,54,51,50,23,22,21,20,7,9,1,38,53,52,55,54,51,50,23,22,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33, + 34,53,17,52,1,53,22,23,22,51,50,55,54,55,6,7,6,35,34,38,53,52,55,54,51,50,23,22,21,20,7,6,35,34,39,38,19,50,54,53, + 52,39,38,35,34,7,6,21,20,23,22,4,204,22,55,62,84,139,62,19,125,254,196,254,192,125,19,63,138,86,60,55,253,2,120,120,4,191,120,120, + 251,65,4,191,240,240,251,65,240,1,46,49,50,50,48,129,68,67,10,35,60,57,69,144,168,87,88,145,167,87,88,107,108,182,49,50,50,204,88,102, + 51,51,88,85,53,52,52,51,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45,149,71,65,4,204,120,248,135,120,120,7,121,120,120, + 240,248,135,240,240,7,121,240,251,223,103,20,11,10,75,75,154,47,27,26,152,132,129,77,78,111,111,212,198,117,118,8,9,1,114,104,92,90,52,53, + 53,52,90,92,52,52,0,0,0,6,0,200,254,20,7,103,7,109,0,21,0,33,0,45,0,59,0,71,0,78,0,0,1,54,55,54,51,50,23,22, + 21,20,7,9,1,38,53,52,55,54,51,50,23,22,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,0,34, + 7,6,21,20,23,22,50,55,54,53,52,47,1,50,22,21,20,6,35,34,38,53,52,54,1,17,7,53,55,51,17,4,204,22,55,62,84,139,62,19, + 125,254,196,254,192,125,19,63,138,86,60,55,253,2,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,3,234,142,50,51,51,50,142,50,51,51, + 121,131,170,170,131,162,140,140,254,116,133,140,137,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45,149,71,65,4,204,120,248,135,120, + 120,7,121,120,120,240,248,135,240,240,7,121,240,254,200,86,86,172,173,86,86,86,86,173,172,86,175,222,211,212,222,222,212,211,222,252,172,2,209,41, + 116,39,252,189,0,4,0,200,254,20,7,103,7,109,0,21,0,33,0,45,0,58,0,0,1,54,55,54,51,50,23,22,21,20,7,9,1,38,53,52, + 55,54,51,50,23,22,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,5,51,17,20,7,6,43,1,53,51, + 50,54,53,4,204,22,55,62,84,139,62,19,125,254,196,254,192,125,19,63,138,86,60,55,253,2,120,120,4,191,120,120,251,65,4,191,240,240,251,65, + 240,1,178,127,65,64,143,49,40,84,70,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45,149,71,65,4,204,120,248,135,120,120,7, + 121,120,120,240,248,135,240,240,7,121,240,240,253,220,149,70,69,96,84,108,0,4,0,200,254,20,7,103,7,109,0,21,0,33,0,45,0,71,0,0, + 1,54,55,54,51,50,23,22,21,20,7,9,1,38,53,52,55,54,51,50,23,22,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20, + 35,33,34,53,17,52,1,14,1,35,34,38,53,52,54,51,50,22,23,21,46,1,35,34,6,21,20,22,51,50,54,55,4,204,22,55,62,84,139,62, + 19,125,254,196,254,192,125,19,63,138,86,60,55,253,2,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,3,60,49,101,57,181,200,201,180,57, + 102,48,47,106,54,124,124,123,125,55,106,46,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45,149,71,65,4,204,120,248,135,120,120, + 7,121,120,120,240,248,135,240,240,7,121,240,251,235,23,22,227,206,205,229,23,23,116,34,36,170,172,171,171,36,34,0,0,5,0,217,254,20,7,120, + 7,109,0,17,0,27,0,49,0,61,0,73,0,0,1,34,6,35,34,38,53,52,54,51,50,22,21,20,6,7,23,7,18,16,38,35,34,6,16,22, + 51,50,1,54,55,54,51,50,23,22,21,20,7,9,1,38,53,52,55,54,51,50,23,22,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21, + 17,20,35,33,34,53,17,52,2,251,4,17,5,158,155,156,158,159,156,86,88,126,95,10,85,97,96,85,85,96,97,1,137,22,55,62,84,139,62,19, + 125,254,196,254,192,125,19,63,138,86,60,55,253,19,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,3,44,1,215,218,219,215,215,219,165,201, + 40,106,56,1,128,1,112,158,158,254,144,158,254,48,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45,149,71,65,4,204,120,248,135,120,120, + 7,121,120,120,240,248,135,240,240,7,121,240,0,4,0,200,254,20,7,103,7,109,0,21,0,33,0,45,0,56,0,0,1,54,55,54,51,50,23,22, + 21,20,7,9,1,38,53,52,55,54,51,50,23,22,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,23,51, + 17,1,51,9,1,35,1,17,35,4,204,22,55,62,84,139,62,19,125,254,196,254,192,125,19,63,138,86,60,55,253,2,120,120,4,191,120,120,251,65, + 4,191,240,240,251,65,240,240,127,1,106,164,254,105,1,184,167,254,120,127,1,182,118,62,71,149,45,59,158,159,254,110,1,146,157,160,59,45,149,71, + 65,4,204,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,240,254,159,1,97,254,122,254,66,1,147,254,109,0,0,0,0,5,0,200, + 254,20,7,103,7,109,0,6,0,18,0,30,0,33,0,41,0,0,1,48,9,1,48,1,48,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50, + 21,17,20,35,33,34,53,17,52,1,3,33,3,51,1,35,39,33,7,35,4,202,1,152,254,104,254,102,254,136,120,120,4,191,120,120,251,65,4,191, + 240,240,251,65,240,2,75,134,1,12,210,154,1,32,132,68,254,182,68,132,2,249,253,242,253,250,2,6,6,10,120,248,135,120,120,7,121,120,120,240, + 248,135,240,240,7,121,240,254,172,254,85,2,15,252,188,218,218,0,0,0,0,4,0,200,254,20,7,103,7,109,0,6,0,18,0,30,0,55,0,0, + 1,48,9,1,48,1,48,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,33,21,33,53,54,55,0,53, + 52,38,35,34,6,7,53,62,1,51,50,22,21,20,1,6,4,202,1,152,254,104,254,102,254,136,120,120,4,191,120,120,251,65,4,191,240,240,251,65, + 240,1,158,1,168,253,170,34,63,1,88,104,85,52,122,72,77,133,57,145,174,254,181,56,2,249,253,242,253,250,2,6,6,10,120,248,135,120,120,7, + 121,120,120,240,248,135,240,240,7,121,240,252,63,114,110,31,56,1,49,94,66,81,35,35,123,28,28,132,108,139,254,228,48,0,0,0,0,4,0,200, + 254,20,7,103,7,109,0,6,0,18,0,30,0,71,0,0,1,48,9,1,48,1,48,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17, + 20,35,33,34,53,17,52,1,30,1,21,20,6,35,34,38,39,53,30,1,51,50,54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,7,53, + 62,1,51,50,22,21,20,6,4,202,1,152,254,104,254,102,254,136,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,154,92,101,190,177,57, + 125,70,52,119,67,109,120,111,108,86,94,94,97,100,95,40,102,81,73,128,55,144,169,90,2,249,253,242,253,250,2,6,6,10,120,248,135,120,120,7, + 121,120,120,240,248,135,240,240,7,121,240,253,145,18,109,82,124,134,21,20,121,27,26,79,70,74,76,108,63,60,58,61,18,23,115,17,18,118,99,69, + 96,0,0,0,0,5,0,200,254,20,7,103,7,109,0,6,0,18,0,30,0,33,0,44,0,0,1,48,9,1,48,1,48,1,34,21,17,20,51,33, + 50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,9,1,33,3,51,17,51,21,35,21,35,53,33,53,4,202,1,152,254,104,254,102,254, + 136,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,142,254,203,1,53,22,166,135,135,144,254,98,2,249,253,242,253,250,2,6,6,10,120, + 248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,254,151,254,93,2,28,253,228,109,186,186,121,0,4,0,200,254,20,7,103,7,109,0,6, + 0,18,0,30,0,63,0,0,1,48,9,1,48,1,48,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,5, + 33,21,33,21,54,55,54,51,50,23,22,21,20,7,6,35,34,38,39,53,22,23,22,51,50,54,52,38,35,34,6,7,4,202,1,152,254,104,254,102, + 254,136,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,1,24,1,254,254,121,28,29,28,28,161,94,94,97,96,176,60,126,66,57,62,62,69, + 111,130,130,111,52,104,54,2,249,253,242,253,250,2,6,6,10,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,240,95,204,9,4,4, + 77,76,131,135,75,74,18,18,113,27,14,13,102,174,102,20,21,0,0,0,0,5,0,200,254,20,7,103,7,109,0,6,0,18,0,30,0,46,0,78, + 0,0,1,48,9,1,48,1,48,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,34,7,6,21,20,23, + 22,51,50,55,54,53,52,39,38,19,21,38,39,38,35,34,7,6,7,54,55,54,51,50,23,22,21,20,7,6,35,34,38,53,52,55,54,51,50,23, + 22,4,202,1,152,254,104,254,102,254,136,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,71,88,51,51,51,51,88,87,51,51,51,51,171, + 49,50,50,49,128,68,68,10,38,57,58,68,145,84,84,88,87,145,167,176,108,108,182,49,50,50,2,249,253,242,253,250,2,6,6,10,120,248,135,120, + 120,7,121,120,120,240,248,135,240,240,7,121,240,253,158,52,53,91,90,52,53,53,52,90,91,53,52,1,98,103,20,10,11,75,76,153,49,26,26,76, + 77,132,127,79,78,222,212,198,117,118,8,9,0,4,0,200,254,20,7,103,7,109,0,6,0,18,0,30,0,37,0,0,1,48,9,1,48,1,48,1, + 34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,23,33,21,1,35,1,33,4,202,1,152,254,104,254,102,254,136, + 120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,240,2,105,254,164,136,1,72,254,51,2,249,253,242,253,250,2,6,6,10,120,248,135,120,120, + 7,121,120,120,240,248,135,240,240,7,121,240,240,48,252,237,2,228,0,0,0,6,0,200,254,20,7,103,7,109,0,6,0,18,0,30,0,43,0,73, + 0,88,0,0,1,48,9,1,48,1,48,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,0,34,7,6,21, + 20,22,51,50,55,54,52,39,37,38,39,38,53,52,54,32,23,22,21,20,7,6,7,22,23,22,21,20,7,6,35,34,39,38,53,52,55,54,55,20, + 23,22,51,50,55,54,53,52,39,38,34,7,6,4,202,1,152,254,104,254,102,254,136,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,151, + 186,53,53,106,93,92,54,53,53,254,236,84,46,47,164,1,30,82,81,46,47,83,90,56,53,85,86,158,159,85,86,53,54,45,47,46,85,81,49,48, + 48,47,166,48,47,2,249,253,242,253,250,2,6,6,10,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,253,91,44,43,75,76,86,44, + 43,150,43,93,18,49,50,72,100,116,58,58,100,74,48,49,18,18,58,55,80,121,65,65,65,65,121,78,57,56,198,63,38,37,37,36,65,63,38,37, + 37,36,0,0,0,5,0,200,254,20,7,103,7,109,0,6,0,18,0,30,0,62,0,77,0,0,1,48,9,1,48,1,48,1,34,21,17,20,51,33, + 50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,53,22,23,22,51,50,55,54,55,6,7,6,35,34,38,53,52,55,54,51,50,23, + 22,21,20,7,6,35,34,39,38,19,50,54,53,52,39,38,35,34,7,6,21,20,23,22,4,202,1,152,254,104,254,102,254,136,120,120,4,191,120,120, + 251,65,4,191,240,240,251,65,240,1,46,49,50,50,48,129,68,67,10,35,60,57,69,144,168,87,88,145,167,87,88,107,108,182,49,50,50,204,88,102, + 51,51,88,85,53,52,52,51,2,249,253,242,253,250,2,6,6,10,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,251,223,103,20,11, + 10,75,75,154,47,27,26,152,132,129,77,78,111,111,212,198,117,118,8,9,1,114,104,92,90,52,53,53,52,90,92,52,52,0,0,0,0,6,0,200, + 254,20,7,103,7,109,0,6,0,18,0,30,0,44,0,56,0,63,0,0,1,48,9,1,48,1,48,1,34,21,17,20,51,33,50,53,17,52,35,37, + 33,50,21,17,20,35,33,34,53,17,52,0,34,7,6,21,20,23,22,50,55,54,53,52,47,1,50,22,21,20,6,35,34,38,53,52,54,1,17,7, + 53,55,51,17,4,202,1,152,254,104,254,102,254,136,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,3,234,142,50,51,51,50,142,50,51,51, + 121,131,170,170,131,162,140,140,254,116,133,140,137,2,249,253,242,253,250,2,6,6,10,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240, + 254,200,86,86,172,173,86,86,86,86,173,172,86,175,222,211,212,222,222,212,211,222,252,172,2,209,41,116,39,252,189,0,0,4,0,200,254,20,7,103, + 7,109,0,6,0,18,0,30,0,43,0,0,1,48,9,1,48,1,48,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34, + 53,17,52,5,51,17,20,7,6,43,1,53,51,50,54,53,4,202,1,152,254,104,254,102,254,136,120,120,4,191,120,120,251,65,4,191,240,240,251,65, + 240,1,178,127,65,64,143,49,40,84,70,2,249,253,242,253,250,2,6,6,10,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,240,253, + 220,149,70,69,96,84,108,0,0,4,0,200,254,20,7,103,7,109,0,6,0,18,0,30,0,56,0,0,1,48,9,1,48,1,48,1,34,21,17,20, + 51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,14,1,35,34,38,53,52,54,51,50,22,23,21,46,1,35,34,6,21,20, + 22,51,50,54,55,4,202,1,152,254,104,254,102,254,136,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,3,60,49,101,57,181,200,201,180,57, + 102,48,47,106,54,124,124,123,125,55,106,46,2,249,253,242,253,250,2,6,6,10,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,251, + 235,23,22,227,206,205,229,23,23,116,34,36,170,172,171,171,36,34,0,0,0,5,0,200,254,20,7,103,7,109,0,6,0,24,0,34,0,46,0,58, + 0,0,1,48,9,1,48,1,48,3,34,6,35,34,38,53,52,54,51,50,22,21,20,6,7,23,7,18,16,38,35,34,6,16,22,51,50,1,34,21, + 17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,4,202,1,152,254,104,254,102,53,4,17,5,158,155,156,158,159,156,86, + 88,126,95,10,85,97,96,85,85,96,97,254,117,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,249,253,242,253,250,2,6,2,65,1,215, + 218,219,215,215,219,165,201,40,106,56,1,128,1,112,158,158,254,144,158,3,111,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,0,0, + 0,4,0,200,254,20,7,103,7,109,0,6,0,18,0,30,0,41,0,0,1,48,9,1,48,1,48,1,34,21,17,20,51,33,50,53,17,52,35,37, + 33,50,21,17,20,35,33,34,53,17,52,23,51,17,1,51,9,1,35,1,17,35,4,202,1,152,254,104,254,102,254,136,120,120,4,191,120,120,251,65, + 4,191,240,240,251,65,240,240,127,1,106,164,254,105,1,184,167,254,120,127,2,249,253,242,253,250,2,6,6,10,120,248,135,120,120,7,121,120,120,240, + 248,135,240,240,7,121,240,240,254,159,1,97,254,122,254,66,1,147,254,109,0,3,0,200,254,20,7,103,7,109,0,9,0,21,0,33,0,0,1,19, + 33,1,19,9,1,19,1,33,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,4,24,142,1,209,254,137,143, + 254,137,254,135,144,254,137,1,208,254,48,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,5,49,254,71,254,239,254,71,1,17,254,239,1,185, + 1,17,3,125,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,0,0,0,0,5,0,200,254,20,7,103,7,109,0,35,0,47,0,59, + 0,62,0,70,0,0,5,54,53,6,39,38,39,38,53,52,55,54,51,50,23,38,53,52,32,21,20,7,54,51,50,23,22,21,20,7,6,7,6,39, + 20,23,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,3,33,3,51,1,35,39,33,7,35,4,85,57, + 72,170,53,25,146,16,63,171,75,49,124,1,216,124,49,75,171,63,16,146,25,53,169,73,57,252,201,120,120,4,191,120,120,251,65,4,191,240,240,251, + 65,240,2,75,134,1,12,210,154,1,32,132,68,254,182,68,132,252,76,251,195,3,1,12,67,149,52,36,141,19,130,106,234,234,106,130,19,141,36,52, + 146,70,12,1,5,197,251,76,7,241,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,254,172,254,85,2,15,252,188,218,218,0,0,0, + 0,4,0,200,254,20,7,103,7,109,0,35,0,47,0,59,0,84,0,0,5,54,53,6,39,38,39,38,53,52,55,54,51,50,23,38,53,52,32,21, + 20,7,54,51,50,23,22,21,20,7,6,7,6,39,20,23,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52, + 1,33,21,33,53,54,55,0,53,52,38,35,34,6,7,53,62,1,51,50,22,21,20,1,6,4,85,57,72,170,53,25,146,16,63,171,75,49,124,1, + 216,124,49,75,171,63,16,146,25,53,169,73,57,252,201,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,1,158,1,168,253,170,34,63,1,88, + 104,85,52,122,72,77,133,57,145,174,254,181,56,252,76,251,195,3,1,12,67,149,52,36,141,19,130,106,234,234,106,130,19,141,36,52,146,70,12,1, + 5,197,251,76,7,241,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,252,63,114,110,31,56,1,49,94,66,81,35,35,123,28,28,132, + 108,139,254,228,48,0,0,0,0,4,0,200,254,20,7,103,7,109,0,35,0,47,0,59,0,100,0,0,5,54,53,6,39,38,39,38,53,52,55,54, + 51,50,23,38,53,52,32,21,20,7,54,51,50,23,22,21,20,7,6,7,6,39,20,23,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21, + 17,20,35,33,34,53,17,52,1,30,1,21,20,6,35,34,38,39,53,30,1,51,50,54,53,52,38,43,1,53,51,50,54,53,52,38,35,34,6,7, + 53,62,1,51,50,22,21,20,6,4,85,57,72,170,53,25,146,16,63,171,75,49,124,1,216,124,49,75,171,63,16,146,25,53,169,73,57,252,201,120, + 120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,154,92,101,190,177,57,125,70,52,119,67,109,120,111,108,86,94,94,97,100,95,40,102,81,73, + 128,55,144,169,90,252,76,251,195,3,1,12,67,149,52,36,141,19,130,106,234,234,106,130,19,141,36,52,146,70,12,1,5,197,251,76,7,241,120,248, + 135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,253,145,18,109,82,124,134,21,20,121,27,26,79,70,74,76,108,63,60,58,61,18,23,115,17, + 18,118,99,69,96,0,0,0,0,5,0,200,254,20,7,103,7,109,0,35,0,47,0,59,0,62,0,73,0,0,5,54,53,6,39,38,39,38,53,52, + 55,54,51,50,23,38,53,52,32,21,20,7,54,51,50,23,22,21,20,7,6,7,6,39,20,23,1,34,21,17,20,51,33,50,53,17,52,35,37,33, + 50,21,17,20,35,33,34,53,17,52,9,1,33,3,51,17,51,21,35,21,35,53,33,53,4,85,57,72,170,53,25,146,16,63,171,75,49,124,1,216, + 124,49,75,171,63,16,146,25,53,169,73,57,252,201,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,142,254,203,1,53,22,166,135,135,144, + 254,98,252,76,251,195,3,1,12,67,149,52,36,141,19,130,106,234,234,106,130,19,141,36,52,146,70,12,1,5,197,251,76,7,241,120,248,135,120,120, + 7,121,120,120,240,248,135,240,240,7,121,240,254,151,254,93,2,28,253,228,109,186,186,121,0,4,0,200,254,20,7,103,7,109,0,35,0,47,0,59, + 0,92,0,0,5,54,53,6,39,38,39,38,53,52,55,54,51,50,23,38,53,52,32,21,20,7,54,51,50,23,22,21,20,7,6,7,6,39,20,23, + 1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,5,33,21,33,21,54,55,54,51,50,23,22,21,20,7,6, + 35,34,38,39,53,22,23,22,51,50,54,52,38,35,34,6,7,4,85,57,72,170,53,25,146,16,63,171,75,49,124,1,216,124,49,75,171,63,16,146, + 25,53,169,73,57,252,201,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,1,24,1,254,254,121,28,29,28,28,161,94,94,97,96,176,60,126, + 66,57,62,62,69,111,130,130,111,52,104,54,252,76,251,195,3,1,12,67,149,52,36,141,19,130,106,234,234,106,130,19,141,36,52,146,70,12,1,5, + 197,251,76,7,241,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,240,95,204,9,4,4,77,76,131,135,75,74,18,18,113,27,14,13, + 102,174,102,20,21,0,0,0,0,5,0,200,254,20,7,103,7,109,0,35,0,47,0,59,0,75,0,107,0,0,5,54,53,6,39,38,39,38,53,52, + 55,54,51,50,23,38,53,52,32,21,20,7,54,51,50,23,22,21,20,7,6,7,6,39,20,23,1,34,21,17,20,51,33,50,53,17,52,35,37,33, + 50,21,17,20,35,33,34,53,17,52,1,34,7,6,21,20,23,22,51,50,55,54,53,52,39,38,19,21,38,39,38,35,34,7,6,7,54,55,54,51, + 50,23,22,21,20,7,6,35,34,38,53,52,55,54,51,50,23,22,4,85,57,72,170,53,25,146,16,63,171,75,49,124,1,216,124,49,75,171,63,16, + 146,25,53,169,73,57,252,201,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,71,88,51,51,51,51,88,87,51,51,51,51,171,49,50,50, + 49,128,68,68,10,38,57,58,68,145,84,84,88,87,145,167,176,108,108,182,49,50,50,252,76,251,195,3,1,12,67,149,52,36,141,19,130,106,234,234, + 106,130,19,141,36,52,146,70,12,1,5,197,251,76,7,241,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,253,158,52,53,91,90,52, + 53,53,52,90,91,53,52,1,98,103,20,10,11,75,76,153,49,26,26,76,77,132,127,79,78,222,212,198,117,118,8,9,0,4,0,200,254,20,7,103, + 7,109,0,35,0,47,0,59,0,66,0,0,5,54,53,6,39,38,39,38,53,52,55,54,51,50,23,38,53,52,32,21,20,7,54,51,50,23,22,21, + 20,7,6,7,6,39,20,23,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,23,33,21,1,35,1,33,4, + 85,57,72,170,53,25,146,16,63,171,75,49,124,1,216,124,49,75,171,63,16,146,25,53,169,73,57,252,201,120,120,4,191,120,120,251,65,4,191,240, + 240,251,65,240,240,2,105,254,164,136,1,72,254,51,252,76,251,195,3,1,12,67,149,52,36,141,19,130,106,234,234,106,130,19,141,36,52,146,70,12, + 1,5,197,251,76,7,241,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,240,48,252,237,2,228,0,0,0,6,0,200,254,20,7,103, + 7,109,0,35,0,47,0,59,0,72,0,102,0,117,0,0,5,54,53,6,39,38,39,38,53,52,55,54,51,50,23,38,53,52,32,21,20,7,54,51, + 50,23,22,21,20,7,6,7,6,39,20,23,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,0,34,7,6, + 21,20,22,51,50,55,54,52,39,37,38,39,38,53,52,54,32,23,22,21,20,7,6,7,22,23,22,21,20,7,6,35,34,39,38,53,52,55,54,55, + 20,23,22,51,50,55,54,53,52,39,38,34,7,6,4,85,57,72,170,53,25,146,16,63,171,75,49,124,1,216,124,49,75,171,63,16,146,25,53,169, + 73,57,252,201,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,151,186,53,53,106,93,92,54,53,53,254,236,84,46,47,164,1,30,82,81, + 46,47,83,90,56,53,85,86,158,159,85,86,53,54,45,47,46,85,81,49,48,48,47,166,48,47,252,76,251,195,3,1,12,67,149,52,36,141,19,130, + 106,234,234,106,130,19,141,36,52,146,70,12,1,5,197,251,76,7,241,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,253,91,44,43, + 75,76,86,44,43,150,43,93,18,49,50,72,100,116,58,58,100,74,48,49,18,18,58,55,80,121,65,65,65,65,121,78,57,56,198,63,38,37,37,36, + 65,63,38,37,37,36,0,0,0,5,0,200,254,20,7,103,7,109,0,35,0,47,0,59,0,91,0,106,0,0,5,54,53,6,39,38,39,38,53,52, + 55,54,51,50,23,38,53,52,32,21,20,7,54,51,50,23,22,21,20,7,6,7,6,39,20,23,1,34,21,17,20,51,33,50,53,17,52,35,37,33, + 50,21,17,20,35,33,34,53,17,52,1,53,22,23,22,51,50,55,54,55,6,7,6,35,34,38,53,52,55,54,51,50,23,22,21,20,7,6,35,34, + 39,38,19,50,54,53,52,39,38,35,34,7,6,21,20,23,22,4,85,57,72,170,53,25,146,16,63,171,75,49,124,1,216,124,49,75,171,63,16,146, + 25,53,169,73,57,252,201,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,1,46,49,50,50,48,129,68,67,10,35,60,57,69,144,168,87,88, + 145,167,87,88,107,108,182,49,50,50,204,88,102,51,51,88,85,53,52,52,51,252,76,251,195,3,1,12,67,149,52,36,141,19,130,106,234,234,106,130, + 19,141,36,52,146,70,12,1,5,197,251,76,7,241,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,251,223,103,20,11,10,75,75,154, + 47,27,26,152,132,129,77,78,111,111,212,198,117,118,8,9,1,114,104,92,90,52,53,53,52,90,92,52,52,0,0,0,0,6,0,200,254,20,7,103, + 7,109,0,35,0,47,0,59,0,73,0,85,0,92,0,0,5,54,53,6,39,38,39,38,53,52,55,54,51,50,23,38,53,52,32,21,20,7,54,51, + 50,23,22,21,20,7,6,7,6,39,20,23,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,0,34,7,6, + 21,20,23,22,50,55,54,53,52,47,1,50,22,21,20,6,35,34,38,53,52,54,1,17,7,53,55,51,17,4,85,57,72,170,53,25,146,16,63,171, + 75,49,124,1,216,124,49,75,171,63,16,146,25,53,169,73,57,252,201,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,3,234,142,50,51,51, + 50,142,50,51,51,121,131,170,170,131,162,140,140,254,116,133,140,137,252,76,251,195,3,1,12,67,149,52,36,141,19,130,106,234,234,106,130,19,141,36, + 52,146,70,12,1,5,197,251,76,7,241,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,254,200,86,86,172,173,86,86,86,86,173,172, + 86,175,222,211,212,222,222,212,211,222,252,172,2,209,41,116,39,252,189,0,0,4,0,200,254,20,7,103,7,109,0,35,0,47,0,59,0,72,0,0, + 5,54,53,6,39,38,39,38,53,52,55,54,51,50,23,38,53,52,32,21,20,7,54,51,50,23,22,21,20,7,6,7,6,39,20,23,1,34,21,17, + 20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,5,51,17,20,7,6,43,1,53,51,50,54,53,4,85,57,72,170,53,25, + 146,16,63,171,75,49,124,1,216,124,49,75,171,63,16,146,25,53,169,73,57,252,201,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,1,178, + 127,65,64,143,49,40,84,70,252,76,251,195,3,1,12,67,149,52,36,141,19,130,106,234,234,106,130,19,141,36,52,146,70,12,1,5,197,251,76,7, + 241,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,240,253,220,149,70,69,96,84,108,0,0,4,0,200,254,20,7,103,7,109,0,35, + 0,47,0,59,0,85,0,0,5,54,53,6,39,38,39,38,53,52,55,54,51,50,23,38,53,52,32,21,20,7,54,51,50,23,22,21,20,7,6,7, + 6,39,20,23,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,14,1,35,34,38,53,52,54,51,50,22, + 23,21,46,1,35,34,6,21,20,22,51,50,54,55,4,85,57,72,170,53,25,146,16,63,171,75,49,124,1,216,124,49,75,171,63,16,146,25,53,169, + 73,57,252,201,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,3,60,49,101,57,181,200,201,180,57,102,48,47,106,54,124,124,123,125,55,106, + 46,252,76,251,195,3,1,12,67,149,52,36,141,19,130,106,234,234,106,130,19,141,36,52,146,70,12,1,5,197,251,76,7,241,120,248,135,120,120,7, + 121,120,120,240,248,135,240,240,7,121,240,251,235,23,22,227,206,205,229,23,23,116,34,36,170,172,171,171,36,34,0,0,0,5,0,200,254,20,7,103, + 7,109,0,35,0,47,0,59,0,77,0,87,0,0,5,54,53,6,39,38,39,38,53,52,55,54,51,50,23,38,53,52,32,21,20,7,54,51,50,23, + 22,21,20,7,6,7,6,39,20,23,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52,1,34,6,35,34,38, + 53,52,54,51,50,22,21,20,6,7,23,7,18,16,38,35,34,6,16,22,51,50,4,85,57,72,170,53,25,146,16,63,171,75,49,124,1,216,124,49, + 75,171,63,16,146,25,53,169,73,57,252,201,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,2,51,4,17,5,158,155,156,158,159,156,86,88, + 126,95,10,85,97,96,85,85,96,97,252,76,251,195,3,1,12,67,149,52,36,141,19,130,106,234,234,106,130,19,141,36,52,146,70,12,1,5,197,251, + 76,7,241,120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,251,191,1,215,218,219,215,215,219,165,201,40,106,56,1,128,1,112,158,158, + 254,144,158,0,0,4,0,200,254,20,7,103,7,109,0,35,0,47,0,59,0,70,0,0,5,54,53,6,39,38,39,38,53,52,55,54,51,50,23,38, + 53,52,32,21,20,7,54,51,50,23,22,21,20,7,6,7,6,39,20,23,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33, + 34,53,17,52,23,51,17,1,51,9,1,35,1,17,35,4,85,57,72,170,53,25,146,16,63,171,75,49,124,1,216,124,49,75,171,63,16,146,25,53, + 169,73,57,252,201,120,120,4,191,120,120,251,65,4,191,240,240,251,65,240,240,127,1,106,164,254,105,1,184,167,254,120,127,252,76,251,195,3,1,12, + 67,149,52,36,141,19,130,106,234,234,106,130,19,141,36,52,146,70,12,1,5,197,251,76,7,241,120,248,135,120,120,7,121,120,120,240,248,135,240,240, + 7,121,240,240,254,159,1,97,254,122,254,66,1,147,254,109,0,4,0,200,254,20,7,103,7,109,0,9,0,19,0,31,0,43,0,0,1,3,33,5, + 3,37,5,3,37,33,3,19,5,1,19,37,5,19,1,37,1,34,21,17,20,51,33,50,53,17,52,35,37,33,50,21,17,20,35,33,34,53,17,52, + 4,24,100,254,188,1,6,101,1,7,1,5,99,1,5,254,187,98,173,1,178,254,184,96,254,137,254,135,98,254,183,1,179,254,77,120,120,4,191,120, + 120,251,65,4,191,240,240,251,65,240,4,110,254,206,190,254,205,190,190,1,51,190,1,245,254,111,40,254,226,254,84,223,223,1,168,1,34,40,3,85, + 120,248,135,120,120,7,121,120,120,240,248,135,240,240,7,121,240,0,0,0,0,8,0,153,255,106,7,191,7,86,0,7,0,17,0,25,0,35,0,43, + 0,51,0,127,0,183,0,0,0,52,54,50,22,20,6,34,55,34,6,21,20,51,50,54,53,52,36,20,6,34,38,52,54,50,23,34,6,21,20,51, + 50,54,53,52,0,52,54,50,22,20,6,34,54,20,6,34,38,52,54,50,6,50,62,3,55,19,23,7,62,4,53,52,38,39,38,39,62,1,53,52, + 38,35,34,14,1,21,20,23,7,38,53,52,55,38,34,7,22,21,20,7,39,54,53,52,46,1,35,34,6,21,20,22,23,6,7,14,1,21,20,30, + 3,23,39,55,19,30,3,18,50,23,62,1,51,50,22,21,20,7,22,21,20,14,2,7,5,7,37,7,6,7,5,7,37,14,1,34,38,39,5,39, + 37,38,47,1,5,39,37,46,3,53,52,55,38,53,52,54,51,50,22,23,2,230,66,92,66,66,92,116,17,45,13,17,46,1,175,66,92,66,66,92, + 23,17,44,13,17,45,254,111,22,32,22,22,32,236,22,32,22,22,32,161,108,78,46,27,9,2,16,134,12,59,113,115,86,54,67,55,48,65,73,98, + 98,79,83,130,67,18,130,23,1,42,168,42,1,23,130,18,67,130,83,79,98,98,73,65,48,55,67,54,86,115,113,59,12,134,16,2,9,27,46,56, + 152,76,43,202,143,139,173,93,156,75,131,152,89,1,159,4,253,236,1,2,4,1,251,22,254,13,32,169,250,169,32,254,13,22,1,251,4,2,1,253, + 236,4,1,159,89,152,131,75,156,93,173,139,143,202,43,3,56,144,103,103,144,103,130,61,24,18,62,24,17,117,144,103,103,144,103,220,61,24,18,62, + 24,17,253,34,54,39,39,54,39,93,54,39,39,54,39,224,36,57,93,87,62,1,58,6,251,31,76,107,116,147,76,74,152,55,51,40,35,131,88,81, + 105,107,164,92,66,63,38,83,84,27,14,3,3,14,27,84,83,38,63,66,92,164,107,105,81,88,131,35,40,51,55,152,74,76,147,116,107,76,31,251, + 6,254,198,62,87,93,57,6,2,6,134,190,183,140,138,114,172,200,108,200,161,126,51,26,68,35,1,31,31,174,64,172,109,138,138,109,172,64,174,31, + 31,1,35,68,26,51,126,161,200,108,200,172,114,138,140,183,190,134,0,0,0,11,0,75,255,106,9,45,6,138,0,9,0,20,0,24,0,34,0,40, + 0,44,0,142,0,153,0,159,0,253,1,7,0,0,1,34,38,52,54,51,50,22,20,6,39,50,54,53,52,35,34,7,6,21,20,23,51,21,35,1, + 34,38,52,54,51,50,22,20,6,1,55,23,7,39,55,1,21,35,53,37,23,6,7,6,21,20,23,30,1,51,50,55,54,55,54,53,52,39,38,39, + 55,22,23,62,4,55,22,51,50,62,4,55,62,1,53,52,39,46,4,35,34,14,2,15,1,6,7,38,36,32,4,7,38,47,1,46,3,35,34,14, + 3,7,6,21,20,22,23,30,5,51,50,55,30,4,23,54,37,50,54,53,52,35,34,7,6,21,20,1,7,23,7,39,55,1,52,55,39,38,39,35, + 34,46,6,39,46,1,53,52,62,1,55,62,1,51,50,30,2,23,22,31,1,54,55,54,32,23,22,23,55,54,55,62,3,51,50,22,23,30,2,21, + 20,6,7,14,7,43,1,6,15,1,22,21,20,7,6,7,6,7,6,7,14,1,34,38,39,38,39,38,39,38,39,38,1,6,32,39,22,23,22,51, + 50,54,3,121,50,62,61,51,50,62,61,30,18,45,14,17,23,22,53,110,110,2,73,51,61,62,50,51,61,62,251,83,51,197,57,63,42,3,148,110, + 253,210,66,63,17,5,57,52,177,139,105,69,128,66,57,5,17,63,66,24,18,5,30,13,20,10,1,82,39,32,56,37,47,22,54,12,49,46,52,2, + 38,30,43,43,18,17,32,35,16,19,19,63,89,61,254,247,254,190,254,247,61,89,63,19,19,16,35,32,17,18,43,43,30,38,2,52,46,49,12,54, + 22,47,37,56,32,39,82,1,10,20,13,30,5,18,3,6,18,45,14,17,23,22,1,237,170,42,63,57,197,250,203,13,21,57,16,10,33,59,43,53, + 27,55,19,63,10,66,58,41,44,35,51,135,65,29,51,50,25,23,37,17,65,40,55,164,1,164,164,55,40,65,17,37,23,25,50,51,29,65,135,51, + 35,44,41,58,66,10,63,19,55,27,53,43,59,33,10,16,57,21,13,13,34,96,9,22,32,66,54,136,196,136,54,66,32,22,9,95,35,13,3,52, + 97,254,186,97,17,31,55,157,107,126,2,209,110,130,110,110,130,110,27,65,21,17,31,29,25,18,212,210,1,139,110,130,110,110,130,110,2,181,45,218, + 186,24,148,253,77,210,210,147,118,36,68,17,25,75,59,55,34,8,13,68,59,75,25,17,68,36,118,13,15,19,104,53,87,77,39,20,11,12,32,17, + 49,10,42,76,55,46,52,2,40,26,35,19,14,34,17,25,25,78,131,101,109,109,101,131,78,25,25,17,34,14,19,35,26,40,2,52,46,55,76,42, + 10,49,17,32,12,11,20,39,77,87,53,104,19,15,78,65,21,17,31,29,25,18,2,154,187,148,24,186,218,251,239,42,44,80,221,73,9,8,27,13, + 44,15,57,9,58,107,82,52,95,53,34,50,83,18,39,24,25,39,21,82,29,27,78,78,27,29,82,21,39,25,24,39,18,83,50,34,53,95,52,82, + 107,58,9,57,15,44,13,27,8,9,73,221,80,44,42,48,40,115,66,68,48,72,46,38,27,27,38,46,72,48,68,66,115,40,254,224,22,22,36,21, + 39,38,0,0,0,8,0,61,255,106,8,29,7,20,0,17,0,25,0,40,0,50,0,65,0,78,0,127,0,184,0,0,1,55,22,51,50,55,22,51, + 50,55,23,6,35,34,39,6,35,34,1,23,6,34,39,55,22,50,1,6,7,6,35,34,39,38,53,52,55,54,51,50,22,7,34,6,21,20,23,62, + 1,55,38,5,62,1,51,50,23,22,21,20,7,6,35,34,39,38,23,22,51,50,55,54,53,52,39,38,35,34,6,5,54,53,52,46,2,39,38,39, + 6,7,38,35,34,7,38,39,6,7,14,3,21,20,23,37,23,5,22,23,37,23,5,22,23,22,32,55,54,55,37,55,5,54,55,37,55,5,38,53, + 52,62,3,55,54,63,1,23,30,1,23,54,50,23,62,1,63,1,23,22,23,30,4,21,20,7,23,7,39,6,7,23,7,39,2,7,6,33,32,39, + 38,3,7,39,55,38,39,7,39,2,166,92,69,91,58,84,84,58,91,69,92,108,144,74,68,69,73,144,1,184,62,122,194,122,62,90,134,254,252,43, + 81,32,40,70,54,21,53,47,65,70,101,78,36,48,5,43,69,18,22,1,184,5,100,70,66,47,53,21,54,70,40,32,81,121,12,26,48,40,16,4, + 12,13,44,64,1,147,18,10,10,22,4,27,42,243,153,116,155,157,116,153,243,42,27,5,21,11,10,18,1,66,10,254,191,14,23,1,30,26,254,225, + 103,164,181,1,234,181,164,103,254,225,26,1,30,21,15,254,192,10,250,192,17,7,19,12,31,5,23,38,15,60,143,253,93,105,226,105,93,253,143,59, + 16,38,23,5,31,12,19,7,17,108,10,109,15,32,110,26,109,117,195,217,254,224,254,223,217,193,118,109,26,109,30,16,109,10,1,140,98,64,44,44, + 64,98,100,28,28,1,168,120,61,61,120,46,1,6,76,28,11,35,36,45,71,48,44,97,38,48,36,14,15,7,52,37,17,29,67,97,44,48,71,45, + 36,35,11,28,4,3,22,24,28,14,12,3,59,167,130,116,46,102,62,118,25,161,167,58,196,21,21,196,58,167,161,27,114,65,101,46,116,130,43,66, + 44,69,64,121,62,122,231,119,132,132,119,231,122,62,121,57,76,44,66,61,124,143,57,106,119,65,147,24,117,140,58,9,22,137,97,13,13,97,137,22, + 9,58,140,117,24,147,65,119,106,57,143,124,15,66,14,81,87,46,62,46,254,247,142,158,158,140,1,11,46,62,46,81,87,14,66,0,0,11,0,170, + 255,106,8,150,7,11,0,7,0,17,0,29,0,37,0,49,0,59,0,71,0,104,0,152,0,170,0,188,0,0,0,52,54,50,22,20,6,34,55,34, + 6,21,20,51,50,54,53,52,3,34,53,52,55,54,51,50,21,20,7,6,0,20,6,34,38,52,54,50,1,52,51,50,23,22,21,20,35,34,39,38, + 1,34,6,21,20,51,50,54,53,52,1,55,22,51,50,54,55,23,6,33,34,38,18,32,55,54,53,52,39,62,2,53,52,39,38,35,34,6,7,46, + 1,35,34,7,6,21,20,30,1,23,6,21,20,23,18,32,4,23,22,23,54,51,50,22,21,20,7,6,7,14,1,43,1,6,7,14,1,7,6,32, + 39,46,1,39,38,39,35,34,38,39,38,39,38,53,52,54,51,50,23,54,55,54,3,38,35,34,7,14,1,21,20,23,22,23,22,59,1,54,55,38, + 37,6,7,22,23,51,50,55,54,55,54,53,52,38,39,38,35,34,3,25,82,116,82,82,116,145,22,55,16,22,56,16,24,44,37,30,24,44,37,2, + 13,82,116,82,82,116,254,255,24,31,37,44,24,31,37,44,1,30,22,55,16,22,56,252,227,106,130,206,96,180,59,106,168,254,238,128,234,138,1,192, + 165,124,84,30,29,31,86,90,130,71,113,31,28,112,71,130,90,86,31,29,30,84,124,208,1,106,1,55,97,105,16,25,29,106,144,8,13,28,34,134, + 89,7,15,58,56,171,109,148,254,224,148,109,171,56,58,15,7,89,134,34,28,13,8,144,106,29,25,16,105,97,214,24,32,13,21,40,43,7,23,71, + 31,38,4,8,60,53,5,116,16,53,60,8,4,38,31,71,23,7,43,40,21,13,32,4,8,116,82,82,116,82,104,49,19,14,49,19,14,254,82,21, + 32,36,31,21,32,36,31,2,12,116,82,82,116,82,254,5,21,31,36,32,21,31,36,1,107,49,19,14,49,19,14,253,168,84,164,88,76,84,214,114, + 254,222,203,154,184,134,149,44,48,94,49,138,105,111,69,53,53,69,111,105,138,49,94,48,44,149,134,184,154,6,0,164,124,136,155,6,164,135,44,54, + 91,63,75,105,123,112,110,173,55,76,76,55,173,110,112,123,105,75,63,91,54,44,135,164,6,155,136,124,253,204,21,7,15,82,58,30,51,151,47,21, + 135,123,87,96,96,87,123,135,21,47,151,51,30,58,82,15,7,0,0,0,0,9,0,170,255,106,7,173,6,110,0,11,0,22,0,34,0,46,0,52, + 0,57,0,62,0,66,0,70,0,0,1,52,54,51,50,22,21,20,6,35,34,38,37,52,54,50,22,21,20,6,35,34,38,5,16,0,33,32,0,17, + 16,0,33,32,0,3,16,0,33,32,0,17,16,0,33,32,0,1,33,16,0,32,0,5,54,55,17,35,3,17,35,17,22,37,54,55,35,5,53,35, + 22,2,130,81,59,58,82,82,58,59,81,2,66,82,116,83,83,58,59,81,252,109,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,135,2, + 14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,1,20,4,219,254,149,253,252,254,148,2,178,88,76,164,136,164,76,2,12,72,28,100,253,32, + 101,28,3,255,59,81,81,59,58,83,83,58,59,81,81,59,58,83,83,219,254,196,254,67,1,189,1,60,1,61,1,192,254,64,254,195,1,117,2,15, + 253,241,254,139,254,140,253,244,2,12,1,106,254,254,254,150,1,106,223,11,42,1,37,254,166,1,90,254,219,42,153,82,100,184,184,102,0,9,0,170, + 255,106,7,173,6,110,0,11,0,23,0,35,0,47,0,53,0,58,0,63,0,67,0,71,0,0,1,16,0,33,32,0,17,16,0,33,32,0,3,16, + 0,33,32,0,17,16,0,33,32,0,1,52,54,50,22,21,35,52,38,34,6,21,33,52,54,50,22,21,35,52,38,34,6,21,7,33,16,0,32,0, + 5,54,55,17,35,3,17,35,17,22,37,54,55,35,5,53,35,22,1,49,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,135,2,14,1, + 116,1,117,2,12,253,244,254,139,254,140,253,242,3,188,140,196,140,135,61,84,61,253,41,140,196,140,135,61,84,61,223,4,219,254,149,253,252,254,148, + 2,178,88,76,164,136,164,76,2,12,72,28,100,253,32,101,28,2,234,254,196,254,67,1,189,1,60,1,61,1,192,254,64,254,195,1,117,2,15,253, + 241,254,139,254,140,253,244,2,12,2,22,139,197,197,139,83,119,119,83,139,197,197,139,83,119,119,83,172,254,254,254,150,1,106,223,11,42,1,37,254, + 166,1,90,254,219,42,153,82,100,184,184,102,0,9,0,95,255,106,8,249,6,110,0,3,0,7,0,12,0,17,0,23,0,35,0,47,0,89,0,126, + 0,0,1,53,35,22,5,54,55,35,1,17,35,17,22,23,54,55,17,35,37,33,16,0,32,0,19,52,54,50,22,21,35,52,38,34,6,21,33,52, + 54,50,22,21,35,52,38,34,6,21,5,16,0,33,32,0,17,20,7,23,22,23,22,21,20,6,34,39,38,47,1,2,7,0,33,32,1,38,3,7, + 6,7,6,34,38,53,52,55,54,63,1,38,55,16,0,33,32,0,17,52,39,6,35,34,39,38,47,1,23,22,23,38,39,38,33,32,7,6,7,54, + 63,1,7,6,7,6,34,39,6,3,60,101,28,3,41,72,28,100,254,76,164,76,224,88,76,164,253,78,4,219,254,149,253,252,254,148,88,140,196,140, + 135,61,84,61,1,201,140,196,140,135,61,84,61,251,189,2,14,1,116,1,117,2,12,2,93,59,24,30,54,76,31,25,18,11,42,209,254,250,254,139, + 254,140,254,249,209,43,10,18,25,31,76,54,30,23,60,92,2,135,1,191,1,60,1,61,1,189,1,27,37,38,31,25,18,45,136,41,24,47,154,222, + 254,194,254,196,224,154,47,24,41,136,45,18,25,31,76,27,1,1,161,184,102,80,82,100,254,166,1,90,254,219,42,11,11,42,1,37,135,254,254,254, + 150,1,106,1,174,139,197,197,139,83,119,119,83,139,197,197,139,83,119,119,83,162,1,117,2,15,253,241,254,139,29,27,31,20,24,31,37,38,54,31, + 25,57,32,254,233,209,254,250,1,6,208,1,22,30,57,25,31,54,38,37,31,25,19,30,28,29,254,196,254,67,1,189,1,60,20,19,26,31,25,57, + 136,45,14,15,199,154,224,224,155,198,16,13,45,136,57,25,31,27,20,0,0,6,0,170,255,106,7,173,6,110,0,11,0,22,0,34,0,46,0,52, + 0,60,0,0,1,52,54,51,50,22,21,20,6,35,34,38,37,52,54,50,22,21,20,6,35,34,38,5,16,0,33,32,0,17,16,0,33,32,0,19, + 16,0,33,32,0,17,16,0,33,32,0,19,33,16,0,32,0,37,33,22,23,22,36,55,54,2,130,81,59,58,82,82,58,59,81,2,66,82,116,83, + 83,58,59,81,251,230,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,141, + 4,219,254,149,253,252,254,148,4,66,252,87,33,92,142,1,148,142,92,3,255,59,81,81,59,58,83,83,58,59,81,81,59,58,83,83,219,1,117,2, + 15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,254,185,254,254,254,150,1,106,123,117,92,142,1, + 142,92,0,0,0,6,0,170,255,106,7,173,6,110,0,11,0,23,0,35,0,47,0,53,0,62,0,0,1,52,54,50,22,21,35,52,38,34,6,21, + 33,52,54,50,22,21,35,52,38,34,6,21,5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,19,33,16,0, + 32,0,37,33,22,23,22,55,50,55,54,2,22,140,196,140,135,61,84,61,1,201,140,196,140,135,61,84,61,251,189,2,14,1,116,1,117,2,12,253, + 244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,141,4,219,254,149,253,252,254,148,4,66,252,87,33,92,142, + 202,202,142,92,3,140,139,197,197,139,83,119,119,83,139,197,197,139,83,119,119,83,162,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254, + 196,254,67,1,189,1,60,1,61,1,192,254,64,254,185,254,254,254,150,1,106,123,117,92,142,1,142,92,0,7,0,170,255,106,7,173,6,110,0,11, + 0,23,0,35,0,47,0,59,0,65,0,74,0,0,1,23,22,7,6,7,6,34,38,53,52,55,5,52,54,50,22,21,35,52,38,34,6,21,33,52, + 54,50,22,21,35,52,38,34,6,21,5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,19,33,16,0,32,0, + 37,33,22,23,22,55,50,55,54,6,168,65,28,1,1,26,27,76,54,27,251,175,140,196,140,135,61,84,61,1,201,140,196,140,135,61,84,61,251,189, + 2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,141,4,219,254,149,253,252, + 254,148,4,66,252,87,33,92,142,202,202,142,92,4,44,128,56,34,43,26,27,54,44,35,53,32,139,197,197,139,83,119,119,83,139,197,197,139,83,119, + 119,83,162,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,254,185,254,254,254,150,1, + 106,123,117,92,142,1,142,92,0,6,0,170,255,106,7,173,6,110,0,6,0,13,0,25,0,37,0,43,0,51,0,0,1,37,23,7,23,7,37,39, + 21,5,39,55,39,55,1,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,19,33,16,0,32,0,37,33,22,23, + 22,36,55,54,4,124,1,39,77,198,198,77,254,217,160,254,217,77,198,198,77,253,245,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135, + 1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,141,4,219,254,149,253,252,254,148,4,66,252,87,33,92,142,1,148,142,92,4,39,206,110, + 139,138,110,206,85,85,206,110,138,139,110,253,245,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1, + 192,254,64,254,185,254,254,254,150,1,106,123,117,92,142,1,142,92,0,0,0,7,0,143,255,106,7,200,7,99,0,15,0,31,0,42,0,53,0,73, + 0,87,0,95,0,0,1,55,22,23,22,4,55,54,55,23,6,7,6,32,39,38,1,16,0,33,32,0,17,16,47,1,6,33,32,39,7,6,5,52, + 54,50,22,21,20,6,35,34,38,37,52,54,51,50,22,20,6,35,34,38,1,52,36,33,32,4,21,20,7,22,17,16,0,33,32,0,17,16,55,38, + 37,54,53,52,36,33,32,4,21,20,23,54,33,32,23,38,35,34,7,22,51,50,2,29,115,28,40,143,1,147,142,39,29,115,37,50,182,253,252,182, + 50,254,239,1,191,1,60,1,61,1,189,222,14,229,254,215,254,216,230,14,224,3,148,82,116,83,83,58,59,81,253,190,81,59,58,82,82,58,59,81, + 254,13,2,30,1,127,1,128,2,28,253,226,253,244,254,139,254,140,253,242,227,254,5,219,188,254,67,254,195,254,196,254,65,189,244,1,74,1,75,67, + 176,222,221,176,176,221,222,1,209,71,44,38,141,1,142,39,44,72,57,50,181,181,51,1,81,254,196,254,67,1,189,1,60,1,61,224,14,57,57,14, + 224,42,59,81,81,59,58,83,83,58,59,81,81,118,82,83,2,92,134,190,190,134,130,92,252,254,165,254,140,253,244,2,12,1,116,1,91,252,92,2, + 54,74,81,114,114,81,74,54,207,245,110,110,28,0,0,0,0,7,0,170,255,106,7,173,7,48,0,3,0,14,0,25,0,29,0,45,0,57,0,74, + 0,0,1,5,7,37,1,52,54,50,22,21,20,6,35,34,38,37,52,54,51,50,22,20,6,35,34,38,1,23,5,39,1,55,22,23,22,32,55,54, + 55,23,6,7,6,32,39,38,1,16,0,33,32,0,17,16,0,33,32,0,1,54,32,23,37,17,22,17,16,0,33,32,0,17,16,55,17,2,210,1, + 47,77,254,209,2,63,82,116,83,83,58,59,81,253,190,81,59,58,82,82,58,59,81,3,4,77,254,209,77,253,198,115,28,40,142,1,148,142,39,29, + 115,37,50,182,253,252,182,50,254,239,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,1,226,132,1,42,132,1,187,173,253,244,254,139,254, + 140,253,242,174,5,103,212,111,213,254,188,59,81,81,59,58,83,83,58,59,81,81,118,82,83,1,236,110,213,111,253,62,71,44,38,142,142,39,44,72, + 57,50,181,181,51,1,81,254,196,254,67,1,189,1,60,1,61,1,192,254,64,2,29,42,42,236,253,208,231,254,209,254,140,253,244,2,12,1,116,1, + 47,231,2,48,0,5,0,170,255,106,7,173,6,110,0,15,0,27,0,39,0,50,0,57,0,0,1,55,22,23,22,32,55,54,55,23,6,7,6,32, + 39,38,1,16,0,33,32,0,17,16,0,33,32,0,3,16,0,33,32,0,17,16,0,33,32,0,1,52,54,51,50,22,20,6,35,34,38,45,1,23, + 7,23,7,37,2,29,115,28,40,142,1,148,142,39,29,115,37,50,182,253,252,182,50,254,239,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254, + 65,135,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,1,216,81,59,58,82,82,58,59,81,1,250,1,39,77,198,198,77,254,217,1,209, + 71,44,38,142,142,39,44,72,57,50,181,181,51,1,81,254,196,254,67,1,189,1,60,1,61,1,192,254,64,254,195,1,117,2,15,253,241,254,139,254, + 140,253,244,2,12,2,135,59,81,81,118,82,83,100,206,110,139,138,110,206,0,5,0,170,255,106,7,173,6,110,0,15,0,27,0,39,0,51,0,63, + 0,0,1,55,22,23,22,32,55,54,55,23,6,7,6,32,39,38,3,52,54,50,22,21,35,52,38,34,6,21,33,52,54,50,22,21,35,52,38,34, + 6,21,5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,2,29,115,28,40,142,1,148,142,39,29,115,37,50, + 182,253,252,182,50,44,140,196,140,135,61,84,61,1,201,140,196,140,135,61,84,61,251,189,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242, + 135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,1,209,71,44,38,142,142,39,44,72,57,50,181,181,51,1,243,139,197,197,139,83,119, + 119,83,139,197,197,139,83,119,119,83,162,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254, + 64,0,0,0,0,5,0,170,255,106,7,173,6,110,0,11,0,23,0,55,0,67,0,81,0,0,1,52,54,50,22,21,35,52,38,34,6,21,33,52, + 54,50,22,21,35,52,38,34,6,21,5,16,0,33,50,55,38,39,6,35,32,0,17,51,20,0,32,0,53,51,20,7,22,29,1,54,17,16,0,33, + 32,0,3,16,0,33,32,0,17,16,0,33,32,0,5,6,7,22,23,22,51,50,55,54,55,52,39,38,4,102,140,196,140,135,61,84,61,253,41,140, + 196,140,135,61,84,61,254,148,1,191,1,60,136,118,101,65,43,45,254,254,254,148,135,1,29,1,148,1,28,135,123,55,209,254,67,254,195,254,196,254, + 65,135,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,5,16,79,92,31,38,36,27,16,13,33,1,1,2,3,140,139,197,197,139,83,119, + 119,83,139,197,197,139,83,119,119,83,162,254,196,254,67,41,48,108,5,1,106,1,2,202,254,229,1,28,201,213,160,100,99,4,218,1,51,1,61,1, + 192,254,64,254,195,1,117,2,15,253,241,254,139,254,140,253,244,2,12,54,67,36,40,24,23,8,19,57,5,6,46,0,0,5,0,170,255,106,7,173, + 6,110,0,15,0,27,0,39,0,51,0,63,0,0,1,55,22,23,22,32,55,54,55,23,6,7,6,32,39,38,1,20,6,34,38,53,51,20,22,50, + 54,53,33,20,6,34,38,53,51,20,22,50,54,53,1,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,2,29, + 115,28,40,142,1,148,142,39,29,115,37,50,182,253,252,182,50,4,0,140,196,140,135,61,84,61,254,55,140,196,140,135,61,84,61,253,63,2,14,1, + 116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,1,209,71,44,38,142,142,39,44,72, + 57,50,181,181,51,2,239,139,197,197,139,83,119,119,83,139,197,197,139,83,119,119,83,254,98,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1, + 116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,0,0,5,0,170,255,106,7,173,6,110,0,23,0,47,0,59,0,71,0,87,0,0,1,50, + 23,22,21,6,15,1,35,39,38,53,38,55,54,51,22,23,22,23,51,52,55,54,33,50,23,22,21,51,54,55,54,55,50,23,22,7,20,15,1,35, + 39,38,39,52,55,54,1,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,19,55,22,23,22,32,55,54,55,23, + 6,7,6,32,39,38,5,166,26,25,60,1,50,168,2,159,62,1,10,38,63,41,32,28,10,1,13,35,253,73,61,35,13,1,10,28,32,41,63,38, + 10,1,62,159,2,168,50,1,60,25,254,18,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254, + 195,254,196,254,65,236,115,28,40,142,1,148,142,39,29,115,37,50,182,253,252,182,50,4,192,14,37,63,65,62,207,190,68,76,21,25,68,1,32,32, + 49,14,29,71,71,29,14,49,32,32,1,68,25,21,76,68,190,207,62,65,63,37,14,254,42,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1, + 116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,253,170,71,44,38,142,142,39,44,72,57,50,181,181,51,0,0,0,4,0,170,255,106,7,173, + 6,110,0,23,0,35,0,51,0,60,0,0,1,16,0,33,32,0,17,52,39,35,21,20,6,34,38,53,20,6,34,38,61,1,35,6,7,16,0,33, + 32,0,17,16,0,33,32,0,37,55,22,23,22,4,55,54,55,23,6,7,6,32,39,38,3,33,38,39,38,33,32,7,6,1,49,1,191,1,60,1, + 61,1,189,84,110,166,236,166,166,236,166,110,85,135,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,1,115,115,28,40,143,1,147,142,39, + 29,115,37,50,182,253,252,182,50,96,4,148,22,24,222,254,194,254,196,224,24,2,234,254,196,254,67,1,189,1,60,195,160,79,100,142,142,100,100,142, + 142,100,79,160,195,1,117,2,15,253,241,254,139,254,140,253,244,2,12,91,71,44,38,141,1,142,39,44,72,57,50,181,181,51,3,59,26,25,224,224, + 25,0,0,0,0,5,0,170,255,106,7,173,6,110,0,3,0,7,0,17,0,29,0,41,0,0,1,53,33,21,33,53,33,21,19,50,55,54,55,23, + 6,7,6,33,1,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,4,152,1,170,251,212,1,170,108,202,142,39, + 29,115,37,50,182,254,254,252,126,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196, + 254,65,3,140,135,135,135,135,253,172,142,39,44,72,57,50,181,2,57,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1, + 189,1,60,1,61,1,192,254,64,0,0,0,0,5,0,170,255,106,7,173,6,110,0,3,0,14,0,25,0,37,0,49,0,0,1,53,33,21,1,52, + 54,51,50,22,20,6,35,34,38,37,52,54,50,22,21,20,6,35,34,38,5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16, + 0,33,32,0,2,76,3,192,252,118,81,59,58,82,82,58,59,81,2,66,82,116,83,83,58,59,81,251,230,2,14,1,116,1,117,2,12,253,244,254, + 139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,1,113,135,135,2,140,59,81,81,118,82,83,58,59,81,81,59,58, + 83,83,217,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,0,0,0,0,5,0,170, + 255,106,7,173,6,110,0,3,0,7,0,11,0,23,0,35,0,0,1,53,33,21,33,53,33,21,1,53,33,21,1,16,0,33,32,0,17,16,0,33, + 32,0,19,16,0,33,32,0,17,16,0,33,32,0,4,152,1,170,251,212,1,170,254,140,3,192,250,158,2,14,1,116,1,117,2,12,253,244,254,139, + 254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,3,140,135,135,135,135,253,229,135,135,1,121,1,117,2,15,253,241,254, + 139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,0,0,5,0,170,255,106,7,173,6,110,0,11,0,23,0,27, + 0,41,0,55,0,0,1,16,0,33,32,0,17,16,0,33,32,0,3,16,0,33,32,0,17,16,0,33,32,0,5,53,33,21,1,53,33,50,22,21, + 20,6,35,34,38,53,52,53,33,53,33,50,22,21,20,6,35,34,38,53,52,53,1,49,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65, + 135,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,1,162,3,192,252,2,1,120,58,82,82,58,59,81,1,86,1,120,58,83,83,58,59, + 81,2,234,254,196,254,67,1,189,1,60,1,61,1,192,254,64,254,195,1,117,2,15,253,241,254,139,254,140,253,244,2,12,5,135,135,2,45,135,81, + 59,58,83,83,58,3,2,135,81,59,58,83,83,58,3,2,0,8,0,170,255,106,7,173,6,110,0,8,0,12,0,16,0,20,0,31,0,42,0,54, + 0,66,0,0,1,23,22,20,6,34,38,52,55,1,53,33,21,19,37,55,13,1,39,37,23,1,52,54,51,50,22,20,6,35,34,38,37,52,54,50, + 22,21,20,6,35,34,38,5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,6,80,65,27,54,76,54,27,252, + 61,3,192,11,254,168,77,1,88,251,221,77,1,88,77,254,233,81,59,58,82,82,58,59,81,2,66,82,116,83,83,58,59,81,251,230,2,14,1,116, + 1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,3,172,128,53,79,54,54,79,53,254,69, + 135,135,2,165,240,111,241,110,110,241,111,254,175,59,81,81,118,82,83,58,59,81,81,59,58,83,83,145,1,117,2,15,253,241,254,139,254,140,253,244, + 2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,0,0,0,5,0,170,255,106,7,173,6,110,0,3,0,15,0,27,0,39,0,51, + 0,0,1,53,33,21,19,20,6,34,38,53,51,20,22,50,54,53,33,20,6,34,38,53,51,20,22,50,54,53,1,16,0,33,32,0,17,16,0,33, + 32,0,19,16,0,33,32,0,17,16,0,33,32,0,2,76,3,192,54,140,196,140,135,61,84,61,254,55,140,196,140,135,61,84,61,253,63,2,14,1, + 116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,1,113,135,135,3,23,139,197,197,139, + 83,119,119,83,139,197,197,139,83,119,119,83,254,98,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61, + 1,192,254,64,0,5,0,170,255,106,7,173,6,110,0,3,0,14,0,25,0,37,0,49,0,0,37,39,1,23,1,52,54,51,50,22,20,6,35,34, + 38,37,52,54,50,22,21,20,6,35,34,38,5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,2,149,57,3, + 103,57,252,134,81,59,58,82,82,58,59,81,2,66,82,116,83,83,58,59,81,251,230,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135, + 1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,172,123,1,150,123,1,187,59,81,81,118,82,83,58,59,81,81,59,58,83,83,217,1,117, + 2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,0,5,0,170,255,106,7,173,6,110,0,3, + 0,15,0,27,0,31,0,66,0,0,1,39,1,23,1,16,0,33,32,0,17,16,0,33,32,0,3,16,0,33,32,0,17,16,0,33,32,0,9,1, + 55,1,3,34,7,6,7,14,1,39,38,39,38,35,34,7,39,54,55,54,50,23,22,23,22,51,50,55,54,55,54,50,23,22,23,7,38,2,201,95, + 1,14,95,253,90,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,135,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,4,229, + 254,242,95,1,14,154,52,41,11,24,70,196,70,28,12,34,53,56,32,121,16,25,70,196,70,28,12,34,53,52,40,12,24,70,196,70,24,16,121,31, + 3,92,95,1,14,95,254,128,254,196,254,67,1,189,1,60,1,61,1,192,254,64,254,195,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,230, + 1,14,95,254,242,254,87,105,29,34,98,1,99,40,33,95,95,57,40,34,98,98,40,34,95,105,30,34,98,98,34,40,57,95,0,0,0,5,0,170, + 255,106,7,173,6,110,0,11,0,22,0,35,0,47,0,59,0,0,1,52,54,51,50,22,21,20,6,35,34,38,37,52,54,50,22,21,20,6,35,34, + 38,3,55,39,55,5,21,7,23,21,5,39,55,39,1,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,2,130, + 81,59,58,82,82,58,59,81,2,66,82,116,83,83,58,59,81,206,80,144,65,1,3,60,60,254,253,65,144,80,252,180,2,14,1,116,1,117,2,12, + 253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,3,255,59,81,81,59,58,83,83,58,59,81,81,59,58, + 83,83,254,36,62,78,118,141,88,46,46,88,141,118,78,62,1,35,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189, + 1,60,1,61,1,192,254,64,0,6,0,170,255,106,7,173,6,110,0,23,0,34,0,41,0,54,0,66,0,78,0,0,1,50,23,22,21,6,15,1, + 35,39,38,53,38,55,54,51,22,23,22,23,51,52,55,54,1,52,54,51,50,22,20,6,35,34,38,45,1,23,7,23,7,37,3,55,39,55,5,21, + 7,23,21,5,39,55,39,1,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,6,106,26,26,60,2,50,168,2, + 158,62,2,10,38,64,40,32,28,10,2,12,34,252,86,81,59,58,82,82,58,59,81,1,250,1,39,77,198,198,77,254,217,134,80,144,65,1,3,60, + 60,254,253,65,144,80,252,180,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254, + 65,2,175,14,37,63,65,62,207,190,68,76,21,25,68,1,32,32,49,14,29,71,1,78,59,81,81,118,82,83,100,206,110,139,138,110,206,254,23,62, + 78,118,141,88,46,46,88,141,118,78,62,1,35,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1, + 192,254,64,0,0,5,0,170,255,106,7,173,6,110,0,11,0,23,0,36,0,48,0,60,0,0,1,52,54,50,22,21,35,52,38,34,6,21,33,52, + 54,50,22,21,35,52,38,34,6,21,3,55,39,55,5,21,7,23,21,5,39,55,39,1,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32, + 0,17,16,0,33,32,0,2,22,140,196,140,135,61,84,61,1,201,140,196,140,135,61,84,61,247,80,144,65,1,3,60,60,254,253,65,144,80,252,180, + 2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,3,140,139,197,197,139,83, + 119,119,83,139,197,197,139,83,119,119,83,254,93,62,78,118,141,88,46,46,88,141,118,78,62,1,35,1,117,2,15,253,241,254,139,254,140,253,244,2, + 12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,0,0,0,0,5,0,170,255,106,7,173,6,110,0,12,0,24,0,36,0,48,0,60, + 0,0,1,55,39,55,5,21,7,23,21,5,39,55,39,1,20,6,34,38,53,51,20,22,50,54,53,33,20,6,34,38,53,51,20,22,50,54,53,1, + 16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,3,246,80,144,65,1,3,60,60,254,253,65,144,80,2,76,140, + 196,140,135,61,84,61,254,55,140,196,140,135,61,84,61,253,63,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61, + 1,189,254,67,254,195,254,196,254,65,1,233,62,78,118,141,88,46,46,88,141,118,78,62,2,193,139,197,197,139,83,119,119,83,139,197,197,139,83,119, + 119,83,254,98,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,0,0,0,6,0,170, + 255,106,7,173,6,110,0,11,0,22,0,34,0,46,0,56,0,62,0,0,1,52,54,51,50,22,21,20,6,35,34,38,37,52,54,50,22,21,20,6, + 35,34,38,5,16,0,33,32,0,17,16,0,33,32,0,3,16,0,33,32,0,17,16,0,33,32,0,37,53,33,21,35,20,6,34,38,53,33,35,20, + 22,50,54,2,130,81,59,58,82,82,58,59,81,2,66,82,116,83,83,58,59,81,252,109,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65, + 135,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,1,162,3,192,242,140,196,140,1,85,206,61,84,61,3,255,59,81,81,59,58,83,83, + 58,59,81,81,59,58,83,83,219,254,196,254,67,1,189,1,60,1,61,1,192,254,64,254,195,1,117,2,15,253,241,254,139,254,140,253,244,2,12,99, + 135,135,139,197,197,139,83,119,119,0,0,0,0,6,0,170,255,106,7,173,6,110,0,10,0,17,0,29,0,41,0,51,0,57,0,0,1,52,54,51, + 50,22,20,6,35,34,38,45,1,23,7,23,7,37,5,16,0,33,32,0,17,16,0,33,32,0,3,16,0,33,32,0,17,16,0,33,32,0,37,53, + 33,21,35,20,6,34,38,53,33,35,20,22,50,54,2,130,81,59,58,82,82,58,59,81,1,250,1,39,77,198,198,77,254,217,252,181,1,191,1,60, + 1,61,1,189,254,67,254,195,254,196,254,65,135,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,1,162,3,192,242,140,196,140,1,85,206, + 61,84,61,3,253,59,81,81,118,82,83,100,206,110,139,138,110,206,232,254,196,254,67,1,189,1,60,1,61,1,192,254,64,254,195,1,117,2,15,253, + 241,254,139,254,140,253,244,2,12,99,135,135,139,197,197,139,83,119,119,0,0,6,0,170,255,106,7,173,6,110,0,11,0,23,0,30,0,37,0,47, + 0,53,0,0,1,16,0,33,32,0,17,16,0,33,32,0,3,16,0,33,32,0,17,16,0,33,32,0,1,21,5,39,55,39,55,5,37,23,7,23, + 7,37,1,53,33,21,35,20,6,34,38,53,33,35,20,22,50,54,1,49,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,135,2,14,1, + 116,1,117,2,12,253,244,254,139,254,140,253,242,3,50,254,217,77,198,198,77,1,199,1,39,77,198,198,77,254,217,253,208,3,192,242,140,196,140,1, + 85,206,61,84,61,2,234,254,196,254,67,1,189,1,60,1,61,1,192,254,64,254,195,1,117,2,15,253,241,254,139,254,140,253,244,2,12,2,177,85, + 206,110,138,139,110,206,206,110,139,138,110,206,254,7,135,135,139,197,197,139,83,119,119,0,0,7,0,170,255,106,7,173,6,110,0,3,0,7,0,18, + 0,29,0,41,0,53,0,70,0,0,1,37,55,13,1,39,37,23,1,52,54,51,50,22,20,6,35,34,38,37,52,54,50,22,21,20,6,35,34,38, + 5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,19,54,55,54,32,23,22,23,7,38,39,38,35,38,7,6, + 7,6,23,254,168,77,1,88,251,221,77,1,88,77,254,233,81,59,58,82,82,58,59,81,2,66,82,116,83,83,58,59,81,251,230,2,14,1,116,1, + 117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,236,37,50,182,2,4,182,51,36,115,28,40, + 142,202,202,142,39,29,4,22,240,111,241,110,110,241,111,254,175,59,81,81,118,82,83,58,59,81,81,59,58,83,83,145,1,117,2,15,253,241,254,139, + 254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,253,37,56,51,181,181,51,56,72,44,39,142,1,142,39,44,0,0, + 0,8,0,170,255,106,7,173,6,110,0,15,0,19,0,23,0,34,0,45,0,57,0,69,0,86,0,0,37,39,54,55,54,50,23,22,23,7,38,39, + 38,34,7,6,1,37,55,13,1,39,37,23,1,52,54,51,50,22,20,6,35,34,38,37,52,54,50,22,21,20,6,35,34,38,5,16,0,33,32,0, + 17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,19,54,55,54,32,23,22,23,7,38,39,38,35,38,7,6,7,3,213,121,16,24, + 70,196,70,24,16,121,7,8,30,84,30,8,2,59,254,168,77,1,88,251,221,77,1,88,77,254,233,81,59,58,82,82,58,59,81,2,66,82,116,83, + 83,58,59,81,251,230,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,236, + 37,50,182,2,4,182,51,36,115,28,40,142,202,202,142,39,29,159,57,40,34,98,98,34,40,57,19,16,60,60,16,3,100,240,111,241,110,110,241,111, + 254,175,59,81,81,118,82,83,58,59,81,81,59,58,83,83,145,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1, + 60,1,61,1,192,254,64,253,37,56,51,181,181,51,56,72,44,39,142,1,142,39,44,0,0,7,0,170,255,106,7,173,6,110,0,3,0,14,0,25, + 0,29,0,41,0,53,0,70,0,0,1,23,5,39,5,52,54,51,50,22,20,6,35,34,38,37,52,54,50,22,21,20,6,35,34,38,1,5,7,37, + 1,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,19,54,55,54,32,23,22,23,7,38,39,38,35,38,7,6, + 7,5,134,77,254,209,77,254,43,81,59,58,82,82,58,59,81,2,66,82,116,83,83,58,59,81,254,14,1,47,77,254,209,254,37,2,14,1,116,1, + 117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,236,37,50,182,2,4,182,51,36,115,28,40, + 142,202,202,142,39,29,5,103,110,213,111,222,59,81,81,118,82,83,58,59,81,81,59,58,83,83,1,236,212,111,213,253,241,1,117,2,15,253,241,254, + 139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,253,37,56,51,181,181,51,56,72,44,39,142,1,142,39,44,0, + 0,8,0,170,255,106,7,173,6,110,0,16,0,28,0,40,0,44,0,55,0,66,0,70,0,86,0,0,1,54,55,54,32,23,22,23,7,38,39,38, + 35,38,7,6,7,1,16,0,33,32,0,17,16,0,33,32,0,3,16,0,33,32,0,17,16,0,33,32,0,1,5,7,37,1,52,54,50,22,21,20, + 6,35,34,38,37,52,54,51,50,22,20,6,35,34,38,1,23,5,39,3,39,54,55,54,50,23,22,23,7,38,39,38,34,7,6,2,29,37,50,182, + 2,4,182,51,36,115,28,40,142,202,202,142,39,29,254,161,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,135,2,14,1,116,1,117,2, + 12,253,244,254,139,254,140,253,242,2,40,1,47,77,254,209,2,63,82,116,83,83,58,59,81,253,190,81,59,58,82,82,58,59,81,3,4,77,254,209, + 77,130,121,16,24,70,196,70,24,16,121,7,8,30,84,30,8,1,76,56,51,181,181,51,56,72,44,39,142,1,142,39,44,1,229,254,196,254,67,1, + 189,1,60,1,61,1,192,254,64,254,195,1,117,2,15,253,241,254,139,254,140,253,244,2,12,3,241,212,111,213,254,188,59,81,81,59,58,83,83,58, + 59,81,81,118,82,83,1,236,110,213,111,252,12,57,40,34,98,98,34,40,57,19,16,60,60,16,0,0,0,5,0,170,255,106,7,173,6,110,0,11, + 0,23,0,35,0,52,0,79,0,0,1,16,0,33,32,0,17,16,0,33,32,0,3,16,0,33,32,0,17,16,0,33,32,0,1,20,6,34,38,53, + 51,20,22,50,54,53,1,54,55,54,32,23,22,23,7,38,39,38,35,38,7,6,7,1,20,7,6,7,23,22,7,6,7,6,34,38,53,52,63,1, + 38,39,38,53,51,20,22,50,54,53,1,49,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,135,2,14,1,116,1,117,2,12,253,244,254, + 139,254,140,253,242,3,72,140,196,140,135,61,84,61,254,178,37,50,182,2,4,182,51,36,115,28,40,142,202,202,142,39,29,3,178,70,58,77,32,28, + 1,1,26,27,76,54,27,32,77,58,70,135,61,84,61,2,234,254,196,254,67,1,189,1,60,1,61,1,192,254,64,254,195,1,117,2,15,253,241,254, + 139,254,140,253,244,2,12,3,18,139,197,197,139,83,119,119,83,252,196,56,51,181,181,51,56,72,44,39,142,1,142,39,44,3,131,140,98,81,14,63, + 55,35,43,26,27,54,44,35,53,63,13,82,98,140,83,119,119,83,0,0,0,5,0,170,255,106,7,173,6,110,0,16,0,23,0,30,0,42,0,54, + 0,0,1,54,55,54,32,23,22,23,7,38,39,38,35,38,7,6,7,1,37,23,7,23,7,37,39,21,5,39,55,39,55,1,16,0,33,32,0,17, + 16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,2,29,37,50,182,2,4,182,51,36,115,28,40,142,202,202,142,39,29,1,236,1,39, + 77,198,198,77,254,217,160,254,217,77,198,198,77,253,245,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189, + 254,67,254,195,254,196,254,65,1,76,56,51,181,181,51,56,72,44,39,142,1,142,39,44,3,34,206,110,139,138,110,206,85,85,206,110,138,139,110,253, + 245,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,0,0,6,0,170,255,106,7,173, + 6,110,0,3,0,7,0,24,0,33,0,45,0,57,0,0,1,39,1,23,9,1,55,9,1,54,55,54,32,23,22,23,7,38,39,38,35,38,7,6, + 7,1,23,22,14,1,34,38,52,55,5,16,0,33,32,0,17,16,0,33,32,0,3,16,0,33,32,0,17,16,0,33,32,0,2,201,95,1,14,95, + 1,184,254,242,95,1,14,252,47,37,50,182,2,4,182,51,36,115,28,40,142,202,202,142,39,29,3,218,66,27,1,54,76,54,28,251,7,1,191,1, + 60,1,61,1,189,254,67,254,195,254,196,254,65,135,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,3,92,95,1,14,95,254,242,1,14, + 95,254,242,253,145,56,51,181,181,51,56,72,44,39,142,1,142,39,44,3,35,128,53,79,54,54,79,53,190,254,196,254,67,1,189,1,60,1,61,1, + 192,254,64,254,195,1,117,2,15,253,241,254,139,254,140,253,244,2,12,0,0,6,0,170,255,106,7,173,6,110,0,11,0,22,0,34,0,46,0,52, + 0,60,0,0,1,52,54,51,50,22,21,20,6,35,34,38,37,52,54,50,22,21,20,6,35,34,38,5,16,0,33,32,0,17,16,0,33,32,0,19, + 16,0,33,32,0,17,16,0,33,32,0,1,33,52,0,32,0,5,33,38,39,38,32,7,6,2,130,81,59,58,82,82,58,59,81,2,66,82,116,83, + 83,58,59,81,251,230,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,4, + 243,252,15,1,39,1,163,1,39,252,169,2,189,24,69,107,254,210,106,69,3,255,59,81,81,59,58,83,83,58,59,81,81,59,58,83,83,219,1,117, + 2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,252,164,232,1,70,254,186,97,96,76,116,117, + 76,0,0,0,0,8,0,170,255,106,7,173,6,110,0,3,0,7,0,18,0,29,0,41,0,53,0,59,0,67,0,0,1,37,55,13,1,39,37,23, + 1,52,54,51,50,22,20,6,35,34,38,37,52,54,50,22,21,20,6,35,34,38,5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0, + 17,16,0,33,32,0,1,33,52,0,32,0,5,33,38,39,38,32,7,6,6,23,254,168,77,1,88,251,221,77,1,88,77,254,233,81,59,58,82,82, + 58,59,81,2,66,82,116,83,83,58,59,81,251,230,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254, + 67,254,195,254,196,254,65,4,243,252,15,1,39,1,163,1,39,252,169,2,189,24,69,107,254,210,106,69,4,22,240,111,241,110,110,241,111,254,175,59, + 81,81,118,82,83,58,59,81,81,59,58,83,83,145,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61, + 1,192,254,64,252,164,232,1,70,254,186,97,96,76,116,117,76,0,0,0,0,14,0,170,255,106,7,173,6,110,0,11,0,19,0,25,0,78,0,90, + 0,102,0,108,0,120,0,132,0,138,0,144,0,150,0,156,0,162,0,0,1,20,22,51,50,54,53,52,38,35,34,6,1,33,38,39,38,32,7,6, + 5,33,52,0,32,0,1,16,0,33,32,0,17,52,39,21,35,17,38,39,17,35,53,14,1,34,39,35,53,38,52,55,17,38,39,17,35,17,6,7, + 17,22,20,7,21,35,6,34,38,39,21,35,17,6,7,17,35,53,6,7,16,0,33,32,0,17,16,0,33,32,0,1,52,54,51,50,22,21,20,6, + 35,34,38,37,54,55,53,6,7,1,52,38,35,34,6,21,20,22,51,50,54,39,20,6,35,34,38,53,52,54,51,50,22,1,21,22,23,53,38,39, + 38,39,21,54,55,37,38,39,21,22,23,37,6,7,21,54,55,37,6,7,21,22,23,4,150,116,74,85,105,111,79,76,114,254,55,2,189,24,69,107, + 254,210,106,69,3,63,252,15,1,39,1,163,1,39,251,13,1,191,1,60,1,61,1,189,53,68,30,37,68,30,109,142,56,68,43,43,33,34,68,34, + 33,43,43,68,56,142,110,29,68,37,30,68,54,135,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,4,113,34,23,24,33,31,26,22,35, + 253,158,32,35,35,32,1,9,114,76,79,111,105,85,74,116,133,35,22,26,31,33,24,23,34,2,31,36,31,32,103,33,34,31,36,1,14,33,34,43, + 24,252,79,35,32,25,42,1,14,34,33,36,31,4,26,82,108,117,73,79,111,111,252,233,96,76,116,117,76,230,232,1,70,254,186,1,55,254,196,254, + 67,1,189,1,60,155,133,186,1,59,46,41,254,110,89,54,71,36,64,60,156,60,1,61,4,1,253,106,2,150,1,4,254,195,60,156,60,64,36,70, + 55,89,1,147,42,46,254,197,188,134,156,1,117,2,15,253,241,254,139,254,140,253,244,2,12,2,164,24,33,33,24,22,35,32,252,10,1,162,15,18, + 254,145,79,111,111,79,73,117,108,82,25,32,35,22,24,33,33,1,121,163,1,10,140,19,40,10,8,242,20,9,38,30,24,132,33,45,210,25,29,156, + 45,33,253,7,11,195,9,20,0,8,0,170,255,106,7,173,6,110,0,3,0,7,0,11,0,15,0,27,0,39,0,45,0,53,0,0,1,39,1,23, + 9,1,55,9,1,39,1,23,9,1,55,1,5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,1,33,52,0, + 32,0,5,33,38,39,38,32,7,6,2,201,95,1,14,95,1,184,254,242,95,1,14,252,219,95,1,14,95,1,184,254,242,95,1,14,250,188,2,14, + 1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,4,243,252,15,1,39,1,163,1, + 39,252,169,2,189,24,69,107,254,210,106,69,4,19,95,1,14,95,254,242,1,14,95,254,242,254,88,95,1,14,95,254,242,1,14,95,254,242,63,1, + 117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,252,164,232,1,70,254,186,97,96,76,116, + 117,76,0,0,0,7,0,170,255,106,7,173,6,110,0,17,0,29,0,41,0,53,0,65,0,71,0,79,0,0,1,55,54,55,54,51,50,23,22,23, + 22,21,20,7,6,7,6,35,3,20,6,34,38,53,51,20,22,50,54,53,33,20,6,34,38,53,51,20,22,50,54,53,1,16,0,33,32,0,17,16, + 0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,1,33,52,0,32,0,5,33,38,39,38,32,7,6,5,196,85,37,31,25,22,13,13,36, + 18,10,5,12,39,31,59,18,140,196,140,135,61,84,61,254,55,140,196,140,135,61,84,61,253,63,2,14,1,116,1,117,2,12,253,244,254,139,254,140, + 253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,4,243,252,15,1,39,1,163,1,39,252,169,2,189,24,69,107,254,210,106,69, + 2,200,116,50,15,11,4,12,34,20,21,14,15,36,20,16,1,192,139,197,197,139,83,119,119,83,139,197,197,139,83,119,119,83,254,98,1,117,2,15, + 253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,252,164,232,1,70,254,186,97,96,76,116,117,76,0, + 0,6,0,170,255,106,7,173,6,110,0,6,0,13,0,25,0,37,0,43,0,51,0,0,1,37,23,7,23,7,37,39,21,5,39,55,39,55,1,16, + 0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,1,33,52,0,32,0,5,33,38,39,38,32,7,6,4,124,1,39, + 77,198,198,77,254,217,160,254,217,77,198,198,77,253,245,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189, + 254,67,254,195,254,196,254,65,4,243,252,15,1,39,1,163,1,39,252,169,2,189,24,69,107,254,210,106,69,4,39,206,110,139,138,110,206,85,85,206, + 110,138,139,110,253,245,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,252,164,232,1, + 70,254,186,97,96,76,116,117,76,0,0,0,0,5,0,95,255,106,8,249,6,110,0,5,0,12,0,19,0,61,0,98,0,0,37,33,52,0,32,0, + 1,21,5,39,55,39,55,5,37,23,7,23,7,37,5,16,0,33,32,0,17,20,7,23,22,23,22,21,20,6,34,39,38,47,1,2,7,0,33,32, + 1,38,3,7,6,7,6,34,38,53,52,55,54,63,1,38,55,16,0,33,32,0,17,52,39,6,35,34,39,38,47,1,23,22,23,38,39,38,33,32, + 7,6,7,54,63,1,7,6,7,6,34,39,6,6,164,252,15,1,39,1,163,1,39,253,184,254,217,77,198,198,77,1,199,1,39,77,198,198,77,254, + 217,252,46,2,14,1,116,1,117,2,12,2,93,59,24,30,54,76,31,25,18,11,42,209,254,250,254,139,254,140,254,249,209,43,10,18,25,31,76,54, + 30,23,60,92,2,135,1,191,1,60,1,61,1,189,1,27,37,38,31,25,18,45,136,41,24,47,154,222,254,194,254,196,224,154,47,24,41,136,45,18, + 25,31,76,27,1,203,232,1,70,254,186,2,116,85,206,110,138,139,110,206,206,110,139,138,110,206,232,1,117,2,15,253,241,254,139,29,27,31,20,24, + 31,37,38,54,31,25,57,32,254,233,209,254,250,1,6,208,1,22,30,57,25,31,54,38,37,31,25,19,30,28,29,254,196,254,67,1,189,1,60,20, + 19,26,31,25,57,136,45,14,15,199,154,224,224,155,198,16,13,45,136,57,25,31,27,20,0,5,0,170,255,106,7,173,6,110,0,7,0,19,0,30, + 0,42,0,54,0,0,0,52,54,50,22,20,6,34,1,52,54,51,50,22,21,20,6,35,34,38,37,52,54,50,22,21,20,6,35,34,38,5,16,0, + 33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,3,44,150,212,150,150,212,254,192,81,59,58,82,82,58,59,81,2,66, + 82,116,83,83,58,59,81,251,230,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196, + 254,65,1,90,212,150,150,212,150,3,59,59,81,81,59,58,83,83,58,59,81,81,59,58,83,83,219,1,117,2,15,253,241,254,139,254,140,253,244,2, + 12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,0,0,0,0,7,0,170,255,106,7,173,6,110,0,3,0,7,0,18,0,29,0,37, + 0,49,0,61,0,0,1,37,55,13,1,39,37,23,1,52,54,51,50,22,20,6,35,34,38,37,52,54,50,22,21,20,6,35,34,38,0,52,54,50, + 22,20,6,34,1,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,6,23,254,168,77,1,88,251,221,77,1,88, + 77,254,233,81,59,58,82,82,58,59,81,2,66,82,116,83,83,58,59,81,254,232,75,106,75,75,106,252,179,2,14,1,116,1,117,2,12,253,244,254, + 139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,4,22,240,111,241,110,110,241,111,254,175,59,81,81,118,82,83,58, + 59,81,81,59,58,83,83,254,20,106,75,75,106,75,1,166,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60, + 1,61,1,192,254,64,0,0,0,8,0,170,255,106,7,173,6,110,0,8,0,16,0,20,0,24,0,35,0,46,0,58,0,70,0,0,1,23,22,20, + 6,34,38,52,55,0,52,54,50,22,20,6,34,1,37,55,13,1,39,37,23,1,52,54,51,50,22,20,6,35,34,38,37,52,54,50,22,21,20,6, + 35,34,38,5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,6,80,65,27,54,76,54,27,253,29,150,212,150, + 150,212,2,85,254,168,77,1,88,251,221,77,1,88,77,254,233,81,59,58,82,82,58,59,81,2,66,82,116,83,83,58,59,81,251,230,2,14,1,116, + 1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,3,172,128,53,79,54,54,79,53,254,46, + 212,150,150,212,150,3,82,240,111,241,110,110,241,111,254,175,59,81,81,118,82,83,58,59,81,81,59,58,83,83,145,1,117,2,15,253,241,254,139,254, + 140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,0,0,0,0,7,0,35,255,60,8,53,6,110,0,7,0,15,0,19, + 0,23,0,31,0,107,0,148,0,0,0,38,52,54,50,22,20,6,32,38,52,54,50,22,20,6,37,39,37,23,5,37,55,5,0,52,54,50,22,20, + 6,34,1,53,46,1,39,2,17,52,54,55,54,55,0,32,1,22,23,30,1,21,16,3,14,1,7,21,35,53,52,55,54,55,54,19,52,38,34,6, + 7,6,7,6,15,1,14,1,29,1,35,53,6,32,39,21,35,53,52,38,47,1,38,39,38,39,46,1,34,6,21,18,23,22,23,22,29,1,37,22, + 32,55,53,52,55,54,55,54,55,54,55,62,1,55,54,55,54,55,38,39,38,32,7,6,7,22,23,30,2,23,22,23,22,23,22,23,22,21,5,21, + 81,82,116,83,83,253,73,81,81,117,82,82,254,249,77,1,88,77,2,126,254,168,77,1,88,252,200,150,212,150,150,212,253,161,72,86,24,138,104,61, + 59,174,1,7,2,233,1,6,174,59,61,104,138,24,86,72,135,38,129,29,122,2,39,58,37,6,14,105,41,56,94,39,27,136,110,254,251,121,136,27, + 39,94,56,41,105,14,6,37,58,39,2,122,29,129,38,1,76,119,1,9,108,27,48,145,56,17,60,17,2,8,12,12,51,15,17,50,143,222,253,134, + 224,143,51,18,15,51,24,8,2,17,60,17,56,145,48,27,3,40,83,117,81,81,117,83,83,117,81,81,118,82,238,110,241,111,240,240,111,241,252,214, + 212,150,150,212,150,254,120,203,62,91,49,1,23,1,39,83,107,10,223,176,1,8,254,248,175,224,10,107,83,254,217,254,233,49,91,62,203,231,36,31, + 110,57,240,1,18,28,40,35,109,243,113,44,37,64,28,60,63,251,76,30,32,78,251,63,60,28,64,37,44,113,243,109,35,40,28,254,238,240,57,110, + 31,36,231,219,38,37,33,89,59,101,86,34,19,68,120,15,134,56,54,48,14,10,181,144,224,224,143,181,11,14,48,110,134,15,120,68,19,34,86,101, + 59,89,0,0,0,9,0,170,255,106,7,173,6,110,0,11,0,23,0,35,0,47,0,59,0,71,0,79,0,91,0,103,0,0,1,20,6,35,34,38, + 53,52,54,51,50,22,23,52,54,51,50,22,21,20,6,35,34,38,55,20,22,51,50,54,53,52,38,35,34,6,23,52,54,51,50,22,21,20,6,35, + 34,38,37,52,38,35,34,6,21,20,22,51,50,54,39,20,6,35,34,38,53,52,54,51,50,22,2,52,54,50,22,20,6,34,1,16,0,33,32,0, + 17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,3,242,146,92,106,132,139,99,95,143,116,143,95,99,139,132,106,92,146,48,116,74, + 85,105,111,79,76,114,133,34,23,24,33,31,26,22,35,254,167,114,76,79,111,105,85,74,116,133,35,22,26,31,33,24,23,34,17,150,212,150,150,212, + 252,232,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,4,26,102,136,147, + 91,99,139,139,99,99,139,139,99,91,147,136,102,82,108,117,73,79,111,111,79,24,33,33,24,22,35,32,25,79,111,111,79,73,117,108,82,25,32,35, + 22,24,33,33,253,40,212,150,150,212,150,2,38,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1, + 192,254,64,0,0,10,0,170,255,106,7,173,6,110,0,74,0,86,0,94,0,98,0,102,0,107,0,112,0,116,0,121,0,126,0,0,1,16,0,33, + 32,0,17,52,39,17,35,17,38,39,21,23,7,17,35,53,35,21,35,53,35,21,35,53,35,21,35,17,51,17,51,17,39,55,23,53,38,32,7,21, + 55,23,7,17,51,17,51,17,35,53,35,21,35,53,35,21,35,53,35,21,35,17,39,55,53,6,7,17,35,17,6,7,16,0,33,32,0,17,16,0, + 33,32,0,36,52,54,50,22,20,6,34,19,17,51,17,1,51,53,39,23,51,53,7,39,17,21,23,53,38,1,53,7,21,3,6,7,21,55,17,53, + 7,39,21,1,49,1,191,1,60,1,61,1,189,64,68,30,38,6,6,68,52,68,68,68,68,68,68,68,91,77,150,167,254,98,167,150,77,91,68,68, + 68,68,68,68,68,52,68,6,6,37,31,68,65,135,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,3,2,75,106,75,75,106,19,68,1, + 16,68,68,136,52,3,49,52,25,252,249,68,68,27,25,52,49,3,2,234,254,196,254,67,1,189,1,60,170,143,254,133,1,243,44,40,103,4,9,254, + 45,136,136,136,136,136,136,2,56,254,215,1,16,63,111,105,123,96,96,123,105,111,63,254,240,1,41,253,200,136,136,136,136,136,136,1,211,9,4,104, + 40,44,254,12,1,125,144,171,1,117,2,15,253,241,254,139,254,140,253,244,2,12,25,106,75,75,106,75,1,100,2,56,253,200,1,15,177,47,224,99, + 4,34,1,35,127,36,122,22,254,111,224,47,177,1,164,19,23,121,36,254,219,129,34,4,99,0,0,0,0,8,0,170,255,106,12,113,7,108,0,9, + 0,19,0,29,0,37,0,49,0,61,0,73,0,85,0,0,1,33,21,3,51,21,33,53,19,35,37,33,21,3,51,21,33,53,19,35,37,33,21,3, + 51,21,33,53,19,35,0,52,54,50,22,20,6,34,1,20,6,34,38,53,51,20,22,50,54,53,33,20,6,34,38,53,51,20,22,50,54,53,1,16, + 0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,10,246,1,123,248,248,254,123,248,238,254,23,1,123,248,248,254,123, + 248,238,254,23,1,123,248,248,254,123,248,238,252,136,75,106,75,75,106,2,75,140,196,140,135,61,84,61,254,55,140,196,140,135,61,84,61,253,63,2, + 14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,7,108,104,254,244,92,104,1, + 12,92,104,254,244,92,104,1,12,92,104,254,244,92,104,1,12,250,127,106,75,75,106,75,3,68,139,197,197,139,83,119,119,83,139,197,197,139,83,119, + 119,83,254,98,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,0,0,0,5,0,170, + 255,106,7,173,6,110,0,11,0,23,0,35,0,43,0,55,0,0,1,39,55,39,55,23,55,23,7,23,7,39,5,16,0,33,32,0,17,16,0,33, + 32,0,3,16,0,33,32,0,17,16,0,33,32,0,4,52,54,50,22,20,6,34,1,39,55,39,55,23,55,23,7,23,7,39,2,149,95,113,113,95, + 113,114,95,113,113,95,114,254,43,1,191,1,60,1,61,1,189,254,67,254,195,254,196,254,65,135,2,14,1,116,1,117,2,12,253,244,254,139,254,140, + 253,242,2,130,150,212,150,150,212,1,30,95,113,113,95,113,114,95,113,113,95,114,3,40,95,113,114,95,113,113,95,114,113,95,113,175,254,196,254,67, + 1,189,1,60,1,61,1,192,254,64,254,195,1,117,2,15,253,241,254,139,254,140,253,244,2,12,28,212,150,150,212,150,2,100,95,113,114,95,113,113, + 95,114,113,95,113,0,0,0,0,4,0,170,255,106,7,173,6,110,0,10,0,21,0,33,0,45,0,0,1,52,54,51,50,22,20,6,35,34,38,37, + 52,54,50,22,21,20,6,35,34,38,5,16,0,33,32,0,17,16,0,33,32,0,19,16,0,33,32,0,17,16,0,33,32,0,2,130,81,59,58,82, + 82,58,59,81,2,66,82,116,83,83,58,59,81,251,230,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253,242,135,1,191,1,60,1,61,1,189, + 254,67,254,195,254,196,254,65,3,253,59,81,81,118,82,83,58,59,81,81,59,58,83,83,217,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1, + 116,254,196,254,67,1,189,1,60,1,61,1,192,254,64,0,0,10,0,170,255,106,7,173,6,110,0,11,0,15,0,19,0,23,0,27,0,31,0,36, + 0,40,0,44,0,55,0,0,19,16,0,33,32,0,17,16,0,33,32,0,1,53,33,21,51,53,33,21,37,39,37,23,5,37,55,5,1,33,17,33, + 1,33,22,33,32,37,54,19,7,1,17,39,18,1,2,39,38,33,32,7,6,3,23,33,170,2,14,1,116,1,117,2,12,253,244,254,139,254,140,253, + 242,1,108,1,170,216,1,170,251,255,77,1,88,77,2,126,254,168,77,1,88,252,57,3,30,252,226,3,84,252,118,196,1,1,1,2,1,20,203,22, + 225,251,212,226,22,5,215,27,190,222,254,194,254,196,224,190,28,224,4,44,2,234,1,117,2,15,253,241,254,139,254,140,253,244,2,12,1,186,135,135, + 135,135,230,110,241,111,240,240,111,241,252,135,1,24,254,97,147,217,201,1,17,158,254,196,1,60,158,254,239,1,179,1,2,191,224,224,191,254,255,157, + 0,9,0,58,255,106,8,38,7,20,0,8,0,29,0,82,0,143,0,157,0,171,0,181,0,187,0,193,0,0,0,50,55,23,6,35,34,39,55,23, + 22,51,50,55,22,21,20,7,6,4,32,36,39,38,53,52,55,22,51,50,1,20,23,37,23,5,22,23,37,23,5,22,23,22,23,22,32,55,54,55, + 54,55,37,55,5,54,55,37,55,5,54,53,52,46,2,39,38,39,6,7,38,35,34,7,38,39,6,7,14,3,7,38,53,52,62,3,55,54,63,1, + 23,30,1,23,54,50,23,62,1,63,1,23,22,23,30,4,21,20,7,23,7,39,6,7,23,7,39,6,7,2,7,6,33,32,39,38,3,38,39,7, + 39,55,38,39,7,39,37,52,46,1,34,14,1,21,35,52,54,50,22,21,33,52,46,1,34,14,1,21,35,52,54,50,22,21,1,38,39,6,7,21, + 22,51,50,63,1,21,54,55,6,35,5,53,35,34,39,22,3,236,130,92,62,120,99,101,118,62,160,114,116,158,146,5,29,54,254,237,254,156,254,236, + 59,35,3,149,160,121,253,93,7,1,77,5,254,180,8,14,1,52,22,254,200,18,22,102,163,181,1,234,181,161,103,26,16,254,205,22,1,46,14,8, + 254,186,5,1,71,6,10,10,22,4,27,42,243,153,116,155,157,116,153,243,42,27,5,21,11,10,128,5,7,19,12,31,5,23,38,15,60,143,253,93, + 105,226,105,93,253,143,59,16,38,23,5,31,12,19,7,5,105,4,107,8,21,104,22,100,19,27,116,192,217,254,224,254,223,217,192,116,29,16,94,22, + 98,20,9,101,4,3,49,21,49,66,49,21,135,140,196,140,1,201,21,49,66,49,21,135,140,196,140,254,58,36,40,26,50,43,36,41,32,136,96,51, + 72,58,254,71,21,63,63,52,2,252,46,120,61,61,120,252,37,66,32,25,68,71,129,147,143,125,75,83,23,23,66,1,199,36,98,21,67,22,74,65, + 105,63,108,58,49,226,119,132,132,118,227,56,53,106,63,103,62,76,21,67,21,82,52,46,102,62,118,25,161,167,58,196,21,21,196,58,167,161,27,114, + 65,101,189,77,69,57,106,119,65,147,24,117,140,58,9,22,137,97,13,13,97,137,22,9,58,140,117,24,147,65,119,106,57,68,77,7,68,7,86,87, + 36,64,34,60,60,254,253,140,158,158,140,1,3,64,54,32,64,34,79,96,7,68,81,43,90,69,69,89,44,140,196,196,140,43,90,69,69,89,44,140, + 196,196,140,254,3,7,11,7,10,145,5,4,132,99,39,70,10,97,97,9,67,0,0,0,0,9,0,96,255,106,8,248,7,20,0,63,0,72,0,93, + 0,168,0,182,0,196,0,206,0,212,0,218,0,0,1,54,53,52,46,2,39,38,39,6,7,38,32,7,38,39,6,7,14,3,21,20,23,54,63,1, + 7,14,1,35,34,39,22,23,37,23,5,22,23,22,23,22,32,55,54,55,54,55,37,55,5,54,55,6,35,34,38,47,1,23,22,4,50,55,23,6, + 35,34,39,55,23,22,51,50,55,22,21,20,7,6,4,32,36,39,38,53,52,55,22,51,50,5,34,38,53,52,54,63,1,52,39,7,39,55,38,53, + 52,62,3,55,54,63,1,23,30,1,23,54,50,23,62,1,63,1,23,22,23,30,4,21,20,7,23,7,39,6,7,23,30,1,21,20,6,35,34,38, + 47,1,6,7,2,7,6,32,39,38,3,38,39,7,6,1,52,46,1,34,14,1,21,35,52,54,50,22,21,33,52,46,1,34,14,1,21,35,52,54, + 50,22,21,1,38,39,6,7,21,22,51,50,63,1,21,54,55,6,35,5,53,35,34,39,22,7,186,2,10,10,22,4,26,42,242,154,116,254,200,116, + 152,244,42,28,5,21,10,10,2,24,80,136,44,17,51,44,48,28,8,16,1,52,22,254,200,18,22,102,164,181,1,233,182,162,102,26,16,254,204,22, + 1,46,16,8,28,48,44,52,16,46,138,82,252,200,130,92,62,120,98,102,118,62,160,114,116,158,146,6,30,54,254,238,254,156,254,236,60,34,2,150, + 160,120,252,124,37,55,62,52,90,8,102,4,100,6,8,18,12,32,4,24,38,14,60,143,253,94,105,225,106,93,253,142,60,16,38,22,5,31,12,20, + 6,4,104,4,106,6,4,90,52,60,54,36,44,52,18,14,24,44,116,192,216,253,192,218,192,116,42,26,16,36,2,228,22,48,66,50,20,136,140,196, + 140,1,202,22,48,66,50,20,136,140,196,140,254,58,36,40,26,50,44,36,40,32,136,96,52,72,58,254,70,20,62,64,52,3,124,40,44,46,102,62, + 118,25,161,167,58,196,21,21,196,58,167,161,27,114,65,101,46,42,39,44,25,44,136,51,60,37,87,76,105,63,108,58,49,226,119,132,132,118,227,56, + 53,106,63,103,68,96,40,60,51,136,44,25,175,46,120,61,61,120,252,37,66,32,25,68,71,129,147,143,125,75,83,23,23,66,65,54,37,44,52,17, + 29,3,74,7,68,6,77,69,57,106,119,65,147,24,117,140,58,9,22,137,97,13,13,97,137,22,9,58,140,117,24,147,65,119,106,57,68,77,7,68, + 7,52,25,29,17,52,44,37,54,60,51,42,104,98,254,253,140,158,158,140,1,3,93,112,45,111,1,196,43,90,69,69,89,44,140,196,196,140,43,90, + 69,69,89,44,140,196,196,140,254,3,7,11,7,10,145,5,4,132,99,39,70,10,97,97,9,67,0,0,0,9,0,58,255,106,8,38,7,20,0,8, + 0,29,0,42,0,95,0,156,0,170,0,180,0,195,0,208,0,0,0,50,55,23,6,35,34,39,55,23,22,51,50,55,22,21,20,7,6,4,32,36, + 39,38,53,52,55,22,51,50,23,6,35,34,39,30,1,50,54,55,6,35,34,1,20,23,37,23,5,22,23,37,23,5,22,23,22,23,22,32,55,54, + 55,54,55,37,55,5,54,55,37,55,5,54,53,52,46,2,39,38,39,6,7,38,35,34,7,38,39,6,7,14,3,7,38,53,52,62,3,55,54,63, + 1,23,30,1,23,54,50,23,62,1,63,1,23,22,23,30,4,21,20,7,23,7,39,6,7,23,7,39,6,7,2,7,6,33,32,39,38,3,38,39, + 7,39,55,38,39,7,39,37,52,54,51,50,22,23,6,7,6,35,34,39,38,55,34,6,21,20,23,62,1,55,38,5,20,7,6,35,34,39,38,39, + 54,55,54,51,50,22,7,22,51,50,55,54,53,52,39,38,35,34,6,3,236,130,92,62,120,99,101,118,62,160,114,116,158,146,5,29,54,254,237,254, + 156,254,236,59,35,3,149,160,121,112,114,119,63,63,53,192,234,189,50,72,58,117,252,125,7,1,77,5,254,180,8,14,1,52,22,254,200,18,22,102, + 163,181,1,234,181,161,103,26,16,254,205,22,1,46,14,8,254,186,5,1,71,6,10,10,22,4,27,42,243,153,116,155,157,116,153,243,42,27,5,21, + 11,10,128,5,7,19,12,31,5,23,38,15,60,143,253,93,105,226,105,93,253,143,59,16,38,23,5,31,12,19,7,5,105,4,107,8,21,104,22,100, + 19,27,116,192,217,254,224,254,223,217,192,116,29,16,94,22,98,20,9,101,4,1,226,99,67,62,93,7,48,76,33,40,67,56,8,253,36,48,5,43, + 69,18,21,2,255,8,56,67,37,36,77,47,8,50,45,59,67,99,164,12,26,46,42,16,4,12,13,44,64,2,252,46,120,61,61,120,252,37,66,32, + 25,68,71,129,147,143,125,75,83,23,23,66,104,31,9,69,76,77,69,10,2,78,36,98,21,67,22,74,65,105,63,108,58,49,226,119,132,132,118,227, + 56,53,106,63,103,62,76,21,67,21,82,52,46,102,62,118,25,161,167,58,196,21,21,196,58,167,161,27,114,65,101,189,77,69,57,106,119,65,147,24, + 117,140,58,9,22,137,97,13,13,97,137,22,9,58,140,117,24,147,65,119,106,57,68,77,7,68,7,86,87,36,64,34,60,60,254,253,140,158,158,140, + 1,3,64,54,32,64,34,79,96,7,68,159,70,95,87,59,69,24,11,33,23,73,43,32,13,13,6,47,33,15,45,29,23,33,12,25,67,66,42,38, + 95,122,3,20,21,25,12,11,3,53,0,0,0,6,0,61,255,106,8,29,7,20,0,17,0,25,0,74,0,131,0,152,0,173,0,0,1,55,22,51, + 50,55,22,51,50,55,23,6,35,34,39,6,35,34,1,23,6,34,39,55,22,50,37,54,53,52,46,2,39,38,39,6,7,38,35,34,7,38,39,6, + 7,14,3,21,20,23,37,23,5,22,23,37,23,5,22,23,22,32,55,54,55,37,55,5,54,55,37,55,5,38,53,52,62,3,55,54,63,1,23,30, + 1,23,54,50,23,62,1,63,1,23,22,23,30,4,21,20,7,23,7,39,6,7,23,7,39,2,7,6,33,32,39,38,3,7,39,55,38,39,7,39, + 1,62,1,51,50,22,21,20,15,1,35,39,38,39,52,54,51,50,23,22,21,37,50,22,23,51,52,55,54,51,50,22,21,6,15,1,35,39,38,53, + 52,54,2,166,92,69,91,58,84,84,58,91,69,92,108,144,74,68,69,73,144,1,184,62,122,194,122,62,90,134,2,186,18,10,10,22,4,27,42,243, + 153,116,155,157,116,153,243,42,27,5,21,11,10,18,1,66,10,254,191,14,23,1,30,26,254,225,103,164,181,1,234,181,164,103,254,225,26,1,30,21, + 15,254,192,10,250,192,17,7,19,12,31,5,23,38,15,60,143,253,93,105,226,105,93,253,143,59,16,38,23,5,31,12,19,7,17,108,10,109,15,32, + 110,26,109,117,195,217,254,224,254,223,217,193,118,109,26,109,30,16,109,10,2,227,10,58,45,46,62,62,159,2,168,49,2,64,47,61,35,13,1,168, + 45,58,10,1,13,35,61,47,64,2,49,168,2,159,62,62,1,140,98,64,44,44,64,98,100,28,28,1,168,120,61,61,120,46,56,130,116,46,102,62, + 118,25,161,167,58,196,21,21,196,58,167,161,27,114,65,101,46,116,130,43,66,44,69,64,121,62,122,231,119,132,132,119,231,122,62,121,57,76,44,66, + 61,124,143,57,106,119,65,147,24,117,140,58,9,22,137,97,13,13,97,137,22,9,58,140,117,24,147,65,119,106,57,143,124,15,66,14,81,87,46,62, + 46,254,247,142,158,158,140,1,11,46,62,46,81,87,14,66,1,149,48,66,61,49,74,74,190,207,61,66,42,72,71,27,16,114,66,48,16,27,71,72, + 42,66,61,207,190,74,74,49,61,0,0,0,0,10,0,61,255,106,8,29,7,20,0,3,0,7,0,15,0,30,0,40,0,55,0,68,0,117,0,174, + 0,184,0,0,1,5,7,45,1,23,5,39,19,23,6,34,39,55,22,50,1,6,7,6,35,34,39,38,53,52,55,54,51,50,22,7,34,6,21,20, + 23,62,1,55,38,5,62,1,51,50,23,22,21,20,7,6,35,34,39,38,23,22,51,50,55,54,53,52,39,38,35,34,6,5,54,53,52,46,2,39, + 38,39,6,7,38,35,34,7,38,39,6,7,14,3,21,20,23,37,23,5,22,23,37,23,5,22,23,22,32,55,54,55,37,55,5,54,55,37,55,5, + 38,53,52,62,3,55,54,63,1,23,30,1,23,54,50,23,62,1,63,1,23,22,23,30,4,21,20,7,23,7,39,6,7,23,7,39,2,7,6,33, + 32,39,38,3,7,39,55,38,39,7,39,1,50,55,54,55,23,6,7,6,33,2,210,1,47,77,254,209,3,1,77,254,209,77,115,62,122,194,122,62, + 90,134,254,252,43,81,32,40,70,54,21,53,47,65,70,101,78,36,48,5,43,69,18,22,1,184,5,100,70,66,47,53,21,54,70,40,32,81,121,12, + 26,48,40,16,4,12,13,44,64,1,147,18,10,10,22,4,27,42,243,153,116,155,157,116,153,243,42,27,5,21,11,10,18,1,66,10,254,191,14,23, + 1,30,26,254,225,103,164,181,1,234,181,164,103,254,225,26,1,30,21,15,254,192,10,250,192,17,7,19,12,31,5,23,38,15,60,143,253,93,105,226, + 105,93,253,143,59,16,38,23,5,31,12,19,7,17,108,10,109,15,32,110,26,109,117,195,217,254,224,254,223,217,193,118,109,26,109,30,16,109,10,3, + 239,202,142,40,28,115,34,53,181,254,253,5,103,212,111,213,110,110,213,111,254,61,120,61,61,120,46,1,6,76,28,11,35,36,45,71,48,44,97,38, + 48,36,14,15,7,52,37,17,29,67,97,44,48,71,45,36,35,11,28,4,3,22,24,28,14,12,3,59,167,130,116,46,102,62,118,25,161,167,58,196, + 21,21,196,58,167,161,27,114,65,101,46,116,130,43,66,44,69,64,121,62,122,231,119,132,132,119,231,122,62,121,57,76,44,66,61,124,143,57,106,119, + 65,147,24,117,140,58,9,22,137,97,13,13,97,137,22,9,58,140,117,24,147,65,119,106,57,143,124,15,66,14,81,87,46,62,46,254,247,142,158,158, + 140,1,11,46,62,46,81,87,14,66,254,127,142,40,43,72,54,53,181,0,0,8,0,61,255,106,8,29,7,20,0,14,0,24,0,39,0,52,0,105, + 0,168,0,181,0,190,0,0,1,6,7,6,35,34,39,38,53,52,55,54,51,50,22,7,34,6,21,20,23,62,1,55,38,5,62,1,51,50,23,22, + 21,20,7,6,35,34,39,38,23,22,51,50,55,54,53,52,39,38,35,34,6,5,54,53,52,46,2,39,38,39,6,7,38,35,34,7,38,39,6,7, + 14,3,21,20,23,22,23,37,23,5,22,23,37,23,5,23,22,23,22,32,55,54,63,1,37,55,5,54,55,37,55,0,50,23,62,1,63,1,23,22, + 23,30,4,21,20,6,21,6,7,23,7,39,6,7,23,7,39,7,2,7,6,33,32,39,38,3,39,7,39,55,38,39,7,39,55,38,39,53,52,62, + 3,55,54,63,1,23,30,1,23,19,55,39,55,5,21,7,23,21,5,39,55,39,2,50,55,23,6,35,34,39,55,3,108,43,81,32,40,70,54,21, + 53,47,65,70,101,78,36,48,5,43,69,18,22,1,184,5,100,70,66,47,53,21,54,70,40,32,81,121,12,26,48,40,16,4,12,13,44,64,1,147, + 18,10,10,22,4,27,42,243,153,116,155,157,116,153,243,42,27,5,21,11,10,2,7,9,1,66,10,254,191,14,23,1,30,26,254,225,2,102,163,181, + 1,234,181,161,103,3,254,225,26,1,30,21,15,254,192,10,253,211,226,105,93,253,143,59,16,38,23,5,31,12,19,7,1,3,13,108,10,109,15,32, + 110,26,109,4,116,192,217,254,224,254,223,217,192,116,3,109,26,109,30,16,109,10,108,14,3,7,19,12,31,5,23,38,15,60,143,253,93,163,80,144, + 65,1,3,60,60,254,253,65,144,80,11,132,91,62,119,100,101,118,62,3,168,76,28,11,35,36,45,71,48,44,97,38,48,36,14,15,7,52,37,17, + 29,67,97,44,48,71,45,36,35,11,28,4,3,22,24,28,14,12,3,59,167,131,115,46,102,62,118,25,161,167,58,196,21,21,196,58,167,161,27,114, + 65,101,46,15,36,130,65,43,66,44,69,64,121,62,122,5,226,119,132,132,118,227,5,122,62,121,57,76,44,66,3,19,13,97,137,22,9,58,140,117, + 24,147,65,119,106,57,7,28,7,138,87,15,66,14,81,87,46,62,46,8,254,253,140,158,158,140,1,3,8,46,62,46,81,87,14,66,15,96,129,42, + 57,106,119,65,147,24,117,140,58,9,22,137,97,251,58,61,78,119,141,89,46,45,89,141,119,78,61,1,218,46,120,61,61,120,0,0,0,11,0,61, + 255,106,8,29,7,20,0,14,0,24,0,39,0,52,0,101,0,158,0,166,0,175,0,184,0,188,0,192,0,0,1,6,7,6,35,34,39,38,53,52, + 55,54,51,50,22,7,34,6,21,20,23,62,1,55,38,5,62,1,51,50,23,22,21,20,7,6,35,34,39,38,23,22,51,50,55,54,53,52,39,38, + 35,34,6,5,54,53,52,46,2,39,38,39,6,7,38,35,34,7,38,39,6,7,14,3,21,20,23,37,23,5,22,23,37,23,5,22,23,22,32,55, + 54,55,37,55,5,54,55,37,55,5,38,53,52,62,3,55,54,63,1,23,30,1,23,54,50,23,62,1,63,1,23,22,23,30,4,21,20,7,23,7, + 39,6,7,23,7,39,2,7,6,33,32,39,38,3,7,39,55,38,39,7,39,1,54,50,23,7,38,34,7,37,54,32,23,7,38,35,34,7,0,50, + 55,23,6,35,34,39,55,1,23,5,39,37,5,7,37,3,108,43,81,32,40,70,54,21,53,47,65,70,101,78,36,48,5,43,69,18,22,1,184,5, + 100,70,66,47,53,21,54,70,40,32,81,121,12,26,48,40,16,4,12,13,44,64,1,147,18,10,10,22,4,27,42,243,153,116,155,157,116,153,243,42, + 27,5,21,11,10,18,1,66,10,254,191,14,23,1,30,26,254,225,103,164,181,1,234,181,164,103,254,225,26,1,30,21,15,254,192,10,250,192,17,7, + 19,12,31,5,23,38,15,60,143,253,93,105,226,105,93,253,143,59,16,38,23,5,31,12,19,7,17,108,10,109,15,32,110,26,109,117,195,217,254,224, + 254,223,217,193,118,109,26,109,30,16,109,10,3,71,70,196,70,96,30,84,30,254,144,181,2,6,181,96,142,202,200,144,1,23,132,91,62,119,100,101, + 118,62,1,246,77,254,209,77,254,123,1,47,77,254,209,3,168,76,28,11,35,36,45,71,48,44,97,38,48,36,14,15,7,52,37,17,29,67,97,44, + 48,71,45,36,35,11,28,4,3,22,24,28,14,12,3,59,167,130,116,46,102,62,118,25,161,167,58,196,21,21,196,58,167,161,27,114,65,101,46,116, + 130,43,66,44,69,64,121,62,122,231,119,132,132,119,231,122,62,121,57,76,44,66,61,124,143,57,106,119,65,147,24,117,140,58,9,22,137,97,13,13, + 97,137,22,9,58,140,117,24,147,65,119,106,57,143,124,15,66,14,81,87,46,62,46,254,247,142,158,158,140,1,11,46,62,46,81,87,14,66,254,19, + 99,99,95,60,60,245,181,181,96,142,142,1,250,46,120,61,61,120,2,61,110,213,111,212,212,111,213,0,0,5,0,61,255,106,8,29,7,20,0,32, + 0,44,0,52,0,100,0,142,0,0,1,20,6,7,23,22,20,6,34,38,53,52,53,6,34,39,55,22,50,55,23,54,63,1,46,1,53,51,20,22, + 50,54,53,33,20,6,34,38,53,51,20,22,50,54,53,3,54,32,23,7,38,32,7,1,38,16,54,63,1,54,63,1,23,30,1,23,54,50,23,62, + 1,63,1,23,22,31,1,30,1,20,7,23,7,39,6,7,23,7,39,2,0,32,0,3,7,39,55,38,39,7,39,5,18,33,50,36,55,37,55,5, + 54,55,37,55,5,54,53,52,47,1,38,39,6,7,38,32,7,38,39,6,15,1,6,21,20,23,37,23,5,22,23,37,23,6,66,128,77,32,27,54, + 76,54,110,194,118,62,91,132,91,51,7,15,32,77,128,135,61,84,61,254,55,140,196,140,135,61,84,61,247,181,2,6,181,96,142,254,110,144,253,213, + 17,32,22,20,23,38,15,60,143,253,93,105,226,105,93,253,143,59,16,38,23,20,43,11,17,108,10,109,15,32,110,26,109,117,254,100,253,191,254,102, + 118,109,26,109,30,16,109,10,1,59,215,1,222,245,1,89,103,254,225,26,1,30,21,15,254,192,10,1,65,18,26,30,16,43,243,153,116,254,200,116, + 153,243,42,27,16,32,19,1,66,10,254,191,14,23,1,30,26,4,136,139,180,14,63,53,79,54,54,44,3,3,53,61,120,46,46,99,24,29,63,14, + 180,139,83,119,119,83,139,197,197,139,83,119,119,83,252,218,181,181,96,142,142,1,198,124,1,6,196,106,97,117,140,58,9,22,137,97,13,13,97,137, + 22,9,58,140,117,97,204,160,200,124,15,66,14,81,87,46,62,46,254,247,254,212,1,42,1,11,46,62,46,81,87,14,66,230,254,30,251,231,122,62, + 121,57,76,44,66,43,130,81,136,141,174,98,167,58,196,21,21,196,58,167,161,84,168,110,107,130,43,66,44,69,64,121,62,0,0,0,0,6,0,61, + 255,106,8,29,7,20,0,52,0,115,0,123,0,131,0,135,0,139,0,0,1,54,53,52,46,2,39,38,39,6,7,38,35,34,7,38,39,6,7,14, + 3,21,20,23,22,23,37,23,5,22,23,37,23,5,23,22,23,22,32,55,54,63,1,37,55,5,54,55,37,55,0,50,23,62,1,63,1,23,22,23, + 30,4,21,20,6,21,6,7,23,7,39,6,7,23,7,39,7,2,7,6,33,32,39,38,3,39,7,39,55,38,39,7,39,55,38,39,53,52,62,3, + 55,54,63,1,23,30,1,23,3,33,38,39,38,32,7,6,5,33,52,55,54,51,50,0,3,1,55,1,5,39,1,23,7,42,18,10,10,22,4,27, + 42,243,153,116,155,157,116,153,243,42,27,5,21,11,10,2,7,9,1,66,10,254,191,14,23,1,30,26,254,225,2,102,163,181,1,234,181,161,103,3, + 254,225,26,1,30,21,15,254,192,10,253,211,226,105,93,253,143,59,16,38,23,5,31,12,19,7,1,3,13,108,10,109,15,32,110,26,109,4,116,192, + 217,254,224,254,223,217,192,116,3,109,26,109,30,16,109,10,108,14,3,7,19,12,31,5,23,38,15,60,143,253,93,134,2,189,24,69,107,254,210,106, + 69,3,63,252,15,147,147,210,209,1,40,149,254,242,95,1,14,252,219,95,1,14,95,2,218,131,115,46,102,62,118,25,161,167,58,196,21,21,196,58, + 167,161,27,114,65,101,46,15,36,130,65,43,66,44,69,64,121,62,122,5,226,119,132,132,118,227,5,122,62,121,57,76,44,66,3,19,13,97,137,22, + 9,58,140,117,24,147,65,119,106,57,7,28,7,138,87,15,66,14,81,87,46,62,46,8,254,253,140,158,158,140,1,3,8,46,62,46,81,87,14,66, + 15,96,129,42,57,106,119,65,147,24,117,140,58,9,22,137,97,251,71,97,75,116,117,75,231,231,164,163,254,186,1,126,1,14,95,254,242,95,95,1, + 14,95,0,0,0,1,255,185,4,154,0,199,6,18,0,3,0,10,64,3,0,3,4,0,16,212,204,48,17,51,3,35,199,117,153,6,18,254,136,0, + 0,2,252,215,5,14,255,41,5,217,0,3,0,7,0,165,64,13,4,0,206,6,2,8,1,100,0,5,100,4,8,16,212,252,220,236,49,0,16,212, + 60,236,50,48,0,75,176,14,84,75,176,17,84,91,88,189,0,8,0,64,0,1,0,8,0,8,255,192,56,17,55,56,89,1,75,176,14,84,75,176, + 13,84,91,75,176,23,84,91,88,189,0,8,255,192,0,1,0,8,0,8,0,64,56,17,55,56,89,1,75,176,17,84,75,176,25,84,91,88,189,0, + 8,0,64,0,1,0,8,0,8,255,192,56,17,55,56,89,0,75,176,24,84,88,189,0,8,255,192,0,1,0,8,0,8,0,64,56,17,55,56,89, + 64,17,96,1,96,2,96,5,96,6,112,1,112,2,112,5,112,6,8,1,93,1,51,21,35,37,51,21,35,254,94,203,203,254,121,203,203,5,217,203, + 203,203,0,0,0,1,253,115,4,238,254,240,5,246,0,3,0,127,64,17,2,3,0,3,1,0,0,3,66,0,2,250,4,1,3,3,4,16,196,16, + 192,49,0,16,244,204,48,75,83,88,7,16,5,201,7,16,5,201,89,34,0,75,176,12,84,88,189,0,4,255,192,0,1,0,4,0,4,0,64,56, + 17,55,56,89,0,75,176,14,84,88,189,0,4,0,64,0,1,0,4,0,4,255,192,56,17,55,56,89,64,32,6,2,21,2,37,1,37,2,54,2, + 70,2,86,2,106,1,103,2,9,15,0,15,1,31,0,31,1,47,0,47,1,6,93,1,93,1,51,3,35,254,55,185,228,153,5,246,254,248,0,0, + 0,1,252,182,5,14,255,74,5,233,0,29,0,117,64,33,22,16,15,3,19,12,7,1,0,3,8,23,12,195,4,19,195,27,8,250,30,16,1,15, + 0,7,22,86,24,7,86,9,30,16,212,236,212,236,17,57,57,57,57,49,0,16,244,60,236,212,236,50,18,23,57,17,18,23,57,48,0,75,176,12, + 84,88,189,0,30,255,192,0,1,0,30,0,30,0,64,56,17,55,56,89,0,75,176,14,84,88,189,0,30,0,64,0,1,0,30,0,30,255,192,56, + 17,55,56,89,180,16,11,31,26,2,93,1,39,46,1,35,34,6,29,1,35,52,54,51,50,22,31,1,30,1,51,50,54,61,1,51,14,1,35,34, + 38,253,252,57,25,31,12,36,40,125,103,86,36,61,48,57,23,34,15,32,40,125,2,103,84,34,59,5,57,33,14,11,50,45,6,101,118,16,27,30, + 13,12,51,41,6,100,119,16,0,1,253,12,4,238,254,139,5,246,0,3,0,137,64,17,1,2,3,2,0,3,3,2,66,0,1,250,4,1,3,3, + 4,16,196,16,192,49,0,16,244,204,48,75,83,88,7,16,5,201,7,16,5,201,89,34,0,75,176,12,84,88,189,0,4,255,192,0,1,0,4,0, + 4,0,64,56,17,55,56,89,0,75,176,14,84,88,189,0,4,0,64,0,1,0,4,0,4,255,192,56,17,55,56,89,64,42,6,0,6,1,22,0, + 18,1,36,0,36,1,53,1,67,1,85,0,85,1,159,0,159,1,175,0,175,1,14,15,0,15,3,31,0,31,3,47,0,47,3,6,93,1,93,1, + 19,35,3,253,199,196,153,230,5,246,254,248,1,8,0,0,0,1,252,207,4,238,255,49,5,248,0,6,0,119,64,10,4,0,5,2,250,7,4,2, + 6,7,16,212,196,57,49,0,16,244,60,196,57,48,0,75,176,12,84,88,189,0,7,255,192,0,1,0,7,0,7,0,64,56,17,55,56,89,0,75, + 176,14,84,88,189,0,7,0,64,0,1,0,7,0,7,255,192,56,17,55,56,89,1,75,176,14,84,88,189,0,7,255,192,0,1,0,7,0,7,0, + 64,56,17,55,56,89,64,19,15,0,15,1,12,4,31,0,31,1,29,4,47,0,47,1,45,4,9,0,93,1,51,19,35,39,7,35,253,162,188,211, + 139,166,166,139,5,248,254,246,178,178,0,0,0,1,252,207,4,238,255,49,5,248,0,6,0,134,64,10,3,4,1,0,250,7,3,5,1,7,16,212, + 196,57,49,0,16,244,196,50,57,48,0,75,176,12,84,75,176,9,84,91,75,176,10,84,91,75,176,11,84,91,88,189,0,7,255,192,0,1,0,7, + 0,7,0,64,56,17,55,56,89,0,75,176,14,84,88,189,0,7,0,64,0,1,0,7,0,7,255,192,56,17,55,56,89,1,75,176,14,84,88,189, + 0,7,255,192,0,1,0,7,0,7,0,64,56,17,55,56,89,64,19,0,0,3,3,0,6,16,0,18,3,16,6,32,0,34,3,32,6,9,0,93, + 1,3,51,23,55,51,3,253,162,211,139,166,166,139,211,4,238,1,10,178,178,254,246,0,0,1,252,199,5,6,255,57,5,248,0,13,0,0,3,35, + 46,1,35,34,6,7,35,62,1,51,50,22,199,118,13,99,83,82,97,16,118,10,160,143,144,159,5,6,54,57,55,56,119,123,122,0,0,1,252,199, + 5,6,255,57,5,248,0,13,0,106,64,14,7,0,4,195,11,250,14,7,86,8,1,86,0,14,16,212,236,212,236,49,0,16,244,252,204,50,48,0, + 75,176,12,84,88,189,0,14,255,192,0,1,0,14,0,14,0,64,56,17,55,56,89,0,75,176,14,84,88,189,0,14,0,64,0,1,0,14,0,14, + 255,192,56,17,55,56,89,1,75,176,14,84,75,176,15,84,91,88,189,0,14,255,192,0,1,0,14,0,14,0,64,56,17,55,56,89,1,51,30,1, + 51,50,54,55,51,14,1,35,34,38,252,199,118,13,99,83,82,97,16,118,10,160,143,144,159,5,248,54,57,55,56,119,123,122,0,0,0,1,253,154, + 5,14,254,102,5,219,0,3,0,71,183,0,206,2,4,1,100,0,4,16,212,236,49,0,16,212,236,48,0,75,176,14,84,75,176,17,84,91,88,189, + 0,4,0,64,0,1,0,4,0,4,255,192,56,17,55,56,89,0,75,176,24,84,88,189,0,4,255,192,0,1,0,4,0,4,0,64,56,17,55,56, + 89,1,51,21,35,253,154,204,204,5,219,205,0,2,252,230,4,238,255,178,5,246,0,3,0,7,0,19,64,7,0,4,3,7,8,0,4,16,204,49, + 0,16,212,60,204,50,48,1,51,3,35,3,51,3,35,254,249,185,228,153,139,185,228,153,5,246,254,248,1,8,254,248,0,2,252,78,4,238,255,26, + 5,246,0,3,0,7,0,0,1,19,35,3,33,19,35,3,253,7,196,153,228,2,8,196,153,228,5,246,254,248,1,8,254,248,1,8,0,1,0,0, + 0,0,0,150,0,150,0,3,0,0,53,51,21,35,150,150,150,150,0,0,0,2,0,0,0,0,1,144,0,150,0,3,0,7,0,0,55,51,21,35, + 39,51,21,35,250,150,150,250,150,150,150,150,150,150,0,0,0,3,0,0,0,0,1,144,1,144,0,3,0,7,0,11,0,0,19,51,21,35,23,51, + 21,35,39,51,21,35,125,150,150,125,150,150,250,150,150,1,144,150,100,150,150,150,0,0,0,3,0,0,255,6,1,144,0,150,0,3,0,7,0,11, + 0,0,23,51,21,35,19,51,21,35,39,51,21,35,125,150,150,125,150,150,250,150,150,100,150,1,144,150,150,150,0,0,0,2,0,0,255,6,0,150, + 0,150,0,3,0,7,0,0,21,51,21,35,17,51,21,35,150,150,150,150,100,150,1,144,150,0,0,0,0,4,0,0,255,6,1,144,0,150,0,3, + 0,7,0,11,0,15,0,0,23,51,21,35,17,51,21,35,7,51,21,35,17,51,21,35,250,150,150,150,150,250,150,150,150,150,100,150,1,144,150,100, + 150,1,144,150,0,1,0,130,255,236,7,239,2,157,0,38,0,0,1,20,23,22,59,1,21,35,34,39,38,39,6,7,4,35,34,39,36,3,38,55, + 51,6,21,20,23,22,51,36,55,54,55,54,53,52,39,51,22,6,239,70,63,63,60,102,116,71,80,24,155,233,254,253,211,196,124,254,183,1,1,64, + 184,65,203,104,151,1,4,190,199,123,59,29,184,19,1,248,208,59,53,184,73,83,66,131,53,58,38,101,1,8,138,92,94,136,125,67,34,2,55,58, + 109,52,119,62,55,75,0,0,255,255,255,236,0,0,1,135,2,88,16,6,20,59,0,0,255,255,255,236,0,0,2,126,2,88,16,6,20,60,0,0, + 0,2,0,130,255,165,8,92,3,17,0,44,0,62,0,0,37,6,7,4,33,36,39,36,3,38,55,51,6,21,20,23,22,33,50,37,55,38,39,38, + 53,52,55,54,55,54,51,50,23,22,23,22,21,20,7,22,51,33,21,33,34,39,54,53,52,39,38,39,38,35,34,7,6,7,6,21,20,23,22,6, + 120,104,110,254,232,254,240,254,207,125,254,183,1,1,64,184,65,203,81,1,43,232,1,29,28,34,29,82,4,22,188,58,52,82,81,137,18,4,80,9, + 7,1,7,254,244,105,111,104,5,14,52,34,40,24,22,61,19,6,41,49,36,43,24,60,1,39,103,1,6,138,92,94,136,115,77,31,54,4,27,44, + 124,121,31,36,155,75,23,50,83,150,37,30,144,106,1,184,223,65,122,20,27,71,39,25,10,25,60,19,18,56,66,78,0,2,255,236,0,0,3,63, + 3,217,0,15,0,48,0,0,1,54,53,52,39,38,7,6,7,6,7,20,23,22,51,50,1,51,50,55,54,55,54,55,6,7,6,39,38,53,52,55, + 54,55,54,51,50,23,22,23,22,21,20,7,6,7,6,35,33,2,86,41,66,31,44,52,40,40,1,55,40,42,72,253,174,241,84,151,79,60,31,15, + 63,97,130,78,98,8,23,150,78,76,90,66,96,46,23,78,74,124,109,145,254,191,2,25,43,77,59,51,25,1,1,42,41,51,80,38,25,254,183,23, + 12,93,48,50,55,2,2,69,87,129,52,44,148,69,36,50,72,102,51,140,208,143,136,44,39,0,0,0,0,2,255,236,0,0,4,32,3,8,0,33, + 0,53,0,0,1,22,23,22,21,20,7,6,7,22,59,1,21,35,34,39,6,43,1,53,51,50,55,38,39,38,53,52,55,54,55,54,51,50,7,34, + 7,6,7,6,21,20,23,22,23,54,55,54,53,52,39,38,39,38,2,102,183,24,8,21,29,36,39,147,127,217,136,185,185,136,217,127,147,39,29,36, + 21,8,23,185,30,65,63,63,15,18,56,24,10,24,31,68,63,36,25,11,23,57,19,2,250,80,150,50,42,73,49,67,50,17,184,57,57,184,17,40, + 77,46,76,44,48,143,87,14,184,10,32,53,21,29,43,53,68,22,21,69,50,46,24,26,52,33,10,0,0,2,0,107,254,12,6,192,2,228,0,46, + 0,64,0,0,37,38,39,38,39,38,53,52,55,54,55,54,51,50,23,22,23,22,23,22,51,33,21,33,35,6,7,6,7,6,39,36,39,38,53,52, + 55,51,6,21,20,23,22,33,50,55,54,19,54,39,38,39,38,35,34,7,6,7,6,21,20,23,22,23,22,4,184,66,46,121,57,147,6,40,147,41, + 87,112,56,99,50,20,6,26,4,1,7,254,244,48,45,61,128,158,175,205,254,142,94,69,62,184,62,27,60,1,6,140,150,213,108,4,22,19,47,34, + 39,34,21,51,21,10,57,76,100,47,10,5,13,35,43,109,185,61,26,165,69,19,50,88,145,58,214,1,184,122,70,145,78,86,1,2,190,138,125,166, + 96,107,155,76,58,130,68,98,1,90,122,87,75,35,25,10,27,58,30,25,60,44,59,20,9,0,0,0,255,255,255,236,0,0,3,63,3,217,16,6, + 22,206,0,0,255,255,255,236,0,0,4,32,3,8,16,6,22,207,0,0,255,255,255,236,0,0,1,135,3,232,16,38,22,203,0,0,16,7,22,196, + 0,224,3,82,255,255,255,236,0,0,2,126,3,232,16,38,22,204,0,0,16,7,22,196,0,224,3,82,0,2,0,0,0,0,1,182,1,183,0,11, + 0,23,0,0,37,52,39,38,34,6,21,20,23,22,50,62,1,20,7,6,34,39,38,52,55,54,50,23,1,60,28,28,82,56,28,28,82,56,122,63, + 64,184,63,64,64,63,184,64,220,40,28,29,56,41,42,28,27,56,133,184,64,64,64,64,184,64,63,63,255,255,0,130,254,144,7,239,3,32,16,39, + 22,197,2,188,2,138,16,39,22,213,2,169,254,144,16,6,22,202,0,0,255,255,255,236,254,244,2,6,3,232,16,38,22,203,0,0,16,39,22,197, + 0,99,3,82,16,7,22,213,0,80,254,244,255,255,255,236,254,244,2,126,3,232,16,38,22,204,0,0,16,39,22,197,0,99,3,82,16,7,22,213, + 0,80,254,244,255,255,0,130,255,236,7,239,3,182,16,39,22,199,2,188,3,32,16,6,22,202,0,0,255,255,255,236,0,0,1,243,4,226,16,38, + 22,203,0,0,16,7,22,199,0,99,4,76,255,255,255,236,0,0,2,126,4,226,16,38,22,204,0,0,16,7,22,199,0,99,4,76,255,255,0,157, + 254,12,5,62,5,175,16,38,20,134,0,0,16,7,5,124,0,138,255,56,255,255,255,236,0,0,4,92,5,75,16,38,20,135,0,0,16,7,5,124, + 0,88,254,212,255,255,255,236,0,0,5,62,5,75,16,38,20,136,0,0,16,7,5,124,0,88,254,212,255,255,0,157,254,12,5,62,5,170,16,38, + 20,134,0,0,16,7,22,200,2,63,5,20,255,255,255,236,0,0,4,92,5,70,16,38,20,135,0,0,16,7,22,200,2,13,4,176,255,255,255,236, + 0,0,5,62,5,70,16,38,20,136,0,0,16,7,22,200,2,13,4,176,255,255,0,157,254,12,5,62,5,170,16,38,20,134,0,0,16,7,22,198, + 1,194,4,26,255,255,255,236,0,0,4,92,5,70,16,38,20,135,0,0,16,7,22,198,1,144,3,182,255,255,255,236,0,0,5,62,5,70,16,38, + 20,136,0,0,16,7,22,198,1,144,3,182,255,255,0,157,254,12,5,62,4,176,16,38,20,134,0,0,16,39,22,196,2,63,4,26,16,7,22,199, + 1,231,0,25,255,255,255,236,254,62,4,92,4,76,16,38,20,135,0,0,16,39,22,199,1,144,255,56,16,7,22,196,2,13,3,182,255,255,255,236, + 254,62,5,62,4,76,16,38,20,136,0,0,16,39,22,199,1,156,255,56,16,7,22,196,2,13,3,182,0,1,0,0,5,51,3,95,7,43,0,3, + 0,0,9,1,53,1,3,95,252,161,3,95,6,149,254,158,150,1,98,0,0,1,0,213,254,86,5,39,5,213,0,19,0,74,64,33,17,17,1,2, + 1,2,17,16,17,16,66,11,149,10,17,2,3,0,175,16,19,11,16,1,17,2,28,4,54,17,28,0,20,16,220,236,252,236,17,57,57,204,49,0, + 47,60,236,50,57,57,220,236,48,75,83,88,7,16,4,237,7,16,4,237,89,34,178,31,21,1,1,93,19,51,1,17,51,17,20,7,6,43,1,53, + 51,50,55,54,53,1,17,35,213,184,2,226,184,82,81,181,254,233,105,38,38,253,30,184,5,213,251,131,4,125,250,23,214,96,96,156,48,49,173,4, + 125,251,131,0,0,1,0,15,0,0,2,31,4,96,0,11,0,50,64,17,2,11,169,5,8,0,188,6,5,2,1,8,8,11,0,70,12,16,252,60, + 60,236,50,50,49,0,47,228,220,60,236,50,48,64,11,16,13,64,13,80,13,96,13,112,13,5,1,93,19,51,17,51,21,35,17,35,17,35,53,51, + 195,184,164,164,184,180,180,4,96,254,8,164,254,60,1,196,164,0,0,0,0,2,254,242,254,86,2,46,4,96,0,14,0,23,0,0,19,32,53,52, + 33,51,17,51,17,51,21,35,6,7,6,3,35,34,23,22,51,50,55,54,33,254,209,1,14,193,184,181,191,18,53,82,32,181,119,3,4,123,105,38, + 18,254,86,221,205,4,96,251,160,155,112,63,96,1,16,51,65,48,23,0,255,255,1,146,6,99,3,232,8,51,16,39,0,113,0,189,2,61,16,7, + 22,185,4,188,1,85,0,0,255,255,1,146,6,97,3,232,8,52,16,39,0,113,0,189,0,255,16,7,22,185,4,188,2,91,0,0,255,255,1,146, + 6,94,3,232,8,51,16,39,22,193,4,188,1,80,16,7,0,113,0,189,2,61,0,0,255,255,1,147,6,99,3,229,8,90,16,39,22,186,4,240, + 2,100,16,7,22,185,4,188,1,85,0,0,255,255,1,147,6,99,3,229,8,90,16,39,22,188,4,140,2,100,16,7,22,185,4,188,1,85,0,0, + 255,255,1,146,6,97,3,232,8,90,16,39,22,186,4,240,2,100,16,7,0,113,0,189,0,255,0,0,255,255,1,146,6,97,3,232,8,90,16,39, + 22,188,4,140,2,100,16,7,0,113,0,189,0,255,0,0,255,255,1,118,6,106,4,10,8,51,16,39,22,187,4,192,1,92,16,7,0,113,0,189, + 2,61,0,0,255,255,1,139,6,99,3,237,8,90,16,39,22,190,4,188,2,98,16,7,22,185,4,188,1,85,0,0,255,255,1,118,6,106,4,10, + 8,86,16,39,22,185,4,188,2,125,16,7,22,187,4,192,1,92,0,0,255,255,1,139,6,99,3,237,8,87,16,39,22,190,4,188,1,117,16,7, + 22,193,4,188,2,124,0,0,255,255,1,118,6,106,4,48,8,90,16,39,22,186,5,64,2,100,16,7,22,187,4,192,1,92,0,0,255,255,1,139, + 6,99,5,24,8,58,16,39,22,189,4,188,1,117,16,7,22,186,6,40,2,68,0,0,255,255,1,139,6,99,4,109,8,58,16,39,22,188,5,226, + 2,68,16,7,22,189,4,188,1,117,0,0,255,255,1,118,6,99,4,10,8,117,16,39,22,189,4,188,1,117,16,7,22,187,4,192,2,140,0,0, + 255,255,1,118,6,86,4,10,8,89,16,39,22,192,4,188,1,80,16,7,22,187,4,192,2,112,0,0,255,255,1,131,6,86,3,245,8,90,16,39, + 22,192,4,188,1,80,16,7,22,186,4,240,2,100,0,0,255,255,1,131,6,86,3,245,8,90,16,39,22,192,4,188,1,80,16,7,22,188,4,140, + 2,100,0,0,255,255,1,131,6,86,3,245,8,139,16,39,2,186,4,171,2,16,16,7,22,192,4,188,1,80,0,0,255,255,1,139,6,99,5,7, + 8,91,16,39,2,186,6,16,1,224,16,7,22,189,4,188,1,117,0,0,255,255,252,154,4,123,255,80,6,110,16,38,2,178,0,0,16,7,2,184, + 254,248,0,90,0,1,0,0,0,0,1,44,1,44,0,3,0,0,17,33,17,33,1,44,254,212,1,44,254,212,0,0,0,1,0,0,255,227,3,79, + 5,213,0,15,0,0,61,1,30,1,51,50,54,53,17,51,17,16,6,35,34,38,91,194,104,143,113,202,211,247,96,190,61,236,81,81,149,203,3,238, + 252,18,254,230,234,44,0,0,255,255,255,171,254,12,5,19,2,38,16,38,23,4,0,0,16,7,5,127,2,6,249,30,0,1,255,171,254,12,4,246, + 2,38,0,24,0,0,1,51,22,23,22,23,22,59,1,21,35,34,39,2,7,4,33,53,32,55,54,55,54,53,52,2,120,184,30,3,10,73,42,101, + 195,250,130,50,68,251,254,228,254,190,1,48,203,218,35,10,2,38,112,30,103,77,44,184,62,254,234,133,151,184,128,138,208,58,72,126,255,255,0,144, + 254,200,6,35,7,196,16,39,5,127,2,188,1,144,16,6,20,194,0,0,255,255,255,236,0,0,2,96,7,196,16,39,5,127,255,83,1,144,16,6, + 20,195,0,0,255,255,255,236,0,0,2,186,7,196,16,39,5,127,255,83,1,144,16,6,20,196,0,0,255,255,0,130,254,240,6,191,3,70,16,39, + 5,127,0,188,253,18,16,6,20,212,0,0,255,255,255,236,254,212,2,56,4,64,16,39,5,127,255,43,254,12,16,39,22,197,0,99,254,212,16,6, + 20,59,0,0,255,255,255,236,254,212,2,126,4,64,16,39,5,127,255,43,254,12,16,39,22,197,0,99,254,212,16,6,20,60,0,0,255,255,255,171, + 254,12,4,126,4,114,16,39,5,127,0,188,254,62,16,6,20,146,0,0,0,1,0,193,0,0,2,57,6,20,0,11,0,57,181,6,2,8,0,70, + 12,16,252,236,196,75,176,14,83,75,176,16,81,90,88,185,0,6,255,192,56,89,49,0,180,0,151,6,135,7,47,236,228,48,64,13,16,13,64,13, + 80,13,96,13,112,13,240,13,6,1,93,19,51,17,20,22,59,1,21,35,34,38,53,193,184,76,105,11,32,181,163,6,20,251,130,153,97,156,192,214, + 255,255,0,145,0,0,4,94,2,238,16,6,20,206,0,0,255,255,0,113,255,227,5,37,5,240,16,6,1,228,0,0,255,255,0,113,255,227,4,113, + 5,15,16,6,1,229,0,0,255,255,0,150,254,117,2,11,4,123,16,38,0,243,0,0,16,7,2,157,255,74,0,0,0,2,0,79,0,0,2,119, + 4,96,0,3,0,7,0,0,55,51,19,35,19,33,19,33,199,134,178,134,36,254,178,218,1,78,100,3,152,252,4,4,96,0,0,0,0,2,255,22, + 254,86,2,119,4,96,0,8,0,22,0,0,5,19,35,3,6,7,54,55,54,5,35,55,51,50,55,54,55,19,33,3,6,7,6,1,53,202,134,208, + 35,53,72,50,75,254,220,220,20,49,105,48,47,29,233,1,78,222,41,100,101,22,4,18,251,208,181,84,15,48,72,244,100,48,49,153,4,172,251,140, + 214,96,96,0,255,255,255,211,254,118,2,103,4,123,16,39,2,176,255,29,0,0,16,6,0,243,0,0,255,255,0,191,254,137,1,121,4,123,16,38, + 0,243,0,0,16,7,2,212,3,29,0,0,0,2,0,240,0,216,1,195,4,251,0,3,0,7,0,0,19,51,21,35,17,51,21,35,240,211,211,211, + 211,1,214,254,4,35,254,0,0,1,0,151,0,0,2,246,5,213,0,11,0,43,64,22,10,2,149,1,129,9,4,149,6,5,2,28,4,3,28,10, + 8,11,28,9,10,12,16,212,50,236,50,16,252,50,236,50,49,0,47,236,50,244,236,50,48,19,33,21,35,17,51,21,33,53,51,17,35,151,2,94, + 202,203,253,162,201,202,5,213,170,251,127,170,170,4,129,0,0,1,1,173,2,149,5,9,3,63,0,3,0,0,1,21,33,53,5,9,252,164,3,63, + 170,170,0,0,255,255,0,200,4,203,3,56,8,242,16,39,5,115,0,0,2,88,16,6,5,121,0,0,255,255,0,200,4,203,3,56,9,85,16,39, + 5,116,0,0,2,88,16,6,5,121,0,0,255,255,0,200,4,186,3,56,8,232,16,39,5,121,0,0,1,244,16,6,5,115,0,0,255,255,0,200, + 4,203,3,56,8,2,16,39,5,118,0,0,2,88,16,6,5,121,0,0,255,255,0,200,4,203,3,56,9,85,16,39,5,119,0,0,2,88,16,6, + 5,121,0,0,255,255,0,200,4,186,3,56,8,32,16,39,5,121,0,0,1,44,16,6,5,118,0,0,255,255,0,220,4,191,3,36,7,158,16,39, + 5,118,0,0,1,244,16,6,5,124,0,0,255,255,0,220,4,191,3,36,8,241,16,39,5,119,0,0,1,244,16,6,5,124,0,0,0,1,0,193, + 0,0,2,78,5,213,0,5,0,26,64,13,4,84,2,175,0,4,7,4,3,8,1,4,6,16,252,252,252,196,49,0,47,236,236,48,51,17,51,17, + 51,21,193,184,213,5,213,250,190,147,0,0,0,1,255,236,0,0,2,78,5,213,0,7,0,30,64,15,1,4,84,7,175,2,1,9,4,0,8,6, + 4,4,8,16,196,252,252,252,196,49,0,47,236,236,50,48,37,51,21,33,53,51,17,51,1,121,213,253,158,213,184,147,147,147,5,66,0,1,255,236, + 0,0,1,121,5,213,0,5,0,26,64,13,2,84,4,175,0,7,4,0,8,4,4,2,6,16,196,252,252,236,49,0,47,236,236,48,41,1,53,51, + 17,51,1,121,254,115,213,184,147,5,66,0,0,2,0,113,255,227,4,166,3,147,0,7,0,21,0,56,64,13,21,23,69,5,28,8,19,17,1,28, + 13,69,22,16,244,236,212,182,16,17,48,17,160,17,3,93,57,57,236,252,196,49,0,64,11,7,160,15,8,3,160,10,140,19,160,8,47,236,244,236, + 16,212,236,48,0,16,22,32,54,16,38,32,1,6,35,34,0,16,0,32,0,21,20,7,51,21,1,13,185,1,6,185,185,254,250,1,42,78,89,195, + 254,235,1,21,1,134,1,21,104,237,2,62,254,250,185,185,1,6,185,253,9,29,1,21,1,134,1,21,254,235,195,169,127,147,0,0,0,2,255,236, + 255,227,4,166,3,147,0,7,0,25,0,65,64,17,24,27,69,5,28,14,11,8,23,4,21,1,28,16,69,13,26,16,196,244,236,212,182,16,21,48, + 21,160,21,3,93,23,57,236,252,196,49,0,64,13,7,160,19,12,3,160,10,140,14,23,160,25,12,47,60,236,50,244,236,16,212,236,48,0,16,22, + 32,54,16,38,32,1,6,34,39,33,53,51,38,53,52,0,32,0,21,20,7,51,21,1,13,185,1,6,185,185,254,250,1,42,78,178,78,254,74,237, + 104,1,21,1,134,1,21,104,237,2,62,254,250,185,185,1,6,185,253,9,29,29,147,127,169,195,1,21,254,235,195,169,127,147,0,0,0,2,255,236, + 255,227,4,33,3,147,0,7,0,21,0,56,64,13,23,69,5,28,19,8,15,1,28,10,69,21,22,16,196,244,236,212,182,16,15,48,15,160,15,3, + 93,57,57,236,236,49,0,64,11,7,160,13,19,3,160,17,140,8,160,19,47,236,244,236,16,212,236,48,0,16,22,32,54,16,38,32,3,38,53,52, + 0,32,0,16,0,35,34,39,33,53,1,13,185,1,6,185,185,254,250,237,104,1,21,1,134,1,21,254,235,195,89,78,254,74,2,62,254,250,185,185, + 1,6,185,253,156,127,169,195,1,21,254,235,254,122,254,235,29,147,0,0,0,1,0,61,0,0,3,120,5,217,0,10,0,52,64,13,5,8,2,10, + 12,7,6,8,28,3,4,2,11,16,220,196,50,252,196,50,220,196,17,18,57,49,0,64,12,5,2,8,3,3,1,6,3,129,10,135,1,47,236,236, + 50,17,18,23,57,48,41,1,17,1,51,27,1,51,1,17,33,3,120,253,222,254,231,194,179,179,194,254,231,1,106,3,42,2,175,254,93,1,163,253, + 81,253,105,0,0,1,255,236,0,0,3,120,5,217,0,12,0,54,64,14,8,11,5,0,14,10,9,11,28,6,7,5,3,13,16,196,220,196,50,252, + 196,50,220,196,17,18,57,49,0,64,12,8,5,11,3,1,9,6,129,12,3,135,1,47,236,50,236,50,17,23,57,48,37,21,33,53,33,17,1,51, + 27,1,51,1,17,3,120,252,116,1,106,254,231,194,179,179,194,254,231,147,147,147,2,151,2,175,254,93,1,163,253,81,253,105,0,0,0,1,255,236, + 0,0,3,39,5,217,0,10,0,52,64,13,6,9,3,12,8,7,9,28,4,5,3,1,11,16,196,220,196,50,252,196,50,204,17,18,57,49,0,64, + 12,6,3,9,3,4,10,7,4,129,1,135,10,47,236,236,50,17,18,23,57,48,35,53,33,17,1,51,27,1,51,1,17,20,1,106,254,231,194,179, + 179,194,254,231,147,2,151,2,175,254,93,1,163,253,81,252,214,0,0,0,0,1,0,61,0,0,4,208,3,113,0,8,0,0,41,1,9,1,35,1, + 51,1,51,4,208,254,236,254,162,254,162,195,1,164,250,1,109,136,2,189,253,67,3,113,253,34,0,0,0,1,255,236,0,0,4,208,3,113,0,10, + 0,0,41,1,53,51,1,51,1,51,21,33,1,1,0,254,236,136,1,109,250,1,109,136,254,236,254,162,147,2,222,253,34,147,2,189,0,1,255,236, + 0,0,4,127,3,113,0,8,0,0,41,1,53,51,1,51,1,35,1,1,0,254,236,136,1,109,250,1,164,195,254,162,147,2,222,252,143,2,189,0, + 0,1,0,186,0,0,5,79,3,113,0,9,0,36,64,11,9,11,4,7,28,5,4,28,2,4,10,16,252,236,212,252,252,196,49,0,182,6,3,163, + 8,5,135,1,47,236,50,244,60,48,41,1,17,51,17,33,17,51,17,51,5,79,251,107,185,2,85,185,206,3,113,253,34,2,222,253,34,0,0,0, + 0,1,255,236,0,0,5,79,3,113,0,11,0,40,64,12,11,13,4,10,28,8,6,28,4,4,2,12,16,196,252,236,212,252,252,196,49,0,183,8, + 5,163,3,6,10,135,1,47,236,50,50,244,60,48,41,1,53,51,17,51,17,33,17,51,17,51,5,79,250,157,206,185,2,85,185,206,147,2,222,253, + 34,2,222,253,34,0,0,0,0,1,255,236,0,0,4,129,3,113,0,9,0,36,64,11,11,4,0,28,8,6,28,4,4,2,10,16,196,252,236,212, + 252,236,49,0,182,8,5,163,3,6,135,0,47,236,50,244,60,48,41,1,53,51,17,51,17,33,17,51,4,129,251,107,206,185,2,85,185,147,2,222, + 253,34,2,222,0,1,0,186,0,0,5,79,3,113,0,9,0,36,64,10,8,11,4,6,28,2,1,4,4,10,16,252,60,212,252,252,196,49,0,183, + 4,160,6,163,7,2,160,0,47,236,50,244,236,48,51,53,33,17,33,53,33,17,51,21,186,3,14,252,242,3,199,206,147,2,75,147,253,34,147,0, + 0,1,255,236,0,0,5,79,3,113,0,9,0,36,64,10,8,11,4,6,28,2,4,4,1,10,16,196,252,212,252,252,196,49,0,183,4,160,6,163, + 7,2,160,0,47,236,50,244,236,48,35,53,33,17,33,53,33,17,51,21,20,3,220,252,242,3,199,206,147,2,75,147,253,34,147,0,0,1,255,236, + 0,0,4,129,3,113,0,7,0,32,64,9,9,4,0,28,4,6,4,3,8,16,196,252,212,252,236,49,0,182,6,160,0,163,4,160,2,47,236,244, + 236,48,1,17,33,53,33,17,33,53,4,129,251,107,3,220,252,242,3,113,252,143,147,2,75,147,0,0,0,2,0,113,0,0,4,212,5,226,0,19, + 0,31,0,58,64,14,18,33,69,27,28,12,16,28,1,21,28,6,69,32,16,252,236,220,178,64,1,1,93,252,220,178,64,12,1,93,236,252,196,49, + 0,64,11,24,149,1,16,30,149,9,145,17,160,0,47,236,244,236,212,60,236,48,33,17,38,39,46,1,52,62,1,32,30,1,20,6,7,6,7,17, + 33,21,0,20,30,1,50,62,1,52,46,1,34,6,2,4,82,74,114,133,133,228,1,12,230,131,131,115,75,82,2,24,252,57,91,156,184,157,90,90, + 157,184,156,3,14,11,32,49,168,197,169,98,98,169,197,168,49,32,11,253,133,147,4,173,112,96,56,56,96,112,96,56,56,0,0,0,0,2,255,236, + 0,0,4,212,5,226,0,21,0,33,0,62,64,15,1,35,69,29,28,17,21,28,6,23,28,11,69,4,34,16,196,252,236,220,178,64,6,1,93,252, + 220,178,64,17,1,93,236,252,196,49,0,64,12,26,149,6,21,32,149,14,145,0,5,160,2,47,236,50,244,236,212,60,236,48,37,33,21,33,53,33, + 17,38,39,46,1,52,62,1,32,30,1,20,6,7,6,7,0,20,30,1,50,62,1,52,46,1,34,6,2,188,2,24,251,24,2,24,82,74,114,133, + 133,228,1,12,230,131,131,115,75,82,254,81,91,156,184,157,90,90,157,184,156,147,147,147,2,123,11,32,49,168,197,169,98,98,169,197,168,49,32,11, + 1,159,112,96,56,56,96,112,96,56,56,0,0,2,255,236,0,0,4,79,5,226,0,19,0,31,0,58,64,14,33,69,27,28,14,18,28,3,21,28, + 8,69,1,32,16,196,252,236,220,178,64,6,1,93,252,220,178,64,17,1,93,236,236,49,0,64,11,24,149,3,18,30,149,11,145,2,160,19,47,236, + 244,236,212,60,236,48,35,53,33,17,38,39,46,1,52,62,1,32,30,1,20,6,7,6,7,17,0,20,30,1,50,62,1,52,46,1,34,6,20,2, + 24,82,74,114,133,133,228,1,12,230,131,131,115,75,82,254,81,91,156,184,157,90,90,157,184,156,147,2,123,11,32,49,168,197,169,98,98,169,197,168, + 49,32,11,252,242,4,173,112,96,56,56,96,112,96,56,56,0,2,0,186,0,0,5,79,4,166,0,8,0,12,0,38,64,10,2,6,0,5,11,4, + 13,12,14,13,16,212,196,16,252,220,204,204,50,49,0,182,2,3,5,7,11,160,9,47,236,220,220,220,204,48,1,16,51,21,34,7,51,21,35,1, + 33,53,33,2,17,242,132,2,133,241,3,62,251,107,4,149,3,156,1,10,102,154,158,252,248,147,0,0,0,2,255,236,0,0,5,79,4,166,0,8, + 0,12,0,34,183,3,6,0,5,12,14,11,13,16,196,212,196,220,204,204,50,49,0,182,2,3,5,7,11,160,9,47,236,220,220,220,204,48,1,16, + 51,21,34,7,51,21,35,1,33,53,33,2,17,242,132,2,133,241,3,62,250,157,5,99,3,156,1,10,102,154,158,252,248,147,0,0,0,2,255,236, + 0,0,4,129,4,166,0,8,0,12,0,36,64,9,2,6,0,5,12,4,14,11,13,16,196,220,252,220,204,204,50,49,0,182,2,3,5,7,11,160, + 9,47,236,220,220,220,204,48,1,16,51,21,34,7,51,21,35,1,33,53,33,2,17,242,132,2,133,241,2,112,251,107,4,149,3,156,1,10,102,154, + 158,252,248,147,0,2,0,113,0,0,6,181,5,238,0,19,0,29,0,55,64,15,18,31,17,8,1,4,20,8,2,14,27,8,9,69,30,16,252,236, + 212,60,236,50,212,252,220,196,49,0,64,13,3,5,1,160,29,15,24,160,10,145,17,160,0,47,236,244,236,212,60,236,50,204,48,33,17,33,17,35, + 17,35,34,38,16,54,32,23,22,29,1,33,17,51,21,1,53,52,39,38,34,6,20,22,51,5,46,254,67,156,248,188,176,177,1,102,94,139,2,118, + 206,252,32,93,56,198,109,114,94,2,222,254,196,1,60,214,1,85,229,102,152,182,201,253,34,147,3,113,201,131,93,56,152,198,131,0,0,2,255,236, + 0,0,6,181,5,238,0,21,0,31,0,59,64,16,18,33,17,8,1,4,22,8,2,14,29,8,9,69,21,32,16,196,252,236,212,60,236,50,212,252, + 220,196,49,0,64,14,3,5,1,160,31,15,26,160,10,145,0,17,160,19,47,236,50,244,236,212,60,236,50,204,48,37,17,33,17,35,17,35,34,38, + 16,54,32,23,22,29,1,33,17,51,21,33,53,1,53,52,39,38,34,6,20,22,51,5,46,254,67,156,248,188,176,177,1,102,94,139,2,118,206,249, + 55,2,233,93,56,198,109,114,94,147,2,75,254,196,1,60,214,1,85,229,102,152,182,201,253,34,147,147,2,222,201,131,93,56,152,198,131,0,0,0, + 0,2,255,236,0,0,5,231,5,238,0,19,0,29,0,55,64,15,31,17,8,1,4,20,8,2,14,27,8,9,69,19,30,16,196,252,236,212,60,236, + 50,212,252,204,49,0,64,13,3,5,1,160,29,15,24,160,10,145,0,160,17,47,236,244,236,212,60,236,50,204,48,37,17,33,17,35,17,35,34,38, + 16,54,32,23,22,29,1,33,17,33,53,1,53,52,39,38,34,6,20,22,51,5,46,254,67,156,248,188,176,177,1,102,94,139,2,118,250,5,2,233, + 93,56,198,109,114,94,147,2,75,254,196,1,60,214,1,85,229,102,152,182,201,252,143,147,2,222,201,131,93,56,152,198,131,0,0,0,0,1,0,193, + 0,0,3,149,5,213,0,11,0,44,64,11,10,13,7,3,19,5,9,28,1,4,12,16,252,252,60,252,60,220,196,49,0,64,11,5,160,7,0,4, + 160,2,175,10,160,0,47,236,244,236,16,220,236,48,51,17,33,21,33,17,33,21,33,17,33,21,193,2,131,254,53,1,203,254,53,2,28,5,213,147, + 254,47,146,253,180,147,0,0,0,1,255,236,0,0,3,149,5,213,0,13,0,48,64,12,12,15,9,5,19,7,11,28,3,4,1,14,16,196,252,252, + 60,252,60,220,196,49,0,64,12,7,160,9,0,6,160,4,175,2,12,160,0,47,236,50,244,236,16,220,236,48,35,53,51,17,33,21,33,17,33,21, + 33,17,33,21,20,213,2,131,254,53,1,203,254,53,2,28,147,5,66,147,254,47,146,253,180,147,0,0,0,1,255,236,0,0,3,68,5,213,0,11, + 0,44,64,11,13,6,9,19,7,11,28,4,4,2,12,16,196,252,252,60,252,60,204,49,0,64,11,8,160,10,0,7,160,5,175,2,160,0,47,236, + 244,236,16,220,236,48,41,1,53,51,17,33,21,33,17,33,21,33,1,121,254,115,213,2,131,254,53,1,203,254,53,147,5,66,147,254,47,146,0,0, + 0,1,0,61,0,0,3,149,5,213,0,11,0,44,64,11,10,13,4,8,18,0,4,19,2,6,12,16,220,60,252,60,252,252,196,49,0,64,11,4, + 160,2,0,5,160,7,175,10,160,0,47,236,244,236,16,220,236,48,33,17,33,53,33,17,33,53,33,17,51,21,2,8,254,53,1,203,254,53,2,131, + 213,2,223,146,1,209,147,250,190,147,0,0,0,1,255,236,0,0,3,149,5,213,0,13,0,48,64,12,12,15,4,10,18,6,2,19,4,8,1,14, + 16,196,220,60,252,60,252,252,196,49,0,64,12,5,160,3,0,8,160,10,175,12,2,160,0,47,236,50,244,236,16,220,236,48,35,53,33,17,33,53, + 33,17,33,53,33,17,51,21,20,2,28,254,53,1,203,254,53,2,131,213,147,2,76,146,1,209,147,250,190,147,0,0,0,1,255,236,0,0,2,192, + 5,213,0,11,0,44,64,11,13,4,11,18,3,7,19,5,9,2,12,16,196,220,60,252,60,252,236,49,0,64,11,7,160,5,0,8,160,10,175,2, + 160,0,47,236,244,236,16,220,236,48,41,1,53,33,17,33,53,33,17,33,53,33,2,192,253,44,2,28,254,53,1,203,254,53,2,131,147,2,76,146, + 1,209,147,0,0,2,0,186,0,0,4,140,5,213,0,10,0,23,0,42,64,12,22,25,27,7,28,19,14,2,28,12,4,24,16,252,252,60,212,236, + 252,196,49,0,64,9,1,160,15,13,129,3,22,160,11,16,236,50,236,212,236,48,1,33,17,33,50,55,54,53,52,39,38,1,17,51,17,33,50,23, + 22,21,20,7,51,21,2,156,254,208,1,44,82,52,44,44,61,253,217,185,1,85,105,127,88,79,211,2,222,253,181,93,79,122,125,73,95,253,34,5, + 213,253,156,135,95,210,164,130,147,0,0,0,0,2,255,236,0,0,4,140,5,213,0,14,0,25,0,46,64,13,13,27,27,22,28,10,5,17,28,3, + 4,1,26,16,196,252,252,60,212,236,252,196,49,0,64,10,16,160,6,4,129,2,18,13,160,0,47,236,50,50,236,212,236,48,35,53,51,17,51,17, + 33,50,23,22,21,20,7,51,21,1,33,17,33,50,55,54,53,52,39,38,20,206,185,1,85,105,127,88,79,211,254,16,254,208,1,44,82,52,44,44, + 61,147,5,66,253,156,135,95,210,164,130,147,2,222,253,181,93,79,122,125,73,95,0,0,0,2,255,236,0,0,4,8,5,213,0,10,0,25,0,42, + 64,12,27,27,7,28,21,16,2,28,14,4,12,26,16,196,252,252,60,212,236,236,49,0,64,9,1,160,17,15,129,13,3,160,11,47,236,50,236,212, + 236,48,1,33,17,33,50,55,54,53,52,39,38,1,53,51,17,51,17,33,50,23,22,21,20,7,6,35,2,156,254,208,1,44,82,52,44,44,61,253, + 11,206,185,1,85,105,127,88,88,88,108,2,222,253,181,93,79,122,125,73,95,253,34,147,5,66,253,156,135,95,210,173,135,133,0,0,0,1,0,193, + 0,0,4,249,5,213,0,19,0,64,64,11,18,21,4,9,17,28,5,0,6,4,20,16,244,220,178,95,0,1,93,57,252,212,252,196,0,64,11,11, + 5,0,6,10,160,7,129,17,160,0,47,236,244,236,57,17,57,57,64,7,11,18,10,18,5,6,5,7,16,5,236,236,49,48,33,52,2,39,38,39, + 3,53,33,21,5,19,22,23,22,23,22,23,33,21,2,170,27,53,77,137,195,3,99,253,153,157,136,52,66,6,2,1,1,152,153,1,95,150,220,220, + 1,57,86,147,1,254,239,234,184,230,156,64,57,147,0,0,0,1,255,236,0,0,4,249,5,213,0,22,0,68,64,12,21,24,4,12,20,28,8,2, + 9,4,1,23,16,196,244,220,178,95,2,1,93,57,252,212,252,196,0,64,12,14,8,0,9,13,160,10,129,20,2,160,0,47,236,50,244,236,57,17, + 57,57,64,7,14,18,13,18,8,9,8,7,16,5,236,236,49,48,35,53,33,38,39,38,39,38,39,3,53,33,21,5,19,22,23,22,23,22,23,33, + 21,20,2,187,3,8,13,53,77,137,195,3,99,253,153,157,136,52,66,6,2,1,1,152,147,88,93,176,150,220,220,1,57,86,147,1,254,239,234,184, + 230,156,64,57,147,0,0,0,0,1,255,236,0,0,4,36,5,213,0,19,0,64,64,11,21,4,12,19,28,8,2,9,4,1,20,16,196,244,220,178, + 95,2,1,93,57,252,212,236,0,64,11,14,8,0,9,13,160,10,129,2,160,0,47,236,244,236,57,17,57,57,64,7,14,18,13,18,8,9,8,7, + 16,5,236,236,49,48,35,53,33,38,39,38,39,38,39,3,53,33,21,5,19,22,23,22,18,7,20,2,187,3,8,13,53,77,137,195,3,99,253,153, + 157,136,52,66,11,1,147,88,93,176,150,220,220,1,57,86,147,1,254,239,234,184,230,254,201,113,0,0,0,1,0,61,0,0,2,225,5,213,0,8, + 0,58,64,9,7,10,4,3,5,28,1,3,9,16,212,220,252,17,57,220,196,49,0,64,13,2,18,1,18,3,4,3,3,4,129,6,160,8,47,236, + 244,204,178,31,3,1,93,7,16,4,236,236,180,141,2,141,1,2,93,48,33,17,1,53,1,51,17,51,21,1,84,254,233,1,21,186,213,4,223,254, + 199,246,1,57,250,190,147,0,0,1,255,236,0,0,2,225,5,213,0,10,0,62,64,10,9,12,6,5,7,28,3,5,1,11,16,196,212,220,252,17, + 57,220,196,49,0,64,14,4,18,3,18,5,6,5,5,6,129,8,2,160,10,47,236,50,244,204,178,31,5,1,93,7,16,4,236,236,180,141,4,141, + 3,2,93,48,35,53,33,17,1,53,1,51,17,51,21,20,1,104,254,233,1,21,186,213,147,4,76,254,199,246,1,57,250,190,147,0,0,1,255,236, + 0,0,2,12,5,213,0,8,0,58,64,9,10,6,5,7,28,3,5,1,9,16,196,212,220,252,17,57,204,49,0,64,13,4,18,3,18,5,6,5, + 5,6,129,2,160,8,47,236,244,204,178,31,5,1,93,7,16,4,236,236,180,141,4,141,3,2,93,48,35,53,33,17,1,53,1,51,17,20,1,104, + 254,233,1,21,186,147,4,76,254,199,246,1,57,250,43,0,0,3,0,193,0,0,7,192,4,26,0,17,0,26,0,35,0,49,64,14,16,37,28,14, + 28,18,24,28,27,33,28,1,4,36,16,252,236,212,236,212,252,252,196,49,0,64,11,21,160,10,30,160,4,16,26,35,160,0,47,236,50,50,212,236, + 212,236,48,51,17,52,18,51,50,22,23,62,1,51,50,23,22,21,17,51,21,1,52,38,35,34,6,21,17,33,1,52,38,35,34,6,29,1,33,193, + 244,198,125,120,53,37,150,211,210,94,136,213,254,113,164,90,129,127,1,254,253,72,164,90,108,148,1,254,1,238,166,0,255,75,45,45,210,88,128,104, + 253,185,147,2,124,130,128,197,149,254,110,1,99,131,127,167,210,242,0,0,0,3,255,236,0,0,7,192,4,26,0,19,0,28,0,37,0,53,64,15, + 18,39,4,16,28,20,26,28,29,35,28,3,4,1,38,16,196,252,236,212,236,212,252,252,196,49,0,64,12,23,160,12,32,160,6,17,27,36,2,160, + 19,47,236,50,50,50,212,236,212,236,48,35,53,51,17,52,18,51,50,22,23,62,1,51,50,23,22,21,17,51,21,1,52,38,35,34,6,21,17,33, + 1,52,38,35,34,6,29,1,33,20,213,244,198,125,120,53,37,150,211,210,94,136,213,254,113,164,90,129,127,1,254,253,72,164,90,108,148,1,254,147, + 1,91,166,0,255,75,45,45,210,88,128,104,253,185,147,2,124,130,128,197,149,254,110,1,99,131,127,167,210,242,0,0,0,3,255,236,0,0,6,235, + 4,26,0,17,0,26,0,35,0,49,64,14,37,4,16,28,18,24,28,27,33,28,3,4,1,36,16,196,252,236,212,236,212,252,236,49,0,64,11,21, + 160,12,30,160,6,2,34,25,160,17,47,236,50,50,212,236,212,236,48,35,53,51,17,52,18,51,50,22,23,62,1,51,50,23,22,21,17,3,52,38, + 35,34,6,21,17,33,1,52,38,35,34,6,29,1,33,20,213,244,198,125,120,53,37,150,211,210,94,136,186,164,90,129,127,1,254,253,72,164,90,108, + 148,1,254,147,1,91,166,0,255,75,45,45,210,88,128,104,253,38,2,124,130,128,197,149,254,110,1,99,131,127,167,210,242,0,0,0,0,1,0,61, + 0,0,3,220,5,213,0,13,0,45,64,12,12,15,9,31,11,7,28,5,1,31,3,14,16,220,252,60,252,60,252,220,196,49,0,64,10,9,1,160, + 3,7,6,129,12,160,0,47,236,252,220,60,252,60,48,33,17,33,53,33,17,51,17,33,21,33,17,33,21,1,136,254,181,1,75,184,1,75,254,181, + 1,156,3,129,147,1,193,254,63,147,253,18,147,0,0,0,0,1,255,236,0,0,3,220,5,213,0,15,0,49,64,13,14,17,11,31,13,9,28,7, + 3,31,5,1,16,16,196,220,252,60,252,60,252,204,196,49,0,64,11,11,3,160,5,9,8,129,2,14,160,0,47,236,50,244,220,60,252,60,48,35, + 53,33,17,33,53,33,17,51,17,33,21,33,17,33,21,20,1,156,254,181,1,75,184,1,75,254,181,1,156,147,2,238,147,1,193,254,63,147,253,18, + 147,0,0,0,0,1,255,236,0,0,3,139,5,213,0,13,0,45,64,12,15,12,31,0,10,28,8,4,31,6,2,14,16,196,220,252,60,252,60,252, + 204,49,0,64,10,12,4,160,6,10,8,129,2,160,0,47,236,244,220,60,252,60,48,41,1,53,33,17,33,53,33,17,51,17,33,21,33,2,64,253, + 172,1,156,254,181,1,75,184,1,75,254,181,147,2,238,147,1,193,254,63,147,0,0,0,0,2,0,61,0,0,6,88,5,213,0,3,0,21,0,62, + 64,17,20,23,16,31,14,18,28,0,12,10,2,28,4,8,31,6,22,16,220,252,60,252,60,220,60,252,60,252,220,196,49,0,64,14,5,1,17,160, + 7,11,15,9,13,129,3,19,160,4,47,236,50,244,60,220,60,60,236,50,50,48,37,17,33,17,7,17,33,53,33,17,51,17,33,17,51,17,33,21, + 33,17,33,21,4,4,254,61,185,254,181,1,75,185,1,195,184,1,76,254,180,1,156,147,2,238,253,18,147,3,129,147,1,193,254,63,1,193,254,63, + 147,253,18,147,0,2,255,236,0,0,6,88,5,213,0,19,0,23,0,66,64,18,18,25,14,31,12,16,28,20,10,8,22,28,2,6,31,4,0,24, + 16,196,220,252,60,252,60,220,60,252,60,252,220,196,49,0,64,15,15,21,3,160,5,9,13,7,11,129,17,23,1,160,19,47,236,50,50,244,60,220, + 60,60,236,50,50,48,35,53,33,17,33,53,33,17,51,17,33,17,51,17,33,21,33,17,33,21,37,17,33,17,20,1,156,254,181,1,75,185,1,195, + 184,1,76,254,180,1,156,253,172,254,61,147,2,238,147,1,193,254,63,1,193,254,63,147,253,18,147,147,2,238,253,18,0,2,255,236,0,0,6,8, + 5,213,0,17,0,21,0,62,64,17,23,15,31,13,17,18,18,11,9,20,28,3,7,31,5,1,22,16,196,220,252,60,252,60,220,60,252,60,252,204, + 49,0,64,14,16,19,4,160,6,10,14,12,8,129,21,2,160,0,47,236,50,244,60,220,60,60,252,60,60,48,41,1,53,33,17,33,53,33,17,51, + 17,33,17,51,17,33,21,33,3,17,33,17,4,188,251,48,1,156,254,181,1,75,185,1,195,184,1,76,254,180,184,254,61,147,2,238,147,1,193,254, + 63,1,193,254,63,147,253,18,2,238,253,18,0,2,0,186,0,0,5,79,3,113,0,5,0,9,0,37,64,11,4,11,4,2,28,8,7,28,1,4, + 10,16,252,236,212,252,252,196,49,0,183,6,160,2,163,3,8,160,0,47,236,50,244,236,48,51,17,33,17,51,21,1,17,33,17,186,3,199,206,252, + 36,2,85,3,113,253,34,147,2,222,253,181,2,75,0,0,0,2,255,236,0,0,5,79,3,113,0,7,0,11,0,42,64,12,6,13,4,4,28,10, + 9,28,3,4,1,12,16,196,252,236,212,252,252,196,49,0,64,9,8,160,4,163,2,9,5,160,0,47,236,50,50,244,236,48,35,53,51,17,33,17, + 51,21,1,17,33,17,20,206,3,199,206,252,36,2,85,147,2,222,253,34,147,2,222,253,181,2,75,0,0,2,255,236,0,0,4,129,3,113,0,5, + 0,9,0,37,64,11,11,4,5,28,8,7,28,4,4,2,10,16,196,252,236,212,252,236,49,0,183,9,160,4,163,3,7,160,0,47,236,50,244,236, + 48,41,1,53,51,17,33,5,17,33,17,4,129,251,107,206,3,199,252,242,2,85,147,2,222,147,253,181,2,75,0,0,0,2,0,61,0,0,5,20, + 5,213,0,2,0,8,0,67,180,7,10,5,4,9,16,212,196,196,196,49,0,64,10,66,1,149,4,129,2,149,7,160,3,47,236,236,244,236,48,75, + 83,88,64,18,2,17,6,1,2,0,17,5,5,6,2,17,3,1,17,4,4,3,5,7,16,236,16,236,7,16,236,8,16,236,89,1,33,1,7,1, + 33,1,33,21,3,198,253,116,1,70,115,254,48,4,134,254,104,1,233,5,66,251,126,192,5,213,250,190,147,0,0,0,0,2,255,236,0,0,5,20, + 5,213,0,2,0,10,0,70,181,9,12,7,6,4,11,16,196,212,196,196,49,0,64,11,66,1,149,6,129,2,149,4,9,160,3,47,236,50,236,244, + 236,48,75,83,88,64,18,2,17,8,1,2,0,17,7,7,8,2,17,5,1,17,6,6,5,5,7,16,236,16,236,7,16,236,8,16,236,89,1,33, + 1,5,53,33,1,33,1,33,21,3,198,253,116,1,70,253,108,1,233,254,104,4,134,254,104,1,233,5,66,251,126,192,147,5,66,250,190,147,0,0, + 0,2,255,236,0,0,4,195,5,213,0,2,0,8,0,67,180,10,7,6,4,9,16,196,212,196,196,49,0,64,10,66,1,149,6,129,2,149,4,160, + 3,47,236,236,244,236,48,75,83,88,64,18,2,17,8,1,2,0,17,7,7,8,2,17,5,1,17,6,6,5,5,7,16,236,16,236,7,16,236,8, + 16,236,89,1,33,1,5,53,33,1,33,1,3,198,253,116,1,70,253,108,1,233,254,104,4,134,254,48,5,66,251,126,192,147,5,66,250,43,0,0, + 0,3,0,193,0,0,5,243,5,213,0,10,0,14,0,31,0,56,64,16,30,33,4,5,28,23,29,0,28,18,14,12,28,16,4,32,16,252,236,212, + 60,252,60,212,236,252,196,49,0,64,13,28,11,160,1,17,10,160,19,129,13,30,160,15,47,236,50,244,236,220,60,236,50,48,1,51,50,55,54,53, + 52,39,38,43,1,1,17,33,17,1,17,33,17,33,50,23,22,21,6,7,6,47,1,17,33,21,3,109,168,93,37,31,31,29,105,164,254,13,1,59, + 254,12,1,244,1,176,132,64,69,1,68,92,140,212,2,134,3,113,81,69,61,60,100,94,253,156,253,181,2,75,253,34,3,113,2,100,133,144,124,145, + 91,124,1,1,253,181,147,0,0,3,255,236,0,0,5,243,5,213,0,10,0,14,0,33,0,60,64,17,32,35,4,5,28,25,31,0,28,20,14,12, + 28,18,4,16,34,16,196,252,236,212,60,252,60,212,236,252,196,49,0,64,14,30,11,160,1,19,10,160,21,129,17,13,32,160,15,47,236,50,50,244, + 236,220,60,236,50,48,1,51,50,55,54,53,52,39,38,43,1,1,17,33,17,1,53,51,17,33,17,33,50,23,22,21,6,7,6,47,1,17,33,21, + 3,109,168,93,37,31,31,29,105,164,254,13,1,59,253,55,213,1,244,1,176,132,64,69,1,68,92,140,212,2,134,3,113,81,69,61,60,100,94,253, + 156,253,181,2,75,253,34,147,2,222,2,100,133,144,124,145,91,124,1,1,253,181,147,0,0,3,255,236,0,0,5,110,5,213,0,10,0,14,0,31, + 0,56,64,16,33,4,5,28,26,15,0,28,21,14,12,28,19,4,17,32,16,196,252,236,212,60,252,60,212,236,236,49,0,64,13,31,11,160,1,20, + 10,160,22,129,18,13,160,16,47,236,50,244,236,220,60,236,50,48,1,51,50,55,54,53,52,39,38,43,1,1,17,33,17,19,33,53,51,17,33,17, + 33,50,23,22,21,6,7,6,47,1,3,109,168,93,37,31,31,29,105,164,254,13,1,59,184,252,127,213,1,244,1,176,132,64,69,1,68,92,140,212, + 3,113,81,69,61,60,100,94,253,156,253,181,2,75,253,34,147,2,222,2,100,133,144,124,145,91,124,1,1,0,0,0,0,1,0,193,0,0,4,81, + 5,213,0,13,0,46,64,13,12,15,4,11,28,9,1,7,3,28,5,4,14,16,252,252,60,220,60,252,252,196,49,0,64,10,4,2,160,6,8,10, + 129,12,160,0,47,236,244,220,204,252,204,48,33,17,33,17,35,17,51,17,33,17,51,17,51,21,2,197,254,181,185,185,1,75,184,212,3,129,254,252, + 2,155,254,252,1,193,250,190,147,0,0,0,0,1,255,236,0,0,4,81,5,213,0,15,0,50,64,14,14,17,4,13,28,11,3,9,5,28,7,4, + 1,16,16,196,252,252,60,220,60,252,252,196,49,0,64,11,6,4,160,8,10,12,129,2,14,160,0,47,236,50,244,220,204,252,204,48,35,53,33,17, + 33,17,35,17,51,17,33,17,51,17,51,21,20,2,217,254,181,185,185,1,75,184,212,147,2,238,254,252,2,155,254,252,1,193,250,190,147,0,0,0, + 0,1,255,236,0,0,3,125,5,213,0,13,0,46,64,13,15,4,12,28,11,3,9,5,28,7,4,1,14,16,196,252,252,60,220,60,252,236,49,0, + 64,10,6,4,160,8,10,12,129,2,160,0,47,236,244,220,204,252,204,48,35,53,33,17,33,17,35,17,51,17,33,17,51,17,20,2,217,254,181,185, + 185,1,75,184,147,2,238,254,252,2,155,254,252,1,193,250,43,0,0,0,0,2,0,112,0,0,5,223,5,213,0,10,0,29,0,51,64,14,28,31, + 4,24,31,22,26,28,11,1,7,17,27,30,16,252,204,212,60,252,60,252,252,196,49,0,64,12,25,12,160,0,23,2,160,21,129,27,160,29,47,236, + 244,236,212,60,236,50,48,1,33,17,33,34,7,6,21,20,23,22,1,17,33,34,39,38,53,52,55,54,51,33,17,33,21,33,17,33,21,1,220,1, + 48,254,212,82,52,44,44,61,1,110,254,171,107,125,88,88,88,108,2,50,1,76,254,180,2,33,2,247,2,75,93,79,122,125,73,95,253,9,2,100, + 135,95,210,173,135,133,253,34,147,254,47,147,0,2,255,236,0,0,5,223,5,213,0,10,0,31,0,55,64,15,30,33,4,26,31,24,28,28,13,1, + 7,19,27,12,32,16,196,252,204,212,60,252,60,252,252,196,49,0,64,13,27,14,160,0,25,2,160,23,129,29,13,160,31,47,236,50,244,236,212,60, + 236,50,48,1,33,17,33,34,7,6,21,20,23,22,1,53,33,17,33,34,39,38,53,52,55,54,51,33,17,33,21,33,17,33,21,1,220,1,48,254, + 212,82,52,44,44,61,254,85,3,25,254,171,107,125,88,88,88,108,2,50,1,76,254,180,2,33,2,247,2,75,93,79,122,125,73,95,253,9,147,1, + 209,135,95,210,173,135,133,253,34,147,254,47,147,0,0,0,0,2,255,236,0,0,5,10,5,213,0,10,0,29,0,51,64,14,31,4,26,31,24,28, + 28,13,1,7,19,27,12,30,16,196,252,204,212,60,252,60,252,236,49,0,64,12,27,14,160,0,25,2,160,23,129,13,160,29,47,236,244,236,212,60, + 236,50,48,1,33,17,33,34,7,6,21,20,23,22,1,53,33,17,33,34,39,38,53,52,55,54,51,33,17,33,21,33,17,1,220,1,48,254,212,82, + 52,44,44,61,254,85,3,25,254,171,107,125,88,88,88,108,2,50,1,76,254,180,2,247,2,75,93,79,122,125,73,95,253,9,147,1,209,135,95,210, + 173,135,133,253,34,147,253,156,0,1,0,61,0,0,3,220,5,213,0,9,0,36,64,10,8,11,4,31,6,28,0,31,2,10,16,220,252,252,252,220, + 196,49,0,183,1,6,160,3,129,7,160,9,47,236,244,236,50,48,33,17,33,53,33,21,33,17,33,21,1,136,254,181,3,78,254,181,1,156,5,66, + 147,147,251,81,147,0,0,0,0,1,255,236,0,0,3,220,5,213,0,11,0,41,64,11,10,13,6,31,8,28,2,31,4,1,12,16,196,220,252,252, + 252,220,196,49,0,64,9,8,3,160,6,129,2,9,160,0,47,236,50,244,236,50,48,35,53,33,17,33,53,33,21,33,17,33,21,20,1,156,254,181, + 3,78,254,181,1,156,147,4,175,147,147,251,81,147,0,0,0,1,255,236,0,0,3,139,5,213,0,9,0,36,64,10,11,7,31,9,28,3,31,5, + 2,10,16,196,220,252,252,252,204,49,0,183,9,4,160,6,129,3,160,0,47,236,244,236,50,48,41,1,53,33,17,33,53,33,21,33,2,64,253,172, + 1,156,254,181,3,78,254,181,147,4,175,147,147,0,0,0,0,2,0,61,0,0,5,20,5,213,0,2,0,8,0,64,179,8,10,3,9,16,212,196, + 196,49,0,64,9,66,1,149,5,129,6,2,160,3,47,236,50,244,236,48,75,83,88,64,18,1,17,5,2,1,0,17,6,6,5,1,17,4,2,17, + 3,3,4,5,7,16,236,16,236,7,16,236,8,16,236,89,37,9,1,7,1,51,1,51,21,3,198,254,186,254,186,253,1,208,230,1,152,137,147,4, + 130,251,126,147,5,213,250,190,147,0,0,0,0,2,255,236,0,0,5,20,5,213,0,2,0,10,0,66,179,9,12,4,11,16,196,196,196,49,0,64, + 10,66,1,149,6,129,8,4,2,160,3,47,236,50,50,244,236,48,75,83,88,64,18,1,17,7,2,1,0,17,8,8,7,1,17,6,2,17,5,5, + 6,5,7,16,236,16,236,7,16,236,8,16,236,89,37,9,1,5,53,51,1,51,1,51,21,3,198,254,186,254,186,254,178,137,1,152,230,1,152,137, + 147,4,130,251,126,147,147,5,66,250,190,147,0,2,255,236,0,0,4,195,5,213,0,2,0,8,0,64,179,10,8,4,9,16,196,196,196,49,0,64, + 9,66,1,149,6,129,4,2,160,3,47,236,50,244,236,48,75,83,88,64,18,1,17,7,2,1,0,17,8,8,7,1,17,6,2,17,5,5,6,5, + 7,16,236,16,236,7,16,236,8,16,236,89,37,9,1,5,53,51,1,51,1,3,198,254,186,254,186,254,178,137,1,152,230,1,208,147,4,130,251,126, + 147,147,5,66,250,43,0,0,0,2,0,113,0,0,4,212,5,213,0,28,0,40,0,0,33,17,38,39,46,1,52,55,54,55,54,55,53,33,53,33, + 17,22,23,30,1,20,6,7,6,7,21,33,21,0,20,30,1,50,62,1,52,46,1,34,6,2,4,82,74,114,133,67,69,111,74,82,254,181,2,3, + 88,69,114,132,132,114,74,83,2,24,252,57,91,156,184,157,90,90,157,184,156,1,134,11,31,49,166,198,83,86,47,31,11,243,147,254,123,13,30,50, + 166,198,166,49,32,11,242,147,3,34,112,95,56,56,95,112,96,56,56,0,0,2,255,236,0,0,4,212,5,213,0,30,0,42,0,0,35,53,33,53, + 38,39,46,1,52,55,54,55,54,55,53,33,53,33,17,22,23,30,1,20,6,7,6,7,21,33,21,0,20,30,1,50,62,1,52,46,1,34,6,20, + 2,24,82,74,114,133,67,69,111,74,82,254,181,2,3,88,69,114,132,132,114,74,83,2,24,252,57,91,156,184,157,90,90,157,184,156,147,243,11,31, + 49,166,198,83,86,47,31,11,243,147,254,123,13,30,50,166,198,166,49,32,11,242,147,3,34,112,95,56,56,95,112,96,56,56,0,0,0,2,255,236, + 0,0,4,79,5,213,0,28,0,40,0,0,35,53,33,53,38,39,46,1,52,55,54,55,54,55,53,33,53,33,17,22,23,30,1,20,6,7,6,7, + 17,0,20,30,1,50,62,1,52,46,1,34,6,20,2,24,82,74,114,133,67,69,111,74,82,254,181,2,3,88,69,114,132,132,114,74,83,254,81,91, + 156,184,157,90,90,157,184,156,147,243,11,31,49,166,198,83,86,47,31,11,243,147,254,123,13,30,50,166,198,166,49,32,11,254,123,3,34,112,95,56, + 56,95,112,96,56,56,0,0,0,1,0,193,0,0,4,81,5,213,0,9,0,37,64,11,8,11,4,1,28,7,3,28,5,4,10,16,252,236,212,236, + 252,196,49,0,183,4,2,160,5,129,7,160,0,47,236,244,252,204,48,33,17,33,17,35,17,33,17,51,21,2,197,254,181,185,2,188,212,5,66,254, + 197,1,206,250,190,147,0,0,0,1,255,236,0,0,4,81,5,213,0,11,0,42,64,12,10,13,4,2,28,8,4,28,6,4,1,12,16,196,252,236, + 212,236,252,196,49,0,64,9,5,4,160,8,129,2,9,160,0,47,236,50,244,252,204,48,35,53,33,17,33,17,35,17,33,17,51,21,20,2,217,254, + 181,185,2,188,212,147,4,175,254,197,1,206,250,190,147,0,0,1,255,236,0,0,3,125,5,213,0,9,0,37,64,11,11,4,3,28,9,5,28,7, + 4,1,10,16,196,252,236,212,236,236,49,0,183,6,4,160,8,129,2,160,0,47,236,244,252,204,48,35,53,33,17,33,17,35,17,33,17,20,2,217, + 254,181,185,2,188,147,4,175,254,197,1,206,250,43,0,0,0,1,0,193,0,0,4,81,4,230,0,11,0,40,64,12,11,13,4,9,28,1,7,3, + 28,5,4,12,16,252,252,60,220,252,252,196,49,0,183,6,8,160,4,2,10,160,0,47,236,212,204,252,204,48,33,17,33,17,35,17,51,17,33,17, + 51,21,2,197,254,181,185,185,2,3,212,3,79,254,252,2,155,254,252,252,177,147,0,0,0,1,255,236,0,0,4,81,4,230,0,13,0,45,64,13, + 13,15,4,11,28,3,9,5,28,7,4,1,14,16,196,252,252,60,220,252,252,196,49,0,64,9,8,10,160,6,4,2,12,160,0,47,236,50,212,204, + 252,204,48,35,53,33,17,33,17,35,17,51,17,33,17,51,21,20,2,217,254,181,185,185,2,3,212,147,2,188,254,252,2,155,254,252,252,177,147,0, + 0,1,255,236,0,0,3,125,4,230,0,11,0,40,64,12,13,4,11,28,3,9,5,28,7,4,1,12,16,196,252,252,60,220,252,236,49,0,183,8, + 10,160,6,4,2,160,0,47,236,212,204,252,204,48,35,53,33,17,33,17,35,17,51,17,33,17,20,2,217,254,181,185,185,2,3,147,2,188,254,252, + 2,155,254,252,252,30,0,0,0,2,0,193,0,0,4,66,5,213,0,3,0,13,0,47,64,13,13,15,4,11,28,7,3,1,28,5,9,4,14,16, + 252,60,236,220,60,252,252,196,49,0,64,11,0,160,6,8,160,10,129,2,12,160,4,47,236,50,244,236,212,236,48,1,17,33,17,1,17,33,17,33, + 53,33,17,51,21,1,122,1,59,254,12,1,244,254,12,2,172,213,2,222,253,181,2,75,253,34,3,113,1,209,147,250,190,147,0,0,0,2,255,236, + 0,0,4,66,5,213,0,3,0,15,0,51,64,14,15,17,4,13,28,9,3,1,28,7,11,4,5,16,16,196,252,60,236,220,60,252,252,196,49,0, + 64,12,0,160,8,10,160,12,129,6,2,14,160,4,47,236,50,50,244,236,212,236,48,1,17,33,17,1,53,51,17,33,17,33,53,33,17,51,21,1, + 122,1,59,253,55,213,1,244,254,12,2,172,213,2,222,253,181,2,75,253,34,147,2,222,1,209,147,250,190,147,0,0,0,2,255,236,0,0,3,109, + 5,213,0,3,0,13,0,47,64,13,15,4,13,28,9,3,1,28,7,11,4,5,14,16,196,252,60,236,220,60,252,236,49,0,64,11,0,160,8,10, + 160,12,129,6,2,160,4,47,236,50,244,236,212,236,48,1,17,33,17,1,53,51,17,33,17,33,53,33,17,1,122,1,59,253,55,213,1,244,254,12, + 2,172,2,222,253,181,2,75,253,34,147,2,222,1,209,147,250,43,0,0,0,2,0,113,0,0,4,212,5,213,0,11,0,38,0,66,64,16,37,40, + 69,7,28,31,26,35,28,23,13,1,28,18,69,39,16,252,236,220,178,64,13,1,93,60,252,60,220,178,64,31,1,93,236,252,196,49,0,64,13,4, + 149,35,13,10,149,26,23,25,129,36,160,12,47,236,236,212,60,236,212,60,236,48,0,20,30,1,50,62,1,52,46,1,34,6,19,17,38,39,46,1, + 52,55,54,55,54,55,17,51,17,22,23,30,1,20,6,7,6,7,21,33,21,1,13,91,156,184,157,90,90,157,184,156,156,82,74,114,133,67,69,111, + 74,82,184,88,69,114,132,132,114,74,83,2,24,3,34,112,95,56,56,95,112,96,56,56,252,126,1,134,11,31,49,166,198,83,86,47,31,11,1,134, + 254,123,13,30,50,166,198,166,49,32,11,242,147,0,0,0,0,2,255,236,0,0,4,212,5,213,0,11,0,40,0,70,64,17,12,42,69,7,28,35, + 30,39,28,27,17,1,28,22,69,15,41,16,196,252,236,220,178,64,17,1,93,60,252,60,220,178,64,35,1,93,236,252,196,49,0,64,14,4,149,39, + 17,10,149,30,27,29,129,40,16,160,14,47,236,50,236,212,60,236,212,60,236,48,0,20,30,1,50,62,1,52,46,1,34,6,1,21,33,53,33,53, + 38,39,46,1,52,55,54,55,54,55,17,51,17,22,23,30,1,20,6,7,6,7,21,1,13,91,156,184,157,90,90,157,184,156,3,108,251,24,2,24, + 82,74,114,133,67,69,111,74,82,184,88,69,114,132,132,114,74,83,3,34,112,95,56,56,95,112,96,56,56,253,17,147,147,243,11,31,49,166,198,83, + 86,47,31,11,1,134,254,123,13,30,50,166,198,166,49,32,11,242,0,0,0,2,255,236,0,0,4,79,5,213,0,11,0,38,0,66,64,16,40,69, + 7,28,31,26,35,28,23,13,1,28,18,69,38,39,16,196,252,236,220,178,64,13,1,93,60,252,60,220,178,64,31,1,93,236,236,49,0,64,13,4, + 149,35,13,10,149,26,23,25,129,12,160,37,47,236,236,212,60,236,212,60,236,48,0,20,30,1,50,62,1,52,46,1,34,6,19,53,38,39,46,1, + 52,55,54,55,54,55,17,51,17,22,23,30,1,20,6,7,6,7,17,33,53,1,13,91,156,184,157,90,90,157,184,156,156,82,74,114,133,67,69,111, + 74,82,184,88,69,114,132,132,114,74,83,253,48,3,34,112,95,56,56,95,112,96,56,56,253,17,243,11,31,49,166,198,83,86,47,31,11,1,134,254, + 123,13,30,50,166,198,166,49,32,11,254,123,147,0,0,0,0,2,0,113,0,0,4,212,5,213,0,30,0,42,0,0,33,17,38,39,46,1,52,55, + 54,55,54,55,53,33,53,33,21,33,21,22,23,30,1,20,6,7,6,7,21,33,21,0,20,30,1,50,62,1,52,46,1,34,6,2,4,82,74,114, + 133,67,69,111,74,82,254,181,3,78,254,181,88,69,114,132,132,114,74,83,2,24,252,57,91,156,184,157,90,90,157,184,156,1,134,11,31,49,166,198, + 83,86,47,31,11,243,147,147,242,13,30,50,166,198,166,49,32,11,242,147,3,34,112,95,56,56,95,112,96,56,56,0,0,2,255,236,0,0,4,212, + 5,213,0,32,0,44,0,0,37,21,33,53,33,53,38,39,46,1,52,55,54,55,54,55,53,33,53,33,21,33,21,22,23,30,1,20,6,7,6,7, + 21,0,20,30,1,50,62,1,52,46,1,34,6,4,212,251,24,2,24,82,74,114,133,67,69,111,74,82,254,181,3,78,254,181,88,69,114,132,132,114, + 74,83,254,81,91,156,184,157,90,90,157,184,156,147,147,147,243,11,31,49,166,198,83,86,47,31,11,243,147,147,242,13,30,50,166,198,166,49,32,11, + 242,2,143,112,95,56,56,95,112,96,56,56,0,2,255,236,0,0,4,79,5,213,0,30,0,42,0,0,41,1,53,33,53,38,39,46,1,52,55,54, + 55,54,55,53,33,53,33,21,33,21,22,23,30,1,20,6,7,6,7,0,20,30,1,50,62,1,52,46,1,34,6,2,188,253,48,2,24,82,74,114, + 133,67,69,111,74,82,254,181,3,78,254,181,88,69,114,132,132,114,74,83,254,81,91,156,184,157,90,90,157,184,156,147,243,11,31,49,166,198,83,86, + 47,31,11,243,147,147,242,13,30,50,166,198,166,49,32,11,1,157,112,95,56,56,95,112,96,56,56,0,255,255,252,236,3,251,255,16,6,32,16,7, + 2,156,251,254,255,26,0,0,255,255,0,170,2,134,6,130,5,213,18,39,15,92,0,0,2,134,16,39,15,92,0,0,3,202,16,7,15,92,0,0, + 5,13,0,0,255,255,0,170,2,134,6,131,5,213,18,39,15,92,0,0,2,134,16,39,15,92,0,1,3,201,16,7,15,93,0,0,5,13,0,0, + 255,255,0,170,2,134,6,130,5,213,18,39,15,92,0,0,2,134,16,39,15,93,0,0,3,201,16,7,15,92,0,0,5,13,0,0,255,255,0,170, + 2,134,6,130,5,213,18,39,15,92,0,0,2,134,16,39,15,93,0,0,3,201,16,7,15,93,0,0,5,13,0,0,255,255,0,170,2,134,6,130, + 5,213,18,39,15,93,0,0,2,134,16,39,15,92,0,0,3,201,16,7,15,92,0,0,5,13,0,0,255,255,0,170,2,134,6,130,5,213,18,39, + 15,93,0,0,2,134,16,39,15,92,0,0,3,201,16,7,15,93,0,0,5,13,0,0,255,255,0,170,2,134,6,130,5,213,18,39,15,93,0,0, + 2,134,16,39,15,93,0,0,3,201,16,7,15,92,0,0,5,13,0,0,255,255,0,170,2,134,6,130,5,213,18,39,15,93,0,0,2,134,16,39, + 15,93,0,0,3,201,16,7,15,93,0,0,5,13,0,0,0,1,1,151,5,24,5,27,5,224,0,11,0,58,64,13,2,1,0,3,6,5,4,7, + 10,9,8,11,12,16,212,64,9,63,11,111,11,143,11,144,11,4,93,220,57,57,212,220,57,57,212,204,57,57,49,0,182,5,4,7,1,10,11,12, + 16,212,204,50,220,60,204,48,1,7,35,39,35,7,35,39,35,7,35,39,5,27,100,50,50,175,50,50,50,175,50,50,100,5,224,200,100,100,100,100, + 200,0,0,0,0,1,0,201,254,86,5,252,5,213,0,14,0,0,33,35,17,1,33,17,51,17,1,33,17,51,21,1,35,5,51,196,253,106,254,240, + 196,2,150,1,16,201,254,146,134,4,225,251,31,5,213,251,31,4,225,250,213,170,254,86,0,1,0,193,254,86,5,56,4,96,0,14,0,0,33,35, + 17,1,35,17,51,17,1,51,17,51,21,1,35,4,128,183,253,228,236,183,2,27,237,184,254,222,123,3,131,252,125,4,96,252,127,3,129,252,57,153, + 254,86,0,0,0,2,0,174,254,86,4,88,4,123,0,31,0,32,0,0,37,53,14,1,35,34,38,53,17,51,17,20,22,51,50,54,53,17,51,17, + 16,2,33,34,38,39,53,30,1,51,50,54,1,3,160,67,177,117,193,200,184,124,124,149,173,184,254,254,250,97,172,81,81,158,82,181,180,254,221,106, + 66,102,99,240,231,2,166,253,97,159,159,190,164,2,123,252,43,254,226,254,233,29,30,179,44,42,189,4,208,0,0,0,255,255,0,125,254,144,4,71, + 3,82,16,39,22,213,1,25,254,144,16,6,20,142,0,0,255,255,0,125,254,162,4,71,3,82,16,39,22,196,1,169,254,162,16,6,20,142,0,0, + 255,255,0,125,254,162,4,71,5,247,16,39,5,75,255,194,255,6,16,39,22,196,1,169,254,162,16,6,20,142,0,0,255,255,0,125,255,218,4,71, + 5,120,16,39,22,199,0,250,4,226,16,6,20,142,0,0,255,255,0,125,255,218,4,71,5,170,16,39,22,201,0,250,5,20,16,6,20,142,0,0, + 255,255,255,171,254,12,4,126,2,38,16,39,22,213,2,88,254,12,16,6,20,146,0,0,255,255,255,171,254,12,4,126,2,38,16,39,22,196,3,52, + 254,72,16,6,20,146,0,0,255,255,255,171,254,12,4,126,2,38,16,39,22,196,0,180,0,40,16,39,22,196,3,52,254,72,16,6,20,146,0,0, + 255,255,255,171,254,12,4,126,3,182,16,39,22,197,1,244,3,32,16,6,20,146,0,0,255,255,255,171,254,12,4,126,4,176,16,39,22,201,1,244, + 4,26,16,6,20,146,0,0,255,255,0,130,254,12,10,71,3,182,16,38,20,150,0,0,16,39,22,196,5,95,3,32,16,7,22,196,5,245,254,162, + 255,255,255,236,254,162,6,10,3,232,16,38,20,151,0,0,16,39,22,196,3,7,3,82,16,7,22,196,3,157,254,162,255,255,255,236,254,162,7,55, + 3,232,16,38,20,152,0,0,16,39,22,196,3,7,3,82,16,7,22,196,3,157,254,162,255,255,0,130,254,12,10,71,2,238,16,38,20,150,0,0, + 16,7,22,199,5,120,255,6,255,255,255,236,254,12,6,10,2,238,16,38,20,151,0,0,16,7,22,199,3,32,255,6,255,255,255,236,254,12,7,55, + 2,238,16,38,20,152,0,0,16,7,22,199,3,32,255,6,255,255,0,130,254,12,10,71,4,176,16,38,20,150,0,0,16,39,22,198,4,226,3,32, + 16,7,22,199,5,120,255,6,255,255,255,236,254,12,6,10,4,176,16,38,20,151,0,0,16,39,22,198,2,138,3,32,16,7,22,199,3,32,255,6, + 255,255,255,236,254,12,7,55,4,176,16,38,20,152,0,0,16,39,22,198,2,138,3,32,16,7,22,199,3,32,255,6,255,255,0,130,254,12,9,225, + 2,229,16,38,20,158,0,0,16,7,22,197,5,120,254,162,255,255,255,236,254,162,6,50,2,229,16,38,20,159,0,0,16,7,22,197,2,88,254,162, + 255,255,255,236,254,162,7,4,2,229,16,38,20,160,0,0,16,7,22,197,2,88,254,162,255,255,0,130,254,12,9,225,4,176,16,38,20,158,0,0, + 16,7,22,198,4,126,3,32,255,255,255,236,0,0,6,50,4,176,16,38,20,159,0,0,16,7,22,198,1,144,3,32,255,255,255,236,0,0,7,4, + 4,176,16,38,20,160,0,0,16,7,22,198,1,144,3,32,255,255,0,144,0,0,7,172,6,20,16,38,20,166,0,0,16,7,22,198,3,132,3,82, + 255,255,255,236,0,0,5,212,6,20,16,38,20,167,0,0,16,7,22,198,2,124,3,82,255,255,255,236,0,0,6,164,6,20,16,38,20,168,0,0, + 16,7,22,198,2,124,3,82,255,255,0,117,254,12,4,178,5,70,16,38,20,174,0,0,16,7,22,198,1,44,3,182,255,255,255,236,0,0,3,248, + 6,64,16,38,20,175,0,0,16,7,22,198,1,44,4,176,255,255,255,236,0,0,3,240,5,70,16,38,20,176,0,0,16,7,22,198,1,44,3,182, + 255,255,0,130,254,162,8,92,3,17,16,38,22,205,0,0,16,7,22,196,3,107,254,162,255,255,255,236,254,212,3,63,3,217,16,38,22,206,0,0, + 16,7,22,196,1,168,254,212,255,255,255,236,254,212,4,32,3,8,16,38,22,207,0,0,16,7,22,196,1,168,254,212,255,255,0,130,254,162,8,92, + 4,76,16,38,22,205,0,0,16,39,22,196,5,245,3,182,16,7,22,196,3,107,254,162,255,255,255,236,254,212,3,63,5,20,16,38,22,206,0,0, + 16,39,22,196,1,169,4,126,16,7,22,196,1,168,254,212,255,255,255,236,254,212,4,32,4,126,16,38,22,207,0,0,16,39,22,196,1,187,3,232, + 16,7,22,196,1,168,254,212,255,255,0,130,253,168,8,92,3,17,16,38,22,205,0,0,16,7,22,199,2,238,254,162,255,255,255,236,253,218,3,63, + 3,217,16,38,22,206,0,0,16,7,22,199,1,44,254,212,255,255,255,236,253,218,4,32,3,8,16,38,22,207,0,0,16,7,22,199,1,44,254,212, + 255,255,0,107,254,12,6,192,4,1,16,38,22,208,0,0,16,7,22,196,4,1,3,107,255,255,255,236,0,0,3,63,5,20,16,38,22,209,0,0, + 16,7,22,196,1,169,4,126,255,255,255,236,0,0,4,32,4,126,16,38,22,210,0,0,16,7,22,196,1,187,3,232,255,255,0,107,254,12,6,192, + 4,251,16,38,22,208,0,0,16,7,22,198,3,132,3,107,255,255,255,236,0,0,3,63,6,14,16,38,22,209,0,0,16,7,22,198,1,44,4,126, + 255,255,255,236,0,0,4,32,5,120,16,38,22,210,0,0,16,7,22,198,1,62,3,232,0,1,0,130,255,167,8,130,6,20,0,55,0,0,37,50, + 36,54,61,1,52,39,37,36,61,1,52,55,54,55,1,33,1,6,7,6,23,22,23,5,22,29,1,20,23,22,59,1,21,35,34,38,39,6,4,35, + 33,34,39,36,17,52,55,51,6,21,20,23,22,51,4,246,184,1,107,49,121,252,89,254,157,11,19,160,2,176,1,96,252,104,95,15,9,4,6,174, + 3,202,248,47,15,22,46,90,92,57,11,83,254,108,161,254,12,192,128,254,182,63,184,65,203,104,151,88,150,108,5,9,107,18,145,55,190,7,6,62, + 99,96,1,155,253,232,55,35,10,35,53,27,150,38,248,69,94,17,5,184,50,48,57,130,38,98,1,11,138,92,94,136,126,66,34,0,0,1,255,236, + 0,0,6,132,6,20,0,32,0,0,35,53,33,50,55,54,39,38,39,37,36,61,1,52,55,54,55,1,33,1,6,7,6,23,22,23,5,22,21,20, + 7,6,35,20,5,8,147,46,19,3,13,99,252,89,254,157,11,17,162,2,176,1,96,252,104,95,15,9,4,6,174,3,202,248,62,95,223,184,104,44, + 28,110,15,145,55,190,8,5,62,98,97,1,155,253,232,55,35,10,35,53,27,150,38,248,113,101,155,0,0,1,255,236,0,0,7,6,6,20,0,41, + 0,0,35,53,33,50,55,54,53,52,39,37,36,61,1,52,55,54,55,1,33,1,6,7,6,23,22,23,5,22,29,1,20,23,22,59,1,21,35,34, + 38,39,6,35,20,5,8,136,57,16,112,252,89,254,157,11,17,162,2,176,1,96,252,104,95,15,9,4,6,174,3,202,248,47,15,22,46,90,90,56, + 11,96,167,184,104,29,24,127,17,145,55,190,8,4,63,98,97,1,155,253,232,55,35,10,35,53,27,150,38,248,69,95,16,5,184,47,40,87,0,0, + 255,255,0,130,255,167,7,217,6,20,16,38,20,28,0,0,16,7,22,213,5,70,3,132,255,255,255,236,0,0,3,207,6,20,16,38,20,191,0,0, + 16,7,22,213,1,244,3,132,255,255,255,236,0,0,4,127,6,20,16,38,20,192,0,0,16,7,22,213,1,244,3,132,255,255,0,144,255,201,6,210, + 6,20,16,38,20,190,0,0,16,7,22,196,2,238,5,70,255,255,255,236,0,0,3,207,6,114,16,38,20,191,0,0,16,7,22,196,0,200,5,220, + 255,255,255,236,0,0,4,127,6,114,16,38,20,192,0,0,16,7,22,196,0,200,5,220,255,255,0,144,253,168,6,210,6,20,16,38,20,190,0,0, + 16,7,22,199,2,88,254,162,255,255,255,236,253,218,3,207,6,20,16,38,20,191,0,0,16,7,22,199,0,200,254,212,255,255,255,236,253,218,4,127, + 6,20,16,38,20,192,0,0,16,7,22,199,0,200,254,212,255,255,0,130,255,167,7,217,7,43,16,38,20,32,0,0,16,7,22,213,5,70,3,132, + 255,255,255,236,0,0,3,207,7,43,16,38,20,33,0,0,16,7,22,213,1,244,3,132,255,255,255,236,0,0,4,127,7,43,16,38,20,34,0,0, + 16,7,22,213,1,244,3,132,255,255,0,130,254,162,7,217,7,43,16,38,20,32,0,0,16,7,22,197,2,88,254,162,255,255,255,236,254,212,3,207, + 7,43,16,38,20,33,0,0,16,7,22,197,0,200,254,212,255,255,255,236,254,212,4,127,7,43,16,38,20,34,0,0,16,7,22,197,0,200,254,212, + 255,255,0,130,255,167,7,217,8,52,16,38,20,32,0,0,16,7,22,198,3,132,6,164,255,255,255,236,0,0,3,207,8,52,16,38,20,33,0,0, + 16,7,22,198,0,75,6,164,255,255,255,236,0,0,4,127,8,52,16,38,20,34,0,0,16,7,22,198,0,75,6,164,255,255,0,144,254,200,6,35, + 7,158,16,38,20,194,0,0,16,7,22,196,4,106,7,8,255,255,255,236,0,0,1,175,7,158,16,38,20,195,0,0,16,7,22,196,1,1,7,8, + 255,255,255,236,0,0,2,186,7,158,16,38,20,196,0,0,16,7,22,196,1,1,7,8,255,255,0,144,254,200,6,35,8,52,16,38,20,194,0,0, + 16,7,22,198,3,232,6,164,255,255,255,236,0,0,2,15,8,52,16,38,20,195,0,0,16,7,22,198,0,127,6,164,255,255,255,236,0,0,2,186, + 8,52,16,38,20,196,0,0,16,7,22,198,0,127,6,164,255,255,0,144,252,224,6,35,6,20,16,38,20,194,0,0,16,7,22,199,2,38,253,218, + 255,255,255,236,254,12,1,243,6,20,16,38,20,195,0,0,16,7,22,199,0,99,255,6,255,255,255,236,254,12,2,186,6,20,16,38,20,196,0,0, + 16,7,22,199,0,129,255,6,255,255,0,147,252,199,6,43,2,188,16,38,20,44,0,0,16,39,22,196,2,63,2,38,16,7,22,196,2,188,252,199, + 255,255,255,236,254,212,1,135,3,232,16,39,22,196,0,224,3,82,16,38,22,203,0,0,16,7,22,196,0,224,254,212,255,255,255,236,254,212,2,126, + 3,232,16,39,22,196,0,224,3,82,16,38,22,204,0,0,16,7,22,196,0,224,254,212,255,255,0,147,252,174,6,43,2,188,16,38,20,44,0,0, + 16,39,22,196,2,63,2,38,16,7,22,213,2,38,252,174,255,255,255,236,254,244,2,6,3,232,16,39,22,196,0,224,3,82,16,38,22,203,0,0, + 16,7,22,213,0,80,254,244,255,255,255,236,254,244,2,126,3,232,16,39,22,196,0,224,3,82,16,38,22,204,0,0,16,7,22,213,0,80,254,244, + 255,255,0,147,254,12,6,43,3,182,16,38,20,44,0,0,16,7,22,198,1,244,2,38,255,255,255,236,0,0,1,243,4,226,16,38,22,203,0,0, + 16,7,22,198,0,99,3,82,255,255,255,236,0,0,2,126,4,226,16,38,22,204,0,0,16,7,22,198,0,99,3,82,0,1,0,0,0,2,87,10, + 221,218,237,250,95,15,60,245,0,31,8,0,0,0,0,0,206,63,215,178,0,0,0,0,206,63,215,178,247,214,252,174,13,114,9,85,0,0,0,8, + 0,0,0,1,0,0,0,0,0,1,0,0,7,109,254,29,0,0,13,226,247,214,250,81,13,114,0,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,23,220,4,205,0,102,0,0,0,0,2,170,0,0,2,139,0,0,3,53,1,53,3,174,0,197,6,180,0,158,5,23,0,170,7,154,0,113, + 6,61,0,129,2,51,0,197,3,31,0,176,3,31,0,164,4,0,0,61,6,180,0,217,2,139,0,158,2,227,0,100,2,139,0,219,2,178,0,0, + 5,23,0,135,5,23,0,225,5,23,0,150,5,23,0,156,5,23,0,100,5,23,0,158,5,23,0,143,5,23,0,168,5,23,0,139,5,23,0,129, + 2,178,0,240,2,178,0,158,6,180,0,217,6,180,0,217,6,180,0,217,4,63,0,147,8,0,0,135,5,121,0,16,5,125,0,201,5,150,0,115, + 6,41,0,201,5,14,0,201,4,154,0,201,6,51,0,115,6,4,0,201,2,92,0,201,2,92,255,150,5,63,0,201,4,117,0,201,6,231,0,201, + 5,252,0,201,6,76,0,115,4,211,0,201,6,76,0,115,5,143,0,201,5,20,0,135,4,227,255,250,5,219,0,178,5,121,0,16,7,233,0,68, + 5,123,0,61,4,227,255,252,5,123,0,92,3,31,0,176,2,178,0,0,3,31,0,199,6,180,0,217,4,0,255,236,4,0,0,170,4,231,0,123, + 5,20,0,186,4,102,0,113,5,20,0,113,4,236,0,113,2,209,0,47,5,20,0,113,5,18,0,186,2,57,0,193,2,57,255,219,4,162,0,186, + 2,57,0,193,7,203,0,186,5,18,0,186,4,229,0,113,5,20,0,186,5,20,0,113,3,74,0,186,4,43,0,111,3,35,0,55,5,18,0,174, + 4,188,0,61,6,139,0,86,4,188,0,59,4,188,0,61,4,51,0,88,5,23,1,0,2,178,1,4,5,23,1,0,6,180,0,217,2,139,0,0, + 3,53,1,53,5,23,0,172,5,23,0,129,5,23,0,94,5,23,0,82,2,178,1,4,4,0,0,92,4,0,0,215,8,0,1,27,3,197,0,115, + 4,229,0,158,6,180,0,217,2,227,0,100,8,0,1,27,4,0,0,213,4,0,0,195,6,180,0,217,3,53,0,94,3,53,0,98,4,0,1,115, + 5,23,0,174,5,23,0,158,2,139,0,219,4,0,1,35,3,53,0,137,3,197,0,96,4,229,0,193,7,193,0,137,7,193,0,137,7,193,0,98, + 4,63,0,143,5,121,0,16,5,121,0,16,5,121,0,16,5,121,0,16,5,121,0,16,5,121,0,16,7,203,0,8,5,150,0,115,5,14,0,201, + 5,14,0,201,5,14,0,201,5,14,0,201,2,92,0,59,2,92,0,162,2,92,255,254,2,92,0,6,6,51,0,10,5,252,0,201,6,76,0,115, + 6,76,0,115,6,76,0,115,6,76,0,115,6,76,0,115,6,180,1,25,6,76,0,102,5,219,0,178,5,219,0,178,5,219,0,178,5,219,0,178, + 4,227,255,252,4,215,0,201,5,10,0,186,4,231,0,123,4,231,0,123,4,231,0,123,4,231,0,123,4,231,0,123,4,231,0,123,7,219,0,123, + 4,102,0,113,4,236,0,113,4,236,0,113,4,236,0,113,4,236,0,113,2,57,255,199,2,57,0,144,2,57,255,222,2,57,255,244,4,229,0,113, + 5,18,0,186,4,229,0,113,4,229,0,113,4,229,0,113,4,229,0,113,4,229,0,113,6,180,0,217,4,229,0,72,5,18,0,174,5,18,0,174, + 5,18,0,174,5,18,0,174,4,188,0,61,5,20,0,186,4,188,0,61,5,121,0,16,4,231,0,123,5,121,0,16,4,231,0,123,5,121,0,16, + 4,231,0,123,5,150,0,115,4,102,0,113,5,150,0,115,4,102,0,113,5,150,0,115,4,102,0,113,5,150,0,115,4,102,0,113,6,41,0,201, + 5,20,0,113,6,51,0,10,5,20,0,113,5,14,0,201,4,236,0,113,5,14,0,201,4,236,0,113,5,14,0,201,4,236,0,113,5,14,0,201, + 4,236,0,113,5,14,0,201,4,236,0,113,6,51,0,115,5,20,0,113,6,51,0,115,5,20,0,113,6,51,0,115,5,20,0,113,6,51,0,115, + 5,20,0,113,6,4,0,201,5,18,255,229,7,84,0,201,5,143,0,120,2,92,255,228,2,57,255,211,2,92,0,3,2,57,255,242,2,92,255,245, + 2,57,255,228,2,92,0,176,2,57,0,150,2,92,0,201,2,57,0,193,4,184,0,201,4,114,0,193,2,92,255,150,2,57,255,219,5,63,0,201, + 4,162,0,186,4,162,0,186,4,117,0,201,2,57,0,193,4,117,0,201,2,57,0,136,4,117,0,201,3,0,0,193,4,117,0,201,2,188,0,193, + 4,127,255,242,2,70,0,2,5,252,0,201,5,18,0,186,5,252,0,201,5,18,0,186,5,252,0,201,5,18,0,186,6,130,0,205,5,252,0,201, + 5,18,0,186,6,76,0,115,4,229,0,113,6,76,0,115,4,229,0,113,6,76,0,115,4,229,0,113,8,143,0,115,8,47,0,113,5,143,0,201, + 3,74,0,186,5,143,0,201,3,74,0,130,5,143,0,201,3,74,0,186,5,20,0,135,4,43,0,111,5,20,0,135,4,43,0,111,5,20,0,135, + 4,43,0,111,5,20,0,135,4,43,0,111,4,227,255,250,3,35,0,55,4,227,255,250,3,35,0,55,4,227,255,250,3,35,0,55,5,219,0,178, + 5,18,0,174,5,219,0,178,5,18,0,174,5,219,0,178,5,18,0,174,5,219,0,178,5,18,0,174,5,219,0,178,5,18,0,174,5,219,0,178, + 5,18,0,174,7,233,0,68,6,139,0,86,4,227,255,252,4,188,0,61,4,227,255,252,5,123,0,92,4,51,0,88,5,123,0,92,4,51,0,88, + 5,123,0,92,4,51,0,88,2,209,0,47,5,20,0,32,5,225,255,151,5,125,0,201,5,20,0,186,5,125,0,0,5,20,0,0,5,160,0,115, + 5,150,0,115,4,102,0,113,6,51,0,10,6,141,255,151,5,125,0,201,5,20,0,113,4,229,0,113,5,14,0,131,6,76,0,117,4,234,0,164, + 4,154,255,150,2,209,255,127,6,51,0,115,5,126,0,8,7,223,0,186,2,212,0,201,2,92,0,10,5,247,0,201,4,162,0,185,2,57,0,10, + 4,188,0,61,7,203,0,178,5,252,255,150,5,18,0,186,6,76,0,115,7,78,0,103,4,229,0,118,7,151,0,115,6,19,0,113,5,55,255,151, + 5,20,0,185,5,143,0,201,5,20,0,114,4,43,0,100,5,14,0,201,2,176,254,242,3,35,0,55,4,227,0,24,3,35,0,55,4,227,255,250, + 6,221,0,173,5,18,0,176,6,29,0,78,5,196,0,201,5,243,255,252,5,216,0,61,5,123,0,92,4,51,0,88,5,84,0,160,5,84,0,92, + 4,159,0,104,4,51,0,113,5,23,0,150,5,84,0,93,4,159,0,104,4,21,0,88,5,20,0,186,2,92,0,201,3,240,0,201,3,172,0,20, + 2,93,0,201,11,96,0,201,10,100,0,201,9,60,0,113,6,175,0,201,6,75,0,201,3,167,0,193,7,115,0,201,7,100,0,201,6,97,0,186, + 5,121,0,16,4,231,0,123,2,92,255,254,2,57,255,224,6,76,0,115,4,229,0,113,5,219,0,178,5,18,0,174,5,219,0,178,5,18,0,174, + 5,219,0,178,5,18,0,174,5,219,0,178,5,18,0,174,5,219,0,178,5,18,0,174,4,236,0,113,5,121,0,16,4,231,0,123,5,121,0,16, + 4,231,0,123,7,203,0,8,7,219,0,123,6,51,0,115,5,20,0,113,6,51,0,115,5,20,0,113,5,63,0,201,4,162,255,233,6,76,0,115, + 4,229,0,113,6,76,0,115,4,229,0,113,5,84,0,160,4,159,0,88,2,57,255,219,11,96,0,201,10,100,0,201,9,60,0,113,6,51,0,115, + 5,20,0,113,8,231,0,201,5,117,0,201,5,252,0,201,5,18,0,186,5,121,0,16,4,231,0,123,7,203,0,8,7,219,0,123,6,76,0,102, + 4,229,0,72,5,121,0,16,4,231,0,123,5,121,0,16,4,231,0,123,5,14,0,201,4,236,0,113,5,14,0,201,4,236,0,113,2,92,255,167, + 2,57,255,195,2,92,0,5,2,57,255,227,6,76,0,115,4,229,0,113,6,76,0,115,4,229,0,113,5,143,0,199,3,74,0,130,5,143,0,201, + 3,74,0,186,5,219,0,178,5,18,0,174,5,219,0,178,5,18,0,174,5,20,0,135,4,43,0,111,4,227,255,250,3,35,0,55,5,4,0,156, + 4,44,0,71,6,4,0,201,5,18,255,240,5,226,0,201,6,180,0,113,5,150,0,113,4,226,0,113,5,123,0,92,4,51,0,88,5,121,0,16, + 4,231,0,123,5,14,0,201,4,236,0,113,6,76,0,115,4,229,0,113,6,76,0,115,4,229,0,113,6,76,0,115,4,229,0,113,6,76,0,115, + 4,229,0,113,4,227,255,252,4,188,0,61,3,204,0,138,6,190,0,186,3,209,0,55,2,57,255,219,7,252,0,113,7,252,0,113,5,121,255,253, + 5,150,0,12,4,102,0,9,4,117,0,10,4,227,255,178,4,43,0,111,4,51,0,88,4,211,0,80,3,213,0,80,5,125,0,10,5,219,0,12, + 5,121,0,16,5,14,0,201,4,236,0,113,2,92,255,150,2,57,255,219,6,64,0,115,5,20,0,113,5,143,0,10,3,74,0,14,4,227,255,246, + 4,188,0,11,4,205,0,174,5,20,0,113,5,20,0,186,5,20,0,186,4,101,0,127,4,102,0,113,5,20,0,113,5,146,0,113,4,236,0,113, + 4,236,0,113,6,142,0,124,4,83,0,133,4,65,0,133,6,52,0,133,5,80,0,113,2,57,255,219,5,145,0,113,5,20,0,113,5,9,0,113, + 4,196,0,96,4,196,0,96,5,18,0,174,5,18,0,186,5,18,0,186,2,57,0,14,2,181,0,166,2,249,0,116,3,42,0,75,3,230,0,77, + 2,58,0,193,5,166,0,193,7,203,0,186,7,203,0,186,7,203,0,186,5,43,255,219,5,35,0,186,5,18,0,179,4,229,0,113,6,221,0,113, + 5,211,0,148,5,71,0,112,3,80,0,0,3,80,0,0,3,79,0,0,3,74,0,186,3,73,0,186,4,62,0,132,4,62,0,116,4,212,0,186, + 4,212,0,186,4,43,0,111,2,176,255,217,2,176,255,217,3,177,0,55,2,176,254,242,3,35,0,55,3,35,0,55,5,18,0,0,4,241,0,113, + 4,201,0,193,4,188,0,61,6,139,0,86,4,188,0,61,4,227,0,102,4,51,0,88,4,51,0,88,4,159,0,88,4,159,0,109,4,21,0,88, + 4,21,0,88,4,21,0,88,4,21,0,88,6,76,0,115,4,163,0,186,5,80,0,113,5,170,0,113,5,59,0,186,2,86,254,242,5,86,0,186, + 4,14,0,186,5,209,0,113,4,21,0,88,4,21,0,88,8,29,0,113,8,118,0,113,8,26,0,113,6,164,0,55,4,225,0,55,6,58,0,55, + 6,201,0,47,5,165,0,193,5,60,0,193,4,31,0,54,4,31,0,54,5,74,0,0,5,79,0,0,3,60,0,117,3,49,0,117,1,102,255,233, + 2,18,0,117,2,93,0,72,2,94,0,72,3,8,0,32,4,31,0,54,2,251,0,38,2,58,0,160,3,174,0,160,2,139,0,174,2,139,0,178, + 2,139,0,196,2,117,0,117,2,117,0,117,2,245,0,117,2,245,0,117,4,0,1,11,4,0,1,11,4,0,0,193,4,0,0,193,4,0,0,193, + 4,0,0,193,2,51,0,214,4,0,0,213,4,0,1,115,4,0,0,170,2,51,0,214,4,0,0,213,4,0,0,170,4,0,1,115,2,178,0,111, + 2,178,0,111,2,117,0,117,2,117,0,117,4,0,1,31,4,0,1,31,3,30,0,100,2,138,0,100,4,0,0,199,4,0,1,154,4,0,0,238, + 4,0,1,76,4,0,0,182,4,0,0,240,2,134,255,255,4,0,0,239,3,104,0,117,1,84,0,122,2,252,0,117,3,141,0,117,2,245,0,117, + 3,242,0,214,3,242,0,214,3,242,0,214,3,242,0,214,3,242,0,214,4,0,0,193,4,0,0,213,4,37,0,174,4,0,0,238,4,0,0,182, + 0,0,252,168,0,0,253,113,0,0,252,193,0,0,252,180,0,0,252,217,0,0,251,236,0,0,252,191,0,0,253,162,0,0,252,215,0,0,253,55, + 0,0,252,236,0,0,252,244,0,0,252,197,0,0,253,188,0,0,252,240,0,0,252,93,0,0,252,191,0,0,252,191,0,0,254,31,0,0,253,144, + 0,0,253,144,0,0,255,121,0,0,252,168,0,0,253,113,0,0,253,36,0,0,253,196,0,0,254,85,0,0,254,240,0,0,253,128,0,0,253,11, + 0,0,253,11,0,0,253,36,0,0,253,11,0,0,253,122,0,0,253,119,0,0,253,162,0,0,252,213,0,0,253,40,0,0,253,106,0,0,253,35, + 0,0,253,76,0,0,253,188,0,0,252,240,0,0,252,99,0,0,252,197,0,0,252,191,0,0,252,191,0,0,252,191,0,0,252,180,0,0,252,217, + 0,0,251,236,0,0,251,236,0,0,251,140,0,0,253,120,0,0,250,237,0,0,251,104,0,0,250,18,0,0,253,172,0,0,252,241,0,0,253,33, + 0,0,252,99,0,0,253,43,0,0,254,6,0,0,251,236,0,0,252,168,0,0,253,113,0,0,252,180,0,0,253,144,0,0,252,231,0,0,253,198, + 0,0,252,213,0,0,253,31,0,0,253,21,0,0,253,31,0,0,252,182,0,0,252,182,0,0,252,182,0,0,252,99,0,0,253,51,0,0,0,0, + 0,0,253,120,0,0,252,191,0,0,253,43,0,0,253,120,0,0,255,46,0,0,252,144,0,0,252,112,0,0,252,112,0,0,252,112,0,0,252,112, + 0,0,253,42,0,0,252,112,0,0,252,119,5,60,0,201,4,139,0,193,6,229,0,201,5,46,0,201,2,58,0,160,2,58,0,160,5,252,0,201, + 5,51,0,186,4,0,1,182,4,101,0,127,4,102,0,113,4,101,0,127,2,178,0,158,4,0,1,115,4,0,0,215,5,138,0,16,2,139,0,219, + 5,248,255,231,6,248,255,243,3,68,255,237,6,128,255,242,6,153,255,225,6,155,255,219,2,181,0,5,5,121,0,16,5,125,0,201,4,117,0,201, + 5,121,0,16,5,14,0,201,5,123,0,92,6,4,0,201,6,76,0,115,2,92,0,201,5,63,0,201,5,121,0,16,6,231,0,201,5,252,0,201, + 5,14,0,201,6,76,0,115,6,4,0,201,4,211,0,201,5,14,0,201,4,227,255,250,4,227,255,252,6,76,0,115,5,123,0,61,6,76,0,115, + 6,29,0,78,2,92,0,6,4,227,255,252,5,70,0,113,4,83,0,133,5,18,0,186,2,181,0,166,4,161,0,149,5,70,0,113,5,27,0,192, + 4,188,0,32,4,229,0,113,4,83,0,133,4,90,0,107,5,18,0,186,4,229,0,113,2,181,0,166,4,183,0,191,4,188,0,61,5,23,0,174, + 4,120,0,74,4,118,0,107,4,229,0,113,4,209,0,74,5,20,0,186,4,178,0,113,5,18,0,113,4,209,0,100,4,161,0,149,5,71,0,112, + 4,159,0,59,5,71,0,112,6,179,0,135,2,181,0,5,4,161,0,149,4,229,0,113,4,161,0,149,6,179,0,135,5,63,0,201,4,234,0,167, + 4,244,0,113,5,151,0,87,6,189,255,225,5,151,0,87,5,71,0,112,6,179,0,65,5,79,0,112,6,76,0,115,4,229,0,113,5,48,0,139, + 4,178,0,113,4,154,0,201,3,171,255,64,5,71,0,179,5,71,0,191,6,236,0,114,5,5,0,119,7,120,0,115,6,179,0,135,6,17,0,115, + 5,70,0,113,6,85,0,201,4,235,0,45,5,126,0,79,4,219,0,100,6,36,0,115,5,0,0,54,5,152,0,115,4,229,0,113,4,227,0,44, + 4,74,0,55,5,79,0,112,5,20,0,186,4,102,0,113,2,57,255,219,6,76,0,115,4,236,0,113,4,236,0,196,4,215,0,201,5,20,0,186, + 5,150,0,115,6,231,0,201,5,53,0,127,5,20,0,85,5,160,0,115,5,150,0,115,5,160,0,115,5,14,0,201,5,14,0,201,6,74,255,250, + 4,225,0,201,5,150,0,115,5,20,0,135,2,92,0,201,2,92,0,6,2,92,255,150,8,192,0,84,8,92,0,201,6,74,255,250,5,174,0,201, + 5,252,0,201,4,224,0,35,6,4,0,201,5,121,0,16,5,125,0,201,5,125,0,201,4,225,0,201,6,64,0,101,5,14,0,201,8,158,0,40, + 5,33,0,135,5,252,0,201,5,252,0,201,5,174,0,201,6,4,0,84,6,231,0,201,6,4,0,201,6,76,0,115,6,4,0,201,4,211,0,201, + 5,150,0,115,4,227,255,250,4,224,0,35,6,227,0,121,5,123,0,61,6,54,0,201,5,124,0,175,8,142,0,201,8,192,0,201,6,169,0,60, + 7,15,0,201,5,125,0,201,5,150,0,111,8,163,0,211,5,143,0,136,4,231,0,123,4,239,0,112,4,183,0,186,4,52,0,186,5,136,0,107, + 4,236,0,113,7,53,0,70,4,65,0,133,5,51,0,186,5,51,0,186,4,213,0,186,5,29,0,76,6,9,0,186,5,59,0,186,4,229,0,113, + 5,59,0,186,5,20,0,186,4,102,0,113,4,169,0,60,4,188,0,61,6,215,0,112,4,188,0,59,5,114,0,186,4,186,0,150,7,82,0,186, + 7,137,0,186,5,167,0,62,6,81,0,186,4,183,0,186,4,100,0,113,6,188,0,193,4,208,0,116,4,236,0,113,4,236,0,113,5,0,0,47, + 4,52,0,186,4,100,0,113,4,43,0,111,2,57,0,193,2,57,255,244,2,57,255,219,7,56,0,76,7,48,0,186,5,55,0,47,4,213,0,186, + 5,51,0,186,4,188,0,61,5,59,0,186,7,120,0,115,6,179,0,135,6,42,0,30,5,96,0,30,7,138,0,211,5,254,0,193,7,9,0,16, + 6,68,0,51,9,71,0,201,8,3,0,193,6,76,0,115,4,229,0,107,8,55,0,201,6,152,0,193,5,23,0,115,4,83,0,91,6,218,0,16, + 7,3,0,50,6,76,0,115,4,229,0,113,6,64,0,16,5,82,0,50,6,64,0,16,5,82,0,50,7,240,0,115,7,60,0,113,7,160,0,115, + 6,17,0,113,9,112,0,118,8,57,0,152,7,120,0,115,6,179,0,135,5,150,0,115,4,102,0,113,4,5,0,59,0,0,251,218,0,0,253,7, + 0,0,253,179,0,0,253,179,0,0,249,202,3,88,247,214,3,88,248,88,6,46,0,201,5,106,0,193,5,125,0,33,4,183,0,38,4,211,0,201, + 5,20,0,186,4,225,0,201,4,52,0,186,5,102,0,71,4,185,0,56,4,254,0,201,4,61,0,186,8,158,0,40,7,53,0,70,5,33,0,135, + 4,65,0,133,5,174,0,201,4,213,0,186,5,174,0,201,4,213,0,186,5,174,0,33,4,213,0,61,6,218,0,50,6,167,0,42,6,4,0,201, + 5,73,0,193,8,29,0,201,7,4,0,193,8,166,0,201,7,83,0,193,7,6,0,115,5,139,0,113,5,150,0,115,4,102,0,113,4,227,255,250, + 4,169,0,60,4,227,255,252,4,188,0,61,4,227,255,252,4,188,0,61,5,123,0,61,4,188,0,59,7,121,255,250,6,116,0,5,5,124,0,175, + 4,186,0,150,5,124,0,175,4,186,0,150,5,124,0,175,5,18,0,186,7,135,0,20,5,211,0,15,7,135,0,20,5,211,0,15,2,92,0,201, + 8,158,0,40,7,53,0,70,5,63,0,201,4,213,0,191,6,53,0,54,5,93,0,46,6,4,0,201,5,73,0,193,6,54,0,201,5,114,0,193, + 5,124,0,175,4,186,0,150,7,26,0,201,6,50,0,193,2,57,0,193,5,121,0,16,4,231,0,123,5,121,0,16,4,231,0,123,7,203,0,8, + 7,219,0,123,5,14,0,201,4,236,0,113,6,76,0,117,4,236,0,113,6,76,0,117,4,236,0,113,8,158,0,40,7,53,0,70,5,33,0,135, + 4,65,0,133,5,84,0,160,4,159,0,88,5,252,0,201,5,51,0,186,5,252,0,201,5,51,0,186,6,76,0,115,4,229,0,113,6,76,0,115, + 4,229,0,113,6,76,0,115,4,229,0,113,5,150,0,111,4,100,0,113,4,224,0,35,4,188,0,61,4,224,0,35,4,188,0,61,4,224,0,35, + 4,188,0,61,5,124,0,175,4,186,0,150,4,225,0,201,4,52,0,186,7,15,0,201,6,81,0,186,5,102,0,71,4,185,0,56,5,123,0,61, + 4,188,0,59,5,123,0,61,4,188,0,59,5,125,0,145,4,183,0,113,8,12,0,145,7,45,0,113,7,204,0,201,6,244,0,171,5,110,0,201, + 4,181,0,171,8,147,0,54,7,168,0,46,8,231,0,201,7,189,0,193,6,51,0,115,5,71,0,113,6,47,255,250,5,176,0,5,4,234,0,164, + 4,83,0,133,6,4,0,84,5,29,0,76,9,90,0,84,7,243,0,76,7,39,0,201,6,234,0,186,8,65,0,136,7,227,0,116,6,76,0,115, + 5,20,0,113,7,233,0,68,6,139,0,86,5,174,0,201,4,213,0,186,8,165,0,84,7,62,0,76,8,166,0,201,7,76,0,186,6,88,0,201, + 5,118,0,186,6,33,0,178,5,219,0,178,6,7,0,93,6,7,0,90,5,219,0,178,6,45,0,178,5,31,0,188,5,219,0,178,6,224,0,178, + 6,7,0,93,5,135,0,188,4,68,0,188,7,96,0,188,6,232,1,8,5,219,0,178,5,186,0,70,6,32,0,168,6,7,0,100,6,35,0,105, + 6,85,0,178,5,210,0,146,5,213,0,0,6,15,0,160,5,219,0,178,5,180,0,120,6,103,0,90,6,37,0,168,6,85,0,178,5,219,0,178, + 6,7,0,100,5,164,0,150,5,141,0,178,5,243,0,160,4,77,0,188,6,124,0,120,6,14,0,50,6,76,0,115,6,82,0,110,2,117,0,117, + 2,139,0,178,1,224,0,0,2,228,0,5,1,231,255,255,3,62,0,8,4,0,0,90,7,203,0,174,5,18,0,186,5,67,0,113,5,78,0,186, + 5,18,0,174,5,20,0,113,4,30,0,186,5,18,0,186,5,232,0,186,5,67,0,113,5,18,0,186,2,44,0,186,7,215,0,186,4,251,0,113, + 5,18,0,174,5,18,0,186,4,221,0,106,5,19,0,186,5,8,0,140,5,18,0,174,2,44,255,212,5,18,255,217,3,253,0,0,5,18,0,186, + 3,60,0,10,7,203,0,174,4,123,0,110,5,48,0,186,5,18,0,174,5,18,0,174,7,202,0,174,5,18,0,186,5,17,0,111,3,122,0,186, + 7,202,0,174,5,23,0,41,4,224,0,111,6,113,0,70,6,126,0,174,2,178,0,240,2,227,0,100,0,0,2,68,0,0,0,171,0,0,0,255, + 0,0,0,255,0,0,2,68,0,0,1,199,0,0,1,199,0,0,1,99,0,0,1,99,0,0,0,0,0,0,0,0,0,0,1,47,0,0,2,78, + 0,0,2,68,2,227,0,100,0,0,1,99,2,92,0,209,0,0,5,25,0,0,0,197,2,92,0,209,3,136,0,102,0,0,1,99,5,89,0,186, + 4,160,0,88,3,76,0,88,4,94,0,88,5,58,0,186,2,46,0,186,2,197,0,88,5,58,0,186,5,48,0,185,1,202,0,136,4,76,0,88, + 4,59,0,88,4,140,0,88,5,79,0,186,5,111,0,88,2,46,0,186,3,52,0,88,5,49,0,185,5,2,0,88,5,30,0,186,4,255,0,186, + 4,81,0,88,4,191,0,88,5,173,0,186,4,132,0,88,5,171,0,88,5,66,0,20,3,196,0,186,3,98,0,136,2,165,0,136,3,83,0,186, + 5,40,0,186,5,25,0,0,5,25,0,0,6,14,0,133,7,208,0,133,2,149,0,219,0,0,0,252,2,139,0,219,4,63,0,147,3,195,0,163, + 2,57,255,181,2,57,0,108,3,221,255,171,2,57,0,108,6,67,0,130,2,57,0,193,7,136,0,130,4,49,0,139,7,136,0,130,7,136,0,130, + 5,42,0,157,5,42,0,157,5,42,0,157,3,144,0,125,3,144,0,125,3,221,255,171,3,221,255,171,9,196,0,130,9,196,0,130,9,172,0,130, + 9,172,0,130,7,102,0,144,7,102,0,144,4,198,0,117,4,198,0,117,2,88,255,236,8,75,0,130,6,53,0,107,6,152,0,144,5,208,0,144, + 4,244,0,140,5,224,0,147,4,49,0,139,3,221,255,171,6,67,0,130,6,67,0,130,0,0,0,220,0,0,0,220,0,0,0,220,0,0,0,220, + 0,0,0,220,0,0,0,220,0,0,0,200,0,0,0,236,0,0,0,152,0,0,1,79,0,0,1,79,0,0,0,220,4,0,0,243,4,76,1,184, + 4,76,1,22,4,76,0,82,4,76,0,76,4,76,0,175,4,76,0,135,4,76,0,85,4,76,0,60,4,76,0,60,4,76,0,100,4,76,0,133, + 2,153,0,0,2,139,0,178,4,92,0,87,7,136,0,130,6,53,0,107,0,0,1,201,2,86,0,122,7,136,0,130,7,136,0,130,7,136,0,130, + 7,136,0,130,7,136,0,130,7,136,0,130,7,136,0,130,7,136,0,130,5,42,0,157,5,42,0,157,5,42,0,157,5,42,0,157,5,42,0,157, + 5,42,0,157,5,42,0,157,3,144,0,125,3,144,0,125,3,144,0,125,3,144,0,125,3,144,0,125,3,144,0,125,3,144,0,125,3,144,0,125, + 3,144,0,125,3,221,255,171,3,221,255,171,3,252,255,171,4,61,255,171,4,226,255,171,4,61,255,171,3,221,255,171,3,221,255,171,3,221,255,171, + 9,196,0,130,9,196,0,130,9,196,0,130,9,172,0,130,9,172,0,130,7,102,0,144,4,198,0,117,8,75,0,130,8,75,0,130,8,75,0,130, + 8,75,0,130,8,75,0,130,8,75,0,130,6,53,0,107,6,53,0,107,7,41,0,130,8,110,0,130,7,41,0,130,6,152,0,144,6,152,0,144, + 6,152,0,144,7,41,0,130,7,41,0,130,7,41,0,130,7,41,0,130,7,41,0,130,7,41,0,130,5,208,0,144,5,208,0,144,5,208,0,144, + 5,208,0,144,5,224,0,147,5,224,0,147,5,224,0,147,5,224,0,147,5,224,0,147,5,150,0,144,5,42,0,157,3,221,255,171,6,67,0,130, + 6,67,0,130,4,49,0,139,4,76,1,184,4,76,1,22,4,76,0,82,4,76,0,76,4,76,0,82,4,76,0,106,4,76,0,208,4,76,0,60, + 4,76,0,60,4,76,0,100,5,23,0,135,5,23,0,225,5,23,0,225,5,23,0,225,5,23,0,225,5,23,0,225,5,23,0,225,5,23,0,214, + 5,23,0,214,5,23,0,157,2,57,0,193,4,146,0,113,3,100,0,61,4,188,0,61,5,59,0,186,5,59,0,186,4,192,0,113,5,59,0,186, + 6,161,0,113,3,129,0,193,3,129,0,61,4,120,0,186,4,229,0,193,2,205,0,61,7,172,0,193,3,200,0,61,6,68,0,61,5,59,0,186, + 5,0,0,61,5,223,0,193,4,61,0,193,5,203,0,112,3,200,0,61,5,0,0,61,4,192,0,113,4,61,0,193,4,61,0,193,4,46,0,193, + 4,192,0,113,4,192,0,113,0,0,0,217,0,0,0,66,0,0,1,164,0,0,0,191,0,0,0,91,0,0,0,66,0,0,0,91,0,0,1,154, + 0,0,0,213,2,130,0,200,2,130,0,200,4,123,0,100,4,123,0,100,2,227,255,236,5,23,0,176,5,93,0,130,5,120,0,139,5,129,0,137, + 3,220,0,109,5,6,0,127,5,120,0,139,5,128,0,115,5,91,0,186,5,34,0,129,5,41,0,0,5,62,0,87,5,69,0,95,5,0,0,73, + 5,0,0,73,5,246,0,89,6,34,0,186,5,126,0,104,5,126,0,104,5,157,0,64,5,128,0,115,5,120,0,139,5,50,0,79,5,15,0,115, + 5,160,0,79,6,141,0,127,5,16,0,115,5,120,0,139,6,77,0,203,5,15,0,111,0,0,251,96,4,80,0,123,4,80,252,154,0,0,251,64, + 0,0,251,64,0,0,251,64,0,0,251,64,0,0,252,254,0,0,252,167,0,0,251,96,0,0,251,28,5,78,0,129,3,0,0,122,5,66,0,122, + 3,174,255,211,4,97,0,92,3,238,0,188,5,100,0,147,0,0,253,18,0,0,251,127,0,0,251,62,0,0,252,78,0,0,251,28,0,0,252,154, + 5,23,0,135,5,32,0,99,5,32,0,99,5,93,0,22,5,0,0,99,5,0,0,99,5,160,0,89,5,93,0,130,5,100,0,150,5,106,0,105, + 8,58,0,127,8,58,0,127,6,254,0,120,5,222,0,110,5,110,0,111,6,173,0,110,4,236,0,100,6,36,0,80,6,7,0,60,7,80,0,121, + 3,160,0,60,4,245,0,120,6,190,0,60,7,15,0,120,4,255,0,130,6,214,0,100,6,64,0,50,5,9,0,80,7,75,0,110,4,247,0,130, + 4,246,0,130,6,214,0,100,6,237,0,100,5,202,0,90,5,10,0,131,4,247,0,110,5,0,0,120,4,245,0,130,6,139,0,121,6,253,0,120, + 4,236,0,130,4,252,0,100,5,0,0,130,5,204,0,60,6,193,0,60,4,196,0,130,5,130,0,111,4,196,0,60,4,192,0,110,5,232,0,80, + 4,16,0,100,4,36,0,100,4,166,0,90,6,139,0,100,4,16,0,100,4,26,0,100,4,1,0,41,6,104,0,100,4,36,0,100,4,21,0,90, + 8,132,0,100,4,46,0,100,4,46,0,130,6,74,0,100,4,16,0,100,4,36,0,100,6,94,0,100,4,46,0,130,5,60,0,90,4,46,0,10, + 6,154,0,100,4,26,0,100,6,74,0,100,4,36,0,100,4,36,0,60,4,46,0,130,4,146,0,90,4,46,0,100,4,36,0,131,4,41,0,100, + 4,46,0,130,3,162,0,20,4,16,0,100,4,36,0,120,4,16,0,100,4,16,0,100,4,36,0,100,4,111,0,100,6,159,0,100,4,106,0,90, + 4,16,0,100,4,146,0,80,4,16,0,100,3,149,0,110,2,151,0,100,5,121,0,16,5,121,0,16,5,121,0,16,5,121,0,16,6,39,0,201, + 6,39,0,201,6,39,0,201,6,39,0,201,6,39,0,119,6,39,0,119,6,174,0,201,6,173,0,16,6,174,0,201,6,173,0,16,6,174,0,201, + 6,173,0,16,7,188,0,201,8,14,0,201,7,188,0,201,8,14,0,201,6,39,0,201,7,188,0,201,8,14,0,119,7,188,0,201,8,14,0,119, + 6,39,0,119,2,12,0,201,4,88,0,137,3,99,0,94,3,99,0,94,3,29,0,137,3,29,0,137,3,37,0,137,3,29,0,137,3,186,0,72, + 3,21,0,137,2,12,0,201,3,29,0,137,3,29,0,137,3,29,0,137,8,184,0,16,7,69,0,16,7,160,0,201,8,239,0,119,5,121,0,16, + 5,121,0,16,5,121,0,16,5,121,0,16,5,213,0,119,5,213,0,119,5,213,0,119,5,213,0,119,5,213,0,119,5,213,0,119,6,174,0,201, + 5,121,0,16,6,174,0,201,6,173,0,16,6,174,0,201,6,173,0,16,7,188,0,201,8,14,0,119,7,188,0,201,8,14,0,119,7,188,0,201, + 8,14,0,119,7,188,0,201,8,14,0,119,5,213,0,119,4,17,0,137,1,137,0,137,5,219,0,178,5,219,0,178,5,219,0,178,5,219,0,178, + 5,215,0,119,5,215,0,119,5,215,0,119,5,215,0,119,5,215,0,121,5,215,0,121,7,94,0,201,7,28,0,178,7,94,0,201,7,28,0,178, + 7,94,0,201,7,28,0,178,7,108,0,201,7,52,0,119,7,108,0,201,7,52,0,119,7,148,0,201,7,52,0,121,7,148,0,201,7,52,0,121, + 7,148,0,240,3,121,0,137,7,5,0,178,7,5,0,178,6,237,0,119,7,31,0,121,5,7,0,70,5,7,0,201,5,7,0,201,5,7,0,201, + 5,7,0,70,5,7,0,70,5,7,0,70,5,7,0,201,5,7,0,201,6,225,0,201,6,42,0,70,6,133,0,201,6,135,0,201,6,133,0,201, + 6,135,0,201,6,225,0,201,6,42,0,70,6,225,0,201,6,42,0,70,6,133,0,201,6,135,0,201,6,133,0,201,6,135,0,201,6,133,0,240, + 3,65,0,137,3,65,0,56,6,1,0,70,6,51,0,201,6,1,0,70,6,51,0,201,5,7,0,70,5,7,0,201,5,7,0,201,5,7,0,201, + 5,7,0,70,5,7,0,70,5,7,0,70,5,7,0,201,5,7,0,201,6,225,0,201,6,42,0,70,6,133,0,201,6,135,0,201,6,133,0,201, + 6,135,0,201,6,225,0,201,6,42,0,70,6,225,0,201,6,42,0,70,6,133,0,201,6,135,0,201,6,133,0,201,6,135,0,201,6,133,0,240, + 3,122,0,137,3,122,0,137,4,225,0,119,4,117,0,201,4,117,0,201,4,117,0,201,4,225,0,119,4,225,0,119,4,225,0,119,4,117,0,201, + 4,117,0,201,5,254,0,201,6,38,0,119,5,248,0,201,6,28,0,201,5,248,0,201,6,28,0,201,5,254,0,201,6,38,0,119,5,254,0,201, + 6,38,0,119,5,248,0,201,6,28,0,201,5,248,0,201,6,28,0,201,5,248,0,240,3,22,0,137,4,17,0,137,3,22,0,137,6,208,0,119, + 6,208,0,70,6,208,0,70,6,208,0,11,6,208,0,119,6,208,0,119,6,208,0,119,6,208,0,70,6,208,0,70,8,142,0,201,8,71,0,119, + 8,121,0,201,6,208,0,70,8,121,0,201,6,208,0,70,6,208,0,70,4,205,0,137,3,159,0,137,4,205,0,137,6,208,0,119,6,208,0,70, + 6,208,0,70,6,208,0,70,6,208,0,119,6,208,0,119,6,208,0,119,6,208,0,70,6,208,0,70,8,142,0,201,8,71,0,119,8,121,0,201, + 8,61,0,70,8,121,0,201,8,61,0,70,8,142,0,201,8,71,0,119,8,142,0,201,8,71,0,119,8,170,0,201,8,61,0,70,8,170,0,201, + 8,61,0,70,4,205,0,137,5,213,0,119,4,211,0,70,4,211,0,201,4,211,0,201,4,211,0,201,4,211,0,70,4,211,0,70,4,211,0,70, + 4,211,0,201,4,211,0,201,6,173,0,201,6,8,0,70,6,86,0,201,6,43,0,201,6,86,0,201,6,43,0,201,6,173,0,201,6,8,0,70, + 6,173,0,201,6,8,0,70,6,86,0,201,6,43,0,201,6,86,0,201,6,43,0,201,6,86,0,240,3,89,0,137,3,93,0,137,3,89,0,137, + 5,178,0,70,5,178,0,70,5,178,0,70,7,34,0,70,7,34,0,70,7,34,0,70,7,34,0,70,7,71,0,201,6,250,0,70,7,71,0,201, + 6,250,0,70,7,71,0,201,6,250,0,70,9,31,0,201,8,204,0,70,9,31,0,201,8,204,0,70,9,31,0,201,8,204,0,70,9,31,0,201, + 8,204,0,70,5,32,0,137,5,4,0,119,5,4,0,201,5,4,0,201,5,4,0,201,5,4,0,119,5,4,0,119,5,4,0,119,5,4,0,201, + 5,4,0,201,6,193,0,201,6,63,0,119,6,135,0,201,6,140,0,201,6,135,0,201,6,140,0,201,6,193,0,201,6,63,0,119,6,193,0,201, + 6,63,0,119,6,135,0,201,6,140,0,201,6,135,0,201,6,140,0,201,6,135,0,240,3,89,0,137,3,29,0,137,3,224,0,137,7,83,0,201, + 7,83,0,119,7,83,0,119,7,83,0,201,7,83,0,201,7,83,0,201,4,211,0,201,4,211,0,201,4,211,0,201,4,211,0,70,4,211,0,70, + 4,211,0,70,6,173,0,201,6,8,0,70,3,89,0,137,5,213,0,119,5,121,0,150,5,121,0,150,5,121,0,150,5,121,0,150,5,207,0,77, + 5,207,0,77,5,207,0,119,5,207,0,119,7,100,0,201,8,14,0,119,4,17,0,137,5,219,0,178,5,219,0,178,5,219,0,178,5,219,0,178, + 5,219,0,178,5,219,0,178,5,215,0,83,5,215,0,83,5,215,0,121,5,215,0,121,7,148,0,201,7,52,0,121,4,17,0,137,6,165,0,70, + 6,165,0,119,6,165,0,119,6,165,0,70,6,165,0,70,6,165,0,119,6,165,0,119,4,130,0,137,6,4,0,201,3,224,0,137,8,96,0,137, + 8,96,0,137,8,96,0,137,8,96,0,137,8,96,0,137,8,96,0,137,8,96,0,137,6,154,0,137,6,165,0,70,6,165,0,119,6,165,0,70, + 6,165,0,119,10,19,0,137,10,19,0,137,10,19,0,137,8,4,0,137,8,4,0,137,10,19,0,137,10,19,0,137,5,153,0,137,8,149,0,137, + 6,208,0,70,6,208,0,70,6,208,0,119,6,208,0,119,6,208,0,70,6,208,0,70,4,205,0,137,5,37,0,119,5,37,0,33,5,37,0,33, + 5,37,0,119,5,37,0,119,5,37,0,33,5,37,0,33,3,89,0,10,5,7,0,201,6,41,0,201,6,35,0,115,3,191,0,137,3,191,0,137, + 3,141,0,117,8,96,0,137,10,122,0,137,13,15,0,137,13,15,0,137,11,0,0,137,11,0,0,137,13,15,0,137,13,15,0,137,3,209,255,236, + 3,241,255,236,5,178,255,236,7,115,255,236,9,52,255,236,10,245,255,236,3,241,255,236,5,178,255,236,7,115,255,236,9,51,255,236,10,245,255,236, + 3,252,255,236,5,191,255,236,7,130,255,236,9,69,255,236,11,8,255,236,3,241,255,236,5,178,255,236,7,112,255,236,9,50,255,236,10,245,255,236, + 3,252,255,236,6,5,255,236,6,79,255,236,9,163,255,236,9,51,255,236,5,119,255,236,4,15,0,113,4,14,255,236,4,188,0,61,5,189,0,11, + 7,219,0,123,4,176,0,62,4,102,0,113,4,215,0,186,4,215,0,36,3,237,0,186,4,83,0,130,2,57,0,193,3,40,0,0,4,162,0,186, + 4,170,0,2,6,9,0,186,5,51,0,186,4,229,0,113,4,102,0,127,5,121,0,113,5,121,0,113,5,121,0,51,8,47,0,113,4,229,0,113, + 4,229,0,113,4,50,0,151,4,208,0,50,4,208,0,50,4,169,0,60,4,152,0,186,5,229,0,174,7,149,0,174,5,26,0,47,4,188,0,61, + 6,139,0,86,4,51,0,88,4,53,0,120,4,170,0,179,4,188,0,61,4,131,0,151,4,50,0,151,4,185,0,90,5,29,0,76,3,114,0,10, + 4,232,0,5,3,117,0,127,3,225,0,127,3,47,0,127,3,47,0,83,3,231,0,72,3,202,0,127,1,124,0,127,1,124,255,189,3,78,0,127, + 2,206,0,127,4,89,0,127,3,197,0,127,3,197,0,127,3,247,0,72,3,132,0,71,3,10,0,127,3,128,0,127,3,20,255,252,3,176,0,112, + 4,251,0,43,3,34,0,77,3,34,0,77,3,62,0,71,5,47,0,77,3,109,0,117,3,62,0,71,3,86,0,71,3,86,0,71,2,226,0,84, + 2,224,0,82,3,62,0,71,1,110,0,122,3,104,0,117,4,252,0,117,3,69,0,117,3,79,0,71,2,246,0,71,3,79,0,71,3,79,0,71, + 3,109,0,117,2,92,0,35,3,61,0,110,3,194,0,110,4,252,0,117,3,86,0,38,3,55,0,121,2,251,0,20,3,21,0,71,3,83,0,71, + 2,233,0,37,1,110,0,122,2,18,0,117,3,61,0,110,3,86,0,38,3,55,0,121,2,251,0,20,3,75,0,121,3,83,0,71,2,233,0,37, + 5,20,0,186,3,202,0,127,2,249,0,116,5,86,0,50,2,57,0,145,3,62,0,71,2,246,0,71,2,246,0,71,3,79,0,71,2,226,0,84, + 2,95,0,30,1,221,255,233,3,62,0,71,3,61,0,110,2,23,0,73,1,255,0,122,2,22,0,73,2,23,0,73,1,224,255,86,1,255,0,122, + 1,225,0,91,3,3,0,113,4,252,0,117,4,252,0,117,3,73,255,233,3,214,0,117,3,69,0,113,3,79,0,71,3,79,0,71,2,226,0,70, + 2,75,255,233,2,92,0,35,4,16,0,94,3,89,0,71,2,228,0,117,3,64,0,122,3,86,0,38,2,238,0,55,3,126,0,55,2,238,0,55, + 3,35,0,55,3,79,0,71,0,0,252,91,0,0,252,91,0,0,252,91,0,0,252,91,0,0,252,66,0,0,252,66,5,121,0,16,4,231,0,123, + 5,125,0,201,5,20,0,184,5,125,0,201,5,20,0,186,5,125,0,201,5,20,0,186,5,150,0,115,4,102,0,113,6,41,0,201,5,20,0,113, + 6,41,0,201,5,20,0,113,6,41,0,201,5,20,0,113,6,41,0,201,5,20,0,113,6,41,0,201,5,20,0,113,5,14,0,201,4,236,0,113, + 5,14,0,201,4,236,0,113,5,14,0,201,4,236,0,113,5,14,0,201,4,236,0,113,5,14,0,201,4,236,0,113,4,154,0,201,2,209,0,47, + 6,51,0,115,5,20,0,113,6,4,0,201,5,18,0,184,6,4,0,201,5,18,0,186,6,4,0,201,5,18,255,237,6,4,0,17,5,18,0,2, + 6,4,0,201,5,18,0,186,2,92,0,0,2,57,255,211,2,92,0,7,2,57,255,244,5,63,0,201,4,162,0,186,5,63,0,201,4,162,0,186, + 5,63,0,201,4,162,0,186,4,117,0,201,2,77,0,201,4,117,0,3,2,77,255,253,4,117,0,201,2,57,255,244,4,117,0,201,2,57,255,222, + 6,231,0,201,7,203,0,186,6,231,0,201,7,203,0,186,6,231,0,201,7,203,0,186,5,252,0,201,5,18,0,186,5,252,0,201,5,18,0,186, + 5,252,0,201,5,18,0,186,5,252,0,201,5,18,0,186,6,76,0,115,4,229,0,113,6,76,0,115,4,229,0,113,6,76,0,115,4,229,0,113, + 6,76,0,115,4,229,0,113,4,211,0,201,5,20,0,186,4,211,0,201,5,20,0,186,5,143,0,201,3,74,0,186,5,143,0,201,3,74,0,186, + 5,143,0,201,3,74,0,186,5,143,0,201,3,74,0,84,5,20,0,135,4,43,0,111,5,20,0,135,4,43,0,111,5,20,0,135,4,43,0,111, + 5,20,0,135,4,43,0,111,5,20,0,135,4,43,0,111,4,227,255,250,3,35,0,55,4,227,255,250,3,35,0,55,4,227,255,250,3,35,0,55, + 4,227,255,250,3,35,0,55,5,219,0,178,5,18,0,174,5,219,0,178,5,18,0,174,5,219,0,178,5,18,0,174,5,219,0,178,5,18,0,174, + 5,219,0,178,5,18,0,174,5,121,0,16,4,188,0,61,5,121,0,16,4,188,0,61,7,233,0,68,6,139,0,86,7,233,0,68,6,139,0,86, + 7,233,0,68,6,139,0,86,7,233,0,68,6,139,0,86,7,233,0,68,6,139,0,86,5,123,0,61,4,188,0,59,5,123,0,61,4,188,0,59, + 4,227,255,252,4,188,0,61,5,123,0,92,4,51,0,88,5,123,0,92,4,51,0,88,5,123,0,92,4,51,0,88,5,18,0,186,3,35,0,4, + 6,139,0,86,4,188,0,61,4,231,0,123,2,209,0,47,2,209,0,2,2,209,0,47,6,38,0,178,4,229,0,113,5,121,0,16,4,231,0,123, + 5,121,0,16,4,231,0,123,5,121,0,16,4,231,0,123,5,121,0,16,4,231,0,123,5,121,0,16,4,231,0,123,5,121,0,16,4,231,0,123, + 5,121,0,16,4,231,0,123,5,121,0,16,4,231,0,123,5,121,0,16,4,231,0,123,5,121,0,16,4,231,0,123,5,121,0,16,4,231,0,123, + 5,121,0,16,4,231,0,123,5,14,0,201,4,236,0,113,5,14,0,201,4,236,0,113,5,14,0,201,4,236,0,113,5,14,0,201,4,236,0,113, + 5,14,0,201,4,236,0,113,5,14,0,201,4,236,0,113,5,14,0,201,4,236,0,113,5,14,0,201,4,236,0,113,2,92,0,90,2,57,0,68, + 2,92,0,201,2,57,0,191,6,76,0,115,4,229,0,113,6,76,0,115,4,229,0,113,6,76,0,115,4,229,0,113,6,76,0,115,4,229,0,113, + 6,76,0,115,4,229,0,113,6,76,0,115,4,229,0,113,6,76,0,115,4,229,0,113,7,78,0,103,4,229,0,118,7,78,0,103,4,229,0,118, + 7,78,0,103,4,229,0,118,7,78,0,103,4,229,0,118,7,78,0,103,4,229,0,118,5,219,0,178,5,18,0,174,5,219,0,178,5,18,0,174, + 6,221,0,173,5,18,0,176,6,221,0,173,5,18,0,176,6,221,0,173,5,18,0,176,6,221,0,173,5,18,0,176,6,221,0,173,5,18,0,176, + 4,227,255,252,4,188,0,61,4,227,255,252,4,188,0,61,4,227,255,252,4,188,0,61,4,227,255,252,4,188,0,61,6,39,0,201,3,209,0,32, + 5,70,0,113,5,70,0,113,5,70,0,113,5,70,0,113,5,70,0,113,5,70,0,113,5,70,0,113,5,70,0,113,5,121,0,16,5,121,0,16, + 7,5,0,5,7,5,0,6,6,39,0,7,6,105,0,4,5,170,0,7,5,241,0,4,4,83,0,133,4,83,0,133,4,83,0,133,4,83,0,133, + 4,83,0,133,4,83,0,133,5,176,0,7,5,176,0,7,7,186,0,5,7,204,0,6,7,48,0,7,7,108,0,4,5,18,0,186,5,18,0,186, + 5,18,0,186,5,18,0,186,5,18,0,186,5,18,0,186,5,18,0,186,5,18,0,186,6,178,0,7,6,175,0,7,8,176,0,5,8,182,0,6, + 8,55,0,7,8,104,0,4,7,120,0,7,7,147,0,4,2,181,0,155,2,181,0,145,2,181,255,177,2,181,255,187,2,181,0,5,2,181,255,211, + 2,181,255,203,2,181,255,198,3,10,0,7,2,254,0,7,5,20,0,5,5,20,0,6,4,144,0,7,4,204,0,4,3,234,0,7,3,241,0,4, + 4,229,0,113,4,229,0,113,4,229,0,113,4,229,0,113,4,229,0,113,4,229,0,113,6,111,0,7,6,201,0,7,8,194,0,5,8,204,0,6, + 7,130,0,7,7,195,0,4,4,161,0,149,4,161,0,149,4,161,0,149,4,161,0,149,4,161,0,149,4,161,0,149,4,161,0,149,4,161,0,149, + 6,69,0,7,7,251,0,6,8,25,0,4,7,46,0,4,6,179,0,135,6,179,0,135,6,179,0,135,6,179,0,135,6,179,0,135,6,179,0,135, + 6,179,0,135,6,179,0,135,6,107,0,7,6,191,0,7,8,183,0,5,8,195,0,6,7,145,0,7,7,199,0,4,7,95,0,7,7,158,0,4, + 5,70,0,113,5,70,0,113,4,83,0,133,4,99,0,133,5,18,0,186,5,60,0,186,2,181,255,141,2,181,0,166,4,229,0,113,4,229,0,113, + 4,161,0,149,4,161,0,149,6,179,0,135,6,179,0,135,5,70,0,113,5,70,0,113,5,70,0,113,5,70,0,113,5,70,0,113,5,70,0,113, + 5,70,0,113,5,70,0,113,5,121,0,16,5,121,0,16,7,5,0,5,7,5,0,6,6,39,0,7,6,105,0,4,5,170,0,7,5,241,0,4, + 5,18,0,186,5,18,0,186,5,18,0,186,5,18,0,186,5,18,0,186,5,18,0,186,5,18,0,186,5,18,0,186,6,178,0,7,6,175,0,7, + 8,176,0,5,8,182,0,6,8,55,0,7,8,104,0,4,7,120,0,7,7,147,0,4,6,179,0,135,6,179,0,135,6,179,0,135,6,179,0,135, + 6,179,0,135,6,179,0,135,6,179,0,135,6,179,0,135,6,107,0,7,6,191,0,7,8,183,0,5,8,195,0,6,7,145,0,7,7,199,0,4, + 7,95,0,7,7,158,0,4,5,70,0,113,5,70,0,113,5,70,0,113,5,70,0,113,5,70,0,113,5,70,0,113,5,70,0,113,5,121,0,16, + 5,121,0,16,5,187,255,252,5,138,0,16,5,121,0,16,4,0,1,134,4,0,1,182,4,0,1,134,4,0,0,182,4,0,0,182,5,18,0,186, + 5,18,0,186,5,60,0,186,5,18,0,186,5,18,0,186,6,112,255,252,5,248,255,231,7,114,255,252,6,248,255,243,6,4,0,201,4,0,0,137, + 4,0,0,180,4,0,0,182,2,181,255,235,2,181,255,227,2,181,255,216,2,181,0,5,2,181,255,228,2,181,255,230,2,92,255,245,2,92,0,3, + 3,205,255,252,3,68,255,237,4,0,0,126,4,0,0,149,4,0,0,182,4,161,0,149,4,161,0,149,4,161,0,149,4,161,0,149,5,20,0,186, + 5,20,0,186,4,161,0,149,4,161,0,149,4,227,255,252,4,227,255,252,6,195,255,252,6,153,255,225,5,123,0,7,4,0,0,170,4,0,0,215, + 4,0,0,170,6,179,0,135,6,179,0,135,6,179,0,135,6,179,0,135,6,179,0,135,7,135,255,252,6,128,255,242,7,97,255,252,6,155,255,219, + 6,29,0,78,4,0,1,115,4,0,1,134,4,0,0,0,8,0,0,0,4,0,0,0,8,0,0,0,2,163,0,0,2,0,0,0,1,86,0,0, + 5,23,0,0,2,139,0,0,1,153,0,0,0,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,227,0,100, + 2,227,0,100,5,23,0,100,4,0,0,100,8,0,0,100,8,0,0,0,4,0,1,4,4,0,255,236,2,139,0,174,2,139,0,178,2,139,0,174, + 2,139,0,178,4,37,0,174,4,37,0,174,4,37,0,174,4,37,0,174,4,0,0,57,4,0,0,57,4,184,1,51,4,184,1,51,2,173,0,236, + 5,87,0,236,8,0,0,236,2,139,0,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, + 1,153,0,0,10,188,0,113,13,226,0,113,1,209,0,40,2,253,0,40,4,41,0,40,1,209,0,40,2,253,0,40,4,41,0,40,2,182,0,11, + 3,51,0,158,3,51,0,193,6,180,0,195,3,226,0,147,4,63,0,147,4,0,255,236,6,110,255,167,6,110,255,167,2,0,255,170,8,0,0,61, + 4,0,0,221,1,86,254,137,3,31,0,176,3,31,0,176,7,96,0,74,5,221,0,147,5,221,0,147,3,250,0,100,5,23,0,236,4,0,0,216, + 4,0,0,216,4,0,0,61,2,178,1,29,6,110,255,167,4,0,0,61,3,153,0,145,8,0,0,100,6,110,255,167,6,180,1,56,4,176,0,250, + 5,78,0,40,6,180,1,102,6,180,1,102,2,139,0,219,6,97,0,100,6,180,0,112,2,139,0,219,2,139,0,219,1,199,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 3,53,0,87,1,110,0,122,3,53,0,63,3,53,0,102,3,53,0,92,3,53,0,108,3,53,0,89,3,53,0,83,4,57,0,137,4,57,0,137, + 4,57,0,137,1,247,0,111,1,247,0,103,3,48,0,117,3,53,0,87,3,53,0,137,3,53,0,94,3,53,0,98,3,53,0,63,3,53,0,102, + 3,53,0,92,3,53,0,108,3,53,0,89,3,53,0,83,4,57,0,137,4,57,0,137,4,57,0,137,1,247,0,111,1,247,0,103,3,34,0,77, + 3,86,0,71,3,79,0,71,3,141,0,117,3,86,0,71,3,60,0,117,3,104,0,117,1,84,0,122,4,252,0,117,3,48,0,117,3,109,0,117, + 2,252,0,117,2,92,0,35,7,4,0,86,5,23,0,115,5,23,0,96,5,23,0,133,5,23,0,129,7,203,0,186,5,252,0,117,10,46,0,201, + 8,151,0,201,7,233,0,59,6,70,0,95,5,23,0,113,5,23,0,0,5,23,0,40,5,23,0,20,10,46,0,208,5,23,0,46,5,23,0,68, + 5,23,0,93,5,23,0,16,6,49,0,117,5,23,0,165,5,23,0,20,5,23,0,106,5,110,0,10,0,0,252,19,0,0,252,61,0,0,252,61, + 0,0,252,61,0,0,252,19,0,0,251,80,0,0,252,61,8,38,0,67,8,38,0,67,5,150,0,115,8,252,0,195,5,35,255,214,8,38,0,60, + 8,137,0,60,4,234,0,164,5,150,0,111,7,157,0,195,7,232,0,73,6,9,0,2,6,204,0,201,5,18,0,72,5,18,0,90,3,194,0,59, + 5,148,0,106,5,195,0,68,3,78,255,228,6,139,0,32,6,104,0,198,8,82,0,54,8,0,1,27,5,148,0,110,5,156,0,200,6,76,0,115, + 6,98,0,66,6,131,0,83,6,86,0,200,7,44,0,169,5,121,0,201,8,40,1,3,8,152,255,252,8,0,1,39,5,121,0,16,5,245,0,92, + 4,159,0,88,6,29,0,78,6,29,0,78,4,238,0,24,2,181,0,68,5,63,0,201,5,121,0,16,6,74,0,92,5,160,0,130,6,214,0,125, + 4,188,0,87,4,216,0,162,6,74,0,84,4,154,0,201,8,142,0,57,3,178,0,104,5,246,0,103,5,100,255,251,3,186,0,27,5,40,0,86, + 3,10,0,70,7,104,0,90,9,141,0,151,5,158,0,36,5,210,0,0,5,60,0,200,6,202,0,201,6,124,0,25,6,51,0,163,4,117,0,8, + 4,117,0,7,4,227,255,252,6,141,0,87,5,170,0,90,4,236,0,91,2,207,0,79,2,207,255,22,6,61,0,59,4,54,0,81,7,193,0,137, + 7,193,0,137,10,246,0,137,7,193,0,137,7,193,0,94,7,193,0,137,7,193,0,94,7,193,0,98,7,193,0,63,7,193,0,137,7,193,0,102, + 7,193,0,137,7,193,0,98,7,193,0,102,7,193,0,108,4,139,0,137,2,92,0,201,3,240,0,201,5,132,0,201,7,98,0,201,5,121,0,16, + 7,97,0,16,8,245,0,16,10,137,0,16,7,87,0,201,5,123,0,61,7,119,0,61,9,13,0,61,4,117,0,201,5,150,0,115,6,41,0,201, + 6,231,0,201,2,57,0,193,3,169,0,193,5,25,0,193,6,126,0,193,4,188,0,61,6,125,0,61,7,237,0,61,9,93,0,61,6,141,0,193, + 4,188,0,59,6,148,0,59,8,4,0,59,2,57,0,193,4,102,0,113,5,20,0,113,7,203,0,186,9,246,0,121,6,41,0,201,9,246,0,121, + 5,160,0,115,4,101,0,127,5,150,0,115,7,193,0,87,6,180,0,100,6,180,1,163,6,180,0,117,6,180,1,163,6,180,0,100,6,180,1,163, + 6,180,1,32,6,180,1,32,6,180,1,32,6,180,1,32,6,180,0,100,6,180,0,117,6,180,0,44,6,180,0,22,6,180,0,100,6,180,1,165, + 6,180,0,117,6,180,1,165,6,180,0,100,6,180,0,117,6,180,0,100,6,180,1,165,6,180,0,117,6,180,1,165,6,180,1,165,6,180,0,100, + 6,180,0,118,6,180,0,100,6,180,0,118,6,180,0,100,6,180,0,100,6,180,1,42,6,180,1,90,6,180,1,172,6,180,1,90,6,180,1,172, + 6,180,1,221,6,180,0,100,6,180,0,45,6,180,0,79,6,180,0,222,6,180,0,112,6,180,0,211,6,180,0,157,6,180,0,100,6,180,0,100, + 6,180,3,5,6,180,1,163,6,180,0,117,6,180,0,117,6,180,3,5,6,180,1,163,6,180,0,100,6,180,0,119,6,180,0,100,6,180,0,100, + 6,180,0,120,6,180,0,118,6,180,0,120,6,180,0,100,6,180,0,100,6,180,0,100,6,180,0,100,6,180,0,117,6,180,0,100,6,180,1,165, + 6,180,0,117,6,180,1,165,6,180,0,100,6,180,1,164,6,180,1,32,6,180,0,188,6,180,0,188,6,180,1,32,6,180,0,100,6,180,0,117, + 6,180,0,100,6,180,0,117,6,180,1,163,6,180,1,163,6,180,0,100,6,180,1,163,6,180,0,117,6,180,1,163,6,180,0,107,6,180,0,117, + 6,180,0,55,6,180,1,94,6,180,0,72,6,180,1,94,6,180,1,94,6,180,1,94,6,180,1,64,6,180,1,94,6,180,1,94,6,180,1,94, + 6,180,0,117,6,180,0,122,6,180,0,122,6,180,1,94,6,180,0,117,6,180,0,119,6,180,0,117,6,180,0,100,6,180,0,117,6,180,0,100, + 6,180,0,100,6,180,0,117,6,180,0,100,6,180,0,55,6,180,0,117,6,180,0,55,5,121,0,16,5,23,0,135,4,35,0,95,5,14,0,201, + 5,14,0,201,6,248,0,155,5,90,255,250,5,90,255,250,6,248,0,175,6,248,0,175,5,190,0,217,6,248,0,175,6,248,0,175,5,190,0,217, + 5,23,1,44,6,14,0,156,6,14,0,156,5,100,0,25,6,180,0,217,6,180,0,217,6,180,0,217,2,178,0,0,5,24,1,138,6,180,1,5, + 5,2,1,68,5,2,1,88,5,25,0,61,5,25,0,61,5,25,0,61,5,183,0,220,6,170,0,220,6,180,1,27,7,44,0,175,7,44,0,175, + 6,180,0,237,4,0,1,176,4,0,0,102,4,0,1,16,4,0,0,102,5,219,1,8,5,219,1,8,5,219,1,8,5,219,1,8,4,43,0,117, + 6,80,0,117,8,117,0,117,4,43,0,117,6,80,0,117,8,117,0,117,4,43,0,117,4,43,0,117,4,43,0,117,5,23,0,121,5,23,0,121, + 2,21,0,161,5,23,0,121,6,180,0,217,6,180,0,217,6,180,0,216,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,162,6,180,0,217, + 3,0,0,208,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217, + 6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,216,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,182,0,217,6,182,0,217, + 8,0,0,207,8,0,0,205,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217, + 6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,218,6,180,0,218, + 6,180,0,218,6,180,0,218,8,96,0,148,8,96,0,148,3,182,0,176,6,180,0,216,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217, + 6,180,0,217,6,180,0,218,6,180,0,217,6,180,0,217,6,180,0,208,6,180,0,208,6,180,0,208,6,180,0,208,6,180,0,217,6,180,0,217, + 6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,204,6,180,0,204,6,180,0,204,6,180,0,204, + 6,180,0,190,6,180,0,217,6,180,0,190,6,180,0,217,6,180,0,190,6,180,0,190,5,219,1,8,5,219,1,8,5,219,1,8,6,180,0,217, + 6,180,0,217,6,180,0,217,6,180,0,217,6,62,0,217,6,62,0,217,6,180,0,187,6,180,0,187,6,180,0,187,6,180,0,187,6,180,0,187, + 6,180,0,187,6,180,0,187,6,180,0,187,6,180,0,187,6,180,0,187,6,180,0,187,6,180,0,187,6,180,0,187,6,248,0,175,6,248,0,175, + 6,248,0,175,6,248,0,175,4,42,0,175,4,42,0,175,6,248,0,175,6,248,0,175,6,248,0,175,6,248,0,175,6,248,0,175,6,248,0,175, + 6,248,0,175,6,248,0,175,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,8,0,0,121,8,0,0,121, + 6,180,0,98,6,180,0,121,4,42,0,238,5,219,0,200,5,219,0,200,5,219,0,200,6,180,1,27,6,180,1,27,6,144,255,250,6,144,255,250, + 6,144,0,140,6,144,0,140,3,244,0,6,2,139,0,219,5,2,0,249,6,180,0,217,8,0,0,217,8,0,0,217,8,0,0,217,8,0,0,217, + 8,0,0,217,6,180,0,217,5,220,0,99,5,220,0,99,6,180,0,190,6,180,0,217,6,180,0,210,6,180,0,210,6,180,1,124,6,180,0,217, + 6,180,0,217,6,180,0,217,11,97,0,148,11,97,0,148,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217, + 6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,225, + 6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,213,8,0,3,150,8,0,0,236,8,0,0,236,8,0,0,236,8,0,0,88,6,248,0,175, + 5,190,0,217,6,248,0,175,6,248,0,175,5,190,0,217,6,248,0,175,6,248,0,175,8,0,0,88,6,248,0,175,5,190,0,217,6,248,0,175, + 5,190,0,217,6,248,0,217,4,209,0,74,4,209,0,114,5,20,0,146,6,180,1,163,6,180,1,163,6,180,1,163,6,180,1,163,3,232,1,59, + 3,31,0,176,3,31,0,199,3,31,0,176,3,31,0,199,6,120,2,244,6,120,0,100,6,120,2,244,6,120,0,100,6,180,0,217,4,27,0,6, + 8,0,0,247,6,180,0,217,3,192,0,176,3,192,0,134,3,192,0,176,3,192,0,134,4,43,1,175,4,43,0,42,9,56,0,156,9,56,0,156, + 11,80,0,156,9,56,0,156,11,140,0,120,11,80,0,1,6,252,0,150,2,181,0,166,5,20,0,186,6,179,0,135,5,70,0,113,6,15,0,26, + 9,56,0,156,6,252,0,35,4,0,0,176,4,0,0,176,4,0,0,176,4,0,0,176,4,0,2,141,4,0,0,176,4,0,0,176,4,0,0,176, + 4,0,0,176,4,0,0,176,4,0,2,141,4,0,0,176,6,0,2,163,6,0,0,168,6,0,2,163,6,0,2,163,6,0,0,168,6,0,2,163, + 6,0,0,168,4,43,1,175,6,180,0,55,7,143,0,186,6,252,0,150,6,39,0,6,5,23,0,89,5,20,255,131,5,20,0,146,7,44,0,152, + 7,44,0,152,7,44,0,152,7,44,0,152,7,44,0,152,7,44,0,152,7,44,0,152,7,44,0,152,7,44,0,152,7,44,0,152,4,209,255,236, + 4,209,255,236,4,209,2,24,4,209,1,200,4,209,255,236,4,209,255,236,4,209,2,24,4,209,1,200,4,209,255,235,4,209,255,236,4,209,2,24, + 4,209,1,200,4,209,2,24,4,209,2,24,4,209,1,200,4,209,1,200,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,2,24, + 4,209,2,24,4,209,1,200,4,209,1,200,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,2,24,4,209,2,24,4,209,1,200, + 4,209,1,200,4,209,1,200,4,209,1,200,4,209,1,200,4,209,1,200,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236, + 4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236, + 4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236, + 4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236, + 4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,2,24,4,209,1,200,4,209,255,236, + 4,209,1,120,4,209,2,24,4,209,1,120,4,209,1,120,4,209,255,236,4,209,255,236,4,209,255,236,4,209,2,24,4,209,1,120,4,209,1,120, + 4,209,255,236,4,209,255,236,4,209,255,236,4,209,2,24,4,209,1,120,4,209,1,120,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236, + 4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,255,236,4,209,2,24,4,209,255,236, + 4,209,255,236,4,209,2,24,4,209,255,147,4,209,255,147,4,209,255,147,4,209,255,236,4,209,2,24,4,209,2,124,4,209,2,24,4,209,255,236, + 4,209,1,200,4,209,2,124,4,209,1,200,4,209,255,236,4,209,1,200,4,209,255,236,4,209,1,200,6,39,255,236,6,39,255,236,6,39,255,236, + 6,39,255,236,6,39,255,236,6,39,255,236,6,39,255,236,6,39,255,236,6,39,255,236,6,39,255,236,6,39,255,236,6,39,255,236,6,39,255,236, + 6,39,255,236,6,39,255,236,6,39,255,236,6,39,3,19,6,39,255,236,6,39,255,236,6,39,255,236,6,39,255,236,6,39,5,113,6,39,255,236, + 6,39,3,19,6,39,255,236,6,39,255,236,6,39,255,236,6,39,255,236,6,39,255,236,6,39,3,19,6,39,255,236,6,39,255,236,7,143,0,186, + 7,143,0,186,7,143,0,186,7,143,0,186,7,143,0,186,7,143,0,186,7,143,0,186,7,143,0,186,7,143,0,186,7,143,0,186,5,108,0,186, + 5,108,0,186,7,143,0,186,7,143,0,186,4,103,0,186,4,103,0,186,6,39,0,6,6,39,0,6,6,39,0,6,6,39,0,6,4,4,0,6, + 4,4,0,6,6,39,0,6,6,39,0,6,4,4,0,6,4,4,0,6,6,39,0,6,6,39,0,6,6,39,0,6,6,39,0,6,4,4,0,6, + 4,4,0,6,6,39,0,6,6,39,0,6,4,4,0,6,4,4,0,6,6,39,0,6,6,39,0,6,6,39,0,6,6,39,0,6,6,39,0,6, + 6,251,0,112,3,244,0,6,6,251,0,112,6,251,0,114,6,251,0,112,6,251,0,112,6,251,0,112,6,251,0,112,6,251,0,112,6,251,0,112, + 6,251,0,112,6,251,0,112,6,251,0,112,4,55,0,112,4,55,0,186,6,84,0,186,7,195,0,186,7,195,0,186,7,195,0,186,3,25,0,6, + 3,25,0,6,3,25,0,6,3,25,0,6,6,251,0,112,6,251,0,112,6,39,0,6,6,39,0,6,6,39,0,6,6,39,0,6,4,184,1,51, + 7,143,0,186,7,143,0,186,7,143,0,186,7,143,0,186,7,143,0,186,6,39,0,6,6,39,0,6,6,39,0,6,8,244,0,112,7,143,0,186, + 7,143,0,186,7,143,0,186,7,143,0,186,6,251,0,112,6,251,0,112,6,251,0,112,6,251,0,112,6,39,0,6,6,39,0,6,6,39,0,6, + 6,164,0,186,6,164,0,186,5,220,0,186,5,220,0,186,6,39,0,6,7,44,0,171,8,0,0,104,7,44,0,100,7,44,0,170,7,44,0,131, + 7,44,0,133,7,44,0,133,4,149,0,170,7,43,0,170,7,44,0,170,7,27,0,125,7,27,0,125,5,95,0,125,8,26,0,125,9,247,0,140, + 10,1,0,145,7,44,0,184,7,44,0,183,7,44,0,183,4,66,0,154,7,44,0,100,7,44,0,152,7,44,0,172,7,44,0,172,7,44,0,159, + 7,44,0,171,7,44,0,172,7,44,0,172,7,44,0,178,4,223,0,147,7,44,0,177,4,223,0,147,7,44,0,125,7,44,0,172,7,44,0,170, + 7,44,0,100,5,90,0,100,5,248,0,170,5,50,0,170,6,69,0,170,4,92,0,170,7,44,0,170,7,44,0,178,7,44,0,170,5,175,0,170, + 7,44,0,171,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,135,8,87,0,170,8,87,0,170,8,87,0,170,7,44,0,170,7,44,2,221,7,44,0,170,4,233,0,175,5,220,0,175, + 5,220,0,175,7,44,0,162,7,44,1,83,7,44,1,192,7,44,0,248,7,44,1,4,7,44,1,236,7,44,0,93,7,44,0,183,7,44,0,192, + 7,44,0,231,7,44,1,30,7,44,0,109,7,44,0,171,7,44,0,69,7,44,0,169,7,44,0,192,7,44,0,176,7,44,1,65,7,44,0,201, + 7,44,0,226,7,44,1,85,7,44,1,182,7,44,1,81,7,44,1,48,7,44,0,201,7,44,0,226,7,44,1,85,7,44,1,182,7,44,1,76, + 7,44,1,48,7,44,1,67,7,44,0,185,7,44,1,88,7,44,0,228,7,44,1,66,7,44,0,182,7,44,1,88,7,44,0,228,7,44,0,216, + 3,198,0,172,5,27,0,172,7,44,1,120,7,44,0,188,3,198,0,181,2,220,0,172,3,223,0,173,5,252,0,172,6,32,0,132,7,44,0,172, + 7,44,0,156,7,44,0,156,7,44,0,156,7,44,0,156,7,44,0,156,7,44,0,156,7,44,0,156,7,44,0,156,7,44,0,172,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,1,49,6,244,0,150,6,244,0,150,6,244,0,150,6,244,0,150,6,244,0,150,6,244,0,150,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,1,88, + 7,44,1,88,7,44,0,106,7,44,0,198,7,44,1,13,4,84,0,125,7,44,0,121,7,44,0,125,7,44,1,41,7,44,0,194,7,44,1,6, + 7,44,1,5,7,44,1,5,7,44,0,100,5,158,0,170,8,9,0,175,8,183,0,162,9,102,0,175,7,57,0,175,6,180,1,13,6,180,0,207, + 6,180,1,128,6,180,0,9,6,180,1,127,6,180,1,127,6,180,1,250,6,180,1,100,6,180,0,84,6,180,0,10,6,192,0,210,6,180,1,177, + 5,220,0,175,5,220,1,89,5,220,0,176,5,220,0,176,6,204,0,120,5,220,1,142,5,220,1,68,6,180,0,86,6,180,0,86,6,180,0,86, + 6,180,0,86,5,220,0,175,6,180,0,22,6,180,0,86,6,180,0,22,6,180,0,73,6,180,0,86,6,180,0,86,6,180,0,120,6,180,0,132, + 6,180,1,179,6,180,0,43,6,180,0,182,6,180,0,53,6,180,0,182,6,180,0,88,6,180,0,138,6,180,1,51,6,180,0,237,6,180,1,3, + 6,180,0,175,6,180,0,241,6,180,0,252,6,180,0,112,6,180,0,112,6,180,0,112,6,180,0,112,6,180,1,82,6,180,1,12,6,180,1,62, + 6,180,0,112,6,180,0,187,6,180,0,84,6,180,0,86,6,180,0,83,6,180,0,84,6,180,0,87,6,180,0,87,6,180,0,47,6,180,0,86, + 6,180,0,48,6,180,0,47,6,180,0,48,6,180,0,48,6,180,0,48,6,180,0,50,6,180,0,132,6,180,0,152,6,180,0,112,6,180,0,64, + 6,180,0,84,6,180,0,187,6,180,0,84,6,180,0,84,6,180,0,84,6,180,0,112,6,180,0,167,6,180,0,167,6,180,0,161,6,180,0,161, + 6,180,0,110,6,180,0,110,6,180,0,84,6,180,0,86,6,180,0,161,6,180,0,182,6,180,0,156,6,180,0,130,6,180,0,161,6,180,0,97, + 6,180,0,97,6,180,0,84,6,180,0,84,7,44,0,102,7,44,0,122,7,44,0,122,7,44,0,122,7,44,0,122,7,44,0,170,6,180,3,5, + 6,180,2,176,6,180,2,6,2,148,0,174,2,148,0,120,4,78,0,174,4,78,0,120,6,180,1,62,6,180,1,158,6,180,1,78,6,180,0,110, + 6,180,1,88,6,180,0,126,6,180,0,160,6,180,1,145,6,180,1,145,6,180,2,29,6,180,2,29,6,180,1,185,6,180,1,219,6,180,1,35, + 6,180,1,57,6,180,1,85,6,180,1,119,6,180,2,196,6,180,2,108,6,180,1,102,6,180,1,161,7,44,0,152,7,44,0,152,7,44,0,152, + 7,44,0,152,7,44,0,152,7,44,0,152,7,44,0,152,7,44,0,152,7,44,0,152,7,44,0,152,6,180,0,9,6,180,0,9,6,180,0,9, + 6,180,0,9,6,180,0,9,6,180,0,9,6,180,0,9,6,180,0,9,6,180,0,9,6,180,0,9,6,180,0,9,6,180,0,9,6,180,0,9, + 6,180,0,9,6,180,0,9,6,180,0,9,6,180,0,9,6,180,0,9,6,180,0,9,6,180,0,9,6,180,0,117,6,180,0,252,6,180,0,117, + 6,180,0,252,6,180,0,117,6,180,0,117,6,180,0,117,6,180,0,117,6,180,0,117,6,180,0,117,6,180,0,117,6,180,0,228,6,180,0,228, + 6,180,0,228,6,180,0,117,6,180,0,117,6,180,1,236,6,180,0,117,6,180,0,117,6,180,0,117,6,180,0,43,6,180,0,43,6,180,1,21, + 6,180,1,21,6,180,0,127,6,180,0,127,6,180,1,60,6,180,0,130,6,180,0,165,6,180,0,117,6,180,0,167,6,180,0,167,6,180,0,117, + 6,180,0,167,6,180,0,115,6,180,0,150,6,180,0,162,6,180,0,162,6,180,0,117,3,31,0,110,3,31,0,79,3,244,0,6,3,246,0,176, + 3,246,0,175,3,31,0,183,3,31,0,164,4,115,0,183,4,115,0,164,6,180,0,91,6,180,0,89,6,180,0,79,6,180,0,79,9,66,0,117, + 11,120,0,100,11,120,0,117,11,120,0,100,11,120,0,100,11,120,0,117,11,120,0,100,11,120,0,100,11,120,0,117,11,120,0,100,11,120,0,117, + 11,120,0,117,5,220,0,0,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,3,132,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,3,132,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,3,132,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44, + 5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,5,220,1,44,6,180,0,100,6,180,0,117,6,180,1,0, + 6,180,1,0,5,119,0,79,5,119,0,79,5,223,1,0,5,223,1,0,6,180,0,217,8,0,0,217,8,0,0,217,8,0,0,217,8,0,0,217, + 8,0,0,217,8,0,0,217,8,0,0,217,3,244,0,6,6,180,0,217,6,180,0,217,8,0,0,58,8,0,0,58,8,0,0,58,10,154,0,117, + 4,43,0,117,4,43,0,117,4,43,0,117,4,43,0,117,4,43,0,117,4,43,0,117,4,43,0,117,4,43,0,117,4,43,0,117,4,43,0,117, + 4,43,255,190,4,43,0,117,4,43,0,117,4,43,0,117,4,43,0,117,4,43,0,107,6,180,1,25,6,180,0,217,6,180,0,217,6,180,0,217, + 6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217, + 6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217, + 6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,218,6,180,0,218,6,180,0,217, + 6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217, + 6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217,6,180,0,217, + 6,180,0,181,6,180,1,32,6,180,0,181,6,180,1,32,6,180,0,55,6,180,0,55,6,180,1,94,6,180,1,94,6,180,0,181,6,180,1,32, + 6,180,0,181,6,180,1,32,6,180,0,55,6,180,1,94,6,176,0,117,6,176,0,117,6,176,0,72,6,176,0,72,7,143,0,186,7,143,0,186, + 7,143,0,186,7,143,0,186,6,39,0,6,6,39,0,6,6,39,0,6,6,39,0,6,7,143,0,186,6,244,0,36,6,244,0,36,6,252,0,150, + 6,252,0,150,6,252,0,34,8,244,0,112,6,244,0,77,6,244,0,77,4,117,0,10,2,57,0,10,4,117,255,215,4,211,0,10,5,143,0,201, + 4,231,0,72,3,35,255,232,6,4,0,201,5,18,0,186,5,63,0,201,4,162,0,186,5,123,0,92,4,51,0,88,6,64,0,115,6,231,0,201, + 5,121,0,16,6,64,0,115,5,224,0,61,9,6,0,68,7,177,0,86,4,188,0,104,5,60,0,201,4,139,0,193,5,71,0,112,3,80,0,0, + 4,229,0,113,3,237,0,98,1,102,255,233,3,114,0,10,5,20,0,135,5,123,0,92,4,186,0,123,4,194,0,50,4,132,0,80,4,208,0,127, + 4,179,0,105,7,73,0,80,5,3,0,0,7,157,0,108,4,195,0,142,4,219,0,104,7,161,0,80,4,245,0,109,4,195,0,80,7,105,0,104, + 4,194,0,104,6,115,0,142,7,115,0,104,4,173,0,104,4,189,0,102,7,99,0,104,7,159,0,123,6,159,0,100,4,196,0,80,4,194,0,104, + 4,184,0,104,4,188,0,80,4,188,0,86,4,247,0,122,7,93,0,80,4,183,0,60,4,177,0,96,4,166,0,70,7,80,0,80,4,196,0,100, + 4,194,0,122,4,189,0,124,5,34,0,104,7,53,0,122,5,44,0,113,7,26,0,115,7,26,0,115,5,117,0,64,5,120,0,67,5,21,0,64, + 4,126,0,150,5,121,0,16,5,121,0,16,5,14,0,201,5,14,0,131,5,118,0,150,6,255,0,219,5,123,0,92,3,237,0,150,5,123,0,92, + 7,26,0,115,7,26,0,115,2,103,0,150,5,4,0,41,6,4,0,201,5,63,0,62,4,56,0,150,5,123,0,92,5,40,0,150,5,14,0,201, + 4,5,0,111,7,159,0,111,6,58,0,111,5,252,0,201,4,247,0,204,2,92,0,201,6,58,0,111,2,92,0,201,6,4,0,159,5,16,0,99, + 7,26,0,115,7,26,0,115,6,4,0,201,2,144,0,201,5,254,0,150,7,26,0,115,7,26,0,115,5,150,0,115,6,36,0,100,5,123,0,61, + 5,150,0,115,4,250,0,201,5,121,0,16,6,4,0,201,5,14,0,201,6,78,0,115,4,137,0,201,6,78,0,115,4,31,0,54,4,63,0,143, + 6,180,0,217,3,31,0,176,3,31,0,199,3,31,0,176,3,31,0,199,4,63,0,147,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 5,125,0,201,4,211,0,201,4,211,0,70,6,41,0,201,4,227,255,250,4,227,255,250,6,51,0,115,5,63,0,201,5,63,255,213,4,24,0,0, + 5,150,0,115,5,160,0,115,5,123,0,92,4,154,0,201,4,154,0,201,6,231,0,201,5,252,0,201,4,117,0,201,5,20,0,135,5,143,0,201, + 5,143,0,59,5,121,0,16,5,121,0,16,6,4,0,201,6,51,0,163,4,24,0,201,7,233,0,68,5,123,0,61,4,227,255,252,5,125,0,145, + 5,121,0,16,5,121,0,16,5,14,0,201,5,14,0,131,2,92,0,201,6,76,0,115,5,219,0,178,5,219,0,178,4,117,0,8,6,35,0,115, + 2,102,0,175,2,102,0,146,4,197,0,175,4,197,0,175,2,102,0,146,2,102,0,175,4,180,0,175,4,180,0,175,5,20,0,114,4,43,0,100, + 2,212,0,201,2,181,0,166,9,112,0,118,8,57,0,152,8,59,0,60,7,64,0,62,8,163,0,115,6,188,0,112,7,208,0,211,6,190,0,193, + 8,127,0,101,7,75,0,107,8,136,0,84,7,53,0,76,9,109,0,201,8,16,0,186,6,76,0,115,4,229,0,113,6,216,0,115,5,179,0,113, + 10,221,0,115,8,38,0,113,7,8,0,58,6,66,255,250,5,122,0,60,4,227,255,250,4,169,0,60,5,124,0,175,5,18,0,186,3,242,0,214, + 3,242,0,214,3,242,0,214,3,242,0,214,3,242,0,214,3,242,0,214,3,242,0,214,3,242,0,214,3,242,0,214,3,242,0,214,3,242,0,214, + 3,242,0,214,3,242,0,214,3,242,0,214,3,242,0,214,2,244,0,102,2,244,0,102,2,5,0,195,2,5,0,195,2,5,0,195,3,21,0,137, + 2,217,0,137,3,198,0,115,3,198,0,115,6,4,0,201,5,18,0,186,7,6,255,250,5,173,0,55,4,234,0,164,4,83,0,133,3,237,0,186, + 4,43,0,111,9,255,0,16,7,225,0,123,9,160,0,16,7,235,0,123,9,35,0,16,7,217,0,123,7,197,0,16,6,139,0,123,7,197,0,16, + 6,139,0,123,7,172,0,16,6,139,0,123,5,160,0,115,4,101,0,127,5,63,0,10,4,170,0,14,5,113,0,201,3,35,0,193,4,167,0,83, + 3,106,0,120,6,116,0,10,5,162,0,10,10,221,0,115,8,38,0,113,4,211,0,10,5,20,255,251,5,223,0,50,6,50,0,50,6,76,0,115, + 5,20,0,113,4,215,0,10,5,20,255,251,4,215,0,10,5,20,255,251,4,117,0,11,2,57,0,193,5,226,0,201,5,18,0,186,2,178,0,240, + 3,2,0,160,3,53,1,53,2,51,0,197,5,124,0,175,3,230,0,77,6,46,0,201,5,85,0,186,6,51,0,4,5,20,0,4,5,63,0,4, + 4,162,0,4,5,252,0,4,5,18,0,4,5,143,0,4,3,74,0,4,5,20,0,4,4,43,0,4,6,104,255,151,7,82,0,186,4,154,0,119, + 4,211,0,70,6,231,0,201,2,92,0,201,9,152,0,68,1,181,0,194,1,231,0,141,2,14,0,110,2,28,0,96,2,35,0,90,1,231,0,141, + 1,181,0,194,1,231,0,141,2,14,0,110,2,28,0,96,2,14,0,110,1,231,0,141,1,181,0,194,1,231,0,141,2,14,0,110,2,28,0,96, + 2,14,0,110,1,231,0,141,1,181,0,194,1,231,0,141,2,35,0,90,2,28,0,96,2,14,0,110,1,231,0,141,1,181,0,194,2,51,0,214, + 7,208,0,150,7,208,0,150,7,208,0,150,7,208,0,150,4,164,0,110,4,164,0,110,4,253,0,110,7,29,0,110,4,174,0,111,4,164,0,110, + 5,57,0,110,7,14,0,110,4,113,0,110,4,164,0,110,9,89,0,110,4,182,0,110,4,184,0,130,6,244,0,110,4,164,0,110,4,183,0,110, + 7,79,0,110,4,184,0,130,5,217,0,110,4,170,0,50,6,250,0,110,4,183,0,110,7,41,0,110,4,182,0,110,4,182,0,110,4,185,0,131, + 5,49,0,112,4,182,0,110,4,183,0,131,4,202,0,110,4,184,0,130,4,33,0,50,4,163,0,110,4,172,0,120,4,164,0,110,4,164,0,110, + 4,165,0,110,5,27,0,110,7,164,0,110,7,115,0,122,6,119,0,100,4,16,0,100,4,16,0,100,4,16,0,100,4,16,0,100,4,16,0,100, + 4,16,0,100,4,16,0,100,4,16,0,100,4,16,0,100,4,16,0,100,4,36,0,100,4,36,0,100,4,36,0,100,6,75,0,100,6,75,0,100, + 6,75,0,100,6,75,0,100,6,75,0,100,4,95,0,60,4,95,0,60,4,95,0,60,4,95,0,60,4,95,0,60,4,95,0,60,4,229,0,113, + 5,131,0,47,5,10,0,47,5,10,0,47,7,188,0,47,7,188,0,47,5,125,0,47,6,227,0,111,9,157,0,171,9,157,0,174,9,145,0,174, + 9,125,0,174,12,60,0,174,1,202,0,136,0,0,1,86,2,165,0,74,5,22,0,78,6,217,0,174,6,49,0,88,7,63,0,186,6,44,0,88, + 6,191,0,88,6,215,0,186,6,117,0,88,7,1,0,96,6,180,0,217,5,171,0,88,5,171,0,78,5,171,0,88,5,171,0,88,5,89,0,186, + 5,89,0,186,5,89,0,186,4,160,0,88,3,76,0,88,4,94,0,88,5,58,0,186,2,216,0,89,3,63,0,89,5,48,0,185,2,164,0,89, + 4,76,0,88,4,59,0,88,4,140,0,88,5,111,0,88,3,50,0,88,5,49,0,185,5,30,0,186,4,255,0,186,4,191,0,88,5,173,0,186, + 4,132,0,88,5,171,0,88,5,66,0,20,2,46,0,186,4,160,0,88,4,59,0,88,4,255,0,186,5,8,0,88,7,136,0,130,7,219,0,130, + 2,58,255,236,2,106,255,236,7,136,0,130,7,219,0,130,2,58,255,236,2,106,255,236,7,136,0,130,7,219,0,130,2,58,255,236,2,106,255,236, + 7,136,0,130,7,219,0,130,2,58,255,236,2,106,255,236,7,136,0,130,7,219,0,130,2,58,255,236,2,106,255,236,7,136,0,130,7,219,0,130, + 2,58,255,236,2,106,255,236,8,75,0,130,8,72,0,130,3,211,255,236,4,12,255,236,8,75,0,130,8,72,0,130,3,211,255,236,4,12,255,236, + 5,42,0,157,5,42,0,157,4,242,255,236,5,42,255,236,5,42,0,157,5,42,0,157,4,242,255,236,5,42,255,236,5,42,0,157,5,42,0,157, + 4,242,255,236,5,42,255,236,5,42,0,157,5,42,0,157,4,242,255,236,5,42,255,236,3,144,0,125,4,51,0,125,3,144,0,125,4,51,0,125, + 3,144,0,125,4,51,0,125,3,144,0,125,4,51,0,125,3,221,255,171,4,106,255,171,3,221,255,171,4,106,255,171,7,41,0,130,7,41,0,130, + 3,207,255,236,4,107,255,236,7,41,0,130,7,41,0,130,3,207,255,236,4,107,255,236,7,41,0,130,7,41,0,130,3,207,255,236,4,107,255,236, + 7,41,0,130,7,41,0,130,3,207,255,236,4,107,255,236,5,224,0,147,6,23,0,147,5,224,0,147,6,23,0,147,2,58,255,236,2,106,255,236, + 5,150,0,144,5,14,0,144,4,56,255,236,3,176,255,236,6,152,0,144,6,190,0,144,3,207,255,236,4,107,255,236,3,221,255,171,4,34,255,171, + 2,58,255,236,2,106,255,236,6,67,0,130,6,171,0,130,2,58,255,236,2,106,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,252,112,0,0,0,0,0,0,253,42,0,0,0,0,2,88,0,8,2,88,255,236,2,88,0,8,2,24,0,105, + 2,88,0,8,2,88,0,8,2,88,255,236,2,88,0,8,2,88,255,236,2,88,0,8,2,88,255,236,2,88,255,244,2,88,255,236,2,88,0,24, + 2,88,255,236,3,195,0,163,2,57,255,181,2,112,255,181,2,57,0,108,2,112,0,108,3,221,255,171,4,34,255,171,2,57,0,108,2,112,0,108, + 6,67,0,130,6,171,0,130,2,58,255,236,2,106,255,236,2,57,0,193,2,112,0,193,7,136,0,130,7,219,0,130,2,58,255,236,2,106,255,236, + 4,49,0,139,4,74,0,145,7,136,0,130,7,219,0,130,2,58,255,236,2,106,255,236,7,136,0,130,7,219,0,130,2,58,255,236,2,106,255,236, + 5,42,0,157,5,42,0,157,4,242,255,236,5,42,255,236,5,42,0,157,5,42,0,157,4,242,255,236,5,42,255,236,5,42,0,157,5,42,0,157, + 4,242,255,236,5,42,255,236,3,144,0,125,4,51,0,125,3,144,0,125,4,51,0,125,3,221,255,171,4,106,255,171,3,221,255,171,4,106,255,171, + 9,196,0,130,10,51,0,130,6,180,255,236,7,35,255,236,9,196,0,130,10,51,0,130,6,180,255,236,7,35,255,236,9,172,0,130,9,205,0,130, + 6,203,255,236,6,240,255,236,9,172,0,130,9,205,0,130,6,203,255,236,6,240,255,236,7,102,0,144,7,152,0,144,6,94,255,236,6,144,255,236, + 7,102,0,144,7,152,0,144,6,94,255,236,6,144,255,236,4,198,0,117,4,66,0,117,4,198,255,236,3,220,255,236,4,198,0,117,4,66,0,117, + 4,47,255,236,3,220,255,236,8,75,0,130,8,72,0,130,3,211,255,236,4,12,255,236,6,53,0,107,6,172,0,107,3,211,255,236,4,12,255,236, + 6,152,0,144,6,190,0,144,3,207,255,236,4,107,255,236,5,208,0,144,6,15,0,144,2,112,255,236,2,166,255,236,4,244,0,140,5,83,0,140, + 4,73,255,236,4,160,255,236,5,224,0,147,6,23,0,147,2,58,255,236,2,106,255,236,4,49,0,139,4,74,0,145,4,56,255,236,3,176,255,236, + 3,221,255,171,4,34,255,171,6,67,0,130,6,171,0,130,6,67,0,130,6,171,0,130,2,58,255,236,2,106,255,236,4,144,255,46,4,198,255,46, + 4,144,255,229,4,198,255,229,4,144,0,23,4,198,0,23,4,144,0,84,4,198,0,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,8,52,0,30,6,14,0,100,4,220,0,200,4,128,0,100,4,206,0,200,4,100,0,200,4,100,0,200,3,132,0,150,5,0,0,200, + 7,58,0,150,2,68,0,200,5,25,0,200,4,95,0,200,11,106,0,200,7,13,0,200,7,100,0,200,7,58,0,150,5,125,0,200,6,242,0,200, + 4,176,0,150,4,218,0,200,3,136,0,150,5,146,0,100,5,24,0,200,5,125,0,150,5,120,0,150,6,122,0,100,4,56,0,150,4,118,0,200, + 4,118,0,200,3,132,0,100,6,14,0,100,2,68,0,200,6,14,0,100,5,125,0,150,6,139,0,100,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,5,237,0,16,5,217,0,201,6,141,0,232,5,214,0,201,5,99,0,201,6,51,0,115, + 3,36,0,102,3,34,255,150,6,5,0,201,5,61,0,201,8,51,0,196,6,76,0,114,5,20,0,136,5,170,255,250,6,164,0,177,5,200,0,16, + 8,221,0,68,6,114,0,108,5,168,255,252,5,75,0,123,5,170,0,148,4,102,0,113,5,170,0,148,4,236,0,111,3,185,0,47,5,170,0,113, + 5,229,0,186,2,207,0,230,2,207,255,215,5,53,0,186,2,207,0,230,9,34,0,186,5,229,0,186,4,229,0,113,5,170,0,113,5,170,0,113, + 3,223,0,186,4,43,0,111,3,185,0,55,5,234,0,177,4,220,0,61,7,72,0,86,5,104,0,76,4,255,0,61,4,184,0,88,5,121,0,16, + 5,125,0,201,5,150,0,115,6,41,0,201,5,14,0,201,4,154,0,201,6,51,0,115,6,4,0,201,3,140,0,151,2,92,255,150,5,63,0,201, + 4,117,0,201,6,231,0,201,5,252,0,201,6,76,0,115,4,211,0,201,6,76,0,115,5,143,0,201,5,20,0,135,4,227,255,250,5,219,0,178, + 5,121,0,16,7,233,0,68,5,123,0,61,4,227,255,252,5,123,0,92,4,231,0,123,5,20,0,186,4,102,0,113,5,20,0,113,4,236,0,113, + 2,209,0,47,5,20,0,113,5,18,0,186,2,57,0,193,2,57,255,219,4,162,0,186,2,57,0,193,7,203,0,186,5,18,0,186,4,229,0,113, + 5,20,0,186,5,20,0,113,3,74,0,186,4,43,0,111,3,35,0,55,5,18,0,174,4,188,0,61,6,139,0,86,4,188,0,59,4,188,0,61, + 4,51,0,88,5,23,0,136,5,23,0,107,5,23,0,130,5,23,0,156,5,23,0,90,5,23,0,148,5,23,0,113,5,23,0,65,5,23,0,139, + 5,20,0,106,5,23,0,135,5,23,0,225,5,23,0,150,5,23,0,156,5,23,0,100,5,23,0,158,5,23,0,143,5,23,0,168,5,23,0,139, + 5,23,0,129,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200, + 10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200, + 10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200, + 10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200, + 10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200,10,233,0,200, + 10,233,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200, + 6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200, + 6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200, + 6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200, + 6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200,6,133,0,200, + 6,133,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200, + 8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200, + 8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,64,0,217,8,47,0,200, + 8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200, + 8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200, + 8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200,8,47,0,200, + 8,88,0,153,9,120,0,75,8,87,0,61,9,64,0,170,8,87,0,170,8,87,0,170,9,89,0,95,8,87,0,170,8,87,0,170,8,87,0,170, + 8,87,0,170,8,87,0,143,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170, + 8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170, + 8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170, + 8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,170,9,89,0,95,8,87,0,170,8,87,0,170, + 8,87,0,170,8,87,0,35,8,87,0,170,8,87,0,170,12,213,0,170,8,87,0,170,8,87,0,170,8,87,0,170,8,87,0,58,9,89,0,96, + 8,87,0,58,8,87,0,61,8,87,0,61,8,87,0,61,8,87,0,61,8,87,0,61,8,87,0,61,0,0,255,185,0,0,252,215,0,0,253,115, + 0,0,252,182,0,0,253,12,0,0,252,207,0,0,252,207,0,0,252,199,0,0,252,199,0,0,253,154,0,0,252,230,0,0,252,78,0,150,0,0, + 1,144,0,0,1,144,0,0,1,144,0,0,0,150,0,0,1,144,0,0,7,219,0,130,2,58,255,236,2,106,255,236,8,72,0,130,3,211,255,236, + 4,12,255,236,6,172,0,107,3,211,255,236,4,12,255,236,2,58,255,236,2,106,255,236,1,182,0,0,7,219,0,130,2,58,255,236,2,106,255,236, + 7,219,0,130,2,58,255,236,2,106,255,236,5,42,0,157,4,242,255,236,5,42,255,236,5,42,0,157,4,242,255,236,5,42,255,236,5,42,0,157, + 4,242,255,236,5,42,255,236,5,42,0,157,4,242,255,236,5,42,255,236,3,95,0,0,5,252,0,213,2,57,0,15,2,238,254,242,5,120,1,146, + 5,120,1,146,5,120,1,146,5,120,1,147,5,120,1,147,5,120,1,146,5,120,1,146,5,120,1,118,5,120,1,139,5,120,1,118,5,120,1,139, + 5,120,1,118,5,120,1,139,5,120,1,139,5,120,1,118,5,120,1,118,5,120,1,131,5,120,1,131,5,120,1,131,5,120,1,139,0,0,252,154, + 1,44,0,0,4,24,0,0,4,226,255,171,4,226,255,171,6,15,0,144,2,112,255,236,2,166,255,236,6,171,0,130,2,58,255,236,2,106,255,236, + 4,106,255,171,2,57,0,193,4,74,0,145,5,150,0,113,4,226,0,113,2,57,0,150,2,207,0,79,2,207,255,22,2,57,255,211,2,57,0,191, + 2,178,0,240,3,140,0,151,6,180,1,173,0,0,0,200,0,0,0,200,0,0,0,200,0,0,0,200,0,0,0,200,0,0,0,200,0,0,0,220, + 0,0,0,220,2,58,0,193,2,58,255,236,2,58,255,236,4,146,0,113,4,146,255,236,4,146,255,236,3,100,0,61,3,100,255,236,3,100,255,236, + 4,188,0,61,4,188,255,236,4,188,255,236,5,59,0,186,5,59,255,236,5,59,255,236,5,59,0,186,5,59,255,236,5,59,255,236,4,192,0,113, + 4,192,255,236,4,192,255,236,5,59,0,186,5,59,255,236,5,59,255,236,6,161,0,113,6,161,255,236,6,161,255,236,3,129,0,193,3,129,255,236, + 3,129,255,236,3,129,0,61,3,129,255,236,3,129,255,236,4,120,0,186,4,120,255,236,4,120,255,236,4,229,0,193,4,229,255,236,4,229,255,236, + 2,205,0,61,2,205,255,236,2,205,255,236,7,172,0,193,7,172,255,236,7,172,255,236,3,200,0,61,3,200,255,236,3,200,255,236,6,68,0,61, + 6,68,255,236,6,68,255,236,5,59,0,186,5,59,255,236,5,59,255,236,5,0,0,61,5,0,255,236,5,0,255,236,5,223,0,193,5,223,255,236, + 5,223,255,236,4,61,0,193,4,61,255,236,4,61,255,236,5,203,0,112,5,203,255,236,5,203,255,236,3,200,0,61,3,200,255,236,3,200,255,236, + 5,0,0,61,5,0,255,236,5,0,255,236,4,192,0,113,4,192,255,236,4,192,255,236,4,61,0,193,4,61,255,236,4,61,255,236,4,61,0,193, + 4,61,255,236,4,61,255,236,4,46,0,193,4,46,255,236,4,46,255,236,4,192,0,113,4,192,255,236,4,192,255,236,4,192,0,113,4,192,255,236, + 4,192,255,236,0,0,252,236,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170,7,44,0,170, + 6,179,1,151,6,46,0,201,5,106,0,193,5,18,0,174,4,51,0,125,4,51,0,125,4,51,0,125,4,51,0,125,4,51,0,125,4,106,255,171, + 4,106,255,171,4,106,255,171,4,106,255,171,4,106,255,171,10,51,0,130,6,180,255,236,7,35,255,236,10,51,0,130,6,180,255,236,7,35,255,236, + 10,51,0,130,6,180,255,236,7,35,255,236,9,205,0,130,6,203,255,236,6,240,255,236,9,205,0,130,6,203,255,236,6,240,255,236,7,152,0,144, + 6,94,255,236,6,144,255,236,4,66,0,117,4,198,255,236,3,220,255,236,8,72,0,130,3,211,255,236,4,12,255,236,8,72,0,130,3,211,255,236, + 4,12,255,236,8,72,0,130,3,211,255,236,4,12,255,236,6,172,0,107,3,211,255,236,4,12,255,236,6,172,0,107,3,211,255,236,4,12,255,236, + 8,110,0,130,6,242,255,236,6,242,255,236,7,41,0,130,3,207,255,236,4,107,255,236,6,190,0,144,3,207,255,236,4,107,255,236,6,190,0,144, + 3,207,255,236,4,107,255,236,7,41,0,130,3,207,255,236,4,107,255,236,7,41,0,130,3,207,255,236,4,107,255,236,7,41,0,130,3,207,255,236, + 4,107,255,236,6,15,0,144,2,112,255,236,2,166,255,236,6,15,0,144,2,112,255,236,2,166,255,236,6,15,0,144,2,112,255,236,2,166,255,236, + 6,23,0,147,2,58,255,236,2,106,255,236,6,23,0,147,2,58,255,236,2,106,255,236,6,23,0,147,2,58,255,236,2,106,255,236,0,0,0,1, + 0,0,63,248,0,1,10,167,48,0,0,11,15,234,0,16,0,36,255,211,0,16,0,37,255,183,0,16,0,42,0,75,0,16,0,45,0,114,0,16, + 0,50,0,57,0,16,0,52,0,75,0,16,0,55,255,68,0,16,0,57,255,136,0,16,0,58,255,173,0,16,0,59,255,154,0,16,0,60,255,13, + 0,16,0,82,0,38,0,16,0,89,255,201,0,16,0,92,255,220,0,16,0,130,255,211,0,16,0,131,255,211,0,16,0,132,255,211,0,16,0,133, + 255,211,0,16,0,134,255,211,0,16,0,148,0,57,0,16,0,149,0,57,0,16,0,150,0,57,0,16,0,151,0,57,0,16,0,152,0,57,0,16, + 0,159,255,13,0,16,0,180,0,38,0,16,0,181,0,38,0,16,0,182,0,38,0,16,0,183,0,38,0,16,0,184,0,38,0,16,0,191,255,220, + 0,16,0,193,255,220,0,16,0,194,255,211,0,16,0,196,255,211,0,16,0,198,255,211,0,16,0,224,0,75,0,16,1,38,255,68,0,16,1,58, + 255,13,0,36,0,16,255,211,0,36,0,17,255,220,0,36,0,29,255,220,0,36,0,36,0,57,0,36,0,38,255,220,0,36,0,42,255,220,0,36, + 0,50,255,220,0,36,0,52,255,220,0,36,0,55,255,97,0,36,0,57,255,125,0,36,0,58,255,144,0,36,0,60,255,97,0,36,0,70,255,220, + 0,36,0,71,255,220,0,36,0,72,255,220,0,36,0,73,255,183,0,36,0,82,255,220,0,36,0,84,255,220,0,36,0,87,255,220,0,36,0,89, + 255,136,0,36,0,90,255,173,0,36,0,92,255,117,0,36,0,109,255,183,0,36,0,130,0,57,0,36,0,131,0,57,0,36,0,132,0,57,0,36, + 0,133,0,57,0,36,0,134,0,57,0,36,0,137,255,220,0,36,0,148,255,220,0,36,0,149,255,220,0,36,0,150,255,220,0,36,0,151,255,220, + 0,36,0,152,255,220,0,36,0,159,255,97,0,36,0,169,255,220,0,36,0,170,255,220,0,36,0,171,255,220,0,36,0,172,255,220,0,36,0,173, + 255,220,0,36,0,180,255,220,0,36,0,181,255,220,0,36,0,182,255,220,0,36,0,183,255,220,0,36,0,184,255,220,0,36,0,191,255,117,0,36, + 0,193,255,117,0,36,0,194,0,57,0,36,0,196,0,57,0,36,0,198,0,57,0,36,0,200,255,220,0,36,0,201,255,220,0,36,0,202,255,220, + 0,36,0,203,255,220,0,36,0,204,255,220,0,36,0,205,255,220,0,36,0,206,255,220,0,36,0,207,255,220,0,36,0,209,255,220,0,36,0,211, + 255,220,0,36,0,213,255,220,0,36,0,215,255,220,0,36,0,217,255,220,0,36,0,219,255,220,0,36,0,221,255,220,0,36,0,222,255,220,0,36, + 0,224,255,220,0,36,0,226,255,220,0,36,1,14,255,220,0,36,1,15,255,220,0,36,1,16,255,220,0,36,1,17,255,220,0,36,1,18,255,220, + 0,36,1,19,255,220,0,36,1,36,255,97,0,36,1,37,255,220,0,36,1,38,255,97,0,36,1,39,255,220,0,36,1,54,255,144,0,36,1,55, + 255,173,0,36,1,56,255,97,0,36,1,57,255,117,0,36,1,58,255,97,0,36,1,136,255,220,0,36,1,172,255,220,0,36,1,173,255,220,0,36, + 1,174,255,220,0,36,1,175,255,220,0,36,1,220,255,97,0,36,1,221,255,220,0,36,1,240,255,220,0,36,1,243,255,220,0,36,1,244,255,97, + 0,36,1,245,255,117,0,36,9,121,255,144,0,36,9,122,255,173,0,36,9,123,255,144,0,36,9,124,255,173,0,36,9,125,255,144,0,36,9,126, + 255,173,0,36,9,235,255,97,0,36,9,236,255,117,0,36,10,250,254,248,0,36,10,251,255,3,0,36,10,252,0,47,0,37,0,38,255,220,0,37, + 0,42,255,220,0,37,0,50,255,220,0,37,0,54,255,220,0,37,0,57,255,193,0,37,0,58,255,183,0,37,0,60,255,144,0,37,0,109,255,193, + 0,37,0,125,255,220,0,37,0,137,255,220,0,37,0,148,255,220,0,37,0,149,255,220,0,37,0,150,255,220,0,37,0,151,255,220,0,37,0,152, + 255,220,0,37,0,159,255,144,0,37,0,200,255,220,0,37,0,202,255,220,0,37,0,204,255,220,0,37,0,206,255,220,0,37,0,222,255,220,0,37, + 0,224,255,220,0,37,0,226,255,220,0,37,0,228,255,220,0,37,1,14,255,220,0,37,1,16,255,220,0,37,1,18,255,220,0,37,1,28,255,220, + 0,37,1,30,255,220,0,37,1,32,255,220,0,37,1,34,255,220,0,37,1,54,255,183,0,37,1,56,255,144,0,37,1,58,255,144,0,37,1,172, + 255,220,0,37,1,174,255,220,0,37,1,218,255,220,0,37,1,240,255,220,0,37,9,121,255,183,0,37,9,123,255,183,0,37,9,125,255,183,0,37, + 9,235,255,144,0,37,10,250,255,144,0,37,10,251,255,144,0,37,10,252,255,173,0,38,0,60,255,220,0,38,0,109,255,220,0,38,0,125,255,220, + 0,38,0,159,255,220,0,38,1,56,255,220,0,38,1,58,255,220,0,38,1,244,255,220,0,38,9,235,255,220,0,38,10,251,0,38,0,39,0,36, + 255,220,0,39,0,57,255,220,0,39,0,60,255,144,0,39,0,109,255,220,0,39,0,125,255,220,0,39,0,130,255,220,0,39,0,131,255,220,0,39, + 0,132,255,220,0,39,0,133,255,220,0,39,0,134,255,220,0,39,0,159,255,144,0,39,0,194,255,220,0,39,0,196,255,220,0,39,0,198,255,220, + 0,39,1,56,255,144,0,39,1,58,255,144,0,39,1,244,255,144,0,39,9,235,255,144,0,39,10,250,255,211,0,39,10,251,255,201,0,39,10,252, + 255,68,0,41,0,17,254,183,0,41,0,29,255,97,0,41,0,36,255,68,0,41,0,54,255,220,0,41,0,55,255,220,0,41,0,68,255,68,0,41, + 0,72,255,144,0,41,0,76,255,107,0,41,0,82,255,183,0,41,0,85,255,107,0,41,0,88,255,144,0,41,0,92,255,68,0,41,0,130,255,68, + 0,41,0,131,255,68,0,41,0,132,255,68,0,41,0,133,255,68,0,41,0,134,255,68,0,41,0,162,255,68,0,41,0,163,255,68,0,41,0,164, + 255,68,0,41,0,165,255,68,0,41,0,166,255,68,0,41,0,167,255,68,0,41,0,170,255,144,0,41,0,171,255,144,0,41,0,172,255,144,0,41, + 0,173,255,144,0,41,0,180,255,183,0,41,0,181,255,183,0,41,0,182,255,183,0,41,0,183,255,183,0,41,0,184,255,183,0,41,0,187,255,144, + 0,41,0,188,255,144,0,41,0,189,255,144,0,41,0,190,255,144,0,41,0,191,255,68,0,41,0,193,255,68,0,41,0,194,255,68,0,41,0,195, + 255,68,0,41,0,196,255,68,0,41,0,197,255,68,0,41,0,198,255,68,0,41,0,199,255,68,0,41,0,213,255,144,0,41,0,215,255,144,0,41, + 0,217,255,144,0,41,0,219,255,144,0,41,0,221,255,144,0,41,0,241,255,107,0,41,0,245,255,107,0,41,1,15,255,183,0,41,1,17,255,183, + 0,41,1,19,255,183,0,41,1,23,255,107,0,41,1,25,255,107,0,41,1,27,255,107,0,41,1,28,255,220,0,41,1,30,255,220,0,41,1,32, + 255,220,0,41,1,34,255,220,0,41,1,36,255,220,0,41,1,38,255,220,0,41,1,40,255,220,0,41,1,43,255,144,0,41,1,45,255,144,0,41, + 1,47,255,144,0,41,1,49,255,144,0,41,1,51,255,144,0,41,1,53,255,144,0,41,1,57,255,68,0,41,1,173,255,183,0,41,1,175,255,183, + 0,41,1,218,255,220,0,41,1,220,255,220,0,41,1,241,255,183,0,41,1,245,255,68,0,41,9,236,255,68,0,41,10,250,255,211,0,41,10,252, + 254,136,0,42,0,55,255,183,0,42,0,60,255,154,0,42,0,109,255,220,0,42,0,125,255,220,0,42,0,159,255,154,0,42,1,38,255,183,0,42, + 1,58,255,154,0,42,10,250,255,211,0,42,10,251,255,211,0,42,10,252,255,201,0,43,0,17,255,220,0,43,10,250,255,183,0,43,10,251,255,193, + 0,43,10,252,255,183,0,45,0,16,255,183,0,45,0,36,255,220,0,45,0,109,255,220,0,45,0,125,255,220,0,45,0,130,255,220,0,45,0,131, + 255,220,0,45,0,132,255,220,0,45,0,133,255,220,0,45,0,134,255,220,0,45,10,250,255,183,0,45,10,251,255,193,0,45,10,252,255,144,0,46, + 0,16,255,41,0,46,0,36,255,220,0,46,0,38,255,144,0,46,0,50,255,144,0,46,0,55,255,97,0,46,0,56,255,201,0,46,0,58,255,183, + 0,46,0,60,255,183,0,46,0,68,255,220,0,46,0,72,255,154,0,46,0,82,255,154,0,46,0,88,255,154,0,46,0,92,255,107,0,46,0,109, + 255,125,0,46,0,130,255,220,0,46,0,131,255,220,0,46,0,132,255,220,0,46,0,133,255,220,0,46,0,134,255,220,0,46,0,137,255,144,0,46, + 0,148,255,144,0,46,0,149,255,144,0,46,0,150,255,144,0,46,0,151,255,144,0,46,0,152,255,144,0,46,0,155,255,201,0,46,0,156,255,201, + 0,46,0,157,255,201,0,46,0,158,255,201,0,46,0,159,255,183,0,46,0,162,255,220,0,46,0,163,255,220,0,46,0,164,255,220,0,46,0,165, + 255,220,0,46,0,166,255,220,0,46,0,167,255,220,0,46,0,170,255,154,0,46,0,171,255,154,0,46,0,172,255,154,0,46,0,173,255,154,0,46, + 0,180,255,154,0,46,0,181,255,154,0,46,0,182,255,154,0,46,0,183,255,154,0,46,0,184,255,154,0,46,0,187,255,154,0,46,0,188,255,154, + 0,46,0,189,255,154,0,46,0,190,255,154,0,46,0,191,255,107,0,46,0,193,255,107,0,46,0,200,255,144,0,46,0,206,255,144,0,46,0,221, + 255,154,0,46,1,38,255,97,0,46,1,48,255,201,0,46,1,49,255,154,0,46,1,58,255,183,0,46,10,250,255,193,0,46,10,251,255,193,0,47, + 0,16,255,220,0,47,0,36,0,47,0,47,0,50,255,183,0,47,0,55,254,230,0,47,0,56,255,154,0,47,0,57,255,31,0,47,0,58,255,68, + 0,47,0,60,254,240,0,47,0,72,255,220,0,47,0,82,255,220,0,47,0,88,255,220,0,47,0,92,255,68,0,47,0,130,0,47,0,47,0,131, + 0,47,0,47,0,132,0,47,0,47,0,133,0,47,0,47,0,134,0,47,0,47,0,148,255,183,0,47,0,149,255,183,0,47,0,150,255,183,0,47, + 0,151,255,183,0,47,0,152,255,183,0,47,0,155,255,154,0,47,0,156,255,154,0,47,0,157,255,154,0,47,0,158,255,154,0,47,0,159,254,240, + 0,47,0,170,255,220,0,47,0,171,255,220,0,47,0,172,255,220,0,47,0,173,255,220,0,47,0,180,255,220,0,47,0,181,255,220,0,47,0,182, + 255,220,0,47,0,183,255,220,0,47,0,184,255,220,0,47,0,187,255,220,0,47,0,188,255,220,0,47,0,189,255,220,0,47,0,190,255,220,0,47, + 0,191,255,68,0,47,0,193,255,68,0,47,0,221,255,220,0,47,1,38,254,230,0,47,1,48,255,154,0,47,1,49,255,220,0,47,1,58,254,240, + 0,47,10,250,254,97,0,47,10,251,253,230,0,50,0,16,0,57,0,50,0,17,255,173,0,50,0,29,255,220,0,50,0,36,255,220,0,50,0,57, + 255,220,0,50,0,59,255,125,0,50,0,60,255,144,0,50,0,109,255,220,0,50,0,130,255,220,0,50,0,131,255,220,0,50,0,132,255,220,0,50, + 0,133,255,220,0,50,0,134,255,220,0,50,0,159,255,144,0,50,1,58,255,144,0,50,10,250,255,211,0,50,10,251,255,220,0,50,10,252,255,68, + 0,51,0,16,255,211,0,51,0,17,254,193,0,51,0,36,255,125,0,51,0,60,255,211,0,51,0,68,255,164,0,51,0,72,255,183,0,51,0,76, + 255,211,0,51,0,81,255,220,0,51,0,82,255,183,0,51,0,85,255,220,0,51,0,86,255,220,0,51,0,88,255,220,0,51,0,109,255,220,0,51, + 0,130,255,125,0,51,0,131,255,125,0,51,0,132,255,125,0,51,0,133,255,125,0,51,0,134,255,125,0,51,0,159,255,211,0,51,0,162,255,164, + 0,51,0,163,255,164,0,51,0,164,255,164,0,51,0,165,255,164,0,51,0,166,255,164,0,51,0,167,255,164,0,51,0,170,255,183,0,51,0,171, + 255,183,0,51,0,172,255,183,0,51,0,173,255,183,0,51,0,179,255,220,0,51,0,180,255,183,0,51,0,181,255,183,0,51,0,182,255,183,0,51, + 0,183,255,183,0,51,0,184,255,183,0,51,0,187,255,220,0,51,0,188,255,220,0,51,0,189,255,220,0,51,0,190,255,220,0,51,0,221,255,183, + 0,51,1,10,255,220,0,51,1,23,255,220,0,51,1,27,255,220,0,51,1,33,255,220,0,51,1,35,255,220,0,51,1,49,255,220,0,51,1,58, + 255,211,0,51,10,250,0,38,0,51,10,251,0,38,0,51,10,252,254,183,0,52,0,16,0,57,0,52,10,250,255,211,0,52,10,251,255,220,0,52, + 10,252,255,125,0,53,0,16,255,173,0,53,0,17,255,183,0,53,0,29,255,193,0,53,0,36,255,173,0,53,0,38,255,154,0,53,0,55,255,107, + 0,53,0,57,255,144,0,53,0,58,255,173,0,53,0,60,255,125,0,53,0,68,255,211,0,53,0,72,255,164,0,53,0,82,255,164,0,53,0,88, + 255,164,0,53,0,92,255,144,0,53,0,109,255,144,0,53,0,125,255,220,0,53,0,130,255,173,0,53,0,131,255,173,0,53,0,132,255,173,0,53, + 0,133,255,173,0,53,0,134,255,173,0,53,0,137,255,154,0,53,0,159,255,125,0,53,0,162,255,211,0,53,0,163,255,211,0,53,0,164,255,211, + 0,53,0,165,255,211,0,53,0,166,255,211,0,53,0,167,255,211,0,53,0,170,255,164,0,53,0,171,255,164,0,53,0,172,255,164,0,53,0,173, + 255,164,0,53,0,180,255,164,0,53,0,181,255,164,0,53,0,182,255,164,0,53,0,183,255,164,0,53,0,184,255,164,0,53,0,187,255,164,0,53, + 0,188,255,164,0,53,0,189,255,164,0,53,0,190,255,164,0,53,0,191,255,144,0,53,0,193,255,144,0,53,0,200,255,154,0,53,0,206,255,154, + 0,53,0,221,255,164,0,53,1,38,255,107,0,53,1,49,255,164,0,53,1,58,255,125,0,53,10,250,255,107,0,53,10,251,255,125,0,53,10,252, + 255,220,0,54,0,36,0,38,0,54,0,130,0,38,0,54,0,131,0,38,0,54,0,132,0,38,0,54,0,133,0,38,0,54,0,134,0,38,0,55, + 0,16,255,68,0,55,0,17,255,13,0,55,0,29,255,31,0,55,0,36,255,97,0,55,0,38,255,136,0,55,0,55,255,220,0,55,0,68,254,173, + 0,55,0,70,254,164,0,55,0,72,254,164,0,55,0,76,255,193,0,55,0,82,254,164,0,55,0,85,254,211,0,55,0,86,254,173,0,55,0,88, + 254,201,0,55,0,90,254,173,0,55,0,92,254,193,0,55,0,109,255,68,0,55,0,125,255,144,0,55,0,130,255,97,0,55,0,131,255,97,0,55, + 0,132,255,97,0,55,0,133,255,97,0,55,0,134,255,97,0,55,0,137,255,136,0,55,0,162,255,17,0,55,0,163,254,173,0,55,0,164,255,17, + 0,55,0,165,255,17,0,55,0,166,255,17,0,55,0,167,255,17,0,55,0,169,254,164,0,55,0,170,254,224,0,55,0,171,254,164,0,55,0,172, + 254,224,0,55,0,173,254,224,0,55,0,180,254,244,0,55,0,181,254,164,0,55,0,182,254,244,0,55,0,183,254,244,0,55,0,184,254,244,0,55, + 0,187,254,231,0,55,0,188,254,201,0,55,0,189,254,231,0,55,0,190,254,231,0,55,0,191,254,193,0,55,0,193,254,193,0,55,0,200,255,136, + 0,55,0,201,254,164,0,55,0,206,255,136,0,55,0,207,254,164,0,55,0,221,254,164,0,55,1,23,254,211,0,55,1,27,254,211,0,55,1,33, + 254,173,0,55,1,35,254,173,0,55,1,38,255,220,0,55,1,49,254,201,0,55,10,251,255,211,0,55,10,252,254,248,0,56,0,61,255,220,0,56, + 1,63,255,220,0,57,0,16,255,136,0,57,0,17,254,248,0,57,0,29,255,89,0,57,0,36,255,125,0,57,0,50,255,220,0,57,0,68,255,97, + 0,57,0,72,255,97,0,57,0,76,255,211,0,57,0,82,255,97,0,57,0,88,255,117,0,57,0,92,255,201,0,57,0,109,255,78,0,57,0,125, + 255,144,0,57,0,130,255,125,0,57,0,131,255,125,0,57,0,132,255,125,0,57,0,133,255,125,0,57,0,134,255,125,0,57,0,148,255,220,0,57, + 0,149,255,220,0,57,0,150,255,220,0,57,0,151,255,220,0,57,0,152,255,220,0,57,0,162,255,97,0,57,0,163,255,97,0,57,0,164,255,97, + 0,57,0,165,255,97,0,57,0,166,255,97,0,57,0,167,255,97,0,57,0,170,255,97,0,57,0,171,255,97,0,57,0,172,255,97,0,57,0,173, + 255,97,0,57,0,180,255,97,0,57,0,181,255,97,0,57,0,182,255,97,0,57,0,183,255,97,0,57,0,184,255,97,0,57,0,187,255,117,0,57, + 0,188,255,117,0,57,0,189,255,117,0,57,0,190,255,117,0,57,0,191,255,201,0,57,0,193,255,201,0,57,0,221,255,97,0,57,1,49,255,117, + 0,57,10,252,254,230,0,58,0,16,255,173,0,58,0,17,255,21,0,58,0,29,255,136,0,58,0,36,255,144,0,58,0,68,255,125,0,58,0,72, + 255,136,0,58,0,76,255,211,0,58,0,82,255,136,0,58,0,85,255,164,0,58,0,88,255,183,0,58,0,92,255,220,0,58,0,109,255,144,0,58, + 0,125,255,220,0,58,0,130,255,144,0,58,0,131,255,144,0,58,0,132,255,144,0,58,0,133,255,144,0,58,0,134,255,144,0,58,0,162,255,125, + 0,58,0,163,255,125,0,58,0,164,255,125,0,58,0,165,255,125,0,58,0,166,255,125,0,58,0,167,255,125,0,58,0,170,255,136,0,58,0,171, + 255,136,0,58,0,172,255,136,0,58,0,173,255,136,0,58,0,180,255,136,0,58,0,181,255,136,0,58,0,182,255,136,0,58,0,183,255,136,0,58, + 0,184,255,136,0,58,0,187,255,183,0,58,0,188,255,183,0,58,0,189,255,183,0,58,0,190,255,183,0,58,0,191,255,220,0,58,0,193,255,220, + 0,58,0,221,255,136,0,58,1,23,255,164,0,58,1,27,255,164,0,58,1,49,255,183,0,58,10,250,255,220,0,58,10,252,254,248,0,59,0,16, + 255,154,0,59,0,38,255,107,0,59,0,50,255,125,0,59,0,55,255,220,0,59,0,72,255,164,0,59,0,109,255,144,0,59,0,137,255,107,0,59, + 0,148,255,125,0,59,0,149,255,125,0,59,0,150,255,125,0,59,0,151,255,125,0,59,0,152,255,125,0,59,0,170,255,164,0,59,0,171,255,164, + 0,59,0,172,255,164,0,59,0,173,255,164,0,59,0,200,255,107,0,59,0,206,255,107,0,59,0,221,255,164,0,59,1,38,255,220,0,59,10,250, + 255,97,0,59,10,251,255,173,0,59,10,252,255,211,0,60,0,16,255,13,0,60,0,17,254,97,0,60,0,29,254,240,0,60,0,36,255,97,0,60, + 0,38,255,144,0,60,0,50,255,144,0,60,0,68,254,230,0,60,0,72,254,240,0,60,0,76,255,183,0,60,0,82,254,240,0,60,0,88,255,21, + 0,60,0,109,255,31,0,60,0,125,255,107,0,60,0,130,255,97,0,60,0,131,255,97,0,60,0,132,255,97,0,60,0,133,255,97,0,60,0,134, + 255,97,0,60,0,137,255,144,0,60,0,148,255,144,0,60,0,149,255,144,0,60,0,150,255,144,0,60,0,151,255,144,0,60,0,152,255,144,0,60, + 0,162,254,230,0,60,0,163,254,230,0,60,0,164,254,230,0,60,0,165,254,230,0,60,0,166,254,230,0,60,0,167,254,230,0,60,0,170,254,240, + 0,60,0,171,254,240,0,60,0,172,254,240,0,60,0,173,254,240,0,60,0,180,254,240,0,60,0,181,254,240,0,60,0,182,254,240,0,60,0,183, + 254,240,0,60,0,184,254,240,0,60,0,187,255,21,0,60,0,188,255,21,0,60,0,189,255,21,0,60,0,190,255,21,0,60,0,200,255,144,0,60, + 0,206,255,144,0,60,0,221,254,240,0,60,1,49,255,21,0,60,10,250,255,144,0,60,10,251,255,220,0,60,10,252,254,248,0,61,0,16,255,220, + 0,61,10,250,255,220,0,61,10,251,255,220,0,61,10,252,255,220,0,72,0,91,255,220,0,73,0,16,255,144,0,73,0,17,255,107,0,73,0,29, + 255,183,0,73,0,87,255,220,0,73,0,90,255,220,0,73,0,92,255,220,0,73,0,109,255,183,0,73,0,125,255,220,0,73,0,191,255,220,0,73, + 0,193,255,220,0,73,1,39,255,220,0,73,10,250,0,65,0,73,10,252,255,21,0,78,0,68,255,220,0,78,0,72,255,183,0,78,0,82,255,183, + 0,78,0,88,255,193,0,78,0,92,255,183,0,78,0,162,255,220,0,78,0,163,255,220,0,78,0,164,255,220,0,78,0,165,255,220,0,78,0,166, + 255,220,0,78,0,167,255,220,0,78,0,170,255,183,0,78,0,171,255,183,0,78,0,172,255,183,0,78,0,173,255,183,0,78,0,180,255,183,0,78, + 0,181,255,183,0,78,0,182,255,183,0,78,0,183,255,183,0,78,0,184,255,183,0,78,0,187,255,193,0,78,0,188,255,193,0,78,0,189,255,193, + 0,78,0,190,255,193,0,78,0,191,255,183,0,78,0,193,255,183,0,78,0,221,255,183,0,78,1,49,255,193,0,81,10,250,255,107,0,81,10,251, + 255,144,0,81,10,252,255,164,0,82,0,16,0,38,0,82,0,17,255,220,0,82,0,91,255,193,0,82,10,250,255,107,0,82,10,251,255,183,0,82, + 10,252,255,125,0,85,0,16,255,125,0,85,0,17,255,68,0,85,0,29,255,220,0,85,0,70,255,211,0,85,0,71,255,220,0,85,0,72,255,211, + 0,85,0,74,255,220,0,85,0,75,255,220,0,85,0,80,255,220,0,85,0,81,255,220,0,85,0,82,255,211,0,85,0,84,255,220,0,85,0,85, + 255,220,0,85,0,91,255,201,0,85,0,109,255,183,0,85,0,169,255,211,0,85,0,170,255,211,0,85,0,171,255,211,0,85,0,172,255,211,0,85, + 0,173,255,211,0,85,0,179,255,220,0,85,0,180,255,211,0,85,0,181,255,211,0,85,0,182,255,211,0,85,0,183,255,211,0,85,0,184,255,211, + 0,85,0,201,255,211,0,85,0,207,255,211,0,85,0,209,0,72,0,85,0,221,255,211,0,85,0,225,255,220,0,85,1,10,255,220,0,85,1,23, + 255,220,0,85,1,27,255,220,0,85,10,251,0,86,0,85,10,252,254,201,0,89,0,16,255,201,0,89,0,17,255,97,0,89,0,29,255,144,0,89, + 0,109,255,220,0,89,0,125,255,220,0,89,10,251,255,220,0,89,10,252,254,240,0,90,0,17,255,68,0,90,0,29,255,144,0,90,0,109,255,220, + 0,90,0,125,255,220,0,90,10,252,255,41,0,91,0,70,255,220,0,91,0,72,255,193,0,91,0,82,255,193,0,91,0,169,255,220,0,91,0,170, + 255,193,0,91,0,171,255,193,0,91,0,172,255,193,0,91,0,173,255,193,0,91,0,180,255,193,0,91,0,181,255,193,0,91,0,182,255,193,0,91, + 0,183,255,193,0,91,0,184,255,193,0,91,0,201,255,220,0,91,0,207,255,220,0,91,0,221,255,193,0,92,0,16,255,220,0,92,0,17,254,220, + 0,92,0,29,255,107,0,92,0,109,255,220,0,92,0,125,255,220,0,92,10,252,254,211,0,109,0,37,255,220,0,109,0,38,255,220,0,109,0,39, + 255,220,0,109,0,42,255,220,0,109,0,45,255,220,0,109,0,55,255,144,0,109,0,57,255,144,0,109,0,58,255,220,0,109,0,60,255,107,0,109, + 0,89,255,220,0,109,0,90,255,220,0,109,0,92,255,220,0,109,0,136,0,151,0,109,0,137,255,220,0,109,0,159,255,107,0,109,0,191,255,220, + 0,109,0,193,255,220,0,109,0,200,255,220,0,109,0,206,255,220,0,109,0,208,255,220,0,109,0,224,255,220,0,109,1,38,255,144,0,109,1,58, + 255,107,0,125,0,36,255,183,0,125,0,37,255,183,0,125,0,38,255,220,0,125,0,39,255,220,0,125,0,45,255,220,0,125,0,50,255,220,0,125, + 0,55,255,68,0,125,0,57,255,78,0,125,0,58,255,144,0,125,0,59,255,144,0,125,0,60,255,31,0,125,0,89,255,220,0,125,0,90,255,220, + 0,125,0,92,255,220,0,125,0,130,255,183,0,125,0,131,255,183,0,125,0,132,255,183,0,125,0,133,255,183,0,125,0,134,255,183,0,125,0,137, + 255,220,0,125,0,148,255,220,0,125,0,149,255,220,0,125,0,150,255,220,0,125,0,151,255,220,0,125,0,152,255,220,0,125,0,159,255,31,0,125, + 0,191,255,220,0,125,0,193,255,220,0,125,0,200,255,220,0,125,0,206,255,220,0,125,0,208,255,220,0,125,1,38,255,68,0,125,1,58,255,31, + 0,130,0,16,255,211,0,130,0,17,255,220,0,130,0,29,255,220,0,130,0,36,0,57,0,130,0,38,255,220,0,130,0,42,255,220,0,130,0,50, + 255,220,0,130,0,52,255,220,0,130,0,55,255,97,0,130,0,57,255,125,0,130,0,58,255,144,0,130,0,60,255,97,0,130,0,70,255,220,0,130, + 0,71,255,220,0,130,0,72,255,220,0,130,0,73,255,183,0,130,0,82,255,220,0,130,0,84,255,220,0,130,0,87,255,220,0,130,0,89,255,136, + 0,130,0,90,255,173,0,130,0,92,255,117,0,130,0,109,255,183,0,130,0,130,0,57,0,130,0,131,0,57,0,130,0,132,0,57,0,130,0,133, + 0,57,0,130,0,134,0,57,0,130,0,137,255,220,0,130,0,148,255,220,0,130,0,149,255,220,0,130,0,150,255,220,0,130,0,151,255,220,0,130, + 0,152,255,220,0,130,0,159,255,97,0,130,0,169,255,220,0,130,0,170,255,220,0,130,0,171,255,220,0,130,0,172,255,220,0,130,0,173,255,220, + 0,130,0,180,255,220,0,130,0,181,255,220,0,130,0,182,255,220,0,130,0,183,255,220,0,130,0,184,255,220,0,130,0,191,255,117,0,130,0,193, + 255,117,0,130,0,194,0,57,0,130,0,196,0,57,0,130,0,198,0,57,0,130,0,200,255,220,0,130,0,201,255,220,0,130,0,202,255,220,0,130, + 0,204,255,220,0,130,0,205,255,220,0,130,0,206,255,220,0,130,0,207,255,220,0,130,0,209,255,220,0,130,0,213,255,220,0,130,0,215,255,220, + 0,130,0,217,255,220,0,130,0,219,255,220,0,130,0,221,255,220,0,130,0,222,255,220,0,130,0,224,255,220,0,130,0,226,255,220,0,130,1,14, + 255,220,0,130,1,15,255,220,0,130,1,16,255,220,0,130,1,17,255,220,0,130,1,18,255,220,0,130,1,19,255,220,0,130,1,36,255,97,0,130, + 1,37,255,220,0,130,1,38,255,97,0,130,1,39,255,220,0,130,1,54,255,144,0,130,1,55,255,173,0,130,1,56,255,97,0,130,1,57,255,117, + 0,130,1,58,255,97,0,130,1,240,255,220,0,130,1,241,255,220,0,130,9,121,255,144,0,130,9,124,255,173,0,130,9,125,255,144,0,130,9,126, + 255,173,0,130,9,235,255,97,0,130,9,236,255,117,0,130,10,250,254,248,0,130,10,251,255,3,0,130,10,252,0,47,0,131,0,16,255,211,0,131, + 0,17,255,220,0,131,0,29,255,220,0,131,0,36,0,57,0,131,0,38,255,220,0,131,0,42,255,220,0,131,0,50,255,220,0,131,0,52,255,220, + 0,131,0,55,255,97,0,131,0,57,255,125,0,131,0,58,255,144,0,131,0,60,255,97,0,131,0,70,255,220,0,131,0,71,255,220,0,131,0,72, + 255,220,0,131,0,73,255,183,0,131,0,82,255,220,0,131,0,84,255,220,0,131,0,87,255,220,0,131,0,89,255,136,0,131,0,90,255,173,0,131, + 0,92,255,117,0,131,0,109,255,183,0,131,0,130,0,57,0,131,0,131,0,57,0,131,0,132,0,57,0,131,0,133,0,57,0,131,0,134,0,57, + 0,131,0,137,255,220,0,131,0,148,255,220,0,131,0,149,255,220,0,131,0,150,255,220,0,131,0,151,255,220,0,131,0,152,255,220,0,131,0,159, + 255,97,0,131,0,169,255,220,0,131,0,170,255,220,0,131,0,171,255,220,0,131,0,172,255,220,0,131,0,173,255,220,0,131,0,180,255,220,0,131, + 0,181,255,220,0,131,0,182,255,220,0,131,0,183,255,220,0,131,0,184,255,220,0,131,0,191,255,117,0,131,0,193,255,117,0,131,0,194,0,57, + 0,131,0,196,0,57,0,131,0,198,0,57,0,131,0,200,255,220,0,131,0,201,255,220,0,131,0,202,255,220,0,131,0,204,255,220,0,131,0,205, + 255,220,0,131,0,206,255,220,0,131,0,207,255,220,0,131,0,209,255,220,0,131,0,213,255,220,0,131,0,215,255,220,0,131,0,217,255,220,0,131, + 0,219,255,220,0,131,0,221,255,220,0,131,0,222,255,220,0,131,0,224,255,220,0,131,0,226,255,220,0,131,1,14,255,220,0,131,1,15,255,220, + 0,131,1,16,255,220,0,131,1,17,255,220,0,131,1,18,255,220,0,131,1,19,255,220,0,131,1,36,255,97,0,131,1,37,255,220,0,131,1,38, + 255,97,0,131,1,39,255,220,0,131,1,54,255,144,0,131,1,55,255,173,0,131,1,56,255,97,0,131,1,57,255,117,0,131,1,58,255,97,0,131, + 1,240,255,220,0,131,1,241,255,220,0,131,9,121,255,144,0,131,9,123,255,144,0,131,9,124,255,173,0,131,9,125,255,144,0,131,9,126,255,173, + 0,131,9,235,255,97,0,131,9,236,255,117,0,131,10,250,254,248,0,131,10,251,255,3,0,131,10,252,0,47,0,132,0,16,255,211,0,132,0,17, + 255,220,0,132,0,29,255,220,0,132,0,36,0,57,0,132,0,38,255,220,0,132,0,42,255,220,0,132,0,50,255,220,0,132,0,52,255,220,0,132, + 0,55,255,97,0,132,0,57,255,125,0,132,0,58,255,144,0,132,0,60,255,97,0,132,0,70,255,220,0,132,0,71,255,220,0,132,0,72,255,220, + 0,132,0,73,255,183,0,132,0,82,255,220,0,132,0,84,255,220,0,132,0,87,255,220,0,132,0,89,255,136,0,132,0,90,255,173,0,132,0,92, + 255,117,0,132,0,109,255,183,0,132,0,130,0,57,0,132,0,131,0,57,0,132,0,132,0,57,0,132,0,133,0,57,0,132,0,134,0,57,0,132, + 0,137,255,220,0,132,0,148,255,220,0,132,0,149,255,220,0,132,0,150,255,220,0,132,0,151,255,220,0,132,0,152,255,220,0,132,0,159,255,97, + 0,132,0,169,255,220,0,132,0,170,255,220,0,132,0,171,255,220,0,132,0,172,255,220,0,132,0,173,255,220,0,132,0,180,255,220,0,132,0,181, + 255,220,0,132,0,182,255,220,0,132,0,183,255,220,0,132,0,184,255,220,0,132,0,191,255,117,0,132,0,193,255,117,0,132,0,194,0,57,0,132, + 0,196,0,57,0,132,0,198,0,57,0,132,0,200,255,220,0,132,0,201,255,220,0,132,0,202,255,220,0,132,0,204,255,220,0,132,0,205,255,220, + 0,132,0,206,255,220,0,132,0,207,255,220,0,132,0,209,255,220,0,132,0,213,255,220,0,132,0,215,255,220,0,132,0,217,255,220,0,132,0,219, + 255,220,0,132,0,221,255,220,0,132,0,222,255,220,0,132,0,224,255,220,0,132,0,226,255,220,0,132,1,14,255,220,0,132,1,15,255,220,0,132, + 1,16,255,220,0,132,1,17,255,220,0,132,1,18,255,220,0,132,1,19,255,220,0,132,1,36,255,97,0,132,1,37,255,220,0,132,1,38,255,97, + 0,132,1,39,255,220,0,132,1,54,255,144,0,132,1,55,255,173,0,132,1,56,255,97,0,132,1,57,255,117,0,132,1,58,255,97,0,132,1,240, + 255,220,0,132,1,241,255,220,0,132,9,121,255,144,0,132,9,123,255,144,0,132,9,124,255,173,0,132,9,125,255,144,0,132,9,126,255,173,0,132, + 9,235,255,97,0,132,9,236,255,117,0,132,10,250,254,248,0,132,10,251,255,3,0,132,10,252,0,47,0,133,0,16,255,211,0,133,0,17,255,220, + 0,133,0,29,255,220,0,133,0,36,0,57,0,133,0,38,255,220,0,133,0,42,255,220,0,133,0,50,255,220,0,133,0,52,255,220,0,133,0,55, + 255,97,0,133,0,57,255,125,0,133,0,58,255,144,0,133,0,60,255,97,0,133,0,70,255,220,0,133,0,71,255,220,0,133,0,72,255,220,0,133, + 0,73,255,183,0,133,0,82,255,220,0,133,0,84,255,220,0,133,0,87,255,220,0,133,0,89,255,136,0,133,0,90,255,173,0,133,0,92,255,117, + 0,133,0,109,255,183,0,133,0,130,0,57,0,133,0,131,0,57,0,133,0,132,0,57,0,133,0,133,0,57,0,133,0,134,0,57,0,133,0,137, + 255,220,0,133,0,148,255,220,0,133,0,149,255,220,0,133,0,150,255,220,0,133,0,151,255,220,0,133,0,152,255,220,0,133,0,159,255,97,0,133, + 0,169,255,220,0,133,0,170,255,220,0,133,0,171,255,220,0,133,0,172,255,220,0,133,0,173,255,220,0,133,0,180,255,220,0,133,0,181,255,220, + 0,133,0,182,255,220,0,133,0,183,255,220,0,133,0,184,255,220,0,133,0,191,255,117,0,133,0,193,255,117,0,133,0,194,0,57,0,133,0,196, + 0,57,0,133,0,198,0,57,0,133,0,200,255,220,0,133,0,201,255,220,0,133,0,202,255,220,0,133,0,204,255,220,0,133,0,205,255,220,0,133, + 0,206,255,220,0,133,0,207,255,220,0,133,0,209,255,220,0,133,0,213,255,220,0,133,0,215,255,220,0,133,0,217,255,220,0,133,0,219,255,220, + 0,133,0,221,255,220,0,133,0,222,255,220,0,133,0,224,255,220,0,133,0,226,255,220,0,133,1,14,255,220,0,133,1,15,255,220,0,133,1,16, + 255,220,0,133,1,17,255,220,0,133,1,18,255,220,0,133,1,19,255,220,0,133,1,36,255,97,0,133,1,37,255,220,0,133,1,38,255,97,0,133, + 1,39,255,220,0,133,1,54,255,144,0,133,1,55,255,173,0,133,1,56,255,97,0,133,1,57,255,117,0,133,1,58,255,97,0,133,1,240,255,220, + 0,133,9,121,255,144,0,133,9,123,255,144,0,133,9,124,255,173,0,133,9,125,255,144,0,133,9,126,255,173,0,133,9,235,255,97,0,133,9,236, + 255,117,0,133,10,250,254,248,0,133,10,251,255,3,0,133,10,252,0,47,0,134,0,16,255,211,0,134,0,17,255,220,0,134,0,29,255,220,0,134, + 0,36,0,57,0,134,0,38,255,220,0,134,0,42,255,220,0,134,0,50,255,220,0,134,0,52,255,220,0,134,0,55,255,97,0,134,0,57,255,125, + 0,134,0,58,255,144,0,134,0,60,255,97,0,134,0,70,255,220,0,134,0,71,255,220,0,134,0,72,255,220,0,134,0,73,255,183,0,134,0,82, + 255,220,0,134,0,84,255,220,0,134,0,87,255,220,0,134,0,89,255,136,0,134,0,90,255,173,0,134,0,92,255,117,0,134,0,109,255,183,0,134, + 0,130,0,57,0,134,0,131,0,57,0,134,0,132,0,57,0,134,0,133,0,57,0,134,0,134,0,57,0,134,0,137,255,220,0,134,0,148,255,220, + 0,134,0,149,255,220,0,134,0,150,255,220,0,134,0,151,255,220,0,134,0,152,255,220,0,134,0,159,255,97,0,134,0,169,255,220,0,134,0,170, + 255,220,0,134,0,171,255,220,0,134,0,172,255,220,0,134,0,173,255,220,0,134,0,180,255,220,0,134,0,181,255,220,0,134,0,182,255,220,0,134, + 0,183,255,220,0,134,0,184,255,220,0,134,0,191,255,117,0,134,0,193,255,117,0,134,0,194,0,57,0,134,0,196,0,57,0,134,0,198,0,57, + 0,134,0,200,255,220,0,134,0,201,255,220,0,134,0,202,255,220,0,134,0,204,255,220,0,134,0,205,255,220,0,134,0,206,255,220,0,134,0,207, + 255,220,0,134,0,209,255,220,0,134,0,213,255,220,0,134,0,215,255,220,0,134,0,217,255,220,0,134,0,219,255,220,0,134,0,221,255,220,0,134, + 0,222,255,220,0,134,0,224,255,220,0,134,0,226,255,220,0,134,1,14,255,220,0,134,1,15,255,220,0,134,1,16,255,220,0,134,1,17,255,220, + 0,134,1,18,255,220,0,134,1,19,255,220,0,134,1,36,255,97,0,134,1,37,255,220,0,134,1,38,255,97,0,134,1,39,255,220,0,134,1,54, + 255,144,0,134,1,55,255,173,0,134,1,56,255,97,0,134,1,57,255,117,0,134,1,58,255,97,0,134,1,240,255,220,0,134,1,241,255,220,0,134, + 9,121,255,144,0,134,9,123,255,144,0,134,9,124,255,173,0,134,9,125,255,144,0,134,9,126,255,173,0,134,9,235,255,97,0,134,9,236,255,117, + 0,134,10,250,254,248,0,134,10,251,255,3,0,134,10,252,0,47,0,136,10,250,255,173,0,136,10,251,255,164,0,136,10,252,255,144,0,137,0,60, + 255,220,0,137,0,109,255,220,0,137,0,125,255,220,0,137,0,159,255,220,0,137,1,58,255,220,0,137,10,251,0,38,0,146,0,36,255,220,0,146, + 0,57,255,220,0,146,0,60,255,144,0,146,0,109,255,220,0,146,0,125,255,220,0,146,0,130,255,220,0,146,0,131,255,220,0,146,0,132,255,220, + 0,146,0,133,255,220,0,146,0,134,255,220,0,146,0,159,255,144,0,146,0,194,255,220,0,146,0,196,255,220,0,146,0,198,255,220,0,146,1,56, + 255,144,0,146,1,58,255,144,0,146,1,244,255,144,0,146,9,235,255,144,0,146,10,250,255,211,0,146,10,251,255,201,0,146,10,252,255,68,0,148, + 0,16,0,57,0,148,0,17,255,173,0,148,0,29,255,220,0,148,0,36,255,220,0,148,0,57,255,220,0,148,0,59,255,125,0,148,0,60,255,144, + 0,148,0,109,255,220,0,148,0,130,255,220,0,148,0,131,255,220,0,148,0,132,255,220,0,148,0,133,255,220,0,148,0,134,255,220,0,148,0,159, + 255,144,0,148,1,58,255,144,0,148,10,250,255,211,0,148,10,251,255,220,0,148,10,252,255,68,0,149,0,16,0,57,0,149,0,17,255,173,0,149, + 0,29,255,220,0,149,0,36,255,220,0,149,0,57,255,220,0,149,0,59,255,125,0,149,0,60,255,144,0,149,0,109,255,220,0,149,0,130,255,220, + 0,149,0,131,255,220,0,149,0,132,255,220,0,149,0,133,255,220,0,149,0,134,255,220,0,149,0,159,255,144,0,149,1,58,255,144,0,149,10,250, + 255,211,0,149,10,251,255,220,0,149,10,252,255,68,0,150,0,16,0,57,0,150,0,17,255,173,0,150,0,29,255,220,0,150,0,36,255,220,0,150, + 0,57,255,220,0,150,0,59,255,125,0,150,0,60,255,144,0,150,0,109,255,220,0,150,0,130,255,220,0,150,0,131,255,220,0,150,0,132,255,220, + 0,150,0,133,255,220,0,150,0,134,255,220,0,150,0,159,255,144,0,150,1,58,255,144,0,150,10,250,255,211,0,150,10,251,255,220,0,150,10,252, + 255,68,0,151,0,16,0,57,0,151,0,17,255,173,0,151,0,29,255,220,0,151,0,36,255,220,0,151,0,57,255,220,0,151,0,59,255,125,0,151, + 0,60,255,144,0,151,0,109,255,220,0,151,0,130,255,220,0,151,0,131,255,220,0,151,0,132,255,220,0,151,0,133,255,220,0,151,0,134,255,220, + 0,151,0,159,255,144,0,151,1,58,255,144,0,151,10,250,255,211,0,151,10,251,255,220,0,151,10,252,255,68,0,152,0,16,0,57,0,152,0,17, + 255,173,0,152,0,29,255,220,0,152,0,36,255,220,0,152,0,57,255,220,0,152,0,59,255,125,0,152,0,60,255,144,0,152,0,109,255,220,0,152, + 0,130,255,220,0,152,0,131,255,220,0,152,0,132,255,220,0,152,0,133,255,220,0,152,0,134,255,220,0,152,0,159,255,144,0,152,1,58,255,144, + 0,152,10,250,255,211,0,152,10,251,255,220,0,152,10,252,255,68,0,155,0,61,255,220,0,155,1,63,255,220,0,156,0,61,255,220,0,156,1,63, + 255,220,0,157,0,61,255,220,0,157,1,63,255,220,0,158,0,61,255,220,0,158,1,63,255,220,0,159,0,16,255,13,0,159,0,17,254,97,0,159, + 0,29,254,240,0,159,0,36,255,97,0,159,0,38,255,144,0,159,0,50,255,144,0,159,0,68,254,230,0,159,0,72,254,240,0,159,0,76,255,183, + 0,159,0,82,254,240,0,159,0,88,255,21,0,159,0,109,255,31,0,159,0,125,255,107,0,159,0,130,255,97,0,159,0,131,255,97,0,159,0,132, + 255,97,0,159,0,133,255,97,0,159,0,134,255,97,0,159,0,137,255,144,0,159,0,148,255,144,0,159,0,149,255,144,0,159,0,150,255,144,0,159, + 0,151,255,144,0,159,0,152,255,144,0,159,0,162,254,230,0,159,0,163,254,230,0,159,0,164,254,230,0,159,0,165,254,230,0,159,0,166,254,230, + 0,159,0,167,254,230,0,159,0,170,254,240,0,159,0,171,254,240,0,159,0,172,254,240,0,159,0,173,254,240,0,159,0,180,254,240,0,159,0,181, + 254,240,0,159,0,182,254,240,0,159,0,183,254,240,0,159,0,184,254,240,0,159,0,187,255,21,0,159,0,188,255,21,0,159,0,189,255,21,0,159, + 0,190,255,21,0,159,0,200,255,144,0,159,0,206,255,144,0,159,0,221,254,240,0,159,1,49,255,21,0,159,10,250,255,144,0,159,10,251,255,220, + 0,159,10,252,254,248,0,160,0,17,255,107,0,160,0,29,255,183,0,160,10,250,255,220,0,160,10,252,255,68,0,161,0,16,0,38,0,161,10,250, + 255,144,0,161,10,251,255,144,0,161,10,252,255,173,0,170,0,91,255,220,0,171,0,91,255,220,0,172,0,91,255,220,0,173,0,91,255,220,0,178, + 10,250,255,164,0,178,10,251,255,144,0,178,10,252,255,183,0,179,10,250,255,107,0,179,10,251,255,144,0,179,10,252,255,164,0,180,0,16,0,38, + 0,180,0,17,255,220,0,180,0,91,255,193,0,180,10,250,255,107,0,180,10,251,255,183,0,180,10,252,255,125,0,181,0,16,0,38,0,181,0,17, + 255,220,0,181,0,91,255,193,0,181,10,250,255,107,0,181,10,251,255,183,0,181,10,252,255,125,0,182,0,16,0,38,0,182,0,17,255,220,0,182, + 0,91,255,193,0,182,10,250,255,107,0,182,10,251,255,183,0,182,10,252,255,125,0,183,0,16,0,38,0,183,0,17,255,220,0,183,0,91,255,193, + 0,183,10,250,255,107,0,183,10,251,255,183,0,183,10,252,255,125,0,184,0,16,0,38,0,184,0,17,255,220,0,184,0,91,255,193,0,184,10,250, + 255,107,0,184,10,251,255,183,0,184,10,252,255,125,0,191,0,16,255,220,0,191,0,17,254,220,0,191,0,29,255,107,0,191,0,109,255,220,0,191, + 0,125,255,220,0,191,10,252,254,211,0,193,0,16,255,220,0,193,0,17,254,220,0,193,0,29,255,107,0,193,0,109,255,220,0,193,0,125,255,220, + 0,193,10,252,254,211,0,194,0,16,255,211,0,194,0,17,255,220,0,194,0,29,255,220,0,194,0,36,0,57,0,194,0,38,255,220,0,194,0,42, + 255,220,0,194,0,50,255,220,0,194,0,52,255,220,0,194,0,55,255,97,0,194,0,57,255,125,0,194,0,58,255,144,0,194,0,60,255,97,0,194, + 0,70,255,220,0,194,0,71,255,220,0,194,0,72,255,220,0,194,0,73,255,183,0,194,0,82,255,220,0,194,0,84,255,220,0,194,0,87,255,220, + 0,194,0,89,255,136,0,194,0,90,255,173,0,194,0,92,255,117,0,194,0,109,255,183,0,194,0,130,0,57,0,194,0,131,0,57,0,194,0,132, + 0,57,0,194,0,133,0,57,0,194,0,134,0,57,0,194,0,148,255,220,0,194,0,149,255,220,0,194,0,150,255,220,0,194,0,151,255,220,0,194, + 0,152,255,220,0,194,0,159,255,97,0,194,0,169,255,220,0,194,0,170,255,220,0,194,0,171,255,220,0,194,0,172,255,220,0,194,0,173,255,220, + 0,194,0,180,255,220,0,194,0,181,255,220,0,194,0,182,255,220,0,194,0,183,255,220,0,194,0,184,255,220,0,194,0,191,255,117,0,194,0,193, + 255,117,0,194,0,194,0,57,0,194,0,196,0,57,0,194,0,198,0,57,0,194,0,200,255,220,0,194,0,202,255,220,0,194,0,204,255,220,0,194, + 0,205,255,220,0,194,0,206,255,220,0,194,0,209,255,220,0,194,0,211,255,220,0,194,0,213,255,220,0,194,0,215,255,220,0,194,0,217,255,220, + 0,194,0,219,255,220,0,194,0,221,255,220,0,194,0,222,255,220,0,194,0,226,255,220,0,194,1,14,255,220,0,194,1,15,255,220,0,194,1,16, + 255,220,0,194,1,17,255,220,0,194,1,18,255,220,0,194,1,19,255,220,0,194,1,36,255,97,0,194,1,37,255,220,0,194,1,38,255,97,0,194, + 1,39,255,220,0,194,1,54,255,144,0,194,1,55,255,173,0,194,1,56,255,97,0,194,1,57,255,117,0,194,1,58,255,97,0,194,1,240,255,220, + 0,194,1,241,255,220,0,194,9,121,255,144,0,194,9,123,255,144,0,194,9,124,255,173,0,194,9,125,255,144,0,194,9,126,255,173,0,194,9,235, + 255,97,0,194,9,236,255,117,0,194,10,250,254,248,0,194,10,251,255,2,0,194,10,252,0,47,0,196,0,16,255,211,0,196,0,17,255,220,0,196, + 0,29,255,220,0,196,0,36,0,57,0,196,0,38,255,220,0,196,0,42,255,220,0,196,0,50,255,220,0,196,0,52,255,220,0,196,0,55,255,97, + 0,196,0,57,255,125,0,196,0,58,255,144,0,196,0,60,255,97,0,196,0,70,255,220,0,196,0,71,255,220,0,196,0,72,255,220,0,196,0,73, + 255,183,0,196,0,82,255,220,0,196,0,84,255,220,0,196,0,87,255,220,0,196,0,89,255,136,0,196,0,90,255,173,0,196,0,92,255,117,0,196, + 0,109,255,183,0,196,0,130,0,57,0,196,0,131,0,57,0,196,0,132,0,57,0,196,0,133,0,57,0,196,0,134,0,57,0,196,0,148,255,220, + 0,196,0,149,255,220,0,196,0,150,255,220,0,196,0,151,255,220,0,196,0,152,255,220,0,196,0,159,255,97,0,196,0,169,255,220,0,196,0,170, + 255,220,0,196,0,171,255,220,0,196,0,172,255,220,0,196,0,173,255,220,0,196,0,180,255,220,0,196,0,181,255,220,0,196,0,182,255,220,0,196, + 0,183,255,220,0,196,0,184,255,220,0,196,0,191,255,117,0,196,0,193,255,117,0,196,0,194,0,57,0,196,0,196,0,57,0,196,0,198,0,57, + 0,196,0,200,255,220,0,196,0,202,255,220,0,196,0,204,255,220,0,196,0,205,255,220,0,196,0,206,255,220,0,196,0,209,255,220,0,196,0,211, + 255,220,0,196,0,213,255,220,0,196,0,215,255,220,0,196,0,217,255,220,0,196,0,219,255,220,0,196,0,221,255,220,0,196,0,222,255,220,0,196, + 0,226,255,220,0,196,1,14,255,220,0,196,1,15,255,220,0,196,1,16,255,220,0,196,1,17,255,220,0,196,1,18,255,220,0,196,1,19,255,220, + 0,196,1,36,255,97,0,196,1,37,255,220,0,196,1,38,255,97,0,196,1,39,255,220,0,196,1,54,255,144,0,196,1,55,255,173,0,196,1,56, + 255,97,0,196,1,57,255,117,0,196,1,58,255,97,0,196,1,240,255,220,0,196,1,241,255,220,0,196,9,121,255,144,0,196,9,123,255,144,0,196, + 9,124,255,173,0,196,9,125,255,144,0,196,9,126,255,173,0,196,9,235,255,97,0,196,9,236,255,117,0,196,10,250,254,248,0,196,10,251,255,2, + 0,196,10,252,0,47,0,198,0,16,255,211,0,198,0,17,255,220,0,198,0,29,255,220,0,198,0,36,0,57,0,198,0,38,255,220,0,198,0,42, + 255,220,0,198,0,50,255,220,0,198,0,52,255,220,0,198,0,55,255,97,0,198,0,57,255,125,0,198,0,58,255,144,0,198,0,60,255,97,0,198, + 0,70,255,220,0,198,0,71,255,220,0,198,0,72,255,220,0,198,0,73,255,183,0,198,0,82,255,220,0,198,0,84,255,220,0,198,0,87,255,220, + 0,198,0,89,255,136,0,198,0,90,255,173,0,198,0,109,255,183,0,198,0,130,0,57,0,198,0,131,0,57,0,198,0,132,0,57,0,198,0,133, + 0,57,0,198,0,134,0,57,0,198,0,148,255,220,0,198,0,149,255,220,0,198,0,150,255,220,0,198,0,151,255,220,0,198,0,152,255,220,0,198, + 0,159,255,97,0,198,0,169,255,220,0,198,0,170,255,220,0,198,0,171,255,220,0,198,0,172,255,220,0,198,0,173,255,220,0,198,0,180,255,220, + 0,198,0,181,255,220,0,198,0,182,255,220,0,198,0,183,255,220,0,198,0,184,255,220,0,198,0,194,0,57,0,198,0,196,0,57,0,198,0,198, + 0,57,0,198,0,200,255,220,0,198,0,202,255,220,0,198,0,204,255,220,0,198,0,205,255,220,0,198,0,206,255,220,0,198,0,209,255,220,0,198, + 0,211,255,220,0,198,0,213,255,220,0,198,0,215,255,220,0,198,0,217,255,220,0,198,0,219,255,220,0,198,0,221,255,220,0,198,0,222,255,220, + 0,198,0,226,255,220,0,198,1,14,255,220,0,198,1,15,255,220,0,198,1,16,255,220,0,198,1,17,255,220,0,198,1,19,255,220,0,198,1,36, + 255,97,0,198,1,37,255,220,0,198,1,38,255,97,0,198,1,39,255,220,0,198,1,54,255,144,0,198,1,55,255,173,0,198,1,56,255,97,0,198, + 1,58,255,97,0,198,1,240,255,220,0,198,1,241,255,220,0,198,9,121,255,144,0,198,9,123,255,144,0,198,9,124,255,173,0,198,9,125,255,144, + 0,198,9,126,255,173,0,198,9,235,255,97,0,198,10,250,254,248,0,198,10,251,255,2,0,198,10,252,0,47,0,200,0,60,255,220,0,200,0,109, + 255,220,0,200,0,125,255,220,0,200,0,159,255,220,0,200,1,58,255,220,0,200,10,251,0,38,0,206,0,60,255,220,0,206,0,109,255,220,0,206, + 0,125,255,220,0,206,0,159,255,220,0,206,1,58,255,220,0,206,10,251,0,38,0,208,0,36,255,220,0,208,0,57,255,220,0,208,0,60,255,144, + 0,208,0,109,255,220,0,208,0,125,255,220,0,208,0,130,255,220,0,208,0,131,255,220,0,208,0,132,255,220,0,208,0,133,255,220,0,208,0,134, + 255,220,0,208,0,159,255,144,0,208,0,194,255,220,0,208,0,196,255,220,0,208,0,198,255,220,0,208,1,56,255,144,0,208,1,58,255,144,0,208, + 1,244,255,144,0,208,9,235,255,144,0,208,10,250,255,211,0,208,10,251,255,201,0,208,10,252,255,68,0,210,0,36,255,220,0,210,0,57,255,220, + 0,210,0,60,255,144,0,210,0,109,255,220,0,210,0,125,255,220,0,210,0,130,255,220,0,210,0,131,255,220,0,210,0,132,255,220,0,210,0,133, + 255,220,0,210,0,134,255,220,0,210,0,159,255,144,0,210,1,58,255,144,0,210,10,250,255,211,0,210,10,251,255,201,0,210,10,252,255,68,0,221, + 0,91,255,220,0,224,0,55,255,183,0,224,0,60,255,154,0,224,0,109,255,220,0,224,0,125,255,220,0,224,0,159,255,154,0,224,1,38,255,183, + 0,224,1,58,255,154,0,224,10,250,255,211,0,224,10,251,255,211,0,224,10,252,255,201,0,251,0,16,255,220,0,251,0,36,0,47,0,251,0,50, + 255,183,0,251,0,55,254,230,0,251,0,56,255,154,0,251,0,57,255,31,0,251,0,58,255,68,0,251,0,60,254,240,0,251,0,72,255,220,0,251, + 0,82,255,220,0,251,0,88,255,220,0,251,0,92,255,68,0,251,0,130,0,47,0,251,0,131,0,47,0,251,0,132,0,47,0,251,0,133,0,47, + 0,251,0,134,0,47,0,251,0,148,255,183,0,251,0,149,255,183,0,251,0,150,255,183,0,251,0,151,255,183,0,251,0,152,255,183,0,251,0,155, + 255,154,0,251,0,156,255,154,0,251,0,157,255,154,0,251,0,158,255,154,0,251,0,159,254,240,0,251,0,170,255,220,0,251,0,171,255,220,0,251, + 0,172,255,220,0,251,0,173,255,220,0,251,0,180,255,220,0,251,0,181,255,220,0,251,0,182,255,220,0,251,0,183,255,220,0,251,0,184,255,220, + 0,251,0,187,255,220,0,251,0,188,255,220,0,251,0,189,255,220,0,251,0,190,255,220,0,251,0,191,255,68,0,251,0,193,255,68,0,251,0,221, + 255,220,0,251,1,38,254,230,0,251,1,48,255,154,0,251,1,49,255,220,0,251,1,58,254,240,0,251,10,250,254,97,0,251,10,251,253,230,0,255, + 0,16,255,220,0,255,0,36,0,47,0,255,0,50,255,183,0,255,0,55,254,230,0,255,0,56,255,154,0,255,0,57,255,31,0,255,0,58,255,68, + 0,255,0,60,254,240,0,255,0,72,255,220,0,255,0,82,255,220,0,255,0,88,255,220,0,255,0,92,255,68,0,255,0,130,0,47,0,255,0,131, + 0,47,0,255,0,132,0,47,0,255,0,133,0,47,0,255,0,134,0,47,0,255,0,148,255,183,0,255,0,149,255,183,0,255,0,150,255,183,0,255, + 0,151,255,183,0,255,0,152,255,183,0,255,0,155,255,154,0,255,0,156,255,154,0,255,0,157,255,154,0,255,0,158,255,154,0,255,0,159,254,240, + 0,255,0,170,255,220,0,255,0,171,255,220,0,255,0,172,255,220,0,255,0,173,255,220,0,255,0,180,255,220,0,255,0,181,255,220,0,255,0,182, + 255,220,0,255,0,183,255,220,0,255,0,184,255,220,0,255,0,187,255,220,0,255,0,188,255,220,0,255,0,189,255,220,0,255,0,190,255,220,0,255, + 0,191,255,68,0,255,0,193,255,68,0,255,0,221,255,220,0,255,1,38,254,230,0,255,1,48,255,154,0,255,1,49,255,220,0,255,1,58,254,240, + 0,255,10,250,254,97,0,255,10,251,253,230,1,2,0,79,255,63,1,10,10,250,255,107,1,10,10,251,255,144,1,10,10,252,255,164,1,22,0,16, + 255,173,1,22,0,17,255,183,1,22,0,29,255,193,1,22,0,36,255,173,1,22,0,38,255,154,1,22,0,55,255,107,1,22,0,57,255,144,1,22, + 0,58,255,173,1,22,0,60,255,125,1,22,0,68,255,211,1,22,0,72,255,164,1,22,0,82,255,164,1,22,0,88,255,164,1,22,0,92,255,144, + 1,22,0,109,255,144,1,22,0,125,255,220,1,22,0,130,255,173,1,22,0,131,255,173,1,22,0,132,255,173,1,22,0,133,255,173,1,22,0,134, + 255,173,1,22,0,137,255,154,1,22,0,159,255,125,1,22,0,162,255,211,1,22,0,163,255,211,1,22,0,164,255,211,1,22,0,165,255,211,1,22, + 0,166,255,211,1,22,0,167,255,211,1,22,0,170,255,164,1,22,0,171,255,164,1,22,0,172,255,164,1,22,0,173,255,164,1,22,0,180,255,164, + 1,22,0,181,255,164,1,22,0,182,255,164,1,22,0,183,255,164,1,22,0,184,255,164,1,22,0,187,255,164,1,22,0,188,255,164,1,22,0,189, + 255,164,1,22,0,190,255,164,1,22,0,191,255,144,1,22,0,193,255,144,1,22,0,200,255,154,1,22,0,206,255,154,1,22,0,221,255,164,1,22, + 1,38,255,107,1,22,1,49,255,164,1,22,1,58,255,125,1,22,10,250,255,107,1,22,10,251,255,125,1,22,10,252,255,220,1,23,0,16,255,125, + 1,23,0,17,255,68,1,23,0,29,255,220,1,23,0,70,255,211,1,23,0,71,255,220,1,23,0,72,255,211,1,23,0,74,255,220,1,23,0,75, + 255,220,1,23,0,80,255,220,1,23,0,81,255,220,1,23,0,82,255,211,1,23,0,84,255,220,1,23,0,85,255,220,1,23,0,91,255,201,1,23, + 0,109,255,183,1,23,0,169,255,211,1,23,0,170,255,211,1,23,0,171,255,211,1,23,0,172,255,211,1,23,0,173,255,211,1,23,0,179,255,220, + 1,23,0,180,255,211,1,23,0,181,255,211,1,23,0,182,255,211,1,23,0,183,255,211,1,23,0,184,255,211,1,23,0,201,255,211,1,23,0,207, + 255,211,1,23,0,209,0,72,1,23,0,221,255,211,1,23,0,225,255,220,1,23,1,10,255,220,1,23,1,23,255,220,1,23,1,27,255,220,1,23, + 10,251,0,86,1,23,10,252,254,201,1,26,0,16,255,173,1,26,0,17,255,183,1,26,0,29,255,193,1,26,0,36,255,173,1,26,0,38,255,154, + 1,26,0,55,255,107,1,26,0,57,255,144,1,26,0,58,255,173,1,26,0,60,255,125,1,26,0,68,255,211,1,26,0,72,255,164,1,26,0,82, + 255,164,1,26,0,88,255,164,1,26,0,92,255,144,1,26,0,109,255,144,1,26,0,125,255,220,1,26,0,130,255,173,1,26,0,131,255,173,1,26, + 0,132,255,173,1,26,0,133,255,173,1,26,0,134,255,173,1,26,0,137,255,154,1,26,0,159,255,125,1,26,0,162,255,211,1,26,0,163,255,211, + 1,26,0,164,255,211,1,26,0,165,255,211,1,26,0,166,255,211,1,26,0,167,255,211,1,26,0,170,255,164,1,26,0,171,255,164,1,26,0,172, + 255,164,1,26,0,173,255,164,1,26,0,180,255,164,1,26,0,181,255,164,1,26,0,182,255,164,1,26,0,183,255,164,1,26,0,184,255,164,1,26, + 0,187,255,164,1,26,0,188,255,164,1,26,0,189,255,164,1,26,0,190,255,164,1,26,0,191,255,144,1,26,0,193,255,144,1,26,0,200,255,154, + 1,26,0,206,255,154,1,26,0,221,255,164,1,26,1,38,255,107,1,26,1,49,255,164,1,26,1,58,255,125,1,26,10,250,255,107,1,26,10,251, + 255,125,1,26,10,252,255,220,1,27,0,16,255,125,1,27,0,17,255,68,1,27,0,29,255,220,1,27,0,70,255,211,1,27,0,71,255,220,1,27, + 0,72,255,211,1,27,0,74,255,220,1,27,0,75,255,220,1,27,0,80,255,220,1,27,0,81,255,220,1,27,0,82,255,211,1,27,0,84,255,220, + 1,27,0,85,255,220,1,27,0,91,255,201,1,27,0,109,255,183,1,27,0,169,255,211,1,27,0,170,255,211,1,27,0,171,255,211,1,27,0,172, + 255,211,1,27,0,173,255,211,1,27,0,179,255,220,1,27,0,180,255,211,1,27,0,181,255,211,1,27,0,182,255,211,1,27,0,183,255,211,1,27, + 0,184,255,211,1,27,0,201,255,211,1,27,0,207,255,211,1,27,0,209,255,220,1,27,0,221,255,211,1,27,0,225,255,220,1,27,1,10,255,220, + 1,27,1,23,255,220,1,27,1,27,255,220,1,27,10,251,0,86,1,27,10,252,254,201,1,32,0,36,0,38,1,32,0,130,0,38,1,32,0,131, + 0,38,1,32,0,132,0,38,1,32,0,133,0,38,1,32,0,134,0,38,1,34,0,36,0,38,1,34,0,130,0,38,1,34,0,131,0,38,1,34, + 0,132,0,38,1,34,0,133,0,38,1,34,0,134,0,38,1,38,0,16,255,68,1,38,0,17,255,13,1,38,0,29,255,31,1,38,0,36,255,97, + 1,38,0,38,255,136,1,38,0,55,255,220,1,38,0,68,254,173,1,38,0,70,254,164,1,38,0,72,254,164,1,38,0,76,255,193,1,38,0,82, + 254,164,1,38,0,85,254,211,1,38,0,86,254,173,1,38,0,88,254,201,1,38,0,90,254,173,1,38,0,92,254,193,1,38,0,109,255,68,1,38, + 0,125,255,144,1,38,0,130,255,97,1,38,0,131,255,97,1,38,0,132,255,97,1,38,0,133,255,97,1,38,0,134,255,97,1,38,0,137,255,136, + 1,38,0,162,254,173,1,38,0,163,254,173,1,38,0,164,254,173,1,38,0,165,254,173,1,38,0,166,254,173,1,38,0,167,254,173,1,38,0,169, + 254,164,1,38,0,170,254,164,1,38,0,171,254,164,1,38,0,172,254,164,1,38,0,173,254,164,1,38,0,180,254,164,1,38,0,181,254,164,1,38, + 0,182,254,164,1,38,0,183,254,164,1,38,0,184,254,164,1,38,0,187,254,201,1,38,0,188,254,201,1,38,0,189,254,201,1,38,0,190,254,201, + 1,38,0,191,254,193,1,38,0,193,254,193,1,38,0,200,255,136,1,38,0,201,254,164,1,38,0,206,255,136,1,38,0,207,254,164,1,38,0,221, + 254,164,1,38,1,23,254,211,1,38,1,27,254,211,1,38,1,33,254,173,1,38,1,35,254,173,1,38,1,38,255,220,1,38,1,49,254,201,1,38, + 10,251,255,211,1,38,10,252,254,248,1,48,0,61,255,220,1,48,1,63,255,220,1,58,0,16,255,13,1,58,0,17,254,97,1,58,0,29,254,240, + 1,58,0,36,255,97,1,58,0,38,255,144,1,58,0,50,255,144,1,58,0,68,254,230,1,58,0,72,254,240,1,58,0,76,255,183,1,58,0,82, + 254,240,1,58,0,88,255,21,1,58,0,109,255,31,1,58,0,125,255,107,1,58,0,130,255,97,1,58,0,131,255,97,1,58,0,132,255,97,1,58, + 0,133,255,97,1,58,0,134,255,97,1,58,0,137,255,144,1,58,0,148,255,144,1,58,0,149,255,144,1,58,0,150,255,144,1,58,0,151,255,144, + 1,58,0,152,255,144,1,58,0,162,254,230,1,58,0,163,254,230,1,58,0,164,254,230,1,58,0,165,254,230,1,58,0,166,254,230,1,58,0,167, + 254,230,1,58,0,170,254,240,1,58,0,171,254,240,1,58,0,172,254,240,1,58,0,173,254,240,1,58,0,180,254,240,1,58,0,181,254,240,1,58, + 0,182,254,240,1,58,0,183,254,240,1,58,0,184,254,240,1,58,0,187,255,21,1,58,0,188,255,21,1,58,0,189,255,21,1,58,0,190,255,21, + 1,58,0,200,255,144,1,58,0,206,255,144,1,58,0,221,254,240,1,58,1,49,255,21,1,58,10,250,255,144,1,58,10,251,255,220,1,58,10,252, + 254,248,1,63,0,16,255,220,1,63,10,250,255,220,1,63,10,251,255,220,1,63,10,252,255,220,10,238,0,36,255,211,10,238,0,37,255,183,10,238, + 0,42,0,75,10,238,0,45,0,114,10,238,0,50,0,57,10,238,0,52,0,75,10,238,0,55,255,68,10,238,0,57,255,136,10,238,0,58,255,173, + 10,238,0,59,255,154,10,238,0,60,255,13,10,238,0,82,0,38,10,238,0,89,255,201,10,238,0,92,255,220,10,238,0,130,255,211,10,238,0,131, + 255,211,10,238,0,132,255,211,10,238,0,133,255,211,10,238,0,134,255,211,10,238,0,148,0,57,10,238,0,149,0,57,10,238,0,150,0,57,10,238, + 0,151,0,57,10,238,0,152,0,57,10,238,0,159,255,13,10,238,0,180,0,38,10,238,0,181,0,38,10,238,0,182,0,38,10,238,0,183,0,38, + 10,238,0,184,0,38,10,238,0,191,255,220,10,238,0,193,255,220,10,238,0,224,0,75,10,238,1,38,255,68,10,238,1,58,255,13,10,250,0,36, + 254,248,10,250,0,37,255,193,10,250,0,38,255,183,10,250,0,39,255,193,10,250,0,41,255,193,10,250,0,42,255,183,10,250,0,43,255,193,10,250, + 0,45,255,193,10,250,0,46,255,193,10,250,0,47,255,193,10,250,0,50,255,183,10,250,0,51,255,193,10,250,0,52,255,183,10,250,0,53,255,193, + 10,250,0,59,255,136,10,250,0,61,255,220,10,250,0,73,255,183,10,250,0,81,255,144,10,250,0,82,255,107,10,250,0,85,255,144,10,250,0,89, + 255,183,10,250,0,90,255,183,10,250,0,92,255,183,10,250,0,130,254,248,10,250,0,131,254,248,10,250,0,132,254,248,10,250,0,133,254,248,10,250, + 0,134,254,248,10,250,0,136,254,125,10,250,0,137,255,183,10,250,0,148,255,183,10,250,0,149,255,183,10,250,0,150,255,183,10,250,0,151,255,183, + 10,250,0,152,255,183,10,250,0,160,255,193,10,250,0,161,255,193,10,250,0,178,255,183,10,250,0,179,255,144,10,250,0,180,255,107,10,250,0,181, + 255,107,10,250,0,182,255,107,10,250,0,183,255,107,10,250,0,184,255,107,10,250,0,191,255,183,10,250,0,193,255,183,10,250,0,200,255,183,10,250, + 0,206,255,183,10,250,0,208,255,193,10,250,0,224,255,183,10,250,0,251,255,193,10,250,0,255,255,193,10,250,1,10,255,144,10,250,1,22,255,193, + 10,250,1,23,255,144,10,250,1,26,255,193,10,250,1,27,255,144,10,250,1,63,255,220,10,250,19,20,255,193,10,252,0,36,0,38,10,252,0,37, + 255,183,10,252,0,38,255,144,10,252,0,39,255,183,10,252,0,41,255,183,10,252,0,42,255,183,10,252,0,43,255,183,10,252,0,45,0,47,10,252, + 0,46,255,183,10,252,0,47,255,183,10,252,0,50,255,144,10,252,0,51,255,183,10,252,0,52,255,144,10,252,0,53,255,183,10,252,0,55,254,230, + 10,252,0,57,254,136,10,252,0,58,255,3,10,252,0,59,255,183,10,252,0,60,254,136,10,252,0,73,255,220,10,252,0,81,255,183,10,252,0,82, + 255,183,10,252,0,85,255,183,10,252,0,89,255,21,10,252,0,90,255,60,10,252,0,92,255,144,10,252,0,130,0,38,10,252,0,131,0,38,10,252, + 0,132,0,38,10,252,0,133,0,38,10,252,0,134,0,38,10,252,0,136,0,38,10,252,0,137,255,144,10,252,0,148,255,144,10,252,0,149,255,144, + 10,252,0,150,255,144,10,252,0,151,255,144,10,252,0,152,255,144,10,252,0,159,254,136,10,252,0,160,255,183,10,252,0,161,255,183,10,252,0,178, + 255,183,10,252,0,179,255,183,10,252,0,180,255,183,10,252,0,181,255,183,10,252,0,182,255,183,10,252,0,183,255,183,10,252,0,184,255,183,10,252, + 0,191,255,144,10,252,0,193,255,144,10,252,0,200,255,144,10,252,0,206,255,144,10,252,0,208,255,183,10,252,0,224,255,183,10,252,0,251,255,183, + 10,252,0,255,255,183,10,252,1,10,255,183,10,252,1,22,255,183,10,252,1,23,255,183,10,252,1,26,255,183,10,252,1,27,255,183,10,252,1,38, + 254,230,10,252,1,58,254,136,10,252,19,20,255,183,18,252,0,16,255,68,18,252,0,17,255,13,18,252,0,29,255,31,18,252,0,36,255,97,18,252, + 0,38,255,136,18,252,0,55,255,220,18,252,0,68,254,173,18,252,0,70,254,164,18,252,0,72,254,164,18,252,0,76,255,193,18,252,0,82,254,164, + 18,252,0,85,254,211,18,252,0,86,254,173,18,252,0,88,254,201,18,252,0,90,254,173,18,252,0,92,254,193,18,252,0,109,255,68,18,252,0,125, + 255,144,18,252,0,130,255,97,18,252,0,131,255,97,18,252,0,132,255,97,18,252,0,133,255,97,18,252,0,134,255,97,18,252,0,137,255,136,18,252, + 0,162,255,17,18,252,0,163,254,173,18,252,0,164,255,17,18,252,0,165,255,17,18,252,0,166,255,17,18,252,0,167,255,17,18,252,0,169,254,164, + 18,252,0,170,254,224,18,252,0,171,254,164,18,252,0,172,254,224,18,252,0,173,254,224,18,252,0,180,254,244,18,252,0,181,254,164,18,252,0,182, + 254,244,18,252,0,183,254,244,18,252,0,184,254,244,18,252,0,187,254,231,18,252,0,188,254,201,18,252,0,189,254,231,18,252,0,190,254,231,18,252, + 0,191,254,193,18,252,0,193,254,193,18,252,0,200,255,136,18,252,0,201,254,164,18,252,0,206,255,136,18,252,0,207,254,164,18,252,0,221,254,164, + 18,252,1,23,254,211,18,252,1,27,254,211,18,252,1,33,254,173,18,252,1,35,254,173,18,252,1,38,255,220,18,252,1,49,254,201,18,252,10,251, + 255,211,18,252,10,252,254,248,19,20,0,16,255,41,19,20,0,36,255,220,19,20,0,38,255,144,19,20,0,50,255,144,19,20,0,55,255,97,19,20, + 0,56,255,201,19,20,0,58,255,183,19,20,0,60,255,183,19,20,0,68,255,220,19,20,0,72,255,154,19,20,0,82,255,154,19,20,0,88,255,154, + 19,20,0,92,255,107,19,20,0,109,255,125,19,20,0,130,255,220,19,20,0,131,255,220,19,20,0,132,255,220,19,20,0,133,255,220,19,20,0,134, + 255,220,19,20,0,137,255,144,19,20,0,148,255,144,19,20,0,149,255,144,19,20,0,150,255,144,19,20,0,151,255,144,19,20,0,152,255,144,19,20, + 0,155,255,201,19,20,0,156,255,201,19,20,0,157,255,201,19,20,0,158,255,201,19,20,0,159,255,183,19,20,0,162,255,220,19,20,0,163,255,220, + 19,20,0,164,255,220,19,20,0,165,255,220,19,20,0,166,255,220,19,20,0,167,255,220,19,20,0,170,255,154,19,20,0,171,255,154,19,20,0,172, + 255,154,19,20,0,173,255,154,19,20,0,180,255,154,19,20,0,181,255,154,19,20,0,182,255,154,19,20,0,183,255,154,19,20,0,184,255,154,19,20, + 0,187,255,154,19,20,0,188,255,154,19,20,0,189,255,154,19,20,0,190,255,154,19,20,0,191,255,107,19,20,0,193,255,107,19,20,0,200,255,144, + 19,20,0,206,255,144,19,20,0,221,255,154,19,20,1,38,255,97,19,20,1,48,255,201,19,20,1,49,255,154,19,20,1,58,255,183,19,20,10,250, + 255,193,19,20,10,251,255,193,19,21,0,68,255,220,19,21,0,72,255,183,19,21,0,82,255,183,19,21,0,88,255,193,19,21,0,92,255,183,19,21, + 0,162,255,220,19,21,0,163,255,220,19,21,0,164,255,220,19,21,0,165,255,220,19,21,0,166,255,220,19,21,0,167,255,220,19,21,0,170,255,183, + 19,21,0,171,255,183,19,21,0,172,255,183,19,21,0,173,255,183,19,21,0,180,255,183,19,21,0,181,255,183,19,21,0,182,255,183,19,21,0,183, + 255,183,19,21,0,184,255,183,19,21,0,187,255,193,19,21,0,188,255,193,19,21,0,189,255,193,19,21,0,190,255,193,19,21,0,191,255,183,19,21, + 0,193,255,183,19,21,0,221,255,183,19,21,1,49,255,193,19,70,19,94,255,216,19,71,19,94,255,177,19,72,19,94,255,163,19,73,19,94,255,156, + 19,74,19,94,255,216,19,76,19,94,255,216,19,77,19,94,255,177,19,78,19,94,255,163,19,79,19,94,255,177,19,80,19,94,255,216,19,82,19,94, + 255,216,19,83,19,94,255,177,19,84,19,94,255,163,19,85,19,94,255,177,19,86,19,94,255,216,19,88,19,94,255,216,19,89,19,94,255,156,19,90, + 19,94,255,163,19,91,19,94,255,177,19,92,19,94,255,216,0,0,0,0,0,0,0,68,0,0,0,68,0,0,0,68,0,0,0,68,0,0,0,168, + 0,0,1,20,0,0,1,236,0,0,3,68,0,0,4,108,0,0,6,212,0,0,7,40,0,0,7,152,0,0,7,240,0,0,8,140,0,0,8,224, + 0,0,9,24,0,0,9,68,0,0,9,108,0,0,9,184,0,0,10,60,0,0,10,172,0,0,11,172,0,0,12,148,0,0,13,80,0,0,14,16, + 0,0,14,232,0,0,15,116,0,0,16,72,0,0,17,28,0,0,17,92,0,0,17,172,0,0,18,36,0,0,18,104,0,0,18,224,0,0,19,184, + 0,0,21,56,0,0,22,52,0,0,22,228,0,0,23,124,0,0,23,252,0,0,24,92,0,0,24,176,0,0,25,88,0,0,25,180,0,0,25,252, + 0,0,26,108,0,0,27,148,0,0,27,216,0,0,28,212,0,0,29,124,0,0,30,8,0,0,30,136,0,0,31,84,0,0,32,104,0,0,33,96, + 0,0,33,208,0,0,34,84,0,0,35,52,0,0,36,240,0,0,37,148,0,0,38,88,0,0,39,24,0,0,39,120,0,0,39,196,0,0,40,24, + 0,0,40,92,0,0,40,136,0,0,40,216,0,0,42,4,0,0,42,156,0,0,43,52,0,0,43,204,0,0,44,160,0,0,45,56,0,0,46,0, + 0,0,46,120,0,0,46,200,0,0,47,68,0,0,48,52,0,0,48,112,0,0,49,52,0,0,49,172,0,0,50,80,0,0,50,240,0,0,51,144, + 0,0,52,0,0,0,53,96,0,0,53,220,0,0,54,96,0,0,55,132,0,0,57,168,0,0,59,44,0,0,60,248,0,0,61,196,0,0,62,160, + 0,0,62,208,0,0,63,188,0,0,64,64,0,0,64,64,0,0,64,208,0,0,65,156,0,0,66,84,0,0,67,108,0,0,68,144,0,0,68,216, + 0,0,70,32,0,0,70,216,0,0,71,252,0,0,72,216,0,0,73,164,0,0,73,220,0,0,74,8,0,0,75,84,0,0,75,160,0,0,76,24, + 0,0,76,136,0,0,77,40,0,0,77,228,0,0,78,52,0,0,78,232,0,0,79,68,0,0,79,112,0,0,79,208,0,0,80,40,0,0,80,176, + 0,0,81,128,0,0,81,160,0,0,81,192,0,0,81,224,0,0,82,216,0,0,82,240,0,0,83,8,0,0,83,52,0,0,83,100,0,0,83,148, + 0,0,84,212,0,0,85,172,0,0,85,196,0,0,85,220,0,0,85,244,0,0,86,24,0,0,86,60,0,0,86,84,0,0,86,108,0,0,86,144, + 0,0,86,180,0,0,87,128,0,0,87,176,0,0,87,200,0,0,87,224,0,0,88,12,0,0,88,64,0,0,88,112,0,0,89,56,0,0,90,112, + 0,0,90,136,0,0,90,160,0,0,90,208,0,0,91,8,0,0,91,32,0,0,91,168,0,0,92,208,0,0,92,244,0,0,93,24,0,0,93,56, + 0,0,93,100,0,0,93,156,0,0,93,220,0,0,95,152,0,0,95,176,0,0,95,200,0,0,95,224,0,0,96,4,0,0,96,40,0,0,96,64, + 0,0,96,88,0,0,96,124,0,0,96,160,0,0,98,80,0,0,98,104,0,0,98,128,0,0,98,152,0,0,98,184,0,0,98,228,0,0,99,16, + 0,0,99,108,0,0,100,224,0,0,100,248,0,0,101,16,0,0,101,48,0,0,101,96,0,0,101,120,0,0,102,24,0,0,102,72,0,0,102,116, + 0,0,102,156,0,0,102,200,0,0,102,232,0,0,103,0,0,0,103,24,0,0,103,48,0,0,103,72,0,0,103,108,0,0,103,132,0,0,103,156, + 0,0,103,180,0,0,103,216,0,0,103,240,0,0,104,8,0,0,104,48,0,0,104,64,0,0,104,252,0,0,105,20,0,0,105,56,0,0,105,92, + 0,0,105,128,0,0,105,152,0,0,105,176,0,0,105,200,0,0,105,224,0,0,106,4,0,0,106,48,0,0,106,84,0,0,106,120,0,0,106,144, + 0,0,106,168,0,0,106,204,0,0,106,228,0,0,106,252,0,0,107,20,0,0,107,68,0,0,107,136,0,0,108,16,0,0,108,164,0,0,108,200, + 0,0,108,236,0,0,109,16,0,0,109,52,0,0,109,88,0,0,109,124,0,0,109,148,0,0,109,172,0,0,109,220,0,0,110,40,0,0,110,76, + 0,0,110,112,0,0,110,148,0,0,110,184,0,0,110,208,0,0,110,232,0,0,111,216,0,0,111,240,0,0,112,40,0,0,112,64,0,0,112,100, + 0,0,112,124,0,0,112,160,0,0,112,184,0,0,112,236,0,0,113,104,0,0,113,248,0,0,114,28,0,0,114,64,0,0,114,88,0,0,114,112, + 0,0,114,160,0,0,114,204,0,0,114,228,0,0,115,124,0,0,116,24,0,0,116,68,0,0,116,100,0,0,116,144,0,0,116,176,0,0,116,200, + 0,0,116,224,0,0,117,128,0,0,118,168,0,0,118,192,0,0,118,216,0,0,118,240,0,0,119,8,0,0,119,44,0,0,119,84,0,0,119,108, + 0,0,119,132,0,0,119,172,0,0,119,208,0,0,119,232,0,0,120,0,0,0,120,40,0,0,120,80,0,0,120,104,0,0,120,128,0,0,120,172, + 0,0,120,208,0,0,121,84,0,0,121,240,0,0,122,28,0,0,122,64,0,0,122,112,0,0,122,148,0,0,122,192,0,0,122,228,0,0,122,252, + 0,0,123,32,0,0,123,56,0,0,123,80,0,0,123,104,0,0,123,128,0,0,123,164,0,0,123,200,0,0,123,236,0,0,124,12,0,0,124,48, + 0,0,124,72,0,0,124,96,0,0,124,120,0,0,124,160,0,0,124,184,0,0,124,224,0,0,125,56,0,0,126,4,0,0,126,204,0,0,126,220, + 0,0,127,144,0,0,128,28,0,0,128,196,0,0,129,84,0,0,130,20,0,0,130,208,0,0,130,224,0,0,131,116,0,0,131,240,0,0,132,152, + 0,0,133,112,0,0,133,204,0,0,134,124,0,0,135,52,0,0,135,180,0,0,136,108,0,0,137,56,0,0,138,76,0,0,139,28,0,0,139,120, + 0,0,139,232,0,0,140,164,0,0,141,184,0,0,142,24,0,0,143,0,0,0,143,192,0,0,144,144,0,0,144,160,0,0,145,68,0,0,145,92, + 0,0,145,116,0,0,146,28,0,0,146,200,0,0,147,96,0,0,148,32,0,0,148,220,0,0,149,176,0,0,150,248,0,0,151,8,0,0,151,164, + 0,0,152,60,0,0,152,204,0,0,153,104,0,0,153,244,0,0,154,12,0,0,154,36,0,0,154,208,0,0,155,92,0,0,156,24,0,0,157,232, + 0,0,158,240,0,0,159,252,0,0,160,220,0,0,161,172,0,0,162,188,0,0,163,40,0,0,163,156,0,0,164,48,0,0,164,188,0,0,165,48, + 0,0,165,196,0,0,166,4,0,0,166,28,0,0,166,156,0,0,166,172,0,0,166,196,0,0,166,220,0,0,166,244,0,0,167,12,0,0,167,36, + 0,0,167,60,0,0,167,84,0,0,167,108,0,0,167,132,0,0,167,164,0,0,167,196,0,0,167,236,0,0,168,20,0,0,168,44,0,0,168,76, + 0,0,168,108,0,0,168,144,0,0,168,168,0,0,168,192,0,0,168,216,0,0,168,240,0,0,169,8,0,0,169,32,0,0,169,56,0,0,169,80, + 0,0,169,96,0,0,169,120,0,0,169,144,0,0,169,168,0,0,169,192,0,0,169,216,0,0,169,240,0,0,170,196,0,0,171,184,0,0,171,228, + 0,0,171,252,0,0,172,20,0,0,172,88,0,0,172,112,0,0,172,136,0,0,172,160,0,0,172,184,0,0,172,208,0,0,172,232,0,0,173,16, + 0,0,173,40,0,0,173,64,0,0,173,88,0,0,173,112,0,0,173,136,0,0,174,32,0,0,174,184,0,0,174,208,0,0,174,232,0,0,175,0, + 0,0,175,24,0,0,175,48,0,0,175,72,0,0,175,96,0,0,175,120,0,0,175,144,0,0,175,168,0,0,175,192,0,0,175,216,0,0,175,240, + 0,0,176,8,0,0,176,32,0,0,176,56,0,0,176,80,0,0,176,104,0,0,176,128,0,0,176,152,0,0,176,176,0,0,176,200,0,0,176,224, + 0,0,176,248,0,0,177,16,0,0,177,40,0,0,177,64,0,0,177,88,0,0,177,112,0,0,177,136,0,0,177,160,0,0,177,184,0,0,177,208, + 0,0,177,232,0,0,178,0,0,0,178,24,0,0,178,164,0,0,179,56,0,0,179,80,0,0,179,148,0,0,180,8,0,0,180,172,0,0,181,184, + 0,0,182,156,0,0,183,136,0,0,184,128,0,0,184,152,0,0,184,176,0,0,184,200,0,0,184,224,0,0,184,248,0,0,185,16,0,0,185,40, + 0,0,185,64,0,0,185,88,0,0,185,112,0,0,185,136,0,0,185,160,0,0,185,184,0,0,185,208,0,0,186,36,0,0,186,168,0,0,187,16, + 0,0,187,116,0,0,188,84,0,0,189,56,0,0,189,168,0,0,190,64,0,0,190,208,0,0,191,60,0,0,191,144,0,0,192,72,0,0,192,160, + 0,0,193,36,0,0,193,172,0,0,194,136,0,0,195,72,0,0,195,88,0,0,195,192,0,0,196,108,0,0,197,8,0,0,197,164,0,0,198,100, + 0,0,199,32,0,0,200,72,0,0,200,212,0,0,201,36,0,0,201,132,0,0,202,168,0,0,203,64,0,0,203,216,0,0,204,144,0,0,205,24, + 0,0,205,248,0,0,206,184,0,0,207,104,0,0,208,76,0,0,208,240,0,0,210,16,0,0,210,32,0,0,210,48,0,0,211,76,0,0,212,24, + 0,0,212,160,0,0,213,132,0,0,214,60,0,0,214,216,0,0,215,204,0,0,216,192,0,0,217,60,0,0,217,212,0,0,218,128,0,0,218,244, + 0,0,219,4,0,0,219,88,0,0,220,4,0,0,220,140,0,0,220,228,0,0,222,12,0,0,222,220,0,0,223,176,0,0,224,160,0,0,225,72, + 0,0,225,220,0,0,226,132,0,0,227,24,0,0,227,196,0,0,228,116,0,0,228,132,0,0,228,236,0,0,229,84,0,0,229,224,0,0,230,84, + 0,0,230,224,0,0,231,60,0,0,231,152,0,0,232,172,0,0,233,80,0,0,234,92,0,0,234,208,0,0,235,124,0,0,235,220,0,0,236,112, + 0,0,236,228,0,0,237,100,0,0,238,8,0,0,238,192,0,0,239,80,0,0,239,224,0,0,242,8,0,0,242,148,0,0,242,252,0,0,243,236, + 0,0,245,12,0,0,246,32,0,0,246,176,0,0,247,68,0,0,247,216,0,0,248,112,0,0,249,12,0,0,249,152,0,0,249,168,0,0,250,120, + 0,0,251,56,0,0,251,72,0,0,251,216,0,0,252,16,0,0,252,76,0,0,253,4,0,0,253,192,0,0,254,124,0,0,255,12,0,0,255,212, + 0,1,0,144,0,1,1,52,0,1,1,192,0,1,2,144,0,1,3,36,0,1,3,156,0,1,4,104,0,1,4,204,0,1,5,60,0,1,5,192, + 0,1,6,92,0,1,6,208,0,1,7,96,0,1,7,192,0,1,8,32,0,1,8,120,0,1,8,244,0,1,9,96,0,1,9,152,0,1,9,220, + 0,1,9,236,0,1,10,4,0,1,10,20,0,1,10,36,0,1,10,92,0,1,10,196,0,1,11,44,0,1,11,180,0,1,12,64,0,1,12,104, + 0,1,12,144,0,1,12,244,0,1,13,104,0,1,13,196,0,1,14,32,0,1,14,80,0,1,14,96,0,1,14,124,0,1,14,156,0,1,14,204, + 0,1,14,224,0,1,15,0,0,1,15,28,0,1,15,136,0,1,15,216,0,1,15,236,0,1,16,0,0,1,16,36,0,1,16,72,0,1,16,116, + 0,1,16,144,0,1,17,28,0,1,17,132,0,1,17,240,0,1,18,80,0,1,19,16,0,1,19,124,0,1,19,180,0,1,19,232,0,1,20,52, + 0,1,20,92,0,1,20,244,0,1,21,44,0,1,21,60,0,1,21,112,0,1,21,188,0,1,21,252,0,1,22,72,0,1,22,124,0,1,22,144, + 0,1,22,168,0,1,22,184,0,1,22,204,0,1,23,152,0,1,23,244,0,1,24,76,0,1,24,180,0,1,24,200,0,1,24,220,0,1,24,240, + 0,1,25,4,0,1,25,72,0,1,25,188,0,1,26,48,0,1,26,68,0,1,26,88,0,1,26,192,0,1,26,236,0,1,27,8,0,1,27,120, + 0,1,27,148,0,1,27,224,0,1,28,8,0,1,28,48,0,1,28,84,0,1,28,112,0,1,28,132,0,1,28,152,0,1,28,188,0,1,28,220, + 0,1,28,252,0,1,29,112,0,1,29,192,0,1,29,228,0,1,30,8,0,1,30,52,0,1,30,80,0,1,30,128,0,1,30,176,0,1,30,200, + 0,1,30,220,0,1,31,72,0,1,31,108,0,1,31,128,0,1,31,148,0,1,31,188,0,1,31,224,0,1,32,40,0,1,32,100,0,1,32,160, + 0,1,32,180,0,1,32,232,0,1,32,252,0,1,33,16,0,1,33,36,0,1,33,56,0,1,33,148,0,1,33,176,0,1,33,204,0,1,33,236, + 0,1,34,12,0,1,34,88,0,1,34,124,0,1,34,164,0,1,34,236,0,1,35,32,0,1,35,128,0,1,35,156,0,1,35,176,0,1,35,196, + 0,1,35,216,0,1,35,232,0,1,35,252,0,1,36,16,0,1,36,52,0,1,36,92,0,1,36,132,0,1,36,164,0,1,37,32,0,1,37,148, + 0,1,37,172,0,1,37,228,0,1,38,12,0,1,38,12,0,1,38,76,0,1,38,100,0,1,38,120,0,1,38,184,0,1,38,204,0,1,39,48, + 0,1,39,68,0,1,39,88,0,1,39,116,0,1,39,144,0,1,40,4,0,1,40,24,0,1,40,64,0,1,40,80,0,1,40,96,0,1,40,144, + 0,1,40,192,0,1,40,240,0,1,41,32,0,1,41,48,0,1,41,64,0,1,41,116,0,1,41,132,0,1,41,156,0,1,41,180,0,1,41,196, + 0,1,42,20,0,1,42,68,0,1,42,92,0,1,42,108,0,1,42,136,0,1,42,164,0,1,42,192,0,1,42,216,0,1,42,244,0,1,43,12, + 0,1,43,36,0,1,43,52,0,1,43,68,0,1,43,124,0,1,43,232,0,1,43,248,0,1,44,8,0,1,44,24,0,1,44,200,0,1,44,216, + 0,1,44,232,0,1,45,76,0,1,45,92,0,1,45,108,0,1,45,204,0,1,45,220,0,1,45,236,0,1,45,252,0,1,46,120,0,1,46,136, + 0,1,46,152,0,1,47,88,0,1,47,104,0,1,47,252,0,1,48,172,0,1,48,208,0,1,48,244,0,1,49,12,0,1,49,36,0,1,49,60, + 0,1,49,84,0,1,49,108,0,1,50,188,0,1,51,88,0,1,51,216,0,1,52,188,0,1,53,140,0,1,54,48,0,1,54,172,0,1,55,116, + 0,1,55,196,0,1,56,68,0,1,56,200,0,1,56,216,0,1,57,104,0,1,58,36,0,1,58,52,0,1,58,176,0,1,59,68,0,1,59,240, + 0,1,60,132,0,1,60,228,0,1,61,112,0,1,62,48,0,1,63,60,0,1,63,208,0,1,64,100,0,1,64,124,0,1,64,148,0,1,64,172, + 0,1,64,196,0,1,64,220,0,1,65,28,0,1,65,236,0,1,66,148,0,1,67,76,0,1,67,104,0,1,67,128,0,1,68,72,0,1,68,248, + 0,1,69,164,0,1,70,92,0,1,71,8,0,1,71,172,0,1,72,72,0,1,72,88,0,1,73,8,0,1,73,100,0,1,73,212,0,1,74,76, + 0,1,74,168,0,1,75,192,0,1,76,152,0,1,77,44,0,1,77,184,0,1,78,108,0,1,79,84,0,1,79,204,0,1,80,60,0,1,80,240, + 0,1,81,160,0,1,82,52,0,1,82,204,0,1,83,60,0,1,83,168,0,1,84,68,0,1,84,252,0,1,85,12,0,1,85,28,0,1,85,44, + 0,1,85,156,0,1,86,8,0,1,86,24,0,1,86,40,0,1,86,56,0,1,87,8,0,1,87,148,0,1,88,20,0,1,88,36,0,1,88,60, + 0,1,88,84,0,1,88,108,0,1,89,12,0,1,89,152,0,1,89,176,0,1,90,92,0,1,90,108,0,1,90,124,0,1,90,140,0,1,90,156, + 0,1,91,52,0,1,91,196,0,1,92,52,0,1,92,76,0,1,92,100,0,1,92,124,0,1,92,212,0,1,92,228,0,1,93,100,0,1,93,116, + 0,1,93,172,0,1,94,56,0,1,94,72,0,1,95,60,0,1,95,244,0,1,96,160,0,1,96,224,0,1,97,116,0,1,97,212,0,1,97,228, + 0,1,97,244,0,1,98,4,0,1,98,76,0,1,98,92,0,1,98,108,0,1,98,124,0,1,99,0,0,1,99,180,0,1,99,196,0,1,100,28, + 0,1,100,120,0,1,100,212,0,1,101,64,0,1,101,192,0,1,101,216,0,1,102,76,0,1,102,248,0,1,103,184,0,1,104,84,0,1,104,100, + 0,1,105,44,0,1,105,200,0,1,106,0,0,1,106,136,0,1,106,152,0,1,107,136,0,1,108,76,0,1,108,188,0,1,108,252,0,1,109,140, + 0,1,109,236,0,1,110,116,0,1,110,204,0,1,110,220,0,1,111,36,0,1,111,52,0,1,111,68,0,1,111,136,0,1,111,152,0,1,112,128, + 0,1,112,144,0,1,112,232,0,1,113,100,0,1,113,192,0,1,114,44,0,1,114,168,0,1,114,192,0,1,115,48,0,1,115,212,0,1,116,120, + 0,1,117,8,0,1,117,32,0,1,117,192,0,1,118,100,0,1,118,124,0,1,119,32,0,1,119,48,0,1,119,64,0,1,119,80,0,1,119,96, + 0,1,119,252,0,1,120,144,0,1,121,32,0,1,121,56,0,1,121,80,0,1,121,104,0,1,121,192,0,1,122,152,0,1,122,168,0,1,123,72, + 0,1,123,220,0,1,124,108,0,1,124,220,0,1,125,32,0,1,125,96,0,1,125,188,0,1,126,20,0,1,126,252,0,1,127,224,0,1,128,92, + 0,1,128,212,0,1,129,192,0,1,130,156,0,1,131,0,0,1,131,100,0,1,131,116,0,1,131,132,0,1,131,208,0,1,132,32,0,1,132,56, + 0,1,132,80,0,1,132,244,0,1,133,120,0,1,134,112,0,1,135,92,0,1,135,124,0,1,135,156,0,1,135,180,0,1,135,204,0,1,136,104, + 0,1,137,0,0,1,137,76,0,1,137,228,0,1,138,24,0,1,138,64,0,1,138,104,0,1,138,168,0,1,139,236,0,1,140,168,0,1,140,192, + 0,1,140,216,0,1,141,116,0,1,142,20,0,1,142,116,0,1,142,252,0,1,143,60,0,1,143,128,0,1,143,224,0,1,144,64,0,1,144,204, + 0,1,145,92,0,1,145,192,0,1,146,32,0,1,146,56,0,1,146,80,0,1,146,148,0,1,146,216,0,1,147,36,0,1,147,108,0,1,147,184, + 0,1,148,4,0,1,148,164,0,1,149,68,0,1,149,180,0,1,150,32,0,1,150,132,0,1,150,228,0,1,151,124,0,1,152,20,0,1,153,8, + 0,1,153,228,0,1,153,252,0,1,154,20,0,1,154,112,0,1,154,200,0,1,154,216,0,1,155,116,0,1,155,188,0,1,156,0,0,1,156,72, + 0,1,156,144,0,1,157,0,0,1,157,112,0,1,157,228,0,1,158,112,0,1,158,192,0,1,159,12,0,1,159,108,0,1,159,124,0,1,160,88, + 0,1,161,84,0,1,161,240,0,1,162,136,0,1,162,152,0,1,162,176,0,1,162,200,0,1,163,36,0,1,163,136,0,1,163,212,0,1,164,32, + 0,1,164,152,0,1,165,16,0,1,165,76,0,1,165,136,0,1,166,0,0,1,166,144,0,1,166,220,0,1,167,40,0,1,167,56,0,1,167,100, + 0,1,167,132,0,1,167,180,0,1,167,236,0,1,167,252,0,1,168,12,0,1,168,48,0,1,168,84,0,1,168,100,0,1,168,116,0,1,168,140, + 0,1,168,164,0,1,168,188,0,1,168,212,0,1,168,236,0,1,169,4,0,1,169,20,0,1,169,36,0,1,169,60,0,1,169,84,0,1,169,108, + 0,1,169,132,0,1,169,180,0,1,169,224,0,1,169,240,0,1,170,0,0,1,170,24,0,1,170,48,0,1,170,72,0,1,170,96,0,1,170,120, + 0,1,170,144,0,1,170,168,0,1,170,192,0,1,170,216,0,1,170,240,0,1,171,8,0,1,171,32,0,1,171,108,0,1,171,184,0,1,171,208, + 0,1,171,232,0,1,172,116,0,1,173,0,0,1,173,96,0,1,173,192,0,1,174,16,0,1,174,96,0,1,174,216,0,1,175,84,0,1,176,36, + 0,1,176,240,0,1,177,208,0,1,178,180,0,1,179,104,0,1,180,36,0,1,180,200,0,1,181,104,0,1,181,120,0,1,182,12,0,1,182,156, + 0,1,183,36,0,1,183,168,0,1,184,48,0,1,184,64,0,1,184,80,0,1,184,208,0,1,185,80,0,1,185,180,0,1,186,28,0,1,186,124, + 0,1,186,244,0,1,187,96,0,1,187,248,0,1,188,8,0,1,188,24,0,1,188,40,0,1,188,56,0,1,188,140,0,1,188,216,0,1,189,132, + 0,1,190,52,0,1,190,220,0,1,191,136,0,1,191,184,0,1,191,232,0,1,192,96,0,1,192,184,0,1,193,40,0,1,193,124,0,1,193,212, + 0,1,194,76,0,1,194,120,0,1,194,200,0,1,195,108,0,1,195,216,0,1,196,36,0,1,196,72,0,1,196,168,0,1,197,92,0,1,197,168, + 0,1,198,4,0,1,198,196,0,1,199,20,0,1,199,148,0,1,199,232,0,1,200,132,0,1,200,216,0,1,201,96,0,1,201,172,0,1,202,28, + 0,1,202,120,0,1,203,36,0,1,203,124,0,1,203,140,0,1,203,224,0,1,204,140,0,1,204,216,0,1,205,144,0,1,205,184,0,1,206,56, + 0,1,206,192,0,1,206,208,0,1,207,112,0,1,207,168,0,1,207,204,0,1,207,232,0,1,208,48,0,1,208,68,0,1,208,188,0,1,208,220, + 0,1,209,88,0,1,209,164,0,1,210,32,0,1,210,104,0,1,210,188,0,1,211,68,0,1,211,112,0,1,211,180,0,1,212,92,0,1,212,208, + 0,1,213,20,0,1,213,52,0,1,213,176,0,1,214,60,0,1,214,128,0,1,214,144,0,1,215,84,0,1,215,156,0,1,216,76,0,1,216,152, + 0,1,216,196,0,1,217,16,0,1,217,152,0,1,217,168,0,1,218,56,0,1,218,180,0,1,219,112,0,1,219,220,0,1,219,236,0,1,220,56, + 0,1,220,172,0,1,220,244,0,1,221,4,0,1,221,36,0,1,221,156,0,1,222,32,0,1,222,48,0,1,222,216,0,1,223,36,0,1,223,72, + 0,1,223,112,0,1,223,176,0,1,223,224,0,1,224,52,0,1,224,152,0,1,224,192,0,1,224,232,0,1,225,104,0,1,225,148,0,1,225,208, + 0,1,225,248,0,1,226,8,0,1,226,104,0,1,226,148,0,1,226,192,0,1,226,220,0,1,227,8,0,1,227,64,0,1,227,108,0,1,227,148, + 0,1,227,220,0,1,228,44,0,1,228,104,0,1,229,80,0,1,229,204,0,1,230,108,0,1,230,188,0,1,231,56,0,1,231,116,0,1,231,236, + 0,1,232,92,0,1,233,28,0,1,233,92,0,1,233,208,0,1,234,88,0,1,234,188,0,1,235,48,0,1,236,12,0,1,236,76,0,1,236,176, + 0,1,237,96,0,1,237,248,0,1,238,164,0,1,239,108,0,1,240,4,0,1,240,200,0,1,241,84,0,1,241,212,0,1,242,236,0,1,243,148, + 0,1,243,172,0,1,243,196,0,1,243,220,0,1,244,12,0,1,244,84,0,1,244,244,0,1,245,164,0,1,245,228,0,1,246,48,0,1,246,80, + 0,1,246,172,0,1,246,220,0,1,247,76,0,1,247,188,0,1,247,212,0,1,247,236,0,1,248,4,0,1,248,28,0,1,248,52,0,1,248,80, + 0,1,248,104,0,1,248,128,0,1,248,152,0,1,248,176,0,1,248,200,0,1,249,48,0,1,249,72,0,1,249,156,0,1,249,180,0,1,249,248, + 0,1,250,16,0,1,250,208,0,1,250,232,0,1,251,172,0,1,251,196,0,1,252,48,0,1,252,72,0,1,252,200,0,1,252,224,0,1,252,248, + 0,1,253,16,0,1,253,40,0,1,253,228,0,1,254,68,0,1,254,208,0,1,254,232,0,1,255,80,0,1,255,208,0,2,0,124,0,2,0,148, + 0,2,0,192,0,2,1,96,0,2,1,136,0,2,1,164,0,2,2,48,0,2,2,76,0,2,2,200,0,2,3,12,0,2,3,84,0,2,3,104, + 0,2,3,124,0,2,4,8,0,2,4,48,0,2,4,76,0,2,4,124,0,2,4,212,0,2,5,80,0,2,5,212,0,2,6,60,0,2,6,132, + 0,2,6,212,0,2,7,36,0,2,7,156,0,2,7,208,0,2,8,16,0,2,8,52,0,2,8,104,0,2,8,204,0,2,9,124,0,2,9,152, + 0,2,9,236,0,2,10,4,0,2,10,28,0,2,10,52,0,2,10,84,0,2,10,108,0,2,10,132,0,2,10,156,0,2,10,180,0,2,10,204, + 0,2,10,228,0,2,10,252,0,2,11,20,0,2,11,44,0,2,11,68,0,2,11,92,0,2,11,116,0,2,11,140,0,2,11,164,0,2,11,196, + 0,2,11,220,0,2,11,244,0,2,12,12,0,2,12,36,0,2,12,60,0,2,12,84,0,2,12,108,0,2,12,132,0,2,12,156,0,2,12,180, + 0,2,12,212,0,2,12,236,0,2,13,4,0,2,13,28,0,2,13,60,0,2,13,84,0,2,13,116,0,2,13,140,0,2,13,164,0,2,13,188, + 0,2,13,212,0,2,14,144,0,2,14,168,0,2,14,200,0,2,14,224,0,2,14,248,0,2,15,16,0,2,15,40,0,2,15,64,0,2,15,212, + 0,2,16,108,0,2,16,132,0,2,16,156,0,2,16,180,0,2,16,204,0,2,16,228,0,2,16,252,0,2,17,20,0,2,17,44,0,2,17,68, + 0,2,17,92,0,2,17,116,0,2,17,140,0,2,17,164,0,2,17,188,0,2,17,220,0,2,18,60,0,2,18,84,0,2,18,116,0,2,18,140, + 0,2,19,76,0,2,19,108,0,2,19,132,0,2,19,148,0,2,19,172,0,2,19,188,0,2,19,204,0,2,19,220,0,2,19,236,0,2,19,252, + 0,2,20,124,0,2,20,252,0,2,21,96,0,2,21,112,0,2,21,128,0,2,21,144,0,2,22,20,0,2,22,108,0,2,22,184,0,2,23,0, + 0,2,23,76,0,2,23,144,0,2,23,208,0,2,24,32,0,2,24,124,0,2,25,24,0,2,25,72,0,2,25,196,0,2,26,28,0,2,26,68, + 0,2,26,136,0,2,26,208,0,2,27,128,0,2,27,220,0,2,28,108,0,2,28,192,0,2,29,20,0,2,29,140,0,2,30,12,0,2,30,104, + 0,2,31,4,0,2,31,92,0,2,31,220,0,2,32,40,0,2,32,148,0,2,33,48,0,2,33,136,0,2,34,20,0,2,34,88,0,2,34,196, + 0,2,35,68,0,2,35,140,0,2,35,220,0,2,36,64,0,2,36,248,0,2,37,128,0,2,37,172,0,2,37,244,0,2,38,28,0,2,38,120, + 0,2,38,228,0,2,39,44,0,2,39,148,0,2,39,188,0,2,39,252,0,2,40,64,0,2,40,128,0,2,40,196,0,2,41,32,0,2,41,76, + 0,2,41,236,0,2,42,176,0,2,43,128,0,2,44,40,0,2,44,208,0,2,45,132,0,2,46,96,0,2,47,44,0,2,47,184,0,2,48,124, + 0,2,49,64,0,2,50,0,0,2,50,168,0,2,51,68,0,2,51,224,0,2,52,176,0,2,53,96,0,2,54,36,0,2,54,232,0,2,55,92, + 0,2,56,40,0,2,56,232,0,2,57,200,0,2,58,112,0,2,59,56,0,2,59,244,0,2,60,176,0,2,61,144,0,2,62,24,0,2,62,52, + 0,2,62,196,0,2,63,64,0,2,63,88,0,2,63,188,0,2,64,44,0,2,64,164,0,2,65,40,0,2,65,112,0,2,65,236,0,2,66,80, + 0,2,66,200,0,2,67,100,0,2,67,248,0,2,68,16,0,2,68,148,0,2,69,56,0,2,69,172,0,2,70,96,0,2,70,136,0,2,71,16, + 0,2,71,172,0,2,71,248,0,2,72,12,0,2,72,88,0,2,72,188,0,2,73,60,0,2,73,180,0,2,74,64,0,2,74,196,0,2,75,104, + 0,2,76,40,0,2,76,152,0,2,77,156,0,2,78,8,0,2,78,240,0,2,80,0,0,2,80,104,0,2,80,180,0,2,81,4,0,2,81,120, + 0,2,81,192,0,2,82,20,0,2,82,120,0,2,82,220,0,2,83,4,0,2,83,104,0,2,83,216,0,2,84,76,0,2,84,160,0,2,85,40, + 0,2,85,112,0,2,85,192,0,2,86,28,0,2,86,104,0,2,86,192,0,2,87,68,0,2,87,200,0,2,88,8,0,2,88,76,0,2,88,140, + 0,2,88,240,0,2,89,48,0,2,89,152,0,2,90,4,0,2,90,92,0,2,90,204,0,2,91,20,0,2,91,92,0,2,91,172,0,2,91,232, + 0,2,92,88,0,2,92,152,0,2,92,232,0,2,93,132,0,2,93,204,0,2,94,48,0,2,94,172,0,2,95,56,0,2,95,136,0,2,95,244, + 0,2,96,108,0,2,96,216,0,2,97,28,0,2,97,124,0,2,98,28,0,2,98,132,0,2,98,224,0,2,99,72,0,2,99,164,0,2,100,0, + 0,2,100,128,0,2,100,204,0,2,101,56,0,2,101,160,0,2,102,76,0,2,102,164,0,2,103,32,0,2,103,124,0,2,103,252,0,2,104,88, + 0,2,104,200,0,2,105,20,0,2,105,144,0,2,106,8,0,2,106,84,0,2,106,204,0,2,107,64,0,2,107,180,0,2,108,20,0,2,108,120, + 0,2,108,240,0,2,109,112,0,2,109,232,0,2,110,84,0,2,110,176,0,2,111,44,0,2,111,140,0,2,111,188,0,2,112,8,0,2,112,116, + 0,2,112,140,0,2,112,156,0,2,112,180,0,2,113,32,0,2,113,56,0,2,113,80,0,2,113,104,0,2,113,216,0,2,113,240,0,2,114,8, + 0,2,114,32,0,2,114,56,0,2,114,80,0,2,114,104,0,2,114,128,0,2,114,152,0,2,114,176,0,2,114,200,0,2,114,224,0,2,114,248, + 0,2,115,16,0,2,115,40,0,2,115,64,0,2,115,88,0,2,115,112,0,2,115,136,0,2,115,180,0,2,115,212,0,2,115,244,0,2,116,48, + 0,2,116,108,0,2,116,168,0,2,116,236,0,2,117,32,0,2,117,104,0,2,117,128,0,2,117,156,0,2,117,200,0,2,117,236,0,2,118,4, + 0,2,118,28,0,2,118,52,0,2,118,76,0,2,118,92,0,2,118,116,0,2,118,132,0,2,118,156,0,2,119,0,0,2,119,24,0,2,119,48, + 0,2,119,72,0,2,119,172,0,2,119,196,0,2,119,220,0,2,119,244,0,2,120,12,0,2,120,36,0,2,120,60,0,2,120,84,0,2,120,108, + 0,2,120,132,0,2,120,156,0,2,120,180,0,2,120,204,0,2,120,228,0,2,120,252,0,2,121,20,0,2,121,44,0,2,121,144,0,2,121,192, + 0,2,121,208,0,2,121,232,0,2,122,84,0,2,122,108,0,2,122,212,0,2,122,236,0,2,123,4,0,2,123,28,0,2,123,132,0,2,123,156, + 0,2,123,180,0,2,123,204,0,2,123,228,0,2,123,252,0,2,124,20,0,2,124,44,0,2,124,68,0,2,124,92,0,2,124,116,0,2,124,140, + 0,2,124,164,0,2,124,188,0,2,124,212,0,2,124,236,0,2,125,4,0,2,125,96,0,2,125,120,0,2,125,144,0,2,125,168,0,2,125,192, + 0,2,126,60,0,2,126,84,0,2,126,208,0,2,126,232,0,2,127,104,0,2,127,128,0,2,127,152,0,2,128,24,0,2,128,48,0,2,128,72, + 0,2,128,96,0,2,128,120,0,2,128,144,0,2,128,168,0,2,128,192,0,2,128,216,0,2,128,240,0,2,129,8,0,2,129,32,0,2,129,56, + 0,2,129,80,0,2,129,104,0,2,129,128,0,2,129,152,0,2,130,16,0,2,130,100,0,2,130,124,0,2,130,148,0,2,130,172,0,2,130,196, + 0,2,131,24,0,2,131,48,0,2,131,136,0,2,131,160,0,2,131,248,0,2,132,16,0,2,132,40,0,2,132,128,0,2,132,152,0,2,132,176, + 0,2,132,200,0,2,132,224,0,2,132,248,0,2,133,16,0,2,133,40,0,2,133,64,0,2,133,88,0,2,133,112,0,2,133,136,0,2,133,160, + 0,2,133,184,0,2,133,208,0,2,133,232,0,2,134,0,0,2,134,88,0,2,134,144,0,2,134,200,0,2,134,224,0,2,135,24,0,2,135,48, + 0,2,135,104,0,2,135,128,0,2,135,152,0,2,135,168,0,2,135,192,0,2,135,216,0,2,135,240,0,2,136,8,0,2,136,32,0,2,136,56, + 0,2,136,80,0,2,136,104,0,2,136,128,0,2,136,152,0,2,136,176,0,2,136,200,0,2,136,224,0,2,136,248,0,2,137,16,0,2,137,40, + 0,2,137,100,0,2,137,196,0,2,137,228,0,2,138,96,0,2,138,120,0,2,138,248,0,2,139,16,0,2,139,136,0,2,139,160,0,2,139,184, + 0,2,140,48,0,2,140,72,0,2,140,96,0,2,140,120,0,2,140,144,0,2,140,168,0,2,140,192,0,2,140,216,0,2,140,240,0,2,141,64, + 0,2,141,128,0,2,141,212,0,2,142,40,0,2,142,64,0,2,142,148,0,2,142,172,0,2,143,0,0,2,143,24,0,2,143,48,0,2,143,132, + 0,2,143,156,0,2,143,180,0,2,143,204,0,2,143,228,0,2,143,252,0,2,144,20,0,2,144,44,0,2,144,68,0,2,144,92,0,2,144,116, + 0,2,144,140,0,2,144,164,0,2,144,188,0,2,144,212,0,2,144,236,0,2,145,36,0,2,145,96,0,2,145,180,0,2,145,204,0,2,146,36, + 0,2,146,60,0,2,146,144,0,2,146,168,0,2,146,192,0,2,147,24,0,2,147,48,0,2,147,72,0,2,147,96,0,2,147,120,0,2,147,144, + 0,2,147,168,0,2,147,192,0,2,147,216,0,2,147,240,0,2,148,8,0,2,148,32,0,2,148,56,0,2,148,80,0,2,148,104,0,2,148,128, + 0,2,148,152,0,2,148,232,0,2,149,108,0,2,149,160,0,2,149,248,0,2,150,80,0,2,150,104,0,2,150,228,0,2,150,252,0,2,151,124, + 0,2,151,148,0,2,151,172,0,2,151,196,0,2,151,220,0,2,151,244,0,2,152,12,0,2,152,36,0,2,152,60,0,2,152,84,0,2,152,108, + 0,2,152,132,0,2,152,156,0,2,152,180,0,2,152,204,0,2,152,228,0,2,153,88,0,2,153,176,0,2,153,200,0,2,154,36,0,2,154,60, + 0,2,154,152,0,2,154,176,0,2,154,200,0,2,155,36,0,2,155,60,0,2,155,84,0,2,155,108,0,2,155,132,0,2,155,156,0,2,155,180, + 0,2,155,204,0,2,155,228,0,2,155,252,0,2,156,20,0,2,156,44,0,2,156,68,0,2,156,92,0,2,156,116,0,2,156,140,0,2,156,164, + 0,2,157,4,0,2,157,20,0,2,157,80,0,2,157,188,0,2,158,40,0,2,158,140,0,2,158,164,0,2,159,8,0,2,159,32,0,2,159,136, + 0,2,159,160,0,2,160,8,0,2,160,112,0,2,160,136,0,2,160,236,0,2,161,4,0,2,161,28,0,2,161,136,0,2,161,196,0,2,162,120, + 0,2,162,144,0,2,163,68,0,2,163,92,0,2,164,20,0,2,164,44,0,2,164,224,0,2,164,248,0,2,165,16,0,2,165,40,0,2,165,148, + 0,2,166,16,0,2,166,140,0,2,167,8,0,2,167,132,0,2,167,156,0,2,167,180,0,2,168,48,0,2,168,72,0,2,168,200,0,2,168,224, + 0,2,168,248,0,2,169,16,0,2,169,136,0,2,169,236,0,2,170,84,0,2,170,108,0,2,170,208,0,2,170,232,0,2,171,76,0,2,171,100, + 0,2,171,196,0,2,171,212,0,2,171,228,0,2,171,252,0,2,172,20,0,2,172,44,0,2,172,68,0,2,172,92,0,2,172,116,0,2,172,140, + 0,2,172,164,0,2,173,36,0,2,173,164,0,2,174,40,0,2,174,176,0,2,174,200,0,2,174,224,0,2,174,248,0,2,175,16,0,2,175,40, + 0,2,175,64,0,2,175,88,0,2,175,204,0,2,176,120,0,2,176,248,0,2,177,16,0,2,177,140,0,2,177,164,0,2,178,36,0,2,178,60, + 0,2,178,128,0,2,178,188,0,2,178,248,0,2,179,16,0,2,179,76,0,2,179,100,0,2,179,160,0,2,179,184,0,2,179,244,0,2,180,120, + 0,2,180,136,0,2,180,248,0,2,181,40,0,2,181,136,0,2,181,192,0,2,181,216,0,2,181,240,0,2,182,8,0,2,182,32,0,2,182,56, + 0,2,182,80,0,2,182,104,0,2,182,128,0,2,182,156,0,2,182,196,0,2,182,244,0,2,183,48,0,2,183,116,0,2,183,196,0,2,183,236, + 0,2,184,28,0,2,184,88,0,2,184,156,0,2,184,236,0,2,185,32,0,2,185,108,0,2,185,208,0,2,186,76,0,2,186,224,0,2,187,16, + 0,2,187,84,0,2,187,172,0,2,188,24,0,2,188,152,0,2,188,224,0,2,189,56,0,2,189,112,0,2,190,8,0,2,190,224,0,2,191,8, + 0,2,191,60,0,2,191,112,0,2,191,168,0,2,191,248,0,2,192,212,0,2,193,64,0,2,193,80,0,2,193,152,0,2,193,240,0,2,194,32, + 0,2,194,176,0,2,194,212,0,2,195,16,0,2,195,32,0,2,195,88,0,2,195,104,0,2,195,120,0,2,195,136,0,2,195,152,0,2,195,240, + 0,2,196,72,0,2,196,216,0,2,197,148,0,2,197,204,0,2,198,4,0,2,198,72,0,2,198,184,0,2,199,40,0,2,199,56,0,2,199,116, + 0,2,199,184,0,2,200,20,0,2,200,136,0,2,200,152,0,2,200,168,0,2,200,184,0,2,201,8,0,2,201,40,0,2,201,56,0,2,201,96, + 0,2,201,112,0,2,201,204,0,2,201,220,0,2,202,16,0,2,202,92,0,2,202,216,0,2,203,40,0,2,203,88,0,2,203,136,0,2,203,248, + 0,2,204,40,0,2,204,68,0,2,204,116,0,2,204,168,0,2,204,200,0,2,205,0,0,2,205,48,0,2,205,96,0,2,205,192,0,2,206,124, + 0,2,206,200,0,2,207,52,0,2,207,92,0,2,207,160,0,2,207,216,0,2,208,88,0,2,208,224,0,2,209,72,0,2,210,32,0,2,210,132, + 0,2,210,236,0,2,211,96,0,2,212,8,0,2,212,156,0,2,213,44,0,2,213,192,0,2,213,228,0,2,214,24,0,2,214,180,0,2,215,72, + 0,2,215,204,0,2,216,52,0,2,216,112,0,2,216,168,0,2,217,12,0,2,217,76,0,2,217,152,0,2,217,228,0,2,218,96,0,2,218,136, + 0,2,218,232,0,2,219,32,0,2,219,168,0,2,220,36,0,2,220,124,0,2,220,144,0,2,220,164,0,2,220,184,0,2,220,204,0,2,220,224, + 0,2,220,244,0,2,221,80,0,2,221,100,0,2,221,120,0,2,221,248,0,2,222,8,0,2,222,72,0,2,222,212,0,2,223,16,0,2,223,120, + 0,2,223,216,0,2,224,92,0,2,224,236,0,2,225,124,0,2,225,192,0,2,226,4,0,2,226,140,0,2,226,216,0,2,227,16,0,2,227,64, + 0,2,227,108,0,2,227,168,0,2,228,0,0,2,228,52,0,2,228,116,0,2,228,148,0,2,229,44,0,2,229,168,0,2,230,8,0,2,230,108, + 0,2,230,156,0,2,231,12,0,2,231,156,0,2,232,68,0,2,232,148,0,2,232,236,0,2,233,84,0,2,233,204,0,2,234,16,0,2,234,116, + 0,2,234,156,0,2,234,204,0,2,235,24,0,2,235,116,0,2,235,224,0,2,236,76,0,2,236,108,0,2,236,144,0,2,236,180,0,2,236,212, + 0,2,237,0,0,2,237,48,0,2,237,72,0,2,237,96,0,2,237,120,0,2,237,144,0,2,237,168,0,2,237,192,0,2,237,216,0,2,237,240, + 0,2,238,8,0,2,238,32,0,2,238,56,0,2,238,80,0,2,238,104,0,2,238,128,0,2,238,152,0,2,238,176,0,2,238,200,0,2,238,224, + 0,2,238,248,0,2,239,16,0,2,239,40,0,2,239,64,0,2,239,88,0,2,239,112,0,2,239,136,0,2,239,160,0,2,239,184,0,2,239,208, + 0,2,239,240,0,2,240,16,0,2,240,40,0,2,240,64,0,2,240,88,0,2,240,112,0,2,240,136,0,2,240,160,0,2,240,184,0,2,240,208, + 0,2,240,232,0,2,241,0,0,2,241,24,0,2,241,48,0,2,241,72,0,2,241,96,0,2,241,120,0,2,241,144,0,2,241,168,0,2,241,192, + 0,2,241,216,0,2,241,240,0,2,242,8,0,2,242,32,0,2,242,56,0,2,242,80,0,2,242,104,0,2,242,128,0,2,242,160,0,2,242,184, + 0,2,242,208,0,2,242,232,0,2,243,0,0,2,243,24,0,2,243,48,0,2,243,72,0,2,243,96,0,2,243,120,0,2,243,144,0,2,243,168, + 0,2,243,192,0,2,243,216,0,2,243,240,0,2,244,8,0,2,244,32,0,2,244,56,0,2,244,80,0,2,244,104,0,2,244,128,0,2,244,152, + 0,2,244,176,0,2,244,208,0,2,244,232,0,2,245,0,0,2,245,24,0,2,245,48,0,2,245,72,0,2,245,96,0,2,245,120,0,2,245,144, + 0,2,245,168,0,2,245,192,0,2,245,216,0,2,245,240,0,2,246,8,0,2,246,32,0,2,246,56,0,2,246,80,0,2,246,104,0,2,246,128, + 0,2,246,152,0,2,246,176,0,2,246,208,0,2,246,240,0,2,247,8,0,2,247,32,0,2,247,56,0,2,247,80,0,2,247,104,0,2,247,128, + 0,2,247,152,0,2,247,176,0,2,247,200,0,2,247,224,0,2,247,248,0,2,248,16,0,2,248,40,0,2,248,64,0,2,248,88,0,2,248,112, + 0,2,248,136,0,2,248,160,0,2,248,184,0,2,248,208,0,2,248,232,0,2,249,0,0,2,249,24,0,2,249,48,0,2,249,72,0,2,249,96, + 0,2,249,120,0,2,249,144,0,2,249,168,0,2,249,192,0,2,249,216,0,2,249,240,0,2,250,8,0,2,250,32,0,2,250,56,0,2,250,80, + 0,2,250,104,0,2,250,128,0,2,250,152,0,2,250,176,0,2,250,200,0,2,250,224,0,2,250,248,0,2,251,16,0,2,251,40,0,2,251,64, + 0,2,251,88,0,2,251,112,0,2,251,136,0,2,251,160,0,2,251,184,0,2,251,208,0,2,251,232,0,2,252,0,0,2,252,80,0,2,252,152, + 0,2,253,48,0,2,253,64,0,2,253,88,0,2,253,112,0,2,253,136,0,2,253,160,0,2,253,184,0,2,253,208,0,2,253,232,0,2,254,0, + 0,2,254,24,0,2,254,48,0,2,254,72,0,2,254,96,0,2,254,120,0,2,254,144,0,2,254,168,0,2,254,192,0,2,254,216,0,2,254,240, + 0,2,255,8,0,2,255,32,0,2,255,56,0,2,255,80,0,2,255,104,0,2,255,128,0,2,255,152,0,2,255,176,0,2,255,200,0,2,255,224, + 0,2,255,248,0,3,0,16,0,3,0,40,0,3,0,64,0,3,0,88,0,3,0,112,0,3,0,136,0,3,0,160,0,3,0,184,0,3,0,208, + 0,3,0,232,0,3,1,8,0,3,1,32,0,3,1,56,0,3,1,80,0,3,1,104,0,3,1,128,0,3,1,152,0,3,1,176,0,3,1,200, + 0,3,1,224,0,3,1,248,0,3,2,16,0,3,2,40,0,3,2,64,0,3,2,88,0,3,2,112,0,3,2,136,0,3,2,160,0,3,2,192, + 0,3,2,216,0,3,2,240,0,3,3,8,0,3,3,32,0,3,3,56,0,3,3,80,0,3,3,104,0,3,3,128,0,3,3,152,0,3,3,176, + 0,3,3,200,0,3,3,224,0,3,3,248,0,3,4,16,0,3,4,40,0,3,4,64,0,3,4,88,0,3,4,112,0,3,4,136,0,3,4,160, + 0,3,4,184,0,3,4,208,0,3,4,232,0,3,5,0,0,3,5,24,0,3,5,48,0,3,5,72,0,3,5,96,0,3,5,120,0,3,5,144, + 0,3,5,168,0,3,5,192,0,3,5,236,0,3,6,40,0,3,6,64,0,3,6,88,0,3,6,112,0,3,6,136,0,3,6,160,0,3,6,184, + 0,3,6,208,0,3,6,232,0,3,7,0,0,3,7,24,0,3,7,52,0,3,7,76,0,3,7,104,0,3,7,132,0,3,7,156,0,3,7,180, + 0,3,7,204,0,3,7,228,0,3,7,252,0,3,8,20,0,3,8,44,0,3,8,68,0,3,8,96,0,3,8,124,0,3,8,152,0,3,8,176, + 0,3,8,204,0,3,8,232,0,3,9,0,0,3,9,24,0,3,9,48,0,3,9,72,0,3,9,96,0,3,9,120,0,3,9,144,0,3,9,168, + 0,3,9,196,0,3,9,224,0,3,9,252,0,3,10,20,0,3,10,48,0,3,10,76,0,3,10,104,0,3,10,132,0,3,10,156,0,3,10,180, + 0,3,10,204,0,3,10,228,0,3,10,252,0,3,11,20,0,3,11,44,0,3,11,68,0,3,11,96,0,3,11,124,0,3,11,152,0,3,11,176, + 0,3,11,204,0,3,11,232,0,3,12,4,0,3,12,32,0,3,12,56,0,3,12,80,0,3,12,104,0,3,12,128,0,3,12,152,0,3,12,176, + 0,3,12,200,0,3,12,224,0,3,12,252,0,3,13,20,0,3,13,48,0,3,13,76,0,3,13,100,0,3,13,124,0,3,13,148,0,3,13,172, + 0,3,13,196,0,3,13,220,0,3,13,244,0,3,14,12,0,3,14,40,0,3,14,64,0,3,14,92,0,3,14,120,0,3,14,144,0,3,14,168, + 0,3,14,192,0,3,14,216,0,3,14,240,0,3,15,8,0,3,15,32,0,3,15,56,0,3,15,80,0,3,15,108,0,3,15,136,0,3,15,160, + 0,3,15,188,0,3,15,216,0,3,15,244,0,3,16,16,0,3,16,40,0,3,16,56,0,3,16,80,0,3,16,96,0,3,16,120,0,3,16,136, + 0,3,16,160,0,3,16,176,0,3,16,200,0,3,16,216,0,3,16,240,0,3,17,0,0,3,17,24,0,3,17,40,0,3,17,64,0,3,17,88, + 0,3,17,112,0,3,17,136,0,3,17,160,0,3,17,184,0,3,17,208,0,3,17,232,0,3,18,0,0,3,18,24,0,3,18,48,0,3,18,72, + 0,3,18,96,0,3,18,120,0,3,18,144,0,3,18,168,0,3,18,192,0,3,18,216,0,3,18,240,0,3,19,8,0,3,19,32,0,3,19,56, + 0,3,19,80,0,3,19,104,0,3,19,128,0,3,19,152,0,3,19,176,0,3,19,200,0,3,19,224,0,3,19,248,0,3,20,16,0,3,20,40, + 0,3,20,64,0,3,20,88,0,3,20,112,0,3,20,136,0,3,20,160,0,3,20,184,0,3,20,208,0,3,20,232,0,3,21,0,0,3,21,24, + 0,3,21,48,0,3,21,72,0,3,21,96,0,3,21,120,0,3,21,144,0,3,21,168,0,3,21,192,0,3,21,216,0,3,21,240,0,3,22,8, + 0,3,22,32,0,3,22,56,0,3,22,80,0,3,22,104,0,3,22,128,0,3,22,152,0,3,22,168,0,3,22,192,0,3,22,208,0,3,22,224, + 0,3,23,80,0,3,23,96,0,3,23,120,0,3,23,144,0,3,23,168,0,3,23,192,0,3,23,216,0,3,23,240,0,3,24,12,0,3,24,28, + 0,3,24,56,0,3,24,72,0,3,24,96,0,3,24,124,0,3,24,148,0,3,24,172,0,3,24,196,0,3,24,220,0,3,24,244,0,3,25,4, + 0,3,25,28,0,3,25,52,0,3,25,76,0,3,25,100,0,3,25,128,0,3,25,144,0,3,25,172,0,3,25,196,0,3,25,220,0,3,25,244, + 0,3,26,12,0,3,26,36,0,3,26,52,0,3,26,76,0,3,26,100,0,3,26,124,0,3,26,148,0,3,26,172,0,3,26,196,0,3,26,224, + 0,3,26,240,0,3,27,12,0,3,27,36,0,3,27,52,0,3,27,68,0,3,27,92,0,3,27,116,0,3,27,140,0,3,27,164,0,3,27,188, + 0,3,27,216,0,3,27,232,0,3,28,4,0,3,28,20,0,3,28,44,0,3,28,60,0,3,28,168,0,3,28,168,0,3,28,168,0,3,28,168, + 0,3,28,168,0,3,28,168,0,3,28,168,0,3,28,168,0,3,28,168,0,3,28,168,0,3,28,168,0,3,28,168,0,3,28,168,0,3,28,168, + 0,3,28,168,0,3,28,168,0,3,28,168,0,3,28,212,0,3,28,228,0,3,29,16,0,3,29,60,0,3,29,104,0,3,29,144,0,3,29,168, + 0,3,29,192,0,3,29,252,0,3,30,56,0,3,30,112,0,3,30,148,0,3,30,240,0,3,31,76,0,3,31,168,0,3,31,220,0,3,32,52, + 0,3,32,184,0,3,32,248,0,3,33,20,0,3,33,60,0,3,33,124,0,3,33,208,0,3,33,232,0,3,33,232,0,3,33,232,0,3,33,232, + 0,3,33,232,0,3,33,232,0,3,33,232,0,3,33,232,0,3,33,232,0,3,35,116,0,3,36,132,0,3,36,164,0,3,36,188,0,3,36,220, + 0,3,36,248,0,3,37,16,0,3,37,48,0,3,37,84,0,3,37,196,0,3,38,56,0,3,38,104,0,3,38,132,0,3,39,0,0,3,39,20, + 0,3,39,116,0,3,39,212,0,3,40,0,0,3,40,36,0,3,40,64,0,3,40,136,0,3,40,184,0,3,40,232,0,3,41,0,0,3,41,24, + 0,3,41,52,0,3,41,160,0,3,41,216,0,3,42,8,0,3,42,56,0,3,42,76,0,3,42,124,0,3,42,148,0,3,42,176,0,3,42,212, + 0,3,43,52,0,3,43,72,0,3,43,156,0,3,43,208,0,3,43,248,0,3,44,56,0,3,44,132,0,3,44,168,0,3,44,228,0,3,45,72, + 0,3,45,120,0,3,45,180,0,3,45,180,0,3,45,180,0,3,45,180,0,3,45,180,0,3,45,180,0,3,45,180,0,3,45,180,0,3,45,180, + 0,3,45,180,0,3,45,180,0,3,45,180,0,3,45,180,0,3,46,8,0,3,46,76,0,3,47,88,0,3,47,188,0,3,48,76,0,3,48,116, + 0,3,49,36,0,3,49,176,0,3,49,228,0,3,50,0,0,3,50,40,0,3,50,96,0,3,50,156,0,3,51,16,0,3,51,36,0,3,51,56, + 0,3,51,76,0,3,51,96,0,3,51,116,0,3,51,136,0,3,51,156,0,3,51,176,0,3,51,196,0,3,51,216,0,3,51,236,0,3,52,0, + 0,3,52,20,0,3,52,40,0,3,52,60,0,3,52,80,0,3,52,100,0,3,52,120,0,3,52,140,0,3,52,160,0,3,52,180,0,3,52,200, + 0,3,52,220,0,3,52,240,0,3,53,4,0,3,53,24,0,3,53,44,0,3,53,64,0,3,53,180,0,3,54,100,0,3,54,244,0,3,55,52, + 0,3,55,156,0,3,56,32,0,3,56,164,0,3,57,136,0,3,58,88,0,3,59,4,0,3,59,104,0,3,59,128,0,3,61,52,0,3,61,124, + 0,3,61,212,0,3,63,96,0,3,63,252,0,3,64,148,0,3,65,40,0,3,65,148,0,3,66,52,0,3,66,196,0,3,66,248,0,3,67,120, + 0,3,67,224,0,3,68,4,0,3,68,36,0,3,68,76,0,3,68,116,0,3,68,172,0,3,68,240,0,3,69,40,0,3,69,232,0,3,70,192, + 0,3,71,56,0,3,71,80,0,3,72,120,0,3,73,20,0,3,73,172,0,3,73,188,0,3,73,208,0,3,73,232,0,3,75,40,0,3,76,24, + 0,3,76,104,0,3,76,196,0,3,77,36,0,3,77,208,0,3,78,100,0,3,79,68,0,3,79,196,0,3,80,64,0,3,80,132,0,3,83,44, + 0,3,83,212,0,3,84,136,0,3,84,248,0,3,85,152,0,3,86,176,0,3,87,172,0,3,88,92,0,3,89,116,0,3,90,28,0,3,90,188, + 0,3,91,28,0,3,91,168,0,3,91,252,0,3,92,60,0,3,92,168,0,3,92,184,0,3,92,200,0,3,93,188,0,3,93,240,0,3,94,0, + 0,3,94,16,0,3,95,8,0,3,95,204,0,3,96,84,0,3,96,208,0,3,97,152,0,3,98,120,0,3,98,164,0,3,99,232,0,3,100,60, + 0,3,100,224,0,3,101,112,0,3,101,252,0,3,102,116,0,3,102,188,0,3,103,48,0,3,103,180,0,3,104,72,0,3,104,188,0,3,104,236, + 0,3,105,48,0,3,105,132,0,3,105,244,0,3,106,44,0,3,106,100,0,3,106,144,0,3,107,20,0,3,107,196,0,3,108,100,0,3,108,156, + 0,3,109,4,0,3,109,156,0,3,109,236,0,3,110,12,0,3,110,44,0,3,110,84,0,3,110,116,0,3,110,148,0,3,110,180,0,3,110,212, + 0,3,110,244,0,3,111,20,0,3,111,52,0,3,111,84,0,3,111,116,0,3,111,148,0,3,111,180,0,3,111,212,0,3,111,236,0,3,111,252, + 0,3,112,20,0,3,112,52,0,3,112,76,0,3,112,92,0,3,112,116,0,3,112,148,0,3,112,188,0,3,112,212,0,3,112,228,0,3,112,252, + 0,3,113,28,0,3,113,44,0,3,113,60,0,3,113,76,0,3,113,92,0,3,113,108,0,3,113,132,0,3,113,164,0,3,113,188,0,3,113,204, + 0,3,113,228,0,3,114,4,0,3,114,44,0,3,114,68,0,3,114,84,0,3,114,108,0,3,114,140,0,3,114,156,0,3,114,172,0,3,114,188, + 0,3,114,204,0,3,115,80,0,3,116,204,0,3,117,172,0,3,117,188,0,3,117,204,0,3,118,56,0,3,118,88,0,3,119,8,0,3,119,184, + 0,3,120,104,0,3,121,24,0,3,122,56,0,3,123,92,0,3,123,140,0,3,123,188,0,3,123,236,0,3,124,28,0,3,124,104,0,3,124,180, + 0,3,125,92,0,3,126,4,0,3,126,80,0,3,126,156,0,3,126,232,0,3,127,52,0,3,127,124,0,3,127,200,0,3,128,4,0,3,128,64, + 0,3,129,4,0,3,129,64,0,3,129,148,0,3,130,20,0,3,130,160,0,3,131,100,0,3,132,40,0,3,133,60,0,3,133,156,0,3,133,228, + 0,3,134,28,0,3,134,84,0,3,134,140,0,3,134,196,0,3,134,252,0,3,135,52,0,3,135,184,0,3,136,56,0,3,136,116,0,3,136,224, + 0,3,137,136,0,3,138,48,0,3,138,160,0,3,139,16,0,3,139,56,0,3,139,96,0,3,139,212,0,3,140,68,0,3,140,104,0,3,140,140, + 0,3,140,168,0,3,140,196,0,3,140,224,0,3,141,40,0,3,141,112,0,3,141,184,0,3,142,0,0,3,142,28,0,3,142,56,0,3,142,160, + 0,3,143,32,0,3,143,136,0,3,143,200,0,3,144,8,0,3,144,72,0,3,144,136,0,3,144,228,0,3,145,64,0,3,145,128,0,3,145,192, + 0,3,146,0,0,3,146,64,0,3,146,128,0,3,146,192,0,3,147,28,0,3,147,120,0,3,147,208,0,3,148,40,0,3,148,112,0,3,148,184, + 0,3,149,4,0,3,149,80,0,3,149,140,0,3,149,200,0,3,150,12,0,3,150,80,0,3,150,144,0,3,150,208,0,3,151,52,0,3,151,136, + 0,3,151,232,0,3,152,72,0,3,152,180,0,3,153,52,0,3,153,136,0,3,153,204,0,3,154,16,0,3,154,108,0,3,155,72,0,3,155,100, + 0,3,155,196,0,3,156,8,0,3,156,80,0,3,156,172,0,3,157,4,0,3,157,96,0,3,157,208,0,3,158,4,0,3,158,56,0,3,158,136, + 0,3,158,196,0,3,159,152,0,3,160,48,0,3,160,100,0,3,160,204,0,3,161,140,0,3,161,240,0,3,162,32,0,3,162,132,0,3,163,40, + 0,3,163,124,0,3,163,224,0,3,164,132,0,3,164,216,0,3,165,0,0,3,165,68,0,3,165,136,0,3,166,32,0,3,166,76,0,3,166,136, + 0,3,167,28,0,3,167,44,0,3,167,64,0,3,167,140,0,3,167,160,0,3,167,176,0,3,168,16,0,3,168,40,0,3,168,64,0,3,168,216, + 0,3,169,144,0,3,169,176,0,3,169,212,0,3,170,128,0,3,171,44,0,3,171,72,0,3,171,180,0,3,171,220,0,3,172,160,0,3,172,204, + 0,3,172,244,0,3,173,52,0,3,173,116,0,3,173,196,0,3,173,220,0,3,173,252,0,3,174,200,0,3,176,0,0,3,177,168,0,3,178,72, + 0,3,179,16,0,3,179,216,0,3,179,252,0,3,180,32,0,3,180,60,0,3,180,104,0,3,180,128,0,3,180,180,0,3,180,228,0,3,181,4, + 0,3,181,100,0,3,181,196,0,3,182,64,0,3,182,136,0,3,182,232,0,3,183,72,0,3,183,180,0,3,184,28,0,3,184,156,0,3,185,16, + 0,3,185,164,0,3,186,52,0,3,187,40,0,3,187,200,0,3,188,120,0,3,189,96,0,3,189,212,0,3,190,44,0,3,190,232,0,3,191,92, + 0,3,191,116,0,3,191,148,0,3,191,180,0,3,191,212,0,3,191,248,0,3,192,24,0,3,192,116,0,3,192,224,0,3,193,40,0,3,193,108, + 0,3,193,172,0,3,193,248,0,3,194,60,0,3,195,28,0,3,195,160,0,3,196,44,0,3,196,184,0,3,197,16,0,3,197,112,0,3,197,220, + 0,3,198,108,0,3,198,248,0,3,199,64,0,3,199,128,0,3,199,232,0,3,200,76,0,3,200,148,0,3,200,216,0,3,201,96,0,3,201,204, + 0,3,202,32,0,3,202,116,0,3,202,224,0,3,203,76,0,3,203,204,0,3,204,68,0,3,204,248,0,3,205,172,0,3,205,240,0,3,206,56, + 0,3,206,196,0,3,207,76,0,3,207,136,0,3,207,192,0,3,208,20,0,3,208,100,0,3,208,244,0,3,209,128,0,3,209,240,0,3,210,96, + 0,3,210,164,0,3,210,232,0,3,211,84,0,3,211,192,0,3,212,20,0,3,212,100,0,3,212,224,0,3,213,96,0,3,213,204,0,3,214,56, + 0,3,214,152,0,3,214,176,0,3,215,16,0,3,215,80,0,3,215,148,0,3,215,200,0,3,215,252,0,3,216,36,0,3,216,72,0,3,217,20, + 0,3,217,200,0,3,218,152,0,3,219,84,0,3,220,8,0,3,220,240,0,3,221,212,0,3,222,148,0,3,223,72,0,3,223,152,0,3,223,212, + 0,3,224,56,0,3,224,112,0,3,224,172,0,3,224,208,0,3,224,248,0,3,225,28,0,3,225,64,0,3,225,112,0,3,225,160,0,3,225,208, + 0,3,226,16,0,3,226,76,0,3,226,144,0,3,226,236,0,3,227,64,0,3,227,172,0,3,228,48,0,3,228,184,0,3,228,232,0,3,229,20, + 0,3,229,76,0,3,229,132,0,3,229,240,0,3,230,92,0,3,230,172,0,3,230,240,0,3,231,20,0,3,231,72,0,3,231,128,0,3,231,180, + 0,3,232,8,0,3,232,56,0,3,232,100,0,3,232,144,0,3,232,244,0,3,233,84,0,3,233,100,0,3,233,144,0,3,233,196,0,3,234,48, + 0,3,234,116,0,3,234,180,0,3,234,244,0,3,235,32,0,3,235,80,0,3,235,180,0,3,235,236,0,3,236,36,0,3,236,168,0,3,237,44, + 0,3,237,164,0,3,238,28,0,3,238,120,0,3,238,220,0,3,239,20,0,3,239,72,0,3,239,176,0,3,240,16,0,3,240,104,0,3,240,188, + 0,3,240,244,0,3,241,44,0,3,241,128,0,3,241,212,0,3,242,104,0,3,242,252,0,3,243,100,0,3,243,204,0,3,244,24,0,3,244,100, + 0,3,244,220,0,3,245,84,0,3,245,220,0,3,246,100,0,3,246,188,0,3,247,20,0,3,247,136,0,3,247,248,0,3,248,28,0,3,248,60, + 0,3,248,96,0,3,248,132,0,3,248,248,0,3,249,96,0,3,249,184,0,3,249,208,0,3,250,68,0,3,250,164,0,3,251,24,0,3,251,132, + 0,3,251,248,0,3,252,96,0,3,252,188,0,3,253,48,0,3,253,148,0,3,253,200,0,3,254,64,0,3,254,108,0,3,254,164,0,3,254,212, + 0,3,255,0,0,3,255,24,0,3,255,56,0,3,255,144,0,3,255,176,0,3,255,208,0,3,255,240,0,4,0,16,0,4,0,56,0,4,0,96, + 0,4,0,136,0,4,0,176,0,4,0,208,0,4,1,36,0,4,2,32,0,4,2,68,0,4,2,104,0,4,2,136,0,4,2,168,0,4,2,200, + 0,4,3,32,0,4,3,120,0,4,3,196,0,4,3,252,0,4,4,104,0,4,4,200,0,4,9,128,0,4,9,236,0,4,10,96,0,4,10,112, + 0,4,10,128,0,4,10,144,0,4,10,160,0,4,10,208,0,4,11,28,0,4,11,96,0,4,11,152,0,4,11,180,0,4,11,236,0,4,12,36, + 0,4,12,64,0,4,12,120,0,4,12,152,0,4,12,180,0,4,12,216,0,4,12,252,0,4,13,24,0,4,13,56,0,4,13,108,0,4,13,196, + 0,4,13,252,0,4,14,24,0,4,14,80,0,4,14,168,0,4,14,220,0,4,14,248,0,4,15,76,0,4,15,120,0,4,16,32,0,4,16,48, + 0,4,16,156,0,4,17,16,0,4,17,56,0,4,18,168,0,4,20,172,0,4,23,60,0,4,24,204,0,4,26,216,0,4,29,60,0,4,30,180, + 0,4,33,176,0,4,36,24,0,4,38,132,0,4,38,160,0,4,38,188,0,4,38,216,0,4,38,244,0,4,39,40,0,4,39,96,0,4,39,152, + 0,4,39,212,0,4,40,12,0,4,40,76,0,4,40,148,0,4,40,224,0,4,41,4,0,4,41,40,0,4,41,76,0,4,41,112,0,4,41,148, + 0,4,41,184,0,4,41,220,0,4,42,0,0,4,42,32,0,4,42,68,0,4,42,104,0,4,42,140,0,4,42,172,0,4,42,204,0,4,42,236, + 0,4,43,16,0,4,43,56,0,4,43,96,0,4,43,140,0,4,43,184,0,4,43,224,0,4,44,16,0,4,44,60,0,4,44,100,0,4,44,140, + 0,4,44,180,0,4,44,224,0,4,45,12,0,4,45,52,0,4,45,100,0,4,45,144,0,4,45,184,0,4,45,224,0,4,46,12,0,4,46,56, + 0,4,46,96,0,4,46,136,0,4,46,180,0,4,46,224,0,4,47,8,0,4,47,44,0,4,47,88,0,4,47,132,0,4,47,172,0,4,47,212, + 0,4,48,0,0,4,48,44,0,4,48,84,0,4,48,132,0,4,48,184,0,4,48,236,0,4,49,32,0,4,49,84,0,4,49,136,0,4,49,188, + 0,4,49,244,0,4,50,44,0,4,50,100,0,4,50,156,0,4,50,208,0,4,51,4,0,4,51,56,0,4,51,108,0,4,51,160,0,4,51,196, + 0,4,51,240,0,4,52,28,0,4,52,72,0,4,52,112,0,4,52,152,0,4,52,196,0,4,52,240,0,4,53,36,0,4,53,80,0,4,53,124, + 0,4,53,176,0,4,53,220,0,4,54,8,0,4,54,60,0,4,54,104,0,4,54,148,0,4,54,200,0,4,54,248,0,4,55,44,0,4,55,112, + 0,4,55,160,0,4,55,212,0,4,56,20,0,4,56,72,0,4,56,120,0,4,56,184,0,4,56,236,0,4,57,28,0,4,57,92,0,4,57,164, + 0,4,57,232,0,4,58,68,0,4,58,120,0,4,58,176,0,4,58,224,0,4,59,20,0,4,59,52,0,4,59,80,0,4,59,144,0,4,59,172, + 0,4,59,200,0,4,59,228,0,4,60,0,0,4,60,28,0,4,60,56,0,4,60,84,0,4,60,112,0,4,60,148,0,4,60,188,0,4,60,224, + 0,4,61,8,0,4,61,28,0,4,61,56,0,4,61,84,0,4,61,112,0,4,61,140,0,4,61,168,0,4,61,196,0,4,61,224,0,4,61,252, + 0,4,62,24,0,4,62,52,0,4,62,80,0,4,62,108,0,4,62,136,0,4,62,164,0,4,62,192,0,4,62,212,0,4,63,136,0,4,66,156, + 0,4,67,68,0,4,67,88,0,4,67,108,0,4,67,136,0,4,67,164,0,4,67,192,0,4,67,228,0,4,68,12,0,4,68,48,0,4,68,84, + 0,4,68,112,0,4,68,152,0,4,68,188,0,4,68,216,0,4,69,4,0,4,69,88,0,4,69,112,0,4,69,200,0,4,70,40,0,4,71,100, + 0,4,71,236,0,4,72,116,0,4,74,52,0,4,74,80,0,4,74,124,0,4,74,152,0,4,74,196,0,4,74,224,0,4,75,12,0,4,75,44, + 0,4,75,96,0,4,75,124,0,4,75,164,0,4,75,192,0,4,75,232,0,4,76,4,0,4,76,48,0,4,76,76,0,4,76,120,0,4,76,148, + 0,4,76,192,0,4,76,220,0,4,77,8,0,4,77,36,0,4,77,80,0,4,77,108,0,4,77,152,0,4,77,180,0,4,77,224,0,4,77,252, + 0,4,78,40,0,4,78,72,0,4,78,124,0,4,78,192,0,4,79,80,0,4,79,164,0,4,80,12,0,4,81,4,0,4,81,184,0,4,82,116, + 0,4,82,216,0,4,83,48,0,4,83,136,0,4,83,228,0,4,84,64,0,4,84,168,0,4,84,248,0,4,85,32,0,4,85,72,0,4,85,132, + 0,4,85,252,0,4,86,80,0,4,86,164,0,4,86,208,0,4,86,252,0,4,87,40,0,4,87,88,0,4,87,156,0,4,87,224,0,4,87,252, + 0,4,88,24,0,4,88,48,0,4,88,72,0,4,88,144,0,4,88,188,0,4,88,232,0,4,89,16,0,4,89,56,0,4,89,116,0,4,89,184, + 0,4,89,228,0,4,90,12,0,4,90,120,0,4,90,184,0,4,90,248,0,4,91,56,0,4,91,120,0,4,91,248,0,4,92,120,0,4,92,248, + 0,4,93,120,0,4,93,160,0,4,93,200,0,4,93,240,0,4,94,28,0,4,94,56,0,4,94,100,0,4,94,128,0,4,94,168,0,4,95,152, + 0,4,96,4,0,4,96,188,0,4,105,160,0,4,108,132,0,4,108,188,0,4,109,32,0,4,109,112,0,4,109,212,0,4,110,104,0,4,111,52, + 0,4,112,0,0,4,112,100,0,4,113,8,0,4,115,140,0,4,118,108,0,4,118,164,0,4,119,28,0,4,119,144,0,4,119,232,0,4,121,72, + 0,4,122,244,0,4,123,60,0,4,123,112,0,4,124,100,0,4,125,56,0,4,125,208,0,4,126,104,0,4,127,44,0,4,127,244,0,4,128,184, + 0,4,129,124,0,4,133,4,0,4,133,128,0,4,134,164,0,4,136,68,0,4,139,172,0,4,140,44,0,4,140,180,0,4,141,40,0,4,141,140, + 0,4,142,16,0,4,142,160,0,4,143,232,0,4,145,24,0,4,145,180,0,4,146,72,0,4,146,252,0,4,147,28,0,4,147,60,0,4,147,92, + 0,4,147,124,0,4,147,156,0,4,147,188,0,4,147,220,0,4,147,252,0,4,149,112,0,4,150,76,0,4,151,40,0,4,151,212,0,4,152,240, + 0,4,153,132,0,4,154,20,0,4,154,204,0,4,155,68,0,4,155,188,0,4,156,48,0,4,156,136,0,4,156,228,0,4,157,120,0,4,158,36, + 0,4,158,140,0,4,159,0,0,4,159,152,0,4,159,252,0,4,160,188,0,4,161,156,0,4,162,108,0,4,162,224,0,4,163,132,0,4,163,224, + 0,4,164,124,0,4,165,104,0,4,165,232,0,4,167,16,0,4,169,60,0,4,169,216,0,4,170,244,0,4,172,60,0,4,173,80,0,4,174,228, + 0,4,175,220,0,4,176,92,0,4,177,36,0,4,178,12,0,4,178,160,0,4,179,20,0,4,179,184,0,4,180,0,0,4,180,160,0,4,181,104, + 0,4,181,188,0,4,181,236,0,4,183,16,0,4,183,252,0,4,184,60,0,4,184,152,0,4,184,252,0,4,185,92,0,4,185,176,0,4,185,252, + 0,4,186,144,0,4,187,80,0,4,188,56,0,4,190,68,0,4,191,56,0,4,192,92,0,4,193,152,0,4,194,152,0,4,195,188,0,4,196,240, + 0,4,197,224,0,4,198,180,0,4,199,192,0,4,200,248,0,4,202,80,0,4,203,84,0,4,203,240,0,4,204,96,0,4,205,20,0,4,206,8, + 0,4,207,64,0,4,208,188,0,4,210,124,0,4,211,24,0,4,211,216,0,4,212,64,0,4,212,204,0,4,212,232,0,4,213,16,0,4,213,40, + 0,4,213,64,0,4,213,88,0,4,213,112,0,4,213,240,0,4,214,64,0,4,214,196,0,4,215,188,0,4,216,104,0,4,217,140,0,4,218,72, + 0,4,218,208,0,4,219,116,0,4,220,124,0,4,222,100,0,4,225,40,0,4,226,232,0,4,227,108,0,4,227,184,0,4,228,152,0,4,229,128, + 0,4,230,104,0,4,230,248,0,4,231,216,0,4,232,236,0,4,233,200,0,4,234,164,0,4,235,24,0,4,235,96,0,4,235,216,0,4,236,220, + 0,4,238,40,0,4,239,108,0,4,239,168,0,4,240,44,0,4,240,132,0,4,240,224,0,4,241,56,0,4,241,168,0,4,242,16,0,4,242,120, + 0,4,242,224,0,4,243,136,0,4,244,104,0,4,245,124,0,4,246,236,0,4,247,132,0,4,249,20,0,4,250,120,0,4,252,4,0,4,255,196, + 0,5,1,80,0,5,2,200,0,5,3,84,0,5,4,4,0,5,6,188,0,5,8,92,0,5,9,116,0,5,10,96,0,5,11,116,0,5,12,92, + 0,5,12,228,0,5,13,72,0,5,13,176,0,5,13,244,0,5,14,52,0,5,15,0,0,5,15,248,0,5,16,120,0,5,16,172,0,5,16,232, + 0,5,17,44,0,5,17,92,0,5,17,188,0,5,18,60,0,5,19,32,0,5,19,184,0,5,20,116,0,5,21,244,0,5,23,120,0,5,26,216, + 0,5,27,56,0,5,27,232,0,5,28,80,0,5,28,220,0,5,29,108,0,5,30,44,0,5,30,184,0,5,31,56,0,5,31,180,0,5,32,36, + 0,5,32,120,0,5,32,224,0,5,33,68,0,5,33,156,0,5,34,96,0,5,34,164,0,5,34,252,0,5,35,76,0,5,35,188,0,5,36,120, + 0,5,38,36,0,5,40,24,0,5,41,68,0,5,43,116,0,5,44,212,0,5,47,76,0,5,52,160,0,5,53,216,0,5,56,40,0,5,56,236, + 0,5,57,180,0,5,58,136,0,5,60,12,0,5,61,140,0,5,62,236,0,5,64,76,0,5,65,152,0,5,67,4,0,5,67,112,0,5,67,220, + 0,5,68,68,0,5,68,172,0,5,69,16,0,5,69,44,0,5,69,72,0,5,69,100,0,5,69,164,0,5,69,240,0,5,70,8,0,5,70,32, + 0,5,70,252,0,5,71,148,0,5,72,80,0,5,72,192,0,5,73,52,0,5,74,84,0,5,75,60,0,5,75,168,0,5,76,24,0,5,76,84, + 0,5,76,144,0,5,76,184,0,5,76,228,0,5,77,12,0,5,77,56,0,5,77,96,0,5,77,140,0,5,77,184,0,5,77,228,0,5,78,72, + 0,5,78,172,0,5,79,40,0,5,79,212,0,5,81,20,0,5,81,156,0,5,82,180,0,5,84,72,0,5,84,188,0,5,87,8,0,5,88,148, + 0,5,90,8,0,5,90,220,0,5,91,224,0,5,92,248,0,5,93,212,0,5,94,212,0,5,95,236,0,5,96,184,0,5,97,228,0,5,98,252, + 0,5,100,44,0,5,100,172,0,5,101,92,0,5,102,36,0,5,102,176,0,5,103,96,0,5,104,40,0,5,104,160,0,5,105,120,0,5,106,64, + 0,5,107,4,0,5,107,52,0,5,107,96,0,5,107,140,0,5,107,184,0,5,107,232,0,5,108,116,0,5,108,156,0,5,108,196,0,5,109,24, + 0,5,109,108,0,5,109,148,0,5,109,196,0,5,109,244,0,5,110,20,0,5,110,100,0,5,110,180,0,5,110,224,0,5,111,16,0,5,111,88, + 0,5,111,160,0,5,111,244,0,5,112,68,0,5,112,144,0,5,112,224,0,5,113,56,0,5,113,144,0,5,113,252,0,5,114,160,0,5,114,248, + 0,5,115,64,0,5,115,152,0,5,116,36,0,5,116,164,0,5,117,48,0,5,118,0,0,5,118,144,0,5,119,184,0,5,120,228,0,5,121,112, + 0,5,121,208,0,5,122,48,0,5,122,108,0,5,122,160,0,5,122,212,0,5,122,252,0,5,123,36,0,5,123,60,0,5,123,84,0,5,123,172, + 0,5,124,0,0,5,124,196,0,5,125,132,0,5,126,128,0,5,127,48,0,5,127,224,0,5,129,0,0,5,129,64,0,5,129,128,0,5,129,220, + 0,5,130,24,0,5,130,84,0,5,130,160,0,5,130,236,0,5,131,112,0,5,131,112,0,5,131,132,0,5,131,152,0,5,131,180,0,5,131,200, + 0,5,131,228,0,5,132,0,0,5,132,36,0,5,132,56,0,5,132,84,0,5,132,112,0,5,132,148,0,5,132,176,0,5,132,212,0,5,132,248, + 0,5,133,36,0,5,133,56,0,5,133,84,0,5,133,112,0,5,133,148,0,5,133,176,0,5,133,212,0,5,133,248,0,5,134,36,0,5,134,64, + 0,5,134,100,0,5,134,136,0,5,134,180,0,5,134,216,0,5,135,4,0,5,135,48,0,5,135,100,0,5,135,120,0,5,135,148,0,5,135,176, + 0,5,135,212,0,5,135,240,0,5,136,20,0,5,136,56,0,5,136,100,0,5,136,128,0,5,136,164,0,5,136,200,0,5,136,244,0,5,137,24, + 0,5,137,68,0,5,137,112,0,5,137,164,0,5,137,192,0,5,137,228,0,5,138,8,0,5,138,52,0,5,138,88,0,5,138,132,0,5,138,176, + 0,5,138,228,0,5,139,8,0,5,139,52,0,5,139,96,0,5,139,148,0,5,139,192,0,5,139,244,0,5,140,40,0,5,140,100,0,5,140,120, + 0,5,140,148,0,5,140,176,0,5,140,212,0,5,140,240,0,5,141,20,0,5,141,56,0,5,141,100,0,5,141,128,0,5,141,164,0,5,141,200, + 0,5,141,244,0,5,142,24,0,5,142,68,0,5,142,112,0,5,142,164,0,5,142,192,0,5,142,228,0,5,143,8,0,5,143,52,0,5,143,88, + 0,5,143,132,0,5,143,176,0,5,143,228,0,5,144,8,0,5,144,52,0,5,144,96,0,5,144,148,0,5,144,192,0,5,144,244,0,5,145,40, + 0,5,145,100,0,5,145,128,0,5,145,164,0,5,145,200,0,5,145,244,0,5,146,24,0,5,146,68,0,5,146,112,0,5,146,164,0,5,146,200, + 0,5,146,244,0,5,147,32,0,5,147,84,0,5,147,128,0,5,147,180,0,5,147,232,0,5,148,36,0,5,148,72,0,5,148,116,0,5,148,160, + 0,5,148,212,0,5,149,0,0,5,149,52,0,5,149,104,0,5,149,164,0,5,149,208,0,5,150,4,0,5,150,56,0,5,150,116,0,5,150,168, + 0,5,150,228,0,5,151,32,0,5,151,100,0,5,151,120,0,5,151,148,0,5,151,176,0,5,151,212,0,5,151,240,0,5,152,20,0,5,152,56, + 0,5,152,100,0,5,152,128,0,5,152,164,0,5,152,200,0,5,152,244,0,5,153,24,0,5,153,68,0,5,153,112,0,5,153,164,0,5,153,192, + 0,5,153,228,0,5,154,8,0,5,154,52,0,5,154,88,0,5,154,132,0,5,154,176,0,5,154,228,0,5,155,8,0,5,155,52,0,5,155,96, + 0,5,155,148,0,5,155,192,0,5,155,244,0,5,156,40,0,5,156,100,0,5,156,128,0,5,156,164,0,5,156,200,0,5,156,244,0,5,157,24, + 0,5,157,68,0,5,157,112,0,5,157,164,0,5,157,200,0,5,157,244,0,5,158,32,0,5,158,84,0,5,158,128,0,5,158,180,0,5,158,232, + 0,5,159,36,0,5,159,72,0,5,159,116,0,5,159,160,0,5,159,212,0,5,160,0,0,5,160,52,0,5,160,104,0,5,160,164,0,5,160,208, + 0,5,161,4,0,5,161,56,0,5,161,116,0,5,161,168,0,5,161,228,0,5,162,32,0,5,162,100,0,5,162,128,0,5,162,164,0,5,162,200, + 0,5,162,244,0,5,163,24,0,5,163,68,0,5,163,112,0,5,163,164,0,5,163,200,0,5,163,244,0,5,164,32,0,5,164,84,0,5,164,128, + 0,5,164,180,0,5,164,232,0,5,165,36,0,5,165,72,0,5,165,116,0,5,165,160,0,5,165,212,0,5,166,0,0,5,166,52,0,5,166,104, + 0,5,166,164,0,5,166,208,0,5,167,4,0,5,167,56,0,5,167,116,0,5,167,168,0,5,167,228,0,5,168,32,0,5,168,100,0,5,168,136, + 0,5,168,180,0,5,168,224,0,5,169,20,0,5,169,64,0,5,169,116,0,5,169,168,0,5,169,228,0,5,170,16,0,5,170,68,0,5,170,120, + 0,5,170,180,0,5,170,232,0,5,171,36,0,5,171,96,0,5,171,164,0,5,171,208,0,5,172,4,0,5,172,56,0,5,172,116,0,5,172,168, + 0,5,172,228,0,5,173,32,0,5,173,100,0,5,173,152,0,5,173,212,0,5,174,16,0,5,174,84,0,5,174,144,0,5,174,212,0,5,175,24, + 0,5,175,100,0,5,175,176,0,5,175,252,0,5,176,68,0,5,176,136,0,5,177,84,0,5,178,28,0,5,179,0,0,5,179,224,0,5,180,44, + 0,5,180,104,0,5,180,164,0,5,180,216,0,5,181,12,0,5,181,52,0,5,181,104,0,5,181,156,0,5,181,188,0,5,182,4,0,5,182,92, + 0,5,183,28,0,5,183,240,0,5,184,212,0,5,184,252,0,5,185,100,0,5,185,224,0,5,186,76,0,5,186,248,0,5,187,152,0,5,188,12, + 0,5,188,156,0,5,189,48,0,5,189,212,0,5,190,88,0,5,190,240,0,5,191,108,0,5,191,244,0,5,192,120,0,5,192,216,0,5,193,56, + 0,5,193,72,0,5,193,96,0,5,193,128,0,5,193,188,0,5,193,244,0,5,194,12,0,5,194,36,0,5,194,60,0,5,194,84,0,5,194,108, + 0,5,194,132,0,5,195,84,0,5,196,32,0,5,196,112,0,5,196,192,0,5,197,132,0,5,198,64,0,5,198,164,0,5,199,0,0,5,199,132, + 0,5,200,4,0,5,200,148,0,5,201,36,0,5,201,128,0,5,201,228,0,5,202,76,0,5,202,176,0,5,202,236,0,5,203,40,0,5,203,64, + 0,5,203,88,0,5,203,156,0,5,203,228,0,5,204,44,0,5,204,124,0,5,204,244,0,5,205,112,0,5,206,4,0,5,206,156,0,5,207,32, + 0,5,207,104,0,5,207,172,0,5,208,16,0,5,208,112,0,5,208,196,0,5,209,24,0,5,209,144,0,5,210,4,0,5,210,228,0,5,211,196, + 0,5,212,148,0,5,213,100,0,5,213,176,0,5,213,248,0,5,214,64,0,5,214,136,0,5,214,208,0,5,215,24,0,5,215,116,0,5,215,156, + 0,5,215,196,0,5,215,236,0,5,216,24,0,5,216,68,0,5,216,112,0,5,216,156,0,5,216,212,0,5,217,12,0,5,217,64,0,5,217,120, + 0,5,217,176,0,5,217,228,0,5,218,16,0,5,218,60,0,5,218,104,0,5,218,144,0,5,218,192,0,5,218,240,0,5,219,32,0,5,219,80, + 0,5,219,252,0,5,220,32,0,5,220,92,0,5,220,160,0,5,220,200,0,5,220,244,0,5,221,48,0,5,221,84,0,5,221,144,0,5,221,216, + 0,5,222,24,0,5,222,136,0,5,222,228,0,5,224,32,0,5,224,208,0,5,225,44,0,5,225,60,0,5,225,140,0,5,225,204,0,5,226,12, + 0,5,226,64,0,5,226,116,0,5,227,12,0,5,227,92,0,5,227,148,0,5,227,244,0,5,228,64,0,5,228,176,0,5,229,16,0,5,229,112, + 0,5,229,152,0,5,229,192,0,5,230,64,0,5,230,140,0,5,231,8,0,5,231,60,0,5,231,80,0,5,231,124,0,5,232,40,0,5,232,128, + 0,5,232,232,0,5,233,92,0,5,233,208,0,5,234,108,0,5,234,180,0,5,235,28,0,5,235,152,0,5,236,20,0,5,236,80,0,5,236,180, + 0,5,237,48,0,5,237,188,0,5,238,28,0,5,238,124,0,5,238,188,0,5,239,44,0,5,239,152,0,5,239,224,0,5,240,76,0,5,240,184, + 0,5,241,92,0,5,241,188,0,5,241,252,0,5,242,64,0,5,242,148,0,5,242,228,0,5,243,68,0,5,243,164,0,5,244,12,0,5,244,128, + 0,5,244,196,0,5,245,56,0,5,245,152,0,5,245,244,0,5,246,80,0,5,246,160,0,5,246,236,0,5,247,120,0,5,247,236,0,5,248,180, + 0,5,249,152,0,5,250,64,0,5,250,232,0,5,251,160,0,5,251,248,0,5,252,8,0,5,252,24,0,5,252,40,0,5,252,56,0,5,253,36, + 0,5,253,168,0,5,254,56,0,5,254,152,0,5,255,40,0,5,255,248,0,6,1,0,0,6,1,100,0,6,1,204,0,6,2,44,0,6,2,244, + 0,6,3,96,0,6,3,204,0,6,4,40,0,6,4,56,0,6,4,140,0,6,5,84,0,6,6,16,0,6,6,32,0,6,6,96,0,6,6,112, + 0,6,6,240,0,6,7,76,0,6,7,236,0,6,8,184,0,6,9,96,0,6,10,68,0,6,10,164,0,6,10,252,0,6,11,132,0,6,12,80, + 0,6,13,52,0,6,14,56,0,6,14,140,0,6,14,156,0,6,15,216,0,6,16,88,0,6,16,104,0,6,16,172,0,6,17,24,0,6,17,220, + 0,6,18,48,0,6,19,28,0,6,19,92,0,6,19,216,0,6,19,240,0,6,20,16,0,6,20,48,0,6,20,80,0,6,20,112,0,6,20,128, + 0,6,20,152,0,6,20,176,0,6,20,200,0,6,20,224,0,6,20,248,0,6,21,16,0,6,21,40,0,6,21,64,0,6,21,88,0,6,21,112, + 0,6,21,136,0,6,21,160,0,6,21,184,0,6,21,208,0,6,21,232,0,6,22,0,0,6,22,24,0,6,22,48,0,6,22,72,0,6,22,96, + 0,6,22,120,0,6,22,144,0,6,22,168,0,6,22,192,0,6,22,216,0,6,22,240,0,6,23,8,0,6,23,32,0,6,23,56,0,6,23,80, + 0,6,23,104,0,6,23,128,0,6,23,152,0,6,23,176,0,6,23,200,0,6,23,224,0,6,23,248,0,6,24,16,0,6,24,40,0,6,24,64, + 0,6,24,88,0,6,24,112,0,6,24,136,0,6,24,160,0,6,24,184,0,6,24,208,0,6,24,232,0,6,25,0,0,6,25,24,0,6,25,48, + 0,6,25,72,0,6,25,96,0,6,25,120,0,6,25,144,0,6,25,168,0,6,25,192,0,6,25,216,0,6,25,240,0,6,26,8,0,6,26,32, + 0,6,26,56,0,6,26,80,0,6,26,104,0,6,26,128,0,6,26,144,0,6,26,160,0,6,26,232,0,6,26,248,0,6,27,8,0,6,27,44, + 0,6,27,60,0,6,27,76,0,6,27,132,0,6,27,148,0,6,27,164,0,6,27,180,0,6,27,196,0,6,27,212,0,6,27,228,0,6,27,244, + 0,6,28,4,0,6,28,20,0,6,28,36,0,6,28,52,0,6,28,152,0,6,28,168,0,6,28,184,0,6,28,200,0,6,28,216,0,6,29,20, + 0,6,29,36,0,6,29,52,0,6,29,68,0,6,29,180,0,6,29,196,0,6,29,212,0,6,29,228,0,6,30,20,0,6,30,36,0,6,30,52, + 0,6,30,68,0,6,30,176,0,6,30,192,0,6,31,48,0,6,31,76,0,6,31,112,0,6,31,136,0,6,31,160,0,6,31,212,0,6,32,0, + 0,6,32,44,0,6,32,84,0,6,32,100,0,6,32,116,0,6,32,132,0,6,32,148,0,6,33,112,0,6,34,32,0,6,34,56,0,6,34,80, + 0,6,34,200,0,6,35,48,0,6,35,128,0,6,36,8,0,6,36,104,0,6,36,196,0,6,37,4,0,6,37,68,0,6,37,136,0,6,37,200, + 0,6,37,224,0,6,37,248,0,6,38,108,0,6,38,224,0,6,39,0,0,6,39,32,0,6,40,168,0,6,41,8,0,6,41,108,0,6,41,164, + 0,6,41,228,0,6,42,92,0,6,42,108,0,6,42,148,0,6,42,188,0,6,42,228,0,6,43,12,0,6,43,52,0,6,43,92,0,6,43,132, + 0,6,43,172,0,6,43,212,0,6,43,248,0,6,44,24,0,6,44,60,0,6,44,96,0,6,44,132,0,6,44,164,0,6,44,208,0,6,44,252, + 0,6,45,40,0,6,45,84,0,6,45,104,0,6,45,172,0,6,45,240,0,6,46,32,0,6,46,80,0,6,46,148,0,6,46,236,0,6,47,112, + 0,6,48,0,0,6,48,16,0,6,48,160,0,6,48,204,0,6,48,220,0,6,49,64,0,6,50,28,0,6,50,164,0,6,51,84,0,6,51,176, + 0,6,52,68,0,6,52,140,0,6,53,8,0,6,53,100,0,6,53,244,0,6,54,88,0,6,54,240,0,6,55,0,0,6,55,16,0,6,55,88, + 0,6,55,160,0,6,55,204,0,6,55,244,0,6,56,36,0,6,56,80,0,6,56,216,0,6,57,92,0,6,58,20,0,6,58,184,0,6,59,20, + 0,6,59,128,0,6,59,248,0,6,60,144,0,6,61,28,0,6,61,132,0,6,61,224,0,6,62,72,0,6,62,160,0,6,63,12,0,6,63,44, + 0,6,63,76,0,6,63,148,0,6,63,216,0,6,63,232,0,6,64,16,0,6,64,108,0,6,64,192,0,6,64,208,0,6,65,48,0,6,65,108, + 0,6,65,184,0,6,66,72,0,6,66,252,0,6,67,92,0,6,67,184,0,6,68,36,0,6,68,148,0,6,69,40,0,6,69,128,0,6,70,24, + 0,6,70,172,0,6,70,244,0,6,71,4,0,6,71,48,0,6,71,120,0,6,71,180,0,6,71,208,0,6,72,28,0,6,72,72,0,6,72,104, + 0,6,72,140,0,6,72,176,0,6,72,212,0,6,72,244,0,6,73,8,0,6,73,28,0,6,73,48,0,6,73,68,0,6,73,104,0,6,73,124, + 0,6,73,144,0,6,73,164,0,6,73,184,0,6,73,220,0,6,73,240,0,6,74,4,0,6,74,24,0,6,74,44,0,6,74,80,0,6,74,100, + 0,6,74,120,0,6,74,140,0,6,74,168,0,6,74,208,0,6,77,124,0,6,80,44,0,6,82,216,0,6,85,136,0,6,85,220,0,6,86,68, + 0,6,86,184,0,6,87,96,0,6,87,188,0,6,88,44,0,6,88,176,0,6,89,48,0,6,89,132,0,6,89,232,0,6,90,152,0,6,91,4, + 0,6,91,100,0,6,91,216,0,6,92,60,0,6,92,148,0,6,93,32,0,6,93,112,0,6,93,240,0,6,94,88,0,6,95,8,0,6,95,104, + 0,6,95,252,0,6,96,100,0,6,96,216,0,6,97,64,0,6,97,192,0,6,98,20,0,6,98,136,0,6,99,0,0,6,99,84,0,6,99,204, + 0,6,100,60,0,6,100,180,0,6,101,44,0,6,101,144,0,6,102,0,0,6,102,132,0,6,103,24,0,6,103,164,0,6,104,116,0,6,104,200, + 0,6,105,40,0,6,105,152,0,6,105,240,0,6,106,84,0,6,106,184,0,6,107,24,0,6,107,124,0,6,107,236,0,6,108,92,0,6,108,180, + 0,6,109,12,0,6,109,112,0,6,109,232,0,6,110,104,0,6,110,248,0,6,111,112,0,6,111,248,0,6,112,112,0,6,112,244,0,6,113,132, + 0,6,113,252,0,6,114,132,0,6,115,8,0,6,115,124,0,6,116,44,0,6,116,208,0,6,117,80,0,6,118,48,0,6,118,240,0,6,119,112, + 0,6,120,104,0,6,121,52,0,6,121,220,0,6,122,120,0,6,123,40,0,6,123,240,0,6,124,8,0,6,124,60,0,6,124,84,0,6,124,160, + 0,6,125,12,0,6,125,52,0,6,125,132,0,6,125,216,0,6,126,4,0,6,126,76,0,6,126,136,0,6,126,232,0,6,127,16,0,6,127,40, + 0,6,127,64,0,6,127,96,0,6,127,128,0,6,127,152,0,6,127,176,0,6,127,200,0,6,127,224,0,6,127,248,0,6,128,16,0,6,128,40, + 0,6,128,68,0,6,128,92,0,6,128,116,0,6,128,144,0,6,128,168,0,6,128,192,0,6,128,216,0,6,128,240,0,6,129,8,0,6,129,32, + 0,6,129,56,0,6,129,80,0,6,129,104,0,6,129,128,0,6,129,152,0,6,129,176,0,6,129,200,0,6,129,224,0,6,129,248,0,6,130,16, + 0,6,130,40,0,6,130,172,0,6,130,196,0,6,130,220,0,6,130,244,0,6,131,12,0,6,131,36,0,6,131,60,0,6,131,84,0,6,131,108, + 0,6,131,132,0,6,131,156,0,6,131,180,0,6,131,204,0,6,131,228,0,6,131,252,0,6,132,20,0,6,132,44,0,6,132,68,0,6,132,92, + 0,6,132,116,0,6,132,140,0,6,132,164,0,6,132,188,0,6,132,212,0,6,132,236,0,6,133,4,0,6,133,28,0,6,133,52,0,6,133,76, + 0,6,133,100,0,6,133,124,0,6,133,148,0,6,133,172,0,6,133,196,0,6,133,220,0,6,133,244,0,6,134,12,0,6,134,36,0,6,134,60, + 0,6,134,84,0,6,134,108,0,6,134,132,0,6,134,156,0,6,134,180,0,6,134,204,0,6,134,228,0,6,134,252,0,6,135,20,0,6,135,44, + 0,6,135,68,0,6,135,92,0,6,135,116,0,6,135,140,0,6,135,164,0,6,135,188,0,6,135,212,0,6,135,236,0,6,136,4,0,6,136,28, + 0,6,136,52,0,6,136,76,0,6,136,92,0,6,137,8,0,6,137,24,0,6,137,40,0,6,137,64,0,6,137,88,0,6,137,112,0,6,137,136, + 0,6,137,160,0,6,137,184,0,6,137,208,0,6,137,232,0,6,138,0,0,6,138,24,0,6,138,48,0,6,138,72,0,6,138,88,0,6,138,208, + 0,6,138,232,0,6,139,0,0,6,139,24,0,6,139,48,0,6,139,64,0,6,139,228,0,6,139,244,0,6,140,4,0,6,140,28,0,6,140,52, + 0,6,140,76,0,6,140,100,0,6,140,124,0,6,140,148,0,6,140,196,0,6,141,4,0,6,141,20,0,6,141,36,0,6,141,60,0,6,141,84, + 0,6,141,84,0,6,141,84,0,6,141,84,0,6,141,84,0,6,141,84,0,6,141,84,0,6,141,84,0,6,141,84,0,6,141,84,0,6,141,84, + 0,6,141,84,0,6,141,84,0,6,141,84,0,6,141,84,0,6,141,84,0,6,141,84,0,6,141,124,0,6,141,164,0,6,141,236,0,6,142,52, + 0,6,142,72,0,6,142,96,0,6,142,116,0,6,142,168,0,6,142,188,0,6,142,208,0,6,142,232,0,6,142,252,0,6,143,20,0,6,143,40, + 0,6,143,64,0,6,143,84,0,6,143,108,0,6,143,128,0,6,143,152,0,6,143,168,0,6,143,192,0,6,143,216,0,6,143,240,0,6,144,8, + 0,6,144,32,0,6,144,56,0,6,144,80,0,6,144,104,0,6,144,128,0,6,144,152,0,6,144,176,0,6,144,200,0,6,144,216,0,6,145,12, + 0,6,145,36,0,6,145,60,0,6,145,84,0,6,145,108,0,6,145,132,0,6,145,156,0,6,145,180,0,6,145,204,0,6,145,228,0,6,145,252, + 0,6,146,20,0,6,146,44,0,6,146,68,0,6,146,92,0,6,146,116,0,6,146,140,0,6,146,164,0,6,146,188,0,6,146,204,0,6,147,96, + 0,6,147,200,0,6,148,76,0,6,148,100,0,6,148,124,0,6,148,148,0,6,148,172,0,6,148,188,0,6,149,32,0,6,149,56,0,6,149,80, + 0,6,149,96,0,6,149,180,0,6,149,204,0,6,149,228,0,6,149,244,0,6,150,200,0,6,151,88,0,6,151,248,0,6,152,16,0,6,152,40, + 0,6,152,64,0,6,152,88,0,6,152,104,0,6,153,68,0,6,153,208,0,6,154,116,0,6,154,140,0,6,154,164,0,6,154,188,0,6,154,212, + 0,6,154,228,0,6,155,104,0,6,155,212,0,6,156,88,0,6,156,112,0,6,156,136,0,6,156,160,0,6,156,184,0,6,156,200,0,6,157,80, + 0,6,157,168,0,6,158,56,0,6,158,80,0,6,158,104,0,6,158,128,0,6,158,152,0,6,158,176,0,6,158,200,0,6,158,224,0,6,158,248, + 0,6,159,16,0,6,159,40,0,6,159,64,0,6,159,88,0,6,159,104,0,6,160,52,0,6,160,160,0,6,161,40,0,6,161,56,0,6,161,172, + 0,6,161,224,0,6,162,36,0,6,162,52,0,6,162,212,0,6,163,68,0,6,163,212,0,6,163,236,0,6,164,4,0,6,164,28,0,6,164,52, + 0,6,164,68,0,6,164,188,0,6,165,120,0,6,166,8,0,6,166,24,0,6,166,172,0,6,166,188,0,6,167,96,0,6,167,120,0,6,167,144, + 0,6,167,168,0,6,167,192,0,6,167,216,0,6,167,240,0,6,168,8,0,6,168,32,0,6,168,56,0,6,168,80,0,6,168,164,0,6,169,12, + 0,6,169,12,0,6,169,12,0,6,169,12,0,6,169,12,0,6,169,12,0,6,169,152,0,6,169,212,0,6,170,76,0,6,170,120,0,6,170,200, + 0,6,171,8,0,6,171,56,0,6,171,100,0,6,171,160,0,6,172,60,0,6,172,88,0,6,172,144,0,6,172,184,0,6,172,248,0,6,173,40, + 0,6,173,132,0,6,174,20,0,6,174,92,0,6,174,148,0,6,174,252,0,6,175,84,0,6,175,140,0,6,175,184,0,6,175,224,0,6,176,36, + 0,6,176,160,0,6,176,216,0,6,177,88,0,6,177,156,0,6,177,228,0,6,178,8,0,6,178,80,0,6,178,96,0,6,178,140,0,6,178,156, + 0,6,178,208,0,6,179,8,0,6,179,36,0,6,179,64,0,6,179,92,0,6,179,120,0,6,179,148,0,6,179,188,0,6,179,228,0,6,180,16, + 0,6,180,56,0,6,180,96,0,6,180,140,0,6,180,180,0,6,180,220,0,6,181,4,0,6,181,44,0,6,181,84,0,6,181,128,0,6,181,168, + 0,6,181,208,0,6,181,252,0,6,182,36,0,6,182,76,0,6,182,116,0,6,182,156,0,6,182,196,0,6,182,240,0,6,183,24,0,6,183,64, + 0,6,183,108,0,6,183,148,0,6,183,188,0,6,183,228,0,6,184,12,0,6,184,52,0,6,184,96,0,6,184,136,0,6,184,176,0,6,184,220, + 0,6,185,4,0,6,185,44,0,6,185,84,0,6,185,124,0,6,185,164,0,6,185,208,0,6,185,248,0,6,186,32,0,6,186,76,0,6,186,116, + 0,6,186,156,0,6,186,196,0,6,186,236,0,6,187,20,0,6,187,64,0,6,187,104,0,6,187,144,0,6,187,188,0,6,187,228,0,6,188,12, + 0,6,188,52,0,6,188,92,0,6,188,132,0,6,188,176,0,6,188,216,0,6,189,0,0,6,189,44,0,6,189,84,0,6,189,124,0,6,189,164, + 0,6,189,204,0,6,189,244,0,6,190,32,0,6,190,72,0,6,190,112,0,6,190,156,0,6,190,196,0,6,190,236,0,6,191,20,0,6,191,60, + 0,6,191,100,0,6,191,144,0,6,191,184,0,6,191,224,0,6,192,12,0,6,192,52,0,6,192,92,0,6,192,132,0,6,192,208,0,6,193,96, + 0,6,193,204,0,6,194,12,0,6,194,72,0,6,194,212,0,6,195,16,0,6,195,92,0,6,195,160,0,6,195,208,0,6,196,44,0,6,196,200, + 0,6,197,100,0,6,197,156,0,6,198,16,0,6,198,76,0,6,198,180,0,6,199,8,0,6,199,80,0,6,199,244,0,6,200,144,0,6,201,8, + 0,6,201,164,0,6,202,28,0,6,202,132,0,6,203,76,0,6,203,192,0,6,203,248,0,6,204,84,0,6,204,152,0,6,204,228,0,6,205,160, + 0,6,206,20,0,6,206,160,0,6,207,60,0,6,207,216,0,6,208,36,0,6,208,240,0,6,209,76,0,6,209,192,0,6,209,252,0,6,210,92, + 0,6,210,176,0,6,211,0,0,6,211,68,0,6,211,84,0,6,211,100,0,6,211,116,0,6,211,132,0,6,211,148,0,6,211,164,0,6,211,180, + 0,6,211,196,0,6,211,212,0,6,211,228,0,6,211,244,0,6,212,4,0,6,212,20,0,6,212,36,0,6,212,52,0,6,212,68,0,6,212,84, + 0,6,212,100,0,6,212,116,0,6,212,132,0,6,212,148,0,6,212,164,0,6,212,180,0,6,212,196,0,6,212,212,0,6,212,228,0,6,212,244, + 0,6,213,4,0,6,213,20,0,6,213,36,0,6,213,52,0,6,213,68,0,6,213,84,0,6,213,100,0,6,213,116,0,6,213,132,0,6,213,148, + 0,6,213,164,0,6,213,180,0,6,213,196,0,6,213,212,0,6,213,228,0,6,213,244,0,6,214,4,0,6,214,20,0,6,214,36,0,6,214,52, + 0,6,214,68,0,6,214,84,0,6,214,100,0,6,214,116,0,6,214,132,0,6,214,240,0,6,215,48,0,6,215,192,0,6,216,84,0,6,216,160, + 0,6,217,16,0,6,217,156,0,6,217,216,0,6,218,180,0,6,219,64,0,6,219,80,0,6,219,96,0,6,219,112,0,6,219,128,0,6,219,144, + 0,6,219,160,0,6,219,176,0,6,219,192,0,6,219,208,0,6,219,224,0,6,220,12,0,6,220,68,0,6,220,192,0,6,221,124,0,6,222,120, + 0,6,223,180,0,6,225,48,0,6,226,228,0,6,227,96,0,6,228,28,0,6,229,28,0,6,230,88,0,6,231,212,0,6,233,144,0,6,235,132, + 0,6,236,64,0,6,237,60,0,6,238,120,0,6,239,244,0,6,241,164,0,6,243,160,0,6,245,212,0,6,246,208,0,6,248,12,0,6,249,140, + 0,6,251,72,0,6,253,68,0,6,255,128,0,7,1,244,0,7,3,40,0,7,4,156,0,7,6,92,0,7,8,88,0,7,10,148,0,7,13,16, + 0,7,15,196,0,7,17,60,0,7,18,248,0,7,20,248,0,7,23,52,0,7,25,176,0,7,28,108,0,7,31,96,0,7,33,32,0,7,35,40, + 0,7,37,112,0,7,39,248,0,7,42,188,0,7,45,196,0,7,48,244,0,7,49,32,0,7,49,88,0,7,49,212,0,7,50,144,0,7,51,140, + 0,7,52,200,0,7,54,68,0,7,55,248,0,7,56,116,0,7,57,48,0,7,58,48,0,7,59,108,0,7,60,232,0,7,62,164,0,7,64,152, + 0,7,65,84,0,7,66,80,0,7,67,140,0,7,69,8,0,7,70,196,0,7,72,192,0,7,74,244,0,7,75,240,0,7,77,44,0,7,78,172, + 0,7,80,104,0,7,82,100,0,7,84,160,0,7,87,20,0,7,88,72,0,7,89,188,0,7,91,120,0,7,93,116,0,7,95,176,0,7,98,28, + 0,7,100,208,0,7,102,72,0,7,104,4,0,7,105,244,0,7,108,48,0,7,110,172,0,7,113,104,0,7,116,92,0,7,118,32,0,7,120,40, + 0,7,122,112,0,7,124,244,0,7,127,184,0,7,130,168,0,7,133,216,0,7,134,52,0,7,134,240,0,7,135,204,0,7,136,200,0,7,137,136, + 0,7,138,116,0,7,139,140,0,7,140,56,0,7,141,108,0,7,142,128,0,7,143,112,0,7,144,36,0,7,144,252,0,7,145,220,0,7,146,152, + 0,7,147,80,0,7,148,40,0,7,149,32,0,7,149,220,0,7,150,196,0,7,151,216,0,7,152,128,0,7,153,176,0,7,154,192,0,7,155,172, + 0,7,156,92,0,7,157,48,0,7,158,12,0,7,158,196,0,7,159,84,0,7,160,4,0,7,160,212,0,7,161,100,0,7,162,36,0,7,163,12, + 0,7,163,140,0,7,164,148,0,7,165,124,0,7,166,64,0,7,166,200,0,7,167,116,0,7,168,40,0,7,168,180,0,7,169,48,0,7,170,8, + 0,7,171,0,0,7,172,24,0,7,172,240,0,7,173,248,0,7,175,40,0,7,175,240,0,7,177,64,0,7,178,112,0,7,179,124,0,7,180,76, + 0,7,181,64,0,7,182,60,0,7,183,16,0,7,183,180,0,7,185,188,0,7,188,164,0,7,190,204,0,7,192,236,0,7,193,236,0,7,194,236, + 0,7,196,132,0,7,197,100,0,7,198,68,0,7,199,72,0,7,200,28,0,7,201,88,0,7,202,100,0,7,203,60,0,7,204,28,0,7,205,40, + 0,7,206,8,0,7,207,48,0,7,208,4,0,7,208,172,0,7,209,100,0,7,209,248,0,7,210,184,0,7,211,172,0,7,212,100,0,7,213,28, + 0,7,214,20,0,7,214,232,0,7,215,252,0,7,216,212,0,7,217,172,0,7,218,132,0,7,219,84,0,7,220,32,0,7,221,32,0,7,222,80, + 0,7,223,80,0,7,224,132,0,7,225,148,0,7,226,104,0,7,227,76,0,7,228,44,0,7,229,44,0,7,231,40,0,7,232,20,0,7,233,40, + 0,7,233,252,0,7,235,72,0,7,236,12,0,7,236,240,0,7,237,240,0,7,239,188,0,7,240,252,0,7,242,124,0,7,243,156,0,7,244,112, + 0,7,245,24,0,7,245,248,0,7,248,64,0,7,250,196,0,7,253,52,0,7,255,60,0,8,1,116,0,8,3,180,0,8,6,4,0,8,7,196, + 0,8,9,132,0,8,9,168,0,8,10,116,0,8,11,16,0,8,11,224,0,8,12,136,0,8,13,36,0,8,13,208,0,8,14,4,0,8,14,164, + 0,8,15,4,0,8,15,64,0,8,15,108,0,8,15,132,0,8,15,168,0,8,15,216,0,8,16,8,0,8,16,44,0,8,16,100,0,8,16,224, + 0,8,16,240,0,8,17,0,0,8,17,192,0,8,18,92,0,8,18,252,0,8,19,196,0,8,19,212,0,8,19,228,0,8,19,252,0,8,20,20, + 0,8,20,100,0,8,20,132,0,8,20,164,0,8,20,196,0,8,20,220,0,8,20,244,0,8,21,12,0,8,21,36,0,8,21,60,0,8,21,84, + 0,8,21,108,0,8,21,132,0,8,21,156,0,8,21,180,0,8,21,204,0,8,21,228,0,8,22,4,0,8,22,36,0,8,22,68,0,8,22,100, + 0,8,22,244,0,8,23,84,0,8,23,164,0,8,23,192,0,8,23,220,0,8,23,248,0,8,24,20,0,8,24,48,0,8,24,76,0,8,24,104, + 0,8,24,132,0,8,24,160,0,8,24,188,0,8,24,216,0,8,24,244,0,8,25,16,0,8,25,44,0,8,25,72,0,8,25,100,0,8,25,128, + 0,8,25,156,0,8,25,184,0,8,25,212,0,8,25,236,0,8,26,8,0,8,26,64,0,8,26,88,0,8,26,172,0,8,26,196,0,8,26,220, + 0,8,26,244,0,8,27,12,0,8,27,44,0,8,27,76,0,8,27,100,0,8,27,200,0,8,27,216,0,8,27,232,0,8,27,248,0,8,28,16, + 0,8,28,60,0,8,28,148,0,8,28,172,0,8,28,196,0,8,28,232,0,8,29,64,0,8,29,92,0,8,29,116,0,8,29,140,0,8,29,164, + 0,8,29,188,0,8,29,212,0,8,29,236,0,8,30,4,0,8,30,28,0,8,30,84,0,8,30,148,0,8,30,204,0,8,31,92,0,8,31,252, + 0,8,32,140,0,8,32,244,0,8,33,100,0,8,33,204,0,8,33,252,0,8,34,44,0,8,34,88,0,8,34,168,0,8,35,0,0,8,35,76, + 0,8,35,152,0,8,35,228,0,8,36,44,0,8,36,212,0,8,37,132,0,8,38,40,0,8,38,132,0,8,38,220,0,8,39,52,0,8,39,204, + 0,8,40,112,0,8,41,12,0,8,41,104,0,8,41,204,0,8,42,40,0,8,42,132,0,8,42,232,0,8,43,68,0,8,43,196,0,8,44,72, + 0,8,44,204,0,8,45,88,0,8,45,240,0,8,46,124,0,8,46,224,0,8,47,76,0,8,47,176,0,8,48,84,0,8,49,0,0,8,49,164, + 0,8,50,8,0,8,50,116,0,8,50,216,0,8,51,100,0,8,51,248,0,8,52,132,0,8,52,216,0,8,53,52,0,8,53,136,0,8,54,0, + 0,8,54,128,0,8,54,248,0,8,55,160,0,8,56,80,0,8,56,248,0,8,57,92,0,8,57,200,0,8,58,44,0,8,58,196,0,8,59,104, + 0,8,60,0,0,8,60,80,0,8,60,168,0,8,60,248,0,8,61,108,0,8,61,228,0,8,62,88,0,8,62,220,0,8,63,100,0,8,63,232, + 0,8,64,56,0,8,64,144,0,8,64,224,0,8,65,56,0,8,65,152,0,8,65,240,0,8,66,92,0,8,66,208,0,8,67,60,0,8,68,0, + 0,8,68,204,0,8,69,144,0,8,70,24,0,8,70,164,0,8,71,44,0,8,71,64,0,8,71,100,0,8,71,136,0,8,71,172,0,8,71,208, + 0,8,71,244,0,8,72,24,0,8,72,60,0,8,72,96,0,8,72,204,0,8,73,8,0,8,73,68,0,8,73,176,0,8,73,200,0,8,73,224, + 0,8,74,0,0,8,74,24,0,8,74,48,0,8,74,72,0,8,74,96,0,8,74,128,0,8,74,152,0,8,74,176,0,8,74,208,0,8,74,240, + 0,8,75,16,0,8,75,40,0,8,75,64,0,8,75,88,0,8,75,120,0,8,75,152,0,8,75,184,0,8,75,208,0,8,75,232,0,8,76,0, + 0,8,76,24,0,8,76,48,0,8,76,72,0,8,76,96,0,8,76,120,0,8,76,144,0,8,76,168,0,8,76,192,0,8,76,216,0,8,76,240, + 0,8,77,8,0,8,77,32,0,8,77,64,0,8,77,96,0,8,77,128,0,8,77,152,0,8,77,176,0,8,77,200,0,8,77,224,0,8,77,248, + 0,8,78,16,0,8,78,40,0,8,78,64,0,8,78,88,0,8,79,4,0,8,79,116,0,8,79,248,0,8,80,16,0,8,80,40,0,8,80,64, + 0,8,80,88,0,8,80,112,0,8,80,136,0,8,80,160,0,8,80,184,0,8,80,208,0,8,80,232,0,8,81,0,0,8,81,24,0,8,81,48, + 0,8,81,72,0,8,81,96,0,8,81,120,0,8,81,144,0,8,81,168,0,8,81,192,0,8,81,216,0,8,81,240,0,8,82,8,0,8,82,32, + 0,8,82,56,0,8,82,80,0,8,82,104,0,8,82,128,0,8,82,160,0,8,82,192,0,8,82,224,0,8,83,0,0,8,83,32,0,8,83,64, + 0,8,83,88,0,8,83,112,0,8,83,136,0,1,0,0,23,220,3,84,0,43,0,104,0,12,0,2,0,16,0,153,0,8,0,0,4,21,2,22, + 0,8,0,4,0,0,0,26,1,62,0,1,0,0,0,0,0,0,0,152,1,50,0,1,0,0,0,0,0,1,0,11,1,227,0,1,0,0,0,0, + 0,2,0,4,1,249,0,1,0,0,0,0,0,3,0,11,2,22,0,1,0,0,0,0,0,4,0,11,2,58,0,1,0,0,0,0,0,5,0,12, + 2,96,0,1,0,0,0,0,0,6,0,10,2,131,0,1,0,0,0,0,0,8,0,17,2,178,0,1,0,0,0,0,0,11,0,29,3,0,0,1, + 0,0,0,0,0,13,18,157,40,90,0,1,0,0,0,0,0,14,0,52,59,98,0,1,0,0,0,0,0,16,0,11,59,175,0,1,0,0,0,0, + 0,17,0,4,59,197,0,3,0,1,4,9,0,0,1,48,0,0,0,3,0,1,4,9,0,1,0,22,1,203,0,3,0,1,4,9,0,2,0,8, + 1,239,0,3,0,1,4,9,0,3,0,22,1,254,0,3,0,1,4,9,0,4,0,22,2,34,0,3,0,1,4,9,0,5,0,24,2,70,0,3, + 0,1,4,9,0,6,0,20,2,109,0,3,0,1,4,9,0,8,0,34,2,142,0,3,0,1,4,9,0,11,0,58,2,196,0,3,0,1,4,9, + 0,13,37,58,3,30,0,3,0,1,4,9,0,14,0,104,58,248,0,3,0,1,4,9,0,16,0,22,59,151,0,3,0,1,4,9,0,17,0,8, + 59,187,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,48,0,51,0,32, + 0,98,0,121,0,32,0,66,0,105,0,116,0,115,0,116,0,114,0,101,0,97,0,109,0,44,0,32,0,73,0,110,0,99,0,46,0,32,0,65, + 0,108,0,108,0,32,0,82,0,105,0,103,0,104,0,116,0,115,0,32,0,82,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,10, + 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,48,0,54,0,32,0,98, + 0,121,0,32,0,84,0,97,0,118,0,109,0,106,0,111,0,110,0,103,0,32,0,66,0,97,0,104,0,46,0,32,0,65,0,108,0,108,0,32, + 0,82,0,105,0,103,0,104,0,116,0,115,0,32,0,82,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,10,0,68,0,101,0,106, + 0,97,0,86,0,117,0,32,0,99,0,104,0,97,0,110,0,103,0,101,0,115,0,32,0,97,0,114,0,101,0,32,0,105,0,110,0,32,0,112, + 0,117,0,98,0,108,0,105,0,99,0,32,0,100,0,111,0,109,0,97,0,105,0,110,0,10,0,0,67,111,112,121,114,105,103,104,116,32,40,99, + 41,32,50,48,48,51,32,98,121,32,66,105,116,115,116,114,101,97,109,44,32,73,110,99,46,32,65,108,108,32,82,105,103,104,116,115,32,82,101,115, + 101,114,118,101,100,46,10,67,111,112,121,114,105,103,104,116,32,40,99,41,32,50,48,48,54,32,98,121,32,84,97,118,109,106,111,110,103,32,66,97, + 104,46,32,65,108,108,32,82,105,103,104,116,115,32,82,101,115,101,114,118,101,100,46,10,68,101,106,97,86,117,32,99,104,97,110,103,101,115,32,97, + 114,101,32,105,110,32,112,117,98,108,105,99,32,100,111,109,97,105,110,10,0,0,68,0,101,0,106,0,97,0,86,0,117,0,32,0,83,0,97,0, + 110,0,115,0,0,68,101,106,97,86,117,32,83,97,110,115,0,0,66,0,111,0,111,0,107,0,0,66,111,111,107,0,0,68,0,101,0,106,0,97, + 0,86,0,117,0,32,0,83,0,97,0,110,0,115,0,0,68,101,106,97,86,117,32,83,97,110,115,0,0,68,0,101,0,106,0,97,0,86,0,117, + 0,32,0,83,0,97,0,110,0,115,0,0,68,101,106,97,86,117,32,83,97,110,115,0,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,32, + 0,50,0,46,0,51,0,52,0,0,86,101,114,115,105,111,110,32,50,46,51,52,0,0,68,0,101,0,106,0,97,0,86,0,117,0,83,0,97,0, + 110,0,115,0,0,68,101,106,97,86,117,83,97,110,115,0,0,68,0,101,0,106,0,97,0,86,0,117,0,32,0,102,0,111,0,110,0,116,0,115, + 0,32,0,116,0,101,0,97,0,109,0,0,68,101,106,97,86,117,32,102,111,110,116,115,32,116,101,97,109,0,0,104,0,116,0,116,0,112,0,58, + 0,47,0,47,0,100,0,101,0,106,0,97,0,118,0,117,0,46,0,115,0,111,0,117,0,114,0,99,0,101,0,102,0,111,0,114,0,103,0,101, + 0,46,0,110,0,101,0,116,0,0,104,116,116,112,58,47,47,100,101,106,97,118,117,46,115,111,117,114,99,101,102,111,114,103,101,46,110,101,116,0, + 0,70,0,111,0,110,0,116,0,115,0,32,0,97,0,114,0,101,0,32,0,40,0,99,0,41,0,32,0,66,0,105,0,116,0,115,0,116,0,114, + 0,101,0,97,0,109,0,32,0,40,0,115,0,101,0,101,0,32,0,98,0,101,0,108,0,111,0,119,0,41,0,46,0,32,0,68,0,101,0,106, + 0,97,0,86,0,117,0,32,0,99,0,104,0,97,0,110,0,103,0,101,0,115,0,32,0,97,0,114,0,101,0,32,0,105,0,110,0,32,0,112, + 0,117,0,98,0,108,0,105,0,99,0,32,0,100,0,111,0,109,0,97,0,105,0,110,0,46,0,32,0,71,0,108,0,121,0,112,0,104,0,115, + 0,32,0,105,0,109,0,112,0,111,0,114,0,116,0,101,0,100,0,32,0,102,0,114,0,111,0,109,0,32,0,65,0,114,0,101,0,118,0,32, + 0,102,0,111,0,110,0,116,0,115,0,32,0,97,0,114,0,101,0,32,0,40,0,99,0,41,0,32,0,84,0,97,0,118,0,109,0,106,0,117, + 0,110,0,103,0,32,0,66,0,97,0,104,0,32,0,40,0,115,0,101,0,101,0,32,0,98,0,101,0,108,0,111,0,119,0,41,0,10,0,10, + 0,66,0,105,0,116,0,115,0,116,0,114,0,101,0,97,0,109,0,32,0,86,0,101,0,114,0,97,0,32,0,70,0,111,0,110,0,116,0,115, + 0,32,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,10,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45, + 0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45, + 0,45,0,10,0,10,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,48, + 0,51,0,32,0,98,0,121,0,32,0,66,0,105,0,116,0,115,0,116,0,114,0,101,0,97,0,109,0,44,0,32,0,73,0,110,0,99,0,46, + 0,32,0,65,0,108,0,108,0,32,0,82,0,105,0,103,0,104,0,116,0,115,0,32,0,82,0,101,0,115,0,101,0,114,0,118,0,101,0,100, + 0,46,0,32,0,66,0,105,0,116,0,115,0,116,0,114,0,101,0,97,0,109,0,32,0,86,0,101,0,114,0,97,0,32,0,105,0,115,0,10, + 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,66,0,105,0,116,0,115,0,116, + 0,114,0,101,0,97,0,109,0,44,0,32,0,73,0,110,0,99,0,46,0,10,0,10,0,80,0,101,0,114,0,109,0,105,0,115,0,115,0,105, + 0,111,0,110,0,32,0,105,0,115,0,32,0,104,0,101,0,114,0,101,0,98,0,121,0,32,0,103,0,114,0,97,0,110,0,116,0,101,0,100, + 0,44,0,32,0,102,0,114,0,101,0,101,0,32,0,111,0,102,0,32,0,99,0,104,0,97,0,114,0,103,0,101,0,44,0,32,0,116,0,111, + 0,32,0,97,0,110,0,121,0,32,0,112,0,101,0,114,0,115,0,111,0,110,0,32,0,111,0,98,0,116,0,97,0,105,0,110,0,105,0,110, + 0,103,0,32,0,97,0,32,0,99,0,111,0,112,0,121,0,10,0,111,0,102,0,32,0,116,0,104,0,101,0,32,0,102,0,111,0,110,0,116, + 0,115,0,32,0,97,0,99,0,99,0,111,0,109,0,112,0,97,0,110,0,121,0,105,0,110,0,103,0,32,0,116,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,40,0,34,0,70,0,111,0,110,0,116,0,115,0,34,0,41,0,32,0,97,0,110, + 0,100,0,32,0,97,0,115,0,115,0,111,0,99,0,105,0,97,0,116,0,101,0,100,0,10,0,100,0,111,0,99,0,117,0,109,0,101,0,110, + 0,116,0,97,0,116,0,105,0,111,0,110,0,32,0,102,0,105,0,108,0,101,0,115,0,32,0,40,0,116,0,104,0,101,0,32,0,34,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,34,0,41,0,44,0,32,0,116,0,111,0,32,0,114, + 0,101,0,112,0,114,0,111,0,100,0,117,0,99,0,101,0,32,0,97,0,110,0,100,0,32,0,100,0,105,0,115,0,116,0,114,0,105,0,98, + 0,117,0,116,0,101,0,32,0,116,0,104,0,101,0,10,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,44,0,32,0,105,0,110,0,99,0,108,0,117,0,100,0,105,0,110,0,103,0,32,0,119,0,105,0,116,0,104,0,111,0,117,0,116, + 0,32,0,108,0,105,0,109,0,105,0,116,0,97,0,116,0,105,0,111,0,110,0,32,0,116,0,104,0,101,0,32,0,114,0,105,0,103,0,104, + 0,116,0,115,0,32,0,116,0,111,0,32,0,117,0,115,0,101,0,44,0,32,0,99,0,111,0,112,0,121,0,44,0,32,0,109,0,101,0,114, + 0,103,0,101,0,44,0,10,0,112,0,117,0,98,0,108,0,105,0,115,0,104,0,44,0,32,0,100,0,105,0,115,0,116,0,114,0,105,0,98, + 0,117,0,116,0,101,0,44,0,32,0,97,0,110,0,100,0,47,0,111,0,114,0,32,0,115,0,101,0,108,0,108,0,32,0,99,0,111,0,112, + 0,105,0,101,0,115,0,32,0,111,0,102,0,32,0,116,0,104,0,101,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,44,0,32,0,97,0,110,0,100,0,32,0,116,0,111,0,32,0,112,0,101,0,114,0,109,0,105,0,116,0,10, + 0,112,0,101,0,114,0,115,0,111,0,110,0,115,0,32,0,116,0,111,0,32,0,119,0,104,0,111,0,109,0,32,0,116,0,104,0,101,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,102,0,117,0,114, + 0,110,0,105,0,115,0,104,0,101,0,100,0,32,0,116,0,111,0,32,0,100,0,111,0,32,0,115,0,111,0,44,0,32,0,115,0,117,0,98, + 0,106,0,101,0,99,0,116,0,32,0,116,0,111,0,32,0,116,0,104,0,101,0,10,0,102,0,111,0,108,0,108,0,111,0,119,0,105,0,110, + 0,103,0,32,0,99,0,111,0,110,0,100,0,105,0,116,0,105,0,111,0,110,0,115,0,58,0,10,0,10,0,84,0,104,0,101,0,32,0,97, + 0,98,0,111,0,118,0,101,0,32,0,99,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,97,0,110,0,100,0,32,0,116, + 0,114,0,97,0,100,0,101,0,109,0,97,0,114,0,107,0,32,0,110,0,111,0,116,0,105,0,99,0,101,0,115,0,32,0,97,0,110,0,100, + 0,32,0,116,0,104,0,105,0,115,0,32,0,112,0,101,0,114,0,109,0,105,0,115,0,115,0,105,0,111,0,110,0,32,0,110,0,111,0,116, + 0,105,0,99,0,101,0,32,0,115,0,104,0,97,0,108,0,108,0,10,0,98,0,101,0,32,0,105,0,110,0,99,0,108,0,117,0,100,0,101, + 0,100,0,32,0,105,0,110,0,32,0,97,0,108,0,108,0,32,0,99,0,111,0,112,0,105,0,101,0,115,0,32,0,111,0,102,0,32,0,111, + 0,110,0,101,0,32,0,111,0,114,0,32,0,109,0,111,0,114,0,101,0,32,0,111,0,102,0,32,0,116,0,104,0,101,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,116,0,121,0,112,0,101,0,102,0,97,0,99,0,101, + 0,115,0,46,0,10,0,10,0,84,0,104,0,101,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,109,0,97,0,121,0,32,0,98,0,101,0,32,0,109,0,111,0,100,0,105,0,102,0,105,0,101,0,100,0,44,0,32,0,97, + 0,108,0,116,0,101,0,114,0,101,0,100,0,44,0,32,0,111,0,114,0,32,0,97,0,100,0,100,0,101,0,100,0,32,0,116,0,111,0,44, + 0,32,0,97,0,110,0,100,0,32,0,105,0,110,0,32,0,112,0,97,0,114,0,116,0,105,0,99,0,117,0,108,0,97,0,114,0,10,0,116, + 0,104,0,101,0,32,0,100,0,101,0,115,0,105,0,103,0,110,0,115,0,32,0,111,0,102,0,32,0,103,0,108,0,121,0,112,0,104,0,115, + 0,32,0,111,0,114,0,32,0,99,0,104,0,97,0,114,0,97,0,99,0,116,0,101,0,114,0,115,0,32,0,105,0,110,0,32,0,116,0,104, + 0,101,0,32,0,70,0,111,0,110,0,116,0,115,0,32,0,109,0,97,0,121,0,32,0,98,0,101,0,32,0,109,0,111,0,100,0,105,0,102, + 0,105,0,101,0,100,0,32,0,97,0,110,0,100,0,10,0,97,0,100,0,100,0,105,0,116,0,105,0,111,0,110,0,97,0,108,0,32,0,103, + 0,108,0,121,0,112,0,104,0,115,0,32,0,111,0,114,0,32,0,99,0,104,0,97,0,114,0,97,0,99,0,116,0,101,0,114,0,115,0,32, + 0,109,0,97,0,121,0,32,0,98,0,101,0,32,0,97,0,100,0,100,0,101,0,100,0,32,0,116,0,111,0,32,0,116,0,104,0,101,0,32, + 0,70,0,111,0,110,0,116,0,115,0,44,0,32,0,111,0,110,0,108,0,121,0,32,0,105,0,102,0,32,0,116,0,104,0,101,0,32,0,102, + 0,111,0,110,0,116,0,115,0,10,0,97,0,114,0,101,0,32,0,114,0,101,0,110,0,97,0,109,0,101,0,100,0,32,0,116,0,111,0,32, + 0,110,0,97,0,109,0,101,0,115,0,32,0,110,0,111,0,116,0,32,0,99,0,111,0,110,0,116,0,97,0,105,0,110,0,105,0,110,0,103, + 0,32,0,101,0,105,0,116,0,104,0,101,0,114,0,32,0,116,0,104,0,101,0,32,0,119,0,111,0,114,0,100,0,115,0,32,0,34,0,66, + 0,105,0,116,0,115,0,116,0,114,0,101,0,97,0,109,0,34,0,32,0,111,0,114,0,32,0,116,0,104,0,101,0,32,0,119,0,111,0,114, + 0,100,0,10,0,34,0,86,0,101,0,114,0,97,0,34,0,46,0,10,0,10,0,84,0,104,0,105,0,115,0,32,0,76,0,105,0,99,0,101, + 0,110,0,115,0,101,0,32,0,98,0,101,0,99,0,111,0,109,0,101,0,115,0,32,0,110,0,117,0,108,0,108,0,32,0,97,0,110,0,100, + 0,32,0,118,0,111,0,105,0,100,0,32,0,116,0,111,0,32,0,116,0,104,0,101,0,32,0,101,0,120,0,116,0,101,0,110,0,116,0,32, + 0,97,0,112,0,112,0,108,0,105,0,99,0,97,0,98,0,108,0,101,0,32,0,116,0,111,0,32,0,70,0,111,0,110,0,116,0,115,0,32, + 0,111,0,114,0,32,0,70,0,111,0,110,0,116,0,10,0,83,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,32,0,116,0,104,0,97, + 0,116,0,32,0,104,0,97,0,115,0,32,0,98,0,101,0,101,0,110,0,32,0,109,0,111,0,100,0,105,0,102,0,105,0,101,0,100,0,32, + 0,97,0,110,0,100,0,32,0,105,0,115,0,32,0,100,0,105,0,115,0,116,0,114,0,105,0,98,0,117,0,116,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,34,0,66,0,105,0,116,0,115,0,116,0,114,0,101,0,97,0,109,0,10, + 0,86,0,101,0,114,0,97,0,34,0,32,0,110,0,97,0,109,0,101,0,115,0,46,0,10,0,10,0,84,0,104,0,101,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,109,0,97,0,121,0,32,0,98,0,101,0,32,0,115, + 0,111,0,108,0,100,0,32,0,97,0,115,0,32,0,112,0,97,0,114,0,116,0,32,0,111,0,102,0,32,0,97,0,32,0,108,0,97,0,114, + 0,103,0,101,0,114,0,32,0,115,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,32,0,112,0,97,0,99,0,107,0,97,0,103,0,101, + 0,32,0,98,0,117,0,116,0,32,0,110,0,111,0,10,0,99,0,111,0,112,0,121,0,32,0,111,0,102,0,32,0,111,0,110,0,101,0,32, + 0,111,0,114,0,32,0,109,0,111,0,114,0,101,0,32,0,111,0,102,0,32,0,116,0,104,0,101,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,116,0,121,0,112,0,101,0,102,0,97,0,99,0,101,0,115,0,32,0,109, + 0,97,0,121,0,32,0,98,0,101,0,32,0,115,0,111,0,108,0,100,0,32,0,98,0,121,0,32,0,105,0,116,0,115,0,101,0,108,0,102, + 0,46,0,10,0,10,0,84,0,72,0,69,0,32,0,70,0,79,0,78,0,84,0,32,0,83,0,79,0,70,0,84,0,87,0,65,0,82,0,69, + 0,32,0,73,0,83,0,32,0,80,0,82,0,79,0,86,0,73,0,68,0,69,0,68,0,32,0,34,0,65,0,83,0,32,0,73,0,83,0,34, + 0,44,0,32,0,87,0,73,0,84,0,72,0,79,0,85,0,84,0,32,0,87,0,65,0,82,0,82,0,65,0,78,0,84,0,89,0,32,0,79, + 0,70,0,32,0,65,0,78,0,89,0,32,0,75,0,73,0,78,0,68,0,44,0,32,0,69,0,88,0,80,0,82,0,69,0,83,0,83,0,10, + 0,79,0,82,0,32,0,73,0,77,0,80,0,76,0,73,0,69,0,68,0,44,0,32,0,73,0,78,0,67,0,76,0,85,0,68,0,73,0,78, + 0,71,0,32,0,66,0,85,0,84,0,32,0,78,0,79,0,84,0,32,0,76,0,73,0,77,0,73,0,84,0,69,0,68,0,32,0,84,0,79, + 0,32,0,65,0,78,0,89,0,32,0,87,0,65,0,82,0,82,0,65,0,78,0,84,0,73,0,69,0,83,0,32,0,79,0,70,0,32,0,77, + 0,69,0,82,0,67,0,72,0,65,0,78,0,84,0,65,0,66,0,73,0,76,0,73,0,84,0,89,0,44,0,10,0,70,0,73,0,84,0,78, + 0,69,0,83,0,83,0,32,0,70,0,79,0,82,0,32,0,65,0,32,0,80,0,65,0,82,0,84,0,73,0,67,0,85,0,76,0,65,0,82, + 0,32,0,80,0,85,0,82,0,80,0,79,0,83,0,69,0,32,0,65,0,78,0,68,0,32,0,78,0,79,0,78,0,73,0,78,0,70,0,82, + 0,73,0,78,0,71,0,69,0,77,0,69,0,78,0,84,0,32,0,79,0,70,0,32,0,67,0,79,0,80,0,89,0,82,0,73,0,71,0,72, + 0,84,0,44,0,32,0,80,0,65,0,84,0,69,0,78,0,84,0,44,0,10,0,84,0,82,0,65,0,68,0,69,0,77,0,65,0,82,0,75, + 0,44,0,32,0,79,0,82,0,32,0,79,0,84,0,72,0,69,0,82,0,32,0,82,0,73,0,71,0,72,0,84,0,46,0,32,0,73,0,78, + 0,32,0,78,0,79,0,32,0,69,0,86,0,69,0,78,0,84,0,32,0,83,0,72,0,65,0,76,0,76,0,32,0,66,0,73,0,84,0,83, + 0,84,0,82,0,69,0,65,0,77,0,32,0,79,0,82,0,32,0,84,0,72,0,69,0,32,0,71,0,78,0,79,0,77,0,69,0,10,0,70, + 0,79,0,85,0,78,0,68,0,65,0,84,0,73,0,79,0,78,0,32,0,66,0,69,0,32,0,76,0,73,0,65,0,66,0,76,0,69,0,32, + 0,70,0,79,0,82,0,32,0,65,0,78,0,89,0,32,0,67,0,76,0,65,0,73,0,77,0,44,0,32,0,68,0,65,0,77,0,65,0,71, + 0,69,0,83,0,32,0,79,0,82,0,32,0,79,0,84,0,72,0,69,0,82,0,32,0,76,0,73,0,65,0,66,0,73,0,76,0,73,0,84, + 0,89,0,44,0,32,0,73,0,78,0,67,0,76,0,85,0,68,0,73,0,78,0,71,0,10,0,65,0,78,0,89,0,32,0,71,0,69,0,78, + 0,69,0,82,0,65,0,76,0,44,0,32,0,83,0,80,0,69,0,67,0,73,0,65,0,76,0,44,0,32,0,73,0,78,0,68,0,73,0,82, + 0,69,0,67,0,84,0,44,0,32,0,73,0,78,0,67,0,73,0,68,0,69,0,78,0,84,0,65,0,76,0,44,0,32,0,79,0,82,0,32, + 0,67,0,79,0,78,0,83,0,69,0,81,0,85,0,69,0,78,0,84,0,73,0,65,0,76,0,32,0,68,0,65,0,77,0,65,0,71,0,69, + 0,83,0,44,0,10,0,87,0,72,0,69,0,84,0,72,0,69,0,82,0,32,0,73,0,78,0,32,0,65,0,78,0,32,0,65,0,67,0,84, + 0,73,0,79,0,78,0,32,0,79,0,70,0,32,0,67,0,79,0,78,0,84,0,82,0,65,0,67,0,84,0,44,0,32,0,84,0,79,0,82, + 0,84,0,32,0,79,0,82,0,32,0,79,0,84,0,72,0,69,0,82,0,87,0,73,0,83,0,69,0,44,0,32,0,65,0,82,0,73,0,83, + 0,73,0,78,0,71,0,32,0,70,0,82,0,79,0,77,0,44,0,32,0,79,0,85,0,84,0,32,0,79,0,70,0,10,0,84,0,72,0,69, + 0,32,0,85,0,83,0,69,0,32,0,79,0,82,0,32,0,73,0,78,0,65,0,66,0,73,0,76,0,73,0,84,0,89,0,32,0,84,0,79, + 0,32,0,85,0,83,0,69,0,32,0,84,0,72,0,69,0,32,0,70,0,79,0,78,0,84,0,32,0,83,0,79,0,70,0,84,0,87,0,65, + 0,82,0,69,0,32,0,79,0,82,0,32,0,70,0,82,0,79,0,77,0,32,0,79,0,84,0,72,0,69,0,82,0,32,0,68,0,69,0,65, + 0,76,0,73,0,78,0,71,0,83,0,32,0,73,0,78,0,32,0,84,0,72,0,69,0,10,0,70,0,79,0,78,0,84,0,32,0,83,0,79, + 0,70,0,84,0,87,0,65,0,82,0,69,0,46,0,10,0,10,0,69,0,120,0,99,0,101,0,112,0,116,0,32,0,97,0,115,0,32,0,99, + 0,111,0,110,0,116,0,97,0,105,0,110,0,101,0,100,0,32,0,105,0,110,0,32,0,116,0,104,0,105,0,115,0,32,0,110,0,111,0,116, + 0,105,0,99,0,101,0,44,0,32,0,116,0,104,0,101,0,32,0,110,0,97,0,109,0,101,0,115,0,32,0,111,0,102,0,32,0,71,0,110, + 0,111,0,109,0,101,0,44,0,32,0,116,0,104,0,101,0,32,0,71,0,110,0,111,0,109,0,101,0,10,0,70,0,111,0,117,0,110,0,100, + 0,97,0,116,0,105,0,111,0,110,0,44,0,32,0,97,0,110,0,100,0,32,0,66,0,105,0,116,0,115,0,116,0,114,0,101,0,97,0,109, + 0,32,0,73,0,110,0,99,0,46,0,44,0,32,0,115,0,104,0,97,0,108,0,108,0,32,0,110,0,111,0,116,0,32,0,98,0,101,0,32, + 0,117,0,115,0,101,0,100,0,32,0,105,0,110,0,32,0,97,0,100,0,118,0,101,0,114,0,116,0,105,0,115,0,105,0,110,0,103,0,32, + 0,111,0,114,0,10,0,111,0,116,0,104,0,101,0,114,0,119,0,105,0,115,0,101,0,32,0,116,0,111,0,32,0,112,0,114,0,111,0,109, + 0,111,0,116,0,101,0,32,0,116,0,104,0,101,0,32,0,115,0,97,0,108,0,101,0,44,0,32,0,117,0,115,0,101,0,32,0,111,0,114, + 0,32,0,111,0,116,0,104,0,101,0,114,0,32,0,100,0,101,0,97,0,108,0,105,0,110,0,103,0,115,0,32,0,105,0,110,0,32,0,116, + 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,10,0,119,0,105, + 0,116,0,104,0,111,0,117,0,116,0,32,0,112,0,114,0,105,0,111,0,114,0,32,0,119,0,114,0,105,0,116,0,116,0,101,0,110,0,32, + 0,97,0,117,0,116,0,104,0,111,0,114,0,105,0,122,0,97,0,116,0,105,0,111,0,110,0,32,0,102,0,114,0,111,0,109,0,32,0,116, + 0,104,0,101,0,32,0,71,0,110,0,111,0,109,0,101,0,32,0,70,0,111,0,117,0,110,0,100,0,97,0,116,0,105,0,111,0,110,0,32, + 0,111,0,114,0,32,0,66,0,105,0,116,0,115,0,116,0,114,0,101,0,97,0,109,0,10,0,73,0,110,0,99,0,46,0,44,0,32,0,114, + 0,101,0,115,0,112,0,101,0,99,0,116,0,105,0,118,0,101,0,108,0,121,0,46,0,32,0,70,0,111,0,114,0,32,0,102,0,117,0,114, + 0,116,0,104,0,101,0,114,0,32,0,105,0,110,0,102,0,111,0,114,0,109,0,97,0,116,0,105,0,111,0,110,0,44,0,32,0,99,0,111, + 0,110,0,116,0,97,0,99,0,116,0,58,0,32,0,102,0,111,0,110,0,116,0,115,0,32,0,97,0,116,0,32,0,103,0,110,0,111,0,109, + 0,101,0,32,0,100,0,111,0,116,0,10,0,111,0,114,0,103,0,46,0,32,0,10,0,10,0,65,0,114,0,101,0,118,0,32,0,70,0,111, + 0,110,0,116,0,115,0,32,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,10,0,45,0,45,0,45,0,45,0,45,0,45, + 0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45,0,45, + 0,45,0,45,0,45,0,45,0,10,0,10,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,48,0,54,0,32,0,98,0,121,0,32,0,84,0,97,0,118,0,109,0,106,0,111,0,110,0,103,0,32,0,66,0,97,0,104, + 0,46,0,32,0,65,0,108,0,108,0,32,0,82,0,105,0,103,0,104,0,116,0,115,0,32,0,82,0,101,0,115,0,101,0,114,0,118,0,101, + 0,100,0,46,0,10,0,10,0,80,0,101,0,114,0,109,0,105,0,115,0,115,0,105,0,111,0,110,0,32,0,105,0,115,0,32,0,104,0,101, + 0,114,0,101,0,98,0,121,0,32,0,103,0,114,0,97,0,110,0,116,0,101,0,100,0,44,0,32,0,102,0,114,0,101,0,101,0,32,0,111, + 0,102,0,32,0,99,0,104,0,97,0,114,0,103,0,101,0,44,0,32,0,116,0,111,0,32,0,97,0,110,0,121,0,32,0,112,0,101,0,114, + 0,115,0,111,0,110,0,32,0,111,0,98,0,116,0,97,0,105,0,110,0,105,0,110,0,103,0,10,0,97,0,32,0,99,0,111,0,112,0,121, + 0,32,0,111,0,102,0,32,0,116,0,104,0,101,0,32,0,102,0,111,0,110,0,116,0,115,0,32,0,97,0,99,0,99,0,111,0,109,0,112, + 0,97,0,110,0,121,0,105,0,110,0,103,0,32,0,116,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,40,0,34,0,70,0,111,0,110,0,116,0,115,0,34,0,41,0,32,0,97,0,110,0,100,0,10,0,97,0,115,0,115,0,111,0,99,0,105, + 0,97,0,116,0,101,0,100,0,32,0,100,0,111,0,99,0,117,0,109,0,101,0,110,0,116,0,97,0,116,0,105,0,111,0,110,0,32,0,102, + 0,105,0,108,0,101,0,115,0,32,0,40,0,116,0,104,0,101,0,32,0,34,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,34,0,41,0,44,0,32,0,116,0,111,0,32,0,114,0,101,0,112,0,114,0,111,0,100,0,117,0,99,0,101, + 0,10,0,97,0,110,0,100,0,32,0,100,0,105,0,115,0,116,0,114,0,105,0,98,0,117,0,116,0,101,0,32,0,116,0,104,0,101,0,32, + 0,109,0,111,0,100,0,105,0,102,0,105,0,99,0,97,0,116,0,105,0,111,0,110,0,115,0,32,0,116,0,111,0,32,0,116,0,104,0,101, + 0,32,0,66,0,105,0,116,0,115,0,116,0,114,0,101,0,97,0,109,0,32,0,86,0,101,0,114,0,97,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,44,0,10,0,105,0,110,0,99,0,108,0,117,0,100,0,105,0,110,0,103, + 0,32,0,119,0,105,0,116,0,104,0,111,0,117,0,116,0,32,0,108,0,105,0,109,0,105,0,116,0,97,0,116,0,105,0,111,0,110,0,32, + 0,116,0,104,0,101,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32,0,116,0,111,0,32,0,117,0,115,0,101,0,44,0,32,0,99, + 0,111,0,112,0,121,0,44,0,32,0,109,0,101,0,114,0,103,0,101,0,44,0,32,0,112,0,117,0,98,0,108,0,105,0,115,0,104,0,44, + 0,10,0,100,0,105,0,115,0,116,0,114,0,105,0,98,0,117,0,116,0,101,0,44,0,32,0,97,0,110,0,100,0,47,0,111,0,114,0,32, + 0,115,0,101,0,108,0,108,0,32,0,99,0,111,0,112,0,105,0,101,0,115,0,32,0,111,0,102,0,32,0,116,0,104,0,101,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,44,0,32,0,97,0,110,0,100,0,32,0,116,0,111, + 0,32,0,112,0,101,0,114,0,109,0,105,0,116,0,10,0,112,0,101,0,114,0,115,0,111,0,110,0,115,0,32,0,116,0,111,0,32,0,119, + 0,104,0,111,0,109,0,32,0,116,0,104,0,101,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,102,0,117,0,114,0,110,0,105,0,115,0,104,0,101,0,100,0,32,0,116,0,111,0,32,0,100,0,111, + 0,32,0,115,0,111,0,44,0,32,0,115,0,117,0,98,0,106,0,101,0,99,0,116,0,32,0,116,0,111,0,10,0,116,0,104,0,101,0,32, + 0,102,0,111,0,108,0,108,0,111,0,119,0,105,0,110,0,103,0,32,0,99,0,111,0,110,0,100,0,105,0,116,0,105,0,111,0,110,0,115, + 0,58,0,10,0,10,0,84,0,104,0,101,0,32,0,97,0,98,0,111,0,118,0,101,0,32,0,99,0,111,0,112,0,121,0,114,0,105,0,103, + 0,104,0,116,0,32,0,97,0,110,0,100,0,32,0,116,0,114,0,97,0,100,0,101,0,109,0,97,0,114,0,107,0,32,0,110,0,111,0,116, + 0,105,0,99,0,101,0,115,0,32,0,97,0,110,0,100,0,32,0,116,0,104,0,105,0,115,0,32,0,112,0,101,0,114,0,109,0,105,0,115, + 0,115,0,105,0,111,0,110,0,32,0,110,0,111,0,116,0,105,0,99,0,101,0,10,0,115,0,104,0,97,0,108,0,108,0,32,0,98,0,101, + 0,32,0,105,0,110,0,99,0,108,0,117,0,100,0,101,0,100,0,32,0,105,0,110,0,32,0,97,0,108,0,108,0,32,0,99,0,111,0,112, + 0,105,0,101,0,115,0,32,0,111,0,102,0,32,0,111,0,110,0,101,0,32,0,111,0,114,0,32,0,109,0,111,0,114,0,101,0,32,0,111, + 0,102,0,32,0,116,0,104,0,101,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,10, + 0,116,0,121,0,112,0,101,0,102,0,97,0,99,0,101,0,115,0,46,0,10,0,10,0,84,0,104,0,101,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,109,0,97,0,121,0,32,0,98,0,101,0,32,0,109,0,111,0,100, + 0,105,0,102,0,105,0,101,0,100,0,44,0,32,0,97,0,108,0,116,0,101,0,114,0,101,0,100,0,44,0,32,0,111,0,114,0,32,0,97, + 0,100,0,100,0,101,0,100,0,32,0,116,0,111,0,44,0,32,0,97,0,110,0,100,0,32,0,105,0,110,0,10,0,112,0,97,0,114,0,116, + 0,105,0,99,0,117,0,108,0,97,0,114,0,32,0,116,0,104,0,101,0,32,0,100,0,101,0,115,0,105,0,103,0,110,0,115,0,32,0,111, + 0,102,0,32,0,103,0,108,0,121,0,112,0,104,0,115,0,32,0,111,0,114,0,32,0,99,0,104,0,97,0,114,0,97,0,99,0,116,0,101, + 0,114,0,115,0,32,0,105,0,110,0,32,0,116,0,104,0,101,0,32,0,70,0,111,0,110,0,116,0,115,0,32,0,109,0,97,0,121,0,32, + 0,98,0,101,0,10,0,109,0,111,0,100,0,105,0,102,0,105,0,101,0,100,0,32,0,97,0,110,0,100,0,32,0,97,0,100,0,100,0,105, + 0,116,0,105,0,111,0,110,0,97,0,108,0,32,0,103,0,108,0,121,0,112,0,104,0,115,0,32,0,111,0,114,0,32,0,99,0,104,0,97, + 0,114,0,97,0,99,0,116,0,101,0,114,0,115,0,32,0,109,0,97,0,121,0,32,0,98,0,101,0,32,0,97,0,100,0,100,0,101,0,100, + 0,32,0,116,0,111,0,32,0,116,0,104,0,101,0,10,0,70,0,111,0,110,0,116,0,115,0,44,0,32,0,111,0,110,0,108,0,121,0,32, + 0,105,0,102,0,32,0,116,0,104,0,101,0,32,0,102,0,111,0,110,0,116,0,115,0,32,0,97,0,114,0,101,0,32,0,114,0,101,0,110, + 0,97,0,109,0,101,0,100,0,32,0,116,0,111,0,32,0,110,0,97,0,109,0,101,0,115,0,32,0,110,0,111,0,116,0,32,0,99,0,111, + 0,110,0,116,0,97,0,105,0,110,0,105,0,110,0,103,0,32,0,101,0,105,0,116,0,104,0,101,0,114,0,10,0,116,0,104,0,101,0,32, + 0,119,0,111,0,114,0,100,0,115,0,32,0,34,0,84,0,97,0,118,0,109,0,106,0,111,0,110,0,103,0,32,0,66,0,97,0,104,0,34, + 0,32,0,111,0,114,0,32,0,116,0,104,0,101,0,32,0,119,0,111,0,114,0,100,0,32,0,34,0,65,0,114,0,101,0,118,0,34,0,46, + 0,10,0,10,0,84,0,104,0,105,0,115,0,32,0,76,0,105,0,99,0,101,0,110,0,115,0,101,0,32,0,98,0,101,0,99,0,111,0,109, + 0,101,0,115,0,32,0,110,0,117,0,108,0,108,0,32,0,97,0,110,0,100,0,32,0,118,0,111,0,105,0,100,0,32,0,116,0,111,0,32, + 0,116,0,104,0,101,0,32,0,101,0,120,0,116,0,101,0,110,0,116,0,32,0,97,0,112,0,112,0,108,0,105,0,99,0,97,0,98,0,108, + 0,101,0,32,0,116,0,111,0,32,0,70,0,111,0,110,0,116,0,115,0,10,0,111,0,114,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,116,0,104,0,97,0,116,0,32,0,104,0,97,0,115,0,32,0,98,0,101,0,101, + 0,110,0,32,0,109,0,111,0,100,0,105,0,102,0,105,0,101,0,100,0,32,0,97,0,110,0,100,0,32,0,105,0,115,0,32,0,100,0,105, + 0,115,0,116,0,114,0,105,0,98,0,117,0,116,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,10,0,34,0,84,0,97,0,118,0,109,0,106,0,111,0,110,0,103,0,32,0,66,0,97,0,104,0,32,0,65,0,114,0,101,0,118,0,34, + 0,32,0,110,0,97,0,109,0,101,0,115,0,46,0,10,0,10,0,84,0,104,0,101,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,109,0,97,0,121,0,32,0,98,0,101,0,32,0,115,0,111,0,108,0,100,0,32,0,97, + 0,115,0,32,0,112,0,97,0,114,0,116,0,32,0,111,0,102,0,32,0,97,0,32,0,108,0,97,0,114,0,103,0,101,0,114,0,32,0,115, + 0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,32,0,112,0,97,0,99,0,107,0,97,0,103,0,101,0,32,0,98,0,117,0,116,0,10, + 0,110,0,111,0,32,0,99,0,111,0,112,0,121,0,32,0,111,0,102,0,32,0,111,0,110,0,101,0,32,0,111,0,114,0,32,0,109,0,111, + 0,114,0,101,0,32,0,111,0,102,0,32,0,116,0,104,0,101,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,116,0,121,0,112,0,101,0,102,0,97,0,99,0,101,0,115,0,32,0,109,0,97,0,121,0,32,0,98,0,101, + 0,32,0,115,0,111,0,108,0,100,0,32,0,98,0,121,0,10,0,105,0,116,0,115,0,101,0,108,0,102,0,46,0,10,0,10,0,84,0,72, + 0,69,0,32,0,70,0,79,0,78,0,84,0,32,0,83,0,79,0,70,0,84,0,87,0,65,0,82,0,69,0,32,0,73,0,83,0,32,0,80, + 0,82,0,79,0,86,0,73,0,68,0,69,0,68,0,32,0,34,0,65,0,83,0,32,0,73,0,83,0,34,0,44,0,32,0,87,0,73,0,84, + 0,72,0,79,0,85,0,84,0,32,0,87,0,65,0,82,0,82,0,65,0,78,0,84,0,89,0,32,0,79,0,70,0,32,0,65,0,78,0,89, + 0,32,0,75,0,73,0,78,0,68,0,44,0,10,0,69,0,88,0,80,0,82,0,69,0,83,0,83,0,32,0,79,0,82,0,32,0,73,0,77, + 0,80,0,76,0,73,0,69,0,68,0,44,0,32,0,73,0,78,0,67,0,76,0,85,0,68,0,73,0,78,0,71,0,32,0,66,0,85,0,84, + 0,32,0,78,0,79,0,84,0,32,0,76,0,73,0,77,0,73,0,84,0,69,0,68,0,32,0,84,0,79,0,32,0,65,0,78,0,89,0,32, + 0,87,0,65,0,82,0,82,0,65,0,78,0,84,0,73,0,69,0,83,0,32,0,79,0,70,0,10,0,77,0,69,0,82,0,67,0,72,0,65, + 0,78,0,84,0,65,0,66,0,73,0,76,0,73,0,84,0,89,0,44,0,32,0,70,0,73,0,84,0,78,0,69,0,83,0,83,0,32,0,70, + 0,79,0,82,0,32,0,65,0,32,0,80,0,65,0,82,0,84,0,73,0,67,0,85,0,76,0,65,0,82,0,32,0,80,0,85,0,82,0,80, + 0,79,0,83,0,69,0,32,0,65,0,78,0,68,0,32,0,78,0,79,0,78,0,73,0,78,0,70,0,82,0,73,0,78,0,71,0,69,0,77, + 0,69,0,78,0,84,0,10,0,79,0,70,0,32,0,67,0,79,0,80,0,89,0,82,0,73,0,71,0,72,0,84,0,44,0,32,0,80,0,65, + 0,84,0,69,0,78,0,84,0,44,0,32,0,84,0,82,0,65,0,68,0,69,0,77,0,65,0,82,0,75,0,44,0,32,0,79,0,82,0,32, + 0,79,0,84,0,72,0,69,0,82,0,32,0,82,0,73,0,71,0,72,0,84,0,46,0,32,0,73,0,78,0,32,0,78,0,79,0,32,0,69, + 0,86,0,69,0,78,0,84,0,32,0,83,0,72,0,65,0,76,0,76,0,10,0,84,0,65,0,86,0,77,0,74,0,79,0,78,0,71,0,32, + 0,66,0,65,0,72,0,32,0,66,0,69,0,32,0,76,0,73,0,65,0,66,0,76,0,69,0,32,0,70,0,79,0,82,0,32,0,65,0,78, + 0,89,0,32,0,67,0,76,0,65,0,73,0,77,0,44,0,32,0,68,0,65,0,77,0,65,0,71,0,69,0,83,0,32,0,79,0,82,0,32, + 0,79,0,84,0,72,0,69,0,82,0,32,0,76,0,73,0,65,0,66,0,73,0,76,0,73,0,84,0,89,0,44,0,10,0,73,0,78,0,67, + 0,76,0,85,0,68,0,73,0,78,0,71,0,32,0,65,0,78,0,89,0,32,0,71,0,69,0,78,0,69,0,82,0,65,0,76,0,44,0,32, + 0,83,0,80,0,69,0,67,0,73,0,65,0,76,0,44,0,32,0,73,0,78,0,68,0,73,0,82,0,69,0,67,0,84,0,44,0,32,0,73, + 0,78,0,67,0,73,0,68,0,69,0,78,0,84,0,65,0,76,0,44,0,32,0,79,0,82,0,32,0,67,0,79,0,78,0,83,0,69,0,81, + 0,85,0,69,0,78,0,84,0,73,0,65,0,76,0,10,0,68,0,65,0,77,0,65,0,71,0,69,0,83,0,44,0,32,0,87,0,72,0,69, + 0,84,0,72,0,69,0,82,0,32,0,73,0,78,0,32,0,65,0,78,0,32,0,65,0,67,0,84,0,73,0,79,0,78,0,32,0,79,0,70, + 0,32,0,67,0,79,0,78,0,84,0,82,0,65,0,67,0,84,0,44,0,32,0,84,0,79,0,82,0,84,0,32,0,79,0,82,0,32,0,79, + 0,84,0,72,0,69,0,82,0,87,0,73,0,83,0,69,0,44,0,32,0,65,0,82,0,73,0,83,0,73,0,78,0,71,0,10,0,70,0,82, + 0,79,0,77,0,44,0,32,0,79,0,85,0,84,0,32,0,79,0,70,0,32,0,84,0,72,0,69,0,32,0,85,0,83,0,69,0,32,0,79, + 0,82,0,32,0,73,0,78,0,65,0,66,0,73,0,76,0,73,0,84,0,89,0,32,0,84,0,79,0,32,0,85,0,83,0,69,0,32,0,84, + 0,72,0,69,0,32,0,70,0,79,0,78,0,84,0,32,0,83,0,79,0,70,0,84,0,87,0,65,0,82,0,69,0,32,0,79,0,82,0,32, + 0,70,0,82,0,79,0,77,0,10,0,79,0,84,0,72,0,69,0,82,0,32,0,68,0,69,0,65,0,76,0,73,0,78,0,71,0,83,0,32, + 0,73,0,78,0,32,0,84,0,72,0,69,0,32,0,70,0,79,0,78,0,84,0,32,0,83,0,79,0,70,0,84,0,87,0,65,0,82,0,69, + 0,46,0,10,0,10,0,69,0,120,0,99,0,101,0,112,0,116,0,32,0,97,0,115,0,32,0,99,0,111,0,110,0,116,0,97,0,105,0,110, + 0,101,0,100,0,32,0,105,0,110,0,32,0,116,0,104,0,105,0,115,0,32,0,110,0,111,0,116,0,105,0,99,0,101,0,44,0,32,0,116, + 0,104,0,101,0,32,0,110,0,97,0,109,0,101,0,32,0,111,0,102,0,32,0,84,0,97,0,118,0,109,0,106,0,111,0,110,0,103,0,32, + 0,66,0,97,0,104,0,32,0,115,0,104,0,97,0,108,0,108,0,32,0,110,0,111,0,116,0,10,0,98,0,101,0,32,0,117,0,115,0,101, + 0,100,0,32,0,105,0,110,0,32,0,97,0,100,0,118,0,101,0,114,0,116,0,105,0,115,0,105,0,110,0,103,0,32,0,111,0,114,0,32, + 0,111,0,116,0,104,0,101,0,114,0,119,0,105,0,115,0,101,0,32,0,116,0,111,0,32,0,112,0,114,0,111,0,109,0,111,0,116,0,101, + 0,32,0,116,0,104,0,101,0,32,0,115,0,97,0,108,0,101,0,44,0,32,0,117,0,115,0,101,0,32,0,111,0,114,0,32,0,111,0,116, + 0,104,0,101,0,114,0,10,0,100,0,101,0,97,0,108,0,105,0,110,0,103,0,115,0,32,0,105,0,110,0,32,0,116,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,119,0,105,0,116,0,104,0,111, + 0,117,0,116,0,32,0,112,0,114,0,105,0,111,0,114,0,32,0,119,0,114,0,105,0,116,0,116,0,101,0,110,0,32,0,97,0,117,0,116, + 0,104,0,111,0,114,0,105,0,122,0,97,0,116,0,105,0,111,0,110,0,10,0,102,0,114,0,111,0,109,0,32,0,84,0,97,0,118,0,109, + 0,106,0,111,0,110,0,103,0,32,0,66,0,97,0,104,0,46,0,32,0,70,0,111,0,114,0,32,0,102,0,117,0,114,0,116,0,104,0,101, + 0,114,0,32,0,105,0,110,0,102,0,111,0,114,0,109,0,97,0,116,0,105,0,111,0,110,0,44,0,32,0,99,0,111,0,110,0,116,0,97, + 0,99,0,116,0,58,0,32,0,116,0,97,0,118,0,109,0,106,0,111,0,110,0,103,0,32,0,64,0,32,0,102,0,114,0,101,0,101,0,10, + 0,46,0,32,0,102,0,114,0,46,0,0,70,111,110,116,115,32,97,114,101,32,40,99,41,32,66,105,116,115,116,114,101,97,109,32,40,115,101,101, + 32,98,101,108,111,119,41,46,32,68,101,106,97,86,117,32,99,104,97,110,103,101,115,32,97,114,101,32,105,110,32,112,117,98,108,105,99,32,100,111, + 109,97,105,110,46,32,71,108,121,112,104,115,32,105,109,112,111,114,116,101,100,32,102,114,111,109,32,65,114,101,118,32,102,111,110,116,115,32,97,114, + 101,32,40,99,41,32,84,97,118,109,106,117,110,103,32,66,97,104,32,40,115,101,101,32,98,101,108,111,119,41,10,10,66,105,116,115,116,114,101,97, + 109,32,86,101,114,97,32,70,111,110,116,115,32,67,111,112,121,114,105,103,104,116,10,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,10,10,67,111,112,121,114,105,103,104,116,32,40,99,41,32,50,48,48,51,32,98,121,32,66,105,116, + 115,116,114,101,97,109,44,32,73,110,99,46,32,65,108,108,32,82,105,103,104,116,115,32,82,101,115,101,114,118,101,100,46,32,66,105,116,115,116,114, + 101,97,109,32,86,101,114,97,32,105,115,10,97,32,116,114,97,100,101,109,97,114,107,32,111,102,32,66,105,116,115,116,114,101,97,109,44,32,73,110, + 99,46,10,10,80,101,114,109,105,115,115,105,111,110,32,105,115,32,104,101,114,101,98,121,32,103,114,97,110,116,101,100,44,32,102,114,101,101,32,111, + 102,32,99,104,97,114,103,101,44,32,116,111,32,97,110,121,32,112,101,114,115,111,110,32,111,98,116,97,105,110,105,110,103,32,97,32,99,111,112,121, + 10,111,102,32,116,104,101,32,102,111,110,116,115,32,97,99,99,111,109,112,97,110,121,105,110,103,32,116,104,105,115,32,108,105,99,101,110,115,101,32, + 40,34,70,111,110,116,115,34,41,32,97,110,100,32,97,115,115,111,99,105,97,116,101,100,10,100,111,99,117,109,101,110,116,97,116,105,111,110,32,102, + 105,108,101,115,32,40,116,104,101,32,34,70,111,110,116,32,83,111,102,116,119,97,114,101,34,41,44,32,116,111,32,114,101,112,114,111,100,117,99,101, + 32,97,110,100,32,100,105,115,116,114,105,98,117,116,101,32,116,104,101,10,70,111,110,116,32,83,111,102,116,119,97,114,101,44,32,105,110,99,108,117, + 100,105,110,103,32,119,105,116,104,111,117,116,32,108,105,109,105,116,97,116,105,111,110,32,116,104,101,32,114,105,103,104,116,115,32,116,111,32,117,115, + 101,44,32,99,111,112,121,44,32,109,101,114,103,101,44,10,112,117,98,108,105,115,104,44,32,100,105,115,116,114,105,98,117,116,101,44,32,97,110,100, + 47,111,114,32,115,101,108,108,32,99,111,112,105,101,115,32,111,102,32,116,104,101,32,70,111,110,116,32,83,111,102,116,119,97,114,101,44,32,97,110, + 100,32,116,111,32,112,101,114,109,105,116,10,112,101,114,115,111,110,115,32,116,111,32,119,104,111,109,32,116,104,101,32,70,111,110,116,32,83,111,102, + 116,119,97,114,101,32,105,115,32,102,117,114,110,105,115,104,101,100,32,116,111,32,100,111,32,115,111,44,32,115,117,98,106,101,99,116,32,116,111,32, + 116,104,101,10,102,111,108,108,111,119,105,110,103,32,99,111,110,100,105,116,105,111,110,115,58,10,10,84,104,101,32,97,98,111,118,101,32,99,111,112, + 121,114,105,103,104,116,32,97,110,100,32,116,114,97,100,101,109,97,114,107,32,110,111,116,105,99,101,115,32,97,110,100,32,116,104,105,115,32,112,101, + 114,109,105,115,115,105,111,110,32,110,111,116,105,99,101,32,115,104,97,108,108,10,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,97,108,108, + 32,99,111,112,105,101,115,32,111,102,32,111,110,101,32,111,114,32,109,111,114,101,32,111,102,32,116,104,101,32,70,111,110,116,32,83,111,102,116,119, + 97,114,101,32,116,121,112,101,102,97,99,101,115,46,10,10,84,104,101,32,70,111,110,116,32,83,111,102,116,119,97,114,101,32,109,97,121,32,98,101, + 32,109,111,100,105,102,105,101,100,44,32,97,108,116,101,114,101,100,44,32,111,114,32,97,100,100,101,100,32,116,111,44,32,97,110,100,32,105,110,32, + 112,97,114,116,105,99,117,108,97,114,10,116,104,101,32,100,101,115,105,103,110,115,32,111,102,32,103,108,121,112,104,115,32,111,114,32,99,104,97,114, + 97,99,116,101,114,115,32,105,110,32,116,104,101,32,70,111,110,116,115,32,109,97,121,32,98,101,32,109,111,100,105,102,105,101,100,32,97,110,100,10, + 97,100,100,105,116,105,111,110,97,108,32,103,108,121,112,104,115,32,111,114,32,99,104,97,114,97,99,116,101,114,115,32,109,97,121,32,98,101,32,97, + 100,100,101,100,32,116,111,32,116,104,101,32,70,111,110,116,115,44,32,111,110,108,121,32,105,102,32,116,104,101,32,102,111,110,116,115,10,97,114,101, + 32,114,101,110,97,109,101,100,32,116,111,32,110,97,109,101,115,32,110,111,116,32,99,111,110,116,97,105,110,105,110,103,32,101,105,116,104,101,114,32, + 116,104,101,32,119,111,114,100,115,32,34,66,105,116,115,116,114,101,97,109,34,32,111,114,32,116,104,101,32,119,111,114,100,10,34,86,101,114,97,34, + 46,10,10,84,104,105,115,32,76,105,99,101,110,115,101,32,98,101,99,111,109,101,115,32,110,117,108,108,32,97,110,100,32,118,111,105,100,32,116,111, + 32,116,104,101,32,101,120,116,101,110,116,32,97,112,112,108,105,99,97,98,108,101,32,116,111,32,70,111,110,116,115,32,111,114,32,70,111,110,116,10, + 83,111,102,116,119,97,114,101,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,109,111,100,105,102,105,101,100,32,97,110,100,32,105,115,32,100, + 105,115,116,114,105,98,117,116,101,100,32,117,110,100,101,114,32,116,104,101,32,34,66,105,116,115,116,114,101,97,109,10,86,101,114,97,34,32,110,97, + 109,101,115,46,10,10,84,104,101,32,70,111,110,116,32,83,111,102,116,119,97,114,101,32,109,97,121,32,98,101,32,115,111,108,100,32,97,115,32,112, + 97,114,116,32,111,102,32,97,32,108,97,114,103,101,114,32,115,111,102,116,119,97,114,101,32,112,97,99,107,97,103,101,32,98,117,116,32,110,111,10, + 99,111,112,121,32,111,102,32,111,110,101,32,111,114,32,109,111,114,101,32,111,102,32,116,104,101,32,70,111,110,116,32,83,111,102,116,119,97,114,101, + 32,116,121,112,101,102,97,99,101,115,32,109,97,121,32,98,101,32,115,111,108,100,32,98,121,32,105,116,115,101,108,102,46,10,10,84,72,69,32,70, + 79,78,84,32,83,79,70,84,87,65,82,69,32,73,83,32,80,82,79,86,73,68,69,68,32,34,65,83,32,73,83,34,44,32,87,73,84,72,79,85, + 84,32,87,65,82,82,65,78,84,89,32,79,70,32,65,78,89,32,75,73,78,68,44,32,69,88,80,82,69,83,83,10,79,82,32,73,77,80,76,73, + 69,68,44,32,73,78,67,76,85,68,73,78,71,32,66,85,84,32,78,79,84,32,76,73,77,73,84,69,68,32,84,79,32,65,78,89,32,87,65,82, + 82,65,78,84,73,69,83,32,79,70,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,44,10,70,73,84,78,69,83,83,32,70,79,82,32, + 65,32,80,65,82,84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,32,65,78,68,32,78,79,78,73,78,70,82,73,78,71,69,77,69,78,84, + 32,79,70,32,67,79,80,89,82,73,71,72,84,44,32,80,65,84,69,78,84,44,10,84,82,65,68,69,77,65,82,75,44,32,79,82,32,79,84,72, + 69,82,32,82,73,71,72,84,46,32,73,78,32,78,79,32,69,86,69,78,84,32,83,72,65,76,76,32,66,73,84,83,84,82,69,65,77,32,79,82, + 32,84,72,69,32,71,78,79,77,69,10,70,79,85,78,68,65,84,73,79,78,32,66,69,32,76,73,65,66,76,69,32,70,79,82,32,65,78,89,32, + 67,76,65,73,77,44,32,68,65,77,65,71,69,83,32,79,82,32,79,84,72,69,82,32,76,73,65,66,73,76,73,84,89,44,32,73,78,67,76,85, + 68,73,78,71,10,65,78,89,32,71,69,78,69,82,65,76,44,32,83,80,69,67,73,65,76,44,32,73,78,68,73,82,69,67,84,44,32,73,78,67, + 73,68,69,78,84,65,76,44,32,79,82,32,67,79,78,83,69,81,85,69,78,84,73,65,76,32,68,65,77,65,71,69,83,44,10,87,72,69,84,72, + 69,82,32,73,78,32,65,78,32,65,67,84,73,79,78,32,79,70,32,67,79,78,84,82,65,67,84,44,32,84,79,82,84,32,79,82,32,79,84,72, + 69,82,87,73,83,69,44,32,65,82,73,83,73,78,71,32,70,82,79,77,44,32,79,85,84,32,79,70,10,84,72,69,32,85,83,69,32,79,82,32, + 73,78,65,66,73,76,73,84,89,32,84,79,32,85,83,69,32,84,72,69,32,70,79,78,84,32,83,79,70,84,87,65,82,69,32,79,82,32,70,82, + 79,77,32,79,84,72,69,82,32,68,69,65,76,73,78,71,83,32,73,78,32,84,72,69,10,70,79,78,84,32,83,79,70,84,87,65,82,69,46,10, + 10,69,120,99,101,112,116,32,97,115,32,99,111,110,116,97,105,110,101,100,32,105,110,32,116,104,105,115,32,110,111,116,105,99,101,44,32,116,104,101, + 32,110,97,109,101,115,32,111,102,32,71,110,111,109,101,44,32,116,104,101,32,71,110,111,109,101,10,70,111,117,110,100,97,116,105,111,110,44,32,97, + 110,100,32,66,105,116,115,116,114,101,97,109,32,73,110,99,46,44,32,115,104,97,108,108,32,110,111,116,32,98,101,32,117,115,101,100,32,105,110,32, + 97,100,118,101,114,116,105,115,105,110,103,32,111,114,10,111,116,104,101,114,119,105,115,101,32,116,111,32,112,114,111,109,111,116,101,32,116,104,101,32, + 115,97,108,101,44,32,117,115,101,32,111,114,32,111,116,104,101,114,32,100,101,97,108,105,110,103,115,32,105,110,32,116,104,105,115,32,70,111,110,116, + 32,83,111,102,116,119,97,114,101,10,119,105,116,104,111,117,116,32,112,114,105,111,114,32,119,114,105,116,116,101,110,32,97,117,116,104,111,114,105,122, + 97,116,105,111,110,32,102,114,111,109,32,116,104,101,32,71,110,111,109,101,32,70,111,117,110,100,97,116,105,111,110,32,111,114,32,66,105,116,115,116, + 114,101,97,109,10,73,110,99,46,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,70,111,114,32,102,117,114,116,104,101,114,32,105,110,102, + 111,114,109,97,116,105,111,110,44,32,99,111,110,116,97,99,116,58,32,102,111,110,116,115,32,97,116,32,103,110,111,109,101,32,100,111,116,10,111,114, + 103,46,32,10,10,65,114,101,118,32,70,111,110,116,115,32,67,111,112,121,114,105,103,104,116,10,45,45,45,45,45,45,45,45,45,45,45,45,45,45, + 45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,10,10,67,111,112,121,114,105,103,104,116,32,40,99,41,32,50,48,48,54,32,98,121,32, + 84,97,118,109,106,111,110,103,32,66,97,104,46,32,65,108,108,32,82,105,103,104,116,115,32,82,101,115,101,114,118,101,100,46,10,10,80,101,114,109, + 105,115,115,105,111,110,32,105,115,32,104,101,114,101,98,121,32,103,114,97,110,116,101,100,44,32,102,114,101,101,32,111,102,32,99,104,97,114,103,101, + 44,32,116,111,32,97,110,121,32,112,101,114,115,111,110,32,111,98,116,97,105,110,105,110,103,10,97,32,99,111,112,121,32,111,102,32,116,104,101,32, + 102,111,110,116,115,32,97,99,99,111,109,112,97,110,121,105,110,103,32,116,104,105,115,32,108,105,99,101,110,115,101,32,40,34,70,111,110,116,115,34, + 41,32,97,110,100,10,97,115,115,111,99,105,97,116,101,100,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,102,105,108,101,115,32,40,116,104, + 101,32,34,70,111,110,116,32,83,111,102,116,119,97,114,101,34,41,44,32,116,111,32,114,101,112,114,111,100,117,99,101,10,97,110,100,32,100,105,115, + 116,114,105,98,117,116,101,32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,115,32,116,111,32,116,104,101,32,66,105,116,115,116,114,101, + 97,109,32,86,101,114,97,32,70,111,110,116,32,83,111,102,116,119,97,114,101,44,10,105,110,99,108,117,100,105,110,103,32,119,105,116,104,111,117,116, + 32,108,105,109,105,116,97,116,105,111,110,32,116,104,101,32,114,105,103,104,116,115,32,116,111,32,117,115,101,44,32,99,111,112,121,44,32,109,101,114, + 103,101,44,32,112,117,98,108,105,115,104,44,10,100,105,115,116,114,105,98,117,116,101,44,32,97,110,100,47,111,114,32,115,101,108,108,32,99,111,112, + 105,101,115,32,111,102,32,116,104,101,32,70,111,110,116,32,83,111,102,116,119,97,114,101,44,32,97,110,100,32,116,111,32,112,101,114,109,105,116,10, + 112,101,114,115,111,110,115,32,116,111,32,119,104,111,109,32,116,104,101,32,70,111,110,116,32,83,111,102,116,119,97,114,101,32,105,115,32,102,117,114, + 110,105,115,104,101,100,32,116,111,32,100,111,32,115,111,44,32,115,117,98,106,101,99,116,32,116,111,10,116,104,101,32,102,111,108,108,111,119,105,110, + 103,32,99,111,110,100,105,116,105,111,110,115,58,10,10,84,104,101,32,97,98,111,118,101,32,99,111,112,121,114,105,103,104,116,32,97,110,100,32,116, + 114,97,100,101,109,97,114,107,32,110,111,116,105,99,101,115,32,97,110,100,32,116,104,105,115,32,112,101,114,109,105,115,115,105,111,110,32,110,111,116, + 105,99,101,10,115,104,97,108,108,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,97,108,108,32,99,111,112,105,101,115,32,111,102,32,111, + 110,101,32,111,114,32,109,111,114,101,32,111,102,32,116,104,101,32,70,111,110,116,32,83,111,102,116,119,97,114,101,10,116,121,112,101,102,97,99,101, + 115,46,10,10,84,104,101,32,70,111,110,116,32,83,111,102,116,119,97,114,101,32,109,97,121,32,98,101,32,109,111,100,105,102,105,101,100,44,32,97, + 108,116,101,114,101,100,44,32,111,114,32,97,100,100,101,100,32,116,111,44,32,97,110,100,32,105,110,10,112,97,114,116,105,99,117,108,97,114,32,116, + 104,101,32,100,101,115,105,103,110,115,32,111,102,32,103,108,121,112,104,115,32,111,114,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104, + 101,32,70,111,110,116,115,32,109,97,121,32,98,101,10,109,111,100,105,102,105,101,100,32,97,110,100,32,97,100,100,105,116,105,111,110,97,108,32,103, + 108,121,112,104,115,32,111,114,32,99,104,97,114,97,99,116,101,114,115,32,109,97,121,32,98,101,32,97,100,100,101,100,32,116,111,32,116,104,101,10, + 70,111,110,116,115,44,32,111,110,108,121,32,105,102,32,116,104,101,32,102,111,110,116,115,32,97,114,101,32,114,101,110,97,109,101,100,32,116,111,32, + 110,97,109,101,115,32,110,111,116,32,99,111,110,116,97,105,110,105,110,103,32,101,105,116,104,101,114,10,116,104,101,32,119,111,114,100,115,32,34,84, + 97,118,109,106,111,110,103,32,66,97,104,34,32,111,114,32,116,104,101,32,119,111,114,100,32,34,65,114,101,118,34,46,10,10,84,104,105,115,32,76, + 105,99,101,110,115,101,32,98,101,99,111,109,101,115,32,110,117,108,108,32,97,110,100,32,118,111,105,100,32,116,111,32,116,104,101,32,101,120,116,101, + 110,116,32,97,112,112,108,105,99,97,98,108,101,32,116,111,32,70,111,110,116,115,10,111,114,32,70,111,110,116,32,83,111,102,116,119,97,114,101,32, + 116,104,97,116,32,104,97,115,32,98,101,101,110,32,109,111,100,105,102,105,101,100,32,97,110,100,32,105,115,32,100,105,115,116,114,105,98,117,116,101, + 100,32,117,110,100,101,114,32,116,104,101,32,10,34,84,97,118,109,106,111,110,103,32,66,97,104,32,65,114,101,118,34,32,110,97,109,101,115,46,10, + 10,84,104,101,32,70,111,110,116,32,83,111,102,116,119,97,114,101,32,109,97,121,32,98,101,32,115,111,108,100,32,97,115,32,112,97,114,116,32,111, + 102,32,97,32,108,97,114,103,101,114,32,115,111,102,116,119,97,114,101,32,112,97,99,107,97,103,101,32,98,117,116,10,110,111,32,99,111,112,121,32, + 111,102,32,111,110,101,32,111,114,32,109,111,114,101,32,111,102,32,116,104,101,32,70,111,110,116,32,83,111,102,116,119,97,114,101,32,116,121,112,101, + 102,97,99,101,115,32,109,97,121,32,98,101,32,115,111,108,100,32,98,121,10,105,116,115,101,108,102,46,10,10,84,72,69,32,70,79,78,84,32,83, + 79,70,84,87,65,82,69,32,73,83,32,80,82,79,86,73,68,69,68,32,34,65,83,32,73,83,34,44,32,87,73,84,72,79,85,84,32,87,65,82, + 82,65,78,84,89,32,79,70,32,65,78,89,32,75,73,78,68,44,10,69,88,80,82,69,83,83,32,79,82,32,73,77,80,76,73,69,68,44,32,73, + 78,67,76,85,68,73,78,71,32,66,85,84,32,78,79,84,32,76,73,77,73,84,69,68,32,84,79,32,65,78,89,32,87,65,82,82,65,78,84,73, + 69,83,32,79,70,10,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,44,32,70,73,84,78,69,83,83,32,70,79,82,32,65,32,80,65,82, + 84,73,67,85,76,65,82,32,80,85,82,80,79,83,69,32,65,78,68,32,78,79,78,73,78,70,82,73,78,71,69,77,69,78,84,10,79,70,32,67, + 79,80,89,82,73,71,72,84,44,32,80,65,84,69,78,84,44,32,84,82,65,68,69,77,65,82,75,44,32,79,82,32,79,84,72,69,82,32,82,73, + 71,72,84,46,32,73,78,32,78,79,32,69,86,69,78,84,32,83,72,65,76,76,10,84,65,86,77,74,79,78,71,32,66,65,72,32,66,69,32,76, + 73,65,66,76,69,32,70,79,82,32,65,78,89,32,67,76,65,73,77,44,32,68,65,77,65,71,69,83,32,79,82,32,79,84,72,69,82,32,76,73, + 65,66,73,76,73,84,89,44,10,73,78,67,76,85,68,73,78,71,32,65,78,89,32,71,69,78,69,82,65,76,44,32,83,80,69,67,73,65,76,44, + 32,73,78,68,73,82,69,67,84,44,32,73,78,67,73,68,69,78,84,65,76,44,32,79,82,32,67,79,78,83,69,81,85,69,78,84,73,65,76,10, + 68,65,77,65,71,69,83,44,32,87,72,69,84,72,69,82,32,73,78,32,65,78,32,65,67,84,73,79,78,32,79,70,32,67,79,78,84,82,65,67, + 84,44,32,84,79,82,84,32,79,82,32,79,84,72,69,82,87,73,83,69,44,32,65,82,73,83,73,78,71,10,70,82,79,77,44,32,79,85,84,32, + 79,70,32,84,72,69,32,85,83,69,32,79,82,32,73,78,65,66,73,76,73,84,89,32,84,79,32,85,83,69,32,84,72,69,32,70,79,78,84,32, + 83,79,70,84,87,65,82,69,32,79,82,32,70,82,79,77,10,79,84,72,69,82,32,68,69,65,76,73,78,71,83,32,73,78,32,84,72,69,32,70, + 79,78,84,32,83,79,70,84,87,65,82,69,46,10,10,69,120,99,101,112,116,32,97,115,32,99,111,110,116,97,105,110,101,100,32,105,110,32,116,104, + 105,115,32,110,111,116,105,99,101,44,32,116,104,101,32,110,97,109,101,32,111,102,32,84,97,118,109,106,111,110,103,32,66,97,104,32,115,104,97,108, + 108,32,110,111,116,10,98,101,32,117,115,101,100,32,105,110,32,97,100,118,101,114,116,105,115,105,110,103,32,111,114,32,111,116,104,101,114,119,105,115, + 101,32,116,111,32,112,114,111,109,111,116,101,32,116,104,101,32,115,97,108,101,44,32,117,115,101,32,111,114,32,111,116,104,101,114,10,100,101,97,108, + 105,110,103,115,32,105,110,32,116,104,105,115,32,70,111,110,116,32,83,111,102,116,119,97,114,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114, + 32,119,114,105,116,116,101,110,32,97,117,116,104,111,114,105,122,97,116,105,111,110,10,102,114,111,109,32,84,97,118,109,106,111,110,103,32,66,97,104, + 46,32,70,111,114,32,102,117,114,116,104,101,114,32,105,110,102,111,114,109,97,116,105,111,110,44,32,99,111,110,116,97,99,116,58,32,116,97,118,109, + 106,111,110,103,32,64,32,102,114,101,101,10,46,32,102,114,46,0,0,104,0,116,0,116,0,112,0,58,0,47,0,47,0,100,0,101,0,106,0,97, + 0,118,0,117,0,46,0,115,0,111,0,117,0,114,0,99,0,101,0,102,0,111,0,114,0,103,0,101,0,46,0,110,0,101,0,116,0,47,0,119, + 0,105,0,107,0,105,0,47,0,105,0,110,0,100,0,101,0,120,0,46,0,112,0,104,0,112,0,47,0,76,0,105,0,99,0,101,0,110,0,115, + 0,101,0,0,104,116,116,112,58,47,47,100,101,106,97,118,117,46,115,111,117,114,99,101,102,111,114,103,101,46,110,101,116,47,119,105,107,105,47,105, + 110,100,101,120,46,112,104,112,47,76,105,99,101,110,115,101,0,0,68,0,101,0,106,0,97,0,86,0,117,0,32,0,83,0,97,0,110,0,115,0, + 0,68,101,106,97,86,117,32,83,97,110,115,0,0,66,0,111,0,111,0,107,0,0,66,111,111,107,0,0,2,0,0,0,0,0,0,255,126,0,90, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,220,0,0,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,96,0,97,0,172,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,2,0,138,0,218,0,131,0,147,0,242,0,243,0,141,0,151,0,136,0,195,0,222,0,241,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,1,3,1,4,1,5,1,6,1,7,1,8,0,253,0,254,1,9,1,10,1,11,1,12,0,255,1,0,1,13, + 1,14,1,15,1,1,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,248,0,249,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,0,250,0,215,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,0,226,0,227,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,0,176,0,177,1,74,1,75,1,76,1,77,1,78,1,79,1,80,1,81,1,82,1,83,0,251, + 0,252,0,228,0,229,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,0,187,1,106,1,107,1,108,1,109,0,230,0,231,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,0,166,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,0,216, + 0,225,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,0,219,0,220,0,221, + 0,224,0,217,0,223,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, + 0,159,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,0,155,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,4,172,4,173,4,174,4,175,4,176,4,177,4,178, + 4,179,4,180,4,181,4,182,4,183,4,184,4,185,4,186,4,187,4,188,4,189,4,190,4,191,4,192,4,193,4,194,4,195,4,196,4,197,4,198, + 4,199,4,200,4,201,4,202,4,203,4,204,4,205,4,206,4,207,4,208,4,209,4,210,4,211,4,212,4,213,4,214,4,215,4,216,4,217,4,218, + 4,219,4,220,4,221,4,222,4,223,4,224,4,225,4,226,4,227,4,228,4,229,4,230,4,231,4,232,4,233,4,234,4,235,4,236,4,237,4,238, + 4,239,4,240,4,241,4,242,4,243,4,244,4,245,4,246,4,247,4,248,4,249,4,250,4,251,4,252,4,253,4,254,4,255,5,0,5,1,5,2, + 5,3,5,4,5,5,5,6,5,7,5,8,5,9,5,10,5,11,5,12,5,13,5,14,5,15,5,16,5,17,5,18,5,19,5,20,5,21,5,22, + 5,23,5,24,5,25,5,26,5,27,5,28,5,29,5,30,5,31,5,32,5,33,5,34,5,35,5,36,5,37,5,38,5,39,5,40,5,41,5,42, + 5,43,5,44,5,45,5,46,5,47,5,48,5,49,5,50,5,51,5,52,5,53,5,54,5,55,5,56,5,57,5,58,5,59,5,60,5,61,5,62, + 5,63,5,64,5,65,5,66,5,67,5,68,5,69,5,70,5,71,5,72,5,73,5,74,5,75,5,76,5,77,5,78,5,79,5,80,5,81,5,82, + 5,83,5,84,5,85,5,86,5,87,5,88,5,89,5,90,5,91,5,92,5,93,5,94,5,95,5,96,5,97,5,98,5,99,5,100,5,101,5,102, + 5,103,5,104,5,105,5,106,5,107,5,108,5,109,5,110,5,111,5,112,5,113,5,114,5,115,5,116,5,117,5,118,5,119,5,120,5,121,5,122, + 5,123,5,124,5,125,5,126,5,127,5,128,5,129,5,130,5,131,5,132,5,133,5,134,5,135,5,136,5,137,5,138,5,139,5,140,5,141,5,142, + 5,143,5,144,5,145,5,146,5,147,5,148,5,149,5,150,5,151,5,152,5,153,5,154,5,155,5,156,5,157,5,158,5,159,5,160,5,161,5,162, + 5,163,5,164,5,165,5,166,5,167,5,168,5,169,5,170,5,171,5,172,5,173,5,174,5,175,5,176,5,177,5,178,5,179,5,180,5,181,5,182, + 5,183,5,184,5,185,5,186,5,187,5,188,5,189,5,190,5,191,5,192,5,193,5,194,5,195,5,196,5,197,5,198,5,199,5,200,5,201,5,202, + 5,203,5,204,5,205,5,206,5,207,5,208,5,209,5,210,5,211,5,212,5,213,5,214,5,215,5,216,5,217,5,218,5,219,5,220,5,221,5,222, + 5,223,5,224,5,225,5,226,5,227,5,228,5,229,5,230,5,231,5,232,5,233,5,234,5,235,5,236,5,237,5,238,5,239,5,240,5,241,5,242, + 5,243,5,244,5,245,5,246,5,247,5,248,5,249,5,250,5,251,5,252,5,253,5,254,5,255,6,0,6,1,6,2,6,3,6,4,6,5,6,6, + 6,7,6,8,6,9,6,10,6,11,6,12,6,13,6,14,6,15,6,16,6,17,6,18,6,19,6,20,6,21,6,22,6,23,6,24,6,25,6,26, + 6,27,6,28,6,29,6,30,6,31,6,32,6,33,6,34,6,35,6,36,6,37,6,38,6,39,6,40,6,41,6,42,6,43,6,44,6,45,6,46, + 6,47,6,48,6,49,6,50,6,51,6,52,6,53,6,54,6,55,6,56,6,57,6,58,6,59,6,60,6,61,6,62,6,63,6,64,6,65,6,66, + 6,67,6,68,6,69,6,70,6,71,6,72,6,73,6,74,6,75,6,76,6,77,6,78,6,79,6,80,6,81,6,82,6,83,6,84,6,85,6,86, + 6,87,6,88,6,89,6,90,6,91,6,92,6,93,6,94,6,95,6,96,6,97,6,98,6,99,6,100,6,101,6,102,6,103,6,104,6,105,6,106, + 6,107,6,108,6,109,6,110,6,111,6,112,6,113,6,114,6,115,6,116,6,117,6,118,6,119,6,120,6,121,6,122,6,123,6,124,6,125,6,126, + 6,127,6,128,6,129,6,130,6,131,6,132,6,133,6,134,6,135,6,136,6,137,6,138,6,139,6,140,6,141,6,142,6,143,6,144,6,145,6,146, + 6,147,6,148,6,149,6,150,6,151,6,152,6,153,6,154,6,155,6,156,6,157,6,158,6,159,6,160,6,161,6,162,6,163,6,164,6,165,6,166, + 6,167,6,168,6,169,6,170,6,171,6,172,6,173,6,174,6,175,6,176,6,177,6,178,6,179,6,180,6,181,6,182,6,183,6,184,6,185,6,186, + 6,187,6,188,6,189,6,190,6,191,6,192,6,193,6,194,6,195,6,196,6,197,6,198,6,199,6,200,6,201,6,202,6,203,6,204,6,205,6,206, + 6,207,6,208,6,209,6,210,6,211,6,212,6,213,6,214,6,215,6,216,6,217,6,218,6,219,6,220,6,221,6,222,6,223,6,224,6,225,6,226, + 6,227,6,228,6,229,6,230,6,231,6,232,6,233,6,234,6,235,6,236,6,237,6,238,6,239,6,240,6,241,6,242,6,243,6,244,6,245,6,246, + 6,247,6,248,6,249,6,250,6,251,6,252,6,253,6,254,6,255,7,0,7,1,7,2,7,3,7,4,7,5,7,6,7,7,7,8,7,9,7,10, + 7,11,7,12,7,13,7,14,7,15,7,16,7,17,7,18,7,19,7,20,7,21,7,22,7,23,7,24,7,25,7,26,7,27,7,28,7,29,7,30, + 7,31,7,32,7,33,7,34,7,35,7,36,7,37,7,38,7,39,7,40,7,41,7,42,7,43,7,44,7,45,7,46,7,47,7,48,7,49,7,50, + 7,51,7,52,7,53,7,54,7,55,7,56,7,57,7,58,7,59,7,60,7,61,7,62,7,63,7,64,7,65,7,66,7,67,7,68,7,69,7,70, + 7,71,7,72,7,73,7,74,7,75,7,76,7,77,7,78,7,79,7,80,7,81,7,82,7,83,7,84,7,85,7,86,7,87,7,88,7,89,7,90, + 7,91,7,92,7,93,7,94,7,95,7,96,7,97,7,98,7,99,7,100,7,101,7,102,7,103,7,104,7,105,7,106,7,107,7,108,7,109,7,110, + 7,111,7,112,7,113,7,114,7,115,7,116,7,117,7,118,7,119,7,120,7,121,7,122,7,123,7,124,7,125,7,126,7,127,7,128,7,129,7,130, + 7,131,7,132,7,133,7,134,7,135,7,136,7,137,7,138,7,139,7,140,7,141,7,142,7,143,7,144,7,145,7,146,7,147,7,148,7,149,7,150, + 7,151,7,152,7,153,7,154,7,155,7,156,7,157,7,158,7,159,7,160,7,161,7,162,7,163,7,164,7,165,7,166,7,167,7,168,7,169,7,170, + 7,171,7,172,7,173,7,174,7,175,7,176,7,177,7,178,7,179,7,180,7,181,7,182,7,183,7,184,7,185,7,186,7,187,7,188,7,189,7,190, + 7,191,7,192,7,193,7,194,7,195,7,196,7,197,7,198,7,199,7,200,7,201,7,202,7,203,7,204,7,205,7,206,7,207,7,208,7,209,7,210, + 7,211,7,212,7,213,7,214,7,215,7,216,7,217,7,218,7,219,7,220,7,221,7,222,7,223,7,224,7,225,7,226,7,227,7,228,7,229,7,230, + 7,231,7,232,7,233,7,234,7,235,7,236,7,237,7,238,7,239,7,240,7,241,7,242,7,243,7,244,7,245,7,246,7,247,7,248,7,249,7,250, + 7,251,7,252,7,253,7,254,7,255,8,0,8,1,8,2,8,3,8,4,8,5,8,6,8,7,8,8,8,9,8,10,8,11,8,12,8,13,8,14, + 8,15,8,16,8,17,8,18,8,19,8,20,8,21,8,22,8,23,8,24,8,25,8,26,8,27,8,28,8,29,8,30,8,31,8,32,8,33,8,34, + 8,35,8,36,8,37,8,38,8,39,8,40,8,41,8,42,8,43,8,44,8,45,8,46,8,47,8,48,8,49,8,50,8,51,8,52,8,53,8,54, + 8,55,8,56,8,57,8,58,8,59,8,60,8,61,8,62,8,63,8,64,8,65,8,66,8,67,8,68,8,69,8,70,8,71,8,72,8,73,8,74, + 8,75,8,76,8,77,8,78,8,79,8,80,8,81,8,82,8,83,8,84,8,85,8,86,8,87,8,88,8,89,8,90,8,91,8,92,8,93,8,94, + 8,95,8,96,8,97,8,98,8,99,8,100,8,101,8,102,8,103,8,104,8,105,8,106,8,107,8,108,8,109,8,110,8,111,8,112,8,113,8,114, + 8,115,8,116,8,117,8,118,8,119,8,120,8,121,8,122,8,123,8,124,8,125,8,126,8,127,8,128,8,129,8,130,8,131,8,132,8,133,8,134, + 8,135,8,136,8,137,8,138,8,139,8,140,8,141,8,142,8,143,8,144,8,145,8,146,8,147,8,148,8,149,8,150,8,151,8,152,8,153,8,154, + 8,155,8,156,8,157,8,158,8,159,8,160,8,161,8,162,8,163,8,164,8,165,8,166,8,167,8,168,8,169,8,170,8,171,8,172,8,173,8,174, + 8,175,8,176,8,177,8,178,8,179,8,180,8,181,8,182,8,183,8,184,8,185,8,186,8,187,8,188,8,189,8,190,8,191,8,192,8,193,8,194, + 8,195,8,196,8,197,8,198,8,199,8,200,8,201,8,202,8,203,8,204,8,205,8,206,8,207,8,208,8,209,8,210,8,211,8,212,8,213,8,214, + 8,215,8,216,8,217,8,218,8,219,8,220,8,221,8,222,8,223,8,224,8,225,8,226,8,227,8,228,8,229,8,230,8,231,8,232,8,233,8,234, + 8,235,8,236,8,237,8,238,8,239,8,240,8,241,8,242,8,243,8,244,8,245,8,246,8,247,8,248,8,249,8,250,8,251,8,252,8,253,8,254, + 8,255,9,0,9,1,9,2,9,3,9,4,9,5,9,6,9,7,9,8,9,9,9,10,9,11,9,12,9,13,9,14,9,15,9,16,9,17,9,18, + 9,19,9,20,9,21,9,22,9,23,9,24,9,25,9,26,9,27,9,28,9,29,9,30,9,31,9,32,9,33,9,34,9,35,9,36,9,37,9,38, + 9,39,9,40,9,41,9,42,9,43,9,44,9,45,9,46,9,47,9,48,9,49,9,50,9,51,9,52,9,53,9,54,9,55,9,56,9,57,9,58, + 9,59,9,60,9,61,9,62,9,63,9,64,9,65,9,66,9,67,9,68,9,69,9,70,9,71,9,72,9,73,9,74,9,75,9,76,9,77,9,78, + 9,79,9,80,9,81,9,82,9,83,9,84,9,85,9,86,9,87,9,88,9,89,9,90,9,91,9,92,9,93,9,94,9,95,9,96,9,97,9,98, + 9,99,9,100,9,101,9,102,9,103,9,104,9,105,9,106,9,107,9,108,9,109,9,110,9,111,9,112,9,113,9,114,9,115,9,116,9,117,9,118, + 9,119,9,120,9,121,9,122,9,123,9,124,9,125,9,126,9,127,9,128,9,129,9,130,9,131,9,132,9,133,9,134,9,135,9,136,9,137,9,138, + 9,139,9,140,9,141,9,142,9,143,9,144,9,145,9,146,9,147,9,148,9,149,9,150,9,151,9,152,9,153,9,154,9,155,9,156,9,157,9,158, + 9,159,9,160,9,161,9,162,9,163,9,164,9,165,9,166,9,167,9,168,9,169,9,170,9,171,9,172,9,173,9,174,9,175,9,176,9,177,9,178, + 9,179,9,180,9,181,9,182,9,183,9,184,9,185,9,186,9,187,9,188,9,189,9,190,9,191,9,192,9,193,9,194,9,195,9,196,9,197,9,198, + 9,199,9,200,9,201,9,202,9,203,9,204,9,205,9,206,9,207,9,208,9,209,9,210,9,211,9,212,9,213,9,214,9,215,9,216,9,217,9,218, + 9,219,9,220,9,221,9,222,9,223,9,224,9,225,9,226,9,227,9,228,9,229,9,230,9,231,9,232,9,233,9,234,9,235,9,236,9,237,9,238, + 9,239,9,240,9,241,9,242,9,243,9,244,9,245,9,246,9,247,9,248,9,249,9,250,9,251,9,252,9,253,9,254,9,255,10,0,10,1,10,2, + 10,3,10,4,10,5,10,6,10,7,10,8,10,9,10,10,10,11,10,12,10,13,10,14,10,15,10,16,10,17,10,18,10,19,10,20,10,21,10,22, + 10,23,10,24,10,25,10,26,10,27,10,28,10,29,10,30,10,31,10,32,10,33,10,34,10,35,10,36,10,37,10,38,10,39,10,40,10,41,10,42, + 10,43,10,44,10,45,10,46,10,47,10,48,10,49,10,50,10,51,10,52,10,53,10,54,10,55,10,56,10,57,10,58,10,59,10,60,10,61,10,62, + 10,63,10,64,10,65,10,66,10,67,10,68,10,69,10,70,10,71,10,72,10,73,10,74,10,75,10,76,10,77,10,78,10,79,10,80,10,81,10,82, + 10,83,10,84,10,85,10,86,10,87,10,88,10,89,10,90,10,91,10,92,10,93,10,94,10,95,10,96,10,97,10,98,10,99,10,100,10,101,10,102, + 10,103,10,104,10,105,10,106,10,107,10,108,10,109,10,110,10,111,10,112,10,113,10,114,10,115,10,116,10,117,10,118,10,119,10,120,10,121,10,122, + 10,123,10,124,10,125,10,126,10,127,10,128,10,129,10,130,10,131,10,132,10,133,10,134,10,135,10,136,10,137,10,138,10,139,10,140,10,141,10,142, + 10,143,10,144,10,145,10,146,10,147,10,148,10,149,10,150,10,151,10,152,10,153,10,154,10,155,10,156,10,157,10,158,10,159,10,160,10,161,10,162, + 10,163,10,164,10,165,10,166,10,167,10,168,10,169,10,170,10,171,10,172,10,173,10,174,10,175,10,176,10,177,10,178,10,179,10,180,10,181,10,182, + 10,183,10,184,10,185,10,186,10,187,10,188,10,189,10,190,10,191,10,192,10,193,10,194,10,195,10,196,10,197,10,198,10,199,10,200,10,201,10,202, + 10,203,10,204,10,205,10,206,10,207,10,208,10,209,10,210,10,211,10,212,10,213,10,214,10,215,10,216,10,217,10,218,10,219,10,220,10,221,10,222, + 10,223,10,224,10,225,10,226,10,227,10,228,10,229,10,230,10,231,10,232,10,233,10,234,10,235,10,236,10,237,10,238,10,239,10,240,10,241,10,242, + 10,243,10,244,10,245,10,246,10,247,10,248,10,249,10,250,10,251,10,252,10,253,10,254,10,255,11,0,11,1,11,2,11,3,11,4,11,5,11,6, + 11,7,11,8,11,9,11,10,11,11,11,12,11,13,11,14,11,15,11,16,11,17,11,18,0,178,0,179,11,19,11,20,11,21,0,182,0,183,0,196, + 11,22,0,180,0,181,0,197,11,23,0,130,0,194,0,135,11,24,11,25,11,26,0,171,11,27,11,28,11,29,11,30,11,31,11,32,11,33,11,34, + 11,35,0,198,11,36,11,37,11,38,11,39,11,40,11,41,11,42,11,43,0,190,0,191,11,44,11,45,11,46,11,47,11,48,11,49,11,50,11,51, + 11,52,0,188,11,53,11,54,11,55,11,56,11,57,11,58,11,59,11,60,11,61,11,62,11,63,11,64,11,65,11,66,11,67,11,68,11,69,11,70, + 11,71,11,72,11,73,11,74,11,75,11,76,11,77,11,78,11,79,11,80,11,81,11,82,11,83,11,84,11,85,11,86,11,87,11,88,11,89,11,90, + 11,91,11,92,11,93,11,94,11,95,11,96,11,97,11,98,11,99,11,100,11,101,11,102,11,103,11,104,11,105,11,106,11,107,11,108,11,109,11,110, + 11,111,11,112,11,113,11,114,11,115,11,116,11,117,11,118,11,119,11,120,11,121,11,122,11,123,11,124,11,125,11,126,11,127,11,128,11,129,11,130, + 11,131,11,132,11,133,11,134,11,135,0,247,11,136,11,137,11,138,11,139,11,140,11,141,11,142,11,143,11,144,11,145,11,146,11,147,11,148,11,149, + 11,150,11,151,11,152,11,153,11,154,11,155,11,156,11,157,11,158,11,159,11,160,11,161,11,162,11,163,11,164,11,165,11,166,11,167,11,168,11,169, + 11,170,11,171,11,172,11,173,11,174,11,175,11,176,11,177,11,178,11,179,11,180,11,181,11,182,11,183,11,184,11,185,11,186,11,187,11,188,11,189, + 11,190,11,191,11,192,11,193,11,194,11,195,11,196,0,140,11,197,11,198,11,199,11,200,11,201,11,202,11,203,11,204,11,205,11,206,11,207,11,208, + 11,209,11,210,11,211,11,212,11,213,11,214,11,215,11,216,11,217,11,218,11,219,11,220,11,221,11,222,11,223,11,224,11,225,11,226,11,227,11,228, + 11,229,11,230,11,231,11,232,11,233,11,234,11,235,11,236,11,237,11,238,11,239,11,240,11,241,11,242,11,243,11,244,11,245,11,246,11,247,11,248, + 11,249,11,250,11,251,11,252,11,253,11,254,11,255,12,0,12,1,12,2,12,3,12,4,12,5,12,6,12,7,12,8,12,9,12,10,12,11,12,12, + 12,13,12,14,12,15,12,16,12,17,12,18,12,19,12,20,12,21,12,22,12,23,12,24,12,25,12,26,12,27,12,28,12,29,12,30,12,31,12,32, + 12,33,12,34,12,35,12,36,12,37,12,38,12,39,12,40,12,41,12,42,12,43,12,44,12,45,12,46,12,47,12,48,12,49,12,50,12,51,12,52, + 12,53,12,54,12,55,12,56,12,57,12,58,12,59,12,60,12,61,12,62,12,63,12,64,12,65,12,66,12,67,12,68,12,69,12,70,12,71,12,72, + 12,73,12,74,12,75,12,76,12,77,12,78,12,79,12,80,12,81,12,82,12,83,12,84,12,85,12,86,12,87,12,88,12,89,12,90,12,91,12,92, + 12,93,12,94,12,95,12,96,12,97,12,98,12,99,12,100,12,101,12,102,12,103,12,104,12,105,12,106,12,107,12,108,12,109,12,110,12,111,12,112, + 12,113,12,114,12,115,12,116,12,117,12,118,12,119,12,120,12,121,12,122,12,123,12,124,12,125,12,126,12,127,12,128,12,129,12,130,12,131,12,132, + 12,133,12,134,12,135,12,136,12,137,12,138,12,139,12,140,12,141,12,142,12,143,12,144,12,145,12,146,12,147,12,148,12,149,12,150,0,152,12,151, + 12,152,12,153,0,168,12,154,12,155,12,156,12,157,12,158,12,159,12,160,12,161,0,154,12,162,0,153,0,239,12,163,12,164,12,165,12,166,12,167, + 12,168,12,169,0,165,12,170,12,171,12,172,0,146,12,173,12,174,12,175,12,176,12,177,12,178,12,179,12,180,12,181,12,182,12,183,12,184,0,156, + 12,185,12,186,12,187,12,188,12,189,12,190,12,191,12,192,12,193,12,194,12,195,12,196,12,197,12,198,12,199,12,200,12,201,12,202,12,203,12,204, + 12,205,12,206,12,207,12,208,12,209,12,210,12,211,12,212,0,167,12,213,12,214,12,215,12,216,12,217,12,218,12,219,12,220,12,221,12,222,12,223, + 12,224,12,225,12,226,12,227,12,228,12,229,12,230,12,231,12,232,12,233,12,234,12,235,0,143,12,236,12,237,12,238,0,148,0,149,12,239,12,240, + 12,241,12,242,12,243,12,244,12,245,12,246,12,247,12,248,12,249,12,250,12,251,12,252,12,253,12,254,12,255,13,0,13,1,13,2,13,3,13,4, + 13,5,13,6,13,7,13,8,13,9,13,10,13,11,13,12,13,13,13,14,13,15,13,16,13,17,13,18,13,19,13,20,13,21,13,22,13,23,13,24, + 13,25,13,26,13,27,13,28,13,29,13,30,13,31,13,32,13,33,13,34,13,35,13,36,13,37,13,38,13,39,13,40,13,41,13,42,13,43,13,44, + 13,45,13,46,13,47,13,48,13,49,13,50,13,51,13,52,13,53,13,54,13,55,13,56,13,57,13,58,13,59,13,60,13,61,13,62,13,63,13,64, + 13,65,13,66,13,67,13,68,13,69,13,70,13,71,13,72,13,73,13,74,13,75,13,76,13,77,13,78,13,79,13,80,13,81,13,82,13,83,13,84, + 13,85,13,86,13,87,13,88,13,89,13,90,13,91,13,92,13,93,13,94,13,95,13,96,13,97,13,98,13,99,13,100,13,101,13,102,13,103,13,104, + 13,105,13,106,13,107,13,108,13,109,13,110,13,111,13,112,13,113,13,114,13,115,13,116,13,117,13,118,13,119,13,120,13,121,13,122,13,123,13,124, + 13,125,13,126,13,127,13,128,13,129,13,130,13,131,13,132,13,133,13,134,13,135,13,136,13,137,13,138,13,139,13,140,13,141,13,142,13,143,13,144, + 13,145,13,146,13,147,13,148,13,149,13,150,13,151,13,152,13,153,13,154,13,155,13,156,13,157,13,158,13,159,13,160,13,161,13,162,13,163,13,164, + 13,165,13,166,13,167,13,168,13,169,13,170,13,171,13,172,13,173,13,174,13,175,13,176,13,177,13,178,13,179,13,180,13,181,13,182,13,183,13,184, + 13,185,13,186,13,187,13,188,13,189,13,190,13,191,13,192,13,193,13,194,13,195,13,196,13,197,13,198,13,199,13,200,13,201,13,202,13,203,13,204, + 13,205,13,206,13,207,13,208,13,209,13,210,13,211,13,212,13,213,13,214,13,215,13,216,13,217,13,218,13,219,13,220,13,221,13,222,13,223,13,224, + 13,225,13,226,13,227,13,228,13,229,13,230,13,231,13,232,13,233,13,234,13,235,13,236,13,237,13,238,13,239,13,240,13,241,13,242,13,243,13,244, + 13,245,13,246,13,247,13,248,13,249,13,250,13,251,13,252,13,253,13,254,13,255,14,0,14,1,14,2,14,3,14,4,14,5,14,6,14,7,14,8, + 14,9,14,10,14,11,14,12,14,13,14,14,14,15,14,16,14,17,14,18,14,19,14,20,14,21,14,22,14,23,14,24,14,25,14,26,14,27,14,28, + 14,29,14,30,14,31,14,32,14,33,14,34,14,35,14,36,14,37,14,38,14,39,14,40,14,41,14,42,14,43,14,44,14,45,14,46,14,47,14,48, + 14,49,14,50,14,51,14,52,14,53,14,54,14,55,14,56,14,57,14,58,14,59,14,60,14,61,14,62,14,63,14,64,14,65,14,66,14,67,14,68, + 14,69,14,70,14,71,14,72,14,73,14,74,14,75,14,76,14,77,14,78,14,79,14,80,14,81,14,82,14,83,14,84,14,85,14,86,14,87,14,88, + 14,89,14,90,14,91,14,92,14,93,14,94,14,95,14,96,14,97,14,98,14,99,14,100,14,101,14,102,14,103,14,104,14,105,14,106,14,107,14,108, + 14,109,14,110,14,111,14,112,14,113,14,114,14,115,14,116,14,117,14,118,14,119,14,120,14,121,14,122,14,123,14,124,14,125,14,126,14,127,14,128, + 14,129,14,130,14,131,14,132,14,133,14,134,14,135,14,136,14,137,14,138,14,139,14,140,14,141,14,142,14,143,14,144,14,145,14,146,14,147,14,148, + 14,149,14,150,14,151,14,152,14,153,14,154,14,155,14,156,14,157,14,158,14,159,0,185,14,160,14,161,14,162,14,163,14,164,14,165,14,166,14,167, + 14,168,14,169,14,170,14,171,14,172,14,173,14,174,14,175,14,176,14,177,14,178,14,179,14,180,14,181,14,182,14,183,14,184,14,185,14,186,14,187, + 14,188,14,189,14,190,14,191,14,192,14,193,14,194,14,195,14,196,14,197,14,198,14,199,14,200,14,201,14,202,14,203,14,204,14,205,14,206,14,207, + 14,208,14,209,14,210,14,211,14,212,14,213,14,214,14,215,14,216,14,217,14,218,14,219,14,220,14,221,14,222,14,223,14,224,14,225,14,226,14,227, + 14,228,14,229,14,230,14,231,14,232,14,233,14,234,14,235,14,236,14,237,14,238,14,239,14,240,14,241,14,242,14,243,14,244,14,245,14,246,14,247, + 14,248,14,249,14,250,14,251,14,252,14,253,14,254,14,255,15,0,15,1,15,2,15,3,15,4,15,5,15,6,15,7,15,8,15,9,15,10,15,11, + 15,12,15,13,15,14,15,15,15,16,15,17,15,18,15,19,15,20,15,21,15,22,15,23,15,24,15,25,15,26,15,27,15,28,15,29,15,30,15,31, + 15,32,15,33,15,34,15,35,15,36,15,37,15,38,15,39,15,40,15,41,15,42,15,43,15,44,15,45,15,46,15,47,15,48,15,49,15,50,15,51, + 15,52,15,53,15,54,15,55,15,56,15,57,15,58,15,59,15,60,15,61,15,62,15,63,15,64,15,65,15,66,15,67,15,68,15,69,15,70,15,71, + 15,72,15,73,15,74,15,75,15,76,15,77,15,78,15,79,15,80,15,81,15,82,15,83,15,84,15,85,15,86,15,87,15,88,15,89,15,90,15,91, + 15,92,15,93,15,94,15,95,15,96,15,97,15,98,15,99,15,100,15,101,15,102,15,103,15,104,15,105,15,106,15,107,15,108,15,109,15,110,15,111, + 15,112,15,113,15,114,15,115,15,116,15,117,15,118,15,119,15,120,15,121,15,122,15,123,15,124,15,125,15,126,15,127,15,128,15,129,15,130,15,131, + 15,132,15,133,15,134,15,135,15,136,15,137,15,138,15,139,15,140,15,141,15,142,15,143,15,144,15,145,15,146,15,147,15,148,15,149,15,150,15,151, + 15,152,15,153,15,154,15,155,15,156,15,157,15,158,15,159,15,160,15,161,15,162,15,163,15,164,15,165,15,166,15,167,15,168,15,169,15,170,15,171, + 15,172,15,173,15,174,15,175,15,176,15,177,15,178,15,179,15,180,15,181,15,182,15,183,15,184,15,185,15,186,15,187,15,188,15,189,15,190,15,191, + 15,192,15,193,15,194,15,195,15,196,15,197,15,198,15,199,15,200,15,201,15,202,15,203,15,204,15,205,15,206,15,207,15,208,15,209,15,210,15,211, + 15,212,15,213,15,214,15,215,15,216,15,217,15,218,15,219,15,220,15,221,15,222,15,223,15,224,15,225,15,226,15,227,15,228,15,229,15,230,15,231, + 15,232,15,233,15,234,15,235,15,236,15,237,15,238,15,239,15,240,15,241,15,242,15,243,15,244,15,245,15,246,15,247,15,248,15,249,15,250,15,251, + 15,252,15,253,15,254,15,255,16,0,16,1,16,2,16,3,16,4,16,5,16,6,16,7,16,8,16,9,16,10,16,11,16,12,16,13,16,14,16,15, + 16,16,16,17,16,18,16,19,16,20,16,21,16,22,16,23,16,24,16,25,16,26,16,27,16,28,16,29,16,30,16,31,16,32,16,33,16,34,16,35, + 16,36,16,37,16,38,16,39,16,40,16,41,16,42,16,43,16,44,16,45,16,46,16,47,16,48,16,49,16,50,16,51,16,52,16,53,16,54,16,55, + 16,56,16,57,16,58,16,59,16,60,16,61,16,62,16,63,16,64,16,65,16,66,16,67,16,68,16,69,16,70,16,71,16,72,16,73,16,74,16,75, + 16,76,16,77,16,78,16,79,16,80,16,81,16,82,16,83,16,84,16,85,16,86,16,87,16,88,16,89,16,90,16,91,16,92,16,93,16,94,16,95, + 16,96,16,97,16,98,16,99,16,100,16,101,16,102,16,103,16,104,16,105,16,106,16,107,16,108,16,109,16,110,16,111,16,112,16,113,16,114,16,115, + 16,116,16,117,16,118,16,119,16,120,16,121,16,122,16,123,16,124,16,125,16,126,16,127,16,128,16,129,16,130,16,131,16,132,16,133,16,134,16,135, + 16,136,16,137,16,138,16,139,16,140,16,141,16,142,16,143,16,144,16,145,16,146,16,147,16,148,16,149,16,150,16,151,16,152,16,153,16,154,16,155, + 16,156,16,157,16,158,16,159,16,160,16,161,16,162,16,163,16,164,16,165,16,166,16,167,16,168,16,169,16,170,16,171,16,172,16,173,16,174,16,175, + 16,176,16,177,16,178,16,179,16,180,16,181,16,182,16,183,16,184,16,185,16,186,16,187,16,188,16,189,16,190,16,191,16,192,16,193,16,194,16,195, + 16,196,16,197,16,198,16,199,16,200,16,201,16,202,16,203,16,204,16,205,16,206,16,207,16,208,16,209,16,210,16,211,16,212,16,213,16,214,16,215, + 16,216,16,217,16,218,16,219,16,220,16,221,16,222,16,223,16,224,16,225,16,226,16,227,16,228,16,229,16,230,16,231,16,232,16,233,16,234,16,235, + 16,236,16,237,16,238,16,239,16,240,16,241,16,242,16,243,16,244,16,245,16,246,16,247,16,248,16,249,16,250,16,251,16,252,16,253,16,254,16,255, + 17,0,17,1,17,2,17,3,17,4,17,5,17,6,17,7,17,8,17,9,17,10,17,11,17,12,17,13,17,14,17,15,17,16,17,17,17,18,17,19, + 17,20,17,21,17,22,17,23,17,24,17,25,17,26,17,27,17,28,17,29,17,30,17,31,17,32,17,33,17,34,17,35,17,36,17,37,17,38,17,39, + 17,40,17,41,17,42,17,43,17,44,17,45,17,46,17,47,17,48,17,49,17,50,17,51,17,52,17,53,17,54,17,55,17,56,17,57,17,58,17,59, + 17,60,17,61,17,62,17,63,17,64,17,65,17,66,17,67,17,68,17,69,17,70,17,71,17,72,17,73,17,74,17,75,17,76,17,77,17,78,17,79, + 17,80,17,81,17,82,17,83,17,84,17,85,17,86,17,87,17,88,17,89,17,90,17,91,17,92,17,93,17,94,17,95,17,96,17,97,17,98,17,99, + 17,100,17,101,17,102,17,103,17,104,17,105,17,106,17,107,17,108,17,109,17,110,17,111,17,112,17,113,17,114,17,115,17,116,17,117,17,118,17,119, + 17,120,17,121,17,122,17,123,17,124,17,125,17,126,17,127,17,128,17,129,17,130,17,131,17,132,17,133,17,134,17,135,17,136,17,137,17,138,17,139, + 17,140,17,141,17,142,17,143,17,144,17,145,17,146,17,147,17,148,17,149,17,150,17,151,17,152,17,153,17,154,17,155,17,156,17,157,17,158,17,159, + 17,160,17,161,17,162,17,163,17,164,17,165,17,166,17,167,17,168,17,169,17,170,17,171,17,172,17,173,17,174,17,175,17,176,17,177,17,178,17,179, + 17,180,17,181,17,182,17,183,17,184,17,185,17,186,17,187,17,188,17,189,17,190,17,191,17,192,17,193,17,194,17,195,17,196,17,197,17,198,17,199, + 17,200,17,201,17,202,17,203,17,204,17,205,17,206,17,207,17,208,17,209,17,210,17,211,17,212,17,213,17,214,17,215,17,216,17,217,17,218,17,219, + 17,220,17,221,17,222,17,223,17,224,17,225,17,226,17,227,17,228,17,229,17,230,17,231,17,232,17,233,17,234,17,235,17,236,17,237,17,238,17,239, + 17,240,17,241,17,242,17,243,17,244,17,245,17,246,17,247,17,248,17,249,17,250,17,251,17,252,17,253,17,254,17,255,18,0,18,1,18,2,18,3, + 18,4,18,5,18,6,18,7,18,8,18,9,18,10,18,11,18,12,18,13,18,14,18,15,18,16,18,17,18,18,18,19,18,20,18,21,18,22,18,23, + 18,24,18,25,18,26,18,27,18,28,18,29,18,30,18,31,18,32,18,33,18,34,18,35,18,36,18,37,18,38,18,39,18,40,18,41,18,42,18,43, + 18,44,18,45,18,46,18,47,18,48,18,49,18,50,18,51,18,52,18,53,18,54,18,55,18,56,18,57,18,58,18,59,18,60,18,61,18,62,18,63, + 18,64,18,65,18,66,18,67,18,68,18,69,18,70,18,71,18,72,18,73,18,74,18,75,18,76,18,77,18,78,18,79,18,80,18,81,18,82,18,83, + 18,84,18,85,18,86,18,87,18,88,18,89,18,90,18,91,18,92,18,93,18,94,18,95,18,96,18,97,18,98,18,99,18,100,18,101,18,102,18,103, + 18,104,18,105,18,106,18,107,18,108,18,109,18,110,18,111,18,112,18,113,18,114,18,115,18,116,18,117,18,118,18,119,18,120,18,121,18,122,18,123, + 18,124,18,125,18,126,18,127,18,128,18,129,18,130,18,131,18,132,18,133,18,134,18,135,18,136,18,137,18,138,18,139,18,140,18,141,18,142,18,143, + 18,144,18,145,18,146,18,147,18,148,18,149,18,150,18,151,18,152,18,153,18,154,18,155,18,156,18,157,18,158,18,159,18,160,18,161,18,162,18,163, + 18,164,18,165,18,166,18,167,18,168,18,169,18,170,18,171,18,172,18,173,18,174,18,175,18,176,18,177,18,178,18,179,18,180,18,181,18,182,18,183, + 18,184,18,185,18,186,18,187,18,188,18,189,18,190,18,191,18,192,18,193,18,194,18,195,18,196,18,197,18,198,18,199,18,200,18,201,18,202,18,203, + 18,204,18,205,18,206,18,207,18,208,18,209,18,210,18,211,18,212,18,213,18,214,18,215,18,216,18,217,18,218,18,219,18,220,18,221,18,222,18,223, + 18,224,18,225,18,226,18,227,18,228,18,229,18,230,18,231,18,232,18,233,18,234,18,235,18,236,18,237,18,238,18,239,18,240,18,241,18,242,18,243, + 18,244,18,245,18,246,18,247,18,248,18,249,18,250,18,251,18,252,18,253,18,254,18,255,19,0,19,1,19,2,19,3,19,4,19,5,19,6,19,7, + 19,8,19,9,19,10,19,11,19,12,19,13,19,14,19,15,19,16,19,17,19,18,19,19,19,20,19,21,19,22,19,23,19,24,19,25,19,26,19,27, + 19,28,19,29,19,30,19,31,19,32,19,33,19,34,19,35,19,36,19,37,19,38,19,39,19,40,19,41,19,42,19,43,19,44,19,45,19,46,19,47, + 19,48,19,49,19,50,19,51,19,52,19,53,19,54,19,55,19,56,19,57,19,58,19,59,19,60,19,61,19,62,19,63,19,64,19,65,19,66,19,67, + 19,68,19,69,19,70,19,71,19,72,19,73,19,74,19,75,19,76,19,77,19,78,19,79,19,80,19,81,19,82,19,83,19,84,19,85,19,86,19,87, + 19,88,19,89,19,90,19,91,19,92,19,93,19,94,19,95,19,96,19,97,19,98,19,99,19,100,19,101,19,102,19,103,19,104,19,105,19,106,19,107, + 19,108,19,109,19,110,19,111,19,112,19,113,19,114,19,115,19,116,19,117,19,118,19,119,19,120,19,121,19,122,19,123,19,124,19,125,19,126,19,127, + 19,128,19,129,19,130,19,131,19,132,19,133,19,134,19,135,19,136,19,137,19,138,19,139,19,140,19,141,19,142,19,143,19,144,19,145,19,146,19,147, + 19,148,19,149,19,150,19,151,19,152,19,153,19,154,19,155,19,156,19,157,19,158,19,159,19,160,19,161,19,162,19,163,19,164,19,165,19,166,19,167, + 19,168,0,192,0,193,19,169,19,170,19,171,19,172,19,173,19,174,19,175,19,176,19,177,19,178,19,179,19,180,19,181,19,182,19,183,19,184,19,185, + 19,186,19,187,19,188,19,189,19,190,19,191,19,192,19,193,19,194,19,195,19,196,19,197,19,198,19,199,19,200,19,201,19,202,19,203,19,204,19,205, + 19,206,19,207,19,208,19,209,19,210,19,211,19,212,19,213,19,214,19,215,19,216,19,217,19,218,19,219,19,220,19,221,19,222,19,223,19,224,19,225, + 19,226,19,227,19,228,19,229,19,230,19,231,19,232,19,233,19,234,19,235,19,236,19,237,19,238,19,239,19,240,19,241,19,242,19,243,19,244,19,245, + 19,246,19,247,19,248,19,249,19,250,19,251,19,252,19,253,19,254,19,255,20,0,20,1,20,2,20,3,20,4,20,5,20,6,20,7,20,8,20,9, + 20,10,20,11,20,12,20,13,20,14,20,15,20,16,20,17,20,18,20,19,20,20,20,21,20,22,20,23,20,24,20,25,20,26,20,27,20,28,20,29, + 20,30,20,31,20,32,20,33,20,34,20,35,20,36,20,37,20,38,20,39,20,40,20,41,20,42,20,43,20,44,20,45,20,46,20,47,20,48,20,49, + 20,50,20,51,20,52,20,53,20,54,20,55,20,56,20,57,20,58,20,59,20,60,20,61,20,62,20,63,20,64,20,65,20,66,20,67,20,68,20,69, + 20,70,20,71,20,72,20,73,20,74,20,75,20,76,20,77,20,78,20,79,20,80,20,81,20,82,20,83,20,84,20,85,20,86,20,87,20,88,20,89, + 20,90,20,91,20,92,20,93,20,94,20,95,20,96,20,97,20,98,20,99,20,100,20,101,20,102,20,103,20,104,20,105,20,106,20,107,20,108,20,109, + 20,110,20,111,20,112,20,113,20,114,20,115,20,116,20,117,20,118,20,119,20,120,20,121,20,122,20,123,20,124,20,125,20,126,20,127,20,128,20,129, + 20,130,20,131,20,132,20,133,20,134,20,135,20,136,20,137,20,138,20,139,20,140,20,141,20,142,20,143,20,144,20,145,20,146,20,147,20,148,20,149, + 20,150,20,151,20,152,20,153,20,154,20,155,20,156,20,157,20,158,20,159,20,160,20,161,20,162,20,163,20,164,20,165,20,166,20,167,20,168,20,169, + 20,170,20,171,20,172,20,173,20,174,20,175,20,176,20,177,20,178,20,179,20,180,20,181,20,182,20,183,20,184,20,185,20,186,20,187,20,188,20,189, + 20,190,20,191,20,192,20,193,20,194,20,195,20,196,20,197,20,198,20,199,20,200,20,201,20,202,20,203,20,204,20,205,20,206,20,207,20,208,20,209, + 20,210,20,211,20,212,20,213,20,214,20,215,20,216,20,217,20,218,20,219,20,220,20,221,20,222,20,223,20,224,20,225,20,226,20,227,20,228,20,229, + 20,230,20,231,20,232,20,233,20,234,20,235,20,236,20,237,20,238,20,239,20,240,20,241,20,242,20,243,20,244,20,245,20,246,20,247,20,248,20,249, + 20,250,20,251,20,252,20,253,20,254,20,255,21,0,21,1,21,2,21,3,21,4,21,5,21,6,21,7,21,8,21,9,21,10,21,11,21,12,21,13, + 21,14,21,15,21,16,21,17,21,18,21,19,21,20,21,21,21,22,21,23,21,24,21,25,21,26,21,27,21,28,21,29,21,30,21,31,21,32,21,33, + 21,34,21,35,21,36,21,37,21,38,21,39,21,40,21,41,21,42,21,43,21,44,21,45,21,46,21,47,21,48,21,49,21,50,21,51,21,52,21,53, + 21,54,21,55,21,56,21,57,21,58,21,59,21,60,21,61,21,62,21,63,21,64,21,65,21,66,21,67,21,68,21,69,21,70,21,71,21,72,21,73, + 21,74,21,75,21,76,21,77,21,78,21,79,21,80,21,81,21,82,21,83,21,84,21,85,21,86,21,87,21,88,21,89,21,90,21,91,21,92,21,93, + 21,94,21,95,21,96,21,97,21,98,21,99,21,100,21,101,21,102,21,103,21,104,21,105,21,106,21,107,21,108,21,109,21,110,21,111,21,112,21,113, + 21,114,21,115,21,116,21,117,21,118,21,119,21,120,21,121,21,122,21,123,21,124,21,125,21,126,21,127,21,128,21,129,21,130,21,131,21,132,21,133, + 21,134,21,135,21,136,21,137,21,138,21,139,21,140,21,141,21,142,21,143,21,144,21,145,21,146,21,147,21,148,21,149,21,150,21,151,21,152,21,153, + 21,154,21,155,21,156,21,157,21,158,21,159,21,160,21,161,21,162,21,163,21,164,21,165,21,166,21,167,21,168,21,169,21,170,21,171,21,172,21,173, + 21,174,21,175,21,176,21,177,21,178,21,179,21,180,21,181,21,182,21,183,21,184,21,185,21,186,21,187,21,188,21,189,21,190,21,191,21,192,21,193, + 21,194,21,195,21,196,21,197,21,198,21,199,21,200,21,201,21,202,21,203,21,204,21,205,21,206,21,207,21,208,21,209,21,210,21,211,21,212,21,213, + 21,214,21,215,21,216,21,217,21,218,21,219,21,220,21,221,21,222,21,223,21,224,21,225,21,226,21,227,21,228,21,229,21,230,21,231,21,232,21,233, + 21,234,21,235,21,236,21,237,21,238,21,239,21,240,21,241,21,242,21,243,21,244,21,245,21,246,21,247,21,248,21,249,21,250,21,251,21,252,21,253, + 21,254,21,255,22,0,22,1,22,2,22,3,22,4,22,5,22,6,22,7,22,8,22,9,22,10,22,11,22,12,22,13,22,14,22,15,22,16,22,17, + 22,18,22,19,22,20,22,21,22,22,22,23,22,24,22,25,22,26,22,27,22,28,22,29,22,30,22,31,22,32,22,33,22,34,22,35,22,36,22,37, + 22,38,22,39,22,40,22,41,22,42,22,43,22,44,22,45,22,46,22,47,22,48,22,49,22,50,22,51,22,52,22,53,22,54,22,55,22,56,22,57, + 22,58,22,59,22,60,22,61,22,62,22,63,22,64,22,65,22,66,22,67,22,68,22,69,22,70,22,71,22,72,22,73,22,74,22,75,22,76,22,77, + 22,78,22,79,22,80,22,81,22,82,22,83,22,84,22,85,22,86,22,87,22,88,22,89,22,90,22,91,22,92,22,93,22,94,22,95,22,96,22,97, + 22,98,22,99,22,100,22,101,22,102,22,103,22,104,22,105,22,106,22,107,22,108,22,109,22,110,22,111,22,112,22,113,22,114,22,115,22,116,22,117, + 22,118,22,119,22,120,22,121,22,122,22,123,22,124,22,125,22,126,22,127,22,128,22,129,22,130,22,131,22,132,22,133,22,134,22,135,22,136,22,137, + 22,138,22,139,22,140,22,141,22,142,22,143,22,144,22,145,22,146,22,147,22,148,22,149,22,150,22,151,22,152,22,153,22,154,22,155,22,156,22,157, + 22,158,22,159,22,160,22,161,22,162,22,163,22,164,22,165,22,166,22,167,22,168,22,169,22,170,22,171,22,172,22,173,22,174,22,175,22,176,22,177, + 22,178,22,179,22,180,22,181,22,182,22,183,22,184,22,185,22,186,22,187,22,188,22,189,22,190,22,191,22,192,22,193,22,194,22,195,22,196,22,197, + 22,198,22,199,22,200,22,201,22,202,22,203,22,204,22,205,22,206,22,207,22,208,22,209,22,210,22,211,22,212,22,213,22,214,22,215,22,216,22,217, + 22,218,22,219,22,220,22,221,22,222,22,223,22,224,22,225,22,226,22,227,22,228,22,229,22,230,22,231,22,232,22,233,22,234,22,235,22,236,22,237, + 22,238,22,239,22,240,22,241,22,242,22,243,22,244,22,245,22,246,22,247,22,248,22,249,22,250,22,251,22,252,22,253,22,254,22,255,23,0,23,1, + 23,2,23,3,23,4,23,5,23,6,23,7,23,8,23,9,23,10,23,11,23,12,23,13,23,14,23,15,23,16,23,17,23,18,23,19,23,20,23,21, + 23,22,23,23,23,24,23,25,23,26,23,27,23,28,23,29,23,30,23,31,23,32,23,33,23,34,23,35,23,36,23,37,23,38,23,39,23,40,23,41, + 23,42,23,43,23,44,23,45,23,46,23,47,23,48,23,49,23,50,23,51,23,52,23,53,23,54,23,55,23,56,23,57,23,58,23,59,23,60,23,61, + 23,62,23,63,23,64,23,65,23,66,23,67,23,68,23,69,23,70,23,71,23,72,23,73,23,74,23,75,23,76,23,77,23,78,23,79,23,80,23,81, + 23,82,23,83,23,84,23,85,23,86,23,87,23,88,23,89,23,90,23,91,23,92,23,93,23,94,23,95,23,96,23,97,23,98,23,99,23,100,23,101, + 23,102,23,103,23,104,23,105,23,106,23,107,23,108,23,109,23,110,23,111,23,112,23,113,23,114,23,115,23,116,23,117,23,118,23,119,23,120,23,121, + 23,122,23,123,23,124,23,125,23,126,23,127,23,128,23,129,23,130,23,131,23,132,23,133,23,134,23,135,23,136,23,137,23,138,23,139,23,140,23,141, + 23,142,23,143,23,144,23,145,23,146,23,147,23,148,23,149,23,150,23,151,23,152,23,153,23,154,23,155,23,156,23,157,23,158,23,159,23,160,23,161, + 23,162,23,163,23,164,23,165,23,166,23,167,23,168,23,169,23,170,23,171,23,172,23,173,23,174,23,175,23,176,23,177,23,178,23,179,23,180,23,181, + 23,182,23,183,23,184,23,185,23,186,23,187,23,188,23,189,23,190,23,191,23,192,23,193,23,194,23,195,23,196,23,197,23,198,23,199,23,200,23,201, + 23,202,23,203,23,204,23,205,23,206,23,207,23,208,23,209,23,210,23,211,23,212,23,213,23,214,23,215,23,216,23,217,23,218,23,219,23,220,9,115, + 102,116,104,121,112,104,101,110,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,11,67,99,105,114,99,117,109,102,108,101,120,11,99,99,105,114,99,117,109,102,108,101,120,10,67, + 100,111,116,97,99,99,101,110,116,10,99,100,111,116,97,99,99,101,110,116,6,68,99,97,114,111,110,6,100,99,97,114,111,110,6,68,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,10,71,100,111,116,97,99,99,101,110,116,10,103, + 100,111,116,97,99,99,101,110,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,6,73,116,105,108,100,101,6,105,116,105, + 108,100,101,7,73,109,97,99,114,111,110,7,105,109,97,99,114,111,110,6,73,98,114,101,118,101,6,105,98,114,101,118,101,7,73,111,103,111,110,101, + 107,7,105,111,103,111,110,101,107,2,73,74,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,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,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,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,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, + 5,108,111,110,103,115,7,117,110,105,48,49,56,48,7,117,110,105,48,49,56,49,7,117,110,105,48,49,56,50,7,117,110,105,48,49,56,51,7,117, + 110,105,48,49,56,52,7,117,110,105,48,49,56,53,7,117,110,105,48,49,56,54,7,117,110,105,48,49,56,55,7,117,110,105,48,49,56,56,7,117, + 110,105,48,49,56,57,7,117,110,105,48,49,56,65,7,117,110,105,48,49,56,66,7,117,110,105,48,49,56,67,7,117,110,105,48,49,56,68,7,117, + 110,105,48,49,56,69,7,117,110,105,48,49,56,70,7,117,110,105,48,49,57,48,7,117,110,105,48,49,57,49,7,117,110,105,48,49,57,51,7,117, + 110,105,48,49,57,52,7,117,110,105,48,49,57,53,7,117,110,105,48,49,57,54,7,117,110,105,48,49,57,55,7,117,110,105,48,49,57,56,7,117, + 110,105,48,49,57,57,7,117,110,105,48,49,57,65,7,117,110,105,48,49,57,66,7,117,110,105,48,49,57,67,7,117,110,105,48,49,57,68,7,117, + 110,105,48,49,57,69,7,117,110,105,48,49,57,70,5,79,104,111,114,110,5,111,104,111,114,110,7,117,110,105,48,49,65,50,7,117,110,105,48,49, + 65,51,7,117,110,105,48,49,65,52,7,117,110,105,48,49,65,53,7,117,110,105,48,49,65,54,7,117,110,105,48,49,65,55,7,117,110,105,48,49, + 65,56,7,117,110,105,48,49,65,57,7,117,110,105,48,49,65,65,7,117,110,105,48,49,65,66,7,117,110,105,48,49,65,67,7,117,110,105,48,49, + 65,68,7,117,110,105,48,49,65,69,5,85,104,111,114,110,5,117,104,111,114,110,7,117,110,105,48,49,66,49,7,117,110,105,48,49,66,50,7,117, + 110,105,48,49,66,51,7,117,110,105,48,49,66,52,7,117,110,105,48,49,66,53,7,117,110,105,48,49,66,54,7,117,110,105,48,49,66,55,7,117, + 110,105,48,49,66,56,7,117,110,105,48,49,66,57,7,117,110,105,48,49,66,65,7,117,110,105,48,49,66,66,7,117,110,105,48,49,66,67,7,117, + 110,105,48,49,66,68,7,117,110,105,48,49,66,69,7,117,110,105,48,49,66,70,7,117,110,105,48,49,67,48,7,117,110,105,48,49,67,49,7,117, + 110,105,48,49,67,50,7,117,110,105,48,49,67,51,7,117,110,105,48,49,67,52,7,117,110,105,48,49,67,53,7,117,110,105,48,49,67,54,7,117, + 110,105,48,49,67,55,7,117,110,105,48,49,67,56,7,117,110,105,48,49,67,57,7,117,110,105,48,49,67,65,7,117,110,105,48,49,67,66,7,117, + 110,105,48,49,67,67,7,117,110,105,48,49,67,68,7,117,110,105,48,49,67,69,7,117,110,105,48,49,67,70,7,117,110,105,48,49,68,48,7,117, + 110,105,48,49,68,49,7,117,110,105,48,49,68,50,7,117,110,105,48,49,68,51,7,117,110,105,48,49,68,52,7,117,110,105,48,49,68,53,7,117, + 110,105,48,49,68,54,7,117,110,105,48,49,68,55,7,117,110,105,48,49,68,56,7,117,110,105,48,49,68,57,7,117,110,105,48,49,68,65,7,117, + 110,105,48,49,68,66,7,117,110,105,48,49,68,67,7,117,110,105,48,49,68,68,7,117,110,105,48,49,68,69,7,117,110,105,48,49,68,70,7,117, + 110,105,48,49,69,48,7,117,110,105,48,49,69,49,7,117,110,105,48,49,69,50,7,117,110,105,48,49,69,51,7,117,110,105,48,49,69,52,7,117, + 110,105,48,49,69,53,6,71,99,97,114,111,110,6,103,99,97,114,111,110,7,117,110,105,48,49,69,56,7,117,110,105,48,49,69,57,7,117,110,105, + 48,49,69,65,7,117,110,105,48,49,69,66,7,117,110,105,48,49,69,67,7,117,110,105,48,49,69,68,7,117,110,105,48,49,69,69,7,117,110,105, + 48,49,69,70,7,117,110,105,48,49,70,48,7,117,110,105,48,49,70,49,7,117,110,105,48,49,70,50,7,117,110,105,48,49,70,51,7,117,110,105, + 48,49,70,52,7,117,110,105,48,49,70,53,7,117,110,105,48,49,70,54,7,117,110,105,48,49,70,55,7,117,110,105,48,49,70,56,7,117,110,105, + 48,49,70,57,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,7,117,110,105,48,50,48,48,7,117,110,105,48,50, + 48,49,7,117,110,105,48,50,48,50,7,117,110,105,48,50,48,51,7,117,110,105,48,50,48,52,7,117,110,105,48,50,48,53,7,117,110,105,48,50, + 48,54,7,117,110,105,48,50,48,55,7,117,110,105,48,50,48,56,7,117,110,105,48,50,48,57,7,117,110,105,48,50,48,65,7,117,110,105,48,50, + 48,66,7,117,110,105,48,50,48,67,7,117,110,105,48,50,48,68,7,117,110,105,48,50,48,69,7,117,110,105,48,50,48,70,7,117,110,105,48,50, + 49,48,7,117,110,105,48,50,49,49,7,117,110,105,48,50,49,50,7,117,110,105,48,50,49,51,7,117,110,105,48,50,49,52,7,117,110,105,48,50, + 49,53,7,117,110,105,48,50,49,54,7,117,110,105,48,50,49,55,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,7,117,110,105,48,50,49,65,7,117,110,105,48,50,49,66,7,117,110,105,48,50,49,67,7,117,110,105,48,50,49,68,7,117,110,105, + 48,50,49,69,7,117,110,105,48,50,49,70,7,117,110,105,48,50,50,48,7,117,110,105,48,50,50,49,7,117,110,105,48,50,50,50,7,117,110,105, + 48,50,50,51,7,117,110,105,48,50,50,52,7,117,110,105,48,50,50,53,7,117,110,105,48,50,50,54,7,117,110,105,48,50,50,55,7,117,110,105, + 48,50,50,56,7,117,110,105,48,50,50,57,7,117,110,105,48,50,50,65,7,117,110,105,48,50,50,66,7,117,110,105,48,50,50,67,7,117,110,105, + 48,50,50,68,7,117,110,105,48,50,50,69,7,117,110,105,48,50,50,70,7,117,110,105,48,50,51,48,7,117,110,105,48,50,51,49,7,117,110,105, + 48,50,51,50,7,117,110,105,48,50,51,51,7,117,110,105,48,50,51,52,7,117,110,105,48,50,51,53,7,117,110,105,48,50,51,54,8,100,111,116, + 108,101,115,115,106,7,117,110,105,48,50,51,56,7,117,110,105,48,50,51,57,7,117,110,105,48,50,51,65,7,117,110,105,48,50,51,66,7,117,110, + 105,48,50,51,67,7,117,110,105,48,50,51,68,7,117,110,105,48,50,51,69,7,117,110,105,48,50,51,70,7,117,110,105,48,50,52,48,7,117,110, + 105,48,50,52,49,7,117,110,105,48,50,52,50,7,117,110,105,48,50,52,51,7,117,110,105,48,50,52,52,7,117,110,105,48,50,52,53,7,117,110, + 105,48,50,52,54,7,117,110,105,48,50,52,55,7,117,110,105,48,50,52,56,7,117,110,105,48,50,52,57,7,117,110,105,48,50,52,65,7,117,110, + 105,48,50,52,66,7,117,110,105,48,50,52,67,7,117,110,105,48,50,52,68,7,117,110,105,48,50,52,69,7,117,110,105,48,50,52,70,7,117,110, + 105,48,50,53,48,7,117,110,105,48,50,53,49,7,117,110,105,48,50,53,50,7,117,110,105,48,50,53,51,7,117,110,105,48,50,53,52,7,117,110, + 105,48,50,53,53,7,117,110,105,48,50,53,54,7,117,110,105,48,50,53,55,7,117,110,105,48,50,53,56,7,117,110,105,48,50,53,57,7,117,110, + 105,48,50,53,65,7,117,110,105,48,50,53,66,7,117,110,105,48,50,53,67,7,117,110,105,48,50,53,68,7,117,110,105,48,50,53,69,7,117,110, + 105,48,50,53,70,7,117,110,105,48,50,54,48,7,117,110,105,48,50,54,49,7,117,110,105,48,50,54,50,7,117,110,105,48,50,54,51,7,117,110, + 105,48,50,54,52,7,117,110,105,48,50,54,53,7,117,110,105,48,50,54,54,7,117,110,105,48,50,54,55,7,117,110,105,48,50,54,56,7,117,110, + 105,48,50,54,57,7,117,110,105,48,50,54,65,7,117,110,105,48,50,54,66,7,117,110,105,48,50,54,67,7,117,110,105,48,50,54,68,7,117,110, + 105,48,50,54,69,7,117,110,105,48,50,54,70,7,117,110,105,48,50,55,48,7,117,110,105,48,50,55,49,7,117,110,105,48,50,55,50,7,117,110, + 105,48,50,55,51,7,117,110,105,48,50,55,52,7,117,110,105,48,50,55,53,7,117,110,105,48,50,55,54,7,117,110,105,48,50,55,55,7,117,110, + 105,48,50,55,56,7,117,110,105,48,50,55,57,7,117,110,105,48,50,55,65,7,117,110,105,48,50,55,66,7,117,110,105,48,50,55,67,7,117,110, + 105,48,50,55,68,7,117,110,105,48,50,55,69,7,117,110,105,48,50,55,70,7,117,110,105,48,50,56,48,7,117,110,105,48,50,56,49,7,117,110, + 105,48,50,56,50,7,117,110,105,48,50,56,51,7,117,110,105,48,50,56,52,7,117,110,105,48,50,56,53,7,117,110,105,48,50,56,54,7,117,110, + 105,48,50,56,55,7,117,110,105,48,50,56,56,7,117,110,105,48,50,56,57,7,117,110,105,48,50,56,65,7,117,110,105,48,50,56,66,7,117,110, + 105,48,50,56,67,7,117,110,105,48,50,56,68,7,117,110,105,48,50,56,69,7,117,110,105,48,50,56,70,7,117,110,105,48,50,57,48,7,117,110, + 105,48,50,57,49,7,117,110,105,48,50,57,50,7,117,110,105,48,50,57,51,7,117,110,105,48,50,57,52,7,117,110,105,48,50,57,53,7,117,110, + 105,48,50,57,54,7,117,110,105,48,50,57,55,7,117,110,105,48,50,57,56,7,117,110,105,48,50,57,57,7,117,110,105,48,50,57,65,7,117,110, + 105,48,50,57,66,7,117,110,105,48,50,57,67,7,117,110,105,48,50,57,68,7,117,110,105,48,50,57,69,7,117,110,105,48,50,57,70,7,117,110, + 105,48,50,65,48,7,117,110,105,48,50,65,49,7,117,110,105,48,50,65,50,7,117,110,105,48,50,65,51,7,117,110,105,48,50,65,52,7,117,110, + 105,48,50,65,53,7,117,110,105,48,50,65,54,7,117,110,105,48,50,65,55,7,117,110,105,48,50,65,56,7,117,110,105,48,50,65,57,7,117,110, + 105,48,50,65,65,7,117,110,105,48,50,65,66,7,117,110,105,48,50,65,67,7,117,110,105,48,50,65,68,7,117,110,105,48,50,65,69,7,117,110, + 105,48,50,65,70,7,117,110,105,48,50,66,48,7,117,110,105,48,50,66,49,7,117,110,105,48,50,66,50,7,117,110,105,48,50,66,51,7,117,110, + 105,48,50,66,52,7,117,110,105,48,50,66,53,7,117,110,105,48,50,66,54,7,117,110,105,48,50,66,55,7,117,110,105,48,50,66,56,7,117,110, + 105,48,50,66,57,7,117,110,105,48,50,66,65,7,117,110,105,48,50,66,66,7,117,110,105,48,50,66,67,7,117,110,105,48,50,66,68,7,117,110, + 105,48,50,66,69,7,117,110,105,48,50,66,70,7,117,110,105,48,50,67,48,7,117,110,105,48,50,67,49,7,117,110,105,48,50,67,50,7,117,110, + 105,48,50,67,51,7,117,110,105,48,50,67,52,7,117,110,105,48,50,67,53,7,117,110,105,48,50,67,56,7,117,110,105,48,50,67,57,7,117,110, + 105,48,50,67,65,7,117,110,105,48,50,67,66,7,117,110,105,48,50,67,67,7,117,110,105,48,50,67,68,7,117,110,105,48,50,67,69,7,117,110, + 105,48,50,67,70,7,117,110,105,48,50,68,48,7,117,110,105,48,50,68,49,7,117,110,105,48,50,68,50,7,117,110,105,48,50,68,51,7,117,110, + 105,48,50,68,52,7,117,110,105,48,50,68,53,7,117,110,105,48,50,68,54,7,117,110,105,48,50,68,55,7,117,110,105,48,50,68,69,7,117,110, + 105,48,50,68,70,7,117,110,105,48,50,69,48,7,117,110,105,48,50,69,49,7,117,110,105,48,50,69,50,7,117,110,105,48,50,69,51,7,117,110, + 105,48,50,69,52,7,117,110,105,48,50,69,53,7,117,110,105,48,50,69,54,7,117,110,105,48,50,69,55,7,117,110,105,48,50,69,56,7,117,110, + 105,48,50,69,57,7,117,110,105,48,50,69,67,7,117,110,105,48,50,69,68,7,117,110,105,48,50,69,69,7,117,110,105,48,50,70,51,7,117,110, + 105,48,50,70,55,9,103,114,97,118,101,99,111,109,98,9,97,99,117,116,101,99,111,109,98,7,117,110,105,48,51,48,50,9,116,105,108,100,101,99, + 111,109,98,7,117,110,105,48,51,48,52,7,117,110,105,48,51,48,53,7,117,110,105,48,51,48,54,7,117,110,105,48,51,48,55,7,117,110,105,48, + 51,48,56,13,104,111,111,107,97,98,111,118,101,99,111,109,98,7,117,110,105,48,51,48,65,7,117,110,105,48,51,48,66,7,117,110,105,48,51,48, + 67,7,117,110,105,48,51,48,68,7,117,110,105,48,51,48,69,7,117,110,105,48,51,48,70,7,117,110,105,48,51,49,48,7,117,110,105,48,51,49, + 49,7,117,110,105,48,51,49,50,7,117,110,105,48,51,49,51,7,117,110,105,48,51,49,52,7,117,110,105,48,51,49,53,7,117,110,105,48,51,49, + 54,7,117,110,105,48,51,49,55,7,117,110,105,48,51,49,56,7,117,110,105,48,51,49,57,7,117,110,105,48,51,49,65,7,117,110,105,48,51,49, + 66,7,117,110,105,48,51,49,67,7,117,110,105,48,51,49,68,7,117,110,105,48,51,49,69,7,117,110,105,48,51,49,70,7,117,110,105,48,51,50, + 48,7,117,110,105,48,51,50,49,7,117,110,105,48,51,50,50,12,100,111,116,98,101,108,111,119,99,111,109,98,7,117,110,105,48,51,50,52,7,117, + 110,105,48,51,50,53,7,117,110,105,48,51,50,54,7,117,110,105,48,51,50,55,7,117,110,105,48,51,50,56,7,117,110,105,48,51,50,57,7,117, + 110,105,48,51,50,65,7,117,110,105,48,51,50,66,7,117,110,105,48,51,50,67,7,117,110,105,48,51,50,68,7,117,110,105,48,51,50,69,7,117, + 110,105,48,51,50,70,7,117,110,105,48,51,51,48,7,117,110,105,48,51,51,49,7,117,110,105,48,51,51,50,7,117,110,105,48,51,51,51,7,117, + 110,105,48,51,51,52,7,117,110,105,48,51,51,53,7,117,110,105,48,51,51,54,7,117,110,105,48,51,51,55,7,117,110,105,48,51,51,56,7,117, + 110,105,48,51,51,57,7,117,110,105,48,51,51,65,7,117,110,105,48,51,51,66,7,117,110,105,48,51,51,67,7,117,110,105,48,51,51,68,7,117, + 110,105,48,51,51,69,7,117,110,105,48,51,51,70,7,117,110,105,48,51,52,48,7,117,110,105,48,51,52,49,7,117,110,105,48,51,52,50,7,117, + 110,105,48,51,52,51,7,117,110,105,48,51,52,52,7,117,110,105,48,51,52,53,7,117,110,105,48,51,52,54,7,117,110,105,48,51,52,55,7,117, + 110,105,48,51,52,56,7,117,110,105,48,51,52,57,7,117,110,105,48,51,52,65,7,117,110,105,48,51,52,66,7,117,110,105,48,51,52,67,7,117, + 110,105,48,51,52,68,7,117,110,105,48,51,52,69,7,117,110,105,48,51,52,70,7,117,110,105,48,51,53,49,7,117,110,105,48,51,53,50,7,117, + 110,105,48,51,53,51,7,117,110,105,48,51,53,55,7,117,110,105,48,51,53,56,7,117,110,105,48,51,53,65,7,117,110,105,48,51,53,67,7,117, + 110,105,48,51,53,68,7,117,110,105,48,51,53,69,7,117,110,105,48,51,53,70,7,117,110,105,48,51,54,48,7,117,110,105,48,51,54,49,7,117, + 110,105,48,51,54,50,7,117,110,105,48,51,55,48,7,117,110,105,48,51,55,49,7,117,110,105,48,51,55,50,7,117,110,105,48,51,55,51,7,117, + 110,105,48,51,55,52,7,117,110,105,48,51,55,53,7,117,110,105,48,51,55,54,7,117,110,105,48,51,55,55,7,117,110,105,48,51,55,65,7,117, + 110,105,48,51,55,66,7,117,110,105,48,51,55,67,7,117,110,105,48,51,55,68,7,117,110,105,48,51,55,69,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,9,73,111,116,97,116,111,110,111,115,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,4,73,111,116,97,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,12,73, + 111,116,97,100,105,101,114,101,115,105,115,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,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,7,117,110,105,48,51,67,70,7,117,110,105,48,51,68,48,6,116,104,101,116,97,49,8,85,112,115,105,108,111, + 110,49,7,117,110,105,48,51,68,51,7,117,110,105,48,51,68,52,4,112,104,105,49,6,111,109,101,103,97,49,7,117,110,105,48,51,68,55,7,117, + 110,105,48,51,68,56,7,117,110,105,48,51,68,57,7,117,110,105,48,51,68,65,7,117,110,105,48,51,68,66,7,117,110,105,48,51,68,67,7,117, + 110,105,48,51,68,68,7,117,110,105,48,51,68,69,7,117,110,105,48,51,68,70,7,117,110,105,48,51,69,48,7,117,110,105,48,51,69,49,7,117, + 110,105,48,51,69,50,7,117,110,105,48,51,69,51,7,117,110,105,48,51,69,52,7,117,110,105,48,51,69,53,7,117,110,105,48,51,69,54,7,117, + 110,105,48,51,69,55,7,117,110,105,48,51,69,56,7,117,110,105,48,51,69,57,7,117,110,105,48,51,69,65,7,117,110,105,48,51,69,66,7,117, + 110,105,48,51,69,67,7,117,110,105,48,51,69,68,7,117,110,105,48,51,69,69,7,117,110,105,48,51,69,70,7,117,110,105,48,51,70,48,7,117, + 110,105,48,51,70,49,7,117,110,105,48,51,70,50,7,117,110,105,48,51,70,51,7,117,110,105,48,51,70,52,7,117,110,105,48,51,70,53,7,117, + 110,105,48,51,70,54,7,117,110,105,48,51,70,55,7,117,110,105,48,51,70,56,7,117,110,105,48,51,70,57,7,117,110,105,48,51,70,65,7,117, + 110,105,48,51,70,66,7,117,110,105,48,51,70,67,7,117,110,105,48,51,70,68,7,117,110,105,48,51,70,69,7,117,110,105,48,51,70,70,7,117, + 110,105,48,52,48,48,7,117,110,105,48,52,48,49,7,117,110,105,48,52,48,50,7,117,110,105,48,52,48,51,7,117,110,105,48,52,48,52,7,117, + 110,105,48,52,48,53,7,117,110,105,48,52,48,54,7,117,110,105,48,52,48,55,7,117,110,105,48,52,48,56,7,117,110,105,48,52,48,57,7,117, + 110,105,48,52,48,65,7,117,110,105,48,52,48,66,7,117,110,105,48,52,48,67,7,117,110,105,48,52,48,68,7,117,110,105,48,52,48,69,7,117, + 110,105,48,52,48,70,7,117,110,105,48,52,49,48,7,117,110,105,48,52,49,49,7,117,110,105,48,52,49,50,7,117,110,105,48,52,49,51,7,117, + 110,105,48,52,49,52,7,117,110,105,48,52,49,53,7,117,110,105,48,52,49,54,7,117,110,105,48,52,49,55,7,117,110,105,48,52,49,56,7,117, + 110,105,48,52,49,57,7,117,110,105,48,52,49,65,7,117,110,105,48,52,49,66,7,117,110,105,48,52,49,67,7,117,110,105,48,52,49,68,7,117, + 110,105,48,52,49,69,7,117,110,105,48,52,49,70,7,117,110,105,48,52,50,48,7,117,110,105,48,52,50,49,7,117,110,105,48,52,50,50,7,117, + 110,105,48,52,50,51,7,117,110,105,48,52,50,52,7,117,110,105,48,52,50,53,7,117,110,105,48,52,50,54,7,117,110,105,48,52,50,55,7,117, + 110,105,48,52,50,56,7,117,110,105,48,52,50,57,7,117,110,105,48,52,50,65,7,117,110,105,48,52,50,66,7,117,110,105,48,52,50,67,7,117, + 110,105,48,52,50,68,7,117,110,105,48,52,50,69,7,117,110,105,48,52,50,70,7,117,110,105,48,52,51,48,7,117,110,105,48,52,51,49,7,117, + 110,105,48,52,51,50,7,117,110,105,48,52,51,51,7,117,110,105,48,52,51,52,7,117,110,105,48,52,51,53,7,117,110,105,48,52,51,54,7,117, + 110,105,48,52,51,55,7,117,110,105,48,52,51,56,7,117,110,105,48,52,51,57,7,117,110,105,48,52,51,65,7,117,110,105,48,52,51,66,7,117, + 110,105,48,52,51,67,7,117,110,105,48,52,51,68,7,117,110,105,48,52,51,69,7,117,110,105,48,52,51,70,7,117,110,105,48,52,52,48,7,117, + 110,105,48,52,52,49,7,117,110,105,48,52,52,50,7,117,110,105,48,52,52,51,7,117,110,105,48,52,52,52,7,117,110,105,48,52,52,53,7,117, + 110,105,48,52,52,54,7,117,110,105,48,52,52,55,7,117,110,105,48,52,52,56,7,117,110,105,48,52,52,57,7,117,110,105,48,52,52,65,7,117, + 110,105,48,52,52,66,7,117,110,105,48,52,52,67,7,117,110,105,48,52,52,68,7,117,110,105,48,52,52,69,7,117,110,105,48,52,52,70,7,117, + 110,105,48,52,53,48,7,117,110,105,48,52,53,49,7,117,110,105,48,52,53,50,7,117,110,105,48,52,53,51,7,117,110,105,48,52,53,52,7,117, + 110,105,48,52,53,53,7,117,110,105,48,52,53,54,7,117,110,105,48,52,53,55,7,117,110,105,48,52,53,56,7,117,110,105,48,52,53,57,7,117, + 110,105,48,52,53,65,7,117,110,105,48,52,53,66,7,117,110,105,48,52,53,67,7,117,110,105,48,52,53,68,7,117,110,105,48,52,53,69,7,117, + 110,105,48,52,53,70,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,55,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,48,7,117, + 110,105,48,52,57,49,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,7,117,110,105,48,52,67,48,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,7,117,110,105,48,52,67,70,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,48,53,49,52,7,117,110,105,48,53,49,53,7,117,110,105,48,53,49,54,7,117,110,105,48,53,49,55,7,117, + 110,105,48,53,49,56,7,117,110,105,48,53,49,57,7,117,110,105,48,53,49,65,7,117,110,105,48,53,49,66,7,117,110,105,48,53,49,67,7,117, + 110,105,48,53,49,68,7,117,110,105,48,53,49,69,7,117,110,105,48,53,49,70,7,117,110,105,48,53,50,48,7,117,110,105,48,53,50,49,7,117, + 110,105,48,53,50,50,7,117,110,105,48,53,50,51,7,117,110,105,48,53,50,52,7,117,110,105,48,53,50,53,7,117,110,105,48,53,51,49,7,117, + 110,105,48,53,51,50,7,117,110,105,48,53,51,51,7,117,110,105,48,53,51,52,7,117,110,105,48,53,51,53,7,117,110,105,48,53,51,54,7,117, + 110,105,48,53,51,55,7,117,110,105,48,53,51,56,7,117,110,105,48,53,51,57,7,117,110,105,48,53,51,65,7,117,110,105,48,53,51,66,7,117, + 110,105,48,53,51,67,7,117,110,105,48,53,51,68,7,117,110,105,48,53,51,69,7,117,110,105,48,53,51,70,7,117,110,105,48,53,52,48,7,117, + 110,105,48,53,52,49,7,117,110,105,48,53,52,50,7,117,110,105,48,53,52,51,7,117,110,105,48,53,52,52,7,117,110,105,48,53,52,53,7,117, + 110,105,48,53,52,54,7,117,110,105,48,53,52,55,7,117,110,105,48,53,52,56,7,117,110,105,48,53,52,57,7,117,110,105,48,53,52,65,7,117, + 110,105,48,53,52,66,7,117,110,105,48,53,52,67,7,117,110,105,48,53,52,68,7,117,110,105,48,53,52,69,7,117,110,105,48,53,52,70,7,117, + 110,105,48,53,53,48,7,117,110,105,48,53,53,49,7,117,110,105,48,53,53,50,7,117,110,105,48,53,53,51,7,117,110,105,48,53,53,52,7,117, + 110,105,48,53,53,53,7,117,110,105,48,53,53,54,7,117,110,105,48,53,53,57,7,117,110,105,48,53,53,65,7,117,110,105,48,53,53,66,7,117, + 110,105,48,53,53,67,7,117,110,105,48,53,53,68,7,117,110,105,48,53,53,69,7,117,110,105,48,53,53,70,7,117,110,105,48,53,54,49,7,117, + 110,105,48,53,54,50,7,117,110,105,48,53,54,51,7,117,110,105,48,53,54,52,7,117,110,105,48,53,54,53,7,117,110,105,48,53,54,54,7,117, + 110,105,48,53,54,55,7,117,110,105,48,53,54,56,7,117,110,105,48,53,54,57,7,117,110,105,48,53,54,65,7,117,110,105,48,53,54,66,7,117, + 110,105,48,53,54,67,7,117,110,105,48,53,54,68,7,117,110,105,48,53,54,69,7,117,110,105,48,53,54,70,7,117,110,105,48,53,55,48,7,117, + 110,105,48,53,55,49,7,117,110,105,48,53,55,50,7,117,110,105,48,53,55,51,7,117,110,105,48,53,55,52,7,117,110,105,48,53,55,53,7,117, + 110,105,48,53,55,54,7,117,110,105,48,53,55,55,7,117,110,105,48,53,55,56,7,117,110,105,48,53,55,57,7,117,110,105,48,53,55,65,7,117, + 110,105,48,53,55,66,7,117,110,105,48,53,55,67,7,117,110,105,48,53,55,68,7,117,110,105,48,53,55,69,7,117,110,105,48,53,55,70,7,117, + 110,105,48,53,56,48,7,117,110,105,48,53,56,49,7,117,110,105,48,53,56,50,7,117,110,105,48,53,56,51,7,117,110,105,48,53,56,52,7,117, + 110,105,48,53,56,53,7,117,110,105,48,53,56,54,7,117,110,105,48,53,56,55,7,117,110,105,48,53,56,57,7,117,110,105,48,53,56,65,7,117, + 110,105,48,53,66,48,7,117,110,105,48,53,66,49,7,117,110,105,48,53,66,50,7,117,110,105,48,53,66,51,7,117,110,105,48,53,66,52,7,117, + 110,105,48,53,66,53,7,117,110,105,48,53,66,54,7,117,110,105,48,53,66,55,7,117,110,105,48,53,66,56,7,117,110,105,48,53,66,57,7,117, + 110,105,48,53,66,65,7,117,110,105,48,53,66,66,7,117,110,105,48,53,66,67,7,117,110,105,48,53,66,68,7,117,110,105,48,53,66,69,7,117, + 110,105,48,53,66,70,7,117,110,105,48,53,67,48,7,117,110,105,48,53,67,49,7,117,110,105,48,53,67,50,7,117,110,105,48,53,67,51,7,117, + 110,105,48,53,67,54,7,117,110,105,48,53,67,55,7,117,110,105,48,53,68,48,7,117,110,105,48,53,68,49,7,117,110,105,48,53,68,50,7,117, + 110,105,48,53,68,51,7,117,110,105,48,53,68,52,7,117,110,105,48,53,68,53,7,117,110,105,48,53,68,54,7,117,110,105,48,53,68,55,7,117, + 110,105,48,53,68,56,7,117,110,105,48,53,68,57,7,117,110,105,48,53,68,65,7,117,110,105,48,53,68,66,7,117,110,105,48,53,68,67,7,117, + 110,105,48,53,68,68,7,117,110,105,48,53,68,69,7,117,110,105,48,53,68,70,7,117,110,105,48,53,69,48,7,117,110,105,48,53,69,49,7,117, + 110,105,48,53,69,50,7,117,110,105,48,53,69,51,7,117,110,105,48,53,69,52,7,117,110,105,48,53,69,53,7,117,110,105,48,53,69,54,7,117, + 110,105,48,53,69,55,7,117,110,105,48,53,69,56,7,117,110,105,48,53,69,57,7,117,110,105,48,53,69,65,7,117,110,105,48,53,70,48,7,117, + 110,105,48,53,70,49,7,117,110,105,48,53,70,50,7,117,110,105,48,53,70,51,7,117,110,105,48,53,70,52,7,117,110,105,48,54,48,54,7,117, + 110,105,48,54,48,55,7,117,110,105,48,54,48,57,7,117,110,105,48,54,48,65,7,117,110,105,48,54,48,67,7,117,110,105,48,54,49,53,7,117, + 110,105,48,54,49,66,7,117,110,105,48,54,49,70,7,117,110,105,48,54,50,49,7,117,110,105,48,54,50,50,7,117,110,105,48,54,50,51,7,117, + 110,105,48,54,50,52,7,117,110,105,48,54,50,53,7,117,110,105,48,54,50,54,7,117,110,105,48,54,50,55,7,117,110,105,48,54,50,56,7,117, + 110,105,48,54,50,57,7,117,110,105,48,54,50,65,7,117,110,105,48,54,50,66,7,117,110,105,48,54,50,67,7,117,110,105,48,54,50,68,7,117, + 110,105,48,54,50,69,7,117,110,105,48,54,50,70,7,117,110,105,48,54,51,48,7,117,110,105,48,54,51,49,7,117,110,105,48,54,51,50,7,117, + 110,105,48,54,51,51,7,117,110,105,48,54,51,52,7,117,110,105,48,54,51,53,7,117,110,105,48,54,51,54,7,117,110,105,48,54,51,55,7,117, + 110,105,48,54,51,56,7,117,110,105,48,54,51,57,7,117,110,105,48,54,51,65,7,117,110,105,48,54,52,48,7,117,110,105,48,54,52,49,7,117, + 110,105,48,54,52,50,7,117,110,105,48,54,52,51,7,117,110,105,48,54,52,52,7,117,110,105,48,54,52,53,7,117,110,105,48,54,52,54,7,117, + 110,105,48,54,52,55,7,117,110,105,48,54,52,56,7,117,110,105,48,54,52,57,7,117,110,105,48,54,52,65,7,117,110,105,48,54,52,66,7,117, + 110,105,48,54,52,67,7,117,110,105,48,54,52,68,7,117,110,105,48,54,52,69,7,117,110,105,48,54,52,70,7,117,110,105,48,54,53,48,7,117, + 110,105,48,54,53,49,7,117,110,105,48,54,53,50,7,117,110,105,48,54,53,51,7,117,110,105,48,54,53,52,7,117,110,105,48,54,53,53,7,117, + 110,105,48,54,53,55,7,117,110,105,48,54,53,65,7,117,110,105,48,54,54,48,7,117,110,105,48,54,54,49,7,117,110,105,48,54,54,50,7,117, + 110,105,48,54,54,51,7,117,110,105,48,54,54,52,7,117,110,105,48,54,54,53,7,117,110,105,48,54,54,54,7,117,110,105,48,54,54,55,7,117, + 110,105,48,54,54,56,7,117,110,105,48,54,54,57,7,117,110,105,48,54,54,65,7,117,110,105,48,54,54,66,7,117,110,105,48,54,54,67,7,117, + 110,105,48,54,54,68,7,117,110,105,48,54,54,69,7,117,110,105,48,54,54,70,7,117,110,105,48,54,55,48,7,117,110,105,48,54,55,52,7,117, + 110,105,48,54,55,57,7,117,110,105,48,54,55,65,7,117,110,105,48,54,55,66,7,117,110,105,48,54,55,67,7,117,110,105,48,54,55,68,7,117, + 110,105,48,54,55,69,7,117,110,105,48,54,55,70,7,117,110,105,48,54,56,48,7,117,110,105,48,54,56,49,7,117,110,105,48,54,56,50,7,117, + 110,105,48,54,56,51,7,117,110,105,48,54,56,52,7,117,110,105,48,54,56,53,7,117,110,105,48,54,56,54,7,117,110,105,48,54,56,55,7,117, + 110,105,48,54,56,56,7,117,110,105,48,54,56,57,7,117,110,105,48,54,56,65,7,117,110,105,48,54,56,66,7,117,110,105,48,54,56,67,7,117, + 110,105,48,54,56,68,7,117,110,105,48,54,56,69,7,117,110,105,48,54,56,70,7,117,110,105,48,54,57,48,7,117,110,105,48,54,57,49,7,117, + 110,105,48,54,57,50,7,117,110,105,48,54,57,51,7,117,110,105,48,54,57,52,7,117,110,105,48,54,57,53,7,117,110,105,48,54,57,54,7,117, + 110,105,48,54,57,55,7,117,110,105,48,54,57,56,7,117,110,105,48,54,57,57,7,117,110,105,48,54,57,65,7,117,110,105,48,54,57,66,7,117, + 110,105,48,54,57,67,7,117,110,105,48,54,57,68,7,117,110,105,48,54,57,69,7,117,110,105,48,54,57,70,7,117,110,105,48,54,65,48,7,117, + 110,105,48,54,65,49,7,117,110,105,48,54,65,50,7,117,110,105,48,54,65,51,7,117,110,105,48,54,65,52,7,117,110,105,48,54,65,53,7,117, + 110,105,48,54,65,54,7,117,110,105,48,54,65,55,7,117,110,105,48,54,65,56,7,117,110,105,48,54,65,57,7,117,110,105,48,54,65,65,7,117, + 110,105,48,54,65,66,7,117,110,105,48,54,65,67,7,117,110,105,48,54,65,68,7,117,110,105,48,54,65,69,7,117,110,105,48,54,65,70,7,117, + 110,105,48,54,66,48,7,117,110,105,48,54,66,49,7,117,110,105,48,54,66,50,7,117,110,105,48,54,66,51,7,117,110,105,48,54,66,52,7,117, + 110,105,48,54,66,53,7,117,110,105,48,54,66,54,7,117,110,105,48,54,66,55,7,117,110,105,48,54,66,56,7,117,110,105,48,54,66,57,7,117, + 110,105,48,54,66,65,7,117,110,105,48,54,66,66,7,117,110,105,48,54,66,67,7,117,110,105,48,54,66,68,7,117,110,105,48,54,66,69,7,117, + 110,105,48,54,66,70,7,117,110,105,48,54,67,54,7,117,110,105,48,54,67,67,7,117,110,105,48,54,67,69,7,117,110,105,48,54,68,53,7,117, + 110,105,48,54,70,48,7,117,110,105,48,54,70,49,7,117,110,105,48,54,70,50,7,117,110,105,48,54,70,51,7,117,110,105,48,54,70,52,7,117, + 110,105,48,54,70,53,7,117,110,105,48,54,70,54,7,117,110,105,48,54,70,55,7,117,110,105,48,54,70,56,7,117,110,105,48,54,70,57,7,117, + 110,105,48,55,67,48,7,117,110,105,48,55,67,49,7,117,110,105,48,55,67,50,7,117,110,105,48,55,67,51,7,117,110,105,48,55,67,52,7,117, + 110,105,48,55,67,53,7,117,110,105,48,55,67,54,7,117,110,105,48,55,67,55,7,117,110,105,48,55,67,56,7,117,110,105,48,55,67,57,7,117, + 110,105,48,55,67,65,7,117,110,105,48,55,67,66,7,117,110,105,48,55,67,67,7,117,110,105,48,55,67,68,7,117,110,105,48,55,67,69,7,117, + 110,105,48,55,67,70,7,117,110,105,48,55,68,48,7,117,110,105,48,55,68,49,7,117,110,105,48,55,68,50,7,117,110,105,48,55,68,51,7,117, + 110,105,48,55,68,52,7,117,110,105,48,55,68,53,7,117,110,105,48,55,68,54,7,117,110,105,48,55,68,55,7,117,110,105,48,55,68,56,7,117, + 110,105,48,55,68,57,7,117,110,105,48,55,68,65,7,117,110,105,48,55,68,66,7,117,110,105,48,55,68,67,7,117,110,105,48,55,68,68,7,117, + 110,105,48,55,68,69,7,117,110,105,48,55,68,70,7,117,110,105,48,55,69,48,7,117,110,105,48,55,69,49,7,117,110,105,48,55,69,50,7,117, + 110,105,48,55,69,51,7,117,110,105,48,55,69,52,7,117,110,105,48,55,69,53,7,117,110,105,48,55,69,54,7,117,110,105,48,55,69,55,7,117, + 110,105,48,55,69,66,7,117,110,105,48,55,69,67,7,117,110,105,48,55,69,68,7,117,110,105,48,55,69,69,7,117,110,105,48,55,69,70,7,117, + 110,105,48,55,70,48,7,117,110,105,48,55,70,49,7,117,110,105,48,55,70,50,7,117,110,105,48,55,70,51,7,117,110,105,48,55,70,52,7,117, + 110,105,48,55,70,53,7,117,110,105,48,55,70,56,7,117,110,105,48,55,70,57,7,117,110,105,48,55,70,65,7,117,110,105,48,69,51,70,7,117, + 110,105,48,69,56,49,7,117,110,105,48,69,56,50,7,117,110,105,48,69,56,52,7,117,110,105,48,69,56,55,7,117,110,105,48,69,56,56,7,117, + 110,105,48,69,56,65,7,117,110,105,48,69,56,68,7,117,110,105,48,69,57,52,7,117,110,105,48,69,57,53,7,117,110,105,48,69,57,54,7,117, + 110,105,48,69,57,55,7,117,110,105,48,69,57,57,7,117,110,105,48,69,57,65,7,117,110,105,48,69,57,66,7,117,110,105,48,69,57,67,7,117, + 110,105,48,69,57,68,7,117,110,105,48,69,57,69,7,117,110,105,48,69,57,70,7,117,110,105,48,69,65,49,7,117,110,105,48,69,65,50,7,117, + 110,105,48,69,65,51,7,117,110,105,48,69,65,53,7,117,110,105,48,69,65,55,7,117,110,105,48,69,65,65,7,117,110,105,48,69,65,66,7,117, + 110,105,48,69,65,68,7,117,110,105,48,69,65,69,7,117,110,105,48,69,65,70,7,117,110,105,48,69,66,48,7,117,110,105,48,69,66,49,7,117, + 110,105,48,69,66,50,7,117,110,105,48,69,66,51,7,117,110,105,48,69,66,52,7,117,110,105,48,69,66,53,7,117,110,105,48,69,66,54,7,117, + 110,105,48,69,66,55,7,117,110,105,48,69,66,56,7,117,110,105,48,69,66,57,7,117,110,105,48,69,66,66,7,117,110,105,48,69,66,67,7,117, + 110,105,48,69,66,68,7,117,110,105,48,69,67,48,7,117,110,105,48,69,67,49,7,117,110,105,48,69,67,50,7,117,110,105,48,69,67,51,7,117, + 110,105,48,69,67,52,7,117,110,105,48,69,67,54,7,117,110,105,48,69,67,56,7,117,110,105,48,69,67,57,7,117,110,105,48,69,67,65,7,117, + 110,105,48,69,67,66,7,117,110,105,48,69,67,67,7,117,110,105,48,69,67,68,7,117,110,105,48,69,68,48,7,117,110,105,48,69,68,49,7,117, + 110,105,48,69,68,50,7,117,110,105,48,69,68,51,7,117,110,105,48,69,68,52,7,117,110,105,48,69,68,53,7,117,110,105,48,69,68,54,7,117, + 110,105,48,69,68,55,7,117,110,105,48,69,68,56,7,117,110,105,48,69,68,57,7,117,110,105,48,69,68,67,7,117,110,105,48,69,68,68,7,117, + 110,105,49,48,65,48,7,117,110,105,49,48,65,49,7,117,110,105,49,48,65,50,7,117,110,105,49,48,65,51,7,117,110,105,49,48,65,52,7,117, + 110,105,49,48,65,53,7,117,110,105,49,48,65,54,7,117,110,105,49,48,65,55,7,117,110,105,49,48,65,56,7,117,110,105,49,48,65,57,7,117, + 110,105,49,48,65,65,7,117,110,105,49,48,65,66,7,117,110,105,49,48,65,67,7,117,110,105,49,48,65,68,7,117,110,105,49,48,65,69,7,117, + 110,105,49,48,65,70,7,117,110,105,49,48,66,48,7,117,110,105,49,48,66,49,7,117,110,105,49,48,66,50,7,117,110,105,49,48,66,51,7,117, + 110,105,49,48,66,52,7,117,110,105,49,48,66,53,7,117,110,105,49,48,66,54,7,117,110,105,49,48,66,55,7,117,110,105,49,48,66,56,7,117, + 110,105,49,48,66,57,7,117,110,105,49,48,66,65,7,117,110,105,49,48,66,66,7,117,110,105,49,48,66,67,7,117,110,105,49,48,66,68,7,117, + 110,105,49,48,66,69,7,117,110,105,49,48,66,70,7,117,110,105,49,48,67,48,7,117,110,105,49,48,67,49,7,117,110,105,49,48,67,50,7,117, + 110,105,49,48,67,51,7,117,110,105,49,48,67,52,7,117,110,105,49,48,67,53,7,117,110,105,49,48,68,48,7,117,110,105,49,48,68,49,7,117, + 110,105,49,48,68,50,7,117,110,105,49,48,68,51,7,117,110,105,49,48,68,52,7,117,110,105,49,48,68,53,7,117,110,105,49,48,68,54,7,117, + 110,105,49,48,68,55,7,117,110,105,49,48,68,56,7,117,110,105,49,48,68,57,7,117,110,105,49,48,68,65,7,117,110,105,49,48,68,66,7,117, + 110,105,49,48,68,67,7,117,110,105,49,48,68,68,7,117,110,105,49,48,68,69,7,117,110,105,49,48,68,70,7,117,110,105,49,48,69,48,7,117, + 110,105,49,48,69,49,7,117,110,105,49,48,69,50,7,117,110,105,49,48,69,51,7,117,110,105,49,48,69,52,7,117,110,105,49,48,69,53,7,117, + 110,105,49,48,69,54,7,117,110,105,49,48,69,55,7,117,110,105,49,48,69,56,7,117,110,105,49,48,69,57,7,117,110,105,49,48,69,65,7,117, + 110,105,49,48,69,66,7,117,110,105,49,48,69,67,7,117,110,105,49,48,69,68,7,117,110,105,49,48,69,69,7,117,110,105,49,48,69,70,7,117, + 110,105,49,48,70,48,7,117,110,105,49,48,70,49,7,117,110,105,49,48,70,50,7,117,110,105,49,48,70,51,7,117,110,105,49,48,70,52,7,117, + 110,105,49,48,70,53,7,117,110,105,49,48,70,54,7,117,110,105,49,48,70,55,7,117,110,105,49,48,70,56,7,117,110,105,49,48,70,57,7,117, + 110,105,49,48,70,65,7,117,110,105,49,48,70,66,7,117,110,105,49,48,70,67,7,117,110,105,49,52,48,49,7,117,110,105,49,52,48,50,7,117, + 110,105,49,52,48,51,7,117,110,105,49,52,48,52,7,117,110,105,49,52,48,53,7,117,110,105,49,52,48,54,7,117,110,105,49,52,48,55,7,117, + 110,105,49,52,48,57,7,117,110,105,49,52,48,65,7,117,110,105,49,52,48,66,7,117,110,105,49,52,48,67,7,117,110,105,49,52,48,68,7,117, + 110,105,49,52,48,69,7,117,110,105,49,52,48,70,7,117,110,105,49,52,49,48,7,117,110,105,49,52,49,49,7,117,110,105,49,52,49,50,7,117, + 110,105,49,52,49,51,7,117,110,105,49,52,49,52,7,117,110,105,49,52,49,53,7,117,110,105,49,52,49,54,7,117,110,105,49,52,49,55,7,117, + 110,105,49,52,49,56,7,117,110,105,49,52,49,57,7,117,110,105,49,52,49,65,7,117,110,105,49,52,49,66,7,117,110,105,49,52,49,68,7,117, + 110,105,49,52,49,69,7,117,110,105,49,52,49,70,7,117,110,105,49,52,50,48,7,117,110,105,49,52,50,49,7,117,110,105,49,52,50,50,7,117, + 110,105,49,52,50,51,7,117,110,105,49,52,50,52,7,117,110,105,49,52,50,53,7,117,110,105,49,52,50,54,7,117,110,105,49,52,50,55,7,117, + 110,105,49,52,50,56,7,117,110,105,49,52,50,57,7,117,110,105,49,52,50,65,7,117,110,105,49,52,50,66,7,117,110,105,49,52,50,67,7,117, + 110,105,49,52,50,68,7,117,110,105,49,52,50,69,7,117,110,105,49,52,50,70,7,117,110,105,49,52,51,48,7,117,110,105,49,52,51,49,7,117, + 110,105,49,52,51,50,7,117,110,105,49,52,51,51,7,117,110,105,49,52,51,52,7,117,110,105,49,52,51,53,7,117,110,105,49,52,51,55,7,117, + 110,105,49,52,51,56,7,117,110,105,49,52,51,57,7,117,110,105,49,52,51,65,7,117,110,105,49,52,51,66,7,117,110,105,49,52,51,67,7,117, + 110,105,49,52,51,68,7,117,110,105,49,52,51,69,7,117,110,105,49,52,51,70,7,117,110,105,49,52,52,48,7,117,110,105,49,52,52,49,7,117, + 110,105,49,52,52,50,7,117,110,105,49,52,52,51,7,117,110,105,49,52,52,52,7,117,110,105,49,52,52,53,7,117,110,105,49,52,52,54,7,117, + 110,105,49,52,52,55,7,117,110,105,49,52,52,56,7,117,110,105,49,52,52,57,7,117,110,105,49,52,52,65,7,117,110,105,49,52,52,67,7,117, + 110,105,49,52,52,68,7,117,110,105,49,52,52,69,7,117,110,105,49,52,52,70,7,117,110,105,49,52,53,48,7,117,110,105,49,52,53,49,7,117, + 110,105,49,52,53,50,7,117,110,105,49,52,53,52,7,117,110,105,49,52,53,53,7,117,110,105,49,52,53,54,7,117,110,105,49,52,53,55,7,117, + 110,105,49,52,53,56,7,117,110,105,49,52,53,57,7,117,110,105,49,52,53,65,7,117,110,105,49,52,53,66,7,117,110,105,49,52,53,67,7,117, + 110,105,49,52,53,68,7,117,110,105,49,52,53,69,7,117,110,105,49,52,53,70,7,117,110,105,49,52,54,48,7,117,110,105,49,52,54,49,7,117, + 110,105,49,52,54,50,7,117,110,105,49,52,54,51,7,117,110,105,49,52,54,52,7,117,110,105,49,52,54,53,7,117,110,105,49,52,54,54,7,117, + 110,105,49,52,54,55,7,117,110,105,49,52,54,56,7,117,110,105,49,52,54,57,7,117,110,105,49,52,54,65,7,117,110,105,49,52,54,66,7,117, + 110,105,49,52,54,67,7,117,110,105,49,52,54,68,7,117,110,105,49,52,54,69,7,117,110,105,49,52,54,70,7,117,110,105,49,52,55,48,7,117, + 110,105,49,52,55,49,7,117,110,105,49,52,55,50,7,117,110,105,49,52,55,51,7,117,110,105,49,52,55,52,7,117,110,105,49,52,55,53,7,117, + 110,105,49,52,55,54,7,117,110,105,49,52,55,55,7,117,110,105,49,52,55,56,7,117,110,105,49,52,55,57,7,117,110,105,49,52,55,65,7,117, + 110,105,49,52,55,66,7,117,110,105,49,52,55,67,7,117,110,105,49,52,55,68,7,117,110,105,49,52,55,69,7,117,110,105,49,52,55,70,7,117, + 110,105,49,52,56,48,7,117,110,105,49,52,56,49,7,117,110,105,49,52,56,50,7,117,110,105,49,52,56,51,7,117,110,105,49,52,56,52,7,117, + 110,105,49,52,56,53,7,117,110,105,49,52,56,54,7,117,110,105,49,52,56,55,7,117,110,105,49,52,56,56,7,117,110,105,49,52,56,57,7,117, + 110,105,49,52,56,65,7,117,110,105,49,52,56,66,7,117,110,105,49,52,56,67,7,117,110,105,49,52,56,68,7,117,110,105,49,52,56,69,7,117, + 110,105,49,52,56,70,7,117,110,105,49,52,57,48,7,117,110,105,49,52,57,49,7,117,110,105,49,52,57,50,7,117,110,105,49,52,57,51,7,117, + 110,105,49,52,57,52,7,117,110,105,49,52,57,53,7,117,110,105,49,52,57,54,7,117,110,105,49,52,57,55,7,117,110,105,49,52,57,56,7,117, + 110,105,49,52,57,57,7,117,110,105,49,52,57,65,7,117,110,105,49,52,57,66,7,117,110,105,49,52,57,67,7,117,110,105,49,52,57,68,7,117, + 110,105,49,52,57,69,7,117,110,105,49,52,57,70,7,117,110,105,49,52,65,48,7,117,110,105,49,52,65,49,7,117,110,105,49,52,65,50,7,117, + 110,105,49,52,65,51,7,117,110,105,49,52,65,52,7,117,110,105,49,52,65,53,7,117,110,105,49,52,65,54,7,117,110,105,49,52,65,55,7,117, + 110,105,49,52,65,56,7,117,110,105,49,52,65,57,7,117,110,105,49,52,65,65,7,117,110,105,49,52,65,66,7,117,110,105,49,52,65,67,7,117, + 110,105,49,52,65,68,7,117,110,105,49,52,65,69,7,117,110,105,49,52,65,70,7,117,110,105,49,52,66,48,7,117,110,105,49,52,66,49,7,117, + 110,105,49,52,66,50,7,117,110,105,49,52,66,51,7,117,110,105,49,52,66,52,7,117,110,105,49,52,66,53,7,117,110,105,49,52,66,54,7,117, + 110,105,49,52,66,55,7,117,110,105,49,52,66,56,7,117,110,105,49,52,66,57,7,117,110,105,49,52,66,65,7,117,110,105,49,52,66,66,7,117, + 110,105,49,52,66,67,7,117,110,105,49,52,66,68,7,117,110,105,49,52,67,48,7,117,110,105,49,52,67,49,7,117,110,105,49,52,67,50,7,117, + 110,105,49,52,67,51,7,117,110,105,49,52,67,52,7,117,110,105,49,52,67,53,7,117,110,105,49,52,67,54,7,117,110,105,49,52,67,55,7,117, + 110,105,49,52,67,56,7,117,110,105,49,52,67,57,7,117,110,105,49,52,67,65,7,117,110,105,49,52,67,66,7,117,110,105,49,52,67,67,7,117, + 110,105,49,52,67,68,7,117,110,105,49,52,67,69,7,117,110,105,49,52,67,70,7,117,110,105,49,52,68,48,7,117,110,105,49,52,68,49,7,117, + 110,105,49,52,68,50,7,117,110,105,49,52,68,51,7,117,110,105,49,52,68,52,7,117,110,105,49,52,68,53,7,117,110,105,49,52,68,54,7,117, + 110,105,49,52,68,55,7,117,110,105,49,52,68,56,7,117,110,105,49,52,68,57,7,117,110,105,49,52,68,65,7,117,110,105,49,52,68,66,7,117, + 110,105,49,52,68,67,7,117,110,105,49,52,68,68,7,117,110,105,49,52,68,69,7,117,110,105,49,52,68,70,7,117,110,105,49,52,69,48,7,117, + 110,105,49,52,69,49,7,117,110,105,49,52,69,50,7,117,110,105,49,52,69,51,7,117,110,105,49,52,69,52,7,117,110,105,49,52,69,53,7,117, + 110,105,49,52,69,54,7,117,110,105,49,52,69,55,7,117,110,105,49,52,69,56,7,117,110,105,49,52,69,57,7,117,110,105,49,52,69,65,7,117, + 110,105,49,52,69,67,7,117,110,105,49,52,69,68,7,117,110,105,49,52,69,69,7,117,110,105,49,52,69,70,7,117,110,105,49,52,70,48,7,117, + 110,105,49,52,70,49,7,117,110,105,49,52,70,50,7,117,110,105,49,52,70,51,7,117,110,105,49,52,70,52,7,117,110,105,49,52,70,53,7,117, + 110,105,49,52,70,54,7,117,110,105,49,52,70,55,7,117,110,105,49,52,70,56,7,117,110,105,49,52,70,57,7,117,110,105,49,52,70,65,7,117, + 110,105,49,52,70,66,7,117,110,105,49,52,70,67,7,117,110,105,49,52,70,68,7,117,110,105,49,52,70,69,7,117,110,105,49,52,70,70,7,117, + 110,105,49,53,48,48,7,117,110,105,49,53,48,49,7,117,110,105,49,53,48,50,7,117,110,105,49,53,48,51,7,117,110,105,49,53,48,52,7,117, + 110,105,49,53,48,53,7,117,110,105,49,53,48,54,7,117,110,105,49,53,48,55,7,117,110,105,49,53,49,48,7,117,110,105,49,53,49,49,7,117, + 110,105,49,53,49,50,7,117,110,105,49,53,49,51,7,117,110,105,49,53,49,52,7,117,110,105,49,53,49,53,7,117,110,105,49,53,49,54,7,117, + 110,105,49,53,49,55,7,117,110,105,49,53,49,56,7,117,110,105,49,53,49,57,7,117,110,105,49,53,49,65,7,117,110,105,49,53,49,66,7,117, + 110,105,49,53,49,67,7,117,110,105,49,53,49,68,7,117,110,105,49,53,49,69,7,117,110,105,49,53,49,70,7,117,110,105,49,53,50,48,7,117, + 110,105,49,53,50,49,7,117,110,105,49,53,50,50,7,117,110,105,49,53,50,51,7,117,110,105,49,53,50,52,7,117,110,105,49,53,50,53,7,117, + 110,105,49,53,50,54,7,117,110,105,49,53,50,55,7,117,110,105,49,53,50,56,7,117,110,105,49,53,50,57,7,117,110,105,49,53,50,65,7,117, + 110,105,49,53,50,66,7,117,110,105,49,53,50,67,7,117,110,105,49,53,50,68,7,117,110,105,49,53,50,69,7,117,110,105,49,53,50,70,7,117, + 110,105,49,53,51,48,7,117,110,105,49,53,51,49,7,117,110,105,49,53,51,50,7,117,110,105,49,53,51,51,7,117,110,105,49,53,51,52,7,117, + 110,105,49,53,51,53,7,117,110,105,49,53,51,54,7,117,110,105,49,53,51,55,7,117,110,105,49,53,51,56,7,117,110,105,49,53,51,57,7,117, + 110,105,49,53,51,65,7,117,110,105,49,53,51,66,7,117,110,105,49,53,51,67,7,117,110,105,49,53,51,68,7,117,110,105,49,53,51,69,7,117, + 110,105,49,53,52,48,7,117,110,105,49,53,52,49,7,117,110,105,49,53,52,50,7,117,110,105,49,53,52,51,7,117,110,105,49,53,52,52,7,117, + 110,105,49,53,52,53,7,117,110,105,49,53,52,54,7,117,110,105,49,53,52,55,7,117,110,105,49,53,52,56,7,117,110,105,49,53,52,57,7,117, + 110,105,49,53,52,65,7,117,110,105,49,53,52,66,7,117,110,105,49,53,52,67,7,117,110,105,49,53,52,68,7,117,110,105,49,53,52,69,7,117, + 110,105,49,53,52,70,7,117,110,105,49,53,53,48,7,117,110,105,49,53,53,50,7,117,110,105,49,53,53,51,7,117,110,105,49,53,53,52,7,117, + 110,105,49,53,53,53,7,117,110,105,49,53,53,54,7,117,110,105,49,53,53,55,7,117,110,105,49,53,53,56,7,117,110,105,49,53,53,57,7,117, + 110,105,49,53,53,65,7,117,110,105,49,53,53,66,7,117,110,105,49,53,53,67,7,117,110,105,49,53,53,68,7,117,110,105,49,53,53,69,7,117, + 110,105,49,53,53,70,7,117,110,105,49,53,54,48,7,117,110,105,49,53,54,49,7,117,110,105,49,53,54,50,7,117,110,105,49,53,54,51,7,117, + 110,105,49,53,54,52,7,117,110,105,49,53,54,53,7,117,110,105,49,53,54,54,7,117,110,105,49,53,54,55,7,117,110,105,49,53,54,56,7,117, + 110,105,49,53,54,57,7,117,110,105,49,53,54,65,7,117,110,105,49,53,55,52,7,117,110,105,49,53,55,53,7,117,110,105,49,53,55,54,7,117, + 110,105,49,53,55,55,7,117,110,105,49,53,55,56,7,117,110,105,49,53,55,57,7,117,110,105,49,53,55,65,7,117,110,105,49,53,55,66,7,117, + 110,105,49,53,55,67,7,117,110,105,49,53,55,68,7,117,110,105,49,53,55,69,7,117,110,105,49,53,55,70,7,117,110,105,49,53,56,48,7,117, + 110,105,49,53,56,49,7,117,110,105,49,53,56,50,7,117,110,105,49,53,56,51,7,117,110,105,49,53,56,52,7,117,110,105,49,53,56,53,7,117, + 110,105,49,53,56,65,7,117,110,105,49,53,56,66,7,117,110,105,49,53,56,67,7,117,110,105,49,53,56,68,7,117,110,105,49,53,56,69,7,117, + 110,105,49,53,56,70,7,117,110,105,49,53,57,48,7,117,110,105,49,53,57,49,7,117,110,105,49,53,57,50,7,117,110,105,49,53,57,51,7,117, + 110,105,49,53,57,52,7,117,110,105,49,53,57,53,7,117,110,105,49,53,57,54,7,117,110,105,49,53,65,48,7,117,110,105,49,53,65,49,7,117, + 110,105,49,53,65,50,7,117,110,105,49,53,65,51,7,117,110,105,49,53,65,52,7,117,110,105,49,53,65,53,7,117,110,105,49,53,65,54,7,117, + 110,105,49,53,65,55,7,117,110,105,49,53,65,56,7,117,110,105,49,53,65,57,7,117,110,105,49,53,65,65,7,117,110,105,49,53,65,66,7,117, + 110,105,49,53,65,67,7,117,110,105,49,53,65,68,7,117,110,105,49,53,65,69,7,117,110,105,49,53,65,70,7,117,110,105,49,53,68,69,7,117, + 110,105,49,53,69,49,7,117,110,105,49,54,52,54,7,117,110,105,49,54,52,55,7,117,110,105,49,54,54,69,7,117,110,105,49,54,54,70,7,117, + 110,105,49,54,55,48,7,117,110,105,49,54,55,49,7,117,110,105,49,54,55,50,7,117,110,105,49,54,55,51,7,117,110,105,49,54,55,52,7,117, + 110,105,49,54,55,53,7,117,110,105,49,54,55,54,7,117,110,105,49,54,56,48,7,117,110,105,49,54,56,49,7,117,110,105,49,54,56,50,7,117, + 110,105,49,54,56,51,7,117,110,105,49,54,56,52,7,117,110,105,49,54,56,53,7,117,110,105,49,54,56,54,7,117,110,105,49,54,56,55,7,117, + 110,105,49,54,56,56,7,117,110,105,49,54,56,57,7,117,110,105,49,54,56,65,7,117,110,105,49,54,56,66,7,117,110,105,49,54,56,67,7,117, + 110,105,49,54,56,68,7,117,110,105,49,54,56,69,7,117,110,105,49,54,56,70,7,117,110,105,49,54,57,48,7,117,110,105,49,54,57,49,7,117, + 110,105,49,54,57,50,7,117,110,105,49,54,57,51,7,117,110,105,49,54,57,52,7,117,110,105,49,54,57,53,7,117,110,105,49,54,57,54,7,117, + 110,105,49,54,57,55,7,117,110,105,49,54,57,56,7,117,110,105,49,54,57,57,7,117,110,105,49,54,57,65,7,117,110,105,49,54,57,66,7,117, + 110,105,49,54,57,67,7,117,110,105,49,68,48,48,7,117,110,105,49,68,48,49,7,117,110,105,49,68,48,50,7,117,110,105,49,68,48,51,7,117, + 110,105,49,68,48,52,7,117,110,105,49,68,48,53,7,117,110,105,49,68,48,54,7,117,110,105,49,68,48,55,7,117,110,105,49,68,48,56,7,117, + 110,105,49,68,48,57,7,117,110,105,49,68,48,65,7,117,110,105,49,68,48,66,7,117,110,105,49,68,48,67,7,117,110,105,49,68,48,68,7,117, + 110,105,49,68,48,69,7,117,110,105,49,68,48,70,7,117,110,105,49,68,49,48,7,117,110,105,49,68,49,49,7,117,110,105,49,68,49,50,7,117, + 110,105,49,68,49,51,7,117,110,105,49,68,49,52,7,117,110,105,49,68,49,54,7,117,110,105,49,68,49,55,7,117,110,105,49,68,49,56,7,117, + 110,105,49,68,49,57,7,117,110,105,49,68,49,65,7,117,110,105,49,68,49,66,7,117,110,105,49,68,49,67,7,117,110,105,49,68,49,68,7,117, + 110,105,49,68,49,69,7,117,110,105,49,68,49,70,7,117,110,105,49,68,50,48,7,117,110,105,49,68,50,49,7,117,110,105,49,68,50,50,7,117, + 110,105,49,68,50,51,7,117,110,105,49,68,50,54,7,117,110,105,49,68,50,55,7,117,110,105,49,68,50,56,7,117,110,105,49,68,50,57,7,117, + 110,105,49,68,50,65,7,117,110,105,49,68,50,66,7,117,110,105,49,68,50,67,7,117,110,105,49,68,50,68,7,117,110,105,49,68,50,69,7,117, + 110,105,49,68,51,48,7,117,110,105,49,68,51,49,7,117,110,105,49,68,51,50,7,117,110,105,49,68,51,51,7,117,110,105,49,68,51,52,7,117, + 110,105,49,68,51,53,7,117,110,105,49,68,51,54,7,117,110,105,49,68,51,55,7,117,110,105,49,68,51,56,7,117,110,105,49,68,51,57,7,117, + 110,105,49,68,51,65,7,117,110,105,49,68,51,66,7,117,110,105,49,68,51,67,7,117,110,105,49,68,51,68,7,117,110,105,49,68,51,69,7,117, + 110,105,49,68,51,70,7,117,110,105,49,68,52,48,7,117,110,105,49,68,52,49,7,117,110,105,49,68,52,50,7,117,110,105,49,68,52,51,7,117, + 110,105,49,68,52,52,7,117,110,105,49,68,52,53,7,117,110,105,49,68,52,54,7,117,110,105,49,68,52,55,7,117,110,105,49,68,52,56,7,117, + 110,105,49,68,52,57,7,117,110,105,49,68,52,65,7,117,110,105,49,68,52,66,7,117,110,105,49,68,52,67,7,117,110,105,49,68,52,68,7,117, + 110,105,49,68,52,69,7,117,110,105,49,68,52,70,7,117,110,105,49,68,53,48,7,117,110,105,49,68,53,49,7,117,110,105,49,68,53,50,7,117, + 110,105,49,68,53,51,7,117,110,105,49,68,53,52,7,117,110,105,49,68,53,53,7,117,110,105,49,68,53,54,7,117,110,105,49,68,53,55,7,117, + 110,105,49,68,53,56,7,117,110,105,49,68,53,57,7,117,110,105,49,68,53,65,7,117,110,105,49,68,53,66,7,117,110,105,49,68,53,68,7,117, + 110,105,49,68,53,69,7,117,110,105,49,68,53,70,7,117,110,105,49,68,54,48,7,117,110,105,49,68,54,49,7,117,110,105,49,68,54,50,7,117, + 110,105,49,68,54,51,7,117,110,105,49,68,54,52,7,117,110,105,49,68,54,53,7,117,110,105,49,68,54,54,7,117,110,105,49,68,54,55,7,117, + 110,105,49,68,54,56,7,117,110,105,49,68,54,57,7,117,110,105,49,68,54,65,7,117,110,105,49,68,55,55,7,117,110,105,49,68,55,56,7,117, + 110,105,49,68,55,66,7,117,110,105,49,68,55,68,7,117,110,105,49,68,56,53,7,117,110,105,49,68,57,66,7,117,110,105,49,68,57,67,7,117, + 110,105,49,68,57,68,7,117,110,105,49,68,57,69,7,117,110,105,49,68,57,70,7,117,110,105,49,68,65,48,7,117,110,105,49,68,65,49,7,117, + 110,105,49,68,65,50,7,117,110,105,49,68,65,51,7,117,110,105,49,68,65,52,7,117,110,105,49,68,65,53,7,117,110,105,49,68,65,54,7,117, + 110,105,49,68,65,55,7,117,110,105,49,68,65,56,7,117,110,105,49,68,65,57,7,117,110,105,49,68,65,65,7,117,110,105,49,68,65,66,7,117, + 110,105,49,68,65,67,7,117,110,105,49,68,65,68,7,117,110,105,49,68,65,69,7,117,110,105,49,68,65,70,7,117,110,105,49,68,66,48,7,117, + 110,105,49,68,66,49,7,117,110,105,49,68,66,50,7,117,110,105,49,68,66,51,7,117,110,105,49,68,66,52,7,117,110,105,49,68,66,53,7,117, + 110,105,49,68,66,54,7,117,110,105,49,68,66,55,7,117,110,105,49,68,66,56,7,117,110,105,49,68,66,57,7,117,110,105,49,68,66,65,7,117, + 110,105,49,68,66,66,7,117,110,105,49,68,66,67,7,117,110,105,49,68,66,68,7,117,110,105,49,68,66,69,7,117,110,105,49,68,66,70,7,117, + 110,105,49,68,67,52,7,117,110,105,49,68,67,53,7,117,110,105,49,68,67,54,7,117,110,105,49,68,67,55,7,117,110,105,49,68,67,56,7,117, + 110,105,49,68,67,57,7,117,110,105,49,69,48,48,7,117,110,105,49,69,48,49,7,117,110,105,49,69,48,50,7,117,110,105,49,69,48,51,7,117, + 110,105,49,69,48,52,7,117,110,105,49,69,48,53,7,117,110,105,49,69,48,54,7,117,110,105,49,69,48,55,7,117,110,105,49,69,48,56,7,117, + 110,105,49,69,48,57,7,117,110,105,49,69,48,65,7,117,110,105,49,69,48,66,7,117,110,105,49,69,48,67,7,117,110,105,49,69,48,68,7,117, + 110,105,49,69,48,69,7,117,110,105,49,69,48,70,7,117,110,105,49,69,49,48,7,117,110,105,49,69,49,49,7,117,110,105,49,69,49,50,7,117, + 110,105,49,69,49,51,7,117,110,105,49,69,49,52,7,117,110,105,49,69,49,53,7,117,110,105,49,69,49,54,7,117,110,105,49,69,49,55,7,117, + 110,105,49,69,49,56,7,117,110,105,49,69,49,57,7,117,110,105,49,69,49,65,7,117,110,105,49,69,49,66,7,117,110,105,49,69,49,67,7,117, + 110,105,49,69,49,68,7,117,110,105,49,69,49,69,7,117,110,105,49,69,49,70,7,117,110,105,49,69,50,48,7,117,110,105,49,69,50,49,7,117, + 110,105,49,69,50,50,7,117,110,105,49,69,50,51,7,117,110,105,49,69,50,52,7,117,110,105,49,69,50,53,7,117,110,105,49,69,50,54,7,117, + 110,105,49,69,50,55,7,117,110,105,49,69,50,56,7,117,110,105,49,69,50,57,7,117,110,105,49,69,50,65,7,117,110,105,49,69,50,66,7,117, + 110,105,49,69,50,67,7,117,110,105,49,69,50,68,7,117,110,105,49,69,50,69,7,117,110,105,49,69,50,70,7,117,110,105,49,69,51,48,7,117, + 110,105,49,69,51,49,7,117,110,105,49,69,51,50,7,117,110,105,49,69,51,51,7,117,110,105,49,69,51,52,7,117,110,105,49,69,51,53,7,117, + 110,105,49,69,51,54,7,117,110,105,49,69,51,55,7,117,110,105,49,69,51,56,7,117,110,105,49,69,51,57,7,117,110,105,49,69,51,65,7,117, + 110,105,49,69,51,66,7,117,110,105,49,69,51,67,7,117,110,105,49,69,51,68,7,117,110,105,49,69,51,69,7,117,110,105,49,69,51,70,7,117, + 110,105,49,69,52,48,7,117,110,105,49,69,52,49,7,117,110,105,49,69,52,50,7,117,110,105,49,69,52,51,7,117,110,105,49,69,52,52,7,117, + 110,105,49,69,52,53,7,117,110,105,49,69,52,54,7,117,110,105,49,69,52,55,7,117,110,105,49,69,52,56,7,117,110,105,49,69,52,57,7,117, + 110,105,49,69,52,65,7,117,110,105,49,69,52,66,7,117,110,105,49,69,52,67,7,117,110,105,49,69,52,68,7,117,110,105,49,69,52,69,7,117, + 110,105,49,69,52,70,7,117,110,105,49,69,53,48,7,117,110,105,49,69,53,49,7,117,110,105,49,69,53,50,7,117,110,105,49,69,53,51,7,117, + 110,105,49,69,53,52,7,117,110,105,49,69,53,53,7,117,110,105,49,69,53,54,7,117,110,105,49,69,53,55,7,117,110,105,49,69,53,56,7,117, + 110,105,49,69,53,57,7,117,110,105,49,69,53,65,7,117,110,105,49,69,53,66,7,117,110,105,49,69,53,67,7,117,110,105,49,69,53,68,7,117, + 110,105,49,69,53,69,7,117,110,105,49,69,53,70,7,117,110,105,49,69,54,48,7,117,110,105,49,69,54,49,7,117,110,105,49,69,54,50,7,117, + 110,105,49,69,54,51,7,117,110,105,49,69,54,52,7,117,110,105,49,69,54,53,7,117,110,105,49,69,54,54,7,117,110,105,49,69,54,55,7,117, + 110,105,49,69,54,56,7,117,110,105,49,69,54,57,7,117,110,105,49,69,54,65,7,117,110,105,49,69,54,66,7,117,110,105,49,69,54,67,7,117, + 110,105,49,69,54,68,7,117,110,105,49,69,54,69,7,117,110,105,49,69,54,70,7,117,110,105,49,69,55,48,7,117,110,105,49,69,55,49,7,117, + 110,105,49,69,55,50,7,117,110,105,49,69,55,51,7,117,110,105,49,69,55,52,7,117,110,105,49,69,55,53,7,117,110,105,49,69,55,54,7,117, + 110,105,49,69,55,55,7,117,110,105,49,69,55,56,7,117,110,105,49,69,55,57,7,117,110,105,49,69,55,65,7,117,110,105,49,69,55,66,7,117, + 110,105,49,69,55,67,7,117,110,105,49,69,55,68,7,117,110,105,49,69,55,69,7,117,110,105,49,69,55,70,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,7,117, + 110,105,49,69,56,54,7,117,110,105,49,69,56,55,7,117,110,105,49,69,56,56,7,117,110,105,49,69,56,57,7,117,110,105,49,69,56,65,7,117, + 110,105,49,69,56,66,7,117,110,105,49,69,56,67,7,117,110,105,49,69,56,68,7,117,110,105,49,69,56,69,7,117,110,105,49,69,56,70,7,117, + 110,105,49,69,57,48,7,117,110,105,49,69,57,49,7,117,110,105,49,69,57,50,7,117,110,105,49,69,57,51,7,117,110,105,49,69,57,52,7,117, + 110,105,49,69,57,53,7,117,110,105,49,69,57,54,7,117,110,105,49,69,57,55,7,117,110,105,49,69,57,56,7,117,110,105,49,69,57,57,7,117, + 110,105,49,69,57,65,7,117,110,105,49,69,57,66,7,117,110,105,49,69,57,67,7,117,110,105,49,69,57,68,7,117,110,105,49,69,57,69,7,117, + 110,105,49,69,57,70,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,7,117,110,105,49,69,67,56,7,117,110,105,49,69,67,57,7,117,110,105,49,69,67,65,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,6,89,103,114,97,118,101,6,121,103,114,97,118,101,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,49,69,70,65,7,117,110,105,49,69,70,66,7,117,110,105,49,70,48,48,7,117,110,105,49,70,48,49,7,117,110,105, + 49,70,48,50,7,117,110,105,49,70,48,51,7,117,110,105,49,70,48,52,7,117,110,105,49,70,48,53,7,117,110,105,49,70,48,54,7,117,110,105, + 49,70,48,55,7,117,110,105,49,70,48,56,7,117,110,105,49,70,48,57,7,117,110,105,49,70,48,65,7,117,110,105,49,70,48,66,7,117,110,105, + 49,70,48,67,7,117,110,105,49,70,48,68,7,117,110,105,49,70,48,69,7,117,110,105,49,70,48,70,7,117,110,105,49,70,49,48,7,117,110,105, + 49,70,49,49,7,117,110,105,49,70,49,50,7,117,110,105,49,70,49,51,7,117,110,105,49,70,49,52,7,117,110,105,49,70,49,53,7,117,110,105, + 49,70,49,56,7,117,110,105,49,70,49,57,7,117,110,105,49,70,49,65,7,117,110,105,49,70,49,66,7,117,110,105,49,70,49,67,7,117,110,105, + 49,70,49,68,7,117,110,105,49,70,50,48,7,117,110,105,49,70,50,49,7,117,110,105,49,70,50,50,7,117,110,105,49,70,50,51,7,117,110,105, + 49,70,50,52,7,117,110,105,49,70,50,53,7,117,110,105,49,70,50,54,7,117,110,105,49,70,50,55,7,117,110,105,49,70,50,56,7,117,110,105, + 49,70,50,57,7,117,110,105,49,70,50,65,7,117,110,105,49,70,50,66,7,117,110,105,49,70,50,67,7,117,110,105,49,70,50,68,7,117,110,105, + 49,70,50,69,7,117,110,105,49,70,50,70,7,117,110,105,49,70,51,48,7,117,110,105,49,70,51,49,7,117,110,105,49,70,51,50,7,117,110,105, + 49,70,51,51,7,117,110,105,49,70,51,52,7,117,110,105,49,70,51,53,7,117,110,105,49,70,51,54,7,117,110,105,49,70,51,55,7,117,110,105, + 49,70,51,56,7,117,110,105,49,70,51,57,7,117,110,105,49,70,51,65,7,117,110,105,49,70,51,66,7,117,110,105,49,70,51,67,7,117,110,105, + 49,70,51,68,7,117,110,105,49,70,51,69,7,117,110,105,49,70,51,70,7,117,110,105,49,70,52,48,7,117,110,105,49,70,52,49,7,117,110,105, + 49,70,52,50,7,117,110,105,49,70,52,51,7,117,110,105,49,70,52,52,7,117,110,105,49,70,52,53,7,117,110,105,49,70,52,56,7,117,110,105, + 49,70,52,57,7,117,110,105,49,70,52,65,7,117,110,105,49,70,52,66,7,117,110,105,49,70,52,67,7,117,110,105,49,70,52,68,7,117,110,105, + 49,70,53,48,7,117,110,105,49,70,53,49,7,117,110,105,49,70,53,50,7,117,110,105,49,70,53,51,7,117,110,105,49,70,53,52,7,117,110,105, + 49,70,53,53,7,117,110,105,49,70,53,54,7,117,110,105,49,70,53,55,7,117,110,105,49,70,53,57,7,117,110,105,49,70,53,66,7,117,110,105, + 49,70,53,68,7,117,110,105,49,70,53,70,7,117,110,105,49,70,54,48,7,117,110,105,49,70,54,49,7,117,110,105,49,70,54,50,7,117,110,105, + 49,70,54,51,7,117,110,105,49,70,54,52,7,117,110,105,49,70,54,53,7,117,110,105,49,70,54,54,7,117,110,105,49,70,54,55,7,117,110,105, + 49,70,54,56,7,117,110,105,49,70,54,57,7,117,110,105,49,70,54,65,7,117,110,105,49,70,54,66,7,117,110,105,49,70,54,67,7,117,110,105, + 49,70,54,68,7,117,110,105,49,70,54,69,7,117,110,105,49,70,54,70,7,117,110,105,49,70,55,48,7,117,110,105,49,70,55,49,7,117,110,105, + 49,70,55,50,7,117,110,105,49,70,55,51,7,117,110,105,49,70,55,52,7,117,110,105,49,70,55,53,7,117,110,105,49,70,55,54,7,117,110,105, + 49,70,55,55,7,117,110,105,49,70,55,56,7,117,110,105,49,70,55,57,7,117,110,105,49,70,55,65,7,117,110,105,49,70,55,66,7,117,110,105, + 49,70,55,67,7,117,110,105,49,70,55,68,7,117,110,105,49,70,56,48,7,117,110,105,49,70,56,49,7,117,110,105,49,70,56,50,7,117,110,105, + 49,70,56,51,7,117,110,105,49,70,56,52,7,117,110,105,49,70,56,53,7,117,110,105,49,70,56,54,7,117,110,105,49,70,56,55,7,117,110,105, + 49,70,56,56,7,117,110,105,49,70,56,57,7,117,110,105,49,70,56,65,7,117,110,105,49,70,56,66,7,117,110,105,49,70,56,67,7,117,110,105, + 49,70,56,68,7,117,110,105,49,70,56,69,7,117,110,105,49,70,56,70,7,117,110,105,49,70,57,48,7,117,110,105,49,70,57,49,7,117,110,105, + 49,70,57,50,7,117,110,105,49,70,57,51,7,117,110,105,49,70,57,52,7,117,110,105,49,70,57,53,7,117,110,105,49,70,57,54,7,117,110,105, + 49,70,57,55,7,117,110,105,49,70,57,56,7,117,110,105,49,70,57,57,7,117,110,105,49,70,57,65,7,117,110,105,49,70,57,66,7,117,110,105, + 49,70,57,67,7,117,110,105,49,70,57,68,7,117,110,105,49,70,57,69,7,117,110,105,49,70,57,70,7,117,110,105,49,70,65,48,7,117,110,105, + 49,70,65,49,7,117,110,105,49,70,65,50,7,117,110,105,49,70,65,51,7,117,110,105,49,70,65,52,7,117,110,105,49,70,65,53,7,117,110,105, + 49,70,65,54,7,117,110,105,49,70,65,55,7,117,110,105,49,70,65,56,7,117,110,105,49,70,65,57,7,117,110,105,49,70,65,65,7,117,110,105, + 49,70,65,66,7,117,110,105,49,70,65,67,7,117,110,105,49,70,65,68,7,117,110,105,49,70,65,69,7,117,110,105,49,70,65,70,7,117,110,105, + 49,70,66,48,7,117,110,105,49,70,66,49,7,117,110,105,49,70,66,50,7,117,110,105,49,70,66,51,7,117,110,105,49,70,66,52,7,117,110,105, + 49,70,66,54,7,117,110,105,49,70,66,55,7,117,110,105,49,70,66,56,7,117,110,105,49,70,66,57,7,117,110,105,49,70,66,65,7,117,110,105, + 49,70,66,66,7,117,110,105,49,70,66,67,7,117,110,105,49,70,66,68,7,117,110,105,49,70,66,69,7,117,110,105,49,70,66,70,7,117,110,105, + 49,70,67,48,7,117,110,105,49,70,67,49,7,117,110,105,49,70,67,50,7,117,110,105,49,70,67,51,7,117,110,105,49,70,67,52,7,117,110,105, + 49,70,67,54,7,117,110,105,49,70,67,55,7,117,110,105,49,70,67,56,7,117,110,105,49,70,67,57,7,117,110,105,49,70,67,65,7,117,110,105, + 49,70,67,66,7,117,110,105,49,70,67,67,7,117,110,105,49,70,67,68,7,117,110,105,49,70,67,69,7,117,110,105,49,70,67,70,7,117,110,105, + 49,70,68,48,7,117,110,105,49,70,68,49,7,117,110,105,49,70,68,50,7,117,110,105,49,70,68,51,7,117,110,105,49,70,68,54,7,117,110,105, + 49,70,68,55,7,117,110,105,49,70,68,56,7,117,110,105,49,70,68,57,7,117,110,105,49,70,68,65,7,117,110,105,49,70,68,66,7,117,110,105, + 49,70,68,68,7,117,110,105,49,70,68,69,7,117,110,105,49,70,68,70,7,117,110,105,49,70,69,48,7,117,110,105,49,70,69,49,7,117,110,105, + 49,70,69,50,7,117,110,105,49,70,69,51,7,117,110,105,49,70,69,52,7,117,110,105,49,70,69,53,7,117,110,105,49,70,69,54,7,117,110,105, + 49,70,69,55,7,117,110,105,49,70,69,56,7,117,110,105,49,70,69,57,7,117,110,105,49,70,69,65,7,117,110,105,49,70,69,66,7,117,110,105, + 49,70,69,67,7,117,110,105,49,70,69,68,7,117,110,105,49,70,69,69,7,117,110,105,49,70,69,70,7,117,110,105,49,70,70,50,7,117,110,105, + 49,70,70,51,7,117,110,105,49,70,70,52,7,117,110,105,49,70,70,54,7,117,110,105,49,70,70,55,7,117,110,105,49,70,70,56,7,117,110,105, + 49,70,70,57,7,117,110,105,49,70,70,65,7,117,110,105,49,70,70,66,7,117,110,105,49,70,70,67,7,117,110,105,49,70,70,68,7,117,110,105, + 49,70,70,69,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,50,48,48,67,7,117,110,105,50,48,48,68,7,117,110,105, + 50,48,48,69,7,117,110,105,50,48,48,70,7,117,110,105,50,48,49,48,7,117,110,105,50,48,49,49,10,102,105,103,117,114,101,100,97,115,104,7, + 117,110,105,50,48,49,53,7,117,110,105,50,48,49,54,13,117,110,100,101,114,115,99,111,114,101,100,98,108,13,113,117,111,116,101,114,101,118,101,114, + 115,101,100,7,117,110,105,50,48,49,70,7,117,110,105,50,48,50,51,14,111,110,101,100,111,116,101,110,108,101,97,100,101,114,14,116,119,111,100,111, + 116,101,110,108,101,97,100,101,114,7,117,110,105,50,48,50,55,7,117,110,105,50,48,50,56,7,117,110,105,50,48,50,57,7,117,110,105,50,48,50, + 65,7,117,110,105,50,48,50,66,7,117,110,105,50,48,50,67,7,117,110,105,50,48,50,68,7,117,110,105,50,48,50,69,7,117,110,105,50,48,50, + 70,7,117,110,105,50,48,51,49,6,109,105,110,117,116,101,6,115,101,99,111,110,100,7,117,110,105,50,48,51,52,7,117,110,105,50,48,51,53,7, + 117,110,105,50,48,51,54,7,117,110,105,50,48,51,55,7,117,110,105,50,48,51,56,7,117,110,105,50,48,51,66,9,101,120,99,108,97,109,100,98, + 108,7,117,110,105,50,48,51,68,7,117,110,105,50,48,51,69,7,117,110,105,50,48,51,70,7,117,110,105,50,48,52,48,7,117,110,105,50,48,52, + 49,7,117,110,105,50,48,52,50,7,117,110,105,50,48,52,51,7,117,110,105,50,48,52,53,7,117,110,105,50,48,52,54,7,117,110,105,50,48,52, + 55,7,117,110,105,50,48,52,56,7,117,110,105,50,48,52,57,7,117,110,105,50,48,52,65,7,117,110,105,50,48,52,66,7,117,110,105,50,48,52, + 67,7,117,110,105,50,48,52,68,7,117,110,105,50,48,52,69,7,117,110,105,50,48,52,70,7,117,110,105,50,48,53,48,7,117,110,105,50,48,53, + 49,7,117,110,105,50,48,53,50,7,117,110,105,50,48,53,51,7,117,110,105,50,48,53,52,7,117,110,105,50,48,53,53,7,117,110,105,50,48,53, + 54,7,117,110,105,50,48,53,55,7,117,110,105,50,48,53,56,7,117,110,105,50,48,53,57,7,117,110,105,50,48,53,65,7,117,110,105,50,48,53, + 66,7,117,110,105,50,48,53,67,7,117,110,105,50,48,53,68,7,117,110,105,50,48,53,69,7,117,110,105,50,48,53,70,7,117,110,105,50,48,54, + 48,7,117,110,105,50,48,54,49,7,117,110,105,50,48,54,50,7,117,110,105,50,48,54,51,7,117,110,105,50,48,54,52,7,117,110,105,50,48,54, + 65,7,117,110,105,50,48,54,66,7,117,110,105,50,48,54,67,7,117,110,105,50,48,54,68,7,117,110,105,50,48,54,69,7,117,110,105,50,48,54, + 70,7,117,110,105,50,48,55,48,7,117,110,105,50,48,55,49,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,55,65,7,117,110,105,50,48,55, + 66,7,117,110,105,50,48,55,67,7,117,110,105,50,48,55,68,7,117,110,105,50,48,55,69,7,117,110,105,50,48,55,70,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,7,117,110,105,50,48,56, + 65,7,117,110,105,50,48,56,66,7,117,110,105,50,48,56,67,7,117,110,105,50,48,56,68,7,117,110,105,50,48,56,69,7,117,110,105,50,48,57, + 48,7,117,110,105,50,48,57,49,7,117,110,105,50,48,57,50,7,117,110,105,50,48,57,51,7,117,110,105,50,48,57,52,7,117,110,105,50,48,57, + 53,7,117,110,105,50,48,57,54,7,117,110,105,50,48,57,55,7,117,110,105,50,48,57,56,7,117,110,105,50,48,57,57,7,117,110,105,50,48,57, + 65,7,117,110,105,50,48,57,66,7,117,110,105,50,48,57,67,7,117,110,105,50,48,65,48,13,99,111,108,111,110,109,111,110,101,116,97,114,121,7, + 117,110,105,50,48,65,50,4,108,105,114,97,7,117,110,105,50,48,65,53,7,117,110,105,50,48,65,54,6,112,101,115,101,116,97,7,117,110,105,50, + 48,65,56,7,117,110,105,50,48,65,57,7,117,110,105,50,48,65,65,4,100,111,110,103,4,69,117,114,111,7,117,110,105,50,48,65,68,7,117,110, + 105,50,48,65,69,7,117,110,105,50,48,65,70,7,117,110,105,50,48,66,48,7,117,110,105,50,48,66,49,7,117,110,105,50,48,66,50,7,117,110, + 105,50,48,66,51,7,117,110,105,50,48,66,52,7,117,110,105,50,48,66,53,7,117,110,105,50,48,66,56,7,117,110,105,50,48,66,57,7,117,110, + 105,50,48,66,65,7,117,110,105,50,48,68,48,7,117,110,105,50,48,68,49,7,117,110,105,50,48,68,54,7,117,110,105,50,48,68,55,7,117,110, + 105,50,48,68,66,7,117,110,105,50,48,68,67,7,117,110,105,50,48,69,49,7,117,110,105,50,49,48,48,7,117,110,105,50,49,48,49,7,117,110, + 105,50,49,48,50,7,117,110,105,50,49,48,51,7,117,110,105,50,49,48,52,7,117,110,105,50,49,48,53,7,117,110,105,50,49,48,54,7,117,110, + 105,50,49,48,55,7,117,110,105,50,49,48,56,7,117,110,105,50,49,48,57,7,117,110,105,50,49,48,66,7,117,110,105,50,49,48,67,7,117,110, + 105,50,49,48,68,7,117,110,105,50,49,48,69,7,117,110,105,50,49,48,70,7,117,110,105,50,49,49,48,8,73,102,114,97,107,116,117,114,7,117, + 110,105,50,49,49,50,7,117,110,105,50,49,49,51,7,117,110,105,50,49,49,52,7,117,110,105,50,49,49,53,7,117,110,105,50,49,49,54,7,117, + 110,105,50,49,49,55,11,119,101,105,101,114,115,116,114,97,115,115,7,117,110,105,50,49,49,57,7,117,110,105,50,49,49,65,7,117,110,105,50,49, + 49,66,8,82,102,114,97,107,116,117,114,7,117,110,105,50,49,49,68,12,112,114,101,115,99,114,105,112,116,105,111,110,7,117,110,105,50,49,49,70, + 7,117,110,105,50,49,50,48,7,117,110,105,50,49,50,49,7,117,110,105,50,49,50,51,7,117,110,105,50,49,50,52,7,117,110,105,50,49,50,53, + 7,117,110,105,50,49,50,54,7,117,110,105,50,49,50,55,7,117,110,105,50,49,50,56,7,117,110,105,50,49,50,57,7,117,110,105,50,49,50,65, + 7,117,110,105,50,49,50,66,7,117,110,105,50,49,50,67,7,117,110,105,50,49,50,68,9,101,115,116,105,109,97,116,101,100,7,117,110,105,50,49, + 50,70,7,117,110,105,50,49,51,48,7,117,110,105,50,49,51,49,7,117,110,105,50,49,51,50,7,117,110,105,50,49,51,51,7,117,110,105,50,49, + 51,52,5,97,108,101,112,104,7,117,110,105,50,49,51,54,7,117,110,105,50,49,51,55,7,117,110,105,50,49,51,56,7,117,110,105,50,49,51,57, + 7,117,110,105,50,49,51,65,7,117,110,105,50,49,51,66,7,117,110,105,50,49,51,67,7,117,110,105,50,49,51,68,7,117,110,105,50,49,51,69, + 7,117,110,105,50,49,51,70,7,117,110,105,50,49,52,48,7,117,110,105,50,49,52,49,7,117,110,105,50,49,52,50,7,117,110,105,50,49,52,51, + 7,117,110,105,50,49,52,52,7,117,110,105,50,49,52,53,7,117,110,105,50,49,52,54,7,117,110,105,50,49,52,55,7,117,110,105,50,49,52,56, + 7,117,110,105,50,49,52,57,7,117,110,105,50,49,52,66,7,117,110,105,50,49,52,69,7,117,110,105,50,49,53,48,7,117,110,105,50,49,53,49, + 7,117,110,105,50,49,53,50,8,111,110,101,116,104,105,114,100,9,116,119,111,116,104,105,114,100,115,7,117,110,105,50,49,53,53,7,117,110,105,50, + 49,53,54,7,117,110,105,50,49,53,55,7,117,110,105,50,49,53,56,7,117,110,105,50,49,53,57,7,117,110,105,50,49,53,65,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,7,117,110,105,50,49,53,70,7,117,110,105,50,49,54,48,7,117,110,105,50,49,54,49,7,117,110,105,50,49,54,50,7,117,110,105,50, + 49,54,51,7,117,110,105,50,49,54,52,7,117,110,105,50,49,54,53,7,117,110,105,50,49,54,54,7,117,110,105,50,49,54,55,7,117,110,105,50, + 49,54,56,7,117,110,105,50,49,54,57,7,117,110,105,50,49,54,65,7,117,110,105,50,49,54,66,7,117,110,105,50,49,54,67,7,117,110,105,50, + 49,54,68,7,117,110,105,50,49,54,69,7,117,110,105,50,49,54,70,7,117,110,105,50,49,55,48,7,117,110,105,50,49,55,49,7,117,110,105,50, + 49,55,50,7,117,110,105,50,49,55,51,7,117,110,105,50,49,55,52,7,117,110,105,50,49,55,53,7,117,110,105,50,49,55,54,7,117,110,105,50, + 49,55,55,7,117,110,105,50,49,55,56,7,117,110,105,50,49,55,57,7,117,110,105,50,49,55,65,7,117,110,105,50,49,55,66,7,117,110,105,50, + 49,55,67,7,117,110,105,50,49,55,68,7,117,110,105,50,49,55,69,7,117,110,105,50,49,55,70,7,117,110,105,50,49,56,48,7,117,110,105,50, + 49,56,49,7,117,110,105,50,49,56,50,7,117,110,105,50,49,56,51,7,117,110,105,50,49,56,52,7,117,110,105,50,49,56,53,7,117,110,105,50, + 49,56,57,9,97,114,114,111,119,108,101,102,116,7,97,114,114,111,119,117,112,10,97,114,114,111,119,114,105,103,104,116,9,97,114,114,111,119,100,111, + 119,110,9,97,114,114,111,119,98,111,116,104,9,97,114,114,111,119,117,112,100,110,7,117,110,105,50,49,57,54,7,117,110,105,50,49,57,55,7,117, + 110,105,50,49,57,56,7,117,110,105,50,49,57,57,7,117,110,105,50,49,57,65,7,117,110,105,50,49,57,66,7,117,110,105,50,49,57,67,7,117, + 110,105,50,49,57,68,7,117,110,105,50,49,57,69,7,117,110,105,50,49,57,70,7,117,110,105,50,49,65,48,7,117,110,105,50,49,65,49,7,117, + 110,105,50,49,65,50,7,117,110,105,50,49,65,51,7,117,110,105,50,49,65,52,7,117,110,105,50,49,65,53,7,117,110,105,50,49,65,54,7,117, + 110,105,50,49,65,55,12,97,114,114,111,119,117,112,100,110,98,115,101,7,117,110,105,50,49,65,57,7,117,110,105,50,49,65,65,7,117,110,105,50, + 49,65,66,7,117,110,105,50,49,65,67,7,117,110,105,50,49,65,68,7,117,110,105,50,49,65,69,7,117,110,105,50,49,65,70,7,117,110,105,50, + 49,66,48,7,117,110,105,50,49,66,49,7,117,110,105,50,49,66,50,7,117,110,105,50,49,66,51,7,117,110,105,50,49,66,52,14,99,97,114,114, + 105,97,103,101,114,101,116,117,114,110,7,117,110,105,50,49,66,54,7,117,110,105,50,49,66,55,7,117,110,105,50,49,66,56,7,117,110,105,50,49, + 66,57,7,117,110,105,50,49,66,65,7,117,110,105,50,49,66,66,7,117,110,105,50,49,66,67,7,117,110,105,50,49,66,68,7,117,110,105,50,49, + 66,69,7,117,110,105,50,49,66,70,7,117,110,105,50,49,67,48,7,117,110,105,50,49,67,49,7,117,110,105,50,49,67,50,7,117,110,105,50,49, + 67,51,7,117,110,105,50,49,67,52,7,117,110,105,50,49,67,53,7,117,110,105,50,49,67,54,7,117,110,105,50,49,67,55,7,117,110,105,50,49, + 67,56,7,117,110,105,50,49,67,57,7,117,110,105,50,49,67,65,7,117,110,105,50,49,67,66,7,117,110,105,50,49,67,67,7,117,110,105,50,49, + 67,68,7,117,110,105,50,49,67,69,7,117,110,105,50,49,67,70,12,97,114,114,111,119,100,98,108,108,101,102,116,10,97,114,114,111,119,100,98,108, + 117,112,13,97,114,114,111,119,100,98,108,114,105,103,104,116,12,97,114,114,111,119,100,98,108,100,111,119,110,12,97,114,114,111,119,100,98,108,98,111, + 116,104,7,117,110,105,50,49,68,53,7,117,110,105,50,49,68,54,7,117,110,105,50,49,68,55,7,117,110,105,50,49,68,56,7,117,110,105,50,49, + 68,57,7,117,110,105,50,49,68,65,7,117,110,105,50,49,68,66,7,117,110,105,50,49,68,67,7,117,110,105,50,49,68,68,7,117,110,105,50,49, + 68,69,7,117,110,105,50,49,68,70,7,117,110,105,50,49,69,48,7,117,110,105,50,49,69,49,7,117,110,105,50,49,69,50,7,117,110,105,50,49, + 69,51,7,117,110,105,50,49,69,52,7,117,110,105,50,49,69,53,7,117,110,105,50,49,69,54,7,117,110,105,50,49,69,55,7,117,110,105,50,49, + 69,56,7,117,110,105,50,49,69,57,7,117,110,105,50,49,69,65,7,117,110,105,50,49,69,66,7,117,110,105,50,49,69,67,7,117,110,105,50,49, + 69,68,7,117,110,105,50,49,69,69,7,117,110,105,50,49,69,70,7,117,110,105,50,49,70,48,7,117,110,105,50,49,70,49,7,117,110,105,50,49, + 70,50,7,117,110,105,50,49,70,51,7,117,110,105,50,49,70,52,7,117,110,105,50,49,70,53,7,117,110,105,50,49,70,54,7,117,110,105,50,49, + 70,55,7,117,110,105,50,49,70,56,7,117,110,105,50,49,70,57,7,117,110,105,50,49,70,65,7,117,110,105,50,49,70,66,7,117,110,105,50,49, + 70,67,7,117,110,105,50,49,70,68,7,117,110,105,50,49,70,69,7,117,110,105,50,49,70,70,9,117,110,105,118,101,114,115,97,108,7,117,110,105, + 50,50,48,49,11,101,120,105,115,116,101,110,116,105,97,108,7,117,110,105,50,50,48,52,8,101,109,112,116,121,115,101,116,8,103,114,97,100,105,101, + 110,116,7,101,108,101,109,101,110,116,10,110,111,116,101,108,101,109,101,110,116,7,117,110,105,50,50,48,65,8,115,117,99,104,116,104,97,116,7,117, + 110,105,50,50,48,67,7,117,110,105,50,50,48,68,7,117,110,105,50,50,48,69,7,117,110,105,50,50,49,48,7,117,110,105,50,50,49,51,7,117, + 110,105,50,50,49,52,7,117,110,105,50,50,49,53,7,117,110,105,50,50,49,54,12,97,115,116,101,114,105,115,107,109,97,116,104,7,117,110,105,50, + 50,49,56,7,117,110,105,50,50,49,57,7,117,110,105,50,50,49,66,7,117,110,105,50,50,49,67,12,112,114,111,112,111,114,116,105,111,110,97,108, + 10,111,114,116,104,111,103,111,110,97,108,5,97,110,103,108,101,7,117,110,105,50,50,50,49,7,117,110,105,50,50,50,50,7,117,110,105,50,50,50, + 51,7,117,110,105,50,50,50,52,7,117,110,105,50,50,50,53,7,117,110,105,50,50,50,54,10,108,111,103,105,99,97,108,97,110,100,9,108,111,103, + 105,99,97,108,111,114,12,105,110,116,101,114,115,101,99,116,105,111,110,5,117,110,105,111,110,7,117,110,105,50,50,50,67,7,117,110,105,50,50,50, + 68,7,117,110,105,50,50,50,69,7,117,110,105,50,50,50,70,7,117,110,105,50,50,51,48,7,117,110,105,50,50,51,49,7,117,110,105,50,50,51, + 50,7,117,110,105,50,50,51,51,9,116,104,101,114,101,102,111,114,101,7,117,110,105,50,50,51,53,7,117,110,105,50,50,51,54,7,117,110,105,50, + 50,51,55,7,117,110,105,50,50,51,56,7,117,110,105,50,50,51,57,7,117,110,105,50,50,51,65,7,117,110,105,50,50,51,66,7,115,105,109,105, + 108,97,114,7,117,110,105,50,50,51,68,7,117,110,105,50,50,51,69,7,117,110,105,50,50,51,70,7,117,110,105,50,50,52,48,7,117,110,105,50, + 50,52,49,7,117,110,105,50,50,52,50,7,117,110,105,50,50,52,51,7,117,110,105,50,50,52,52,9,99,111,110,103,114,117,101,110,116,7,117,110, + 105,50,50,52,54,7,117,110,105,50,50,52,55,7,117,110,105,50,50,52,57,7,117,110,105,50,50,52,65,7,117,110,105,50,50,52,66,7,117,110, + 105,50,50,52,67,7,117,110,105,50,50,52,68,7,117,110,105,50,50,52,69,7,117,110,105,50,50,52,70,7,117,110,105,50,50,53,48,7,117,110, + 105,50,50,53,49,7,117,110,105,50,50,53,50,7,117,110,105,50,50,53,51,7,117,110,105,50,50,53,52,7,117,110,105,50,50,53,53,7,117,110, + 105,50,50,53,54,7,117,110,105,50,50,53,55,7,117,110,105,50,50,53,56,7,117,110,105,50,50,53,57,7,117,110,105,50,50,53,65,7,117,110, + 105,50,50,53,66,7,117,110,105,50,50,53,67,7,117,110,105,50,50,53,68,7,117,110,105,50,50,53,69,7,117,110,105,50,50,53,70,11,101,113, + 117,105,118,97,108,101,110,99,101,7,117,110,105,50,50,54,50,7,117,110,105,50,50,54,51,7,117,110,105,50,50,54,54,7,117,110,105,50,50,54, + 55,7,117,110,105,50,50,54,56,7,117,110,105,50,50,54,57,7,117,110,105,50,50,54,65,7,117,110,105,50,50,54,66,7,117,110,105,50,50,54, + 67,7,117,110,105,50,50,54,68,7,117,110,105,50,50,54,69,7,117,110,105,50,50,54,70,7,117,110,105,50,50,55,48,7,117,110,105,50,50,55, + 49,7,117,110,105,50,50,55,50,7,117,110,105,50,50,55,51,7,117,110,105,50,50,55,52,7,117,110,105,50,50,55,53,7,117,110,105,50,50,55, + 54,7,117,110,105,50,50,55,55,7,117,110,105,50,50,55,56,7,117,110,105,50,50,55,57,7,117,110,105,50,50,55,65,7,117,110,105,50,50,55, + 66,7,117,110,105,50,50,55,67,7,117,110,105,50,50,55,68,7,117,110,105,50,50,55,69,7,117,110,105,50,50,55,70,7,117,110,105,50,50,56, + 48,7,117,110,105,50,50,56,49,12,112,114,111,112,101,114,115,117,98,115,101,116,14,112,114,111,112,101,114,115,117,112,101,114,115,101,116,9,110,111, + 116,115,117,98,115,101,116,7,117,110,105,50,50,56,53,12,114,101,102,108,101,120,115,117,98,115,101,116,14,114,101,102,108,101,120,115,117,112,101,114, + 115,101,116,7,117,110,105,50,50,56,56,7,117,110,105,50,50,56,57,7,117,110,105,50,50,56,65,7,117,110,105,50,50,56,66,7,117,110,105,50, + 50,56,67,7,117,110,105,50,50,56,68,7,117,110,105,50,50,56,69,7,117,110,105,50,50,56,70,7,117,110,105,50,50,57,48,7,117,110,105,50, + 50,57,49,7,117,110,105,50,50,57,50,7,117,110,105,50,50,57,51,7,117,110,105,50,50,57,52,10,99,105,114,99,108,101,112,108,117,115,7,117, + 110,105,50,50,57,54,14,99,105,114,99,108,101,109,117,108,116,105,112,108,121,7,117,110,105,50,50,57,56,7,117,110,105,50,50,57,57,7,117,110, + 105,50,50,57,65,7,117,110,105,50,50,57,66,7,117,110,105,50,50,57,67,7,117,110,105,50,50,57,68,7,117,110,105,50,50,57,69,7,117,110, + 105,50,50,57,70,7,117,110,105,50,50,65,48,7,117,110,105,50,50,65,49,7,117,110,105,50,50,65,50,7,117,110,105,50,50,65,51,7,117,110, + 105,50,50,65,52,13,112,101,114,112,101,110,100,105,99,117,108,97,114,7,117,110,105,50,50,65,54,7,117,110,105,50,50,65,55,7,117,110,105,50, + 50,65,56,7,117,110,105,50,50,65,57,7,117,110,105,50,50,65,65,7,117,110,105,50,50,65,66,7,117,110,105,50,50,65,67,7,117,110,105,50, + 50,65,68,7,117,110,105,50,50,65,69,7,117,110,105,50,50,65,70,7,117,110,105,50,50,66,48,7,117,110,105,50,50,66,49,7,117,110,105,50, + 50,66,50,7,117,110,105,50,50,66,51,7,117,110,105,50,50,66,52,7,117,110,105,50,50,66,53,7,117,110,105,50,50,66,54,7,117,110,105,50, + 50,66,55,7,117,110,105,50,50,66,56,7,117,110,105,50,50,66,57,7,117,110,105,50,50,66,65,7,117,110,105,50,50,66,66,7,117,110,105,50, + 50,66,67,7,117,110,105,50,50,66,68,7,117,110,105,50,50,66,69,7,117,110,105,50,50,66,70,7,117,110,105,50,50,67,48,7,117,110,105,50, + 50,67,49,7,117,110,105,50,50,67,50,7,117,110,105,50,50,67,51,7,117,110,105,50,50,67,52,7,100,111,116,109,97,116,104,7,117,110,105,50, + 50,67,54,7,117,110,105,50,50,67,55,7,117,110,105,50,50,67,56,7,117,110,105,50,50,67,57,7,117,110,105,50,50,67,65,7,117,110,105,50, + 50,67,66,7,117,110,105,50,50,67,67,7,117,110,105,50,50,67,68,7,117,110,105,50,50,67,69,7,117,110,105,50,50,67,70,7,117,110,105,50, + 50,68,48,7,117,110,105,50,50,68,49,7,117,110,105,50,50,68,50,7,117,110,105,50,50,68,51,7,117,110,105,50,50,68,52,7,117,110,105,50, + 50,68,53,7,117,110,105,50,50,68,54,7,117,110,105,50,50,68,55,7,117,110,105,50,50,68,56,7,117,110,105,50,50,68,57,7,117,110,105,50, + 50,68,65,7,117,110,105,50,50,68,66,7,117,110,105,50,50,68,67,7,117,110,105,50,50,68,68,7,117,110,105,50,50,68,69,7,117,110,105,50, + 50,68,70,7,117,110,105,50,50,69,48,7,117,110,105,50,50,69,49,7,117,110,105,50,50,69,50,7,117,110,105,50,50,69,51,7,117,110,105,50, + 50,69,52,7,117,110,105,50,50,69,53,7,117,110,105,50,50,69,54,7,117,110,105,50,50,69,55,7,117,110,105,50,50,69,56,7,117,110,105,50, + 50,69,57,7,117,110,105,50,50,69,65,7,117,110,105,50,50,69,66,7,117,110,105,50,50,69,67,7,117,110,105,50,50,69,68,7,117,110,105,50, + 50,69,69,7,117,110,105,50,50,69,70,7,117,110,105,50,50,70,48,7,117,110,105,50,50,70,49,7,117,110,105,50,50,70,50,7,117,110,105,50, + 50,70,51,7,117,110,105,50,50,70,52,7,117,110,105,50,50,70,53,7,117,110,105,50,50,70,54,7,117,110,105,50,50,70,55,7,117,110,105,50, + 50,70,56,7,117,110,105,50,50,70,57,7,117,110,105,50,50,70,65,7,117,110,105,50,50,70,66,7,117,110,105,50,50,70,67,7,117,110,105,50, + 50,70,68,7,117,110,105,50,50,70,69,7,117,110,105,50,50,70,70,7,117,110,105,50,51,48,48,7,117,110,105,50,51,48,49,5,104,111,117,115, + 101,7,117,110,105,50,51,48,51,7,117,110,105,50,51,48,52,7,117,110,105,50,51,48,53,7,117,110,105,50,51,48,54,7,117,110,105,50,51,48, + 55,7,117,110,105,50,51,48,56,7,117,110,105,50,51,48,57,7,117,110,105,50,51,48,65,7,117,110,105,50,51,48,66,7,117,110,105,50,51,48, + 67,7,117,110,105,50,51,48,68,7,117,110,105,50,51,48,69,7,117,110,105,50,51,48,70,13,114,101,118,108,111,103,105,99,97,108,110,111,116,7, + 117,110,105,50,51,49,49,7,117,110,105,50,51,49,56,7,117,110,105,50,51,49,57,7,117,110,105,50,51,49,67,7,117,110,105,50,51,49,68,7, + 117,110,105,50,51,49,69,7,117,110,105,50,51,49,70,10,105,110,116,101,103,114,97,108,116,112,10,105,110,116,101,103,114,97,108,98,116,7,117,110, + 105,50,51,50,52,7,117,110,105,50,51,50,53,7,117,110,105,50,51,50,54,7,117,110,105,50,51,50,55,7,117,110,105,50,51,50,56,7,117,110, + 105,50,51,50,66,7,117,110,105,50,51,50,67,7,117,110,105,50,51,55,51,7,117,110,105,50,51,55,52,7,117,110,105,50,51,55,53,7,117,110, + 105,50,51,55,65,7,117,110,105,50,51,55,68,7,117,110,105,50,51,56,55,7,117,110,105,50,51,57,52,7,117,110,105,50,51,57,66,7,117,110, + 105,50,51,57,67,7,117,110,105,50,51,57,68,7,117,110,105,50,51,57,69,7,117,110,105,50,51,57,70,7,117,110,105,50,51,65,48,7,117,110, + 105,50,51,65,49,7,117,110,105,50,51,65,50,7,117,110,105,50,51,65,51,7,117,110,105,50,51,65,52,7,117,110,105,50,51,65,53,7,117,110, + 105,50,51,65,54,7,117,110,105,50,51,65,55,7,117,110,105,50,51,65,56,7,117,110,105,50,51,65,57,7,117,110,105,50,51,65,65,7,117,110, + 105,50,51,65,66,7,117,110,105,50,51,65,67,7,117,110,105,50,51,65,68,7,117,110,105,50,51,65,69,7,117,110,105,50,51,67,69,7,117,110, + 105,50,51,67,70,7,117,110,105,50,51,69,51,7,117,110,105,50,51,69,53,7,117,110,105,50,51,69,56,7,117,110,105,50,52,50,50,7,117,110, + 105,50,52,50,51,7,117,110,105,50,52,54,48,7,117,110,105,50,52,54,49,7,117,110,105,50,52,54,50,7,117,110,105,50,52,54,51,7,117,110, + 105,50,52,54,52,7,117,110,105,50,52,54,53,7,117,110,105,50,52,54,54,7,117,110,105,50,52,54,55,7,117,110,105,50,52,54,56,7,117,110, + 105,50,52,54,57,8,83,70,49,48,48,48,48,48,7,117,110,105,50,53,48,49,8,83,70,49,49,48,48,48,48,7,117,110,105,50,53,48,51,7, + 117,110,105,50,53,48,52,7,117,110,105,50,53,48,53,7,117,110,105,50,53,48,54,7,117,110,105,50,53,48,55,7,117,110,105,50,53,48,56,7, + 117,110,105,50,53,48,57,7,117,110,105,50,53,48,65,7,117,110,105,50,53,48,66,8,83,70,48,49,48,48,48,48,7,117,110,105,50,53,48,68, + 7,117,110,105,50,53,48,69,7,117,110,105,50,53,48,70,8,83,70,48,51,48,48,48,48,7,117,110,105,50,53,49,49,7,117,110,105,50,53,49, + 50,7,117,110,105,50,53,49,51,8,83,70,48,50,48,48,48,48,7,117,110,105,50,53,49,53,7,117,110,105,50,53,49,54,7,117,110,105,50,53, + 49,55,8,83,70,48,52,48,48,48,48,7,117,110,105,50,53,49,57,7,117,110,105,50,53,49,65,7,117,110,105,50,53,49,66,8,83,70,48,56, + 48,48,48,48,7,117,110,105,50,53,49,68,7,117,110,105,50,53,49,69,7,117,110,105,50,53,49,70,7,117,110,105,50,53,50,48,7,117,110,105, + 50,53,50,49,7,117,110,105,50,53,50,50,7,117,110,105,50,53,50,51,8,83,70,48,57,48,48,48,48,7,117,110,105,50,53,50,53,7,117,110, + 105,50,53,50,54,7,117,110,105,50,53,50,55,7,117,110,105,50,53,50,56,7,117,110,105,50,53,50,57,7,117,110,105,50,53,50,65,7,117,110, + 105,50,53,50,66,8,83,70,48,54,48,48,48,48,7,117,110,105,50,53,50,68,7,117,110,105,50,53,50,69,7,117,110,105,50,53,50,70,7,117, + 110,105,50,53,51,48,7,117,110,105,50,53,51,49,7,117,110,105,50,53,51,50,7,117,110,105,50,53,51,51,8,83,70,48,55,48,48,48,48,7, + 117,110,105,50,53,51,53,7,117,110,105,50,53,51,54,7,117,110,105,50,53,51,55,7,117,110,105,50,53,51,56,7,117,110,105,50,53,51,57,7, + 117,110,105,50,53,51,65,7,117,110,105,50,53,51,66,8,83,70,48,53,48,48,48,48,7,117,110,105,50,53,51,68,7,117,110,105,50,53,51,69, + 7,117,110,105,50,53,51,70,7,117,110,105,50,53,52,48,7,117,110,105,50,53,52,49,7,117,110,105,50,53,52,50,7,117,110,105,50,53,52,51, + 7,117,110,105,50,53,52,52,7,117,110,105,50,53,52,53,7,117,110,105,50,53,52,54,7,117,110,105,50,53,52,55,7,117,110,105,50,53,52,56, + 7,117,110,105,50,53,52,57,7,117,110,105,50,53,52,65,7,117,110,105,50,53,52,66,7,117,110,105,50,53,52,67,7,117,110,105,50,53,52,68, + 7,117,110,105,50,53,52,69,7,117,110,105,50,53,52,70,8,83,70,52,51,48,48,48,48,8,83,70,50,52,48,48,48,48,8,83,70,53,49,48, + 48,48,48,8,83,70,53,50,48,48,48,48,8,83,70,51,57,48,48,48,48,8,83,70,50,50,48,48,48,48,8,83,70,50,49,48,48,48,48,8, + 83,70,50,53,48,48,48,48,8,83,70,53,48,48,48,48,48,8,83,70,52,57,48,48,48,48,8,83,70,51,56,48,48,48,48,8,83,70,50,56, + 48,48,48,48,8,83,70,50,55,48,48,48,48,8,83,70,50,54,48,48,48,48,8,83,70,51,54,48,48,48,48,8,83,70,51,55,48,48,48,48, + 8,83,70,52,50,48,48,48,48,8,83,70,49,57,48,48,48,48,8,83,70,50,48,48,48,48,48,8,83,70,50,51,48,48,48,48,8,83,70,52, + 55,48,48,48,48,8,83,70,52,56,48,48,48,48,8,83,70,52,49,48,48,48,48,8,83,70,52,53,48,48,48,48,8,83,70,52,54,48,48,48, + 48,8,83,70,52,48,48,48,48,48,8,83,70,53,52,48,48,48,48,8,83,70,53,51,48,48,48,48,8,83,70,52,52,48,48,48,48,7,117,110, + 105,50,53,54,68,7,117,110,105,50,53,54,69,7,117,110,105,50,53,54,70,7,117,110,105,50,53,55,48,7,117,110,105,50,53,55,49,7,117,110, + 105,50,53,55,50,7,117,110,105,50,53,55,51,7,117,110,105,50,53,55,52,7,117,110,105,50,53,55,53,7,117,110,105,50,53,55,54,7,117,110, + 105,50,53,55,55,7,117,110,105,50,53,55,56,7,117,110,105,50,53,55,57,7,117,110,105,50,53,55,65,7,117,110,105,50,53,55,66,7,117,110, + 105,50,53,55,67,7,117,110,105,50,53,55,68,7,117,110,105,50,53,55,69,7,117,110,105,50,53,55,70,7,117,112,98,108,111,99,107,7,117,110, + 105,50,53,56,49,7,117,110,105,50,53,56,50,7,117,110,105,50,53,56,51,7,100,110,98,108,111,99,107,7,117,110,105,50,53,56,53,7,117,110, + 105,50,53,56,54,7,117,110,105,50,53,56,55,5,98,108,111,99,107,7,117,110,105,50,53,56,57,7,117,110,105,50,53,56,65,7,117,110,105,50, + 53,56,66,7,108,102,98,108,111,99,107,7,117,110,105,50,53,56,68,7,117,110,105,50,53,56,69,7,117,110,105,50,53,56,70,7,114,116,98,108, + 111,99,107,7,108,116,115,104,97,100,101,5,115,104,97,100,101,7,100,107,115,104,97,100,101,7,117,110,105,50,53,57,52,7,117,110,105,50,53,57, + 53,7,117,110,105,50,53,57,54,7,117,110,105,50,53,57,55,7,117,110,105,50,53,57,56,7,117,110,105,50,53,57,57,7,117,110,105,50,53,57, + 65,7,117,110,105,50,53,57,66,7,117,110,105,50,53,57,67,7,117,110,105,50,53,57,68,7,117,110,105,50,53,57,69,7,117,110,105,50,53,57, + 70,9,102,105,108,108,101,100,98,111,120,6,72,50,50,48,55,51,7,117,110,105,50,53,65,50,7,117,110,105,50,53,65,51,7,117,110,105,50,53, + 65,52,7,117,110,105,50,53,65,53,7,117,110,105,50,53,65,54,7,117,110,105,50,53,65,55,7,117,110,105,50,53,65,56,7,117,110,105,50,53, + 65,57,6,72,49,56,53,52,51,6,72,49,56,53,53,49,10,102,105,108,108,101,100,114,101,99,116,7,117,110,105,50,53,65,68,7,117,110,105,50, + 53,65,69,7,117,110,105,50,53,65,70,7,117,110,105,50,53,66,48,7,117,110,105,50,53,66,49,7,116,114,105,97,103,117,112,7,117,110,105,50, + 53,66,51,7,117,110,105,50,53,66,52,7,117,110,105,50,53,66,53,7,117,110,105,50,53,66,54,7,117,110,105,50,53,66,55,7,117,110,105,50, + 53,66,56,7,117,110,105,50,53,66,57,7,116,114,105,97,103,114,116,7,117,110,105,50,53,66,66,7,116,114,105,97,103,100,110,7,117,110,105,50, + 53,66,68,7,117,110,105,50,53,66,69,7,117,110,105,50,53,66,70,7,117,110,105,50,53,67,48,7,117,110,105,50,53,67,49,7,117,110,105,50, + 53,67,50,7,117,110,105,50,53,67,51,7,116,114,105,97,103,108,102,7,117,110,105,50,53,67,53,7,117,110,105,50,53,67,54,7,117,110,105,50, + 53,67,55,7,117,110,105,50,53,67,56,7,117,110,105,50,53,67,57,6,99,105,114,99,108,101,7,117,110,105,50,53,67,67,7,117,110,105,50,53, + 67,68,7,117,110,105,50,53,67,69,6,72,49,56,53,51,51,7,117,110,105,50,53,68,48,7,117,110,105,50,53,68,49,7,117,110,105,50,53,68, + 50,7,117,110,105,50,53,68,51,7,117,110,105,50,53,68,52,7,117,110,105,50,53,68,53,7,117,110,105,50,53,68,54,7,117,110,105,50,53,68, + 55,9,105,110,118,98,117,108,108,101,116,9,105,110,118,99,105,114,99,108,101,7,117,110,105,50,53,68,65,7,117,110,105,50,53,68,66,7,117,110, + 105,50,53,68,67,7,117,110,105,50,53,68,68,7,117,110,105,50,53,68,69,7,117,110,105,50,53,68,70,7,117,110,105,50,53,69,48,7,117,110, + 105,50,53,69,49,7,117,110,105,50,53,69,50,7,117,110,105,50,53,69,51,7,117,110,105,50,53,69,52,7,117,110,105,50,53,69,53,10,111,112, + 101,110,98,117,108,108,101,116,7,117,110,105,50,53,69,55,7,117,110,105,50,53,69,56,7,117,110,105,50,53,69,57,7,117,110,105,50,53,69,65, + 7,117,110,105,50,53,69,66,7,117,110,105,50,53,69,67,7,117,110,105,50,53,69,68,7,117,110,105,50,53,69,69,7,117,110,105,50,53,69,70, + 7,117,110,105,50,53,70,48,7,117,110,105,50,53,70,49,7,117,110,105,50,53,70,50,7,117,110,105,50,53,70,51,7,117,110,105,50,53,70,52, + 7,117,110,105,50,53,70,53,7,117,110,105,50,53,70,54,7,117,110,105,50,53,70,55,7,117,110,105,50,53,70,56,7,117,110,105,50,53,70,57, + 7,117,110,105,50,53,70,65,7,117,110,105,50,53,70,66,7,117,110,105,50,53,70,67,7,117,110,105,50,53,70,68,7,117,110,105,50,53,70,69, + 7,117,110,105,50,53,70,70,7,117,110,105,50,54,48,48,7,117,110,105,50,54,48,49,7,117,110,105,50,54,48,50,7,117,110,105,50,54,48,51, + 7,117,110,105,50,54,48,52,7,117,110,105,50,54,48,53,7,117,110,105,50,54,48,54,7,117,110,105,50,54,48,55,7,117,110,105,50,54,48,56, + 7,117,110,105,50,54,48,57,7,117,110,105,50,54,48,65,7,117,110,105,50,54,48,66,7,117,110,105,50,54,48,67,7,117,110,105,50,54,48,68, + 7,117,110,105,50,54,48,69,7,117,110,105,50,54,48,70,7,117,110,105,50,54,49,48,7,117,110,105,50,54,49,49,7,117,110,105,50,54,49,50, + 7,117,110,105,50,54,49,51,7,117,110,105,50,54,49,52,7,117,110,105,50,54,49,53,7,117,110,105,50,54,49,54,7,117,110,105,50,54,49,55, + 7,117,110,105,50,54,49,56,7,117,110,105,50,54,49,57,7,117,110,105,50,54,49,65,7,117,110,105,50,54,49,66,7,117,110,105,50,54,49,67, + 7,117,110,105,50,54,49,68,7,117,110,105,50,54,49,69,7,117,110,105,50,54,49,70,7,117,110,105,50,54,50,48,7,117,110,105,50,54,50,49, + 7,117,110,105,50,54,50,50,7,117,110,105,50,54,50,51,7,117,110,105,50,54,50,52,7,117,110,105,50,54,50,53,7,117,110,105,50,54,50,54, + 7,117,110,105,50,54,50,55,7,117,110,105,50,54,50,56,7,117,110,105,50,54,50,57,7,117,110,105,50,54,50,65,7,117,110,105,50,54,50,66, + 7,117,110,105,50,54,50,67,7,117,110,105,50,54,50,68,7,117,110,105,50,54,50,69,7,117,110,105,50,54,50,70,7,117,110,105,50,54,51,48, + 7,117,110,105,50,54,51,49,7,117,110,105,50,54,51,50,7,117,110,105,50,54,51,51,7,117,110,105,50,54,51,52,7,117,110,105,50,54,51,53, + 7,117,110,105,50,54,51,54,7,117,110,105,50,54,51,55,7,117,110,105,50,54,51,56,7,117,110,105,50,54,51,57,9,115,109,105,108,101,102,97, + 99,101,12,105,110,118,115,109,105,108,101,102,97,99,101,3,115,117,110,7,117,110,105,50,54,51,68,7,117,110,105,50,54,51,69,7,117,110,105,50, + 54,51,70,6,102,101,109,97,108,101,7,117,110,105,50,54,52,49,4,109,97,108,101,7,117,110,105,50,54,52,51,7,117,110,105,50,54,52,52,7, + 117,110,105,50,54,52,53,7,117,110,105,50,54,52,54,7,117,110,105,50,54,52,55,7,117,110,105,50,54,52,56,7,117,110,105,50,54,52,57,7, + 117,110,105,50,54,52,65,7,117,110,105,50,54,52,66,7,117,110,105,50,54,52,67,7,117,110,105,50,54,52,68,7,117,110,105,50,54,52,69,7, + 117,110,105,50,54,52,70,7,117,110,105,50,54,53,48,7,117,110,105,50,54,53,49,7,117,110,105,50,54,53,50,7,117,110,105,50,54,53,51,7, + 117,110,105,50,54,53,52,7,117,110,105,50,54,53,53,7,117,110,105,50,54,53,54,7,117,110,105,50,54,53,55,7,117,110,105,50,54,53,56,7, + 117,110,105,50,54,53,57,7,117,110,105,50,54,53,65,7,117,110,105,50,54,53,66,7,117,110,105,50,54,53,67,7,117,110,105,50,54,53,68,7, + 117,110,105,50,54,53,69,7,117,110,105,50,54,53,70,5,115,112,97,100,101,7,117,110,105,50,54,54,49,7,117,110,105,50,54,54,50,4,99,108, + 117,98,7,117,110,105,50,54,54,52,5,104,101,97,114,116,7,100,105,97,109,111,110,100,7,117,110,105,50,54,54,55,7,117,110,105,50,54,54,56, + 7,117,110,105,50,54,54,57,11,109,117,115,105,99,97,108,110,111,116,101,14,109,117,115,105,99,97,108,110,111,116,101,100,98,108,7,117,110,105,50, + 54,54,67,7,117,110,105,50,54,54,68,7,117,110,105,50,54,54,69,7,117,110,105,50,54,54,70,7,117,110,105,50,54,55,48,7,117,110,105,50, + 54,55,49,7,117,110,105,50,54,55,50,7,117,110,105,50,54,55,51,7,117,110,105,50,54,55,52,7,117,110,105,50,54,55,53,7,117,110,105,50, + 54,55,54,7,117,110,105,50,54,55,55,7,117,110,105,50,54,55,56,7,117,110,105,50,54,55,57,7,117,110,105,50,54,55,65,7,117,110,105,50, + 54,55,66,7,117,110,105,50,54,55,67,7,117,110,105,50,54,55,68,7,117,110,105,50,54,55,69,7,117,110,105,50,54,55,70,7,117,110,105,50, + 54,56,48,7,117,110,105,50,54,56,49,7,117,110,105,50,54,56,50,7,117,110,105,50,54,56,51,7,117,110,105,50,54,56,52,7,117,110,105,50, + 54,56,53,7,117,110,105,50,54,56,54,7,117,110,105,50,54,56,55,7,117,110,105,50,54,56,56,7,117,110,105,50,54,56,57,7,117,110,105,50, + 54,56,65,7,117,110,105,50,54,56,66,7,117,110,105,50,54,56,67,7,117,110,105,50,54,56,68,7,117,110,105,50,54,56,69,7,117,110,105,50, + 54,56,70,7,117,110,105,50,54,57,48,7,117,110,105,50,54,57,49,7,117,110,105,50,54,57,50,7,117,110,105,50,54,57,51,7,117,110,105,50, + 54,57,52,7,117,110,105,50,54,57,53,7,117,110,105,50,54,57,54,7,117,110,105,50,54,57,55,7,117,110,105,50,54,57,56,7,117,110,105,50, + 54,57,57,7,117,110,105,50,54,57,65,7,117,110,105,50,54,57,66,7,117,110,105,50,54,57,67,7,117,110,105,50,54,65,48,7,117,110,105,50, + 54,65,49,7,117,110,105,50,54,65,50,7,117,110,105,50,54,65,51,7,117,110,105,50,54,65,52,7,117,110,105,50,54,65,53,7,117,110,105,50, + 54,65,54,7,117,110,105,50,54,65,55,7,117,110,105,50,54,65,56,7,117,110,105,50,54,65,57,7,117,110,105,50,54,65,65,7,117,110,105,50, + 54,65,66,7,117,110,105,50,54,65,67,7,117,110,105,50,54,65,68,7,117,110,105,50,54,65,69,7,117,110,105,50,54,65,70,7,117,110,105,50, + 54,66,48,7,117,110,105,50,54,66,49,7,117,110,105,50,54,66,50,7,117,110,105,50,54,66,51,7,117,110,105,50,54,66,52,7,117,110,105,50, + 54,66,53,7,117,110,105,50,54,66,54,7,117,110,105,50,54,66,55,7,117,110,105,50,54,66,56,7,117,110,105,50,54,67,48,7,117,110,105,50, + 54,67,49,7,117,110,105,50,54,67,50,7,117,110,105,50,54,67,51,7,117,110,105,50,54,69,50,7,117,110,105,50,55,48,49,7,117,110,105,50, + 55,48,50,7,117,110,105,50,55,48,51,7,117,110,105,50,55,48,52,7,117,110,105,50,55,48,54,7,117,110,105,50,55,48,55,7,117,110,105,50, + 55,48,56,7,117,110,105,50,55,48,57,7,117,110,105,50,55,48,67,7,117,110,105,50,55,48,68,7,117,110,105,50,55,48,69,7,117,110,105,50, + 55,48,70,7,117,110,105,50,55,49,48,7,117,110,105,50,55,49,49,7,117,110,105,50,55,49,50,7,117,110,105,50,55,49,51,7,117,110,105,50, + 55,49,52,7,117,110,105,50,55,49,53,7,117,110,105,50,55,49,54,7,117,110,105,50,55,49,55,7,117,110,105,50,55,49,56,7,117,110,105,50, + 55,49,57,7,117,110,105,50,55,49,65,7,117,110,105,50,55,49,66,7,117,110,105,50,55,49,67,7,117,110,105,50,55,49,68,7,117,110,105,50, + 55,49,69,7,117,110,105,50,55,49,70,7,117,110,105,50,55,50,48,7,117,110,105,50,55,50,49,7,117,110,105,50,55,50,50,7,117,110,105,50, + 55,50,51,7,117,110,105,50,55,50,52,7,117,110,105,50,55,50,53,7,117,110,105,50,55,50,54,7,117,110,105,50,55,50,55,7,117,110,105,50, + 55,50,57,7,117,110,105,50,55,50,65,7,117,110,105,50,55,50,66,7,117,110,105,50,55,50,67,7,117,110,105,50,55,50,68,7,117,110,105,50, + 55,50,69,7,117,110,105,50,55,50,70,7,117,110,105,50,55,51,48,7,117,110,105,50,55,51,49,7,117,110,105,50,55,51,50,7,117,110,105,50, + 55,51,51,7,117,110,105,50,55,51,52,7,117,110,105,50,55,51,53,7,117,110,105,50,55,51,54,7,117,110,105,50,55,51,55,7,117,110,105,50, + 55,51,56,7,117,110,105,50,55,51,57,7,117,110,105,50,55,51,65,7,117,110,105,50,55,51,66,7,117,110,105,50,55,51,67,7,117,110,105,50, + 55,51,68,7,117,110,105,50,55,51,69,7,117,110,105,50,55,51,70,7,117,110,105,50,55,52,48,7,117,110,105,50,55,52,49,7,117,110,105,50, + 55,52,50,7,117,110,105,50,55,52,51,7,117,110,105,50,55,52,52,7,117,110,105,50,55,52,53,7,117,110,105,50,55,52,54,7,117,110,105,50, + 55,52,55,7,117,110,105,50,55,52,56,7,117,110,105,50,55,52,57,7,117,110,105,50,55,52,65,7,117,110,105,50,55,52,66,7,117,110,105,50, + 55,52,68,7,117,110,105,50,55,52,70,7,117,110,105,50,55,53,48,7,117,110,105,50,55,53,49,7,117,110,105,50,55,53,50,7,117,110,105,50, + 55,53,54,7,117,110,105,50,55,53,56,7,117,110,105,50,55,53,57,7,117,110,105,50,55,53,65,7,117,110,105,50,55,53,66,7,117,110,105,50, + 55,53,67,7,117,110,105,50,55,53,68,7,117,110,105,50,55,53,69,7,117,110,105,50,55,54,49,7,117,110,105,50,55,54,50,7,117,110,105,50, + 55,54,51,7,117,110,105,50,55,54,52,7,117,110,105,50,55,54,53,7,117,110,105,50,55,54,54,7,117,110,105,50,55,54,55,7,117,110,105,50, + 55,54,56,7,117,110,105,50,55,54,57,7,117,110,105,50,55,54,65,7,117,110,105,50,55,54,66,7,117,110,105,50,55,54,67,7,117,110,105,50, + 55,54,68,7,117,110,105,50,55,54,69,7,117,110,105,50,55,54,70,7,117,110,105,50,55,55,48,7,117,110,105,50,55,55,49,7,117,110,105,50, + 55,55,50,7,117,110,105,50,55,55,51,7,117,110,105,50,55,55,52,7,117,110,105,50,55,55,53,7,117,110,105,50,55,55,54,7,117,110,105,50, + 55,55,55,7,117,110,105,50,55,55,56,7,117,110,105,50,55,55,57,7,117,110,105,50,55,55,65,7,117,110,105,50,55,55,66,7,117,110,105,50, + 55,55,67,7,117,110,105,50,55,55,68,7,117,110,105,50,55,55,69,7,117,110,105,50,55,55,70,7,117,110,105,50,55,56,48,7,117,110,105,50, + 55,56,49,7,117,110,105,50,55,56,50,7,117,110,105,50,55,56,51,7,117,110,105,50,55,56,52,7,117,110,105,50,55,56,53,7,117,110,105,50, + 55,56,54,7,117,110,105,50,55,56,55,7,117,110,105,50,55,56,56,7,117,110,105,50,55,56,57,7,117,110,105,50,55,56,65,7,117,110,105,50, + 55,56,66,7,117,110,105,50,55,56,67,7,117,110,105,50,55,56,68,7,117,110,105,50,55,56,69,7,117,110,105,50,55,56,70,7,117,110,105,50, + 55,57,48,7,117,110,105,50,55,57,49,7,117,110,105,50,55,57,50,7,117,110,105,50,55,57,51,7,117,110,105,50,55,57,52,7,117,110,105,50, + 55,57,56,7,117,110,105,50,55,57,57,7,117,110,105,50,55,57,65,7,117,110,105,50,55,57,66,7,117,110,105,50,55,57,67,7,117,110,105,50, + 55,57,68,7,117,110,105,50,55,57,69,7,117,110,105,50,55,57,70,7,117,110,105,50,55,65,48,7,117,110,105,50,55,65,49,7,117,110,105,50, + 55,65,50,7,117,110,105,50,55,65,51,7,117,110,105,50,55,65,52,7,117,110,105,50,55,65,53,7,117,110,105,50,55,65,54,7,117,110,105,50, + 55,65,55,7,117,110,105,50,55,65,56,7,117,110,105,50,55,65,57,7,117,110,105,50,55,65,65,7,117,110,105,50,55,65,66,7,117,110,105,50, + 55,65,67,7,117,110,105,50,55,65,68,7,117,110,105,50,55,65,69,7,117,110,105,50,55,65,70,7,117,110,105,50,55,66,49,7,117,110,105,50, + 55,66,50,7,117,110,105,50,55,66,51,7,117,110,105,50,55,66,52,7,117,110,105,50,55,66,53,7,117,110,105,50,55,66,54,7,117,110,105,50, + 55,66,55,7,117,110,105,50,55,66,56,7,117,110,105,50,55,66,57,7,117,110,105,50,55,66,65,7,117,110,105,50,55,66,66,7,117,110,105,50, + 55,66,67,7,117,110,105,50,55,66,68,7,117,110,105,50,55,66,69,7,117,110,105,50,55,67,53,7,117,110,105,50,55,67,54,7,117,110,105,50, + 55,69,48,7,117,110,105,50,55,69,54,7,117,110,105,50,55,69,55,7,117,110,105,50,55,69,56,7,117,110,105,50,55,69,57,7,117,110,105,50, + 55,69,65,7,117,110,105,50,55,69,66,7,117,110,105,50,55,70,48,7,117,110,105,50,55,70,49,7,117,110,105,50,55,70,50,7,117,110,105,50, + 55,70,51,7,117,110,105,50,55,70,52,7,117,110,105,50,55,70,53,7,117,110,105,50,55,70,54,7,117,110,105,50,55,70,55,7,117,110,105,50, + 55,70,56,7,117,110,105,50,55,70,57,7,117,110,105,50,55,70,65,7,117,110,105,50,55,70,66,7,117,110,105,50,55,70,67,7,117,110,105,50, + 55,70,68,7,117,110,105,50,55,70,69,7,117,110,105,50,55,70,70,7,117,110,105,50,56,48,48,7,117,110,105,50,56,48,49,7,117,110,105,50, + 56,48,50,7,117,110,105,50,56,48,51,7,117,110,105,50,56,48,52,7,117,110,105,50,56,48,53,7,117,110,105,50,56,48,54,7,117,110,105,50, + 56,48,55,7,117,110,105,50,56,48,56,7,117,110,105,50,56,48,57,7,117,110,105,50,56,48,65,7,117,110,105,50,56,48,66,7,117,110,105,50, + 56,48,67,7,117,110,105,50,56,48,68,7,117,110,105,50,56,48,69,7,117,110,105,50,56,48,70,7,117,110,105,50,56,49,48,7,117,110,105,50, + 56,49,49,7,117,110,105,50,56,49,50,7,117,110,105,50,56,49,51,7,117,110,105,50,56,49,52,7,117,110,105,50,56,49,53,7,117,110,105,50, + 56,49,54,7,117,110,105,50,56,49,55,7,117,110,105,50,56,49,56,7,117,110,105,50,56,49,57,7,117,110,105,50,56,49,65,7,117,110,105,50, + 56,49,66,7,117,110,105,50,56,49,67,7,117,110,105,50,56,49,68,7,117,110,105,50,56,49,69,7,117,110,105,50,56,49,70,7,117,110,105,50, + 56,50,48,7,117,110,105,50,56,50,49,7,117,110,105,50,56,50,50,7,117,110,105,50,56,50,51,7,117,110,105,50,56,50,52,7,117,110,105,50, + 56,50,53,7,117,110,105,50,56,50,54,7,117,110,105,50,56,50,55,7,117,110,105,50,56,50,56,7,117,110,105,50,56,50,57,7,117,110,105,50, + 56,50,65,7,117,110,105,50,56,50,66,7,117,110,105,50,56,50,67,7,117,110,105,50,56,50,68,7,117,110,105,50,56,50,69,7,117,110,105,50, + 56,50,70,7,117,110,105,50,56,51,48,7,117,110,105,50,56,51,49,7,117,110,105,50,56,51,50,7,117,110,105,50,56,51,51,7,117,110,105,50, + 56,51,52,7,117,110,105,50,56,51,53,7,117,110,105,50,56,51,54,7,117,110,105,50,56,51,55,7,117,110,105,50,56,51,56,7,117,110,105,50, + 56,51,57,7,117,110,105,50,56,51,65,7,117,110,105,50,56,51,66,7,117,110,105,50,56,51,67,7,117,110,105,50,56,51,68,7,117,110,105,50, + 56,51,69,7,117,110,105,50,56,51,70,7,117,110,105,50,56,52,48,7,117,110,105,50,56,52,49,7,117,110,105,50,56,52,50,7,117,110,105,50, + 56,52,51,7,117,110,105,50,56,52,52,7,117,110,105,50,56,52,53,7,117,110,105,50,56,52,54,7,117,110,105,50,56,52,55,7,117,110,105,50, + 56,52,56,7,117,110,105,50,56,52,57,7,117,110,105,50,56,52,65,7,117,110,105,50,56,52,66,7,117,110,105,50,56,52,67,7,117,110,105,50, + 56,52,68,7,117,110,105,50,56,52,69,7,117,110,105,50,56,52,70,7,117,110,105,50,56,53,48,7,117,110,105,50,56,53,49,7,117,110,105,50, + 56,53,50,7,117,110,105,50,56,53,51,7,117,110,105,50,56,53,52,7,117,110,105,50,56,53,53,7,117,110,105,50,56,53,54,7,117,110,105,50, + 56,53,55,7,117,110,105,50,56,53,56,7,117,110,105,50,56,53,57,7,117,110,105,50,56,53,65,7,117,110,105,50,56,53,66,7,117,110,105,50, + 56,53,67,7,117,110,105,50,56,53,68,7,117,110,105,50,56,53,69,7,117,110,105,50,56,53,70,7,117,110,105,50,56,54,48,7,117,110,105,50, + 56,54,49,7,117,110,105,50,56,54,50,7,117,110,105,50,56,54,51,7,117,110,105,50,56,54,52,7,117,110,105,50,56,54,53,7,117,110,105,50, + 56,54,54,7,117,110,105,50,56,54,55,7,117,110,105,50,56,54,56,7,117,110,105,50,56,54,57,7,117,110,105,50,56,54,65,7,117,110,105,50, + 56,54,66,7,117,110,105,50,56,54,67,7,117,110,105,50,56,54,68,7,117,110,105,50,56,54,69,7,117,110,105,50,56,54,70,7,117,110,105,50, + 56,55,48,7,117,110,105,50,56,55,49,7,117,110,105,50,56,55,50,7,117,110,105,50,56,55,51,7,117,110,105,50,56,55,52,7,117,110,105,50, + 56,55,53,7,117,110,105,50,56,55,54,7,117,110,105,50,56,55,55,7,117,110,105,50,56,55,56,7,117,110,105,50,56,55,57,7,117,110,105,50, + 56,55,65,7,117,110,105,50,56,55,66,7,117,110,105,50,56,55,67,7,117,110,105,50,56,55,68,7,117,110,105,50,56,55,69,7,117,110,105,50, + 56,55,70,7,117,110,105,50,56,56,48,7,117,110,105,50,56,56,49,7,117,110,105,50,56,56,50,7,117,110,105,50,56,56,51,7,117,110,105,50, + 56,56,52,7,117,110,105,50,56,56,53,7,117,110,105,50,56,56,54,7,117,110,105,50,56,56,55,7,117,110,105,50,56,56,56,7,117,110,105,50, + 56,56,57,7,117,110,105,50,56,56,65,7,117,110,105,50,56,56,66,7,117,110,105,50,56,56,67,7,117,110,105,50,56,56,68,7,117,110,105,50, + 56,56,69,7,117,110,105,50,56,56,70,7,117,110,105,50,56,57,48,7,117,110,105,50,56,57,49,7,117,110,105,50,56,57,50,7,117,110,105,50, + 56,57,51,7,117,110,105,50,56,57,52,7,117,110,105,50,56,57,53,7,117,110,105,50,56,57,54,7,117,110,105,50,56,57,55,7,117,110,105,50, + 56,57,56,7,117,110,105,50,56,57,57,7,117,110,105,50,56,57,65,7,117,110,105,50,56,57,66,7,117,110,105,50,56,57,67,7,117,110,105,50, + 56,57,68,7,117,110,105,50,56,57,69,7,117,110,105,50,56,57,70,7,117,110,105,50,56,65,48,7,117,110,105,50,56,65,49,7,117,110,105,50, + 56,65,50,7,117,110,105,50,56,65,51,7,117,110,105,50,56,65,52,7,117,110,105,50,56,65,53,7,117,110,105,50,56,65,54,7,117,110,105,50, + 56,65,55,7,117,110,105,50,56,65,56,7,117,110,105,50,56,65,57,7,117,110,105,50,56,65,65,7,117,110,105,50,56,65,66,7,117,110,105,50, + 56,65,67,7,117,110,105,50,56,65,68,7,117,110,105,50,56,65,69,7,117,110,105,50,56,65,70,7,117,110,105,50,56,66,48,7,117,110,105,50, + 56,66,49,7,117,110,105,50,56,66,50,7,117,110,105,50,56,66,51,7,117,110,105,50,56,66,52,7,117,110,105,50,56,66,53,7,117,110,105,50, + 56,66,54,7,117,110,105,50,56,66,55,7,117,110,105,50,56,66,56,7,117,110,105,50,56,66,57,7,117,110,105,50,56,66,65,7,117,110,105,50, + 56,66,66,7,117,110,105,50,56,66,67,7,117,110,105,50,56,66,68,7,117,110,105,50,56,66,69,7,117,110,105,50,56,66,70,7,117,110,105,50, + 56,67,48,7,117,110,105,50,56,67,49,7,117,110,105,50,56,67,50,7,117,110,105,50,56,67,51,7,117,110,105,50,56,67,52,7,117,110,105,50, + 56,67,53,7,117,110,105,50,56,67,54,7,117,110,105,50,56,67,55,7,117,110,105,50,56,67,56,7,117,110,105,50,56,67,57,7,117,110,105,50, + 56,67,65,7,117,110,105,50,56,67,66,7,117,110,105,50,56,67,67,7,117,110,105,50,56,67,68,7,117,110,105,50,56,67,69,7,117,110,105,50, + 56,67,70,7,117,110,105,50,56,68,48,7,117,110,105,50,56,68,49,7,117,110,105,50,56,68,50,7,117,110,105,50,56,68,51,7,117,110,105,50, + 56,68,52,7,117,110,105,50,56,68,53,7,117,110,105,50,56,68,54,7,117,110,105,50,56,68,55,7,117,110,105,50,56,68,56,7,117,110,105,50, + 56,68,57,7,117,110,105,50,56,68,65,7,117,110,105,50,56,68,66,7,117,110,105,50,56,68,67,7,117,110,105,50,56,68,68,7,117,110,105,50, + 56,68,69,7,117,110,105,50,56,68,70,7,117,110,105,50,56,69,48,7,117,110,105,50,56,69,49,7,117,110,105,50,56,69,50,7,117,110,105,50, + 56,69,51,7,117,110,105,50,56,69,52,7,117,110,105,50,56,69,53,7,117,110,105,50,56,69,54,7,117,110,105,50,56,69,55,7,117,110,105,50, + 56,69,56,7,117,110,105,50,56,69,57,7,117,110,105,50,56,69,65,7,117,110,105,50,56,69,66,7,117,110,105,50,56,69,67,7,117,110,105,50, + 56,69,68,7,117,110,105,50,56,69,69,7,117,110,105,50,56,69,70,7,117,110,105,50,56,70,48,7,117,110,105,50,56,70,49,7,117,110,105,50, + 56,70,50,7,117,110,105,50,56,70,51,7,117,110,105,50,56,70,52,7,117,110,105,50,56,70,53,7,117,110,105,50,56,70,54,7,117,110,105,50, + 56,70,55,7,117,110,105,50,56,70,56,7,117,110,105,50,56,70,57,7,117,110,105,50,56,70,65,7,117,110,105,50,56,70,66,7,117,110,105,50, + 56,70,67,7,117,110,105,50,56,70,68,7,117,110,105,50,56,70,69,7,117,110,105,50,56,70,70,7,117,110,105,50,57,48,54,7,117,110,105,50, + 57,48,55,7,117,110,105,50,57,48,65,7,117,110,105,50,57,48,66,7,117,110,105,50,57,52,48,7,117,110,105,50,57,52,49,7,117,110,105,50, + 57,56,51,7,117,110,105,50,57,56,52,7,117,110,105,50,57,67,69,7,117,110,105,50,57,67,70,7,117,110,105,50,57,68,48,7,117,110,105,50, + 57,68,49,7,117,110,105,50,57,68,50,7,117,110,105,50,57,68,51,7,117,110,105,50,57,68,52,7,117,110,105,50,57,68,53,7,117,110,105,50, + 57,69,66,7,117,110,105,50,57,70,65,7,117,110,105,50,57,70,66,7,117,110,105,50,65,48,48,7,117,110,105,50,65,48,49,7,117,110,105,50, + 65,48,50,7,117,110,105,50,65,48,67,7,117,110,105,50,65,48,68,7,117,110,105,50,65,48,69,7,117,110,105,50,65,48,70,7,117,110,105,50, + 65,49,48,7,117,110,105,50,65,49,49,7,117,110,105,50,65,49,50,7,117,110,105,50,65,49,51,7,117,110,105,50,65,49,52,7,117,110,105,50, + 65,49,53,7,117,110,105,50,65,49,54,7,117,110,105,50,65,49,55,7,117,110,105,50,65,49,56,7,117,110,105,50,65,49,57,7,117,110,105,50, + 65,49,65,7,117,110,105,50,65,49,66,7,117,110,105,50,65,49,67,7,117,110,105,50,65,50,70,7,117,110,105,50,65,54,65,7,117,110,105,50, + 65,54,66,7,117,110,105,50,65,55,68,7,117,110,105,50,65,55,69,7,117,110,105,50,65,55,70,7,117,110,105,50,65,56,48,7,117,110,105,50, + 65,56,49,7,117,110,105,50,65,56,50,7,117,110,105,50,65,56,51,7,117,110,105,50,65,56,52,7,117,110,105,50,65,56,53,7,117,110,105,50, + 65,56,54,7,117,110,105,50,65,56,55,7,117,110,105,50,65,56,56,7,117,110,105,50,65,56,57,7,117,110,105,50,65,56,65,7,117,110,105,50, + 65,56,66,7,117,110,105,50,65,56,67,7,117,110,105,50,65,56,68,7,117,110,105,50,65,56,69,7,117,110,105,50,65,56,70,7,117,110,105,50, + 65,57,48,7,117,110,105,50,65,57,49,7,117,110,105,50,65,57,50,7,117,110,105,50,65,57,51,7,117,110,105,50,65,57,52,7,117,110,105,50, + 65,57,53,7,117,110,105,50,65,57,54,7,117,110,105,50,65,57,55,7,117,110,105,50,65,57,56,7,117,110,105,50,65,57,57,7,117,110,105,50, + 65,57,65,7,117,110,105,50,65,57,66,7,117,110,105,50,65,57,67,7,117,110,105,50,65,57,68,7,117,110,105,50,65,57,69,7,117,110,105,50, + 65,57,70,7,117,110,105,50,65,65,48,7,117,110,105,50,65,65,69,7,117,110,105,50,65,65,70,7,117,110,105,50,65,66,48,7,117,110,105,50, + 65,66,49,7,117,110,105,50,65,66,50,7,117,110,105,50,65,66,51,7,117,110,105,50,65,66,52,7,117,110,105,50,65,66,53,7,117,110,105,50, + 65,66,54,7,117,110,105,50,65,66,55,7,117,110,105,50,65,66,56,7,117,110,105,50,65,66,57,7,117,110,105,50,65,66,65,7,117,110,105,50, + 65,70,57,7,117,110,105,50,65,70,65,7,117,110,105,50,66,48,48,7,117,110,105,50,66,48,49,7,117,110,105,50,66,48,50,7,117,110,105,50, + 66,48,51,7,117,110,105,50,66,48,52,7,117,110,105,50,66,48,53,7,117,110,105,50,66,48,54,7,117,110,105,50,66,48,55,7,117,110,105,50, + 66,48,56,7,117,110,105,50,66,48,57,7,117,110,105,50,66,48,65,7,117,110,105,50,66,48,66,7,117,110,105,50,66,48,67,7,117,110,105,50, + 66,48,68,7,117,110,105,50,66,48,69,7,117,110,105,50,66,48,70,7,117,110,105,50,66,49,48,7,117,110,105,50,66,49,49,7,117,110,105,50, + 66,49,50,7,117,110,105,50,66,49,51,7,117,110,105,50,66,49,52,7,117,110,105,50,66,49,53,7,117,110,105,50,66,49,54,7,117,110,105,50, + 66,49,55,7,117,110,105,50,66,49,56,7,117,110,105,50,66,49,57,7,117,110,105,50,66,49,65,7,117,110,105,50,66,49,70,7,117,110,105,50, + 66,50,48,7,117,110,105,50,66,50,49,7,117,110,105,50,66,50,50,7,117,110,105,50,66,50,51,7,117,110,105,50,66,50,52,7,117,110,105,50, + 66,53,51,7,117,110,105,50,66,53,52,7,117,110,105,50,67,54,48,7,117,110,105,50,67,54,49,7,117,110,105,50,67,54,50,7,117,110,105,50, + 67,54,51,7,117,110,105,50,67,54,52,7,117,110,105,50,67,54,53,7,117,110,105,50,67,54,54,7,117,110,105,50,67,54,55,7,117,110,105,50, + 67,54,56,7,117,110,105,50,67,54,57,7,117,110,105,50,67,54,65,7,117,110,105,50,67,54,66,7,117,110,105,50,67,54,67,7,117,110,105,50, + 67,54,68,7,117,110,105,50,67,54,69,7,117,110,105,50,67,54,70,7,117,110,105,50,67,55,48,7,117,110,105,50,67,55,49,7,117,110,105,50, + 67,55,50,7,117,110,105,50,67,55,51,7,117,110,105,50,67,55,52,7,117,110,105,50,67,55,53,7,117,110,105,50,67,55,54,7,117,110,105,50, + 67,55,55,7,117,110,105,50,67,55,57,7,117,110,105,50,67,55,65,7,117,110,105,50,67,55,66,7,117,110,105,50,67,55,67,7,117,110,105,50, + 67,55,68,7,117,110,105,50,67,55,69,7,117,110,105,50,67,55,70,7,117,110,105,50,68,48,48,7,117,110,105,50,68,48,49,7,117,110,105,50, + 68,48,50,7,117,110,105,50,68,48,51,7,117,110,105,50,68,48,52,7,117,110,105,50,68,48,53,7,117,110,105,50,68,48,54,7,117,110,105,50, + 68,48,55,7,117,110,105,50,68,48,56,7,117,110,105,50,68,48,57,7,117,110,105,50,68,48,65,7,117,110,105,50,68,48,66,7,117,110,105,50, + 68,48,67,7,117,110,105,50,68,48,68,7,117,110,105,50,68,48,69,7,117,110,105,50,68,48,70,7,117,110,105,50,68,49,48,7,117,110,105,50, + 68,49,49,7,117,110,105,50,68,49,50,7,117,110,105,50,68,49,51,7,117,110,105,50,68,49,52,7,117,110,105,50,68,49,53,7,117,110,105,50, + 68,49,54,7,117,110,105,50,68,49,55,7,117,110,105,50,68,49,56,7,117,110,105,50,68,49,57,7,117,110,105,50,68,49,65,7,117,110,105,50, + 68,49,66,7,117,110,105,50,68,49,67,7,117,110,105,50,68,49,68,7,117,110,105,50,68,49,69,7,117,110,105,50,68,49,70,7,117,110,105,50, + 68,50,48,7,117,110,105,50,68,50,49,7,117,110,105,50,68,50,50,7,117,110,105,50,68,50,51,7,117,110,105,50,68,50,52,7,117,110,105,50, + 68,50,53,7,117,110,105,50,68,51,48,7,117,110,105,50,68,51,49,7,117,110,105,50,68,51,50,7,117,110,105,50,68,51,51,7,117,110,105,50, + 68,51,52,7,117,110,105,50,68,51,53,7,117,110,105,50,68,51,54,7,117,110,105,50,68,51,55,7,117,110,105,50,68,51,56,7,117,110,105,50, + 68,51,57,7,117,110,105,50,68,51,65,7,117,110,105,50,68,51,66,7,117,110,105,50,68,51,67,7,117,110,105,50,68,51,68,7,117,110,105,50, + 68,51,69,7,117,110,105,50,68,51,70,7,117,110,105,50,68,52,48,7,117,110,105,50,68,52,49,7,117,110,105,50,68,52,50,7,117,110,105,50, + 68,52,51,7,117,110,105,50,68,52,52,7,117,110,105,50,68,52,53,7,117,110,105,50,68,52,54,7,117,110,105,50,68,52,55,7,117,110,105,50, + 68,52,56,7,117,110,105,50,68,52,57,7,117,110,105,50,68,52,65,7,117,110,105,50,68,52,66,7,117,110,105,50,68,52,67,7,117,110,105,50, + 68,52,68,7,117,110,105,50,68,52,69,7,117,110,105,50,68,52,70,7,117,110,105,50,68,53,48,7,117,110,105,50,68,53,49,7,117,110,105,50, + 68,53,50,7,117,110,105,50,68,53,51,7,117,110,105,50,68,53,52,7,117,110,105,50,68,53,53,7,117,110,105,50,68,53,54,7,117,110,105,50, + 68,53,55,7,117,110,105,50,68,53,56,7,117,110,105,50,68,53,57,7,117,110,105,50,68,53,65,7,117,110,105,50,68,53,66,7,117,110,105,50, + 68,53,67,7,117,110,105,50,68,53,68,7,117,110,105,50,68,53,69,7,117,110,105,50,68,53,70,7,117,110,105,50,68,54,48,7,117,110,105,50, + 68,54,49,7,117,110,105,50,68,54,50,7,117,110,105,50,68,54,51,7,117,110,105,50,68,54,52,7,117,110,105,50,68,54,53,7,117,110,105,50, + 68,54,70,7,117,110,105,50,69,49,56,7,117,110,105,50,69,49,69,7,117,110,105,50,69,50,50,7,117,110,105,50,69,50,51,7,117,110,105,50, + 69,50,52,7,117,110,105,50,69,50,53,7,117,110,105,50,69,50,69,7,117,110,105,52,68,67,48,7,117,110,105,52,68,67,49,7,117,110,105,52, + 68,67,50,7,117,110,105,52,68,67,51,7,117,110,105,52,68,67,52,7,117,110,105,52,68,67,53,7,117,110,105,52,68,67,54,7,117,110,105,52, + 68,67,55,7,117,110,105,52,68,67,56,7,117,110,105,52,68,67,57,7,117,110,105,52,68,67,65,7,117,110,105,52,68,67,66,7,117,110,105,52, + 68,67,67,7,117,110,105,52,68,67,68,7,117,110,105,52,68,67,69,7,117,110,105,52,68,67,70,7,117,110,105,52,68,68,48,7,117,110,105,52, + 68,68,49,7,117,110,105,52,68,68,50,7,117,110,105,52,68,68,51,7,117,110,105,52,68,68,52,7,117,110,105,52,68,68,53,7,117,110,105,52, + 68,68,54,7,117,110,105,52,68,68,55,7,117,110,105,52,68,68,56,7,117,110,105,52,68,68,57,7,117,110,105,52,68,68,65,7,117,110,105,52, + 68,68,66,7,117,110,105,52,68,68,67,7,117,110,105,52,68,68,68,7,117,110,105,52,68,68,69,7,117,110,105,52,68,68,70,7,117,110,105,52, + 68,69,48,7,117,110,105,52,68,69,49,7,117,110,105,52,68,69,50,7,117,110,105,52,68,69,51,7,117,110,105,52,68,69,52,7,117,110,105,52, + 68,69,53,7,117,110,105,52,68,69,54,7,117,110,105,52,68,69,55,7,117,110,105,52,68,69,56,7,117,110,105,52,68,69,57,7,117,110,105,52, + 68,69,65,7,117,110,105,52,68,69,66,7,117,110,105,52,68,69,67,7,117,110,105,52,68,69,68,7,117,110,105,52,68,69,69,7,117,110,105,52, + 68,69,70,7,117,110,105,52,68,70,48,7,117,110,105,52,68,70,49,7,117,110,105,52,68,70,50,7,117,110,105,52,68,70,51,7,117,110,105,52, + 68,70,52,7,117,110,105,52,68,70,53,7,117,110,105,52,68,70,54,7,117,110,105,52,68,70,55,7,117,110,105,52,68,70,56,7,117,110,105,52, + 68,70,57,7,117,110,105,52,68,70,65,7,117,110,105,52,68,70,66,7,117,110,105,52,68,70,67,7,117,110,105,52,68,70,68,7,117,110,105,52, + 68,70,69,7,117,110,105,52,68,70,70,7,117,110,105,65,52,68,48,7,117,110,105,65,52,68,49,7,117,110,105,65,52,68,50,7,117,110,105,65, + 52,68,51,7,117,110,105,65,52,68,52,7,117,110,105,65,52,68,53,7,117,110,105,65,52,68,54,7,117,110,105,65,52,68,55,7,117,110,105,65, + 52,68,56,7,117,110,105,65,52,68,57,7,117,110,105,65,52,68,65,7,117,110,105,65,52,68,66,7,117,110,105,65,52,68,67,7,117,110,105,65, + 52,68,68,7,117,110,105,65,52,68,69,7,117,110,105,65,52,68,70,7,117,110,105,65,52,69,48,7,117,110,105,65,52,69,49,7,117,110,105,65, + 52,69,50,7,117,110,105,65,52,69,51,7,117,110,105,65,52,69,52,7,117,110,105,65,52,69,53,7,117,110,105,65,52,69,54,7,117,110,105,65, + 52,69,55,7,117,110,105,65,52,69,56,7,117,110,105,65,52,69,57,7,117,110,105,65,52,69,65,7,117,110,105,65,52,69,66,7,117,110,105,65, + 52,69,67,7,117,110,105,65,52,69,68,7,117,110,105,65,52,69,69,7,117,110,105,65,52,69,70,7,117,110,105,65,52,70,48,7,117,110,105,65, + 52,70,49,7,117,110,105,65,52,70,50,7,117,110,105,65,52,70,51,7,117,110,105,65,52,70,52,7,117,110,105,65,52,70,53,7,117,110,105,65, + 52,70,54,7,117,110,105,65,52,70,55,7,117,110,105,65,52,70,56,7,117,110,105,65,52,70,57,7,117,110,105,65,52,70,65,7,117,110,105,65, + 52,70,66,7,117,110,105,65,52,70,67,7,117,110,105,65,52,70,68,7,117,110,105,65,52,70,69,7,117,110,105,65,52,70,70,7,117,110,105,65, + 54,52,52,7,117,110,105,65,54,52,53,7,117,110,105,65,54,52,54,7,117,110,105,65,54,52,55,7,117,110,105,65,54,52,67,7,117,110,105,65, + 54,52,68,7,117,110,105,65,54,53,48,7,117,110,105,65,54,53,49,7,117,110,105,65,54,53,52,7,117,110,105,65,54,53,53,7,117,110,105,65, + 54,53,54,7,117,110,105,65,54,53,55,7,117,110,105,65,54,54,50,7,117,110,105,65,54,54,51,7,117,110,105,65,54,54,52,7,117,110,105,65, + 54,54,53,7,117,110,105,65,54,54,54,7,117,110,105,65,54,54,55,7,117,110,105,65,54,54,56,7,117,110,105,65,54,54,57,7,117,110,105,65, + 54,54,65,7,117,110,105,65,54,54,66,7,117,110,105,65,54,54,67,7,117,110,105,65,54,54,68,7,117,110,105,65,54,54,69,7,117,110,105,65, + 54,56,65,7,117,110,105,65,54,56,66,7,117,110,105,65,54,56,67,7,117,110,105,65,54,56,68,7,117,110,105,65,54,57,52,7,117,110,105,65, + 54,57,53,7,117,110,105,65,55,48,56,7,117,110,105,65,55,48,57,7,117,110,105,65,55,48,65,7,117,110,105,65,55,48,66,7,117,110,105,65, + 55,48,67,7,117,110,105,65,55,48,68,7,117,110,105,65,55,48,69,7,117,110,105,65,55,48,70,7,117,110,105,65,55,49,48,7,117,110,105,65, + 55,49,49,7,117,110,105,65,55,49,50,7,117,110,105,65,55,49,51,7,117,110,105,65,55,49,52,7,117,110,105,65,55,49,53,7,117,110,105,65, + 55,49,54,7,117,110,105,65,55,49,66,7,117,110,105,65,55,49,67,7,117,110,105,65,55,49,68,7,117,110,105,65,55,49,69,7,117,110,105,65, + 55,49,70,7,117,110,105,65,55,50,50,7,117,110,105,65,55,50,51,7,117,110,105,65,55,50,52,7,117,110,105,65,55,50,53,7,117,110,105,65, + 55,50,54,7,117,110,105,65,55,50,55,7,117,110,105,65,55,50,56,7,117,110,105,65,55,50,57,7,117,110,105,65,55,50,65,7,117,110,105,65, + 55,50,66,7,117,110,105,65,55,51,48,7,117,110,105,65,55,51,49,7,117,110,105,65,55,51,50,7,117,110,105,65,55,51,51,7,117,110,105,65, + 55,51,52,7,117,110,105,65,55,51,53,7,117,110,105,65,55,51,54,7,117,110,105,65,55,51,55,7,117,110,105,65,55,51,56,7,117,110,105,65, + 55,51,57,7,117,110,105,65,55,51,65,7,117,110,105,65,55,51,66,7,117,110,105,65,55,51,67,7,117,110,105,65,55,51,68,7,117,110,105,65, + 55,51,69,7,117,110,105,65,55,51,70,7,117,110,105,65,55,52,48,7,117,110,105,65,55,52,49,7,117,110,105,65,55,52,54,7,117,110,105,65, + 55,52,55,7,117,110,105,65,55,52,56,7,117,110,105,65,55,52,57,7,117,110,105,65,55,52,65,7,117,110,105,65,55,52,66,7,117,110,105,65, + 55,52,69,7,117,110,105,65,55,52,70,7,117,110,105,65,55,53,48,7,117,110,105,65,55,53,49,7,117,110,105,65,55,53,50,7,117,110,105,65, + 55,53,51,7,117,110,105,65,55,53,54,7,117,110,105,65,55,53,55,7,117,110,105,65,55,54,52,7,117,110,105,65,55,54,53,7,117,110,105,65, + 55,54,54,7,117,110,105,65,55,54,55,7,117,110,105,65,55,56,48,7,117,110,105,65,55,56,49,7,117,110,105,65,55,56,50,7,117,110,105,65, + 55,56,51,7,117,110,105,65,55,56,57,7,117,110,105,65,55,56,65,7,117,110,105,65,55,56,66,7,117,110,105,65,55,56,67,7,117,110,105,65, + 55,56,68,7,117,110,105,65,55,56,69,7,117,110,105,65,55,57,48,7,117,110,105,65,55,57,49,7,117,110,105,65,55,65,48,7,117,110,105,65, + 55,65,49,7,117,110,105,65,55,65,50,7,117,110,105,65,55,65,51,7,117,110,105,65,55,65,52,7,117,110,105,65,55,65,53,7,117,110,105,65, + 55,65,54,7,117,110,105,65,55,65,55,7,117,110,105,65,55,65,56,7,117,110,105,65,55,65,57,7,117,110,105,65,55,65,65,7,117,110,105,65, + 55,70,65,7,117,110,105,65,55,70,66,7,117,110,105,65,55,70,67,7,117,110,105,65,55,70,68,7,117,110,105,65,55,70,69,7,117,110,105,65, + 55,70,70,9,117,110,105,48,50,69,53,46,53,9,117,110,105,48,50,69,54,46,53,9,117,110,105,48,50,69,55,46,53,9,117,110,105,48,50,69, + 56,46,53,9,117,110,105,48,50,69,57,46,53,9,117,110,105,48,50,69,53,46,52,9,117,110,105,48,50,69,54,46,52,9,117,110,105,48,50,69, + 55,46,52,9,117,110,105,48,50,69,56,46,52,9,117,110,105,48,50,69,57,46,52,9,117,110,105,48,50,69,53,46,51,9,117,110,105,48,50,69, + 54,46,51,9,117,110,105,48,50,69,55,46,51,9,117,110,105,48,50,69,56,46,51,9,117,110,105,48,50,69,57,46,51,9,117,110,105,48,50,69, + 53,46,50,9,117,110,105,48,50,69,54,46,50,9,117,110,105,48,50,69,55,46,50,9,117,110,105,48,50,69,56,46,50,9,117,110,105,48,50,69, + 57,46,50,9,117,110,105,48,50,69,53,46,49,9,117,110,105,48,50,69,54,46,49,9,117,110,105,48,50,69,55,46,49,9,117,110,105,48,50,69, + 56,46,49,9,117,110,105,48,50,69,57,46,49,4,115,116,101,109,7,117,110,105,70,48,48,48,7,117,110,105,70,48,48,49,7,117,110,105,70,48, + 48,50,7,117,110,105,70,48,48,51,7,117,110,105,70,52,48,48,7,117,110,105,70,52,48,49,7,117,110,105,70,52,48,50,7,117,110,105,70,52, + 48,51,7,117,110,105,70,52,48,52,7,117,110,105,70,52,48,53,7,117,110,105,70,52,48,54,7,117,110,105,70,52,48,55,7,117,110,105,70,52, + 48,56,7,117,110,105,70,52,48,57,7,117,110,105,70,52,48,65,7,117,110,105,70,52,48,66,7,117,110,105,70,52,48,67,7,117,110,105,70,52, + 48,68,7,117,110,105,70,52,48,69,7,117,110,105,70,52,48,70,7,117,110,105,70,52,49,48,7,117,110,105,70,52,49,49,7,117,110,105,70,52, + 49,50,7,117,110,105,70,52,49,51,7,117,110,105,70,52,49,52,7,117,110,105,70,52,49,53,7,117,110,105,70,52,49,54,7,117,110,105,70,52, + 49,55,7,117,110,105,70,52,49,56,7,117,110,105,70,52,49,57,7,117,110,105,70,52,49,65,7,117,110,105,70,52,49,66,7,117,110,105,70,52, + 49,67,7,117,110,105,70,52,49,68,7,117,110,105,70,52,49,69,7,117,110,105,70,52,49,70,7,117,110,105,70,52,50,48,7,117,110,105,70,52, + 50,49,7,117,110,105,70,52,50,50,7,117,110,105,70,52,50,51,7,117,110,105,70,52,50,52,7,117,110,105,70,52,50,53,7,117,110,105,70,52, + 50,54,7,117,110,105,70,52,50,56,7,117,110,105,70,52,50,57,7,117,110,105,70,52,50,65,7,117,110,105,70,52,50,66,7,117,110,105,70,52, + 50,67,7,117,110,105,70,52,50,68,7,117,110,105,70,52,50,69,7,117,110,105,70,52,50,70,7,117,110,105,70,52,51,48,7,117,110,105,70,52, + 51,49,7,117,110,105,70,52,51,50,7,117,110,105,70,52,51,51,7,117,110,105,70,52,51,52,7,117,110,105,70,52,51,53,7,117,110,105,70,52, + 51,54,7,117,110,105,70,52,51,55,7,117,110,105,70,52,51,56,7,117,110,105,70,52,51,57,7,117,110,105,70,52,51,65,7,117,110,105,70,52, + 51,66,7,117,110,105,70,52,51,67,7,117,110,105,70,52,51,68,7,117,110,105,70,52,51,69,7,117,110,105,70,52,51,70,7,117,110,105,70,52, + 52,48,7,117,110,105,70,52,52,49,7,117,110,105,70,54,67,53,7,117,110,105,70,66,48,48,7,117,110,105,70,66,48,51,7,117,110,105,70,66, + 48,52,7,117,110,105,70,66,48,53,7,117,110,105,70,66,48,54,7,117,110,105,70,66,49,51,7,117,110,105,70,66,49,52,7,117,110,105,70,66, + 49,53,7,117,110,105,70,66,49,54,7,117,110,105,70,66,49,55,7,117,110,105,70,66,49,68,7,117,110,105,70,66,49,69,7,117,110,105,70,66, + 49,70,7,117,110,105,70,66,50,48,7,117,110,105,70,66,50,49,7,117,110,105,70,66,50,50,7,117,110,105,70,66,50,51,7,117,110,105,70,66, + 50,52,7,117,110,105,70,66,50,53,7,117,110,105,70,66,50,54,7,117,110,105,70,66,50,55,7,117,110,105,70,66,50,56,7,117,110,105,70,66, + 50,57,7,117,110,105,70,66,50,65,7,117,110,105,70,66,50,66,7,117,110,105,70,66,50,67,7,117,110,105,70,66,50,68,7,117,110,105,70,66, + 50,69,7,117,110,105,70,66,50,70,7,117,110,105,70,66,51,48,7,117,110,105,70,66,51,49,7,117,110,105,70,66,51,50,7,117,110,105,70,66, + 51,51,7,117,110,105,70,66,51,52,7,117,110,105,70,66,51,53,7,117,110,105,70,66,51,54,7,117,110,105,70,66,51,56,7,117,110,105,70,66, + 51,57,7,117,110,105,70,66,51,65,7,117,110,105,70,66,51,66,7,117,110,105,70,66,51,67,7,117,110,105,70,66,51,69,7,117,110,105,70,66, + 52,48,7,117,110,105,70,66,52,49,7,117,110,105,70,66,52,51,7,117,110,105,70,66,52,52,7,117,110,105,70,66,52,54,7,117,110,105,70,66, + 52,55,7,117,110,105,70,66,52,56,7,117,110,105,70,66,52,57,7,117,110,105,70,66,52,65,7,117,110,105,70,66,52,66,7,117,110,105,70,66, + 52,67,7,117,110,105,70,66,52,68,7,117,110,105,70,66,52,69,7,117,110,105,70,66,52,70,7,117,110,105,70,66,53,50,7,117,110,105,70,66, + 53,51,7,117,110,105,70,66,53,52,7,117,110,105,70,66,53,53,7,117,110,105,70,66,53,54,7,117,110,105,70,66,53,55,7,117,110,105,70,66, + 53,56,7,117,110,105,70,66,53,57,7,117,110,105,70,66,53,65,7,117,110,105,70,66,53,66,7,117,110,105,70,66,53,67,7,117,110,105,70,66, + 53,68,7,117,110,105,70,66,53,69,7,117,110,105,70,66,53,70,7,117,110,105,70,66,54,48,7,117,110,105,70,66,54,49,7,117,110,105,70,66, + 54,50,7,117,110,105,70,66,54,51,7,117,110,105,70,66,54,52,7,117,110,105,70,66,54,53,7,117,110,105,70,66,54,54,7,117,110,105,70,66, + 54,55,7,117,110,105,70,66,54,56,7,117,110,105,70,66,54,57,7,117,110,105,70,66,54,65,7,117,110,105,70,66,54,66,7,117,110,105,70,66, + 54,67,7,117,110,105,70,66,54,68,7,117,110,105,70,66,54,69,7,117,110,105,70,66,54,70,7,117,110,105,70,66,55,48,7,117,110,105,70,66, + 55,49,7,117,110,105,70,66,55,50,7,117,110,105,70,66,55,51,7,117,110,105,70,66,55,52,7,117,110,105,70,66,55,53,7,117,110,105,70,66, + 55,54,7,117,110,105,70,66,55,55,7,117,110,105,70,66,55,56,7,117,110,105,70,66,55,57,7,117,110,105,70,66,55,65,7,117,110,105,70,66, + 55,66,7,117,110,105,70,66,55,67,7,117,110,105,70,66,55,68,7,117,110,105,70,66,55,69,7,117,110,105,70,66,55,70,7,117,110,105,70,66, + 56,48,7,117,110,105,70,66,56,49,7,117,110,105,70,66,56,50,7,117,110,105,70,66,56,51,7,117,110,105,70,66,56,52,7,117,110,105,70,66, + 56,53,7,117,110,105,70,66,56,54,7,117,110,105,70,66,56,55,7,117,110,105,70,66,56,56,7,117,110,105,70,66,56,57,7,117,110,105,70,66, + 56,65,7,117,110,105,70,66,56,66,7,117,110,105,70,66,56,67,7,117,110,105,70,66,56,68,7,117,110,105,70,66,56,69,7,117,110,105,70,66, + 56,70,7,117,110,105,70,66,57,48,7,117,110,105,70,66,57,49,7,117,110,105,70,66,57,50,7,117,110,105,70,66,57,51,7,117,110,105,70,66, + 57,52,7,117,110,105,70,66,57,53,7,117,110,105,70,66,57,54,7,117,110,105,70,66,57,55,7,117,110,105,70,66,57,56,7,117,110,105,70,66, + 57,57,7,117,110,105,70,66,57,65,7,117,110,105,70,66,57,66,7,117,110,105,70,66,57,67,7,117,110,105,70,66,57,68,7,117,110,105,70,66, + 57,69,7,117,110,105,70,66,57,70,7,117,110,105,70,66,65,48,7,117,110,105,70,66,65,49,7,117,110,105,70,66,65,50,7,117,110,105,70,66, + 65,51,7,117,110,105,70,66,65,65,7,117,110,105,70,66,65,66,7,117,110,105,70,66,65,67,7,117,110,105,70,66,65,68,7,117,110,105,70,66, + 68,51,7,117,110,105,70,66,68,52,7,117,110,105,70,66,68,53,7,117,110,105,70,66,68,54,7,117,110,105,70,66,68,57,7,117,110,105,70,66, + 68,65,7,117,110,105,70,66,69,56,7,117,110,105,70,66,69,57,7,117,110,105,70,66,70,67,7,117,110,105,70,66,70,68,7,117,110,105,70,66, + 70,69,7,117,110,105,70,66,70,70,7,117,110,105,70,69,48,48,7,117,110,105,70,69,48,49,7,117,110,105,70,69,48,50,7,117,110,105,70,69, + 48,51,7,117,110,105,70,69,48,52,7,117,110,105,70,69,48,53,7,117,110,105,70,69,48,54,7,117,110,105,70,69,48,55,7,117,110,105,70,69, + 48,56,7,117,110,105,70,69,48,57,7,117,110,105,70,69,48,65,7,117,110,105,70,69,48,66,7,117,110,105,70,69,48,67,7,117,110,105,70,69, + 48,68,7,117,110,105,70,69,48,69,7,117,110,105,70,69,48,70,7,117,110,105,70,69,50,48,7,117,110,105,70,69,50,49,7,117,110,105,70,69, + 50,50,7,117,110,105,70,69,50,51,7,117,110,105,70,69,55,48,7,117,110,105,70,69,55,49,7,117,110,105,70,69,55,50,7,117,110,105,70,69, + 55,51,7,117,110,105,70,69,55,52,7,117,110,105,70,69,55,54,7,117,110,105,70,69,55,55,7,117,110,105,70,69,55,56,7,117,110,105,70,69, + 55,57,7,117,110,105,70,69,55,65,7,117,110,105,70,69,55,66,7,117,110,105,70,69,55,67,7,117,110,105,70,69,55,68,7,117,110,105,70,69, + 55,69,7,117,110,105,70,69,55,70,7,117,110,105,70,69,56,48,7,117,110,105,70,69,56,49,7,117,110,105,70,69,56,50,7,117,110,105,70,69, + 56,51,7,117,110,105,70,69,56,52,7,117,110,105,70,69,56,53,7,117,110,105,70,69,56,54,7,117,110,105,70,69,56,55,7,117,110,105,70,69, + 56,56,7,117,110,105,70,69,56,57,7,117,110,105,70,69,56,65,7,117,110,105,70,69,56,66,7,117,110,105,70,69,56,67,7,117,110,105,70,69, + 56,68,7,117,110,105,70,69,56,69,7,117,110,105,70,69,56,70,7,117,110,105,70,69,57,48,7,117,110,105,70,69,57,49,7,117,110,105,70,69, + 57,50,7,117,110,105,70,69,57,51,7,117,110,105,70,69,57,52,7,117,110,105,70,69,57,53,7,117,110,105,70,69,57,54,7,117,110,105,70,69, + 57,55,7,117,110,105,70,69,57,56,7,117,110,105,70,69,57,57,7,117,110,105,70,69,57,65,7,117,110,105,70,69,57,66,7,117,110,105,70,69, + 57,67,7,117,110,105,70,69,57,68,7,117,110,105,70,69,57,69,7,117,110,105,70,69,57,70,7,117,110,105,70,69,65,48,7,117,110,105,70,69, + 65,49,7,117,110,105,70,69,65,50,7,117,110,105,70,69,65,51,7,117,110,105,70,69,65,52,7,117,110,105,70,69,65,53,7,117,110,105,70,69, + 65,54,7,117,110,105,70,69,65,55,7,117,110,105,70,69,65,56,7,117,110,105,70,69,65,57,7,117,110,105,70,69,65,65,7,117,110,105,70,69, + 65,66,7,117,110,105,70,69,65,67,7,117,110,105,70,69,65,68,7,117,110,105,70,69,65,69,7,117,110,105,70,69,65,70,7,117,110,105,70,69, + 66,48,7,117,110,105,70,69,66,49,7,117,110,105,70,69,66,50,7,117,110,105,70,69,66,51,7,117,110,105,70,69,66,52,7,117,110,105,70,69, + 66,53,7,117,110,105,70,69,66,54,7,117,110,105,70,69,66,55,7,117,110,105,70,69,66,56,7,117,110,105,70,69,66,57,7,117,110,105,70,69, + 66,65,7,117,110,105,70,69,66,66,7,117,110,105,70,69,66,67,7,117,110,105,70,69,66,68,7,117,110,105,70,69,66,69,7,117,110,105,70,69, + 66,70,7,117,110,105,70,69,67,48,7,117,110,105,70,69,67,49,7,117,110,105,70,69,67,50,7,117,110,105,70,69,67,51,7,117,110,105,70,69, + 67,52,7,117,110,105,70,69,67,53,7,117,110,105,70,69,67,54,7,117,110,105,70,69,67,55,7,117,110,105,70,69,67,56,7,117,110,105,70,69, + 67,57,7,117,110,105,70,69,67,65,7,117,110,105,70,69,67,66,7,117,110,105,70,69,67,67,7,117,110,105,70,69,67,68,7,117,110,105,70,69, + 67,69,7,117,110,105,70,69,67,70,7,117,110,105,70,69,68,48,7,117,110,105,70,69,68,49,7,117,110,105,70,69,68,50,7,117,110,105,70,69, + 68,51,7,117,110,105,70,69,68,52,7,117,110,105,70,69,68,53,7,117,110,105,70,69,68,54,7,117,110,105,70,69,68,55,7,117,110,105,70,69, + 68,56,7,117,110,105,70,69,68,57,7,117,110,105,70,69,68,65,7,117,110,105,70,69,68,66,7,117,110,105,70,69,68,67,7,117,110,105,70,69, + 68,68,7,117,110,105,70,69,68,69,7,117,110,105,70,69,68,70,7,117,110,105,70,69,69,48,7,117,110,105,70,69,69,49,7,117,110,105,70,69, + 69,50,7,117,110,105,70,69,69,51,7,117,110,105,70,69,69,52,7,117,110,105,70,69,69,53,7,117,110,105,70,69,69,54,7,117,110,105,70,69, + 69,55,7,117,110,105,70,69,69,56,7,117,110,105,70,69,69,57,7,117,110,105,70,69,69,65,7,117,110,105,70,69,69,66,7,117,110,105,70,69, + 69,67,7,117,110,105,70,69,69,68,7,117,110,105,70,69,69,69,7,117,110,105,70,69,69,70,7,117,110,105,70,69,70,48,7,117,110,105,70,69, + 70,49,7,117,110,105,70,69,70,50,7,117,110,105,70,69,70,51,7,117,110,105,70,69,70,52,7,117,110,105,70,69,70,53,7,117,110,105,70,69, + 70,54,7,117,110,105,70,69,70,55,7,117,110,105,70,69,70,56,7,117,110,105,70,69,70,57,7,117,110,105,70,69,70,65,7,117,110,105,70,69, + 70,66,7,117,110,105,70,69,70,67,7,117,110,105,70,69,70,70,7,117,110,105,70,70,70,57,7,117,110,105,70,70,70,65,7,117,110,105,70,70, + 70,66,7,117,110,105,70,70,70,67,7,117,110,105,70,70,70,68,6,117,49,48,51,48,48,6,117,49,48,51,48,49,6,117,49,48,51,48,50,6, + 117,49,48,51,48,51,6,117,49,48,51,48,52,6,117,49,48,51,48,53,6,117,49,48,51,48,54,6,117,49,48,51,48,55,6,117,49,48,51,48, + 56,6,117,49,48,51,48,57,6,117,49,48,51,48,65,6,117,49,48,51,48,66,6,117,49,48,51,48,67,6,117,49,48,51,48,68,6,117,49,48, + 51,48,69,6,117,49,48,51,48,70,6,117,49,48,51,49,48,6,117,49,48,51,49,49,6,117,49,48,51,49,50,6,117,49,48,51,49,51,6,117, + 49,48,51,49,52,6,117,49,48,51,49,53,6,117,49,48,51,49,54,6,117,49,48,51,49,55,6,117,49,48,51,49,56,6,117,49,48,51,49,57, + 6,117,49,48,51,49,65,6,117,49,48,51,49,66,6,117,49,48,51,49,67,6,117,49,48,51,49,68,6,117,49,48,51,49,69,6,117,49,48,51, + 50,48,6,117,49,48,51,50,49,6,117,49,48,51,50,50,6,117,49,48,51,50,51,6,117,49,68,51,48,48,6,117,49,68,51,48,49,6,117,49, + 68,51,48,50,6,117,49,68,51,48,51,6,117,49,68,51,48,52,6,117,49,68,51,48,53,6,117,49,68,51,48,54,6,117,49,68,51,48,55,6, + 117,49,68,51,48,56,6,117,49,68,51,48,57,6,117,49,68,51,48,65,6,117,49,68,51,48,66,6,117,49,68,51,48,67,6,117,49,68,51,48, + 68,6,117,49,68,51,48,69,6,117,49,68,51,48,70,6,117,49,68,51,49,48,6,117,49,68,51,49,49,6,117,49,68,51,49,50,6,117,49,68, + 51,49,51,6,117,49,68,51,49,52,6,117,49,68,51,49,53,6,117,49,68,51,49,54,6,117,49,68,51,49,55,6,117,49,68,51,49,56,6,117, + 49,68,51,49,57,6,117,49,68,51,49,65,6,117,49,68,51,49,66,6,117,49,68,51,49,67,6,117,49,68,51,49,68,6,117,49,68,51,49,69, + 6,117,49,68,51,49,70,6,117,49,68,51,50,48,6,117,49,68,51,50,49,6,117,49,68,51,50,50,6,117,49,68,51,50,51,6,117,49,68,51, + 50,52,6,117,49,68,51,50,53,6,117,49,68,51,50,54,6,117,49,68,51,50,55,6,117,49,68,51,50,56,6,117,49,68,51,50,57,6,117,49, + 68,51,50,65,6,117,49,68,51,50,66,6,117,49,68,51,50,67,6,117,49,68,51,50,68,6,117,49,68,51,50,69,6,117,49,68,51,50,70,6, + 117,49,68,51,51,48,6,117,49,68,51,51,49,6,117,49,68,51,51,50,6,117,49,68,51,51,51,6,117,49,68,51,51,52,6,117,49,68,51,51, + 53,6,117,49,68,51,51,54,6,117,49,68,51,51,55,6,117,49,68,51,51,56,6,117,49,68,51,51,57,6,117,49,68,51,51,65,6,117,49,68, + 51,51,66,6,117,49,68,51,51,67,6,117,49,68,51,51,68,6,117,49,68,51,51,69,6,117,49,68,51,51,70,6,117,49,68,51,52,48,6,117, + 49,68,51,52,49,6,117,49,68,51,52,50,6,117,49,68,51,52,51,6,117,49,68,51,52,52,6,117,49,68,51,52,53,6,117,49,68,51,52,54, + 6,117,49,68,51,52,55,6,117,49,68,51,52,56,6,117,49,68,51,52,57,6,117,49,68,51,52,65,6,117,49,68,51,52,66,6,117,49,68,51, + 52,67,6,117,49,68,51,52,68,6,117,49,68,51,52,69,6,117,49,68,51,52,70,6,117,49,68,51,53,48,6,117,49,68,51,53,49,6,117,49, + 68,51,53,50,6,117,49,68,51,53,51,6,117,49,68,51,53,52,6,117,49,68,51,53,53,6,117,49,68,51,53,54,6,117,49,68,53,51,56,6, + 117,49,68,53,51,57,6,117,49,68,53,51,66,6,117,49,68,53,51,67,6,117,49,68,53,51,68,6,117,49,68,53,51,69,6,117,49,68,53,52, + 48,6,117,49,68,53,52,49,6,117,49,68,53,52,50,6,117,49,68,53,52,51,6,117,49,68,53,52,52,6,117,49,68,53,52,54,6,117,49,68, + 53,52,65,6,117,49,68,53,52,66,6,117,49,68,53,52,67,6,117,49,68,53,52,68,6,117,49,68,53,52,69,6,117,49,68,53,52,70,6,117, + 49,68,53,53,48,6,117,49,68,53,53,50,6,117,49,68,53,53,51,6,117,49,68,53,53,52,6,117,49,68,53,53,53,6,117,49,68,53,53,54, + 6,117,49,68,53,53,55,6,117,49,68,53,53,56,6,117,49,68,53,53,57,6,117,49,68,53,53,65,6,117,49,68,53,53,66,6,117,49,68,53, + 53,67,6,117,49,68,53,53,68,6,117,49,68,53,53,69,6,117,49,68,53,53,70,6,117,49,68,53,54,48,6,117,49,68,53,54,49,6,117,49, + 68,53,54,50,6,117,49,68,53,54,51,6,117,49,68,53,54,52,6,117,49,68,53,54,53,6,117,49,68,53,54,54,6,117,49,68,53,54,55,6, + 117,49,68,53,54,56,6,117,49,68,53,54,57,6,117,49,68,53,54,65,6,117,49,68,53,54,66,6,117,49,68,53,65,48,6,117,49,68,53,65, + 49,6,117,49,68,53,65,50,6,117,49,68,53,65,51,6,117,49,68,53,65,52,6,117,49,68,53,65,53,6,117,49,68,53,65,54,6,117,49,68, + 53,65,55,6,117,49,68,53,65,56,6,117,49,68,53,65,57,6,117,49,68,53,65,65,6,117,49,68,53,65,66,6,117,49,68,53,65,67,6,117, + 49,68,53,65,68,6,117,49,68,53,65,69,6,117,49,68,53,65,70,6,117,49,68,53,66,48,6,117,49,68,53,66,49,6,117,49,68,53,66,50, + 6,117,49,68,53,66,51,6,117,49,68,53,66,52,6,117,49,68,53,66,53,6,117,49,68,53,66,54,6,117,49,68,53,66,55,6,117,49,68,53, + 66,56,6,117,49,68,53,66,57,6,117,49,68,53,66,65,6,117,49,68,53,66,66,6,117,49,68,53,66,67,6,117,49,68,53,66,68,6,117,49, + 68,53,66,69,6,117,49,68,53,66,70,6,117,49,68,53,67,48,6,117,49,68,53,67,49,6,117,49,68,53,67,50,6,117,49,68,53,67,51,6, + 117,49,68,53,67,52,6,117,49,68,53,67,53,6,117,49,68,53,67,54,6,117,49,68,53,67,55,6,117,49,68,53,67,56,6,117,49,68,53,67, + 57,6,117,49,68,53,67,65,6,117,49,68,53,67,66,6,117,49,68,53,67,67,6,117,49,68,53,67,68,6,117,49,68,53,67,69,6,117,49,68, + 53,67,70,6,117,49,68,53,68,48,6,117,49,68,53,68,49,6,117,49,68,53,68,50,6,117,49,68,53,68,51,6,117,49,68,55,68,56,6,117, + 49,68,55,68,57,6,117,49,68,55,68,65,6,117,49,68,55,68,66,6,117,49,68,55,68,67,6,117,49,68,55,68,68,6,117,49,68,55,68,69, + 6,117,49,68,55,68,70,6,117,49,68,55,69,48,6,117,49,68,55,69,49,6,117,49,68,55,69,50,6,117,49,68,55,69,51,6,117,49,68,55, + 69,52,6,117,49,68,55,69,53,6,117,49,68,55,69,54,6,117,49,68,55,69,55,6,117,49,68,55,69,56,6,117,49,68,55,69,57,6,117,49, + 68,55,69,65,6,117,49,68,55,69,66,6,117,49,70,48,51,48,6,117,49,70,48,51,49,6,117,49,70,48,51,50,6,117,49,70,48,51,51,6, + 117,49,70,48,51,52,6,117,49,70,48,51,53,6,117,49,70,48,51,54,6,117,49,70,48,51,55,6,117,49,70,48,51,56,6,117,49,70,48,51, + 57,6,117,49,70,48,51,65,6,117,49,70,48,51,66,6,117,49,70,48,51,67,6,117,49,70,48,51,68,6,117,49,70,48,51,69,6,117,49,70, + 48,51,70,6,117,49,70,48,52,48,6,117,49,70,48,52,49,6,117,49,70,48,52,50,6,117,49,70,48,52,51,6,117,49,70,48,52,52,6,117, + 49,70,48,52,53,6,117,49,70,48,52,54,6,117,49,70,48,52,55,6,117,49,70,48,52,56,6,117,49,70,48,52,57,6,117,49,70,48,52,65, + 6,117,49,70,48,52,66,6,117,49,70,48,52,67,6,117,49,70,48,52,68,6,117,49,70,48,52,69,6,117,49,70,48,52,70,6,117,49,70,48, + 53,48,6,117,49,70,48,53,49,6,117,49,70,48,53,50,6,117,49,70,48,53,51,6,117,49,70,48,53,52,6,117,49,70,48,53,53,6,117,49, + 70,48,53,54,6,117,49,70,48,53,55,6,117,49,70,48,53,56,6,117,49,70,48,53,57,6,117,49,70,48,53,65,6,117,49,70,48,53,66,6, + 117,49,70,48,53,67,6,117,49,70,48,53,68,6,117,49,70,48,53,69,6,117,49,70,48,53,70,6,117,49,70,48,54,48,6,117,49,70,48,54, + 49,6,117,49,70,48,54,50,6,117,49,70,48,54,51,6,117,49,70,48,54,52,6,117,49,70,48,54,53,6,117,49,70,48,54,54,6,117,49,70, + 48,54,55,6,117,49,70,48,54,56,6,117,49,70,48,54,57,6,117,49,70,48,54,65,6,117,49,70,48,54,66,6,117,49,70,48,54,67,6,117, + 49,70,48,54,68,6,117,49,70,48,54,69,6,117,49,70,48,54,70,6,117,49,70,48,55,48,6,117,49,70,48,55,49,6,117,49,70,48,55,50, + 6,117,49,70,48,55,51,6,117,49,70,48,55,52,6,117,49,70,48,55,53,6,117,49,70,48,55,54,6,117,49,70,48,55,55,6,117,49,70,48, + 55,56,6,117,49,70,48,55,57,6,117,49,70,48,55,65,6,117,49,70,48,55,66,6,117,49,70,48,55,67,6,117,49,70,48,55,68,6,117,49, + 70,48,55,69,6,117,49,70,48,55,70,6,117,49,70,48,56,48,6,117,49,70,48,56,49,6,117,49,70,48,56,50,6,117,49,70,48,56,51,6, + 117,49,70,48,56,52,6,117,49,70,48,56,53,6,117,49,70,48,56,54,6,117,49,70,48,56,55,6,117,49,70,48,56,56,6,117,49,70,48,56, + 57,6,117,49,70,48,56,65,6,117,49,70,48,56,66,6,117,49,70,48,56,67,6,117,49,70,48,56,68,6,117,49,70,48,56,69,6,117,49,70, + 48,56,70,6,117,49,70,48,57,48,6,117,49,70,48,57,49,6,117,49,70,48,57,50,6,117,49,70,48,57,51,6,117,49,70,48,65,48,6,117, + 49,70,48,65,49,6,117,49,70,48,65,50,6,117,49,70,48,65,51,6,117,49,70,48,65,52,6,117,49,70,48,65,53,6,117,49,70,48,65,54, + 6,117,49,70,48,65,55,6,117,49,70,48,65,56,6,117,49,70,48,65,57,6,117,49,70,48,65,65,6,117,49,70,48,65,66,6,117,49,70,48, + 65,67,6,117,49,70,48,65,68,6,117,49,70,48,65,69,6,117,49,70,48,66,49,6,117,49,70,48,66,50,6,117,49,70,48,66,51,6,117,49, + 70,48,66,52,6,117,49,70,48,66,53,6,117,49,70,48,66,54,6,117,49,70,48,66,55,6,117,49,70,48,66,56,6,117,49,70,48,66,57,6, + 117,49,70,48,66,65,6,117,49,70,48,66,66,6,117,49,70,48,66,67,6,117,49,70,48,66,68,6,117,49,70,48,66,69,6,117,49,70,48,67, + 49,6,117,49,70,48,67,50,6,117,49,70,48,67,51,6,117,49,70,48,67,52,6,117,49,70,48,67,53,6,117,49,70,48,67,54,6,117,49,70, + 48,67,55,6,117,49,70,48,67,56,6,117,49,70,48,67,57,6,117,49,70,48,67,65,6,117,49,70,48,67,66,6,117,49,70,48,67,67,6,117, + 49,70,48,67,68,6,117,49,70,48,67,69,6,117,49,70,48,67,70,6,117,49,70,48,68,49,6,117,49,70,48,68,50,6,117,49,70,48,68,51, + 6,117,49,70,48,68,52,6,117,49,70,48,68,53,6,117,49,70,48,68,54,6,117,49,70,48,68,55,6,117,49,70,48,68,56,6,117,49,70,48, + 68,57,6,117,49,70,48,68,65,6,117,49,70,48,68,66,6,117,49,70,48,68,67,6,117,49,70,48,68,68,6,117,49,70,48,68,69,6,117,49, + 70,48,68,70,6,117,49,70,52,50,68,6,117,49,70,52,50,69,6,117,49,70,52,51,49,6,117,49,70,52,51,53,6,117,49,70,54,48,48,6, + 117,49,70,54,48,49,6,117,49,70,54,48,50,6,117,49,70,54,48,51,6,117,49,70,54,48,52,6,117,49,70,54,48,53,6,117,49,70,54,48, + 54,6,117,49,70,54,48,55,6,117,49,70,54,48,56,6,117,49,70,54,48,57,6,117,49,70,54,48,65,6,117,49,70,54,48,66,6,117,49,70, + 54,48,67,6,117,49,70,54,48,68,6,117,49,70,54,48,69,6,117,49,70,54,48,70,6,117,49,70,54,49,48,6,117,49,70,54,49,49,6,117, + 49,70,54,49,50,6,117,49,70,54,49,51,6,117,49,70,54,49,52,6,117,49,70,54,49,53,6,117,49,70,54,49,54,6,117,49,70,54,49,55, + 6,117,49,70,54,49,56,6,117,49,70,54,49,57,6,117,49,70,54,49,65,6,117,49,70,54,49,66,6,117,49,70,54,49,67,6,117,49,70,54, + 49,68,6,117,49,70,54,49,69,6,117,49,70,54,49,70,6,117,49,70,54,50,48,6,117,49,70,54,50,49,6,117,49,70,54,50,50,6,117,49, + 70,54,50,51,6,117,49,70,54,50,53,6,117,49,70,54,50,54,6,117,49,70,54,50,55,6,117,49,70,54,50,56,6,117,49,70,54,50,57,6, + 117,49,70,54,50,65,6,117,49,70,54,50,66,6,117,49,70,54,50,68,6,117,49,70,54,50,69,6,117,49,70,54,50,70,6,117,49,70,54,51, + 48,6,117,49,70,54,51,49,6,117,49,70,54,51,50,6,117,49,70,54,51,51,6,117,49,70,54,51,52,6,117,49,70,54,51,53,6,117,49,70, + 54,51,54,6,117,49,70,54,51,55,6,117,49,70,54,51,56,6,117,49,70,54,51,57,6,117,49,70,54,51,65,6,117,49,70,54,51,66,6,117, + 49,70,54,51,67,6,117,49,70,54,51,68,6,117,49,70,54,51,69,6,117,49,70,54,51,70,6,117,49,70,54,52,48,9,100,108,76,116,99,97, + 114,111,110,8,68,105,101,114,101,115,105,115,5,65,99,117,116,101,5,84,105,108,100,101,5,71,114,97,118,101,10,67,105,114,99,117,109,102,108,101, + 120,5,67,97,114,111,110,12,117,110,105,48,51,49,49,46,99,97,115,101,5,66,114,101,118,101,9,68,111,116,97,99,99,101,110,116,12,72,117,110, + 103,97,114,117,109,108,97,117,116,11,68,111,117,98,108,101,103,114,97,118,101,10,97,114,97,98,105,99,95,100,111,116,12,97,114,97,98,105,99,95, + 50,100,111,116,115,12,97,114,97,98,105,99,95,51,100,111,116,115,14,97,114,97,98,105,99,95,51,100,111,116,115,95,97,14,97,114,97,98,105,99, + 95,50,100,111,116,115,95,97,12,97,114,97,98,105,99,95,52,100,111,116,115,12,117,110,105,48,54,54,69,46,102,105,110,97,12,117,110,105,48,54, + 54,69,46,105,110,105,116,12,117,110,105,48,54,54,69,46,109,101,100,105,12,117,110,105,48,54,65,49,46,102,105,110,97,12,117,110,105,48,54,65, + 49,46,105,110,105,116,12,117,110,105,48,54,65,49,46,109,101,100,105,12,117,110,105,48,54,54,70,46,102,105,110,97,12,117,110,105,48,54,54,70, + 46,105,110,105,116,12,117,110,105,48,54,54,70,46,109,101,100,105,12,117,110,105,48,54,66,65,46,105,110,105,116,12,117,110,105,48,54,66,65,46, + 109,101,100,105,11,97,114,97,98,105,99,95,114,105,110,103,12,117,110,105,48,54,55,67,46,102,105,110,97,12,117,110,105,48,54,55,67,46,105,110, + 105,116,12,117,110,105,48,54,55,67,46,109,101,100,105,12,117,110,105,48,54,55,68,46,102,105,110,97,12,117,110,105,48,54,55,68,46,105,110,105, + 116,12,117,110,105,48,54,55,68,46,109,101,100,105,12,117,110,105,48,54,56,49,46,102,105,110,97,12,117,110,105,48,54,56,49,46,105,110,105,116, + 12,117,110,105,48,54,56,49,46,109,101,100,105,12,117,110,105,48,54,56,50,46,102,105,110,97,12,117,110,105,48,54,56,50,46,105,110,105,116,12, + 117,110,105,48,54,56,50,46,109,101,100,105,12,117,110,105,48,54,56,53,46,102,105,110,97,12,117,110,105,48,54,56,53,46,105,110,105,116,12,117, + 110,105,48,54,56,53,46,109,101,100,105,12,117,110,105,48,54,66,70,46,102,105,110,97,12,117,110,105,48,54,66,70,46,105,110,105,116,12,117,110, + 105,48,54,66,70,46,109,101,100,105,14,97,114,97,98,105,99,95,103,97,102,95,98,97,114,7,69,110,103,46,97,108,116,15,117,110,105,48,50,54, + 56,46,100,111,116,108,101,115,115,15,117,110,105,48,50,57,68,46,100,111,116,108,101,115,115,11,117,110,105,48,51,48,56,48,51,48,52,11,117,110, + 105,48,51,48,52,48,51,48,56,11,117,110,105,48,51,48,55,48,51,48,52,11,117,110,105,48,51,48,56,48,51,48,49,11,117,110,105,48,51,48, + 56,48,51,48,48,11,117,110,105,48,51,48,52,48,51,48,49,11,117,110,105,48,51,48,52,48,51,48,48,11,117,110,105,48,51,48,51,48,51,48, + 52,11,117,110,105,48,51,48,56,48,51,48,67,11,117,110,105,48,51,48,51,48,51,48,56,11,117,110,105,48,51,48,67,48,51,48,55,11,117,110, + 105,48,51,48,51,48,51,48,49,11,117,110,105,48,51,48,50,48,51,48,49,11,117,110,105,48,51,48,50,48,51,48,48,11,117,110,105,48,51,48, + 50,48,51,48,51,11,117,110,105,48,51,48,54,48,51,48,51,11,117,110,105,48,51,48,54,48,51,48,49,11,117,110,105,48,51,48,54,48,51,48, + 48,11,117,110,105,48,51,48,54,48,51,48,57,11,117,110,105,48,51,48,50,48,51,48,57,11,117,110,105,48,51,48,49,48,51,48,55,10,98,114, + 97,105,108,108,101,100,111,116,5,74,46,97,108,116,12,117,110,105,48,54,57,53,46,102,105,110,97,22,117,110,105,70,69,65,69,46,102,105,110,97, + 46,108,111,110,103,115,116,97,114,116,12,117,110,105,48,54,66,53,46,102,105,110,97,12,117,110,105,48,54,66,53,46,105,110,105,116,12,117,110,105, + 48,54,66,53,46,109,101,100,105,12,117,110,105,48,54,67,69,46,102,105,110,97,12,117,110,105,48,54,67,69,46,105,110,105,116,12,117,110,105,48, + 54,67,69,46,109,101,100,105,12,117,110,105,48,54,57,50,46,102,105,110,97,5,108,46,97,108,116,12,117,110,105,48,54,68,53,46,102,105,110,97, + 17,117,110,105,48,52,55,56,46,109,111,110,111,103,114,97,112,104,17,117,110,105,48,52,55,57,46,109,111,110,111,103,114,97,112,104,15,105,111,103, + 111,110,101,107,46,100,111,116,108,101,115,115,15,117,110,105,50,49,52,56,46,100,111,116,108,101,115,115,15,117,110,105,50,49,52,57,46,100,111,116, + 108,101,115,115,15,117,110,105,49,69,50,68,46,100,111,116,108,101,115,115,15,117,110,105,49,69,67,66,46,100,111,116,108,101,115,115,3,100,99,111, + 5,73,46,97,108,116,10,97,114,114,111,119,46,98,97,115,101,11,117,110,105,48,54,53,49,48,54,52,66,11,117,110,105,48,54,53,49,48,54,52, + 67,11,117,110,105,48,54,52,66,48,54,53,49,11,117,110,105,48,54,53,49,48,54,52,69,11,117,110,105,48,54,53,49,48,54,52,70,11,117,110, + 105,48,54,52,69,48,54,53,49,11,117,110,105,48,54,53,52,48,54,52,69,11,117,110,105,48,54,53,52,48,54,52,70,12,117,110,105,48,55,67, + 65,46,102,105,110,97,12,117,110,105,48,55,67,65,46,109,101,100,105,12,117,110,105,48,55,67,65,46,105,110,105,116,12,117,110,105,48,55,67,66, + 46,102,105,110,97,12,117,110,105,48,55,67,66,46,109,101,100,105,12,117,110,105,48,55,67,66,46,105,110,105,116,12,117,110,105,48,55,67,67,46, + 102,105,110,97,12,117,110,105,48,55,67,67,46,109,101,100,105,12,117,110,105,48,55,67,67,46,105,110,105,116,12,117,110,105,48,55,67,68,46,102, + 105,110,97,12,117,110,105,48,55,67,68,46,109,101,100,105,12,117,110,105,48,55,67,68,46,105,110,105,116,12,117,110,105,48,55,67,69,46,102,105, + 110,97,12,117,110,105,48,55,67,69,46,109,101,100,105,12,117,110,105,48,55,67,69,46,105,110,105,116,12,117,110,105,48,55,67,70,46,102,105,110, + 97,12,117,110,105,48,55,67,70,46,109,101,100,105,12,117,110,105,48,55,67,70,46,105,110,105,116,12,117,110,105,48,55,68,48,46,102,105,110,97, + 12,117,110,105,48,55,68,48,46,109,101,100,105,12,117,110,105,48,55,68,48,46,105,110,105,116,12,117,110,105,48,55,68,49,46,102,105,110,97,12, + 117,110,105,48,55,68,49,46,109,101,100,105,12,117,110,105,48,55,68,49,46,105,110,105,116,12,117,110,105,48,55,68,50,46,102,105,110,97,12,117, + 110,105,48,55,68,50,46,109,101,100,105,12,117,110,105,48,55,68,50,46,105,110,105,116,12,117,110,105,48,55,68,51,46,102,105,110,97,12,117,110, + 105,48,55,68,51,46,109,101,100,105,12,117,110,105,48,55,68,51,46,105,110,105,116,12,117,110,105,48,55,68,52,46,102,105,110,97,12,117,110,105, + 48,55,68,52,46,109,101,100,105,12,117,110,105,48,55,68,52,46,105,110,105,116,12,117,110,105,48,55,68,53,46,102,105,110,97,12,117,110,105,48, + 55,68,53,46,109,101,100,105,12,117,110,105,48,55,68,53,46,105,110,105,116,12,117,110,105,48,55,68,54,46,102,105,110,97,12,117,110,105,48,55, + 68,54,46,109,101,100,105,12,117,110,105,48,55,68,54,46,105,110,105,116,12,117,110,105,48,55,68,55,46,102,105,110,97,12,117,110,105,48,55,68, + 55,46,109,101,100,105,12,117,110,105,48,55,68,55,46,105,110,105,116,12,117,110,105,48,55,68,56,46,102,105,110,97,12,117,110,105,48,55,68,56, + 46,109,101,100,105,12,117,110,105,48,55,68,56,46,105,110,105,116,12,117,110,105,48,55,68,57,46,102,105,110,97,12,117,110,105,48,55,68,57,46, + 109,101,100,105,12,117,110,105,48,55,68,57,46,105,110,105,116,12,117,110,105,48,55,68,65,46,102,105,110,97,12,117,110,105,48,55,68,65,46,109, + 101,100,105,12,117,110,105,48,55,68,65,46,105,110,105,116,12,117,110,105,48,55,68,66,46,102,105,110,97,12,117,110,105,48,55,68,66,46,109,101, + 100,105,12,117,110,105,48,55,68,66,46,105,110,105,116,12,117,110,105,48,55,68,67,46,102,105,110,97,12,117,110,105,48,55,68,67,46,109,101,100, + 105,12,117,110,105,48,55,68,67,46,105,110,105,116,12,117,110,105,48,55,68,68,46,102,105,110,97,12,117,110,105,48,55,68,68,46,109,101,100,105, + 12,117,110,105,48,55,68,68,46,105,110,105,116,12,117,110,105,48,55,68,69,46,102,105,110,97,12,117,110,105,48,55,68,69,46,109,101,100,105,12, + 117,110,105,48,55,68,69,46,105,110,105,116,12,117,110,105,48,55,68,70,46,102,105,110,97,12,117,110,105,48,55,68,70,46,109,101,100,105,12,117, + 110,105,48,55,68,70,46,105,110,105,116,12,117,110,105,48,55,69,48,46,102,105,110,97,12,117,110,105,48,55,69,48,46,109,101,100,105,12,117,110, + 105,48,55,69,48,46,105,110,105,116,12,117,110,105,48,55,69,49,46,102,105,110,97,12,117,110,105,48,55,69,49,46,109,101,100,105,12,117,110,105, + 48,55,69,49,46,105,110,105,116,12,117,110,105,48,55,69,50,46,102,105,110,97,12,117,110,105,48,55,69,50,46,109,101,100,105,12,117,110,105,48, + 55,69,50,46,105,110,105,116,12,117,110,105,48,55,69,51,46,102,105,110,97,12,117,110,105,48,55,69,51,46,109,101,100,105,12,117,110,105,48,55, + 69,51,46,105,110,105,116,12,117,110,105,48,55,69,52,46,102,105,110,97,12,117,110,105,48,55,69,52,46,109,101,100,105,12,117,110,105,48,55,69, + 52,46,105,110,105,116,12,117,110,105,48,55,69,53,46,102,105,110,97,12,117,110,105,48,55,69,53,46,109,101,100,105,12,117,110,105,48,55,69,53, + 46,105,110,105,116,12,117,110,105,48,55,69,54,46,102,105,110,97,12,117,110,105,48,55,69,54,46,109,101,100,105,12,117,110,105,48,55,69,54,46, + 105,110,105,116,12,117,110,105,48,55,69,55,46,102,105,110,97,12,117,110,105,48,55,69,55,46,109,101,100,105,12,117,110,105,48,55,69,55,46,105, + 110,105,116,9,82,105,110,103,97,98,111,118,101,11,117,110,105,50,54,51,48,46,97,108,116,11,117,110,105,50,54,51,49,46,97,108,116,11,117,110, + 105,50,54,51,50,46,97,108,116,11,117,110,105,50,54,51,51,46,97,108,116,11,117,110,105,50,54,51,52,46,97,108,116,11,117,110,105,50,54,51, + 53,46,97,108,116,11,117,110,105,50,54,51,54,46,97,108,116,11,117,110,105,50,54,51,55,46,97,108,116,12,117,110,105,48,52,55,69,46,100,105, + 97,99,17,117,110,105,48,52,56,65,46,98,114,101,118,101,108,101,115,115,17,117,110,105,48,52,56,66,46,98,114,101,118,101,108,101,115,115,5,121, + 46,97,108,116,12,117,110,105,48,54,56,57,46,102,105,110,97,12,117,110,105,48,54,56,65,46,102,105,110,97,12,117,110,105,48,54,56,66,46,102, + 105,110,97,12,117,110,105,48,54,56,70,46,102,105,110,97,12,117,110,105,48,54,57,48,46,102,105,110,97,12,117,110,105,48,54,57,51,46,102,105, + 110,97,12,117,110,105,48,54,57,52,46,102,105,110,97,12,117,110,105,48,54,57,54,46,102,105,110,97,12,117,110,105,48,54,57,55,46,102,105,110, + 97,12,117,110,105,48,54,57,57,46,102,105,110,97,12,117,110,105,48,54,57,65,46,102,105,110,97,12,117,110,105,48,54,57,65,46,105,110,105,116, + 12,117,110,105,48,54,57,65,46,109,101,100,105,12,117,110,105,48,54,57,66,46,102,105,110,97,12,117,110,105,48,54,57,66,46,105,110,105,116,12, + 117,110,105,48,54,57,66,46,109,101,100,105,12,117,110,105,48,54,57,67,46,102,105,110,97,12,117,110,105,48,54,57,67,46,105,110,105,116,12,117, + 110,105,48,54,57,67,46,109,101,100,105,12,117,110,105,48,54,57,68,46,102,105,110,97,12,117,110,105,48,54,57,68,46,105,110,105,116,12,117,110, + 105,48,54,57,68,46,109,101,100,105,12,117,110,105,48,54,57,69,46,102,105,110,97,12,117,110,105,48,54,57,69,46,105,110,105,116,12,117,110,105, + 48,54,57,69,46,109,101,100,105,12,117,110,105,48,54,57,70,46,102,105,110,97,12,117,110,105,48,54,57,70,46,105,110,105,116,12,117,110,105,48, + 54,57,70,46,109,101,100,105,12,117,110,105,48,54,65,48,46,102,105,110,97,12,117,110,105,48,54,65,48,46,105,110,105,116,12,117,110,105,48,54, + 65,48,46,109,101,100,105,12,117,110,105,48,54,65,50,46,102,105,110,97,12,117,110,105,48,54,65,50,46,105,110,105,116,12,117,110,105,48,54,65, + 50,46,109,101,100,105,12,117,110,105,48,54,65,51,46,102,105,110,97,12,117,110,105,48,54,65,51,46,105,110,105,116,12,117,110,105,48,54,65,51, + 46,109,101,100,105,12,117,110,105,48,54,65,53,46,102,105,110,97,12,117,110,105,48,54,65,53,46,105,110,105,116,12,117,110,105,48,54,65,53,46, + 109,101,100,105,12,117,110,105,48,54,65,55,46,102,105,110,97,12,117,110,105,48,54,65,55,46,105,110,105,116,12,117,110,105,48,54,65,55,46,109, + 101,100,105,12,117,110,105,48,54,65,56,46,102,105,110,97,12,117,110,105,48,54,65,56,46,105,110,105,116,12,117,110,105,48,54,65,56,46,109,101, + 100,105,12,117,110,105,48,54,65,65,46,102,105,110,97,12,117,110,105,48,54,65,65,46,105,110,105,116,12,117,110,105,48,54,65,65,46,109,101,100, + 105,12,117,110,105,48,54,65,66,46,102,105,110,97,12,117,110,105,48,54,65,66,46,105,110,105,116,12,117,110,105,48,54,65,66,46,109,101,100,105, + 12,117,110,105,48,54,65,67,46,102,105,110,97,12,117,110,105,48,54,65,67,46,105,110,105,116,12,117,110,105,48,54,65,67,46,109,101,100,105,12, + 117,110,105,48,54,65,69,46,102,105,110,97,12,117,110,105,48,54,65,69,46,105,110,105,116,12,117,110,105,48,54,65,69,46,109,101,100,105,12,117, + 110,105,48,54,66,48,46,102,105,110,97,12,117,110,105,48,54,66,48,46,105,110,105,116,12,117,110,105,48,54,66,48,46,109,101,100,105,12,117,110, + 105,48,54,66,50,46,102,105,110,97,12,117,110,105,48,54,66,50,46,105,110,105,116,12,117,110,105,48,54,66,50,46,109,101,100,105,12,117,110,105, + 48,54,66,52,46,102,105,110,97,12,117,110,105,48,54,66,52,46,105,110,105,116,12,117,110,105,48,54,66,52,46,109,101,100,105,12,117,110,105,48, + 54,66,54,46,102,105,110,97,12,117,110,105,48,54,66,54,46,105,110,105,116,12,117,110,105,48,54,66,54,46,109,101,100,105,12,117,110,105,48,54, + 66,55,46,102,105,110,97,12,117,110,105,48,54,66,55,46,105,110,105,116,12,117,110,105,48,54,66,55,46,109,101,100,105,12,117,110,105,48,54,66, + 56,46,102,105,110,97,12,117,110,105,48,54,66,56,46,105,110,105,116,12,117,110,105,48,54,66,56,46,109,101,100,105,12,117,110,105,48,54,66,57, + 46,102,105,110,97,12,117,110,105,48,54,66,57,46,105,110,105,116,12,117,110,105,48,54,66,57,46,109,101,100,105,12,117,110,105,48,54,66,67,46, + 102,105,110,97,12,117,110,105,48,54,66,67,46,105,110,105,116,12,117,110,105,48,54,66,67,46,109,101,100,105,12,117,110,105,48,54,66,68,46,102, + 105,110,97,12,117,110,105,48,54,66,68,46,105,110,105,116,12,117,110,105,48,54,66,68,46,109,101,100,105,0,0,0,184,2,128,64,255,251,254,3, + 250,20,3,249,37,3,248,50,3,247,150,3,246,14,3,245,254,3,244,254,3,243,37,3,242,14,3,241,150,3,240,37,3,239,138,65,5,239,254,3, + 238,150,3,237,150,3,236,250,3,235,250,3,234,254,3,233,58,3,232,66,3,231,254,3,230,50,3,229,228,83,5,229,150,3,228,138,65,5,228,83, + 3,227,226,47,5,227,250,3,226,47,3,225,254,3,224,254,3,223,50,3,222,20,3,221,150,3,220,254,3,219,18,3,218,125,3,217,187,3,216,254, + 3,214,138,65,5,214,125,3,213,212,71,5,213,125,3,212,71,3,211,210,27,5,211,254,3,210,27,3,209,254,3,208,254,3,207,254,3,206,254,3, + 205,150,3,204,203,30,5,204,254,3,203,30,3,202,50,3,201,254,3,198,133,17,5,198,28,3,197,22,3,196,254,3,195,254,3,194,254,3,193,254, + 3,192,254,3,191,254,3,190,254,3,189,254,3,188,254,3,187,254,3,186,17,3,185,134,37,5,185,254,3,184,183,187,5,184,254,3,183,182,93,5, + 183,187,3,183,128,4,182,181,37,5,182,93,64,255,3,182,64,4,181,37,3,180,254,3,179,150,3,178,254,3,177,254,3,176,254,3,175,254,3,174, + 100,3,173,14,3,172,171,37,5,172,100,3,171,170,18,5,171,37,3,170,18,3,169,138,65,5,169,250,3,168,254,3,167,254,3,166,254,3,165,18, + 3,164,254,3,163,162,14,5,163,50,3,162,14,3,161,100,3,160,138,65,5,160,150,3,159,254,3,158,157,12,5,158,254,3,157,12,3,156,155,25, + 5,156,100,3,155,154,16,5,155,25,3,154,16,3,153,10,3,152,254,3,151,150,13,5,151,254,3,150,13,3,149,138,65,5,149,150,3,148,147,14, + 5,148,40,3,147,14,3,146,250,3,145,144,187,5,145,254,3,144,143,93,5,144,187,3,144,128,4,143,142,37,5,143,93,3,143,64,4,142,37,3, + 141,254,3,140,139,46,5,140,254,3,139,46,3,138,134,37,5,138,65,3,137,136,11,5,137,20,3,136,11,3,135,134,37,5,135,100,3,134,133,17, + 5,134,37,3,133,17,3,132,254,3,131,130,17,5,131,254,3,130,17,3,129,254,3,128,254,3,127,254,3,64,255,126,125,125,5,126,254,3,125,125, + 3,124,100,3,123,84,21,5,123,37,3,122,254,3,121,254,3,120,14,3,119,12,3,118,10,3,117,254,3,116,250,3,115,250,3,114,250,3,113,250, + 3,112,254,3,111,254,3,110,254,3,108,33,3,107,254,3,106,17,66,5,106,83,3,105,254,3,104,125,3,103,17,66,5,102,254,3,101,254,3,100, + 254,3,99,254,3,98,254,3,97,58,3,96,250,3,94,12,3,93,254,3,91,254,3,90,254,3,89,88,10,5,89,250,3,88,10,3,87,22,25,5, + 87,50,3,86,254,3,85,84,21,5,85,66,3,84,21,3,83,1,16,5,83,24,3,82,20,3,81,74,19,5,81,254,3,80,11,3,79,254,3,78, + 77,16,5,78,254,3,77,16,3,76,254,3,75,74,19,5,75,254,3,74,73,16,5,74,19,3,73,29,13,5,73,16,3,72,13,3,71,254,3,70, + 150,3,69,150,3,68,254,3,67,2,45,5,67,250,3,66,187,3,65,75,3,64,254,3,63,254,3,62,61,18,5,62,20,3,61,60,15,5,61,18, + 3,60,59,13,5,60,64,255,15,3,59,13,3,58,254,3,57,254,3,56,55,20,5,56,250,3,55,54,16,5,55,20,3,54,53,11,5,54,16,3, + 53,11,3,52,30,3,51,13,3,50,49,11,5,50,254,3,49,11,3,48,47,11,5,48,13,3,47,11,3,46,45,9,5,46,16,3,45,9,3,44, + 50,3,43,42,37,5,43,100,3,42,41,18,5,42,37,3,41,18,3,40,39,37,5,40,65,3,39,37,3,38,37,11,5,38,15,3,37,11,3,36, + 254,3,35,254,3,34,15,3,33,1,16,5,33,18,3,32,100,3,31,250,3,30,29,13,5,30,100,3,29,13,3,28,17,66,5,28,254,3,27,250, + 3,26,66,3,25,17,66,5,25,254,3,24,100,3,23,22,25,5,23,254,3,22,1,16,5,22,25,3,21,254,3,20,254,3,19,254,3,18,17,66, + 5,18,254,3,17,2,45,5,17,66,3,16,125,3,15,100,3,14,254,3,13,12,22,5,13,254,3,12,1,16,5,12,22,3,11,254,3,10,16,3, + 9,254,3,8,2,45,5,8,254,3,7,20,3,6,100,3,4,1,16,5,4,254,3,64,21,3,2,45,5,3,254,3,2,1,16,5,2,45,3,1, + 16,3,0,254,3,1,184,1,100,133,141,1,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, + 43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, + 43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, + 43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, + 43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,0,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, + 43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, + 43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, + 43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, + 43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,29,0,0}; +const char* blendish_resources::dejavusans_ttf = (const char*) temp2; + diff --git a/dpf/dgl/src/oui-blendish/blendish_resources.h b/dpf/dgl/src/oui-blendish/blendish_resources.h new file mode 100644 index 0000000..cdb8bb2 --- /dev/null +++ b/dpf/dgl/src/oui-blendish/blendish_resources.h @@ -0,0 +1,15 @@ +/* (Auto-generated binary data file). */ + +#ifndef BINARY_BLENDISH_RESOURCES_H +#define BINARY_BLENDISH_RESOURCES_H + +namespace blendish_resources +{ + extern const char* blender_icons16_png; + const unsigned int blender_icons16_png_size = 250706; + + extern const char* dejavusans_ttf; + const unsigned int dejavusans_ttf_size = 741536; +}; + +#endif diff --git a/dpf/dgl/src/oui-blendish/oui.h b/dpf/dgl/src/oui-blendish/oui.h new file mode 100644 index 0000000..b6807f9 --- /dev/null +++ b/dpf/dgl/src/oui-blendish/oui.h @@ -0,0 +1,2025 @@ +/* +OUI - A minimal semi-immediate GUI handling & layouting library + +Copyright (c) 2014 Leonard Ritter + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + */ + +#ifndef _OUI_H_ +#define _OUI_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +Revision 4 (2014-12-17) + +OUI (short for "Open UI", spoken like the french "oui" for "yes") is a +platform agnostic single-header C library for layouting GUI elements and +handling related user input. Together with a set of widget drawing and logic +routines it can be used to build complex user interfaces. + +OUI is a semi-immediate GUI. Widget declarations are persistent for the duration +of the setup and evaluation, but do not need to be kept around longer than one +frame. + +OUI has no widget types; instead, it provides only one kind of element, "Items", +which can be tailored to the application by the user and expanded with custom +buffers and event handlers to behave as containers, buttons, sliders, radio +buttons, and so on. + +OUI also does not draw anything; Instead it provides a set of functions to +iterate and query the layouted items in order to allow client code to render +each widget with its current state using a preferred graphics library. + +See example.cpp in the repository for a full usage example. + +A basic setup for OUI usage in C looks like this: +================================================= + +// a header for each widget +typedef struct Data { + int type; + UIhandler handler; +} Data; + +/// global event dispatch +void ui_handler(int item, UIevent event) { + Data *data = (Data *)uiGetHandle(item); + if (data && data->handler) { + data->handler(item, event); + } +} + +void app_main(...) { + UIcontext *context = uiCreateContext(4096, 1<<20); + uiMakeCurrent(context); + uiSetHandler(ui_handler); + + while (app_running()) { + // update position of mouse cursor; the ui can also be updated + // from received events. + uiSetCursor(app_get_mouse_x(), app_get_mouse_y()); + + // update button state + for (int i = 0; i < 3; ++i) + uiSetButton(i, app_get_button_state(i)); + + // you can also send keys and scroll events; see example.cpp for more + + // -------------- + // this section does not have to be regenerated on frame; a good + // policy is to invalidate it on events, as this usually alters + // structure and layout. + + // begin new UI declarations + uiBeginLayout(); + + // - UI setup code goes here - + app_setup_ui(); + + // layout UI + uiEndLayout(); + + // -------------- + + // draw UI, starting with the first item, index 0 + app_draw_ui(render_context,0); + + // update states and fire handlers + uiProcess(get_time_ms()); + } + + uiDestroyContext(context); +} + +Here's an example setup for a checkbox control: +=============================================== + +typedef struct CheckBoxData { + Data head; + const char *label; + bool *checked; +} CheckBoxData; + +// called when the item is clicked (see checkbox()) +void app_checkbox_handler(int item, UIevent event) { + // retrieve custom data (see checkbox()) + CheckBoxData *data = (CheckBoxData *)uiGetHandle(item); + + switch(event) { + default: break; + case UI_BUTTON0_DOWN: { + // toggle value + *data->checked = !(*data->checked); + } break; + } +} + +// creates a checkbox control for a pointer to a boolean +int checkbox(const char *label, bool *checked) { + + // create new ui item + int item = uiItem(); + + // set minimum size of wiget; horizontal size is dynamic, vertical is fixed + uiSetSize(item, 0, APP_WIDGET_HEIGHT); + + // store some custom data with the checkbox that we use for rendering + // and value changes. + CheckBoxData *data = (CheckBoxData *)uiAllocHandle(item, sizeof(CheckBoxData)); + + // assign a custom typeid to the data so the renderer knows how to + // render this control, and our event handler + data->head.type = APP_WIDGET_CHECKBOX; + data->head.handler = app_checkbox_handler; + data->label = label; + data->checked = checked; + + // set to fire as soon as the left button is + // pressed; UI_BUTTON0_HOT_UP is also a popular alternative. + uiSetEvents(item, UI_BUTTON0_DOWN); + + return item; +} + +A simple recursive drawing routine can look like this: +====================================================== + +void app_draw_ui(AppRenderContext *ctx, int item) { + // retrieve custom data and cast it to Data; we assume the first member + // of every widget data item to be a Data field. + Data *head = (Data *)uiGetHandle(item); + + // if a handle is set, this is a specialized widget + if (head) { + // get the widgets absolute rectangle + UIrect rect = uiGetRect(item); + + switch(head->type) { + default: break; + case APP_WIDGET_LABEL: { + // ... + } break; + case APP_WIDGET_BUTTON: { + // ... + } break; + case APP_WIDGET_CHECKBOX: { + // cast to the full data type + CheckBoxData *data = (CheckBoxData*)head; + + // get the widgets current state + int state = uiGetState(item); + + // if the value is set, the state is always active + if (*data->checked) + state = UI_ACTIVE; + + // draw the checkbox + app_draw_checkbox(ctx, rect, state, data->label); + } break; + } + } + + // iterate through all children and draw + int kid = uiFirstChild(item); + while (kid != -1) { + app_draw_ui(ctx, kid); + kid = uiNextSibling(kid); + } +} + +Layouting items works like this: +================================ + +void layout_window(int w, int h) { + // create root item; the first item always has index 0 + int parent = uiItem(); + // assign fixed size + uiSetSize(parent, w, h); + + // create column box and use as new parent + parent = uiInsert(parent, uiItem()); + // configure as column + uiSetBox(parent, UI_COLUMN); + // span horizontally, attach to top + uiSetLayout(parent, UI_HFILL | UI_TOP); + + // add a label - we're assuming custom control functions to exist + int item = uiInsert(parent, label("Hello World")); + // set a fixed height for the label + uiSetSize(item, 0, APP_WIDGET_HEIGHT); + // span the label horizontally + uiSetLayout(item, UI_HFILL); + + static bool checked = false; + + // add a checkbox to the same parent as item; this is faster than + // calling uiInsert on the same parent repeatedly. + item = uiAppend(item, checkbox("Checked:", &checked)); + // set a fixed height for the checkbox + uiSetSize(item, 0, APP_WIDGET_HEIGHT); + // span the checkbox in the same way as the label + uiSetLayout(item, UI_HFILL); +} + + + + */ + +// you can override this from the outside to pick +// the export level you need +#ifndef OUI_EXPORT +#define OUI_EXPORT +#endif + +// limits + +enum { + // maximum size in bytes of a single data buffer passed to uiAllocData(). + UI_MAX_DATASIZE = 4096, + // maximum depth of nested containers + UI_MAX_DEPTH = 64, + // maximum number of buffered input events + UI_MAX_INPUT_EVENTS = 64, + // consecutive click threshold in ms + UI_CLICK_THRESHOLD = 250, +}; + +typedef unsigned int UIuint; + +// opaque UI context +typedef struct UIcontext UIcontext; + +// item states as returned by uiGetState() + +typedef enum UIitemState { + // the item is inactive + UI_COLD = 0, + // the item is inactive, but the cursor is hovering over this item + UI_HOT = 1, + // the item is toggled, activated, focused (depends on item kind) + UI_ACTIVE = 2, + // the item is unresponsive + UI_FROZEN = 3, +} UIitemState; + +// container flags to pass to uiSetBox() +typedef enum UIboxFlags { + // flex-direction (bit 0+1) + + // left to right + UI_ROW = 0x002, + // top to bottom + UI_COLUMN = 0x003, + + // model (bit 1) + + // free layout + UI_LAYOUT = 0x000, + // flex model + UI_FLEX = 0x002, + + // flex-wrap (bit 2) + + // single-line + UI_NOWRAP = 0x000, + // multi-line, wrap left to right + UI_WRAP = 0x004, + + + // justify-content (start, end, center, space-between) + // at start of row/column + UI_START = 0x008, + // at center of row/column + UI_MIDDLE = 0x000, + // at end of row/column + UI_END = 0x010, + // insert spacing to stretch across whole row/column + UI_JUSTIFY = 0x018, + + // align-items + // can be implemented by putting a flex container in a layout container, + // then using UI_TOP, UI_DOWN, UI_VFILL, UI_VCENTER, etc. + // FILL is equivalent to stretch/grow + + // align-content (start, end, center, stretch) + // can be implemented by putting a flex container in a layout container, + // then using UI_TOP, UI_DOWN, UI_VFILL, UI_VCENTER, etc. + // FILL is equivalent to stretch; space-between is not supported. +} UIboxFlags; + +// child layout flags to pass to uiSetLayout() +typedef enum UIlayoutFlags { + // attachments (bit 5-8) + // fully valid when parent uses UI_LAYOUT model + // partially valid when in UI_FLEX model + + // anchor to left item or left side of parent + UI_LEFT = 0x020, + // anchor to top item or top side of parent + UI_TOP = 0x040, + // anchor to right item or right side of parent + UI_RIGHT = 0x080, + // anchor to bottom item or bottom side of parent + UI_DOWN = 0x100, + // anchor to both left and right item or parent borders + UI_HFILL = 0x0a0, + // anchor to both top and bottom item or parent borders + UI_VFILL = 0x140, + // center horizontally, with left margin as offset + UI_HCENTER = 0x000, + // center vertically, with top margin as offset + UI_VCENTER = 0x000, + // center in both directions, with left/top margin as offset + UI_CENTER = 0x000, + // anchor to all four directions + UI_FILL = 0x1e0, + // when wrapping, put this element on a new line + // wrapping layout code auto-inserts UI_BREAK flags, + // drawing routines can read them with uiGetLayout() + UI_BREAK = 0x200 +} UIlayoutFlags; + +// event flags +typedef enum UIevent { + // on button 0 down + UI_BUTTON0_DOWN = 0x0400, + // on button 0 up + // when this event has a handler, uiGetState() will return UI_ACTIVE as + // long as button 0 is down. + UI_BUTTON0_UP = 0x0800, + // on button 0 up while item is hovered + // when this event has a handler, uiGetState() will return UI_ACTIVE + // when the cursor is hovering the items rectangle; this is the + // behavior expected for buttons. + UI_BUTTON0_HOT_UP = 0x1000, + // item is being captured (button 0 constantly pressed); + // when this event has a handler, uiGetState() will return UI_ACTIVE as + // long as button 0 is down. + UI_BUTTON0_CAPTURE = 0x2000, + // on button 2 down (right mouse button, usually triggers context menu) + UI_BUTTON2_DOWN = 0x4000, + // item has received a scrollwheel event + // the accumulated wheel offset can be queried with uiGetScroll() + UI_SCROLL = 0x8000, + // item is focused and has received a key-down event + // the respective key can be queried using uiGetKey() and uiGetModifier() + UI_KEY_DOWN = 0x10000, + // item is focused and has received a key-up event + // the respective key can be queried using uiGetKey() and uiGetModifier() + UI_KEY_UP = 0x20000, + // item is focused and has received a character event + // the respective character can be queried using uiGetKey() + UI_CHAR = 0x40000, +} UIevent; + +enum { + // these bits, starting at bit 24, can be safely assigned by the + // application, e.g. as item types, other event types, drop targets, etc. + // they can be set and queried using uiSetFlags() and uiGetFlags() + UI_USERMASK = 0xff000000, + + // a special mask passed to uiFindItem() + UI_ANY = 0xffffffff, +}; + +// handler callback; event is one of UI_EVENT_* +typedef void (*UIhandler)(UIcontext* ui_context, int item, UIevent event); + +// for cursor positions, mainly +typedef struct UIvec2 { + union { + int v[2]; + struct { int x, y; }; + }; +} UIvec2; + +// layout rectangle +typedef struct UIrect { + union { + int v[4]; + struct { int x, y, w, h; }; + }; +} UIrect; + +// unless declared otherwise, all operations have the complexity O(1). + +// Context Management +// ------------------ + +// create a new UI context; call uiMakeCurrent() to make this context the +// current context. The context is managed by the client and must be released +// using uiDestroyContext() +// item_capacity is the maximum of number of items that can be declared. +// buffer_capacity is the maximum total size of bytes that can be allocated +// using uiAllocHandle(); you may pass 0 if you don't need to allocate +// handles. +// 4096 and (1<<20) are good starting values. +OUI_EXPORT UIcontext *uiCreateContext( + unsigned int item_capacity, + unsigned int buffer_capacity); + +// release the memory of an UI context created with uiCreateContext(); if the +// context is the current context, the current context will be set to NULL +OUI_EXPORT void uiDestroyContext(UIcontext *ctx); + +// User Data +OUI_EXPORT void uiSetContextHandle(UIcontext *ui_context, void *handle); +OUI_EXPORT void *uiGetContextHandle(UIcontext *ui_context); + +// Input Control +// ------------- + +// sets the current cursor position (usually belonging to a mouse) to the +// screen coordinates at (x,y) +OUI_EXPORT void uiSetCursor(UIcontext *ui_context, int x, int y); + +// returns the current cursor position in screen coordinates as set by +// uiSetCursor() +OUI_EXPORT UIvec2 uiGetCursor(UIcontext *ui_context); + +// returns the offset of the cursor relative to the last call to uiProcess() +OUI_EXPORT UIvec2 uiGetCursorDelta(UIcontext *ui_context); + +// returns the beginning point of a drag operation. +OUI_EXPORT UIvec2 uiGetCursorStart(UIcontext *ui_context); + +// returns the offset of the cursor relative to the beginning point of a drag +// operation. +OUI_EXPORT UIvec2 uiGetCursorStartDelta(UIcontext *ui_context); + +// sets a mouse or gamepad button as pressed/released +// button is in the range 0..63 and maps to an application defined input +// source. +// mod is an application defined set of flags for modifier keys +// enabled is 1 for pressed, 0 for released +OUI_EXPORT void uiSetButton(UIcontext *ui_context, unsigned int button, unsigned int mod, bool enabled); + +// returns the current state of an application dependent input button +// as set by uiSetButton(). +// the function returns 1 if the button has been set to pressed, 0 for released. +OUI_EXPORT int uiGetButton(UIcontext *ui_context, unsigned int button); + +// returns the number of chained clicks; 1 is a single click, +// 2 is a double click, etc. +OUI_EXPORT int uiGetClicks(UIcontext *ui_context); + +// sets a key as down/up; the key can be any application defined keycode +// mod is an application defined set of flags for modifier keys +// enabled is 1 for key down, 0 for key up +// all key events are being buffered until the next call to uiProcess() +OUI_EXPORT void uiSetKey(UIcontext *ui_context, unsigned int key, unsigned int mod, bool enabled); + +// sends a single character for text input; the character is usually in the +// unicode range, but can be application defined. +// all char events are being buffered until the next call to uiProcess() +OUI_EXPORT void uiSetChar(UIcontext *ui_context, unsigned int value); + +// accumulates scroll wheel offsets for the current frame +// all offsets are being accumulated until the next call to uiProcess() +OUI_EXPORT void uiSetScroll(UIcontext *ui_context, int x, int y); + +// returns the currently accumulated scroll wheel offsets for this frame +OUI_EXPORT UIvec2 uiGetScroll(UIcontext *ui_context); + + + + + +// Stages +// ------ + +// clear the item buffer; uiBeginLayout() should be called before the first +// UI declaration for this frame to avoid concatenation of the same UI multiple +// times. +// After the call, all previously declared item IDs are invalid, and all +// application dependent context data has been freed. +// uiBeginLayout() must be followed by uiEndLayout(). +OUI_EXPORT void uiBeginLayout(UIcontext *ui_context); + +// layout all added items starting from the root item 0. +// after calling uiEndLayout(), no further modifications to the item tree should +// be done until the next call to uiBeginLayout(). +// It is safe to immediately draw the items after a call to uiEndLayout(). +// this is an O(N) operation for N = number of declared items. +OUI_EXPORT void uiEndLayout(UIcontext *ui_context); + +// update the current hot item; this only needs to be called if items are kept +// for more than one frame and uiEndLayout() is not called +OUI_EXPORT void uiUpdateHotItem(UIcontext *ui_context); + +// update the internal state according to the current cursor position and +// button states, and call all registered handlers. +// timestamp is the time in milliseconds relative to the last call to uiProcess() +// and is used to estimate the threshold for double-clicks +// after calling uiProcess(), no further modifications to the item tree should +// be done until the next call to uiBeginLayout(). +// Items should be drawn before a call to uiProcess() +// this is an O(N) operation for N = number of declared items. +OUI_EXPORT void uiProcess(UIcontext *ui_context, int timestamp); + +// reset the currently stored hot/active etc. handles; this should be called when +// a re-declaration of the UI changes the item indices, to avoid state +// related glitches because item identities have changed. +OUI_EXPORT void uiClearState(UIcontext *ui_context); + +// UI Declaration +// -------------- + +// create a new UI item and return the new items ID. +OUI_EXPORT int uiItem(UIcontext *ui_context); + +// set an items state to frozen; the UI will not recurse into frozen items +// when searching for hot or active items; subsequently, frozen items and +// their child items will not cause mouse event notifications. +// The frozen state is not applied recursively; uiGetState() will report +// UI_COLD for child items. Upon encountering a frozen item, the drawing +// routine needs to handle rendering of child items appropriately. +// see example.cpp for a demonstration. +OUI_EXPORT void uiSetFrozen(UIcontext *ui_context, int item, bool enable); + +// set the application-dependent handle of an item. +// handle is an application defined 64-bit handle. If handle is NULL, the item +// will not be interactive. +OUI_EXPORT void uiSetHandle(UIcontext *ui_context, int item, void *handle); + +// allocate space for application-dependent context data and assign it +// as the handle to the item. +// The memory of the pointer is managed by the UI context and released +// upon the next call to uiBeginLayout() +OUI_EXPORT void *uiAllocHandle(UIcontext *ui_context, int item, unsigned int size); + +// set the global handler callback for interactive items. +// the handler will be called for each item whose event flags are set using +// uiSetEvents. +OUI_EXPORT void uiSetHandler(UIcontext *ui_context, UIhandler handler); + +// flags is a combination of UI_EVENT_* and designates for which events the +// handler should be called. +OUI_EXPORT void uiSetEvents(UIcontext *ui_context, int item, unsigned int flags); + +// flags is a user-defined set of flags defined by UI_USERMASK. +OUI_EXPORT void uiSetFlags(UIcontext *ui_context, int item, unsigned int flags); + +// assign an item to a container. +// an item ID of 0 refers to the root item. +// the function returns the child item ID +// if the container has already added items, the function searches +// for the last item and calls uiAppend() on it, which is an +// O(N) operation for N siblings. +// it is usually more efficient to call uiInsert() for the first child, +// then chain additional siblings using uiAppend(). +OUI_EXPORT int uiInsert(UIcontext *ui_context, int item, int child); + +// assign an item to the same container as another item +// sibling is inserted after item. +OUI_EXPORT int uiAppend(UIcontext *ui_context, int item, int sibling); + +// insert child into container item like uiInsert(), but prepend +// it to the first child item, effectively putting it in +// the background. +// it is efficient to call uiInsertBack() repeatedly +// in cases where drawing or layout order doesn't matter. +OUI_EXPORT int uiInsertBack(UIcontext *ui_context, int item, int child); + +// same as uiInsert() +OUI_EXPORT int uiInsertFront(UIcontext *ui_context, int item, int child); + +// set the size of the item; a size of 0 indicates the dimension to be +// dynamic; if the size is set, the item can not expand beyond that size. +OUI_EXPORT void uiSetSize(UIcontext *ui_context, int item, int w, int h); + +// set the anchoring behavior of the item to one or multiple UIlayoutFlags +OUI_EXPORT void uiSetLayout(UIcontext *ui_context, int item, unsigned int flags); + +// set the box model behavior of the item to one or multiple UIboxFlags +OUI_EXPORT void uiSetBox(UIcontext *ui_context, int item, unsigned int flags); + +// set the left, top, right and bottom margins of an item; when the item is +// anchored to the parent or another item, the margin controls the distance +// from the neighboring element. +OUI_EXPORT void uiSetMargins(UIcontext *ui_context, int item, short l, short t, short r, short b); + +// set item as recipient of all keyboard events; if item is -1, no item will +// be focused. +OUI_EXPORT void uiFocus(UIcontext *ui_context, int item); + +// Iteration +// --------- + +// returns the first child item of a container item. If the item is not +// a container or does not contain any items, -1 is returned. +// if item is 0, the first child item of the root item will be returned. +OUI_EXPORT int uiFirstChild(UIcontext *ui_context, int item); + +// returns an items next sibling in the list of the parent containers children. +// if item is 0 or the item is the last child item, -1 will be returned. +OUI_EXPORT int uiNextSibling(UIcontext *ui_context, int item); + +// Querying +// -------- + +// return the total number of allocated items +OUI_EXPORT int uiGetItemCount(UIcontext *ui_context); + +// return the total bytes that have been allocated by uiAllocHandle() +OUI_EXPORT unsigned int uiGetAllocSize(UIcontext *ui_context); + +// return the current state of the item. This state is only valid after +// a call to uiProcess(). +// The returned value is one of UI_COLD, UI_HOT, UI_ACTIVE, UI_FROZEN. +OUI_EXPORT UIitemState uiGetState(UIcontext *ui_context, int item); + +// return the application-dependent handle of the item as passed to uiSetHandle() +// or uiAllocHandle(). +OUI_EXPORT void *uiGetHandle(UIcontext *ui_context, int item); + +// return the item that is currently under the cursor or -1 for none +OUI_EXPORT int uiGetHotItem(UIcontext *ui_context); + +// return the item that is currently focused or -1 for none +OUI_EXPORT int uiGetFocusedItem(UIcontext *ui_context); + +// returns the topmost item containing absolute location (x,y), starting with +// item as parent, using a set of flags and masks as filter: +// if both flags and mask are UI_ANY, the first topmost item is returned. +// if mask is UI_ANY, the first topmost item matching *any* of flags is returned. +// otherwise the first item matching (item.flags & flags) == mask is returned. +// you may combine box, layout, event and user flags. +// frozen items will always be ignored. +OUI_EXPORT int uiFindItem(UIcontext *ui_context, int item, int x, int y, + unsigned int flags, unsigned int mask); + +// return the handler callback as passed to uiSetHandler() +OUI_EXPORT UIhandler uiGetHandler(UIcontext *ui_context); +// return the event flags for an item as passed to uiSetEvents() +OUI_EXPORT unsigned int uiGetEvents(UIcontext *ui_context, int item); +// return the user-defined flags for an item as passed to uiSetFlags() +OUI_EXPORT unsigned int uiGetFlags(UIcontext *ui_context, int item); + +// when handling a KEY_DOWN/KEY_UP event: the key that triggered this event +OUI_EXPORT unsigned int uiGetKey(UIcontext *ui_context); +// when handling a keyboard or mouse event: the active modifier keys +OUI_EXPORT unsigned int uiGetModifier(UIcontext *ui_context); + +// returns the items layout rectangle in absolute coordinates. If +// uiGetRect() is called before uiEndLayout(), the values of the returned +// rectangle are undefined. +OUI_EXPORT UIrect uiGetRect(UIcontext *ui_context, int item); + +// returns 1 if an items absolute rectangle contains a given coordinate +// otherwise 0 +OUI_EXPORT int uiContains(UIcontext *ui_context, int item, int x, int y); + +// return the width of the item as set by uiSetSize() +OUI_EXPORT int uiGetWidth(UIcontext *ui_context, int item); +// return the height of the item as set by uiSetSize() +OUI_EXPORT int uiGetHeight(UIcontext *ui_context, int item); + +// return the anchoring behavior as set by uiSetLayout() +OUI_EXPORT unsigned int uiGetLayout(UIcontext *ui_context, int item); +// return the box model as set by uiSetBox() +OUI_EXPORT unsigned int uiGetBox(UIcontext *ui_context, int item); + +// return the left margin of the item as set with uiSetMargins() +OUI_EXPORT short uiGetMarginLeft(UIcontext *ui_context, int item); +// return the top margin of the item as set with uiSetMargins() +OUI_EXPORT short uiGetMarginTop(UIcontext *ui_context, int item); +// return the right margin of the item as set with uiSetMargins() +OUI_EXPORT short uiGetMarginRight(UIcontext *ui_context, int item); +// return the bottom margin of the item as set with uiSetMargins() +OUI_EXPORT short uiGetMarginDown(UIcontext *ui_context, int item); + +// when uiBeginLayout() is called, the most recently declared items are retained. +// when uiEndLayout() completes, it matches the old item hierarchy to the new one +// and attempts to map old items to new items as well as possible. +// when passed an item Id from the previous frame, uiRecoverItem() returns the +// items new assumed Id, or -1 if the item could not be mapped. +// it is valid to pass -1 as item. +OUI_EXPORT int uiRecoverItem(UIcontext *ui_context, int olditem); + +// in cases where it is important to recover old state over changes in +// the view, and the built-in remapping fails, the UI declaration can manually +// remap old items to new IDs in cases where e.g. the previous item ID has been +// temporarily saved; uiRemapItem() would then be called after creating the +// new item using uiItem(). +OUI_EXPORT void uiRemapItem(UIcontext *ui_context, int olditem, int newitem); + +// returns the number if items that have been allocated in the last frame +OUI_EXPORT int uiGetLastItemCount(UIcontext *ui_context); + +#ifdef __cplusplus +}; +#endif + +#endif // _OUI_H_ + +#ifdef OUI_IMPLEMENTATION + +#include + +#ifdef _MSC_VER + #pragma warning (disable: 4996) // Switch off security warnings + #pragma warning (disable: 4100) // Switch off unreferenced formal parameter warnings + #pragma warning (disable: 4244) + #pragma warning (disable: 4305) + + #ifdef __cplusplus + #define UI_INLINE inline + #else + #define UI_INLINE + #endif +#else + #ifdef __clang__ + #define UI_INLINE static inline + #else + #define UI_INLINE inline + #endif +#endif + +#define UI_MAX_KIND 16 + +#define UI_ANY_BUTTON0_INPUT (UI_BUTTON0_DOWN \ + |UI_BUTTON0_UP \ + |UI_BUTTON0_HOT_UP \ + |UI_BUTTON0_CAPTURE) + +#define UI_ANY_BUTTON2_INPUT (UI_BUTTON2_DOWN) + +#define UI_ANY_MOUSE_INPUT (UI_ANY_BUTTON0_INPUT \ + |UI_ANY_BUTTON2_INPUT) + +#define UI_ANY_KEY_INPUT (UI_KEY_DOWN \ + |UI_KEY_UP \ + |UI_CHAR) + +#define UI_ANY_INPUT (UI_ANY_MOUSE_INPUT \ + |UI_ANY_KEY_INPUT) + +enum { + // extra item flags + + // bit 0-2 + UI_ITEM_BOX_MODEL_MASK = 0x000007, + // bit 0-4 + UI_ITEM_BOX_MASK = 0x00001F, + // bit 5-8 + UI_ITEM_LAYOUT_MASK = 0x0003E0, + // bit 9-18 + UI_ITEM_EVENT_MASK = 0x07FC00, + // item is frozen (bit 19) + UI_ITEM_FROZEN = 0x080000, + // item handle is pointer to data (bit 20) + UI_ITEM_DATA = 0x100000, + // item has been inserted (bit 21) + UI_ITEM_INSERTED = 0x200000, + // horizontal size has been explicitly set (bit 22) + UI_ITEM_HFIXED = 0x400000, + // vertical size has been explicitly set (bit 23) + UI_ITEM_VFIXED = 0x800000, + // bit 22-23 + UI_ITEM_FIXED_MASK = 0xC00000, + + // which flag bits will be compared + UI_ITEM_COMPARE_MASK = UI_ITEM_BOX_MODEL_MASK + | (UI_ITEM_LAYOUT_MASK & ~UI_BREAK) + | UI_ITEM_EVENT_MASK + | UI_USERMASK, +}; + +typedef struct UIitem { + // data handle + void *handle; + + // about 27 bits worth of flags + unsigned int flags; + + // index of first kid + // if old item: index of equivalent new item + int firstkid; + // index of next sibling with same parent + int nextitem; + + // margin offsets, interpretation depends on flags + // after layouting, the first two components are absolute coordinates + short margins[4]; + // size + short size[2]; +} UIitem; + +typedef enum UIstate { + UI_STATE_IDLE = 0, + UI_STATE_CAPTURE, +} UIstate; + +typedef enum UIstage { + UI_STAGE_LAYOUT = 0, + UI_STAGE_POST_LAYOUT, + UI_STAGE_PROCESS, +} UIstage; + +typedef struct UIhandleEntry { + unsigned int key; + int item; +} UIhandleEntry; + +typedef struct UIinputEvent { + unsigned int key; + unsigned int mod; + UIevent event; +} UIinputEvent; + +struct UIcontext { + unsigned int item_capacity; + unsigned int buffer_capacity; + + // handler + UIhandler handler; + // User data + void *handle; + + // button state in this frame + unsigned long long buttons; + // button state in the previous frame + unsigned long long last_buttons; + + // where the cursor was at the beginning of the active state + UIvec2 start_cursor; + // where the cursor was last frame + UIvec2 last_cursor; + // where the cursor is currently + UIvec2 cursor; + // accumulated scroll wheel offsets + UIvec2 scroll; + + int active_item; + int focus_item; + int last_hot_item; + int last_click_item; + int hot_item; + + UIstate state; + UIstage stage; + unsigned int active_key; + unsigned int active_modifier; + unsigned int active_button_modifier; + int last_timestamp; + int last_click_timestamp; + int clicks; + + int count; + int last_count; + int eventcount; + unsigned int datasize; + + UIitem *items; + unsigned char *data; + UIitem *last_items; + int *item_map; + UIinputEvent events[UI_MAX_INPUT_EVENTS]; +}; + +UI_INLINE int ui_max(int a, int b) { + return (a>b)?a:b; +} + +UI_INLINE int ui_min(int a, int b) { + return (ab)?a:b; +} + +UI_INLINE float ui_minf(float a, float b) { + return (alast_count = ui_context->count; + ui_context->count = 0; + ui_context->datasize = 0; + ui_context->hot_item = -1; + // swap buffers + UIitem *items = ui_context->items; + ui_context->items = ui_context->last_items; + ui_context->last_items = items; + for (i = 0; i < ui_context->last_count; ++i) { + ui_context->item_map[i] = -1; + } +} + +static UIcontext *uiInitializeContext( + UIcontext *ctx, + unsigned int item_capacity, + unsigned int buffer_capacity) { + memset(ctx, 0, sizeof(UIcontext)); + ctx->item_capacity = item_capacity; + ctx->buffer_capacity = buffer_capacity; + ctx->stage = UI_STAGE_PROCESS; + ctx->items = (UIitem *)malloc(sizeof(UIitem) * item_capacity); + ctx->last_items = (UIitem *)malloc(sizeof(UIitem) * item_capacity); + ctx->item_map = (int *)malloc(sizeof(int) * item_capacity); + if (buffer_capacity) { + ctx->data = (unsigned char *)malloc(buffer_capacity); + } + return ctx; +} + +UIcontext *uiCreateContext( + unsigned int item_capacity, + unsigned int buffer_capacity) { + assert(item_capacity); + UIcontext *ctx = (UIcontext *)malloc(sizeof(UIcontext)); + uiInitializeContext(ctx, item_capacity, buffer_capacity); + uiClear(ctx); + uiClearState(ctx); + return ctx; +} + +void uiDestroyContext(UIcontext *ctx) { + free(ctx->items); + free(ctx->last_items); + free(ctx->item_map); + free(ctx->data); + free(ctx); +} + +void uiSetContextHandle(UIcontext *ui_context, void *handle) { + assert(ui_context); + ui_context->handle = handle; +} + +void *uiGetContextHandle(UIcontext *ui_context) { + assert(ui_context); + return ui_context->handle; +} + + +void uiSetButton(UIcontext *ui_context, unsigned int button, unsigned int mod, bool enabled) { + assert(ui_context); + unsigned long long mask = 1ull<buttons = (enabled)? + (ui_context->buttons | mask): + (ui_context->buttons & ~mask); + ui_context->active_button_modifier = mod; +} + +static void uiAddInputEvent(UIcontext *ui_context, UIinputEvent event) { + assert(ui_context); + if (ui_context->eventcount == UI_MAX_INPUT_EVENTS) return; + ui_context->events[ui_context->eventcount++] = event; +} + +static void uiClearInputEvents(UIcontext *ui_context) { + assert(ui_context); + ui_context->eventcount = 0; + ui_context->scroll.x = 0; + ui_context->scroll.y = 0; +} + +void uiSetKey(UIcontext *ui_context, unsigned int key, unsigned int mod, bool enabled) { + assert(ui_context); + UIinputEvent event = { key, mod, enabled?UI_KEY_DOWN:UI_KEY_UP }; + uiAddInputEvent(ui_context, event); +} + +void uiSetChar(UIcontext *ui_context, unsigned int value) { + assert(ui_context); + UIinputEvent event = { value, 0, UI_CHAR }; + uiAddInputEvent(ui_context, event); +} + +void uiSetScroll(UIcontext *ui_context, int x, int y) { + assert(ui_context); + ui_context->scroll.x += x; + ui_context->scroll.y += y; +} + +UIvec2 uiGetScroll(UIcontext *ui_context) { + assert(ui_context); + return ui_context->scroll; +} + +int uiGetLastButton(UIcontext *ui_context, unsigned int button) { + assert(ui_context); + return (ui_context->last_buttons & (1ull<buttons & (1ull<cursor.x = x; + ui_context->cursor.y = y; +} + +UIvec2 uiGetCursor(UIcontext *ui_context) { + assert(ui_context); + return ui_context->cursor; +} + +UIvec2 uiGetCursorStart(UIcontext *ui_context) { + assert(ui_context); + return ui_context->start_cursor; +} + +UIvec2 uiGetCursorDelta(UIcontext *ui_context) { + assert(ui_context); + UIvec2 result = {{{ + ui_context->cursor.x - ui_context->last_cursor.x, + ui_context->cursor.y - ui_context->last_cursor.y + }}}; + return result; +} + +UIvec2 uiGetCursorStartDelta(UIcontext *ui_context) { + assert(ui_context); + UIvec2 result = {{{ + ui_context->cursor.x - ui_context->start_cursor.x, + ui_context->cursor.y - ui_context->start_cursor.y + }}}; + return result; +} + +unsigned int uiGetKey(UIcontext *ui_context) { + assert(ui_context); + return ui_context->active_key; +} + +unsigned int uiGetModifier(UIcontext *ui_context) { + assert(ui_context); + return ui_context->active_modifier; +} + +int uiGetItemCount(UIcontext *ui_context) { + assert(ui_context); + return ui_context->count; +} + +int uiGetLastItemCount(UIcontext *ui_context) { + assert(ui_context); + return ui_context->last_count; +} + +unsigned int uiGetAllocSize(UIcontext *ui_context) { + assert(ui_context); + return ui_context->datasize; +} + +UIitem *uiItemPtr(UIcontext *ui_context, int item) { + assert(ui_context && (item >= 0) && (item < ui_context->count)); + return ui_context->items + item; +} + +UIitem *uiLastItemPtr(UIcontext *ui_context, int item) { + assert(ui_context && (item >= 0) && (item < ui_context->last_count)); + return ui_context->last_items + item; +} + +int uiGetHotItem(UIcontext *ui_context) { + assert(ui_context); + return ui_context->hot_item; +} + +void uiFocus(UIcontext *ui_context, int item) { + assert(ui_context && (item >= -1) && (item < ui_context->count)); + assert(ui_context->stage != UI_STAGE_LAYOUT); + ui_context->focus_item = item; +} + +static void uiValidateStateItems(UIcontext *ui_context) { + assert(ui_context); + ui_context->last_hot_item = uiRecoverItem(ui_context, ui_context->last_hot_item); + ui_context->active_item = uiRecoverItem(ui_context, ui_context->active_item); + ui_context->focus_item = uiRecoverItem(ui_context, ui_context->focus_item); + ui_context->last_click_item = uiRecoverItem(ui_context, ui_context->last_click_item); +} + +int uiGetFocusedItem(UIcontext *ui_context) { + assert(ui_context); + return ui_context->focus_item; +} + + +void uiBeginLayout(UIcontext *ui_context) { + assert(ui_context); + assert(ui_context->stage == UI_STAGE_PROCESS); // must run uiEndLayout(), uiProcess() first + uiClear(ui_context); + ui_context->stage = UI_STAGE_LAYOUT; +} + +void uiClearState(UIcontext *ui_context) { + assert(ui_context); + ui_context->last_hot_item = -1; + ui_context->active_item = -1; + ui_context->focus_item = -1; + ui_context->last_click_item = -1; +} + +int uiItem(UIcontext *ui_context) { + assert(ui_context); + assert(ui_context->stage == UI_STAGE_LAYOUT); // must run between uiBeginLayout() and uiEndLayout() + assert(ui_context->count < (int)ui_context->item_capacity); + int idx = ui_context->count++; + UIitem *item = uiItemPtr(ui_context, idx); + memset(item, 0, sizeof(UIitem)); + item->firstkid = -1; + item->nextitem = -1; + return idx; +} + +void uiNotifyItem(UIcontext *ui_context, int item, UIevent event) { + assert(ui_context); + if (!ui_context->handler) + return; + assert((event & UI_ITEM_EVENT_MASK) == event); + UIitem *pitem = uiItemPtr(ui_context, item); + if (pitem->flags & event) { + ui_context->handler(ui_context, item, event); + } +} + +UI_INLINE int uiLastChild(UIcontext *ui_context, int item) { + item = uiFirstChild(ui_context, item); + if (item < 0) + return -1; + while (true) { + int nextitem = uiNextSibling(ui_context, item); + if (nextitem < 0) + return item; + item = nextitem; + } +} + +int uiAppend(UIcontext *ui_context, int item, int sibling) { + assert(sibling > 0); + UIitem *pitem = uiItemPtr(ui_context, item); + UIitem *psibling = uiItemPtr(ui_context, sibling); + assert(!(psibling->flags & UI_ITEM_INSERTED)); + psibling->nextitem = pitem->nextitem; + psibling->flags |= UI_ITEM_INSERTED; + pitem->nextitem = sibling; + return sibling; +} + +int uiInsert(UIcontext *ui_context, int item, int child) { + assert(child > 0); + UIitem *pparent = uiItemPtr(ui_context, item); + UIitem *pchild = uiItemPtr(ui_context, child); + assert(!(pchild->flags & UI_ITEM_INSERTED)); + if (pparent->firstkid < 0) { + pparent->firstkid = child; + pchild->flags |= UI_ITEM_INSERTED; + } else { + uiAppend(ui_context, uiLastChild(ui_context, item), child); + } + return child; +} + +int uiInsertFront(UIcontext *ui_context, int item, int child) { + return uiInsert(ui_context, item, child); +} + +int uiInsertBack(UIcontext *ui_context, int item, int child) { + assert(child > 0); + UIitem *pparent = uiItemPtr(ui_context, item); + UIitem *pchild = uiItemPtr(ui_context, child); + assert(!(pchild->flags & UI_ITEM_INSERTED)); + pchild->nextitem = pparent->firstkid; + pparent->firstkid = child; + pchild->flags |= UI_ITEM_INSERTED; + return child; +} + +void uiSetFrozen(UIcontext *ui_context, int item, bool enable) { + UIitem *pitem = uiItemPtr(ui_context, item); + if (enable) + pitem->flags |= UI_ITEM_FROZEN; + else + pitem->flags &= ~UI_ITEM_FROZEN; +} + +void uiSetSize(UIcontext *ui_context, int item, int w, int h) { + UIitem *pitem = uiItemPtr(ui_context, item); + pitem->size[0] = w; + pitem->size[1] = h; + if (!w) + pitem->flags &= ~UI_ITEM_HFIXED; + else + pitem->flags |= UI_ITEM_HFIXED; + if (!h) + pitem->flags &= ~UI_ITEM_VFIXED; + else + pitem->flags |= UI_ITEM_VFIXED; +} + +int uiGetWidth(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->size[0]; +} + +int uiGetHeight(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->size[1]; +} + +void uiSetLayout(UIcontext *ui_context, int item, unsigned int flags) { + UIitem *pitem = uiItemPtr(ui_context, item); + assert((flags & UI_ITEM_LAYOUT_MASK) == (unsigned int)flags); + pitem->flags &= ~UI_ITEM_LAYOUT_MASK; + pitem->flags |= flags & UI_ITEM_LAYOUT_MASK; +} + +unsigned int uiGetLayout(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->flags & UI_ITEM_LAYOUT_MASK; +} + +void uiSetBox(UIcontext *ui_context, int item, unsigned int flags) { + UIitem *pitem = uiItemPtr(ui_context, item); + assert((flags & UI_ITEM_BOX_MASK) == (unsigned int)flags); + pitem->flags &= ~UI_ITEM_BOX_MASK; + pitem->flags |= flags & UI_ITEM_BOX_MASK; +} + +unsigned int uiGetBox(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->flags & UI_ITEM_BOX_MASK; +} + +void uiSetMargins(UIcontext *ui_context, int item, short l, short t, short r, short b) { + UIitem *pitem = uiItemPtr(ui_context, item); + pitem->margins[0] = l; + pitem->margins[1] = t; + pitem->margins[2] = r; + pitem->margins[3] = b; +} + +short uiGetMarginLeft(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->margins[0]; +} +short uiGetMarginTop(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->margins[1]; +} +short uiGetMarginRight(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->margins[2]; +} +short uiGetMarginDown(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->margins[3]; +} + +// compute bounding box of all items super-imposed +UI_INLINE void uiComputeImposedSize(UIcontext *ui_context, UIitem *pitem, int dim) { + int wdim = dim+2; + // largest size is required size + short need_size = 0; + int kid = pitem->firstkid; + while (kid >= 0) { + UIitem *pkid = uiItemPtr(ui_context, kid); + + // width = start margin + calculated width + end margin + int kidsize = pkid->margins[dim] + pkid->size[dim] + pkid->margins[wdim]; + need_size = ui_max(need_size, kidsize); + kid = uiNextSibling(ui_context, kid); + } + pitem->size[dim] = need_size; +} + +// compute bounding box of all items stacked +UI_INLINE void uiComputeStackedSize(UIcontext *ui_context, UIitem *pitem, int dim) { + int wdim = dim+2; + short need_size = 0; + int kid = pitem->firstkid; + while (kid >= 0) { + UIitem *pkid = uiItemPtr(ui_context, kid); + // width += start margin + calculated width + end margin + need_size += pkid->margins[dim] + pkid->size[dim] + pkid->margins[wdim]; + kid = uiNextSibling(ui_context, kid); + } + pitem->size[dim] = need_size; +} + +// compute bounding box of all items stacked, repeating when breaking +UI_INLINE void uiComputeWrappedStackedSize(UIcontext *ui_context, UIitem *pitem, int dim) { + int wdim = dim+2; + + short need_size = 0; + short need_size2 = 0; + int kid = pitem->firstkid; + while (kid >= 0) { + UIitem *pkid = uiItemPtr(ui_context, kid); + + // if next position moved back, we assume a new line + if (pkid->flags & UI_BREAK) { + need_size2 = ui_max(need_size2, need_size); + // newline + need_size = 0; + } + + // width = start margin + calculated width + end margin + need_size += pkid->margins[dim] + pkid->size[dim] + pkid->margins[wdim]; + kid = uiNextSibling(ui_context, kid); + } + pitem->size[dim] = ui_max(need_size2, need_size); +} + +// compute bounding box of all items stacked + wrapped +UI_INLINE void uiComputeWrappedSize(UIcontext *ui_context, UIitem *pitem, int dim) { + int wdim = dim+2; + + short need_size = 0; + short need_size2 = 0; + int kid = pitem->firstkid; + while (kid >= 0) { + UIitem *pkid = uiItemPtr(ui_context, kid); + + // if next position moved back, we assume a new line + if (pkid->flags & UI_BREAK) { + need_size2 += need_size; + // newline + need_size = 0; + } + + // width = start margin + calculated width + end margin + int kidsize = pkid->margins[dim] + pkid->size[dim] + pkid->margins[wdim]; + need_size = ui_max(need_size, kidsize); + kid = uiNextSibling(ui_context, kid); + } + pitem->size[dim] = need_size2 + need_size; +} + +static void uiComputeSize(UIcontext *ui_context, int item, int dim) { + UIitem *pitem = uiItemPtr(ui_context, item); + + // children expand the size + int kid = pitem->firstkid; + while (kid >= 0) { + uiComputeSize(ui_context, kid, dim); + kid = uiNextSibling(ui_context, kid); + } + + if (pitem->size[dim]) + return; + switch(pitem->flags & UI_ITEM_BOX_MODEL_MASK) { + case UI_COLUMN|UI_WRAP: { + // flex model + if (dim) // direction + uiComputeStackedSize(ui_context, pitem, 1); + else + uiComputeImposedSize(ui_context, pitem, 0); + } break; + case UI_ROW|UI_WRAP: { + // flex model + if (!dim) // direction + uiComputeWrappedStackedSize(ui_context, pitem, 0); + else + uiComputeWrappedSize(ui_context, pitem, 1); + } break; + case UI_COLUMN: + case UI_ROW: { + // flex model + if ((pitem->flags & 1) == (unsigned int)dim) // direction + uiComputeStackedSize(ui_context, pitem, dim); + else + uiComputeImposedSize(ui_context, pitem, dim); + } break; + default: { + // layout model + uiComputeImposedSize(ui_context, pitem, dim); + } break; + } +} + +// stack all items according to their alignment +UI_INLINE void uiArrangeStacked(UIcontext *ui_context, UIitem *pitem, int dim, bool wrap) { + int wdim = dim+2; + + short space = pitem->size[dim]; + float max_x2 = (float)pitem->margins[dim] + (float)space; + + int start_kid = pitem->firstkid; + while (start_kid >= 0) { + short used = 0; + + int count = 0; // count of fillers + int squeezed_count = 0; // count of squeezable elements + int total = 0; + bool hardbreak = false; + // first pass: count items that need to be expanded, + // and the space that is used + int kid = start_kid; + int end_kid = -1; + while (kid >= 0) { + UIitem *pkid = uiItemPtr(ui_context, kid); + int flags = (pkid->flags & UI_ITEM_LAYOUT_MASK) >> dim; + int fflags = (pkid->flags & UI_ITEM_FIXED_MASK) >> dim; + short extend = used; + if ((flags & UI_HFILL) == UI_HFILL) { // grow + count++; + extend += pkid->margins[dim] + pkid->margins[wdim]; + } else { + if ((fflags & UI_ITEM_HFIXED) != UI_ITEM_HFIXED) + squeezed_count++; + extend += pkid->margins[dim] + pkid->size[dim] + pkid->margins[wdim]; + } + // wrap on end of line or manual flag + if (wrap && (total && ((extend > space) || (pkid->flags & UI_BREAK)))) { + end_kid = kid; + hardbreak = ((pkid->flags & UI_BREAK) == UI_BREAK); + // add marker for subsequent queries + pkid->flags |= UI_BREAK; + break; + } else { + used = extend; + kid = uiNextSibling(ui_context, kid); + } + total++; + } + + int extra_space = space - used; + float filler = 0.0f; + float spacer = 0.0f; + float extra_margin = 0.0f; + float eater = 0.0f; + + if (extra_space > 0) { + if (count) { + filler = (float)extra_space / (float)count; + } else if (total) { + switch(pitem->flags & UI_JUSTIFY) { + default: { + extra_margin = extra_space / 2.0f; + } break; + case UI_JUSTIFY: { + // justify when not wrapping or not in last line, + // or not manually breaking + if (!wrap || ((end_kid != -1) && !hardbreak)) + spacer = (float)extra_space / (float)(total-1); + } break; + case UI_START: { + } break; + case UI_END: { + extra_margin = extra_space; + } break; + } + } + } else if (!wrap && (extra_space < 0)) { + eater = (float)extra_space / (float)squeezed_count; + } + + // distribute width among items + float x = (float)pitem->margins[dim]; + float x1; + // second pass: distribute and rescale + kid = start_kid; + while (kid != end_kid) { + short ix0,ix1; + UIitem *pkid = uiItemPtr(ui_context, kid); + int flags = (pkid->flags & UI_ITEM_LAYOUT_MASK) >> dim; + int fflags = (pkid->flags & UI_ITEM_FIXED_MASK) >> dim; + + x += (float)pkid->margins[dim] + extra_margin; + if ((flags & UI_HFILL) == UI_HFILL) { // grow + x1 = x+filler; + } else if ((fflags & UI_ITEM_HFIXED) == UI_ITEM_HFIXED) { + x1 = x+(float)pkid->size[dim]; + } else { + // squeeze + x1 = x+ui_maxf(0.0f,(float)pkid->size[dim]+eater); + } + ix0 = (short)x; + if (wrap) + ix1 = (short)ui_minf(max_x2-(float)pkid->margins[wdim], x1); + else + ix1 = (short)x1; + pkid->margins[dim] = ix0; + pkid->size[dim] = ix1-ix0; + x = x1 + (float)pkid->margins[wdim]; + + kid = uiNextSibling(ui_context, kid); + extra_margin = spacer; + } + + start_kid = end_kid; + } +} + +// superimpose all items according to their alignment +UI_INLINE void uiArrangeImposedRange(UIcontext *ui_context, UIitem *pitem, int dim, + int start_kid, int end_kid, short offset, short space) { + int wdim = dim+2; + + int kid = start_kid; + while (kid != end_kid) { + UIitem *pkid = uiItemPtr(ui_context, kid); + + int flags = (pkid->flags & UI_ITEM_LAYOUT_MASK) >> dim; + + switch(flags & UI_HFILL) { + default: break; + case UI_HCENTER: { + pkid->margins[dim] += (space-pkid->size[dim])/2 - pkid->margins[wdim]; + } break; + case UI_RIGHT: { + pkid->margins[dim] = space-pkid->size[dim]-pkid->margins[wdim]; + } break; + case UI_HFILL: { + pkid->size[dim] = ui_max(0,space-pkid->margins[dim]-pkid->margins[wdim]); + } break; + } + pkid->margins[dim] += offset; + + kid = uiNextSibling(ui_context, kid); + } +} + +UI_INLINE void uiArrangeImposed(UIcontext *ui_context, UIitem *pitem, int dim) { + uiArrangeImposedRange(ui_context, pitem, dim, pitem->firstkid, -1, pitem->margins[dim], pitem->size[dim]); +} + +// superimpose all items according to their alignment, +// squeeze items that expand the available space +UI_INLINE void uiArrangeImposedSqueezedRange(UIcontext *ui_context, UIitem *pitem, int dim, + int start_kid, int end_kid, short offset, short space) { + int wdim = dim+2; + + int kid = start_kid; + while (kid != end_kid) { + UIitem *pkid = uiItemPtr(ui_context, kid); + + int flags = (pkid->flags & UI_ITEM_LAYOUT_MASK) >> dim; + + short min_size = ui_max(0,space-pkid->margins[dim]-pkid->margins[wdim]); + switch(flags & UI_HFILL) { + default: { + pkid->size[dim] = ui_min(pkid->size[dim], min_size); + } break; + case UI_HCENTER: { + pkid->size[dim] = ui_min(pkid->size[dim], min_size); + pkid->margins[dim] += (space-pkid->size[dim])/2 - pkid->margins[wdim]; + } break; + case UI_RIGHT: { + pkid->size[dim] = ui_min(pkid->size[dim], min_size); + pkid->margins[dim] = space-pkid->size[dim]-pkid->margins[wdim]; + } break; + case UI_HFILL: { + pkid->size[dim] = min_size; + } break; + } + pkid->margins[dim] += offset; + + kid = uiNextSibling(ui_context, kid); + } +} + +UI_INLINE void uiArrangeImposedSqueezed(UIcontext *ui_context, UIitem *pitem, int dim) { + uiArrangeImposedSqueezedRange(ui_context, pitem, dim, pitem->firstkid, -1, pitem->margins[dim], pitem->size[dim]); +} + +// superimpose all items according to their alignment +UI_INLINE short uiArrangeWrappedImposedSqueezed(UIcontext *ui_context, UIitem *pitem, int dim) { + int wdim = dim+2; + + short offset = pitem->margins[dim]; + + short need_size = 0; + int kid = pitem->firstkid; + int start_kid = kid; + while (kid >= 0) { + UIitem *pkid = uiItemPtr(ui_context, kid); + + if (pkid->flags & UI_BREAK) { + uiArrangeImposedSqueezedRange(ui_context, pitem, dim, start_kid, kid, offset, need_size); + offset += need_size; + start_kid = kid; + // newline + need_size = 0; + } + + // width = start margin + calculated width + end margin + int kidsize = pkid->margins[dim] + pkid->size[dim] + pkid->margins[wdim]; + need_size = ui_max(need_size, kidsize); + kid = uiNextSibling(ui_context, kid); + } + + uiArrangeImposedSqueezedRange(ui_context, pitem, dim, start_kid, -1, offset, need_size); + offset += need_size; + return offset; +} + +static void uiArrange(UIcontext *ui_context, int item, int dim) { + UIitem *pitem = uiItemPtr(ui_context, item); + + switch(pitem->flags & UI_ITEM_BOX_MODEL_MASK) { + case UI_COLUMN|UI_WRAP: { + // flex model, wrapping + if (dim) { // direction + uiArrangeStacked(ui_context, pitem, 1, true); + // this retroactive resize will not effect parent widths + short offset = uiArrangeWrappedImposedSqueezed(ui_context, pitem, 0); + pitem->size[0] = offset - pitem->margins[0]; + } + } break; + case UI_ROW|UI_WRAP: { + // flex model, wrapping + if (!dim) { // direction + uiArrangeStacked(ui_context, pitem, 0, true); + } else { + uiArrangeWrappedImposedSqueezed(ui_context, pitem, 1); + } + } break; + case UI_COLUMN: + case UI_ROW: { + // flex model + if ((pitem->flags & 1) == (unsigned int)dim) // direction + uiArrangeStacked(ui_context, pitem, dim, false); + else + uiArrangeImposedSqueezed(ui_context, pitem, dim); + } break; + default: { + // layout model + uiArrangeImposed(ui_context, pitem, dim); + } break; + } + + int kid = uiFirstChild(ui_context, item); + while (kid >= 0) { + uiArrange(ui_context, kid, dim); + kid = uiNextSibling(ui_context, kid); + } +} + +UI_INLINE bool uiCompareItems(UIcontext *ui_context, UIitem *item1, UIitem *item2) { + return ((item1->flags & UI_ITEM_COMPARE_MASK) == (item2->flags & UI_ITEM_COMPARE_MASK)); + +} + +static bool uiMapItems(UIcontext *ui_context, int item1, int item2) { + UIitem *pitem1 = uiLastItemPtr(ui_context, item1); + if (item2 == -1) { + return false; + } + + UIitem *pitem2 = uiItemPtr(ui_context, item2); + if (!uiCompareItems(ui_context, pitem1, pitem2)) { + return false; + } + + int count = 0; + int failed = 0; + int kid1 = pitem1->firstkid; + int kid2 = pitem2->firstkid; + while (kid1 != -1) { + UIitem *pkid1 = uiLastItemPtr(ui_context, kid1); + count++; + if (!uiMapItems(ui_context, kid1, kid2)) { + failed = count; + break; + } + kid1 = pkid1->nextitem; + if (kid2 != -1) { + kid2 = uiItemPtr(ui_context, kid2)->nextitem; + } + } + + if (count && (failed == 1)) { + return false; + } + + ui_context->item_map[item1] = item2; + return true; +} + +int uiRecoverItem(UIcontext *ui_context, int olditem) { + assert(ui_context); + assert((olditem >= -1) && (olditem < ui_context->last_count)); + if (olditem == -1) return -1; + return ui_context->item_map[olditem]; +} + +void uiRemapItem(UIcontext *ui_context, int olditem, int newitem) { + assert(ui_context); + assert((olditem >= 0) && (olditem < ui_context->last_count)); + assert((newitem >= -1) && (newitem < ui_context->count)); + ui_context->item_map[olditem] = newitem; +} + +void uiEndLayout(UIcontext *ui_context) { + assert(ui_context); + assert(ui_context->stage == UI_STAGE_LAYOUT); // must run uiBeginLayout() first + + if (ui_context->count) { + uiComputeSize(ui_context, 0, 0); + uiArrange(ui_context, 0, 0); + uiComputeSize(ui_context, 0, 1); + uiArrange(ui_context, 0, 1); + + if (ui_context->last_count) { + // map old item id to new item id + uiMapItems(ui_context, 0, 0); + } + } + + uiValidateStateItems(ui_context); + if (ui_context->count) { + // drawing routines may require this to be set already + uiUpdateHotItem(ui_context); + } + + ui_context->stage = UI_STAGE_POST_LAYOUT; +} + +UIrect uiGetRect(UIcontext *ui_context, int item) { + UIitem *pitem = uiItemPtr(ui_context, item); + UIrect rc = {{{ + pitem->margins[0], pitem->margins[1], + pitem->size[0], pitem->size[1] + }}}; + return rc; +} + +int uiFirstChild(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->firstkid; +} + +int uiNextSibling(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->nextitem; +} + +void *uiAllocHandle(UIcontext *ui_context, int item, unsigned int size) { + assert((size > 0) && (size < UI_MAX_DATASIZE)); + UIitem *pitem = uiItemPtr(ui_context, item); + assert(pitem->handle == NULL); + assert((ui_context->datasize+size) <= ui_context->buffer_capacity); + pitem->handle = ui_context->data + ui_context->datasize; + pitem->flags |= UI_ITEM_DATA; + ui_context->datasize += size; + return pitem->handle; +} + +void uiSetHandle(UIcontext *ui_context, int item, void *handle) { + UIitem *pitem = uiItemPtr(ui_context, item); + assert(pitem->handle == NULL); + pitem->handle = handle; +} + +void *uiGetHandle(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->handle; +} + +void uiSetHandler(UIcontext *ui_context, UIhandler handler) { + assert(ui_context); + ui_context->handler = handler; +} + +UIhandler uiGetHandler(UIcontext *ui_context) { + assert(ui_context); + return ui_context->handler; +} + +void uiSetEvents(UIcontext *ui_context, int item, unsigned int flags) { + UIitem *pitem = uiItemPtr(ui_context, item); + pitem->flags &= ~UI_ITEM_EVENT_MASK; + pitem->flags |= flags & UI_ITEM_EVENT_MASK; +} + +unsigned int uiGetEvents(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->flags & UI_ITEM_EVENT_MASK; +} + +void uiSetFlags(UIcontext *ui_context, int item, unsigned int flags) { + UIitem *pitem = uiItemPtr(ui_context, item); + pitem->flags &= ~UI_USERMASK; + pitem->flags |= flags & UI_USERMASK; +} + +unsigned int uiGetFlags(UIcontext *ui_context, int item) { + return uiItemPtr(ui_context, item)->flags & UI_USERMASK; +} + +int uiContains(UIcontext *ui_context, int item, int x, int y) { + UIrect rect = uiGetRect(ui_context, item); + x -= rect.x; + y -= rect.y; + if ((x>=0) + && (y>=0) + && (xflags & UI_ITEM_FROZEN) return -1; + if (uiContains(ui_context, item, x, y)) { + int best_hit = -1; + int kid = uiFirstChild(ui_context, item); + while (kid >= 0) { + int hit = uiFindItem(ui_context, kid, x, y, flags, mask); + if (hit >= 0) { + best_hit = hit; + } + kid = uiNextSibling(ui_context, kid); + } + if (best_hit >= 0) { + return best_hit; + } + if (((mask == UI_ANY) && ((flags == UI_ANY) + || (pitem->flags & flags))) + || ((pitem->flags & flags) == mask)) { + return item; + } + } + return -1; +} + +void uiUpdateHotItem(UIcontext *ui_context) { + assert(ui_context); + if (!ui_context->count) return; + ui_context->hot_item = uiFindItem(ui_context, 0, + ui_context->cursor.x, ui_context->cursor.y, + UI_ANY_MOUSE_INPUT, UI_ANY); +} + +int uiGetClicks(UIcontext *ui_context) { + return ui_context->clicks; +} + +void uiProcess(UIcontext *ui_context, int timestamp) { + assert(ui_context); + + assert(ui_context->stage != UI_STAGE_LAYOUT); // must run uiBeginLayout(), uiEndLayout() first + + if (ui_context->stage == UI_STAGE_PROCESS) { + uiUpdateHotItem(ui_context); + } + ui_context->stage = UI_STAGE_PROCESS; + + if (!ui_context->count) { + uiClearInputEvents(ui_context); + return; + } + + int hot_item = ui_context->last_hot_item; + int active_item = ui_context->active_item; + int focus_item = ui_context->focus_item; + + // send all keyboard events + if (focus_item >= 0) { + int i; + for (i = 0; i < ui_context->eventcount; ++i) { + ui_context->active_key = ui_context->events[i].key; + ui_context->active_modifier = ui_context->events[i].mod; + uiNotifyItem(ui_context, focus_item, ui_context->events[i].event); + } + } else { + ui_context->focus_item = -1; + } + if (ui_context->scroll.x || ui_context->scroll.y) { + int scroll_item = uiFindItem(ui_context, 0, + ui_context->cursor.x, ui_context->cursor.y, + UI_SCROLL, UI_ANY); + if (scroll_item >= 0) { + uiNotifyItem(ui_context, scroll_item, UI_SCROLL); + } + } + + uiClearInputEvents(ui_context); + + int hot = ui_context->hot_item; + + switch(ui_context->state) { + default: + case UI_STATE_IDLE: { + ui_context->start_cursor = ui_context->cursor; + if (uiGetButton(ui_context, 0)) { + hot_item = -1; + active_item = hot; + + if (active_item != focus_item) { + focus_item = -1; + ui_context->focus_item = -1; + } + + if (active_item >= 0) { + if ( + ((timestamp - ui_context->last_click_timestamp) > UI_CLICK_THRESHOLD) + || (ui_context->last_click_item != active_item)) { + ui_context->clicks = 0; + } + ui_context->clicks++; + + ui_context->last_click_timestamp = timestamp; + ui_context->last_click_item = active_item; + ui_context->active_modifier = ui_context->active_button_modifier; + uiNotifyItem(ui_context, active_item, UI_BUTTON0_DOWN); + } + ui_context->state = UI_STATE_CAPTURE; + } else if (uiGetButton(ui_context, 2) && !uiGetLastButton(ui_context, 2)) { + hot_item = -1; + hot = uiFindItem(ui_context, 0, ui_context->cursor.x, ui_context->cursor.y, + UI_BUTTON2_DOWN, UI_ANY); + if (hot >= 0) { + ui_context->active_modifier = ui_context->active_button_modifier; + uiNotifyItem(ui_context, hot, UI_BUTTON2_DOWN); + } + } else { + hot_item = hot; + } + } break; + case UI_STATE_CAPTURE: { + if (!uiGetButton(ui_context, 0)) { + if (active_item >= 0) { + ui_context->active_modifier = ui_context->active_button_modifier; + uiNotifyItem(ui_context, active_item, UI_BUTTON0_UP); + if (active_item == hot) { + uiNotifyItem(ui_context, active_item, UI_BUTTON0_HOT_UP); + } + } + active_item = -1; + ui_context->state = UI_STATE_IDLE; + } else { + if (active_item >= 0) { + ui_context->active_modifier = ui_context->active_button_modifier; + uiNotifyItem(ui_context, active_item, UI_BUTTON0_CAPTURE); + } + if (hot == active_item) + hot_item = hot; + else + hot_item = -1; + } + } break; + } + + ui_context->last_cursor = ui_context->cursor; + ui_context->last_hot_item = hot_item; + ui_context->active_item = active_item; + + ui_context->last_timestamp = timestamp; + ui_context->last_buttons = ui_context->buttons; +} + +static int uiIsActive(UIcontext *ui_context, int item) { + assert(ui_context); + return ui_context->active_item == item; +} + +static int uiIsHot(UIcontext *ui_context, int item) { + assert(ui_context); + return ui_context->last_hot_item == item; +} + +static int uiIsFocused(UIcontext *ui_context, int item) { + assert(ui_context); + return ui_context->focus_item == item; +} + +UIitemState uiGetState(UIcontext *ui_context, int item) { + UIitem *pitem = uiItemPtr(ui_context, item); + if (pitem->flags & UI_ITEM_FROZEN) return UI_FROZEN; + if (uiIsFocused(ui_context, item)) { + if (pitem->flags & (UI_KEY_DOWN|UI_CHAR|UI_KEY_UP)) return UI_ACTIVE; + } + if (uiIsActive(ui_context, item)) { + if (pitem->flags & (UI_BUTTON0_CAPTURE|UI_BUTTON0_UP)) return UI_ACTIVE; + if ((pitem->flags & UI_BUTTON0_HOT_UP) + && uiIsHot(ui_context, item)) return UI_ACTIVE; + return UI_COLD; + } else if (uiIsHot(ui_context, item)) { + return UI_HOT; + } + return UI_COLD; +} + +#endif // OUI_IMPLEMENTATION diff --git a/dpf/dgl/src/oui-blendish/resources/DejaVuSans.ttf b/dpf/dgl/src/oui-blendish/resources/DejaVuSans.ttf new file mode 100644 index 0000000..9d40c32 Binary files /dev/null and b/dpf/dgl/src/oui-blendish/resources/DejaVuSans.ttf differ diff --git a/dpf/dgl/src/oui-blendish/resources/LICENSE-DejaVuSans.ttf.txt b/dpf/dgl/src/oui-blendish/resources/LICENSE-DejaVuSans.ttf.txt new file mode 100644 index 0000000..3e91fed --- /dev/null +++ b/dpf/dgl/src/oui-blendish/resources/LICENSE-DejaVuSans.ttf.txt @@ -0,0 +1,97 @@ +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. +Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) + +Bitstream Vera Fonts Copyright +------------------------------ + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is +a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute the +Font Software, including without limitation the rights to use, copy, merge, +publish, distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to the +following conditions: + +The above copyright and trademark notices and this permission notice shall +be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular +the designs of glyphs or characters in the Fonts may be modified and +additional glyphs or characters may be added to the Fonts, only if the fonts +are renamed to names not containing either the words "Bitstream" or the word +"Vera". + +This License becomes null and void to the extent applicable to Fonts or Font +Software that has been modified and is distributed under the "Bitstream +Vera" names. + +The Font Software may be sold as part of a larger software package but no +copy of one or more of the Font Software typefaces may be sold by itself. + +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 BITSTREAM OR THE GNOME +FOUNDATION 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. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font Software +without prior written authorization from the Gnome Foundation or Bitstream +Inc., respectively. For further information, contact: fonts at gnome dot +org. + +Arev Fonts Copyright +------------------------------ + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and +associated documentation files (the "Font Software"), to reproduce +and distribute the modifications to the Bitstream Vera Font Software, +including without limitation the rights to use, copy, merge, publish, +distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to +the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Tavmjong Bah" or the word "Arev". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Tavmjong Bah Arev" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +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 +TAVMJONG BAH 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. + +Except as contained in this notice, the name of Tavmjong Bah shall not +be used in advertising or otherwise to promote the sale, use or other +dealings in this Font Software without prior written authorization +from Tavmjong Bah. For further information, contact: tavmjong @ free +. fr. diff --git a/dpf/dgl/src/oui-blendish/resources/LICENSE-blender_icons.svg.txt b/dpf/dgl/src/oui-blendish/resources/LICENSE-blender_icons.svg.txt new file mode 100644 index 0000000..72b6484 --- /dev/null +++ b/dpf/dgl/src/oui-blendish/resources/LICENSE-blender_icons.svg.txt @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/dpf/dgl/src/oui-blendish/resources/blender_icons.svg b/dpf/dgl/src/oui-blendish/resources/blender_icons.svg new file mode 100644 index 0000000..4a1e2cd --- /dev/null +++ b/dpf/dgl/src/oui-blendish/resources/blender_icons.svg @@ -0,0 +1,88974 @@ + + + + + Blender icons v. 2.5.08 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Blender icons v. 2.5.08 + 21.05.2012 + + + Andrzej Ambroż + + + + + Andrzej Ambroż + + + + + Andrzej Ambroż + + + + + This content is under CC Attribution-NonCommercial ShareAlike licence 3.0 as long as it's used for Blender 3D GUI. Any other uses are not allowed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dpf/dgl/src/oui-blendish/resources/blender_icons16.png b/dpf/dgl/src/oui-blendish/resources/blender_icons16.png new file mode 100644 index 0000000..8d00905 Binary files /dev/null and b/dpf/dgl/src/oui-blendish/resources/blender_icons16.png differ diff --git a/dpf/dgl/src/pugl/common.h b/dpf/dgl/src/pugl/common.h new file mode 100644 index 0000000..afda61e --- /dev/null +++ b/dpf/dgl/src/pugl/common.h @@ -0,0 +1,121 @@ +/* + Copyright 2014 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef PUGL_COMMON_H_INCLUDED +#define PUGL_COMMON_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @addtogroup pugl + @{ +*/ + +/** + A Pugl view. +*/ +typedef struct PuglViewImpl PuglView; + +/** + A native window handle. + + On X11, this is a Window. + On OSX, this is an NSView*. + On Windows, this is a HWND. +*/ +typedef intptr_t PuglNativeWindow; + +/** + Handle for opaque user data. +*/ +typedef void* PuglHandle; + +/** + Return status code. +*/ +typedef enum { + PUGL_SUCCESS = 0 +} PuglStatus; + +/** + Drawing context type. +*/ +typedef enum { + PUGL_GL, + PUGL_CAIRO +} PuglContextType; + +/** + Convenience symbols for ASCII control characters. +*/ +typedef enum { + PUGL_CHAR_BACKSPACE = 0x08, + PUGL_CHAR_ESCAPE = 0x1B, + PUGL_CHAR_DELETE = 0x7F +} PuglChar; + +/** + Keyboard modifier flags. +*/ +typedef enum { + PUGL_MOD_SHIFT = 1 << 0, /**< Shift key */ + PUGL_MOD_CTRL = 1 << 1, /**< Control key */ + PUGL_MOD_ALT = 1 << 2, /**< Alt/Option key */ + PUGL_MOD_SUPER = 1 << 3 /**< Mod4/Command/Windows key */ +} PuglMod; + +/** + Special (non-Unicode) keyboard keys. +*/ +typedef enum { + PUGL_KEY_F1 = 1, + PUGL_KEY_F2, + PUGL_KEY_F3, + PUGL_KEY_F4, + PUGL_KEY_F5, + PUGL_KEY_F6, + PUGL_KEY_F7, + PUGL_KEY_F8, + PUGL_KEY_F9, + PUGL_KEY_F10, + PUGL_KEY_F11, + PUGL_KEY_F12, + PUGL_KEY_LEFT, + PUGL_KEY_UP, + PUGL_KEY_RIGHT, + PUGL_KEY_DOWN, + PUGL_KEY_PAGE_UP, + PUGL_KEY_PAGE_DOWN, + PUGL_KEY_HOME, + PUGL_KEY_END, + PUGL_KEY_INSERT, + PUGL_KEY_SHIFT, + PUGL_KEY_CTRL, + PUGL_KEY_ALT, + PUGL_KEY_SUPER +} PuglKey; + +/** + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* PUGL_COMMON_H_INCLUDED */ diff --git a/dpf/dgl/src/pugl/event.h b/dpf/dgl/src/pugl/event.h new file mode 100644 index 0000000..7314e48 --- /dev/null +++ b/dpf/dgl/src/pugl/event.h @@ -0,0 +1,41 @@ +/* + Copyright 2014 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef PUGL_EVENT_H_INCLUDED +#define PUGL_EVENT_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#else +# include +#endif + +#include "pugl/common.h" + +/** + @addtogroup pugl + @{ +*/ + +/** + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* PUGL_EVENT_H_INCLUDED */ diff --git a/dpf/dgl/src/pugl/gl.h b/dpf/dgl/src/pugl/gl.h new file mode 100644 index 0000000..9a6aeef --- /dev/null +++ b/dpf/dgl/src/pugl/gl.h @@ -0,0 +1,32 @@ +/* + Copyright 2012-2014 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file gl.h Portable header wrapper for gl.h. + + Unfortunately, GL includes vary across platforms so this header allows for + pure portable programs. +*/ + +#ifdef __APPLE__ +# include "OpenGL/gl.h" +#else +# ifdef _WIN32 +# include /* Broken Windows GL headers require this */ +# endif +# include "GL/gl.h" +#endif + diff --git a/dpf/dgl/src/pugl/glu.h b/dpf/dgl/src/pugl/glu.h new file mode 100644 index 0000000..4be79c7 --- /dev/null +++ b/dpf/dgl/src/pugl/glu.h @@ -0,0 +1,32 @@ +/* + Copyright 2012-2014 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file glu.h Portable header wrapper for glu.h. + + Unfortunately, GL includes vary across platforms so this header allows for + pure portable programs. +*/ + +#ifdef __APPLE__ +# include "OpenGL/glu.h" +#else +# ifdef _WIN32 +# include /* Broken Windows GL headers require this */ +# endif +# include "GL/glu.h" +#endif + diff --git a/dpf/dgl/src/pugl/pugl.h b/dpf/dgl/src/pugl/pugl.h new file mode 100644 index 0000000..3ee1c43 --- /dev/null +++ b/dpf/dgl/src/pugl/pugl.h @@ -0,0 +1,383 @@ +/* + Copyright 2012-2014 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file pugl.h API for Pugl, a minimal portable API for OpenGL. +*/ + +#ifndef PUGL_H_INCLUDED +#define PUGL_H_INCLUDED + +#include + +#include "pugl/common.h" +#include "pugl/event.h" + +#ifdef PUGL_SHARED +# ifdef _WIN32 +# define PUGL_LIB_IMPORT __declspec(dllimport) +# define PUGL_LIB_EXPORT __declspec(dllexport) +# else +# define PUGL_LIB_IMPORT __attribute__((visibility("default"))) +# define PUGL_LIB_EXPORT __attribute__((visibility("default"))) +# endif +# ifdef PUGL_INTERNAL +# define PUGL_API PUGL_LIB_EXPORT +# else +# define PUGL_API PUGL_LIB_IMPORT +# endif +#else +# ifdef _WIN32 +# define PUGL_API +# else +# define PUGL_API __attribute__((visibility("hidden"))) +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#else +# include +#endif + +/** + @defgroup pugl Pugl + A minimal portable API for OpenGL. + @{ +*/ + +/** + A function called when the window is closed. +*/ +typedef void (*PuglCloseFunc)(PuglView* view); + +/** + A function called to draw the view contents with OpenGL. +*/ +typedef void (*PuglDisplayFunc)(PuglView* view); + +/** + A function called when a key is pressed or released. + @param view The view the event occured in. + @param press True if the key was pressed, false if released. + @param key Unicode point of the key pressed. +*/ +typedef void (*PuglKeyboardFunc)(PuglView* view, bool press, uint32_t key); + +/** + A function called when the pointer moves. + @param view The view the event occured in. + @param x The window-relative x coordinate of the pointer. + @param y The window-relative y coordinate of the pointer. +*/ +typedef void (*PuglMotionFunc)(PuglView* view, int x, int y); + +/** + A function called when a mouse button is pressed or released. + @param view The view the event occured in. + @param button The button number (1 = left, 2 = middle, 3 = right). + @param press True if the key was pressed, false if released. + @param x The window-relative x coordinate of the pointer. + @param y The window-relative y coordinate of the pointer. +*/ +typedef void (*PuglMouseFunc)( + PuglView* view, int button, bool press, int x, int y); + +/** + A function called when the view is resized. + @param view The view being resized. + @param width The new view width. + @param height The new view height. +*/ +typedef void (*PuglReshapeFunc)(PuglView* view, int width, int height); + +/** + A function called on scrolling (e.g. mouse wheel or track pad). + + The distances used here are in "lines", a single tick of a clicking mouse + wheel. For example, @p dy = 1.0 scrolls 1 line up. Some systems and + devices support finer resolution and/or higher values for fast scrolls, + so programs should handle any value gracefully. + + @param view The view being scrolled. + @param x The window-relative x coordinate of the pointer. + @param y The window-relative y coordinate of the pointer. + @param dx The scroll x distance. + @param dx The scroll y distance. +*/ +typedef void (*PuglScrollFunc)(PuglView* view, int x, int y, float dx, float dy); + +/** + A function called when a special key is pressed or released. + + This callback allows the use of keys that do not have unicode points. + Note that some are non-printable keys. + + @param view The view the event occured in. + @param press True if the key was pressed, false if released. + @param key The key pressed. +*/ +typedef void (*PuglSpecialFunc)(PuglView* view, bool press, PuglKey key); + +/** + A function called when a filename is selected via file-browser. + + @param view The view the event occured in. + @param filename The selected file name or NULL if the dialog was canceled. +*/ +typedef void (*PuglFileSelectedFunc)(PuglView* view, const char* filename); + +/** + @name Initialization + Configuration functions which must be called before creating a window. + @{ +*/ + +/** + Create a Pugl context. + + To create a window, call the various puglInit* functions as necessary, then + call puglCreateWindow(). +*/ +PUGL_API PuglView* +puglInit(void); + +/** + Set the parent window before creating a window (for embedding). +*/ +PUGL_API void +puglInitWindowParent(PuglView* view, PuglNativeWindow parent); + +/** + Set the window size before creating a window. +*/ +PUGL_API void +puglInitWindowSize(PuglView* view, int width, int height); + +/** + Set the minimum window size before creating a window. +*/ +PUGL_API void +puglInitWindowMinSize(PuglView* view, int width, int height); + +/** + Enable or disable resizing before creating a window. +*/ +PUGL_API void +puglInitUserResizable(PuglView* view, bool resizable); + +/** + Set transient parent before creating a window. + + On X11, parent_id must be a Window. + On OSX, parent_id must be an NSView*. +*/ +PUGL_API void +puglInitTransientFor(PuglView* view, uintptr_t parent); + +/** + Set the context type before creating a window. +*/ +PUGL_API void +puglInitContextType(PuglView* view, PuglContextType type); + +/** + @} +*/ + +/** + @name Windows + Window management functions. + @{ +*/ + +/** + Create a window with the settings given by the various puglInit functions. + + @return 1 (pugl does not currently support multiple windows). +*/ +PUGL_API int +puglCreateWindow(PuglView* view, const char* title); + +/** + Show the current window. +*/ +PUGL_API void +puglShowWindow(PuglView* view); + +/** + Hide the current window. +*/ +PUGL_API void +puglHideWindow(PuglView* view); + +/** + Return the native window handle. +*/ +PUGL_API PuglNativeWindow +puglGetNativeWindow(PuglView* view); + +/** + @} +*/ + +/** + Set the handle to be passed to all callbacks. + + This is generally a pointer to a struct which contains all necessary state. + Everything needed in callbacks should be here, not in static variables. + + Note the lack of this facility makes GLUT unsuitable for plugins or + non-trivial programs; this mistake is largely why Pugl exists. +*/ +PUGL_API void +puglSetHandle(PuglView* view, PuglHandle handle); + +/** + Get the handle to be passed to all callbacks. +*/ +PUGL_API PuglHandle +puglGetHandle(PuglView* view); + +/** + Get the drawing context. + + For PUGL_GL contexts, this is unused and returns NULL. + For PUGL_CAIRO contexts, this returns a pointer to a cairo_t. +*/ +PUGL_API void* +puglGetContext(PuglView* view); + +/** + Return the timestamp (if any) of the currently-processing event. +*/ +PUGL_API uint32_t +puglGetEventTimestamp(PuglView* view); + +/** + Get the currently active modifiers (PuglMod flags). + + This should only be called from an event handler. +*/ +PUGL_API int +puglGetModifiers(PuglView* view); + +/** + Ignore synthetic repeated key events. +*/ +PUGL_API void +puglIgnoreKeyRepeat(PuglView* view, bool ignore); + +/** + @name Event Callbacks + Functions to set event callbacks for handling user input. + @{ +*/ + +/** + Set the function to call when the window is closed. +*/ +PUGL_API void +puglSetCloseFunc(PuglView* view, PuglCloseFunc closeFunc); + +/** + Set the display function which should draw the UI using GL. +*/ +PUGL_API void +puglSetDisplayFunc(PuglView* view, PuglDisplayFunc displayFunc); + +/** + Set the function to call on keyboard events. +*/ +PUGL_API void +puglSetKeyboardFunc(PuglView* view, PuglKeyboardFunc keyboardFunc); + +/** + Set the function to call on mouse motion. +*/ +PUGL_API void +puglSetMotionFunc(PuglView* view, PuglMotionFunc motionFunc); + +/** + Set the function to call on mouse button events. +*/ +PUGL_API void +puglSetMouseFunc(PuglView* view, PuglMouseFunc mouseFunc); + +/** + Set the function to call on scroll events. +*/ +PUGL_API void +puglSetScrollFunc(PuglView* view, PuglScrollFunc scrollFunc); + +/** + Set the function to call on special events. +*/ +PUGL_API void +puglSetSpecialFunc(PuglView* view, PuglSpecialFunc specialFunc); + +/** + Set the function to call when the window size changes. +*/ +PUGL_API void +puglSetReshapeFunc(PuglView* view, PuglReshapeFunc reshapeFunc); + +/** + Set the function to call on file-browser selections. +*/ +PUGL_API void +puglSetFileSelectedFunc(PuglView* view, PuglFileSelectedFunc fileSelectedFunc); + +/** + @} +*/ + +/** + Grab the input focus. +*/ +PUGL_API void +puglGrabFocus(PuglView* view); + +/** + Process all pending window events. + + This handles input events as well as rendering, so it should be called + regularly and rapidly enough to keep the UI responsive. +*/ +PUGL_API PuglStatus +puglProcessEvents(PuglView* view); + +/** + Request a redisplay on the next call to puglProcessEvents(). +*/ +PUGL_API void +puglPostRedisplay(PuglView* view); + +/** + Destroy a GL window. +*/ +PUGL_API void +puglDestroy(PuglView* view); + +/** + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* PUGL_H_INCLUDED */ diff --git a/dpf/dgl/src/pugl/pugl_internal.h b/dpf/dgl/src/pugl/pugl_internal.h new file mode 100644 index 0000000..3ca59ca --- /dev/null +++ b/dpf/dgl/src/pugl/pugl_internal.h @@ -0,0 +1,352 @@ +/* + Copyright 2012-2014 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file pugl_internal.h Private platform-independent definitions. + + Note this file contains function definitions, so it must be compiled into + the final binary exactly once. Each platform specific implementation file + including it once should achieve this. + + If you are copying the pugl code into your source tree, the following + symbols can be defined to tweak pugl behaviour: + + PUGL_HAVE_CAIRO: Include Cairo support code. + PUGL_HAVE_GL: Include OpenGL support code. + PUGL_GRAB_FOCUS: Work around reparent keyboard issues by grabbing focus. + PUGL_VERBOSE: Print GL information to console. +*/ + +#include "pugl/pugl.h" +#include "pugl/event.h" + +#ifdef PUGL_VERBOSE +# include +# define PUGL_LOG(str) fprintf(stderr, "pugl: " str) +# define PUGL_LOGF(fmt, ...) fprintf(stderr, "pugl: " fmt, __VA_ARGS__) +#else +# define PUGL_LOG(str) +# define PUGL_LOGF(fmt, ...) +#endif + +typedef struct PuglInternalsImpl PuglInternals; + +struct PuglViewImpl { + PuglHandle handle; + PuglCloseFunc closeFunc; + PuglDisplayFunc displayFunc; + PuglKeyboardFunc keyboardFunc; + PuglMotionFunc motionFunc; + PuglMouseFunc mouseFunc; + PuglReshapeFunc reshapeFunc; + PuglScrollFunc scrollFunc; + PuglSpecialFunc specialFunc; + PuglFileSelectedFunc fileSelectedFunc; + + PuglInternals* impl; + + PuglNativeWindow parent; + PuglContextType ctx_type; + uintptr_t transient_parent; + + int width; + int height; + int min_width; + int min_height; + int mods; + bool mouse_in_view; + bool ignoreKeyRepeat; + bool redisplay; + bool resizable; + uint32_t event_timestamp_ms; +}; + +PuglInternals* puglInitInternals(void); + +PuglView* +puglInit(void) +{ + PuglView* view = (PuglView*)calloc(1, sizeof(PuglView)); + if (!view) { + return NULL; + } + + PuglInternals* impl = puglInitInternals(); + if (!impl) { + free(view); + return NULL; + } + + view->impl = impl; + view->width = 640; + view->height = 480; + + return view; +} + +void +puglInitWindowSize(PuglView* view, int width, int height) +{ + view->width = width; + view->height = height; +} + +void +puglInitWindowMinSize(PuglView* view, int width, int height) +{ + view->min_width = width; + view->min_height = height; +} + +void +puglInitWindowParent(PuglView* view, PuglNativeWindow parent) +{ + view->parent = parent; +} + +void +puglInitUserResizable(PuglView* view, bool resizable) +{ + view->resizable = resizable; +} + +void +puglInitTransientFor(PuglView* view, uintptr_t parent) +{ + view->transient_parent = parent; +} + +void +puglInitContextType(PuglView* view, PuglContextType type) +{ + view->ctx_type = type; +} + +void +puglSetHandle(PuglView* view, PuglHandle handle) +{ + view->handle = handle; +} + +PuglHandle +puglGetHandle(PuglView* view) +{ + return view->handle; +} + +uint32_t +puglGetEventTimestamp(PuglView* view) +{ + return view->event_timestamp_ms; +} + +int +puglGetModifiers(PuglView* view) +{ + return view->mods; +} + +void +puglIgnoreKeyRepeat(PuglView* view, bool ignore) +{ + view->ignoreKeyRepeat = ignore; +} + +void +puglSetCloseFunc(PuglView* view, PuglCloseFunc closeFunc) +{ + view->closeFunc = closeFunc; +} + +void +puglSetDisplayFunc(PuglView* view, PuglDisplayFunc displayFunc) +{ + view->displayFunc = displayFunc; +} + +void +puglSetKeyboardFunc(PuglView* view, PuglKeyboardFunc keyboardFunc) +{ + view->keyboardFunc = keyboardFunc; +} + +void +puglSetMotionFunc(PuglView* view, PuglMotionFunc motionFunc) +{ + view->motionFunc = motionFunc; +} + +void +puglSetMouseFunc(PuglView* view, PuglMouseFunc mouseFunc) +{ + view->mouseFunc = mouseFunc; +} + +void +puglSetReshapeFunc(PuglView* view, PuglReshapeFunc reshapeFunc) +{ + view->reshapeFunc = reshapeFunc; +} + +void +puglSetScrollFunc(PuglView* view, PuglScrollFunc scrollFunc) +{ + view->scrollFunc = scrollFunc; +} + +void +puglSetSpecialFunc(PuglView* view, PuglSpecialFunc specialFunc) +{ + view->specialFunc = specialFunc; +} + +void +puglSetFileSelectedFunc(PuglView* view, PuglFileSelectedFunc fileSelectedFunc) +{ + view->fileSelectedFunc = fileSelectedFunc; +} + +void +puglEnterContext(PuglView* view); + +void +puglLeaveContext(PuglView* view, bool flush); + +#if 0 +/** Return the code point for buf, or the replacement character on error. */ +static uint32_t +puglDecodeUTF8(const uint8_t* buf) +{ +#define FAIL_IF(cond) { if (cond) return 0xFFFD; } + + /* http://en.wikipedia.org/wiki/UTF-8 */ + + if (buf[0] < 0x80) { + return buf[0]; + } else if (buf[0] < 0xC2) { + return 0xFFFD; + } else if (buf[0] < 0xE0) { + FAIL_IF((buf[1] & 0xC0) != 0x80); + return (buf[0] << 6) + buf[1] - 0x3080; + } else if (buf[0] < 0xF0) { + FAIL_IF((buf[1] & 0xC0) != 0x80); + FAIL_IF(buf[0] == 0xE0 && buf[1] < 0xA0); + FAIL_IF((buf[2] & 0xC0) != 0x80); + return (buf[0] << 12) + (buf[1] << 6) + buf[2] - 0xE2080; + } else if (buf[0] < 0xF5) { + FAIL_IF((buf[1] & 0xC0) != 0x80); + FAIL_IF(buf[0] == 0xF0 && buf[1] < 0x90); + FAIL_IF(buf[0] == 0xF4 && buf[1] >= 0x90); + FAIL_IF((buf[2] & 0xC0) != 0x80); + FAIL_IF((buf[3] & 0xC0) != 0x80); + return ((buf[0] << 18) + + (buf[1] << 12) + + (buf[2] << 6) + + buf[3] - 0x3C82080); + } + return 0xFFFD; +} +#endif + +static void +puglDefaultReshape(PuglView* view, int width, int height) +{ + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, width, height, 0, 0, 1); + glViewport(0, 0, width, height); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + return; + + // unused + (void)view; +} + +#if 0 +static void +puglDispatchEvent(PuglView* view, const PuglEvent* event) +{ + if (view->eventFunc) { + view->eventFunc(view, event); + } + + switch (event->type) { + case PUGL_CONFIGURE: + puglEnterContext(view); + view->width = event->configure.width; + view->height = event->configure.height; + if (view->reshapeFunc) { + view->reshapeFunc(view, view->width, view->height); + } + puglLeaveContext(view, false); + break; + case PUGL_EXPOSE: + if (event->expose.count == 0) { + puglEnterContext(view); + if (view->displayFunc) { + view->displayFunc(view); + } + view->redisplay = false; + puglLeaveContext(view, true); + } + break; + case PUGL_MOTION_NOTIFY: + view->event_timestamp_ms = event->motion.time; + view->mods = event->motion.state; + if (view->motionFunc) { + view->motionFunc(view, event->motion.x, event->motion.y); + } + break; + case PUGL_SCROLL: + if (view->scrollFunc) { + view->scrollFunc(view, + event->scroll.x, event->scroll.y, + event->scroll.dx, event->scroll.dy); + } + break; + case PUGL_BUTTON_PRESS: + case PUGL_BUTTON_RELEASE: + view->event_timestamp_ms = event->button.time; + view->mods = event->button.state; + if (view->mouseFunc) { + view->mouseFunc(view, + event->button.button, + event->type == PUGL_BUTTON_PRESS, + event->button.x, + event->button.y); + } + break; + case PUGL_KEY_PRESS: + case PUGL_KEY_RELEASE: + view->event_timestamp_ms = event->key.time; + view->mods = event->key.state; + if (event->key.special && view->specialFunc) { + view->specialFunc(view, + event->type == PUGL_KEY_PRESS, + event->key.special); + } else if (event->key.character && view->keyboardFunc) { + view->keyboardFunc(view, + event->type == PUGL_KEY_PRESS, + event->key.character); + } + break; + default: + break; + } +} +#endif diff --git a/dpf/dgl/src/pugl/pugl_osx.m b/dpf/dgl/src/pugl/pugl_osx.m new file mode 100644 index 0000000..5909d67 --- /dev/null +++ b/dpf/dgl/src/pugl/pugl_osx.m @@ -0,0 +1,573 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file pugl_osx.m OSX/Cocoa Pugl Implementation. +*/ + +#include + +#import + +#include "pugl_internal.h" + +@interface PuglWindow : NSWindow +{ +@public + PuglView* puglview; +} + +- (id) initWithContentRect:(NSRect)contentRect + styleMask:(unsigned int)aStyle + backing:(NSBackingStoreType)bufferingType + defer:(BOOL)flag; +- (void) setPuglview:(PuglView*)view; +- (BOOL) canBecomeKeyWindow; +- (BOOL) windowShouldClose:(id)sender; +@end + +@implementation PuglWindow + +- (id)initWithContentRect:(NSRect)contentRect + styleMask:(unsigned int)aStyle + backing:(NSBackingStoreType)bufferingType + defer:(BOOL)flag +{ + NSWindow* result = [super initWithContentRect:contentRect + styleMask:(NSClosableWindowMask | + NSTitledWindowMask | + NSResizableWindowMask) + backing:NSBackingStoreBuffered defer:NO]; + + [result setAcceptsMouseMovedEvents:YES]; + [result setLevel: CGShieldingWindowLevel() + 1]; + + return (PuglWindow*)result; + + // unused + (void)aStyle; (void)bufferingType; (void)flag; +} + +- (void)setPuglview:(PuglView*)view +{ + puglview = view; + [self setContentSize:NSMakeSize(view->width, view->height)]; +} + +- (BOOL)canBecomeKeyWindow +{ + return YES; +} + +- (BOOL)windowShouldClose:(id)sender +{ + if (puglview->closeFunc) + puglview->closeFunc(puglview); + return YES; + + // unused + (void)sender; +} + +@end + +static void +puglDisplay(PuglView* view) +{ + view->redisplay = false; + if (view->displayFunc) { + view->displayFunc(view); + } +} + +@interface PuglOpenGLView : NSOpenGLView +{ +@public + PuglView* puglview; + NSTrackingArea* trackingArea; + bool doubleBuffered; +} + +- (BOOL) acceptsFirstMouse:(NSEvent*)e; +- (BOOL) acceptsFirstResponder; +- (BOOL) isFlipped; +- (BOOL) isOpaque; +- (BOOL) preservesContentInLiveResize; +- (id) initWithFrame:(NSRect)frame; +- (void) reshape; +- (void) drawRect:(NSRect)r; +- (void) cursorUpdate:(NSEvent*)e; +- (void) updateTrackingAreas; +- (void) viewWillMoveToWindow:(NSWindow*)newWindow; +- (void) mouseMoved:(NSEvent*)event; +- (void) mouseDragged:(NSEvent*)event; +- (void) rightMouseDragged:(NSEvent*)event; +- (void) otherMouseDragged:(NSEvent*)event; +- (void) mouseDown:(NSEvent*)event; +- (void) rightMouseDown:(NSEvent*)event; +- (void) otherMouseDown:(NSEvent*)event; +- (void) mouseUp:(NSEvent*)event; +- (void) rightMouseUp:(NSEvent*)event; +- (void) otherMouseUp:(NSEvent*)event; +- (void) scrollWheel:(NSEvent*)event; +- (void) keyDown:(NSEvent*)event; +- (void) keyUp:(NSEvent*)event; +- (void) flagsChanged:(NSEvent*)event; + +@end + +@implementation PuglOpenGLView + +- (BOOL) acceptsFirstMouse:(NSEvent*)e +{ + return YES; + + // unused + (void)e; +} + +- (BOOL) acceptsFirstResponder +{ + return YES; +} + +- (BOOL) isFlipped +{ + return YES; +} + +- (BOOL) isOpaque +{ + return YES; +} + +- (BOOL) preservesContentInLiveResize +{ + return NO; +} + +- (id) initWithFrame:(NSRect)frame +{ + puglview = nil; + trackingArea = nil; + doubleBuffered = true; + + NSOpenGLPixelFormatAttribute pixelAttribs[] = { + NSOpenGLPFAColorSize, 24, + NSOpenGLPFAAlphaSize, 8, + NSOpenGLPFADepthSize, 16, + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAAccelerated, + 0 + }; + + NSOpenGLPixelFormat* pixelFormat = [[NSOpenGLPixelFormat alloc] + initWithAttributes:pixelAttribs]; + + if (pixelFormat) { + self = [super initWithFrame:frame pixelFormat:pixelFormat]; + [pixelFormat release]; + printf("Is doubleBuffered? TRUE\n"); + } else { + self = [super initWithFrame:frame]; + doubleBuffered = false; + printf("Is doubleBuffered? FALSE\n"); + } + + if (self) { + GLint swapInterval = 1; + [[self openGLContext] setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval]; + + [self reshape]; + } + + return self; +} + +- (void) reshape +{ + [[self openGLContext] update]; + + if (!puglview) { + /* NOTE: Apparently reshape gets called when the GC gets around to + deleting the view (?), so we must have reset puglview to NULL when + this comes around. + */ + return; + } + + NSRect bounds = [self bounds]; + int width = bounds.size.width; + int height = bounds.size.height; + + puglEnterContext(puglview); + + if (puglview->reshapeFunc) { + puglview->reshapeFunc(puglview, width, height); + } else { + puglDefaultReshape(puglview, width, height); + } + + puglLeaveContext(puglview, false); + + puglview->width = width; + puglview->height = height; +} + +- (void) drawRect:(NSRect)r +{ + puglEnterContext(puglview); + puglDisplay(puglview); + puglLeaveContext(puglview, true); + + // unused + return; (void)r; +} + +- (void) cursorUpdate:(NSEvent*)e +{ + [[NSCursor arrowCursor] set]; + + // unused + return; (void)e; +} + +- (void) updateTrackingAreas +{ + static const int opts = NSTrackingMouseEnteredAndExited + | NSTrackingMouseMoved + | NSTrackingEnabledDuringMouseDrag + | NSTrackingInVisibleRect + | NSTrackingActiveAlways + | NSTrackingCursorUpdate; + + if (trackingArea != nil) { + [self removeTrackingArea:trackingArea]; + [trackingArea release]; + } + + trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] + options:opts + owner:self + userInfo:nil]; + [self addTrackingArea:trackingArea]; + [super updateTrackingAreas]; +} + +- (void) viewWillMoveToWindow:(NSWindow*)newWindow +{ + if (newWindow != nil) { + [newWindow setAcceptsMouseMovedEvents:YES]; + [newWindow makeFirstResponder:self]; + } + + [super viewWillMoveToWindow:newWindow]; +} + +static unsigned +getModifiers(PuglView* view, NSEvent* ev) +{ + const unsigned modifierFlags = [ev modifierFlags]; + + view->event_timestamp_ms = fmod([ev timestamp] * 1000.0, UINT32_MAX); + + unsigned mods = 0; + mods |= (modifierFlags & NSShiftKeyMask) ? PUGL_MOD_SHIFT : 0; + mods |= (modifierFlags & NSControlKeyMask) ? PUGL_MOD_CTRL : 0; + mods |= (modifierFlags & NSAlternateKeyMask) ? PUGL_MOD_ALT : 0; + mods |= (modifierFlags & NSCommandKeyMask) ? PUGL_MOD_SUPER : 0; + return mods; +} + +static int +getFixedAppKitButton(NSInteger button) +{ + switch (button) { + case 0: return 1; + case 1: return 3; + case 2: return 2; + default: return button; + } +} + +- (void) mouseMoved:(NSEvent*)event +{ + if (puglview->motionFunc) { + NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil]; + puglview->mods = getModifiers(puglview, event); + puglview->motionFunc(puglview, loc.x, loc.y); + } +} + +- (void) mouseDragged:(NSEvent*)event +{ + [self mouseMoved:event]; +} + +- (void) rightMouseDragged:(NSEvent*)event +{ + [self mouseDragged:event]; +} + +- (void) otherMouseDragged:(NSEvent*)event +{ + [self mouseDragged:event]; +} + +- (void) mouseDown:(NSEvent*)event +{ + if (puglview->mouseFunc) { + NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil]; + puglview->mods = getModifiers(puglview, event); + puglview->mouseFunc(puglview, getFixedAppKitButton([event buttonNumber]), true, loc.x, loc.y); + } +} + +- (void) rightMouseDown:(NSEvent*)event +{ + [self mouseDown:event]; +} + +- (void) otherMouseDown:(NSEvent*)event +{ + [self mouseDown:event]; +} + +- (void) mouseUp:(NSEvent*)event +{ + if (puglview->mouseFunc) { + NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil]; + puglview->mods = getModifiers(puglview, event); + puglview->mouseFunc(puglview, getFixedAppKitButton([event buttonNumber]), false, loc.x, loc.y); + } +} + +- (void) rightMouseUp:(NSEvent*)event +{ + [self mouseUp:event]; +} + +- (void) otherMouseUp:(NSEvent*)event +{ + [self mouseUp:event]; +} + +- (void) scrollWheel:(NSEvent*)event +{ + if (puglview->scrollFunc) { + NSPoint loc = [self convertPoint:[event locationInWindow] fromView:nil]; + puglview->mods = getModifiers(puglview, event); + puglview->scrollFunc(puglview, + loc.x, loc.y, + [event deltaX], [event deltaY]); + } +} + +- (void) keyDown:(NSEvent*)event +{ + if (puglview->keyboardFunc && !(puglview->ignoreKeyRepeat && [event isARepeat])) { + NSString* chars = [event characters]; + puglview->mods = getModifiers(puglview, event); + puglview->keyboardFunc(puglview, true, [chars characterAtIndex:0]); + } +} + +- (void) keyUp:(NSEvent*)event +{ + if (puglview->keyboardFunc) { + NSString* chars = [event characters]; + puglview->mods = getModifiers(puglview, event); + puglview->keyboardFunc(puglview, false, [chars characterAtIndex:0]); + } +} + +- (void) flagsChanged:(NSEvent*)event +{ + if (puglview->specialFunc) { + const unsigned mods = getModifiers(puglview, event); + if ((mods & PUGL_MOD_SHIFT) != (puglview->mods & PUGL_MOD_SHIFT)) { + puglview->specialFunc(puglview, mods & PUGL_MOD_SHIFT, PUGL_KEY_SHIFT); + } else if ((mods & PUGL_MOD_CTRL) != (puglview->mods & PUGL_MOD_CTRL)) { + puglview->specialFunc(puglview, mods & PUGL_MOD_CTRL, PUGL_KEY_CTRL); + } else if ((mods & PUGL_MOD_ALT) != (puglview->mods & PUGL_MOD_ALT)) { + puglview->specialFunc(puglview, mods & PUGL_MOD_ALT, PUGL_KEY_ALT); + } else if ((mods & PUGL_MOD_SUPER) != (puglview->mods & PUGL_MOD_SUPER)) { + puglview->specialFunc(puglview, mods & PUGL_MOD_SUPER, PUGL_KEY_SUPER); + } + puglview->mods = mods; + } +} + +@end + +struct PuglInternalsImpl { + PuglOpenGLView* glview; + id window; +}; + +PuglInternals* +puglInitInternals() +{ + return (PuglInternals*)calloc(1, sizeof(PuglInternals)); +} + +void +puglEnterContext(PuglView* view) +{ +#ifdef PUGL_HAVE_GL + if (view->ctx_type == PUGL_GL) { + [[view->impl->glview openGLContext] makeCurrentContext]; + } +#endif +} + +void +puglLeaveContext(PuglView* view, bool flush) +{ +#ifdef PUGL_HAVE_GL + if (view->ctx_type == PUGL_GL && flush) { + if (view->impl->glview->doubleBuffered) { + [[view->impl->glview openGLContext] flushBuffer]; + } else { + glFlush(); + } + //[NSOpenGLContext clearCurrentContext]; + } +#endif +} + +int +puglCreateWindow(PuglView* view, const char* title) +{ + PuglInternals* impl = view->impl; + + [NSAutoreleasePool new]; + [NSApplication sharedApplication]; + + impl->glview = [PuglOpenGLView new]; + + if (!impl->glview) { + return 1; + } + + impl->glview->puglview = view; + + if (view->resizable) { + [impl->glview setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + } + + if (view->parent) { + [impl->glview retain]; + NSView* pview = (NSView*)view->parent; + [pview addSubview:impl->glview]; + return 0; + } + + id window = [[PuglWindow new]retain]; + + if (title) { + NSString* titleString = [[NSString alloc] + initWithBytes:title + length:strlen(title) + encoding:NSUTF8StringEncoding]; + + [window setTitle:titleString]; + } + + [window setPuglview:view]; + [window setContentView:impl->glview]; + [window makeFirstResponder:impl->glview]; + [window makeKeyAndOrderFront:window]; + + // wait for first puglShowWindow + [window setIsVisible:NO]; + + [NSApp activateIgnoringOtherApps:YES]; + [window center]; + + impl->window = window; + + return 0; +} + +void +puglShowWindow(PuglView* view) +{ + PuglInternals* impl = view->impl; + + if (impl->window) { + [impl->window setIsVisible:YES]; + } else { + [view->impl->glview setHidden:NO]; + } +} + +void +puglHideWindow(PuglView* view) +{ + PuglInternals* impl = view->impl; + + if (impl->window) { + [impl->window setIsVisible:NO]; + } else { + [impl->glview setHidden:YES]; + } +} + +void +puglDestroy(PuglView* view) +{ + view->impl->glview->puglview = NULL; + + if (view->impl->window) { + [view->impl->window close]; + [view->impl->glview release]; + [view->impl->window release]; + } else { + [view->impl->glview release]; + } + + free(view->impl); + free(view); +} + +PuglStatus +puglProcessEvents(PuglView* view) +{ + return PUGL_SUCCESS; + + // unused + (void)view; +} + +void +puglPostRedisplay(PuglView* view) +{ + view->redisplay = true; + [view->impl->glview setNeedsDisplay:YES]; +} + +PuglNativeWindow +puglGetNativeWindow(PuglView* view) +{ + return (PuglNativeWindow)view->impl->glview; +} + +void* +puglGetContext(PuglView* view) +{ + return NULL; +} diff --git a/dpf/dgl/src/pugl/pugl_win.cpp b/dpf/dgl/src/pugl/pugl_win.cpp new file mode 100644 index 0000000..1ac7c9e --- /dev/null +++ b/dpf/dgl/src/pugl/pugl_win.cpp @@ -0,0 +1,481 @@ +/* + Copyright 2012-2014 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file pugl_win.cpp Windows/WGL Pugl Implementation. +*/ + +#include +#include +#include + +#include +#include +#include + +#include "pugl/pugl_internal.h" + +#ifndef WM_MOUSEWHEEL +# define WM_MOUSEWHEEL 0x020A +#endif +#ifndef WM_MOUSEHWHEEL +# define WM_MOUSEHWHEEL 0x020E +#endif +#ifndef WHEEL_DELTA +# define WHEEL_DELTA 120 +#endif +#ifndef GWLP_USERDATA +# define GWLP_USERDATA (-21) +#endif + +#define PUGL_LOCAL_CLOSE_MSG (WM_USER + 50) + +HINSTANCE hInstance = NULL; + +struct PuglInternalsImpl { + HWND hwnd; + HDC hdc; + HGLRC hglrc; + WNDCLASS wc; +}; + +LRESULT CALLBACK +wndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + +#if 0 +extern "C" { +BOOL WINAPI +DllMain(HINSTANCE hInst, DWORD, LPVOID) +{ + hInstance = hInst; + return 1; +} +} // extern "C" +#endif + +PuglInternals* +puglInitInternals() +{ + return (PuglInternals*)calloc(1, sizeof(PuglInternals)); +} + +void +puglEnterContext(PuglView* view) +{ +#ifdef PUGL_HAVE_GL + if (view->ctx_type == PUGL_GL) { + wglMakeCurrent(view->impl->hdc, view->impl->hglrc); + } +#endif +} + +void +puglLeaveContext(PuglView* view, bool flush) +{ +#ifdef PUGL_HAVE_GL + if (view->ctx_type == PUGL_GL && flush) { + glFlush(); + SwapBuffers(view->impl->hdc); + } +#endif +} + +int +puglCreateWindow(PuglView* view, const char* title) +{ + PuglInternals* impl = view->impl; + + if (!title) { + title = "Window"; + } + + // FIXME: This is nasty, and pugl should not have static anything. + // Should class be a parameter? Does this make sense on other platforms? + static int wc_count = 0; + char classNameBuf[256]; + std::srand((std::time(NULL))); + _snprintf(classNameBuf, sizeof(classNameBuf), "%s_%d-%d", title, std::rand(), ++wc_count); + classNameBuf[sizeof(classNameBuf)-1] = '\0'; + + impl->wc.style = CS_OWNDC; + impl->wc.lpfnWndProc = wndProc; + impl->wc.cbClsExtra = 0; + impl->wc.cbWndExtra = 0; + impl->wc.hInstance = hInstance; + impl->wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION); + impl->wc.hCursor = LoadCursor(hInstance, IDC_ARROW); + impl->wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + impl->wc.lpszMenuName = NULL; + impl->wc.lpszClassName = strdup(classNameBuf); + + if (!RegisterClass(&impl->wc)) { + free((void*)impl->wc.lpszClassName); + free(impl); + free(view); + return 1; + } + + int winFlags = WS_POPUPWINDOW | WS_CAPTION; + if (view->resizable) { + winFlags |= WS_SIZEBOX; + if (view->min_width > 0 && view->min_height > 0) { + // Adjust the minimum window size to accomodate requested view size + RECT mr = { 0, 0, view->min_width, view->min_height }; + AdjustWindowRectEx(&mr, view->parent ? WS_CHILD : winFlags, FALSE, WS_EX_TOPMOST); + view->min_width = mr.right - mr.left; + view->min_height = mr.bottom - mr.top; + } + } + + // Adjust the window size to accomodate requested view size + RECT wr = { 0, 0, view->width, view->height }; + AdjustWindowRectEx(&wr, view->parent ? WS_CHILD : winFlags, FALSE, WS_EX_TOPMOST); + + impl->hwnd = CreateWindowEx( + WS_EX_TOPMOST, + classNameBuf, title, + view->parent ? (WS_CHILD | WS_VISIBLE) : winFlags, + CW_USEDEFAULT, CW_USEDEFAULT, wr.right-wr.left, wr.bottom-wr.top, + (HWND)view->parent, NULL, hInstance, NULL); + + if (!impl->hwnd) { + UnregisterClass(impl->wc.lpszClassName, NULL); + free((void*)impl->wc.lpszClassName); + free(impl); + free(view); + return 1; + } + + SetWindowLongPtr(impl->hwnd, GWLP_USERDATA, (LONG_PTR)view); + + impl->hdc = GetDC(impl->hwnd); + + PIXELFORMATDESCRIPTOR pfd; + ZeroMemory(&pfd, sizeof(pfd)); + pfd.nSize = sizeof(pfd); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 24; + pfd.cDepthBits = 16; + pfd.iLayerType = PFD_MAIN_PLANE; + + int format = ChoosePixelFormat(impl->hdc, &pfd); + SetPixelFormat(impl->hdc, format, &pfd); + + impl->hglrc = wglCreateContext(impl->hdc); + if (!impl->hglrc) { + ReleaseDC (impl->hwnd, impl->hdc); + DestroyWindow (impl->hwnd); + UnregisterClass (impl->wc.lpszClassName, NULL); + free((void*)impl->wc.lpszClassName); + free(impl); + free(view); + return 1; + } + + return PUGL_SUCCESS; +} + +void +puglShowWindow(PuglView* view) +{ + ShowWindow(view->impl->hwnd, SW_SHOWNORMAL); +} + +void +puglHideWindow(PuglView* view) +{ + ShowWindow(view->impl->hwnd, SW_HIDE); +} + +void +puglDestroy(PuglView* view) +{ + wglMakeCurrent(NULL, NULL); + wglDeleteContext(view->impl->hglrc); + ReleaseDC(view->impl->hwnd, view->impl->hdc); + DestroyWindow(view->impl->hwnd); + UnregisterClass(view->impl->wc.lpszClassName, NULL); + free((void*)view->impl->wc.lpszClassName); + free(view->impl); + free(view); +} + +static void +puglReshape(PuglView* view, int width, int height) +{ + puglEnterContext(view); + + if (view->reshapeFunc) { + view->reshapeFunc(view, width, height); + } else { + puglDefaultReshape(view, width, height); + } + + view->width = width; + view->height = height; +} + +static void +puglDisplay(PuglView* view) +{ + puglEnterContext(view); + + view->redisplay = false; + if (view->displayFunc) { + view->displayFunc(view); + } + + puglLeaveContext(view, true); +} + +static PuglKey +keySymToSpecial(int sym) +{ + switch (sym) { + case VK_F1: return PUGL_KEY_F1; + case VK_F2: return PUGL_KEY_F2; + case VK_F3: return PUGL_KEY_F3; + case VK_F4: return PUGL_KEY_F4; + case VK_F5: return PUGL_KEY_F5; + case VK_F6: return PUGL_KEY_F6; + case VK_F7: return PUGL_KEY_F7; + case VK_F8: return PUGL_KEY_F8; + case VK_F9: return PUGL_KEY_F9; + case VK_F10: return PUGL_KEY_F10; + case VK_F11: return PUGL_KEY_F11; + case VK_F12: return PUGL_KEY_F12; + case VK_LEFT: return PUGL_KEY_LEFT; + case VK_UP: return PUGL_KEY_UP; + case VK_RIGHT: return PUGL_KEY_RIGHT; + case VK_DOWN: return PUGL_KEY_DOWN; + case VK_PRIOR: return PUGL_KEY_PAGE_UP; + case VK_NEXT: return PUGL_KEY_PAGE_DOWN; + case VK_HOME: return PUGL_KEY_HOME; + case VK_END: return PUGL_KEY_END; + case VK_INSERT: return PUGL_KEY_INSERT; + case VK_SHIFT: return PUGL_KEY_SHIFT; + case VK_CONTROL: return PUGL_KEY_CTRL; + case VK_MENU: return PUGL_KEY_ALT; + case VK_LWIN: return PUGL_KEY_SUPER; + case VK_RWIN: return PUGL_KEY_SUPER; + } + return (PuglKey)0; +} + +static void +processMouseEvent(PuglView* view, int button, bool press, LPARAM lParam) +{ + view->event_timestamp_ms = GetMessageTime(); + if (press) { + SetCapture(view->impl->hwnd); + } else { + ReleaseCapture(); + } + + if (view->mouseFunc) { + view->mouseFunc(view, button, press, + GET_X_LPARAM(lParam), + GET_Y_LPARAM(lParam)); + } +} + +static void +setModifiers(PuglView* view) +{ + view->mods = 0; + view->mods |= (GetKeyState(VK_SHIFT) < 0) ? PUGL_MOD_SHIFT : 0; + view->mods |= (GetKeyState(VK_CONTROL) < 0) ? PUGL_MOD_CTRL : 0; + view->mods |= (GetKeyState(VK_MENU) < 0) ? PUGL_MOD_ALT : 0; + view->mods |= (GetKeyState(VK_LWIN) < 0) ? PUGL_MOD_SUPER : 0; + view->mods |= (GetKeyState(VK_RWIN) < 0) ? PUGL_MOD_SUPER : 0; +} + +static LRESULT +handleMessage(PuglView* view, UINT message, WPARAM wParam, LPARAM lParam) +{ + PAINTSTRUCT ps; + PuglKey key; + RECT rect; + MINMAXINFO* mmi; + + setModifiers(view); + switch (message) { + case WM_CREATE: + case WM_SHOWWINDOW: + case WM_SIZE: + GetClientRect(view->impl->hwnd, &rect); + puglReshape(view, rect.right, rect.bottom); + view->width = rect.right; + view->height = rect.bottom; + break; + case WM_GETMINMAXINFO: + mmi = (MINMAXINFO*)lParam; + mmi->ptMinTrackSize.x = view->min_width; + mmi->ptMinTrackSize.y = view->min_height; + break; + case WM_PAINT: + BeginPaint(view->impl->hwnd, &ps); + puglDisplay(view); + EndPaint(view->impl->hwnd, &ps); + break; + case WM_MOUSEMOVE: + if (view->motionFunc) { + view->event_timestamp_ms = GetMessageTime(); + view->motionFunc(view, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + } + break; + case WM_LBUTTONDOWN: + processMouseEvent(view, 1, true, lParam); + break; + case WM_MBUTTONDOWN: + processMouseEvent(view, 2, true, lParam); + break; + case WM_RBUTTONDOWN: + processMouseEvent(view, 3, true, lParam); + break; + case WM_LBUTTONUP: + processMouseEvent(view, 1, false, lParam); + break; + case WM_MBUTTONUP: + processMouseEvent(view, 2, false, lParam); + break; + case WM_RBUTTONUP: + processMouseEvent(view, 3, false, lParam); + break; + case WM_MOUSEWHEEL: + if (view->scrollFunc) { + view->event_timestamp_ms = GetMessageTime(); + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + ScreenToClient(view->impl->hwnd, &pt); + view->scrollFunc( + view, pt.x, pt.y, + 0.0f, GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA); + } + break; + case WM_MOUSEHWHEEL: + if (view->scrollFunc) { + view->event_timestamp_ms = GetMessageTime(); + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + ScreenToClient(view->impl->hwnd, &pt); + view->scrollFunc( + view, pt.x, pt.y, + GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA, 0.0f); + } + break; + case WM_KEYDOWN: + if (view->ignoreKeyRepeat && (lParam & (1 << 30))) { + break; + } // else nobreak + case WM_KEYUP: + view->event_timestamp_ms = GetMessageTime(); + if ((key = keySymToSpecial(wParam))) { + if (view->specialFunc) { + view->specialFunc(view, message == WM_KEYDOWN, key); + } + } else if (view->keyboardFunc) { + static BYTE kbs[256]; + if (GetKeyboardState(kbs) != FALSE) { + char lb[2]; + UINT scanCode = (lParam >> 8) & 0xFFFFFF00; + if ( 1 == ToAscii(wParam, scanCode, kbs, (LPWORD)lb, 0)) { + view->keyboardFunc(view, message == WM_KEYDOWN, (char)lb[0]); + } + } + } + break; + case WM_QUIT: + case PUGL_LOCAL_CLOSE_MSG: + if (view->closeFunc) { + view->closeFunc(view); + view->redisplay = false; + } + break; + default: + return DefWindowProc( + view->impl->hwnd, message, wParam, lParam); + } + + return 0; +} + +void +puglGrabFocus(PuglView* view) +{ + // TODO +} + +PuglStatus +puglProcessEvents(PuglView* view) +{ + MSG msg; + while (PeekMessage(&msg, view->impl->hwnd, 0, 0, PM_REMOVE)) { + handleMessage(view, msg.message, msg.wParam, msg.lParam); + } + + if (view->redisplay) { + InvalidateRect(view->impl->hwnd, NULL, FALSE); + } + + return PUGL_SUCCESS; +} + +LRESULT CALLBACK +wndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + PuglView* view = (PuglView*)GetWindowLongPtr(hwnd, GWLP_USERDATA); + + switch (message) { + case WM_CREATE: + PostMessage(hwnd, WM_SHOWWINDOW, TRUE, 0); + return 0; + case WM_CLOSE: + PostMessage(hwnd, PUGL_LOCAL_CLOSE_MSG, wParam, lParam); + return 0; + case WM_DESTROY: + return 0; + default: + if (view && hwnd == view->impl->hwnd) { + return handleMessage(view, message, wParam, lParam); + } else { + return DefWindowProc(hwnd, message, wParam, lParam); + } + } +} + +void +puglPostRedisplay(PuglView* view) +{ + view->redisplay = true; +} + +PuglNativeWindow +puglGetNativeWindow(PuglView* view) +{ + return (PuglNativeWindow)view->impl->hwnd; +} + +void* +puglGetContext(PuglView* view) +{ +#ifdef PUGL_HAVE_CAIRO + if (view->ctx_type == PUGL_CAIRO) { + // TODO + } +#endif + return NULL; +} diff --git a/dpf/dgl/src/pugl/pugl_x11.c b/dpf/dgl/src/pugl/pugl_x11.c new file mode 100644 index 0000000..d0cd881 --- /dev/null +++ b/dpf/dgl/src/pugl/pugl_x11.c @@ -0,0 +1,609 @@ +/* + Copyright 2012-2014 David Robillard + Copyright 2013 Robin Gareus + Copyright 2011-2012 Ben Loftis, Harrison Consoles + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file pugl_x11.c X11 Pugl Implementation. +*/ + +#include +#include +#include + +#include +#include +#include +#include + +#ifdef PUGL_HAVE_GL +#include +#include +#endif + +#ifdef PUGL_HAVE_CAIRO +#include +#include +#endif + +#include "pugl/pugl_internal.h" + +#define SOFD_HAVE_X11 +#include "../sofd/libsofd.h" +#include "../sofd/libsofd.c" + +struct PuglInternalsImpl { + Display* display; + int screen; + Window win; + XIM xim; + XIC xic; +#ifdef PUGL_HAVE_CAIRO + cairo_t* cr; + cairo_surface_t* surface; +#endif +#ifdef PUGL_HAVE_GL + GLXContext ctx; + Bool doubleBuffered; +#endif +}; + +PuglInternals* +puglInitInternals(void) +{ + return (PuglInternals*)calloc(1, sizeof(PuglInternals)); +} + +static XVisualInfo* +getVisual(PuglView* view) +{ + PuglInternals* const impl = view->impl; + XVisualInfo* vi = NULL; + +#ifdef PUGL_HAVE_GL + if (view->ctx_type == PUGL_GL) { + /** + Attributes for single-buffered RGBA with at least + 4 bits per color and a 16 bit depth buffer. + */ + int attrListSgl[] = { + GLX_RGBA, + GLX_RED_SIZE, 4, + GLX_GREEN_SIZE, 4, + GLX_BLUE_SIZE, 4, + GLX_DEPTH_SIZE, 16, + GLX_ARB_multisample, 1, + None + }; + + /** + Attributes for double-buffered RGBA with at least + 4 bits per color and a 16 bit depth buffer. + */ + int attrListDbl[] = { + GLX_RGBA, + GLX_DOUBLEBUFFER, + GLX_RED_SIZE, 4, + GLX_GREEN_SIZE, 4, + GLX_BLUE_SIZE, 4, + GLX_DEPTH_SIZE, 16, + GLX_ARB_multisample, 1, + None + }; + + /** + Attributes for double-buffered RGBA with multi-sampling + (antialiasing) + */ + int attrListDblMS[] = { + GLX_RGBA, + GLX_DOUBLEBUFFER, + GLX_RED_SIZE, 4, + GLX_GREEN_SIZE, 4, + GLX_BLUE_SIZE, 4, + GLX_ALPHA_SIZE, 4, + GLX_DEPTH_SIZE, 16, + GLX_SAMPLE_BUFFERS, 1, + GLX_SAMPLES, 4, + None + }; + + impl->doubleBuffered = True; + + vi = glXChooseVisual(impl->display, impl->screen, attrListDblMS); + + if (vi == NULL) { + vi = glXChooseVisual(impl->display, impl->screen, attrListDbl); + PUGL_LOG("multisampling (antialiasing) is not available\n"); + } + + if (vi == NULL) { + vi = glXChooseVisual(impl->display, impl->screen, attrListSgl); + impl->doubleBuffered = False; + PUGL_LOG("singlebuffered rendering will be used, no doublebuffering available\n"); + } + } +#endif +#ifdef PUGL_HAVE_CAIRO + if (view->ctx_type == PUGL_CAIRO) { + XVisualInfo pat; + int n; + pat.screen = impl->screen; + vi = XGetVisualInfo(impl->display, VisualScreenMask, &pat, &n); + } +#endif + + return vi; +} + +static bool +createContext(PuglView* view, XVisualInfo* vi) +{ + PuglInternals* const impl = view->impl; + +#ifdef PUGL_HAVE_GL + if (view->ctx_type == PUGL_GL) { + impl->ctx = glXCreateContext(impl->display, vi, 0, GL_TRUE); + return (impl->ctx != NULL); + } +#endif +#ifdef PUGL_HAVE_CAIRO + if (view->ctx_type == PUGL_CAIRO) { + impl->surface = cairo_xlib_surface_create( + impl->display, impl->win, vi->visual, view->width, view->height); + if (impl->surface == NULL) { + PUGL_LOG("failed to create cairo surface\n"); + return false; + } + impl->cr = cairo_create(impl->surface); + if (impl->cr == NULL) { + cairo_surface_destroy(impl->surface); + impl->surface = NULL; + PUGL_LOG("failed to create cairo context\n"); + return false; + } + return true; + } +#endif + + return false; +} + +static void +destroyContext(PuglView* view) +{ + PuglInternals* const impl = view->impl; + +#ifdef PUGL_HAVE_GL + if (view->ctx_type == PUGL_GL) { + glXDestroyContext(impl->display, impl->ctx); + impl->ctx = NULL; + } +#endif +#ifdef PUGL_HAVE_CAIRO + if (view->ctx_type == PUGL_CAIRO) { + cairo_destroy(impl->cr); + impl->cr = NULL; + + cairo_surface_destroy(impl->surface); + impl->surface = NULL; + } +#endif +} + +void +puglEnterContext(PuglView* view) +{ +#ifdef PUGL_HAVE_GL + if (view->ctx_type == PUGL_GL) { + glXMakeCurrent(view->impl->display, view->impl->win, view->impl->ctx); + } +#endif +} + +void +puglLeaveContext(PuglView* view, bool flush) +{ +#ifdef PUGL_HAVE_GL + if (view->ctx_type == PUGL_GL && flush) { + glFlush(); + if (view->impl->doubleBuffered) { + glXSwapBuffers(view->impl->display, view->impl->win); + } + } +#endif +} + +int +puglCreateWindow(PuglView* view, const char* title) +{ + PuglInternals* const impl = view->impl; + + impl->display = XOpenDisplay(NULL); + impl->screen = DefaultScreen(impl->display); + + XVisualInfo* const vi = getVisual(view); + if (!vi) { + XCloseDisplay(impl->display); + impl->display = NULL; + return 1; + } + +#ifdef PUGL_HAVE_GL + int glxMajor, glxMinor; + glXQueryVersion(impl->display, &glxMajor, &glxMinor); + PUGL_LOGF("GLX Version %d.%d\n", glxMajor, glxMinor); +#endif + + Window xParent = view->parent + ? (Window)view->parent + : RootWindow(impl->display, impl->screen); + + Colormap cmap = XCreateColormap( + impl->display, xParent, vi->visual, AllocNone); + + XSetWindowAttributes attr; + memset(&attr, 0, sizeof(XSetWindowAttributes)); + attr.background_pixel = BlackPixel(impl->display, impl->screen); + attr.border_pixel = BlackPixel(impl->display, impl->screen); + attr.colormap = cmap; + attr.event_mask = (ExposureMask | StructureNotifyMask | + EnterWindowMask | LeaveWindowMask | + KeyPressMask | KeyReleaseMask | + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask | FocusChangeMask); + + impl->win = XCreateWindow( + impl->display, xParent, + 0, 0, view->width, view->height, 0, vi->depth, InputOutput, vi->visual, + CWBackPixel | CWBorderPixel | CWColormap | CWEventMask, &attr); + + if (!createContext(view, vi)) { + XDestroyWindow(impl->display, impl->win); + impl->win = 0; + + XCloseDisplay(impl->display); + impl->display = NULL; + + return 1; + } + + XSizeHints sizeHints; + memset(&sizeHints, 0, sizeof(sizeHints)); + if (!view->resizable) { + sizeHints.flags = PMinSize|PMaxSize; + sizeHints.min_width = view->width; + sizeHints.min_height = view->height; + sizeHints.max_width = view->width; + sizeHints.max_height = view->height; + XSetNormalHints(impl->display, impl->win, &sizeHints); + } else if (view->min_width > 0 && view->min_height > 0) { + sizeHints.flags = PMinSize; + sizeHints.min_width = view->min_width; + sizeHints.min_height = view->min_height; + XSetNormalHints(impl->display, impl->win, &sizeHints); + } + + if (title) { + XStoreName(impl->display, impl->win, title); + } + + if (!view->parent) { + Atom wmDelete = XInternAtom(impl->display, "WM_DELETE_WINDOW", True); + XSetWMProtocols(impl->display, impl->win, &wmDelete, 1); + } + + if (glXIsDirect(impl->display, impl->ctx)) { + PUGL_LOG("DRI enabled (to disable, set LIBGL_ALWAYS_INDIRECT=1\n"); + } else { + PUGL_LOG("No DRI available\n"); + } + + XFree(vi); + + return PUGL_SUCCESS; +} + +void +puglShowWindow(PuglView* view) +{ + XMapRaised(view->impl->display, view->impl->win); +} + +void +puglHideWindow(PuglView* view) +{ + XUnmapWindow(view->impl->display, view->impl->win); +} + +void +puglDestroy(PuglView* view) +{ + if (!view) { + return; + } + + x_fib_close(view->impl->display); + + destroyContext(view); + XDestroyWindow(view->impl->display, view->impl->win); + XCloseDisplay(view->impl->display); + free(view->impl); + free(view); +} + +static void +puglReshape(PuglView* view, int width, int height) +{ + puglEnterContext(view); + + if (view->reshapeFunc) { + view->reshapeFunc(view, width, height); + } else { + puglDefaultReshape(view, width, height); + } + + puglLeaveContext(view, false); + + view->width = width; + view->height = height; +} + +static void +puglDisplay(PuglView* view) +{ + puglEnterContext(view); + + view->redisplay = false; + + if (view->displayFunc) { + view->displayFunc(view); + } + + puglLeaveContext(view, true); +} + +static PuglKey +keySymToSpecial(KeySym sym) +{ + switch (sym) { + case XK_F1: return PUGL_KEY_F1; + case XK_F2: return PUGL_KEY_F2; + case XK_F3: return PUGL_KEY_F3; + case XK_F4: return PUGL_KEY_F4; + case XK_F5: return PUGL_KEY_F5; + case XK_F6: return PUGL_KEY_F6; + case XK_F7: return PUGL_KEY_F7; + case XK_F8: return PUGL_KEY_F8; + case XK_F9: return PUGL_KEY_F9; + case XK_F10: return PUGL_KEY_F10; + case XK_F11: return PUGL_KEY_F11; + case XK_F12: return PUGL_KEY_F12; + case XK_Left: return PUGL_KEY_LEFT; + case XK_Up: return PUGL_KEY_UP; + case XK_Right: return PUGL_KEY_RIGHT; + case XK_Down: return PUGL_KEY_DOWN; + case XK_Page_Up: return PUGL_KEY_PAGE_UP; + case XK_Page_Down: return PUGL_KEY_PAGE_DOWN; + case XK_Home: return PUGL_KEY_HOME; + case XK_End: return PUGL_KEY_END; + case XK_Insert: return PUGL_KEY_INSERT; + case XK_Shift_L: return PUGL_KEY_SHIFT; + case XK_Shift_R: return PUGL_KEY_SHIFT; + case XK_Control_L: return PUGL_KEY_CTRL; + case XK_Control_R: return PUGL_KEY_CTRL; + case XK_Alt_L: return PUGL_KEY_ALT; + case XK_Alt_R: return PUGL_KEY_ALT; + case XK_Super_L: return PUGL_KEY_SUPER; + case XK_Super_R: return PUGL_KEY_SUPER; + } + return (PuglKey)0; +} + +static void +setModifiers(PuglView* view, unsigned xstate, unsigned xtime) +{ + view->event_timestamp_ms = xtime; + + view->mods = 0; + view->mods |= (xstate & ShiftMask) ? PUGL_MOD_SHIFT : 0; + view->mods |= (xstate & ControlMask) ? PUGL_MOD_CTRL : 0; + view->mods |= (xstate & Mod1Mask) ? PUGL_MOD_ALT : 0; + view->mods |= (xstate & Mod4Mask) ? PUGL_MOD_SUPER : 0; +} + +static void +dispatchKey(PuglView* view, XEvent* event, bool press) +{ + KeySym sym; + char str[5]; + const int n = XLookupString(&event->xkey, str, 4, &sym, NULL); + + if (sym == XK_Escape && view->closeFunc && !press && !view->parent) { + view->closeFunc(view); + view->redisplay = false; + return; + } + if (n == 0) { + return; + } + if (n > 1) { + fprintf(stderr, "warning: Unsupported multi-byte key %X\n", (int)sym); + return; + } + + const PuglKey special = keySymToSpecial(sym); + if (special && view->specialFunc) { + view->specialFunc(view, press, special); + } else if (!special && view->keyboardFunc) { + view->keyboardFunc(view, press, str[0]); + } +} + +PuglStatus +puglProcessEvents(PuglView* view) +{ + XEvent event; + while (XPending(view->impl->display) > 0) { + XNextEvent(view->impl->display, &event); + + if (x_fib_handle_events(view->impl->display, &event)) { + const int status = x_fib_status(); + + if (status > 0) { + char* const filename = x_fib_filename(); + x_fib_close(view->impl->display); + if (view->fileSelectedFunc) { + view->fileSelectedFunc(view, filename); + } + free(filename); + } else if (status < 0) { + x_fib_close(view->impl->display); + if (view->fileSelectedFunc) { + view->fileSelectedFunc(view, NULL); + } + } + break; + } + + if (event.xany.window != view->impl->win) { + continue; + } + + switch (event.type) { + case MapNotify: + puglReshape(view, view->width, view->height); + break; + case ConfigureNotify: + if ((event.xconfigure.width != view->width) || + (event.xconfigure.height != view->height)) { + puglReshape(view, + event.xconfigure.width, + event.xconfigure.height); + } + break; + case Expose: + if (event.xexpose.count != 0) { + break; + } + puglDisplay(view); + break; + case MotionNotify: + setModifiers(view, event.xmotion.state, event.xmotion.time); + if (view->motionFunc) { + view->motionFunc(view, event.xmotion.x, event.xmotion.y); + } + break; + case ButtonPress: + setModifiers(view, event.xbutton.state, event.xbutton.time); + if (event.xbutton.button >= 4 && event.xbutton.button <= 7) { + if (view->scrollFunc) { + float dx = 0, dy = 0; + switch (event.xbutton.button) { + case 4: dy = 1.0f; break; + case 5: dy = -1.0f; break; + case 6: dx = -1.0f; break; + case 7: dx = 1.0f; break; + } + view->scrollFunc(view, event.xbutton.x, event.xbutton.y, dx, dy); + } + break; + } + // nobreak + case ButtonRelease: + setModifiers(view, event.xbutton.state, event.xbutton.time); + if (view->mouseFunc && + (event.xbutton.button < 4 || event.xbutton.button > 7)) { + view->mouseFunc(view, + event.xbutton.button, event.type == ButtonPress, + event.xbutton.x, event.xbutton.y); + } + break; + case KeyPress: + setModifiers(view, event.xkey.state, event.xkey.time); + dispatchKey(view, &event, true); + break; + case KeyRelease: { + setModifiers(view, event.xkey.state, event.xkey.time); + bool repeated = false; + if (view->ignoreKeyRepeat && + XEventsQueued(view->impl->display, QueuedAfterReading)) { + XEvent next; + XPeekEvent(view->impl->display, &next); + if (next.type == KeyPress && + next.xkey.time == event.xkey.time && + next.xkey.keycode == event.xkey.keycode) { + XNextEvent(view->impl->display, &event); + repeated = true; + } + } + if (!repeated) { + dispatchKey(view, &event, false); + } + } break; + case ClientMessage: { + char* type = XGetAtomName(view->impl->display, + event.xclient.message_type); + if (!strcmp(type, "WM_PROTOCOLS")) { + if (view->closeFunc) { + view->closeFunc(view); + view->redisplay = false; + } + } + XFree(type); + } break; +#ifdef PUGL_GRAB_FOCUS + case EnterNotify: + XSetInputFocus(view->impl->display, view->impl->win, RevertToPointerRoot, CurrentTime); + break; +#endif + default: + break; + } + } + + if (view->redisplay) { + puglDisplay(view); + } + + return PUGL_SUCCESS; +} + +void +puglPostRedisplay(PuglView* view) +{ + view->redisplay = true; +} + +PuglNativeWindow +puglGetNativeWindow(PuglView* view) +{ + return view->impl->win; +} + +void* +puglGetContext(PuglView* view) +{ +#ifdef PUGL_HAVE_CAIRO + if (view->ctx_type == PUGL_CAIRO) { + return view->impl->cr; + } +#endif + return NULL; + + // may be unused + (void)view; +} diff --git a/dpf/dgl/src/sofd/libsofd.c b/dpf/dgl/src/sofd/libsofd.c new file mode 100644 index 0000000..bcca9f7 --- /dev/null +++ b/dpf/dgl/src/sofd/libsofd.c @@ -0,0 +1,2431 @@ +/* libSOFD - Simple Open File Dialog [for X11 without toolkit] + * + * Copyright (C) 2014 Robin Gareus + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* Test and example: + * gcc -Wall -D SOFD_TEST -g -o sofd libsofd.c -lX11 + * + * public API documentation and example code at the bottom of this file + * + * This small lib may one day include openGL rendering and + * wayland window support, but not today. Today we celebrate + * 30 years of X11. + */ + +#ifdef SOFD_TEST +#define SOFD_HAVE_X11 +#include "libsofd.h" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wnarrowing" +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wnarrowing" +#endif + +// shared 'recently used' implementation +// sadly, xbel does not qualify as simple. +// hence we use a simple format alike the +// gtk-bookmark list (one file per line) + +#define MAX_RECENT_ENTRIES 24 +#define MAX_RECENT_AGE (15552000) // 180 days (in sec) + +typedef struct { + char path[1024]; + time_t atime; +} FibRecentFile; + +static FibRecentFile *_recentlist = NULL; +static unsigned int _recentcnt = 0; +static uint8_t _recentlock = 0; + +static int fib_isxdigit (const char x) { + if ( + (x >= '0' && x <= '9') + || + (x >= 'a' && x <= 'f') + || + (x >= 'A' && x <= 'F') + ) return 1; + return 0; +} + +static void decode_3986 (char *str) { + int len = strlen (str); + int idx = 0; + while (idx + 2 < len) { + char *in = &str[idx]; + if (('%' == *in) && fib_isxdigit (in[1]) && fib_isxdigit (in[2])) { + char hexstr[3]; + hexstr[0] = in[1]; + hexstr[1] = in[2]; + hexstr[2] = 0; + long hex = strtol (hexstr, NULL, 16); + *in = hex; + memmove (&str[idx+1], &str[idx + 3], len - idx - 2); + len -= 2; + } + ++idx; + } +} + +static char *encode_3986 (const char *str) { + size_t alloc, newlen; + char *ns = NULL; + unsigned char in; + size_t i = 0; + size_t length; + + if (!str) return strdup (""); + + alloc = strlen (str) + 1; + newlen = alloc; + + ns = (char*) malloc (alloc); + + length = alloc; + while (--length) { + in = *str; + + switch (in) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case 'a': case 'b': case 'c': case 'd': case 'e': + case 'f': case 'g': case 'h': case 'i': case 'j': + case 'k': case 'l': case 'm': case 'n': case 'o': + case 'p': case 'q': case 'r': case 's': case 't': + case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': + case 'A': case 'B': case 'C': case 'D': case 'E': + case 'F': case 'G': case 'H': case 'I': case 'J': + case 'K': case 'L': case 'M': case 'N': case 'O': + case 'P': case 'Q': case 'R': case 'S': case 'T': + case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': + case '_': case '~': case '.': case '-': + case '/': case ',': // XXX not in RFC3986 + ns[i++] = in; + break; + default: + newlen += 2; /* this'll become a %XX */ + if (newlen > alloc) { + alloc *= 2; + ns = (char*) realloc (ns, alloc); + } + snprintf (&ns[i], 4, "%%%02X", in); + i += 3; + break; + } + ++str; + } + ns[i] = 0; + return ns; +} + +void x_fib_free_recent () { + free (_recentlist); + _recentlist = NULL; + _recentcnt = 0; +} + +static int cmp_recent (const void *p1, const void *p2) { + FibRecentFile *a = (FibRecentFile*) p1; + FibRecentFile *b = (FibRecentFile*) p2; + if (a->atime == b->atime) return 0; + return a->atime < b->atime; +} + +int x_fib_add_recent (const char *path, time_t atime) { + unsigned int i; + struct stat fs; + if (_recentlock) { return -1; } + if (access (path, R_OK)) { + return -1; + } + if (stat (path, &fs)) { + return -1; + } + if (!S_ISREG (fs.st_mode)) { + return -1; + } + if (atime == 0) atime = time (NULL); + if (MAX_RECENT_AGE > 0 && atime + MAX_RECENT_AGE < time (NULL)) { + return -1; + } + + for (i = 0; i < _recentcnt; ++i) { + if (!strcmp (_recentlist[i].path, path)) { + if (_recentlist[i].atime < atime) { + _recentlist[i].atime = atime; + } + qsort (_recentlist, _recentcnt, sizeof(FibRecentFile), cmp_recent); + return _recentcnt; + } + } + _recentlist = (FibRecentFile*)realloc (_recentlist, (_recentcnt + 1) * sizeof(FibRecentFile)); + _recentlist[_recentcnt].atime = atime; + strcpy (_recentlist[_recentcnt].path, path); + qsort (_recentlist, _recentcnt + 1, sizeof(FibRecentFile), cmp_recent); + + if (_recentcnt >= MAX_RECENT_ENTRIES) { + return (_recentcnt); + } + return (++_recentcnt); +} + +#ifdef PATHSEP +#undef PATHSEP +#endif + +#ifdef PLATFORM_WINDOWS +#define DIRSEP '\\' +#else +#define DIRSEP '/' +#endif + +static void mkpath(const char *dir) { + char tmp[1024]; + char *p; + size_t len; + + snprintf (tmp, sizeof(tmp), "%s", dir); + len = strlen(tmp); + if (tmp[len - 1] == '/') + tmp[len - 1] = 0; + for (p = tmp + 1; *p; ++p) + if(*p == DIRSEP) { + *p = 0; +#ifdef PLATFORM_WINDOWS + mkdir(tmp); +#else + mkdir(tmp, 0755); +#endif + *p = DIRSEP; + } +#ifdef PLATFORM_WINDOWS + mkdir(tmp); +#else + mkdir(tmp, 0755); +#endif +} + +int x_fib_save_recent (const char *fn) { + if (_recentlock) { return -1; } + if (!fn) { return -1; } + if (_recentcnt < 1 || !_recentlist) { return -1; } + unsigned int i; + char *dn = strdup (fn); + mkpath (dirname (dn)); + free (dn); + + FILE *rf = fopen (fn, "w"); + if (!rf) return -1; + + qsort (_recentlist, _recentcnt, sizeof(FibRecentFile), cmp_recent); + for (i = 0; i < _recentcnt; ++i) { + char *n = encode_3986 (_recentlist[i].path); + fprintf (rf, "%s %lu\n", n, _recentlist[i].atime); + free (n); + } + fclose (rf); + return 0; +} + +int x_fib_load_recent (const char *fn) { + char tmp[1024]; + if (_recentlock) { return -1; } + if (!fn) { return -1; } + x_fib_free_recent (); + if (access (fn, R_OK)) { + return -1; + } + FILE *rf = fopen (fn, "r"); + if (!rf) return -1; + while (fgets (tmp, sizeof(tmp), rf) + && strlen (tmp) > 1 + && strlen (tmp) < sizeof(tmp)) + { + char *s; + tmp[strlen (tmp) - 1] = '\0'; // strip newline + if (!(s = strchr (tmp, ' '))) { // find name <> atime sep + continue; + } + *s = '\0'; + time_t t = atol (++s); + decode_3986 (tmp); + x_fib_add_recent (tmp, t); + } + fclose (rf); + return 0; +} + +unsigned int x_fib_recent_count () { + return _recentcnt; +} + +const char *x_fib_recent_at (unsigned int i) { + if (i >= _recentcnt) + return NULL; + return _recentlist[i].path; +} + +#ifdef PLATFORM_WINDOWS +#define PATHSEP "\\" +#else +#define PATHSEP "/" +#endif + +const char *x_fib_recent_file(const char *appname) { + static char recent_file[1024]; + assert(!strchr(appname, '/')); + const char *xdg = getenv("XDG_DATA_HOME"); + if (xdg && (strlen(xdg) + strlen(appname) + 10) < sizeof(recent_file)) { + sprintf(recent_file, "%s" PATHSEP "%s" PATHSEP "recent", xdg, appname); + return recent_file; + } +#ifdef PLATFORM_WINDOWS + const char * homedrive = getenv("HOMEDRIVE"); + const char * homepath = getenv("HOMEPATH"); + if (homedrive && homepath && (strlen(homedrive) + strlen(homepath) + strlen(appname) + 29) < PATH_MAX) { + sprintf(recent_file, "%s%s" PATHSEP "Application Data" PATHSEP "%s" PATHSEP "recent.txt", homedrive, homepath, appname); + return recent_file; + } +#elif defined PLATFORM_OSX + const char *home = getenv("HOME"); + if (home && (strlen(home) + strlen(appname) + 29) < sizeof(recent_file)) { + sprintf(recent_file, "%s/Library/Preferences/%s/recent", home, appname); + return recent_file; + } +#else + const char *home = getenv("HOME"); + if (home && (strlen(home) + strlen(appname) + 22) < sizeof(recent_file)) { + sprintf(recent_file, "%s/.local/share/%s/recent", home, appname); + return recent_file; + } +#endif + return NULL; +} + +#ifdef SOFD_HAVE_X11 +#include +#include + +#include +#include +#include +#include +#include + +#ifndef MIN +#define MIN(A,B) ( (A) < (B) ? (A) : (B) ) +#endif + +#ifndef MAX +#define MAX(A,B) ( (A) < (B) ? (B) : (A) ) +#endif + +static Window _fib_win = 0; +static GC _fib_gc = 0; +static XColor _c_gray0, _c_gray1, _c_gray2, _c_gray3, _c_gray4, _c_gray5, _c_gray6; +static Font _fibfont = 0; +static Pixmap _pixbuffer = None; + +static int _fib_width = 100; +static int _fib_height = 100; +static int _btn_w = 0; +static int _btn_span = 0; + +static int _fib_font_height = 0; +static int _fib_dir_indent = 0; +static int _fib_spc_norm = 0; +static int _fib_font_ascent = 0; +static int _fib_font_vsep = 0; +static int _fib_font_size_width = 0; +static int _fib_font_time_width = 0; +static int _fib_place_width = 0; + +static int _scrl_f = 0; +static int _scrl_y0 = -1; +static int _scrl_y1 = -1; +static int _scrl_my = -1; +static int _scrl_mf = -1; +static int _view_p = -1; + +static int _fsel = -1; +static int _hov_b = -1; +static int _hov_f = -1; +static int _hov_p = -1; +static int _hov_h = -1; +static int _hov_l = -1; +static int _hov_s = -1; +static int _sort = 0; +static int _columns = 0; +static int _fib_filter_fn = 1; +static int _fib_hidden_fn = 0; +static int _fib_show_places = 0; + +static uint8_t _fib_mapped = 0; +static uint8_t _fib_resized = 0; +static unsigned long _dblclk = 0; + +static int _status = -2; +static char _rv_open[1024] = ""; + +static char _fib_cfg_custom_places[1024] = ""; +static char _fib_cfg_custom_font[256] = ""; +static char _fib_cfg_title[128] = "xjadeo - Open Video File"; + +typedef struct { + char name[256]; + int x0; + int xw; +} FibPathButton; + +typedef struct { + char name[256]; + char strtime[32]; + char strsize[32]; + int ssizew; + off_t size; + time_t mtime; + uint8_t flags; // 2: selected, 4: isdir 8: recent-entry + FibRecentFile *rfp; +} FibFileEntry; + +typedef struct { + char text[24]; + uint8_t flags; // 2: selected, 4: toggle, 8 disable + int x0; + int tw; + int xw; + void (*callback)(Display*); +} FibButton; + +typedef struct { + char name[256]; + char path[1024]; + uint8_t flags; // 1: hover, 2: selected, 4:add sep +} FibPlace; + +static char _cur_path[1024] = ""; +static FibFileEntry *_dirlist = NULL; +static FibPathButton *_pathbtn = NULL; +static FibPlace *_placelist = NULL; +static int _dircount = 0; +static int _pathparts = 0; +static int _placecnt = 0; + +static FibButton _btn_ok; +static FibButton _btn_cancel; +static FibButton _btn_filter; +static FibButton _btn_places; +static FibButton _btn_hidden; +static FibButton *_btns[] = {&_btn_places, &_btn_filter, &_btn_hidden, &_btn_cancel, &_btn_ok}; + +static int (*_fib_filter_function)(const char *filename); + +/* hardcoded layout */ +#define DSEP 6 // px; horiz space beween elements, also l+r margin for file-list +#define PSEP 4 // px; horiz space beween paths +#define FILECOLUMN (17 * _fib_dir_indent) //px; min width of file-column +#define LISTTOP 2.7 //em; top of the file-browser list +#define LISTBOT 4.75 //em; bottom of the file-browers list +#define BTNBTMMARGIN 0.75 //em; height/margin of the button row +#define BTNPADDING 2 // px - only used for open/cancel buttons +#define SCROLLBARW (3 + (_fib_spc_norm&~1)) //px; - should be SCROLLBARW = (N * 2 + 3) +#define SCROLLBOXH 10 //px; arrow box top+bottom +#define PLACESW _fib_place_width //px; +#define PLACESWMAX (15 *_fib_spc_norm) //px; +#define PATHBTNTOP _fib_font_vsep //px; offset by (_fib_font_ascent); +#define FAREAMRGB 3 //px; base L+R margin +#define FAREAMRGR (FAREAMRGB + 1) //px; right margin of file-area + 1 (line width) +#define FAREAMRGL (_fib_show_places ? PLACESW + FAREAMRGB : FAREAMRGB) //px; left margin of file-area +#define TEXTSEP 4 //px; +#define FAREATEXTL (FAREAMRGL + TEXTSEP) //px; filename text-left FAREAMRGL + TEXTSEP +#define SORTBTNOFF -10 //px; + +#define DBLCLKTME 400 //msec; double click time +#define DRAW_OUTLINE +#define DOUBLE_BUFFER + +static int query_font_geometry (Display *dpy, GC gc, const char *txt, int *w, int *h, int *a, int *d) { + XCharStruct text_structure; + int font_direction, font_ascent, font_descent; + XFontStruct *fontinfo = XQueryFont (dpy, XGContextFromGC (gc)); + + if (!fontinfo) { return -1; } + XTextExtents (fontinfo, txt, strlen (txt), &font_direction, &font_ascent, &font_descent, &text_structure); + if (w) *w = XTextWidth (fontinfo, txt, strlen (txt)); + if (h) *h = text_structure.ascent + text_structure.descent; + if (a) *a = text_structure.ascent; + if (d) *d = text_structure.descent; + XFreeFontInfo (NULL, fontinfo, 1); + return 0; +} + +static void VDrawRectangle (Display *dpy, Drawable d, GC gc, int x, int y, unsigned int w, unsigned int h) { + const unsigned long blackColor = BlackPixel (dpy, DefaultScreen (dpy)); +#ifdef DRAW_OUTLINE + XSetForeground (dpy, gc, _c_gray5.pixel); + XDrawLine (dpy, d, gc, x + 1, y + h, x + w, y + h); + XDrawLine (dpy, d, gc, x + w, y + 1, x + w, y + h); + + XSetForeground (dpy, gc, blackColor); + XDrawLine (dpy, d, gc, x + 1, y, x + w, y); + XDrawLine (dpy, d, gc, x, y + 1, x, y + h); +#else + XSetForeground (dpy, _fib_gc, blackColor); + XDrawRectangle (dpy, d, gc, x, y, w, h); +#endif +} + +static void fib_expose (Display *dpy, Window realwin) { + int i; + XID win; + const unsigned long whiteColor = WhitePixel (dpy, DefaultScreen (dpy)); + const unsigned long blackColor = BlackPixel (dpy, DefaultScreen (dpy)); + if (!_fib_mapped) return; + + if (_fib_resized +#ifdef DOUBLE_BUFFER + || !_pixbuffer +#endif + ) + { +#ifdef DOUBLE_BUFFER + unsigned int w = 0, h = 0; + if (_pixbuffer != None) { + Window ignored_w; + int ignored_i; + unsigned int ignored_u; + XGetGeometry(dpy, _pixbuffer, &ignored_w, &ignored_i, &ignored_i, &w, &h, &ignored_u, &ignored_u); + if (_fib_width != (int)w || _fib_height != (int)h) { + XFreePixmap (dpy, _pixbuffer); + _pixbuffer = None; + } + } + if (_pixbuffer == None) { + XWindowAttributes wa; + XGetWindowAttributes (dpy, realwin, &wa); + _pixbuffer = XCreatePixmap (dpy, realwin, _fib_width, _fib_height, wa.depth); + } +#endif + if (_pixbuffer != None) { + XSetForeground (dpy, _fib_gc, _c_gray1.pixel); + XFillRectangle (dpy, _pixbuffer, _fib_gc, 0, 0, _fib_width, _fib_height); + } else { + XSetForeground (dpy, _fib_gc, _c_gray1.pixel); + XFillRectangle (dpy, realwin, _fib_gc, 0, 0, _fib_width, _fib_height); + } + _fib_resized = 0; + } + + if (_pixbuffer == None) { + win = realwin; + } else { + win = _pixbuffer; + } + + // Top Row: dirs and up navigation + + int ppw = 0; + int ppx = FAREAMRGB; + + for (i = _pathparts - 1; i >= 0; --i) { + ppw += _pathbtn[i].xw + PSEP; + if (ppw >= _fib_width - PSEP - _pathbtn[0].xw - FAREAMRGB) break; // XXX, first change is from "/" to "<", NOOP + } + ++i; + // border-less "<" parent/up, IFF space is limited + if (i > 0) { + if (0 == _hov_p || (_hov_p > 0 && _hov_p < _pathparts - 1)) { + XSetForeground (dpy, _fib_gc, _c_gray4.pixel); + } else { + XSetForeground (dpy, _fib_gc, blackColor); + } + XDrawString (dpy, win, _fib_gc, ppx, PATHBTNTOP, "<", 1); + ppx += _pathbtn[0].xw + PSEP; + if (i == _pathparts) --i; + } + + _view_p = i; + + while (i < _pathparts) { + if (i == _hov_p) { + XSetForeground (dpy, _fib_gc, _c_gray0.pixel); + } else { + XSetForeground (dpy, _fib_gc, _c_gray2.pixel); + } + XFillRectangle (dpy, win, _fib_gc, + ppx + 1, PATHBTNTOP - _fib_font_ascent, + _pathbtn[i].xw - 1, _fib_font_height); + VDrawRectangle (dpy, win, _fib_gc, + ppx, PATHBTNTOP - _fib_font_ascent, + _pathbtn[i].xw, _fib_font_height); + XDrawString (dpy, win, _fib_gc, ppx + 1 + BTNPADDING, PATHBTNTOP, + _pathbtn[i].name, strlen (_pathbtn[i].name)); + _pathbtn[i].x0 = ppx; // current position + ppx += _pathbtn[i].xw + PSEP; + ++i; + } + + // middle, scroll list of file names + const int ltop = LISTTOP * _fib_font_vsep; + const int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; + const int fsel_height = 4 + llen * _fib_font_vsep; + const int fsel_width = _fib_width - FAREAMRGL - FAREAMRGR - (llen < _dircount ? SCROLLBARW : 0); + const int t_x = FAREATEXTL; + int t_s = FAREATEXTL + fsel_width; + int t_t = FAREATEXTL + fsel_width; + + // check which colums can be visible + // depending on available width of window. + _columns = 0; + if (fsel_width > FILECOLUMN + _fib_font_size_width + _fib_font_time_width) { + _columns |= 2; + t_s = FAREAMRGL + fsel_width - _fib_font_time_width - TEXTSEP; + } + if (fsel_width > FILECOLUMN + _fib_font_size_width) { + _columns |= 1; + t_t = t_s - _fib_font_size_width - TEXTSEP; + } + + int fstop = _scrl_f; // first entry in scroll position + const int ttop = ltop - _fib_font_height + _fib_font_ascent; + + if (fstop > 0 && fstop + llen > _dircount) { + fstop = MAX (0, _dircount - llen); + _scrl_f = fstop; + } + + // list header + XSetForeground (dpy, _fib_gc, _c_gray3.pixel); + XFillRectangle (dpy, win, _fib_gc, FAREAMRGL, ltop - _fib_font_vsep, fsel_width, _fib_font_vsep); + + // draw background of file list + XSetForeground (dpy, _fib_gc, _c_gray2.pixel); + XFillRectangle (dpy, win, _fib_gc, FAREAMRGL, ltop, fsel_width, fsel_height); + +#ifdef DRAW_OUTLINE + VDrawRectangle (dpy, win, _fib_gc, FAREAMRGL, ltop - _fib_font_vsep -1, _fib_width - FAREAMRGL - FAREAMRGR, fsel_height + _fib_font_vsep + 1); +#endif + + switch (_hov_h) { + case 1: + XSetForeground (dpy, _fib_gc, _c_gray0.pixel); + XFillRectangle (dpy, win, _fib_gc, t_x + _fib_dir_indent - TEXTSEP + 1, ltop - _fib_font_vsep, t_t - t_x - _fib_dir_indent - 1, _fib_font_vsep); + break; + case 2: + XSetForeground (dpy, _fib_gc, _c_gray0.pixel); + XFillRectangle (dpy, win, _fib_gc, t_t - TEXTSEP + 1, ltop - _fib_font_vsep, _fib_font_size_width + TEXTSEP - 1, _fib_font_vsep); + break; + case 3: + XSetForeground (dpy, _fib_gc, _c_gray0.pixel); + XFillRectangle (dpy, win, _fib_gc, t_s - TEXTSEP + 1, ltop - _fib_font_vsep, TEXTSEP + TEXTSEP + _fib_font_time_width - 1, _fib_font_vsep); + break; + default: + break; + } + + // column headings and sort order + int arp = MAX (2, _fib_font_height / 5); // arrow scale + const int trioff = _fib_font_height - _fib_font_ascent - arp + 1; + XPoint ptri[4] = { {0, ttop - trioff }, {arp, -arp - arp - 1}, {-arp - arp, 0}, {arp, arp + arp + 1}}; + if (_sort & 1) { + ptri[0].y = ttop -arp - arp - 1; + ptri[1].y *= -1; + ptri[3].y *= -1; + } + switch (_sort) { + case 0: + case 1: + ptri[0].x = t_t + SORTBTNOFF + 2 - arp; + XSetForeground (dpy, _fib_gc, _c_gray6.pixel); + XFillPolygon (dpy, win, _fib_gc, ptri, 3, Convex, CoordModePrevious); + XDrawLines (dpy, win, _fib_gc, ptri, 4, CoordModePrevious); + break; + case 2: + case 3: + if (_columns & 1) { + ptri[0].x = t_s + SORTBTNOFF + 2 - arp; + XSetForeground (dpy, _fib_gc, _c_gray6.pixel); + XFillPolygon (dpy, win, _fib_gc, ptri, 3, Convex, CoordModePrevious); + XDrawLines (dpy, win, _fib_gc, ptri, 4, CoordModePrevious); + } + break; + case 4: + case 5: + if (_columns & 2) { + ptri[0].x = FAREATEXTL + fsel_width + SORTBTNOFF + 2 - arp; + XSetForeground (dpy, _fib_gc, _c_gray6.pixel); + XFillPolygon (dpy, win, _fib_gc, ptri, 3, Convex, CoordModePrevious); + XDrawLines (dpy, win, _fib_gc, ptri, 4, CoordModePrevious); + } + break; + } + +#if 0 // bottom header bottom border + XSetForeground (dpy, _fib_gc, _c_gray5.pixel); + XSetLineAttributes (dpy, _fib_gc, 1, LineOnOffDash, CapButt, JoinMiter); + XDrawLine (dpy, win, _fib_gc, + FAREAMRGL + 1, ltop, + FAREAMRGL + fsel_width, ltop); + XSetLineAttributes (dpy, _fib_gc, 1, LineSolid, CapButt, JoinMiter); +#endif + + XSetForeground (dpy, _fib_gc, _c_gray4.pixel); + XDrawLine (dpy, win, _fib_gc, + t_x + _fib_dir_indent - TEXTSEP, ltop - _fib_font_vsep + 3, + t_x + _fib_dir_indent - TEXTSEP, ltop - 3); + + XSetForeground (dpy, _fib_gc, blackColor); + XDrawString (dpy, win, _fib_gc, t_x + _fib_dir_indent, ttop, "Name", 4); + + if (_columns & 1) { + XSetForeground (dpy, _fib_gc, _c_gray4.pixel); + XDrawLine (dpy, win, _fib_gc, + t_t - TEXTSEP, ltop - _fib_font_vsep + 3, + t_t - TEXTSEP, ltop - 3); + XSetForeground (dpy, _fib_gc, blackColor); + XDrawString (dpy, win, _fib_gc, t_t, ttop, "Size", 4); + } + + if (_columns & 2) { + XSetForeground (dpy, _fib_gc, _c_gray4.pixel); + XDrawLine (dpy, win, _fib_gc, + t_s - TEXTSEP, ltop - _fib_font_vsep + 3, + t_s - TEXTSEP, ltop - 3); + XSetForeground (dpy, _fib_gc, blackColor); + if (_pathparts > 0) + XDrawString (dpy, win, _fib_gc, t_s, ttop, "Last Modified", 13); + else + XDrawString (dpy, win, _fib_gc, t_s, ttop, "Last Used", 9); + } + + // scrollbar sep + if (llen < _dircount) { + const int sx0 = _fib_width - SCROLLBARW - FAREAMRGR; + XSetForeground (dpy, _fib_gc, _c_gray4.pixel); + XDrawLine (dpy, win, _fib_gc, + sx0 - 1, ltop - _fib_font_vsep, +#ifdef DRAW_OUTLINE + sx0 - 1, ltop + fsel_height +#else + sx0 - 1, ltop - 1 +#endif + ); + } + + // clip area for file-name + XRectangle clp = {FAREAMRGL + 1, ltop, t_t - FAREAMRGL - TEXTSEP - TEXTSEP - 1, fsel_height}; + + // list files in view + for (i = 0; i < llen; ++i) { + const int j = i + fstop; + if (j >= _dircount) break; + + const int t_y = ltop + (i+1) * _fib_font_vsep - 4; + + XSetForeground (dpy, _fib_gc, blackColor); + if (_dirlist[j].flags & 2) { + XSetForeground (dpy, _fib_gc, blackColor); + XFillRectangle (dpy, win, _fib_gc, + FAREAMRGL, t_y - _fib_font_ascent, fsel_width, _fib_font_height); + XSetForeground (dpy, _fib_gc, whiteColor); + } + if (_hov_f == j && !(_dirlist[j].flags & 2)) { + XSetForeground (dpy, _fib_gc, _c_gray4.pixel); + } + if (_dirlist[j].flags & 4) { + XDrawString (dpy, win, _fib_gc, t_x, t_y, "D", 1); + } + XSetClipRectangles (dpy, _fib_gc, 0, 0, &clp, 1, Unsorted); + XDrawString (dpy, win, _fib_gc, + t_x + _fib_dir_indent, t_y, + _dirlist[j].name, strlen (_dirlist[j].name)); + XSetClipMask (dpy, _fib_gc, None); + + if (_columns & 1) // right-aligned 'size' + XDrawString (dpy, win, _fib_gc, + t_s - TEXTSEP - 2 - _dirlist[j].ssizew, t_y, + _dirlist[j].strsize, strlen (_dirlist[j].strsize)); + if (_columns & 2) + XDrawString (dpy, win, _fib_gc, + t_s, t_y, + _dirlist[j].strtime, strlen (_dirlist[j].strtime)); + } + + // scrollbar + if (llen < _dircount) { + float sl = (fsel_height + _fib_font_vsep - (SCROLLBOXH + SCROLLBOXH)) / (float) _dircount; + sl = MAX ((8. / llen), sl); // 8px min height of scroller + const int sy1 = llen * sl; + const float mx = (fsel_height + _fib_font_vsep - (SCROLLBOXH + SCROLLBOXH) - sy1) / (float)(_dircount - llen); + const int sy0 = fstop * mx; + const int sx0 = _fib_width - SCROLLBARW - FAREAMRGR; + const int stop = ltop - _fib_font_vsep; + + _scrl_y0 = stop + SCROLLBOXH + sy0; + _scrl_y1 = _scrl_y0 + sy1; + + assert (fstop + llen <= _dircount); + // scroll-bar background + XSetForeground (dpy, _fib_gc, _c_gray3.pixel); + XFillRectangle (dpy, win, _fib_gc, sx0, stop, SCROLLBARW, fsel_height + _fib_font_vsep); + + // scroller + if (_hov_s == 0) { + XSetForeground (dpy, _fib_gc, _c_gray0.pixel); + } else { + XSetForeground (dpy, _fib_gc, _c_gray1.pixel); + } + XFillRectangle (dpy, win, _fib_gc, sx0 + 1, stop + SCROLLBOXH + sy0, SCROLLBARW - 2, sy1); + + int scrw = (SCROLLBARW -3) / 2; + // arrows top and bottom + if (_hov_s == 1) { + XSetForeground (dpy, _fib_gc, _c_gray0.pixel); + } else { + XSetForeground (dpy, _fib_gc, _c_gray1.pixel); + } + XPoint ptst[4] = { {sx0 + 1, stop + 8}, {scrw, -7}, {scrw, 7}, {-2 * scrw, 0}}; + XFillPolygon (dpy, win, _fib_gc, ptst, 3, Convex, CoordModePrevious); + XDrawLines (dpy, win, _fib_gc, ptst, 4, CoordModePrevious); + + if (_hov_s == 2) { + XSetForeground (dpy, _fib_gc, _c_gray0.pixel); + } else { + XSetForeground (dpy, _fib_gc, _c_gray1.pixel); + } + XPoint ptsb[4] = { {sx0 + 1, ltop + fsel_height - 9}, {2*scrw, 0}, {-scrw, 7}, {-scrw, -7}}; + XFillPolygon (dpy, win, _fib_gc, ptsb, 3, Convex, CoordModePrevious); + XDrawLines (dpy, win, _fib_gc, ptsb, 4, CoordModePrevious); + } else { + _scrl_y0 = _scrl_y1 = -1; + } + + if (_fib_show_places) { + assert (_placecnt > 0); + + // heading + XSetForeground (dpy, _fib_gc, _c_gray3.pixel); + XFillRectangle (dpy, win, _fib_gc, FAREAMRGB, ltop - _fib_font_vsep, PLACESW - TEXTSEP, _fib_font_vsep); + + // body + XSetForeground (dpy, _fib_gc, _c_gray2.pixel); + XFillRectangle (dpy, win, _fib_gc, FAREAMRGB, ltop, PLACESW - TEXTSEP, fsel_height); + +#ifdef DRAW_OUTLINE + VDrawRectangle (dpy, win, _fib_gc, FAREAMRGB, ltop - _fib_font_vsep -1, PLACESW - TEXTSEP, fsel_height + _fib_font_vsep + 1); +#endif + + XSetForeground (dpy, _fib_gc, blackColor); + XDrawString (dpy, win, _fib_gc, FAREAMRGB + TEXTSEP, ttop, "Places", 6); + + XRectangle pclip = {FAREAMRGB + 1, ltop, PLACESW - TEXTSEP -1, fsel_height}; + XSetClipRectangles (dpy, _fib_gc, 0, 0, &pclip, 1, Unsorted); + const int plx = FAREAMRGB + TEXTSEP; + for (i = 0; i < llen && i < _placecnt; ++i) { + const int ply = ltop + (i+1) * _fib_font_vsep - 4; + if (i == _hov_l) { + XSetForeground (dpy, _fib_gc, _c_gray4.pixel); + } else { + XSetForeground (dpy, _fib_gc, blackColor); + } + XDrawString (dpy, win, _fib_gc, + plx, ply, + _placelist[i].name, strlen (_placelist[i].name)); + if (_placelist[i].flags & 4) { + XSetForeground (dpy, _fib_gc, _c_gray3.pixel); + const int plly = ply - _fib_font_ascent + _fib_font_height; + const int pllx0 = FAREAMRGB; + const int pllx1 = FAREAMRGB + (PLACESW - TEXTSEP); + XDrawLine (dpy, win, _fib_gc, pllx0, plly, pllx1, plly); + } + } + XSetClipMask (dpy, _fib_gc, None); + + if (_placecnt > llen) { + const int plly = ltop + fsel_height - _fib_font_height + _fib_font_ascent; + const int pllx0 = FAREAMRGB + (PLACESW - TEXTSEP) * .75; + const int pllx1 = FAREAMRGB + (PLACESW - TEXTSEP - TEXTSEP); + + XSetForeground (dpy, _fib_gc, blackColor); + XSetLineAttributes (dpy, _fib_gc, 1, LineOnOffDash, CapButt, JoinMiter); + XDrawLine (dpy, win, _fib_gc, pllx0, plly, pllx1, plly); + XSetLineAttributes (dpy, _fib_gc, 1, LineSolid, CapButt, JoinMiter); + } + } + + // Bottom Buttons + const int numb = sizeof(_btns) / sizeof(FibButton*); + int xtra = _fib_width - _btn_span; + const int cbox = _fib_font_ascent - 2; + const int bbase = _fib_height - BTNBTMMARGIN * _fib_font_vsep - BTNPADDING; + const int cblw = cbox > 20 ? 5 : ( cbox > 9 ? 3 : 1); + + int bx = FAREAMRGB; + for (i = 0; i < numb; ++i) { + if (_btns[i]->flags & 8) { continue; } + if (_btns[i]->flags & 4) { + // checkbutton + const int cby0 = bbase - cbox + 1 + BTNPADDING; + if (i == _hov_b) { + XSetForeground (dpy, _fib_gc, _c_gray4.pixel); + } else { + XSetForeground (dpy, _fib_gc, blackColor); + } + XDrawRectangle (dpy, win, _fib_gc, + bx, cby0 - 1, cbox + 1, cbox + 1); + + if (i == _hov_b) { + XSetForeground (dpy, _fib_gc, _c_gray5.pixel); + } else { + XSetForeground (dpy, _fib_gc, blackColor); + } + XDrawString (dpy, win, _fib_gc, BTNPADDING + bx + _fib_font_ascent, 1 + bbase + BTNPADDING, + _btns[i]->text, strlen (_btns[i]->text)); + + if (i == _hov_b) { + XSetForeground (dpy, _fib_gc, _c_gray0.pixel); + } else { + if (_btns[i]->flags & 2) { + XSetForeground (dpy, _fib_gc, _c_gray1.pixel); + } else { + XSetForeground (dpy, _fib_gc, _c_gray2.pixel); + } + } + XFillRectangle (dpy, win, _fib_gc, + bx+1, cby0, cbox, cbox); + + if (_btns[i]->flags & 2) { + XSetLineAttributes (dpy, _fib_gc, cblw, LineSolid, CapRound, JoinMiter); + XSetForeground (dpy, _fib_gc, _c_gray6.pixel); + XDrawLine (dpy, win, _fib_gc, + bx + 2, cby0 + 1, + bx + cbox - 1, cby0 + cbox - 2); + XDrawLine (dpy, win, _fib_gc, + bx + cbox - 1, cby0 + 1, + bx + 2, cby0 + cbox - 2); + XSetLineAttributes (dpy, _fib_gc, 1, LineSolid, CapButt, JoinMiter); + } + } else { + if (xtra > 0) { + bx += xtra; + xtra = 0; + } + // pushbutton + + uint8_t can_hover = 1; // special case + if (_btns[i] == &_btn_ok) { + if (_fsel < 0 || _fsel >= _dircount) { + can_hover = 0; + } + } + + if (can_hover && i == _hov_b) { + XSetForeground (dpy, _fib_gc, _c_gray0.pixel); + } else { + XSetForeground (dpy, _fib_gc, _c_gray2.pixel); + } + XFillRectangle (dpy, win, _fib_gc, + bx + 1, bbase - _fib_font_ascent, + _btn_w - 1, _fib_font_height + BTNPADDING + BTNPADDING); + VDrawRectangle (dpy, win, _fib_gc, + bx, bbase - _fib_font_ascent, + _btn_w, _fib_font_height + BTNPADDING + BTNPADDING); + XDrawString (dpy, win, _fib_gc, bx + (_btn_w - _btns[i]->tw) * .5, 1 + bbase + BTNPADDING, + _btns[i]->text, strlen (_btns[i]->text)); + } + _btns[i]->x0 = bx; + bx += _btns[i]->xw + DSEP; + } + + if (_pixbuffer != None) { + XCopyArea(dpy, _pixbuffer, realwin, _fib_gc, 0, 0, _fib_width, _fib_height, 0, 0); + } + XFlush (dpy); +} + +static void fib_reset () { + _hov_p = _hov_f = _hov_h = _hov_l = -1; + _scrl_f = 0; + _fib_resized = 1; +} + +static int cmp_n_up (const void *p1, const void *p2) { + FibFileEntry *a = (FibFileEntry*) p1; + FibFileEntry *b = (FibFileEntry*) p2; + if ((a->flags & 4) && !(b->flags & 4)) return -1; + if (!(a->flags & 4) && (b->flags & 4)) return 1; + return strcmp (a->name, b->name); +} + +static int cmp_n_down (const void *p1, const void *p2) { + FibFileEntry *a = (FibFileEntry*) p1; + FibFileEntry *b = (FibFileEntry*) p2; + if ((a->flags & 4) && !(b->flags & 4)) return -1; + if (!(a->flags & 4) && (b->flags & 4)) return 1; + return strcmp (b->name, a->name); +} + +static int cmp_t_up (const void *p1, const void *p2) { + FibFileEntry *a = (FibFileEntry*) p1; + FibFileEntry *b = (FibFileEntry*) p2; + if ((a->flags & 4) && !(b->flags & 4)) return -1; + if (!(a->flags & 4) && (b->flags & 4)) return 1; + if (a->mtime == b->mtime) return 0; + return a->mtime > b->mtime ? -1 : 1; +} + +static int cmp_t_down (const void *p1, const void *p2) { + FibFileEntry *a = (FibFileEntry*) p1; + FibFileEntry *b = (FibFileEntry*) p2; + if ((a->flags & 4) && !(b->flags & 4)) return -1; + if (!(a->flags & 4) && (b->flags & 4)) return 1; + if (a->mtime == b->mtime) return 0; + return a->mtime > b->mtime ? 1 : -1; +} + +static int cmp_s_up (const void *p1, const void *p2) { + FibFileEntry *a = (FibFileEntry*) p1; + FibFileEntry *b = (FibFileEntry*) p2; + if ((a->flags & 4) && (b->flags & 4)) return 0; // dir, no size, retain order + if ((a->flags & 4) && !(b->flags & 4)) return -1; + if (!(a->flags & 4) && (b->flags & 4)) return 1; + if (a->size == b->size) return 0; + return a->size > b->size ? -1 : 1; +} + +static int cmp_s_down (const void *p1, const void *p2) { + FibFileEntry *a = (FibFileEntry*) p1; + FibFileEntry *b = (FibFileEntry*) p2; + if ((a->flags & 4) && (b->flags & 4)) return 0; // dir, no size, retain order + if ((a->flags & 4) && !(b->flags & 4)) return -1; + if (!(a->flags & 4) && (b->flags & 4)) return 1; + if (a->size == b->size) return 0; + return a->size > b->size ? 1 : -1; +} + +static void fmt_size (Display *dpy, FibFileEntry *f) { + if (f->size > 10995116277760) { + sprintf (f->strsize, "%.0f TB", f->size / 1099511627776.f); + } + if (f->size > 1099511627776) { + sprintf (f->strsize, "%.1f TB", f->size / 1099511627776.f); + } + else if (f->size > 10737418240) { + sprintf (f->strsize, "%.0f GB", f->size / 1073741824.f); + } + else if (f->size > 1073741824) { + sprintf (f->strsize, "%.1f GB", f->size / 1073741824.f); + } + else if (f->size > 10485760) { + sprintf (f->strsize, "%.0f MB", f->size / 1048576.f); + } + else if (f->size > 1048576) { + sprintf (f->strsize, "%.1f MB", f->size / 1048576.f); + } + else if (f->size > 10240) { + sprintf (f->strsize, "%.0f KB", f->size / 1024.f); + } + else if (f->size >= 1000) { + sprintf (f->strsize, "%.1f KB", f->size / 1024.f); + } + else { + sprintf (f->strsize, "%.0f B", f->size / 1.f); + } + int sw = 0; + query_font_geometry (dpy, _fib_gc, f->strsize, &sw, NULL, NULL, NULL); + if (sw > _fib_font_size_width) { + _fib_font_size_width = sw; + } + f->ssizew = sw; +} + +static void fmt_time (Display *dpy, FibFileEntry *f) { + struct tm *tmp; + tmp = localtime (&f->mtime); + if (!tmp) { + return; + } + strftime (f->strtime, sizeof(f->strtime), "%F %H:%M", tmp); + + int tw = 0; + query_font_geometry (dpy, _fib_gc, f->strtime, &tw, NULL, NULL, NULL); + if (tw > _fib_font_time_width) { + _fib_font_time_width = tw; + } +} + +static void fib_resort (const char * sel) { + if (_dircount < 1) { return; } + int (*sortfn)(const void *p1, const void *p2); + switch (_sort) { + case 1: sortfn = &cmp_n_down; break; + case 2: sortfn = &cmp_s_down; break; + case 3: sortfn = &cmp_s_up; break; + case 4: sortfn = &cmp_t_down; break; + case 5: sortfn = &cmp_t_up; break; + default: + sortfn = &cmp_n_up; + break; + } + qsort (_dirlist, _dircount, sizeof(_dirlist[0]), sortfn); + int i; + for (i = 0; i < _dircount && sel; ++i) { + if (!strcmp (_dirlist[i].name, sel)) { + _fsel = i; + break; + } + } +} + +static void fib_select (Display *dpy, int item) { + if (_fsel >= 0) { + _dirlist[_fsel].flags &= ~2; + } + _fsel = item; + if (_fsel >= 0 && _fsel < _dircount) { + _dirlist[_fsel].flags |= 2; + const int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; + if (_fsel < _scrl_f) { + _scrl_f = _fsel; + } + else if (_fsel >= _scrl_f + llen) { + _scrl_f = 1 + _fsel - llen; + } + } else { + _fsel = -1; + } + + fib_expose (dpy, _fib_win); +} + +static inline int fib_filter (const char *name) { + if (_fib_filter_function) { + return _fib_filter_function (name); + } else { + return 1; + } +} + +static void fib_pre_opendir (Display *dpy) { + if (_dirlist) free (_dirlist); + if (_pathbtn) free (_pathbtn); + _dirlist = NULL; + _pathbtn = NULL; + _dircount = 0; + _pathparts = 0; + query_font_geometry (dpy, _fib_gc, "Size ", &_fib_font_size_width, NULL, NULL, NULL); + fib_reset (); + _fsel = -1; +} + +static void fib_post_opendir (Display *dpy, const char *sel) { + if (_dircount > 0) + _fsel = 0; // select first + else + _fsel = -1; + fib_resort (sel); + + if (_dircount > 0 && _fsel >= 0) { + fib_select (dpy, _fsel); + } else { + fib_expose (dpy, _fib_win); + } +} + +static int fib_dirlistadd (Display *dpy, const int i, const char* path, const char *name, time_t mtime) { + char tp[1024]; + struct stat fs; + if (!_fib_hidden_fn && name[0] == '.') return -1; + if (!strcmp (name, ".")) return -1; + if (!strcmp (name, "..")) return -1; + strcpy (tp, path); + strcat (tp, name); + if (access (tp, R_OK)) { + return -1; + } + if (stat (tp, &fs)) { + return -1; + } + assert (i < _dircount); // could happen if dir changes while we're reading. + if (i >= _dircount) return -1; + if (S_ISDIR (fs.st_mode)) { + _dirlist[i].flags |= 4; + } + else if (S_ISREG (fs.st_mode)) { + if (!fib_filter (name)) return -1; + } +#if 0 // only needed with lstat() + else if (S_ISLNK (fs.st_mode)) { + if (!fib_filter (name)) return -1; + } +#endif + else { + return -1; + } + strcpy (_dirlist[i].name, name); + _dirlist[i].mtime = mtime > 0 ? mtime : fs.st_mtime; + _dirlist[i].size = fs.st_size; + if (!(_dirlist[i].flags & 4)) + fmt_size (dpy, &_dirlist[i]); + fmt_time (dpy, &_dirlist[i]); + return 0; +} + +static int fib_openrecent (Display *dpy, const char *sel) { + int i; + unsigned int j; + assert (_recentcnt > 0); + fib_pre_opendir (dpy); + query_font_geometry (dpy, _fib_gc, "Last Used", &_fib_font_time_width, NULL, NULL, NULL); + _dirlist = (FibFileEntry*) calloc (_recentcnt, sizeof(FibFileEntry)); + _dircount = _recentcnt; + for (j = 0, i = 0; j < _recentcnt; ++j) { + char base[1024]; + char *s = strrchr (_recentlist[j].path, '/'); + if (!s || !*++s) continue; + size_t len = (s - _recentlist[j].path); + strncpy (base, _recentlist[j].path, len); + base[len] = '\0'; + if (!fib_dirlistadd (dpy, i, base, s, _recentlist[j].atime)) { + _dirlist[i].rfp = &_recentlist[j]; + _dirlist[i].flags |= 8; + ++i; + } + } + _dircount = i; + fib_post_opendir (dpy, sel); + return _dircount; +} + +static int fib_opendir (Display *dpy, const char* path, const char *sel) { + char *t0, *t1; + int i; + + assert (path); + + if (strlen (path) == 0 && _recentcnt > 0) { // XXX we should use a better indication for this + strcpy (_cur_path, ""); + return fib_openrecent (dpy, sel); + } + + assert (strlen (path) < sizeof(_cur_path) -1); + assert (strlen (path) > 0); + assert (strstr (path, "//") == NULL); + assert (path[0] == '/'); + + fib_pre_opendir (dpy); + + query_font_geometry (dpy, _fib_gc, "Last Modified", &_fib_font_time_width, NULL, NULL, NULL); + DIR *dir = opendir (path); + if (!dir) { + strcpy (_cur_path, "/"); + } else { + int i; + struct dirent *de; + strcpy (_cur_path, path); + + if (_cur_path[strlen (_cur_path) -1] != '/') + strcat (_cur_path, "/"); + + while ((de = readdir (dir))) { + if (!_fib_hidden_fn && de->d_name[0] == '.') continue; + ++_dircount; + } + + if (_dircount > 0) + _dirlist = (FibFileEntry*) calloc (_dircount, sizeof(FibFileEntry)); + + rewinddir (dir); + + i = 0; + while ((de = readdir (dir))) { + if (!fib_dirlistadd (dpy, i, _cur_path, de->d_name, 0)) + ++i; + } + _dircount = i; + closedir (dir); + } + + t0 = _cur_path; + while (*t0 && (t0 = strchr (t0, '/'))) { + ++_pathparts; + ++t0; + } + assert (_pathparts > 0); + _pathbtn = (FibPathButton*) calloc (_pathparts + 1, sizeof(FibPathButton)); + + t1 = _cur_path; + i = 0; + while (*t1 && (t0 = strchr (t1, '/'))) { + if (i == 0) { + strcpy (_pathbtn[i].name, "/"); + } else { + *t0 = 0; + strcpy (_pathbtn[i].name, t1); + } + query_font_geometry (dpy, _fib_gc, _pathbtn[i].name, &_pathbtn[i].xw, NULL, NULL, NULL); + _pathbtn[i].xw += BTNPADDING + BTNPADDING; + *t0 = '/'; + t1 = t0 + 1; + ++i; + } + fib_post_opendir (dpy, sel); + return _dircount; +} + +static int fib_open (Display *dpy, int item) { + char tp[1024]; + if (_dirlist[item].flags & 8) { + assert (_dirlist[item].rfp); + strcpy (_rv_open, _dirlist[item].rfp->path); + _status = 1; + return 0; + } + strcpy (tp, _cur_path); + strcat (tp, _dirlist[item].name); + if (_dirlist[item].flags & 4) { + fib_opendir (dpy, tp, NULL); + return 0; + } else { + _status = 1; + strcpy (_rv_open, tp); + } + return 0; +} + +static void cb_cancel (Display *dpy) { + _status = -1; + + // unused + return; (void)dpy; +} + +static void cb_open (Display *dpy) { + if (_fsel >= 0 && _fsel < _dircount) { + fib_open (dpy, _fsel); + } +} + +static void sync_button_states () { + if (_fib_show_places) + _btn_places.flags |= 2; + else + _btn_places.flags &= ~2; + if (_fib_filter_fn) // inverse -> show all + _btn_filter.flags &= ~2; + else + _btn_filter.flags |= 2; + if (_fib_hidden_fn) + _btn_hidden.flags |= 2; + else + _btn_hidden.flags &= ~2; +} + +static void cb_places (Display *dpy) { + _fib_show_places = ! _fib_show_places; + if (_placecnt < 1) + _fib_show_places = 0; + sync_button_states (); + _fib_resized = 1; + fib_expose (dpy, _fib_win); +} + +static void cb_filter (Display *dpy) { + _fib_filter_fn = ! _fib_filter_fn; + sync_button_states (); + char *sel = _fsel >= 0 ? strdup (_dirlist[_fsel].name) : NULL; + fib_opendir (dpy, _cur_path, sel); + free (sel); +} + +static void cb_hidden (Display *dpy) { + _fib_hidden_fn = ! _fib_hidden_fn; + sync_button_states (); + char *sel = _fsel >= 0 ? strdup (_dirlist[_fsel].name) : NULL; + fib_opendir (dpy, _cur_path, sel); + free (sel); +} + +static int fib_widget_at_pos (Display *dpy, int x, int y, int *it) { + const int btop = _fib_height - BTNBTMMARGIN * _fib_font_vsep - _fib_font_ascent - BTNPADDING; + const int bbot = btop + _fib_font_height + BTNPADDING + BTNPADDING; + const int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; + const int ltop = LISTTOP * _fib_font_vsep; + const int fbot = ltop + 4 + llen * _fib_font_vsep; + const int ptop = PATHBTNTOP - _fib_font_ascent; + assert (it); + + // paths at top + if (y > ptop && y < ptop + _fib_font_height && _view_p >= 0 && _pathparts > 0) { + int i = _view_p; + *it = -1; + if (i > 0) { // special case '<' + if (x > FAREAMRGB && x <= FAREAMRGB + _pathbtn[0].xw) { + *it = _view_p - 1; + i = _pathparts; + } + } + while (i < _pathparts) { + if (x >= _pathbtn[i].x0 && x <= _pathbtn[i].x0 + _pathbtn[i].xw) { + *it = i; + break; + } + ++i; + } + assert (*it < _pathparts); + if (*it >= 0) return 1; + else return 0; + } + + // buttons at bottom + if (y > btop && y < bbot) { + size_t i; + *it = -1; + for (i = 0; i < sizeof(_btns) / sizeof(FibButton*); ++i) { + const int bx = _btns[i]->x0; + if (_btns[i]->flags & 8) { continue; } + if (x > bx && x < bx + _btns[i]->xw) { + *it = i; + } + } + if (*it >= 0) return 3; + else return 0; + } + + // main file area + if (y >= ltop - _fib_font_vsep && y < fbot && x > FAREAMRGL && x < _fib_width - FAREAMRGR) { + // scrollbar + if (_scrl_y0 > 0 && x >= _fib_width - (FAREAMRGR + SCROLLBARW) && x <= _fib_width - FAREAMRGR) { + if (y >= _scrl_y0 && y < _scrl_y1) { + *it = 0; + } else if (y >= _scrl_y1) { + *it = 2; + } else { + *it = 1; + } + return 4; + } + // file-list + else if (y >= ltop) { + const int item = (y - ltop) / _fib_font_vsep + _scrl_f; + *it = -1; + if (item >= 0 && item < _dircount) { + *it = item; + } + if (*it >= 0) return 2; + else return 0; + } + else { + *it = -1; + const int fsel_width = _fib_width - FAREAMRGL - FAREAMRGR - (llen < _dircount ? SCROLLBARW : 0); + const int t_s = FAREAMRGL + fsel_width - _fib_font_time_width - TEXTSEP - TEXTSEP; + const int t_t = FAREAMRGL + fsel_width - TEXTSEP - _fib_font_size_width - ((_columns & 2) ? ( _fib_font_time_width + TEXTSEP + TEXTSEP) : 0); + if (x >= fsel_width + FAREAMRGL) ; + else if ((_columns & 2) && x >= t_s) *it = 3; + else if ((_columns & 1) && x >= t_t) *it = 2; + else if (x >= FAREATEXTL + _fib_dir_indent - TEXTSEP) *it = 1; + if (*it >= 0) return 5; + else return 0; + } + } + + // places list + if (_fib_show_places && y >= ltop && y < fbot && x > FAREAMRGB && x < FAREAMRGL - FAREAMRGB) { + const int item = (y - ltop) / _fib_font_vsep; + *it = -1; + if (item >= 0 && item < _placecnt) { + *it = item; + } + if (*it >= 0) return 6; + else return 0; + } + + return 0; + + // unused + (void)dpy; +} + +static void fib_update_hover (Display *dpy, int need_expose, const int type, const int item) { + int hov_p = -1; + int hov_b = -1; + int hov_h = -1; + int hov_s = -1; +#ifdef LIST_ENTRY_HOVER + int hov_f = -1; + int hov_l = -1; +#endif + + switch (type) { + case 1: hov_p = item; break; + case 3: hov_b = item; break; + case 4: hov_s = item; break; + case 5: hov_h = item; break; +#ifdef LIST_ENTRY_HOVER + case 6: hov_l = item; break; + case 2: hov_f = item; break; +#endif + default: break; + } +#ifdef LIST_ENTRY_HOVER + if (hov_f != _hov_f) { _hov_f = hov_f; need_expose = 1; } + if (hov_l != _hov_l) { _hov_l = hov_l; need_expose = 1; } +#endif + if (hov_b != _hov_b) { _hov_b = hov_b; need_expose = 1; } + if (hov_p != _hov_p) { _hov_p = hov_p; need_expose = 1; } + if (hov_h != _hov_h) { _hov_h = hov_h; need_expose = 1; } + if (hov_s != _hov_s) { _hov_s = hov_s; need_expose = 1; } + + if (need_expose) { + fib_expose (dpy, _fib_win); + } +} + +static void fib_motion (Display *dpy, int x, int y) { + int it = -1; + + if (_scrl_my >= 0) { + const int sdiff = y - _scrl_my; + const int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; + const int fsel_height = 4 + llen * _fib_font_vsep; + const float sl = (fsel_height + _fib_font_vsep - (SCROLLBOXH + SCROLLBOXH)) / (float) _dircount; + + int news = _scrl_mf + sdiff / sl; + if (news < 0) news = 0; + if (news >= (_dircount - llen)) news = _dircount - llen; + if (news != _scrl_f) { + _scrl_f = news; + fib_expose (dpy, _fib_win); + } + return; + } + + const int type = fib_widget_at_pos (dpy, x, y, &it); + fib_update_hover (dpy, 0, type, it); +} + +static void fib_mousedown (Display *dpy, int x, int y, int btn, unsigned long time) { + int it; + switch (fib_widget_at_pos (dpy, x, y, &it)) { + case 4: // scrollbar + if (btn == 1) { + _dblclk = 0; + if (it == 0) { + _scrl_my = y; + _scrl_mf = _scrl_f; + } else { + int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; + if (llen < 2) llen = 2; + int news = _scrl_f; + if (it == 1) { + news -= llen - 1; + } else { + news += llen - 1; + } + if (news < 0) news = 0; + if (news >= (_dircount - llen)) news = _dircount - llen; + if (news != _scrl_f && _scrl_y0 >= 0) { + assert (news >=0); + _scrl_f = news; + fib_update_hover (dpy, 1, 4, it); + } + } + } + break; + case 2: // file-list + if (btn == 4 || btn == 5) { + const int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; + int news = _scrl_f + ((btn == 4) ? - 1 : 1); + if (news < 0) news = 0; + if (news >= (_dircount - llen)) news = _dircount - llen; + if (news != _scrl_f && _scrl_y0 >= 0) { + assert (news >=0); + _scrl_f = news; + fib_update_hover (dpy, 1, 0, 0); + } + _dblclk = 0; + } + else if (btn == 1 && it >= 0 && it < _dircount) { + if (_fsel == it) { + if (time - _dblclk < DBLCLKTME) { + fib_open (dpy, it); + _dblclk = 0; + } + _dblclk = time; + } else { + fib_select (dpy, it); + _dblclk = time; + } + /*if (_fsel >= 0) { + if (!(_dirlist[_fsel].flags & 4)); + }*/ + } + break; + case 1: // paths + assert (_fsel < _dircount); + assert (it >= 0 && it < _pathparts); + { + int i = 0; + char path[1024] = "/"; + while (++i <= it) { + strcat (path, _pathbtn[i].name); + strcat (path, "/"); + } + char *sel = NULL; + if (i < _pathparts) + sel = strdup (_pathbtn[i].name); + else if (i == _pathparts && _fsel >= 0) + sel = strdup (_dirlist[_fsel].name); + fib_opendir (dpy, path, sel); + free (sel); + } + break; + case 3: // btn + if (btn == 1 && _btns[it]->callback) { + _btns[it]->callback (dpy); + } + break; + case 5: // sort + if (btn == 1) { + switch (it) { + case 1: if (_sort == 0) _sort = 1; else _sort = 0; break; + case 2: if (_sort == 2) _sort = 3; else _sort = 2; break; + case 3: if (_sort == 4) _sort = 5; else _sort = 4; break; + } + if (_fsel >= 0) { + assert (_dirlist && _dircount >= _fsel); + _dirlist[_fsel].flags &= ~2; + char *sel = strdup (_dirlist[_fsel].name); + fib_resort (sel); + free (sel); + } else { + fib_resort (NULL); + _fsel = -1; + } + fib_reset (); + _hov_h = it; + fib_select (dpy, _fsel); + } + break; + case 6: + if (btn == 1 && it >= 0 && it < _placecnt) { + fib_opendir (dpy, _placelist[it].path, NULL); + } + break; + default: + break; + } +} + +static void fib_mouseup (Display *dpy, int x, int y, int btn, unsigned long time) { + _scrl_my = -1; + + // unused + return; (void)dpy; (void)x; (void)y; (void)btn; (void)time; +} + +static void add_place_raw (Display *dpy, const char *name, const char *path) { + _placelist = (FibPlace*) realloc (_placelist, (_placecnt + 1) * sizeof(FibPlace)); + strcpy (_placelist[_placecnt].path, path); + strcpy (_placelist[_placecnt].name, name); + _placelist[_placecnt].flags = 0; + + int sw; + query_font_geometry (dpy, _fib_gc, name, &sw, NULL, NULL, NULL); + if (sw > _fib_place_width) { + _fib_place_width = sw; + } + ++_placecnt; +} + +static int add_place_places (Display *dpy, const char *name, const char *url) { + char const * path; + struct stat fs; + int i; + if (!url || strlen (url) < 1) return -1; + if (!name || strlen (name) < 1) return -1; + if (url[0] == '/') { + path = url; + } + else if (!strncmp (url, "file:///", 8)) { + path = &url[7]; + } + else { + return -1; + } + + if (access (path, R_OK)) { + return -1; + } + if (stat (path, &fs)) { + return -1; + } + if (!S_ISDIR (fs.st_mode)) { + return -1; + } + + for (i = 0; i < _placecnt; ++i) { + if (!strcmp (path, _placelist[i].path)) { + return -1; + } + } + add_place_raw (dpy, name, path); + return 0; +} + +static int parse_gtk_bookmarks (Display *dpy, const char *fn) { + char tmp[1024]; + if (access (fn, R_OK)) { + return -1; + } + FILE *bm = fopen (fn, "r"); + if (!bm) return -1; + int found = 0; + while (fgets (tmp, sizeof(tmp), bm) + && strlen (tmp) > 1 + && strlen (tmp) < sizeof(tmp)) + { + char *s, *n; + tmp[strlen (tmp) - 1] = '\0'; // strip newline + if ((s = strchr (tmp, ' '))) { + *s = '\0'; + n = strdup (++s); + decode_3986 (tmp); + if (!add_place_places (dpy, n, tmp)) { + ++found; + } + free (n); + } else if ((s = strrchr (tmp, '/'))) { + n = strdup (++s); + decode_3986 (tmp); + if (!add_place_places (dpy, n, tmp)) { + ++found; + } + free (n); + } + } + fclose (bm); + return found; +} + +static const char *ignore_mountpoints[] = { + "/bin", "/boot", "/dev", "/etc", + "/lib", "/live", "/mnt", "/opt", + "/root", "/sbin", "/srv", "/tmp", + "/usr", "/var", "/proc", "/sbin", + "/net", "/sys" +}; + +static const char *ignore_fs[] = { + "auto", "autofs", + "debugfs", "devfs", + "devpts", "ecryptfs", + "fusectl", "kernfs", + "linprocfs", "proc", + "ptyfs", "rootfs", + "selinuxfs", "sysfs", + "tmpfs", "usbfs", + "nfsd", "rpc_pipefs", +}; + +static const char *ignore_devices[] = { + "binfmt_", "devpts", + "gvfs", "none", + "nfsd", "sunrpc", + "/dev/loop", "/dev/vn" +}; + +static int check_mount (const char *mountpoint, const char *fs, const char *device) { + size_t i; + if (!mountpoint || !fs || !device) return -1; + //printf("%s %s %s\n", mountpoint, fs, device); + for (i = 0 ; i < sizeof(ignore_mountpoints) / sizeof(char*); ++i) { + if (!strncmp (mountpoint, ignore_mountpoints[i], strlen (ignore_mountpoints[i]))) { + return 1; + } + } + if (!strncmp (mountpoint, "/home", 5)) { + return 1; + } + for (i = 0 ; i < sizeof(ignore_fs) / sizeof(char*); ++i) { + if (!strncmp (fs, ignore_fs[i], strlen (ignore_fs[i]))) { + return 1; + } + } + for (i = 0 ; i < sizeof(ignore_devices) / sizeof(char*); ++i) { + if (!strncmp (device, ignore_devices[i], strlen (ignore_devices[i]))) { + return 1; + } + } + return 0; +} + +static int read_mtab (Display *dpy, const char *mtab) { + FILE *mt = fopen (mtab, "r"); + if (!mt) return -1; + int found = 0; + struct mntent *mntent; + while ((mntent = getmntent (mt)) != NULL) { + char *s; + if (check_mount (mntent->mnt_dir, mntent->mnt_type, mntent->mnt_fsname)) + continue; + + if ((s = strrchr (mntent->mnt_dir, '/'))) { + ++s; + } else { + s = mntent->mnt_dir; + } + if (!add_place_places (dpy, s, mntent->mnt_dir)) { + ++found; + } + } + fclose (mt); + return found; +} + +static void populate_places (Display *dpy) { + char tmp[1024]; + int spacer = -1; + if (_placecnt > 0) return; + _fib_place_width = 0; + + if (_recentcnt > 0) { + add_place_raw (dpy, "Recently Used", ""); + _placelist[0].flags |= 4; + } + + add_place_places (dpy, "Home", getenv ("HOME")); + + if (getenv ("HOME")) { + strcpy (tmp, getenv ("HOME")); + strcat (tmp, "/Desktop"); + add_place_places (dpy, "Desktop", tmp); + } + + add_place_places (dpy, "Filesystem", "/"); + + if (_placecnt > 0) spacer = _placecnt -1; + + if (strlen (_fib_cfg_custom_places) > 0) { + parse_gtk_bookmarks (dpy, _fib_cfg_custom_places); + } + + if (read_mtab (dpy, "/proc/mounts") < 1) { + read_mtab (dpy, "/etc/mtab"); + } + + int parsed_bookmarks = 0; + if (!parsed_bookmarks && getenv ("HOME")) { + strcpy (tmp, getenv ("HOME")); + strcat (tmp, "/.gtk-bookmarks"); + if (parse_gtk_bookmarks (dpy, tmp) > 0) { + parsed_bookmarks = 1; + } + } + if (!parsed_bookmarks && getenv ("XDG_CONFIG_HOME")) { + strcpy (tmp, getenv ("XDG_CONFIG_HOME")); + strcat (tmp, "/gtk-3.0/bookmarks"); + if (parse_gtk_bookmarks (dpy, tmp) > 0) { + parsed_bookmarks = 1; + } + } + if (!parsed_bookmarks && getenv ("HOME")) { + strcpy (tmp, getenv ("HOME")); + strcat (tmp, "/.config/gtk-3.0/bookmarks"); + if (parse_gtk_bookmarks (dpy, tmp) > 0) { + parsed_bookmarks = 1; + } + } + if (_fib_place_width > 0) { + _fib_place_width = MIN (_fib_place_width + TEXTSEP + _fib_dir_indent /*extra*/ , PLACESWMAX); + } + if (spacer > 0 && spacer < _placecnt -1) { + _placelist[ spacer ].flags |= 4; + } +} + +static uint8_t font_err = 0; +static int x_error_handler (Display *d, XErrorEvent *e) { + font_err = 1; + return 0; + + // unused + (void)d; (void)e; +} + +int x_fib_show (Display *dpy, Window parent, int x, int y) { + if (_fib_win) { + XSetInputFocus (dpy, _fib_win, RevertToParent, CurrentTime); + return -1; + } + + _status = 0; + _rv_open[0] = '\0'; + + Colormap colormap = DefaultColormap (dpy, DefaultScreen (dpy)); + _c_gray1.flags= DoRed | DoGreen | DoBlue; + _c_gray0.red = _c_gray0.green = _c_gray0.blue = 61710; // 95% hover prelight + _c_gray1.red = _c_gray1.green = _c_gray1.blue = 60416; // 93% window bg, scrollbar-fg + _c_gray2.red = _c_gray2.green = _c_gray2.blue = 54016; // 83% button & list bg + _c_gray3.red = _c_gray3.green = _c_gray3.blue = 48640; // 75% heading + scrollbar-bg + _c_gray4.red = _c_gray4.green = _c_gray4.blue = 26112; // 40% prelight text, sep lines + _c_gray5.red = _c_gray5.green = _c_gray5.blue = 12800; // 20% 3D border + _c_gray6.red = _c_gray6.green = _c_gray6.blue = 6400; // 10% checkbox cross, sort triangles + + if (!XAllocColor (dpy, colormap, &_c_gray0)) return -1; + if (!XAllocColor (dpy, colormap, &_c_gray1)) return -1; + if (!XAllocColor (dpy, colormap, &_c_gray2)) return -1; + if (!XAllocColor (dpy, colormap, &_c_gray3)) return -1; + if (!XAllocColor (dpy, colormap, &_c_gray4)) return -1; + if (!XAllocColor (dpy, colormap, &_c_gray5)) return -1; + if (!XAllocColor (dpy, colormap, &_c_gray6)) return -1; + + XSetWindowAttributes attr; + memset (&attr, 0, sizeof(XSetWindowAttributes)); + attr.border_pixel = _c_gray2.pixel; + + attr.event_mask = ExposureMask | KeyPressMask + | ButtonPressMask | ButtonReleaseMask + | ConfigureNotify | StructureNotifyMask + | PointerMotionMask | LeaveWindowMask; + + _fib_win = XCreateWindow ( + dpy, DefaultRootWindow (dpy), + x, y, _fib_width, _fib_height, + 1, CopyFromParent, InputOutput, CopyFromParent, + CWEventMask | CWBorderPixel, &attr); + + if (!_fib_win) { return 1; } + + if (parent) + XSetTransientForHint (dpy, _fib_win, parent); + + XStoreName (dpy, _fib_win, "Select File"); + + Atom wmDelete = XInternAtom (dpy, "WM_DELETE_WINDOW", True); + XSetWMProtocols (dpy, _fib_win, &wmDelete, 1); + + _fib_gc = XCreateGC (dpy, _fib_win, 0, NULL); + XSetLineAttributes (dpy, _fib_gc, 1, LineSolid, CapButt, JoinMiter); + const char dl[1] = {1}; + XSetDashes (dpy, _fib_gc, 0, dl, 1); + + int (*handler)(Display *, XErrorEvent *) = XSetErrorHandler (&x_error_handler); + +#define _XTESTFONT(FN) \ + { \ + font_err = 0; \ + _fibfont = XLoadFont (dpy, FN); \ + XSetFont (dpy, _fib_gc, _fibfont); \ + XSync (dpy, False); \ + } + + font_err = 1; + if (getenv ("XJFONT")) _XTESTFONT (getenv ("XJFONT")); + if (font_err && strlen (_fib_cfg_custom_font) > 0) _XTESTFONT (_fib_cfg_custom_font); + if (font_err) _XTESTFONT ("-*-helvetica-medium-r-normal-*-12-*-*-*-*-*-*-*"); + if (font_err) _XTESTFONT ("-*-verdana-medium-r-normal-*-12-*-*-*-*-*-*-*"); + if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*"); + if (font_err) _XTESTFONT ("-misc-fixed-medium-r-normal-*-12-*-*-*-*-*-*-*"); + if (font_err) _fibfont = None; + XSync (dpy, False); + XSetErrorHandler (handler); + + if (_fib_font_height == 0) { // 1st time only + query_font_geometry (dpy, _fib_gc, "D ", &_fib_dir_indent, NULL, NULL, NULL); + query_font_geometry (dpy, _fib_gc, "_", &_fib_spc_norm, NULL, NULL, NULL); + if (query_font_geometry (dpy, _fib_gc, "|0Yy", NULL, &_fib_font_height, &_fib_font_ascent, NULL)) { + XFreeGC (dpy, _fib_gc); + XDestroyWindow (dpy, _fib_win); + _fib_win = 0; + return -1; + } + _fib_font_height += 3; + _fib_font_ascent += 2; + _fib_font_vsep = _fib_font_height + 2; + } + + populate_places (dpy); + + strcpy (_btn_ok.text, "Open"); + strcpy (_btn_cancel.text, "Cancel"); + strcpy (_btn_filter.text, "List All Files"); + strcpy (_btn_places.text, "Show Places"); + strcpy (_btn_hidden.text, "Show Hidden"); + + _btn_ok.callback = &cb_open; + _btn_cancel.callback = &cb_cancel; + _btn_filter.callback = &cb_filter; + _btn_places.callback = &cb_places; + _btn_hidden.callback = &cb_hidden; + _btn_filter.flags |= 4; + _btn_places.flags |= 4; + _btn_hidden.flags |= 4; + + if (!_fib_filter_function) { + _btn_filter.flags |= 8; + } + + size_t i; + int btncnt = 0; + _btn_w = 0; + _btn_span = 0; + for (i = 0; i < sizeof(_btns) / sizeof(FibButton*); ++i) { + if (_btns[i]->flags & 8) { continue; } + query_font_geometry (dpy, _fib_gc, _btns[i]->text, &_btns[i]->tw, NULL, NULL, NULL); + if (_btns[i]->flags & 4) { + _btn_span += _btns[i]->tw + _fib_font_ascent + TEXTSEP; + } else { + ++btncnt; + if (_btns[i]->tw > _btn_w) + _btn_w = _btns[i]->tw; + } + } + + _btn_w += BTNPADDING + BTNPADDING + TEXTSEP + TEXTSEP + TEXTSEP; + _btn_span += _btn_w * btncnt + DSEP * (i - 1) + FAREAMRGR + FAREAMRGB; + + for (i = 0; i < sizeof(_btns) / sizeof(FibButton*); ++i) { + if (_btns[i]->flags & 8) { continue; } + if (_btns[i]->flags & 4) { + _btns[i]->xw = _btns[i]->tw + _fib_font_ascent + TEXTSEP; + } else { + _btns[i]->xw = _btn_w; + } + } + + sync_button_states () ; + + _fib_height = _fib_font_vsep * (15.8); + _fib_width = MAX (_btn_span, 440); + + XResizeWindow (dpy, _fib_win, _fib_width, _fib_height); + + XTextProperty x_wname, x_iname; + XSizeHints hints; + XWMHints wmhints; + + hints.flags = PSize | PMinSize; + hints.min_width = _btn_span; + hints.min_height = 8 * _fib_font_vsep; + + char *w_name = & _fib_cfg_title[0]; + + wmhints.input = True; + wmhints.flags = InputHint; + if (XStringListToTextProperty (&w_name, 1, &x_wname) && + XStringListToTextProperty (&w_name, 1, &x_iname)) + { + XSetWMProperties (dpy, _fib_win, &x_wname, &x_iname, NULL, 0, &hints, &wmhints, NULL); + XFree (x_wname.value); + XFree (x_iname.value); + } + + XSetWindowBackground (dpy, _fib_win, _c_gray1.pixel); + + _fib_mapped = 0; + XMapRaised (dpy, _fib_win); + + if (!strlen (_cur_path) || !fib_opendir (dpy, _cur_path, NULL)) { + fib_opendir (dpy, getenv ("HOME") ? getenv ("HOME") : "/", NULL); + } + +#if 0 + XGrabPointer (dpy, _fib_win, True, + ButtonReleaseMask | ButtonPressMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask | StructureNotifyMask, + GrabModeAsync, GrabModeAsync, None, None, CurrentTime); + XGrabKeyboard (dpy, _fib_win, True, GrabModeAsync, GrabModeAsync, CurrentTime); + //XSetInputFocus (dpy, parent, RevertToNone, CurrentTime); +#endif + _recentlock = 1; + return 0; +} + +void x_fib_close (Display *dpy) { + if (!_fib_win) return; + XFreeGC (dpy, _fib_gc); + XDestroyWindow (dpy, _fib_win); + _fib_win = 0; + free (_dirlist); + _dirlist = NULL; + free (_pathbtn); + _pathbtn = NULL; + if (_fibfont != None) XUnloadFont (dpy, _fibfont); + _fibfont = None; + free (_placelist); + _placelist = NULL; + _dircount = 0; + _pathparts = 0; + _placecnt = 0; + if (_pixbuffer != None) XFreePixmap (dpy, _pixbuffer); + _pixbuffer = None; + Colormap colormap = DefaultColormap (dpy, DefaultScreen (dpy)); + XFreeColors (dpy, colormap, &_c_gray0.pixel, 1, 0); + XFreeColors (dpy, colormap, &_c_gray1.pixel, 1, 0); + XFreeColors (dpy, colormap, &_c_gray2.pixel, 1, 0); + XFreeColors (dpy, colormap, &_c_gray3.pixel, 1, 0); + XFreeColors (dpy, colormap, &_c_gray4.pixel, 1, 0); + XFreeColors (dpy, colormap, &_c_gray5.pixel, 1, 0); + XFreeColors (dpy, colormap, &_c_gray6.pixel, 1, 0); + _recentlock = 0; +} + +int x_fib_handle_events (Display *dpy, XEvent *event) { + if (!_fib_win) return 0; + if (_status) return 0; + if (event->xany.window != _fib_win) { + return 0; + } + + switch (event->type) { + case MapNotify: + _fib_mapped = 1; + break; + case UnmapNotify: + _fib_mapped = 0; + break; + case LeaveNotify: + fib_update_hover (dpy, 1, 0, 0); + break; + case ClientMessage: + if (!strcmp (XGetAtomName (dpy, event->xclient.message_type), "WM_PROTOCOLS")) { + _status = -1; + } + case ConfigureNotify: + if ( + (event->xconfigure.width > 1 && event->xconfigure.height > 1) + && + (event->xconfigure.width != _fib_width || event->xconfigure.height != _fib_height) + ) + { + _fib_width = event->xconfigure.width; + _fib_height = event->xconfigure.height; + _fib_resized = 1; + } + break; + case Expose: + if (event->xexpose.count == 0) { + fib_expose (dpy, event->xany.window); + } + break; + case MotionNotify: + fib_motion (dpy, event->xmotion.x, event->xmotion.y); + if (event->xmotion.is_hint == NotifyHint) { + XGetMotionEvents (dpy, event->xany.window, CurrentTime, CurrentTime, NULL); + } + break; + case ButtonPress: + fib_mousedown (dpy, event->xbutton.x, event->xbutton.y, event->xbutton.button, event->xbutton.time); + break; + case ButtonRelease: + fib_mouseup (dpy, event->xbutton.x, event->xbutton.y, event->xbutton.button, event->xbutton.time); + break; + case KeyRelease: + break; + case KeyPress: + { + KeySym key; + char buf[100]; + static XComposeStatus stat; + XLookupString (&event->xkey, buf, sizeof(buf), &key, &stat); + switch (key) { + case XK_Escape: + _status = -1; + break; + case XK_Up: + if (_fsel > 0) { + fib_select (dpy, _fsel - 1); + } + break; + case XK_Down: + if (_fsel < _dircount -1) { + fib_select ( dpy, _fsel + 1); + } + break; + case XK_Page_Up: + if (_fsel > 0) { + int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; + if (llen < 1) llen = 1; else --llen; + int fs = MAX (0, _fsel - llen); + fib_select ( dpy, fs); + } + break; + case XK_Page_Down: + if (_fsel < _dircount) { + int llen = (_fib_height - LISTBOT * _fib_font_vsep) / _fib_font_vsep; + if (llen < 1) llen = 1; else --llen; + int fs = MIN (_dircount - 1, _fsel + llen); + fib_select ( dpy, fs); + } + break; + case XK_Left: + if (_pathparts > 1) { + int i = 0; + char path[1024] = "/"; + while (++i < _pathparts - 1) { + strcat (path, _pathbtn[i].name); + strcat (path, "/"); + } + char *sel = strdup (_pathbtn[_pathparts-1].name); + fib_opendir (dpy, path, sel); + free (sel); + } + break; + case XK_Right: + if (_fsel >= 0 && _fsel < _dircount) { + if (_dirlist[_fsel].flags & 4) { + cb_open (dpy); + } + } + break; + case XK_Return: + cb_open (dpy); + break; + default: + if ((key >= XK_a && key <= XK_z) || (key >= XK_0 && key <= XK_9)) { + int i; + for (i = 0; i < _dircount; ++i) { + int j = (_fsel + i + 1) % _dircount; + char kcmp = _dirlist[j].name[0]; + if (kcmp > 0x40 && kcmp <= 0x5A) kcmp |= 0x20; + if (kcmp == (char)key) { + fib_select ( dpy, j); + break; + } + } + } + break; + } + } + break; + } + + if (_status) { + x_fib_close (dpy); + } + return _status; +} + +int x_fib_status () { + return _status; +} + +int x_fib_configure (int k, const char *v) { + if (_fib_win) { return -1; } + switch (k) { + case 0: + if (strlen (v) >= sizeof(_cur_path) -1) return -2; + if (strlen (v) < 1) return -2; + if (v[0] != '/') return -2; + if (strstr (v, "//")) return -2; + strncpy (_cur_path, v, sizeof(_cur_path)); + break; + case 1: + if (strlen (v) >= sizeof(_fib_cfg_title) -1) return -2; + strncpy (_fib_cfg_title, v, sizeof(_fib_cfg_title)); + break; + case 2: + if (strlen (v) >= sizeof(_fib_cfg_custom_font) -1) return -2; + strncpy (_fib_cfg_custom_font, v, sizeof(_fib_cfg_custom_font)); + break; + case 3: + if (strlen (v) >= sizeof(_fib_cfg_custom_places) -1) return -2; + strncpy (_fib_cfg_custom_places, v, sizeof(_fib_cfg_custom_places)); + break; + default: + return -2; + } + return 0; +} + +int x_fib_cfg_buttons (int k, int v) { + if (_fib_win) { return -1; } + switch (k) { + case 1: + if (v < 0) { + _btn_hidden.flags |= 8; + } else { + _btn_hidden.flags &= ~8; + } + if (v == 1) { + _btn_hidden.flags |= 2; + _fib_hidden_fn = 1; + } else if (v == 0) { + _btn_hidden.flags &= 2; + _fib_hidden_fn = 0; + } + break; + case 2: + if (v < 0) { + _btn_places.flags |= 8; + } else { + _btn_places.flags &= ~8; + } + if (v == 1) { + _btn_places.flags |= 2; + _fib_show_places = 1; + } else if (v == 0) { + _btn_places.flags &= ~2; + _fib_show_places = 0; + } + break; + case 3: + // NB. filter button is automatically hidden + // IFF the filter-function is NULL. + if (v < 0) { + _btn_filter.flags |= 8; + } else { + _btn_filter.flags &= ~8; + } + if (v == 1) { + _btn_filter.flags &= ~2; // inverse - 'show all' = !filter + _fib_filter_fn = 1; + } else if (v == 0) { + _btn_filter.flags |= 2; + _fib_filter_fn = 0; + } + default: + return -2; + } + return 0; +} + +int x_fib_cfg_filter_callback (int (*cb)(const char*)) { + if (_fib_win) { return -1; } + _fib_filter_function = cb; + return 0; +} + +char *x_fib_filename () { + if (_status > 0 && !_fib_win) + return strdup (_rv_open); + else + return NULL; +} +#endif // SOFD_HAVE_X11 + +#if defined(__clang__) +# pragma clang diagnostic pop +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic pop +#endif + +/* example usage */ +#ifdef SOFD_TEST + +static int fib_filter_movie_filename (const char *name) { + if (!_fib_filter_fn) return 1; + const int l3 = strlen (name) - 3; + const int l4 = l3 - 1; + const int l5 = l4 - 1; + const int l6 = l5 - 1; + const int l9 = l6 - 3; + if ( + (l4 > 0 && ( + !strcasecmp (&name[l4], ".avi") + || !strcasecmp (&name[l4], ".mov") + || !strcasecmp (&name[l4], ".ogg") + || !strcasecmp (&name[l4], ".ogv") + || !strcasecmp (&name[l4], ".mpg") + || !strcasecmp (&name[l4], ".mov") + || !strcasecmp (&name[l4], ".mp4") + || !strcasecmp (&name[l4], ".mkv") + || !strcasecmp (&name[l4], ".vob") + || !strcasecmp (&name[l4], ".asf") + || !strcasecmp (&name[l4], ".avs") + || !strcasecmp (&name[l4], ".dts") + || !strcasecmp (&name[l4], ".flv") + || !strcasecmp (&name[l4], ".m4v") + )) || + (l5 > 0 && ( + !strcasecmp (&name[l5], ".h264") + || !strcasecmp (&name[l5], ".webm") + )) || + (l6 > 0 && ( + !strcasecmp (&name[l6], ".dirac") + )) || + (l9 > 0 && ( + !strcasecmp (&name[l9], ".matroska") + )) || + (l3 > 0 && ( + !strcasecmp (&name[l3], ".dv") + || !strcasecmp (&name[l3], ".ts") + )) + ) + { + return 1; + } + return 0; +} + +int main (int argc, char **argv) { + Display* dpy = XOpenDisplay (0); + if (!dpy) return -1; + + x_fib_cfg_filter_callback (fib_filter_movie_filename); + x_fib_configure (1, "Open Movie File"); + x_fib_load_recent ("/tmp/sofd.recent"); + x_fib_show (dpy, 0, 300, 300); + + while (1) { + XEvent event; + while (XPending (dpy) > 0) { + XNextEvent (dpy, &event); + if (x_fib_handle_events (dpy, &event)) { + if (x_fib_status () > 0) { + char *fn = x_fib_filename (); + printf ("OPEN '%s'\n", fn); + x_fib_add_recent (fn, time (NULL)); + free (fn); + } + } + } + if (x_fib_status ()) { + break; + } + usleep (80000); + } + x_fib_close (dpy); + + x_fib_save_recent ("/tmp/sofd.recent"); + + x_fib_free_recent (); + XCloseDisplay (dpy); + return 0; +} +#endif diff --git a/dpf/dgl/src/sofd/libsofd.h b/dpf/dgl/src/sofd/libsofd.h new file mode 100644 index 0000000..ba8a254 --- /dev/null +++ b/dpf/dgl/src/sofd/libsofd.h @@ -0,0 +1,175 @@ +/* libSOFD - Simple Open File Dialog [for X11 without toolkit] + * + * Copyright (C) 2014 Robin Gareus + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef LIBSOFD_H +#define LIBSOFD_H + +#include + +/////////////////////////////////////////////////////////////////////////////// +/* public API */ + +/** open a file select dialog + * @param dpy X Display connection + * @param parent (optional) if not NULL, become transient for given window + * @param x if >0 set explict initial width of the window + * @param y if >0 set explict initial height of the window + * @return 0 on success + */ +int x_fib_show (Display *dpy, Window parent, int x, int y); + +/** force close the dialog. + * This is normally not needed, the dialog closes itself + * when a file is selected or the user cancels selection. + * @param dpy X Display connection + */ +void x_fib_close (Display *dpy); + +/** non-blocking X11 event handler. + * It is safe to run this function even if the dialog is + * closed or was not initialized. + * + * @param dpy X Display connection + * @param event the XEvent to process + * @return status + * 0: the event was not for this window, or file-dialog still + * active, or the dialog window is not displayed. + * >0: file was selected, dialog closed + * <0: file selection was cancelled. + */ +int x_fib_handle_events (Display *dpy, XEvent *event); + +/** last status of the dialog + * @return >0: file was selected, <0: canceled or inactive. 0: active + */ +int x_fib_status (); + +/** query the selected filename + * @return NULL if none set, or allocated string to be free()ed by the called + */ +char *x_fib_filename (); + +/** customize/configure the dialog before calling \ref x_fib_show + * changes only have any effect if the dialog is not visible. + * @param k key to change + * 0: set current dir to display (must end with slash) + * 1: set title of dialog window + * 2: specify a custom X11 font to use + * 3: specify a custom 'places' file to include + * (following gtk-bookmark convention) + * @param v value + * @return 0 on success. + */ +int x_fib_configure (int k, const char *v); + +/** customize/configure the dialog before calling \ref x_fib_show + * changes only have any effect if the dialog is not visible. + * + * @param k button to change: + * 1: show hidden files + * 2: show places + * 3: show filter/list all (automatically hidden if there is no + * filter function) + * @param v <0 to hide the button >=0 show button, + * 0: set button-state to not-checked + * 1: set button-state to checked + * >1: retain current state + * @return 0 on success. + */ +int x_fib_cfg_buttons (int k, int v); + +/** set custom callback to filter file-names. + * NULL will disable the filter and hide the 'show all' button. + * changes only have any effect if the dialog is not visible. + * + * @param cb callback function to check file + * the callback function is called with the file name (basename only) + * and is expected to return 1 if the file passes the filter + * and 0 if the file should not be listed by default. + * @return 0 on success. + */ +int x_fib_cfg_filter_callback (int (*cb)(const char*)); + +/* 'recently used' API. x-platform + * NOTE: all functions use a static cache and are not reentrant. + * It is expected that none of these functions are called in + * parallel from different threads. + */ + +/** release static resources of 'recently used files' + */ +void x_fib_free_recent (); + +/** add an entry to the recently used list + * + * The dialog does not add files automatically on open, + * if the application succeeds to open a selected file, + * this function should be called. + * + * @param path complete path to file + * @param atime time of last use, 0: NOW + * @return -1 on error, number of current entries otherwise + */ +int x_fib_add_recent (const char *path, time_t atime); + +/** get a platform specific path to a good location for + * saving the recently used file list. + * (follows XDG_DATA_HOME on Unix, and CSIDL_LOCAL_APPDATA spec) + * + * @param application-name to use to include in file + * @return pointer to static path or NULL + */ +const char *x_fib_recent_file(const char *appname); + +/** save the current list of recently used files to the given filename + * (the format is one file per line, filename URL encoded and space separated + * with last-used timestamp) + * + * This function tries to creates the containing directory if it does + * not exist. + * + * @param fn file to save the list to + * @return 0: on success + */ +int x_fib_save_recent (const char *fn); + +/** load a recently used file list. + * + * @param fn file to load the list from + * @return 0: on success + */ +int x_fib_load_recent (const char *fn); + +/** get number of entries in the current list + * @return number of entries in the recently used list + */ +unsigned int x_fib_recent_count (); + +/** get recently used entry at given position + * + * @param i entry to query + * @return pointer to static string + */ +const char *x_fib_recent_at (unsigned int i); + +#endif // LIBSOFD_H diff --git a/dpf/distrho/DistrhoInfo.hpp b/dpf/distrho/DistrhoInfo.hpp new file mode 100644 index 0000000..4105292 --- /dev/null +++ b/dpf/distrho/DistrhoInfo.hpp @@ -0,0 +1,571 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef DOXYGEN + +#include "src/DistrhoDefines.h" + +START_NAMESPACE_DISTRHO + +/* ------------------------------------------------------------------------------------------------------------ + * Intro */ + +/** + @mainpage DISTRHO %Plugin Framework + + DISTRHO %Plugin Framework (or @b DPF for short) + is a plugin framework designed to make development of new plugins an easy and enjoyable task.@n + It allows developers to create plugins with custom UIs using a simple C++ API.@n + The framework facilitates exporting various different plugin formats from the same code-base. + + DPF can build for LADSPA, DSSI, LV2 and VST2 formats.@n + A JACK/Standalone mode is also available, allowing you to quickly test plugins. + + @section Macros + You start by creating a "DistrhoPluginInfo.h" file describing the plugin via macros, see @ref PluginMacros.@n + This file is included in the main DPF code to select which features to activate for each plugin format. + + For example, a plugin (with %UI) that use states will require LV2 hosts to support Atom and Worker extensions for + message passing from the %UI to the plugin.@n + If your plugin does not make use of states, the Worker extension is not set as a required feature. + + @section Plugin + The next step is to create your plugin code by subclassing DPF's Plugin class.@n + You need to pass the number of parameters in the constructor and also the number of programs and states, if any. + + Here's an example of an audio plugin that simply mutes the host output: + @code + class MutePlugin : public Plugin + { + public: + /** + Plugin class constructor. + */ + MutePlugin() + : Plugin(0, 0, 0) // 0 parameters, 0 programs and 0 states + { + } + + protected: + /* ---------------------------------------------------------------------------------------- + * Information */ + + /** + Get the plugin label. + This label is a short restricted name consisting of only _, a-z, A-Z and 0-9 characters. + */ + const char* getLabel() const override + { + return "Mute"; + } + + /** + Get the plugin author/maker. + */ + const char* getMaker() const override + { + return "DPF"; + } + + /** + Get the plugin license name (a single line of text). + For commercial plugins this should return some short copyright information. + */ + const char* getLicense() const override + { + return "MIT"; + } + + /** + Get the plugin version, in hexadecimal. + TODO format to be defined + */ + uint32_t getVersion() const override + { + return 0x1000; + } + + /** + Get the plugin unique Id. + This value is used by LADSPA, DSSI and VST plugin formats. + */ + int64_t getUniqueId() const override + { + return cconst('M', 'u', 't', 'e'); + } + + /* ---------------------------------------------------------------------------------------- + * This example has no parameters, so skip parameter stuff */ + + void initParameter(uint32_t, Parameter&) override {} + float getParameterValue(uint32_t) const override { return 0.0f; } + void setParameterValue(uint32_t, float) override {} + + /* ---------------------------------------------------------------------------------------- + * Audio/MIDI Processing */ + + /** + Run/process function for plugins without MIDI input. + NOTE: Some parameters might be null if there are no audio inputs or outputs. + */ + void run(const float**, float** outputs, uint32_t frames) override + { + // get the left and right audio outputs + float* const outL = outputs[0]; + float* const outR = outputs[1]; + + // mute audio + std::memset(outL, 0, sizeof(float)*frames); + std::memset(outR, 0, sizeof(float)*frames); + } + + }; + @endcode + + See the Plugin class for more information and to understand what each function does. + + @section Parameters + A plugin is nothing without parameters.@n + In DPF parameters can be inputs or outputs.@n + They have hints to describe how they behave plus a name and a symbol identifying them.@n + Parameters also have 'ranges' – a minimum, maximum and default value. + + Input parameters are "read-only": the plugin can read them but not change them. + (the exception being when changing programs, more on that below)@n + It's the host responsibility to save, restore and set input parameters. + + Output parameters can be changed at anytime by the plugin.@n + The host will simply read their values and not change them. + + Here's an example of an audio plugin that has 1 input parameter: + @code + class GainPlugin : public Plugin + { + public: + /** + Plugin class constructor. + You must set all parameter values to their defaults, matching ParameterRanges::def. + */ + GainPlugin() + : Plugin(1, 0, 0), // 1 parameter, 0 programs and 0 states + fGain(1.0f) + { + } + + protected: + /* ---------------------------------------------------------------------------------------- + * Information */ + + const char* getLabel() const override + { + return "Gain"; + } + + const char* getMaker() const override + { + return "DPF"; + } + + const char* getLicense() const override + { + return "MIT"; + } + + uint32_t getVersion() const override + { + return 0x1000; + } + + int64_t getUniqueId() const override + { + return cconst('G', 'a', 'i', 'n'); + } + + /* ---------------------------------------------------------------------------------------- + * Init */ + + /** + Initialize a parameter. + This function will be called once, shortly after the plugin is created. + */ + void initParameter(uint32_t index, Parameter& parameter) override + { + // we only have one parameter so we can skip checking the index + + parameter.hints = kParameterIsAutomable; + parameter.name = "Gain"; + parameter.symbol = "gain"; + parameter.ranges.min = 0.0f; + parameter.ranges.max = 2.0f; + parameter.ranges.def = 1.0f; + } + + /* ---------------------------------------------------------------------------------------- + * Internal data */ + + /** + Get the current value of a parameter. + */ + float getParameterValue(uint32_t index) const override + { + // same as before, ignore index check + + return fGain; + } + + /** + Change a parameter value. + */ + void setParameterValue(uint32_t index, float value) override + { + // same as before, ignore index check + + fGain = value; + } + + /* ---------------------------------------------------------------------------------------- + * Audio/MIDI Processing */ + + void run(const float**, float** outputs, uint32_t frames) override + { + // get the mono input and output + const float* const in = inputs[0]; + /* */ float* const out = outputs[0]; + + // apply gain against all samples + for (uint32_t i=0; i < frames; ++i) + out[i] = in[i] * fGain; + } + + private: + float fGain; + }; + @endcode + + See the Parameter struct for more information about parameters. + + @section Programs + Programs in DPF refer to plugin-side presets (usually called "factory presets"), + an initial set of presets provided by plugin authors included in the actual plugin. + + To use programs you must first enable them by setting @ref DISTRHO_PLUGIN_WANT_PROGRAMS to 1 in your DistrhoPluginInfo.h file.@n + When enabled you'll need to override 2 new function in your plugin code, + Plugin::initProgramName(uint32_t, String&) and Plugin::loadProgram(uint32_t). + + Here's an example of a plugin with a "default" program: + @code + class PluginWithPresets : public Plugin + { + public: + PluginWithPresets() + : Plugin(2, 1, 0), // 2 parameters, 1 program and 0 states + fGainL(1.0f), + fGainR(1.0f), + { + } + + protected: + /* ---------------------------------------------------------------------------------------- + * Information */ + + const char* getLabel() const override + { + return "Prog"; + } + + const char* getMaker() const override + { + return "DPF"; + } + + const char* getLicense() const override + { + return "MIT"; + } + + uint32_t getVersion() const override + { + return 0x1000; + } + + int64_t getUniqueId() const override + { + return cconst('P', 'r', 'o', 'g'); + } + + /* ---------------------------------------------------------------------------------------- + * Init */ + + /** + Initialize a parameter. + This function will be called once, shortly after the plugin is created. + */ + void initParameter(uint32_t index, Parameter& parameter) override + { + parameter.hints = kParameterIsAutomable; + parameter.ranges.min = 0.0f; + parameter.ranges.max = 2.0f; + parameter.ranges.def = 1.0f; + + switch (index) + { + case 0; + parameter.name = "Gain Right"; + parameter.symbol = "gainR"; + break; + case 1; + parameter.name = "Gain Left"; + parameter.symbol = "gainL"; + break; + } + } + + /** + Set the name of the program @a index. + This function will be called once, shortly after the plugin is created. + */ + void initProgramName(uint32_t index, String& programName) + { + switch(index) + { + case 0: + programName = "Default"; + break; + } + } + + /* ---------------------------------------------------------------------------------------- + * Internal data */ + + /** + Get the current value of a parameter. + */ + float getParameterValue(uint32_t index) const override + { + switch (index) + { + case 0; + return fGainL; + case 1; + return fGainR; + } + } + + /** + Change a parameter value. + */ + void setParameterValue(uint32_t index, float value) override + { + switch (index) + { + case 0; + fGainL = value; + break; + case 1; + fGainR = value; + break; + } + } + + /** + Load a program. + */ + void loadProgram(uint32_t index) + { + switch(index) + { + case 0: + fGainL = 1.0f; + fGainR = 1.0f; + break; + } + } + + /* ---------------------------------------------------------------------------------------- + * Audio/MIDI Processing */ + + void run(const float**, float** outputs, uint32_t frames) override + { + // get the left and right audio buffers + const float* const inL = inputs[0]; + const float* const inR = inputs[0]; + /* */ float* const outL = outputs[0]; + /* */ float* const outR = outputs[0]; + + // apply gain against all samples + for (uint32_t i=0; i < frames; ++i) + { + outL[i] = inL[i] * fGainL; + outR[i] = inR[i] * fGainR; + } + } + + private: + float fGainL, fGainR; + }; + @endcode + + @section States + describe them + + @section MIDI + describe them + + @section Latency + describe it + + @section Time-Position + describe it + + @section UI + describe them +*/ + +/* ------------------------------------------------------------------------------------------------------------ + * Plugin Macros */ + +/** + @defgroup PluginMacros Plugin Macros + + C Macros that describe your plugin. (defined in the "DistrhoPluginInfo.h" file) + + With these macros you can tell the host what features your plugin requires.@n + Depending on which macros you enable, new functions will be available to call and/or override. + + All values are either integer or strings.@n + For boolean-like values 1 means 'on' and 0 means 'off'. + + The values defined in this group are for documentation purposes only.@n + All macros are disabled by default. + + Only 4 macros are required, they are: + - @ref DISTRHO_PLUGIN_NAME + - @ref DISTRHO_PLUGIN_NUM_INPUTS + - @ref DISTRHO_PLUGIN_NUM_OUTPUTS + - @ref DISTRHO_PLUGIN_URI + @{ + */ + +/** + The plugin name.@n + This is used to identify your plugin before a Plugin instance can be created. + @note This macro is required. + */ +#define DISTRHO_PLUGIN_NAME "Plugin Name" + +/** + Number of audio inputs the plugin has. + @note This macro is required. + */ +#define DISTRHO_PLUGIN_NUM_INPUTS 2 + +/** + Number of audio outputs the plugin has. + @note This macro is required. + */ +#define DISTRHO_PLUGIN_NUM_OUTPUTS 2 + +/** + The plugin URI when exporting in LV2 format. + @note This macro is required. + */ +#define DISTRHO_PLUGIN_URI "urn:distrho:name" + +/** + Wherever the plugin has a custom %UI. + @see DISTRHO_UI_USE_NANOVG + @see UI + */ +#define DISTRHO_PLUGIN_HAS_UI 1 + +/** + Wherever the plugin processing is realtime-safe.@n + TODO - list rtsafe requirements + */ +#define DISTRHO_PLUGIN_IS_RT_SAFE 1 + +/** + Wherever the plugin is a synth.@n + @ref DISTRHO_PLUGIN_WANT_MIDI_INPUT is automatically enabled when this is too. + @see DISTRHO_PLUGIN_WANT_MIDI_INPUT + */ +#define DISTRHO_PLUGIN_IS_SYNTH 1 + +/** + Enable direct access between the %UI and plugin code. + @see UI::getPluginInstancePointer() + @note DO NOT USE THIS UNLESS STRICTLY NECESSARY!! + Try to avoid it at all costs! + */ +#define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 0 + +/** + Wherever the plugin introduces latency during audio or midi processing. + @see Plugin::setLatency(uint32_t) + */ +#define DISTRHO_PLUGIN_WANT_LATENCY 1 + +/** + Wherever the plugin wants MIDI input.@n + This is automatically enabled if @ref DISTRHO_PLUGIN_IS_SYNTH is true. + */ +#define DISTRHO_PLUGIN_WANT_MIDI_INPUT 1 + +/** + Wherever the plugin wants MIDI output. + @see Plugin::writeMidiEvent(const MidiEvent&) + */ +#define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 1 + +/** + Wherever the plugin provides its own internal programs. + @see Plugin::initProgramName(uint32_t, String&) + @see Plugin::loadProgram(uint32_t) + */ +#define DISTRHO_PLUGIN_WANT_PROGRAMS 1 + +/** + Wherever the plugin uses internal non-parameter data. + @see Plugin::initState(uint32_t, String&, String&) + @see Plugin::setState(const char*, const char*) + */ +#define DISTRHO_PLUGIN_WANT_STATE 1 + +/** + Wherever the plugin wants time position information from the host. + @see Plugin::getTimePosition() + */ +#define DISTRHO_PLUGIN_WANT_TIMEPOS 1 + +/** + Wherever the %UI uses NanoVG for drawing instead of the default raw OpenGL calls.@n + When enabled your %UI instance will subclass @ref NanoWidget instead of @ref Widget. + */ +#define DISTRHO_UI_USE_NANOVG 1 + +/** + The %UI URI when exporting in LV2 format.@n + By default this is set to @ref DISTRHO_PLUGIN_URI with "#UI" as suffix. + */ +#define DISTRHO_UI_URI DISTRHO_PLUGIN_URI "#UI" + +/** @} */ + +// ----------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DOXYGEN diff --git a/dpf/distrho/DistrhoPlugin.hpp b/dpf/distrho/DistrhoPlugin.hpp new file mode 100644 index 0000000..0ee9893 --- /dev/null +++ b/dpf/distrho/DistrhoPlugin.hpp @@ -0,0 +1,720 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_PLUGIN_HPP_INCLUDED +#define DISTRHO_PLUGIN_HPP_INCLUDED + +#include "extra/String.hpp" +#include "extra/LeakDetector.hpp" +#include "src/DistrhoPluginChecks.h" + +START_NAMESPACE_DISTRHO + +/* ------------------------------------------------------------------------------------------------------------ + * Audio Port Hints */ + +/** + @defgroup AudioPortHints Audio Port Hints + + Various audio port hints. + @see AudioPort::hints + @{ + */ + +/** + Audio port can be used as control voltage (LV2 only). + */ +static const uint32_t kAudioPortIsCV = 0x1; + +/** + Audio port should be used as sidechan (LV2 only). + */ +static const uint32_t kAudioPortIsSidechain = 0x2; + +/** @} */ + +/* ------------------------------------------------------------------------------------------------------------ + * Parameter Hints */ + +/** + @defgroup ParameterHints Parameter Hints + + Various parameter hints. + @see Parameter::hints + @{ + */ + +/** + Parameter is automable (real-time safe). + @see Plugin::setParameterValue(uint32_t, float) + */ +static const uint32_t kParameterIsAutomable = 0x01; + +/** + Parameter value is boolean.@n + It's always at either minimum or maximum value. + */ +static const uint32_t kParameterIsBoolean = 0x02; + +/** + Parameter value is integer. + */ +static const uint32_t kParameterIsInteger = 0x04; + +/** + Parameter value is logarithmic. + */ +static const uint32_t kParameterIsLogarithmic = 0x08; + +/** + Parameter is of output type.@n + When unset, parameter is assumed to be of input type. + + Parameter inputs are changed by the host and must not be changed by the plugin.@n + The only exception being when changing programs, see Plugin::loadProgram().@n + Outputs are changed by the plugin and never modified by the host. + */ +static const uint32_t kParameterIsOutput = 0x10; + +/** @} */ + +/* ------------------------------------------------------------------------------------------------------------ + * Base Plugin structs */ + +/** + @defgroup BasePluginStructs Base Plugin Structs + @{ + */ + +/** + Audio Port. + */ +struct AudioPort { + /** + Hints describing this audio port. + @see AudioPortHints + */ + uint32_t hints; + + /** + The name of this audio port.@n + An audio port name can contain any character, but hosts might have a hard time with non-ascii ones.@n + The name doesn't have to be unique within a plugin instance, but it's recommended. + */ + String name; + + /** + The symbol of this audio port.@n + An audio port symbol is a short restricted name used as a machine and human readable identifier.@n + The first character must be one of _, a-z or A-Z and subsequent characters can be from _, a-z, A-Z and 0-9. + @note Audio port and parameter symbols MUST be unique within a plugin instance. + */ + String symbol; + + /** + Default constructor for a regular audio port. + */ + AudioPort() noexcept + : hints(0x0), + name(), + symbol() {} +}; + +/** + Parameter ranges.@n + This is used to set the default, minimum and maximum values of a parameter. + + By default a parameter has 0.0 as minimum, 1.0 as maximum and 0.0 as default.@n + When changing this struct values you must ensure maximum > minimum and default is within range. + */ +struct ParameterRanges { + /** + Default value. + */ + float def; + + /** + Minimum value. + */ + float min; + + /** + Maximum value. + */ + float max; + + /** + Default constructor, using 0.0 as minimum, 1.0 as maximum and 0.0 as default. + */ + ParameterRanges() noexcept + : def(0.0f), + min(0.0f), + max(1.0f) {} + + /** + Constructor using custom values. + */ + ParameterRanges(float df, float mn, float mx) noexcept + : def(df), + min(mn), + max(mx) {} + + /** + Fix the default value within range. + */ + void fixDefault() noexcept + { + fixValue(def); + } + + /** + Fix a value within range. + */ + void fixValue(float& value) const noexcept + { + if (value < min) + value = min; + else if (value > max) + value = max; + } + + /** + Get a fixed value within range. + */ + const float& getFixedValue(const float& value) const noexcept + { + if (value <= min) + return min; + if (value >= max) + return max; + return value; + } + + /** + Get a value normalized to 0.0<->1.0. + */ + float getNormalizedValue(const float& value) const noexcept + { + const float normValue((value - min) / (max - min)); + + if (normValue <= 0.0f) + return 0.0f; + if (normValue >= 1.0f) + return 1.0f; + return normValue; + } + + /** + Get a value normalized to 0.0<->1.0, fixed within range. + */ + float getFixedAndNormalizedValue(const float& value) const noexcept + { + if (value <= min) + return 0.0f; + if (value >= max) + return 1.0f; + + const float normValue((value - min) / (max - min)); + + if (normValue <= 0.0f) + return 0.0f; + if (normValue >= 1.0f) + return 1.0f; + + return normValue; + } + + /** + Get a proper value previously normalized to 0.0<->1.0. + */ + float getUnnormalizedValue(const float& value) const noexcept + { + if (value <= 0.0f) + return min; + if (value >= 1.0f) + return max; + + return value * (max - min) + min; + } +}; + +/** + Parameter. + */ +struct Parameter { + /** + Hints describing this parameter. + @see ParameterHints + */ + uint32_t hints; + + /** + The name of this parameter.@n + A parameter name can contain any character, but hosts might have a hard time with non-ascii ones.@n + The name doesn't have to be unique within a plugin instance, but it's recommended. + */ + String name; + + /** + The symbol of this parameter.@n + A parameter symbol is a short restricted name used as a machine and human readable identifier.@n + The first character must be one of _, a-z or A-Z and subsequent characters can be from _, a-z, A-Z and 0-9. + @note Parameter symbols MUST be unique within a plugin instance. + */ + String symbol; + + /** + The unit of this parameter.@n + This means something like "dB", "kHz" and "ms".@n + Can be left blank if a unit does not apply to this parameter. + */ + String unit; + + /** + Ranges of this parameter.@n + The ranges describe the default, minimum and maximum values. + */ + ParameterRanges ranges; + + /** + Default constructor for a null parameter. + */ + Parameter() noexcept + : hints(0x0), + name(), + symbol(), + unit(), + ranges() {} + + /** + Constructor using custom values. + */ + Parameter(uint32_t h, const char* n, const char* s, const char* u, float def, float min, float max) noexcept + : hints(h), + name(n), + symbol(s), + unit(u), + ranges(def, min, max) {} +}; + +/** + MIDI event. + */ +struct MidiEvent { + /** + Size of internal data. + */ + static const uint32_t kDataSize = 4; + + /** + Time offset in frames. + */ + uint32_t frame; + + /** + Number of bytes used. + */ + uint32_t size; + + /** + MIDI data.@n + If size > kDataSize, dataExt is used (otherwise null). + */ + uint8_t data[kDataSize]; + const uint8_t* dataExt; +}; + +/** + Time position.@n + The @a playing and @a frame values are always valid.@n + BBT values are only valid when @a bbt.valid is true. + + This struct is inspired by the JACK Transport API. + */ +struct TimePosition { + /** + Wherever the host transport is playing/rolling. + */ + bool playing; + + /** + Current host transport position in frames. + */ + uint64_t frame; + + /** + Bar-Beat-Tick time position. + */ + struct BarBeatTick { + /** + Wherever the host transport is using BBT.@n + If false you must not read from this struct. + */ + bool valid; + + /** + Current bar.@n + Should always be > 0.@n + The first bar is bar '1'. + */ + int32_t bar; + + /** + Current beat within bar.@n + Should always be > 0 and <= @a beatsPerBar.@n + The first beat is beat '1'. + */ + int32_t beat; + + /** + Current tick within beat.@n + Should always be > 0 and <= @a ticksPerBeat.@n + The first tick is tick '0'. + */ + int32_t tick; + + /** + Number of ticks that have elapsed between frame 0 and the first beat of the current measure. + */ + double barStartTick; + + /** + Time signature "numerator". + */ + float beatsPerBar; + + /** + Time signature "denominator". + */ + float beatType; + + /** + Number of ticks within a bar.@n + Usually a moderately large integer with many denominators, such as 1920.0. + */ + double ticksPerBeat; + + /** + Number of beats per minute. + */ + double beatsPerMinute; + + /** + Default constructor for a null BBT time position. + */ + BarBeatTick() noexcept + : valid(false), + bar(0), + beat(0), + tick(0), + barStartTick(0.0), + beatsPerBar(0.0f), + beatType(0.0f), + ticksPerBeat(0.0), + beatsPerMinute(0.0) {} + } bbt; + + /** + Default constructor for a time position. + */ + TimePosition() noexcept + : playing(false), + frame(0), + bbt() {} +}; + +/** @} */ + +/* ------------------------------------------------------------------------------------------------------------ + * DPF Plugin */ + +/** + @defgroup MainClasses Main Classes + @{ + */ + +/** + DPF Plugin class from where plugin instances are created. + + The public methods (Host state) are called from the plugin to get or set host information.@n + They can be called from a plugin instance at anytime unless stated otherwise.@n + All other methods are to be implemented by the plugin and will be called by the host. + + Shortly after a plugin instance is created, the various init* functions will be called by the host.@n + Host will call activate() before run(), and deactivate() before the plugin instance is destroyed.@n + The host may call deactivate right after activate and vice-versa, but never activate/deactivate consecutively.@n + There is no limit on how many times run() is called, only that activate/deactivate will be called in between. + + The buffer size and sample rate values will remain constant between activate and deactivate.@n + Buffer size is only a hint though, the host might call run() with a higher or lower number of frames. + + Some of this class functions are only available according to some macros. + + DISTRHO_PLUGIN_WANT_PROGRAMS activates program related features.@n + When enabled you need to implement initProgramName() and loadProgram(). + + DISTRHO_PLUGIN_WANT_STATE activates internal state features.@n + When enabled you need to implement initStateKey() and setState(). + + The process function run() changes wherever DISTRHO_PLUGIN_WANT_MIDI_INPUT is enabled or not.@n + When enabled it provides midi input events. + */ +class Plugin +{ +public: + /** + Plugin class constructor.@n + You must set all parameter values to their defaults, matching ParameterRanges::def. + */ + Plugin(uint32_t parameterCount, uint32_t programCount, uint32_t stateCount); + + /** + Destructor. + */ + virtual ~Plugin(); + + /* -------------------------------------------------------------------------------------------------------- + * Host state */ + + /** + Get the current buffer size that will probably be used during processing, in frames.@n + This value will remain constant between activate and deactivate. + @note This value is only a hint!@n + Hosts might call run() with a higher or lower number of frames. + @see bufferSizeChanged(uint32_t) + */ + uint32_t getBufferSize() const noexcept; + + /** + Get the current sample rate that will be used during processing.@n + This value will remain constant between activate and deactivate. + @see sampleRateChanged(double) + */ + double getSampleRate() const noexcept; + +#if DISTRHO_PLUGIN_WANT_TIMEPOS + /** + Get the current host transport time position.@n + This function should only be called during run().@n + You can call this during other times, but the returned position is not guaranteed to be in sync. + @note TimePosition is not supported in LADSPA and DSSI plugin formats. + */ + const TimePosition& getTimePosition() const noexcept; +#endif + +#if DISTRHO_PLUGIN_WANT_LATENCY + /** + Change the plugin audio output latency to @a frames.@n + This function should only be called in the constructor, activate() and run(). + @note This function is only available if DISTRHO_PLUGIN_WANT_LATENCY is enabled. + */ + void setLatency(uint32_t frames) noexcept; +#endif + +#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + /** + Write a MIDI output event.@n + This function must only be called during run().@n + Returns false when the host buffer is full, in which case do not call this again until the next run(). + */ + bool writeMidiEvent(const MidiEvent& midiEvent) noexcept; +#endif + +protected: + /* -------------------------------------------------------------------------------------------------------- + * Information */ + + /** + Get the plugin name.@n + Returns DISTRHO_PLUGIN_NAME by default. + */ + virtual const char* getName() const { return DISTRHO_PLUGIN_NAME; } + + /** + Get the plugin label.@n + This label is a short restricted name consisting of only _, a-z, A-Z and 0-9 characters. + */ + virtual const char* getLabel() const = 0; + + /** + Get the plugin author/maker. + */ + virtual const char* getMaker() const = 0; + + /** + Get the plugin license name (a single line of text).@n + For commercial plugins this should return some short copyright information. + */ + virtual const char* getLicense() const = 0; + + /** + Get the plugin version, in hexadecimal.@n + TODO format to be defined + */ + virtual uint32_t getVersion() const = 0; + + /** + Get the plugin unique Id.@n + This value is used by LADSPA, DSSI and VST plugin formats. + */ + virtual int64_t getUniqueId() const = 0; + + /* -------------------------------------------------------------------------------------------------------- + * Init */ + + /** + Initialize the audio port @a index.@n + This function will be called once, shortly after the plugin is created. + */ + virtual void initAudioPort(bool input, uint32_t index, AudioPort& port); + + /** + Initialize the parameter @a index.@n + This function will be called once, shortly after the plugin is created. + */ + virtual void initParameter(uint32_t index, Parameter& parameter) = 0; + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + /** + Set the name of the program @a index.@n + This function will be called once, shortly after the plugin is created.@n + Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_PROGRAMS is enabled. + */ + virtual void initProgramName(uint32_t index, String& programName) = 0; +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + /** + Set the state key and default value of @a index.@n + This function will be called once, shortly after the plugin is created.@n + Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled. + */ + virtual void initState(uint32_t index, String& stateKey, String& defaultStateValue) = 0; +#endif + + /* -------------------------------------------------------------------------------------------------------- + * Internal data */ + + /** + Get the current value of a parameter.@n + The host may call this function from any context, including realtime processing. + */ + virtual float getParameterValue(uint32_t index) const = 0; + + /** + Change a parameter value.@n + The host may call this function from any context, including realtime processing.@n + When a parameter is marked as automable, you must ensure no non-realtime operations are performed. + @note This function will only be called for parameter inputs. + */ + virtual void setParameterValue(uint32_t index, float value) = 0; + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + /** + Load a program.@n + The host may call this function from any context, including realtime processing.@n + Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_PROGRAMS is enabled. + */ + virtual void loadProgram(uint32_t index) = 0; +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + /** + Change an internal state @a key to @a value.@n + Must be implemented by your plugin class only if DISTRHO_PLUGIN_WANT_STATE is enabled. + */ + virtual void setState(const char* key, const char* value) = 0; +#endif + + /* -------------------------------------------------------------------------------------------------------- + * Audio/MIDI Processing */ + + /** + Activate this plugin. + */ + virtual void activate() {} + + /** + Deactivate this plugin. + */ + virtual void deactivate() {} + +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + /** + Run/process function for plugins with MIDI input. + @note Some parameters might be null if there are no audio inputs/outputs or MIDI events. + */ + virtual void run(const float** inputs, float** outputs, uint32_t frames, + const MidiEvent* midiEvents, uint32_t midiEventCount) = 0; +#else + /** + Run/process function for plugins without MIDI input. + @note Some parameters might be null if there are no audio inputs or outputs. + */ + virtual void run(const float** inputs, float** outputs, uint32_t frames) = 0; +#endif + + /* -------------------------------------------------------------------------------------------------------- + * Callbacks (optional) */ + + /** + Optional callback to inform the plugin about a buffer size change.@n + This function will only be called when the plugin is deactivated. + @note This value is only a hint!@n + Hosts might call run() with a higher or lower number of frames. + @see getBufferSize() + */ + virtual void bufferSizeChanged(uint32_t newBufferSize); + + /** + Optional callback to inform the plugin about a sample rate change.@n + This function will only be called when the plugin is deactivated. + @see getSampleRate() + */ + virtual void sampleRateChanged(double newSampleRate); + + // ------------------------------------------------------------------------------------------------------- + +private: + struct PrivateData; + PrivateData* const pData; + friend class PluginExporter; + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Plugin) +}; + +/** @} */ + +/* ------------------------------------------------------------------------------------------------------------ + * Create plugin, entry point */ + +/** + @defgroup EntryPoints Entry Points + @{ + */ + +/** + TODO. + */ +extern Plugin* createPlugin(); + +/** @} */ + +// ----------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_PLUGIN_HPP_INCLUDED diff --git a/dpf/distrho/DistrhoPluginMain.cpp b/dpf/distrho/DistrhoPluginMain.cpp new file mode 100644 index 0000000..76dea76 --- /dev/null +++ b/dpf/distrho/DistrhoPluginMain.cpp @@ -0,0 +1,30 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "src/DistrhoPlugin.cpp" + +#if defined(DISTRHO_PLUGIN_TARGET_CARLA) +# include "src/DistrhoPluginCarla.cpp" +#elif defined(DISTRHO_PLUGIN_TARGET_JACK) +# include "src/DistrhoPluginJack.cpp" +#elif (defined(DISTRHO_PLUGIN_TARGET_LADSPA) || defined(DISTRHO_PLUGIN_TARGET_DSSI)) +# include "src/DistrhoPluginLADSPA+DSSI.cpp" +#elif defined(DISTRHO_PLUGIN_TARGET_LV2) +# include "src/DistrhoPluginLV2.cpp" +# include "src/DistrhoPluginLV2export.cpp" +#elif defined(DISTRHO_PLUGIN_TARGET_VST) +# include "src/DistrhoPluginVST.cpp" +#endif diff --git a/dpf/distrho/DistrhoUI.hpp b/dpf/distrho/DistrhoUI.hpp new file mode 100644 index 0000000..18d0789 --- /dev/null +++ b/dpf/distrho/DistrhoUI.hpp @@ -0,0 +1,209 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_UI_HPP_INCLUDED +#define DISTRHO_UI_HPP_INCLUDED + +#include "extra/LeakDetector.hpp" +#include "src/DistrhoPluginChecks.h" + +#if DISTRHO_UI_USE_NANOVG +# include "../dgl/NanoVG.hpp" +typedef DGL::NanoWidget UIWidget; +#else +# include "../dgl/Widget.hpp" +typedef DGL::Widget UIWidget; +#endif + +START_NAMESPACE_DISTRHO + +/* ------------------------------------------------------------------------------------------------------------ + * DPF UI */ + +/** + @addtogroup MainClasses + @{ + */ + +/** + DPF UI class from where UI instances are created. + + TODO. + + must call setSize during construction, + */ +class UI : public UIWidget +{ +public: + /** + UI class constructor. + The UI should be initialized to a default state that matches the plugin side. + */ + UI(uint width = 0, uint height = 0); + + /** + Destructor. + */ + virtual ~UI(); + + /* -------------------------------------------------------------------------------------------------------- + * Host state */ + + /** + Get the current sample rate used in plugin processing. + @see sampleRateChanged(double) + */ + double getSampleRate() const noexcept; + + /** + TODO: Document this. + */ + void editParameter(uint32_t index, bool started); + + /** + TODO: Document this. + */ + void setParameterValue(uint32_t index, float value); + +#if DISTRHO_PLUGIN_WANT_STATE + /** + TODO: Document this. + */ + void setState(const char* key, const char* value); +#endif + +#if DISTRHO_PLUGIN_IS_SYNTH + /** + TODO: Document this. + */ + void sendNote(uint8_t channel, uint8_t note, uint8_t velocity); +#endif + +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + /* -------------------------------------------------------------------------------------------------------- + * Direct DSP access - DO NOT USE THIS UNLESS STRICTLY NECESSARY!! */ + + /** + TODO: Document this. + */ + void* getPluginInstancePointer() const noexcept; +#endif + +protected: + /* -------------------------------------------------------------------------------------------------------- + * DSP/Plugin Callbacks */ + + /** + A parameter has changed on the plugin side. + This is called by the host to inform the UI about parameter changes. + */ + virtual void parameterChanged(uint32_t index, float value) = 0; + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + /** + A program has been loaded on the plugin side. + This is called by the host to inform the UI about program changes. + */ + virtual void programLoaded(uint32_t index) = 0; +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + /** + A state has changed on the plugin side. + This is called by the host to inform the UI about state changes. + */ + virtual void stateChanged(const char* key, const char* value) = 0; +#endif + + /* -------------------------------------------------------------------------------------------------------- + * DSP/Plugin Callbacks (optional) */ + + /** + Optional callback to inform the UI about a sample rate change on the plugin side. + @see getSampleRate() + */ + virtual void sampleRateChanged(double newSampleRate); + + /* -------------------------------------------------------------------------------------------------------- + * UI Callbacks (optional) */ + + /** + TODO: Document this. + */ + virtual void uiIdle() {} + + /** + File browser selected function. + @see Window::fileBrowserSelected(const char*) + */ + virtual void uiFileBrowserSelected(const char* filename); + + /** + OpenGL window reshape function, called when parent window is resized. + You can reimplement this function for a custom OpenGL state. + @see Window::onReshape(uint,uint) + */ + virtual void uiReshape(uint width, uint height); + + /* -------------------------------------------------------------------------------------------------------- + * UI Resize Handling, internal */ + + /** + OpenGL widget resize function, called when the widget is resized. + This is overriden here so the host knows when the UI is resized by you. + @see Widget::onResize(const ResizeEvent&) + */ + void onResize(const ResizeEvent& ev) override; + + // ------------------------------------------------------------------------------------------------------- + +private: + struct PrivateData; + PrivateData* const pData; + friend class UIExporter; + friend class UIExporterWindow; + + // these should not be used + void setAbsoluteX(int) const noexcept {} + void setAbsoluteY(int) const noexcept {} + void setAbsolutePos(int, int) const noexcept {} + void setAbsolutePos(const DGL::Point&) const noexcept {} + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UI) +}; + +/** @} */ + +/* ------------------------------------------------------------------------------------------------------------ + * Create UI, entry point */ + +/** + @addtogroup EntryPoints + @{ + */ + +/** + TODO. + */ +extern UI* createUI(); + +/** @} */ + +// ----------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_UI_HPP_INCLUDED diff --git a/dpf/distrho/DistrhoUIMain.cpp b/dpf/distrho/DistrhoUIMain.cpp new file mode 100644 index 0000000..ee4a6e5 --- /dev/null +++ b/dpf/distrho/DistrhoUIMain.cpp @@ -0,0 +1,29 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "src/DistrhoUI.cpp" + +#if defined(DISTRHO_PLUGIN_TARGET_CARLA) +// nothing +#elif defined(DISTRHO_PLUGIN_TARGET_JACK) +// nothing +#elif defined(DISTRHO_PLUGIN_TARGET_DSSI) +# include "src/DistrhoUIDSSI.cpp" +#elif defined(DISTRHO_PLUGIN_TARGET_LV2) +# include "src/DistrhoUILV2.cpp" +#elif defined(DISTRHO_PLUGIN_TARGET_VST) +// nothing +#endif diff --git a/dpf/distrho/DistrhoUtils.hpp b/dpf/distrho/DistrhoUtils.hpp new file mode 100644 index 0000000..874ec41 --- /dev/null +++ b/dpf/distrho/DistrhoUtils.hpp @@ -0,0 +1,233 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_UTILS_HPP_INCLUDED +#define DISTRHO_UTILS_HPP_INCLUDED + +#include "src/DistrhoDefines.h" + +#include +#include +#include +#include + +#include +#include + +#ifdef DISTRHO_PROPER_CPP11_SUPPORT +# include +#else +# include +#endif + +#if defined(DISTRHO_OS_MAC) && ! defined(CARLA_OS_MAC) +namespace std { +inline float fmin(float __x, float __y) + { return __builtin_fminf(__x, __y); } +inline float fmax(float __x, float __y) + { return __builtin_fmaxf(__x, __y); } +inline float rint(float __x) + { return __builtin_rintf(__x); } +inline float round(float __x) + { return __builtin_roundf(__x); } +} +#endif + +#ifndef M_PI +# define M_PI 3.14159265358979323846 +#endif + +// ----------------------------------------------------------------------- +// misc functions + +/* + * Return a 64-bit number from 4 8-bit numbers. + */ +static inline +int64_t d_cconst(const uint8_t a, const uint8_t b, const uint8_t c, const uint8_t d) noexcept +{ + return (a << 24) | (b << 16) | (c << 8) | (d << 0); +} + +/* + * Dummy function. + */ +static inline +void d_pass() noexcept {} + +// ----------------------------------------------------------------------- +// string print functions + +/* + * Print a string to stdout with newline (gray color). + * Does nothing if DEBUG is not defined. + */ +#ifndef DEBUG +# define d_debug(...) +#else +static inline +void d_debug(const char* const fmt, ...) noexcept +{ + try { + ::va_list args; + ::va_start(args, fmt); + std::fprintf(stdout, "\x1b[30;1m"); + std::vfprintf(stdout, fmt, args); + std::fprintf(stdout, "\x1b[0m\n"); + ::va_end(args); + } catch (...) {} +} +#endif + +/* + * Print a string to stdout with newline. + */ +static inline +void d_stdout(const char* const fmt, ...) noexcept +{ + try { + ::va_list args; + ::va_start(args, fmt); + std::vfprintf(stdout, fmt, args); + std::fprintf(stdout, "\n"); + ::va_end(args); + } catch (...) {} +} + +/* + * Print a string to stderr with newline. + */ +static inline +void d_stderr(const char* const fmt, ...) noexcept +{ + try { + ::va_list args; + ::va_start(args, fmt); + std::vfprintf(stderr, fmt, args); + std::fprintf(stderr, "\n"); + ::va_end(args); + } catch (...) {} +} + +/* + * Print a string to stderr with newline (red color). + */ +static inline +void d_stderr2(const char* const fmt, ...) noexcept +{ + try { + ::va_list args; + ::va_start(args, fmt); + std::fprintf(stderr, "\x1b[31m"); + std::vfprintf(stderr, fmt, args); + std::fprintf(stderr, "\x1b[0m\n"); + ::va_end(args); + } catch (...) {} +} + +/* + * Print a safe assertion error message. + */ +static inline +void d_safe_assert(const char* const assertion, const char* const file, const int line) noexcept +{ + d_stderr2("assertion failure: \"%s\" in file %s, line %i", assertion, file, line); +} + +/* + * Print a safe exception error message. + */ +static inline +void d_safe_exception(const char* const exception, const char* const file, const int line) noexcept +{ + d_stderr2("exception caught: \"%s\" in file %s, line %i", exception, file, line); +} + +// ----------------------------------------------------------------------- +// math functions + +/* + * Safely compare two floating point numbers. + * Returns true if they match. + */ +template +static inline +bool d_isEqual(const T& v1, const T& v2) +{ + return std::abs(v1-v2) < std::numeric_limits::epsilon(); +} + +/* + * Safely compare two floating point numbers. + * Returns true if they don't match. + */ +template +static inline +bool d_isNotEqual(const T& v1, const T& v2) +{ + return std::abs(v1-v2) >= std::numeric_limits::epsilon(); +} + +/* + * Safely check if a floating point number is zero. + */ +template +static inline +bool d_isZero(const T& value) +{ + return std::abs(value) < std::numeric_limits::epsilon(); +} + +/* + * Safely check if a floating point number is not zero. + */ +template +static inline +bool d_isNotZero(const T& value) +{ + return std::abs(value) >= std::numeric_limits::epsilon(); +} + +/* + * Get next power of 2. + */ +static inline +uint32_t d_nextPowerOf2(uint32_t size) noexcept +{ + DISTRHO_SAFE_ASSERT_RETURN(size > 0, 0); + + // http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 + --size; + size |= size >> 1; + size |= size >> 2; + size |= size >> 4; + size |= size >> 8; + size |= size >> 16; + return ++size; +} + +// ----------------------------------------------------------------------- + +#ifndef DONT_SET_USING_DISTRHO_NAMESPACE + // If your code uses a lot of DISTRHO classes, then this will obviously save you + // a lot of typing, but can be disabled by setting DONT_SET_USING_DISTRHO_NAMESPACE. + namespace DISTRHO_NAMESPACE {} + using namespace DISTRHO_NAMESPACE; +#endif + +// ----------------------------------------------------------------------- + +#endif // DISTRHO_UTILS_HPP_INCLUDED diff --git a/dpf/distrho/extra/Base64.hpp b/dpf/distrho/extra/Base64.hpp new file mode 100644 index 0000000..b1cce48 --- /dev/null +++ b/dpf/distrho/extra/Base64.hpp @@ -0,0 +1,127 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_BASE64_HPP_INCLUDED +#define DISTRHO_BASE64_HPP_INCLUDED + +#include "../DistrhoUtils.hpp" + +#include +#include + +// ----------------------------------------------------------------------- +// base64 stuff, based on http://www.adp-gmbh.ch/cpp/common/base64.html +// Copyright (C) 2004-2008 René Nyffenegger + +// ----------------------------------------------------------------------- +// Helpers + +#ifndef DOXYGEN +namespace DistrhoBase64Helpers { + +static const char* const kBase64Chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + +static inline +uint8_t findBase64CharIndex(const char c) +{ + static const uint8_t kBase64CharsLen(static_cast(std::strlen(kBase64Chars))); + + for (uint8_t i=0; i d_getChunkFromBase64String(const char* const base64string) +{ + DISTRHO_SAFE_ASSERT_RETURN(base64string != nullptr, std::vector()); + + uint i=0, j=0; + uint charArray3[3], charArray4[4]; + + std::vector ret; + ret.reserve(std::strlen(base64string)*3/4 + 4); + + for (std::size_t l=0, len=std::strlen(base64string); l(c); + + if (i == 4) + { + for (i=0; i<4; ++i) + charArray4[i] = DistrhoBase64Helpers::findBase64CharIndex(static_cast(charArray4[i])); + + charArray3[0] = (charArray4[0] << 2) + ((charArray4[1] & 0x30) >> 4); + charArray3[1] = ((charArray4[1] & 0xf) << 4) + ((charArray4[2] & 0x3c) >> 2); + charArray3[2] = ((charArray4[2] & 0x3) << 6) + charArray4[3]; + + for (i=0; i<3; ++i) + ret.push_back(static_cast(charArray3[i])); + + i = 0; + } + } + + if (i != 0) + { + for (j=0; j(charArray4[j])); + + for (j=i; j<4; ++j) + charArray4[j] = 0; + + charArray3[0] = (charArray4[0] << 2) + ((charArray4[1] & 0x30) >> 4); + charArray3[1] = ((charArray4[1] & 0xf) << 4) + ((charArray4[2] & 0x3c) >> 2); + charArray3[2] = ((charArray4[2] & 0x3) << 6) + charArray4[3]; + + for (j=0; i>0 && j(charArray3[j])); + } + + return ret; +} + +// ----------------------------------------------------------------------- + +#endif // DISTRHO_BASE64_HPP_INCLUDED diff --git a/dpf/distrho/extra/LeakDetector.hpp b/dpf/distrho/extra/LeakDetector.hpp new file mode 100644 index 0000000..08974e6 --- /dev/null +++ b/dpf/distrho/extra/LeakDetector.hpp @@ -0,0 +1,141 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_LEAK_DETECTOR_HPP_INCLUDED +#define DISTRHO_LEAK_DETECTOR_HPP_INCLUDED + +#include "../DistrhoUtils.hpp" + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- +// The following code was based from juce-core LeakDetector class +// Copyright (C) 2013 Raw Material Software Ltd. + +/** A good old-fashioned C macro concatenation helper. + This combines two items (which may themselves be macros) into a single string, + avoiding the pitfalls of the ## macro operator. +*/ +#define DISTRHO_JOIN_MACRO_HELPER(a, b) a ## b +#define DISTRHO_JOIN_MACRO(item1, item2) DISTRHO_JOIN_MACRO_HELPER(item1, item2) + +/** This macro lets you embed a leak-detecting object inside a class.\n + To use it, simply declare a DISTRHO_LEAK_DETECTOR(YourClassName) inside a private section + of the class declaration. E.g. + \code + class MyClass + { + public: + MyClass(); + void blahBlah(); + + private: + DISTRHO_LEAK_DETECTOR(MyClass) + }; + \endcode +*/ +#define DISTRHO_LEAK_DETECTOR(ClassName) \ + friend class DISTRHO_NAMESPACE::LeakedObjectDetector; \ + static const char* getLeakedObjectClassName() noexcept { return #ClassName; } \ + DISTRHO_NAMESPACE::LeakedObjectDetector DISTRHO_JOIN_MACRO(leakDetector_, ClassName); + +#define DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ClassName) \ + DISTRHO_DECLARE_NON_COPY_CLASS(ClassName) \ + DISTRHO_LEAK_DETECTOR(ClassName) + +//============================================================================== +/** + Embedding an instance of this class inside another class can be used as a low-overhead + way of detecting leaked instances. + + This class keeps an internal static count of the number of instances that are + active, so that when the app is shutdown and the static destructors are called, + it can check whether there are any left-over instances that may have been leaked. + + To use it, use the DISTRHO_LEAK_DETECTOR macro as a simple way to put one in your + class declaration. +*/ +template +class LeakedObjectDetector +{ +public: + //============================================================================== + LeakedObjectDetector() noexcept { ++(getCounter().numObjects); } + LeakedObjectDetector(const LeakedObjectDetector&) noexcept { ++(getCounter().numObjects); } + + ~LeakedObjectDetector() noexcept + { + if (--(getCounter().numObjects) < 0) + { + /** If you hit this, then you've managed to delete more instances of this class than you've + created.. That indicates that you're deleting some dangling pointers. + + Note that although this assertion will have been triggered during a destructor, it might + not be this particular deletion that's at fault - the incorrect one may have happened + at an earlier point in the program, and simply not been detected until now. + + Most errors like this are caused by using old-fashioned, non-RAII techniques for + your object management. Tut, tut. Always, always use ScopedPointers, OwnedArrays, + ReferenceCountedObjects, etc, and avoid the 'delete' operator at all costs! + */ + d_stderr2("*** Dangling pointer deletion! Class: '%s', Count: %i", getLeakedObjectClassName(), getCounter().numObjects); + } + } + +private: + //============================================================================== + class LeakCounter + { + public: + LeakCounter() noexcept + : numObjects(0) {} + + ~LeakCounter() noexcept + { + if (numObjects > 0) + { + /** If you hit this, then you've leaked one or more objects of the type specified by + the 'OwnerClass' template parameter - the name should have been printed by the line above. + + If you're leaking, it's probably because you're using old-fashioned, non-RAII techniques for + your object management. Tut, tut. Always, always use ScopedPointers, OwnedArrays, + ReferenceCountedObjects, etc, and avoid the 'delete' operator at all costs! + */ + d_stderr2("*** Leaked objects detected: %i instance(s) of class '%s'", numObjects, getLeakedObjectClassName()); + } + } + + // this should be an atomic... + volatile int numObjects; + }; + + static const char* getLeakedObjectClassName() noexcept + { + return OwnerClass::getLeakedObjectClassName(); + } + + static LeakCounter& getCounter() noexcept + { + static LeakCounter counter; + return counter; + } +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_LEAK_DETECTOR_HPP_INCLUDED diff --git a/dpf/distrho/extra/Mutex.hpp b/dpf/distrho/extra/Mutex.hpp new file mode 100644 index 0000000..8badcc3 --- /dev/null +++ b/dpf/distrho/extra/Mutex.hpp @@ -0,0 +1,274 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_MUTEX_HPP_INCLUDED +#define DISTRHO_MUTEX_HPP_INCLUDED + +#include "../DistrhoUtils.hpp" + +#ifdef DISTRHO_OS_WINDOWS +# include +# include +#endif + +#include + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- +// Mutex class + +class Mutex +{ +public: + /* + * Constructor. + */ + Mutex() noexcept + : fMutex() + { + pthread_mutex_init(&fMutex, nullptr); + } + + /* + * Destructor. + */ + ~Mutex() noexcept + { + pthread_mutex_destroy(&fMutex); + } + + /* + * Lock the mutex. + */ + void lock() const noexcept + { + pthread_mutex_lock(&fMutex); + } + + /* + * Try to lock the mutex. + * Returns true if successful. + */ + bool tryLock() const noexcept + { + return (pthread_mutex_trylock(&fMutex) == 0); + } + + /* + * Unlock the mutex. + */ + void unlock() const noexcept + { + pthread_mutex_unlock(&fMutex); + } + +private: + mutable pthread_mutex_t fMutex; + + DISTRHO_PREVENT_HEAP_ALLOCATION + DISTRHO_DECLARE_NON_COPY_CLASS(Mutex) +}; + +// ----------------------------------------------------------------------- +// RecursiveMutex class + +class RecursiveMutex +{ +public: + /* + * Constructor. + */ + RecursiveMutex() noexcept +#ifdef DISTRHO_OS_WINDOWS + : fSection() +#else + : fMutex() +#endif + { +#ifdef DISTRHO_OS_WINDOWS + InitializeCriticalSection(&fSection); +#else + pthread_mutexattr_t atts; + pthread_mutexattr_init(&atts); + pthread_mutexattr_settype(&atts, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&fMutex, &atts); + pthread_mutexattr_destroy(&atts); +#endif + } + + /* + * Destructor. + */ + ~RecursiveMutex() noexcept + { +#ifdef DISTRHO_OS_WINDOWS + DeleteCriticalSection(&fSection); +#else + pthread_mutex_destroy(&fMutex); +#endif + } + + /* + * Lock the mutex. + */ + void lock() const noexcept + { +#ifdef DISTRHO_OS_WINDOWS + EnterCriticalSection(&fSection); +#else + pthread_mutex_lock(&fMutex); +#endif + } + + /* + * Try to lock the mutex. + * Returns true if successful. + */ + bool tryLock() const noexcept + { +#ifdef DISTRHO_OS_WINDOWS + return (TryEnterCriticalSection(&fSection) != FALSE); +#else + return (pthread_mutex_trylock(&fMutex) == 0); +#endif + } + + /* + * Unlock the mutex. + */ + void unlock() const noexcept + { +#ifdef DISTRHO_OS_WINDOWS + LeaveCriticalSection(&fSection); +#else + pthread_mutex_unlock(&fMutex); +#endif + } + +private: +#ifdef DISTRHO_OS_WINDOWS + mutable CRITICAL_SECTION fSection; +#else + mutable pthread_mutex_t fMutex; +#endif + + DISTRHO_PREVENT_HEAP_ALLOCATION + DISTRHO_DECLARE_NON_COPY_CLASS(RecursiveMutex) +}; + +// ----------------------------------------------------------------------- +// Helper class to lock&unlock a mutex during a function scope. + +template +class ScopeLocker +{ +public: + ScopeLocker(const Mutex& mutex) noexcept + : fMutex(mutex) + { + fMutex.lock(); + } + + ~ScopeLocker() noexcept + { + fMutex.unlock(); + } + +private: + const Mutex& fMutex; + + DISTRHO_PREVENT_HEAP_ALLOCATION + DISTRHO_DECLARE_NON_COPY_CLASS(ScopeLocker) +}; + +// ----------------------------------------------------------------------- +// Helper class to try-lock&unlock a mutex during a function scope. + +template +class ScopeTryLocker +{ +public: + ScopeTryLocker(const Mutex& mutex) noexcept + : fMutex(mutex), + fLocked(mutex.tryLock()) {} + + ~ScopeTryLocker() noexcept + { + if (fLocked) + fMutex.unlock(); + } + + bool wasLocked() const noexcept + { + return fLocked; + } + + bool wasNotLocked() const noexcept + { + return !fLocked; + } + +private: + const Mutex& fMutex; + const bool fLocked; + + DISTRHO_PREVENT_HEAP_ALLOCATION + DISTRHO_DECLARE_NON_COPY_CLASS(ScopeTryLocker) +}; + +// ----------------------------------------------------------------------- +// Helper class to unlock&lock a mutex during a function scope. + +template +class ScopeUnlocker +{ +public: + ScopeUnlocker(const Mutex& mutex) noexcept + : fMutex(mutex) + { + fMutex.unlock(); + } + + ~ScopeUnlocker() noexcept + { + fMutex.lock(); + } + +private: + const Mutex& fMutex; + + DISTRHO_PREVENT_HEAP_ALLOCATION + DISTRHO_DECLARE_NON_COPY_CLASS(ScopeUnlocker) +}; + +// ----------------------------------------------------------------------- +// Define types + +typedef ScopeLocker MutexLocker; +typedef ScopeLocker RecursiveMutexLocker; + +typedef ScopeTryLocker MutexTryLocker; +typedef ScopeTryLocker RecursiveMutexTryLocker; + +typedef ScopeUnlocker MutexUnlocker; +typedef ScopeUnlocker RecursiveMutexUnlocker; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_MUTEX_HPP_INCLUDED diff --git a/dpf/distrho/extra/ScopedPointer.hpp b/dpf/distrho/extra/ScopedPointer.hpp new file mode 100644 index 0000000..12e6ba0 --- /dev/null +++ b/dpf/distrho/extra/ScopedPointer.hpp @@ -0,0 +1,230 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_SCOPED_POINTER_HPP_INCLUDED +#define DISTRHO_SCOPED_POINTER_HPP_INCLUDED + +#include "../DistrhoUtils.hpp" + +#include + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- +// The following code was based from juce-core ScopedPointer class +// Copyright (C) 2013 Raw Material Software Ltd. + +//============================================================================== +/** + This class holds a pointer which is automatically deleted when this object goes + out of scope. + + Once a pointer has been passed to a ScopedPointer, it will make sure that the pointer + gets deleted when the ScopedPointer is deleted. Using the ScopedPointer on the stack or + as member variables is a good way to use RAII to avoid accidentally leaking dynamically + created objects. + + A ScopedPointer can be used in pretty much the same way that you'd use a normal pointer + to an object. If you use the assignment operator to assign a different object to a + ScopedPointer, the old one will be automatically deleted. + + A const ScopedPointer is guaranteed not to lose ownership of its object or change the + object to which it points during its lifetime. This means that making a copy of a const + ScopedPointer is impossible, as that would involve the new copy taking ownership from the + old one. + + If you need to get a pointer out of a ScopedPointer without it being deleted, you + can use the release() method. + + Something to note is the main difference between this class and the std::auto_ptr class, + which is that ScopedPointer provides a cast-to-object operator, wheras std::auto_ptr + requires that you always call get() to retrieve the pointer. The advantages of providing + the cast is that you don't need to call get(), so can use the ScopedPointer in pretty much + exactly the same way as a raw pointer. The disadvantage is that the compiler is free to + use the cast in unexpected and sometimes dangerous ways - in particular, it becomes difficult + to return a ScopedPointer as the result of a function. To avoid this causing errors, + ScopedPointer contains an overloaded constructor that should cause a syntax error in these + circumstances, but it does mean that instead of returning a ScopedPointer from a function, + you'd need to return a raw pointer (or use a std::auto_ptr instead). +*/ +template +class ScopedPointer +{ +public: + //============================================================================== + /** Creates a ScopedPointer containing a null pointer. */ + ScopedPointer() noexcept + : object(nullptr) {} + + /** Creates a ScopedPointer that owns the specified object. */ + ScopedPointer(ObjectType* const objectToTakePossessionOf) noexcept + : object(objectToTakePossessionOf) {} + + /** Creates a ScopedPointer that takes its pointer from another ScopedPointer. + + Because a pointer can only belong to one ScopedPointer, this transfers + the pointer from the other object to this one, and the other object is reset to + be a null pointer. + */ + ScopedPointer(ScopedPointer& objectToTransferFrom) noexcept + : object(objectToTransferFrom.object) + { + objectToTransferFrom.object = nullptr; + } + + /** Destructor. + This will delete the object that this ScopedPointer currently refers to. + */ + ~ScopedPointer() + { + delete object; + } + + /** Changes this ScopedPointer to point to a new object. + + Because a pointer can only belong to one ScopedPointer, this transfers + the pointer from the other object to this one, and the other object is reset to + be a null pointer. + + If this ScopedPointer already points to an object, that object + will first be deleted. + */ + ScopedPointer& operator=(ScopedPointer& objectToTransferFrom) + { + if (this != objectToTransferFrom.getAddress()) + { + // Two ScopedPointers should never be able to refer to the same object - if + // this happens, you must have done something dodgy! + DISTRHO_SAFE_ASSERT_RETURN(object == nullptr || object != objectToTransferFrom.object, *this); + + ObjectType* const oldObject = object; + object = objectToTransferFrom.object; + objectToTransferFrom.object = nullptr; + delete oldObject; + } + + return *this; + } + + /** Changes this ScopedPointer to point to a new object. + + If this ScopedPointer already points to an object, that object + will first be deleted. + + The pointer that you pass in may be a nullptr. + */ + ScopedPointer& operator=(ObjectType* const newObjectToTakePossessionOf) + { + if (object != newObjectToTakePossessionOf) + { + ObjectType* const oldObject = object; + object = newObjectToTakePossessionOf; + delete oldObject; + } + + return *this; + } + + //============================================================================== + /** Returns the object that this ScopedPointer refers to. */ + operator ObjectType*() const noexcept { return object; } + + /** Returns the object that this ScopedPointer refers to. */ + ObjectType* get() const noexcept { return object; } + + /** Returns the object that this ScopedPointer refers to. */ + ObjectType& operator*() const noexcept { return *object; } + + /** Lets you access methods and properties of the object that this ScopedPointer refers to. */ + ObjectType* operator->() const noexcept { return object; } + + //============================================================================== + /** Removes the current object from this ScopedPointer without deleting it. + This will return the current object, and set the ScopedPointer to a null pointer. + */ + ObjectType* release() noexcept { ObjectType* const o = object; object = nullptr; return o; } + + //============================================================================== + /** Swaps this object with that of another ScopedPointer. + The two objects simply exchange their pointers. + */ + void swapWith(ScopedPointer& other) noexcept + { + // Two ScopedPointers should never be able to refer to the same object - if + // this happens, you must have done something dodgy! + DISTRHO_SAFE_ASSERT_RETURN(object != other.object || this == other.getAddress() || object == nullptr,); + + std::swap(object, other.object); + } + +private: + //============================================================================== + ObjectType* object; + + // (Required as an alternative to the overloaded & operator). + const ScopedPointer* getAddress() const noexcept { return this; } + +#ifndef _MSC_VER // (MSVC can't deal with multiple copy constructors) + /* The copy constructors are private to stop people accidentally copying a const ScopedPointer + (the compiler would let you do so by implicitly casting the source to its raw object pointer). + + A side effect of this is that in a compiler that doesn't support C++11, you may hit an + error when you write something like this: + + ScopedPointer m = new MyClass(); // Compile error: copy constructor is private. + + Even though the compiler would normally ignore the assignment here, it can't do so when the + copy constructor is private. It's very easy to fix though - just write it like this: + + ScopedPointer m (new MyClass()); // Compiles OK + + It's probably best to use the latter form when writing your object declarations anyway, as + this is a better representation of the code that you actually want the compiler to produce. + */ +# ifdef DISTRHO_PROPER_CPP11_SUPPORT + ScopedPointer(const ScopedPointer&) = delete; + ScopedPointer& operator=(const ScopedPointer&) = delete; +# else + ScopedPointer(const ScopedPointer&); + ScopedPointer& operator=(const ScopedPointer&); +# endif +#endif +}; + +//============================================================================== +/** Compares a ScopedPointer with another pointer. + This can be handy for checking whether this is a null pointer. +*/ +template +bool operator==(const ScopedPointer& pointer1, ObjectType* const pointer2) noexcept +{ + return static_cast(pointer1) == pointer2; +} + +/** Compares a ScopedPointer with another pointer. + This can be handy for checking whether this is a null pointer. +*/ +template +bool operator!=(const ScopedPointer& pointer1, ObjectType* const pointer2) noexcept +{ + return static_cast(pointer1) != pointer2; +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_SCOPED_POINTER_HPP_INCLUDED diff --git a/dpf/distrho/extra/Sleep.hpp b/dpf/distrho/extra/Sleep.hpp new file mode 100644 index 0000000..4953a12 --- /dev/null +++ b/dpf/distrho/extra/Sleep.hpp @@ -0,0 +1,68 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_SLEEP_HPP_INCLUDED +#define DISTRHO_SLEEP_HPP_INCLUDED + +#include "../DistrhoUtils.hpp" + +#ifdef DISTRHO_OS_WINDOWS +# include +# include +#else +# include +#endif + +// ----------------------------------------------------------------------- +// d_*sleep + +/* + * Sleep for 'secs' seconds. + */ +static inline +void d_sleep(const uint secs) noexcept +{ + DISTRHO_SAFE_ASSERT_RETURN(secs > 0,); + + try { +#ifdef DISTRHO_OS_WINDOWS + ::Sleep(secs * 1000); +#else + ::sleep(secs); +#endif + } DISTRHO_SAFE_EXCEPTION("d_sleep"); +} + +/* + * Sleep for 'msecs' milliseconds. + */ +static inline +void d_msleep(const uint msecs) noexcept +{ + DISTRHO_SAFE_ASSERT_RETURN(msecs > 0,); + + try { +#ifdef DISTRHO_OS_WINDOWS + ::Sleep(msecs); +#else + ::usleep(msecs * 1000); +#endif + } DISTRHO_SAFE_EXCEPTION("d_msleep"); +} + +// ----------------------------------------------------------------------- + +#endif // DISTRHO_SLEEP_HPP_INCLUDED diff --git a/dpf/distrho/extra/String.hpp b/dpf/distrho/extra/String.hpp new file mode 100644 index 0000000..6cf96d4 --- /dev/null +++ b/dpf/distrho/extra/String.hpp @@ -0,0 +1,840 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_STRING_HPP_INCLUDED +#define DISTRHO_STRING_HPP_INCLUDED + +#include "../DistrhoUtils.hpp" + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- +// String class + +class String +{ +public: + // ------------------------------------------------------------------- + // constructors (no explicit conversions allowed) + + /* + * Empty string. + */ + explicit String() noexcept + : fBuffer(_null()), + fBufferLen(0) {} + + /* + * Simple character. + */ + explicit String(const char c) noexcept + : fBuffer(_null()), + fBufferLen(0) + { + char ch[2]; + ch[0] = c; + ch[1] = '\0'; + + _dup(ch); + } + + /* + * Simple char string. + */ + explicit String(char* const strBuf) noexcept + : fBuffer(_null()), + fBufferLen(0) + { + _dup(strBuf); + } + + /* + * Simple const char string. + */ + explicit String(const char* const strBuf) noexcept + : fBuffer(_null()), + fBufferLen(0) + { + _dup(strBuf); + } + + /* + * Integer. + */ + explicit String(const int value) noexcept + : fBuffer(_null()), + fBufferLen(0) + { + char strBuf[0xff+1]; + std::snprintf(strBuf, 0xff, "%d", value); + strBuf[0xff] = '\0'; + + _dup(strBuf); + } + + /* + * Unsigned integer, possibly in hexadecimal. + */ + explicit String(const unsigned int value, const bool hexadecimal = false) noexcept + : fBuffer(_null()), + fBufferLen(0) + { + char strBuf[0xff+1]; + std::snprintf(strBuf, 0xff, hexadecimal ? "0x%x" : "%u", value); + strBuf[0xff] = '\0'; + + _dup(strBuf); + } + + /* + * Long integer. + */ + explicit String(const long value) noexcept + : fBuffer(_null()), + fBufferLen(0) + { + char strBuf[0xff+1]; + std::snprintf(strBuf, 0xff, "%ld", value); + strBuf[0xff] = '\0'; + + _dup(strBuf); + } + + /* + * Long unsigned integer, possibly hexadecimal. + */ + explicit String(const unsigned long value, const bool hexadecimal = false) noexcept + : fBuffer(_null()), + fBufferLen(0) + { + char strBuf[0xff+1]; + std::snprintf(strBuf, 0xff, hexadecimal ? "0x%lx" : "%lu", value); + strBuf[0xff] = '\0'; + + _dup(strBuf); + } + + /* + * Long long integer. + */ + explicit String(const long long value) noexcept + : fBuffer(_null()), + fBufferLen(0) + { + char strBuf[0xff+1]; + std::snprintf(strBuf, 0xff, "%lld", value); + strBuf[0xff] = '\0'; + + _dup(strBuf); + } + + /* + * Long long unsigned integer, possibly hexadecimal. + */ + explicit String(const unsigned long long value, const bool hexadecimal = false) noexcept + : fBuffer(_null()), + fBufferLen(0) + { + char strBuf[0xff+1]; + std::snprintf(strBuf, 0xff, hexadecimal ? "0x%llx" : "%llu", value); + strBuf[0xff] = '\0'; + + _dup(strBuf); + } + + /* + * Single-precision floating point number. + */ + explicit String(const float value) noexcept + : fBuffer(_null()), + fBufferLen(0) + { + char strBuf[0xff+1]; + std::snprintf(strBuf, 0xff, "%f", value); + strBuf[0xff] = '\0'; + + _dup(strBuf); + } + + /* + * Double-precision floating point number. + */ + explicit String(const double value) noexcept + : fBuffer(_null()), + fBufferLen(0) + { + char strBuf[0xff+1]; + std::snprintf(strBuf, 0xff, "%g", value); + strBuf[0xff] = '\0'; + + _dup(strBuf); + } + + // ------------------------------------------------------------------- + // non-explicit constructor + + /* + * Create string from another string. + */ + String(const String& str) noexcept + : fBuffer(_null()), + fBufferLen(0) + { + _dup(str.fBuffer); + } + + // ------------------------------------------------------------------- + // destructor + + /* + * Destructor. + */ + ~String() noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fBuffer != nullptr,); + + if (fBuffer == _null()) + return; + + std::free(fBuffer); + + fBuffer = nullptr; + fBufferLen = 0; + } + + // ------------------------------------------------------------------- + // public methods + + /* + * Get length of the string. + */ + std::size_t length() const noexcept + { + return fBufferLen; + } + + /* + * Check if the string is empty. + */ + bool isEmpty() const noexcept + { + return (fBufferLen == 0); + } + + /* + * Check if the string is not empty. + */ + bool isNotEmpty() const noexcept + { + return (fBufferLen != 0); + } + + /* + * Check if the string contains another string, optionally ignoring case. + */ + bool contains(const char* const strBuf, const bool ignoreCase = false) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(strBuf != nullptr, false); + + if (ignoreCase) + { +#ifdef __USE_GNU + return (strcasestr(fBuffer, strBuf) != nullptr); +#else + String tmp1(fBuffer), tmp2(strBuf); + + // memory allocation failed or empty string(s) + if (tmp1.fBuffer == _null() || tmp2.fBuffer == _null()) + return false; + + tmp1.toLower(); + tmp2.toLower(); + return (std::strstr(tmp1, tmp2) != nullptr); +#endif + } + + return (std::strstr(fBuffer, strBuf) != nullptr); + } + + /* + * Check if character at 'pos' is a digit. + */ + bool isDigit(const std::size_t pos) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(pos < fBufferLen, false); + + return (fBuffer[pos] >= '0' && fBuffer[pos] <= '9'); + } + + /* + * Check if the string starts with the character 'c'. + */ + bool startsWith(const char c) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(c != '\0', false); + + return (fBufferLen > 0 && fBuffer[0] == c); + } + + /* + * Check if the string starts with the string 'prefix'. + */ + bool startsWith(const char* const prefix) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(prefix != nullptr, false); + + const std::size_t prefixLen(std::strlen(prefix)); + + if (fBufferLen < prefixLen) + return false; + + return (std::strncmp(fBuffer, prefix, prefixLen) == 0); + } + + /* + * Check if the string ends with the character 'c'. + */ + bool endsWith(const char c) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(c != '\0', false); + + return (fBufferLen > 0 && fBuffer[fBufferLen-1] == c); + } + + /* + * Check if the string ends with the string 'suffix'. + */ + bool endsWith(const char* const suffix) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(suffix != nullptr, false); + + const std::size_t suffixLen(std::strlen(suffix)); + + if (fBufferLen < suffixLen) + return false; + + return (std::strncmp(fBuffer + (fBufferLen-suffixLen), suffix, suffixLen) == 0); + } + + /* + * Find the first occurrence of character 'c' in the string. + * Returns "length()" if the character is not found. + */ + std::size_t find(const char c, bool* const found = nullptr) const noexcept + { + if (fBufferLen == 0 || c == '\0') + { + if (found != nullptr) + *found = false; + return fBufferLen; + } + + for (std::size_t i=0; i < fBufferLen; ++i) + { + if (fBuffer[i] == c) + { + if (found != nullptr) + *found = true; + return i; + } + } + + if (found != nullptr) + *found = false; + return fBufferLen; + } + + /* + * Find the first occurrence of string 'strBuf' in the string. + * Returns "length()" if the string is not found. + */ + std::size_t find(const char* const strBuf, bool* const found = nullptr) const noexcept + { + if (fBufferLen == 0 || strBuf == nullptr || strBuf[0] == '\0') + { + if (found != nullptr) + *found = false; + return fBufferLen; + } + + if (char* const subStrBuf = std::strstr(fBuffer, strBuf)) + { + const ssize_t ret(subStrBuf - fBuffer); + + if (ret < 0) + { + // should never happen! + d_safe_assert("ret >= 0", __FILE__, __LINE__); + + if (found != nullptr) + *found = false; + return fBufferLen; + } + + if (found != nullptr) + *found = true; + return static_cast(ret); + } + + if (found != nullptr) + *found = false; + return fBufferLen; + } + + /* + * Find the last occurrence of character 'c' in the string. + * Returns "length()" if the character is not found. + */ + std::size_t rfind(const char c, bool* const found = nullptr) const noexcept + { + if (fBufferLen == 0 || c == '\0') + { + if (found != nullptr) + *found = false; + return fBufferLen; + } + + for (std::size_t i=fBufferLen; i > 0; --i) + { + if (fBuffer[i-1] == c) + { + if (found != nullptr) + *found = true; + return i-1; + } + } + + if (found != nullptr) + *found = false; + return fBufferLen; + } + + /* + * Find the last occurrence of string 'strBuf' in the string. + * Returns "length()" if the string is not found. + */ + std::size_t rfind(const char* const strBuf, bool* const found = nullptr) const noexcept + { + if (found != nullptr) + *found = false; + + if (fBufferLen == 0 || strBuf == nullptr || strBuf[0] == '\0') + return fBufferLen; + + const std::size_t strBufLen(std::strlen(strBuf)); + + std::size_t ret = fBufferLen; + const char* tmpBuf = fBuffer; + + for (std::size_t i=0; i < fBufferLen; ++i) + { + if (std::strstr(tmpBuf+1, strBuf) == nullptr && std::strncmp(tmpBuf, strBuf, strBufLen) == 0) + { + if (found != nullptr) + *found = true; + break; + } + + --ret; + ++tmpBuf; + } + + return fBufferLen-ret; + } + + /* + * Clear the string. + */ + void clear() noexcept + { + truncate(0); + } + + /* + * Replace all occurrences of character 'before' with character 'after'. + */ + String& replace(const char before, const char after) noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(before != '\0' && after != '\0', *this); + + for (std::size_t i=0; i < fBufferLen; ++i) + { + if (fBuffer[i] == before) + fBuffer[i] = after; + } + + return *this; + } + + /* + * Truncate the string to size 'n'. + */ + String& truncate(const std::size_t n) noexcept + { + if (n >= fBufferLen) + return *this; + + for (std::size_t i=n; i < fBufferLen; ++i) + fBuffer[i] = '\0'; + + fBufferLen = n; + + return *this; + } + + /* + * Convert all non-basic characters to '_'. + */ + String& toBasic() noexcept + { + for (std::size_t i=0; i < fBufferLen; ++i) + { + if (fBuffer[i] >= '0' && fBuffer[i] <= '9') + continue; + if (fBuffer[i] >= 'A' && fBuffer[i] <= 'Z') + continue; + if (fBuffer[i] >= 'a' && fBuffer[i] <= 'z') + continue; + if (fBuffer[i] == '_') + continue; + + fBuffer[i] = '_'; + } + + return *this; + } + + /* + * Convert to all ascii characters to lowercase. + */ + String& toLower() noexcept + { + static const char kCharDiff('a' - 'A'); + + for (std::size_t i=0; i < fBufferLen; ++i) + { + if (fBuffer[i] >= 'A' && fBuffer[i] <= 'Z') + fBuffer[i] = static_cast(fBuffer[i] + kCharDiff); + } + + return *this; + } + + /* + * Convert to all ascii characters to uppercase. + */ + String& toUpper() noexcept + { + static const char kCharDiff('a' - 'A'); + + for (std::size_t i=0; i < fBufferLen; ++i) + { + if (fBuffer[i] >= 'a' && fBuffer[i] <= 'z') + fBuffer[i] = static_cast(fBuffer[i] - kCharDiff); + } + + return *this; + } + + /* + * Direct access to the string buffer (read-only). + */ + const char* buffer() const noexcept + { + return fBuffer; + } + + // ------------------------------------------------------------------- + // base64 stuff, based on http://www.adp-gmbh.ch/cpp/common/base64.html + // Copyright (C) 2004-2008 René Nyffenegger + + static String asBase64(const void* const data, const std::size_t dataSize) + { + static const char* const kBase64Chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + + const std::size_t kTmpBufSize = d_nextPowerOf2(dataSize/3); + + const uchar* bytesToEncode((const uchar*)data); + + uint i=0, j=0; + uint charArray3[3], charArray4[4]; + + char strBuf[kTmpBufSize+1]; + strBuf[kTmpBufSize] = '\0'; + std::size_t strBufIndex = 0; + + String ret; + + for (std::size_t s=0; s> 2; + charArray4[1] = ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4); + charArray4[2] = ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6); + charArray4[3] = charArray3[2] & 0x3f; + + for (i=0; i<4; ++i) + strBuf[strBufIndex++] = kBase64Chars[charArray4[i]]; + + if (strBufIndex >= kTmpBufSize-7) + { + strBuf[strBufIndex] = '\0'; + strBufIndex = 0; + ret += strBuf; + } + + i = 0; + } + } + + if (i != 0) + { + for (j=i; j<3; ++j) + charArray3[j] = '\0'; + + charArray4[0] = (charArray3[0] & 0xfc) >> 2; + charArray4[1] = ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4); + charArray4[2] = ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6); + charArray4[3] = charArray3[2] & 0x3f; + + for (j=0; j<4 && i<3 && j 0) ? size : std::strlen(strBuf); + fBuffer = (char*)std::malloc(fBufferLen+1); + + if (fBuffer == nullptr) + { + fBuffer = _null(); + fBufferLen = 0; + return; + } + + std::strcpy(fBuffer, strBuf); + + fBuffer[fBufferLen] = '\0'; + } + else + { + DISTRHO_SAFE_ASSERT(size == 0); + + // don't recreate null string + if (fBuffer == _null()) + return; + + DISTRHO_SAFE_ASSERT(fBuffer != nullptr); + std::free(fBuffer); + + fBuffer = _null(); + fBufferLen = 0; + } + } + + DISTRHO_PREVENT_HEAP_ALLOCATION +}; + +// ----------------------------------------------------------------------- + +static inline +String operator+(const String& strBefore, const char* const strBufAfter) noexcept +{ + const char* const strBufBefore = strBefore.buffer(); + const std::size_t newBufSize = strBefore.length() + ((strBufAfter != nullptr) ? std::strlen(strBufAfter) : 0) + 1; + char newBuf[newBufSize]; + + std::strcpy(newBuf, strBufBefore); + std::strcat(newBuf, strBufAfter); + + return String(newBuf); +} + +static inline +String operator+(const char* const strBufBefore, const String& strAfter) noexcept +{ + const char* const strBufAfter = strAfter.buffer(); + const std::size_t newBufSize = ((strBufBefore != nullptr) ? std::strlen(strBufBefore) : 0) + strAfter.length() + 1; + char newBuf[newBufSize]; + + std::strcpy(newBuf, strBufBefore); + std::strcat(newBuf, strBufAfter); + + return String(newBuf); +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_STRING_HPP_INCLUDED diff --git a/dpf/distrho/extra/Thread.hpp b/dpf/distrho/extra/Thread.hpp new file mode 100644 index 0000000..efb2862 --- /dev/null +++ b/dpf/distrho/extra/Thread.hpp @@ -0,0 +1,290 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_THREAD_HPP_INCLUDED +#define DISTRHO_THREAD_HPP_INCLUDED + +#include "Mutex.hpp" +#include "Sleep.hpp" +#include "String.hpp" + +#ifdef DISTRHO_OS_LINUX +# include +#endif + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- +// Thread class + +class Thread +{ +protected: + /* + * Constructor. + */ + Thread(const char* const threadName = nullptr) noexcept + : fLock(), + fName(threadName), +#ifdef PTW32_DLLPORT + fHandle({nullptr, 0}), +#else + fHandle(0), +#endif + fShouldExit(false) {} + + /* + * Destructor. + */ + virtual ~Thread() /*noexcept*/ + { + DISTRHO_SAFE_ASSERT(! isThreadRunning()); + + stopThread(-1); + } + + /* + * Virtual function to be implemented by the subclass. + */ + virtual void run() = 0; + + // ------------------------------------------------------------------- + +public: + /* + * Check if the thread is running. + */ + bool isThreadRunning() const noexcept + { +#ifdef PTW32_DLLPORT + return (fHandle.p != nullptr); +#else + return (fHandle != 0); +#endif + } + + /* + * Check if the thread should exit. + */ + bool shouldThreadExit() const noexcept + { + return fShouldExit; + } + + /* + * Start the thread. + */ + bool startThread() noexcept + { + // check if already running + DISTRHO_SAFE_ASSERT_RETURN(! isThreadRunning(), true); + + const MutexLocker cml(fLock); + + fShouldExit = false; + + pthread_t handle; + + if (pthread_create(&handle, nullptr, _entryPoint, this) == 0) + { +#ifdef PTW32_DLLPORT + DISTRHO_SAFE_ASSERT_RETURN(handle.p != nullptr, false); +#else + DISTRHO_SAFE_ASSERT_RETURN(handle != 0, false); +#endif + pthread_detach(handle); + _copyFrom(handle); + + // wait for thread to start + fLock.lock(); + + return true; + } + + return false; + } + + /* + * Stop the thread. + * In the 'timeOutMilliseconds': + * = 0 -> no wait + * > 0 -> wait timeout value + * < 0 -> wait forever + */ + bool stopThread(const int timeOutMilliseconds) noexcept + { + const MutexLocker cml(fLock); + + if (isThreadRunning()) + { + signalThreadShouldExit(); + + if (timeOutMilliseconds != 0) + { + // Wait for the thread to stop + int timeOutCheck = (timeOutMilliseconds == 1 || timeOutMilliseconds == -1) ? timeOutMilliseconds : timeOutMilliseconds/2; + + for (; isThreadRunning();) + { + d_msleep(2); + + if (timeOutCheck < 0) + continue; + + if (timeOutCheck > 0) + timeOutCheck -= 1; + else + break; + } + } + + if (isThreadRunning()) + { + // should never happen! + d_stderr2("assertion failure: \"! isThreadRunning()\" in file %s, line %i", __FILE__, __LINE__); + + // copy thread id so we can clear our one + pthread_t threadId; + _copyTo(threadId); + _init(); + + try { + pthread_cancel(threadId); + } DISTRHO_SAFE_EXCEPTION("pthread_cancel"); + + return false; + } + } + + return true; + } + + /* + * Tell the thread to stop as soon as possible. + */ + void signalThreadShouldExit() noexcept + { + fShouldExit = true; + } + + // ------------------------------------------------------------------- + + /* + * Returns the name of the thread. + * This is the name that gets set in the constructor. + */ + const String& getThreadName() const noexcept + { + return fName; + } + + /* + * Changes the name of the caller thread. + */ + static void setCurrentThreadName(const char* const name) noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0',); + +#ifdef DISTRHO_OS_LINUX + prctl(PR_SET_NAME, name, 0, 0, 0); +#endif +#if defined(__GLIBC__) && (__GLIBC__ * 1000 + __GLIBC_MINOR__) >= 2012 + pthread_setname_np(pthread_self(), name); +#endif + } + + // ------------------------------------------------------------------- + +private: + Mutex fLock; // Thread lock + const String fName; // Thread name + volatile pthread_t fHandle; // Handle for this thread + volatile bool fShouldExit; // true if thread should exit + + /* + * Init pthread type. + */ + void _init() noexcept + { +#ifdef PTW32_DLLPORT + fHandle.p = nullptr; + fHandle.x = 0; +#else + fHandle = 0; +#endif + } + + /* + * Copy our pthread type from another var. + */ + void _copyFrom(const pthread_t& handle) noexcept + { +#ifdef PTW32_DLLPORT + fHandle.p = handle.p; + fHandle.x = handle.x; +#else + fHandle = handle; +#endif + } + + /* + * Copy our pthread type to another var. + */ + void _copyTo(volatile pthread_t& handle) const noexcept + { +#ifdef PTW32_DLLPORT + handle.p = fHandle.p; + handle.x = fHandle.x; +#else + handle = fHandle; +#endif + } + + /* + * Thread entry point. + */ + void _runEntryPoint() noexcept + { + // report ready + fLock.unlock(); + + setCurrentThreadName(fName); + + try { + run(); + } catch(...) {} + + // done + _init(); + } + + /* + * Thread entry point. + */ + static void* _entryPoint(void* userData) noexcept + { + static_cast(userData)->_runEntryPoint(); + return nullptr; + } + + DISTRHO_DECLARE_NON_COPY_CLASS(Thread) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_THREAD_HPP_INCLUDED diff --git a/dpf/distrho/src/DistrhoDefines.h b/dpf/distrho/src/DistrhoDefines.h new file mode 100644 index 0000000..83d4256 --- /dev/null +++ b/dpf/distrho/src/DistrhoDefines.h @@ -0,0 +1,134 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_DEFINES_H_INCLUDED +#define DISTRHO_DEFINES_H_INCLUDED + +/* Compatibility with non-clang compilers */ +#ifndef __has_feature +# define __has_feature(x) 0 +#endif +#ifndef __has_extension +# define __has_extension __has_feature +#endif + +/* Check OS */ +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) +# define DISTRHO_PLUGIN_EXPORT extern "C" __declspec (dllexport) +# define DISTRHO_OS_WINDOWS 1 +# define DISTRHO_DLL_EXTENSION "dll" +#else +# define DISTRHO_PLUGIN_EXPORT extern "C" __attribute__ ((visibility("default"))) +# if defined(__APPLE__) +# define DISTRHO_OS_MAC 1 +# define DISTRHO_DLL_EXTENSION "dylib" +# elif defined(__HAIKU__) +# define DISTRHO_OS_HAIKU 1 +# elif defined(__linux__) +# define DISTRHO_OS_LINUX 1 +# endif +#endif + +#ifndef DISTRHO_DLL_EXTENSION +# define DISTRHO_DLL_EXTENSION "so" +#endif + +/* Check for C++11 support */ +#if defined(HAVE_CPP11_SUPPORT) +# define DISTRHO_PROPER_CPP11_SUPPORT +#elif __cplusplus >= 201103L || (defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 405) || __has_extension(cxx_noexcept) +# define DISTRHO_PROPER_CPP11_SUPPORT +# if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 407 && ! defined(__clang__)) || (defined(__clang__) && ! __has_extension(cxx_override_control)) +# define override // gcc4.7+ only +# define final // gcc4.7+ only +# endif +#endif + +#ifndef DISTRHO_PROPER_CPP11_SUPPORT +# define noexcept throw() +# define override +# define final +# define nullptr NULL +#endif + +/* Define DISTRHO_SAFE_ASSERT* */ +#define DISTRHO_SAFE_ASSERT(cond) if (! (cond)) d_safe_assert(#cond, __FILE__, __LINE__); +#define DISTRHO_SAFE_ASSERT_BREAK(cond) if (! (cond)) { d_safe_assert(#cond, __FILE__, __LINE__); break; } +#define DISTRHO_SAFE_ASSERT_CONTINUE(cond) if (! (cond)) { d_safe_assert(#cond, __FILE__, __LINE__); continue; } +#define DISTRHO_SAFE_ASSERT_RETURN(cond, ret) if (! (cond)) { d_safe_assert(#cond, __FILE__, __LINE__); return ret; } + +/* Define DISTRHO_SAFE_EXCEPTION */ +#define DISTRHO_SAFE_EXCEPTION(msg) catch(...) { d_safe_exception(msg, __FILE__, __LINE__); } +#define DISTRHO_SAFE_EXCEPTION_BREAK(msg) catch(...) { d_safe_exception(msg, __FILE__, __LINE__); break; } +#define DISTRHO_SAFE_EXCEPTION_CONTINUE(msg) catch(...) { d_safe_exception(msg, __FILE__, __LINE__); continue; } +#define DISTRHO_SAFE_EXCEPTION_RETURN(msg, ret) catch(...) { d_safe_exception(msg, __FILE__, __LINE__); return ret; } + +/* Define DISTRHO_DECLARE_NON_COPY_CLASS */ +#ifdef DISTRHO_PROPER_CPP11_SUPPORT +# define DISTRHO_DECLARE_NON_COPY_CLASS(ClassName) \ +private: \ + ClassName(ClassName&) = delete; \ + ClassName(const ClassName&) = delete; \ + ClassName& operator=(ClassName&) = delete ; \ + ClassName& operator=(const ClassName&) = delete; +#else +# define DISTRHO_DECLARE_NON_COPY_CLASS(ClassName) \ +private: \ + ClassName(ClassName&); \ + ClassName(const ClassName&); \ + ClassName& operator=(ClassName&); \ + ClassName& operator=(const ClassName&); +#endif + +/* Define DISTRHO_DECLARE_NON_COPY_STRUCT */ +#ifdef DISTRHO_PROPER_CPP11_SUPPORT +# define DISTRHO_DECLARE_NON_COPY_STRUCT(StructName) \ + StructName(StructName&) = delete; \ + StructName(const StructName&) = delete; \ + StructName& operator=(StructName&) = delete; \ + StructName& operator=(const StructName&) = delete; +#else +# define DISTRHO_DECLARE_NON_COPY_STRUCT(StructName) +#endif + +/* Define DISTRHO_PREVENT_HEAP_ALLOCATION */ +#ifdef DISTRHO_PROPER_CPP11_SUPPORT +# define DISTRHO_PREVENT_HEAP_ALLOCATION \ +private: \ + static void* operator new(size_t) = delete; \ + static void operator delete(void*) = delete; +#else +# define DISTRHO_PREVENT_HEAP_ALLOCATION \ +private: \ + static void* operator new(size_t); \ + static void operator delete(void*); +#endif + +/* Define namespace */ +#ifndef DISTRHO_NAMESPACE +# define DISTRHO_NAMESPACE DISTRHO +#endif +#define START_NAMESPACE_DISTRHO namespace DISTRHO_NAMESPACE { +#define END_NAMESPACE_DISTRHO } +#define USE_NAMESPACE_DISTRHO using namespace DISTRHO_NAMESPACE; + +/* Useful typedefs */ +typedef unsigned char uchar; +typedef unsigned short int ushort; +typedef unsigned int uint; +typedef unsigned long int ulong; + +#endif // DISTRHO_DEFINES_H_INCLUDED diff --git a/dpf/distrho/src/DistrhoPlugin.cpp b/dpf/distrho/src/DistrhoPlugin.cpp new file mode 100644 index 0000000..aed9784 --- /dev/null +++ b/dpf/distrho/src/DistrhoPlugin.cpp @@ -0,0 +1,141 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "DistrhoPluginInternal.hpp" + +START_NAMESPACE_DISTRHO + +/* ------------------------------------------------------------------------------------------------------------ + * Static data, see DistrhoPluginInternal.hpp */ + +uint32_t d_lastBufferSize = 0; +double d_lastSampleRate = 0.0; + +/* ------------------------------------------------------------------------------------------------------------ + * Static fallback data, see DistrhoPluginInternal.hpp */ + +const String PluginExporter::sFallbackString; +const AudioPort PluginExporter::sFallbackAudioPort; +const ParameterRanges PluginExporter::sFallbackRanges; + +/* ------------------------------------------------------------------------------------------------------------ + * Plugin */ + +Plugin::Plugin(uint32_t parameterCount, uint32_t programCount, uint32_t stateCount) + : pData(new PrivateData()) +{ +#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + pData->audioPorts = new AudioPort[DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS]; +#endif + + if (parameterCount > 0) + { + pData->parameterCount = parameterCount; + pData->parameters = new Parameter[parameterCount]; + } + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + if (programCount > 0) + { + pData->programCount = programCount; + pData->programNames = new String[programCount]; + } +#else + DISTRHO_SAFE_ASSERT(programCount == 0); +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + if (stateCount > 0) + { + pData->stateCount = stateCount; + pData->stateKeys = new String[stateCount]; + pData->stateDefValues = new String[stateCount]; + } +#else + DISTRHO_SAFE_ASSERT(stateCount == 0); +#endif +} + +Plugin::~Plugin() +{ + delete pData; +} + +/* ------------------------------------------------------------------------------------------------------------ + * Host state */ + +uint32_t Plugin::getBufferSize() const noexcept +{ + return pData->bufferSize; +} + +double Plugin::getSampleRate() const noexcept +{ + return pData->sampleRate; +} + +#if DISTRHO_PLUGIN_WANT_TIMEPOS +const TimePosition& Plugin::getTimePosition() const noexcept +{ + return pData->timePosition; +} +#endif + +#if DISTRHO_PLUGIN_WANT_LATENCY +void Plugin::setLatency(uint32_t frames) noexcept +{ + pData->latency = frames; +} +#endif + +#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT +bool Plugin::writeMidiEvent(const MidiEvent& /*midiEvent*/) noexcept +{ + // TODO + return false; +} +#endif + +/* ------------------------------------------------------------------------------------------------------------ + * Init */ + +void Plugin::initAudioPort(bool input, uint32_t index, AudioPort& port) +{ + if (port.hints & kAudioPortIsCV) + { + port.name = input ? "CV Input " : "CV Output "; + port.name += String(index+1); + port.symbol = input ? "cv_in_" : "cv_out_"; + port.symbol += String(index+1); + } + else + { + port.name = input ? "Audio Input " : "Audio Output "; + port.name += String(index+1); + port.symbol = input ? "audio_in_" : "audio_out_"; + port.symbol += String(index+1); + } +} + +/* ------------------------------------------------------------------------------------------------------------ + * Callbacks (optional) */ + +void Plugin::bufferSizeChanged(uint32_t) {} +void Plugin::sampleRateChanged(double) {} + +// ----------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO diff --git a/dpf/distrho/src/DistrhoPluginCarla.cpp b/dpf/distrho/src/DistrhoPluginCarla.cpp new file mode 100644 index 0000000..e16436b --- /dev/null +++ b/dpf/distrho/src/DistrhoPluginCarla.cpp @@ -0,0 +1,480 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * For a full copy of the license see the LGPL.txt file + */ + +#include "DistrhoPluginInternal.hpp" + +#if DISTRHO_PLUGIN_HAS_UI +# include "DistrhoUIInternal.hpp" +#endif + +#include "CarlaNative.hpp" + +// ----------------------------------------------------------------------- + +START_NAMESPACE_DISTRHO + +#if DISTRHO_PLUGIN_HAS_UI +// ----------------------------------------------------------------------- +// Carla UI + +#if ! DISTRHO_PLUGIN_WANT_STATE +static const setStateFunc setStateCallback = nullptr; +#endif +#if ! DISTRHO_PLUGIN_IS_SYNTH +static const sendNoteFunc sendNoteCallback = nullptr; +#endif + +class UICarla +{ +public: + UICarla(const NativeHostDescriptor* const host, PluginExporter* const plugin) + : fHost(host), + fPlugin(plugin), + fUI(this, 0, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, plugin->getInstancePointer()) + { + fUI.setWindowTitle(host->uiName); + + if (host->uiParentId != 0) + fUI.setWindowTransientWinId(host->uiParentId); + } + + ~UICarla() + { + fUI.quit(); + } + + // --------------------------------------------- + + void carla_show(const bool yesNo) + { + fUI.setWindowVisible(yesNo); + } + + bool carla_idle() + { + return fUI.idle(); + } + + void carla_setParameterValue(const uint32_t index, const float value) + { + fUI.parameterChanged(index, value); + } + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + void carla_setMidiProgram(const uint32_t realProgram) + { + fUI.programLoaded(realProgram); + } +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + void carla_setCustomData(const char* const key, const char* const value) + { + fUI.stateChanged(key, value); + } +#endif + + void carla_setUiTitle(const char* const uiTitle) + { + fUI.setWindowTitle(uiTitle); + } + + // --------------------------------------------- + +protected: + void handleEditParameter(const uint32_t, const bool) + { + // TODO + } + + void handleSetParameterValue(const uint32_t rindex, const float value) + { + fHost->ui_parameter_changed(fHost->handle, rindex, value); + } + + void handleSetState(const char* const key, const char* const value) + { + fHost->ui_custom_data_changed(fHost->handle, key, value); + } + + void handleSendNote(const uint8_t, const uint8_t, const uint8_t) + { + // TODO + } + + void handleSetSize(const uint width, const uint height) + { + fUI.setWindowSize(width, height); + } + + // --------------------------------------------- + +private: + // Plugin stuff + const NativeHostDescriptor* const fHost; + PluginExporter* const fPlugin; + + // UI + UIExporter fUI; + + // --------------------------------------------- + // Callbacks + + #define handlePtr ((UICarla*)ptr) + + static void editParameterCallback(void* ptr, uint32_t index, bool started) + { + handlePtr->handleEditParameter(index, started); + } + + static void setParameterCallback(void* ptr, uint32_t rindex, float value) + { + handlePtr->handleSetParameterValue(rindex, value); + } + +#if DISTRHO_PLUGIN_WANT_STATE + static void setStateCallback(void* ptr, const char* key, const char* value) + { + handlePtr->handleSetState(key, value); + } +#endif + +#if DISTRHO_PLUGIN_IS_SYNTH + static void sendNoteCallback(void* ptr, uint8_t channel, uint8_t note, uint8_t velocity) + { + handlePtr->handleSendNote(channel, note, velocity); + } +#endif + + static void setSizeCallback(void* ptr, uint width, uint height) + { + handlePtr->handleSetSize(width, height); + } + + #undef handlePtr + + CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UICarla) +}; +#endif // DISTRHO_PLUGIN_HAS_UI + +// ----------------------------------------------------------------------- +// Carla Plugin + +class PluginCarla : public NativePluginClass +{ +public: + PluginCarla(const NativeHostDescriptor* const host) + : NativePluginClass(host) + { +#if DISTRHO_PLUGIN_HAS_UI + fUiPtr = nullptr; +#endif + } + + ~PluginCarla() override + { +#if DISTRHO_PLUGIN_HAS_UI + if (fUiPtr != nullptr) + { + delete fUiPtr; + fUiPtr = nullptr; + } +#endif + } + +protected: + // ------------------------------------------------------------------- + // Plugin parameter calls + + uint32_t getParameterCount() const override + { + return fPlugin.getParameterCount(); + } + + const NativeParameter* getParameterInfo(const uint32_t index) const override + { + CARLA_SAFE_ASSERT_RETURN(index < getParameterCount(), nullptr); + + static NativeParameter param; + + param.scalePointCount = 0; + param.scalePoints = nullptr; + + { + int nativeParamHints = ::NATIVE_PARAMETER_IS_ENABLED; + const uint32_t paramHints = fPlugin.getParameterHints(index); + + if (paramHints & kParameterIsAutomable) + nativeParamHints |= ::NATIVE_PARAMETER_IS_AUTOMABLE; + if (paramHints & kParameterIsBoolean) + nativeParamHints |= ::NATIVE_PARAMETER_IS_BOOLEAN; + if (paramHints & kParameterIsInteger) + nativeParamHints |= ::NATIVE_PARAMETER_IS_INTEGER; + if (paramHints & kParameterIsLogarithmic) + nativeParamHints |= ::NATIVE_PARAMETER_IS_LOGARITHMIC; + if (paramHints & kParameterIsOutput) + nativeParamHints |= ::NATIVE_PARAMETER_IS_OUTPUT; + + param.hints = static_cast(nativeParamHints); + } + + param.name = fPlugin.getParameterName(index); + param.unit = fPlugin.getParameterUnit(index); + + { + const ParameterRanges& ranges(fPlugin.getParameterRanges(index)); + + param.ranges.def = ranges.def; + param.ranges.min = ranges.min; + param.ranges.max = ranges.max; + } + + return ¶m; + } + + float getParameterValue(const uint32_t index) const override + { + CARLA_SAFE_ASSERT_RETURN(index < getParameterCount(), 0.0f); + + return fPlugin.getParameterValue(index); + } + + // ------------------------------------------------------------------- + // Plugin midi-program calls + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + uint32_t getMidiProgramCount() const override + { + return fPlugin.getProgramCount(); + } + + const NativeMidiProgram* getMidiProgramInfo(const uint32_t index) const override + { + CARLA_SAFE_ASSERT_RETURN(index < getMidiProgramCount(), nullptr); + + static NativeMidiProgram midiProgram; + + midiProgram.bank = index / 128; + midiProgram.program = index % 128; + midiProgram.name = fPlugin.getProgramName(index); + + return &midiProgram; + } +#endif + + // ------------------------------------------------------------------- + // Plugin state calls + + void setParameterValue(const uint32_t index, const float value) override + { + CARLA_SAFE_ASSERT_RETURN(index < getParameterCount(),); + + fPlugin.setParameterValue(index, value); + } + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + void setMidiProgram(const uint8_t, const uint32_t bank, const uint32_t program) override + { + const uint32_t realProgram(bank * 128 + program); + + CARLA_SAFE_ASSERT_RETURN(realProgram < getMidiProgramCount(),); + + fPlugin.loadProgram(realProgram); + } +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + void setCustomData(const char* const key, const char* const value) override + { + CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); + CARLA_SAFE_ASSERT_RETURN(value != nullptr,); + + fPlugin.setState(key, value); + } +#endif + + // ------------------------------------------------------------------- + // Plugin process calls + + void activate() override + { + fPlugin.activate(); + } + + void deactivate() override + { + fPlugin.deactivate(); + } + +#if DISTRHO_PLUGIN_IS_SYNTH + void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const NativeMidiEvent* const midiEvents, const uint32_t midiEventCount) override + { + MidiEvent realMidiEvents[midiEventCount]; + + for (uint32_t i=0; i < midiEventCount; ++i) + { + const NativeMidiEvent& midiEvent(midiEvents[i]); + MidiEvent& realMidiEvent(realMidiEvents[i]); + + realMidiEvent.frame = midiEvent.time; + realMidiEvent.size = midiEvent.size; + + uint8_t j=0; + for (; j(inBuffer), outBuffer, frames, realMidiEvents, midiEventCount); + } +#else + void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const NativeMidiEvent* const, const uint32_t) override + { + fPlugin.run(const_cast(inBuffer), outBuffer, frames); + } +#endif + + // ------------------------------------------------------------------- + // Plugin UI calls + +#if DISTRHO_PLUGIN_HAS_UI + void uiShow(const bool show) override + { + if (show) + { + createUiIfNeeded(); + CARLA_SAFE_ASSERT_RETURN(fUiPtr != nullptr,); + + fUiPtr->carla_show(show); + } + else if (fUiPtr != nullptr) + { + delete fUiPtr; + fUiPtr = nullptr; + } + } + + void uiIdle() override + { + CARLA_SAFE_ASSERT_RETURN(fUiPtr != nullptr,); + + if (! fUiPtr->carla_idle()) + { + uiClosed(); + + delete fUiPtr; + fUiPtr = nullptr; + } + } + + void uiSetParameterValue(const uint32_t index, const float value) override + { + CARLA_SAFE_ASSERT_RETURN(fUiPtr != nullptr,); + CARLA_SAFE_ASSERT_RETURN(index < getParameterCount(),); + + fUiPtr->carla_setParameterValue(index, value); + } + +# if DISTRHO_PLUGIN_WANT_PROGRAMS + void uiSetMidiProgram(const uint8_t, const uint32_t bank, const uint32_t program) override + { + CARLA_SAFE_ASSERT_RETURN(fUiPtr != nullptr,); + + const uint32_t realProgram(bank * 128 + program); + + CARLA_SAFE_ASSERT_RETURN(realProgram < getMidiProgramCount(),); + + fUiPtr->carla_setMidiProgram(realProgram); + } +# endif + +# if DISTRHO_PLUGIN_WANT_STATE + void uiSetCustomData(const char* const key, const char* const value) override + { + CARLA_SAFE_ASSERT_RETURN(fUiPtr != nullptr,); + CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); + CARLA_SAFE_ASSERT_RETURN(value != nullptr,); + + fUiPtr->carla_setCustomData(key, value); + } +# endif +#endif + + // ------------------------------------------------------------------- + // Plugin dispatcher calls + + void bufferSizeChanged(const uint32_t bufferSize) override + { + fPlugin.setBufferSize(bufferSize, true); + } + + void sampleRateChanged(const double sampleRate) override + { + fPlugin.setSampleRate(sampleRate, true); + } + +#if DISTRHO_PLUGIN_HAS_UI + void uiNameChanged(const char* const uiName) override + { + CARLA_SAFE_ASSERT_RETURN(fUiPtr != nullptr,); + + fUiPtr->carla_setUiTitle(uiName); + } +#endif + + // ------------------------------------------------------------------- + +private: + PluginExporter fPlugin; + +#if DISTRHO_PLUGIN_HAS_UI + // UI + UICarla* fUiPtr; + + void createUiIfNeeded() + { + if (fUiPtr == nullptr) + { + d_lastUiSampleRate = getSampleRate(); + fUiPtr = new UICarla(getHostHandle(), &fPlugin); + } + } +#endif + + CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginCarla) + + // ------------------------------------------------------------------- + +public: + static NativePluginHandle _instantiate(const NativeHostDescriptor* host) + { + d_lastBufferSize = host->get_buffer_size(host->handle); + d_lastSampleRate = host->get_sample_rate(host->handle); + return new PluginCarla(host); + } + + static void _cleanup(NativePluginHandle handle) + { + delete (PluginCarla*)handle; + } +}; + +END_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- diff --git a/dpf/distrho/src/DistrhoPluginChecks.h b/dpf/distrho/src/DistrhoPluginChecks.h new file mode 100644 index 0000000..eb7cc63 --- /dev/null +++ b/dpf/distrho/src/DistrhoPluginChecks.h @@ -0,0 +1,109 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_PLUGIN_CHECKS_H_INCLUDED +#define DISTRHO_PLUGIN_CHECKS_H_INCLUDED + +#include "DistrhoPluginInfo.h" + +// ----------------------------------------------------------------------- +// Check if all required macros are defined + +#ifndef DISTRHO_PLUGIN_NAME +# error DISTRHO_PLUGIN_NAME undefined! +#endif + +#ifndef DISTRHO_PLUGIN_NUM_INPUTS +# error DISTRHO_PLUGIN_NUM_INPUTS undefined! +#endif + +#ifndef DISTRHO_PLUGIN_NUM_OUTPUTS +# error DISTRHO_PLUGIN_NUM_OUTPUTS undefined! +#endif + +#ifndef DISTRHO_PLUGIN_URI +# error DISTRHO_PLUGIN_URI undefined! +#endif + +// ----------------------------------------------------------------------- +// Define optional macros if not done yet + +#ifndef DISTRHO_PLUGIN_HAS_UI +# define DISTRHO_PLUGIN_HAS_UI 0 +#endif + +#ifndef DISTRHO_PLUGIN_IS_RT_SAFE +# define DISTRHO_PLUGIN_IS_RT_SAFE 0 +#endif + +#ifndef DISTRHO_PLUGIN_IS_SYNTH +# define DISTRHO_PLUGIN_IS_SYNTH 0 +#endif + +#ifndef DISTRHO_PLUGIN_WANT_DIRECT_ACCESS +# define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 0 +#endif + +#ifndef DISTRHO_PLUGIN_WANT_LATENCY +# define DISTRHO_PLUGIN_WANT_LATENCY 0 +#endif + +#ifndef DISTRHO_PLUGIN_WANT_MIDI_OUTPUT +# define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 0 +#endif + +#ifndef DISTRHO_PLUGIN_WANT_PROGRAMS +# define DISTRHO_PLUGIN_WANT_PROGRAMS 0 +#endif + +#ifndef DISTRHO_PLUGIN_WANT_STATE +# define DISTRHO_PLUGIN_WANT_STATE 0 +#endif + +#ifndef DISTRHO_PLUGIN_WANT_TIMEPOS +# define DISTRHO_PLUGIN_WANT_TIMEPOS 0 +#endif + +#ifndef DISTRHO_UI_USE_NANOVG +# define DISTRHO_UI_USE_NANOVG 0 +#endif + +// ----------------------------------------------------------------------- +// Define DISTRHO_UI_URI if needed + +#ifndef DISTRHO_UI_URI +# define DISTRHO_UI_URI DISTRHO_PLUGIN_URI "#UI" +#endif + +// ----------------------------------------------------------------------- +// Test if synth has audio outputs + +#if DISTRHO_PLUGIN_IS_SYNTH && DISTRHO_PLUGIN_NUM_OUTPUTS == 0 +# error Synths need audio output to work! +#endif + +// ----------------------------------------------------------------------- +// Enable MIDI input if synth, test if midi-input disabled when synth + +#ifndef DISTRHO_PLUGIN_WANT_MIDI_INPUT +# define DISTRHO_PLUGIN_WANT_MIDI_INPUT DISTRHO_PLUGIN_IS_SYNTH +#elif DISTRHO_PLUGIN_IS_SYNTH && ! DISTRHO_PLUGIN_WANT_MIDI_INPUT +# error Synths need MIDI input to work! +#endif + +// ----------------------------------------------------------------------- + +#endif // DISTRHO_PLUGIN_CHECKS_H_INCLUDED diff --git a/dpf/distrho/src/DistrhoPluginInternal.hpp b/dpf/distrho/src/DistrhoPluginInternal.hpp new file mode 100644 index 0000000..da8abd4 --- /dev/null +++ b/dpf/distrho/src/DistrhoPluginInternal.hpp @@ -0,0 +1,553 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_PLUGIN_INTERNAL_HPP_INCLUDED +#define DISTRHO_PLUGIN_INTERNAL_HPP_INCLUDED + +#include "../DistrhoPlugin.hpp" + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- +// Maxmimum values + +static const uint32_t kMaxMidiEvents = 512; + +// ----------------------------------------------------------------------- +// Static data, see DistrhoPlugin.cpp + +extern uint32_t d_lastBufferSize; +extern double d_lastSampleRate; + +// ----------------------------------------------------------------------- +// Plugin private data + +struct Plugin::PrivateData { + bool isProcessing; + +#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + AudioPort* audioPorts; +#endif + + uint32_t parameterCount; + Parameter* parameters; + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + uint32_t programCount; + String* programNames; +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + uint32_t stateCount; + String* stateKeys; + String* stateDefValues; +#endif + +#if DISTRHO_PLUGIN_WANT_LATENCY + uint32_t latency; +#endif + +#if DISTRHO_PLUGIN_WANT_TIMEPOS + TimePosition timePosition; +#endif + + uint32_t bufferSize; + double sampleRate; + + PrivateData() noexcept + : isProcessing(false), +#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + audioPorts(nullptr), +#endif + parameterCount(0), + parameters(nullptr), +#if DISTRHO_PLUGIN_WANT_PROGRAMS + programCount(0), + programNames(nullptr), +#endif +#if DISTRHO_PLUGIN_WANT_STATE + stateCount(0), + stateKeys(nullptr), + stateDefValues(nullptr), +#endif +#if DISTRHO_PLUGIN_WANT_LATENCY + latency(0), +#endif + bufferSize(d_lastBufferSize), + sampleRate(d_lastSampleRate) + { + DISTRHO_SAFE_ASSERT(bufferSize != 0); + DISTRHO_SAFE_ASSERT(d_isNotZero(sampleRate)); + } + + ~PrivateData() noexcept + { +#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + if (audioPorts != nullptr) + { + delete[] audioPorts; + audioPorts = nullptr; + } +#endif + + if (parameters != nullptr) + { + delete[] parameters; + parameters = nullptr; + } + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + if (programNames != nullptr) + { + delete[] programNames; + programNames = nullptr; + } +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + if (stateKeys != nullptr) + { + delete[] stateKeys; + stateKeys = nullptr; + } + + if (stateDefValues != nullptr) + { + delete[] stateDefValues; + stateDefValues = nullptr; + } +#endif + } +}; + +// ----------------------------------------------------------------------- +// Plugin exporter class + +class PluginExporter +{ +public: + PluginExporter() + : fPlugin(createPlugin()), + fData((fPlugin != nullptr) ? fPlugin->pData : nullptr), + fIsActive(false) + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + +#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + { + uint32_t j=0; +# if DISTRHO_PLUGIN_NUM_INPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i, ++j) + fPlugin->initAudioPort(true, i, fData->audioPorts[j]); +# endif +# if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i, ++j) + fPlugin->initAudioPort(false, i, fData->audioPorts[j]); +# endif + } +#endif + + for (uint32_t i=0, count=fData->parameterCount; i < count; ++i) + fPlugin->initParameter(i, fData->parameters[i]); + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + for (uint32_t i=0, count=fData->programCount; i < count; ++i) + fPlugin->initProgramName(i, fData->programNames[i]); +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + for (uint32_t i=0, count=fData->stateCount; i < count; ++i) + fPlugin->initState(i, fData->stateKeys[i], fData->stateDefValues[i]); +#endif + } + + ~PluginExporter() + { + delete fPlugin; + } + + // ------------------------------------------------------------------- + + const char* getName() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); + + return fPlugin->getName(); + } + + const char* getLabel() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); + + return fPlugin->getLabel(); + } + + const char* getMaker() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); + + return fPlugin->getMaker(); + } + + const char* getLicense() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, ""); + + return fPlugin->getLicense(); + } + + uint32_t getVersion() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, 0); + + return fPlugin->getVersion(); + } + + long getUniqueId() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, 0); + + return fPlugin->getUniqueId(); + } + + void* getInstancePointer() const noexcept + { + return fPlugin; + } + + // ------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_WANT_LATENCY + uint32_t getLatency() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0); + + return fData->latency; + } +#endif + +#if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + const AudioPort& getAudioPort(const bool input, const uint32_t index) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, sFallbackAudioPort); + + if (input) + { +# if DISTRHO_PLUGIN_NUM_INPUTS > 0 + DISTRHO_SAFE_ASSERT_RETURN(index < DISTRHO_PLUGIN_NUM_INPUTS, sFallbackAudioPort); +# endif + } + else + { +# if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + DISTRHO_SAFE_ASSERT_RETURN(index < DISTRHO_PLUGIN_NUM_OUTPUTS, sFallbackAudioPort); +# endif + } + + return fData->audioPorts[index + (input ? 0 : DISTRHO_PLUGIN_NUM_INPUTS)]; + } +#endif + + uint32_t getParameterCount() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0); + + return fData->parameterCount; + } + + uint32_t getParameterHints(const uint32_t index) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, 0x0); + + return fData->parameters[index].hints; + } + + bool isParameterOutput(const uint32_t index) const noexcept + { + return (getParameterHints(index) & kParameterIsOutput); + } + + const String& getParameterName(const uint32_t index) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackString); + + return fData->parameters[index].name; + } + + const String& getParameterSymbol(const uint32_t index) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackString); + + return fData->parameters[index].symbol; + } + + const String& getParameterUnit(const uint32_t index) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackString); + + return fData->parameters[index].unit; + } + + const ParameterRanges& getParameterRanges(const uint32_t index) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, sFallbackRanges); + + return fData->parameters[index].ranges; + } + + float getParameterValue(const uint32_t index) const + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, 0.0f); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount, 0.0f); + + return fPlugin->getParameterValue(index); + } + + void setParameterValue(const uint32_t index, const float value) + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->parameterCount,); + + fPlugin->setParameterValue(index, value); + } + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + uint32_t getProgramCount() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0); + + return fData->programCount; + } + + const String& getProgramName(const uint32_t index) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->programCount, sFallbackString); + + return fData->programNames[index]; + } + + void loadProgram(const uint32_t index) + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->programCount,); + + fPlugin->loadProgram(index); + } +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + uint32_t getStateCount() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0); + + return fData->stateCount; + } + + const String& getStateKey(const uint32_t index) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->stateCount, sFallbackString); + + return fData->stateKeys[index]; + } + + const String& getStateDefaultValue(const uint32_t index) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr && index < fData->stateCount, sFallbackString); + + return fData->stateDefValues[index]; + } + + void setState(const char* const key, const char* const value) + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); + DISTRHO_SAFE_ASSERT_RETURN(value != nullptr,); + + fPlugin->setState(key, value); + } + + bool wantStateKey(const char* const key) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, false); + DISTRHO_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0', false); + + for (uint32_t i=0; i < fData->stateCount; ++i) + { + if (fData->stateKeys[i] == key) + return true; + } + + return false; + } +#endif + +#if DISTRHO_PLUGIN_WANT_TIMEPOS + void setTimePosition(const TimePosition& timePosition) noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + + std::memcpy(&fData->timePosition, &timePosition, sizeof(TimePosition)); + } +#endif + + // ------------------------------------------------------------------- + + bool isActive() const noexcept + { + return fIsActive; + } + + void activate() + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(! fIsActive,); + + fIsActive = true; + fPlugin->activate(); + } + + void deactivate() + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fIsActive,); + + fIsActive = false; + fPlugin->deactivate(); + } + + void deactivateIfNeeded() + { + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + + if (fIsActive) + { + fIsActive = false; + fPlugin->deactivate(); + } + } + +#if DISTRHO_PLUGIN_IS_SYNTH + void run(const float** const inputs, float** const outputs, const uint32_t frames, + const MidiEvent* const midiEvents, const uint32_t midiEventCount) + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + + if (! fIsActive) + { + fIsActive = true; + fPlugin->activate(); + } + + fData->isProcessing = true; + fPlugin->run(inputs, outputs, frames, midiEvents, midiEventCount); + fData->isProcessing = false; + } +#else + void run(const float** const inputs, float** const outputs, const uint32_t frames) + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + + if (! fIsActive) + { + fIsActive = true; + fPlugin->activate(); + } + + fData->isProcessing = true; + fPlugin->run(inputs, outputs, frames); + fData->isProcessing = false; + } +#endif + + // ------------------------------------------------------------------- + + uint32_t getBufferSize() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0); + return fData->bufferSize; + } + + double getSampleRate() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0.0); + return fData->sampleRate; + } + + void setBufferSize(const uint32_t bufferSize, const bool doCallback = false) + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT(bufferSize >= 2); + + if (fData->bufferSize == bufferSize) + return; + + fData->bufferSize = bufferSize; + + if (doCallback) + { + if (fIsActive) fPlugin->deactivate(); + fPlugin->bufferSizeChanged(bufferSize); + if (fIsActive) fPlugin->activate(); + } + } + + void setSampleRate(const double sampleRate, const bool doCallback = false) + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT(sampleRate > 0.0); + + if (d_isEqual(fData->sampleRate, sampleRate)) + return; + + fData->sampleRate = sampleRate; + + if (doCallback) + { + if (fIsActive) fPlugin->deactivate(); + fPlugin->sampleRateChanged(sampleRate); + if (fIsActive) fPlugin->activate(); + } + } + +private: + // ------------------------------------------------------------------- + // Plugin and DistrhoPlugin data + + Plugin* const fPlugin; + Plugin::PrivateData* const fData; + bool fIsActive; + + // ------------------------------------------------------------------- + // Static fallback data, see DistrhoPlugin.cpp + + static const String sFallbackString; + static const AudioPort sFallbackAudioPort; + static const ParameterRanges sFallbackRanges; + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginExporter) + DISTRHO_PREVENT_HEAP_ALLOCATION +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_PLUGIN_INTERNAL_HPP_INCLUDED diff --git a/dpf/distrho/src/DistrhoPluginJack.cpp b/dpf/distrho/src/DistrhoPluginJack.cpp new file mode 100644 index 0000000..7aa97cb --- /dev/null +++ b/dpf/distrho/src/DistrhoPluginJack.cpp @@ -0,0 +1,523 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * For a full copy of the license see the LGPL.txt file + */ + +#include "DistrhoPluginInternal.hpp" + +#if DISTRHO_PLUGIN_HAS_UI && ! defined(HAVE_DGL) +# undef DISTRHO_PLUGIN_HAS_UI +# define DISTRHO_PLUGIN_HAS_UI 0 +#endif + +#if DISTRHO_PLUGIN_HAS_UI +# include "DistrhoUIInternal.hpp" +#else +# include "../extra/Sleep.hpp" +#endif + +#include "jack/jack.h" +#include "jack/midiport.h" +#include "jack/transport.h" + +#ifndef DISTRHO_OS_WINDOWS +# include +#endif + +// ----------------------------------------------------------------------- + +START_NAMESPACE_DISTRHO + +#if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_WANT_STATE +static const setStateFunc setStateCallback = nullptr; +#endif + +// ----------------------------------------------------------------------- + +static volatile bool gCloseSignalReceived = false; + +#ifdef DISTRHO_OS_WINDOWS +static BOOL WINAPI winSignalHandler(DWORD dwCtrlType) noexcept +{ + if (dwCtrlType == CTRL_C_EVENT) + { + gCloseSignalReceived = true; + return TRUE; + } + return FALSE; +} + +static void initSignalHandler() +{ + SetConsoleCtrlHandler(winSignalHandler, TRUE); +} +#else +static void closeSignalHandler(int) noexcept +{ + gCloseSignalReceived = true; +} + +static void initSignalHandler() +{ + struct sigaction sint; + struct sigaction sterm; + + sint.sa_handler = closeSignalHandler; + sint.sa_flags = SA_RESTART; + sint.sa_restorer = nullptr; + sigemptyset(&sint.sa_mask); + sigaction(SIGINT, &sint, nullptr); + + sterm.sa_handler = closeSignalHandler; + sterm.sa_flags = SA_RESTART; + sterm.sa_restorer = nullptr; + sigemptyset(&sterm.sa_mask); + sigaction(SIGTERM, &sterm, nullptr); +} +#endif + +// ----------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_HAS_UI +class PluginJack : public IdleCallback +#else +class PluginJack +#endif +{ +public: + PluginJack(jack_client_t* const client) + : fPlugin(), +#if DISTRHO_PLUGIN_HAS_UI + fUI(this, 0, nullptr, setParameterValueCallback, setStateCallback, nullptr, setSizeCallback, fPlugin.getInstancePointer()), +#endif + fClient(client) + { + char strBuf[0xff+1]; + strBuf[0xff] = '\0'; + +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i) + { + std::snprintf(strBuf, 0xff, "in%i", i+1); + fPortAudioIns[i] = jack_port_register(fClient, strBuf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); + } +#endif + +#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) + { + std::snprintf(strBuf, 0xff, "out%i", i+1); + fPortAudioOuts[i] = jack_port_register(fClient, strBuf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0); + } +#endif + +#if DISTRHO_PLUGIN_IS_SYNTH + fPortMidiIn = jack_port_register(fClient, "midi-in", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0); +#endif + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + if (fPlugin.getProgramCount() > 0) + { + fPlugin.loadProgram(0); +# if DISTRHO_PLUGIN_HAS_UI + fUI.programLoaded(0); +# endif + } +#endif + + if (const uint32_t count = fPlugin.getParameterCount()) + { + fLastOutputValues = new float[count]; + + for (uint32_t i=0; i < count; ++i) + { + if (fPlugin.isParameterOutput(i)) + { + fLastOutputValues[i] = fPlugin.getParameterValue(i); + } + else + { + fLastOutputValues[i] = 0.0f; +# if DISTRHO_PLUGIN_HAS_UI + fUI.parameterChanged(i, fPlugin.getParameterValue(i)); +# endif + } + } + } + else + { + fLastOutputValues = nullptr; + } + + jack_set_buffer_size_callback(fClient, jackBufferSizeCallback, this); + jack_set_sample_rate_callback(fClient, jackSampleRateCallback, this); + jack_set_process_callback(fClient, jackProcessCallback, this); + jack_on_shutdown(fClient, jackShutdownCallback, this); + + fPlugin.activate(); + + jack_activate(fClient); + +#if DISTRHO_PLUGIN_HAS_UI + if (const char* const name = jack_get_client_name(fClient)) + fUI.setWindowTitle(name); + else + fUI.setWindowTitle(fPlugin.getName()); + + fUI.exec(this); +#else + while (! gCloseSignalReceived) + d_sleep(1); +#endif + } + + ~PluginJack() + { + if (fClient == nullptr) + return; + + jack_deactivate(fClient); + + fPlugin.deactivate(); + +#if DISTRHO_PLUGIN_IS_SYNTH + jack_port_unregister(fClient, fPortMidiIn); + fPortMidiIn = nullptr; +#endif + +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i) + { + jack_port_unregister(fClient, fPortAudioIns[i]); + fPortAudioIns[i] = nullptr; + } +#endif + +#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) + { + jack_port_unregister(fClient, fPortAudioOuts[i]); + fPortAudioOuts[i] = nullptr; + } +#endif + + jack_client_close(fClient); + } + + // ------------------------------------------------------------------- + +protected: +#if DISTRHO_PLUGIN_HAS_UI + void idleCallback() override + { + if (gCloseSignalReceived) + return fUI.quit(); + + float value; + + for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) + { + if (! fPlugin.isParameterOutput(i)) + continue; + + value = fPlugin.getParameterValue(i); + + if (fLastOutputValues[i] == value) + continue; + + fLastOutputValues[i] = value; + fUI.parameterChanged(i, value); + } + + fUI.exec_idle(); + } +#endif + + void jackBufferSize(const jack_nframes_t nframes) + { + fPlugin.setBufferSize(nframes, true); + } + + void jackSampleRate(const jack_nframes_t nframes) + { + fPlugin.setSampleRate(nframes, true); + } + + void jackProcess(const jack_nframes_t nframes) + { +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + const float* audioIns[DISTRHO_PLUGIN_NUM_INPUTS]; + + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i) + audioIns[i] = (const float*)jack_port_get_buffer(fPortAudioIns[i], nframes); +#else + static const float** audioIns = nullptr; +#endif + +#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + float* audioOuts[DISTRHO_PLUGIN_NUM_OUTPUTS]; + + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) + audioOuts[i] = (float*)jack_port_get_buffer(fPortAudioOuts[i], nframes); +#else + static float** audioOuts = nullptr; +#endif + +#if DISTRHO_PLUGIN_WANT_TIMEPOS + jack_position_t pos; + fTimePosition.playing = (jack_transport_query(fClient, &pos) == JackTransportRolling); + + if (pos.unique_1 == pos.unique_2) + { + fTimePosition.frame = pos.frame; + + if (pos.valid & JackTransportBBT) + { + fTimePosition.bbt.valid = true; + + fTimePosition.bbt.bar = pos.bar; + fTimePosition.bbt.beat = pos.beat; + fTimePosition.bbt.tick = pos.tick; + fTimePosition.bbt.barStartTick = pos.bar_start_tick; + + fTimePosition.bbt.beatsPerBar = pos.beats_per_bar; + fTimePosition.bbt.beatType = pos.beat_type; + + fTimePosition.bbt.ticksPerBeat = pos.ticks_per_beat; + fTimePosition.bbt.beatsPerMinute = pos.beats_per_minute; + } + else + fTimePosition.bbt.valid = false; + } + else + { + fTimePosition.bbt.valid = false; + fTimePosition.frame = 0; + } + + fPlugin.setTimePosition(fTimePosition); +#endif + +#if DISTRHO_PLUGIN_IS_SYNTH + void* const midiBuf = jack_port_get_buffer(fPortMidiIn, nframes); + + if (const uint32_t eventCount = jack_midi_get_event_count(midiBuf)) + { + uint32_t midiEventCount = 0; + MidiEvent midiEvents[eventCount]; + + jack_midi_event_t jevent; + + for (uint32_t i=0; i < eventCount; ++i) + { + if (jack_midi_event_get(&jevent, midiBuf, i) != 0) + break; + + MidiEvent& midiEvent(midiEvents[midiEventCount++]); + + midiEvent.frame = jevent.time; + midiEvent.size = jevent.size; + + if (midiEvent.size > MidiEvent::kDataSize) + midiEvent.dataExt = jevent.buffer; + else + std::memcpy(midiEvent.data, jevent.buffer, midiEvent.size); + } + + fPlugin.run(audioIns, audioOuts, nframes, midiEvents, midiEventCount); + } + else + { + fPlugin.run(audioIns, audioOuts, nframes, nullptr, 0); + } +#else + fPlugin.run(audioIns, audioOuts, nframes); +#endif + } + + void jackShutdown() + { + d_stderr("jack has shutdown, quitting now..."); + fClient = nullptr; +#if DISTRHO_PLUGIN_HAS_UI + fUI.quit(); +#endif + } + + // ------------------------------------------------------------------- + + void setParameterValue(const uint32_t index, const float value) + { + fPlugin.setParameterValue(index, value); + } + +#if DISTRHO_PLUGIN_WANT_STATE + void setState(const char* const key, const char* const value) + { + fPlugin.setState(key, value); + } +#endif + +#if DISTRHO_PLUGIN_HAS_UI + void setSize(const uint width, const uint height) + { + fUI.setWindowSize(width, height); + } +#endif + + // ------------------------------------------------------------------- + +private: + PluginExporter fPlugin; +#if DISTRHO_PLUGIN_HAS_UI + UIExporter fUI; +#endif + + jack_client_t* fClient; + +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + jack_port_t* fPortAudioIns[DISTRHO_PLUGIN_NUM_INPUTS]; +#endif +#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + jack_port_t* fPortAudioOuts[DISTRHO_PLUGIN_NUM_OUTPUTS]; +#endif +#if DISTRHO_PLUGIN_IS_SYNTH + jack_port_t* fPortMidiIn; +#endif +#if DISTRHO_PLUGIN_WANT_TIMEPOS + TimePosition fTimePosition; +#endif + + // Temporary data + float* fLastOutputValues; + + // ------------------------------------------------------------------- + // Callbacks + + #define uiPtr ((PluginJack*)ptr) + + static int jackBufferSizeCallback(jack_nframes_t nframes, void* ptr) + { + uiPtr->jackBufferSize(nframes); + return 0; + } + + static int jackSampleRateCallback(jack_nframes_t nframes, void* ptr) + { + uiPtr->jackSampleRate(nframes); + return 0; + } + + static int jackProcessCallback(jack_nframes_t nframes, void* ptr) + { + uiPtr->jackProcess(nframes); + return 0; + } + + static void jackShutdownCallback(void* ptr) + { + uiPtr->jackShutdown(); + } + + static void setParameterValueCallback(void* ptr, uint32_t index, float value) + { + uiPtr->setParameterValue(index, value); + } + +#if DISTRHO_PLUGIN_WANT_STATE + static void setStateCallback(void* ptr, const char* key, const char* value) + { + uiPtr->setState(key, value); + } +#endif + +#if DISTRHO_PLUGIN_HAS_UI + static void setSizeCallback(void* ptr, uint width, uint height) + { + uiPtr->setSize(width, height); + } +#endif + + #undef uiPtr +}; + +END_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- + +int main() +{ + USE_NAMESPACE_DISTRHO; + + jack_status_t status = jack_status_t(0x0); + jack_client_t* client = jack_client_open(DISTRHO_PLUGIN_NAME, JackNoStartServer, &status); + + if (client == nullptr) + { + String errorString; + + if (status & JackFailure) + errorString += "Overall operation failed;\n"; + if (status & JackInvalidOption) + errorString += "The operation contained an invalid or unsupported option;\n"; + if (status & JackNameNotUnique) + errorString += "The desired client name was not unique;\n"; + if (status & JackServerStarted) + errorString += "The JACK server was started as a result of this operation;\n"; + if (status & JackServerFailed) + errorString += "Unable to connect to the JACK server;\n"; + if (status & JackServerError) + errorString += "Communication error with the JACK server;\n"; + if (status & JackNoSuchClient) + errorString += "Requested client does not exist;\n"; + if (status & JackLoadFailure) + errorString += "Unable to load internal client;\n"; + if (status & JackInitFailure) + errorString += "Unable to initialize client;\n"; + if (status & JackShmFailure) + errorString += "Unable to access shared memory;\n"; + if (status & JackVersionError) + errorString += "Client's protocol version does not match;\n"; + if (status & JackBackendError) + errorString += "Backend Error;\n"; + if (status & JackClientZombie) + errorString += "Client is being shutdown against its will;\n"; + + if (errorString.isNotEmpty()) + { + errorString[errorString.length()-2] = '.'; + d_stderr("Failed to create jack client, reason was:\n%s", errorString.buffer()); + } + else + d_stderr("Failed to create jack client, cannot continue!"); + + return 1; + } + + USE_NAMESPACE_DISTRHO; + + initSignalHandler(); + + d_lastBufferSize = jack_get_buffer_size(client); + d_lastSampleRate = jack_get_sample_rate(client); +#if DISTRHO_PLUGIN_HAS_UI + d_lastUiSampleRate = d_lastSampleRate; +#endif + + const PluginJack p(client); + + return 0; +} + +// ----------------------------------------------------------------------- diff --git a/dpf/distrho/src/DistrhoPluginLADSPA+DSSI.cpp b/dpf/distrho/src/DistrhoPluginLADSPA+DSSI.cpp new file mode 100644 index 0000000..82399fc --- /dev/null +++ b/dpf/distrho/src/DistrhoPluginLADSPA+DSSI.cpp @@ -0,0 +1,711 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "DistrhoPluginInternal.hpp" + +#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT +# error Cannot use MIDI Output with LADSPA or DSSI +#endif + +#ifdef DISTRHO_PLUGIN_TARGET_DSSI +# include "dssi/dssi.h" +#else +# include "ladspa/ladspa.h" +# if DISTRHO_PLUGIN_WANT_MIDI_INPUT +# error Cannot use MIDI with LADSPA +# endif +# if DISTRHO_PLUGIN_WANT_STATE +# warning LADSPA cannot handle states +# endif +#endif + +#if DISTRHO_PLUGIN_WANT_TIMEPOS +# warning LADSPA/DSSI does not support TimePos +#endif + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- + +class PluginLadspaDssi +{ +public: + PluginLadspaDssi() + : fPortControls(nullptr), + fLastControlValues(nullptr) + { +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i) + fPortAudioIns[i] = nullptr; +#else + fPortAudioIns = nullptr; +#endif + +#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) + fPortAudioOuts[i] = nullptr; +#else + fPortAudioOuts = nullptr; +#endif + + if (const uint32_t count = fPlugin.getParameterCount()) + { + fPortControls = new LADSPA_Data*[count]; + fLastControlValues = new LADSPA_Data[count]; + + for (uint32_t i=0; i < count; ++i) + { + fPortControls[i] = nullptr; + fLastControlValues[i] = fPlugin.getParameterValue(i); + } + } + else + { + fPortControls = nullptr; + fLastControlValues = nullptr; + } + +#if DISTRHO_PLUGIN_WANT_LATENCY + fPortLatency = nullptr; +#endif + } + + ~PluginLadspaDssi() noexcept + { + if (fPortControls != nullptr) + { + delete[] fPortControls; + fPortControls = nullptr; + } + + if (fLastControlValues != nullptr) + { + delete[] fLastControlValues; + fLastControlValues = nullptr; + } + } + + // ------------------------------------------------------------------- + + void ladspa_activate() + { + fPlugin.activate(); + } + + void ladspa_deactivate() + { + fPlugin.deactivate(); + } + + // ------------------------------------------------------------------- + + void ladspa_connect_port(const ulong port, LADSPA_Data* const dataLocation) noexcept + { + ulong index = 0; + +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + for (ulong i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i) + { + if (port == index++) + { + fPortAudioIns[i] = dataLocation; + return; + } + } +#endif + +#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + for (ulong i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) + { + if (port == index++) + { + fPortAudioOuts[i] = dataLocation; + return; + } + } +#endif + +#if DISTRHO_PLUGIN_WANT_LATENCY + if (port == index++) + { + fPortLatency = dataLocation; + return; + } +#endif + + for (ulong i=0, count=fPlugin.getParameterCount(); i < count; ++i) + { + if (port == index++) + { + fPortControls[i] = dataLocation; + return; + } + } + } + + // ------------------------------------------------------------------- + +#ifdef DISTRHO_PLUGIN_TARGET_DSSI + void ladspa_run(const ulong sampleCount) + { + dssi_run_synth(sampleCount, nullptr, 0); + } + + void dssi_run_synth(const ulong sampleCount, snd_seq_event_t* const events, const ulong eventCount) +#else + void ladspa_run(const ulong sampleCount) +#endif + { + // pre-roll + if (sampleCount == 0) + return updateParameterOutputs(); + + // Check for updated parameters + float curValue; + + for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) + { + if (fPortControls[i] == nullptr) + continue; + + curValue = *fPortControls[i]; + + if (fLastControlValues[i] != curValue && ! fPlugin.isParameterOutput(i)) + { + fLastControlValues[i] = curValue; + fPlugin.setParameterValue(i, curValue); + } + } + +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + // Get MIDI Events + uint32_t midiEventCount = 0; + MidiEvent midiEvents[eventCount]; + + for (uint32_t i=0, j; i < eventCount; ++i) + { + const snd_seq_event_t& seqEvent(events[i]); + + // FIXME + if (seqEvent.data.note.channel > 0xF || seqEvent.data.control.channel > 0xF) + continue; + + switch (seqEvent.type) + { + case SND_SEQ_EVENT_NOTEOFF: + j = midiEventCount++; + midiEvents[j].frame = seqEvent.time.tick; + midiEvents[j].size = 3; + midiEvents[j].data[0] = 0x80 + seqEvent.data.note.channel; + midiEvents[j].data[1] = seqEvent.data.note.note; + midiEvents[j].data[2] = 0; + midiEvents[j].data[3] = 0; + break; + case SND_SEQ_EVENT_NOTEON: + j = midiEventCount++; + midiEvents[j].frame = seqEvent.time.tick; + midiEvents[j].size = 3; + midiEvents[j].data[0] = 0x90 + seqEvent.data.note.channel; + midiEvents[j].data[1] = seqEvent.data.note.note; + midiEvents[j].data[2] = seqEvent.data.note.velocity; + midiEvents[j].data[3] = 0; + break; + case SND_SEQ_EVENT_KEYPRESS: + j = midiEventCount++; + midiEvents[j].frame = seqEvent.time.tick; + midiEvents[j].size = 3; + midiEvents[j].data[0] = 0xA0 + seqEvent.data.note.channel; + midiEvents[j].data[1] = seqEvent.data.note.note; + midiEvents[j].data[2] = seqEvent.data.note.velocity; + midiEvents[j].data[3] = 0; + break; + case SND_SEQ_EVENT_CONTROLLER: + j = midiEventCount++; + midiEvents[j].frame = seqEvent.time.tick; + midiEvents[j].size = 3; + midiEvents[j].data[0] = 0xB0 + seqEvent.data.control.channel; + midiEvents[j].data[1] = seqEvent.data.control.param; + midiEvents[j].data[2] = seqEvent.data.control.value; + midiEvents[j].data[3] = 0; + break; + case SND_SEQ_EVENT_CHANPRESS: + j = midiEventCount++; + midiEvents[j].frame = seqEvent.time.tick; + midiEvents[j].size = 2; + midiEvents[j].data[0] = 0xD0 + seqEvent.data.control.channel; + midiEvents[j].data[1] = seqEvent.data.control.value; + midiEvents[j].data[2] = 0; + midiEvents[j].data[3] = 0; + break; +#if 0 // TODO + case SND_SEQ_EVENT_PITCHBEND: + j = midiEventCount++; + midiEvents[j].frame = seqEvent.time.tick; + midiEvents[j].size = 3; + midiEvents[j].data[0] = 0xE0 + seqEvent.data.control.channel; + midiEvents[j].data[1] = 0; + midiEvents[j].data[2] = 0; + midiEvents[j].data[3] = 0; + break; +#endif + } + } + + fPlugin.run(fPortAudioIns, fPortAudioOuts, sampleCount, midiEvents, midiEventCount); +#else + fPlugin.run(fPortAudioIns, fPortAudioOuts, sampleCount); +#endif + + updateParameterOutputs(); + +#if defined(DISTRHO_PLUGIN_TARGET_DSSI) && ! DISTRHO_PLUGIN_WANT_MIDI_INPUT + return; // unused + (void)events; (void)eventCount; +#endif + } + + // ------------------------------------------------------------------- + +#ifdef DISTRHO_PLUGIN_TARGET_DSSI +# if DISTRHO_PLUGIN_WANT_STATE + char* dssi_configure(const char* const key, const char* const value) + { + if (std::strncmp(key, DSSI_RESERVED_CONFIGURE_PREFIX, std::strlen(DSSI_RESERVED_CONFIGURE_PREFIX) == 0)) + return nullptr; + if (std::strncmp(key, DSSI_GLOBAL_CONFIGURE_PREFIX, std::strlen(DSSI_GLOBAL_CONFIGURE_PREFIX) == 0)) + return nullptr; + + fPlugin.setState(key, value); + return nullptr; + } +# endif + +# if DISTRHO_PLUGIN_WANT_PROGRAMS + const DSSI_Program_Descriptor* dssi_get_program(const ulong index) + { + if (index >= fPlugin.getProgramCount()) + return nullptr; + + static DSSI_Program_Descriptor desc; + + desc.Bank = index / 128; + desc.Program = index % 128; + desc.Name = fPlugin.getProgramName(index); + + return &desc; + } + + void dssi_select_program(const ulong bank, const ulong program) + { + const ulong realProgram(bank * 128 + program); + + DISTRHO_SAFE_ASSERT_RETURN(realProgram < fPlugin.getProgramCount(),); + + fPlugin.loadProgram(realProgram); + + // Update control inputs + for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) + { + if (fPlugin.isParameterOutput(i)) + continue; + + fLastControlValues[i] = fPlugin.getParameterValue(i); + + if (fPortControls[i] != nullptr) + *fPortControls[i] = fLastControlValues[i]; + } + } +# endif +#endif + + // ------------------------------------------------------------------- + +private: + PluginExporter fPlugin; + + // LADSPA ports +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + const LADSPA_Data* fPortAudioIns[DISTRHO_PLUGIN_NUM_INPUTS]; +#else + const LADSPA_Data** fPortAudioIns; +#endif +#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + LADSPA_Data* fPortAudioOuts[DISTRHO_PLUGIN_NUM_OUTPUTS]; +#else + LADSPA_Data** fPortAudioOuts; +#endif + LADSPA_Data** fPortControls; +#if DISTRHO_PLUGIN_WANT_LATENCY + LADSPA_Data* fPortLatency; +#endif + + // Temporary data + LADSPA_Data* fLastControlValues; + + // ------------------------------------------------------------------- + + void updateParameterOutputs() + { + for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) + { + if (! fPlugin.isParameterOutput(i)) + continue; + + fLastControlValues[i] = fPlugin.getParameterValue(i); + + if (fPortControls[i] != nullptr) + *fPortControls[i] = fLastControlValues[i]; + } + +#if DISTRHO_PLUGIN_WANT_LATENCY + if (fPortLatency != nullptr) + *fPortLatency = fPlugin.getLatency(); +#endif + } +}; + +// ----------------------------------------------------------------------- + +static LADSPA_Handle ladspa_instantiate(const LADSPA_Descriptor*, ulong sampleRate) +{ + if (d_lastBufferSize == 0) + d_lastBufferSize = 2048; + d_lastSampleRate = sampleRate; + + return new PluginLadspaDssi(); +} + +#define instancePtr ((PluginLadspaDssi*)instance) + +static void ladspa_connect_port(LADSPA_Handle instance, ulong port, LADSPA_Data* dataLocation) +{ + instancePtr->ladspa_connect_port(port, dataLocation); +} + +static void ladspa_activate(LADSPA_Handle instance) +{ + instancePtr->ladspa_activate(); +} + +static void ladspa_run(LADSPA_Handle instance, ulong sampleCount) +{ + instancePtr->ladspa_run(sampleCount); +} + +static void ladspa_deactivate(LADSPA_Handle instance) +{ + instancePtr->ladspa_deactivate(); +} + +static void ladspa_cleanup(LADSPA_Handle instance) +{ + delete instancePtr; +} + +#ifdef DISTRHO_PLUGIN_TARGET_DSSI +# if DISTRHO_PLUGIN_WANT_STATE +static char* dssi_configure(LADSPA_Handle instance, const char* key, const char* value) +{ + return instancePtr->dssi_configure(key, value); +} +# endif + +# if DISTRHO_PLUGIN_WANT_PROGRAMS +static const DSSI_Program_Descriptor* dssi_get_program(LADSPA_Handle instance, ulong index) +{ + return instancePtr->dssi_get_program(index); +} + +static void dssi_select_program(LADSPA_Handle instance, ulong bank, ulong program) +{ + instancePtr->dssi_select_program(bank, program); +} +# endif + +# if DISTRHO_PLUGIN_WANT_MIDI_INPUT +static void dssi_run_synth(LADSPA_Handle instance, ulong sampleCount, snd_seq_event_t* events, ulong eventCount) +{ + instancePtr->dssi_run_synth(sampleCount, events, eventCount); +} +# endif +#endif + +#undef instancePtr + +// ----------------------------------------------------------------------- + +static LADSPA_Descriptor sLadspaDescriptor = { + /* UniqueID */ 0, + /* Label */ nullptr, +#if DISTRHO_PLUGIN_IS_RT_SAFE + /* Properties */ LADSPA_PROPERTY_HARD_RT_CAPABLE, +#else + /* Properties */ 0x0, +#endif + /* Name */ nullptr, + /* Maker */ nullptr, + /* Copyright */ nullptr, + /* PortCount */ 0, + /* PortDescriptors */ nullptr, + /* PortNames */ nullptr, + /* PortRangeHints */ nullptr, + /* ImplementationData */ nullptr, + ladspa_instantiate, + ladspa_connect_port, + ladspa_activate, + ladspa_run, + /* run_adding */ nullptr, + /* set_run_adding_gain */ nullptr, + ladspa_deactivate, + ladspa_cleanup +}; + +#ifdef DISTRHO_PLUGIN_TARGET_DSSI +static DSSI_Descriptor sDssiDescriptor = { + 1, + &sLadspaDescriptor, +# if DISTRHO_PLUGIN_WANT_STATE + dssi_configure, +# else + /* configure */ nullptr, +# endif +# if DISTRHO_PLUGIN_WANT_PROGRAMS + dssi_get_program, + dssi_select_program, +# else + /* get_program */ nullptr, + /* select_program */ nullptr, +# endif + /* get_midi_controller_for_port */ nullptr, +# if DISTRHO_PLUGIN_WANT_MIDI_INPUT + dssi_run_synth, +# else + /* run_synth */ nullptr, +# endif + /* run_synth_adding */ nullptr, + /* run_multiple_synths */ nullptr, + /* run_multiple_synths_adding */ nullptr, + nullptr, nullptr +}; +#endif + +// ----------------------------------------------------------------------- + +class DescriptorInitializer +{ +public: + DescriptorInitializer() + { + // Create dummy plugin to get data from + d_lastBufferSize = 512; + d_lastSampleRate = 44100.0; + PluginExporter plugin; + d_lastBufferSize = 0; + d_lastSampleRate = 0.0; + + // Get port count, init + ulong port = 0; + ulong portCount = DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS + plugin.getParameterCount(); +#if DISTRHO_PLUGIN_WANT_LATENCY + portCount += 1; +#endif + const char** const portNames = new const char*[portCount]; + LADSPA_PortDescriptor* portDescriptors = new LADSPA_PortDescriptor[portCount]; + LADSPA_PortRangeHint* portRangeHints = new LADSPA_PortRangeHint [portCount]; + + // Set ports +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + for (ulong i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i, ++port) + { + const AudioPort& aport(plugin.getAudioPort(true, i)); + + portNames[port] = strdup(aport.name); + portDescriptors[port] = LADSPA_PORT_AUDIO | LADSPA_PORT_INPUT; + + portRangeHints[port].HintDescriptor = 0x0; + portRangeHints[port].LowerBound = 0.0f; + portRangeHints[port].UpperBound = 1.0f; + } +#endif + +#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + for (ulong i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i, ++port) + { + const AudioPort& aport(plugin.getAudioPort(false, i)); + + portNames[port] = strdup(aport.name); + portDescriptors[port] = LADSPA_PORT_AUDIO | LADSPA_PORT_OUTPUT; + + portRangeHints[port].HintDescriptor = 0x0; + portRangeHints[port].LowerBound = 0.0f; + portRangeHints[port].UpperBound = 1.0f; + } +#endif + +#if DISTRHO_PLUGIN_WANT_LATENCY + // Set latency port + portNames[port] = strdup("_latency"); + portDescriptors[port] = LADSPA_PORT_CONTROL | LADSPA_PORT_OUTPUT; + portRangeHints[port].HintDescriptor = LADSPA_HINT_SAMPLE_RATE|LADSPA_HINT_INTEGER; + portRangeHints[port].LowerBound = 0.0f; + portRangeHints[port].UpperBound = 1.0f; + ++port; +#endif + + for (ulong i=0, count=plugin.getParameterCount(); i < count; ++i, ++port) + { + portNames[port] = strdup((const char*)plugin.getParameterName(i)); + portDescriptors[port] = LADSPA_PORT_CONTROL; + + if (plugin.isParameterOutput(i)) + portDescriptors[port] |= LADSPA_PORT_OUTPUT; + else + portDescriptors[port] |= LADSPA_PORT_INPUT; + + { + const ParameterRanges& ranges(plugin.getParameterRanges(i)); + const float defValue(ranges.def); + + portRangeHints[port].HintDescriptor = LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE; + portRangeHints[port].LowerBound = ranges.min; + portRangeHints[port].UpperBound = ranges.max; + + if (defValue == 0.0f) + portRangeHints[port].HintDescriptor |= LADSPA_HINT_DEFAULT_0; + else if (defValue == 1.0f) + portRangeHints[port].HintDescriptor |= LADSPA_HINT_DEFAULT_1; + else if (defValue == 100.0f) + portRangeHints[port].HintDescriptor |= LADSPA_HINT_DEFAULT_100; + else if (defValue == 440.0f) + portRangeHints[port].HintDescriptor |= LADSPA_HINT_DEFAULT_440; + else if (ranges.min == defValue) + portRangeHints[port].HintDescriptor |= LADSPA_HINT_DEFAULT_MINIMUM; + else if (ranges.max == defValue) + portRangeHints[port].HintDescriptor |= LADSPA_HINT_DEFAULT_MAXIMUM; + else + { + const float middleValue = ranges.min/2.0f + ranges.max/2.0f; + const float middleLow = (ranges.min/2.0f + middleValue/2.0f)/2.0f + middleValue/2.0f; + const float middleHigh = (ranges.max/2.0f + middleValue/2.0f)/2.0f + middleValue/2.0f; + + if (defValue < middleLow) + portRangeHints[port].HintDescriptor |= LADSPA_HINT_DEFAULT_LOW; + else if (defValue > middleHigh) + portRangeHints[port].HintDescriptor |= LADSPA_HINT_DEFAULT_HIGH; + else + portRangeHints[port].HintDescriptor |= LADSPA_HINT_DEFAULT_MIDDLE; + } + } + + { + const uint32_t hints(plugin.getParameterHints(i)); + + if (hints & kParameterIsBoolean) + portRangeHints[port].HintDescriptor |= LADSPA_HINT_TOGGLED; + if (hints & kParameterIsInteger) + portRangeHints[port].HintDescriptor |= LADSPA_HINT_INTEGER; + if (hints & kParameterIsLogarithmic) + portRangeHints[port].HintDescriptor |= LADSPA_HINT_LOGARITHMIC; + } + } + + // Set data + sLadspaDescriptor.UniqueID = plugin.getUniqueId(); + sLadspaDescriptor.Label = strdup(plugin.getLabel()); + sLadspaDescriptor.Name = strdup(plugin.getName()); + sLadspaDescriptor.Maker = strdup(plugin.getMaker()); + sLadspaDescriptor.Copyright = strdup(plugin.getLicense()); + sLadspaDescriptor.PortCount = portCount; + sLadspaDescriptor.PortNames = portNames; + sLadspaDescriptor.PortDescriptors = portDescriptors; + sLadspaDescriptor.PortRangeHints = portRangeHints; + } + + ~DescriptorInitializer() + { + if (sLadspaDescriptor.Label != nullptr) + { + std::free((void*)sLadspaDescriptor.Label); + sLadspaDescriptor.Label = nullptr; + } + + if (sLadspaDescriptor.Name != nullptr) + { + std::free((void*)sLadspaDescriptor.Name); + sLadspaDescriptor.Name = nullptr; + } + + if (sLadspaDescriptor.Maker != nullptr) + { + std::free((void*)sLadspaDescriptor.Maker); + sLadspaDescriptor.Maker = nullptr; + } + + if (sLadspaDescriptor.Copyright != nullptr) + { + std::free((void*)sLadspaDescriptor.Copyright); + sLadspaDescriptor.Copyright = nullptr; + } + + if (sLadspaDescriptor.PortDescriptors != nullptr) + { + delete[] sLadspaDescriptor.PortDescriptors; + sLadspaDescriptor.PortDescriptors = nullptr; + } + + if (sLadspaDescriptor.PortRangeHints != nullptr) + { + delete[] sLadspaDescriptor.PortRangeHints; + sLadspaDescriptor.PortRangeHints = nullptr; + } + + if (sLadspaDescriptor.PortNames != nullptr) + { + for (ulong i=0; i < sLadspaDescriptor.PortCount; ++i) + { + if (sLadspaDescriptor.PortNames[i] != nullptr) + std::free((void*)sLadspaDescriptor.PortNames[i]); + } + + delete[] sLadspaDescriptor.PortNames; + sLadspaDescriptor.PortNames = nullptr; + } + } +}; + +static DescriptorInitializer sDescInit; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +DISTRHO_PLUGIN_EXPORT +const LADSPA_Descriptor* ladspa_descriptor(ulong index) +{ + USE_NAMESPACE_DISTRHO + return (index == 0) ? &sLadspaDescriptor : nullptr; +} + +#ifdef DISTRHO_PLUGIN_TARGET_DSSI +DISTRHO_PLUGIN_EXPORT +const DSSI_Descriptor* dssi_descriptor(ulong index) +{ + USE_NAMESPACE_DISTRHO + return (index == 0) ? &sDssiDescriptor : nullptr; +} +#endif + +// ----------------------------------------------------------------------- diff --git a/dpf/distrho/src/DistrhoPluginLV2.cpp b/dpf/distrho/src/DistrhoPluginLV2.cpp new file mode 100644 index 0000000..bd2a522 --- /dev/null +++ b/dpf/distrho/src/DistrhoPluginLV2.cpp @@ -0,0 +1,1107 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "DistrhoPluginInternal.hpp" + +#include "lv2/atom.h" +#include "lv2/atom-util.h" +#include "lv2/buf-size.h" +#include "lv2/data-access.h" +#include "lv2/instance-access.h" +#include "lv2/midi.h" +#include "lv2/options.h" +#include "lv2/state.h" +#include "lv2/time.h" +#include "lv2/urid.h" +#include "lv2/worker.h" +#include "lv2/lv2_kxstudio_properties.h" +#include "lv2/lv2_programs.h" + +#ifdef noexcept +# undef noexcept +#endif + +#include + +#ifndef DISTRHO_PLUGIN_URI +# error DISTRHO_PLUGIN_URI undefined! +#endif + +#if DISTRHO_PLUGIN_WANT_TIMEPOS +# warning LV2 TimePos still TODO +#endif + +#define DISTRHO_LV2_USE_EVENTS_IN (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_TIMEPOS || (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)) +#define DISTRHO_LV2_USE_EVENTS_OUT (DISTRHO_PLUGIN_WANT_MIDI_OUTPUT || (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)) + +START_NAMESPACE_DISTRHO + +typedef std::map StringMap; + +// ----------------------------------------------------------------------- + +class PluginLv2 +{ +public: + PluginLv2(const double sampleRate, const LV2_URID_Map* const uridMap, const LV2_Worker_Schedule* const worker) + : fPortControls(nullptr), + fLastControlValues(nullptr), + fSampleRate(sampleRate), +#if DISTRHO_LV2_USE_EVENTS_IN || DISTRHO_LV2_USE_EVENTS_OUT +# if DISTRHO_PLUGIN_WANT_TIMEPOS + fLastTimeSpeed(0.0), +# endif + fURIDs(uridMap), +#endif + fUridMap(uridMap), + fWorker(worker) + { +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i) + fPortAudioIns[i] = nullptr; +#else + fPortAudioIns = nullptr; +#endif + +#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) + fPortAudioOuts[i] = nullptr; +#else + fPortAudioOuts = nullptr; +#endif + + if (const uint32_t count = fPlugin.getParameterCount()) + { + fPortControls = new float*[count]; + fLastControlValues = new float[count]; + + for (uint32_t i=0; i < count; ++i) + { + fPortControls[i] = nullptr; + fLastControlValues[i] = fPlugin.getParameterValue(i); + } + } + else + { + fPortControls = nullptr; + fLastControlValues = nullptr; + } + +#if DISTRHO_LV2_USE_EVENTS_IN + fPortEventsIn = nullptr; +#endif +#if DISTRHO_LV2_USE_EVENTS_OUT + fPortEventsOut = nullptr; +#endif +#if DISTRHO_PLUGIN_WANT_LATENCY + fPortLatency = nullptr; +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + if (const uint32_t count = fPlugin.getStateCount()) + { + fNeededUiSends = new bool[count]; + + for (uint32_t i=0; i < count; ++i) + { + fNeededUiSends[i] = false; + + const String& dkey(fPlugin.getStateKey(i)); + fStateMap[dkey] = fPlugin.getStateDefaultValue(i); + } + } + else + { + fNeededUiSends = nullptr; + } +#else + // unused + (void)fWorker; +#endif + +#if DISTRHO_PLUGIN_WANT_TIMEPOS + // hosts may not send all values, resulting on some invalid ones + fTimePosition.bbt.valid = false; + fTimePosition.bbt.bar = 1; + fTimePosition.bbt.beat = 1; + fTimePosition.bbt.tick = 0; + fTimePosition.bbt.barStartTick = 0; + fTimePosition.bbt.beatsPerBar = 4; + fTimePosition.bbt.beatType = 4; + fTimePosition.bbt.ticksPerBeat = 960.0; + fTimePosition.bbt.beatsPerMinute = 120.0; +#endif + } + + ~PluginLv2() + { + if (fPortControls != nullptr) + { + delete[] fPortControls; + fPortControls = nullptr; + } + + if (fLastControlValues) + { + delete[] fLastControlValues; + fLastControlValues = nullptr; + } + +#if DISTRHO_PLUGIN_WANT_STATE + if (fNeededUiSends != nullptr) + { + delete[] fNeededUiSends; + fNeededUiSends = nullptr; + } + + fStateMap.clear(); +#endif + } + + // ------------------------------------------------------------------- + + void lv2_activate() + { + fPlugin.activate(); + } + + void lv2_deactivate() + { + fPlugin.deactivate(); + } + + // ------------------------------------------------------------------- + + void lv2_connect_port(const uint32_t port, void* const dataLocation) + { + uint32_t index = 0; + +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i) + { + if (port == index++) + { + fPortAudioIns[i] = (const float*)dataLocation; + return; + } + } +#endif + +#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) + { + if (port == index++) + { + fPortAudioOuts[i] = (float*)dataLocation; + return; + } + } +#endif + +#if DISTRHO_LV2_USE_EVENTS_IN + if (port == index++) + { + fPortEventsIn = (LV2_Atom_Sequence*)dataLocation; + return; + } +#endif + +#if DISTRHO_LV2_USE_EVENTS_OUT + if (port == index++) + { + fPortEventsOut = (LV2_Atom_Sequence*)dataLocation; + return; + } +#endif + +#if DISTRHO_PLUGIN_WANT_LATENCY + if (port == index++) + { + fPortLatency = (float*)dataLocation; + return; + } +#endif + + for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) + { + if (port == index++) + { + fPortControls[i] = (float*)dataLocation; + return; + } + } + } + + // ------------------------------------------------------------------- + + void lv2_run(const uint32_t sampleCount) + { + // pre-roll + if (sampleCount == 0) + return updateParameterOutputs(); + + // Check for updated parameters + float curValue; + + for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) + { + if (fPortControls[i] == nullptr) + continue; + + curValue = *fPortControls[i]; + + if (fLastControlValues[i] != curValue && ! fPlugin.isParameterOutput(i)) + { + fLastControlValues[i] = curValue; + fPlugin.setParameterValue(i, curValue); + } + } + +#if DISTRHO_LV2_USE_EVENTS_IN +# if DISTRHO_PLUGIN_WANT_MIDI_INPUT + uint32_t midiEventCount = 0; +# endif + LV2_ATOM_SEQUENCE_FOREACH(fPortEventsIn, event) + { + if (event == nullptr) + break; + +# if DISTRHO_PLUGIN_WANT_MIDI_INPUT + if (event->body.type == fURIDs.midiEvent) + { + if (midiEventCount >= kMaxMidiEvents) + continue; + + const uint8_t* const data((const uint8_t*)(event + 1)); + + MidiEvent& midiEvent(fMidiEvents[midiEventCount]); + + midiEvent.frame = event->time.frames; + midiEvent.size = event->body.size; + + if (midiEvent.size > MidiEvent::kDataSize) + midiEvent.dataExt = data; + else + std::memcpy(midiEvent.data, data, midiEvent.size); + + ++midiEventCount; + continue; + } +# endif +# if DISTRHO_PLUGIN_WANT_TIMEPOS + if (event->body.type == fURIDs.atomBlank || event->body.type == fURIDs.atomObject) + { + const LV2_Atom_Object* const obj((const LV2_Atom_Object*)&event->body); + + if (obj->body.otype != fURIDs.timePosition) + continue; + + LV2_Atom* bar = nullptr; + LV2_Atom* barBeat = nullptr; + LV2_Atom* beat = nullptr; + LV2_Atom* beatUnit = nullptr; + LV2_Atom* beatsPerBar = nullptr; + LV2_Atom* beatsPerMinute = nullptr; + LV2_Atom* ticksPerBeat = nullptr; + LV2_Atom* frame = nullptr; + LV2_Atom* speed = nullptr; + + lv2_atom_object_get(obj, + fURIDs.timeBar, &bar, + fURIDs.timeBarBeat, &barBeat, + fURIDs.timeBeat, &beat, + fURIDs.timeBeatUnit, &beatUnit, + fURIDs.timeBeatsPerBar, &beatsPerBar, + fURIDs.timeBeatsPerMinute, &beatsPerMinute, + fURIDs.timeTicksPerBeat, &ticksPerBeat, + fURIDs.timeFrame, &frame, + fURIDs.timeSpeed, &speed, + nullptr); + + if (bar != nullptr) + { + /**/ if (bar->type == fURIDs.atomDouble) + fTimePosition.bbt.bar = ((LV2_Atom_Double*)bar)->body + 1.0; + else if (bar->type == fURIDs.atomFloat) + fTimePosition.bbt.bar = ((LV2_Atom_Float*)bar)->body + 1.0f; + else if (bar->type == fURIDs.atomInt) + fTimePosition.bbt.bar = ((LV2_Atom_Int*)bar)->body + 1; + else if (bar->type == fURIDs.atomLong) + fTimePosition.bbt.bar = ((LV2_Atom_Long*)bar)->body + 1; + else + d_stderr("Unknown lv2 bar value type"); + } + + if (ticksPerBeat != nullptr) + { + /**/ if (ticksPerBeat->type == fURIDs.atomDouble) + fTimePosition.bbt.ticksPerBeat = ((LV2_Atom_Double*)ticksPerBeat)->body; + else if (ticksPerBeat->type == fURIDs.atomFloat) + fTimePosition.bbt.ticksPerBeat = ((LV2_Atom_Float*)ticksPerBeat)->body; + else if (ticksPerBeat->type == fURIDs.atomInt) + fTimePosition.bbt.ticksPerBeat = ((LV2_Atom_Int*)ticksPerBeat)->body; + else if (ticksPerBeat->type == fURIDs.atomLong) + fTimePosition.bbt.ticksPerBeat = ((LV2_Atom_Long*)ticksPerBeat)->body; + else + d_stderr("Unknown lv2 ticksPerBeat value type"); + } + + if (barBeat != nullptr) + { + double barBeatValue = 0.0; + + /**/ if (barBeat->type == fURIDs.atomDouble) + barBeatValue = ((LV2_Atom_Double*)barBeat)->body; + else if (barBeat->type == fURIDs.atomFloat) + barBeatValue = ((LV2_Atom_Float*)barBeat)->body; + else if (barBeat->type == fURIDs.atomInt) + barBeatValue = ((LV2_Atom_Int*)barBeat)->body; + else if (barBeat->type == fURIDs.atomLong) + barBeatValue = ((LV2_Atom_Long*)barBeat)->body; + else + d_stderr("Unknown lv2 barBeat value type"); + + const double rest = std::fmod(barBeatValue, 1.0); + fTimePosition.bbt.beat = barBeatValue-rest+1.0; + fTimePosition.bbt.tick = rest*fTimePosition.bbt.ticksPerBeat+0.5; + } + // barBeat includes beat + else if (beat != nullptr) + { + /**/ if (beat->type == fURIDs.atomDouble) + fTimePosition.bbt.beat = ((LV2_Atom_Double*)beat)->body + 1.0; + else if (beat->type == fURIDs.atomFloat) + fTimePosition.bbt.beat = ((LV2_Atom_Float*)beat)->body + 1.0f; + else if (beat->type == fURIDs.atomInt) + fTimePosition.bbt.beat = ((LV2_Atom_Int*)beat)->body + 1; + else if (beat->type == fURIDs.atomLong) + fTimePosition.bbt.beat = ((LV2_Atom_Long*)beat)->body + 1; + else + d_stderr("Unknown lv2 beat value type"); + } + + if (beatUnit != nullptr) + { + /**/ if (beatUnit->type == fURIDs.atomDouble) + fTimePosition.bbt.beatType = ((LV2_Atom_Double*)beatUnit)->body; + else if (beatUnit->type == fURIDs.atomFloat) + fTimePosition.bbt.beatType = ((LV2_Atom_Float*)beatUnit)->body; + else if (beatUnit->type == fURIDs.atomInt) + fTimePosition.bbt.beatType = ((LV2_Atom_Int*)beatUnit)->body; + else if (beatUnit->type == fURIDs.atomLong) + fTimePosition.bbt.beatType = ((LV2_Atom_Long*)beatUnit)->body; + else + d_stderr("Unknown lv2 beatUnit value type"); + } + + if (beatsPerBar != nullptr) + { + /**/ if (beatsPerBar->type == fURIDs.atomDouble) + fTimePosition.bbt.beatsPerBar = ((LV2_Atom_Double*)beatsPerBar)->body; + else if (beatsPerBar->type == fURIDs.atomFloat) + fTimePosition.bbt.beatsPerBar = ((LV2_Atom_Float*)beatsPerBar)->body; + else if (beatsPerBar->type == fURIDs.atomInt) + fTimePosition.bbt.beatsPerBar = ((LV2_Atom_Int*)beatsPerBar)->body; + else if (beatsPerBar->type == fURIDs.atomLong) + fTimePosition.bbt.beatsPerBar = ((LV2_Atom_Long*)beatsPerBar)->body; + else + d_stderr("Unknown lv2 beatsPerBar value type"); + } + + if (beatsPerMinute != nullptr) + { + /**/ if (beatsPerMinute->type == fURIDs.atomDouble) + fTimePosition.bbt.beatsPerMinute = ((LV2_Atom_Double*)beatsPerMinute)->body; + else if (beatsPerMinute->type == fURIDs.atomFloat) + fTimePosition.bbt.beatsPerMinute = ((LV2_Atom_Float*)beatsPerMinute)->body; + else if (beatsPerMinute->type == fURIDs.atomInt) + fTimePosition.bbt.beatsPerMinute = ((LV2_Atom_Int*)beatsPerMinute)->body; + else if (beatsPerMinute->type == fURIDs.atomLong) + fTimePosition.bbt.beatsPerMinute = ((LV2_Atom_Long*)beatsPerMinute)->body; + else + d_stderr("Unknown lv2 beatsPerMinute value type"); + } + + fTimePosition.bbt.barStartTick = fTimePosition.bbt.ticksPerBeat*fTimePosition.bbt.beatsPerBar*(fTimePosition.bbt.bar-1); + + if (frame != nullptr && frame->type == fURIDs.atomLong) + fTimePosition.frame = ((LV2_Atom_Long*)frame)->body; + + if (speed != nullptr && speed->type == fURIDs.atomFloat) + { + fLastTimeSpeed = ((LV2_Atom_Float*)speed)->body; + fTimePosition.playing = (fLastTimeSpeed == 1.0); + } + + fTimePosition.bbt.valid = (beatsPerMinute != nullptr && beatsPerBar != nullptr && beatUnit != nullptr); + continue; + } +# endif +# if (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI) + if (event->body.type == fURIDs.distrhoState && fWorker != nullptr) + { + const void* const data((const void*)(event + 1)); + + // check if this is our special message + if (std::strcmp((const char*)data, "__dpf_ui_data__") == 0) + { + for (uint32_t i=0, count=fPlugin.getStateCount(); i < count; ++i) + fNeededUiSends[i] = true; + } + else + // no, send to DSP as usual + { + fWorker->schedule_work(fWorker->handle, event->body.size, data); + } + + continue; + } +# endif + } +#endif + +# if DISTRHO_PLUGIN_WANT_TIMEPOS + fPlugin.setTimePosition(fTimePosition); +# endif + +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + fPlugin.run(fPortAudioIns, fPortAudioOuts, sampleCount, fMidiEvents, midiEventCount); +#else + fPlugin.run(fPortAudioIns, fPortAudioOuts, sampleCount); +#endif + +# if DISTRHO_PLUGIN_WANT_TIMEPOS + // update timePos for next callback + if (fLastTimeSpeed != 0.0) + { + const double newFrames = fLastTimeSpeed*sampleCount; + + fTimePosition.frame += newFrames; + + if (fTimePosition.bbt.valid) + { + const double samplesPerBeat = 60.0 / fTimePosition.bbt.beatsPerMinute * fSampleRate; + const double ticksPerSample = fTimePosition.bbt.ticksPerBeat / samplesPerBeat; + + double newTickPos = double(fTimePosition.bbt.tick) + ticksPerSample*newFrames; + double newBeatPos = double(fTimePosition.bbt.beat)-1.0; + double newBarPos = double(fTimePosition.bbt.bar)-1.0; + + for (; newTickPos >= fTimePosition.bbt.ticksPerBeat;) + { + ++newBeatPos; + newTickPos -= fTimePosition.bbt.ticksPerBeat; + } + + for (; newBeatPos >= fTimePosition.bbt.beatsPerBar;) + { + ++newBarPos; + newBeatPos -= fTimePosition.bbt.beatsPerBar; + } + + fTimePosition.bbt.bar = newBarPos+1.0; + fTimePosition.bbt.beat = newBeatPos+1.0; + fTimePosition.bbt.tick = newTickPos; + fTimePosition.bbt.barStartTick = fTimePosition.bbt.ticksPerBeat*fTimePosition.bbt.beatsPerBar*(fTimePosition.bbt.bar-1); + } + } +# endif + + updateParameterOutputs(); + +#if DISTRHO_LV2_USE_EVENTS_OUT + const uint32_t capacity = fPortEventsOut->atom.size; + + bool needsInit = true; + uint32_t size, offset = 0; + LV2_Atom_Event* aev; + +# if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + // TODO +# endif +# if (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI) + for (uint32_t i=0, count=fPlugin.getStateCount(); i < count; ++i) + { + if (! fNeededUiSends[i]) + continue; + + const String& key = fPlugin.getStateKey(i); + + for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) + { + const String& curKey = cit->first; + + if (curKey != key) + continue; + + const String& value = cit->second; + + // set msg size (key + value + separator + 2x null terminator) + const size_t msgSize(key.length()+value.length()+3); + + if (sizeof(LV2_Atom_Event) + msgSize > capacity - offset) + break; + + if (needsInit) + { + fPortEventsOut->atom.size = 0; + fPortEventsOut->atom.type = fURIDs.atomSequence; + fPortEventsOut->body.unit = 0; + fPortEventsOut->body.pad = 0; + needsInit = false; + } + + // reserve msg space + char msgBuf[msgSize]; + std::memset(msgBuf, 0, msgSize); + + // write key and value in atom bufer + std::memcpy(msgBuf, key.buffer(), key.length()); + std::memcpy(msgBuf+(key.length()+1), value.buffer(), value.length()); + + // put data + aev = (LV2_Atom_Event*)(LV2_ATOM_CONTENTS(LV2_Atom_Sequence, fPortEventsOut) + offset); + aev->time.frames = 0; + aev->body.type = fURIDs.distrhoState; + aev->body.size = msgSize; + std::memcpy(LV2_ATOM_BODY(&aev->body), msgBuf, msgSize-1); + + size = lv2_atom_pad_size(sizeof(LV2_Atom_Event) + msgSize); + offset += size; + fPortEventsOut->atom.size += size; + + fNeededUiSends[i] = false; + break; + } + } +# endif +#endif + } + + // ------------------------------------------------------------------- + + uint32_t lv2_get_options(LV2_Options_Option* const /*options*/) + { + // currently unused + return LV2_OPTIONS_ERR_UNKNOWN; + } + + uint32_t lv2_set_options(const LV2_Options_Option* const options) + { + for (int i=0; options[i].key != 0; ++i) + { + if (options[i].key == fUridMap->map(fUridMap->handle, LV2_BUF_SIZE__maxBlockLength)) + { + if (options[i].type == fUridMap->map(fUridMap->handle, LV2_ATOM__Int)) + { + const int bufferSize(*(const int*)options[i].value); + fPlugin.setBufferSize(bufferSize); + continue; + } + else + { + d_stderr("Host changed maxBlockLength but with wrong value type"); + continue; + } + } + else if (options[i].key == fUridMap->map(fUridMap->handle, LV2_CORE__sampleRate)) + { + if (options[i].type == fUridMap->map(fUridMap->handle, LV2_ATOM__Double)) + { + const double sampleRate(*(const double*)options[i].value); + fSampleRate = sampleRate; + fPlugin.setSampleRate(sampleRate); + continue; + } + else + { + d_stderr("Host changed sampleRate but with wrong value type"); + continue; + } + } + } + + return LV2_OPTIONS_SUCCESS; + } + + // ------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + const LV2_Program_Descriptor* lv2_get_program(const uint32_t index) + { + if (index >= fPlugin.getProgramCount()) + return nullptr; + + static LV2_Program_Descriptor desc; + + desc.bank = index / 128; + desc.program = index % 128; + desc.name = fPlugin.getProgramName(index); + + return &desc; + } + + void lv2_select_program(const uint32_t bank, const uint32_t program) + { + const uint32_t realProgram(bank * 128 + program); + + if (realProgram >= fPlugin.getProgramCount()) + return; + + fPlugin.loadProgram(realProgram); + + // Update control inputs + for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) + { + if (fPlugin.isParameterOutput(i)) + continue; + + fLastControlValues[i] = fPlugin.getParameterValue(i); + + if (fPortControls[i] != nullptr) + *fPortControls[i] = fLastControlValues[i]; + } + } +#endif + + // ------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_WANT_STATE + LV2_State_Status lv2_save(const LV2_State_Store_Function store, const LV2_State_Handle handle) + { + for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) + { + const String& key = cit->first; + const String& value = cit->second; + + const String urnKey("urn:distrho:" + key); + + // some hosts need +1 for the null terminator, even though the type is string + store(handle, fUridMap->map(fUridMap->handle, urnKey.buffer()), value.buffer(), value.length()+1, fURIDs.atomString, LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE); + } + + return LV2_STATE_SUCCESS; + } + + LV2_State_Status lv2_restore(const LV2_State_Retrieve_Function retrieve, const LV2_State_Handle handle) + { + size_t size; + uint32_t type, flags; + + for (uint32_t i=0, count=fPlugin.getStateCount(); i < count; ++i) + { + const String& key(fPlugin.getStateKey(i)); + const String urnKey("urn:distrho:" + key); + + size = 0; + type = 0; + flags = LV2_STATE_IS_POD|LV2_STATE_IS_PORTABLE; + const void* data = retrieve(handle, fUridMap->map(fUridMap->handle, urnKey.buffer()), &size, &type, &flags); + + if (data == nullptr || size == 0) + continue; + + DISTRHO_SAFE_ASSERT_CONTINUE(type == fURIDs.atomString); + + const char* const value((const char*)data); + const std::size_t length(std::strlen(value)); + DISTRHO_SAFE_ASSERT_CONTINUE(length == size || length+1 == size); + + setState(key, value); + +#if DISTRHO_LV2_USE_EVENTS_OUT + // signal msg needed for UI + fNeededUiSends[i] = true; +#endif + } + + return LV2_STATE_SUCCESS; + } + + // ------------------------------------------------------------------- + + LV2_Worker_Status lv2_work(const void* const data) + { + const char* const key((const char*)data); + const char* const value(key+std::strlen(key)+1); + + setState(key, value); + + return LV2_WORKER_SUCCESS; + } +#endif + + // ------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + void* lv2_get_instance_pointer() + { + return fPlugin.getInstancePointer(); + } +#endif + + // ------------------------------------------------------------------- + +private: + PluginExporter fPlugin; + + // LV2 ports +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + const float* fPortAudioIns[DISTRHO_PLUGIN_NUM_INPUTS]; +#else + const float** fPortAudioIns; +#endif +#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + float* fPortAudioOuts[DISTRHO_PLUGIN_NUM_OUTPUTS]; +#else + float** fPortAudioOuts; +#endif + float** fPortControls; +#if DISTRHO_LV2_USE_EVENTS_IN + LV2_Atom_Sequence* fPortEventsIn; +#endif +#if DISTRHO_LV2_USE_EVENTS_OUT + LV2_Atom_Sequence* fPortEventsOut; +#endif +#if DISTRHO_PLUGIN_WANT_LATENCY + float* fPortLatency; +#endif + + // Temporary data + float* fLastControlValues; + double fSampleRate; +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + MidiEvent fMidiEvents[kMaxMidiEvents]; +#endif +#if DISTRHO_PLUGIN_WANT_TIMEPOS + TimePosition fTimePosition; + double fLastTimeSpeed; +#endif + + // LV2 URIDs +#if DISTRHO_LV2_USE_EVENTS_IN || DISTRHO_LV2_USE_EVENTS_OUT + struct URIDs { + LV2_URID atomBlank; + LV2_URID atomObject; + LV2_URID atomDouble; + LV2_URID atomFloat; + LV2_URID atomInt; + LV2_URID atomLong; + LV2_URID atomSequence; + LV2_URID atomString; + LV2_URID distrhoState; + LV2_URID midiEvent; + LV2_URID timePosition; + LV2_URID timeBar; + LV2_URID timeBarBeat; + LV2_URID timeBeat; + LV2_URID timeBeatUnit; + LV2_URID timeBeatsPerBar; + LV2_URID timeBeatsPerMinute; + LV2_URID timeTicksPerBeat; + LV2_URID timeFrame; + LV2_URID timeSpeed; + + URIDs(const LV2_URID_Map* const uridMap) + : atomBlank(uridMap->map(uridMap->handle, LV2_ATOM__Blank)), + atomObject(uridMap->map(uridMap->handle, LV2_ATOM__Object)), + atomDouble(uridMap->map(uridMap->handle, LV2_ATOM__Double)), + atomFloat(uridMap->map(uridMap->handle, LV2_ATOM__Float)), + atomInt(uridMap->map(uridMap->handle, LV2_ATOM__Int)), + atomLong(uridMap->map(uridMap->handle, LV2_ATOM__Long)), + atomSequence(uridMap->map(uridMap->handle, LV2_ATOM__Sequence)), + atomString(uridMap->map(uridMap->handle, LV2_ATOM__String)), + distrhoState(uridMap->map(uridMap->handle, "urn:distrho:keyValueState")), + midiEvent(uridMap->map(uridMap->handle, LV2_MIDI__MidiEvent)), + timePosition(uridMap->map(uridMap->handle, LV2_TIME__Position)), + timeBar(uridMap->map(uridMap->handle, LV2_TIME__bar)), + timeBarBeat(uridMap->map(uridMap->handle, LV2_TIME__barBeat)), + timeBeat(uridMap->map(uridMap->handle, LV2_TIME__beat)), + timeBeatUnit(uridMap->map(uridMap->handle, LV2_TIME__beatUnit)), + timeBeatsPerBar(uridMap->map(uridMap->handle, LV2_TIME__beatsPerBar)), + timeBeatsPerMinute(uridMap->map(uridMap->handle, LV2_TIME__beatsPerMinute)), + timeTicksPerBeat(uridMap->map(uridMap->handle, LV2_KXSTUDIO_PROPERTIES__TimePositionTicksPerBeat)), + timeFrame(uridMap->map(uridMap->handle, LV2_TIME__frame)), + timeSpeed(uridMap->map(uridMap->handle, LV2_TIME__speed)) {} + } fURIDs; +#endif + + // LV2 features + const LV2_URID_Map* const fUridMap; + const LV2_Worker_Schedule* const fWorker; + +#if DISTRHO_PLUGIN_WANT_STATE + StringMap fStateMap; + bool* fNeededUiSends; + + void setState(const char* const key, const char* const newValue) + { + fPlugin.setState(key, newValue); + + // check if we want to save this key + if (! fPlugin.wantStateKey(key)) + return; + + // check if key already exists + for (StringMap::iterator it=fStateMap.begin(), ite=fStateMap.end(); it != ite; ++it) + { + const String& dkey(it->first); + + if (dkey == key) + { + it->second = newValue; + return; + } + } + + d_stderr("Failed to find plugin state with key \"%s\"", key); + } +#endif + + void updateParameterOutputs() + { + for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) + { + if (! fPlugin.isParameterOutput(i)) + continue; + + fLastControlValues[i] = fPlugin.getParameterValue(i); + + if (fPortControls[i] != nullptr) + *fPortControls[i] = fLastControlValues[i]; + } + +#if DISTRHO_PLUGIN_WANT_LATENCY + if (fPortLatency != nullptr) + *fPortLatency = fPlugin.getLatency(); +#endif + } +}; + +// ----------------------------------------------------------------------- + +static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, const char*, const LV2_Feature* const* features) +{ + const LV2_Options_Option* options = nullptr; + const LV2_URID_Map* uridMap = nullptr; + const LV2_Worker_Schedule* worker = nullptr; + + for (int i=0; features[i] != nullptr; ++i) + { + if (std::strcmp(features[i]->URI, LV2_OPTIONS__options) == 0) + options = (const LV2_Options_Option*)features[i]->data; + else if (std::strcmp(features[i]->URI, LV2_URID__map) == 0) + uridMap = (const LV2_URID_Map*)features[i]->data; + else if (std::strcmp(features[i]->URI, LV2_WORKER__schedule) == 0) + worker = (const LV2_Worker_Schedule*)features[i]->data; + } + + if (options == nullptr) + { + d_stderr("Options feature missing, cannot continue!"); + return nullptr; + } + + if (uridMap == nullptr) + { + d_stderr("URID Map feature missing, cannot continue!"); + return nullptr; + } + +#if DISTRHO_PLUGIN_WANT_STATE + if (worker == nullptr) + { + d_stderr("Worker feature missing, cannot continue!"); + return nullptr; + } +#endif + + d_lastBufferSize = 0; + + for (int i=0; options[i].key != 0; ++i) + { + if (options[i].key == uridMap->map(uridMap->handle, LV2_BUF_SIZE__maxBlockLength)) + { + if (options[i].type == uridMap->map(uridMap->handle, LV2_ATOM__Int)) + d_lastBufferSize = *(const int*)options[i].value; + else + d_stderr("Host provides maxBlockLength but has wrong value type"); + + break; + } + } + + if (d_lastBufferSize == 0) + { + d_stderr("Host does not provide maxBlockLength option"); + d_lastBufferSize = 2048; + } + + d_lastSampleRate = sampleRate; + + return new PluginLv2(sampleRate, uridMap, worker); +} + +#define instancePtr ((PluginLv2*)instance) + +static void lv2_connect_port(LV2_Handle instance, uint32_t port, void* dataLocation) +{ + instancePtr->lv2_connect_port(port, dataLocation); +} + +static void lv2_activate(LV2_Handle instance) +{ + instancePtr->lv2_activate(); +} + +static void lv2_run(LV2_Handle instance, uint32_t sampleCount) +{ + instancePtr->lv2_run(sampleCount); +} + +static void lv2_deactivate(LV2_Handle instance) +{ + instancePtr->lv2_deactivate(); +} + +static void lv2_cleanup(LV2_Handle instance) +{ + delete instancePtr; +} + +// ----------------------------------------------------------------------- + +static uint32_t lv2_get_options(LV2_Handle instance, LV2_Options_Option* options) +{ + return instancePtr->lv2_get_options(options); +} + +static uint32_t lv2_set_options(LV2_Handle instance, const LV2_Options_Option* options) +{ + return instancePtr->lv2_set_options(options); +} + +// ----------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_WANT_PROGRAMS +static const LV2_Program_Descriptor* lv2_get_program(LV2_Handle instance, uint32_t index) +{ + return instancePtr->lv2_get_program(index); +} + +static void lv2_select_program(LV2_Handle instance, uint32_t bank, uint32_t program) +{ + instancePtr->lv2_select_program(bank, program); +} +#endif + +// ----------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_WANT_STATE +static LV2_State_Status lv2_save(LV2_Handle instance, LV2_State_Store_Function store, LV2_State_Handle handle, uint32_t, const LV2_Feature* const*) +{ + return instancePtr->lv2_save(store, handle); +} + +static LV2_State_Status lv2_restore(LV2_Handle instance, LV2_State_Retrieve_Function retrieve, LV2_State_Handle handle, uint32_t, const LV2_Feature* const*) +{ + return instancePtr->lv2_restore(retrieve, handle); +} + +LV2_Worker_Status lv2_work(LV2_Handle instance, LV2_Worker_Respond_Function, LV2_Worker_Respond_Handle, uint32_t, const void* data) +{ + return instancePtr->lv2_work(data); +} +#endif + +// ----------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS +static void* lv2_get_instance_pointer(LV2_Handle instance) +{ + return instancePtr->lv2_get_instance_pointer(); +} +#endif + +// ----------------------------------------------------------------------- + +static const void* lv2_extension_data(const char* uri) +{ + static const LV2_Options_Interface options = { lv2_get_options, lv2_set_options }; + + if (std::strcmp(uri, LV2_OPTIONS__interface) == 0) + return &options; + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + static const LV2_Programs_Interface programs = { lv2_get_program, lv2_select_program }; + + if (std::strcmp(uri, LV2_PROGRAMS__Interface) == 0) + return &programs; +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + static const LV2_State_Interface state = { lv2_save, lv2_restore }; + static const LV2_Worker_Interface worker = { lv2_work, nullptr, nullptr }; + + if (std::strcmp(uri, LV2_STATE__interface) == 0) + return &state; + if (std::strcmp(uri, LV2_WORKER__interface) == 0) + return &worker; +#endif + +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS +# define DISTRHO_DIRECT_ACCESS_URI "urn:distrho:direct-access" + + struct LV2_DirectAccess_Interface { + void* (*get_instance_pointer)(LV2_Handle handle); + }; + + static const LV2_DirectAccess_Interface directaccess = { lv2_get_instance_pointer }; + + if (std::strcmp(uri, DISTRHO_DIRECT_ACCESS_URI) == 0) + return &directaccess; +#endif + + return nullptr; +} + +#undef instancePtr + +// ----------------------------------------------------------------------- + +static const LV2_Descriptor sLv2Descriptor = { + DISTRHO_PLUGIN_URI, + lv2_instantiate, + lv2_connect_port, + lv2_activate, + lv2_run, + lv2_deactivate, + lv2_cleanup, + lv2_extension_data +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +DISTRHO_PLUGIN_EXPORT +const LV2_Descriptor* lv2_descriptor(uint32_t index) +{ + USE_NAMESPACE_DISTRHO + return (index == 0) ? &sLv2Descriptor : nullptr; +} + +// ----------------------------------------------------------------------- diff --git a/dpf/distrho/src/DistrhoPluginLV2export.cpp b/dpf/distrho/src/DistrhoPluginLV2export.cpp new file mode 100644 index 0000000..9508b43 --- /dev/null +++ b/dpf/distrho/src/DistrhoPluginLV2export.cpp @@ -0,0 +1,431 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "DistrhoPluginInternal.hpp" + +#include "lv2/atom.h" +#include "lv2/buf-size.h" +#include "lv2/data-access.h" +#include "lv2/instance-access.h" +#include "lv2/midi.h" +#include "lv2/options.h" +#include "lv2/port-props.h" +#include "lv2/resize-port.h" +#include "lv2/state.h" +#include "lv2/time.h" +#include "lv2/ui.h" +#include "lv2/units.h" +#include "lv2/urid.h" +#include "lv2/worker.h" +#include "lv2/lv2_kxstudio_properties.h" +#include "lv2/lv2_programs.h" + +#include +#include + +#ifndef DISTRHO_PLUGIN_URI +# error DISTRHO_PLUGIN_URI undefined! +#endif + +#ifndef DISTRHO_PLUGIN_MINIMUM_BUFFER_SIZE +# define DISTRHO_PLUGIN_MINIMUM_BUFFER_SIZE 2048 +#endif + +#if DISTRHO_PLUGIN_HAS_UI && ! defined(HAVE_DGL) +# undef DISTRHO_PLUGIN_HAS_UI +# define DISTRHO_PLUGIN_HAS_UI 0 +#endif + +#define DISTRHO_LV2_USE_EVENTS_IN (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_TIMEPOS || (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)) +#define DISTRHO_LV2_USE_EVENTS_OUT (DISTRHO_PLUGIN_WANT_MIDI_OUTPUT || (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)) + +// ----------------------------------------------------------------------- + +DISTRHO_PLUGIN_EXPORT +void lv2_generate_ttl(const char* const basename) +{ + USE_NAMESPACE_DISTRHO + + // Dummy plugin to get data from + d_lastBufferSize = 512; + d_lastSampleRate = 44100.0; + PluginExporter plugin; + d_lastBufferSize = 0; + d_lastSampleRate = 0.0; + + String pluginDLL(basename); + String pluginTTL(pluginDLL + ".ttl"); + + // --------------------------------------------- + + { + std::cout << "Writing manifest.ttl..."; std::cout.flush(); + std::fstream manifestFile("manifest.ttl", std::ios::out); + + String manifestString; + manifestString += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; + manifestString += "@prefix rdfs: .\n"; +#if DISTRHO_PLUGIN_HAS_UI + manifestString += "@prefix ui: <" LV2_UI_PREFIX "> .\n"; +#endif + manifestString += "\n"; + + manifestString += "<" DISTRHO_PLUGIN_URI ">\n"; + manifestString += " a lv2:Plugin ;\n"; + manifestString += " lv2:binary <" + pluginDLL + "." DISTRHO_DLL_EXTENSION "> ;\n"; + manifestString += " rdfs:seeAlso <" + pluginTTL + "> .\n"; + manifestString += "\n"; + +#if DISTRHO_PLUGIN_HAS_UI + manifestString += "<" DISTRHO_UI_URI ">\n"; +# if DISTRHO_OS_HAIKU + manifestString += " a ui:BeUI ;\n"; +# elif DISTRHO_OS_MAC + manifestString += " a ui:CocoaUI ;\n"; +# elif DISTRHO_OS_WINDOWS + manifestString += " a ui:WindowsUI ;\n"; +# else + manifestString += " a ui:X11UI ;\n"; +# endif +# if ! DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + String pluginUI(pluginDLL); + pluginUI.truncate(pluginDLL.rfind("_dsp")); + pluginUI += "_ui"; + + manifestString += " ui:binary <" + pluginUI + "." DISTRHO_DLL_EXTENSION "> ;\n"; +# else + manifestString += " ui:binary <" + pluginDLL + "." DISTRHO_DLL_EXTENSION "> ;\n"; +#endif + manifestString += "\n"; + manifestString += " lv2:extensionData ui:idleInterface ,\n"; +# if DISTRHO_PLUGIN_WANT_PROGRAMS + manifestString += " ui:showInterface ,\n"; + manifestString += " <" LV2_PROGRAMS__Interface "> ;\n"; +# else + manifestString += " ui:showInterface ;\n"; +# endif + manifestString += "\n"; + manifestString += " lv2:optionalFeature ui:noUserResize ,\n"; + manifestString += " ui:resize ,\n"; + manifestString += " ui:touch ;\n"; + manifestString += "\n"; +# if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + manifestString += " lv2:requiredFeature <" LV2_DATA_ACCESS_URI "> ,\n"; + manifestString += " <" LV2_INSTANCE_ACCESS_URI "> ,\n"; + manifestString += " <" LV2_OPTIONS__options "> ,\n"; +# else + manifestString += " lv2:requiredFeature <" LV2_OPTIONS__options "> ,\n"; +# endif + manifestString += " <" LV2_URID__map "> .\n"; +#endif + + manifestFile << manifestString << std::endl; + manifestFile.close(); + std::cout << " done!" << std::endl; + } + + // --------------------------------------------- + + { + std::cout << "Writing " << pluginTTL << "..."; std::cout.flush(); + std::fstream pluginFile(pluginTTL, std::ios::out); + + String pluginString; + + // header +#if DISTRHO_LV2_USE_EVENTS_IN + pluginString += "@prefix atom: <" LV2_ATOM_PREFIX "> .\n"; +#endif + pluginString += "@prefix doap: .\n"; + pluginString += "@prefix foaf: .\n"; + pluginString += "@prefix lv2: <" LV2_CORE_PREFIX "> .\n"; + pluginString += "@prefix rsz: <" LV2_RESIZE_PORT_PREFIX "> .\n"; +#if DISTRHO_PLUGIN_HAS_UI + pluginString += "@prefix ui: <" LV2_UI_PREFIX "> .\n"; +#endif + pluginString += "@prefix unit: <" LV2_UNITS_PREFIX "> .\n"; + pluginString += "\n"; + + // plugin + pluginString += "<" DISTRHO_PLUGIN_URI ">\n"; +#if DISTRHO_PLUGIN_IS_SYNTH + pluginString += " a lv2:InstrumentPlugin, lv2:Plugin ;\n"; +#else + pluginString += " a lv2:Plugin ;\n"; +#endif + pluginString += "\n"; + + // extensionData + pluginString += " lv2:extensionData <" LV2_STATE__interface "> "; +#if DISTRHO_PLUGIN_WANT_STATE + pluginString += ",\n <" LV2_OPTIONS__interface "> "; + pluginString += ",\n <" LV2_WORKER__interface "> "; +#endif +#if DISTRHO_PLUGIN_WANT_PROGRAMS + pluginString += ",\n <" LV2_PROGRAMS__Interface "> "; +#endif + pluginString += ";\n\n"; + + // optionalFeatures +#if DISTRHO_PLUGIN_IS_RT_SAFE + pluginString += " lv2:optionalFeature <" LV2_CORE__hardRTCapable "> ,\n"; + pluginString += " <" LV2_BUF_SIZE__boundedBlockLength "> ;\n"; +#else + pluginString += " lv2:optionalFeature <" LV2_BUF_SIZE__boundedBlockLength "> ;\n"; +#endif + pluginString += "\n"; + + // requiredFeatures + pluginString += " lv2:requiredFeature <" LV2_OPTIONS__options "> "; + pluginString += ",\n <" LV2_URID__map "> "; +#if DISTRHO_PLUGIN_WANT_STATE + pluginString += ",\n <" LV2_WORKER__schedule "> "; +#endif + pluginString += ";\n\n"; + + // UI +#if DISTRHO_PLUGIN_HAS_UI + pluginString += " ui:ui <" DISTRHO_UI_URI "> ;\n"; + pluginString += "\n"; +#endif + + { + uint32_t portIndex = 0; + +#if DISTRHO_PLUGIN_NUM_INPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_INPUTS; ++i, ++portIndex) + { + const AudioPort& port(plugin.getAudioPort(true, i)); + + if (i == 0) + pluginString += " lv2:port [\n"; + else + pluginString += " [\n"; + + if (port.hints & kAudioPortIsCV) + pluginString += " a lv2:InputPort, lv2:CVPort ;\n"; + else + pluginString += " a lv2:InputPort, lv2:AudioPort ;\n"; + + pluginString += " lv2:index " + String(portIndex) + " ;\n"; + pluginString += " lv2:symbol \"" + port.symbol + "\" ;\n"; + pluginString += " lv2:name \"" + port.name + "\" ;\n"; + + if (port.hints & kAudioPortIsSidechain) + pluginString += " lv2:portProperty lv2:isSideChain;\n"; + + if (i+1 == DISTRHO_PLUGIN_NUM_INPUTS) + pluginString += " ] ;\n"; + else + pluginString += " ] ,\n"; + } + pluginString += "\n"; +#endif + +#if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + for (uint32_t i=0; i < DISTRHO_PLUGIN_NUM_OUTPUTS; ++i, ++portIndex) + { + const AudioPort& port(plugin.getAudioPort(false, i)); + + if (i == 0) + pluginString += " lv2:port [\n"; + else + pluginString += " [\n"; + + if (port.hints & kAudioPortIsCV) + pluginString += " a lv2:OutputPort, lv2:CVPort ;\n"; + else + pluginString += " a lv2:OutputPort, lv2:AudioPort ;\n"; + + pluginString += " lv2:index " + String(portIndex) + " ;\n"; + pluginString += " lv2:symbol \"" + port.symbol + "\" ;\n"; + pluginString += " lv2:name \"" + port.name + "\" ;\n"; + + if (port.hints & kAudioPortIsSidechain) + pluginString += " lv2:portProperty lv2:isSideChain;\n"; + + if (i+1 == DISTRHO_PLUGIN_NUM_OUTPUTS) + pluginString += " ] ;\n"; + else + pluginString += " ] ,\n"; + } + pluginString += "\n"; +#endif + +#if DISTRHO_LV2_USE_EVENTS_IN + pluginString += " lv2:port [\n"; + pluginString += " a lv2:InputPort, atom:AtomPort ;\n"; + pluginString += " lv2:index " + String(portIndex) + " ;\n"; + pluginString += " lv2:name \"Events Input\" ;\n"; + pluginString += " lv2:symbol \"lv2_events_in\" ;\n"; + pluginString += " rsz:minimumSize " + String(DISTRHO_PLUGIN_MINIMUM_BUFFER_SIZE) + " ;\n"; + pluginString += " atom:bufferType atom:Sequence ;\n"; +# if (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI) + pluginString += " atom:supports <" LV2_ATOM__String "> ;\n"; +# endif +# if DISTRHO_PLUGIN_WANT_MIDI_INPUT + pluginString += " atom:supports <" LV2_MIDI__MidiEvent "> ;\n"; +# endif +# if DISTRHO_PLUGIN_WANT_TIMEPOS + pluginString += " atom:supports <" LV2_TIME__Position "> ;\n"; +# endif + pluginString += " ] ;\n\n"; + ++portIndex; +#endif + +#if DISTRHO_LV2_USE_EVENTS_OUT + pluginString += " lv2:port [\n"; + pluginString += " a lv2:OutputPort, atom:AtomPort ;\n"; + pluginString += " lv2:index " + String(portIndex) + " ;\n"; + pluginString += " lv2:name \"Events Output\" ;\n"; + pluginString += " lv2:symbol \"lv2_events_out\" ;\n"; + pluginString += " rsz:minimumSize " + String(DISTRHO_PLUGIN_MINIMUM_BUFFER_SIZE) + " ;\n"; + pluginString += " atom:bufferType atom:Sequence ;\n"; +# if (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI) + pluginString += " atom:supports <" LV2_ATOM__String "> ;\n"; +# endif +# if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + pluginString += " atom:supports <" LV2_MIDI__MidiEvent "> ;\n"; +# endif + pluginString += " ] ;\n\n"; + ++portIndex; +#endif + +#if DISTRHO_PLUGIN_WANT_LATENCY + pluginString += " lv2:port [\n"; + pluginString += " a lv2:OutputPort, lv2:ControlPort ;\n"; + pluginString += " lv2:index " + String(portIndex) + " ;\n"; + pluginString += " lv2:name \"Latency\" ;\n"; + pluginString += " lv2:symbol \"lv2_latency\" ;\n"; + pluginString += " lv2:designation lv2:latency ;\n"; + pluginString += " lv2:portProperty lv2:reportsLatency, lv2:integer ;\n"; + pluginString += " ] ;\n\n"; + ++portIndex; +#endif + + for (uint32_t i=0, count=plugin.getParameterCount(); i < count; ++i, ++portIndex) + { + if (i == 0) + pluginString += " lv2:port [\n"; + else + pluginString += " [\n"; + + if (plugin.isParameterOutput(i)) + pluginString += " a lv2:OutputPort, lv2:ControlPort ;\n"; + else + pluginString += " a lv2:InputPort, lv2:ControlPort ;\n"; + + pluginString += " lv2:index " + String(portIndex) + " ;\n"; + pluginString += " lv2:name \"" + plugin.getParameterName(i) + "\" ;\n"; + + // symbol + { + String symbol(plugin.getParameterSymbol(i)); + + if (symbol.isEmpty()) + symbol = "lv2_port_" + String(portIndex-1); + + pluginString += " lv2:symbol \"" + symbol + "\" ;\n"; + } + + // ranges + { + const ParameterRanges& ranges(plugin.getParameterRanges(i)); + + if (plugin.getParameterHints(i) & kParameterIsInteger) + { + pluginString += " lv2:default " + String(int(plugin.getParameterValue(i))) + " ;\n"; + pluginString += " lv2:minimum " + String(int(ranges.min)) + " ;\n"; + pluginString += " lv2:maximum " + String(int(ranges.max)) + " ;\n"; + } + else + { + pluginString += " lv2:default " + String(plugin.getParameterValue(i)) + " ;\n"; + pluginString += " lv2:minimum " + String(ranges.min) + " ;\n"; + pluginString += " lv2:maximum " + String(ranges.max) + " ;\n"; + } + } + + // unit + { + const String& unit(plugin.getParameterUnit(i)); + + if (! unit.isEmpty()) + { + if (unit == "db" || unit == "dB") + { + pluginString += " unit:unit unit:db ;\n"; + } + else if (unit == "hz" || unit == "Hz") + { + pluginString += " unit:unit unit:hz ;\n"; + } + else if (unit == "khz" || unit == "kHz") + { + pluginString += " unit:unit unit:khz ;\n"; + } + else if (unit == "mhz" || unit == "mHz") + { + pluginString += " unit:unit unit:mhz ;\n"; + } + else if (unit == "%") + { + pluginString += " unit:unit unit:pc ;\n"; + } + else + { + pluginString += " unit:unit [\n"; + pluginString += " a unit:Unit ;\n"; + pluginString += " unit:name \"" + unit + "\" ;\n"; + pluginString += " unit:symbol \"" + unit + "\" ;\n"; + pluginString += " unit:render \"%f " + unit + "\" ;\n"; + pluginString += " ] ;\n"; + } + } + } + + // hints + { + const uint32_t hints(plugin.getParameterHints(i)); + + if (hints & kParameterIsBoolean) + pluginString += " lv2:portProperty lv2:toggled ;\n"; + if (hints & kParameterIsInteger) + pluginString += " lv2:portProperty lv2:integer ;\n"; + if (hints & kParameterIsLogarithmic) + pluginString += " lv2:portProperty <" LV2_PORT_PROPS__logarithmic "> ;\n"; + if ((hints & kParameterIsAutomable) == 0 && ! plugin.isParameterOutput(i)) + { + pluginString += " lv2:portProperty <" LV2_PORT_PROPS__expensive "> ,\n"; + pluginString += " <" LV2_KXSTUDIO_PROPERTIES__NonAutomable "> ;\n"; + } + } + + if (i+1 == count) + pluginString += " ] ;\n\n"; + else + pluginString += " ] ,\n"; + } + } + + pluginString += " doap:name \"" + String(plugin.getName()) + "\" ;\n"; + pluginString += " doap:maintainer [ foaf:name \"" + String(plugin.getMaker()) + "\" ] .\n"; + + pluginFile << pluginString << std::endl; + pluginFile.close(); + std::cout << " done!" << std::endl; + } +} diff --git a/dpf/distrho/src/DistrhoPluginVST.cpp b/dpf/distrho/src/DistrhoPluginVST.cpp new file mode 100644 index 0000000..4e56567 --- /dev/null +++ b/dpf/distrho/src/DistrhoPluginVST.cpp @@ -0,0 +1,1125 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "DistrhoPluginInternal.hpp" + +#if DISTRHO_PLUGIN_HAS_UI && ! defined(HAVE_DGL) +# undef DISTRHO_PLUGIN_HAS_UI +# define DISTRHO_PLUGIN_HAS_UI 0 +#endif + +#if DISTRHO_PLUGIN_HAS_UI +# include "DistrhoUIInternal.hpp" +#endif + +#ifndef __cdecl +# define __cdecl +#endif + +// has some conflicts +#ifdef noexcept +# undef noexcept +#endif + +#define VESTIGE_HEADER +#define VST_FORCE_DEPRECATED 0 + +#include +#include + +#ifdef VESTIGE_HEADER +# include "vestige/aeffectx.h" +#define effFlagsProgramChunks (1 << 5) +#define effSetProgramName 4 +#define effGetParamLabel 6 +#define effGetParamDisplay 7 +#define effGetChunk 23 +#define effSetChunk 24 +#define effCanBeAutomated 26 +#define effGetProgramNameIndexed 29 +#define effGetPlugCategory 35 +#define effIdle 53 +#define kPlugCategEffect 1 +#define kPlugCategSynth 2 +#define kVstVersion 2400 +struct ERect { + int16_t top, left, bottom, right; +}; +#else +# include "vst/aeffectx.h" +#endif + +START_NAMESPACE_DISTRHO + +typedef std::map StringMap; + +// ----------------------------------------------------------------------- + +void strncpy(char* const dst, const char* const src, const size_t size) +{ + std::strncpy(dst, src, size-1); + dst[size-1] = '\0'; +} + +void snprintf_param(char* const dst, const float value, const size_t size) +{ + std::snprintf(dst, size-1, "%f", value); + dst[size-1] = '\0'; +} + +#if DISTRHO_PLUGIN_HAS_UI +// ----------------------------------------------------------------------- + +class UiHelper +{ +public: + UiHelper() + : parameterChecks(nullptr), + parameterValues(nullptr) {} + + virtual ~UiHelper() + { + if (parameterChecks != nullptr) + { + delete[] parameterChecks; + parameterChecks = nullptr; + } + if (parameterValues != nullptr) + { + delete[] parameterValues; + parameterValues = nullptr; + } + } + + bool* parameterChecks; + float* parameterValues; + +# if DISTRHO_PLUGIN_WANT_STATE + virtual void setStateFromUI(const char* const newKey, const char* const newValue) = 0; +# endif +}; + +// ----------------------------------------------------------------------- + +class UIVst +{ +public: + UIVst(const audioMasterCallback audioMaster, AEffect* const effect, UiHelper* const uiHelper, PluginExporter* const plugin, const intptr_t winId) + : fAudioMaster(audioMaster), + fEffect(effect), + fUiHelper(uiHelper), + fPlugin(plugin), + fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, plugin->getInstancePointer()) + { + } + + // ------------------------------------------------------------------- + + void idle() + { + for (uint32_t i=0, count = fPlugin->getParameterCount(); i < count; ++i) + { + if (fUiHelper->parameterChecks[i]) + { + fUiHelper->parameterChecks[i] = false; + fUI.parameterChanged(i, fUiHelper->parameterValues[i]); + } + } + + fUI.idle(); + } + + int16_t getWidth() const + { + return fUI.getWidth(); + } + + int16_t getHeight() const + { + return fUI.getHeight(); + } + + void setSampleRate(const double newSampleRate) + { + fUI.setSampleRate(newSampleRate, true); + } + + // ------------------------------------------------------------------- + // functions called from the plugin side, may block + +# if DISTRHO_PLUGIN_WANT_STATE + void setStateFromPlugin(const char* const key, const char* const value) + { + fUI.stateChanged(key, value); + } +# endif + + // ------------------------------------------------------------------- + +protected: + intptr_t hostCallback(const int32_t opcode, + const int32_t index = 0, + const intptr_t value = 0, + void* const ptr = nullptr, + const float opt = 0.0f) + { + return fAudioMaster(fEffect, opcode, index, value, ptr, opt); + } + + void editParameter(const uint32_t index, const bool started) + { + hostCallback(started ? audioMasterBeginEdit : audioMasterEndEdit, index); + } + + void setParameterValue(const uint32_t index, const float realValue) + { + const ParameterRanges& ranges(fPlugin->getParameterRanges(index)); + const float perValue(ranges.getNormalizedValue(realValue)); + + fPlugin->setParameterValue(index, realValue); + hostCallback(audioMasterAutomate, index, 0, nullptr, perValue); + } + + void setState(const char* const key, const char* const value) + { +# if DISTRHO_PLUGIN_WANT_STATE + fUiHelper->setStateFromUI(key, value); +# else + return; // unused + (void)key; + (void)value; +# endif + } + + void sendNote(const uint8_t channel, const uint8_t note, const uint8_t velocity) + { +# if 0 //DISTRHO_PLUGIN_WANT_MIDI_INPUT + // TODO +# else + return; // unused + (void)channel; + (void)note; + (void)velocity; +# endif + } + + void setSize(const uint width, const uint height) + { + fUI.setWindowSize(width, height); + hostCallback(audioMasterSizeWindow, width, height); + } + +private: + // Vst stuff + const audioMasterCallback fAudioMaster; + AEffect* const fEffect; + UiHelper* const fUiHelper; + PluginExporter* const fPlugin; + + // Plugin UI + UIExporter fUI; + + // ------------------------------------------------------------------- + // Callbacks + + #define handlePtr ((UIVst*)ptr) + + static void editParameterCallback(void* ptr, uint32_t index, bool started) + { + handlePtr->editParameter(index, started); + } + + static void setParameterCallback(void* ptr, uint32_t rindex, float value) + { + handlePtr->setParameterValue(rindex, value); + } + + static void setStateCallback(void* ptr, const char* key, const char* value) + { + handlePtr->setState(key, value); + } + + static void sendNoteCallback(void* ptr, uint8_t channel, uint8_t note, uint8_t velocity) + { + handlePtr->sendNote(channel, note, velocity); + } + + static void setSizeCallback(void* ptr, uint width, uint height) + { + handlePtr->setSize(width, height); + } + + #undef handlePtr +}; +#endif + +// ----------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_HAS_UI +class PluginVst : public UiHelper +#else +class PluginVst +#endif +{ +public: + PluginVst(const audioMasterCallback audioMaster, AEffect* const effect) + : fAudioMaster(audioMaster), + fEffect(effect) + { + std::memset(fProgramName, 0, sizeof(char)*(32+1)); + std::strcpy(fProgramName, "Default"); + +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + fMidiEventCount = 0; +#endif + +#if DISTRHO_PLUGIN_HAS_UI + fVstUI = nullptr; + fVstRect.top = 0; + fVstRect.left = 0; + fVstRect.bottom = 0; + fVstRect.right = 0; + + if (const uint32_t paramCount = fPlugin.getParameterCount()) + { + parameterChecks = new bool[paramCount]; + parameterValues = new float[paramCount]; + + for (uint32_t i=0; i < paramCount; ++i) + { + parameterChecks[i] = false; + parameterValues[i] = 0.0f; + } + } +# if DISTRHO_OS_MAC +# ifdef __LP64__ + fUsingNsView = true; +# else +# warning 32bit VST UIs on OSX only work if the host supports "hasCockosViewAsConfig" + fUsingNsView = false; +# endif +# endif // DISTRHO_OS_MAC +#endif // DISTRHO_PLUGIN_HAS_UI + +#if DISTRHO_PLUGIN_WANT_STATE + fStateChunk = nullptr; + + for (uint32_t i=0, count=fPlugin.getStateCount(); i(fPlugin.getParameterCount())) + { + DISTRHO::snprintf_param((char*)ptr, fPlugin.getParameterValue(index), 24); + return 1; + } + break; + + case effSetSampleRate: + fPlugin.setSampleRate(opt, true); + +#if DISTRHO_PLUGIN_HAS_UI + if (fVstUI != nullptr) + fVstUI->setSampleRate(opt); +#endif + break; + + case effSetBlockSize: + fPlugin.setBufferSize(value, true); + break; + + case effMainsChanged: + if (value != 0) + { +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + fMidiEventCount = 0; + + // tell host we want MIDI events + hostCallback(audioMasterWantMidi); +#endif + + // deactivate for possible changes + fPlugin.deactivateIfNeeded(); + + // check if something changed + const uint32_t bufferSize = static_cast(hostCallback(audioMasterGetBlockSize)); + const double sampleRate = static_cast(hostCallback(audioMasterGetSampleRate)); + + if (bufferSize != 0) + fPlugin.setBufferSize(bufferSize, true); + + if (sampleRate != 0.0) + fPlugin.setSampleRate(sampleRate, true); + + fPlugin.activate(); + } + else + { + fPlugin.deactivate(); + } + break; + +#if DISTRHO_PLUGIN_HAS_UI + case effEditGetRect: + if (fVstUI != nullptr) + { + fVstRect.right = fVstUI->getWidth(); + fVstRect.bottom = fVstUI->getHeight(); + } + else + { + d_lastUiSampleRate = fPlugin.getSampleRate(); + + UIExporter tmpUI(nullptr, 0, nullptr, nullptr, nullptr, nullptr, nullptr, fPlugin.getInstancePointer()); + fVstRect.right = tmpUI.getWidth(); + fVstRect.bottom = tmpUI.getHeight(); + tmpUI.quit(); + } + *(ERect**)ptr = &fVstRect; + return 1; + + case effEditOpen: + if (fVstUI == nullptr) + { +# if DISTRHO_OS_MAC + if (! fUsingNsView) + { + d_stderr("Host doesn't support hasCockosViewAsConfig, cannot use UI"); + return 0; + } +# endif + d_lastUiSampleRate = fPlugin.getSampleRate(); + + fVstUI = new UIVst(fAudioMaster, fEffect, this, &fPlugin, (intptr_t)ptr); + +# if DISTRHO_PLUGIN_WANT_STATE + for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) + { + const String& key = cit->first; + const String& value = cit->second; + + fVstUI->setStateFromPlugin(key, value); + } +# endif + for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) + setParameterValueFromPlugin(i, fPlugin.getParameterValue(i)); + + fVstUI->idle(); + return 1; + } + break; + + case effEditClose: + if (fVstUI != nullptr) + { + delete fVstUI; + fVstUI = nullptr; + return 1; + } + break; + + //case effIdle: + case effEditIdle: + if (fVstUI != nullptr) + fVstUI->idle(); + break; +#endif // DISTRHO_PLUGIN_HAS_UI + +#if DISTRHO_PLUGIN_WANT_STATE + case effGetChunk: + if (ptr == nullptr) + return 0; + + if (fStateChunk != nullptr) + { + delete[] fStateChunk; + fStateChunk = nullptr; + } + + if (fPlugin.getStateCount() == 0) + { + fStateChunk = new char[1]; + fStateChunk[0] = '\0'; + return 1; + } + else + { + String chunkStr; + + for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) + { + const String& key = cit->first; + const String& value = cit->second; + + // join key and value + String tmpStr; + tmpStr = key; + tmpStr += "\xff"; + tmpStr += value; + tmpStr += "\xff"; + + chunkStr += tmpStr; + } + + const std::size_t chunkSize(chunkStr.length()+1); + + fStateChunk = new char[chunkSize]; + std::memcpy(fStateChunk, chunkStr.buffer(), chunkStr.length()); + fStateChunk[chunkSize] = '\0'; + + for (std::size_t i=0; isetStateFromPlugin(key, value); +# endif + + // get next key + key = value+(std::strlen(value)+1); + } + + return 1; + } +#endif // DISTRHO_PLUGIN_WANT_STATE + +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + case effProcessEvents: + if (! fPlugin.isActive()) + { + // host has not activated the plugin yet, nasty! + vst_dispatcher(effMainsChanged, 0, 1, nullptr, 0.0f); + } + + if (const VstEvents* const events = (const VstEvents*)ptr) + { + if (events->numEvents == 0) + break; + + for (int i=0, count=events->numEvents; i < count; ++i) + { + const VstMidiEvent* const vstMidiEvent((const VstMidiEvent*)events->events[i]); + + if (vstMidiEvent == nullptr) + break; + if (vstMidiEvent->type != kVstMidiType) + continue; + if (fMidiEventCount >= kMaxMidiEvents) + break; + + MidiEvent& midiEvent(fMidiEvents[fMidiEventCount++]); + midiEvent.frame = vstMidiEvent->deltaFrames; + midiEvent.size = 3; + std::memcpy(midiEvent.data, vstMidiEvent->midiData, sizeof(uint8_t)*3); + } + } + break; +#endif + + case effCanBeAutomated: + if (index < static_cast(fPlugin.getParameterCount())) + { + const uint32_t hints(fPlugin.getParameterHints(index)); + + // must be automable, and not output + if ((hints & kParameterIsAutomable) != 0 && (hints & kParameterIsOutput) == 0) + return 1; + } + break; + +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT || DISTRHO_PLUGIN_WANT_TIMEPOS || DISTRHO_OS_MAC + case effCanDo: + if (const char* const canDo = (const char*)ptr) + { +# if DISTRHO_OS_MAC && DISTRHO_PLUGIN_HAS_UI + if (std::strcmp(canDo, "hasCockosViewAsConfig") == 0) + { + fUsingNsView = true; + return 0xbeef0000; + } +# endif +# if DISTRHO_PLUGIN_WANT_MIDI_INPUT + if (std::strcmp(canDo, "receiveVstEvents") == 0) + return 1; + if (std::strcmp(canDo, "receiveVstMidiEvent") == 0) + return 1; +# endif +# if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + if (std::strcmp(canDo, "sendVstEvents") == 0) + return 1; + if (std::strcmp(canDo, "sendVstMidiEvent") == 0) + return 1; +# endif +# if DISTRHO_PLUGIN_WANT_TIMEPOS + if (std::strcmp(canDo, "receiveVstTimeInfo") == 0) + return 1; +# endif + } + break; +#endif + + //case effStartProcess: + //case effStopProcess: + // unused + // break; + } + + return 0; + } + + float vst_getParameter(const int32_t index) + { + const ParameterRanges& ranges(fPlugin.getParameterRanges(index)); + return ranges.getNormalizedValue(fPlugin.getParameterValue(index)); + } + + void vst_setParameter(const int32_t index, const float value) + { + const ParameterRanges& ranges(fPlugin.getParameterRanges(index)); + const float realValue(ranges.getUnnormalizedValue(value)); + fPlugin.setParameterValue(index, realValue); + +#if DISTRHO_PLUGIN_HAS_UI + if (fVstUI != nullptr) + setParameterValueFromPlugin(index, realValue); +#endif + } + + void vst_processReplacing(const float** const inputs, float** const outputs, const int32_t sampleFrames) + { + if (sampleFrames <= 0) + return; + + if (! fPlugin.isActive()) + { + // host has not activated the plugin yet, nasty! + vst_dispatcher(effMainsChanged, 0, 1, nullptr, 0.0f); + } + +#if DISTRHO_PLUGIN_WANT_TIMEPOS + static const int kWantVstTimeFlags(kVstTransportPlaying|kVstPpqPosValid|kVstTempoValid|kVstTimeSigValid); + + if (const VstTimeInfo* const vstTimeInfo = (const VstTimeInfo*)hostCallback(audioMasterGetTime, 0, kWantVstTimeFlags)) + { + fTimePosition.frame = vstTimeInfo->samplePos; + fTimePosition.playing = (vstTimeInfo->flags & kVstTransportPlaying); + fTimePosition.bbt.valid = ((vstTimeInfo->flags & kVstTempoValid) != 0 || (vstTimeInfo->flags & kVstTimeSigValid) != 0); + + // ticksPerBeat is not possible with VST + fTimePosition.bbt.ticksPerBeat = 960.0; + + if (vstTimeInfo->flags & kVstTempoValid) + fTimePosition.bbt.beatsPerMinute = vstTimeInfo->tempo; + else + fTimePosition.bbt.beatsPerMinute = 120.0; + + if (vstTimeInfo->flags & (kVstPpqPosValid|kVstTimeSigValid)) + { + const int ppqPerBar = vstTimeInfo->timeSigNumerator * 4 / vstTimeInfo->timeSigDenominator; + const double barBeats = (std::fmod(vstTimeInfo->ppqPos, ppqPerBar) / ppqPerBar) * vstTimeInfo->timeSigDenominator; + const double rest = std::fmod(barBeats, 1.0); + + fTimePosition.bbt.bar = int(vstTimeInfo->ppqPos)/ppqPerBar + 1; + fTimePosition.bbt.beat = barBeats-rest+1; + fTimePosition.bbt.tick = rest*fTimePosition.bbt.ticksPerBeat+0.5; + fTimePosition.bbt.beatsPerBar = vstTimeInfo->timeSigNumerator; + fTimePosition.bbt.beatType = vstTimeInfo->timeSigDenominator; + } + else + { + fTimePosition.bbt.bar = 1; + fTimePosition.bbt.beat = 1; + fTimePosition.bbt.tick = 0; + fTimePosition.bbt.beatsPerBar = 4.0f; + fTimePosition.bbt.beatType = 4.0f; + } + + fTimePosition.bbt.barStartTick = fTimePosition.bbt.ticksPerBeat*fTimePosition.bbt.beatsPerBar*(fTimePosition.bbt.bar-1); + + fPlugin.setTimePosition(fTimePosition); + } +#endif + +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + fPlugin.run(inputs, outputs, sampleFrames, fMidiEvents, fMidiEventCount); + fMidiEventCount = 0; +#else + fPlugin.run(inputs, outputs, sampleFrames); +#endif + +#if DISTRHO_PLUGIN_HAS_UI + if (fVstUI == nullptr) + return; + + for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i) + { + if (fPlugin.isParameterOutput(i)) + setParameterValueFromPlugin(i, fPlugin.getParameterValue(i)); + } +#endif + } + + // ------------------------------------------------------------------- + + friend class UIVst; + +private: + // VST stuff + const audioMasterCallback fAudioMaster; + AEffect* const fEffect; + + // Plugin + PluginExporter fPlugin; + + // Temporary data + char fProgramName[32+1]; + +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + uint32_t fMidiEventCount; + MidiEvent fMidiEvents[kMaxMidiEvents]; +#endif + +#if DISTRHO_PLUGIN_WANT_TIMEPOS + TimePosition fTimePosition; +#endif + + // UI stuff +#if DISTRHO_PLUGIN_HAS_UI + UIVst* fVstUI; + ERect fVstRect; +# if DISTRHO_OS_MAC + bool fUsingNsView; +# endif +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + char* fStateChunk; + StringMap fStateMap; +#endif + + // ------------------------------------------------------------------- + // host callback + + intptr_t hostCallback(const int32_t opcode, + const int32_t index = 0, + const intptr_t value = 0, + void* const ptr = nullptr, + const float opt = 0.0f) + { + return fAudioMaster(fEffect, opcode, index, value, ptr, opt); + } + + // ------------------------------------------------------------------- + // functions called from the plugin side, RT no block + +#if DISTRHO_PLUGIN_HAS_UI + void setParameterValueFromPlugin(const uint32_t index, const float realValue) + { + parameterValues[index] = realValue; + parameterChecks[index] = true; + } +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + // ------------------------------------------------------------------- + // functions called from the UI side, may block + +# if DISTRHO_PLUGIN_HAS_UI + void setStateFromUI(const char* const key, const char* const newValue) override +# else + void setStateFromUI(const char* const key, const char* const newValue) +# endif + { + fPlugin.setState(key, newValue); + + // check if we want to save this key + if (! fPlugin.wantStateKey(key)) + return; + + // check if key already exists + for (StringMap::iterator it=fStateMap.begin(), ite=fStateMap.end(); it != ite; ++it) + { + const String& dkey(it->first); + + if (dkey == key) + { + it->second = newValue; + return; + } + } + + d_stderr("Failed to find plugin state with key \"%s\"", key); + } +#endif +}; + +// ----------------------------------------------------------------------- + +struct VstObject { + audioMasterCallback audioMaster; + PluginVst* plugin; +}; + +#ifdef VESTIGE_HEADER +# define validObject effect != nullptr && effect->ptr3 != nullptr +# define validPlugin effect != nullptr && effect->ptr3 != nullptr && ((VstObject*)effect->ptr3)->plugin != nullptr +# define vstObjectPtr (VstObject*)effect->ptr3 +#else +# define validObject effect != nullptr && effect->object != nullptr +# define validPlugin effect != nullptr && effect->object != nullptr && ((VstObject*)effect->object)->plugin != nullptr +# define vstObjectPtr (VstObject*)effect->object +#endif + +#define pluginPtr (vstObjectPtr)->plugin + +static intptr_t vst_dispatcherCallback(AEffect* effect, int32_t opcode, int32_t index, intptr_t value, void* ptr, float opt) +{ + // first internal init + const bool doInternalInit = (opcode == -1729 && index == 0xdead && value == 0xf00d); + + if (doInternalInit) + { + // set valid but dummy values + d_lastBufferSize = 512; + d_lastSampleRate = 44100.0; + } + + // Create dummy plugin to get data from + static PluginExporter plugin; + + if (doInternalInit) + { + // unset + d_lastBufferSize = 0; + d_lastSampleRate = 0.0; + + *(PluginExporter**)ptr = &plugin; + return 0; + } + + // handle base opcodes + switch (opcode) + { + case effOpen: + if (VstObject* const obj = vstObjectPtr) + { + // this must always be valid + DISTRHO_SAFE_ASSERT_RETURN(obj->audioMaster != nullptr, 0); + + // some hosts call effOpen twice + DISTRHO_SAFE_ASSERT_RETURN(obj->plugin == nullptr, 1); + + audioMasterCallback audioMaster = (audioMasterCallback)obj->audioMaster; + + d_lastBufferSize = audioMaster(effect, audioMasterGetBlockSize, 0, 0, nullptr, 0.0f); + d_lastSampleRate = audioMaster(effect, audioMasterGetSampleRate, 0, 0, nullptr, 0.0f); + + // some hosts are not ready at this point or return 0 buffersize/samplerate + if (d_lastBufferSize == 0) + d_lastBufferSize = 2048; + if (d_lastSampleRate <= 0.0) + d_lastSampleRate = 44100.0; + + obj->plugin = new PluginVst(audioMaster, effect); + return 1; + } + return 0; + + case effClose: + if (VstObject* const obj = vstObjectPtr) + { + if (obj->plugin != nullptr) + { + delete obj->plugin; + obj->plugin = nullptr; + } + +#if 0 + /* This code invalidates the object created in VSTPluginMain + * Probably not safe against all hosts */ + obj->audioMaster = nullptr; +# ifdef VESTIGE_HEADER + effect->ptr3 = nullptr; +# else + vstObjectPtr = nullptr; +# endif + delete obj; +#endif + + return 1; + } + //delete effect; + return 0; + + case effGetParamLabel: + if (ptr != nullptr && index < static_cast(plugin.getParameterCount())) + { + DISTRHO::strncpy((char*)ptr, plugin.getParameterUnit(index), 8); + return 1; + } + return 0; + + case effGetParamName: + if (ptr != nullptr && index < static_cast(plugin.getParameterCount())) + { + DISTRHO::strncpy((char*)ptr, plugin.getParameterName(index), 16); + return 1; + } + return 0; + + case effGetPlugCategory: +#if DISTRHO_PLUGIN_IS_SYNTH + return kPlugCategSynth; +#else + return kPlugCategEffect; +#endif + + case effGetEffectName: + if (char* const cptr = (char*)ptr) + { + DISTRHO::strncpy(cptr, plugin.getName(), 32); + return 1; + } + return 0; + + case effGetVendorString: + if (char* const cptr = (char*)ptr) + { + DISTRHO::strncpy(cptr, plugin.getMaker(), 32); + return 1; + } + return 0; + + case effGetProductString: + if (char* const cptr = (char*)ptr) + { + DISTRHO::strncpy(cptr, plugin.getLabel(), 32); + return 1; + } + return 0; + + case effGetVendorVersion: + return plugin.getVersion(); + + case effGetVstVersion: + return kVstVersion; + }; + + // handle advanced opcodes + if (validPlugin) + return pluginPtr->vst_dispatcher(opcode, index, value, ptr, opt); + + return 0; +} + +static float vst_getParameterCallback(AEffect* effect, int32_t index) +{ + if (validPlugin) + return pluginPtr->vst_getParameter(index); + return 0.0f; +} + +static void vst_setParameterCallback(AEffect* effect, int32_t index, float value) +{ + if (validPlugin) + pluginPtr->vst_setParameter(index, value); +} + +static void vst_processCallback(AEffect* effect, float** inputs, float** outputs, int32_t sampleFrames) +{ + if (validPlugin) + pluginPtr->vst_processReplacing(const_cast(inputs), outputs, sampleFrames); +} + +static void vst_processReplacingCallback(AEffect* effect, float** inputs, float** outputs, int32_t sampleFrames) +{ + if (validPlugin) + pluginPtr->vst_processReplacing(const_cast(inputs), outputs, sampleFrames); +} + +#undef pluginPtr +#undef validObject +#undef validPlugin +#undef vstObjectPtr + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +DISTRHO_PLUGIN_EXPORT +#if DISTRHO_OS_WINDOWS || DISTRHO_OS_MAC +const AEffect* VSTPluginMain(audioMasterCallback audioMaster); +#else +const AEffect* VSTPluginMain(audioMasterCallback audioMaster) asm ("main"); +#endif + +DISTRHO_PLUGIN_EXPORT +const AEffect* VSTPluginMain(audioMasterCallback audioMaster) +{ + USE_NAMESPACE_DISTRHO + + // old version + if (audioMaster(nullptr, audioMasterVersion, 0, 0, nullptr, 0.0f) == 0) + return nullptr; + + // first internal init + PluginExporter* plugin = nullptr; + vst_dispatcherCallback(nullptr, -1729, 0xdead, 0xf00d, &plugin, 0.0f); + DISTRHO_SAFE_ASSERT_RETURN(plugin != nullptr, nullptr); + + AEffect* const effect(new AEffect); + std::memset(effect, 0, sizeof(AEffect)); + + // vst fields + effect->magic = kEffectMagic; + effect->uniqueID = plugin->getUniqueId(); +#ifdef VESTIGE_HEADER + int32_t* const version = (int32_t*)&effect->unknown1; + *version = plugin->getVersion(); +#else + effect->version = plugin->getVersion(); +#endif + + // VST doesn't support parameter outputs, hide them + int numParams = 0; + bool outputsReached = false; + + for (uint32_t i=0, count=plugin->getParameterCount(); i < count; ++i) + { + if (! plugin->isParameterOutput(i)) + { + // parameter outputs must be all at the end + DISTRHO_SAFE_ASSERT_BREAK(! outputsReached); + ++numParams; + continue; + } + outputsReached = true; + } + + // plugin fields + effect->numParams = numParams; + effect->numPrograms = 1; + effect->numInputs = DISTRHO_PLUGIN_NUM_INPUTS; + effect->numOutputs = DISTRHO_PLUGIN_NUM_OUTPUTS; + + // plugin flags + effect->flags |= effFlagsCanReplacing; +#if DISTRHO_PLUGIN_IS_SYNTH + effect->flags |= effFlagsIsSynth; +#endif +#if DISTRHO_PLUGIN_HAS_UI + effect->flags |= effFlagsHasEditor; +#endif +#if DISTRHO_PLUGIN_WANT_STATE + effect->flags |= effFlagsProgramChunks; +#endif + + // static calls + effect->dispatcher = vst_dispatcherCallback; + effect->process = vst_processCallback; + effect->getParameter = vst_getParameterCallback; + effect->setParameter = vst_setParameterCallback; + effect->processReplacing = vst_processReplacingCallback; + + // pointers + VstObject* const obj(new VstObject()); + obj->audioMaster = audioMaster; + obj->plugin = nullptr; +#ifdef VESTIGE_HEADER + effect->ptr3 = obj; +#else + effect->object = obj; +#endif + + return effect; +} + +// ----------------------------------------------------------------------- diff --git a/dpf/distrho/src/DistrhoUI.cpp b/dpf/distrho/src/DistrhoUI.cpp new file mode 100644 index 0000000..a52a927 --- /dev/null +++ b/dpf/distrho/src/DistrhoUI.cpp @@ -0,0 +1,123 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "DistrhoUIInternal.hpp" +#include "src/WidgetPrivateData.hpp" + +START_NAMESPACE_DISTRHO + +/* ------------------------------------------------------------------------------------------------------------ + * Static data, see DistrhoUIInternal.hpp */ + +double d_lastUiSampleRate = 0.0; +void* d_lastUiDspPtr = nullptr; +Window* d_lastUiWindow = nullptr; + +/* ------------------------------------------------------------------------------------------------------------ + * UI */ + +UI::UI(uint width, uint height) + : UIWidget(*d_lastUiWindow), + pData(new PrivateData()) +{ + ((UIWidget*)this)->pData->needsFullViewport = false; + + if (width > 0 && height > 0) + setSize(width, height); +} + +UI::~UI() +{ + delete pData; +} + +/* ------------------------------------------------------------------------------------------------------------ + * Host state */ + +double UI::getSampleRate() const noexcept +{ + return pData->sampleRate; +} + +void UI::editParameter(uint32_t index, bool started) +{ + pData->editParamCallback(index + pData->parameterOffset, started); +} + +void UI::setParameterValue(uint32_t index, float value) +{ + pData->setParamCallback(index + pData->parameterOffset, value); +} + +#if DISTRHO_PLUGIN_WANT_STATE +void UI::setState(const char* key, const char* value) +{ + pData->setStateCallback(key, value); +} +#endif + +#if DISTRHO_PLUGIN_IS_SYNTH +void UI::sendNote(uint8_t channel, uint8_t note, uint8_t velocity) +{ + pData->sendNoteCallback(channel, note, velocity); +} +#endif + +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS +/* ------------------------------------------------------------------------------------------------------------ + * Direct DSP access */ + +void* UI::getPluginInstancePointer() const noexcept +{ + return pData->dspPtr; +} +#endif + +/* ------------------------------------------------------------------------------------------------------------ + * DSP/Plugin Callbacks (optional) */ + +void UI::sampleRateChanged(double) {} + +/* ------------------------------------------------------------------------------------------------------------ + * UI Callbacks (optional) */ + +void UI::uiFileBrowserSelected(const char*) +{ +} + +void UI::uiReshape(uint width, uint height) +{ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0, static_cast(width), static_cast(height), 0.0, 0.0, 1.0); + glViewport(0, 0, static_cast(width), static_cast(height)); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +/* ------------------------------------------------------------------------------------------------------------ + * UI Resize Handling, internal */ + +void UI::onResize(const ResizeEvent& ev) +{ + pData->setSizeCallback(ev.size.getWidth(), ev.size.getHeight()); +} + +// ----------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO diff --git a/dpf/distrho/src/DistrhoUIDSSI.cpp b/dpf/distrho/src/DistrhoUIDSSI.cpp new file mode 100644 index 0000000..d2868fd --- /dev/null +++ b/dpf/distrho/src/DistrhoUIDSSI.cpp @@ -0,0 +1,511 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "DistrhoUIInternal.hpp" + +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS +# error DSSI UIs do not support direct access! +#endif + +#include "../extra/Sleep.hpp" + +#include + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- + +struct OscData { + lo_address addr; + const char* path; + lo_server server; + + OscData() + : addr(nullptr), + path(nullptr), + server(nullptr) {} + + void idle() const + { + if (server == nullptr) + return; + + while (lo_server_recv_noblock(server, 0) != 0) {} + } + + void send_configure(const char* const key, const char* const value) const + { + char targetPath[std::strlen(path)+11]; + std::strcpy(targetPath, path); + std::strcat(targetPath, "/configure"); + lo_send(addr, targetPath, "ss", key, value); + } + + void send_control(const int32_t index, const float value) const + { + char targetPath[std::strlen(path)+9]; + std::strcpy(targetPath, path); + std::strcat(targetPath, "/control"); + lo_send(addr, targetPath, "if", index, value); + } + + void send_midi(uchar data[4]) const + { + char targetPath[std::strlen(path)+6]; + std::strcpy(targetPath, path); + std::strcat(targetPath, "/midi"); + lo_send(addr, targetPath, "m", data); + } + + void send_update(const char* const url) const + { + char targetPath[std::strlen(path)+8]; + std::strcpy(targetPath, path); + std::strcat(targetPath, "/update"); + lo_send(addr, targetPath, "s", url); + } + + void send_exiting() const + { + char targetPath[std::strlen(path)+9]; + std::strcpy(targetPath, path); + std::strcat(targetPath, "/exiting"); + lo_send(addr, targetPath, ""); + } +}; + +// ----------------------------------------------------------------------- + +class UIDssi +{ +public: + UIDssi(const OscData& oscData, const char* const uiTitle) + : fUI(this, 0, nullptr, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback), + fHostClosed(false), + fOscData(oscData) + { + fUI.setWindowTitle(uiTitle); + } + + ~UIDssi() + { + if (fOscData.server != nullptr && ! fHostClosed) + fOscData.send_exiting(); + } + + void exec() + { + for (;;) + { + fOscData.idle(); + + if (fHostClosed || ! fUI.idle()) + break; + + d_msleep(30); + } + } + + // ------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_WANT_STATE + void dssiui_configure(const char* key, const char* value) + { + fUI.stateChanged(key, value); + } +#endif + + void dssiui_control(ulong index, float value) + { + fUI.parameterChanged(index, value); + } + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + void dssiui_program(ulong bank, ulong program) + { + fUI.programLoaded(bank * 128 + program); + } +#endif + + void dssiui_samplerate(const double sampleRate) + { + fUI.setSampleRate(sampleRate, true); + } + + void dssiui_show() + { + fUI.setWindowVisible(true); + } + + void dssiui_hide() + { + fUI.setWindowVisible(false); + } + + void dssiui_quit() + { + fHostClosed = true; + fUI.quit(); + } + + // ------------------------------------------------------------------- + +protected: + void setParameterValue(const uint32_t rindex, const float value) + { + if (fOscData.server == nullptr) + return; + + fOscData.send_control(rindex, value); + } + + void setState(const char* const key, const char* const value) + { + if (fOscData.server == nullptr) + return; + + fOscData.send_configure(key, value); + } + + void sendNote(const uint8_t channel, const uint8_t note, const uint8_t velocity) + { + if (fOscData.server == nullptr) + return; + if (channel > 0xF) + return; + + uint8_t mdata[4] = { 0, channel, note, velocity }; + mdata[1] += (velocity != 0) ? 0x90 : 0x80; + + fOscData.send_midi(mdata); + } + + void setSize(const uint width, const uint height) + { + fUI.setWindowSize(width, height); + } + +private: + UIExporter fUI; + bool fHostClosed; + + const OscData& fOscData; + + // ------------------------------------------------------------------- + // Callbacks + + #define uiPtr ((UIDssi*)ptr) + + static void setParameterCallback(void* ptr, uint32_t rindex, float value) + { + uiPtr->setParameterValue(rindex, value); + } + + static void setStateCallback(void* ptr, const char* key, const char* value) + { + uiPtr->setState(key, value); + } + + static void sendNoteCallback(void* ptr, uint8_t channel, uint8_t note, uint8_t velocity) + { + uiPtr->sendNote(channel, note, velocity); + } + + static void setSizeCallback(void* ptr, uint width, uint height) + { + uiPtr->setSize(width, height); + } + + #undef uiPtr +}; + +// ----------------------------------------------------------------------- + +static OscData gOscData; +static const char* gUiTitle = nullptr; +static UIDssi* globalUI = nullptr; + +static void initUiIfNeeded() +{ + if (globalUI != nullptr) + return; + + if (d_lastUiSampleRate == 0.0) + d_lastUiSampleRate = 44100.0; + + globalUI = new UIDssi(gOscData, gUiTitle); +} + +// ----------------------------------------------------------------------- + +int osc_debug_handler(const char* path, const char*, lo_arg**, int, lo_message, void*) +{ + d_debug("osc_debug_handler(\"%s\")", path); + return 0; + +#ifndef DEBUG + // unused + (void)path; +#endif +} + +void osc_error_handler(int num, const char* msg, const char* path) +{ + d_stderr("osc_error_handler(%i, \"%s\", \"%s\")", num, msg, path); +} + +#if DISTRHO_PLUGIN_WANT_STATE +int osc_configure_handler(const char*, const char*, lo_arg** argv, int, lo_message, void*) +{ + const char* const key = &argv[0]->s; + const char* const value = &argv[1]->s; + d_debug("osc_configure_handler(\"%s\", \"%s\")", key, value); + + initUiIfNeeded(); + + globalUI->dssiui_configure(key, value); + + return 0; +} +#endif + +int osc_control_handler(const char*, const char*, lo_arg** argv, int, lo_message, void*) +{ + const int32_t rindex = argv[0]->i; + const float value = argv[1]->f; + d_debug("osc_control_handler(%i, %f)", rindex, value); + + int32_t index = rindex - DISTRHO_PLUGIN_NUM_INPUTS - DISTRHO_PLUGIN_NUM_OUTPUTS; + + // latency +#if DISTRHO_PLUGIN_WANT_LATENCY + index -= 1; +#endif + + if (index < 0) + return 0; + + initUiIfNeeded(); + + globalUI->dssiui_control(index, value); + + return 0; +} + +#if DISTRHO_PLUGIN_WANT_PROGRAMS +int osc_program_handler(const char*, const char*, lo_arg** argv, int, lo_message, void*) +{ + const int32_t bank = argv[0]->i; + const int32_t program = argv[1]->f; + d_debug("osc_program_handler(%i, %i)", bank, program); + + initUiIfNeeded(); + + globalUI->dssiui_program(bank, program); + + return 0; +} +#endif + +int osc_sample_rate_handler(const char*, const char*, lo_arg** argv, int, lo_message, void*) +{ + const int32_t sampleRate = argv[0]->i; + d_debug("osc_sample_rate_handler(%i)", sampleRate); + + d_lastUiSampleRate = sampleRate; + + if (globalUI != nullptr) + globalUI->dssiui_samplerate(sampleRate); + + return 0; +} + +int osc_show_handler(const char*, const char*, lo_arg**, int, lo_message, void*) +{ + d_debug("osc_show_handler()"); + + initUiIfNeeded(); + + globalUI->dssiui_show(); + + return 0; +} + +int osc_hide_handler(const char*, const char*, lo_arg**, int, lo_message, void*) +{ + d_debug("osc_hide_handler()"); + + if (globalUI != nullptr) + globalUI->dssiui_hide(); + + return 0; +} + +int osc_quit_handler(const char*, const char*, lo_arg**, int, lo_message, void*) +{ + d_debug("osc_quit_handler()"); + + if (globalUI != nullptr) + globalUI->dssiui_quit(); + + return 0; +} + +END_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- + +int main(int argc, char* argv[]) +{ + USE_NAMESPACE_DISTRHO + + // dummy test mode + if (argc == 1) + { + gUiTitle = "DSSI UI Test"; + + initUiIfNeeded(); + globalUI->dssiui_show(); + globalUI->exec(); + + delete globalUI; + globalUI = nullptr; + + return 0; + } + + if (argc != 5) + { + fprintf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char* oscUrl = argv[1]; + const char* uiTitle = argv[4]; + + char* const oscHost = lo_url_get_hostname(oscUrl); + char* const oscPort = lo_url_get_port(oscUrl); + char* const oscPath = lo_url_get_path(oscUrl); + size_t oscPathSize = strlen(oscPath); + lo_address oscAddr = lo_address_new(oscHost, oscPort); + lo_server oscServer = lo_server_new_with_proto(nullptr, LO_UDP, osc_error_handler); + + char* const oscServerPath = lo_server_get_url(oscServer); + + char pluginPath[strlen(oscServerPath)+oscPathSize]; + strcpy(pluginPath, oscServerPath); + strcat(pluginPath, oscPath+1); + +#if DISTRHO_PLUGIN_WANT_STATE + char oscPathConfigure[oscPathSize+11]; + strcpy(oscPathConfigure, oscPath); + strcat(oscPathConfigure, "/configure"); + lo_server_add_method(oscServer, oscPathConfigure, "ss", osc_configure_handler, nullptr); +#endif + + char oscPathControl[oscPathSize+9]; + strcpy(oscPathControl, oscPath); + strcat(oscPathControl, "/control"); + lo_server_add_method(oscServer, oscPathControl, "if", osc_control_handler, nullptr); + + d_stdout("oscServerPath: \"%s\"", oscServerPath); + d_stdout("pluginPath: \"%s\"", pluginPath); + d_stdout("oscPathControl: \"%s\"", oscPathControl); + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + char oscPathProgram[oscPathSize+9]; + strcpy(oscPathProgram, oscPath); + strcat(oscPathProgram, "/program"); + lo_server_add_method(oscServer, oscPathProgram, "ii", osc_program_handler, nullptr); +#endif + + char oscPathSampleRate[oscPathSize+13]; + strcpy(oscPathSampleRate, oscPath); + strcat(oscPathSampleRate, "/sample-rate"); + lo_server_add_method(oscServer, oscPathSampleRate, "i", osc_sample_rate_handler, nullptr); + + char oscPathShow[oscPathSize+6]; + strcpy(oscPathShow, oscPath); + strcat(oscPathShow, "/show"); + lo_server_add_method(oscServer, oscPathShow, "", osc_show_handler, nullptr); + + char oscPathHide[oscPathSize+6]; + strcpy(oscPathHide, oscPath); + strcat(oscPathHide, "/hide"); + lo_server_add_method(oscServer, oscPathHide, "", osc_hide_handler, nullptr); + + char oscPathQuit[oscPathSize+6]; + strcpy(oscPathQuit, oscPath); + strcat(oscPathQuit, "/quit"); + lo_server_add_method(oscServer, oscPathQuit, "", osc_quit_handler, nullptr); + + lo_server_add_method(oscServer, nullptr, nullptr, osc_debug_handler, nullptr); + + gUiTitle = uiTitle; + + gOscData.addr = oscAddr; + gOscData.path = oscPath; + gOscData.server = oscServer; + gOscData.send_update(pluginPath); + + // wait for init + for (int i=0; i < 100; ++i) + { + lo_server_recv(oscServer); + + if (d_lastUiSampleRate != 0.0 || globalUI != nullptr) + break; + + d_msleep(50); + } + + int ret = 1; + + if (d_lastUiSampleRate != 0.0 || globalUI != nullptr) + { + initUiIfNeeded(); + + globalUI->exec(); + + delete globalUI; + globalUI = nullptr; + + ret = 0; + } + +#if DISTRHO_PLUGIN_WANT_STATE + lo_server_del_method(oscServer, oscPathConfigure, "ss"); +#endif + lo_server_del_method(oscServer, oscPathControl, "if"); +#if DISTRHO_PLUGIN_WANT_PROGRAMS + lo_server_del_method(oscServer, oscPathProgram, "ii"); +#endif + lo_server_del_method(oscServer, oscPathSampleRate, "i"); + lo_server_del_method(oscServer, oscPathShow, ""); + lo_server_del_method(oscServer, oscPathHide, ""); + lo_server_del_method(oscServer, oscPathQuit, ""); + lo_server_del_method(oscServer, nullptr, nullptr); + + std::free(oscServerPath); + std::free(oscHost); + std::free(oscPort); + std::free(oscPath); + + lo_address_free(oscAddr); + lo_server_free(oscServer); + + return ret; +} diff --git a/dpf/distrho/src/DistrhoUIInternal.hpp b/dpf/distrho/src/DistrhoUIInternal.hpp new file mode 100644 index 0000000..3872760 --- /dev/null +++ b/dpf/distrho/src/DistrhoUIInternal.hpp @@ -0,0 +1,393 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_UI_INTERNAL_HPP_INCLUDED +#define DISTRHO_UI_INTERNAL_HPP_INCLUDED + +#include "../DistrhoUI.hpp" +#include "../../dgl/Application.hpp" +#include "../../dgl/Window.hpp" + +using DGL::Application; +using DGL::IdleCallback; +using DGL::Window; + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- +// Static data, see DistrhoUI.cpp + +extern double d_lastUiSampleRate; +extern void* d_lastUiDspPtr; +extern Window* d_lastUiWindow; + +// ----------------------------------------------------------------------- +// UI callbacks + +typedef void (*editParamFunc) (void* ptr, uint32_t rindex, bool started); +typedef void (*setParamFunc) (void* ptr, uint32_t rindex, float value); +typedef void (*setStateFunc) (void* ptr, const char* key, const char* value); +typedef void (*sendNoteFunc) (void* ptr, uint8_t channel, uint8_t note, uint8_t velo); +typedef void (*setSizeFunc) (void* ptr, uint width, uint height); + +// ----------------------------------------------------------------------- +// UI private data + +struct UI::PrivateData { + // DSP + double sampleRate; + uint32_t parameterOffset; +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + void* dspPtr; +#endif + + // Callbacks + editParamFunc editParamCallbackFunc; + setParamFunc setParamCallbackFunc; + setStateFunc setStateCallbackFunc; + sendNoteFunc sendNoteCallbackFunc; + setSizeFunc setSizeCallbackFunc; + void* ptr; + + PrivateData() noexcept + : sampleRate(d_lastUiSampleRate), + parameterOffset(0), +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + dspPtr(d_lastUiDspPtr), +#endif + editParamCallbackFunc(nullptr), + setParamCallbackFunc(nullptr), + setStateCallbackFunc(nullptr), + sendNoteCallbackFunc(nullptr), + setSizeCallbackFunc(nullptr), + ptr(nullptr) + { + DISTRHO_SAFE_ASSERT(d_isNotZero(sampleRate)); + +#if defined(DISTRHO_PLUGIN_TARGET_DSSI) || defined(DISTRHO_PLUGIN_TARGET_LV2) + parameterOffset += DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS; +# if DISTRHO_PLUGIN_WANT_LATENCY + parameterOffset += 1; +# endif +#endif + +#ifdef DISTRHO_PLUGIN_TARGET_LV2 +# if (DISTRHO_PLUGIN_IS_SYNTH || DISTRHO_PLUGIN_WANT_TIMEPOS || DISTRHO_PLUGIN_WANT_STATE) + parameterOffset += 1; +# if DISTRHO_PLUGIN_WANT_STATE + parameterOffset += 1; +# endif +# endif +#endif + } + + void editParamCallback(const uint32_t rindex, const bool started) + { + if (editParamCallbackFunc != nullptr) + editParamCallbackFunc(ptr, rindex, started); + } + + void setParamCallback(const uint32_t rindex, const float value) + { + if (setParamCallbackFunc != nullptr) + setParamCallbackFunc(ptr, rindex, value); + } + + void setStateCallback(const char* const key, const char* const value) + { + if (setStateCallbackFunc != nullptr) + setStateCallbackFunc(ptr, key, value); + } + + void sendNoteCallback(const uint8_t channel, const uint8_t note, const uint8_t velocity) + { + if (sendNoteCallbackFunc != nullptr) + sendNoteCallbackFunc(ptr, channel, note, velocity); + } + + void setSizeCallback(const uint width, const uint height) + { + if (setSizeCallbackFunc != nullptr) + setSizeCallbackFunc(ptr, width, height); + } +}; + +// ----------------------------------------------------------------------- +// Plugin Window, needed to take care of resize properly + +static inline +UI* createUiWrapper(void* const dspPtr, Window* const window) +{ + d_lastUiDspPtr = dspPtr; + d_lastUiWindow = window; + UI* const ret = createUI(); + d_lastUiDspPtr = nullptr; + d_lastUiWindow = nullptr; + return ret; +} + +class UIExporterWindow : public Window +{ +public: + UIExporterWindow(Application& app, const intptr_t winId, void* const dspPtr) + : Window(app, winId), + fUI(createUiWrapper(dspPtr, this)), + fIsReady(false) + { + DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); + + // set window size + setResizable(false); + setSize(fUI->getWidth(), fUI->getHeight()); + } + + ~UIExporterWindow() + { + delete fUI; + } + + UI* getUI() const noexcept + { + return fUI; + } + + bool isReady() const noexcept + { + return fIsReady; + } + +protected: + // custom window reshape + void onReshape(uint width, uint height) override + { + DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); + + fUI->uiReshape(width, height); + fIsReady = true; + } + + // custom file-browser selected + void fileBrowserSelected(const char* filename) override + { + DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); + + fUI->uiFileBrowserSelected(filename); + } + +private: + UI* const fUI; + bool fIsReady; +}; + +// ----------------------------------------------------------------------- +// UI exporter class + +class UIExporter +{ +public: + UIExporter(void* const ptr, const intptr_t winId, + const editParamFunc editParamCall, const setParamFunc setParamCall, const setStateFunc setStateCall, const sendNoteFunc sendNoteCall, const setSizeFunc setSizeCall, + void* const dspPtr = nullptr) + : glApp(), + glWindow(glApp, winId, dspPtr), + fChangingSize(false), + fUI(glWindow.getUI()), + fData((fUI != nullptr) ? fUI->pData : nullptr) + { + DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + + fData->ptr = ptr; + fData->editParamCallbackFunc = editParamCall; + fData->setParamCallbackFunc = setParamCall; + fData->setStateCallbackFunc = setStateCall; + fData->sendNoteCallbackFunc = sendNoteCall; + fData->setSizeCallbackFunc = setSizeCall; + } + + // ------------------------------------------------------------------- + + uint getWidth() const noexcept + { + return glWindow.getWidth(); + } + + uint getHeight() const noexcept + { + return glWindow.getHeight(); + } + + bool isVisible() const noexcept + { + return glWindow.isVisible(); + } + + // ------------------------------------------------------------------- + + intptr_t getWindowId() const noexcept + { + return glWindow.getWindowId(); + } + + // ------------------------------------------------------------------- + + uint32_t getParameterOffset() const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0); + + return fData->parameterOffset; + } + + // ------------------------------------------------------------------- + + void parameterChanged(const uint32_t index, const float value) + { + DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); + + fUI->parameterChanged(index, value); + } + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + void programLoaded(const uint32_t index) + { + DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); + + fUI->programLoaded(index); + } +#endif + +#if DISTRHO_PLUGIN_WANT_STATE + void stateChanged(const char* const key, const char* const value) + { + DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); + DISTRHO_SAFE_ASSERT_RETURN(value != nullptr,); + + fUI->stateChanged(key, value); + } +#endif + + // ------------------------------------------------------------------- + + void exec(IdleCallback* const cb) + { + DISTRHO_SAFE_ASSERT_RETURN(cb != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); + + glWindow.addIdleCallback(cb); + glWindow.setVisible(true); + glApp.exec(); + } + + void exec_idle() + { + if (glWindow.isReady()) + fUI->uiIdle(); + } + + bool idle() + { + DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr, false); + + glApp.idle(); + + if (glWindow.isReady()) + fUI->uiIdle(); + + return ! glApp.isQuiting(); + } + + void quit() + { + glWindow.close(); + glApp.quit(); + } + + // ------------------------------------------------------------------- + + void setWindowSize(const uint width, const uint height, const bool updateUI = false) + { + DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(! fChangingSize,); + + fChangingSize = true; + + if (updateUI) + fUI->setSize(width, height); + + glWindow.setSize(width, height); + + fChangingSize = false; + } + + void setWindowTitle(const char* const uiTitle) + { + glWindow.setTitle(uiTitle); + } + + void setWindowTransientWinId(const uintptr_t winId) + { + glWindow.setTransientWinId(winId); + } + + bool setWindowVisible(const bool yesNo) + { + glWindow.setVisible(yesNo); + + return ! glApp.isQuiting(); + } + + // ------------------------------------------------------------------- + + void setSampleRate(const double sampleRate, const bool doCallback = false) + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fUI != nullptr,); + DISTRHO_SAFE_ASSERT(sampleRate > 0.0); + + if (d_isEqual(fData->sampleRate, sampleRate)) + return; + + fData->sampleRate = sampleRate; + + if (doCallback) + fUI->sampleRateChanged(sampleRate); + } + +private: + // ------------------------------------------------------------------- + // DGL Application and Window for this widget + + Application glApp; + UIExporterWindow glWindow; + + // prevent recursion + bool fChangingSize; + + // ------------------------------------------------------------------- + // Widget and DistrhoUI data + + UI* const fUI; + UI::PrivateData* const fData; + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UIExporter) +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_UI_INTERNAL_HPP_INCLUDED diff --git a/dpf/distrho/src/DistrhoUILV2.cpp b/dpf/distrho/src/DistrhoUILV2.cpp new file mode 100644 index 0000000..7376a7b --- /dev/null +++ b/dpf/distrho/src/DistrhoUILV2.cpp @@ -0,0 +1,536 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2015 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "DistrhoUIInternal.hpp" + +#include "../extra/String.hpp" + +#include "lv2/atom.h" +#include "lv2/atom-util.h" +#include "lv2/data-access.h" +#include "lv2/instance-access.h" +#include "lv2/options.h" +#include "lv2/ui.h" +#include "lv2/urid.h" +#include "lv2/lv2_kxstudio_properties.h" +#include "lv2/lv2_programs.h" + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- + +class UiLv2 +{ +public: + UiLv2(const intptr_t winId, + const LV2_Options_Option* options, const LV2_URID_Map* const uridMap, const LV2UI_Resize* const uiResz, const LV2UI_Touch* uiTouch, + const LV2UI_Controller controller, const LV2UI_Write_Function writeFunc, + LV2UI_Widget* const widget, void* const dspPtr) + : fUI(this, winId, editParameterCallback, setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, dspPtr), + fUridMap(uridMap), + fUiResize(uiResz), + fUiTouch(uiTouch), + fController(controller), + fWriteFunction(writeFunc), + fEventTransferURID(uridMap->map(uridMap->handle, LV2_ATOM__eventTransfer)), + fKeyValueURID(uridMap->map(uridMap->handle, "urn:distrho:keyValueState")), + fWinIdWasNull(winId == 0) + { + if (fUiResize != nullptr && winId != 0) + fUiResize->ui_resize(fUiResize->handle, fUI.getWidth(), fUI.getHeight()); + + if (widget != nullptr) + *widget = (LV2UI_Widget*)fUI.getWindowId(); + +#if DISTRHO_PLUGIN_WANT_STATE + // tell the DSP we're ready to receive msgs + setState("__dpf_ui_data__", ""); +#endif + + if (winId != 0) + return; + + // if winId == 0 then options must not be null + DISTRHO_SAFE_ASSERT_RETURN(options != nullptr,); + + const LV2_URID uridWindowTitle(uridMap->map(uridMap->handle, LV2_UI__windowTitle)); + const LV2_URID uridTransientWinId(uridMap->map(uridMap->handle, LV2_KXSTUDIO_PROPERTIES__TransientWindowId)); + + bool hasTitle = false; + + for (int i=0; options[i].key != 0; ++i) + { + if (options[i].key == uridTransientWinId) + { + if (options[i].type == uridMap->map(uridMap->handle, LV2_ATOM__Long)) + { + if (const int64_t transientWinId = *(const int64_t*)options[i].value) + fUI.setWindowTransientWinId(static_cast(transientWinId)); + } + else + d_stderr("Host provides transientWinId but has wrong value type"); + } + else if (options[i].key == uridWindowTitle) + { + if (options[i].type == uridMap->map(uridMap->handle, LV2_ATOM__String)) + { + if (const char* const windowTitle = (const char*)options[i].value) + { + hasTitle = true; + fUI.setWindowTitle(windowTitle); + } + } + else + d_stderr("Host provides windowTitle but has wrong value type"); + } + } + + if (! hasTitle) + fUI.setWindowTitle(DISTRHO_PLUGIN_NAME); + } + + // ------------------------------------------------------------------- + + void lv2ui_port_event(const uint32_t rindex, const uint32_t bufferSize, const uint32_t format, const void* const buffer) + { + if (format == 0) + { + const uint32_t parameterOffset(fUI.getParameterOffset()); + + DISTRHO_SAFE_ASSERT_RETURN(rindex >= parameterOffset,) + DISTRHO_SAFE_ASSERT_RETURN(bufferSize == sizeof(float),) + + const float value(*(const float*)buffer); + fUI.parameterChanged(rindex-parameterOffset, value); + } +#if DISTRHO_PLUGIN_WANT_STATE + else if (format == fEventTransferURID) + { + const LV2_Atom* const atom((const LV2_Atom*)buffer); + + DISTRHO_SAFE_ASSERT_RETURN(atom->type == fKeyValueURID,); + + const char* const key = (const char*)LV2_ATOM_BODY_CONST(atom); + const char* const value = key+(std::strlen(key)+1); + + fUI.stateChanged(key, value); + } +#endif + } + + // ------------------------------------------------------------------- + + int lv2ui_idle() + { + if (fWinIdWasNull) + return (fUI.idle() && fUI.isVisible()) ? 0 : 1; + + return fUI.idle() ? 0 : 1; + } + + int lv2ui_show() + { + return fUI.setWindowVisible(true) ? 0 : 1; + } + + int lv2ui_hide() + { + return fUI.setWindowVisible(false) ? 0 : 1; + } + + int lv2ui_resize(uint width, uint height) + { + fUI.setWindowSize(width, height, true); + return 0; + } + + // ------------------------------------------------------------------- + + uint32_t lv2_get_options(LV2_Options_Option* const /*options*/) + { + // currently unused + return LV2_OPTIONS_ERR_UNKNOWN; + } + + uint32_t lv2_set_options(const LV2_Options_Option* const options) + { + for (int i=0; options[i].key != 0; ++i) + { + if (options[i].key == fUridMap->map(fUridMap->handle, LV2_CORE__sampleRate)) + { + if (options[i].type == fUridMap->map(fUridMap->handle, LV2_ATOM__Double)) + { + const double sampleRate(*(const double*)options[i].value); + fUI.setSampleRate(sampleRate); + continue; + } + else + { + d_stderr("Host changed sampleRate but with wrong value type"); + continue; + } + } + } + + return LV2_OPTIONS_SUCCESS; + } + + // ------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + void lv2ui_select_program(const uint32_t bank, const uint32_t program) + { + const uint32_t realProgram(bank * 128 + program); + + fUI.programLoaded(realProgram); + } +#endif + + // ------------------------------------------------------------------- + +protected: + void editParameterValue(const uint32_t rindex, const bool started) + { + if (fUiTouch != nullptr && fUiTouch->touch != nullptr) + fUiTouch->touch(fUiTouch->handle, rindex, started); + } + + void setParameterValue(const uint32_t rindex, const float value) + { + DISTRHO_SAFE_ASSERT_RETURN(fWriteFunction != nullptr,); + + fWriteFunction(fController, rindex, sizeof(float), 0, &value); + } + + void setState(const char* const key, const char* const value) + { + DISTRHO_SAFE_ASSERT_RETURN(fWriteFunction != nullptr,); + + const uint32_t eventInPortIndex(DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS); + + // join key and value + String tmpStr; + tmpStr += key; + tmpStr += "\xff"; + tmpStr += value; + + tmpStr[std::strlen(key)] = '\0'; + + // set msg size (key + separator + value + null terminator) + const size_t msgSize(tmpStr.length()+1); + + // reserve atom space + const size_t atomSize(lv2_atom_pad_size(sizeof(LV2_Atom) + msgSize)); + char atomBuf[atomSize]; + std::memset(atomBuf, 0, atomSize); + + // set atom info + LV2_Atom* const atom((LV2_Atom*)atomBuf); + atom->size = msgSize; + atom->type = fKeyValueURID; + + // set atom data + std::memcpy(atomBuf + sizeof(LV2_Atom), tmpStr.buffer(), msgSize); + + // send to DSP side + fWriteFunction(fController, eventInPortIndex, atomSize, fEventTransferURID, atom); + } + + void sendNote(const uint8_t /*channel*/, const uint8_t /*note*/, const uint8_t /*velocity*/) + { + } + + void setSize(const uint width, const uint height) + { + fUI.setWindowSize(width, height); + + if (fUiResize != nullptr && ! fWinIdWasNull) + fUiResize->ui_resize(fUiResize->handle, width, height); + } + +private: + UIExporter fUI; + + // LV2 features + const LV2_URID_Map* const fUridMap; + const LV2UI_Resize* const fUiResize; + const LV2UI_Touch* const fUiTouch; + + // LV2 UI stuff + const LV2UI_Controller fController; + const LV2UI_Write_Function fWriteFunction; + + // Need to save this + const LV2_URID fEventTransferURID; + const LV2_URID fKeyValueURID; + + // using ui:showInterface if true + bool fWinIdWasNull; + + // ------------------------------------------------------------------- + // Callbacks + + #define uiPtr ((UiLv2*)ptr) + + static void editParameterCallback(void* ptr, uint32_t rindex, bool started) + { + uiPtr->editParameterValue(rindex, started); + } + + static void setParameterCallback(void* ptr, uint32_t rindex, float value) + { + uiPtr->setParameterValue(rindex, value); + } + + static void setStateCallback(void* ptr, const char* key, const char* value) + { + uiPtr->setState(key, value); + } + + static void sendNoteCallback(void* ptr, uint8_t channel, uint8_t note, uint8_t velocity) + { + uiPtr->sendNote(channel, note, velocity); + } + + static void setSizeCallback(void* ptr, uint width, uint height) + { + uiPtr->setSize(width, height); + } + + #undef uiPtr +}; + +// ----------------------------------------------------------------------- + +static LV2UI_Handle lv2ui_instantiate(const LV2UI_Descriptor*, const char* uri, const char*, LV2UI_Write_Function writeFunction, LV2UI_Controller controller, LV2UI_Widget* widget, const LV2_Feature* const* features) +{ + if (uri == nullptr || std::strcmp(uri, DISTRHO_PLUGIN_URI) != 0) + { + d_stderr("Invalid plugin URI"); + return nullptr; + } + + const LV2_Options_Option* options = nullptr; + const LV2_URID_Map* uridMap = nullptr; + const LV2UI_Resize* uiResize = nullptr; + const LV2UI_Touch* uiTouch = nullptr; + void* parentId = nullptr; + void* instance = nullptr; + +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS +# define DISTRHO_DIRECT_ACCESS_URI "urn:distrho:direct-access" + + struct LV2_DirectAccess_Interface { + void* (*get_instance_pointer)(LV2_Handle handle); + }; + const LV2_Extension_Data_Feature* extData = nullptr; +#endif + + for (int i=0; features[i] != nullptr; ++i) + { + if (std::strcmp(features[i]->URI, LV2_OPTIONS__options) == 0) + options = (const LV2_Options_Option*)features[i]->data; + else if (std::strcmp(features[i]->URI, LV2_URID__map) == 0) + uridMap = (const LV2_URID_Map*)features[i]->data; + else if (std::strcmp(features[i]->URI, LV2_UI__resize) == 0) + uiResize = (const LV2UI_Resize*)features[i]->data; + else if (std::strcmp(features[i]->URI, LV2_UI__parent) == 0) + parentId = features[i]->data; +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + else if (std::strcmp(features[i]->URI, LV2_DATA_ACCESS_URI) == 0) + extData = (const LV2_Extension_Data_Feature*)features[i]->data; + else if (std::strcmp(features[i]->URI, LV2_INSTANCE_ACCESS_URI) == 0) + instance = features[i]->data; +#endif + } + + if (options == nullptr && parentId == nullptr) + { + d_stderr("Options feature missing (needed for show-interface), cannot continue!"); + return nullptr; + } + + if (uridMap == nullptr) + { + d_stderr("URID Map feature missing, cannot continue!"); + return nullptr; + } + + if (parentId == nullptr) + { + d_stdout("Parent Window Id missing, host should be using ui:showInterface..."); + } + +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + if (extData == nullptr || instance == nullptr) + { + d_stderr("Data or instance access missing, cannot continue!"); + return nullptr; + } + + if (const LV2_DirectAccess_Interface* const directAccess = (const LV2_DirectAccess_Interface*)extData->data_access(DISTRHO_DIRECT_ACCESS_URI)) + instance = directAccess->get_instance_pointer(instance); + else + instance = nullptr; + + if (instance == nullptr) + { + d_stderr("Failed to get direct access, cannot continue!"); + return nullptr; + } +#endif + + const intptr_t winId((intptr_t)parentId); + + if (options != nullptr) + { + const LV2_URID uridSampleRate(uridMap->map(uridMap->handle, LV2_CORE__sampleRate)); + + for (int i=0; options[i].key != 0; ++i) + { + if (options[i].key == uridSampleRate) + { + if (options[i].type == uridMap->map(uridMap->handle, LV2_ATOM__Double)) + d_lastUiSampleRate = *(const double*)options[i].value; + else + d_stderr("Host provides sampleRate but has wrong value type"); + + break; + } + } + } + + if (d_lastUiSampleRate == 0.0) + { + d_stdout("WARNING: this host does not send sample-rate information for LV2 UIs, using 44100 as fallback (this could be wrong)"); + d_lastUiSampleRate = 44100.0; + } + + return new UiLv2(winId, options, uridMap, uiResize, uiTouch, controller, writeFunction, widget, instance); +} + +#define uiPtr ((UiLv2*)ui) + +static void lv2ui_cleanup(LV2UI_Handle ui) +{ + delete uiPtr; +} + +static void lv2ui_port_event(LV2UI_Handle ui, uint32_t portIndex, uint32_t bufferSize, uint32_t format, const void* buffer) +{ + uiPtr->lv2ui_port_event(portIndex, bufferSize, format, buffer); +} + +// ----------------------------------------------------------------------- + +static int lv2ui_idle(LV2UI_Handle ui) +{ + return uiPtr->lv2ui_idle(); +} + +static int lv2ui_show(LV2UI_Handle ui) +{ + return uiPtr->lv2ui_show(); +} + +static int lv2ui_hide(LV2UI_Handle ui) +{ + return uiPtr->lv2ui_hide(); +} + +static int lv2ui_resize(LV2UI_Handle ui, int width, int height) +{ + DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr, 1); + DISTRHO_SAFE_ASSERT_RETURN(width > 0, 1); + DISTRHO_SAFE_ASSERT_RETURN(height > 0, 1); + + return 1; // This needs more testing + //return uiPtr->lv2ui_resize(width, height); +} + +// ----------------------------------------------------------------------- + +static uint32_t lv2_get_options(LV2UI_Handle ui, LV2_Options_Option* options) +{ + return uiPtr->lv2_get_options(options); +} + +static uint32_t lv2_set_options(LV2UI_Handle ui, const LV2_Options_Option* options) +{ + return uiPtr->lv2_set_options(options); +} + +// ----------------------------------------------------------------------- + +#if DISTRHO_PLUGIN_WANT_PROGRAMS +static void lv2ui_select_program(LV2UI_Handle ui, uint32_t bank, uint32_t program) +{ + uiPtr->lv2ui_select_program(bank, program); +} +#endif + +// ----------------------------------------------------------------------- + +static const void* lv2ui_extension_data(const char* uri) +{ + static const LV2_Options_Interface options = { lv2_get_options, lv2_set_options }; + static const LV2UI_Idle_Interface uiIdle = { lv2ui_idle }; + static const LV2UI_Show_Interface uiShow = { lv2ui_show, lv2ui_hide }; + static const LV2UI_Resize uiResz = { nullptr, lv2ui_resize }; + + if (std::strcmp(uri, LV2_OPTIONS__interface) == 0) + return &options; + if (std::strcmp(uri, LV2_UI__idleInterface) == 0) + return &uiIdle; + if (std::strcmp(uri, LV2_UI__showInterface) == 0) + return &uiShow; + if (std::strcmp(uri, LV2_UI__resize) == 0) + return &uiResz; + +#if DISTRHO_PLUGIN_WANT_PROGRAMS + static const LV2_Programs_UI_Interface uiPrograms = { lv2ui_select_program }; + + if (std::strcmp(uri, LV2_PROGRAMS__UIInterface) == 0) + return &uiPrograms; +#endif + + return nullptr; +} + +#undef instancePtr + +// ----------------------------------------------------------------------- + +static const LV2UI_Descriptor sLv2UiDescriptor = { + DISTRHO_UI_URI, + lv2ui_instantiate, + lv2ui_cleanup, + lv2ui_port_event, + lv2ui_extension_data +}; + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +DISTRHO_PLUGIN_EXPORT +const LV2UI_Descriptor* lv2ui_descriptor(uint32_t index) +{ + USE_NAMESPACE_DISTRHO + return (index == 0) ? &sLv2UiDescriptor : nullptr; +} + +// ----------------------------------------------------------------------- diff --git a/dpf/distrho/src/dssi/dssi.h b/dpf/distrho/src/dssi/dssi.h new file mode 100644 index 0000000..ce36e18 --- /dev/null +++ b/dpf/distrho/src/dssi/dssi.h @@ -0,0 +1,441 @@ +/* -*- c-basic-offset: 4 -*- */ + +/* dssi.h + + DSSI version 1.0 + Copyright (c) 2004, 2009 Chris Cannam, Steve Harris and Sean Bolton + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 2.1 of + the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301 USA +*/ + +#ifndef DSSI_INCLUDED +#define DSSI_INCLUDED + +#include "../ladspa/ladspa.h" +#include "seq_event-compat.h" + +#define DSSI_VERSION "1.0" +#define DSSI_VERSION_MAJOR 1 +#define DSSI_VERSION_MINOR 0 + +#ifdef __cplusplus +extern "C" { +#endif + +/* + There is a need for an API that supports hosted MIDI soft synths + with GUIs in Linux audio applications. In time the GMPI initiative + should comprehensively address this need, but the requirement for + Linux applications to be able to support simple hosted synths is + here now, and GMPI is not. This proposal (the "DSSI Soft Synth + Interface" or DSSI, pronounced "dizzy") aims to provide a simple + solution in a way that we hope will prove complete and compelling + enough to support now, yet not so compelling as to supplant GMPI or + any other comprehensive future proposal. + + For simplicity and familiarity, this API is based as far as + possible on existing work -- the LADSPA plugin API for control + values and audio processing, and the ALSA sequencer event types for + MIDI event communication. The GUI part of the proposal is quite + new, but may also be applicable retroactively to LADSPA plugins + that do not otherwise support this synth interface. +*/ + +typedef struct _DSSI_Program_Descriptor { + + /** Bank number for this program. Note that DSSI does not support + MIDI-style separation of bank LSB and MSB values. There is no + restriction on the set of available banks: the numbers do not + need to be contiguous, there does not need to be a bank 0, etc. */ + unsigned long Bank; + + /** Program number (unique within its bank) for this program. + There is no restriction on the set of available programs: the + numbers do not need to be contiguous, there does not need to + be a program 0, etc. */ + unsigned long Program; + + /** Name of the program. */ + const char * Name; + +} DSSI_Program_Descriptor; + + +typedef struct _DSSI_Descriptor { + + /** + * DSSI_API_Version + * + * This member indicates the DSSI API level used by this plugin. + * If we're lucky, this will never be needed. For now all plugins + * must set it to 1. + */ + int DSSI_API_Version; + + /** + * LADSPA_Plugin + * + * A DSSI synth plugin consists of a LADSPA plugin plus an + * additional framework for controlling program settings and + * transmitting MIDI events. A plugin must fully implement the + * LADSPA descriptor fields as well as the required LADSPA + * functions including instantiate() and (de)activate(). It + * should also implement run(), with the same behaviour as if + * run_synth() (below) were called with no synth events. + * + * In order to instantiate a synth the host calls the LADSPA + * instantiate function, passing in this LADSPA_Descriptor + * pointer. The returned LADSPA_Handle is used as the argument + * for the DSSI functions below as well as for the LADSPA ones. + */ + const LADSPA_Descriptor *LADSPA_Plugin; + + /** + * configure() + * + * This member is a function pointer that sends a piece of + * configuration data to the plugin. The key argument specifies + * some aspect of the synth's configuration that is to be changed, + * and the value argument specifies a new value for it. A plugin + * that does not require this facility at all may set this member + * to NULL. + * + * This call is intended to set some session-scoped aspect of a + * plugin's behaviour, for example to tell the plugin to load + * sample data from a particular file. The plugin should act + * immediately on the request. The call should return NULL on + * success, or an error string that may be shown to the user. The + * host will free the returned value after use if it is non-NULL. + * + * Calls to configure() are not automated as timed events. + * Instead, a host should remember the last value associated with + * each key passed to configure() during a given session for a + * given plugin instance, and should call configure() with the + * correct value for each key the next time it instantiates the + * "same" plugin instance, for example on reloading a project in + * which the plugin was used before. Plugins should note that a + * host may typically instantiate a plugin multiple times with the + * same configuration values, and should share data between + * instances where practical. + * + * Calling configure() completely invalidates the program and bank + * information last obtained from the plugin. + * + * Reserved and special key prefixes + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * The DSSI: prefix + * ---------------- + * Configure keys starting with DSSI: are reserved for particular + * purposes documented in the DSSI specification. At the moment, + * there is one such key: DSSI:PROJECT_DIRECTORY. A host may call + * configure() passing this key and a directory path value. This + * indicates to the plugin and its UI that a directory at that + * path exists and may be used for project-local data. Plugins + * may wish to use the project directory as a fallback location + * when looking for other file data, or as a base for relative + * paths in other configuration values. + * + * The GLOBAL: prefix + * ------------------ + * Configure keys starting with GLOBAL: may be used by the plugin + * and its UI for any purpose, but are treated specially by the + * host. When one of these keys is used in a configure OSC call + * from the plugin UI, the host makes the corresponding configure + * call (preserving the GLOBAL: prefix) not only to the target + * plugin but also to all other plugins in the same instance + * group, as well as their UIs. Note that if any instance + * returns non-NULL from configure to indicate error, the host + * may stop there (and the set of plugins on which configure has + * been called will thus depend on the host implementation). + * See also the configure OSC call documentation in RFC.txt. + */ + char *(*configure)(LADSPA_Handle Instance, + const char *Key, + const char *Value); + + #define DSSI_RESERVED_CONFIGURE_PREFIX "DSSI:" + #define DSSI_GLOBAL_CONFIGURE_PREFIX "GLOBAL:" + #define DSSI_PROJECT_DIRECTORY_KEY \ + DSSI_RESERVED_CONFIGURE_PREFIX "PROJECT_DIRECTORY" + + /** + * get_program() + * + * This member is a function pointer that provides a description + * of a program (named preset sound) available on this synth. A + * plugin that does not support programs at all should set this + * member to NULL. + * + * The Index argument is an index into the plugin's list of + * programs, not a program number as represented by the Program + * field of the DSSI_Program_Descriptor. (This distinction is + * needed to support synths that use non-contiguous program or + * bank numbers.) + * + * This function returns a DSSI_Program_Descriptor pointer that is + * guaranteed to be valid only until the next call to get_program, + * deactivate, or configure, on the same plugin instance. This + * function must return NULL if passed an Index argument out of + * range, so that the host can use it to query the number of + * programs as well as their properties. + */ + const DSSI_Program_Descriptor *(*get_program)(LADSPA_Handle Instance, + unsigned long Index); + + /** + * select_program() + * + * This member is a function pointer that selects a new program + * for this synth. The program change should take effect + * immediately at the start of the next run_synth() call. (This + * means that a host providing the capability of changing programs + * between any two notes on a track must vary the block size so as + * to place the program change at the right place. A host that + * wanted to avoid this would probably just instantiate a plugin + * for each program.) + * + * A plugin that does not support programs at all should set this + * member NULL. Plugins should ignore a select_program() call + * with an invalid bank or program. + * + * A plugin is not required to select any particular default + * program on activate(): it's the host's duty to set a program + * explicitly. The current program is invalidated by any call to + * configure(). + * + * A plugin is permitted to re-write the values of its input + * control ports when select_program is called. The host should + * re-read the input control port values and update its own + * records appropriately. (This is the only circumstance in + * which a DSSI plugin is allowed to modify its own input ports.) + */ + void (*select_program)(LADSPA_Handle Instance, + unsigned long Bank, + unsigned long Program); + + /** + * get_midi_controller_for_port() + * + * This member is a function pointer that returns the MIDI + * controller number or NRPN that should be mapped to the given + * input control port. If the given port should not have any MIDI + * controller mapped to it, the function should return DSSI_NONE. + * The behaviour of this function is undefined if the given port + * number does not correspond to an input control port. A plugin + * that does not want MIDI controllers mapped to ports at all may + * set this member NULL. + * + * Correct values can be got using the macros DSSI_CC(num) and + * DSSI_NRPN(num) as appropriate, and values can be combined using + * bitwise OR: e.g. DSSI_CC(23) | DSSI_NRPN(1069) means the port + * should respond to CC #23 and NRPN #1069. + * + * The host is responsible for doing proper scaling from MIDI + * controller and NRPN value ranges to port ranges according to + * the plugin's LADSPA port hints. Hosts should not deliver + * through run_synth any MIDI controller events that have already + * been mapped to control port values. + * + * A plugin should not attempt to request mappings from + * controllers 0 or 32 (MIDI Bank Select MSB and LSB). + */ + int (*get_midi_controller_for_port)(LADSPA_Handle Instance, + unsigned long Port); + + /** + * run_synth() + * + * This member is a function pointer that runs a synth for a + * block. This is identical in function to the LADSPA run() + * function, except that it also supplies events to the synth. + * + * A plugin may provide this function, run_multiple_synths() (see + * below), both, or neither (if it is not in fact a synth). A + * plugin that does not provide this function must set this member + * to NULL. Authors of synth plugins are encouraged to provide + * this function if at all possible. + * + * The Events pointer points to a block of EventCount ALSA + * sequencer events, which is used to communicate MIDI and related + * events to the synth. Each event is timestamped relative to the + * start of the block, (mis)using the ALSA "tick time" field as a + * frame count. The host is responsible for ensuring that events + * with differing timestamps are already ordered by time. + * + * See also the notes on activation, port connection etc in + * ladpsa.h, in the context of the LADSPA run() function. + * + * Note Events + * ~~~~~~~~~~~ + * There are two minor requirements aimed at making the plugin + * writer's life as simple as possible: + * + * 1. A host must never send events of type SND_SEQ_EVENT_NOTE. + * Notes should always be sent as separate SND_SEQ_EVENT_NOTE_ON + * and NOTE_OFF events. A plugin should discard any one-point + * NOTE events it sees. + * + * 2. A host must not attempt to switch notes off by sending + * zero-velocity NOTE_ON events. It should always send true + * NOTE_OFFs. It is the host's responsibility to remap events in + * cases where an external MIDI source has sent it zero-velocity + * NOTE_ONs. + * + * Bank and Program Events + * ~~~~~~~~~~~~~~~~~~~~~~~ + * Hosts must map MIDI Bank Select MSB and LSB (0 and 32) + * controllers and MIDI Program Change events onto the banks and + * programs specified by the plugin, using the DSSI select_program + * call. No host should ever deliver a program change or bank + * select controller to a plugin via run_synth. + */ + void (*run_synth)(LADSPA_Handle Instance, + unsigned long SampleCount, + snd_seq_event_t *Events, + unsigned long EventCount); + + /** + * run_synth_adding() + * + * This member is a function pointer that runs an instance of a + * synth for a block, adding its outputs to the values already + * present at the output ports. This is provided for symmetry + * with LADSPA run_adding(), and is equally optional. A plugin + * that does not provide it must set this member to NULL. + */ + void (*run_synth_adding)(LADSPA_Handle Instance, + unsigned long SampleCount, + snd_seq_event_t *Events, + unsigned long EventCount); + + /** + * run_multiple_synths() + * + * This member is a function pointer that runs multiple synth + * instances for a block. This is very similar to run_synth(), + * except that Instances, Events, and EventCounts each point to + * arrays that hold the LADSPA handles, event buffers, and + * event counts for each of InstanceCount instances. That is, + * Instances points to an array of InstanceCount pointers to + * DSSI plugin instantiations, Events points to an array of + * pointers to each instantiation's respective event list, and + * EventCounts points to an array containing each instantiation's + * respective event count. + * + * A host using this function must guarantee that ALL active + * instances of the plugin are represented in each call to the + * function -- that is, a host may not call run_multiple_synths() + * for some instances of a given plugin and then call run_synth() + * as well for others. 'All .. instances of the plugin' means + * every instance sharing the same LADSPA label and shared object + * (*.so) file (rather than every instance sharing the same *.so). + * 'Active' means any instance for which activate() has been called + * but deactivate() has not. + * + * A plugin may provide this function, run_synths() (see above), + * both, or neither (if it not in fact a synth). A plugin that + * does not provide this function must set this member to NULL. + * Plugin authors implementing run_multiple_synths are strongly + * encouraged to implement run_synth as well if at all possible, + * to aid simplistic hosts, even where it would be less efficient + * to use it. + */ + void (*run_multiple_synths)(unsigned long InstanceCount, + LADSPA_Handle *Instances, + unsigned long SampleCount, + snd_seq_event_t **Events, + unsigned long *EventCounts); + + /** + * run_multiple_synths_adding() + * + * This member is a function pointer that runs multiple synth + * instances for a block, adding each synth's outputs to the + * values already present at the output ports. This is provided + * for symmetry with both the DSSI run_multiple_synths() and LADSPA + * run_adding() functions, and is equally optional. A plugin + * that does not provide it must set this member to NULL. + */ + void (*run_multiple_synths_adding)(unsigned long InstanceCount, + LADSPA_Handle *Instances, + unsigned long SampleCount, + snd_seq_event_t **Events, + unsigned long *EventCounts); + + /** + * set_custom_data() + */ + int (*set_custom_data)(LADSPA_Handle Instance, + void *Data, + unsigned long DataLength); + + /** + * get_custom_data() + */ + int (*get_custom_data)(LADSPA_Handle Instance, + void **Data, + unsigned long *DataLength); + +} DSSI_Descriptor; + +/** + * DSSI supports a plugin discovery method similar to that of LADSPA: + * + * - DSSI hosts may wish to locate DSSI plugin shared object files by + * searching the paths contained in the DSSI_PATH and LADSPA_PATH + * environment variables, if they are present. Both are expected + * to be colon-separated lists of directories to be searched (in + * order), and DSSI_PATH should be searched first if both variables + * are set. + * + * - Each shared object file containing DSSI plugins must include a + * function dssi_descriptor(), with the following function prototype + * and C-style linkage. Hosts may enumerate the plugin types + * available in the shared object file by repeatedly calling + * this function with successive Index values (beginning from 0), + * until a return value of NULL indicates no more plugin types are + * available. Each non-NULL return is the DSSI_Descriptor + * of a distinct plugin type. + */ + +const DSSI_Descriptor *dssi_descriptor(unsigned long Index); + +typedef const DSSI_Descriptor *(*DSSI_Descriptor_Function)(unsigned long Index); + +/* + * Macros to specify particular MIDI controllers in return values from + * get_midi_controller_for_port() + */ + +#define DSSI_CC_BITS 0x20000000 +#define DSSI_NRPN_BITS 0x40000000 + +#define DSSI_NONE -1 +#define DSSI_CONTROLLER_IS_SET(n) (DSSI_NONE != (n)) + +#define DSSI_CC(n) (DSSI_CC_BITS | (n)) +#define DSSI_IS_CC(n) (DSSI_CC_BITS & (n)) +#define DSSI_CC_NUMBER(n) ((n) & 0x7f) + +#define DSSI_NRPN(n) (DSSI_NRPN_BITS | ((n) << 7)) +#define DSSI_IS_NRPN(n) (DSSI_NRPN_BITS & (n)) +#define DSSI_NRPN_NUMBER(n) (((n) >> 7) & 0x3fff) + +#ifdef __cplusplus +} +#endif + +#endif /* DSSI_INCLUDED */ diff --git a/dpf/distrho/src/dssi/seq_event-compat.h b/dpf/distrho/src/dssi/seq_event-compat.h new file mode 100644 index 0000000..6619c23 --- /dev/null +++ b/dpf/distrho/src/dssi/seq_event-compat.h @@ -0,0 +1,272 @@ +/* + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef __ALSA_SEQ_EVENT_COMPAT_H +#define __ALSA_SEQ_EVENT_COMPAT_H + +/** + * Sequencer event data type + */ +typedef unsigned char snd_seq_event_type_t; + +/** Sequencer event type */ +enum snd_seq_event_type { + /** system status; event data type = #snd_seq_result_t */ + SND_SEQ_EVENT_SYSTEM = 0, + /** returned result status; event data type = #snd_seq_result_t */ + SND_SEQ_EVENT_RESULT, + + /** note on and off with duration; event data type = #snd_seq_ev_note_t */ + SND_SEQ_EVENT_NOTE = 5, + /** note on; event data type = #snd_seq_ev_note_t */ + SND_SEQ_EVENT_NOTEON, + /** note off; event data type = #snd_seq_ev_note_t */ + SND_SEQ_EVENT_NOTEOFF, + /** key pressure change (aftertouch); event data type = #snd_seq_ev_note_t */ + SND_SEQ_EVENT_KEYPRESS, + + /** controller; event data type = #snd_seq_ev_ctrl_t */ + SND_SEQ_EVENT_CONTROLLER = 10, + /** program change; event data type = #snd_seq_ev_ctrl_t */ + SND_SEQ_EVENT_PGMCHANGE, + /** channel pressure; event data type = #snd_seq_ev_ctrl_t */ + SND_SEQ_EVENT_CHANPRESS, + /** pitchwheel; event data type = #snd_seq_ev_ctrl_t; data is from -8192 to 8191) */ + SND_SEQ_EVENT_PITCHBEND, + /** 14 bit controller value; event data type = #snd_seq_ev_ctrl_t */ + SND_SEQ_EVENT_CONTROL14, + /** 14 bit NRPN; event data type = #snd_seq_ev_ctrl_t */ + SND_SEQ_EVENT_NONREGPARAM, + /** 14 bit RPN; event data type = #snd_seq_ev_ctrl_t */ + SND_SEQ_EVENT_REGPARAM, + + /** SPP with LSB and MSB values; event data type = #snd_seq_ev_ctrl_t */ + SND_SEQ_EVENT_SONGPOS = 20, + /** Song Select with song ID number; event data type = #snd_seq_ev_ctrl_t */ + SND_SEQ_EVENT_SONGSEL, + /** midi time code quarter frame; event data type = #snd_seq_ev_ctrl_t */ + SND_SEQ_EVENT_QFRAME, + /** SMF Time Signature event; event data type = #snd_seq_ev_ctrl_t */ + SND_SEQ_EVENT_TIMESIGN, + /** SMF Key Signature event; event data type = #snd_seq_ev_ctrl_t */ + SND_SEQ_EVENT_KEYSIGN, + + /** MIDI Real Time Start message; event data type = #snd_seq_ev_queue_control_t */ + SND_SEQ_EVENT_START = 30, + /** MIDI Real Time Continue message; event data type = #snd_seq_ev_queue_control_t */ + SND_SEQ_EVENT_CONTINUE, + /** MIDI Real Time Stop message; event data type = #snd_seq_ev_queue_control_t */ + SND_SEQ_EVENT_STOP, + /** Set tick queue position; event data type = #snd_seq_ev_queue_control_t */ + SND_SEQ_EVENT_SETPOS_TICK, + /** Set real-time queue position; event data type = #snd_seq_ev_queue_control_t */ + SND_SEQ_EVENT_SETPOS_TIME, + /** (SMF) Tempo event; event data type = #snd_seq_ev_queue_control_t */ + SND_SEQ_EVENT_TEMPO, + /** MIDI Real Time Clock message; event data type = #snd_seq_ev_queue_control_t */ + SND_SEQ_EVENT_CLOCK, + /** MIDI Real Time Tick message; event data type = #snd_seq_ev_queue_control_t */ + SND_SEQ_EVENT_TICK, + /** Queue timer skew; event data type = #snd_seq_ev_queue_control_t */ + SND_SEQ_EVENT_QUEUE_SKEW, + /** Sync position changed; event data type = #snd_seq_ev_queue_control_t */ + SND_SEQ_EVENT_SYNC_POS, + + /** Tune request; event data type = none */ + SND_SEQ_EVENT_TUNE_REQUEST = 40, + /** Reset to power-on state; event data type = none */ + SND_SEQ_EVENT_RESET, + /** Active sensing event; event data type = none */ + SND_SEQ_EVENT_SENSING, + + /** Echo-back event; event data type = any type */ + SND_SEQ_EVENT_ECHO = 50, + /** OSS emulation raw event; event data type = any type */ + SND_SEQ_EVENT_OSS, + + /** New client has connected; event data type = #snd_seq_addr_t */ + SND_SEQ_EVENT_CLIENT_START = 60, + /** Client has left the system; event data type = #snd_seq_addr_t */ + SND_SEQ_EVENT_CLIENT_EXIT, + /** Client status/info has changed; event data type = #snd_seq_addr_t */ + SND_SEQ_EVENT_CLIENT_CHANGE, + /** New port was created; event data type = #snd_seq_addr_t */ + SND_SEQ_EVENT_PORT_START, + /** Port was deleted from system; event data type = #snd_seq_addr_t */ + SND_SEQ_EVENT_PORT_EXIT, + /** Port status/info has changed; event data type = #snd_seq_addr_t */ + SND_SEQ_EVENT_PORT_CHANGE, + + /** Ports connected; event data type = #snd_seq_connect_t */ + SND_SEQ_EVENT_PORT_SUBSCRIBED, + /** Ports disconnected; event data type = #snd_seq_connect_t */ + SND_SEQ_EVENT_PORT_UNSUBSCRIBED, + + /** user-defined event; event data type = any (fixed size) */ + SND_SEQ_EVENT_USR0 = 90, + /** user-defined event; event data type = any (fixed size) */ + SND_SEQ_EVENT_USR1, + /** user-defined event; event data type = any (fixed size) */ + SND_SEQ_EVENT_USR2, + /** user-defined event; event data type = any (fixed size) */ + SND_SEQ_EVENT_USR3, + /** user-defined event; event data type = any (fixed size) */ + SND_SEQ_EVENT_USR4, + /** user-defined event; event data type = any (fixed size) */ + SND_SEQ_EVENT_USR5, + /** user-defined event; event data type = any (fixed size) */ + SND_SEQ_EVENT_USR6, + /** user-defined event; event data type = any (fixed size) */ + SND_SEQ_EVENT_USR7, + /** user-defined event; event data type = any (fixed size) */ + SND_SEQ_EVENT_USR8, + /** user-defined event; event data type = any (fixed size) */ + SND_SEQ_EVENT_USR9, + + /** system exclusive data (variable length); event data type = #snd_seq_ev_ext_t */ + SND_SEQ_EVENT_SYSEX = 130, + /** error event; event data type = #snd_seq_ev_ext_t */ + SND_SEQ_EVENT_BOUNCE, + /** reserved for user apps; event data type = #snd_seq_ev_ext_t */ + SND_SEQ_EVENT_USR_VAR0 = 135, + /** reserved for user apps; event data type = #snd_seq_ev_ext_t */ + SND_SEQ_EVENT_USR_VAR1, + /** reserved for user apps; event data type = #snd_seq_ev_ext_t */ + SND_SEQ_EVENT_USR_VAR2, + /** reserved for user apps; event data type = #snd_seq_ev_ext_t */ + SND_SEQ_EVENT_USR_VAR3, + /** reserved for user apps; event data type = #snd_seq_ev_ext_t */ + SND_SEQ_EVENT_USR_VAR4, + + /** NOP; ignored in any case */ + SND_SEQ_EVENT_NONE = 255 +}; + +/** Sequencer event address */ +typedef struct snd_seq_addr { + unsigned char client; /**< Client id */ + unsigned char port; /**< Port id */ +} snd_seq_addr_t; + +/** Connection (subscription) between ports */ +typedef struct snd_seq_connect { + snd_seq_addr_t sender; /**< sender address */ + snd_seq_addr_t dest; /**< destination address */ +} snd_seq_connect_t; + +/** Real-time data record */ +typedef struct snd_seq_real_time { + unsigned int tv_sec; /**< seconds */ + unsigned int tv_nsec; /**< nanoseconds */ +} snd_seq_real_time_t; + +/** (MIDI) Tick-time data record */ +typedef unsigned int snd_seq_tick_time_t; + +/** unioned time stamp */ +typedef union snd_seq_timestamp { + snd_seq_tick_time_t tick; /**< tick-time */ + struct snd_seq_real_time time; /**< real-time */ +} snd_seq_timestamp_t; + +/** Note event */ +typedef struct snd_seq_ev_note { + unsigned char channel; /**< channel number */ + unsigned char note; /**< note */ + unsigned char velocity; /**< velocity */ + unsigned char off_velocity; /**< note-off velocity; only for #SND_SEQ_EVENT_NOTE */ + unsigned int duration; /**< duration until note-off; only for #SND_SEQ_EVENT_NOTE */ +} snd_seq_ev_note_t; + +/** Controller event */ +typedef struct snd_seq_ev_ctrl { + unsigned char channel; /**< channel number */ + unsigned char unused[3]; /**< reserved */ + unsigned int param; /**< control parameter */ + signed int value; /**< control value */ +} snd_seq_ev_ctrl_t; + +/** generic set of bytes (12x8 bit) */ +typedef struct snd_seq_ev_raw8 { + unsigned char d[12]; /**< 8 bit value */ +} snd_seq_ev_raw8_t; + +/** generic set of integers (3x32 bit) */ +typedef struct snd_seq_ev_raw32 { + unsigned int d[3]; /**< 32 bit value */ +} snd_seq_ev_raw32_t; + +/** external stored data */ +typedef struct snd_seq_ev_ext { + unsigned int len; /**< length of data */ + void *ptr; /**< pointer to data (note: can be 64-bit) */ +} __attribute__((packed)) snd_seq_ev_ext_t; + +/** Result events */ +typedef struct snd_seq_result { + int event; /**< processed event type */ + int result; /**< status */ +} snd_seq_result_t; + +/** Queue skew values */ +typedef struct snd_seq_queue_skew { + unsigned int value; /**< skew value */ + unsigned int base; /**< skew base */ +} snd_seq_queue_skew_t; + +/** queue timer control */ +typedef struct snd_seq_ev_queue_control { + unsigned char queue; /**< affected queue */ + unsigned char unused[3]; /**< reserved */ + union { + signed int value; /**< affected value (e.g. tempo) */ + snd_seq_timestamp_t time; /**< time */ + unsigned int position; /**< sync position */ + snd_seq_queue_skew_t skew; /**< queue skew */ + unsigned int d32[2]; /**< any data */ + unsigned char d8[8]; /**< any data */ + } param; /**< data value union */ +} snd_seq_ev_queue_control_t; + +/** Sequencer event */ +typedef struct snd_seq_event { + snd_seq_event_type_t type; /**< event type */ + unsigned char flags; /**< event flags */ + unsigned char tag; /**< tag */ + + unsigned char queue; /**< schedule queue */ + snd_seq_timestamp_t time; /**< schedule time */ + + snd_seq_addr_t source; /**< source address */ + snd_seq_addr_t dest; /**< destination address */ + + union { + snd_seq_ev_note_t note; /**< note information */ + snd_seq_ev_ctrl_t control; /**< MIDI control information */ + snd_seq_ev_raw8_t raw8; /**< raw8 data */ + snd_seq_ev_raw32_t raw32; /**< raw32 data */ + snd_seq_ev_ext_t ext; /**< external data */ + snd_seq_ev_queue_control_t queue; /**< queue control */ + snd_seq_timestamp_t time; /**< timestamp */ + snd_seq_addr_t addr; /**< address */ + snd_seq_connect_t connect; /**< connect information */ + snd_seq_result_t result; /**< operation result code */ + } data; /**< event data... */ +} snd_seq_event_t; + +#endif /* __ALSA_SEQ_EVENT_COMPAT_H */ + diff --git a/dpf/distrho/src/ladspa/ladspa.h b/dpf/distrho/src/ladspa/ladspa.h new file mode 100644 index 0000000..5c30a8a --- /dev/null +++ b/dpf/distrho/src/ladspa/ladspa.h @@ -0,0 +1,603 @@ +/* ladspa.h + + Linux Audio Developer's Simple Plugin API Version 1.1[LGPL]. + Copyright (C) 2000-2002 Richard W.E. Furse, Paul Barton-Davis, + Stefan Westerfeld. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 2.1 of + the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. */ + +#ifndef LADSPA_INCLUDED +#define LADSPA_INCLUDED + +#define LADSPA_VERSION "1.1" +#define LADSPA_VERSION_MAJOR 1 +#define LADSPA_VERSION_MINOR 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/*****************************************************************************/ + +/* Overview: + + There is a large number of synthesis packages in use or development + on the Linux platform at this time. This API (`The Linux Audio + Developer's Simple Plugin API') attempts to give programmers the + ability to write simple `plugin' audio processors in C/C++ and link + them dynamically (`plug') into a range of these packages (`hosts'). + It should be possible for any host and any plugin to communicate + completely through this interface. + + This API is deliberately short and simple. To achieve compatibility + with a range of promising Linux sound synthesis packages it + attempts to find the `greatest common divisor' in their logical + behaviour. Having said this, certain limiting decisions are + implicit, notably the use of a fixed type (LADSPA_Data) for all + data transfer and absence of a parameterised `initialisation' + phase. See below for the LADSPA_Data typedef. + + Plugins are expected to distinguish between control and audio + data. Plugins have `ports' that are inputs or outputs for audio or + control data and each plugin is `run' for a `block' corresponding + to a short time interval measured in samples. Audio data is + communicated using arrays of LADSPA_Data, allowing a block of audio + to be processed by the plugin in a single pass. Control data is + communicated using single LADSPA_Data values. Control data has a + single value at the start of a call to the `run()' or `run_adding()' + function, and may be considered to remain this value for its + duration. The plugin may assume that all its input and output ports + have been connected to the relevant data location (see the + `connect_port()' function below) before it is asked to run. + + Plugins will reside in shared object files suitable for dynamic + linking by dlopen() and family. The file will provide a number of + `plugin types' that can be used to instantiate actual plugins + (sometimes known as `plugin instances') that can be connected + together to perform tasks. + + This API contains very limited error-handling. */ + +/*****************************************************************************/ + +/* Fundamental data type passed in and out of plugin. This data type + is used to communicate audio samples and control values. It is + assumed that the plugin will work sensibly given any numeric input + value although it may have a preferred range (see hints below). + + For audio it is generally assumed that 1.0f is the `0dB' reference + amplitude and is a `normal' signal level. */ + +typedef float LADSPA_Data; + +/*****************************************************************************/ + +/* Special Plugin Properties: + + Optional features of the plugin type are encapsulated in the + LADSPA_Properties type. This is assembled by ORing individual + properties together. */ + +typedef int LADSPA_Properties; + +/* Property LADSPA_PROPERTY_REALTIME indicates that the plugin has a + real-time dependency (e.g. listens to a MIDI device) and so its + output must not be cached or subject to significant latency. */ +#define LADSPA_PROPERTY_REALTIME 0x1 + +/* Property LADSPA_PROPERTY_INPLACE_BROKEN indicates that the plugin + may cease to work correctly if the host elects to use the same data + location for both input and output (see connect_port()). This + should be avoided as enabling this flag makes it impossible for + hosts to use the plugin to process audio `in-place.' */ +#define LADSPA_PROPERTY_INPLACE_BROKEN 0x2 + +/* Property LADSPA_PROPERTY_HARD_RT_CAPABLE indicates that the plugin + is capable of running not only in a conventional host but also in a + `hard real-time' environment. To qualify for this the plugin must + satisfy all of the following: + + (1) The plugin must not use malloc(), free() or other heap memory + management within its run() or run_adding() functions. All new + memory used in run() must be managed via the stack. These + restrictions only apply to the run() function. + + (2) The plugin will not attempt to make use of any library + functions with the exceptions of functions in the ANSI standard C + and C maths libraries, which the host is expected to provide. + + (3) The plugin will not access files, devices, pipes, sockets, IPC + or any other mechanism that might result in process or thread + blocking. + + (4) The plugin will take an amount of time to execute a run() or + run_adding() call approximately of form (A+B*SampleCount) where A + and B depend on the machine and host in use. This amount of time + may not depend on input signals or plugin state. The host is left + the responsibility to perform timings to estimate upper bounds for + A and B. */ +#define LADSPA_PROPERTY_HARD_RT_CAPABLE 0x4 + +#define LADSPA_IS_REALTIME(x) ((x) & LADSPA_PROPERTY_REALTIME) +#define LADSPA_IS_INPLACE_BROKEN(x) ((x) & LADSPA_PROPERTY_INPLACE_BROKEN) +#define LADSPA_IS_HARD_RT_CAPABLE(x) ((x) & LADSPA_PROPERTY_HARD_RT_CAPABLE) + +/*****************************************************************************/ + +/* Plugin Ports: + + Plugins have `ports' that are inputs or outputs for audio or + data. Ports can communicate arrays of LADSPA_Data (for audio + inputs/outputs) or single LADSPA_Data values (for control + input/outputs). This information is encapsulated in the + LADSPA_PortDescriptor type which is assembled by ORing individual + properties together. + + Note that a port must be an input or an output port but not both + and that a port must be a control or audio port but not both. */ + +typedef int LADSPA_PortDescriptor; + +/* Property LADSPA_PORT_INPUT indicates that the port is an input. */ +#define LADSPA_PORT_INPUT 0x1 + +/* Property LADSPA_PORT_OUTPUT indicates that the port is an output. */ +#define LADSPA_PORT_OUTPUT 0x2 + +/* Property LADSPA_PORT_CONTROL indicates that the port is a control + port. */ +#define LADSPA_PORT_CONTROL 0x4 + +/* Property LADSPA_PORT_AUDIO indicates that the port is a audio + port. */ +#define LADSPA_PORT_AUDIO 0x8 + +#define LADSPA_IS_PORT_INPUT(x) ((x) & LADSPA_PORT_INPUT) +#define LADSPA_IS_PORT_OUTPUT(x) ((x) & LADSPA_PORT_OUTPUT) +#define LADSPA_IS_PORT_CONTROL(x) ((x) & LADSPA_PORT_CONTROL) +#define LADSPA_IS_PORT_AUDIO(x) ((x) & LADSPA_PORT_AUDIO) + +/*****************************************************************************/ + +/* Plugin Port Range Hints: + + The host may wish to provide a representation of data entering or + leaving a plugin (e.g. to generate a GUI automatically). To make + this more meaningful, the plugin should provide `hints' to the host + describing the usual values taken by the data. + + Note that these are only hints. The host may ignore them and the + plugin must not assume that data supplied to it is meaningful. If + the plugin receives invalid input data it is expected to continue + to run without failure and, where possible, produce a sensible + output (e.g. a high-pass filter given a negative cutoff frequency + might switch to an all-pass mode). + + Hints are meaningful for all input and output ports but hints for + input control ports are expected to be particularly useful. + + More hint information is encapsulated in the + LADSPA_PortRangeHintDescriptor type which is assembled by ORing + individual hint types together. Hints may require further + LowerBound and UpperBound information. + + All the hint information for a particular port is aggregated in the + LADSPA_PortRangeHint structure. */ + +typedef int LADSPA_PortRangeHintDescriptor; + +/* Hint LADSPA_HINT_BOUNDED_BELOW indicates that the LowerBound field + of the LADSPA_PortRangeHint should be considered meaningful. The + value in this field should be considered the (inclusive) lower + bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also + specified then the value of LowerBound should be multiplied by the + sample rate. */ +#define LADSPA_HINT_BOUNDED_BELOW 0x1 + +/* Hint LADSPA_HINT_BOUNDED_ABOVE indicates that the UpperBound field + of the LADSPA_PortRangeHint should be considered meaningful. The + value in this field should be considered the (inclusive) upper + bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also + specified then the value of UpperBound should be multiplied by the + sample rate. */ +#define LADSPA_HINT_BOUNDED_ABOVE 0x2 + +/* Hint LADSPA_HINT_TOGGLED indicates that the data item should be + considered a Boolean toggle. Data less than or equal to zero should + be considered `off' or `false,' and data above zero should be + considered `on' or `true.' LADSPA_HINT_TOGGLED may not be used in + conjunction with any other hint except LADSPA_HINT_DEFAULT_0 or + LADSPA_HINT_DEFAULT_1. */ +#define LADSPA_HINT_TOGGLED 0x4 + +/* Hint LADSPA_HINT_SAMPLE_RATE indicates that any bounds specified + should be interpreted as multiples of the sample rate. For + instance, a frequency range from 0Hz to the Nyquist frequency (half + the sample rate) could be requested by this hint in conjunction + with LowerBound = 0 and UpperBound = 0.5. Hosts that support bounds + at all must support this hint to retain meaning. */ +#define LADSPA_HINT_SAMPLE_RATE 0x8 + +/* Hint LADSPA_HINT_LOGARITHMIC indicates that it is likely that the + user will find it more intuitive to view values using a logarithmic + scale. This is particularly useful for frequencies and gains. */ +#define LADSPA_HINT_LOGARITHMIC 0x10 + +/* Hint LADSPA_HINT_INTEGER indicates that a user interface would + probably wish to provide a stepped control taking only integer + values. Any bounds set should be slightly wider than the actual + integer range required to avoid floating point rounding errors. For + instance, the integer set {0,1,2,3} might be described as [-0.1, + 3.1]. */ +#define LADSPA_HINT_INTEGER 0x20 + +/* The various LADSPA_HINT_HAS_DEFAULT_* hints indicate a `normal' + value for the port that is sensible as a default. For instance, + this value is suitable for use as an initial value in a user + interface or as a value the host might assign to a control port + when the user has not provided one. Defaults are encoded using a + mask so only one default may be specified for a port. Some of the + hints make use of lower and upper bounds, in which case the + relevant bound or bounds must be available and + LADSPA_HINT_SAMPLE_RATE must be applied as usual. The resulting + default must be rounded if LADSPA_HINT_INTEGER is present. Default + values were introduced in LADSPA v1.1. */ +#define LADSPA_HINT_DEFAULT_MASK 0x3C0 + +/* This default values indicates that no default is provided. */ +#define LADSPA_HINT_DEFAULT_NONE 0x0 + +/* This default hint indicates that the suggested lower bound for the + port should be used. */ +#define LADSPA_HINT_DEFAULT_MINIMUM 0x40 + +/* This default hint indicates that a low value between the suggested + lower and upper bounds should be chosen. For ports with + LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.75 + + log(upper) * 0.25). Otherwise, this should be (lower * 0.75 + upper + * 0.25). */ +#define LADSPA_HINT_DEFAULT_LOW 0x80 + +/* This default hint indicates that a middle value between the + suggested lower and upper bounds should be chosen. For ports with + LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.5 + + log(upper) * 0.5). Otherwise, this should be (lower * 0.5 + upper * + 0.5). */ +#define LADSPA_HINT_DEFAULT_MIDDLE 0xC0 + +/* This default hint indicates that a high value between the suggested + lower and upper bounds should be chosen. For ports with + LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.25 + + log(upper) * 0.75). Otherwise, this should be (lower * 0.25 + upper + * 0.75). */ +#define LADSPA_HINT_DEFAULT_HIGH 0x100 + +/* This default hint indicates that the suggested upper bound for the + port should be used. */ +#define LADSPA_HINT_DEFAULT_MAXIMUM 0x140 + +/* This default hint indicates that the number 0 should be used. Note + that this default may be used in conjunction with + LADSPA_HINT_TOGGLED. */ +#define LADSPA_HINT_DEFAULT_0 0x200 + +/* This default hint indicates that the number 1 should be used. Note + that this default may be used in conjunction with + LADSPA_HINT_TOGGLED. */ +#define LADSPA_HINT_DEFAULT_1 0x240 + +/* This default hint indicates that the number 100 should be used. */ +#define LADSPA_HINT_DEFAULT_100 0x280 + +/* This default hint indicates that the Hz frequency of `concert A' + should be used. This will be 440 unless the host uses an unusual + tuning convention, in which case it may be within a few Hz. */ +#define LADSPA_HINT_DEFAULT_440 0x2C0 + +#define LADSPA_IS_HINT_BOUNDED_BELOW(x) ((x) & LADSPA_HINT_BOUNDED_BELOW) +#define LADSPA_IS_HINT_BOUNDED_ABOVE(x) ((x) & LADSPA_HINT_BOUNDED_ABOVE) +#define LADSPA_IS_HINT_TOGGLED(x) ((x) & LADSPA_HINT_TOGGLED) +#define LADSPA_IS_HINT_SAMPLE_RATE(x) ((x) & LADSPA_HINT_SAMPLE_RATE) +#define LADSPA_IS_HINT_LOGARITHMIC(x) ((x) & LADSPA_HINT_LOGARITHMIC) +#define LADSPA_IS_HINT_INTEGER(x) ((x) & LADSPA_HINT_INTEGER) + +#define LADSPA_IS_HINT_HAS_DEFAULT(x) ((x) & LADSPA_HINT_DEFAULT_MASK) +#define LADSPA_IS_HINT_DEFAULT_MINIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_MINIMUM) +#define LADSPA_IS_HINT_DEFAULT_LOW(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_LOW) +#define LADSPA_IS_HINT_DEFAULT_MIDDLE(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_MIDDLE) +#define LADSPA_IS_HINT_DEFAULT_HIGH(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_HIGH) +#define LADSPA_IS_HINT_DEFAULT_MAXIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_MAXIMUM) +#define LADSPA_IS_HINT_DEFAULT_0(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_0) +#define LADSPA_IS_HINT_DEFAULT_1(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_1) +#define LADSPA_IS_HINT_DEFAULT_100(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_100) +#define LADSPA_IS_HINT_DEFAULT_440(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_440) + +typedef struct _LADSPA_PortRangeHint { + + /* Hints about the port. */ + LADSPA_PortRangeHintDescriptor HintDescriptor; + + /* Meaningful when hint LADSPA_HINT_BOUNDED_BELOW is active. When + LADSPA_HINT_SAMPLE_RATE is also active then this value should be + multiplied by the relevant sample rate. */ + LADSPA_Data LowerBound; + + /* Meaningful when hint LADSPA_HINT_BOUNDED_ABOVE is active. When + LADSPA_HINT_SAMPLE_RATE is also active then this value should be + multiplied by the relevant sample rate. */ + LADSPA_Data UpperBound; + +} LADSPA_PortRangeHint; + +/*****************************************************************************/ + +/* Plugin Handles: + + This plugin handle indicates a particular instance of the plugin + concerned. It is valid to compare this to NULL (0 for C++) but + otherwise the host should not attempt to interpret it. The plugin + may use it to reference internal instance data. */ + +typedef void * LADSPA_Handle; + +/*****************************************************************************/ + +/* Descriptor for a Type of Plugin: + + This structure is used to describe a plugin type. It provides a + number of functions to examine the type, instantiate it, link it to + buffers and workspaces and to run it. */ + +typedef struct _LADSPA_Descriptor { + + /* This numeric identifier indicates the plugin type + uniquely. Plugin programmers may reserve ranges of IDs from a + central body to avoid clashes. Hosts may assume that IDs are + below 0x1000000. */ + unsigned long UniqueID; + + /* This identifier can be used as a unique, case-sensitive + identifier for the plugin type within the plugin file. Plugin + types should be identified by file and label rather than by index + or plugin name, which may be changed in new plugin + versions. Labels must not contain white-space characters. */ + const char * Label; + + /* This indicates a number of properties of the plugin. */ + LADSPA_Properties Properties; + + /* This member points to the null-terminated name of the plugin + (e.g. "Sine Oscillator"). */ + const char * Name; + + /* This member points to the null-terminated string indicating the + maker of the plugin. This can be an empty string but not NULL. */ + const char * Maker; + + /* This member points to the null-terminated string indicating any + copyright applying to the plugin. If no Copyright applies the + string "None" should be used. */ + const char * Copyright; + + /* This indicates the number of ports (input AND output) present on + the plugin. */ + unsigned long PortCount; + + /* This member indicates an array of port descriptors. Valid indices + vary from 0 to PortCount-1. */ + const LADSPA_PortDescriptor * PortDescriptors; + + /* This member indicates an array of null-terminated strings + describing ports (e.g. "Frequency (Hz)"). Valid indices vary from + 0 to PortCount-1. */ + const char * const * PortNames; + + /* This member indicates an array of range hints for each port (see + above). Valid indices vary from 0 to PortCount-1. */ + const LADSPA_PortRangeHint * PortRangeHints; + + /* This may be used by the plugin developer to pass any custom + implementation data into an instantiate call. It must not be used + or interpreted by the host. It is expected that most plugin + writers will not use this facility as LADSPA_Handle should be + used to hold instance data. */ + void * ImplementationData; + + /* This member is a function pointer that instantiates a plugin. A + handle is returned indicating the new plugin instance. The + instantiation function accepts a sample rate as a parameter. The + plugin descriptor from which this instantiate function was found + must also be passed. This function must return NULL if + instantiation fails. + + Note that instance initialisation should generally occur in + activate() rather than here. */ + LADSPA_Handle (*instantiate)(const struct _LADSPA_Descriptor * Descriptor, + unsigned long SampleRate); + + /* This member is a function pointer that connects a port on an + instantiated plugin to a memory location at which a block of data + for the port will be read/written. The data location is expected + to be an array of LADSPA_Data for audio ports or a single + LADSPA_Data value for control ports. Memory issues will be + managed by the host. The plugin must read/write the data at these + locations every time run() or run_adding() is called and the data + present at the time of this connection call should not be + considered meaningful. + + connect_port() may be called more than once for a plugin instance + to allow the host to change the buffers that the plugin is + reading or writing. These calls may be made before or after + activate() or deactivate() calls. + + connect_port() must be called at least once for each port before + run() or run_adding() is called. When working with blocks of + LADSPA_Data the plugin should pay careful attention to the block + size passed to the run function as the block allocated may only + just be large enough to contain the block of samples. + + Plugin writers should be aware that the host may elect to use the + same buffer for more than one port and even use the same buffer + for both input and output (see LADSPA_PROPERTY_INPLACE_BROKEN). + However, overlapped buffers or use of a single buffer for both + audio and control data may result in unexpected behaviour. */ + void (*connect_port)(LADSPA_Handle Instance, + unsigned long Port, + LADSPA_Data * DataLocation); + + /* This member is a function pointer that initialises a plugin + instance and activates it for use. This is separated from + instantiate() to aid real-time support and so that hosts can + reinitialise a plugin instance by calling deactivate() and then + activate(). In this case the plugin instance must reset all state + information dependent on the history of the plugin instance + except for any data locations provided by connect_port() and any + gain set by set_run_adding_gain(). If there is nothing for + activate() to do then the plugin writer may provide a NULL rather + than an empty function. + + When present, hosts must call this function once before run() (or + run_adding()) is called for the first time. This call should be + made as close to the run() call as possible and indicates to + real-time plugins that they are now live. Plugins should not rely + on a prompt call to run() after activate(). activate() may not be + called again unless deactivate() is called first. Note that + connect_port() may be called before or after a call to + activate(). */ + void (*activate)(LADSPA_Handle Instance); + + /* This method is a function pointer that runs an instance of a + plugin for a block. Two parameters are required: the first is a + handle to the particular instance to be run and the second + indicates the block size (in samples) for which the plugin + instance may run. + + Note that if an activate() function exists then it must be called + before run() or run_adding(). If deactivate() is called for a + plugin instance then the plugin instance may not be reused until + activate() has been called again. + + If the plugin has the property LADSPA_PROPERTY_HARD_RT_CAPABLE + then there are various things that the plugin should not do + within the run() or run_adding() functions (see above). */ + void (*run)(LADSPA_Handle Instance, + unsigned long SampleCount); + + /* This method is a function pointer that runs an instance of a + plugin for a block. This has identical behaviour to run() except + in the way data is output from the plugin. When run() is used, + values are written directly to the memory areas associated with + the output ports. However when run_adding() is called, values + must be added to the values already present in the memory + areas. Furthermore, output values written must be scaled by the + current gain set by set_run_adding_gain() (see below) before + addition. + + run_adding() is optional. When it is not provided by a plugin, + this function pointer must be set to NULL. When it is provided, + the function set_run_adding_gain() must be provided also. */ + void (*run_adding)(LADSPA_Handle Instance, + unsigned long SampleCount); + + /* This method is a function pointer that sets the output gain for + use when run_adding() is called (see above). If this function is + never called the gain is assumed to default to 1. Gain + information should be retained when activate() or deactivate() + are called. + + This function should be provided by the plugin if and only if the + run_adding() function is provided. When it is absent this + function pointer must be set to NULL. */ + void (*set_run_adding_gain)(LADSPA_Handle Instance, + LADSPA_Data Gain); + + /* This is the counterpart to activate() (see above). If there is + nothing for deactivate() to do then the plugin writer may provide + a NULL rather than an empty function. + + Hosts must deactivate all activated units after they have been + run() (or run_adding()) for the last time. This call should be + made as close to the last run() call as possible and indicates to + real-time plugins that they are no longer live. Plugins should + not rely on prompt deactivation. Note that connect_port() may be + called before or after a call to deactivate(). + + Deactivation is not similar to pausing as the plugin instance + will be reinitialised when activate() is called to reuse it. */ + void (*deactivate)(LADSPA_Handle Instance); + + /* Once an instance of a plugin has been finished with it can be + deleted using the following function. The instance handle passed + ceases to be valid after this call. + + If activate() was called for a plugin instance then a + corresponding call to deactivate() must be made before cleanup() + is called. */ + void (*cleanup)(LADSPA_Handle Instance); + +} LADSPA_Descriptor; + +/**********************************************************************/ + +/* Accessing a Plugin: */ + +/* The exact mechanism by which plugins are loaded is host-dependent, + however all most hosts will need to know is the name of shared + object file containing the plugin types. To allow multiple hosts to + share plugin types, hosts may wish to check for environment + variable LADSPA_PATH. If present, this should contain a + colon-separated path indicating directories that should be searched + (in order) when loading plugin types. + + A plugin programmer must include a function called + "ladspa_descriptor" with the following function prototype within + the shared object file. This function will have C-style linkage (if + you are using C++ this is taken care of by the `extern "C"' clause + at the top of the file). + + A host will find the plugin shared object file by one means or + another, find the ladspa_descriptor() function, call it, and + proceed from there. + + Plugin types are accessed by index (not ID) using values from 0 + upwards. Out of range indexes must result in this function + returning NULL, so the plugin count can be determined by checking + for the least index that results in NULL being returned. */ + +const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index); + +/* Datatype corresponding to the ladspa_descriptor() function. */ +typedef const LADSPA_Descriptor * +(*LADSPA_Descriptor_Function)(unsigned long Index); + +/**********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* LADSPA_INCLUDED */ + +/* EOF */ diff --git a/dpf/distrho/src/lv2/atom-forge.h b/dpf/distrho/src/lv2/atom-forge.h new file mode 100644 index 0000000..d803d23 --- /dev/null +++ b/dpf/distrho/src/lv2/atom-forge.h @@ -0,0 +1,747 @@ +/* + Copyright 2008-2013 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file forge.h An API for constructing LV2 atoms. + + This file provides an API for constructing Atoms which makes it relatively + simple to build nested atoms of arbitrary complexity without requiring + dynamic memory allocation. + + The API is based on successively appending the appropriate pieces to build a + complete Atom. The size of containers is automatically updated. Functions + that begin a container return (via their frame argument) a stack frame which + must be popped when the container is finished. + + All output is written to a user-provided buffer or sink function. This + makes it popssible to create create atoms on the stack, on the heap, in LV2 + port buffers, in a ringbuffer, or elsewhere, all using the same API. + + This entire API is realtime safe if used with a buffer or a realtime safe + sink, except lv2_atom_forge_init() which is only realtime safe if the URI + map function is. + + Note these functions are all static inline, do not take their address. + + This header is non-normative, it is provided for convenience. +*/ + +#ifndef LV2_ATOM_FORGE_H +#define LV2_ATOM_FORGE_H + +#include + +#include "atom.h" +#include "atom-util.h" +#include "urid.h" + +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) +# define LV2_ATOM_FORGE_DEPRECATED __attribute__((__deprecated__)) +#else +# define LV2_ATOM_FORGE_DEPRECATED +#endif + +#ifdef __cplusplus +extern "C" { +#else +# include +#endif + +/** Handle for LV2_Atom_Forge_Sink. */ +typedef void* LV2_Atom_Forge_Sink_Handle; + +/** A reference to a chunk of written output. */ +typedef intptr_t LV2_Atom_Forge_Ref; + +/** Sink function for writing output. See lv2_atom_forge_set_sink(). */ +typedef LV2_Atom_Forge_Ref +(*LV2_Atom_Forge_Sink)(LV2_Atom_Forge_Sink_Handle handle, + const void* buf, + uint32_t size); + +/** Function for resolving a reference. See lv2_atom_forge_set_sink(). */ +typedef LV2_Atom* +(*LV2_Atom_Forge_Deref_Func)(LV2_Atom_Forge_Sink_Handle handle, + LV2_Atom_Forge_Ref ref); + +/** A stack frame used for keeping track of nested Atom containers. */ +typedef struct _LV2_Atom_Forge_Frame { + struct _LV2_Atom_Forge_Frame* parent; + LV2_Atom_Forge_Ref ref; +} LV2_Atom_Forge_Frame; + +/** A "forge" for creating atoms by appending to a buffer. */ +typedef struct { + uint8_t* buf; + uint32_t offset; + uint32_t size; + + LV2_Atom_Forge_Sink sink; + LV2_Atom_Forge_Deref_Func deref; + LV2_Atom_Forge_Sink_Handle handle; + + LV2_Atom_Forge_Frame* stack; + + LV2_URID Blank LV2_ATOM_FORGE_DEPRECATED; + LV2_URID Bool; + LV2_URID Chunk; + LV2_URID Double; + LV2_URID Float; + LV2_URID Int; + LV2_URID Long; + LV2_URID Literal; + LV2_URID Object; + LV2_URID Path; + LV2_URID Property; + LV2_URID Resource LV2_ATOM_FORGE_DEPRECATED; + LV2_URID Sequence; + LV2_URID String; + LV2_URID Tuple; + LV2_URID URI; + LV2_URID URID; + LV2_URID Vector; +} LV2_Atom_Forge; + +static inline void +lv2_atom_forge_set_buffer(LV2_Atom_Forge* forge, uint8_t* buf, size_t size); + +/** + Initialise @p forge. + + URIs will be mapped using @p map and stored, a reference to @p map itself is + not held. +*/ +static inline void +lv2_atom_forge_init(LV2_Atom_Forge* forge, LV2_URID_Map* map) +{ +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdeprecated-declarations" +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + lv2_atom_forge_set_buffer(forge, NULL, 0); + forge->Blank = map->map(map->handle, LV2_ATOM__Blank); + forge->Bool = map->map(map->handle, LV2_ATOM__Bool); + forge->Chunk = map->map(map->handle, LV2_ATOM__Chunk); + forge->Double = map->map(map->handle, LV2_ATOM__Double); + forge->Float = map->map(map->handle, LV2_ATOM__Float); + forge->Int = map->map(map->handle, LV2_ATOM__Int); + forge->Long = map->map(map->handle, LV2_ATOM__Long); + forge->Literal = map->map(map->handle, LV2_ATOM__Literal); + forge->Object = map->map(map->handle, LV2_ATOM__Object); + forge->Path = map->map(map->handle, LV2_ATOM__Path); + forge->Property = map->map(map->handle, LV2_ATOM__Property); + forge->Resource = map->map(map->handle, LV2_ATOM__Resource); + forge->Sequence = map->map(map->handle, LV2_ATOM__Sequence); + forge->String = map->map(map->handle, LV2_ATOM__String); + forge->Tuple = map->map(map->handle, LV2_ATOM__Tuple); + forge->URI = map->map(map->handle, LV2_ATOM__URI); + forge->URID = map->map(map->handle, LV2_ATOM__URID); + forge->Vector = map->map(map->handle, LV2_ATOM__Vector); +#if defined(__clang__) +# pragma clang diagnostic pop +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic pop +#endif +} + +static inline LV2_Atom* +lv2_atom_forge_deref(LV2_Atom_Forge* forge, LV2_Atom_Forge_Ref ref) +{ + if (forge->buf) { + return (LV2_Atom*)ref; + } else { + return forge->deref(forge->handle, ref); + } +} + +/** + @name Object Stack + @{ +*/ + +/** + Push a stack frame. + This is done automatically by container functions (which take a stack frame + pointer), but may be called by the user to push the top level container when + writing to an existing Atom. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_push(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + LV2_Atom_Forge_Ref ref) +{ + frame->parent = forge->stack; + frame->ref = ref; + forge->stack = frame; + return ref; +} + +/** Pop a stack frame. This must be called when a container is finished. */ +static inline void +lv2_atom_forge_pop(LV2_Atom_Forge* forge, LV2_Atom_Forge_Frame* frame) +{ + assert(frame == forge->stack); + forge->stack = frame->parent; +} + +/** Return true iff the top of the stack has the given type. */ +static inline bool +lv2_atom_forge_top_is(LV2_Atom_Forge* forge, uint32_t type) +{ + return forge->stack && forge->stack->ref && + (lv2_atom_forge_deref(forge, forge->stack->ref)->type == type); +} + +/** Return true iff @p type is an atom:Object. */ +static inline bool +lv2_atom_forge_is_object_type(const LV2_Atom_Forge* forge, uint32_t type) +{ +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdeprecated-declarations" +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + return (type == forge->Object || + type == forge->Blank || + type == forge->Resource); +#if defined(__clang__) +# pragma clang diagnostic pop +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic pop +#endif +} + +/** Return true iff @p type is an atom:Object with a blank ID. */ +static inline bool +lv2_atom_forge_is_blank(const LV2_Atom_Forge* forge, + uint32_t type, + const LV2_Atom_Object_Body* body) +{ +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdeprecated-declarations" +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + return (type == forge->Blank || + (type == forge->Object && body->id == 0)); +#if defined(__clang__) +# pragma clang diagnostic pop +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic pop +#endif +} + +/** + @} + @name Output Configuration + @{ +*/ + +/** Set the output buffer where @p forge will write atoms. */ +static inline void +lv2_atom_forge_set_buffer(LV2_Atom_Forge* forge, uint8_t* buf, size_t size) +{ + forge->buf = buf; + forge->size = (uint32_t)size; + forge->offset = 0; + forge->deref = NULL; + forge->sink = NULL; + forge->handle = NULL; + forge->stack = NULL; +} + +/** + Set the sink function where @p forge will write output. + + The return value of forge functions is an LV2_Atom_Forge_Ref which is an + integer type safe to use as a pointer but is otherwise opaque. The sink + function must return a ref that can be dereferenced to access as least + sizeof(LV2_Atom) bytes of the written data, so sizes can be updated. For + ringbuffers, this should be possible as long as the size of the buffer is a + multiple of sizeof(LV2_Atom), since atoms are always aligned. + + Note that 0 is an invalid reference, so if you are using a buffer offset be + sure to offset it such that 0 is never a valid reference. You will get + confusing errors otherwise. +*/ +static inline void +lv2_atom_forge_set_sink(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Sink sink, + LV2_Atom_Forge_Deref_Func deref, + LV2_Atom_Forge_Sink_Handle handle) +{ + forge->buf = NULL; + forge->size = forge->offset = 0; + forge->deref = deref; + forge->sink = sink; + forge->handle = handle; + forge->stack = NULL; +} + +/** + @} + @name Low Level Output + @{ +*/ + +/** + Write raw output. This is used internally, but is also useful for writing + atom types not explicitly supported by the forge API. Note the caller is + responsible for ensuring the output is approriately padded. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_raw(LV2_Atom_Forge* forge, const void* data, uint32_t size) +{ + LV2_Atom_Forge_Ref out = 0; + if (forge->sink) { + out = forge->sink(forge->handle, data, size); + } else { + out = (LV2_Atom_Forge_Ref)forge->buf + (LV2_Atom_Forge_Ref)forge->offset; + uint8_t* mem = forge->buf + forge->offset; + if (forge->offset + size > forge->size) { + return 0; + } + forge->offset += size; + memcpy(mem, data, size); + } + for (LV2_Atom_Forge_Frame* f = forge->stack; f; f = f->parent) { + lv2_atom_forge_deref(forge, f->ref)->size += size; + } + return out; +} + +/** Pad output accordingly so next write is 64-bit aligned. */ +static inline void +lv2_atom_forge_pad(LV2_Atom_Forge* forge, uint32_t written) +{ + const uint64_t pad = 0; + const uint32_t pad_size = lv2_atom_pad_size(written) - written; + lv2_atom_forge_raw(forge, &pad, pad_size); +} + +/** Write raw output, padding to 64-bits as necessary. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_write(LV2_Atom_Forge* forge, const void* data, uint32_t size) +{ + LV2_Atom_Forge_Ref out = lv2_atom_forge_raw(forge, data, size); + if (out) { + lv2_atom_forge_pad(forge, size); + } + return out; +} + +/** Write a null-terminated string body. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_string_body(LV2_Atom_Forge* forge, + const char* str, + uint32_t len) +{ + LV2_Atom_Forge_Ref out = lv2_atom_forge_raw(forge, str, len); + if (out && (out = lv2_atom_forge_raw(forge, "", 1))) { + lv2_atom_forge_pad(forge, len + 1); + } + return out; +} + +/** + @} + @name Atom Output + @{ +*/ + +/** Write an atom:Atom header. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_atom(LV2_Atom_Forge* forge, uint32_t size, uint32_t type) +{ + const LV2_Atom a = { size, type }; + return lv2_atom_forge_raw(forge, &a, sizeof(a)); +} + +/** Write a primitive (fixed-size) atom. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_primitive(LV2_Atom_Forge* forge, const LV2_Atom* a) +{ + if (lv2_atom_forge_top_is(forge, forge->Vector)) { + return lv2_atom_forge_raw(forge, LV2_ATOM_BODY_CONST(a), a->size); + } else { + return lv2_atom_forge_write( + forge, a, (uint32_t)sizeof(LV2_Atom) + a->size); + } +} + +/** Write an atom:Int. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_int(LV2_Atom_Forge* forge, int32_t val) +{ + const LV2_Atom_Int a = { { sizeof(val), forge->Int }, val }; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:Long. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_long(LV2_Atom_Forge* forge, int64_t val) +{ + const LV2_Atom_Long a = { { sizeof(val), forge->Long }, val }; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:Float. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_float(LV2_Atom_Forge* forge, float val) +{ + const LV2_Atom_Float a = { { sizeof(val), forge->Float }, val }; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:Double. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_double(LV2_Atom_Forge* forge, double val) +{ + const LV2_Atom_Double a = { { sizeof(val), forge->Double }, val }; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:Bool. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_bool(LV2_Atom_Forge* forge, bool val) +{ + const LV2_Atom_Bool a = { { sizeof(int32_t), forge->Bool }, val ? 1 : 0 }; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom:URID. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_urid(LV2_Atom_Forge* forge, LV2_URID id) +{ + const LV2_Atom_URID a = { { sizeof(id), forge->URID }, id }; + return lv2_atom_forge_primitive(forge, &a.atom); +} + +/** Write an atom compatible with atom:String. Used internally. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_typed_string(LV2_Atom_Forge* forge, + uint32_t type, + const char* str, + uint32_t len) +{ + const LV2_Atom_String a = { { len + 1, type } }; + LV2_Atom_Forge_Ref out = lv2_atom_forge_raw(forge, &a, sizeof(a)); + if (out) { + if (!lv2_atom_forge_string_body(forge, str, len)) { + LV2_Atom* atom = lv2_atom_forge_deref(forge, out); + atom->size = atom->type = 0; + out = 0; + } + } + return out; +} + +/** Write an atom:String. Note that @p str need not be NULL terminated. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_string(LV2_Atom_Forge* forge, const char* str, uint32_t len) +{ + return lv2_atom_forge_typed_string(forge, forge->String, str, len); +} + +/** + Write an atom:URI. Note that @p uri need not be NULL terminated. + This does not map the URI, but writes the complete URI string. To write + a mapped URI, use lv2_atom_forge_urid(). +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_uri(LV2_Atom_Forge* forge, const char* uri, uint32_t len) +{ + return lv2_atom_forge_typed_string(forge, forge->URI, uri, len); +} + +/** Write an atom:Path. Note that @p path need not be NULL terminated. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_path(LV2_Atom_Forge* forge, const char* path, uint32_t len) +{ + return lv2_atom_forge_typed_string(forge, forge->Path, path, len); +} + +/** Write an atom:Literal. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_literal(LV2_Atom_Forge* forge, + const char* str, + uint32_t len, + uint32_t datatype, + uint32_t lang) +{ + const LV2_Atom_Literal a = { + { (uint32_t)(sizeof(LV2_Atom_Literal) - sizeof(LV2_Atom) + len + 1), + forge->Literal }, + { datatype, + lang } + }; + LV2_Atom_Forge_Ref out = lv2_atom_forge_raw(forge, &a, sizeof(a)); + if (out) { + if (!lv2_atom_forge_string_body(forge, str, len)) { + LV2_Atom* atom = lv2_atom_forge_deref(forge, out); + atom->size = atom->type = 0; + out = 0; + } + } + return out; +} + +/** Start an atom:Vector. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_vector_head(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + uint32_t child_size, + uint32_t child_type) +{ + const LV2_Atom_Vector a = { + { sizeof(LV2_Atom_Vector_Body), forge->Vector }, + { child_size, child_type } + }; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** Write a complete atom:Vector. */ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_vector(LV2_Atom_Forge* forge, + uint32_t child_size, + uint32_t child_type, + uint32_t n_elems, + const void* elems) +{ + const LV2_Atom_Vector a = { + { (uint32_t)(sizeof(LV2_Atom_Vector_Body) + n_elems * child_size), + forge->Vector }, + { child_size, child_type } + }; + LV2_Atom_Forge_Ref out = lv2_atom_forge_write(forge, &a, sizeof(a)); + if (out) { + lv2_atom_forge_write(forge, elems, child_size * n_elems); + } + return out; +} + +/** + Write the header of an atom:Tuple. + + The passed frame will be initialised to represent this tuple. To complete + the tuple, write a sequence of atoms, then pop the frame with + lv2_atom_forge_pop(). + + For example: + @code + // Write tuple (1, 2.0) + LV2_Atom_Forge_Frame frame; + LV2_Atom* tup = (LV2_Atom*)lv2_atom_forge_tuple(forge, &frame); + lv2_atom_forge_int32(forge, 1); + lv2_atom_forge_float(forge, 2.0); + lv2_atom_forge_pop(forge, &frame); + @endcode +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_tuple(LV2_Atom_Forge* forge, LV2_Atom_Forge_Frame* frame) +{ + const LV2_Atom_Tuple a = { { 0, forge->Tuple } }; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + Write the header of an atom:Object. + + The passed frame will be initialised to represent this object. To complete + the object, write a sequence of properties, then pop the frame with + lv2_atom_forge_pop(). + + For example: + @code + LV2_URID eg_Cat = map("http://example.org/Cat"); + LV2_URID eg_name = map("http://example.org/name"); + + // Start object with type eg_Cat and blank ID + LV2_Atom_Forge_Frame frame; + lv2_atom_forge_object(forge, &frame, 0, eg_Cat); + + // Append property eg:name = "Hobbes" + lv2_atom_forge_key(forge, eg_name); + lv2_atom_forge_string(forge, "Hobbes", strlen("Hobbes")); + + // Finish object + lv2_atom_forge_pop(forge, &frame); + @endcode +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_object(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + LV2_URID id, + LV2_URID otype) +{ + const LV2_Atom_Object a = { + { (uint32_t)sizeof(LV2_Atom_Object_Body), forge->Object }, + { id, otype } + }; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + The same as lv2_atom_forge_object(), but for object:Resource. + + This function is deprecated and should not be used in new code. + Use lv2_atom_forge_object() directly instead. +*/ +LV2_ATOM_FORGE_DEPRECATED +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_resource(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + LV2_URID id, + LV2_URID otype) +{ +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdeprecated-declarations" +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + const LV2_Atom_Object a = { + { (uint32_t)sizeof(LV2_Atom_Object_Body), forge->Resource }, + { id, otype } + }; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +#if defined(__clang__) +# pragma clang diagnostic pop +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic pop +#endif +} + +/** + The same as lv2_atom_forge_object(), but for object:Blank. + + This function is deprecated and should not be used in new code. + Use lv2_atom_forge_object() directly instead. +*/ +LV2_ATOM_FORGE_DEPRECATED +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_blank(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + uint32_t id, + LV2_URID otype) +{ +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wdeprecated-declarations" +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + const LV2_Atom_Object a = { + { (uint32_t)sizeof(LV2_Atom_Object_Body), forge->Blank }, + { id, otype } + }; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +#if defined(__clang__) +# pragma clang diagnostic pop +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic pop +#endif +} + +/** + Write a property key in an Object, to be followed by the value. + + See lv2_atom_forge_object() documentation for an example. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_key(LV2_Atom_Forge* forge, + LV2_URID key) +{ + const LV2_Atom_Property_Body a = { key, 0, { 0, 0 } }; + return lv2_atom_forge_write(forge, &a, 2 * (uint32_t)sizeof(uint32_t)); +} + +/** + Write the header for a property body in an object, with context. + + If you do not need the context, which is almost certainly the case, + use the simpler lv2_atom_forge_key() instead. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_property_head(LV2_Atom_Forge* forge, + LV2_URID key, + LV2_URID context) +{ + const LV2_Atom_Property_Body a = { key, context, { 0, 0 } }; + return lv2_atom_forge_write(forge, &a, 2 * (uint32_t)sizeof(uint32_t)); +} + +/** + Write the header for a Sequence. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_sequence_head(LV2_Atom_Forge* forge, + LV2_Atom_Forge_Frame* frame, + uint32_t unit) +{ + const LV2_Atom_Sequence a = { + { (uint32_t)sizeof(LV2_Atom_Sequence_Body), forge->Sequence }, + { unit, 0 } + }; + return lv2_atom_forge_push( + forge, frame, lv2_atom_forge_write(forge, &a, sizeof(a))); +} + +/** + Write the time stamp header of an Event (in a Sequence) in audio frames. + After this, call the appropriate forge method(s) to write the body. Note + the returned reference is to an LV2_Event which is NOT an Atom. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_frame_time(LV2_Atom_Forge* forge, int64_t frames) +{ + return lv2_atom_forge_write(forge, &frames, sizeof(frames)); +} + +/** + Write the time stamp header of an Event (in a Sequence) in beats. After + this, call the appropriate forge method(s) to write the body. Note the + returned reference is to an LV2_Event which is NOT an Atom. +*/ +static inline LV2_Atom_Forge_Ref +lv2_atom_forge_beat_time(LV2_Atom_Forge* forge, double beats) +{ + return lv2_atom_forge_write(forge, &beats, sizeof(beats)); +} + +/** + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_ATOM_FORGE_H */ diff --git a/dpf/distrho/src/lv2/atom-helpers.h b/dpf/distrho/src/lv2/atom-helpers.h new file mode 100644 index 0000000..97cef2c --- /dev/null +++ b/dpf/distrho/src/lv2/atom-helpers.h @@ -0,0 +1,249 @@ +// lv2_atom_helpers.h +// +/**************************************************************************** + Copyright (C) 2005-2013, rncbc aka Rui Nuno Capela. All rights reserved. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +*****************************************************************************/ + +/* Helper functions for LV2 atom:Sequence event buffer. + * + * tentatively adapted from: + * + * - lv2_evbuf.h,c - An abstract/opaque LV2 event buffer implementation. + * + * - event-helpers.h - Helper functions for the LV2 Event extension. + * + * + * Copyright 2008-2012 David Robillard + */ + +#ifndef LV2_ATOM_HELPERS_H +#define LV2_ATOM_HELPERS_H + +#include +#include +#include +#include +#include + +#include "atom-util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// An abstract/opaque LV2 atom:Sequence buffer. +// +typedef +struct _LV2_Atom_Buffer +{ + uint32_t capacity; + uint32_t chunk_type; + uint32_t sequence_type; + LV2_Atom_Sequence atoms; + +} LV2_Atom_Buffer; + + +// Clear and initialize an existing LV2 atom:Sequenece buffer. +// +static inline +void lv2_atom_buffer_reset ( LV2_Atom_Buffer *buf, bool input ) +{ + if (input) { + buf->atoms.atom.size = sizeof(LV2_Atom_Sequence_Body); + buf->atoms.atom.type = buf->sequence_type; + } else { + buf->atoms.atom.size = buf->capacity; + buf->atoms.atom.type = buf->chunk_type; + } +} + + +// Allocate a new, empty LV2 atom:Sequence buffer. +// +static inline +LV2_Atom_Buffer *lv2_atom_buffer_new ( + uint32_t capacity, uint32_t chunk_type, uint32_t sequence_type, bool input ) +{ + LV2_Atom_Buffer *buf = (LV2_Atom_Buffer *) + malloc(sizeof(LV2_Atom_Buffer) + sizeof(LV2_Atom_Sequence) + capacity); + + buf->capacity = capacity; + buf->chunk_type = chunk_type; + buf->sequence_type = sequence_type; + + lv2_atom_buffer_reset(buf, input); + + return buf; +} + + +// Free an LV2 atom:Sequenece buffer allocated with lv2_atome_buffer_new. +// +static inline +void lv2_atom_buffer_free ( LV2_Atom_Buffer *buf ) +{ + free(buf); +} + + +// Return the total padded size of events stored in a LV2 atom:Sequence buffer. +// +static inline +uint32_t lv2_atom_buffer_get_size ( LV2_Atom_Buffer *buf ) +{ + if (buf->atoms.atom.type == buf->sequence_type) + return buf->atoms.atom.size - uint32_t(sizeof(LV2_Atom_Sequence_Body)); + else + return 0; +} + + +// Return the actual LV2 atom:Sequence implementation. +// +static inline +LV2_Atom_Sequence *lv2_atom_buffer_get_sequence ( LV2_Atom_Buffer *buf ) +{ + return &buf->atoms; +} + + +// An iterator over an atom:Sequence buffer. +// +typedef +struct _LV2_Atom_Buffer_Iterator +{ + LV2_Atom_Buffer *buf; + uint32_t offset; + +} LV2_Atom_Buffer_Iterator; + + +// Reset an iterator to point to the start of an LV2 atom:Sequence buffer. +// +static inline +bool lv2_atom_buffer_begin ( + LV2_Atom_Buffer_Iterator *iter, LV2_Atom_Buffer *buf ) +{ + iter->buf = buf; + iter->offset = 0; + + return (buf->atoms.atom.size > 0); +} + + +// Reset an iterator to point to the end of an LV2 atom:Sequence buffer. +// +static inline +bool lv2_atom_buffer_end ( + LV2_Atom_Buffer_Iterator *iter, LV2_Atom_Buffer *buf ) +{ + iter->buf = buf; + iter->offset = lv2_atom_pad_size(lv2_atom_buffer_get_size(buf)); + + return (iter->offset < buf->capacity - sizeof(LV2_Atom_Event)); +} + + +// Check if a LV2 atom:Sequenece buffer iterator is valid. +// +static inline +bool lv2_atom_buffer_is_valid ( LV2_Atom_Buffer_Iterator *iter ) +{ + return iter->offset < lv2_atom_buffer_get_size(iter->buf); +} + + +// Advance a LV2 atom:Sequenece buffer iterator forward one event. +// +static inline +bool lv2_atom_buffer_increment ( LV2_Atom_Buffer_Iterator *iter ) +{ + if (!lv2_atom_buffer_is_valid(iter)) + return false; + + LV2_Atom_Buffer *buf = iter->buf; + LV2_Atom_Sequence *atoms = &buf->atoms; + uint32_t size = ((LV2_Atom_Event *) ((char *) + LV2_ATOM_CONTENTS(LV2_Atom_Sequence, atoms) + iter->offset))->body.size; + iter->offset += lv2_atom_pad_size(uint32_t(sizeof(LV2_Atom_Event)) + size); + + return true; +} + + +// Get the event currently pointed at a LV2 atom:Sequence buffer iterator. +// +static inline +LV2_Atom_Event *lv2_atom_buffer_get ( + LV2_Atom_Buffer_Iterator *iter, uint8_t **data ) +{ + if (!lv2_atom_buffer_is_valid(iter)) + return NULL; + + LV2_Atom_Buffer *buf = iter->buf; + LV2_Atom_Sequence *atoms = &buf->atoms; + LV2_Atom_Event *ev = (LV2_Atom_Event *) ((char *) + LV2_ATOM_CONTENTS(LV2_Atom_Sequence, atoms) + iter->offset); + + *data = (uint8_t *) LV2_ATOM_BODY(&ev->body); + + return ev; +} + + +// Write an event at a LV2 atom:Sequence buffer iterator. + +static inline +bool lv2_atom_buffer_write ( + LV2_Atom_Buffer_Iterator *iter, + uint32_t frames, + uint32_t /*subframes*/, + uint32_t type, + uint32_t size, + const uint8_t *data ) +{ + LV2_Atom_Buffer *buf = iter->buf; + LV2_Atom_Sequence *atoms = &buf->atoms; + if (buf->capacity - sizeof(LV2_Atom) - atoms->atom.size + < sizeof(LV2_Atom_Event) + size) + return false; + + LV2_Atom_Event *ev = (LV2_Atom_Event*) ((char *) + LV2_ATOM_CONTENTS(LV2_Atom_Sequence, atoms) + iter->offset); + + ev->time.frames = frames; + ev->body.type = type; + ev->body.size = size; + + memcpy(LV2_ATOM_BODY(&ev->body), data, size); + + size = lv2_atom_pad_size(uint32_t(sizeof(LV2_Atom_Event)) + size); + atoms->atom.size += size; + iter->offset += size; + + return true; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif // LV2_ATOM_HELPERS_H + +// end of lv2_atom_helpers.h diff --git a/dpf/distrho/src/lv2/atom-util.h b/dpf/distrho/src/lv2/atom-util.h new file mode 100644 index 0000000..c47c0f6 --- /dev/null +++ b/dpf/distrho/src/lv2/atom-util.h @@ -0,0 +1,446 @@ +/* + Copyright 2008-2013 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file util.h Helper functions for the LV2 Atom extension. + + Note these functions are all static inline, do not take their address. + + This header is non-normative, it is provided for convenience. +*/ + +#ifndef LV2_ATOM_UTIL_H +#define LV2_ATOM_UTIL_H + +#include +#include +#include + +#include "atom.h" + +#ifdef __cplusplus +extern "C" { +#else +# include +#endif + +/** Pad a size to 64 bits. */ +static inline uint32_t +lv2_atom_pad_size(uint32_t size) +{ + return (size + 7U) & (~7U); +} + +/** Return the total size of @p atom, including the header. */ +static inline uint32_t +lv2_atom_total_size(const LV2_Atom* atom) +{ + return (uint32_t)sizeof(LV2_Atom) + atom->size; +} + +/** Return true iff @p atom is null. */ +static inline bool +lv2_atom_is_null(const LV2_Atom* atom) +{ + return !atom || (atom->type == 0 && atom->size == 0); +} + +/** Return true iff @p a is equal to @p b. */ +static inline bool +lv2_atom_equals(const LV2_Atom* a, const LV2_Atom* b) +{ + return (a == b) || ((a->type == b->type) && + (a->size == b->size) && + !memcmp(a + 1, b + 1, a->size)); +} + +/** + @name Sequence Iterator + @{ +*/ + +/** Get an iterator pointing to the first event in a Sequence body. */ +static inline const LV2_Atom_Event* +lv2_atom_sequence_begin(const LV2_Atom_Sequence_Body* body) +{ + return (const LV2_Atom_Event*)(body + 1); +} + +/** Get an iterator pointing to the end of a Sequence body. */ +static inline LV2_Atom_Event* +lv2_atom_sequence_end(LV2_Atom_Sequence_Body* body, uint32_t size) +{ + return (LV2_Atom_Event*)((uint8_t*)body + lv2_atom_pad_size(size)); +} + +/** Return true iff @p i has reached the end of @p body. */ +static inline bool +lv2_atom_sequence_is_end(const LV2_Atom_Sequence_Body* body, + uint32_t size, + const LV2_Atom_Event* i) +{ + return (const uint8_t*)i >= ((const uint8_t*)body + size); +} + +/** Return an iterator to the element following @p i. */ +static inline const LV2_Atom_Event* +lv2_atom_sequence_next(const LV2_Atom_Event* i) +{ + return (const LV2_Atom_Event*)((const uint8_t*)i + + sizeof(LV2_Atom_Event) + + lv2_atom_pad_size(i->body.size)); +} + +/** + A macro for iterating over all events in a Sequence. + @param seq The sequence to iterate over + @param iter The name of the iterator + + This macro is used similarly to a for loop (which it expands to), e.g.: + @code + LV2_ATOM_SEQUENCE_FOREACH(sequence, ev) { + // Do something with ev (an LV2_Atom_Event*) here... + } + @endcode +*/ +#define LV2_ATOM_SEQUENCE_FOREACH(seq, iter) \ + for (const LV2_Atom_Event* (iter) = lv2_atom_sequence_begin(&(seq)->body); \ + !lv2_atom_sequence_is_end(&(seq)->body, (seq)->atom.size, (iter)); \ + (iter) = lv2_atom_sequence_next(iter)) + +/** Like LV2_ATOM_SEQUENCE_FOREACH but for a headerless sequence body. */ +#define LV2_ATOM_SEQUENCE_BODY_FOREACH(body, size, iter) \ + for (const LV2_Atom_Event* (iter) = lv2_atom_sequence_begin(body); \ + !lv2_atom_sequence_is_end(body, size, (iter)); \ + (iter) = lv2_atom_sequence_next(iter)) + +/** + @} + @name Sequence Utilities + @{ +*/ + +/** + Clear all events from @p sequence. + + This simply resets the size field, the other fields are left untouched. +*/ +static inline void +lv2_atom_sequence_clear(LV2_Atom_Sequence* seq) +{ + seq->atom.size = sizeof(LV2_Atom_Sequence_Body); +} + +/** + Append an event at the end of @p sequence. + + @param seq Sequence to append to. + @param capacity Total capacity of the sequence atom + (e.g. as set by the host for sequence output ports). + @param event Event to write. + + @return A pointer to the newly written event in @p seq, + or NULL on failure (insufficient space). +*/ +static inline LV2_Atom_Event* +lv2_atom_sequence_append_event(LV2_Atom_Sequence* seq, + uint32_t capacity, + const LV2_Atom_Event* event) +{ + const uint32_t total_size = (uint32_t)sizeof(*event) + event->body.size; + if (capacity - seq->atom.size < total_size) { + return NULL; + } + + LV2_Atom_Event* e = lv2_atom_sequence_end(&seq->body, seq->atom.size); + memcpy(e, event, total_size); + + seq->atom.size += lv2_atom_pad_size(total_size); + + return e; +} + +/** + @} + @name Tuple Iterator + @{ +*/ + +/** Get an iterator pointing to the first element in @p tup. */ +static inline const LV2_Atom* +lv2_atom_tuple_begin(const LV2_Atom_Tuple* tup) +{ + return (const LV2_Atom*)(LV2_ATOM_BODY_CONST(tup)); +} + +/** Return true iff @p i has reached the end of @p body. */ +static inline bool +lv2_atom_tuple_is_end(const void* body, uint32_t size, const LV2_Atom* i) +{ + return (const uint8_t*)i >= ((const uint8_t*)body + size); +} + +/** Return an iterator to the element following @p i. */ +static inline const LV2_Atom* +lv2_atom_tuple_next(const LV2_Atom* i) +{ + return (const LV2_Atom*)( + (const uint8_t*)i + sizeof(LV2_Atom) + lv2_atom_pad_size(i->size)); +} + +/** + A macro for iterating over all properties of a Tuple. + @param tuple The tuple to iterate over + @param iter The name of the iterator + + This macro is used similarly to a for loop (which it expands to), e.g.: + @code + LV2_ATOMO_TUPLE_FOREACH(tuple, elem) { + // Do something with elem (an LV2_Atom*) here... + } + @endcode +*/ +#define LV2_ATOM_TUPLE_FOREACH(tuple, iter) \ + for (const LV2_Atom* (iter) = lv2_atom_tuple_begin(tuple); \ + !lv2_atom_tuple_is_end(LV2_ATOM_BODY_CONST(tuple), (tuple)->size, (iter)); \ + (iter) = lv2_atom_tuple_next(iter)) + +/** Like LV2_ATOM_TUPLE_FOREACH but for a headerless tuple body. */ +#define LV2_ATOM_TUPLE_BODY_FOREACH(body, size, iter) \ + for (const LV2_Atom* (iter) = (const LV2_Atom*)body; \ + !lv2_atom_tuple_is_end(body, size, (iter)); \ + (iter) = lv2_atom_tuple_next(iter)) + +/** + @} + @name Object Iterator + @{ +*/ + +/** Return a pointer to the first property in @p body. */ +static inline const LV2_Atom_Property_Body* +lv2_atom_object_begin(const LV2_Atom_Object_Body* body) +{ + return (const LV2_Atom_Property_Body*)(body + 1); +} + +/** Return true iff @p i has reached the end of @p obj. */ +static inline bool +lv2_atom_object_is_end(const LV2_Atom_Object_Body* body, + uint32_t size, + const LV2_Atom_Property_Body* i) +{ + return (const uint8_t*)i >= ((const uint8_t*)body + size); +} + +/** Return an iterator to the property following @p i. */ +static inline const LV2_Atom_Property_Body* +lv2_atom_object_next(const LV2_Atom_Property_Body* i) +{ + const LV2_Atom* const value = (const LV2_Atom*)( + (const uint8_t*)i + 2 * sizeof(uint32_t)); + return (const LV2_Atom_Property_Body*)( + (const uint8_t*)i + lv2_atom_pad_size( + (uint32_t)sizeof(LV2_Atom_Property_Body) + value->size)); +} + +/** + A macro for iterating over all properties of an Object. + @param obj The object to iterate over + @param iter The name of the iterator + + This macro is used similarly to a for loop (which it expands to), e.g.: + @code + LV2_ATOM_OBJECT_FOREACH(object, i) { + // Do something with prop (an LV2_Atom_Property_Body*) here... + } + @endcode +*/ +#define LV2_ATOM_OBJECT_FOREACH(obj, iter) \ + for (const LV2_Atom_Property_Body* (iter) = lv2_atom_object_begin(&(obj)->body); \ + !lv2_atom_object_is_end(&(obj)->body, (obj)->atom.size, (iter)); \ + (iter) = lv2_atom_object_next(iter)) + +/** Like LV2_ATOM_OBJECT_FOREACH but for a headerless object body. */ +#define LV2_ATOM_OBJECT_BODY_FOREACH(body, size, iter) \ + for (const LV2_Atom_Property_Body* (iter) = lv2_atom_object_begin(body); \ + !lv2_atom_object_is_end(body, size, (iter)); \ + (iter) = lv2_atom_object_next(iter)) + +/** + @} + @name Object Query + @{ +*/ + +/** A single entry in an Object query. */ +typedef struct { + uint32_t key; /**< Key to query (input set by user) */ + const LV2_Atom** value; /**< Found value (output set by query function) */ +} LV2_Atom_Object_Query; + +static const LV2_Atom_Object_Query LV2_ATOM_OBJECT_QUERY_END = { 0, NULL }; + +/** + Get an object's values for various keys. + + The value pointer of each item in @p query will be set to the location of + the corresponding value in @p object. Every value pointer in @p query MUST + be initialised to NULL. This function reads @p object in a single linear + sweep. By allocating @p query on the stack, objects can be "queried" + quickly without allocating any memory. This function is realtime safe. + + This function can only do "flat" queries, it is not smart enough to match + variables in nested objects. + + For example: + @code + const LV2_Atom* name = NULL; + const LV2_Atom* age = NULL; + LV2_Atom_Object_Query q[] = { + { urids.eg_name, &name }, + { urids.eg_age, &age }, + LV2_ATOM_OBJECT_QUERY_END + }; + lv2_atom_object_query(obj, q); + // name and age are now set to the appropriate values in obj, or NULL. + @endcode +*/ +static inline int +lv2_atom_object_query(const LV2_Atom_Object* object, + LV2_Atom_Object_Query* query) +{ + int matches = 0; + int n_queries = 0; + + /* Count number of query keys so we can short-circuit when done */ + for (LV2_Atom_Object_Query* q = query; q->key; ++q) { + ++n_queries; + } + + LV2_ATOM_OBJECT_FOREACH(object, prop) { + for (LV2_Atom_Object_Query* q = query; q->key; ++q) { + if (q->key == prop->key && !*q->value) { + *q->value = &prop->value; + if (++matches == n_queries) { + return matches; + } + break; + } + } + } + return matches; +} + +/** + Body only version of lv2_atom_object_get(). +*/ +static inline int +lv2_atom_object_body_get(uint32_t size, const LV2_Atom_Object_Body* body, ...) +{ + int matches = 0; + int n_queries = 0; + + /* Count number of keys so we can short-circuit when done */ + va_list args; + va_start(args, body); + for (n_queries = 0; va_arg(args, uint32_t); ++n_queries) { + if (!va_arg(args, const LV2_Atom**)) { + return -1; + } + } + va_end(args); + + LV2_ATOM_OBJECT_BODY_FOREACH(body, size, prop) { + va_start(args, body); + for (int i = 0; i < n_queries; ++i) { + uint32_t qkey = va_arg(args, uint32_t); + const LV2_Atom** qval = va_arg(args, const LV2_Atom**); + if (qkey == prop->key && !*qval) { + *qval = &prop->value; + if (++matches == n_queries) { + return matches; + } + break; + } + } + va_end(args); + } + return matches; +} + +/** + Variable argument version of lv2_atom_object_query(). + + This is nicer-looking in code, but a bit more error-prone since it is not + type safe and the argument list must be terminated. + + The arguments should be a series of uint32_t key and const LV2_Atom** value + pairs, terminated by a zero key. The value pointers MUST be initialized to + NULL. For example: + + @code + const LV2_Atom* name = NULL; + const LV2_Atom* age = NULL; + lv2_atom_object_get(obj, + uris.name_key, &name, + uris.age_key, &age, + 0); + @endcode +*/ +static inline int +lv2_atom_object_get(const LV2_Atom_Object* object, ...) +{ + int matches = 0; + int n_queries = 0; + + /* Count number of keys so we can short-circuit when done */ + va_list args; + va_start(args, object); + for (n_queries = 0; va_arg(args, uint32_t); ++n_queries) { + if (!va_arg(args, const LV2_Atom**)) { + return -1; + } + } + va_end(args); + + LV2_ATOM_OBJECT_FOREACH(object, prop) { + va_start(args, object); + for (int i = 0; i < n_queries; ++i) { + uint32_t qkey = va_arg(args, uint32_t); + const LV2_Atom** qval = va_arg(args, const LV2_Atom**); + if (qkey == prop->key && !*qval) { + *qval = &prop->value; + if (++matches == n_queries) { + return matches; + } + break; + } + } + va_end(args); + } + return matches; +} + +/** + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_ATOM_UTIL_H */ diff --git a/dpf/distrho/src/lv2/atom.h b/dpf/distrho/src/lv2/atom.h new file mode 100644 index 0000000..91c4fa3 --- /dev/null +++ b/dpf/distrho/src/lv2/atom.h @@ -0,0 +1,246 @@ +/* + Copyright 2008-2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file atom.h C header for the LV2 Atom extension + . +*/ + +#ifndef LV2_ATOM_H +#define LV2_ATOM_H + +#include +#include + +#define LV2_ATOM_URI "http://lv2plug.in/ns/ext/atom" +#define LV2_ATOM_PREFIX LV2_ATOM_URI "#" + +#define LV2_ATOM__Atom LV2_ATOM_PREFIX "Atom" +#define LV2_ATOM__AtomPort LV2_ATOM_PREFIX "AtomPort" +#define LV2_ATOM__Blank LV2_ATOM_PREFIX "Blank" +#define LV2_ATOM__Bool LV2_ATOM_PREFIX "Bool" +#define LV2_ATOM__Chunk LV2_ATOM_PREFIX "Chunk" +#define LV2_ATOM__Double LV2_ATOM_PREFIX "Double" +#define LV2_ATOM__Event LV2_ATOM_PREFIX "Event" +#define LV2_ATOM__Float LV2_ATOM_PREFIX "Float" +#define LV2_ATOM__Int LV2_ATOM_PREFIX "Int" +#define LV2_ATOM__Literal LV2_ATOM_PREFIX "Literal" +#define LV2_ATOM__Long LV2_ATOM_PREFIX "Long" +#define LV2_ATOM__Number LV2_ATOM_PREFIX "Number" +#define LV2_ATOM__Object LV2_ATOM_PREFIX "Object" +#define LV2_ATOM__Path LV2_ATOM_PREFIX "Path" +#define LV2_ATOM__Property LV2_ATOM_PREFIX "Property" +#define LV2_ATOM__Resource LV2_ATOM_PREFIX "Resource" +#define LV2_ATOM__Sequence LV2_ATOM_PREFIX "Sequence" +#define LV2_ATOM__Sound LV2_ATOM_PREFIX "Sound" +#define LV2_ATOM__String LV2_ATOM_PREFIX "String" +#define LV2_ATOM__Tuple LV2_ATOM_PREFIX "Tuple" +#define LV2_ATOM__URI LV2_ATOM_PREFIX "URI" +#define LV2_ATOM__URID LV2_ATOM_PREFIX "URID" +#define LV2_ATOM__Vector LV2_ATOM_PREFIX "Vector" +#define LV2_ATOM__atomTransfer LV2_ATOM_PREFIX "atomTransfer" +#define LV2_ATOM__beatTime LV2_ATOM_PREFIX "beatTime" +#define LV2_ATOM__bufferType LV2_ATOM_PREFIX "bufferType" +#define LV2_ATOM__childType LV2_ATOM_PREFIX "childType" +#define LV2_ATOM__eventTransfer LV2_ATOM_PREFIX "eventTransfer" +#define LV2_ATOM__frameTime LV2_ATOM_PREFIX "frameTime" +#define LV2_ATOM__supports LV2_ATOM_PREFIX "supports" +#define LV2_ATOM__timeUnit LV2_ATOM_PREFIX "timeUnit" + +#define LV2_ATOM_REFERENCE_TYPE 0 + +#ifdef __cplusplus +extern "C" { +#endif + +/** This expression will fail to compile if double does not fit in 64 bits. */ +typedef char lv2_atom_assert_double_fits_in_64_bits[ + ((sizeof(double) <= sizeof(uint64_t)) * 2) - 1]; + +/** + Return a pointer to the contents of an Atom. The "contents" of an atom + is the data past the complete type-specific header. + @param type The type of the atom, e.g. LV2_Atom_String. + @param atom A variable-sized atom. +*/ +#define LV2_ATOM_CONTENTS(type, atom) \ + ((uint8_t*)(atom) + sizeof(type)) + +/** + Const version of LV2_ATOM_CONTENTS. +*/ +#define LV2_ATOM_CONTENTS_CONST(type, atom) \ + ((const uint8_t*)(atom) + sizeof(type)) + +/** + Return a pointer to the body of an Atom. The "body" of an atom is the + data just past the LV2_Atom head (i.e. the same offset for all types). +*/ +#define LV2_ATOM_BODY(atom) LV2_ATOM_CONTENTS(LV2_Atom, atom) + +/** + Const version of LV2_ATOM_BODY. +*/ +#define LV2_ATOM_BODY_CONST(atom) LV2_ATOM_CONTENTS_CONST(LV2_Atom, atom) + +/** The header of an atom:Atom. */ +typedef struct { + uint32_t size; /**< Size in bytes, not including type and size. */ + uint32_t type; /**< Type of this atom (mapped URI). */ +} LV2_Atom; + +/** An atom:Int or atom:Bool. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + int32_t body; /**< Integer value. */ +} LV2_Atom_Int; + +/** An atom:Long. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + int64_t body; /**< Integer value. */ +} LV2_Atom_Long; + +/** An atom:Float. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + float body; /**< Floating point value. */ +} LV2_Atom_Float; + +/** An atom:Double. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + double body; /**< Floating point value. */ +} LV2_Atom_Double; + +/** An atom:Bool. May be cast to LV2_Atom. */ +typedef LV2_Atom_Int LV2_Atom_Bool; + +/** An atom:URID. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + uint32_t body; /**< URID. */ +} LV2_Atom_URID; + +/** An atom:String. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + /* Contents (a null-terminated UTF-8 string) follow here. */ +} LV2_Atom_String; + +/** The body of an atom:Literal. */ +typedef struct { + uint32_t datatype; /**< Datatype URID. */ + uint32_t lang; /**< Language URID. */ + /* Contents (a null-terminated UTF-8 string) follow here. */ +} LV2_Atom_Literal_Body; + +/** An atom:Literal. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Literal_Body body; /**< Body. */ +} LV2_Atom_Literal; + +/** An atom:Tuple. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + /* Contents (a series of complete atoms) follow here. */ +} LV2_Atom_Tuple; + +/** The body of an atom:Vector. */ +typedef struct { + uint32_t child_size; /**< The size of each element in the vector. */ + uint32_t child_type; /**< The type of each element in the vector. */ + /* Contents (a series of packed atom bodies) follow here. */ +} LV2_Atom_Vector_Body; + +/** An atom:Vector. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Vector_Body body; /**< Body. */ +} LV2_Atom_Vector; + +/** The body of an atom:Property (e.g. in an atom:Object). */ +typedef struct { + uint32_t key; /**< Key (predicate) (mapped URI). */ + uint32_t context; /**< Context URID (may be, and generally is, 0). */ + LV2_Atom value; /**< Value atom header. */ + /* Value atom body follows here. */ +} LV2_Atom_Property_Body; + +/** An atom:Property. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Property_Body body; /**< Body. */ +} LV2_Atom_Property; + +/** The body of an atom:Object. May be cast to LV2_Atom. */ +typedef struct { + uint32_t id; /**< URID, or 0 for blank. */ + uint32_t otype; /**< Type URID (same as rdf:type, for fast dispatch). */ + /* Contents (a series of property bodies) follow here. */ +} LV2_Atom_Object_Body; + +/** An atom:Object. May be cast to LV2_Atom. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Object_Body body; /**< Body. */ +} LV2_Atom_Object; + +/** The header of an atom:Event. Note this type is NOT an LV2_Atom. */ +typedef struct { + /** Time stamp. Which type is valid is determined by context. */ + union { + int64_t frames; /**< Time in audio frames. */ + double beats; /**< Time in beats. */ + } time; + LV2_Atom body; /**< Event body atom header. */ + /* Body atom contents follow here. */ +} LV2_Atom_Event; + +/** + The body of an atom:Sequence (a sequence of events). + + The unit field is either a URID that described an appropriate time stamp + type, or may be 0 where a default stamp type is known. For + LV2_Descriptor::run(), the default stamp type is audio frames. + + The contents of a sequence is a series of LV2_Atom_Event, each aligned + to 64-bits, e.g.: +
+   | Event 1 (size 6)                              | Event 2
+   |       |       |       |       |       |       |       |       |
+   | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+   |FRAMES |SUBFRMS|TYPE   |SIZE   |DATADATADATAPAD|FRAMES |SUBFRMS|...
+   
+*/ +typedef struct { + uint32_t unit; /**< URID of unit of event time stamps. */ + uint32_t pad; /**< Currently unused. */ + /* Contents (a series of events) follow here. */ +} LV2_Atom_Sequence_Body; + +/** An atom:Sequence. */ +typedef struct { + LV2_Atom atom; /**< Atom header. */ + LV2_Atom_Sequence_Body body; /**< Body. */ +} LV2_Atom_Sequence; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_ATOM_H */ diff --git a/dpf/distrho/src/lv2/buf-size.h b/dpf/distrho/src/lv2/buf-size.h new file mode 100644 index 0000000..20cd8fd --- /dev/null +++ b/dpf/distrho/src/lv2/buf-size.h @@ -0,0 +1,30 @@ +/* + Copyright 2007-2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_BUF_SIZE_H +#define LV2_BUF_SIZE_H + +#define LV2_BUF_SIZE_URI "http://lv2plug.in/ns/ext/buf-size" +#define LV2_BUF_SIZE_PREFIX LV2_BUF_SIZE_URI "#" + +#define LV2_BUF_SIZE__boundedBlockLength LV2_BUF_SIZE_PREFIX "boundedBlockLength" +#define LV2_BUF_SIZE__fixedBlockLength LV2_BUF_SIZE_PREFIX "fixedBlockLength" +#define LV2_BUF_SIZE__maxBlockLength LV2_BUF_SIZE_PREFIX "maxBlockLength" +#define LV2_BUF_SIZE__minBlockLength LV2_BUF_SIZE_PREFIX "minBlockLength" +#define LV2_BUF_SIZE__powerOf2BlockLength LV2_BUF_SIZE_PREFIX "powerOf2BlockLength" +#define LV2_BUF_SIZE__sequenceSize LV2_BUF_SIZE_PREFIX "sequenceSize" + +#endif /* LV2_BUF_SIZE_H */ diff --git a/dpf/distrho/src/lv2/data-access.h b/dpf/distrho/src/lv2/data-access.h new file mode 100644 index 0000000..68aaf62 --- /dev/null +++ b/dpf/distrho/src/lv2/data-access.h @@ -0,0 +1,63 @@ +/* + LV2 Data Access Extension + Copyright 2008-2011 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file data-access.h + C header for the LV2 Extension Data extension + . + + This extension defines a method for (e.g.) plugin UIs to have (possibly + marshalled) access to the extension_data function on a plugin instance. +*/ + +#ifndef LV2_DATA_ACCESS_H +#define LV2_DATA_ACCESS_H + +#define LV2_DATA_ACCESS_URI "http://lv2plug.in/ns/ext/data-access" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + The data field of the LV2_Feature for this extension. + + To support this feature the host must pass an LV2_Feature struct to the + instantiate method with URI "http://lv2plug.in/ns/ext/data-access" + and data pointed to an instance of this struct. +*/ +typedef struct { + /** + A pointer to a method the UI can call to get data (of a type specified + by some other extension) from the plugin. + + This call never is never guaranteed to return anything, UIs should + degrade gracefully if direct access to the plugin data is not possible + (in which case this function will return NULL). + + This is for access to large data that can only possibly work if the UI + and plugin are running in the same process. For all other things, use + the normal LV2 UI communication system. + */ + const void* (*data_access)(const char* uri); +} LV2_Extension_Data_Feature; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_DATA_ACCESS_H */ diff --git a/dpf/distrho/src/lv2/dynmanifest.h b/dpf/distrho/src/lv2/dynmanifest.h new file mode 100644 index 0000000..fad33c8 --- /dev/null +++ b/dpf/distrho/src/lv2/dynmanifest.h @@ -0,0 +1,144 @@ +/* + Dynamic manifest specification for LV2 + Copyright 2008-2011 Stefano D'Angelo + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file dynmanifest.h + C header for the LV2 Dynamic Manifest extension + . + Revision: 1.2 +*/ + +#ifndef LV2_DYN_MANIFEST_H_INCLUDED +#define LV2_DYN_MANIFEST_H_INCLUDED + +#include + +#include "lv2.h" + +#define LV2_DYN_MANIFEST_URI "http://lv2plug.in/ns/ext/dynmanifest" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Dynamic manifest generator handle. + + This handle indicates a particular status of a dynamic manifest generator. + The host MUST NOT attempt to interpret it and, unlikely LV2_Handle, it is + NOT even valid to compare this to NULL. The dynamic manifest generator MAY + use it to reference internal data. +*/ +typedef void * LV2_Dyn_Manifest_Handle; + +/** + Generate the dynamic manifest. + + @param handle Pointer to an uninitialized dynamic manifest generator handle. + + @param features NULL terminated array of LV2_Feature structs which represent + the features the host supports. The dynamic manifest generator may refuse to + (re)generate the dynamic manifest if required features are not found here + (however hosts SHOULD NOT use this as a discovery mechanism, instead of + reading the static manifest file). This array must always exist; if a host + has no features, it MUST pass a single element array containing NULL. + + @return 0 on success, otherwise a non-zero error code. The host SHOULD + evaluate the result of the operation by examining the returned value and + MUST NOT try to interpret the value of handle. +*/ +int lv2_dyn_manifest_open(LV2_Dyn_Manifest_Handle * handle, + const LV2_Feature *const * features); + +/** + Fetch a "list" of subject URIs described in the dynamic manifest. + + The dynamic manifest generator has to fill the resource only with the needed + triples to make the host aware of the "objects" it wants to expose. For + example, if the plugin library exposes a regular LV2 plugin, it should + output only a triple like the following: + + a lv2:Plugin . + + The objects that are elegible for exposure are those that would need to be + represented by a subject node in a static manifest. + + @param handle Dynamic manifest generator handle. + + @param fp FILE * identifying the resource the host has to set up for the + dynamic manifest generator. The host MUST pass a writable, empty resource to + this function, and the dynamic manifest generator MUST ONLY perform write + operations on it at the end of the stream (e.g., using only fprintf(), + fwrite() and similar). + + @return 0 on success, otherwise a non-zero error code. +*/ +int lv2_dyn_manifest_get_subjects(LV2_Dyn_Manifest_Handle handle, + FILE * fp); + +/** + Function that fetches data related to a specific URI. + + The dynamic manifest generator has to fill the resource with data related to + object represented by the given URI. For example, if the library exposes a + regular LV2 plugin whose URI, as retrieved by the host using + lv2_dyn_manifest_get_subjects() is http://www.example.com/plugin/uri, it + should output something like: + +
+   
+       a lv2:Plugin ;
+       doap:name "My Plugin" ;
+       lv2:binary  ;
+       etc:etc "..." .
+   
+ + @param handle Dynamic manifest generator handle. + + @param fp FILE * identifying the resource the host has to set up for the + dynamic manifest generator. The host MUST pass a writable resource to this + function, and the dynamic manifest generator MUST ONLY perform write + operations on it at the current position of the stream (e.g. using only + fprintf(), fwrite() and similar). + + @param uri URI to get data about (in the "plain" form, i.e., absolute URI + without Turtle prefixes). + + @return 0 on success, otherwise a non-zero error code. +*/ +int lv2_dyn_manifest_get_data(LV2_Dyn_Manifest_Handle handle, + FILE * fp, + const char * uri); + +/** + Function that ends the operations on the dynamic manifest generator. + + This function SHOULD be used by the dynamic manifest generator to perform + cleanup operations, etc. + + Once this function is called, referring to handle will cause undefined + behavior. + + @param handle Dynamic manifest generator handle. +*/ +void lv2_dyn_manifest_close(LV2_Dyn_Manifest_Handle handle); + +#ifdef __cplusplus +} +#endif + +#endif /* LV2_DYN_MANIFEST_H_INCLUDED */ diff --git a/dpf/distrho/src/lv2/event-helpers.h b/dpf/distrho/src/lv2/event-helpers.h new file mode 100644 index 0000000..5caaab5 --- /dev/null +++ b/dpf/distrho/src/lv2/event-helpers.h @@ -0,0 +1,266 @@ +/* + Copyright 2008-2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file event-helpers.h Helper functions for the LV2 Event extension + . +*/ + +#ifndef LV2_EVENT_HELPERS_H +#define LV2_EVENT_HELPERS_H + +#include +#include +#include + +#include "event.h" + +#ifdef __cplusplus +extern "C" { +#else +# include +#endif + +/** @file + * Helper functions for the LV2 Event extension + * . + * + * These functions are provided for convenience only, use of them is not + * required for supporting lv2ev (i.e. the events extension is defined by the + * raw buffer format described in lv2_event.h and NOT by this API). + * + * Note that these functions are all static inline which basically means: + * do not take the address of these functions. */ + + +/** Pad a size to 64 bits (for event sizes) */ +static inline uint16_t +lv2_event_pad_size(uint16_t size) +{ + return (uint16_t)(size + 7U) & (uint16_t)(~7U); +} + + +/** Initialize (empty, reset..) an existing event buffer. + * The contents of buf are ignored entirely and overwritten, except capacity + * which is unmodified. */ +static inline void +lv2_event_buffer_reset(LV2_Event_Buffer* buf, + uint16_t stamp_type, + uint8_t* data) +{ + buf->data = data; + buf->header_size = sizeof(LV2_Event_Buffer); + buf->stamp_type = stamp_type; + buf->event_count = 0; + buf->size = 0; +} + + +/** Allocate a new, empty event buffer. */ +static inline LV2_Event_Buffer* +lv2_event_buffer_new(uint32_t capacity, uint16_t stamp_type) +{ + const size_t size = sizeof(LV2_Event_Buffer) + capacity; + LV2_Event_Buffer* buf = (LV2_Event_Buffer*)malloc(size); + if (buf != NULL) { + buf->capacity = capacity; + lv2_event_buffer_reset(buf, stamp_type, (uint8_t *)(buf + 1)); + return buf; + } else { + return NULL; + } +} + + +/** An iterator over an LV2_Event_Buffer. + * + * Multiple simultaneous read iterators over a single buffer is fine, + * but changing the buffer invalidates all iterators (e.g. RW Lock). */ +typedef struct { + LV2_Event_Buffer* buf; + uint32_t offset; +} LV2_Event_Iterator; + + +/** Reset an iterator to point to the start of @a buf. + * @return True if @a iter is valid, otherwise false (buffer is empty) */ +static inline bool +lv2_event_begin(LV2_Event_Iterator* iter, + LV2_Event_Buffer* buf) +{ + iter->buf = buf; + iter->offset = 0; + return (buf->size > 0); +} + + +/** Check if @a iter is valid. + * @return True if @a iter is valid, otherwise false (past end of buffer) */ +static inline bool +lv2_event_is_valid(LV2_Event_Iterator* iter) +{ + return (iter->buf && (iter->offset < iter->buf->size)); +} + + +/** Advance @a iter forward one event. + * @a iter must be valid. + * @return True if @a iter is valid, otherwise false (reached end of buffer) */ +static inline bool +lv2_event_increment(LV2_Event_Iterator* iter) +{ + if (!lv2_event_is_valid(iter)) { + return false; + } + + LV2_Event* const ev = (LV2_Event*)( + (uint8_t*)iter->buf->data + iter->offset); + + iter->offset += lv2_event_pad_size( + (uint16_t)((uint16_t)sizeof(LV2_Event) + ev->size)); + + return true; +} + + +/** Dereference an event iterator (get the event currently pointed at). + * @a iter must be valid. + * @a data if non-NULL, will be set to point to the contents of the event + * returned. + * @return A Pointer to the event @a iter is currently pointing at, or NULL + * if the end of the buffer is reached (in which case @a data is + * also set to NULL). */ +static inline LV2_Event* +lv2_event_get(LV2_Event_Iterator* iter, + uint8_t** data) +{ + if (!lv2_event_is_valid(iter)) { + return NULL; + } + + LV2_Event* const ev = (LV2_Event*)( + (uint8_t*)iter->buf->data + iter->offset); + + if (data) + *data = (uint8_t*)ev + sizeof(LV2_Event); + + return ev; +} + + +/** Write an event at @a iter. + * The event (if any) pointed to by @a iter will be overwritten, and @a iter + * incremented to point to the following event (i.e. several calls to this + * function can be done in sequence without twiddling iter in-between). + * @return True if event was written, otherwise false (buffer is full). */ +static inline bool +lv2_event_write(LV2_Event_Iterator* iter, + uint32_t frames, + uint32_t subframes, + uint16_t type, + uint16_t size, + const uint8_t* data) +{ + if (!iter->buf) + return false; + + if (iter->buf->capacity - iter->buf->size < sizeof(LV2_Event) + size) + return false; + + LV2_Event* const ev = (LV2_Event*)( + (uint8_t*)iter->buf->data + iter->offset); + + ev->frames = frames; + ev->subframes = subframes; + ev->type = type; + ev->size = size; + memcpy((uint8_t*)ev + sizeof(LV2_Event), data, size); + ++iter->buf->event_count; + + size = lv2_event_pad_size((uint16_t)(sizeof(LV2_Event) + size)); + iter->buf->size += size; + iter->offset += size; + + return true; +} + + +/** Reserve space for an event in the buffer and return a pointer to + the memory where the caller can write the event data, or NULL if there + is not enough room in the buffer. */ +static inline uint8_t* +lv2_event_reserve(LV2_Event_Iterator* iter, + uint32_t frames, + uint32_t subframes, + uint16_t type, + uint16_t size) +{ + const uint16_t total_size = (uint16_t)(sizeof(LV2_Event) + size); + if (iter->buf->capacity - iter->buf->size < total_size) + return NULL; + + LV2_Event* const ev = (LV2_Event*)( + (uint8_t*)iter->buf->data + iter->offset); + + ev->frames = frames; + ev->subframes = subframes; + ev->type = type; + ev->size = size; + ++iter->buf->event_count; + + const uint16_t padded_size = lv2_event_pad_size(total_size); + iter->buf->size += padded_size; + iter->offset += padded_size; + + return (uint8_t*)ev + sizeof(LV2_Event); +} + + +/** Write an event at @a iter. + * The event (if any) pointed to by @a iter will be overwritten, and @a iter + * incremented to point to the following event (i.e. several calls to this + * function can be done in sequence without twiddling iter in-between). + * @return True if event was written, otherwise false (buffer is full). */ +static inline bool +lv2_event_write_event(LV2_Event_Iterator* iter, + const LV2_Event* ev, + const uint8_t* data) +{ + const uint16_t total_size = (uint16_t)(sizeof(LV2_Event) + ev->size); + if (iter->buf->capacity - iter->buf->size < total_size) + return false; + + LV2_Event* const write_ev = (LV2_Event*)( + (uint8_t*)iter->buf->data + iter->offset); + + *write_ev = *ev; + memcpy((uint8_t*)write_ev + sizeof(LV2_Event), data, ev->size); + ++iter->buf->event_count; + + const uint16_t padded_size = lv2_event_pad_size(total_size); + iter->buf->size += padded_size; + iter->offset += padded_size; + + return true; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_EVENT_HELPERS_H */ + diff --git a/dpf/distrho/src/lv2/event.h b/dpf/distrho/src/lv2/event.h new file mode 100644 index 0000000..e33d862 --- /dev/null +++ b/dpf/distrho/src/lv2/event.h @@ -0,0 +1,294 @@ +/* + Copyright 2008-2011 David Robillard + Copyright 2006-2007 Lars Luthman + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file event.h + C API for the LV2 Event extension . + + This extension is a generic transport mechanism for time stamped events + of any type (e.g. MIDI, OSC, ramps, etc). Each port can transport mixed + events of any type; the type of events and timestamps are defined by a URI + which is mapped to an integer by the host for performance reasons. + + This extension requires the host to support the LV2 URI Map extension. + Any host which supports this extension MUST guarantee that any call to + the LV2 URI Map uri_to_id function with the URI of this extension as the + 'map' argument returns a value within the range of uint16_t. +*/ + +#ifndef LV2_EVENT_H +#define LV2_EVENT_H + +#define LV2_EVENT_URI "http://lv2plug.in/ns/ext/event" +#define LV2_EVENT_PREFIX LV2_EVENT_URI "#" + +#define LV2_EVENT__Event LV2_EVENT_PREFIX "Event" +#define LV2_EVENT__EventPort LV2_EVENT_PREFIX "EventPort" +#define LV2_EVENT__FrameStamp LV2_EVENT_PREFIX "FrameStamp" +#define LV2_EVENT__TimeStamp LV2_EVENT_PREFIX "TimeStamp" +#define LV2_EVENT__generatesTimeStamp LV2_EVENT_PREFIX "generatesTimeStamp" +#define LV2_EVENT__generic LV2_EVENT_PREFIX "generic" +#define LV2_EVENT__inheritsEvent LV2_EVENT_PREFIX "inheritsEvent" +#define LV2_EVENT__inheritsTimeStamp LV2_EVENT_PREFIX "inheritsTimeStamp" +#define LV2_EVENT__supportsEvent LV2_EVENT_PREFIX "supportsEvent" +#define LV2_EVENT__supportsTimeStamp LV2_EVENT_PREFIX "supportsTimeStamp" + +#define LV2_EVENT_AUDIO_STAMP 0 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + The best Pulses Per Quarter Note for tempo-based uint32_t timestamps. + Equal to 2^12 * 5 * 7 * 9 * 11 * 13 * 17, which is evenly divisble + by all integers from 1 through 18 inclusive, and powers of 2 up to 2^12. +*/ +static const uint32_t LV2_EVENT_PPQN = 3136573440U; + +/** + An LV2 event (header only). + + LV2 events are generic time-stamped containers for any type of event. + The type field defines the format of a given event's contents. + + This struct defines the header of an LV2 event. An LV2 event is a single + chunk of POD (plain old data), usually contained in a flat buffer (see + LV2_EventBuffer below). Unless a required feature says otherwise, hosts may + assume a deep copy of an LV2 event can be created safely using a simple: + + memcpy(ev_copy, ev, sizeof(LV2_Event) + ev->size); (or equivalent) +*/ +typedef struct { + /** + The frames portion of timestamp. The units used here can optionally be + set for a port (with the lv2ev:timeUnits property), otherwise this is + audio frames, corresponding to the sample_count parameter of the LV2 run + method (e.g. frame 0 is the first frame for that call to run). + */ + uint32_t frames; + + /** + The sub-frames portion of timestamp. The units used here can optionally + be set for a port (with the lv2ev:timeUnits property), otherwise this is + 1/(2^32) of an audio frame. + */ + uint32_t subframes; + + /** + The type of this event, as a number which represents some URI + defining an event type. This value MUST be some value previously + returned from a call to the uri_to_id function defined in the LV2 + URI map extension (see lv2_uri_map.h). + There are special rules which must be followed depending on the type + of an event. If the plugin recognizes an event type, the definition + of that event type will describe how to interpret the event, and + any required behaviour. Otherwise, if the type is 0, this event is a + non-POD event and lv2_event_unref MUST be called if the event is + 'dropped' (see above). Even if the plugin does not understand an event, + it may pass the event through to an output by simply copying (and NOT + calling lv2_event_unref). These rules are designed to allow for generic + event handling plugins and large non-POD events, but with minimal hassle + on simple plugins that "don't care" about these more advanced features. + */ + uint16_t type; + + /** + The size of the data portion of this event in bytes, which immediately + follows. The header size (12 bytes) is not included in this value. + */ + uint16_t size; + + /* size bytes of data follow here */ +} LV2_Event; + + +/** + A buffer of LV2 events (header only). + + Like events (which this contains) an event buffer is a single chunk of POD: + the entire buffer (including contents) can be copied with a single memcpy. + The first contained event begins sizeof(LV2_EventBuffer) bytes after the + start of this struct. + + After this header, the buffer contains an event header (defined by struct + LV2_Event), followed by that event's contents (padded to 64 bits), followed + by another header, etc: + + | | | | | | | + | | | | | | | | | | | | | | | | | | | | | | | | | + |FRAMES |SUBFRMS|TYP|LEN|DATA..DATA..PAD|FRAMES | ... +*/ +typedef struct { + /** + The contents of the event buffer. This may or may not reside in the + same block of memory as this header, plugins must not assume either. + The host guarantees this points to at least capacity bytes of allocated + memory (though only size bytes of that are valid events). + */ + uint8_t* data; + + /** + The size of this event header in bytes (including everything). + + This is to allow for extending this header in the future without + breaking binary compatibility. Whenever this header is copied, + it MUST be done using this field (and NOT the sizeof this struct). + */ + uint16_t header_size; + + /** + The type of the time stamps for events in this buffer. + As a special exception, '0' always means audio frames and subframes + (1/UINT32_MAX'th of a frame) in the sample rate passed to instantiate. + + INPUTS: The host must set this field to the numeric ID of some URI + defining the meaning of the frames/subframes fields of contained events + (obtained by the LV2 URI Map uri_to_id function with the URI of this + extension as the 'map' argument, see lv2_uri_map.h). The host must + never pass a plugin a buffer which uses a stamp type the plugin does not + 'understand'. The value of this field must never change, except when + connect_port is called on the input port, at which time the host MUST + have set the stamp_type field to the value that will be used for all + subsequent run calls. + + OUTPUTS: The plugin may set this to any value that has been returned + from uri_to_id with the URI of this extension for a 'map' argument. + When connected to a buffer with connect_port, output ports MUST set this + field to the type of time stamp they will be writing. On any call to + connect_port on an event input port, the plugin may change this field on + any output port, it is the responsibility of the host to check if any of + these values have changed and act accordingly. + */ + uint16_t stamp_type; + + /** + The number of events in this buffer. + + INPUTS: The host must set this field to the number of events contained + in the data buffer before calling run(). The plugin must not change + this field. + + OUTPUTS: The plugin must set this field to the number of events it has + written to the buffer before returning from run(). Any initial value + should be ignored by the plugin. + */ + uint32_t event_count; + + /** + The size of the data buffer in bytes. + This is set by the host and must not be changed by the plugin. + The host is allowed to change this between run() calls. + */ + uint32_t capacity; + + /** + The size of the initial portion of the data buffer containing data. + + INPUTS: The host must set this field to the number of bytes used + by all events it has written to the buffer (including headers) + before calling the plugin's run(). + The plugin must not change this field. + + OUTPUTS: The plugin must set this field to the number of bytes + used by all events it has written to the buffer (including headers) + before returning from run(). + Any initial value should be ignored by the plugin. + */ + uint32_t size; +} LV2_Event_Buffer; + + +/** + Opaque pointer to host data. +*/ +typedef void* LV2_Event_Callback_Data; + + +/** + Non-POD events feature. + + To support this feature the host must pass an LV2_Feature struct to the + plugin's instantiate method with URI "http://lv2plug.in/ns/ext/event" + and data pointed to an instance of this struct. Note this feature + is not mandatory to support the event extension. +*/ +typedef struct { + /** + Opaque pointer to host data. + + The plugin MUST pass this to any call to functions in this struct. + Otherwise, it must not be interpreted in any way. + */ + LV2_Event_Callback_Data callback_data; + + /** + Take a reference to a non-POD event. + + If a plugin receives an event with type 0, it means the event is a + pointer to some object in memory and not a flat sequence of bytes + in the buffer. When receiving a non-POD event, the plugin already + has an implicit reference to the event. If the event is stored AND + passed to an output, lv2_event_ref MUST be called on that event. + If the event is only stored OR passed through, this is not necessary + (as the plugin already has 1 implicit reference). + + @param event An event received at an input that will not be copied to + an output or stored in any way. + + @param context The calling context. Like event types, this is a mapped + URI, see lv2_context.h. Simple plugin with just a run() method should + pass 0 here (the ID of the 'standard' LV2 run context). The host + guarantees that this function is realtime safe iff @a context is + realtime safe. + + PLUGINS THAT VIOLATE THESE RULES MAY CAUSE CRASHES AND MEMORY LEAKS. + */ + uint32_t (*lv2_event_ref)(LV2_Event_Callback_Data callback_data, + LV2_Event* event); + + /** + Drop a reference to a non-POD event. + + If a plugin receives an event with type 0, it means the event is a + pointer to some object in memory and not a flat sequence of bytes + in the buffer. If the plugin does not pass the event through to + an output or store it internally somehow, it MUST call this function + on the event (more information on using non-POD events below). + + @param event An event received at an input that will not be copied to an + output or stored in any way. + + @param context The calling context. Like event types, this is a mapped + URI, see lv2_context.h. Simple plugin with just a run() method should + pass 0 here (the ID of the 'standard' LV2 run context). The host + guarantees that this function is realtime safe iff @a context is + realtime safe. + + PLUGINS THAT VIOLATE THESE RULES MAY CAUSE CRASHES AND MEMORY LEAKS. + */ + uint32_t (*lv2_event_unref)(LV2_Event_Callback_Data callback_data, + LV2_Event* event); +} LV2_Event_Feature; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_EVENT_H */ diff --git a/dpf/distrho/src/lv2/instance-access.h b/dpf/distrho/src/lv2/instance-access.h new file mode 100644 index 0000000..06d8dde --- /dev/null +++ b/dpf/distrho/src/lv2/instance-access.h @@ -0,0 +1,37 @@ +/* + LV2 Instance Access Extension + Copyright 2008-2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_INSTANCE_ACCESS_H +#define LV2_INSTANCE_ACCESS_H + +#define LV2_INSTANCE_ACCESS_URI "http://lv2plug.in/ns/ext/instance-access" + +/** + @file instance-access.h + C header for the LV2 Instance Access extension + . + + This extension defines a method for (e.g.) plugin UIs to get a direct + handle to an LV2 plugin instance (LV2_Handle), if possible. + + To support this feature the host must pass an LV2_Feature struct to the + UI instantiate method with URI "http://lv2plug.in/ns/ext/instance-access" + and data pointed directly to the LV2_Handle of the plugin instance. +*/ + +#endif /* LV2_INSTANCE_ACCESS_H */ + diff --git a/dpf/distrho/src/lv2/log.h b/dpf/distrho/src/lv2/log.h new file mode 100644 index 0000000..4b7b0f4 --- /dev/null +++ b/dpf/distrho/src/lv2/log.h @@ -0,0 +1,99 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file log.h C header for the LV2 Log extension + . +*/ + +#ifndef LV2_LOG_H +#define LV2_LOG_H + +#define LV2_LOG_URI "http://lv2plug.in/ns/ext/log" +#define LV2_LOG_PREFIX LV2_LOG_URI "#" + +#define LV2_LOG__Entry LV2_LOG_PREFIX "Entry" +#define LV2_LOG__Error LV2_LOG_PREFIX "Error" +#define LV2_LOG__Note LV2_LOG_PREFIX "Note" +#define LV2_LOG__Trace LV2_LOG_PREFIX "Trace" +#define LV2_LOG__Warning LV2_LOG_PREFIX "Warning" +#define LV2_LOG__log LV2_LOG_PREFIX "log" + +#include + +#include "urid.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __GNUC__ +/** Allow type checking of printf-like functions. */ +# define LV2_LOG_FUNC(fmt, arg1) __attribute__((format(printf, fmt, arg1))) +#else +# define LV2_LOG_FUNC(fmt, arg1) +#endif + +/** + Opaque data to host data for LV2_Log_Log. +*/ +typedef void* LV2_Log_Handle; + +/** + Log feature (LV2_LOG__log) +*/ +typedef struct _LV2_Log { + /** + Opaque pointer to host data. + + This MUST be passed to methods in this struct whenever they are called. + Otherwise, it must not be interpreted in any way. + */ + LV2_Log_Handle handle; + + /** + Log a message, passing format parameters directly. + + The API of this function matches that of the standard C printf function, + except for the addition of the first two parameters. This function may + be called from any non-realtime context, or from any context if @p type + is @ref LV2_LOG__Trace. + */ + LV2_LOG_FUNC(3, 4) + int (*printf)(LV2_Log_Handle handle, + LV2_URID type, + const char* fmt, ...); + + /** + Log a message, passing format parameters in a va_list. + + The API of this function matches that of the standard C vprintf + function, except for the addition of the first two parameters. This + function may be called from any non-realtime context, or from any + context if @p type is @ref LV2_LOG__Trace. + */ + LV2_LOG_FUNC(3, 0) + int (*vprintf)(LV2_Log_Handle handle, + LV2_URID type, + const char* fmt, + va_list ap); +} LV2_Log_Log; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_LOG_H */ diff --git a/dpf/distrho/src/lv2/logger.h b/dpf/distrho/src/lv2/logger.h new file mode 100644 index 0000000..9143544 --- /dev/null +++ b/dpf/distrho/src/lv2/logger.h @@ -0,0 +1,146 @@ +/* + Copyright 2012-2013 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file logger.h Convenience API for easy logging in plugin code. + + This file provides simple wrappers for the most common log operations for + use in plugin implementations. If host support for logging is not + available, then these functions will print to stderr instead. + + This header is non-normative, it is provided for convenience. +*/ + +#ifndef LV2_ATOM_LOGGER_H +#define LV2_ATOM_LOGGER_H + +#include +#include + +#include "log.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Logger convenience API state. +*/ +typedef struct { + LV2_Log_Log* log; + + LV2_URID Error; + LV2_URID Note; + LV2_URID Trace; + LV2_URID Warning; +} LV2_Log_Logger; + +/** + Initialise @p logger. + + URIs will be mapped using @p map and stored, a reference to @p map itself is + not held. Both @p map and @p log may be NULL when unsupported by the host, + in which case the implementation will fall back to printing to stderr. +*/ +static inline void +lv2_log_logger_init(LV2_Log_Logger* logger, + LV2_URID_Map* map, + LV2_Log_Log* log) +{ + memset(logger, 0, sizeof(LV2_Log_Logger)); + logger->log = log; + if (map) { + logger->Error = map->map(map->handle, LV2_LOG__Error); + logger->Note = map->map(map->handle, LV2_LOG__Note); + logger->Trace = map->map(map->handle, LV2_LOG__Trace); + logger->Warning = map->map(map->handle, LV2_LOG__Warning); + } +} + +/** + Log a message to the host, or stderr if support is unavailable. +*/ +LV2_LOG_FUNC(3, 0) +static inline int +lv2_log_vprintf(LV2_Log_Logger* logger, + LV2_URID type, + const char* fmt, + va_list args) +{ + if (logger->log) { + return logger->log->vprintf(logger->log->handle, type, fmt, args); + } else { + return vfprintf(stderr, fmt, args); + } +} + +/** Log an error via lv2_log_vprintf(). */ +LV2_LOG_FUNC(2, 3) +static inline int +lv2_log_error(LV2_Log_Logger* logger, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = lv2_log_vprintf(logger, logger->Error, fmt, args); + va_end(args); + return ret; +} + +/** Log a note via lv2_log_vprintf(). */ +LV2_LOG_FUNC(2, 3) +static inline int +lv2_log_note(LV2_Log_Logger* logger, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = lv2_log_vprintf(logger, logger->Note, fmt, args); + va_end(args); + return ret; +} + +/** Log a trace via lv2_log_vprintf(). */ +LV2_LOG_FUNC(2, 3) +static inline int +lv2_log_trace(LV2_Log_Logger* logger, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = lv2_log_vprintf(logger, logger->Trace, fmt, args); + va_end(args); + return ret; +} + +/** Log a warning via lv2_log_vprintf(). */ +LV2_LOG_FUNC(2, 3) +static inline int +lv2_log_warning(LV2_Log_Logger* logger, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + const int ret = lv2_log_vprintf(logger, logger->Warning, fmt, args); + va_end(args); + return ret; +} + +/** + @} +*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_LOG_LOGGER_H */ diff --git a/dpf/distrho/src/lv2/lv2-midifunctions.h b/dpf/distrho/src/lv2/lv2-midifunctions.h new file mode 100644 index 0000000..d068f49 --- /dev/null +++ b/dpf/distrho/src/lv2/lv2-midifunctions.h @@ -0,0 +1,98 @@ +/**************************************************************************** + + lv2-midifunctions.h - support file for using MIDI in LV2 plugins + + Copyright (C) 2006 Lars Luthman + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 01222-1307 USA + +****************************************************************************/ + +#ifndef LV2_MIDIFUNCTIONS +#define LV2_MIDIFUNCTIONS + +#include "lv2-miditype.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + LV2_MIDI* midi; + uint32_t frame_count; + uint32_t position; +} LV2_MIDIState; + + +inline double lv2midi_get_event(LV2_MIDIState* state, + double* timestamp, + uint32_t* size, + unsigned char** data) { + + if (state->position >= state->midi->size) { + state->position = state->midi->size; + *timestamp = state->frame_count; + *size = 0; + *data = NULL; + return *timestamp; + } + + *timestamp = *(double*)(state->midi->data + state->position); + *size = (uint32_t)*(size_t*)(state->midi->data + state->position + sizeof(double)); + *data = state->midi->data + state->position + + sizeof(double) + sizeof(size_t); + return *timestamp; +} + + +inline double lv2midi_step(LV2_MIDIState* state) { + + if (state->position >= state->midi->size) { + state->position = state->midi->size; + return state->frame_count; + } + + state->position += (uint32_t)sizeof(double); + size_t size = *(size_t*)(state->midi->data + state->position); + state->position += (uint32_t)sizeof(size_t); + state->position += (uint32_t)size; + return *(double*)(state->midi->data + state->position); +} + + +inline void lv2midi_put_event(LV2_MIDIState* state, + double timestamp, + uint32_t size, + const unsigned char* data) { + + if (state->midi->size + sizeof(double) + sizeof(size_t) + size < state->midi->capacity) + { + *((double*)(state->midi->data + state->midi->size)) = timestamp; + state->midi->size += (uint32_t)sizeof(double); + *((size_t*)(state->midi->data + state->midi->size)) = size; + state->midi->size += (uint32_t)sizeof(size_t); + memcpy(state->midi->data + state->midi->size, data, size); + + state->midi->size += size; + state->midi->event_count++; + } +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif + diff --git a/dpf/distrho/src/lv2/lv2-miditype.h b/dpf/distrho/src/lv2/lv2-miditype.h new file mode 100644 index 0000000..7afcae8 --- /dev/null +++ b/dpf/distrho/src/lv2/lv2-miditype.h @@ -0,0 +1,175 @@ +/**************************************************************************** + + lv2-miditype.h - header file for using MIDI in LV2 plugins + + Copyright (C) 2006 Lars Luthman + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 01222-1307 USA + +****************************************************************************/ + +#ifndef LV2_MIDITYPE_H +#define LV2_MIDITYPE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** This data structure is used to contain the MIDI events for one run() + cycle. The port buffer for a LV2 port that has the datatype + should be a pointer + to an instance of this struct. + + To store two Note On events on MIDI channel 0 in a buffer, with timestamps + 12 and 35.5, you could use something like this code (assuming that + midi_data is a variable of type LV2_MIDI): + @code + + size_t buffer_offset = 0; + *(double*)(midi_data->data + buffer_offset) = 12; + buffer_offset += sizeof(double); + *(size_t*)(midi_data->data + buffer_offset) = 3; + buffer_offset += sizeof(size_t); + midi_data->data[buffer_offset++] = 0x90; + midi_data->data[buffer_offset++] = 0x48; + midi_data->data[buffer_offset++] = 0x64; + ++midi_data->event_count; + + *(double*)(midi_data->data + buffer_offset) = 35.5; + buffer_offset += sizeof(double); + *(size_t*)(midi_data->data + buffer_offset) = 3; + buffer_offset += sizeof(size_t); + midi_data->data[buffer_offset++] = 0x90; + midi_data->data[buffer_offset++] = 0x55; + midi_data->data[buffer_offset++] = 0x64; + ++midi_data->event_count; + + midi_data->size = buffer_offset; + + @endcode + + This would be done by the host in the case of an input port, and by the + plugin in the case of an output port. Whoever is writing events to the + buffer must also take care not to exceed the capacity of the data buffer. + + To read events from a buffer, you could do something like this: + @code + + size_t buffer_offset = 0; + uint32_t i; + for (i = 0; i < midi_data->event_count; ++i) { + double timestamp = *(double*)(midi_data->data + buffer_offset); + buffer_offset += sizeof(double); + size_t size = *(size_t*)(midi_data->data + buffer_offset); + buffer_offset += sizeof(size_t); + do_something_with_event(timestamp, size, + midi_data->data + buffer_offset); + buffer_offset += size; + } + + @endcode +*/ +typedef struct { + + /** The number of MIDI events in the data buffer. + INPUT PORTS: It's the host's responsibility to set this field to the + number of MIDI events contained in the data buffer before calling the + plugin's run() function. The plugin may not change this field. + OUTPUT PORTS: It's the plugin's responsibility to set this field to the + number of MIDI events it has stored in the data buffer before returning + from the run() function. Any initial value should be ignored by the + plugin. + */ + uint32_t event_count; + + /** The size of the data buffer in bytes. It is set by the host and may not + be changed by the plugin. The host is allowed to change this between + run() calls. + */ + uint32_t capacity; + + /** The size of the initial part of the data buffer that actually contains + data. + INPUT PORTS: It's the host's responsibility to set this field to the + number of bytes used by all MIDI events it has written to the buffer + (including timestamps and size fields) before calling the plugin's + run() function. The plugin may not change this field. + OUTPUT PORTS: It's the plugin's responsibility to set this field to + the number of bytes used by all MIDI events it has written to the + buffer (including timestamps and size fields) before returning from + the run() function. Any initial value should be ignored by the plugin. + */ + uint32_t size; + + /** The data buffer that is used to store MIDI events. The events are packed + after each other, and the format of each event is as follows: + + First there is a timestamp, which should have the type "double", + i.e. have the same bit size as a double and the same bit layout as a + double (whatever that is on the current platform). This timestamp gives + the offset from the beginning of the current cycle, in frames, that + the MIDI event occurs on. It must be strictly smaller than the 'nframes' + parameter to the current run() call. The MIDI events in the buffer must + be ordered by their timestamp, e.g. an event with a timestamp of 123.23 + must be stored after an event with a timestamp of 65.0. + + The second part of the event is a size field, which should have the type + "size_t" (as defined in the standard C header stddef.h). It should + contain the size of the MIDI data for this event, i.e. the number of + bytes used to store the actual MIDI event. The bytes used by the + timestamp and the size field should not be counted. + + The third part of the event is the actual MIDI data. There are some + requirements that must be followed: + + * Running status is not allowed. Every event must have its own status + byte. + * Note On events with velocity 0 are not allowed. These events are + equivalent to Note Off in standard MIDI streams, but in order to make + plugins and hosts easier to write, as well as more efficient, only + proper Note Off events are allowed as Note Off. + * "Realtime events" (status bytes 0xF8 to 0xFF) are allowed, but may not + occur inside other events like they are allowed to in hardware MIDI + streams. + * All events must be fully contained in a single data buffer, i.e. events + may not "wrap around" by storing the first few bytes in one buffer and + then wait for the next run() call to store the rest of the event. If + there isn't enough space in the current data buffer to store an event, + the event will either have to wait until next run() call, be ignored, + or compensated for in some more clever way. + * All events must be valid MIDI events. This means for example that + only the first byte in each event (the status byte) may have the eighth + bit set, that Note On and Note Off events are always 3 bytes long etc. + The MIDI writer (host or plugin) is responsible for writing valid MIDI + events to the buffer, and the MIDI reader (plugin or host) can assume + that all events are valid. + + On a platform where double is 8 bytes and size_t is 4 bytes, the data + buffer layout for a 3-byte event followed by a 4-byte event may look + something like this: + _______________________________________________________________ + | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ... + |TIMESTAMP 1 |SIZE 1 |DATA |TIMESTAMP 2 |SIZE 2 |DATA | ... + + */ + unsigned char* data; + +} LV2_MIDI; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/dpf/distrho/src/lv2/lv2.h b/dpf/distrho/src/lv2/lv2.h new file mode 100644 index 0000000..6e0edaa --- /dev/null +++ b/dpf/distrho/src/lv2/lv2.h @@ -0,0 +1,458 @@ +/* + LV2 - An audio plugin interface specification. + Copyright 2006-2012 Steve Harris, David Robillard. + + Based on LADSPA, Copyright 2000-2002 Richard W.E. Furse, + Paul Barton-Davis, Stefan Westerfeld. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file lv2.h + API for the LV2 specification . + Revision: 12.0 +*/ + +#ifndef LV2_H_INCLUDED +#define LV2_H_INCLUDED + +#include + +#define LV2_CORE_URI "http://lv2plug.in/ns/lv2core" +#define LV2_CORE_PREFIX LV2_CORE_URI "#" + +#define LV2_CORE__AllpassPlugin LV2_CORE_PREFIX "AllpassPlugin" +#define LV2_CORE__AmplifierPlugin LV2_CORE_PREFIX "AmplifierPlugin" +#define LV2_CORE__AnalyserPlugin LV2_CORE_PREFIX "AnalyserPlugin" +#define LV2_CORE__AudioPort LV2_CORE_PREFIX "AudioPort" +#define LV2_CORE__BandpassPlugin LV2_CORE_PREFIX "BandpassPlugin" +#define LV2_CORE__CVPort LV2_CORE_PREFIX "CVPort" +#define LV2_CORE__ChorusPlugin LV2_CORE_PREFIX "ChorusPlugin" +#define LV2_CORE__CombPlugin LV2_CORE_PREFIX "CombPlugin" +#define LV2_CORE__CompressorPlugin LV2_CORE_PREFIX "CompressorPlugin" +#define LV2_CORE__ConstantPlugin LV2_CORE_PREFIX "ConstantPlugin" +#define LV2_CORE__ControlPort LV2_CORE_PREFIX "ControlPort" +#define LV2_CORE__ConverterPlugin LV2_CORE_PREFIX "ConverterPlugin" +#define LV2_CORE__DelayPlugin LV2_CORE_PREFIX "DelayPlugin" +#define LV2_CORE__DistortionPlugin LV2_CORE_PREFIX "DistortionPlugin" +#define LV2_CORE__DynamicsPlugin LV2_CORE_PREFIX "DynamicsPlugin" +#define LV2_CORE__EQPlugin LV2_CORE_PREFIX "EQPlugin" +#define LV2_CORE__EnvelopePlugin LV2_CORE_PREFIX "EnvelopePlugin" +#define LV2_CORE__ExpanderPlugin LV2_CORE_PREFIX "ExpanderPlugin" +#define LV2_CORE__ExtensionData LV2_CORE_PREFIX "ExtensionData" +#define LV2_CORE__Feature LV2_CORE_PREFIX "Feature" +#define LV2_CORE__FilterPlugin LV2_CORE_PREFIX "FilterPlugin" +#define LV2_CORE__FlangerPlugin LV2_CORE_PREFIX "FlangerPlugin" +#define LV2_CORE__FunctionPlugin LV2_CORE_PREFIX "FunctionPlugin" +#define LV2_CORE__GatePlugin LV2_CORE_PREFIX "GatePlugin" +#define LV2_CORE__GeneratorPlugin LV2_CORE_PREFIX "GeneratorPlugin" +#define LV2_CORE__HighpassPlugin LV2_CORE_PREFIX "HighpassPlugin" +#define LV2_CORE__InputPort LV2_CORE_PREFIX "InputPort" +#define LV2_CORE__InstrumentPlugin LV2_CORE_PREFIX "InstrumentPlugin" +#define LV2_CORE__LimiterPlugin LV2_CORE_PREFIX "LimiterPlugin" +#define LV2_CORE__LowpassPlugin LV2_CORE_PREFIX "LowpassPlugin" +#define LV2_CORE__MixerPlugin LV2_CORE_PREFIX "MixerPlugin" +#define LV2_CORE__ModulatorPlugin LV2_CORE_PREFIX "ModulatorPlugin" +#define LV2_CORE__MultiEQPlugin LV2_CORE_PREFIX "MultiEQPlugin" +#define LV2_CORE__OscillatorPlugin LV2_CORE_PREFIX "OscillatorPlugin" +#define LV2_CORE__OutputPort LV2_CORE_PREFIX "OutputPort" +#define LV2_CORE__ParaEQPlugin LV2_CORE_PREFIX "ParaEQPlugin" +#define LV2_CORE__PhaserPlugin LV2_CORE_PREFIX "PhaserPlugin" +#define LV2_CORE__PitchPlugin LV2_CORE_PREFIX "PitchPlugin" +#define LV2_CORE__Plugin LV2_CORE_PREFIX "Plugin" +#define LV2_CORE__PluginBase LV2_CORE_PREFIX "PluginBase" +#define LV2_CORE__Point LV2_CORE_PREFIX "Point" +#define LV2_CORE__Port LV2_CORE_PREFIX "Port" +#define LV2_CORE__PortProperty LV2_CORE_PREFIX "PortProperty" +#define LV2_CORE__Resource LV2_CORE_PREFIX "Resource" +#define LV2_CORE__ReverbPlugin LV2_CORE_PREFIX "ReverbPlugin" +#define LV2_CORE__ScalePoint LV2_CORE_PREFIX "ScalePoint" +#define LV2_CORE__SimulatorPlugin LV2_CORE_PREFIX "SimulatorPlugin" +#define LV2_CORE__SpatialPlugin LV2_CORE_PREFIX "SpatialPlugin" +#define LV2_CORE__Specification LV2_CORE_PREFIX "Specification" +#define LV2_CORE__SpectralPlugin LV2_CORE_PREFIX "SpectralPlugin" +#define LV2_CORE__UtilityPlugin LV2_CORE_PREFIX "UtilityPlugin" +#define LV2_CORE__WaveshaperPlugin LV2_CORE_PREFIX "WaveshaperPlugin" +#define LV2_CORE__appliesTo LV2_CORE_PREFIX "appliesTo" +#define LV2_CORE__binary LV2_CORE_PREFIX "binary" +#define LV2_CORE__connectionOptional LV2_CORE_PREFIX "connectionOptional" +#define LV2_CORE__control LV2_CORE_PREFIX "control" +#define LV2_CORE__default LV2_CORE_PREFIX "default" +#define LV2_CORE__designation LV2_CORE_PREFIX "designation" +#define LV2_CORE__documentation LV2_CORE_PREFIX "documentation" +#define LV2_CORE__enumeration LV2_CORE_PREFIX "enumeration" +#define LV2_CORE__extensionData LV2_CORE_PREFIX "extensionData" +#define LV2_CORE__freeWheeling LV2_CORE_PREFIX "freeWheeling" +#define LV2_CORE__hardRTCapable LV2_CORE_PREFIX "hardRTCapable" +#define LV2_CORE__inPlaceBroken LV2_CORE_PREFIX "inPlaceBroken" +#define LV2_CORE__index LV2_CORE_PREFIX "index" +#define LV2_CORE__integer LV2_CORE_PREFIX "integer" +#define LV2_CORE__isLive LV2_CORE_PREFIX "isLive" +#define LV2_CORE__latency LV2_CORE_PREFIX "latency" +#define LV2_CORE__maximum LV2_CORE_PREFIX "maximum" +#define LV2_CORE__microVersion LV2_CORE_PREFIX "microVersion" +#define LV2_CORE__minimum LV2_CORE_PREFIX "minimum" +#define LV2_CORE__minorVersion LV2_CORE_PREFIX "minorVersion" +#define LV2_CORE__name LV2_CORE_PREFIX "name" +#define LV2_CORE__optionalFeature LV2_CORE_PREFIX "optionalFeature" +#define LV2_CORE__port LV2_CORE_PREFIX "port" +#define LV2_CORE__portProperty LV2_CORE_PREFIX "portProperty" +#define LV2_CORE__project LV2_CORE_PREFIX "project" +#define LV2_CORE__prototype LV2_CORE_PREFIX "prototype" +#define LV2_CORE__reportsLatency LV2_CORE_PREFIX "reportsLatency" +#define LV2_CORE__requiredFeature LV2_CORE_PREFIX "requiredFeature" +#define LV2_CORE__sampleRate LV2_CORE_PREFIX "sampleRate" +#define LV2_CORE__scalePoint LV2_CORE_PREFIX "scalePoint" +#define LV2_CORE__symbol LV2_CORE_PREFIX "symbol" +#define LV2_CORE__toggled LV2_CORE_PREFIX "toggled" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Plugin Instance Handle. + + This is a handle for one particular instance of a plugin. It is valid to + compare to NULL (or 0 for C++) but otherwise the host MUST NOT attempt to + interpret it. +*/ +typedef void * LV2_Handle; + +/** + Feature. + + Features allow hosts to make additional functionality available to plugins + without requiring modification to the LV2 API. Extensions may define new + features and specify the @ref URI and @ref data to be used if necessary. + Some features, such as lv2:isLive, do not require the host to pass data. +*/ +typedef struct _LV2_Feature { + /** + A globally unique, case-sensitive identifier (URI) for this feature. + + This MUST be a valid URI string as defined by RFC 3986. + */ + const char * URI; + + /** + Pointer to arbitrary data. + + The format of this data is defined by the extension which describes the + feature with the given @ref URI. + */ + void * data; +} LV2_Feature; + +/** + Plugin Descriptor. + + This structure provides the core functions necessary to instantiate and use + a plugin. +*/ +typedef struct _LV2_Descriptor { + /** + A globally unique, case-sensitive identifier for this plugin. + + This MUST be a valid URI string as defined by RFC 3986. All plugins with + the same URI MUST be compatible to some degree, see + http://lv2plug.in/ns/lv2core for details. + */ + const char * URI; + + /** + Instantiate the plugin. + + Note that instance initialisation should generally occur in activate() + rather than here. If a host calls instantiate(), it MUST call cleanup() + at some point in the future. + + @param descriptor Descriptor of the plugin to instantiate. + + @param sample_rate Sample rate, in Hz, for the new plugin instance. + + @param bundle_path Path to the LV2 bundle which contains this plugin + binary. It MUST include the trailing directory separator (e.g. '/') so + that simply appending a filename will yield the path to that file in the + bundle. + + @param features A NULL terminated array of LV2_Feature structs which + represent the features the host supports. Plugins may refuse to + instantiate if required features are not found here. However, hosts MUST + NOT use this as a discovery mechanism: instead, use the RDF data to + determine which features are required and do not attempt to instantiate + unsupported plugins at all. This parameter MUST NOT be NULL, i.e. a host + that supports no features MUST pass a single element array containing + NULL. + + @return A handle for the new plugin instance, or NULL if instantiation + has failed. + */ + LV2_Handle (*instantiate)(const struct _LV2_Descriptor * descriptor, + double sample_rate, + const char * bundle_path, + const LV2_Feature *const * features); + + /** + Connect a port on a plugin instance to a memory location. + + Plugin writers should be aware that the host may elect to use the same + buffer for more than one port and even use the same buffer for both + input and output (see lv2:inPlaceBroken in lv2.ttl). + + If the plugin has the feature lv2:hardRTCapable then there are various + things that the plugin MUST NOT do within the connect_port() function; + see lv2core.ttl for details. + + connect_port() MUST be called at least once for each port before run() + is called, unless that port is lv2:connectionOptional. The plugin must + pay careful attention to the block size passed to run() since the block + allocated may only just be large enough to contain the data, and is not + guaranteed to remain constant between run() calls. + + connect_port() may be called more than once for a plugin instance to + allow the host to change the buffers that the plugin is reading or + writing. These calls may be made before or after activate() or + deactivate() calls. + + @param instance Plugin instance containing the port. + + @param port Index of the port to connect. The host MUST NOT try to + connect a port index that is not defined in the plugin's RDF data. If + it does, the plugin's behaviour is undefined (a crash is likely). + + @param data_location Pointer to data of the type defined by the port + type in the plugin's RDF data (e.g. an array of float for an + lv2:AudioPort). This pointer must be stored by the plugin instance and + used to read/write data when run() is called. Data present at the time + of the connect_port() call MUST NOT be considered meaningful. + */ + void (*connect_port)(LV2_Handle instance, + uint32_t port, + void * data_location); + + /** + Initialise a plugin instance and activate it for use. + + This is separated from instantiate() to aid real-time support and so + that hosts can reinitialise a plugin instance by calling deactivate() + and then activate(). In this case the plugin instance MUST reset all + state information dependent on the history of the plugin instance except + for any data locations provided by connect_port(). If there is nothing + for activate() to do then this field may be NULL. + + When present, hosts MUST call this function once before run() is called + for the first time. This call SHOULD be made as close to the run() call + as possible and indicates to real-time plugins that they are now live, + however plugins MUST NOT rely on a prompt call to run() after + activate(). + + The host MUST NOT call activate() again until deactivate() has been + called first. If a host calls activate(), it MUST call deactivate() at + some point in the future. Note that connect_port() may be called before + or after activate(). + */ + void (*activate)(LV2_Handle instance); + + /** + Run a plugin instance for a block. + + Note that if an activate() function exists then it must be called before + run(). If deactivate() is called for a plugin instance then run() may + not be called until activate() has been called again. + + If the plugin has the feature lv2:hardRTCapable then there are various + things that the plugin MUST NOT do within the run() function (see + lv2core.ttl for details). + + As a special case, when @p sample_count == 0, the plugin should update + any output ports that represent a single instant in time (e.g. control + ports, but not audio ports). This is particularly useful for latent + plugins, which should update their latency output port so hosts can + pre-roll plugins to compute latency. Plugins MUST NOT crash when + @p sample_count == 0. + + @param instance Instance to be run. + + @param sample_count The block size (in samples) for which the plugin + instance must run. + */ + void (*run)(LV2_Handle instance, + uint32_t sample_count); + + /** + Deactivate a plugin instance (counterpart to activate()). + + Hosts MUST deactivate all activated instances after they have been run() + for the last time. This call SHOULD be made as close to the last run() + call as possible and indicates to real-time plugins that they are no + longer live, however plugins MUST NOT rely on prompt deactivation. If + there is nothing for deactivate() to do then this field may be NULL + + Deactivation is not similar to pausing since the plugin instance will be + reinitialised by activate(). However, deactivate() itself MUST NOT fully + reset plugin state. For example, the host may deactivate a plugin, then + store its state (using some extension to do so). + + Hosts MUST NOT call deactivate() unless activate() was previously + called. Note that connect_port() may be called before or after + deactivate(). + */ + void (*deactivate)(LV2_Handle instance); + + /** + Clean up a plugin instance (counterpart to instantiate()). + + Once an instance of a plugin has been finished with it must be deleted + using this function. The instance handle passed ceases to be valid after + this call. + + If activate() was called for a plugin instance then a corresponding call + to deactivate() MUST be made before cleanup() is called. Hosts MUST NOT + call cleanup() unless instantiate() was previously called. + */ + void (*cleanup)(LV2_Handle instance); + + /** + Return additional plugin data defined by some extenion. + + A typical use of this facility is to return a struct containing function + pointers to extend the LV2_Descriptor API. + + The actual type and meaning of the returned object MUST be specified + precisely by the extension. This function MUST return NULL for any + unsupported URI. If a plugin does not support any extension data, this + field may be NULL. + + The host is never responsible for freeing the returned value. + */ + const void * (*extension_data)(const char * uri); +} LV2_Descriptor; + +/** + Put this (LV2_SYMBOL_EXPORT) before any functions that are to be loaded + by the host as a symbol from the dynamic library. +*/ +#ifdef _WIN32 +# define LV2_SYMBOL_EXPORT __declspec(dllexport) +#else +# define LV2_SYMBOL_EXPORT +#endif + +/** + Prototype for plugin accessor function. + + Plugins are discovered by hosts using RDF data (not by loading libraries). + See http://lv2plug.in for details on the discovery process, though most + hosts should use an existing library to implement this functionality. + + This is the simple plugin discovery API, suitable for most statically + defined plugins. Advanced plugins that need access to their bundle during + discovery can use lv2_lib_descriptor() instead. Plugin libraries MUST + include a function called "lv2_descriptor" or "lv2_lib_descriptor" with + C-style linkage, but SHOULD provide "lv2_descriptor" wherever possible. + + When it is time to load a plugin (designated by its URI), the host loads the + plugin's library, gets the lv2_descriptor() function from it, and uses this + function to find the LV2_Descriptor for the desired plugin. Plugins are + accessed by index using values from 0 upwards. This function MUST return + NULL for out of range indices, so the host can enumerate plugins by + increasing @p index until NULL is returned. + + Note that @p index has no meaning, hosts MUST NOT depend on it remaining + consistent between loads of the plugin library. +*/ +LV2_SYMBOL_EXPORT +const LV2_Descriptor * lv2_descriptor(uint32_t index); + +/** + Type of the lv2_descriptor() function in a library (old discovery API). +*/ +typedef const LV2_Descriptor * +(*LV2_Descriptor_Function)(uint32_t index); + +/** + Handle for a library descriptor. +*/ +typedef void* LV2_Lib_Handle; + +/** + Descriptor for a plugin library. + + To access a plugin library, the host creates an LV2_Lib_Descriptor via the + lv2_lib_descriptor() function in the shared object. +*/ +typedef struct { + /** + Opaque library data which must be passed as the first parameter to all + the methods of this struct. + */ + LV2_Lib_Handle handle; + + /** + The total size of this struct. This allows for this struct to be + expanded in the future if necessary. This MUST be set by the library to + sizeof(LV2_Lib_Descriptor). The host MUST NOT access any fields of this + struct beyond get_plugin() unless this field indicates they are present. + */ + uint32_t size; + + /** + Destroy this library descriptor and free all related resources. + */ + void (*cleanup)(LV2_Lib_Handle handle); + + /** + Plugin accessor. + + Plugins are accessed by index using values from 0 upwards. Out of range + indices MUST result in this function returning NULL, so the host can + enumerate plugins by increasing @a index until NULL is returned. + */ + const LV2_Descriptor * (*get_plugin)(LV2_Lib_Handle handle, + uint32_t index); +} LV2_Lib_Descriptor; + +/** + Prototype for library accessor function. + + This is the more advanced discovery API, which allows plugin libraries to + access their bundles during discovery, which makes it possible for plugins to + be dynamically defined by files in their bundle. This API also has an + explicit cleanup function, removing any need for non-portable shared library + destructors. Simple plugins that do not require these features may use + lv2_descriptor() instead. + + This is the entry point for a plugin library. Hosts load this symbol from + the library and call this function to obtain a library descriptor which can + be used to access all the contained plugins. The returned object must not + be destroyed (using LV2_Lib_Descriptor::cleanup()) until all plugins loaded + from that library have been destroyed. +*/ +const LV2_Lib_Descriptor * +lv2_lib_descriptor(const char * bundle_path, + const LV2_Feature *const * features); + +/** + Type of the lv2_lib_descriptor() function in an LV2 library. +*/ +typedef const LV2_Lib_Descriptor * +(*LV2_Lib_Descriptor_Function)(const char * bundle_path, + const LV2_Feature *const * features); + +#ifdef __cplusplus +} +#endif + +#endif /* LV2_H_INCLUDED */ diff --git a/dpf/distrho/src/lv2/lv2_external_ui.h b/dpf/distrho/src/lv2/lv2_external_ui.h new file mode 100755 index 0000000..789cd3f --- /dev/null +++ b/dpf/distrho/src/lv2/lv2_external_ui.h @@ -0,0 +1,109 @@ +/* + LV2 External UI extension + This work is in public domain. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + If you have questions, contact Filipe Coelho (aka falkTX) + or ask in #lad channel, FreeNode IRC network. +*/ + +/** + @file lv2_external_ui.h + C header for the LV2 External UI extension . +*/ + +#ifndef LV2_EXTERNAL_UI_H +#define LV2_EXTERNAL_UI_H + +#include "ui.h" + +#define LV2_EXTERNAL_UI_URI "http://kxstudio.sf.net/ns/lv2ext/external-ui" +#define LV2_EXTERNAL_UI_PREFIX LV2_EXTERNAL_UI_URI "#" + +#define LV2_EXTERNAL_UI__Host LV2_EXTERNAL_UI_PREFIX "Host" +#define LV2_EXTERNAL_UI__Widget LV2_EXTERNAL_UI_PREFIX "Widget" + +/** This extension used to be defined by a lv2plug.in URI */ +#define LV2_EXTERNAL_UI_DEPRECATED_URI "http://lv2plug.in/ns/extensions/ui#external" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * When LV2_EXTERNAL_UI__Widget UI is instantiated, the returned + * LV2UI_Widget handle must be cast to pointer to LV2_External_UI_Widget. + * UI is created in invisible state. + */ +typedef struct _LV2_External_UI_Widget { + /** + * Host calls this function regulary. UI library implementing the + * callback may do IPC or redraw the UI. + * + * @param _this_ the UI context + */ + void (*run)(struct _LV2_External_UI_Widget * _this_); + + /** + * Host calls this function to make the plugin UI visible. + * + * @param _this_ the UI context + */ + void (*show)(struct _LV2_External_UI_Widget * _this_); + + /** + * Host calls this function to make the plugin UI invisible again. + * + * @param _this_ the UI context + */ + void (*hide)(struct _LV2_External_UI_Widget * _this_); + +} LV2_External_UI_Widget; + +#define LV2_EXTERNAL_UI_RUN(ptr) (ptr)->run(ptr) +#define LV2_EXTERNAL_UI_SHOW(ptr) (ptr)->show(ptr) +#define LV2_EXTERNAL_UI_HIDE(ptr) (ptr)->hide(ptr) + +/** + * On UI instantiation, host must supply LV2_EXTERNAL_UI__Host feature. + * LV2_Feature::data must be pointer to LV2_External_UI_Host. + */ +typedef struct _LV2_External_UI_Host { + /** + * Callback that plugin UI will call when UI (GUI window) is closed by user. + * This callback will be called during execution of LV2_External_UI_Widget::run() + * (i.e. not from background thread). + * + * After this callback is called, UI is defunct. Host must call LV2UI_Descriptor::cleanup(). + * If host wants to make the UI visible again, the UI must be reinstantiated. + * + * @note When using the depreated URI LV2_EXTERNAL_UI_DEPRECATED_URI, + * some hosts will not call LV2UI_Descriptor::cleanup() as they should, + * and may call show() again without re-initialization. + * + * @param controller Host context associated with plugin UI, as + * supplied to LV2UI_Descriptor::instantiate(). + */ + void (*ui_closed)(LV2UI_Controller controller); + + /** + * Optional (may be NULL) "user friendly" identifier which the UI + * may display to allow a user to easily associate this particular + * UI instance with the correct plugin instance as it is represented + * by the host (e.g. "track 1" or "channel 4"). + * + * If supplied by host, the string will be referenced only during + * LV2UI_Descriptor::instantiate() + */ + const char * plugin_human_id; + +} LV2_External_UI_Host; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_EXTERNAL_UI_H */ diff --git a/dpf/distrho/src/lv2/lv2_kxstudio_properties.h b/dpf/distrho/src/lv2/lv2_kxstudio_properties.h new file mode 100644 index 0000000..e8b42a6 --- /dev/null +++ b/dpf/distrho/src/lv2/lv2_kxstudio_properties.h @@ -0,0 +1,33 @@ +/* + LV2 KXStudio Properties Extension + Copyright 2014 Filipe Coelho + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file lv2_kxstudio_properties.h + C header for the LV2 KXStudio Properties extension . +*/ + +#ifndef LV2_KXSTUDIO_PROPERTIES_H +#define LV2_KXSTUDIO_PROPERTIES_H + +#define LV2_KXSTUDIO_PROPERTIES_URI "http://kxstudio.sf.net/ns/lv2ext/props" +#define LV2_KXSTUDIO_PROPERTIES_PREFIX LV2_KXSTUDIO_PROPERTIES_URI "#" + +#define LV2_KXSTUDIO_PROPERTIES__NonAutomable LV2_KXSTUDIO_PROPERTIES_PREFIX "NonAutomable" +#define LV2_KXSTUDIO_PROPERTIES__TimePositionTicksPerBeat LV2_KXSTUDIO_PROPERTIES_PREFIX "TimePositionTicksPerBeat" +#define LV2_KXSTUDIO_PROPERTIES__TransientWindowId LV2_KXSTUDIO_PROPERTIES_PREFIX "TransientWindowId" + +#endif /* LV2_KXSTUDIO_PROPERTIES_H */ diff --git a/dpf/distrho/src/lv2/lv2_programs.h b/dpf/distrho/src/lv2/lv2_programs.h new file mode 100644 index 0000000..01e2877 --- /dev/null +++ b/dpf/distrho/src/lv2/lv2_programs.h @@ -0,0 +1,174 @@ +/* + LV2 Programs Extension + Copyright 2012 Filipe Coelho + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file lv2_programs.h + C header for the LV2 programs extension . +*/ + +#ifndef LV2_PROGRAMS_H +#define LV2_PROGRAMS_H + +#include "lv2.h" +#include "ui.h" + +#define LV2_PROGRAMS_URI "http://kxstudio.sf.net/ns/lv2ext/programs" +#define LV2_PROGRAMS_PREFIX LV2_PROGRAMS_URI "#" + +#define LV2_PROGRAMS__Host LV2_PROGRAMS_PREFIX "Host" +#define LV2_PROGRAMS__Interface LV2_PROGRAMS_PREFIX "Interface" +#define LV2_PROGRAMS__UIInterface LV2_PROGRAMS_PREFIX "UIInterface" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void* LV2_Programs_Handle; + +typedef struct _LV2_Program_Descriptor { + + /** Bank number for this program. Note that this extension does not + support MIDI-style separation of bank LSB and MSB values. There is + no restriction on the set of available banks: the numbers do not + need to be contiguous, there does not need to be a bank 0, etc. */ + uint32_t bank; + + /** Program number (unique within its bank) for this program. There is + no restriction on the set of available programs: the numbers do not + need to be contiguous, there does not need to be a program 0, etc. */ + uint32_t program; + + /** Name of the program. */ + const char * name; + +} LV2_Program_Descriptor; + +/** + Programs extension, plugin data. + + When the plugin's extension_data is called with argument LV2_PROGRAMS__Interface, + the plugin MUST return an LV2_Programs_Instance structure, which remains valid + for the lifetime of the plugin. +*/ +typedef struct _LV2_Programs_Interface { + /** + * get_program() + * + * This member is a function pointer that provides a description + * of a program (named preset sound) available on this plugin. + * + * The index argument is an index into the plugin's list of + * programs, not a program number as represented by the Program + * field of the LV2_Program_Descriptor. (This distinction is + * needed to support plugins that use non-contiguous program or + * bank numbers.) + * + * This function returns a LV2_Program_Descriptor pointer that is + * guaranteed to be valid only until the next call to get_program + * or deactivate, on the same plugin instance. This function must + * return NULL if passed an index argument out of range, so that + * the host can use it to query the number of programs as well as + * their properties. + */ + const LV2_Program_Descriptor *(*get_program)(LV2_Handle handle, + uint32_t index); + + /** + * select_program() + * + * This member is a function pointer that selects a new program + * for this plugin. The program change should take effect + * immediately at the start of the next run() call. (This + * means that a host providing the capability of changing programs + * between any two notes on a track must vary the block size so as + * to place the program change at the right place. A host that + * wanted to avoid this would probably just instantiate a plugin + * for each program.) + * + * Plugins should ignore a select_program() call with an invalid + * bank or program. + * + * A plugin is not required to select any particular default + * program on activate(): it's the host's duty to set a program + * explicitly. + * + * A plugin is permitted to re-write the values of its input + * control ports when select_program is called. The host should + * re-read the input control port values and update its own + * records appropriately. (This is the only circumstance in which + * a LV2 plugin is allowed to modify its own control-input ports.) + */ + void (*select_program)(LV2_Handle handle, + uint32_t bank, + uint32_t program); + +} LV2_Programs_Interface; + +/** + Programs extension, UI data. + + When the UI's extension_data is called with argument LV2_PROGRAMS__UIInterface, + the UI MUST return an LV2_Programs_UI_Interface structure, which remains valid + for the lifetime of the UI. +*/ +typedef struct _LV2_Programs_UI_Interface { + /** + * select_program() + * + * This is exactly the same as select_program in LV2_Programs_Instance, + * but this struct relates to the UI instead of the plugin. + * + * When called, UIs should update their state to match the selected program. + */ + void (*select_program)(LV2UI_Handle handle, + uint32_t bank, + uint32_t program); + +} LV2_Programs_UI_Interface; + +/** + Feature data for LV2_PROGRAMS__Host. +*/ +typedef struct _LV2_Programs_Host { + /** + * Opaque host data. + */ + LV2_Programs_Handle handle; + + /** + * program_changed() + * + * Tell the host to reload a plugin's program. + * Parameter handle MUST be the 'handle' member of this struct. + * Parameter index is program index to change. + * When index is -1, host should reload all the programs. + * + * The plugin MUST NEVER call this function on a RT context or during run(). + * + * NOTE: This call is to inform the host about a program's bank, program or name change. + * It DOES NOT change the current selected program. + */ + void (*program_changed)(LV2_Programs_Handle handle, + int32_t index); + +} LV2_Programs_Host; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_PROGRAMS_H */ diff --git a/dpf/distrho/src/lv2/lv2_rtmempool.h b/dpf/distrho/src/lv2/lv2_rtmempool.h new file mode 100644 index 0000000..7988886 --- /dev/null +++ b/dpf/distrho/src/lv2/lv2_rtmempool.h @@ -0,0 +1,119 @@ +/* + LV2 realtime safe memory pool extension definition + This work is in public domain. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + If you have questions, contact Filipe Coelho (aka falkTX) + or ask in #lad channel, FreeNode IRC network. +*/ + +/** + * @file lv2_rtmempool.h + * C header for the LV2 rtmempool extension . + * + */ + +#ifndef LV2_RTMEMPOOL_H +#define LV2_RTMEMPOOL_H + +#define LV2_RTSAFE_MEMORY_POOL_URI "http://kxstudio.sf.net/ns/lv2ext/rtmempool" +#define LV2_RTSAFE_MEMORY_POOL_PREFIX LV2_RTSAFE_MEMORY_POOL_URI "#" + +#define LV2_RTSAFE_MEMORY_POOL__Pool LV2_RTSAFE_MEMORY_POOL_URI "Pool" + +/** max size of memory pool name, in chars, including terminating zero char */ +#define LV2_RTSAFE_MEMORY_POOL_NAME_MAX 128 + +/** This extension used to be defined by a different URI */ +#define LV2_RTSAFE_MEMORY_POOL_DEPRECATED_URI "http://home.gna.org/lv2dynparam/rtmempool/v1" + +#ifdef __cplusplus +extern "C" { +#else +#include +#endif + +/** + * Opaque data to host data for LV2_RtMemPool_Pool. + */ +typedef void* LV2_RtMemPool_Handle; + +/** + * On instantiation, host must supply LV2_RTSAFE_MEMORY_POOL__Pool feature. + * LV2_Feature::data must be pointer to LV2_RtMemPool_Pool. + */ +typedef struct _LV2_RtMemPool_Pool { + /** + * This function is called when plugin wants to create memory pool + * + * may/will sleep + * + * @param pool_name pool name, for debug purposes, max RTSAFE_MEMORY_POOL_NAME_MAX chars, including terminating zero char. May be NULL. + * @param data_size memory chunk size + * @param min_preallocated min chunks preallocated + * @param max_preallocated max chunks preallocated + * + * @return Success status, true if successful + */ + bool (*create)(LV2_RtMemPool_Handle * handle_ptr, + const char * pool_name, + size_t data_size, + size_t min_preallocated, + size_t max_preallocated); + + /** + * This function is called when plugin wants to destroy previously created memory pool + * + * may/will sleep + */ + void (*destroy)(LV2_RtMemPool_Handle handle); + + /** + * This function is called when plugin wants to allocate memory in context where sleeping is not allowed + * + * will not sleep + * + * @return Pointer to allocated memory or NULL if memory no memory is available + */ + void * (*allocate_atomic)(LV2_RtMemPool_Handle handle); + + /** + * This function is called when plugin wants to allocate memory in context where sleeping is allowed + * + * may/will sleep + * + * @return Pointer to allocated memory or NULL if memory no memory is available (should not happen under normal conditions) + */ + void * (*allocate_sleepy)(LV2_RtMemPool_Handle handle); + + /** + * This function is called when plugin wants to deallocate previously allocated memory + * + * will not sleep + * + * @param memory_ptr pointer to previously allocated memory chunk + */ + void (*deallocate)(LV2_RtMemPool_Handle handle, + void * memory_ptr); + +} LV2_RtMemPool_Pool; + +/** + * Deprecated feature for backwards compatibility. + */ +typedef struct _LV2_RtMemPool_Pool_Deprecated { + unsigned char (*create)(const char*,size_t,size_t,size_t,LV2_RtMemPool_Handle*); + void (*destroy)(LV2_RtMemPool_Handle); + void* (*allocate_atomic)(LV2_RtMemPool_Handle); + void* (*allocate_sleepy)(LV2_RtMemPool_Handle); + void (*deallocate)(LV2_RtMemPool_Handle,void*); +} LV2_RtMemPool_Pool_Deprecated; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_RTMEMPOOL_H */ diff --git a/dpf/distrho/src/lv2/midi.h b/dpf/distrho/src/lv2/midi.h new file mode 100644 index 0000000..2c53c49 --- /dev/null +++ b/dpf/distrho/src/lv2/midi.h @@ -0,0 +1,226 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file midi.h + C definitions for the LV2 MIDI extension . +*/ + +#ifndef LV2_MIDI_H +#define LV2_MIDI_H + +#include + +#ifdef __cplusplus +extern "C" { +#else +# include +#endif + +#define LV2_MIDI_URI "http://lv2plug.in/ns/ext/midi" +#define LV2_MIDI_PREFIX LV2_MIDI_URI "#" + +#define LV2_MIDI__ActiveSense LV2_MIDI_PREFIX "ActiveSense" +#define LV2_MIDI__Aftertouch LV2_MIDI_PREFIX "Aftertouch" +#define LV2_MIDI__Bender LV2_MIDI_PREFIX "Bender" +#define LV2_MIDI__ChannelPressure LV2_MIDI_PREFIX "ChannelPressure" +#define LV2_MIDI__Chunk LV2_MIDI_PREFIX "Chunk" +#define LV2_MIDI__Clock LV2_MIDI_PREFIX "Clock" +#define LV2_MIDI__Continue LV2_MIDI_PREFIX "Continue" +#define LV2_MIDI__Controller LV2_MIDI_PREFIX "Controller" +#define LV2_MIDI__MidiEvent LV2_MIDI_PREFIX "MidiEvent" +#define LV2_MIDI__NoteOff LV2_MIDI_PREFIX "NoteOff" +#define LV2_MIDI__NoteOn LV2_MIDI_PREFIX "NoteOn" +#define LV2_MIDI__ProgramChange LV2_MIDI_PREFIX "ProgramChange" +#define LV2_MIDI__QuarterFrame LV2_MIDI_PREFIX "QuarterFrame" +#define LV2_MIDI__Reset LV2_MIDI_PREFIX "Reset" +#define LV2_MIDI__SongPosition LV2_MIDI_PREFIX "SongPosition" +#define LV2_MIDI__SongSelect LV2_MIDI_PREFIX "SongSelect" +#define LV2_MIDI__Start LV2_MIDI_PREFIX "Start" +#define LV2_MIDI__Stop LV2_MIDI_PREFIX "Stop" +#define LV2_MIDI__SystemCommon LV2_MIDI_PREFIX "SystemCommon" +#define LV2_MIDI__SystemExclusive LV2_MIDI_PREFIX "SystemExclusive" +#define LV2_MIDI__SystemMessage LV2_MIDI_PREFIX "SystemMessage" +#define LV2_MIDI__SystemRealtime LV2_MIDI_PREFIX "SystemRealtime" +#define LV2_MIDI__Tick LV2_MIDI_PREFIX "Tick" +#define LV2_MIDI__TuneRequest LV2_MIDI_PREFIX "TuneRequest" +#define LV2_MIDI__VoiceMessage LV2_MIDI_PREFIX "VoiceMessage" +#define LV2_MIDI__benderValue LV2_MIDI_PREFIX "benderValue" +#define LV2_MIDI__binding LV2_MIDI_PREFIX "binding" +#define LV2_MIDI__byteNumber LV2_MIDI_PREFIX "byteNumber" +#define LV2_MIDI__channel LV2_MIDI_PREFIX "channel" +#define LV2_MIDI__chunk LV2_MIDI_PREFIX "chunk" +#define LV2_MIDI__controllerNumber LV2_MIDI_PREFIX "controllerNumber" +#define LV2_MIDI__controllerValue LV2_MIDI_PREFIX "controllerValue" +#define LV2_MIDI__noteNumber LV2_MIDI_PREFIX "noteNumber" +#define LV2_MIDI__pressure LV2_MIDI_PREFIX "pressure" +#define LV2_MIDI__programNumber LV2_MIDI_PREFIX "programNumber" +#define LV2_MIDI__property LV2_MIDI_PREFIX "property" +#define LV2_MIDI__songNumber LV2_MIDI_PREFIX "songNumber" +#define LV2_MIDI__songPosition LV2_MIDI_PREFIX "songPosition" +#define LV2_MIDI__status LV2_MIDI_PREFIX "status" +#define LV2_MIDI__statusMask LV2_MIDI_PREFIX "statusMask" +#define LV2_MIDI__velocity LV2_MIDI_PREFIX "velocity" + +/** + MIDI Message Type. + + This includes both voice messages (which have a channel) and system messages + (which do not), as well as a sentinel value for invalid messages. To get + the type of a message suitable for use in a switch statement, use + lv2_midi_get_type() on the status byte. +*/ +typedef enum { + LV2_MIDI_MSG_INVALID = 0, /**< Invalid Message */ + LV2_MIDI_MSG_NOTE_OFF = 0x80, /**< Note Off */ + LV2_MIDI_MSG_NOTE_ON = 0x90, /**< Note On */ + LV2_MIDI_MSG_NOTE_PRESSURE = 0xA0, /**< Note Pressure */ + LV2_MIDI_MSG_CONTROLLER = 0xB0, /**< Controller */ + LV2_MIDI_MSG_PGM_CHANGE = 0xC0, /**< Program Change */ + LV2_MIDI_MSG_CHANNEL_PRESSURE = 0xD0, /**< Channel Pressure */ + LV2_MIDI_MSG_BENDER = 0xE0, /**< Pitch Bender */ + LV2_MIDI_MSG_SYSTEM_EXCLUSIVE = 0xF0, /**< System Exclusive Begin */ + LV2_MIDI_MSG_MTC_QUARTER = 0xF1, /**< MTC Quarter Frame */ + LV2_MIDI_MSG_SONG_POS = 0xF2, /**< Song Position */ + LV2_MIDI_MSG_SONG_SELECT = 0xF3, /**< Song Select */ + LV2_MIDI_MSG_TUNE_REQUEST = 0xF6, /**< Tune Request */ + LV2_MIDI_MSG_CLOCK = 0xF8, /**< Clock */ + LV2_MIDI_MSG_START = 0xFA, /**< Start */ + LV2_MIDI_MSG_CONTINUE = 0xFB, /**< Continue */ + LV2_MIDI_MSG_STOP = 0xFC, /**< Stop */ + LV2_MIDI_MSG_ACTIVE_SENSE = 0xFE, /**< Active Sensing */ + LV2_MIDI_MSG_RESET = 0xFF /**< Reset */ +} LV2_Midi_Message_Type; + +/** + Standard MIDI Controller Numbers. +*/ +typedef enum { + LV2_MIDI_CTL_MSB_BANK = 0x00, /**< Bank Selection */ + LV2_MIDI_CTL_MSB_MODWHEEL = 0x01, /**< Modulation */ + LV2_MIDI_CTL_MSB_BREATH = 0x02, /**< Breath */ + LV2_MIDI_CTL_MSB_FOOT = 0x04, /**< Foot */ + LV2_MIDI_CTL_MSB_PORTAMENTO_TIME = 0x05, /**< Portamento Time */ + LV2_MIDI_CTL_MSB_DATA_ENTRY = 0x06, /**< Data Entry */ + LV2_MIDI_CTL_MSB_MAIN_VOLUME = 0x07, /**< Main Volume */ + LV2_MIDI_CTL_MSB_BALANCE = 0x08, /**< Balance */ + LV2_MIDI_CTL_MSB_PAN = 0x0A, /**< Panpot */ + LV2_MIDI_CTL_MSB_EXPRESSION = 0x0B, /**< Expression */ + LV2_MIDI_CTL_MSB_EFFECT1 = 0x0C, /**< Effect1 */ + LV2_MIDI_CTL_MSB_EFFECT2 = 0x0D, /**< Effect2 */ + LV2_MIDI_CTL_MSB_GENERAL_PURPOSE1 = 0x10, /**< General Purpose 1 */ + LV2_MIDI_CTL_MSB_GENERAL_PURPOSE2 = 0x11, /**< General Purpose 2 */ + LV2_MIDI_CTL_MSB_GENERAL_PURPOSE3 = 0x12, /**< General Purpose 3 */ + LV2_MIDI_CTL_MSB_GENERAL_PURPOSE4 = 0x13, /**< General Purpose 4 */ + LV2_MIDI_CTL_LSB_BANK = 0x20, /**< Bank Selection */ + LV2_MIDI_CTL_LSB_MODWHEEL = 0x21, /**< Modulation */ + LV2_MIDI_CTL_LSB_BREATH = 0x22, /**< Breath */ + LV2_MIDI_CTL_LSB_FOOT = 0x24, /**< Foot */ + LV2_MIDI_CTL_LSB_PORTAMENTO_TIME = 0x25, /**< Portamento Time */ + LV2_MIDI_CTL_LSB_DATA_ENTRY = 0x26, /**< Data Entry */ + LV2_MIDI_CTL_LSB_MAIN_VOLUME = 0x27, /**< Main Volume */ + LV2_MIDI_CTL_LSB_BALANCE = 0x28, /**< Balance */ + LV2_MIDI_CTL_LSB_PAN = 0x2A, /**< Panpot */ + LV2_MIDI_CTL_LSB_EXPRESSION = 0x2B, /**< Expression */ + LV2_MIDI_CTL_LSB_EFFECT1 = 0x2C, /**< Effect1 */ + LV2_MIDI_CTL_LSB_EFFECT2 = 0x2D, /**< Effect2 */ + LV2_MIDI_CTL_LSB_GENERAL_PURPOSE1 = 0x30, /**< General Purpose 1 */ + LV2_MIDI_CTL_LSB_GENERAL_PURPOSE2 = 0x31, /**< General Purpose 2 */ + LV2_MIDI_CTL_LSB_GENERAL_PURPOSE3 = 0x32, /**< General Purpose 3 */ + LV2_MIDI_CTL_LSB_GENERAL_PURPOSE4 = 0x33, /**< General Purpose 4 */ + LV2_MIDI_CTL_SUSTAIN = 0x40, /**< Sustain Pedal */ + LV2_MIDI_CTL_PORTAMENTO = 0x41, /**< Portamento */ + LV2_MIDI_CTL_SOSTENUTO = 0x42, /**< Sostenuto */ + LV2_MIDI_CTL_SOFT_PEDAL = 0x43, /**< Soft Pedal */ + LV2_MIDI_CTL_LEGATO_FOOTSWITCH = 0x44, /**< Legato Foot Switch */ + LV2_MIDI_CTL_HOLD2 = 0x45, /**< Hold2 */ + LV2_MIDI_CTL_SC1_SOUND_VARIATION = 0x46, /**< SC1 Sound Variation */ + LV2_MIDI_CTL_SC2_TIMBRE = 0x47, /**< SC2 Timbre */ + LV2_MIDI_CTL_SC3_RELEASE_TIME = 0x48, /**< SC3 Release Time */ + LV2_MIDI_CTL_SC4_ATTACK_TIME = 0x49, /**< SC4 Attack Time */ + LV2_MIDI_CTL_SC5_BRIGHTNESS = 0x4A, /**< SC5 Brightness */ + LV2_MIDI_CTL_SC6 = 0x4B, /**< SC6 */ + LV2_MIDI_CTL_SC7 = 0x4C, /**< SC7 */ + LV2_MIDI_CTL_SC8 = 0x4D, /**< SC8 */ + LV2_MIDI_CTL_SC9 = 0x4E, /**< SC9 */ + LV2_MIDI_CTL_SC10 = 0x4F, /**< SC10 */ + LV2_MIDI_CTL_GENERAL_PURPOSE5 = 0x50, /**< General Purpose 5 */ + LV2_MIDI_CTL_GENERAL_PURPOSE6 = 0x51, /**< General Purpose 6 */ + LV2_MIDI_CTL_GENERAL_PURPOSE7 = 0x52, /**< General Purpose 7 */ + LV2_MIDI_CTL_GENERAL_PURPOSE8 = 0x53, /**< General Purpose 8 */ + LV2_MIDI_CTL_PORTAMENTO_CONTROL = 0x54, /**< Portamento Control */ + LV2_MIDI_CTL_E1_REVERB_DEPTH = 0x5B, /**< E1 Reverb Depth */ + LV2_MIDI_CTL_E2_TREMOLO_DEPTH = 0x5C, /**< E2 Tremolo Depth */ + LV2_MIDI_CTL_E3_CHORUS_DEPTH = 0x5D, /**< E3 Chorus Depth */ + LV2_MIDI_CTL_E4_DETUNE_DEPTH = 0x5E, /**< E4 Detune Depth */ + LV2_MIDI_CTL_E5_PHASER_DEPTH = 0x5F, /**< E5 Phaser Depth */ + LV2_MIDI_CTL_DATA_INCREMENT = 0x60, /**< Data Increment */ + LV2_MIDI_CTL_DATA_DECREMENT = 0x61, /**< Data Decrement */ + LV2_MIDI_CTL_NRPN_LSB = 0x62, /**< Non-registered Parameter Number */ + LV2_MIDI_CTL_NRPN_MSB = 0x63, /**< Non-registered Parameter Number */ + LV2_MIDI_CTL_RPN_LSB = 0x64, /**< Registered Parameter Number */ + LV2_MIDI_CTL_RPN_MSB = 0x65, /**< Registered Parameter Number */ + LV2_MIDI_CTL_ALL_SOUNDS_OFF = 0x78, /**< All Sounds Off */ + LV2_MIDI_CTL_RESET_CONTROLLERS = 0x79, /**< Reset Controllers */ + LV2_MIDI_CTL_LOCAL_CONTROL_SWITCH = 0x7A, /**< Local Control Switch */ + LV2_MIDI_CTL_ALL_NOTES_OFF = 0x7B, /**< All Notes Off */ + LV2_MIDI_CTL_OMNI_OFF = 0x7C, /**< Omni Off */ + LV2_MIDI_CTL_OMNI_ON = 0x7D, /**< Omni On */ + LV2_MIDI_CTL_MONO1 = 0x7E, /**< Mono1 */ + LV2_MIDI_CTL_MONO2 = 0x7F /**< Mono2 */ +} LV2_Midi_Controller; + +/** + Return true iff @p msg is a MIDI voice message (which has a channel). +*/ +static inline bool +lv2_midi_is_voice_message(const uint8_t* msg) { + return msg[0] >= 0x80 && msg[0] < 0xF0; +} + +/** + Return true iff @p msg is a MIDI system message (which has no channel). +*/ +static inline bool +lv2_midi_is_system_message(const uint8_t* msg) { + switch (msg[0]) { + case 0xF4: case 0xF5: case 0xF7: case 0xF9: case 0xFD: + return false; + default: + return (msg[0] & 0xF0) == 0xF0; + } +} + +/** + Return the type of a MIDI message. + @param msg Pointer to the start (status byte) of a MIDI message. +*/ +static inline LV2_Midi_Message_Type +lv2_midi_message_type(const uint8_t* msg) { + if (lv2_midi_is_voice_message(msg)) { + return (LV2_Midi_Message_Type)(msg[0] & 0xF0); + } else if (lv2_midi_is_system_message(msg)) { + return (LV2_Midi_Message_Type)msg[0]; + } else { + return LV2_MIDI_MSG_INVALID; + } +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_MIDI_H */ diff --git a/dpf/distrho/src/lv2/morph.h b/dpf/distrho/src/lv2/morph.h new file mode 100644 index 0000000..df888df --- /dev/null +++ b/dpf/distrho/src/lv2/morph.h @@ -0,0 +1,34 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_MORPH_H +#define LV2_MORPH_H + +#include + +#include "lv2.h" +#include "urid.h" + +#define LV2_MORPH_URI "http://lv2plug.in/ns/ext/morph" +#define LV2_MORPH_PREFIX LV2_MORPH_URI "#" + +#define LV2_MORPH__AutoMorphPort LV2_MORPH_PREFIX "AutoMorphPort" +#define LV2_MORPH__MorphPort LV2_MORPH_PREFIX "MorphPort" +#define LV2_MORPH__interface LV2_MORPH_PREFIX "interface" +#define LV2_MORPH__supportsType LV2_MORPH_PREFIX "supportsType" +#define LV2_MORPH__currentType LV2_MORPH_PREFIX "currentType" + +#endif /* LV2_MORPH_H */ diff --git a/dpf/distrho/src/lv2/options.h b/dpf/distrho/src/lv2/options.h new file mode 100644 index 0000000..5437db5 --- /dev/null +++ b/dpf/distrho/src/lv2/options.h @@ -0,0 +1,132 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_OPTIONS_H +#define LV2_OPTIONS_H + +#include + +#include "urid.h" +#include "lv2.h" + +#define LV2_OPTIONS_URI "http://lv2plug.in/ns/ext/options" +#define LV2_OPTIONS_PREFIX LV2_OPTIONS_URI "#" + +#define LV2_OPTIONS__Option LV2_OPTIONS_PREFIX "Option" +#define LV2_OPTIONS__interface LV2_OPTIONS_PREFIX "interface" +#define LV2_OPTIONS__options LV2_OPTIONS_PREFIX "options" +#define LV2_OPTIONS__requiredOption LV2_OPTIONS_PREFIX "requiredOption" +#define LV2_OPTIONS__supportedOption LV2_OPTIONS_PREFIX "supportedOption" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + The context of an Option, which defines the subject it applies to. +*/ +typedef enum { + /** + This option applies to the instance itself. The subject must be + ignored. + */ + LV2_OPTIONS_INSTANCE, + + /** + This option applies to some named resource. The subject is a URI mapped + to an integer (a LV2_URID, like the key) + */ + LV2_OPTIONS_RESOURCE, + + /** + This option applies to some blank node. The subject is a blank node + identifier, which is valid only within the current local scope. + */ + LV2_OPTIONS_BLANK, + + /** + This option applies to a port on the instance. The subject is the + port's index. + */ + LV2_OPTIONS_PORT +} LV2_Options_Context; + +/** + An option. + + This is a property with a subject, also known as a triple or statement. + + This struct is useful anywhere a statement needs to be passed where no + memory ownership issues are present (since the value is a const pointer). + + Options can be passed to an instance via the feature LV2_OPTIONS__options + with data pointed to an array of options terminated by a zeroed option, or + accessed/manipulated using LV2_Options_Interface. +*/ +typedef struct _LV2_Options_Option { + LV2_Options_Context context; /**< Context (type of subject). */ + uint32_t subject; /**< Subject. */ + LV2_URID key; /**< Key (property). */ + uint32_t size; /**< Size of value in bytes. */ + LV2_URID type; /**< Type of value (datatype). */ + const void* value; /**< Pointer to value (object). */ +} LV2_Options_Option; + +/** A status code for option functions. */ +typedef enum { + LV2_OPTIONS_SUCCESS = 0, /**< Completed successfully. */ + LV2_OPTIONS_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_OPTIONS_ERR_BAD_SUBJECT = 1 << 1, /**< Invalid/unsupported subject. */ + LV2_OPTIONS_ERR_BAD_KEY = 1 << 2, /**< Invalid/unsupported key. */ + LV2_OPTIONS_ERR_BAD_VALUE = 1 << 3 /**< Invalid/unsupported value. */ +} LV2_Options_Status; + +/** + Interface for dynamically setting options (LV2_OPTIONS__interface). +*/ +typedef struct _LV2_Options_Interface { + /** + Get the given options. + + Each element of the passed options array MUST have type, subject, and + key set. All other fields (size, type, value) MUST be initialised to + zero, and are set to the option value if such an option is found. + + This function is in the "instantiation" LV2 threading class, so no other + instance functions may be called concurrently. + + @return Bitwise OR of LV2_Options_Status values. + */ + uint32_t (*get)(LV2_Handle instance, + LV2_Options_Option* options); + + /** + Set the given options. + + This function is in the "instantiation" LV2 threading class, so no other + instance functions may be called concurrently. + + @return Bitwise OR of LV2_Options_Status values. + */ + uint32_t (*set)(LV2_Handle instance, + const LV2_Options_Option* options); +} LV2_Options_Interface; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_OPTIONS_H */ diff --git a/dpf/distrho/src/lv2/parameters.h b/dpf/distrho/src/lv2/parameters.h new file mode 100644 index 0000000..9c06bab --- /dev/null +++ b/dpf/distrho/src/lv2/parameters.h @@ -0,0 +1,49 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_PARAMETERS_H +#define LV2_PARAMETERS_H + +#define LV2_PARAMETERS_URI "http://lv2plug.in/ns/ext/parameters" +#define LV2_PARAMETERS_PREFIX LV2_PARAMETERS_URI "#" + +#define LV2_PARAMETERS__CompressorControls LV2_PARAMETERS_PREFIX "CompressorControls" +#define LV2_PARAMETERS__ControlGroup LV2_PARAMETERS_PREFIX "ControlGroup" +#define LV2_PARAMETERS__EnvelopeControls LV2_PARAMETERS_PREFIX "EnvelopeControls" +#define LV2_PARAMETERS__FilterControls LV2_PARAMETERS_PREFIX "FilterControls" +#define LV2_PARAMETERS__OscillatorControls LV2_PARAMETERS_PREFIX "OscillatorControls" +#define LV2_PARAMETERS__amplitude LV2_PARAMETERS_PREFIX "amplitude" +#define LV2_PARAMETERS__attack LV2_PARAMETERS_PREFIX "attack" +#define LV2_PARAMETERS__bypass LV2_PARAMETERS_PREFIX "bypass" +#define LV2_PARAMETERS__cutoffFrequency LV2_PARAMETERS_PREFIX "cutoffFrequency" +#define LV2_PARAMETERS__decay LV2_PARAMETERS_PREFIX "decay" +#define LV2_PARAMETERS__delay LV2_PARAMETERS_PREFIX "delay" +#define LV2_PARAMETERS__dryLevel LV2_PARAMETERS_PREFIX "dryLevel" +#define LV2_PARAMETERS__frequency LV2_PARAMETERS_PREFIX "frequency" +#define LV2_PARAMETERS__gain LV2_PARAMETERS_PREFIX "gain" +#define LV2_PARAMETERS__hold LV2_PARAMETERS_PREFIX "hold" +#define LV2_PARAMETERS__pulseWidth LV2_PARAMETERS_PREFIX "pulseWidth" +#define LV2_PARAMETERS__ratio LV2_PARAMETERS_PREFIX "ratio" +#define LV2_PARAMETERS__release LV2_PARAMETERS_PREFIX "release" +#define LV2_PARAMETERS__resonance LV2_PARAMETERS_PREFIX "resonance" +#define LV2_PARAMETERS__sampleRate LV2_PARAMETERS_PREFIX "sampleRate" +#define LV2_PARAMETERS__sustain LV2_PARAMETERS_PREFIX "sustain" +#define LV2_PARAMETERS__threshold LV2_PARAMETERS_PREFIX "threshold" +#define LV2_PARAMETERS__waveform LV2_PARAMETERS_PREFIX "waveform" +#define LV2_PARAMETERS__wetDryRatio LV2_PARAMETERS_PREFIX "wetDryRatio" +#define LV2_PARAMETERS__wetLevel LV2_PARAMETERS_PREFIX "wetLevel" + +#endif /* LV2_PARAMETERS_H */ diff --git a/dpf/distrho/src/lv2/patch.h b/dpf/distrho/src/lv2/patch.h new file mode 100644 index 0000000..3224264 --- /dev/null +++ b/dpf/distrho/src/lv2/patch.h @@ -0,0 +1,56 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file patch.h C header for the LV2 Patch extension + . + + The patch extension is purely data, this header merely defines URIs + for convenience. +*/ + +#ifndef LV2_PATCH_H +#define LV2_PATCH_H + +#define LV2_PATCH_URI "http://lv2plug.in/ns/ext/patch" +#define LV2_PATCH_PREFIX LV2_PATCH_URI "#" + +#define LV2_PATCH__Ack LV2_PATCH_PREFIX "Ack" +#define LV2_PATCH__Delete LV2_PATCH_PREFIX "Delete" +#define LV2_PATCH__Error LV2_PATCH_PREFIX "Error" +#define LV2_PATCH__Get LV2_PATCH_PREFIX "Get" +#define LV2_PATCH__Message LV2_PATCH_PREFIX "Message" +#define LV2_PATCH__Move LV2_PATCH_PREFIX "Move" +#define LV2_PATCH__Patch LV2_PATCH_PREFIX "Patch" +#define LV2_PATCH__Post LV2_PATCH_PREFIX "Post" +#define LV2_PATCH__Put LV2_PATCH_PREFIX "Put" +#define LV2_PATCH__Request LV2_PATCH_PREFIX "Request" +#define LV2_PATCH__Response LV2_PATCH_PREFIX "Response" +#define LV2_PATCH__Set LV2_PATCH_PREFIX "Set" +#define LV2_PATCH__add LV2_PATCH_PREFIX "add" +#define LV2_PATCH__body LV2_PATCH_PREFIX "body" +#define LV2_PATCH__destination LV2_PATCH_PREFIX "destination" +#define LV2_PATCH__property LV2_PATCH_PREFIX "property" +#define LV2_PATCH__readable LV2_PATCH_PREFIX "readable" +#define LV2_PATCH__remove LV2_PATCH_PREFIX "remove" +#define LV2_PATCH__request LV2_PATCH_PREFIX "request" +#define LV2_PATCH__subject LV2_PATCH_PREFIX "subject" +#define LV2_PATCH__sequenceNumber LV2_PATCH_PREFIX "sequenceNumber" +#define LV2_PATCH__value LV2_PATCH_PREFIX "value" +#define LV2_PATCH__wildcard LV2_PATCH_PREFIX "wildcard" +#define LV2_PATCH__writable LV2_PATCH_PREFIX "writable" + +#endif /* LV2_PATCH_H */ diff --git a/dpf/distrho/src/lv2/port-groups.h b/dpf/distrho/src/lv2/port-groups.h new file mode 100644 index 0000000..4dd8cf4 --- /dev/null +++ b/dpf/distrho/src/lv2/port-groups.h @@ -0,0 +1,64 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file port-groups.h + C definitions for the LV2 Port Groups extension + . +*/ + +#ifndef LV2_PORT_GROUPS_H +#define LV2_PORT_GROUPS_H + +#define LV2_PORT_GROUPS_URI "http://lv2plug.in/ns/ext/port-groups" +#define LV2_PORT_GROUPS_PREFIX LV2_PORT_GROUPS_URI "#" + +#define LV2_PORT_GROUPS__DiscreteGroup LV2_PORT_GROUPS_PREFIX "DiscreteGroup" +#define LV2_PORT_GROUPS__Element LV2_PORT_GROUPS_PREFIX "Element" +#define LV2_PORT_GROUPS__FivePointOneGroup LV2_PORT_GROUPS_PREFIX "FivePointOneGroup" +#define LV2_PORT_GROUPS__FivePointZeroGroup LV2_PORT_GROUPS_PREFIX "FivePointZeroGroup" +#define LV2_PORT_GROUPS__FourPointZeroGroup LV2_PORT_GROUPS_PREFIX "FourPointZeroGroup" +#define LV2_PORT_GROUPS__Group LV2_PORT_GROUPS_PREFIX "Group" +#define LV2_PORT_GROUPS__InputGroup LV2_PORT_GROUPS_PREFIX "InputGroup" +#define LV2_PORT_GROUPS__MidSideGroup LV2_PORT_GROUPS_PREFIX "MidSideGroup" +#define LV2_PORT_GROUPS__MonoGroup LV2_PORT_GROUPS_PREFIX "MonoGroup" +#define LV2_PORT_GROUPS__OutputGroup LV2_PORT_GROUPS_PREFIX "OutputGroup" +#define LV2_PORT_GROUPS__SevenPointOneGroup LV2_PORT_GROUPS_PREFIX "SevenPointOneGroup" +#define LV2_PORT_GROUPS__SevenPointOneWideGroup LV2_PORT_GROUPS_PREFIX "SevenPointOneWideGroup" +#define LV2_PORT_GROUPS__SixPointOneGroup LV2_PORT_GROUPS_PREFIX "SixPointOneGroup" +#define LV2_PORT_GROUPS__StereoGroup LV2_PORT_GROUPS_PREFIX "StereoGroup" +#define LV2_PORT_GROUPS__ThreePointZeroGroup LV2_PORT_GROUPS_PREFIX "ThreePointZeroGroup" +#define LV2_PORT_GROUPS__center LV2_PORT_GROUPS_PREFIX "center" +#define LV2_PORT_GROUPS__centerLeft LV2_PORT_GROUPS_PREFIX "centerLeft" +#define LV2_PORT_GROUPS__centerRight LV2_PORT_GROUPS_PREFIX "centerRight" +#define LV2_PORT_GROUPS__element LV2_PORT_GROUPS_PREFIX "element" +#define LV2_PORT_GROUPS__group LV2_PORT_GROUPS_PREFIX "group" +#define LV2_PORT_GROUPS__left LV2_PORT_GROUPS_PREFIX "left" +#define LV2_PORT_GROUPS__lowFrequencyEffects LV2_PORT_GROUPS_PREFIX "lowFrequencyEffects" +#define LV2_PORT_GROUPS__mainInput LV2_PORT_GROUPS_PREFIX "mainInput" +#define LV2_PORT_GROUPS__mainOutput LV2_PORT_GROUPS_PREFIX "mainOutput" +#define LV2_PORT_GROUPS__rearCenter LV2_PORT_GROUPS_PREFIX "rearCenter" +#define LV2_PORT_GROUPS__rearLeft LV2_PORT_GROUPS_PREFIX "rearLeft" +#define LV2_PORT_GROUPS__rearRight LV2_PORT_GROUPS_PREFIX "rearRight" +#define LV2_PORT_GROUPS__right LV2_PORT_GROUPS_PREFIX "right" +#define LV2_PORT_GROUPS__side LV2_PORT_GROUPS_PREFIX "side" +#define LV2_PORT_GROUPS__sideChainOf LV2_PORT_GROUPS_PREFIX "sideChainOf" +#define LV2_PORT_GROUPS__sideLeft LV2_PORT_GROUPS_PREFIX "sideLeft" +#define LV2_PORT_GROUPS__sideRight LV2_PORT_GROUPS_PREFIX "sideRight" +#define LV2_PORT_GROUPS__source LV2_PORT_GROUPS_PREFIX "source" +#define LV2_PORT_GROUPS__subGroupOf LV2_PORT_GROUPS_PREFIX "subGroupOf" + +#endif /* LV2_PORT_GROUPS_H */ diff --git a/dpf/distrho/src/lv2/port-props.h b/dpf/distrho/src/lv2/port-props.h new file mode 100644 index 0000000..11274cc --- /dev/null +++ b/dpf/distrho/src/lv2/port-props.h @@ -0,0 +1,42 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file port-props.h + C definitions for the LV2 Port Props extension + . +*/ + +#ifndef LV2_PORT_PROPS_H +#define LV2_PORT_PROPS_H + +#define LV2_PORT_PROPS_URI "http://lv2plug.in/ns/ext/port-props" +#define LV2_PORT_PROPS_PREFIX LV2_PORT_PROPS_URI "#" + +#define LV2_PORT_PROPS__causesArtifacts LV2_PORT_PROPS_PREFIX "causesArtifacts" +#define LV2_PORT_PROPS__continuousCV LV2_PORT_PROPS_PREFIX "continuousCV" +#define LV2_PORT_PROPS__discreteCV LV2_PORT_PROPS_PREFIX "discreteCV" +#define LV2_PORT_PROPS__displayPriority LV2_PORT_PROPS_PREFIX "displayPriority" +#define LV2_PORT_PROPS__expensive LV2_PORT_PROPS_PREFIX "expensive" +#define LV2_PORT_PROPS__hasStrictBounds LV2_PORT_PROPS_PREFIX "hasStrictBounds" +#define LV2_PORT_PROPS__logarithmic LV2_PORT_PROPS_PREFIX "logarithmic" +#define LV2_PORT_PROPS__notAutomatic LV2_PORT_PROPS_PREFIX "notAutomatic" +#define LV2_PORT_PROPS__notOnGUI LV2_PORT_PROPS_PREFIX "notOnGUI" +#define LV2_PORT_PROPS__rangeSteps LV2_PORT_PROPS_PREFIX "rangeSteps" +#define LV2_PORT_PROPS__supportsStrictBounds LV2_PORT_PROPS_PREFIX "supportsStrictBounds" +#define LV2_PORT_PROPS__trigger LV2_PORT_PROPS_PREFIX "trigger" + +#endif /* LV2_PORT_PROPS_H */ diff --git a/dpf/distrho/src/lv2/presets.h b/dpf/distrho/src/lv2/presets.h new file mode 100644 index 0000000..4851feb --- /dev/null +++ b/dpf/distrho/src/lv2/presets.h @@ -0,0 +1,34 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file presets.h + + C definitions for the LV2 Presets extension + . +*/ + +#ifndef LV2_PRESETS_H +#define LV2_PRESETS_H + +#define LV2_PRESETS_URI "http://lv2plug.in/ns/ext/presets" +#define LV2_PRESETS_PREFIX LV2_PRESETS_URI "#" + +#define LV2_PRESETS__Preset LV2_PRESETS_PREFIX "Preset" +#define LV2_PRESETS__preset LV2_PRESETS_PREFIX "preset" +#define LV2_PRESETS__value LV2_PRESETS_PREFIX "value" + +#endif /* LV2_PRESETS_H */ diff --git a/dpf/distrho/src/lv2/resize-port.h b/dpf/distrho/src/lv2/resize-port.h new file mode 100644 index 0000000..fa3abd7 --- /dev/null +++ b/dpf/distrho/src/lv2/resize-port.h @@ -0,0 +1,72 @@ +/* + Copyright 2007-2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#ifndef LV2_RESIZE_PORT_H +#define LV2_RESIZE_PORT_H + +#include +#include + +#define LV2_RESIZE_PORT_URI "http://lv2plug.in/ns/ext/resize-port" +#define LV2_RESIZE_PORT_PREFIX LV2_RESIZE_PORT_URI "#" + +#define LV2_RESIZE_PORT__asLargeAs LV2_RESIZE_PORT_PREFIX "asLargeAs" +#define LV2_RESIZE_PORT__minimumSize LV2_RESIZE_PORT_PREFIX "minimumSize" +#define LV2_RESIZE_PORT__resize LV2_RESIZE_PORT_PREFIX "resize" + +#ifdef __cplusplus +extern "C" { +#else +# include +#endif + +/** A status code for state functions. */ +typedef enum { + LV2_RESIZE_PORT_SUCCESS = 0, /**< Completed successfully. */ + LV2_RESIZE_PORT_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_RESIZE_PORT_ERR_NO_SPACE = 2 /**< Insufficient space. */ +} LV2_Resize_Port_Status; + +typedef void* LV2_Resize_Port_Feature_Data; + +typedef struct { + LV2_Resize_Port_Feature_Data data; + + /** + Resize a port buffer to at least @a size bytes. + + This function MAY return an error, in which case the port buffer was not + resized and the port is still connected to the same location. Plugins + MUST gracefully handle this situation. + + This function is in the audio threading class. + + The host MUST preserve the contents of the port buffer when resizing. + + Plugins MAY resize a port many times in a single run callback. Hosts + SHOULD make this as inexpensive as possible. + */ + LV2_Resize_Port_Status (*resize)(LV2_Resize_Port_Feature_Data data, + uint32_t index, + size_t size); +} LV2_Resize_Port_Resize; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_RESIZE_PORT_H */ + diff --git a/dpf/distrho/src/lv2/state.h b/dpf/distrho/src/lv2/state.h new file mode 100644 index 0000000..09787d9 --- /dev/null +++ b/dpf/distrho/src/lv2/state.h @@ -0,0 +1,352 @@ +/* + Copyright 2010-2012 David Robillard + Copyright 2010 Leonard Ritter + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file state.h + C API for the LV2 State extension . +*/ + +#ifndef LV2_STATE_H +#define LV2_STATE_H + +#include +#include + +#include "lv2.h" + +#define LV2_STATE_URI "http://lv2plug.in/ns/ext/state" +#define LV2_STATE_PREFIX LV2_STATE_URI "#" + +#define LV2_STATE__State LV2_STATE_PREFIX "State" +#define LV2_STATE__interface LV2_STATE_PREFIX "interface" +#define LV2_STATE__loadDefaultState LV2_STATE_PREFIX "loadDefaultState" +#define LV2_STATE__makePath LV2_STATE_PREFIX "makePath" +#define LV2_STATE__mapPath LV2_STATE_PREFIX "mapPath" +#define LV2_STATE__state LV2_STATE_PREFIX "state" + +#ifdef __cplusplus +extern "C" { +#else +# include +#endif + +typedef void* LV2_State_Handle; +typedef void* LV2_State_Map_Path_Handle; +typedef void* LV2_State_Make_Path_Handle; + +/** + Flags describing value characteristics. + + These flags are used along with the value's type URI to determine how to + (de-)serialise the value data, or whether it is even possible to do so. +*/ +typedef enum { + /** + Plain Old Data. + + Values with this flag contain no pointers or references to other areas + of memory. It is safe to copy POD values with a simple memcpy and store + them for the duration of the process. A POD value is not necessarily + safe to trasmit between processes or machines (e.g. filenames are POD), + see LV2_STATE_IS_PORTABLE for details. + + Implementations MUST NOT attempt to copy or serialise a non-POD value if + they do not understand its type (and thus know how to correctly do so). + */ + LV2_STATE_IS_POD = 1, + + /** + Portable (architecture independent) data. + + Values with this flag are in a format that is usable on any + architecture. A portable value saved on one machine can be restored on + another machine regardless of architecture. The format of portable + values MUST NOT depend on architecture-specific properties like + endianness or alignment. Portable values MUST NOT contain filenames. + */ + LV2_STATE_IS_PORTABLE = 1 << 1, + + /** + Native data. + + This flag is used by the host to indicate that the saved data is only + going to be used locally in the currently running process (e.g. for + instance duplication or snapshots), so the plugin should use the most + efficient representation possible and not worry about serialisation + and portability. + */ + LV2_STATE_IS_NATIVE = 1 << 2 +} LV2_State_Flags; + +/** A status code for state functions. */ +typedef enum { + LV2_STATE_SUCCESS = 0, /**< Completed successfully. */ + LV2_STATE_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_STATE_ERR_BAD_TYPE = 2, /**< Failed due to unsupported type. */ + LV2_STATE_ERR_BAD_FLAGS = 3, /**< Failed due to unsupported flags. */ + LV2_STATE_ERR_NO_FEATURE = 4, /**< Failed due to missing features. */ + LV2_STATE_ERR_NO_PROPERTY = 5 /**< Failed due to missing property. */ +} LV2_State_Status; + +/** + A host-provided function to store a property. + @param handle Must be the handle passed to LV2_State_Interface.save(). + @param key The key to store @p value under (URID). + @param value Pointer to the value to be stored. + @param size The size of @p value in bytes. + @param type The type of @p value (URID). + @param flags LV2_State_Flags for @p value. + @return 0 on success, otherwise a non-zero error code. + + The host passes a callback of this type to LV2_State_Interface.save(). This + callback is called repeatedly by the plugin to store all the properties that + describe its current state. + + DO NOT INVENT NONSENSE URI SCHEMES FOR THE KEY. Best is to use keys from + existing vocabularies. If nothing appropriate is available, use http URIs + that point to somewhere you can host documents so documentation can be made + resolvable (e.g. a child of the plugin or project URI). If this is not + possible, invent a URN scheme, e.g. urn:myproj:whatever. The plugin MUST + NOT pass an invalid URI key. + + The host MAY fail to store a property for whatever reason, but SHOULD + store any property that is LV2_STATE_IS_POD and LV2_STATE_IS_PORTABLE. + Implementations SHOULD use the types from the LV2 Atom extension + (http://lv2plug.in/ns/ext/atom) wherever possible. The plugin SHOULD + attempt to fall-back and avoid the error if possible. + + Note that @p size MUST be > 0, and @p value MUST point to a valid region of + memory @p size bytes long (this is required to make restore unambiguous). + + The plugin MUST NOT attempt to use this function outside of the + LV2_State_Interface.restore() context. +*/ +typedef LV2_State_Status (*LV2_State_Store_Function)( + LV2_State_Handle handle, + uint32_t key, + const void* value, + size_t size, + uint32_t type, + uint32_t flags); + +/** + A host-provided function to retrieve a property. + @param handle Must be the handle passed to LV2_State_Interface.restore(). + @param key The key of the property to retrieve (URID). + @param size (Output) If non-NULL, set to the size of the restored value. + @param type (Output) If non-NULL, set to the type of the restored value. + @param flags (Output) If non-NULL, set to the flags for the restored value. + @return A pointer to the restored value (object), or NULL if no value + has been stored under @p key. + + A callback of this type is passed by the host to + LV2_State_Interface.restore(). This callback is called repeatedly by the + plugin to retrieve any properties it requires to restore its state. + + The returned value MUST remain valid until LV2_State_Interface.restore() + returns. The plugin MUST NOT attempt to use this function, or any value + returned from it, outside of the LV2_State_Interface.restore() context. +*/ +typedef const void* (*LV2_State_Retrieve_Function)( + LV2_State_Handle handle, + uint32_t key, + size_t* size, + uint32_t* type, + uint32_t* flags); + +/** + LV2 Plugin State Interface. + + When the plugin's extension_data is called with argument + LV2_STATE__interface, the plugin MUST return an LV2_State_Interface + structure, which remains valid for the lifetime of the plugin. + + The host can use the contained function pointers to save and restore the + state of a plugin instance at any time, provided the threading restrictions + of the functions are met. + + Stored data is only guaranteed to be compatible between instances of plugins + with the same URI (i.e. if a change to a plugin would cause a fatal error + when restoring state saved by a previous version of that plugin, the plugin + URI MUST change just as it must when ports change incompatibly). Plugin + authors should consider this possibility, and always store sensible data + with meaningful types to avoid such problems in the future. +*/ +typedef struct _LV2_State_Interface { + /** + Save plugin state using a host-provided @p store callback. + + @param instance The instance handle of the plugin. + @param store The host-provided store callback. + @param handle An opaque pointer to host data which MUST be passed as the + handle parameter to @p store if it is called. + @param flags Flags describing desired properties of this save. These + flags may be used to determine the most appropriate values to store. + @param features Extensible parameter for passing any additional + features to be used for this save. + + The plugin is expected to store everything necessary to completely + restore its state later. Plugins SHOULD store simple POD data whenever + possible, and consider the possibility of state being restored much + later on a different machine. + + The @p handle pointer and @p store function MUST NOT be used + beyond the scope of save(). + + This function has its own special threading class: it may not be called + concurrently with any "Instantiation" function, but it may be called + concurrently with functions in any other class, unless the definition of + that class prohibits it (e.g. it may not be called concurrently with a + "Discovery" function, but it may be called concurrently with an "Audio" + function. The plugin is responsible for any locking or lock-free + techniques necessary to make this possible. + + Note that in the simple case where state is only modified by restore(), + there are no synchronization issues since save() is never called + concurrently with restore() (though run() may read it during a save). + + Plugins that dynamically modify state while running, however, must take + care to do so in such a way that a concurrent call to save() will save a + consistent representation of plugin state for a single instant in time. + */ + LV2_State_Status (*save)(LV2_Handle instance, + LV2_State_Store_Function store, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature *const * features); + + /** + Restore plugin state using a host-provided @p retrieve callback. + + @param instance The instance handle of the plugin. + @param retrieve The host-provided retrieve callback. + @param handle An opaque pointer to host data which MUST be passed as the + handle parameter to @p retrieve if it is called. + @param flags Currently unused. + @param features Extensible parameter for passing any additional + features to be used for this restore. + + The plugin MAY assume a restored value was set by a previous call to + LV2_State_Interface.save() by a plugin with the same URI. + + The plugin MUST gracefully fall back to a default value when a value can + not be retrieved. This allows the host to reset the plugin state with + an empty map. + + The @p handle pointer and @p store function MUST NOT be used + beyond the scope of restore(). + + This function is in the "Instantiation" threading class as defined by + LV2. This means it MUST NOT be called concurrently with any other + function on the same plugin instance. + */ + LV2_State_Status (*restore)(LV2_Handle instance, + LV2_State_Retrieve_Function retrieve, + LV2_State_Handle handle, + uint32_t flags, + const LV2_Feature *const * features); +} LV2_State_Interface; + +/** + Feature data for state:mapPath (LV2_STATE__mapPath). +*/ +typedef struct { + /** + Opaque host data. + */ + LV2_State_Map_Path_Handle handle; + + /** + Map an absolute path to an abstract path for use in plugin state. + @param handle MUST be the @p handle member of this struct. + @param absolute_path The absolute path of a file. + @return An abstract path suitable for use in plugin state. + + The plugin MUST use this function to map any paths that will be stored + in plugin state. The returned value is an abstract path which MAY not + be an actual file system path; @ref absolute_path() MUST be used to map + it to an actual path in order to use the file. + + Plugins MUST NOT make any assumptions about abstract paths except that + they can be mapped back to the absolute path of the "same" file (though + not necessarily the same original path) using @ref absolute_path(). + + This function may only be called within the context of + LV2_State_Interface methods. The caller is responsible for freeing the + returned value with free(). + */ + char* (*abstract_path)(LV2_State_Map_Path_Handle handle, + const char* absolute_path); + + /** + Map an abstract path from plugin state to an absolute path. + @param handle MUST be the @p handle member of this struct. + @param abstract_path An abstract path (e.g. a path from plugin state). + @return An absolute file system path. + + The plugin MUST use this function in order to actually open or otherwise + use any paths loaded from plugin state. + + This function may only be called within the context of + LV2_State_Interface methods. The caller is responsible for freeing the + returned value with free(). + */ + char* (*absolute_path)(LV2_State_Map_Path_Handle handle, + const char* abstract_path); +} LV2_State_Map_Path; + +/** + Feature data for state:makePath (@ref LV2_STATE__makePath). +*/ +typedef struct { + /** + Opaque host data. + */ + LV2_State_Make_Path_Handle handle; + + /** + Return a path the plugin may use to create a new file. + @param handle MUST be the @p handle member of this struct. + @param path The path of the new file within a namespace unique to this + plugin instance. + @return The absolute path to use for the new file. + + This function can be used by plugins to create files and directories, + either at state saving time (if this feature is passed to + LV2_State_Interface.save()) or any time (if this feature is passed to + LV2_Descriptor.instantiate()). + + The host MUST do whatever is necessary for the plugin to be able to + create a file at the returned path (e.g. using fopen), including + creating any leading directories. + + If this function is passed to LV2_Descriptor.instantiate(), it may be + called from any non-realtime context. If it is passed to + LV2_State_Interface.save(), it may only be called within the dynamic + scope of that function call. + + The caller is responsible for freeing the returned value with free(). + */ + char* (*path)(LV2_State_Make_Path_Handle handle, + const char* path); +} LV2_State_Make_Path; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_STATE_H */ diff --git a/dpf/distrho/src/lv2/time.h b/dpf/distrho/src/lv2/time.h new file mode 100644 index 0000000..3bb0614 --- /dev/null +++ b/dpf/distrho/src/lv2/time.h @@ -0,0 +1,49 @@ +/* + Copyright 2011 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file time.h C header for the LV2 Time extension + . +*/ + +#ifndef LV2_TIME_H +#define LV2_TIME_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define LV2_TIME_URI "http://lv2plug.in/ns/ext/time" + +#define LV2_TIME__Time LV2_TIME_URI "#Time" +#define LV2_TIME__Position LV2_TIME_URI "#Position" +#define LV2_TIME__Rate LV2_TIME_URI "#Rate" +#define LV2_TIME__position LV2_TIME_URI "#position" +#define LV2_TIME__barBeat LV2_TIME_URI "#barBeat" +#define LV2_TIME__bar LV2_TIME_URI "#bar" +#define LV2_TIME__beat LV2_TIME_URI "#beat" +#define LV2_TIME__beatUnit LV2_TIME_URI "#beatUnit" +#define LV2_TIME__beatsPerBar LV2_TIME_URI "#beatsPerBar" +#define LV2_TIME__beatsPerMinute LV2_TIME_URI "#beatsPerMinute" +#define LV2_TIME__frame LV2_TIME_URI "#frame" +#define LV2_TIME__framesPerSecond LV2_TIME_URI "#framesPerSecond" +#define LV2_TIME__speed LV2_TIME_URI "#speed" + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_TIME_H */ diff --git a/dpf/distrho/src/lv2/ui.h b/dpf/distrho/src/lv2/ui.h new file mode 100644 index 0000000..9ee4bd1 --- /dev/null +++ b/dpf/distrho/src/lv2/ui.h @@ -0,0 +1,430 @@ +/* + LV2 UI Extension + Copyright 2009-2014 David Robillard + Copyright 2006-2011 Lars Luthman + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file ui.h User Interface API. + + For high-level documentation, see . +*/ + +#ifndef LV2_UI_H +#define LV2_UI_H + +#include + +#include "lv2.h" + +#define LV2_UI_URI "http://lv2plug.in/ns/extensions/ui" +#define LV2_UI_PREFIX LV2_UI_URI "#" + +#define LV2_UI__CocoaUI LV2_UI_PREFIX "CocoaUI" +#define LV2_UI__Gtk3UI LV2_UI_PREFIX "Gtk3UI" +#define LV2_UI__GtkUI LV2_UI_PREFIX "GtkUI" +#define LV2_UI__PortNotification LV2_UI_PREFIX "PortNotification" +#define LV2_UI__Qt4UI LV2_UI_PREFIX "Qt4UI" +#define LV2_UI__UI LV2_UI_PREFIX "UI" +#define LV2_UI__WindowsUI LV2_UI_PREFIX "WindowsUI" +#define LV2_UI__X11UI LV2_UI_PREFIX "X11UI" +#define LV2_UI__binary LV2_UI_PREFIX "binary" +#define LV2_UI__fixedSize LV2_UI_PREFIX "fixedSize" +#define LV2_UI__idleInterface LV2_UI_PREFIX "idleInterface" +#define LV2_UI__noUserResize LV2_UI_PREFIX "noUserResize" +#define LV2_UI__notifyType LV2_UI_PREFIX "notifyType" +#define LV2_UI__parent LV2_UI_PREFIX "parent" +#define LV2_UI__plugin LV2_UI_PREFIX "plugin" +#define LV2_UI__portIndex LV2_UI_PREFIX "portIndex" +#define LV2_UI__portMap LV2_UI_PREFIX "portMap" +#define LV2_UI__portNotification LV2_UI_PREFIX "portNotification" +#define LV2_UI__portSubscribe LV2_UI_PREFIX "portSubscribe" +#define LV2_UI__resize LV2_UI_PREFIX "resize" +#define LV2_UI__showInterface LV2_UI_PREFIX "showInterface" +#define LV2_UI__touch LV2_UI_PREFIX "touch" +#define LV2_UI__ui LV2_UI_PREFIX "ui" +#define LV2_UI__updateRate LV2_UI_PREFIX "updateRate" +#define LV2_UI__windowTitle LV2_UI_PREFIX "windowTitle" + +/** + The index returned by LV2_UI_Port_Port::port_index() for unknown ports. +*/ +#define LV2UI_INVALID_PORT_INDEX ((uint32_t)-1) + +#ifdef __cplusplus +extern "C" { +#else +# include +#endif + +/** + A pointer to some widget or other type of UI handle. + + The actual type is defined by the type of the UI. +*/ +typedef void* LV2UI_Widget; + +/** + A pointer to UI instance internals. + + The host may compare this to NULL, but otherwise MUST NOT interpret it. +*/ +typedef void* LV2UI_Handle; + +/** + A pointer to a controller provided by the host. + + The UI may compare this to NULL, but otherwise MUST NOT interpret it. +*/ +typedef void* LV2UI_Controller; + +/** + A pointer to opaque data for a feature. +*/ +typedef void* LV2UI_Feature_Handle; + +/** + A host-provided function that sends data to a plugin's input ports. + + The @p buffer parameter must point to a block of data, @p buffer_size bytes + large. The format of this data and how the host should use it is defined by + the @p port_protocol. This buffer is owned by the UI and is only valid for + the duration of this call. + + The @p port_protocol parameter should either be 0 or the URID for a + ui:PortProtocol. If it is 0, the protocol is implicitly ui:floatProtocol, + the port MUST be an lv2:ControlPort input, @p buffer MUST point to a single + float value, and @p buffer_size MUST be sizeof(float). + + The UI SHOULD NOT use a protocol not supported by the host, but the host + MUST gracefully ignore any protocol it does not understand. +*/ +typedef void (*LV2UI_Write_Function)(LV2UI_Controller controller, + uint32_t port_index, + uint32_t buffer_size, + uint32_t port_protocol, + const void* buffer); + +/** + A plugin UI. + + A pointer to an object of this type is returned by the lv2ui_descriptor() + function. +*/ +typedef struct _LV2UI_Descriptor { + /** + The URI for this UI (not for the plugin it controls). + */ + const char* URI; + + /** + Create a new UI and return a handle to it. This function works + similarly to LV2_Descriptor::instantiate(). + + @param descriptor The descriptor for the UI to instantiate. + + @param plugin_uri The URI of the plugin that this UI will control. + + @param bundle_path The path to the bundle containing this UI, including + the trailing directory separator. + + @param write_function A function that the UI can use to send data to the + plugin's input ports. + + @param controller A handle for the plugin instance to be passed as the + first parameter of UI methods. + + @param widget (output) widget pointer. The UI points this at its main + widget, which has the type defined by the UI type in the data file. + + @param features An array of LV2_Feature pointers. The host must pass + all feature URIs that it and the UI supports and any additional data, as + in LV2_Descriptor::instantiate(). Note that UI features and plugin + features are not necessarily the same. + + */ + LV2UI_Handle (*instantiate)(const struct _LV2UI_Descriptor* descriptor, + const char* plugin_uri, + const char* bundle_path, + LV2UI_Write_Function write_function, + LV2UI_Controller controller, + LV2UI_Widget* widget, + const LV2_Feature* const* features); + + + /** + Destroy the UI. The host must not try to access the widget after + calling this function. + */ + void (*cleanup)(LV2UI_Handle ui); + + /** + Tell the UI that something interesting has happened at a plugin port. + + What is "interesting" and how it is written to @p buffer is defined by + @p format, which has the same meaning as in LV2UI_Write_Function(). + Format 0 is a special case for lv2:ControlPort, where this function + should be called when the port value changes (but not necessarily for + every change), @p buffer_size must be sizeof(float), and @p buffer + points to a single IEEE-754 float. + + By default, the host should only call this function for lv2:ControlPort + inputs. However, the UI can request updates for other ports statically + with ui:portNotification or dynamicaly with ui:portSubscribe. + + The UI MUST NOT retain any reference to @p buffer after this function + returns, it is only valid for the duration of the call. + + This member may be NULL if the UI is not interested in any port events. + */ + void (*port_event)(LV2UI_Handle ui, + uint32_t port_index, + uint32_t buffer_size, + uint32_t format, + const void* buffer); + + /** + Return a data structure associated with an extension URI, typically an + interface struct with additional function pointers + + This member may be set to NULL if the UI is not interested in supporting + any extensions. This is similar to LV2_Descriptor::extension_data(). + + */ + const void* (*extension_data)(const char* uri); +} LV2UI_Descriptor; + +/** + Feature/interface for resizable UIs (LV2_UI__resize). + + This structure is used in two ways: as a feature passed by the host via + LV2UI_Descriptor::instantiate(), or as an interface provided by a UI via + LV2UI_Descriptor::extension_data()). +*/ +typedef struct _LV2UI_Resize { + /** + Pointer to opaque data which must be passed to ui_resize(). + */ + LV2UI_Feature_Handle handle; + + /** + Request/advertise a size change. + + When provided by the host, the UI may call this function to inform the + host about the size of the UI. + + When provided by the UI, the host may call this function to notify the + UI that it should change its size accordingly. + + @return 0 on success. + */ + int (*ui_resize)(LV2UI_Feature_Handle handle, int width, int height); +} LV2UI_Resize; + +/** + Feature to map port symbols to UIs. + + This can be used by the UI to get the index for a port with the given + symbol. This makes it possible to implement and distribute a UI separately + from the plugin (since symbol, unlike index, is a stable port identifier). +*/ +typedef struct _LV2UI_Port_Map { + /** + Pointer to opaque data which must be passed to port_index(). + */ + LV2UI_Feature_Handle handle; + + /** + Get the index for the port with the given @p symbol. + + @return The index of the port, or LV2UI_INVALID_PORT_INDEX if no such + port is found. + */ + uint32_t (*port_index)(LV2UI_Feature_Handle handle, const char* symbol); +} LV2UI_Port_Map; + +/** + Feature to subscribe to port updates (LV2_UI__portSubscribe). +*/ +typedef struct _LV2UI_Port_Subscribe { + /** + Pointer to opaque data which must be passed to subscribe() and + unsubscribe(). + */ + LV2UI_Feature_Handle handle; + + /** + Subscribe to updates for a port. + + This means that the host will call the UI's port_event() function when + the port value changes (as defined by protocol). + + Calling this function with the same @p port_index and @p port_protocol + as an already active subscription has no effect. + + @param handle The handle field of this struct. + @param port_index The index of the port. + @param port_protocol The URID of the ui:PortProtocol. + @param features Features for this subscription. + @return 0 on success. + */ + uint32_t (*subscribe)(LV2UI_Feature_Handle handle, + uint32_t port_index, + uint32_t port_protocol, + const LV2_Feature* const* features); + + /** + Unsubscribe from updates for a port. + + This means that the host will cease calling calling port_event() when + the port value changes. + + Calling this function with a @p port_index and @p port_protocol that + does not refer to an active port subscription has no effect. + + @param handle The handle field of this struct. + @param port_index The index of the port. + @param port_protocol The URID of the ui:PortProtocol. + @param features Features for this subscription. + @return 0 on success. + */ + uint32_t (*unsubscribe)(LV2UI_Feature_Handle handle, + uint32_t port_index, + uint32_t port_protocol, + const LV2_Feature* const* features); +} LV2UI_Port_Subscribe; + +/** + A feature to notify the host that the user has grabbed a UI control. +*/ +typedef struct _LV2UI_Touch { + /** + Pointer to opaque data which must be passed to ui_resize(). + */ + LV2UI_Feature_Handle handle; + + /** + Notify the host that a control has been grabbed or released. + + The host should cease automating the port or otherwise manipulating the + port value until the control has been ungrabbed. + + @param handle The handle field of this struct. + @param port_index The index of the port associated with the control. + @param grabbed If true, the control has been grabbed, otherwise the + control has been released. + */ + void (*touch)(LV2UI_Feature_Handle handle, + uint32_t port_index, + bool grabbed); +} LV2UI_Touch; + +/** + UI Idle Interface (LV2_UI__idleInterface) + + UIs can provide this interface to have an idle() callback called by the host + rapidly to update the UI. +*/ +typedef struct _LV2UI_Idle_Interface { + /** + Run a single iteration of the UI's idle loop. + + This will be called rapidly in the UI thread at a rate appropriate + for a toolkit main loop. There are no precise timing guarantees, but + the host should attempt to call idle() at a high enough rate for smooth + animation, at least 30Hz. + + @return non-zero if the UI has been closed, in which case the host + should stop calling idle(), and can either completely destroy the UI, or + re-show it and resume calling idle(). + */ + int (*idle)(LV2UI_Handle ui); +} LV2UI_Idle_Interface; + +/** + UI Show Interface (LV2_UI__showInterface) + + UIs can provide this interface to show and hide a window, which allows them + to function in hosts unable to embed their widget. This allows any UI to + provide a fallback for embedding that works in any host. + + If used: + - The host MUST use LV2UI_Idle_Interface to drive the UI. + - The UI MUST return non-zero from LV2UI_Idle_Interface::idle() when it has been closed. + - If idle() returns non-zero, the host MUST call hide() and stop calling + idle(). It MAY later call show() then resume calling idle(). +*/ +typedef struct _LV2UI_Show_Interface { + /** + Show a window for this UI. + + The window title MAY have been passed by the host to + LV2UI_Descriptor::instantiate() as an LV2_Options_Option with key + LV2_UI__windowTitle. + + @return 0 on success, or anything else to stop being called. + */ + int (*show)(LV2UI_Handle ui); + + /** + Hide the window for this UI. + + @return 0 on success, or anything else to stop being called. + */ + int (*hide)(LV2UI_Handle ui); +} LV2UI_Show_Interface; + +/** + Peak data for a slice of time, the update format for ui:peakProtocol. +*/ +typedef struct _LV2UI_Peak_Data { + /** + The start of the measurement period. This is just a running counter + that is only meaningful in comparison to previous values and must not be + interpreted as an absolute time. + */ + uint32_t period_start; + + /** + The size of the measurement period, in the same units as period_start. + */ + uint32_t period_size; + + /** + The peak value for the measurement period. This should be the maximal + value for abs(sample) over all the samples in the period. + */ + float peak; +} LV2UI_Peak_Data; + +/** + Prototype for UI accessor function. + + This is the entry point to a UI library, which works in the same way as + lv2_descriptor() but for UIs rather than plugins. +*/ +LV2_SYMBOL_EXPORT +const LV2UI_Descriptor* lv2ui_descriptor(uint32_t index); + +/** + The type of the lv2ui_descriptor() function. +*/ +typedef const LV2UI_Descriptor* (*LV2UI_DescriptorFunction)(uint32_t index); + +#ifdef __cplusplus +} +#endif + +#endif /* LV2_UI_H */ diff --git a/dpf/distrho/src/lv2/units.h b/dpf/distrho/src/lv2/units.h new file mode 100644 index 0000000..a40f097 --- /dev/null +++ b/dpf/distrho/src/lv2/units.h @@ -0,0 +1,62 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file units.h + C definitions for the LV2 Units extension + . +*/ + +#ifndef LV2_UNITS_H +#define LV2_UNITS_H + +#define LV2_UNITS_URI "http://lv2plug.in/ns/extensions/units" +#define LV2_UNITS_PREFIX LV2_UNITS_URI "#" + +#define LV2_UNITS__Conversion LV2_UNITS_PREFIX "Conversion" +#define LV2_UNITS__Unit LV2_UNITS_PREFIX "Unit" +#define LV2_UNITS__bar LV2_UNITS_PREFIX "bar" +#define LV2_UNITS__beat LV2_UNITS_PREFIX "beat" +#define LV2_UNITS__bpm LV2_UNITS_PREFIX "bpm" +#define LV2_UNITS__cent LV2_UNITS_PREFIX "cent" +#define LV2_UNITS__cm LV2_UNITS_PREFIX "cm" +#define LV2_UNITS__coef LV2_UNITS_PREFIX "coef" +#define LV2_UNITS__conversion LV2_UNITS_PREFIX "conversion" +#define LV2_UNITS__db LV2_UNITS_PREFIX "db" +#define LV2_UNITS__degree LV2_UNITS_PREFIX "degree" +#define LV2_UNITS__frame LV2_UNITS_PREFIX "frame" +#define LV2_UNITS__hz LV2_UNITS_PREFIX "hz" +#define LV2_UNITS__inch LV2_UNITS_PREFIX "inch" +#define LV2_UNITS__khz LV2_UNITS_PREFIX "khz" +#define LV2_UNITS__km LV2_UNITS_PREFIX "km" +#define LV2_UNITS__m LV2_UNITS_PREFIX "m" +#define LV2_UNITS__mhz LV2_UNITS_PREFIX "mhz" +#define LV2_UNITS__midiNote LV2_UNITS_PREFIX "midiNote" +#define LV2_UNITS__mile LV2_UNITS_PREFIX "mile" +#define LV2_UNITS__min LV2_UNITS_PREFIX "min" +#define LV2_UNITS__mm LV2_UNITS_PREFIX "mm" +#define LV2_UNITS__ms LV2_UNITS_PREFIX "ms" +#define LV2_UNITS__name LV2_UNITS_PREFIX "name" +#define LV2_UNITS__oct LV2_UNITS_PREFIX "oct" +#define LV2_UNITS__pc LV2_UNITS_PREFIX "pc" +#define LV2_UNITS__prefixConversion LV2_UNITS_PREFIX "prefixConversion" +#define LV2_UNITS__render LV2_UNITS_PREFIX "render" +#define LV2_UNITS__s LV2_UNITS_PREFIX "s" +#define LV2_UNITS__semitone12TET LV2_UNITS_PREFIX "semitone12TET" +#define LV2_UNITS__symbol LV2_UNITS_PREFIX "symbol" +#define LV2_UNITS__unit LV2_UNITS_PREFIX "unit" + +#endif /* LV2_UNITS_H */ diff --git a/dpf/distrho/src/lv2/uri-map.h b/dpf/distrho/src/lv2/uri-map.h new file mode 100644 index 0000000..2062af3 --- /dev/null +++ b/dpf/distrho/src/lv2/uri-map.h @@ -0,0 +1,98 @@ +/* + Copyright 2008-2011 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file + C header for the LV2 URI Map extension . + + This extension defines a simple mechanism for plugins to map URIs to + integers, usually for performance reasons (e.g. processing events typed by + URIs in real time). The expected use case is for plugins to map URIs to + integers for things they 'understand' at instantiation time, and store those + values for use in the audio thread without doing any string comparison. + This allows the extensibility of RDF with the performance of integers (or + centrally defined enumerations). +*/ + +#ifndef LV2_URI_MAP_H +#define LV2_URI_MAP_H + +#define LV2_URI_MAP_URI "http://lv2plug.in/ns/ext/uri-map" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Opaque pointer to host data. +*/ +typedef void* LV2_URI_Map_Callback_Data; + +/** + URI Map Feature. + + To support this feature the host must pass an LV2_Feature struct to the + plugin's instantiate method with URI "http://lv2plug.in/ns/ext/uri-map" + and data pointed to an instance of this struct. +*/ +typedef struct { + /** + Opaque pointer to host data. + + The plugin MUST pass this to any call to functions in this struct. + Otherwise, it must not be interpreted in any way. + */ + LV2_URI_Map_Callback_Data callback_data; + + /** + Get the numeric ID of a URI from the host. + + @param callback_data Must be the callback_data member of this struct. + @param map The 'context' of this URI. Certain extensions may define a + URI that must be passed here with certain restrictions on the return + value (e.g. limited range). This value may be NULL if the plugin needs + an ID for a URI in general. Extensions SHOULD NOT define a context + unless there is a specific need to do so, e.g. to restrict the range of + the returned value. + @param uri The URI to be mapped to an integer ID. + + This function is referentially transparent; any number of calls with the + same arguments is guaranteed to return the same value over the life of a + plugin instance (though the same URI may return different values with a + different map parameter). However, this function is not necessarily very + fast: plugins SHOULD cache any IDs they might need in performance + critical situations. + + The return value 0 is reserved and indicates that an ID for that URI + could not be created for whatever reason. Extensions MAY define more + precisely what this means in a certain context, but in general plugins + SHOULD handle this situation as gracefully as possible. However, hosts + SHOULD NOT return 0 from this function in non-exceptional circumstances + (e.g. the URI map SHOULD be dynamic). Hosts that statically support only + a fixed set of URIs should not expect plugins to function correctly. + */ + uint32_t (*uri_to_id)(LV2_URI_Map_Callback_Data callback_data, + const char* map, + const char* uri); +} LV2_URI_Map_Feature; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_URI_MAP_H */ diff --git a/dpf/distrho/src/lv2/urid.h b/dpf/distrho/src/lv2/urid.h new file mode 100644 index 0000000..c317f7f --- /dev/null +++ b/dpf/distrho/src/lv2/urid.h @@ -0,0 +1,129 @@ +/* + Copyright 2008-2012 David Robillard + Copyright 2011 Gabriel M. Beddingfield + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file urid.h + C header for the LV2 URID extension +*/ + +#ifndef LV2_URID_H +#define LV2_URID_H + +#define LV2_URID_URI "http://lv2plug.in/ns/ext/urid" +#define LV2_URID_PREFIX LV2_URID_URI "#" + +#define LV2_URID__map LV2_URID_PREFIX "map" +#define LV2_URID__unmap LV2_URID_PREFIX "unmap" + +/* Legacy defines */ +#define LV2_URID_MAP_URI LV2_URID__map +#define LV2_URID_UNMAP_URI LV2_URID__unmap + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Opaque pointer to host data for LV2_URID_Map. +*/ +typedef void* LV2_URID_Map_Handle; + +/** + Opaque pointer to host data for LV2_URID_Unmap. +*/ +typedef void* LV2_URID_Unmap_Handle; + +/** + URI mapped to an integer. +*/ +typedef uint32_t LV2_URID; + +/** + URID Map Feature (LV2_URID__map) +*/ +typedef struct _LV2_URID_Map { + /** + Opaque pointer to host data. + + This MUST be passed to map_uri() whenever it is called. + Otherwise, it must not be interpreted in any way. + */ + LV2_URID_Map_Handle handle; + + /** + Get the numeric ID of a URI. + + If the ID does not already exist, it will be created. + + This function is referentially transparent; any number of calls with the + same arguments is guaranteed to return the same value over the life of a + plugin instance. Note, however, that several URIs MAY resolve to the + same ID if the host considers those URIs equivalent. + + This function is not necessarily very fast or RT-safe: plugins SHOULD + cache any IDs they might need in performance critical situations. + + The return value 0 is reserved and indicates that an ID for that URI + could not be created for whatever reason. However, hosts SHOULD NOT + return 0 from this function in non-exceptional circumstances (i.e. the + URI map SHOULD be dynamic). + + @param handle Must be the callback_data member of this struct. + @param uri The URI to be mapped to an integer ID. + */ + LV2_URID (*map)(LV2_URID_Map_Handle handle, + const char* uri); +} LV2_URID_Map; + +/** + URI Unmap Feature (LV2_URID__unmap) +*/ +typedef struct _LV2_URID_Unmap { + /** + Opaque pointer to host data. + + This MUST be passed to unmap() whenever it is called. + Otherwise, it must not be interpreted in any way. + */ + LV2_URID_Unmap_Handle handle; + + /** + Get the URI for a previously mapped numeric ID. + + Returns NULL if @p urid is not yet mapped. Otherwise, the corresponding + URI is returned in a canonical form. This MAY not be the exact same + string that was originally passed to LV2_URID_Map::map(), but it MUST be + an identical URI according to the URI syntax specification (RFC3986). A + non-NULL return for a given @p urid will always be the same for the life + of the plugin. Plugins that intend to perform string comparison on + unmapped URIs SHOULD first canonicalise URI strings with a call to + map_uri() followed by a call to unmap_uri(). + + @param handle Must be the callback_data member of this struct. + @param urid The ID to be mapped back to the URI string. + */ + const char* (*unmap)(LV2_URID_Unmap_Handle handle, + LV2_URID urid); +} LV2_URID_Unmap; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_URID_H */ diff --git a/dpf/distrho/src/lv2/worker.h b/dpf/distrho/src/lv2/worker.h new file mode 100644 index 0000000..fc09d55 --- /dev/null +++ b/dpf/distrho/src/lv2/worker.h @@ -0,0 +1,158 @@ +/* + Copyright 2012 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file worker.h C header for the LV2 Worker extension + . +*/ + +#ifndef LV2_WORKER_H +#define LV2_WORKER_H + +#include + +#include "lv2.h" + +#define LV2_WORKER_URI "http://lv2plug.in/ns/ext/worker" +#define LV2_WORKER_PREFIX LV2_WORKER_URI "#" + +#define LV2_WORKER__interface LV2_WORKER_PREFIX "interface" +#define LV2_WORKER__schedule LV2_WORKER_PREFIX "schedule" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + A status code for worker functions. +*/ +typedef enum { + LV2_WORKER_SUCCESS = 0, /**< Completed successfully. */ + LV2_WORKER_ERR_UNKNOWN = 1, /**< Unknown error. */ + LV2_WORKER_ERR_NO_SPACE = 2 /**< Failed due to lack of space. */ +} LV2_Worker_Status; + +typedef void* LV2_Worker_Respond_Handle; + +/** + A function to respond to run() from the worker method. + + The @p data MUST be safe for the host to copy and later pass to + work_response(), and the host MUST guarantee that it will be eventually + passed to work_response() if this function returns LV2_WORKER_SUCCESS. +*/ +typedef LV2_Worker_Status (*LV2_Worker_Respond_Function)( + LV2_Worker_Respond_Handle handle, + uint32_t size, + const void* data); + +/** + LV2 Plugin Worker Interface. + + This is the interface provided by the plugin to implement a worker method. + The plugin's extension_data() method should return an LV2_Worker_Interface + when called with LV2_WORKER__interface as its argument. +*/ +typedef struct _LV2_Worker_Interface { + /** + The worker method. This is called by the host in a non-realtime context + as requested, possibly with an arbitrary message to handle. + + A response can be sent to run() using @p respond. The plugin MUST NOT + make any assumptions about which thread calls this method, other than + the fact that there are no real-time requirements. + + @param instance The LV2 instance this is a method on. + @param respond A function for sending a response to run(). + @param handle Must be passed to @p respond if it is called. + @param size The size of @p data. + @param data Data from run(), or NULL. + */ + LV2_Worker_Status (*work)(LV2_Handle instance, + LV2_Worker_Respond_Function respond, + LV2_Worker_Respond_Handle handle, + uint32_t size, + const void* data); + + /** + Handle a response from the worker. This is called by the host in the + run() context when a response from the worker is ready. + + @param instance The LV2 instance this is a method on. + @param size The size of @p body. + @param body Message body, or NULL. + */ + LV2_Worker_Status (*work_response)(LV2_Handle instance, + uint32_t size, + const void* body); + + /** + Called when all responses for this cycle have been delivered. + + Since work_response() may be called after run() finished, this provides + a hook for code that must run after the cycle is completed. + + This field may be NULL if the plugin has no use for it. Otherwise, the + host MUST call it after every run(), regardless of whether or not any + responses were sent that cycle. + */ + LV2_Worker_Status (*end_run)(LV2_Handle instance); +} LV2_Worker_Interface; + +typedef void* LV2_Worker_Schedule_Handle; + +typedef struct _LV2_Worker_Schedule { + /** + Opaque host data. + */ + LV2_Worker_Schedule_Handle handle; + + /** + Request from run() that the host call the worker. + + This function is in the audio threading class. It should be called from + run() to request that the host call the work() method in a non-realtime + context with the given arguments. + + This function is always safe to call from run(), but it is not + guaranteed that the worker is actually called from a different thread. + In particular, when free-wheeling (e.g. for offline rendering), the + worker may be executed immediately. This allows single-threaded + processing with sample accuracy and avoids timing problems when run() is + executing much faster or slower than real-time. + + Plugins SHOULD be written in such a way that if the worker runs + immediately, and responses from the worker are delivered immediately, + the effect of the work takes place immediately with sample accuracy. + + The @p data MUST be safe for the host to copy and later pass to work(), + and the host MUST guarantee that it will be eventually passed to work() + if this function returns LV2_WORKER_SUCCESS. + + @param handle The handle field of this struct. + @param size The size of @p data. + @param data Message to pass to work(), or NULL. + */ + LV2_Worker_Status (*schedule_work)(LV2_Worker_Schedule_Handle handle, + uint32_t size, + const void* data); +} LV2_Worker_Schedule; + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* LV2_WORKER_H */ diff --git a/dpf/distrho/src/vestige/aeffectx.h b/dpf/distrho/src/vestige/aeffectx.h new file mode 100644 index 0000000..23f84f2 --- /dev/null +++ b/dpf/distrho/src/vestige/aeffectx.h @@ -0,0 +1,275 @@ +/* + * aeffectx.h - simple header to allow VeSTige compilation and eventually work + * + * Copyright (c) 2006 Javier Serrano Polo + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ +#include +#ifndef _AEFFECTX_H +#define _AEFFECTX_H + +#define CCONST(a, b, c, d)( ( ( (int) a ) << 24 ) | \ + ( ( (int) b ) << 16 ) | \ + ( ( (int) c ) << 8 ) | \ + ( ( (int) d ) << 0 ) ) + +#define audioMasterAutomate 0 +#define audioMasterVersion 1 +#define audioMasterCurrentId 2 +#define audioMasterIdle 3 +#define audioMasterPinConnected 4 +// unsupported? 5 +#define audioMasterWantMidi 6 +#define audioMasterGetTime 7 +#define audioMasterProcessEvents 8 +#define audioMasterSetTime 9 +#define audioMasterTempoAt 10 +#define audioMasterGetNumAutomatableParameters 11 +#define audioMasterGetParameterQuantization 12 +#define audioMasterIOChanged 13 +#define audioMasterNeedIdle 14 +#define audioMasterSizeWindow 15 +#define audioMasterGetSampleRate 16 +#define audioMasterGetBlockSize 17 +#define audioMasterGetInputLatency 18 +#define audioMasterGetOutputLatency 19 +#define audioMasterGetPreviousPlug 20 +#define audioMasterGetNextPlug 21 +#define audioMasterWillReplaceOrAccumulate 22 +#define audioMasterGetCurrentProcessLevel 23 +#define audioMasterGetAutomationState 24 +#define audioMasterOfflineStart 25 +#define audioMasterOfflineRead 26 +#define audioMasterOfflineWrite 27 +#define audioMasterOfflineGetCurrentPass 28 +#define audioMasterOfflineGetCurrentMetaPass 29 +#define audioMasterSetOutputSampleRate 30 +// unsupported? 31 +#define audioMasterGetSpeakerArrangement 31 // deprecated in 2.4? +#define audioMasterGetVendorString 32 +#define audioMasterGetProductString 33 +#define audioMasterGetVendorVersion 34 +#define audioMasterVendorSpecific 35 +#define audioMasterSetIcon 36 +#define audioMasterCanDo 37 +#define audioMasterGetLanguage 38 +#define audioMasterOpenWindow 39 +#define audioMasterCloseWindow 40 +#define audioMasterGetDirectory 41 +#define audioMasterUpdateDisplay 42 +#define audioMasterBeginEdit 43 +#define audioMasterEndEdit 44 +#define audioMasterOpenFileSelector 45 +#define audioMasterCloseFileSelector 46 // currently unused +#define audioMasterEditFile 47 // currently unused +#define audioMasterGetChunkFile 48 // currently unused +#define audioMasterGetInputSpeakerArrangement 49 // currently unused + +#define effFlagsHasEditor 1 +#define effFlagsCanReplacing (1 << 4) // very likely +#define effFlagsIsSynth (1 << 8) // currently unused + +#define effOpen 0 +#define effClose 1 // currently unused +#define effSetProgram 2 // currently unused +#define effGetProgram 3 // currently unused +#define effGetProgramName 5 // currently unused +#define effGetParamName 8 // currently unused +#define effSetSampleRate 10 +#define effSetBlockSize 11 +#define effMainsChanged 12 +#define effEditGetRect 13 +#define effEditOpen 14 +#define effEditClose 15 +#define effEditIdle 19 +#define effEditTop 20 +#define effProcessEvents 25 +#define effGetEffectName 45 +#define effGetVendorString 47 +#define effGetProductString 48 +#define effGetVendorVersion 49 +#define effCanDo 51 // currently unused +/* from http://asseca.com/vst-24-specs/efGetParameterProperties.html */ +#define effGetParameterProperties 56 +#define effGetVstVersion 58 // currently unused + +#define kEffectMagic (CCONST( 'V', 's', 't', 'P' )) +#define kVstLangEnglish 1 +#define kVstMidiType 1 + +struct RemoteVstPlugin; + +#define kVstTransportPlaying (1 << 1) + +#define kVstNanosValid (1 << 8) +#define kVstPpqPosValid (1 << 9) +#define kVstTempoValid (1 << 10) +#define kVstBarsValid (1 << 11) +#define kVstCyclePosValid (1 << 12) +#define kVstTimeSigValid (1 << 13) +#define kVstSmpteValid (1 << 14) +#define kVstClockValid (1 << 15) + +struct _VstMidiEvent +{ + // 00 + int type; + // 04 + int byteSize; + // 08 + int deltaFrames; + // 0c? + int flags; + // 10? + int noteLength; + // 14? + int noteOffset; + // 18 + char midiData[4]; + // 1c? + char detune; + // 1d? + char noteOffVelocity; + // 1e? + char reserved1; + // 1f? + char reserved2; +}; + +typedef struct _VstMidiEvent VstMidiEvent; + + +struct _VstEvent +{ + char dump[sizeof (VstMidiEvent)]; + +}; + +typedef struct _VstEvent VstEvent; + +struct _VstEvents +{ + // 00 + int numEvents; + // 04 + void *reserved; + // 08 + VstEvent * events[2]; +}; + +typedef struct _VstEvents VstEvents; + +/* this struct taken from http://asseca.com/vst-24-specs/efGetParameterProperties.html */ +struct _VstParameterProperties +{ + float stepFloat; + float smallStepFloat; + float largeStepFloat; + char label[64]; + int32_t flags; + int32_t minInteger; + int32_t maxInteger; + int32_t stepInteger; + int32_t largeStepInteger; + char shortLabel[8]; +}; + +typedef struct _VstParameterProperties VstParameterProperties; + +/* this enum taken from http://asseca.com/vst-24-specs/efGetParameterProperties.html */ +enum VstParameterFlags +{ + kVstParameterIsSwitch = 1 << 0, /* parameter is a switch (on/off) */ + kVstParameterUsesIntegerMinMax = 1 << 1, /* minInteger, maxInteger valid */ + kVstParameterUsesFloatStep = 1 << 2, /* stepFloat, smallStepFloat, largeStepFloat valid */ + kVstParameterUsesIntStep = 1 << 3, /* stepInteger, largeStepInteger valid */ + kVstParameterSupportsDisplayIndex = 1 << 4, /* displayIndex valid */ + kVstParameterSupportsDisplayCategory = 1 << 5, /* category, etc. valid */ + kVstParameterCanRamp = 1 << 6 /* set if parameter value can ramp up/down */ +}; + +struct _AEffect +{ + // Never use virtual functions!!! + // 00-03 + int magic; + // dispatcher 04-07 + intptr_t (* dispatcher) (struct _AEffect *, int, int, intptr_t, void *, float); + // process, quite sure 08-0b + void (* process) (struct _AEffect *, float **, float **, int); + // setParameter 0c-0f + void (* setParameter) (struct _AEffect *, int, float); + // getParameter 10-13 + float (* getParameter) (struct _AEffect *, int); + // programs 14-17 + int numPrograms; + // Params 18-1b + int numParams; + // Input 1c-1f + int numInputs; + // Output 20-23 + int numOutputs; + // flags 24-27 + int flags; + // Fill somewhere 28-2b + void *ptr1; + void *ptr2; + // Zeroes 2c-2f 30-33 34-37 38-3b + char empty3[4 + 4 + 4]; + // 1.0f 3c-3f + float unkown_float; + // An object? pointer 40-43 + void *ptr3; + // Zeroes 44-47 + void *user; + // Id 48-4b + int32_t uniqueID; + // Don't know 4c-4f + char unknown1[4]; + // processReplacing 50-53 + void (* processReplacing) (struct _AEffect *, float **, float **, int); +}; + +typedef struct _AEffect AEffect; + +typedef struct _VstTimeInfo +{ + /* info from online documentation of VST provided by Steinberg */ + + double samplePos; + double sampleRate; + double nanoSeconds; + double ppqPos; + double tempo; + double barStartPos; + double cycleStartPos; + double cycleEndPos; + int32_t timeSigNumerator; + int32_t timeSigDenominator; + int32_t smpteOffset; + int32_t smpteFrameRate; + int32_t samplesToNextClock; + int32_t flags; + +} VstTimeInfo; + +typedef intptr_t (* audioMasterCallback) (AEffect *, int32_t, int32_t, intptr_t, void *, float); + +#endif diff --git a/dpf/dpf.doxygen b/dpf/dpf.doxygen new file mode 100644 index 0000000..2dfa18d --- /dev/null +++ b/dpf/dpf.doxygen @@ -0,0 +1,302 @@ +# Doxyfile 1.7.6.1 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "DISTRHO Plugin Framework" +PROJECT_NUMBER = +PROJECT_BRIEF = +PROJECT_LOGO = +OUTPUT_DIRECTORY = docs +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 4 +ALIASES = +TCL_SUBST = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +EXTENSION_MAPPING = +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = NO +TYPEDEF_HIDES_STRUCT = YES +SYMBOL_CACHE_SIZE = 0 +LOOKUP_CACHE_SIZE = 0 +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = YES +EXTRACT_ANON_NSPACES = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +FORCE_LOCAL_INCLUDES = NO +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +SORT_BRIEF_DOCS = NO +SORT_MEMBERS_CTORS_1ST = NO +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = NO +SHOW_FILES = YES +SHOW_NAMESPACES = YES +FILE_VERSION_FILTER = +LAYOUT_FILE = +CITE_BIB_FILES = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = distrho distrho/extra dgl +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = +RECURSIVE = NO +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = NO +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = . +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_EXTRA_FILES = +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 80 +HTML_TIMESTAMP = YES +HTML_ALIGN_MEMBERS = YES +HTML_DYNAMIC_SECTIONS = NO +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_NAME = Publisher +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +CHM_INDEX_ENCODING = +BINARY_TOC = NO +TOC_EXPAND = NO +GENERATE_QHP = NO +QCH_FILE = +QHP_NAMESPACE = org.doxygen.Project +QHP_VIRTUAL_FOLDER = doc +QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = +QHG_LOCATION = +GENERATE_ECLIPSEHELP = NO +ECLIPSE_DOC_ID = org.doxygen.Project +DISABLE_INDEX = NO +GENERATE_TREEVIEW = NO +ENUM_VALUES_PER_LINE = 4 +USE_INLINE_TREES = NO +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +FORMULA_FONTSIZE = 10 +FORMULA_TRANSPARENT = YES +USE_MATHJAX = NO +MATHJAX_RELPATH = http://www.mathjax.org/mathjax +MATHJAX_EXTENSIONS = +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4 +EXTRA_PACKAGES = +LATEX_HEADER = +LATEX_FOOTER = +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +LATEX_SOURCE_CODE = NO +LATEX_BIB_STYLE = plain +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = DOXYGEN \ + DISTRHO_PLUGIN_NAME="Plugin Name" \ + DISTRHO_PLUGIN_NUM_INPUTS=2 \ + DISTRHO_PLUGIN_NUM_OUTPUTS=2 \ + DISTRHO_PLUGIN_URI="urn:distrho:name" \ + DISTRHO_PLUGIN_HAS_UI=1 \ + DISTRHO_PLUGIN_IS_RT_SAFE=1 \ + DISTRHO_PLUGIN_IS_SYNTH=1 \ + DISTRHO_PLUGIN_WANT_DIRECT_ACCESS=1 \ + DISTRHO_PLUGIN_WANT_LATENCY=1 \ + DISTRHO_PLUGIN_WANT_MIDI_INPUT=1 \ + DISTRHO_PLUGIN_WANT_MIDI_OUTPUT=1 \ + DISTRHO_PLUGIN_WANT_PROGRAMS=1 \ + DISTRHO_PLUGIN_WANT_STATE=1 \ + DISTRHO_PLUGIN_WANT_TIMEPOS=1 \ + DISTRHO_UI_USE_NANOVG=1 +EXPAND_AS_DEFINED = YES +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = YES +MSCGEN_PATH = +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = NO +DOT_NUM_THREADS = 0 +DOT_FONTNAME = Helvetica +DOT_FONTSIZE = 10 +DOT_FONTPATH = +CLASS_GRAPH = YES +COLLABORATION_GRAPH = YES +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +CALLER_GRAPH = NO +GRAPHICAL_HIERARCHY = YES +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +INTERACTIVE_SVG = NO +DOT_PATH = +DOTFILE_DIRS = +MSCFILE_DIRS = +DOT_GRAPH_MAX_NODES = 50 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = YES +GENERATE_LEGEND = YES +DOT_CLEANUP = YES diff --git a/dpf/dpf.kdev4 b/dpf/dpf.kdev4 new file mode 100644 index 0000000..86f9a94 --- /dev/null +++ b/dpf/dpf.kdev4 @@ -0,0 +1,9 @@ +[Project] +Manager=KDevGenericManager +Name=DPF + +[Filters] +Excludes=*/.*,*/*~,*/*.a + +[Project] +VersionControlSupport=kdevgit diff --git a/dpf/lac/2014-small-talk.odp b/dpf/lac/2014-small-talk.odp new file mode 100644 index 0000000..536ccc5 Binary files /dev/null and b/dpf/lac/2014-small-talk.odp differ diff --git a/dpf/utils/README-DPF-Windows.txt b/dpf/utils/README-DPF-Windows.txt new file mode 100644 index 0000000..96beb53 --- /dev/null +++ b/dpf/utils/README-DPF-Windows.txt @@ -0,0 +1,13 @@ +###################################### +## Generic README for DISTRHO Plugins + +This folder contains audio plugins downloaded from http://distrho.sourceforge.net/plugins + +The included *.lv2 folder is an LV2 bundle and the *.dll file is a VST. +Check your host documentation to know where to place these files. +Note that most hosts support VST but not LV2. + + +If your host is not listing these plugins, make sure the binaries you downloaded match your host architecture. +32bit plugins go into 32bit hosts, same for 64bit. +Some hosts are able to load plugins with different architecture, but that's the exception rather than the rule. diff --git a/dpf/utils/generate-ttl.sh b/dpf/utils/generate-ttl.sh new file mode 100755 index 0000000..dc7de63 --- /dev/null +++ b/dpf/utils/generate-ttl.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -e + +if [ -d bin ]; then + cd bin +else + echo "Please run this script from the source root folder" + exit +fi + +PWD=`dirname $0` + +if [ -f $PWD/lv2_ttl_generator.exe ]; then + GEN=$PWD/lv2_ttl_generator.exe + EXT=dll +else + GEN=$PWD/lv2_ttl_generator + if [ -d /Library/Audio ]; then + EXT=dylib + else + EXT=so + fi +fi + +FOLDERS=`find . -type d -name \*.lv2` + +for i in $FOLDERS; do + cd $i + FILE=`ls *.$EXT | sort | head -n 1` + $GEN ./$FILE + cd .. +done diff --git a/dpf/utils/generate-vst-bundles.sh b/dpf/utils/generate-vst-bundles.sh new file mode 100755 index 0000000..4ff14b6 --- /dev/null +++ b/dpf/utils/generate-vst-bundles.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -e + +if [ -d bin ]; then + cd bin +else + echo "Please run this script from the root folder" + exit +fi + +PWD=`pwd` + +if [ ! -d /System/Library ]; then + echo "This doesn't seem to be OSX, please stop!" + exit 0 +fi + +rm -rf *.vst/ + +PLUGINS=`ls | grep vst.dylib` + +for i in $PLUGINS; do + FILE=`echo $i | awk 'sub("-vst.dylib","")'` + cp -r ../dpf/utils/plugin.vst/ $FILE.vst + mv $i $FILE.vst/Contents/MacOS/$FILE + rm -f $FILE.vst/Contents/MacOS/deleteme + sed -i -e "s/X-PROJECTNAME-X/$FILE/" $FILE.vst/Contents/Info.plist + rm -f $FILE.vst/Contents/Info.plist-e + SetFile -a B $FILE.vst +done + +cd .. diff --git a/dpf/utils/lv2-ttl-generator/GNUmakefile b/dpf/utils/lv2-ttl-generator/GNUmakefile new file mode 100644 index 0000000..80209c2 --- /dev/null +++ b/dpf/utils/lv2-ttl-generator/GNUmakefile @@ -0,0 +1,19 @@ +#!/usr/bin/makefile -f + +all: build + +ifeq ($(WIN32),true) +build: ../lv2_ttl_generator.exe +else +build: ../lv2_ttl_generator +endif + +../lv2_ttl_generator: lv2_ttl_generator.c + $(CC) lv2_ttl_generator.c -o ../lv2_ttl_generator -ldl + +../lv2_ttl_generator.exe: lv2_ttl_generator.c + $(CC) lv2_ttl_generator.c -o ../lv2_ttl_generator.exe -static + touch ../lv2_ttl_generator + +clean: + rm -f ../lv2_ttl_generator ../lv2_ttl_generator.exe diff --git a/dpf/utils/lv2-ttl-generator/lv2_ttl_generator.c b/dpf/utils/lv2-ttl-generator/lv2_ttl_generator.c new file mode 100644 index 0000000..5ef2b14 --- /dev/null +++ b/dpf/utils/lv2-ttl-generator/lv2_ttl_generator.c @@ -0,0 +1,89 @@ +/* + * DPF LV2 *.ttl generator + */ + +#include +#include + +#ifdef _WIN32 + #include + #define TTL_GENERATOR_WINDOWS +#else + #include +#endif + +#ifndef nullptr + #define nullptr (0) +#endif + +typedef void (*TTL_Generator_Function)(const char* basename); + +int main(int argc, char* argv[]) +{ + if (argc != 2) + { + printf("usage: %s /path/to/plugin-DLL\n", argv[0]); + return 1; + } + +#ifdef TTL_GENERATOR_WINDOWS + const HMODULE handle = LoadLibraryA(argv[1]); +#else + void* const handle = dlopen(argv[1], RTLD_LAZY); +#endif + + if (! handle) + { +#ifdef TTL_GENERATOR_WINDOWS + printf("Failed to open plugin DLL\n"); +#else + printf("Failed to open plugin DLL, error was:\n%s\n", dlerror()); +#endif + return 2; + } + +#ifdef TTL_GENERATOR_WINDOWS + const TTL_Generator_Function ttlFn = (TTL_Generator_Function)GetProcAddress(handle, "lv2_generate_ttl"); +#else + const TTL_Generator_Function ttlFn = (TTL_Generator_Function)dlsym(handle, "lv2_generate_ttl"); +#endif + + if (ttlFn != NULL) + { + char basename[strlen(argv[1])+1]; + +#ifdef TTL_GENERATOR_WINDOWS + char* base2 = strrchr(argv[1], '\\'); +#else + char* base2 = strrchr(argv[1], '/'); +#endif + if (base2 != NULL) + { + strcpy(basename, base2+1); + basename[strrchr(base2, '.')-base2-1] = '\0'; + } + else if (argv[1][0] == '.' && argv[1][1] == '/') + { + strcpy(basename, argv[1]+2); + basename[strrchr(basename, '.')-basename] = '\0'; + } + else + { + strcpy(basename, argv[1]); + } + + printf("Generate ttl data for '%s', basename: '%s'\n", argv[1], basename); + + ttlFn(basename); + } + else + printf("Failed to find 'lv2_generate_ttl' function\n"); + +#ifdef TTL_GENERATOR_WINDOWS + FreeLibrary(handle); +#else + dlclose(handle); +#endif + + return 0; +} diff --git a/dpf/utils/pack-win-dlls.sh b/dpf/utils/pack-win-dlls.sh new file mode 100755 index 0000000..4660f30 --- /dev/null +++ b/dpf/utils/pack-win-dlls.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +set -e + +# -------------------------------------------------------------------------------------------------------------------------------- +# extract debs and pack them + +function compressFolderAsZip() { +rm -f "$1.zip" +zip -X -r "$1" "$1" +rm -r "$1" +} + +# -------------------------------------------------------------------------------------------------------------------------------- + +if [ "$1" == "" ]; then +echo Missing argument +exit +fi + +# -------------------------------------------------------------------------------------------------------------------------------- + +cd bin + +mkdir -p tmp +rm -rf tmp/* + +NAME="$1" + +_mingw32-build make -C .. clean +_mingw32-build make -C .. +for i in `ls *-vst.dll`; do mv $i `echo $i | awk 'sub("-vst","")'`; done +rm -rf *ladspa* *dssi* *vst* +mkdir -p "$NAME-win32bit" +mv *.dll *.lv2/ "$NAME-win32bit" +cp "../dpf/utils/README-DPF-Windows.txt" "$NAME-win32bit/README.txt" +compressFolderAsZip "$NAME-win32bit" +rm -rf tmp/* + +_mingw64-build make -C .. clean +_mingw64-build make -C .. +for i in `ls *-vst.dll`; do mv $i `echo $i | awk 'sub("-vst","")'`; done +rm -rf *ladspa* *dssi* *vst* +mkdir -p "$NAME-win64bit" +mv *.dll *.lv2/ "$NAME-win64bit" +cp "../dpf/utils/README-DPF-Windows.txt" "$NAME-win64bit/README.txt" +compressFolderAsZip "$NAME-win64bit" +rm -rf tmp/* + +_mingw64-build make -C .. clean + +cd .. + +# -------------------------------------------------------------------------------------------------------------------------------- diff --git a/dpf/utils/plugin.vst/Contents/Info.plist b/dpf/utils/plugin.vst/Contents/Info.plist new file mode 100644 index 0000000..df723b5 --- /dev/null +++ b/dpf/utils/plugin.vst/Contents/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + X-PROJECTNAME-X + CFBundleIconFile + + CFBundleIdentifier + net.sf.distrho.X-PROJECTNAME-X + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + CSResourcesFileMapped + + + diff --git a/dpf/utils/plugin.vst/Contents/MacOS/deleteme b/dpf/utils/plugin.vst/Contents/MacOS/deleteme new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/dpf/utils/plugin.vst/Contents/MacOS/deleteme @@ -0,0 +1 @@ + diff --git a/dpf/utils/plugin.vst/Contents/PkgInfo b/dpf/utils/plugin.vst/Contents/PkgInfo new file mode 100644 index 0000000..43c9cb0 --- /dev/null +++ b/dpf/utils/plugin.vst/Contents/PkgInfo @@ -0,0 +1 @@ +BNDL???? diff --git a/dpf/utils/plugin.vst/Contents/Resources/empty.lproj b/dpf/utils/plugin.vst/Contents/Resources/empty.lproj new file mode 100644 index 0000000..e69de29 diff --git a/dpf/utils/png2rgba.py b/dpf/utils/png2rgba.py new file mode 100755 index 0000000..7d992b4 --- /dev/null +++ b/dpf/utils/png2rgba.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python + +import os, numpy, sys +import Image + +# ----------------------------------------------------- + +formats = { + 2: "GL_LUMINANCE", + 3: "GL_BGR", + 4: "GL_BGRA" +} + +def png2rgba(namespace, filenames): + + fdH = open("%s.hpp" % namespace, "w") + fdH.write("/* (Auto-generated binary data file). */\n") + fdH.write("\n") + fdH.write("#ifndef BINARY_%s_HPP\n" % namespace.upper()) + fdH.write("#define BINARY_%s_HPP\n" % namespace.upper()) + fdH.write("\n") + fdH.write("namespace %s\n" % namespace) + fdH.write("{\n") + + fdC = open("%s.cpp" % namespace, "w") + fdC.write("/* (Auto-generated binary data file). */\n") + fdC.write("\n") + fdC.write("#include \"%s.hpp\"\n" % namespace) + fdC.write("\n") + + tempIndex = 1 + + for filename in filenames: + shortFilename = filename.rsplit(os.sep, 1)[-1].split(".", 1)[0] + shortFilename = shortFilename.replace("-", "_") + + png = Image.open(filename) + pngNumpy = numpy.array(png) + pngData = pngNumpy.tolist() + #pngData.reverse() + + height = len(pngData) + for dataBlock in pngData: + width = len(dataBlock) + if isinstance(dataBlock[0], int): + channels = 2 + else: + channels = len(dataBlock[0]) + break + else: + print("Invalid image found, cannot continue!") + quit() + + if channels not in formats.keys(): + print("Invalid image channel count, cannot continue!") + quit() + + print("Generating data for \"%s\" using '%s' type" % (filename, formats[channels])) + #print(" Width: %i" % width) + #print(" Height: %i" % height) + #print(" DataSize: %i" % (width * height * channels)) + + fdH.write(" extern const char* %sData;\n" % shortFilename) + fdH.write(" const unsigned int %sDataSize = %i;\n" % (shortFilename, width * height * channels)) + fdH.write(" const unsigned int %sWidth = %i;\n" % (shortFilename, width)) + fdH.write(" const unsigned int %sHeight = %i;\n" % (shortFilename, height)) + + if tempIndex != len(filenames): + fdH.write("\n") + + fdC.write("static const unsigned char temp_%s_%i[] = {\n" % (shortFilename, tempIndex)) + + curColumn = 1 + fdC.write(" ") + + for dataBlock in pngData: + if curColumn == 0: + fdC.write(" ") + + for data in dataBlock: + if channels == 2: + fdC.write(" %3u," % data) + + elif channels == 3: + r, g, b = data + fdC.write(" %3u, %3u, %3u," % (b, g, r)) + + else: + r, g, b, a = data + + if filename in ("artwork/claw1.png", + "artwork/claw2.png", + "artwork/run1.png", + "artwork/run2.png", + "artwork/run3.png", + "artwork/run4.png", + "artwork/scratch1.png", + "artwork/scratch2.png", + "artwork/sit.png", + "artwork/tail.png"): + if r == 255: + a -= 38 + if a < 0: a = 0 + #a = 0 + #else: + #r = g = b = 255 + + fdC.write(" %3u, %3u, %3u, %3u," % (b, g, r, a)) + + if curColumn > 20: + fdC.write("\n ") + curColumn = 1 + else: + curColumn += 1 + + fdC.write("};\n") + fdC.write("const char* %s::%sData = (const char*)temp_%s_%i;\n" % (namespace, shortFilename, shortFilename, tempIndex)) + + if tempIndex != len(filenames): + fdC.write("\n") + + tempIndex += 1 + + fdH.write("}\n") + fdH.write("\n") + fdH.write("#endif // BINARY_%s_HPP\n" % namespace.upper()) + fdH.write("\n") + fdH.close() + + fdC.write("\n") + fdC.close() + +# ----------------------------------------------------- + +if __name__ == '__main__': + if len(sys.argv) != 3: + print("Usage: %s " % sys.argv[0]) + quit() + + namespace = sys.argv[1] + artFolder = sys.argv[2] + + if not os.path.exists(artFolder): + print("Folder '%s' does not exist" % artFolder) + quit() + + # find png files + pngFiles = [] + + for root, dirs, files in os.walk(artFolder): + for name in [name for name in files if name.lower().endswith(".png")]: + pngFiles.append(os.path.join(root, name)) + + pngFiles.sort() + + # create code now + png2rgba(namespace, pngFiles)