diff --git a/include/xlnt/cell/cell.hpp b/include/xlnt/cell/cell.hpp index 49ed6402..89fedffc 100644 --- a/include/xlnt/cell/cell.hpp +++ b/include/xlnt/cell/cell.hpp @@ -172,7 +172,48 @@ public: /// bool has_hyperlink() const; - // style + // computed format + + /// + /// For each of alignment, border, fill, font, number format, and protection, + /// returns a format using the value from the cell format if that value is + /// applied, or else the value from the named style if that value is applied, + /// or else the default value. This is used to retreive the formatting of the cell + /// as it will be displayed in an editing application. + /// + format get_computed_format() const; + + /// + /// Returns the result of get_computed_format().get_alignment(). + /// + alignment get_computed_alignment() const; + + /// + /// Returns the result of get_computed_format().get_border(). + /// + border get_computed_border() const; + + /// + /// Returns the result of get_computed_format().get_fill(). + /// + fill get_computed_fill() const; + + /// + /// Returns the result of get_computed_format().get_font(). + /// + font get_computed_font() const; + + /// + /// Returns the result of get_computed_format().get_number_format(). + /// + number_format get_computed_number_format() const; + + /// + /// Returns the result of get_computed_format().get_protection(). + /// + protection get_computed_protection() const; + + // format /// /// Return true if this cell has had a format applied to it. @@ -181,100 +222,145 @@ public: /// /// Return a reference to the format applied to this cell. + /// If this cell has no format, an invalid_attribute exception will be thrown. /// - format &get_format(); - - /// - /// Return a reference to the format applied to this cell. - /// - const format &get_format() const; + format get_format() const; + /// + /// Applies the cell-level formatting of new_format to this cell. + /// void set_format(const format &new_format); - - void set_format_id(std::size_t format_id); + /// + /// Remove the cell-level formatting from this cell. + /// This doesn't affect the style that may also be applied to the cell. + /// Throws an invalid_attribute exception if no format is applied. + /// void clear_format(); - - // style /// - /// Return true if this cell has had a format applied to it. - /// - bool has_style() const; - - /// - /// Return a reference to the format applied to this cell. - /// - const style &get_style() const; - - void set_style(const style &new_style); - - void set_style(const std::string &style_name); - - void clear_style(); - - /// - /// Return the number format of this cell. + /// Returns the number format of this cell. /// const number_format &get_number_format() const; + /// + /// Creates a new format in the workbook, sets its number_format + /// to the given format, and applies the format to this cell. + /// void set_number_format(const number_format &format); /// - /// Return the font applied to the text in this cell. + /// Returns the font applied to the text in this cell. /// const font &get_font() const; + /// + /// Creates a new format in the workbook, sets its font + /// to the given font, and applies the format to this cell. + /// void set_font(const font &font_); /// - /// Return the fill applied to this cell. + /// Returns the fill applied to this cell. /// const fill &get_fill() const; + /// + /// Creates a new format in the workbook, sets its fill + /// to the given fill, and applies the format to this cell. + /// void set_fill(const fill &fill_); /// - /// Return the border of this cell. + /// Returns the border of this cell. /// const border &get_border() const; + /// + /// Creates a new format in the workbook, sets its border + /// to the given border, and applies the format to this cell. + /// void set_border(const border &border_); /// - /// Return the alignment of the text in this cell. + /// Returns the alignment of the text in this cell. /// const alignment &get_alignment() const; + /// + /// Creates a new format in the workbook, sets its alignment + /// to the given alignment, and applies the format to this cell. + /// void set_alignment(const alignment &alignment_); /// - /// Return the protection of this cell. + /// Returns the protection of this cell. /// const protection &get_protection() const; + /// + /// Creates a new format in the workbook, sets its protection + /// to the given protection, and applies the format to this cell. + /// void set_protection(const protection &protection_); - // comment + // style - /// - /// Return the comment of this cell. - /// - comment get_comment(); + /// + /// Returns true if this cell has had a style applied to it. + /// + bool has_style() const; - /// - /// Return the comment of this cell. - /// - const comment get_comment() const; + /// + /// Returns a reference to the named style applied to this cell. + /// + style get_style() const; - void set_comment(const comment &comment); - void clear_comment(); - bool has_comment() const; + /// + /// Returns the name of the style applied to this cell. + /// + std::string get_style_name() const; + + /// + /// Equivalent to set_style(new_style.name()) + /// + void set_style(const style &new_style); + + /// + /// Sets the named style applied to this cell to a style named style_name. + /// If this style has not been previously created in the workbook, a + /// key_not_found exception will be thrown. + /// + void set_style(const std::string &style_name); + + /// + /// Removes the named style from this cell. + /// An invalid_attribute exception will be thrown if this cell has no style. + /// This will not affect the cell format of the cell. + /// + void clear_style(); // formula + + /// + /// Returns the string representation of the formula applied to this cell. + /// std::string get_formula() const; + + /// + /// Sets the formula of this cell to the given value. + /// This formula string should begin with '='. + /// void set_formula(const std::string &formula); + + /// + /// Removes the formula from this cell. After this is called, has_formula() will return false. + /// void clear_formula(); + + /// + /// Returns true if this cell has had a formula applied to it. + /// bool has_formula() const; // printing @@ -384,8 +470,6 @@ public: friend XLNT_FUNCTION std::ostream &operator<<(std::ostream &stream, const xlnt::cell &cell); private: - std::size_t get_format_id() const; - // make these friends so they can use the private constructor friend class style; friend class worksheet; @@ -393,8 +477,18 @@ private: friend class detail::xlsx_producer; friend struct detail::cell_impl; + /// + /// Helper function to guess the type of a string, convert it, + /// and then use the correct cell::get_value according to the type. + /// void guess_type_and_set_value(const std::string &value); + /// + /// Returns a non-const reference to the format of this cell. + /// This is for internal use only. + /// + format &get_format(); + /// /// Private constructor to create a cell from its implementation. /// diff --git a/include/xlnt/cell/index_types.hpp b/include/xlnt/cell/index_types.hpp index 2b66c903..1b4f5f70 100644 --- a/include/xlnt/cell/index_types.hpp +++ b/include/xlnt/cell/index_types.hpp @@ -54,7 +54,7 @@ public: /// /// Excel only supports 1 - 3 letter column names from A->ZZZ, so we /// restrict our column names to 1 - 3 characters, each in the range A - Z. - /// Strings outside this range and malformed strings will throw xlnt::column_string_index_exception. + /// Strings outside this range and malformed strings will throw column_string_index_exception. /// static index_t column_index_from_string(const std::string &column_string); diff --git a/include/xlnt/cell/text_run.hpp b/include/xlnt/cell/text_run.hpp index a7dba081..823182f5 100644 --- a/include/xlnt/cell/text_run.hpp +++ b/include/xlnt/cell/text_run.hpp @@ -63,11 +63,11 @@ public: private: std::string string_; - std::experimental::optional size_; - std::experimental::optional color_; - std::experimental::optional font_; - std::experimental::optional family_; - std::experimental::optional scheme_; + optional size_; + optional color_; + optional font_; + optional family_; + optional scheme_; }; } // namespace xlnt diff --git a/include/xlnt/styles/alignment.hpp b/include/xlnt/styles/alignment.hpp index 218e418e..d82be6f1 100644 --- a/include/xlnt/styles/alignment.hpp +++ b/include/xlnt/styles/alignment.hpp @@ -28,6 +28,7 @@ #include #include #include +#include namespace xlnt { @@ -37,36 +38,40 @@ namespace xlnt { class XLNT_CLASS alignment : public hashable { public: - bool get_wrap_text() const; + optional shrink() const; - void set_wrap_text(bool wrap_text); + alignment &shrink(bool shrink_to_fit); - bool has_horizontal() const; + optional wrap() const; - horizontal_alignment get_horizontal() const; + alignment &wrap(bool wrap_text); - void set_horizontal(horizontal_alignment horizontal); + optional indent() const; - bool has_vertical() const; + alignment &indent(int indent_size); - vertical_alignment get_vertical() const; + optional rotation() const; - void set_vertical(vertical_alignment vertical); - - void set_shrink_to_fit(bool shrink_to_fit); - - bool get_shrink_to_fit() const; + alignment &rotation(bool text_rotation); + + optional horizontal() const; + + alignment &horizontal(horizontal_alignment horizontal); + + optional vertical() const; + + alignment &vertical(vertical_alignment vertical); protected: std::string to_hash_string() const override; private: - horizontal_alignment horizontal_ = horizontal_alignment::general; - vertical_alignment vertical_ = vertical_alignment::bottom; - int text_rotation_ = 0; - bool wrap_text_ = false; - bool shrink_to_fit_ = false; - int indent_ = 0; + optional shrink_to_fit_; + optional wrap_text_; + optional indent_; + optional text_rotation_; + optional horizontal_; + optional vertical_; }; } // namespace xlnt diff --git a/include/xlnt/styles/base_format.hpp b/include/xlnt/styles/base_format.hpp index 09f7cd9f..e53eaf9e 100644 --- a/include/xlnt/styles/base_format.hpp +++ b/include/xlnt/styles/base_format.hpp @@ -33,8 +33,6 @@ namespace xlnt { -class cell; - /// /// Describes the formatting of a particular cell. /// diff --git a/include/xlnt/styles/border.hpp b/include/xlnt/styles/border.hpp index ffdfccdd..cd206fb8 100644 --- a/include/xlnt/styles/border.hpp +++ b/include/xlnt/styles/border.hpp @@ -34,6 +34,7 @@ #include #include #include +#include namespace xlnt { @@ -50,19 +51,6 @@ enum class XLNT_CLASS border_side } // namespace xlnt -namespace std { - -template<> -struct hash -{ - size_t operator()(const xlnt::border_side &k) const - { - return static_cast(k); - } -}; - -} // namepsace std - namespace xlnt { /// @@ -71,44 +59,44 @@ namespace xlnt { class XLNT_CLASS border : public hashable { public: - using side = border_side; - class XLNT_CLASS border_property { public: - bool has_color() const; - const color &get_color() const; - void set_color(const color &c); + optional color() const; + border_property &color(const xlnt::color &c); - bool has_style() const; - border_style get_style() const; - void set_style(border_style style); + optional style() const; + border_property &style(border_style style); private: - bool has_color_ = false; - color color_ = color::black(); - - bool has_style_ = false; - border_style style_; + optional color_; + optional style_; }; - static const std::vector> &get_side_names(); + static const std::vector &all_sides(); border(); - bool has_side(side s) const; - const border_property &get_side(side s) const; - void set_side(side s, const border_property &prop); + optional side(border_side s) const; + border &side(border_side s, const border_property &prop); + + optional diagonal() const; + border &diagonal(diagonal_direction dir); protected: std::string to_hash_string() const override; private: - std::unordered_map sides_; - /* - bool outline_ = true; - diagonal_direction diagonal_direction_ = diagonal_direction::neither; - */ + optional start_; + optional end_; + optional top_; + optional bottom_; + optional vertical_; + optional horizontal_; + optional diagonal_; + + //bool outline_ = true; + optional diagonal_direction_; }; } // namespace xlnt diff --git a/include/xlnt/styles/fill.hpp b/include/xlnt/styles/fill.hpp index c6a24bd0..a7cffb01 100644 --- a/include/xlnt/styles/fill.hpp +++ b/include/xlnt/styles/fill.hpp @@ -31,114 +31,115 @@ namespace xlnt { +enum class XLNT_CLASS pattern_fill_type +{ + none, + solid, + mediumgray, + darkgray, + lightgray, + darkhorizontal, + darkvertical, + darkdown, + darkup, + darkgrid, + darktrellis, + lighthorizontal, + lightvertical, + lightdown, + lightup, + lightgrid, + lighttrellis, + gray125, + gray0625 +}; + class XLNT_CLASS pattern_fill : public hashable { public: - enum class type - { - none, - solid, - mediumgray, - darkgray, - lightgray, - darkhorizontal, - darkvertical, - darkdown, - darkup, - darkgrid, - darktrellis, - lighthorizontal, - lightvertical, - lightdown, - lightup, - lightgrid, - lighttrellis, - gray125, - gray0625 - }; - pattern_fill(); - pattern_fill(type pattern_type); + pattern_fill_type type() const; - type get_type() const; + pattern_fill &type(pattern_fill_type new_type); - void set_type(type pattern_type); + optional foreground() const; - void set_foreground_color(const color &c); - - std::experimental::optional &get_foreground_color(); - - const std::experimental::optional &get_foreground_color() const; + pattern_fill &foreground(const color &foreground); - void set_background_color(const color &c); + optional background() const; - std::experimental::optional &get_background_color(); - - const std::experimental::optional &get_background_color() const; + pattern_fill &background(const color &background); protected: std::string to_hash_string() const override; private: - type type_ = type::none; + pattern_fill_type type_ = pattern_fill_type::none; - std::experimental::optional foreground_color_; - std::experimental::optional background_color_; + optional foreground_; + optional background_; +}; + +enum class XLNT_CLASS gradient_fill_type +{ + linear, + path }; class XLNT_CLASS gradient_fill : public hashable { public: - enum class type - { - linear, - path - }; - gradient_fill(); - gradient_fill(type gradient_type); + gradient_fill_type type() const; - type get_type() const; + // Type + gradient_fill &type(gradient_fill_type new_type); - void set_type(type gradient_type); + // Degree - void set_degree(double degree); + gradient_fill °ree(double degree); - double get_degree() const; + double degree() const; - double get_gradient_left() const; + // Left - void set_gradient_left(double value); + double left() const; - double get_gradient_right() const; + gradient_fill &left(double value); - void set_gradient_right(double value); + // Right - double get_gradient_top() const; + double right() const; - void set_gradient_top(double value); + gradient_fill &right(double value); - double get_gradient_bottom() const; + // Top - void set_gradient_bottom(double value); + double top() const; - void add_stop(double position, color stop_color); + gradient_fill &top(double value); - void delete_stop(double position); + // Bottom - void clear_stops(); + double bottom() const; + + gradient_fill &bottom(double value); + + // Stops + + gradient_fill &add_stop(double position, color stop_color); + + gradient_fill &clear_stops(); - const std::unordered_map &get_stops() const; + std::unordered_map stops() const; protected: std::string to_hash_string() const override; private: - type type_ = type::linear; - - std::unordered_map stops_; + gradient_fill_type type_ = gradient_fill_type::linear; double degree_ = 0; @@ -146,6 +147,14 @@ private: double right_ = 0; double top_ = 0; double bottom_ = 0; + + std::unordered_map stops_; +}; + +enum class XLNT_CLASS fill_type +{ + pattern, + gradient }; /// @@ -154,33 +163,46 @@ private: class XLNT_CLASS fill : public hashable { public: - enum class type - { - pattern, - gradient - }; + /// + /// Constructs a fill initialized as a none-type pattern fill with no + /// foreground or background colors. + /// + fill(); - static fill gradient(gradient_fill::type gradient_type); + /// + /// Constructs a fill initialized as a pattern fill based on the given pattern. + /// + fill(const pattern_fill &pattern); - static fill pattern(pattern_fill::type pattern_type); + /// + /// Constructs a fill initialized as a gradient fill based on the given gradient. + /// + fill(const gradient_fill &gradient); - type get_type() const; + /// + /// Returns the fill_type of this fill depending on how it was constructed. + /// + fill_type type() const; - gradient_fill &get_gradient_fill(); + /// + /// Returns the gradient fill represented by this fill. + /// Throws an invalid_attribute exception if this is not a gradient fill. + /// + gradient_fill gradient_fill() const; - const gradient_fill &get_gradient_fill() const; - - pattern_fill &get_pattern_fill(); - - const pattern_fill &get_pattern_fill() const; + /// + /// Returns the pattern fill represented by this fill. + /// Throws an invalid_attribute exception if this is not a pattern fill. + /// + pattern_fill pattern_fill() const; protected: std::string to_hash_string() const override; private: - type type_ = type::pattern; - gradient_fill gradient_; - pattern_fill pattern_; + fill_type type_ = fill_type::pattern; + xlnt::gradient_fill gradient_; + xlnt::pattern_fill pattern_; }; } // namespace xlnt diff --git a/include/xlnt/styles/font.hpp b/include/xlnt/styles/font.hpp index b9ce5d98..a3af7f55 100644 --- a/include/xlnt/styles/font.hpp +++ b/include/xlnt/styles/font.hpp @@ -27,7 +27,7 @@ #include #include -#include +#include namespace xlnt { @@ -50,47 +50,43 @@ public: font(); - void set_bold(bool bold); + font &bold(bool bold); - bool is_bold() const; + bool bold() const; - void set_italic(bool italic); + font &italic(bool italic); - bool is_italic() const; + bool italic() const; - void set_strikethrough(bool strikethrough); + font &strikethrough(bool strikethrough); - bool is_strikethrough() const; + bool strikethrough() const; - void set_underline(underline_style new_underline); + font &underline(underline_style new_underline); - bool is_underline() const; + bool underlined() const; - underline_style get_underline() const; + underline_style underline() const; - void set_size(std::size_t size); + font &size(std::size_t size); - std::size_t get_size() const; + std::size_t size() const; - void set_name(const std::string &name); + font &name(const std::string &name); - std::string get_name() const; + std::string name() const; - void set_color(color c); + font &color(const color &c); - void set_family(std::size_t family); + optional color() const; - bool has_scheme() const; + font &family(std::size_t family); - void set_scheme(const std::string &scheme); + optional family() const; - std::string get_scheme() const; + font &scheme(const std::string &scheme); - color get_color() const; - - bool has_family() const; - - std::size_t get_family() const; + optional scheme() const; protected: std::string to_hash_string() const override; @@ -104,13 +100,11 @@ private: bool italic_ = false; bool superscript_ = false; bool subscript_ = false; - underline_style underline_ = underline_style::none; bool strikethrough_ = false; - color color_ = theme_color(1); - bool has_family_ = true; - std::size_t family_ = 2; - bool has_scheme_ = true; - std::string scheme_ = "minor"; + underline_style underline_ = underline_style::none; + optional color_; + optional family_; + optional scheme_; }; } // namespace xlnt diff --git a/include/xlnt/styles/format.hpp b/include/xlnt/styles/format.hpp index a8bb05f5..2ecd285c 100644 --- a/include/xlnt/styles/format.hpp +++ b/include/xlnt/styles/format.hpp @@ -1,5 +1,4 @@ // Copyright (c) 2014-2016 Thomas Fussell -// Copyright (c) 2010-2015 openpyxl // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -23,25 +22,58 @@ // @author: see AUTHORS file #pragma once -#include +#include +#include + +#include namespace xlnt { -class style; -namespace detail { struct workbook_impl; } +class alignment; +class border; +class fill; +class font; +class number_format; +class protection; + +namespace detail { +struct format_impl; +struct stylesheet; +} // namespace detail /// /// Describes the formatting of a particular cell. /// -class XLNT_CLASS format : public base_format +class XLNT_CLASS format { public: - format(); - format(const format &other); - format &operator=(const format &other); - -protected: - std::string to_hash_string() const override; + std::size_t get_id() const; + + alignment get_alignment() const; + void set_alignment(const alignment &new_alignment); + + border get_border() const; + void set_border(const border &new_border); + + fill get_fill() const; + void set_fill(const fill &new_fill); + + font get_font() const; + void set_font(const font &new_font); + + number_format get_number_format() const; + void set_number_format(const number_format &new_number_format); + + protection get_protection() const; + void set_protection(const protection &new_protection); + + void set_style(const std::string &name); + std::string get_name() const; + +private: + friend struct detail::stylesheet; + format(detail::format_impl *d); + detail::format_impl *d_; }; } // namespace xlnt diff --git a/include/xlnt/styles/protection.hpp b/include/xlnt/styles/protection.hpp index 4f06822f..80ee259a 100644 --- a/include/xlnt/styles/protection.hpp +++ b/include/xlnt/styles/protection.hpp @@ -27,6 +27,7 @@ #include #include +#include namespace xlnt { @@ -36,14 +37,18 @@ namespace xlnt { class XLNT_CLASS protection : public hashable { public: - protection(); - protection(bool locked, bool hidden); + static protection unlocked_and_visible(); + static protection locked_and_visible(); + static protection unlocked_and_hidden(); + static protection locked_and_hidden(); - bool get_locked() const; - void set_locked(bool locked); + protection(); + + bool locked() const; + protection &locked(bool locked); - bool get_hidden() const; - void set_hidden(bool hidden); + bool hidden() const; + protection &hidden(bool hidden); protected: std::string to_hash_string() const override; diff --git a/include/xlnt/styles/style.hpp b/include/xlnt/styles/style.hpp index 9f219b0e..9a5bd840 100644 --- a/include/xlnt/styles/style.hpp +++ b/include/xlnt/styles/style.hpp @@ -30,35 +30,34 @@ namespace xlnt { -class workbook; +namespace detail { +struct style_impl; +struct stylesheet; +} /// /// Describes a style which has a name and can be applied to multiple individual /// formats. In Excel this is a "Cell Style". /// -class XLNT_CLASS style : public base_format +class XLNT_CLASS style { public: - style(); - style(const style &other); - style &operator=(const style &other); - - std::string get_name() const; - void set_name(const std::string &name); + std::string name() const; + style &name(const std::string &name); - bool get_hidden() const; - void set_hidden(bool value); - - std::size_t get_builtin_id() const; - void set_builtin_id(std::size_t builtin_id); + bool hidden() const; + style &hidden(bool value); -protected: - std::string to_hash_string() const override; + bool custom() const; + style &custom(bool value); + + std::size_t built_in_id() const; + style &built_in_id(std::size_t builtin_id); private: - std::string name_; - bool hidden_; - std::size_t builtin_id_; + friend struct detail::stylesheet; + style(detail::style_impl *d); + detail::style_impl *d_; }; } // namespace xlnt diff --git a/include/xlnt/utils/datetime.hpp b/include/xlnt/utils/datetime.hpp index dc03e23e..46ab8787 100644 --- a/include/xlnt/utils/datetime.hpp +++ b/include/xlnt/utils/datetime.hpp @@ -29,6 +29,9 @@ namespace xlnt { +struct date; +struct time; + /// /// A datetime is a combination of a date and a time. /// @@ -52,6 +55,7 @@ struct XLNT_CLASS datetime /// static datetime from_number(long double number, calendar base_date); + datetime(const date &d, const time &t); datetime(int year_, int month_, int day_, int hour_ = 0, int minute_ = 0, int second_ = 0, int microsecond_ = 0); std::string to_string() const; diff --git a/include/xlnt/utils/optional.hpp b/include/xlnt/utils/optional.hpp index 99565f50..e84a8a76 100644 --- a/include/xlnt/utils/optional.hpp +++ b/include/xlnt/utils/optional.hpp @@ -1,1042 +1,87 @@ -// Copyright (C) 2011 - 2012 Andrzej Krzemienski. -// -// Use, modification, and distribution is subject to the Boost Software -// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The idea and interface is based on Boost.Optional library -// authored by Fernando Luis Cacciola Carballal +#pragma once -# ifndef ___OPTIONAL_HPP___ -# define ___OPTIONAL_HPP___ +#include +#include -# include -# include -# include -# include -# include -# include -# include +namespace xlnt { -# define TR2_OPTIONAL_REQUIRES(...) typename enable_if<__VA_ARGS__::value, bool>::type = false - -# if defined __GNUC__ // NOTE: GNUC is also defined for Clang -# if (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8) -# define TR2_OPTIONAL_GCC_4_8_AND_HIGHER___ -# elif (__GNUC__ > 4) -# define TR2_OPTIONAL_GCC_4_8_AND_HIGHER___ -# endif -# -# if (__GNUC__ == 4) && (__GNUC_MINOR__ >= 7) -# define TR2_OPTIONAL_GCC_4_7_AND_HIGHER___ -# elif (__GNUC__ > 4) -# define TR2_OPTIONAL_GCC_4_7_AND_HIGHER___ -# endif -# -# if (__GNUC__ == 4) && (__GNUC_MINOR__ == 8) && (__GNUC_PATCHLEVEL__ >= 1) -# define TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ -# elif (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9) -# define TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ -# elif (__GNUC__ > 4) -# define TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ -# endif -# endif -# -# if defined __clang_major__ -# if (__clang_major__ == 3 && __clang_minor__ >= 5) -# define TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ -# elif (__clang_major__ > 3) -# define TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ -# endif -# if defined TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ -# define TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_ -# elif (__clang_major__ == 3 && __clang_minor__ == 4 && __clang_patchlevel__ >= 2) -# define TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_ -# endif -# endif -# -# if defined _MSC_VER -# if (_MSC_VER >= 1900) -# define TR2_OPTIONAL_MSVC_2015_AND_HIGHER___ -# endif -# endif - -# if defined __clang__ -# if (__clang_major__ > 2) || (__clang_major__ == 2) && (__clang_minor__ >= 9) -# define OPTIONAL_HAS_THIS_RVALUE_REFS 1 -# else -# define OPTIONAL_HAS_THIS_RVALUE_REFS 0 -# endif -# elif defined TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ -# define OPTIONAL_HAS_THIS_RVALUE_REFS 1 -# elif defined TR2_OPTIONAL_MSVC_2015_AND_HIGHER___ -# define OPTIONAL_HAS_THIS_RVALUE_REFS 1 -# else -# define OPTIONAL_HAS_THIS_RVALUE_REFS 0 -# endif - - -# if defined TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___ -# define OPTIONAL_HAS_CONSTEXPR_INIT_LIST 1 -# define OPTIONAL_CONSTEXPR_INIT_LIST constexpr -# else -# define OPTIONAL_HAS_CONSTEXPR_INIT_LIST 0 -# define OPTIONAL_CONSTEXPR_INIT_LIST -# endif - -# if defined TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ && (defined __cplusplus) && (__cplusplus != 201103L) -# define OPTIONAL_HAS_MOVE_ACCESSORS 1 -# else -# define OPTIONAL_HAS_MOVE_ACCESSORS 0 -# endif - -# // In C++11 constexpr implies const, so we need to make non-const members also non-constexpr -# if (defined __cplusplus) && (__cplusplus == 201103L) -# define OPTIONAL_MUTABLE_CONSTEXPR -# else -# define OPTIONAL_MUTABLE_CONSTEXPR constexpr -# endif - -namespace std{ - -namespace experimental{ - -// BEGIN workaround for missing is_trivially_destructible -# if defined TR2_OPTIONAL_GCC_4_8_AND_HIGHER___ - // leave it: it is already there -# elif defined TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_ - // leave it: it is already there -# elif defined TR2_OPTIONAL_MSVC_2015_AND_HIGHER___ - // leave it: it is already there -# elif defined TR2_OPTIONAL_DISABLE_EMULATION_OF_TYPE_TRAITS - // leave it: the user doesn't want it -# else - template - using is_trivially_destructible = std::has_trivial_destructor; -# endif -// END workaround for missing is_trivially_destructible - -# if (defined TR2_OPTIONAL_GCC_4_7_AND_HIGHER___) - // leave it; our metafunctions are already defined. -# elif defined TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_ - // leave it; our metafunctions are already defined. -# elif defined TR2_OPTIONAL_MSVC_2015_AND_HIGHER___ - // leave it: it is already there -# elif defined TR2_OPTIONAL_DISABLE_EMULATION_OF_TYPE_TRAITS - // leave it: the user doesn't want it -# else - - -// workaround for missing traits in GCC and CLANG -template -struct is_nothrow_move_constructible +template +class XLNT_CLASS optional { - constexpr static bool value = std::is_nothrow_constructible::value; -}; - - -template -struct is_assignable -{ - template - constexpr static bool has_assign(...) { return false; } - - template () = std::declval(), true)) > - // the comma operator is necessary for the cases where operator= returns void - constexpr static bool has_assign(bool) { return true; } - - constexpr static bool value = has_assign(true); -}; - - -template -struct is_nothrow_move_assignable -{ - template - struct has_nothrow_move_assign { - constexpr static bool value = false; - }; - - template - struct has_nothrow_move_assign { - constexpr static bool value = noexcept( std::declval() = std::declval() ); - }; - - constexpr static bool value = has_nothrow_move_assign::value>::value; -}; -// end workaround - - -# endif - - - -// 20.5.4, optional for object types -template class optional; - -// 20.5.5, optional for lvalue reference types -template class optional; - - -// workaround: std utility functions aren't constexpr yet -template inline constexpr T&& constexpr_forward(typename std::remove_reference::type& t) noexcept -{ - return static_cast(t); -} - -template inline constexpr T&& constexpr_forward(typename std::remove_reference::type&& t) noexcept -{ - static_assert(!std::is_lvalue_reference::value, "!!"); - return static_cast(t); -} - -template inline constexpr typename std::remove_reference::type&& constexpr_move(T&& t) noexcept -{ - return static_cast::type&&>(t); -} - - -#if defined NDEBUG -# define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR) (EXPR) -#else -# define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR) ((CHECK) ? (EXPR) : ([]{assert(!#CHECK);}(), (EXPR))) -#endif - - -namespace detail_ -{ - -// static_addressof: a constexpr version of addressof -template -struct has_overloaded_addressof -{ - template - constexpr static bool has_overload(...) { return false; } - - template ().operator&()) > - constexpr static bool has_overload(bool) { return true; } - - constexpr static bool value = has_overload(true); -}; - -template )> -constexpr T* static_addressof(T& ref) -{ - return &ref; -} - -template )> -T* static_addressof(T& ref) -{ - return std::addressof(ref); -} - - -// the call to convert(b) has return type A and converts b to type A iff b decltype(b) is implicitly convertible to A -template -U convert(U v) { return v; } - -} // namespace detail - - -constexpr struct trivial_init_t{} trivial_init{}; - - -// 20.5.6, In-place construction -constexpr struct in_place_t{} in_place{}; - - -// 20.5.7, Disengaged state indicator -struct nullopt_t -{ - struct init{}; - constexpr explicit nullopt_t(init){} -}; -constexpr nullopt_t nullopt{nullopt_t::init()}; - - -// 20.5.8, class bad_optional_access -class bad_optional_access : public logic_error { public: - explicit bad_optional_access(const string& what_arg) : logic_error{what_arg} {} - explicit bad_optional_access(const char* what_arg) : logic_error{what_arg} {} + optional() : has_value_(false) + { + } + + optional(const T &value) : has_value_(true), value_(value) + { + } + + operator bool() const + { + return is_set(); + } + + bool is_set() const + { + return has_value_; + } + + void set(const T &value) + { + has_value_ = true; + value_ = value; + } + + T &operator*() + { + return get(); + } + + const T &operator*() const + { + return get(); + } + + T *operator->() + { + return &get(); + } + + const T *operator->() const + { + return &get(); + } + + T &get() + { + if (!has_value_) + { + throw invalid_attribute(); + } + + return value_; + } + + const T &get() const + { + if (!has_value_) + { + throw invalid_attribute(); + } + + return value_; + } + + void clear() + { + has_value_ = false; + value_ = T(); + } + +private: + bool has_value_; + T value_; }; - -template -union storage_t -{ - unsigned char dummy_; - T value_; - - constexpr storage_t( trivial_init_t ) noexcept : dummy_() {}; - - template - constexpr storage_t( Args&&... args ) : value_(constexpr_forward(args)...) {} - - ~storage_t(){} -}; - - -template -union constexpr_storage_t -{ - unsigned char dummy_; - T value_; - - constexpr constexpr_storage_t( trivial_init_t ) noexcept : dummy_() {}; - - template - constexpr constexpr_storage_t( Args&&... args ) : value_(constexpr_forward(args)...) {} - - ~constexpr_storage_t() = default; -}; - - -template -struct optional_base -{ - bool init_; - storage_t storage_; - - constexpr optional_base() noexcept : init_(false), storage_(trivial_init) {}; - - explicit constexpr optional_base(const T& v) : init_(true), storage_(v) {} - - explicit constexpr optional_base(T&& v) : init_(true), storage_(constexpr_move(v)) {} - - template explicit optional_base(in_place_t, Args&&... args) - : init_(true), storage_(constexpr_forward(args)...) {} - - template >)> - explicit optional_base(in_place_t, std::initializer_list il, Args&&... args) - : init_(true), storage_(il, std::forward(args)...) {} - - ~optional_base() { if (init_) storage_.value_.T::~T(); } -}; - - -template -struct constexpr_optional_base -{ - bool init_; - constexpr_storage_t storage_; - - constexpr constexpr_optional_base() noexcept : init_(false), storage_(trivial_init) {}; - - explicit constexpr constexpr_optional_base(const T& v) : init_(true), storage_(v) {} - - explicit constexpr constexpr_optional_base(T&& v) : init_(true), storage_(constexpr_move(v)) {} - - template explicit constexpr constexpr_optional_base(in_place_t, Args&&... args) - : init_(true), storage_(constexpr_forward(args)...) {} - - template >)> - OPTIONAL_CONSTEXPR_INIT_LIST explicit constexpr_optional_base(in_place_t, std::initializer_list il, Args&&... args) - : init_(true), storage_(il, std::forward(args)...) {} - - ~constexpr_optional_base() = default; -}; - -template -using OptionalBase = typename std::conditional< - is_trivially_destructible::value, - constexpr_optional_base, - optional_base ->::type; - - - -template -class optional : private OptionalBase -{ - static_assert( !std::is_same::type, nullopt_t>::value, "bad T" ); - static_assert( !std::is_same::type, in_place_t>::value, "bad T" ); - - - constexpr bool initialized() const noexcept { return OptionalBase::init_; } - T* dataptr() { return std::addressof(OptionalBase::storage_.value_); } - constexpr const T* dataptr() const { return detail_::static_addressof(OptionalBase::storage_.value_); } - -# if OPTIONAL_HAS_THIS_RVALUE_REFS == 1 - constexpr const T& contained_val() const& { return OptionalBase::storage_.value_; } -# if OPTIONAL_HAS_MOVE_ACCESSORS == 1 - OPTIONAL_MUTABLE_CONSTEXPR T&& contained_val() && { return std::move(OptionalBase::storage_.value_); } - OPTIONAL_MUTABLE_CONSTEXPR T& contained_val() & { return OptionalBase::storage_.value_; } -# else - T& contained_val() & { return OptionalBase::storage_.value_; } - T&& contained_val() && { return std::move(OptionalBase::storage_.value_); } -# endif -# else - constexpr const T& contained_val() const { return OptionalBase::storage_.value_; } - T& contained_val() { return OptionalBase::storage_.value_; } -# endif - - void clear() noexcept { - if (initialized()) dataptr()->T::~T(); - OptionalBase::init_ = false; - } - - template - void initialize(Args&&... args) noexcept(noexcept(T(std::forward(args)...))) - { - assert(!OptionalBase::init_); - ::new (static_cast(dataptr())) T(std::forward(args)...); - OptionalBase::init_ = true; - } - - template - void initialize(std::initializer_list il, Args&&... args) noexcept(noexcept(T(il, std::forward(args)...))) - { - assert(!OptionalBase::init_); - ::new (static_cast(dataptr())) T(il, std::forward(args)...); - OptionalBase::init_ = true; - } - -public: - typedef T value_type; - - // 20.5.5.1, constructors - constexpr optional() noexcept : OptionalBase() {}; - constexpr optional(nullopt_t) noexcept : OptionalBase() {}; - - optional(const optional& rhs) - : OptionalBase() - { - if (rhs.initialized()) { - ::new (static_cast(dataptr())) T(*rhs); - OptionalBase::init_ = true; - } - } - - optional(optional&& rhs) noexcept(is_nothrow_move_constructible::value) - : OptionalBase() - { - if (rhs.initialized()) { - ::new (static_cast(dataptr())) T(std::move(*rhs)); - OptionalBase::init_ = true; - } - } - - constexpr optional(const T& v) : OptionalBase(v) {} - - constexpr optional(T&& v) : OptionalBase(constexpr_move(v)) {} - - template - explicit constexpr optional(in_place_t, Args&&... args) - : OptionalBase(in_place_t{}, constexpr_forward(args)...) {} - - template >)> - OPTIONAL_CONSTEXPR_INIT_LIST explicit optional(in_place_t, std::initializer_list il, Args&&... args) - : OptionalBase(in_place_t{}, il, constexpr_forward(args)...) {} - - // 20.5.4.2, Destructor - ~optional() = default; - - // 20.5.4.3, assignment - optional& operator=(nullopt_t) noexcept - { - clear(); - return *this; - } - - optional& operator=(const optional& rhs) - { - if (initialized() == true && rhs.initialized() == false) clear(); - else if (initialized() == false && rhs.initialized() == true) initialize(*rhs); - else if (initialized() == true && rhs.initialized() == true) contained_val() = *rhs; - return *this; - } - - optional& operator=(optional&& rhs) - noexcept(is_nothrow_move_assignable::value && is_nothrow_move_constructible::value) - { - if (initialized() == true && rhs.initialized() == false) clear(); - else if (initialized() == false && rhs.initialized() == true) initialize(std::move(*rhs)); - else if (initialized() == true && rhs.initialized() == true) contained_val() = std::move(*rhs); - return *this; - } - - template - auto operator=(U&& v) - -> typename enable_if - < - is_same::type, T>::value, - optional& - >::type - { - if (initialized()) { contained_val() = std::forward(v); } - else { initialize(std::forward(v)); } - return *this; - } - - - template - void emplace(Args&&... args) - { - clear(); - initialize(std::forward(args)...); - } - - template - void emplace(initializer_list il, Args&&... args) - { - clear(); - initialize(il, std::forward(args)...); - } - - // 20.5.4.4, Swap - void swap(optional& rhs) noexcept(is_nothrow_move_constructible::value && noexcept(swap(declval(), declval()))) - { - if (initialized() == true && rhs.initialized() == false) { rhs.initialize(std::move(**this)); clear(); } - else if (initialized() == false && rhs.initialized() == true) { initialize(std::move(*rhs)); rhs.clear(); } - else if (initialized() == true && rhs.initialized() == true) { using std::swap; swap(**this, *rhs); } - } - - // 20.5.4.5, Observers - - explicit constexpr operator bool() const noexcept { return initialized(); } - - constexpr T const* operator ->() const { - return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), dataptr()); - } - -# if OPTIONAL_HAS_MOVE_ACCESSORS == 1 - - OPTIONAL_MUTABLE_CONSTEXPR T* operator ->() { - assert (initialized()); - return dataptr(); - } - - constexpr T const& operator *() const& { - return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), contained_val()); - } - - OPTIONAL_MUTABLE_CONSTEXPR T& operator *() & { - assert (initialized()); - return contained_val(); - } - - OPTIONAL_MUTABLE_CONSTEXPR T&& operator *() && { - assert (initialized()); - return constexpr_move(contained_val()); - } - - constexpr T const& value() const& { - return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val()); - } - - OPTIONAL_MUTABLE_CONSTEXPR T& value() & { - return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val()); - } - - OPTIONAL_MUTABLE_CONSTEXPR T&& value() && { - if (!initialized()) throw bad_optional_access("bad optional access"); - return std::move(contained_val()); - } - -# else - - T* operator ->() { - assert (initialized()); - return dataptr(); - } - - constexpr T const& operator *() const { - return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), contained_val()); - } - - T& operator *() { - assert (initialized()); - return contained_val(); - } - - constexpr T const& value() const { - return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val()); - } - - T& value() { - return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val()); - } - -# endif - -# if OPTIONAL_HAS_THIS_RVALUE_REFS == 1 - - template - constexpr T value_or(V&& v) const& - { - return *this ? **this : detail_::convert(constexpr_forward(v)); - } - -# if OPTIONAL_HAS_MOVE_ACCESSORS == 1 - - template - OPTIONAL_MUTABLE_CONSTEXPR T value_or(V&& v) && - { - return *this ? constexpr_move(const_cast&>(*this).contained_val()) : detail_::convert(constexpr_forward(v)); - } - -# else - - template - T value_or(V&& v) && - { - return *this ? constexpr_move(const_cast&>(*this).contained_val()) : detail_::convert(constexpr_forward(v)); - } - -# endif - -# else - - template - constexpr T value_or(V&& v) const - { - return *this ? **this : detail_::convert(constexpr_forward(v)); - } - -# endif - -}; - - -template -class optional -{ - static_assert( !std::is_same::value, "bad T" ); - static_assert( !std::is_same::value, "bad T" ); - T* ref; - -public: - - // 20.5.5.1, construction/destruction - constexpr optional() noexcept : ref(nullptr) {} - - constexpr optional(nullopt_t) noexcept : ref(nullptr) {} - - constexpr optional(T& v) noexcept : ref(detail_::static_addressof(v)) {} - - optional(T&&) = delete; - - constexpr optional(const optional& rhs) noexcept : ref(rhs.ref) {} - - explicit constexpr optional(in_place_t, T& v) noexcept : ref(detail_::static_addressof(v)) {} - - explicit optional(in_place_t, T&&) = delete; - - ~optional() = default; - - // 20.5.5.2, mutation - optional& operator=(nullopt_t) noexcept { - ref = nullptr; - return *this; - } - - // optional& operator=(const optional& rhs) noexcept { - // ref = rhs.ref; - // return *this; - // } - - // optional& operator=(optional&& rhs) noexcept { - // ref = rhs.ref; - // return *this; - // } - - template - auto operator=(U&& rhs) noexcept - -> typename enable_if - < - is_same::type, optional>::value, - optional& - >::type - { - ref = rhs.ref; - return *this; - } - - template - auto operator=(U&& rhs) noexcept - -> typename enable_if - < - !is_same::type, optional>::value, - optional& - >::type - = delete; - - void emplace(T& v) noexcept { - ref = detail_::static_addressof(v); - } - - void emplace(T&&) = delete; - - - void swap(optional& rhs) noexcept - { - std::swap(ref, rhs.ref); - } - - // 20.5.5.3, observers - constexpr T* operator->() const { - return TR2_OPTIONAL_ASSERTED_EXPRESSION(ref, ref); - } - - constexpr T& operator*() const { - return TR2_OPTIONAL_ASSERTED_EXPRESSION(ref, *ref); - } - - constexpr T& value() const { - return ref ? *ref : (throw bad_optional_access("bad optional access"), *ref); - } - - explicit constexpr operator bool() const noexcept { - return ref != nullptr; - } - - template - constexpr typename decay::type value_or(V&& v) const - { - return *this ? **this : detail_::convert::type>(constexpr_forward(v)); - } -}; - - -template -class optional -{ - static_assert( sizeof(T) == 0, "optional rvalue references disallowed" ); -}; - - -// 20.5.8, Relational operators -template constexpr bool operator==(const optional& x, const optional& y) -{ - return bool(x) != bool(y) ? false : bool(x) == false ? true : *x == *y; -} - -template constexpr bool operator!=(const optional& x, const optional& y) -{ - return !(x == y); -} - -template constexpr bool operator<(const optional& x, const optional& y) -{ - return (!y) ? false : (!x) ? true : *x < *y; -} - -template constexpr bool operator>(const optional& x, const optional& y) -{ - return (y < x); -} - -template constexpr bool operator<=(const optional& x, const optional& y) -{ - return !(y < x); -} - -template constexpr bool operator>=(const optional& x, const optional& y) -{ - return !(x < y); -} - - -// 20.5.9, Comparison with nullopt -template constexpr bool operator==(const optional& x, nullopt_t) noexcept -{ - return (!x); -} - -template constexpr bool operator==(nullopt_t, const optional& x) noexcept -{ - return (!x); -} - -template constexpr bool operator!=(const optional& x, nullopt_t) noexcept -{ - return bool(x); -} - -template constexpr bool operator!=(nullopt_t, const optional& x) noexcept -{ - return bool(x); -} - -template constexpr bool operator<(const optional&, nullopt_t) noexcept -{ - return false; -} - -template constexpr bool operator<(nullopt_t, const optional& x) noexcept -{ - return bool(x); -} - -template constexpr bool operator<=(const optional& x, nullopt_t) noexcept -{ - return (!x); -} - -template constexpr bool operator<=(nullopt_t, const optional&) noexcept -{ - return true; -} - -template constexpr bool operator>(const optional& x, nullopt_t) noexcept -{ - return bool(x); -} - -template constexpr bool operator>(nullopt_t, const optional&) noexcept -{ - return false; -} - -template constexpr bool operator>=(const optional&, nullopt_t) noexcept -{ - return true; -} - -template constexpr bool operator>=(nullopt_t, const optional& x) noexcept -{ - return (!x); -} - - - -// 20.5.10, Comparison with T -template constexpr bool operator==(const optional& x, const T& v) -{ - return bool(x) ? *x == v : false; -} - -template constexpr bool operator==(const T& v, const optional& x) -{ - return bool(x) ? v == *x : false; -} - -template constexpr bool operator!=(const optional& x, const T& v) -{ - return bool(x) ? *x != v : true; -} - -template constexpr bool operator!=(const T& v, const optional& x) -{ - return bool(x) ? v != *x : true; -} - -template constexpr bool operator<(const optional& x, const T& v) -{ - return bool(x) ? *x < v : true; -} - -template constexpr bool operator>(const T& v, const optional& x) -{ - return bool(x) ? v > *x : true; -} - -template constexpr bool operator>(const optional& x, const T& v) -{ - return bool(x) ? *x > v : false; -} - -template constexpr bool operator<(const T& v, const optional& x) -{ - return bool(x) ? v < *x : false; -} - -template constexpr bool operator>=(const optional& x, const T& v) -{ - return bool(x) ? *x >= v : false; -} - -template constexpr bool operator<=(const T& v, const optional& x) -{ - return bool(x) ? v <= *x : false; -} - -template constexpr bool operator<=(const optional& x, const T& v) -{ - return bool(x) ? *x <= v : true; -} - -template constexpr bool operator>=(const T& v, const optional& x) -{ - return bool(x) ? v >= *x : true; -} - - -// Comparison of optional with T -template constexpr bool operator==(const optional& x, const T& v) -{ - return bool(x) ? *x == v : false; -} - -template constexpr bool operator==(const T& v, const optional& x) -{ - return bool(x) ? v == *x : false; -} - -template constexpr bool operator!=(const optional& x, const T& v) -{ - return bool(x) ? *x != v : true; -} - -template constexpr bool operator!=(const T& v, const optional& x) -{ - return bool(x) ? v != *x : true; -} - -template constexpr bool operator<(const optional& x, const T& v) -{ - return bool(x) ? *x < v : true; -} - -template constexpr bool operator>(const T& v, const optional& x) -{ - return bool(x) ? v > *x : true; -} - -template constexpr bool operator>(const optional& x, const T& v) -{ - return bool(x) ? *x > v : false; -} - -template constexpr bool operator<(const T& v, const optional& x) -{ - return bool(x) ? v < *x : false; -} - -template constexpr bool operator>=(const optional& x, const T& v) -{ - return bool(x) ? *x >= v : false; -} - -template constexpr bool operator<=(const T& v, const optional& x) -{ - return bool(x) ? v <= *x : false; -} - -template constexpr bool operator<=(const optional& x, const T& v) -{ - return bool(x) ? *x <= v : true; -} - -template constexpr bool operator>=(const T& v, const optional& x) -{ - return bool(x) ? v >= *x : true; -} - -// Comparison of optional with T -template constexpr bool operator==(const optional& x, const T& v) -{ - return bool(x) ? *x == v : false; -} - -template constexpr bool operator==(const T& v, const optional& x) -{ - return bool(x) ? v == *x : false; -} - -template constexpr bool operator!=(const optional& x, const T& v) -{ - return bool(x) ? *x != v : true; -} - -template constexpr bool operator!=(const T& v, const optional& x) -{ - return bool(x) ? v != *x : true; -} - -template constexpr bool operator<(const optional& x, const T& v) -{ - return bool(x) ? *x < v : true; -} - -template constexpr bool operator>(const T& v, const optional& x) -{ - return bool(x) ? v > *x : true; -} - -template constexpr bool operator>(const optional& x, const T& v) -{ - return bool(x) ? *x > v : false; -} - -template constexpr bool operator<(const T& v, const optional& x) -{ - return bool(x) ? v < *x : false; -} - -template constexpr bool operator>=(const optional& x, const T& v) -{ - return bool(x) ? *x >= v : false; -} - -template constexpr bool operator<=(const T& v, const optional& x) -{ - return bool(x) ? v <= *x : false; -} - -template constexpr bool operator<=(const optional& x, const T& v) -{ - return bool(x) ? *x <= v : true; -} - -template constexpr bool operator>=(const T& v, const optional& x) -{ - return bool(x) ? v >= *x : true; -} - - -// 20.5.12, Specialized algorithms -template -void swap(optional& x, optional& y) noexcept(noexcept(x.swap(y))) -{ - x.swap(y); -} - - -template -constexpr optional::type> make_optional(T&& v) -{ - return optional::type>(constexpr_forward(v)); -} - -template -constexpr optional make_optional(reference_wrapper v) -{ - return optional(v.get()); -} - - -} // namespace experimental -} // namespace std - -namespace std -{ - template - struct hash> - { - typedef typename hash::result_type result_type; - typedef std::experimental::optional argument_type; - - constexpr result_type operator()(argument_type const& arg) const { - return arg ? std::hash{}(*arg) : result_type{}; - } - }; - - template - struct hash> - { - typedef typename hash::result_type result_type; - typedef std::experimental::optional argument_type; - - constexpr result_type operator()(argument_type const& arg) const { - return arg ? std::hash{}(*arg) : result_type{}; - } - }; -} - -# undef TR2_OPTIONAL_REQUIRES -# undef TR2_OPTIONAL_ASSERTED_EXPRESSION - -# endif //___OPTIONAL_HPP___ +} // namespace xlnt diff --git a/include/xlnt/workbook/workbook.hpp b/include/xlnt/workbook/workbook.hpp index e4fbc829..e67a3c4f 100644 --- a/include/xlnt/workbook/workbook.hpp +++ b/include/xlnt/workbook/workbook.hpp @@ -401,7 +401,7 @@ public: format &get_format(std::size_t format_index); const format &get_format(std::size_t format_index) const; - std::size_t add_format(const format &new_format); + format &create_format(); void clear_formats(); // styles @@ -409,11 +409,7 @@ public: bool has_style(const std::string &name) const; style &get_style(const std::string &name); const style &get_style(const std::string &name) const; - style &get_style_by_id(std::size_t style_id); - const style &get_style_by_id(std::size_t style_id) const; - std::size_t get_style_id(const std::string &name) const; style &create_style(const std::string &name); - std::size_t add_style(const style &new_style); void clear_styles(); // manifest @@ -478,6 +474,16 @@ private: /// Apply the function "f" to every cell in every worksheet in this workbook. /// void apply_to_cells(std::function f); + + void register_app_properties_in_manifest(); + + void register_core_properties_in_manifest(); + + void register_shared_string_table_in_manifest(); + + void register_stylesheet_in_manifest(); + + void register_theme_in_manifest(); /// /// An opaque pointer to a structure that holds all of the data relating to this workbook. diff --git a/source/cell/cell.cpp b/source/cell/cell.cpp index 9815afb2..34da6fd8 100644 --- a/source/cell/cell.cpp +++ b/source/cell/cell.cpp @@ -169,7 +169,7 @@ std::string cell::check_string(const std::string &to_check) { if (c >= 0 && (c <= 8 || c == 11 || c == 12 || (c >= 14 && c <= 31))) { - throw xlnt::illegal_character(c); + throw illegal_character(c); } } @@ -182,7 +182,7 @@ cell::cell(detail::cell_impl *d) : d_(d) bool cell::garbage_collectible() const { - return !(get_data_type() != type::null || is_merged() || has_comment() || has_formula() || has_format()); + return !(get_data_type() != type::null || is_merged() || has_formula() || has_format()); } template <> @@ -353,10 +353,8 @@ XLNT_FUNCTION void cell::set_value(cell c) d_->value_numeric_ = c.d_->value_numeric_; d_->value_text_ = c.d_->value_text_; d_->hyperlink_ = c.d_->hyperlink_; - d_->has_hyperlink_ = c.d_->has_hyperlink_; d_->formula_ = c.d_->formula_; d_->format_id_ = c.d_->format_id_; - if (c.has_comment()) set_comment(c.get_comment()); } template <> @@ -433,7 +431,18 @@ bool cell::operator==(const cell &comparand) const cell &cell::operator=(const cell &rhs) { - *d_ = *rhs.d_; + d_->column_ = rhs.d_->column_; + d_->format_id_ = rhs.d_->format_id_; + d_->formula_ = rhs.d_->formula_; + d_->hyperlink_ = rhs.d_->hyperlink_; + d_->is_merged_ = rhs.d_->is_merged_; + d_->parent_ = rhs.d_->parent_; + d_->row_ = rhs.d_->row_; + d_->style_name_ = rhs.d_->style_name_; + d_->type_ = rhs.d_->type_; + d_->value_numeric_ = rhs.d_->value_numeric_; + d_->value_text_ = rhs.d_->value_text_; + return *this; } @@ -444,27 +453,16 @@ std::string cell::to_repr() const std::string cell::get_hyperlink() const { - if (!d_->has_hyperlink_) - { - throw std::runtime_error("no hyperlink set"); - } - - return d_->hyperlink_; -} - -bool cell::has_hyperlink() const -{ - return d_->has_hyperlink_; + return d_->hyperlink_.get(); } void cell::set_hyperlink(const std::string &hyperlink) { if (hyperlink.length() == 0 || std::find(hyperlink.begin(), hyperlink.end(), ':') == hyperlink.end()) { - throw invalid_data_type(); + throw invalid_parameter(); } - d_->has_hyperlink_ = true; d_->hyperlink_ = hyperlink; if (get_data_type() == type::null) @@ -492,17 +490,12 @@ void cell::set_formula(const std::string &formula) bool cell::has_formula() const { - return !d_->formula_.empty(); + return d_->formula_; } std::string cell::get_formula() const { - if (d_->formula_.empty()) - { - throw invalid_attribute(); - } - - return d_->formula_; + return d_->formula_.get(); } void cell::clear_formula() @@ -510,36 +503,6 @@ void cell::clear_formula() d_->formula_.clear(); } -void cell::set_comment(const xlnt::comment &c) -{ - if (c.d_ != d_->comment_.get()) - { - throw xlnt::invalid_attribute(); - } - - if (!has_comment()) - { - get_worksheet().increment_comments(); - } - - *get_comment().d_ = *c.d_; -} - -void cell::clear_comment() -{ - if (has_comment()) - { - get_worksheet().decrement_comments(); - } - - d_->comment_ = nullptr; -} - -bool cell::has_comment() const -{ - return d_->comment_ != nullptr; -} - void cell::set_error(const std::string &error) { if (error.length() == 0 || error[0] != '#') @@ -575,18 +538,8 @@ const workbook &cell::get_workbook() const { return get_worksheet().get_workbook(); } -comment cell::get_comment() -{ - if (d_->comment_ == nullptr) - { - d_->comment_.reset(new detail::comment_impl()); - get_worksheet().increment_comments(); - } - return comment(d_->comment_.get()); -} - -//TODO: this shares a lot of code with worksheet::get_point_pos, try to reduce repition +//TODO: this shares a lot of code with worksheet::get_point_pos, try to reduce repetion std::pair cell::get_anchor() const { static const double DefaultColumnWidth = 51.85; @@ -650,76 +603,34 @@ void cell::set_data_type(type t) d_->type_ = t; } -const number_format &cell::get_number_format() const +number_format cell::get_computed_number_format() const { - if (d_->has_format_) - { - return get_workbook().get_format(d_->format_id_).get_number_format(); - } - else - { - return get_workbook().get_format(0).get_number_format(); - } + return get_computed_format().get_number_format(); } -const font &cell::get_font() const +font cell::get_computed_font() const { - if (d_->has_format_) - { - return get_workbook().get_format(d_->format_id_).get_font(); - } - else - { - return get_workbook().get_format(0).get_font(); - } + return get_computed_format().get_font(); } -const fill &cell::get_fill() const +fill cell::get_computed_fill() const { - if (d_->has_format_) - { - return get_workbook().get_format(d_->format_id_).get_fill(); - } - else - { - return get_workbook().get_format(0).get_fill(); - } + return get_computed_format().get_fill(); } -const border &cell::get_border() const +border cell::get_computed_border() const { - if (d_->has_format_) - { - return get_workbook().get_format(d_->format_id_).get_border(); - } - else - { - return get_workbook().get_format(0).get_border(); - } + return get_computed_format().get_border(); } -const alignment &cell::get_alignment() const +alignment cell::get_computed_alignment() const { - if (d_->has_format_) - { - return get_workbook().get_format(d_->format_id_).get_alignment(); - } - else - { - return get_workbook().get_format(0).get_alignment(); - } + return get_computed_format().get_alignment(); } -const protection &cell::get_protection() const +protection cell::get_computed_protection() const { - if (d_->has_format_) - { - return get_workbook().get_format(d_->format_id_).get_protection(); - } - else - { - return get_workbook().get_format(0).get_protection(); - } + return get_computed_format().get_protection(); } void cell::clear_value() @@ -842,64 +753,32 @@ XLNT_FUNCTION timedelta cell::get_value() const void cell::set_border(const xlnt::border &border_) { - d_->has_format_ = true; - auto format_copy = get_workbook().get_format(d_->format_id_); - format_copy.set_border(border_); - d_->format_id_ = get_workbook().add_format(format_copy); + get_format().set_border(border_); } void cell::set_fill(const xlnt::fill &fill_) { - d_->has_format_ = true; - auto format_copy = get_workbook().get_format(d_->format_id_); - format_copy.set_fill(fill_); - d_->format_id_ = get_workbook().add_format(format_copy); + get_format().set_fill(fill_); } void cell::set_font(const font &font_) { - d_->has_format_ = true; - auto format_copy = get_workbook().get_format(d_->format_id_); - format_copy.set_font(font_); - d_->format_id_ = get_workbook().add_format(format_copy); + get_format().set_font(font_); } void cell::set_number_format(const number_format &number_format_) { - format new_format; - - if (d_->has_format_) - { - new_format = get_workbook().get_format(d_->format_id_); - } - - auto number_format_with_id = number_format_; - - if (!number_format_with_id.has_id()) - { - number_format_with_id.set_id(get_worksheet().next_custom_number_format_id()); - } - - new_format.set_number_format(number_format_with_id); - - d_->has_format_ = true; - d_->format_id_ = get_workbook().add_format(new_format); + get_format().set_number_format(number_format_); } void cell::set_alignment(const xlnt::alignment &alignment_) { - d_->has_format_ = true; - auto format_copy = get_workbook().get_format(d_->format_id_); - format_copy.set_alignment(alignment_); - d_->format_id_ = get_workbook().add_format(format_copy); + get_format().set_alignment(alignment_); } void cell::set_protection(const xlnt::protection &protection_) { - d_->has_format_ = true; - auto format_copy = get_workbook().get_format(d_->format_id_); - format_copy.set_protection(protection_); - d_->format_id_ = get_workbook().add_format(format_copy); + get_format().set_protection(protection_); } template <> @@ -947,19 +826,12 @@ format &cell::get_format() bool cell::has_format() const { - return d_->has_format_; + return d_->format_id_.is_set(); } void cell::set_format(const format &new_format) { - d_->format_id_ = get_workbook().add_format(new_format); - d_->has_format_ = true; -} - -void cell::set_format_id(std::size_t format_id) -{ - d_->format_id_ = format_id; - d_->has_format_ = true; + d_->format_id_ = get_workbook().create_format().get_id(); } calendar cell::get_base_date() const @@ -972,11 +844,6 @@ std::ostream &operator<<(std::ostream &stream, const xlnt::cell &cell) return stream << cell.to_string(); } -std::size_t cell::get_format_id() const -{ - return d_->format_id_; -} - void cell::guess_type_and_set_value(const std::string &value) { auto percentage = cast_percentage(value); @@ -1012,55 +879,37 @@ void cell::guess_type_and_set_value(const std::string &value) void cell::clear_format() { - d_->format_id_ = 0; - d_->has_format_ = false; + d_->format_id_.clear(); } void cell::clear_style() { - d_->style_id_ = 0; - d_->has_style_ = false; + d_->style_name_.clear(); } void cell::set_style(const style &new_style) { - d_->has_style_ = true; - - if (get_workbook().has_style(new_style.get_name())) - { - d_->style_id_ = get_workbook().get_style_id(new_style.get_name()); - } - else - { - d_->style_id_ = get_workbook().add_style(new_style); - } + d_->style_name_ = new_style.name(); } void cell::set_style(const std::string &style_name) { - d_->has_style_ = true; - - if (!get_workbook().has_style(style_name)) - { - throw std::runtime_error("style " + style_name + " doesn't exist in workbook"); - } - - d_->style_id_ = get_workbook().get_style_id(style_name); + d_->style_name_ = style_name; } -const style &cell::get_style() const +style cell::get_style() const { - if (!d_->has_style_) + if (!d_->style_name_) { - throw std::runtime_error("cell has no style"); + throw invalid_attribute(); } - return get_workbook().get_style_by_id(d_->style_id_); + return get_workbook().get_style(*d_->style_name_); } bool cell::has_style() const { - return d_->has_style_; + return d_->style_name_; } } // namespace xlnt diff --git a/source/cell/comment.cpp b/source/cell/comment.cpp index 0a038304..206a975f 100644 --- a/source/cell/comment.cpp +++ b/source/cell/comment.cpp @@ -34,7 +34,6 @@ comment::comment(detail::comment_impl *d) : d_(d) comment::comment(cell parent, const std::string &text, const std::string &author) : d_(nullptr) { - d_ = parent.get_comment().d_; d_->text_ = text; d_->author_ = author; } diff --git a/source/cell/tests/test_cell.hpp b/source/cell/tests/test_cell.hpp index be82a558..029fe523 100644 --- a/source/cell/tests/test_cell.hpp +++ b/source/cell/tests/test_cell.hpp @@ -355,14 +355,14 @@ public: auto ws = wb.create_sheet(); auto cell = ws.get_cell("A1"); - xlnt::fill f = xlnt::fill::pattern(xlnt::pattern_fill::type::solid); - f.get_pattern_fill().set_foreground_color(xlnt::color::red()); - - cell.set_fill(f); + xlnt::fill fill(xlnt::pattern_fill() + .type(xlnt::pattern_fill_type::solid) + .foreground(xlnt::color::red())); + cell.set_fill(fill); TS_ASSERT(cell.has_format()); TS_ASSERT(cell.get_format().fill_applied()); - TS_ASSERT_EQUALS(cell.get_fill(), f); + TS_ASSERT_EQUALS(cell.get_fill(), fill); } void test_border() @@ -454,12 +454,12 @@ public: TS_ASSERT_EQUALS(cell.get_style().get_number_format(), xlnt::number_format::percentage()); TS_ASSERT_EQUALS(cell.get_style(), last_style); - TS_ASSERT_THROWS(cell.set_style("doesn't exist"), std::runtime_error); + TS_ASSERT_THROWS(cell.set_style("doesn't exist"), xlnt::key_not_found); cell.clear_style(); TS_ASSERT(!cell.has_style()); - TS_ASSERT_THROWS(cell.get_style(), std::runtime_error); + TS_ASSERT_THROWS(cell.get_style(), xlnt::invalid_attribute); } void test_print() @@ -651,9 +651,9 @@ public: xlnt::workbook wb; auto cell = wb.get_active_sheet().get_cell("A1"); TS_ASSERT(!cell.has_hyperlink()); - TS_ASSERT_THROWS(cell.get_hyperlink(), std::runtime_error); - TS_ASSERT_THROWS(cell.set_hyperlink("notaurl"), std::runtime_error); - TS_ASSERT_THROWS(cell.set_hyperlink(""), std::runtime_error); + TS_ASSERT_THROWS(cell.get_hyperlink(), xlnt::invalid_attribute); + TS_ASSERT_THROWS(cell.set_hyperlink("notaurl"), xlnt::invalid_parameter); + TS_ASSERT_THROWS(cell.set_hyperlink(""), xlnt::invalid_parameter); cell.set_hyperlink("http://example.com"); TS_ASSERT(cell.has_hyperlink()); TS_ASSERT_EQUALS(cell.get_hyperlink(), "http://example.com"); diff --git a/source/detail/cell_impl.cpp b/source/detail/cell_impl.cpp index a4449232..6cb0a20d 100644 --- a/source/detail/cell_impl.cpp +++ b/source/detail/cell_impl.cpp @@ -29,64 +29,5 @@ namespace xlnt { namespace detail { -cell_impl::cell_impl() : cell_impl(column_t(1), 1) -{ -} - -cell_impl::cell_impl(column_t column, row_t row) : cell_impl(nullptr, column, row) -{ -} - -cell_impl::cell_impl(worksheet_impl *parent, column_t column, row_t row) - : type_(cell::type::null), - parent_(parent), - column_(column), - row_(row), - value_numeric_(0), - has_hyperlink_(false), - is_merged_(false), - has_format_(false), - format_id_(0), - has_style_(false), - style_id_(0), - comment_(nullptr) -{ -} - -cell_impl::cell_impl(const cell_impl &rhs) -{ - *this = rhs; -} - -cell_impl &cell_impl::operator=(const cell_impl &rhs) -{ - type_ = rhs.type_; - parent_ = rhs.parent_; - column_ = rhs.column_; - row_ = rhs.row_; - value_text_ = rhs.value_text_; - value_numeric_ = rhs.value_numeric_; - has_hyperlink_ = rhs.has_hyperlink_; - hyperlink_ = rhs.hyperlink_; - formula_ = rhs.formula_; - is_merged_ = rhs.is_merged_; - has_format_ = rhs.has_format_; - format_id_ = rhs.format_id_; - has_style_ = rhs.has_style_; - style_id_ = rhs.style_id_; - - if (rhs.comment_ != nullptr) - { - comment_.reset(new comment_impl(*rhs.comment_)); - } - - return *this; -} - -cell cell_impl::self() -{ - return xlnt::cell(this); -} - } // namespace detail } // namespace xlnt diff --git a/source/detail/cell_impl.hpp b/source/detail/cell_impl.hpp index 8542f400..eb9ee89d 100644 --- a/source/detail/cell_impl.hpp +++ b/source/detail/cell_impl.hpp @@ -22,61 +22,42 @@ // @author: see AUTHORS file #pragma once -#include +#include +#include -#include -#include -#include +#include #include -#include -#include -#include -#include - -#include "comment_impl.hpp" +#include +#include namespace xlnt { -class style; - namespace detail { +struct comment_impl; struct worksheet_impl; struct cell_impl { - cell_impl(); - cell_impl(column_t column, row_t row); - cell_impl(worksheet_impl *parent, column_t column, row_t row); - cell_impl(const cell_impl &rhs); - cell_impl &operator=(const cell_impl &rhs); - - cell self(); - - cell::type type_; + cell_type type_; worksheet_impl *parent_; column_t column_; row_t row_; + bool is_merged_; + text value_text_; long double value_numeric_; - std::string formula_; + optional formula_; - bool has_hyperlink_; - std::string hyperlink_; + optional hyperlink_; - bool is_merged_; + optional format_id_; - bool has_format_; - std::size_t format_id_; - - bool has_style_; - std::size_t style_id_; - - std::unique_ptr comment_; + optional style_name_; }; } // namespace detail diff --git a/source/detail/excel_thumbnail.hpp b/source/detail/excel_thumbnail.hpp new file mode 100644 index 00000000..649d452d --- /dev/null +++ b/source/detail/excel_thumbnail.hpp @@ -0,0 +1,430 @@ +#pragma once + +#include +#include + +namespace xlnt { + +const std::vector &excel_thumbnail() +{ + const auto *data = new std::vector{ + 0xff,0xd8,0xff,0xe0,0x00,0x10,0x4a,0x46,0x49,0x46,0x00,0x01,0x01,0x00,0x00,0x48,0x00,0x48,0x00,0x00,0xff,0xe1,0x00,0x80,0x45,0x78,0x69,0x66,0x00,0x00,0x4d,0x4d,0x00 + ,0x2a,0x00,0x00,0x00,0x08,0x00,0x04,0x01,0x1a,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3e,0x01,0x1b,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x46,0x01 + ,0x28,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x87,0x69,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00 + ,0x00,0x00,0x01,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x03,0xa0,0x01,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0xa0,0x02,0x00,0x04,0x00,0x00,0x00 + ,0x01,0x00,0x00,0x01,0x00,0xa0,0x03,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x9d,0x00,0x00,0x00,0x00,0xff,0xed,0x00,0x38,0x50,0x68,0x6f,0x74,0x6f,0x73,0x68 + ,0x6f,0x70,0x20,0x33,0x2e,0x30,0x00,0x38,0x42,0x49,0x4d,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x42,0x49,0x4d,0x04,0x25,0x00,0x00,0x00,0x00,0x00,0x10,0xd4 + ,0x1d,0x8c,0xd9,0x8f,0x00,0xb2,0x04,0xe9,0x80,0x09,0x98,0xec,0xf8,0x42,0x7e,0xff,0xc0,0x00,0x11,0x08,0x00,0x9d,0x01,0x00,0x03,0x01,0x11,0x00,0x02,0x11,0x01,0x03 + ,0x11,0x01,0xff,0xc4,0x00,0x1f,0x00,0x00,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08 + ,0x09,0x0a,0x0b,0xff,0xc4,0x00,0xb5,0x10,0x00,0x02,0x01,0x03,0x03,0x02,0x04,0x03,0x05,0x05,0x04,0x04,0x00,0x00,0x01,0x7d,0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12 + ,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16 + ,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59 + ,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98 + ,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4 + ,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xff,0xc4,0x00,0x1f,0x01,0x00 + ,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0xff,0xc4,0x00,0xb5,0x11 + ,0x00,0x02,0x01,0x02,0x04,0x04,0x03,0x04,0x07,0x05,0x04,0x04,0x00,0x01,0x02,0x77,0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71 + ,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26 + ,0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68 + ,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5 + ,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda + ,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xff,0xdb,0x00,0x43,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 + ,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 + ,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xff,0xdb,0x00,0x43,0x01,0x01,0x01,0x01,0x01 + ,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01 + ,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xff,0xdd,0x00,0x04 + ,0x00,0x20,0xff,0xda,0x00,0x0c,0x03,0x01,0x00,0x02,0x11,0x03,0x11,0x00,0x3f,0x00,0xfe,0xef,0x7c,0x33,0xe1,0x7f,0x0d,0x4f,0xe1,0xbf,0x0f,0xcf,0x3f,0x87,0xb4,0x39 + ,0xa6,0x9b,0x44,0xd2,0xa5,0x9a,0x69,0x74,0x8b,0x09,0x25,0x96,0x59,0x2c,0x2d,0xde,0x49,0x24,0x91,0xa1,0x2c,0xf2,0x3b,0x92,0xce,0xec,0x4b,0x33,0x12,0x49,0x24,0x93 + ,0x40,0x1b,0x7f,0xf0,0x89,0x78,0x57,0xfe,0x85,0xaf,0x0f,0xff,0x00,0xe0,0x9b,0x4e,0xff,0x00,0xe3,0x14,0x00,0x7f,0xc2,0x25,0xe1,0x5f,0xfa,0x16,0xbc,0x3f,0xff,0x00 + ,0x82,0x6d,0x3b,0xff,0x00,0x8c,0x50,0x01,0xff,0x00,0x08,0x97,0x85,0x7f,0xe8,0x5a,0xf0,0xff,0x00,0xfe,0x09,0xb4,0xef,0xfe,0x31,0x40,0x07,0xfc,0x22,0x5e,0x15,0xff + ,0x00,0xa1,0x6b,0xc3,0xff,0x00,0xf8,0x26,0xd3,0xbf,0xf8,0xc5,0x00,0x1f,0xf0,0x89,0x78,0x57,0xfe,0x85,0xaf,0x0f,0xff,0x00,0xe0,0x9b,0x4e,0xff,0x00,0xe3,0x14,0x00 + ,0x7f,0xc2,0x25,0xe1,0x5f,0xfa,0x16,0xbc,0x3f,0xff,0x00,0x82,0x6d,0x3b,0xff,0x00,0x8c,0x50,0x01,0xff,0x00,0x08,0x97,0x85,0x7f,0xe8,0x5a,0xf0,0xff,0x00,0xfe,0x09 + ,0xb4,0xef,0xfe,0x31,0x40,0x07,0xfc,0x22,0x5e,0x15,0xff,0x00,0xa1,0x6b,0xc3,0xff,0x00,0xf8,0x26,0xd3,0xbf,0xf8,0xc5,0x00,0x1f,0xf0,0x89,0x78,0x57,0xfe,0x85,0xaf + ,0x0f,0xff,0x00,0xe0,0x9b,0x4e,0xff,0x00,0xe3,0x14,0x00,0x7f,0xc2,0x25,0xe1,0x5f,0xfa,0x16,0xbc,0x3f,0xff,0x00,0x82,0x6d,0x3b,0xff,0x00,0x8c,0x50,0x01,0xff,0x00 + ,0x08,0x97,0x85,0x7f,0xe8,0x5a,0xf0,0xff,0x00,0xfe,0x09,0xb4,0xef,0xfe,0x31,0x40,0x07,0xfc,0x22,0x5e,0x15,0xff,0x00,0xa1,0x6b,0xc3,0xff,0x00,0xf8,0x26,0xd3,0xbf + ,0xf8,0xc5,0x00,0x1f,0xf0,0x89,0x78,0x57,0xfe,0x85,0xaf,0x0f,0xff,0x00,0xe0,0x9b,0x4e,0xff,0x00,0xe3,0x14,0x00,0x7f,0xc2,0x25,0xe1,0x5f,0xfa,0x16,0xbc,0x3f,0xff + ,0x00,0x82,0x6d,0x3b,0xff,0x00,0x8c,0x50,0x01,0xff,0x00,0x08,0x97,0x85,0x7f,0xe8,0x5a,0xf0,0xff,0x00,0xfe,0x09,0xb4,0xef,0xfe,0x31,0x40,0x07,0xfc,0x22,0x5e,0x15 + ,0xff,0x00,0xa1,0x6b,0xc3,0xff,0x00,0xf8,0x26,0xd3,0xbf,0xf8,0xc5,0x00,0x1f,0xf0,0x89,0x78,0x57,0xfe,0x85,0xaf,0x0f,0xff,0x00,0xe0,0x9b,0x4e,0xff,0x00,0xe3,0x14 + ,0x00,0x7f,0xc2,0x25,0xe1,0x5f,0xfa,0x16,0xbc,0x3f,0xff,0x00,0x82,0x6d,0x3b,0xff,0x00,0x8c,0x50,0x01,0xff,0x00,0x08,0x97,0x85,0x7f,0xe8,0x5a,0xf0,0xff,0x00,0xfe + ,0x09,0xb4,0xef,0xfe,0x31,0x40,0x07,0xfc,0x22,0x5e,0x15,0xff,0x00,0xa1,0x6b,0xc3,0xff,0x00,0xf8,0x26,0xd3,0xbf,0xf8,0xc5,0x00,0x1f,0xf0,0x89,0x78,0x57,0xfe,0x85 + ,0xaf,0x0f,0xff,0x00,0xe0,0x9b,0x4e,0xff,0x00,0xe3,0x14,0x00,0x7f,0xc2,0x25,0xe1,0x5f,0xfa,0x16,0xbc,0x3f,0xff,0x00,0x82,0x6d,0x3b,0xff,0x00,0x8c,0x50,0x01,0xff + ,0x00,0x08,0x97,0x85,0x7f,0xe8,0x5a,0xf0,0xff,0x00,0xfe,0x09,0xb4,0xef,0xfe,0x31,0x40,0x07,0xfc,0x22,0x5e,0x15,0xff,0x00,0xa1,0x6b,0xc3,0xff,0x00,0xf8,0x26,0xd3 + ,0xbf,0xf8,0xc5,0x00,0x1f,0xf0,0x89,0x78,0x57,0xfe,0x85,0xaf,0x0f,0xff,0x00,0xe0,0x9b,0x4e,0xff,0x00,0xe3,0x14,0x00,0x7f,0xc2,0x25,0xe1,0x5f,0xfa,0x16,0xbc,0x3f + ,0xff,0x00,0x82,0x6d,0x3b,0xff,0x00,0x8c,0x50,0x01,0xff,0x00,0x08,0x97,0x85,0x7f,0xe8,0x5a,0xf0,0xff,0x00,0xfe,0x09,0xb4,0xef,0xfe,0x31,0x40,0x07,0xfc,0x22,0x5e + ,0x15,0xff,0x00,0xa1,0x6b,0xc3,0xff,0x00,0xf8,0x26,0xd3,0xbf,0xf8,0xc5,0x00,0x1f,0xf0,0x89,0x78,0x57,0xfe,0x85,0xaf,0x0f,0xff,0x00,0xe0,0x9b,0x4e,0xff,0x00,0xe3 + ,0x14,0x00,0x7f,0xc2,0x25,0xe1,0x5f,0xfa,0x16,0xbc,0x3f,0xff,0x00,0x82,0x6d,0x3b,0xff,0x00,0x8c,0x50,0x01,0xff,0x00,0x08,0x97,0x85,0x7f,0xe8,0x5a,0xf0,0xff,0x00 + ,0xfe,0x09,0xb4,0xef,0xfe,0x31,0x40,0x1f,0xff,0xd0,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8 + ,0x00,0xa0,0x02,0x80,0x0a,0x00,0x28,0x00,0xa0,0x02,0x80,0x0a,0x00,0x28,0x00,0xa0,0x02,0x80,0x0a,0x00,0x28,0x00,0xa0,0x02,0x80,0x0a,0x00,0x28,0x00,0xa0,0x02,0x80 + ,0x0a,0x00,0x28,0x00,0xa0,0x02,0x80,0x0a,0x00,0x28,0x00,0xa0,0x02,0x80,0x0a,0x00,0x28,0x00,0xa0,0x02,0x80,0x3f,0xff,0xd1,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf + ,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0xc8,0xfc,0x25,0xe1,0x3f,0x0b,0x6a,0xcf,0xe2,0xeb,0xcd,0x57,0xc3,0x5e,0x1f,0xd4,0xee + ,0xdb,0xc7,0x5e,0x28,0x46,0xba,0xd4,0x34,0x6d,0x3a,0xf2,0xe0,0xa2,0xde,0x82,0xa8,0x67,0xb8,0x82,0x49,0x0a,0xa9,0x24,0xaa,0x96,0xc0,0xc9,0xc0,0x19,0x6d,0xc0,0x1d + ,0x7f,0xfc,0x20,0x1e,0x04,0xff,0x00,0xa1,0x2b,0xc2,0x5f,0xf8,0x4d,0xe8,0xff,0x00,0xfc,0x89,0x40,0x07,0xfc,0x20,0x1e,0x04,0xff,0x00,0xa1,0x2b,0xc2,0x5f,0xf8,0x4d + ,0xe8,0xff,0x00,0xfc,0x89,0x40,0x07,0xfc,0x20,0x1e,0x04,0xff,0x00,0xa1,0x2b,0xc2,0x5f,0xf8,0x4d,0xe8,0xff,0x00,0xfc,0x89,0x40,0x07,0xfc,0x20,0x1e,0x04,0xff,0x00 + ,0xa1,0x2b,0xc2,0x5f,0xf8,0x4d,0xe8,0xff,0x00,0xfc,0x89,0x40,0x07,0xfc,0x20,0x1e,0x04,0xff,0x00,0xa1,0x2b,0xc2,0x5f,0xf8,0x4d,0xe8,0xff,0x00,0xfc,0x89,0x40,0x1c + ,0xb7,0x83,0xfc,0x11,0xe0,0xbb,0x9d,0x26,0xee,0x4b,0x8f,0x08,0x78,0x5e,0x79,0x17,0xc5,0x3e,0x39,0x81,0x5e,0x6f,0x0f,0xe9,0x52,0xba,0xc1,0x6b,0xe3,0x5f,0x10,0x5b + ,0x5a,0xc2,0x19,0xed,0x58,0x88,0xad,0xad,0xa1,0x8a,0xde,0x08,0xc1,0xd9,0x0c,0x11,0x47,0x14,0x61,0x51,0x11,0x54,0x03,0xa9,0xff,0x00,0x84,0x03,0xc0,0x9f,0xf4,0x25 + ,0x78,0x4b,0xff,0x00,0x09,0xbd,0x1f,0xff,0x00,0x91,0x28,0x00,0xff,0x00,0x84,0x03,0xc0,0x9f,0xf4,0x25,0x78,0x4b,0xff,0x00,0x09,0xbd,0x1f,0xff,0x00,0x91,0x28,0x00 + ,0xff,0x00,0x84,0x03,0xc0,0x9f,0xf4,0x25,0x78,0x4b,0xff,0x00,0x09,0xbd,0x1f,0xff,0x00,0x91,0x28,0x00,0xff,0x00,0x84,0x03,0xc0,0x9f,0xf4,0x25,0x78,0x4b,0xff,0x00 + ,0x09,0xbd,0x1f,0xff,0x00,0x91,0x28,0x00,0xff,0x00,0x84,0x03,0xc0,0x9f,0xf4,0x25,0x78,0x4b,0xff,0x00,0x09,0xbd,0x1f,0xff,0x00,0x91,0x28,0x03,0x8b,0xf8,0x79,0xe0 + ,0xaf,0x06,0xde,0x78,0x3f,0x48,0xb9,0xbc,0xf0,0x97,0x86,0x6e,0xae,0x24,0x3a,0x8f,0x99,0x3d,0xce,0x83,0xa5,0xcf,0x34,0x9b,0x35,0x5b,0xe8,0xd3,0x7c,0xb2,0xda,0xb3 + ,0xb6,0xc8,0xd1,0x51,0x77,0x13,0xb5,0x15,0x54,0x70,0xa2,0x80,0x3b,0x4f,0xf8,0x40,0x3c,0x09,0xff,0x00,0x42,0x57,0x84,0xbf,0xf0,0x9b,0xd1,0xff,0x00,0xf9,0x12,0x80 + ,0x0f,0xf8,0x40,0x3c,0x09,0xff,0x00,0x42,0x57,0x84,0xbf,0xf0,0x9b,0xd1,0xff,0x00,0xf9,0x12,0x80,0x0f,0xf8,0x40,0x3c,0x09,0xff,0x00,0x42,0x57,0x84,0xbf,0xf0,0x9b + ,0xd1,0xff,0x00,0xf9,0x12,0x80,0x0f,0xf8,0x40,0x3c,0x09,0xff,0x00,0x42,0x57,0x84,0xbf,0xf0,0x9b,0xd1,0xff,0x00,0xf9,0x12,0x80,0x0f,0xf8,0x40,0x3c,0x09,0xff,0x00 + ,0x42,0x57,0x84,0xbf,0xf0,0x9b,0xd1,0xff,0x00,0xf9,0x12,0x80,0x39,0x6f,0x03,0x78,0x23,0xc1,0x77,0x5e,0x0a,0xf0,0x7d,0xd5,0xd7,0x84,0x3c,0x2f,0x73,0x73,0x73,0xe1 + ,0x6f,0x0f,0xcf,0x71,0x71,0x3f,0x87,0xf4,0xa9,0xa7,0x9e,0x79,0xb4,0x9b,0x49,0x25,0x9a,0x69,0x64,0xb5,0x69,0x25,0x96,0x59,0x19,0x9e,0x49,0x1d,0x99,0xdd,0xd8,0xb3 + ,0x12,0xc4,0x9a,0x00,0xea,0x7f,0xe1,0x00,0xf0,0x27,0xfd,0x09,0x5e,0x12,0xff,0x00,0xc2,0x6f,0x47,0xff,0x00,0xe4,0x4a,0x00,0x3f,0xe1,0x00,0xf0,0x27,0xfd,0x09,0x5e + ,0x12,0xff,0x00,0xc2,0x6f,0x47,0xff,0x00,0xe4,0x4a,0x00,0x3f,0xe1,0x00,0xf0,0x27,0xfd,0x09,0x5e,0x12,0xff,0x00,0xc2,0x6f,0x47,0xff,0x00,0xe4,0x4a,0x00,0x3f,0xe1 + ,0x00,0xf0,0x27,0xfd,0x09,0x5e,0x12,0xff,0x00,0xc2,0x6f,0x47,0xff,0x00,0xe4,0x4a,0x00,0xcb,0xd7,0x3c,0x09,0xe0,0x88,0xb4,0x5d,0x62,0x58,0xbc,0x1b,0xe1,0x58,0xe5 + ,0x8b,0x4b,0xd4,0x24,0x8e,0x48,0xfc,0x3d,0xa4,0x24,0x91,0xc8,0x96,0x92,0xb2,0x3a,0x3a,0xda,0x86,0x47,0x46,0x01,0x95,0x94,0xe5,0x48,0xc8,0xc1,0x14,0x01,0x53,0xc2 + ,0x9e,0x06,0xf0,0x4d,0xc7,0x85,0xfc,0x37,0x3c,0xfe,0x0f,0xf0,0xb4,0xd3,0xcf,0xa0,0x68,0xf3,0x4d,0x34,0xde,0x1f,0xd2,0x64,0x96,0x69,0x64,0xd3,0xad,0x9e,0x49,0x65 + ,0x91,0xed,0x4b,0xc9,0x24,0x8e,0xc5,0xdd,0xd8,0x96,0x66,0x62,0xcc,0x49,0x39,0xa0,0x0d,0xff,0x00,0xf8,0x40,0x3c,0x09,0xff,0x00,0x42,0x57,0x84,0xbf,0xf0,0x9b,0xd1 + ,0xff,0x00,0xf9,0x12,0x80,0x0f,0xf8,0x40,0x3c,0x09,0xff,0x00,0x42,0x57,0x84,0xbf,0xf0,0x9b,0xd1,0xff,0x00,0xf9,0x12,0x80,0x0f,0xf8,0x40,0x3c,0x09,0xff,0x00,0x42 + ,0x57,0x84,0xbf,0xf0,0x9b,0xd1,0xff,0x00,0xf9,0x12,0x80,0x0f,0xf8,0x40,0x3c,0x09,0xff,0x00,0x42,0x57,0x84,0xbf,0xf0,0x9b,0xd1,0xff,0x00,0xf9,0x12,0x80,0x39,0x8f + ,0x1b,0xf8,0x23,0xc1,0x76,0x9e,0x0b,0xf1,0x75,0xd5,0xaf,0x84,0x7c,0x31,0x6d,0x73,0x6d,0xe1,0x8d,0x7e,0xe2,0xde,0xe2,0xdf,0x40,0xd2,0xa1,0x9e,0xde,0x78,0x74,0xab + ,0xb9,0x21,0x9a,0x19,0xa3,0xb5,0x59,0x22,0x9a,0x29,0x15,0x64,0x8e,0x48,0xd9,0x5d,0x1d,0x55,0x94,0x86,0x00,0xd0,0x07,0xff,0xd2,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22 + ,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0xc6,0xbc,0x2e,0xfe,0x35,0x12,0xf8,0xb8,0x68,0x96,0xfe,0x16,0x92,0xc7,0xfe,0x13 + ,0x9f,0x13,0xed,0x6d,0x52,0xf3,0x56,0x8a,0xec,0xc9,0xf6,0xef,0x9f,0x72,0x5a,0x59,0x4d,0x08,0x4c,0x6d,0xdb,0x87,0x2d,0xd7,0x38,0xc0,0xa0,0x0e,0xaf,0xcc,0xf8,0x99 + ,0xff,0x00,0x3e,0x9e,0x05,0xff,0x00,0xc1,0x8e,0xbf,0xff,0x00,0xca,0xda,0x00,0x3c,0xcf,0x89,0x9f,0xf3,0xe9,0xe0,0x5f,0xfc,0x18,0xeb,0xff,0x00,0xfc,0xad,0xa0,0x03 + ,0xcc,0xf8,0x99,0xff,0x00,0x3e,0x9e,0x05,0xff,0x00,0xc1,0x8e,0xbf,0xff,0x00,0xca,0xda,0x00,0x3c,0xcf,0x89,0x9f,0xf3,0xe9,0xe0,0x5f,0xfc,0x18,0xeb,0xff,0x00,0xfc + ,0xad,0xa0,0x03,0xcc,0xf8,0x99,0xff,0x00,0x3e,0x9e,0x05,0xff,0x00,0xc1,0x8e,0xbf,0xff,0x00,0xca,0xda,0x00,0xe6,0x3c,0x22,0xff,0x00,0x10,0xc6,0x95,0x77,0xf6,0x5b + ,0x5f,0x06,0x34,0x5f,0xf0,0x93,0xf8,0xdb,0x71,0xb8,0xbe,0xd7,0x16,0x4f,0xb4,0x9f,0x19,0xeb,0xe6,0xf0,0x28,0x8f,0x4f,0x75,0x30,0x2d,0xdf,0x9e,0xb6,0xcc,0x48,0x91 + ,0xed,0x84,0x4f,0x2a,0xa4,0xac,0xe8,0xa0,0x1d,0x3f,0x99,0xf1,0x33,0xfe,0x7d,0x3c,0x0b,0xff,0x00,0x83,0x1d,0x7f,0xff,0x00,0x95,0xb4,0x00,0x79,0x9f,0x13,0x3f,0xe7 + ,0xd3,0xc0,0xbf,0xf8,0x31,0xd7,0xff,0x00,0xf9,0x5b,0x40,0x07,0x99,0xf1,0x33,0xfe,0x7d,0x3c,0x0b,0xff,0x00,0x83,0x1d,0x7f,0xff,0x00,0x95,0xb4,0x00,0x79,0x9f,0x13 + ,0x3f,0xe7,0xd3,0xc0,0xbf,0xf8,0x31,0xd7,0xff,0x00,0xf9,0x5b,0x40,0x07,0x99,0xf1,0x33,0xfe,0x7d,0x3c,0x0b,0xff,0x00,0x83,0x1d,0x7f,0xff,0x00,0x95,0xb4,0x01,0xc6 + ,0xfc,0x3f,0x7f,0x88,0x03,0xc2,0x3a,0x4f,0xd8,0x2d,0x7c,0x1c,0xd6,0x99,0xd4,0x3c,0xa3,0x77,0x7d,0xad,0xa5,0xc7,0xfc,0x85,0x2f,0xbc,0xcf,0x31,0x61,0xd3,0xde,0x31 + ,0x89,0x77,0x84,0xda,0xc7,0x29,0xb0,0xb6,0x18,0x95,0x50,0x0e,0xcb,0xcc,0xf8,0x99,0xff,0x00,0x3e,0x9e,0x05,0xff,0x00,0xc1,0x8e,0xbf,0xff,0x00,0xca,0xda,0x00,0x3c + ,0xcf,0x89,0x9f,0xf3,0xe9,0xe0,0x5f,0xfc,0x18,0xeb,0xff,0x00,0xfc,0xad,0xa0,0x03,0xcc,0xf8,0x99,0xff,0x00,0x3e,0x9e,0x05,0xff,0x00,0xc1,0x8e,0xbf,0xff,0x00,0xca + ,0xda,0x00,0x3c,0xcf,0x89,0x9f,0xf3,0xe9,0xe0,0x5f,0xfc,0x18,0xeb,0xff,0x00,0xfc,0xad,0xa0,0x03,0xcc,0xf8,0x99,0xff,0x00,0x3e,0x9e,0x05,0xff,0x00,0xc1,0x8e,0xbf + ,0xff,0x00,0xca,0xda,0x00,0xe6,0x3c,0x12,0xff,0x00,0x10,0xc7,0x83,0x3c,0x22,0x2c,0xed,0x7c,0x18,0xd6,0x83,0xc3,0x1a,0x07,0xd9,0x5a,0xe6,0xfb,0x5c,0x4b,0x96,0xb6 + ,0xfe,0xca,0xb4,0xf2,0x0d,0xc2,0x45,0xa7,0xbc,0x4b,0x39,0x8b,0x69,0x95,0x63,0x77,0x8d,0x64,0xdc,0x11,0x99,0x40,0x34,0x01,0xd3,0xf9,0x9f,0x13,0x3f,0xe7,0xd3,0xc0 + ,0xbf,0xf8,0x31,0xd7,0xff,0x00,0xf9,0x5b,0x40,0x07,0x99,0xf1,0x33,0xfe,0x7d,0x3c,0x0b,0xff,0x00,0x83,0x1d,0x7f,0xff,0x00,0x95,0xb4,0x00,0x79,0x9f,0x13,0x3f,0xe7 + ,0xd3,0xc0,0xbf,0xf8,0x31,0xd7,0xff,0x00,0xf9,0x5b,0x40,0x07,0x99,0xf1,0x33,0xfe,0x7d,0x3c,0x0b,0xff,0x00,0x83,0x1d,0x7f,0xff,0x00,0x95,0xb4,0x01,0x97,0xad,0xbf + ,0xc4,0x7f,0xec,0x5d,0x5f,0xce,0xb4,0xf0,0x40,0x87,0xfb,0x2e,0xff,0x00,0xcd,0x31,0x6a,0x1a,0xf1,0x90,0x47,0xf6,0x49,0x77,0x98,0xc3,0x69,0xc1,0x4b,0xed,0xce,0xc0 + ,0xc4,0x29,0x6c,0x64,0x81,0x93,0x40,0x15,0x7c,0x2c,0xff,0x00,0x11,0x7f,0xe1,0x18,0xf0,0xe7,0xd9,0x6d,0x7c,0x14,0x6d,0xbf,0xb0,0x74,0x8f,0xb3,0x99,0xef,0xf5,0xc5 + ,0x9c,0xc1,0xfd,0x9f,0x6f,0xe5,0x19,0x96,0x3d,0x39,0xa3,0x12,0x98,0xf6,0xf9,0x82,0x36,0x64,0x0f,0x90,0xa4,0xa8,0x06,0x80,0x37,0xbc,0xcf,0x89,0x9f,0xf3,0xe9,0xe0 + ,0x5f,0xfc,0x18,0xeb,0xff,0x00,0xfc,0xad,0xa0,0x03,0xcc,0xf8,0x99,0xff,0x00,0x3e,0x9e,0x05,0xff,0x00,0xc1,0x8e,0xbf,0xff,0x00,0xca,0xda,0x00,0x3c,0xcf,0x89,0x9f + ,0xf3,0xe9,0xe0,0x5f,0xfc,0x18,0xeb,0xff,0x00,0xfc,0xad,0xa0,0x03,0xcc,0xf8,0x99,0xff,0x00,0x3e,0x9e,0x05,0xff,0x00,0xc1,0x8e,0xbf,0xff,0x00,0xca,0xda,0x00,0xe6 + ,0x7c,0x6a,0xff,0x00,0x10,0xcf,0x83,0x7c,0x5a,0x2f,0x2d,0x7c,0x18,0xb6,0x67,0xc3,0x3a,0xf7,0xda,0xda,0xd6,0xfb,0x5c,0x7b,0x95,0xb6,0xfe,0xca,0xbb,0xf3,0xcd,0xba + ,0x4b,0xa7,0xa4,0x4f,0x38,0x8b,0x71,0x89,0x64,0x74,0x8d,0xa4,0xda,0x1d,0x95,0x49,0x34,0x01,0xff,0xd3,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec + ,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0xc9,0xfc,0x21,0xe2,0x7f,0x0d,0xe9,0x6d,0xe2,0xdb,0x5d,0x4b,0xc4,0x3a,0x1e,0x9d,0x74,0x3c,0x75,0xe2,0x87 + ,0x36,0xd7,0xda,0xb5,0x85,0xa4,0xe1,0x1a,0xf4,0x6d,0x63,0x0d,0xc4,0xf1,0xc8,0x14,0x95,0x21,0x58,0xae,0x0e,0x0e,0x09,0xc1,0xda,0x01,0xd8,0x7f,0xc2,0x71,0xe0,0xbf + ,0xfa,0x1b,0xfc,0x2f,0xff,0x00,0x85,0x06,0x93,0xff,0x00,0xc9,0x74,0x00,0x7f,0xc2,0x71,0xe0,0xbf,0xfa,0x1b,0xfc,0x2f,0xff,0x00,0x85,0x06,0x93,0xff,0x00,0xc9,0x74 + ,0x00,0x7f,0xc2,0x71,0xe0,0xbf,0xfa,0x1b,0xfc,0x2f,0xff,0x00,0x85,0x06,0x93,0xff,0x00,0xc9,0x74,0x00,0x7f,0xc2,0x71,0xe0,0xbf,0xfa,0x1b,0xfc,0x2f,0xff,0x00,0x85 + ,0x06,0x93,0xff,0x00,0xc9,0x74,0x00,0x7f,0xc2,0x71,0xe0,0xbf,0xfa,0x1b,0xfc,0x2f,0xff,0x00,0x85,0x06,0x93,0xff,0x00,0xc9,0x74,0x01,0xcb,0x78,0x3b,0xc6,0x3e,0x11 + ,0xb7,0xd2,0x6e,0xe3,0x9f,0xc5,0x3e,0x1c,0x81,0xdb,0xc5,0x3e,0x39,0x9d,0x52,0x6d,0x73,0x4b,0x8d,0xda,0x1b,0x9f,0x1b,0x78,0x86,0xe6,0xda,0x60,0xaf,0x74,0xa4,0xc5 + ,0x71,0x6f,0x2c,0x53,0xc1,0x20,0x1b,0x25,0x86,0x48,0xe5,0x8c,0xb2,0x3a,0xb3,0x00,0x75,0x3f,0xf0,0x9c,0x78,0x2f,0xfe,0x86,0xff,0x00,0x0b,0xff,0x00,0xe1,0x41,0xa4 + ,0xff,0x00,0xf2,0x5d,0x00,0x1f,0xf0,0x9c,0x78,0x2f,0xfe,0x86,0xff,0x00,0x0b,0xff,0x00,0xe1,0x41,0xa4,0xff,0x00,0xf2,0x5d,0x00,0x1f,0xf0,0x9c,0x78,0x2f,0xfe,0x86 + ,0xff,0x00,0x0b,0xff,0x00,0xe1,0x41,0xa4,0xff,0x00,0xf2,0x5d,0x00,0x1f,0xf0,0x9c,0x78,0x2f,0xfe,0x86,0xff,0x00,0x0b,0xff,0x00,0xe1,0x41,0xa4,0xff,0x00,0xf2,0x5d + ,0x00,0x1f,0xf0,0x9c,0x78,0x2f,0xfe,0x86,0xff,0x00,0x0b,0xff,0x00,0xe1,0x41,0xa4,0xff,0x00,0xf2,0x5d,0x00,0x71,0x5f,0x0e,0xfc,0x5f,0xe1,0x3b,0x4f,0x07,0xe9,0x16 + ,0xf7,0x5e,0x28,0xf0,0xed,0xb4,0xf1,0x9d,0x47,0x7c,0x17,0x1a,0xde,0x99,0x0c,0xc9,0xbf,0x55,0xbe,0x74,0xdf,0x14,0x97,0x2a,0xeb,0xb9,0x19,0x5d,0x72,0xa3,0x72,0x30 + ,0x61,0x95,0x60,0x68,0x03,0xb5,0xff,0x00,0x84,0xe3,0xc1,0x7f,0xf4,0x37,0xf8,0x5f,0xff,0x00,0x0a,0x0d,0x27,0xff,0x00,0x92,0xe8,0x00,0xff,0x00,0x84,0xe3,0xc1,0x7f + ,0xf4,0x37,0xf8,0x5f,0xff,0x00,0x0a,0x0d,0x27,0xff,0x00,0x92,0xe8,0x00,0xff,0x00,0x84,0xe3,0xc1,0x7f,0xf4,0x37,0xf8,0x5f,0xff,0x00,0x0a,0x0d,0x27,0xff,0x00,0x92 + ,0xe8,0x00,0xff,0x00,0x84,0xe3,0xc1,0x7f,0xf4,0x37,0xf8,0x5f,0xff,0x00,0x0a,0x0d,0x27,0xff,0x00,0x92,0xe8,0x00,0xff,0x00,0x84,0xe3,0xc1,0x7f,0xf4,0x37,0xf8,0x5f + ,0xff,0x00,0x0a,0x0d,0x27,0xff,0x00,0x92,0xe8,0x03,0x96,0xf0,0x37,0x8c,0x7c,0x23,0x6d,0xe0,0x9f,0x07,0xdb,0x5c,0xf8,0xa7,0xc3,0x96,0xf7,0x16,0xfe,0x16,0xf0,0xfc + ,0x13,0xc1,0x3e,0xb9,0xa5,0xc5,0x34,0x13,0x45,0xa4,0xda,0x24,0xb0,0xcd,0x13,0xdd,0x2b,0xc7,0x2c,0x6e,0xac,0x92,0x46,0xea,0xae,0x8e,0xa5,0x58,0x02,0x08,0xa0,0x0e + ,0xa7,0xfe,0x13,0x8f,0x05,0xff,0x00,0xd0,0xdf,0xe1,0x7f,0xfc,0x28,0x34,0x9f,0xfe,0x4b,0xa0,0x03,0xfe,0x13,0x8f,0x05,0xff,0x00,0xd0,0xdf,0xe1,0x7f,0xfc,0x28,0x34 + ,0x9f,0xfe,0x4b,0xa0,0x03,0xfe,0x13,0x8f,0x05,0xff,0x00,0xd0,0xdf,0xe1,0x7f,0xfc,0x28,0x34,0x9f,0xfe,0x4b,0xa0,0x03,0xfe,0x13,0x8f,0x05,0xff,0x00,0xd0,0xdf,0xe1 + ,0x7f,0xfc,0x28,0x34,0x9f,0xfe,0x4b,0xa0,0x0c,0xad,0x77,0xc6,0x9e,0x0e,0x93,0x44,0xd6,0x23,0x8f,0xc5,0x9e,0x19,0x92,0x49,0x34,0xad,0x41,0x11,0x13,0x5e,0xd2,0x99 + ,0xdd,0xda,0xd2,0x65,0x54,0x45,0x5b,0xa2,0xcc,0xcc,0xc4,0x05,0x55,0x04,0x92,0x70,0x01,0x27,0x14,0x01,0x57,0xc2,0x7e,0x32,0xf0,0x84,0x1e,0x16,0xf0,0xd4,0x13,0x78 + ,0xaf,0xc3,0x70,0xcd,0x0e,0x81,0xa3,0x45,0x34,0x32,0xeb,0xba,0x5c,0x72,0xc5,0x2c,0x7a,0x75,0xb2,0x49,0x1c,0x91,0xbd,0xd0,0x74,0x91,0x18,0x15,0x74,0x60,0x19,0x58 + ,0x10,0xc0,0x11,0x8a,0x00,0xdf,0xff,0x00,0x84,0xe3,0xc1,0x7f,0xf4,0x37,0xf8,0x5f,0xff,0x00,0x0a,0x0d,0x27,0xff,0x00,0x92,0xe8,0x00,0xff,0x00,0x84,0xe3,0xc1,0x7f + ,0xf4,0x37,0xf8,0x5f,0xff,0x00,0x0a,0x0d,0x27,0xff,0x00,0x92,0xe8,0x00,0xff,0x00,0x84,0xe3,0xc1,0x7f,0xf4,0x37,0xf8,0x5f,0xff,0x00,0x0a,0x0d,0x27,0xff,0x00,0x92 + ,0xe8,0x00,0xff,0x00,0x84,0xe3,0xc1,0x7f,0xf4,0x37,0xf8,0x5f,0xff,0x00,0x0a,0x0d,0x27,0xff,0x00,0x92,0xe8,0x03,0x97,0xf1,0xc7,0x8c,0x7c,0x23,0x73,0xe0,0xbf,0x17 + ,0xdb,0x5b,0x78,0xa7,0xc3,0x97,0x17,0x17,0x1e,0x17,0xf1,0x04,0x10,0x41,0x06,0xb9,0xa6,0x4b,0x34,0xf3,0x4b,0xa4,0xdd,0xc7,0x14,0x30,0xc5,0x1d,0xd3,0x49,0x24,0xb2 + ,0x3b,0x2a,0x47,0x1a,0x2b,0x3b,0xbb,0x05,0x50,0x58,0x81,0x40,0x1f,0xff,0xd4,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9 + ,0xba,0xda,0x80,0x37,0xe8,0x03,0xce,0x7c,0x11,0x63,0x65,0x70,0x9e,0x2c,0x92,0xe2,0xce,0xd6,0x79,0x3f,0xe1,0x3b,0xf1,0x4a,0xef,0x9a,0xde,0x29,0x1f,0x68,0xbd,0x18 + ,0x1b,0x9d,0x58,0xe0,0x64,0xe0,0x67,0x8f,0x7f,0xe1,0x00,0xed,0xff,0x00,0xb2,0xb4,0xbf,0xfa,0x06,0xd8,0x7f,0xe0,0x24,0x1f,0xfc,0x6e,0x80,0x0f,0xec,0xad,0x2f,0xfe + ,0x81,0xb6,0x1f,0xf8,0x09,0x07,0xff,0x00,0x1b,0xa0,0x03,0xfb,0x2b,0x4b,0xff,0x00,0xa0,0x6d,0x87,0xfe,0x02,0x41,0xff,0x00,0xc6,0xe8,0x00,0xfe,0xca,0xd2,0xff,0x00 + ,0xe8,0x1b,0x61,0xff,0x00,0x80,0x90,0x7f,0xf1,0xba,0x00,0x3f,0xb2,0xb4,0xbf,0xfa,0x06,0xd8,0x7f,0xe0,0x24,0x1f,0xfc,0x6e,0x80,0x39,0x3f,0x05,0xe9,0xba,0x6b,0xe8 + ,0xf7,0x85,0xf4,0xfb,0x26,0x23,0xc5,0x9e,0x3d,0x50,0x5a,0xd6,0x12,0x42,0xa7,0x8e,0xbc,0x46,0x88,0xa0,0x94,0x27,0x6a,0x22,0xaa,0x28,0xe8,0xaa,0xa1,0x46,0x00,0xc5 + ,0x00,0x75,0x9f,0xd9,0x5a,0x5f,0xfd,0x03,0x6c,0x3f,0xf0,0x12,0x0f,0xfe,0x37,0x40,0x07,0xf6,0x56,0x97,0xff,0x00,0x40,0xdb,0x0f,0xfc,0x04,0x83,0xff,0x00,0x8d,0xd0 + ,0x01,0xfd,0x95,0xa5,0xff,0x00,0xd0,0x36,0xc3,0xff,0x00,0x01,0x20,0xff,0x00,0xe3,0x74,0x00,0x7f,0x65,0x69,0x7f,0xf4,0x0d,0xb0,0xff,0x00,0xc0,0x48,0x3f,0xf8,0xdd + ,0x00,0x1f,0xd9,0x5a,0x5f,0xfd,0x03,0x6c,0x3f,0xf0,0x12,0x0f,0xfe,0x37,0x40,0x1c,0x37,0xc3,0x6d,0x37,0x4e,0x93,0xc1,0x7a,0x33,0xc9,0x61,0x65,0x23,0x93,0xa9,0x65 + ,0xde,0xd6,0x16,0x63,0x8d,0x5e,0xfc,0x0c,0x92,0x84,0x9c,0x00,0x00,0xc9,0xe0,0x00,0x38,0xa0,0x0e,0xe7,0xfb,0x2b,0x4b,0xff,0x00,0xa0,0x6d,0x87,0xfe,0x02,0x41,0xff + ,0x00,0xc6,0xe8,0x00,0xfe,0xca,0xd2,0xff,0x00,0xe8,0x1b,0x61,0xff,0x00,0x80,0x90,0x7f,0xf1,0xba,0x00,0x3f,0xb2,0xb4,0xbf,0xfa,0x06,0xd8,0x7f,0xe0,0x24,0x1f,0xfc + ,0x6e,0x80,0x0f,0xec,0xad,0x2f,0xfe,0x81,0xb6,0x1f,0xf8,0x09,0x07,0xff,0x00,0x1b,0xa0,0x03,0xfb,0x2b,0x4b,0xff,0x00,0xa0,0x6d,0x87,0xfe,0x02,0x41,0xff,0x00,0xc6 + ,0xe8,0x03,0x93,0xf0,0x16,0x9b,0xa6,0xbf,0x81,0x7c,0x16,0xef,0xa7,0xd9,0x3b,0xbf,0x84,0xfc,0x38,0xce,0xed,0x6b,0x0b,0x33,0xb3,0x68,0xf6,0x65,0x99,0x98,0xa1,0x25 + ,0x98,0x92,0x49,0x27,0x24,0x9c,0x9c,0xe4,0xd0,0x07,0x59,0xfd,0x95,0xa5,0xff,0x00,0xd0,0x36,0xc3,0xff,0x00,0x01,0x20,0xff,0x00,0xe3,0x74,0x00,0x7f,0x65,0x69,0x7f + ,0xf4,0x0d,0xb0,0xff,0x00,0xc0,0x48,0x3f,0xf8,0xdd,0x00,0x1f,0xd9,0x5a,0x5f,0xfd,0x03,0x6c,0x3f,0xf0,0x12,0x0f,0xfe,0x37,0x40,0x07,0xf6,0x56,0x97,0xff,0x00,0x40 + ,0xdb,0x0f,0xfc,0x04,0x83,0xff,0x00,0x8d,0xd0,0x06,0x4e,0xbf,0xa6,0x69,0x8b,0xa1,0x6b,0x4c,0xba,0x75,0x8a,0xb2,0xe9,0x3a,0x89,0x56,0x16,0x90,0x02,0x08,0xb3,0x98 + ,0x82,0x08,0x8f,0x20,0x83,0xc8,0x23,0xa5,0x00,0x53,0xf0,0x86,0x99,0xa6,0xbf,0x84,0xfc,0x2e,0xef,0xa7,0xd8,0xb3,0x37,0x87,0x74,0x56,0x66,0x6b,0x58,0x0b,0x33,0x36 + ,0x9b,0x6a,0x4b,0x31,0x31,0xe4,0x92,0x79,0x24,0xf2,0x4f,0x27,0xad,0x00,0x74,0x5f,0xd9,0x5a,0x5f,0xfd,0x03,0x6c,0x3f,0xf0,0x12,0x0f,0xfe,0x37,0x40,0x07,0xf6,0x56 + ,0x97,0xff,0x00,0x40,0xdb,0x0f,0xfc,0x04,0x83,0xff,0x00,0x8d,0xd0,0x01,0xfd,0x95,0xa5,0xff,0x00,0xd0,0x36,0xc3,0xff,0x00,0x01,0x20,0xff,0x00,0xe3,0x74,0x00,0x7f + ,0x65,0x69,0x7f,0xf4,0x0d,0xb0,0xff,0x00,0xc0,0x48,0x3f,0xf8,0xdd,0x00,0x72,0x9e,0x3c,0xd3,0x74,0xd4,0xf0,0x37,0x8c,0xdd,0x34,0xfb,0x24,0x74,0xf0,0xa7,0x88,0x99 + ,0x1d,0x6d,0x61,0x56,0x46,0x5d,0x22,0xf0,0xab,0x2b,0x04,0x04,0x32,0x90,0x08,0x20,0xe4,0x11,0x91,0x8c,0x0a,0x00,0xff,0xd5,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf + ,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0xc8,0xfc,0x25,0x6d,0xe2,0xa9,0x1f,0xc5,0xcd,0xa5,0x6b,0x3e,0x1f,0xb3,0xb4,0xff,0x00 + ,0x84,0xeb,0xc5,0x01,0x61,0xd4,0x3c,0x35,0xa8,0xea,0x57,0x01,0xfe,0xdc,0x37,0x13,0x75,0x6f,0xe2,0xbd,0x26,0x36,0x52,0x30,0x02,0x8b,0x45,0x2a,0x41,0x25,0xce,0xe5 + ,0x14,0x01,0xd7,0xfd,0x8f,0xc7,0x7f,0xf4,0x31,0xf8,0x4b,0xff,0x00,0x08,0xbd,0x63,0xff,0x00,0x9b,0xea,0x00,0x3e,0xc7,0xe3,0xbf,0xfa,0x18,0xfc,0x25,0xff,0x00,0x84 + ,0x5e,0xb1,0xff,0x00,0xcd,0xf5,0x00,0x1f,0x63,0xf1,0xdf,0xfd,0x0c,0x7e,0x12,0xff,0x00,0xc2,0x2f,0x58,0xff,0x00,0xe6,0xfa,0x80,0x0f,0xb1,0xf8,0xef,0xfe,0x86,0x3f + ,0x09,0x7f,0xe1,0x17,0xac,0x7f,0xf3,0x7d,0x40,0x07,0xd8,0xfc,0x77,0xff,0x00,0x43,0x1f,0x84,0xbf,0xf0,0x8b,0xd6,0x3f,0xf9,0xbe,0xa0,0x0e,0x5b,0xc1,0xf6,0x9e,0x34 + ,0x6d,0x26,0xec,0xdb,0xeb,0xfe,0x17,0x8a,0x3f,0xf8,0x4a,0x7c,0x72,0x19,0x66,0xf0,0x8e,0xab,0x3b,0x99,0xd7,0xc6,0xbe,0x20,0x5b,0xa9,0x03,0xa7,0x8d,0xad,0xc2,0xc5 + ,0x35,0xc8,0x96,0x58,0x21,0x31,0xb3,0xdb,0x40,0xf1,0xdb,0xc9,0x3d,0xd3,0xc4,0xf7,0x33,0x80,0x75,0x3f,0x63,0xf1,0xdf,0xfd,0x0c,0x7e,0x12,0xff,0x00,0xc2,0x2f,0x58 + ,0xff,0x00,0xe6,0xfa,0x80,0x0f,0xb1,0xf8,0xef,0xfe,0x86,0x3f,0x09,0x7f,0xe1,0x17,0xac,0x7f,0xf3,0x7d,0x40,0x07,0xd8,0xfc,0x77,0xff,0x00,0x43,0x1f,0x84,0xbf,0xf0 + ,0x8b,0xd6,0x3f,0xf9,0xbe,0xa0,0x03,0xec,0x7e,0x3b,0xff,0x00,0xa1,0x8f,0xc2,0x5f,0xf8,0x45,0xeb,0x1f,0xfc,0xdf,0x50,0x01,0xf6,0x3f,0x1d,0xff,0x00,0xd0,0xc7,0xe1 + ,0x2f,0xfc,0x22,0xf5,0x8f,0xfe,0x6f,0xa8,0x03,0x8b,0xf8,0x79,0x6b,0xe3,0x26,0xf0,0x7e,0x90,0xd6,0x9a,0xf7,0x86,0x60,0xb7,0x27,0x51,0xf2,0xe2,0xb9,0xf0,0x96,0xa9 + ,0x75,0x32,0xe3,0x55,0xbe,0x0f,0xbe,0x78,0xbc,0x6b,0x68,0x8f,0x97,0xdc,0xcb,0xb6,0xde,0x3d,0xa8,0xca,0x87,0x79,0x52,0xec,0x01,0xda,0x7d,0x8f,0xc7,0x7f,0xf4,0x31 + ,0xf8,0x4b,0xff,0x00,0x08,0xbd,0x63,0xff,0x00,0x9b,0xea,0x00,0x3e,0xc7,0xe3,0xbf,0xfa,0x18,0xfc,0x25,0xff,0x00,0x84,0x5e,0xb1,0xff,0x00,0xcd,0xf5,0x00,0x1f,0x63 + ,0xf1,0xdf,0xfd,0x0c,0x7e,0x12,0xff,0x00,0xc2,0x2f,0x58,0xff,0x00,0xe6,0xfa,0x80,0x0f,0xb1,0xf8,0xef,0xfe,0x86,0x3f,0x09,0x7f,0xe1,0x17,0xac,0x7f,0xf3,0x7d,0x40 + ,0x07,0xd8,0xfc,0x77,0xff,0x00,0x43,0x1f,0x84,0xbf,0xf0,0x8b,0xd6,0x3f,0xf9,0xbe,0xa0,0x0e,0x5b,0xc0,0xd6,0x9e,0x34,0x6f,0x05,0x78,0x3d,0xad,0x75,0xff,0x00,0x0b + ,0xc3,0x6c,0xde,0x16,0xf0,0xf9,0xb7,0x8a,0x7f,0x08,0xea,0xb7,0x13,0xc5,0x01,0xd2,0x6d,0x0c,0x51,0xcd,0x71,0x1f,0x8d,0xad,0x63,0x9e,0x54,0x8f,0x6a,0xc9,0x32,0x5b + ,0x5b,0xa4,0xae,0x0b,0xac,0x10,0xab,0x08,0xd4,0x03,0xa9,0xfb,0x1f,0x8e,0xff,0x00,0xe8,0x63,0xf0,0x97,0xfe,0x11,0x7a,0xc7,0xff,0x00,0x37,0xd4,0x00,0x7d,0x8f,0xc7 + ,0x7f,0xf4,0x31,0xf8,0x4b,0xff,0x00,0x08,0xbd,0x63,0xff,0x00,0x9b,0xea,0x00,0x3e,0xc7,0xe3,0xbf,0xfa,0x18,0xfc,0x25,0xff,0x00,0x84,0x5e,0xb1,0xff,0x00,0xcd,0xf5 + ,0x00,0x1f,0x63,0xf1,0xdf,0xfd,0x0c,0x7e,0x12,0xff,0x00,0xc2,0x2f,0x58,0xff,0x00,0xe6,0xfa,0x80,0x32,0xf5,0xcb,0x3f,0x1b,0x8d,0x17,0x58,0x32,0xf8,0x87,0xc2,0xaf + ,0x10,0xd2,0xf5,0x03,0x22,0x47,0xe0,0xed,0x5e,0x39,0x1e,0x31,0x69,0x2e,0xf5,0x49,0x1b,0xc7,0x52,0xac,0x6e,0xcb,0x90,0xae,0xd1,0x48,0x14,0x9d,0xc6,0x37,0x03,0x6b + ,0x00,0x54,0xf0,0xa5,0xa7,0x8d,0x8f,0x85,0xfc,0x36,0x60,0xf1,0x07,0x85,0xa3,0x80,0xe8,0x1a,0x39,0x86,0x39,0xbc,0x1f,0xab,0x4d,0x2c,0x71,0x1d,0x3a,0xd8,0xc6,0x92 + ,0xcc,0x9e,0x38,0xb7,0x49,0x64,0x54,0xc2,0xbc,0xab,0x04,0x0b,0x23,0x02,0xcb,0x14,0x60,0xec,0x50,0x0d,0xff,0x00,0xb1,0xf8,0xef,0xfe,0x86,0x3f,0x09,0x7f,0xe1,0x17 + ,0xac,0x7f,0xf3,0x7d,0x40,0x07,0xd8,0xfc,0x77,0xff,0x00,0x43,0x1f,0x84,0xbf,0xf0,0x8b,0xd6,0x3f,0xf9,0xbe,0xa0,0x03,0xec,0x7e,0x3b,0xff,0x00,0xa1,0x8f,0xc2,0x5f + ,0xf8,0x45,0xeb,0x1f,0xfc,0xdf,0x50,0x01,0xf6,0x3f,0x1d,0xff,0x00,0xd0,0xc7,0xe1,0x2f,0xfc,0x22,0xf5,0x8f,0xfe,0x6f,0xa8,0x03,0x97,0xf1,0xbd,0xa7,0x8d,0x17,0xc1 + ,0x7e,0x2f,0x6b,0xad,0x7f,0xc2,0xf3,0x5b,0x2f,0x85,0xf5,0xf3,0x71,0x14,0x1e,0x11,0xd5,0x6d,0xa7,0x96,0x01,0xa5,0x5d,0x99,0xa3,0x86,0xe2,0x4f,0x1b,0x5d,0x47,0x04 + ,0xaf,0x1e,0xe5,0x8e,0x67,0xb6,0xb8,0x48,0x9c,0x87,0x68,0x26,0x55,0x31,0xb0,0x07,0xff,0xd6,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3 + ,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0xc7,0x7c,0x2d,0xe3,0x3f,0x0b,0x68,0xb2,0xf8,0xba,0xcb,0x55,0xd7,0x2c,0x2c,0x6e,0xd7,0xc7,0x3e,0x28,0x91,0xa0,0x9e + ,0x52,0xb2,0x04,0x6b,0xec,0x2b,0x10,0x15,0xb8,0x25,0x58,0x0e,0x7f,0x87,0xbe,0x0e,0xd0,0x0e,0xaf,0xfe,0x16,0x4f,0x81,0x3f,0xe8,0x68,0xd2,0xbf,0xef,0xf3,0x7f,0xf1 + ,0xba,0x00,0x3f,0xe1,0x64,0xf8,0x13,0xfe,0x86,0x8d,0x2b,0xfe,0xff,0x00,0x37,0xff,0x00,0x1b,0xa0,0x03,0xfe,0x16,0x4f,0x81,0x3f,0xe8,0x68,0xd2,0xbf,0xef,0xf3,0x7f + ,0xf1,0xba,0x00,0x3f,0xe1,0x64,0xf8,0x13,0xfe,0x86,0x8d,0x2b,0xfe,0xff,0x00,0x37,0xff,0x00,0x1b,0xa0,0x03,0xfe,0x16,0x4f,0x81,0x3f,0xe8,0x68,0xd2,0xbf,0xef,0xf3 + ,0x7f,0xf1,0xba,0x00,0xe5,0xfc,0x21,0xf1,0x03,0xc1,0x76,0xba,0x55,0xdc,0x57,0x1e,0x23,0xd3,0x22,0x91,0xbc,0x51,0xe3,0x7b,0x85,0x57,0x99,0x81,0x30,0x5e,0x78,0xd3 + ,0x5f,0xbb,0xb6,0x94,0x7c,0x87,0xe5,0x9a,0xda,0x78,0x66,0x43,0xdd,0x24,0x53,0x81,0x9c,0x28,0x07,0x51,0xff,0x00,0x0b,0x27,0xc0,0x9f,0xf4,0x34,0x69,0x5f,0xf7,0xf9 + ,0xbf,0xf8,0xdd,0x00,0x1f,0xf0,0xb2,0x7c,0x09,0xff,0x00,0x43,0x46,0x95,0xff,0x00,0x7f,0x9b,0xff,0x00,0x8d,0xd0,0x01,0xff,0x00,0x0b,0x27,0xc0,0x9f,0xf4,0x34,0x69 + ,0x5f,0xf7,0xf9,0xbf,0xf8,0xdd,0x00,0x1f,0xf0,0xb2,0x7c,0x09,0xff,0x00,0x43,0x46,0x95,0xff,0x00,0x7f,0x9b,0xff,0x00,0x8d,0xd0,0x01,0xff,0x00,0x0b,0x27,0xc0,0x9f + ,0xf4,0x34,0x69,0x5f,0xf7,0xf9,0xbf,0xf8,0xdd,0x00,0x71,0x9f,0x0f,0xbc,0x7d,0xe0,0xdb,0x1f,0x08,0x69,0x36,0xb7,0x7e,0x22,0xd3,0x6d,0xee,0x22,0x3a,0x87,0x99,0x14 + ,0x92,0xb0,0x75,0xdf,0xaa,0x5f,0x48,0x99,0x1b,0x0f,0xde,0x47,0x57,0x1c,0xf4,0x61,0xd7,0x34,0x01,0xd9,0xff,0x00,0xc2,0xc9,0xf0,0x27,0xfd,0x0d,0x1a,0x57,0xfd,0xfe + ,0x6f,0xfe,0x37,0x40,0x07,0xfc,0x2c,0x9f,0x02,0x7f,0xd0,0xd1,0xa5,0x7f,0xdf,0xe6,0xff,0x00,0xe3,0x74,0x00,0x7f,0xc2,0xc9,0xf0,0x27,0xfd,0x0d,0x1a,0x57,0xfd,0xfe + ,0x6f,0xfe,0x37,0x40,0x07,0xfc,0x2c,0x9f,0x02,0x7f,0xd0,0xd1,0xa5,0x7f,0xdf,0xe6,0xff,0x00,0xe3,0x74,0x00,0x7f,0xc2,0xc9,0xf0,0x27,0xfd,0x0d,0x1a,0x57,0xfd,0xfe + ,0x6f,0xfe,0x37,0x40,0x1c,0xbf,0x82,0x3e,0x20,0x78,0x2e,0xcf,0xc1,0x7e,0x10,0xb4,0xb9,0xf1,0x1e,0x99,0x0d,0xcd,0xaf,0x85,0xf4,0x0b,0x7b,0x88,0x5e,0x66,0x0f,0x14 + ,0xf0,0x69,0x56,0x91,0x4b,0x13,0x8d,0x87,0x0d,0x1c,0x8a,0xc8,0xc3,0x27,0x04,0x75,0x3d,0x68,0x03,0xa8,0xff,0x00,0x85,0x93,0xe0,0x4f,0xfa,0x1a,0x34,0xaf,0xfb,0xfc + ,0xdf,0xfc,0x6e,0x80,0x0f,0xf8,0x59,0x3e,0x04,0xff,0x00,0xa1,0xa3,0x4a,0xff,0x00,0xbf,0xcd,0xff,0x00,0xc6,0xe8,0x00,0xff,0x00,0x85,0x93,0xe0,0x4f,0xfa,0x1a,0x34 + ,0xaf,0xfb,0xfc,0xdf,0xfc,0x6e,0x80,0x0f,0xf8,0x59,0x3e,0x04,0xff,0x00,0xa1,0xa3,0x4a,0xff,0x00,0xbf,0xcd,0xff,0x00,0xc6,0xe8,0x03,0x2f,0x5b,0xf8,0x8b,0xe0,0x89 + ,0xb4,0x5d,0x5e,0x18,0xbc,0x4d,0xa5,0xbc,0x92,0xe9,0x7a,0x84,0x71,0xa2,0xcc,0xdb,0x9d,0xde,0xd2,0x55,0x45,0x1f,0xbb,0xea,0xcc,0x40,0x1e,0xf4,0x01,0x57,0xc2,0xbf + ,0x10,0xbc,0x13,0x6d,0xe1,0x8f,0x0e,0x5b,0x4f,0xe2,0x4d,0x32,0x29,0xed,0xf4,0x1d,0x1e,0x09,0xa2,0x69,0x98,0x34,0x72,0xc5,0xa7,0xdb,0xa4,0x91,0xb0,0xd8,0x70,0xc8 + ,0xea,0x54,0xf3,0xd4,0x77,0xa0,0x0d,0xef,0xf8,0x59,0x3e,0x04,0xff,0x00,0xa1,0xa3,0x4a,0xff,0x00,0xbf,0xcd,0xff,0x00,0xc6,0xe8,0x00,0xff,0x00,0x85,0x93,0xe0,0x4f + ,0xfa,0x1a,0x34,0xaf,0xfb,0xfc,0xdf,0xfc,0x6e,0x80,0x0f,0xf8,0x59,0x3e,0x04,0xff,0x00,0xa1,0xa3,0x4a,0xff,0x00,0xbf,0xcd,0xff,0x00,0xc6,0xe8,0x00,0xff,0x00,0x85 + ,0x93,0xe0,0x4f,0xfa,0x1a,0x34,0xaf,0xfb,0xfc,0xdf,0xfc,0x6e,0x80,0x39,0x9f,0x1a,0xfc,0x40,0xf0,0x5d,0xe7,0x83,0x7c,0x5b,0x69,0x6b,0xe2,0x3d,0x36,0x7b,0x9b,0xaf + ,0x0c,0xeb,0xd6,0xd6,0xf0,0xc7,0x2b,0x17,0x9a,0x79,0xf4,0xab,0xa8,0xa1,0x89,0x06,0xc1,0x97,0x92,0x46,0x54,0x51,0x9e,0x4b,0x01,0xc5,0x00,0x7f,0xff,0xd7,0xfe,0xf6 + ,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0x83,0xf0,0x17,0xfa,0xaf,0x16,0x7f,0xd8,0xf9,0xe2,0xaf + ,0xfd,0x2d,0x5a,0x00,0xef,0x28,0x00,0xa0,0x02,0x80,0x0a,0x00,0x28,0x03,0x91,0xf0,0x4f,0xfc,0x81,0xaf,0x7f,0xec,0x6e,0xf8,0x81,0xff,0x00,0xa9,0xe7,0x89,0x28,0x03 + ,0xae,0xa0,0x02,0x80,0x0a,0x00,0x28,0x00,0xa0,0x0e,0x13,0xe1,0x9f,0xfc,0x89,0x3a,0x2f,0xd7,0x53,0xff,0x00,0xd3,0xc5,0xfd,0x00,0x77,0x74,0x00,0x50,0x01,0x40,0x05 + ,0x00,0x14,0x01,0xc8,0xfc,0x3f,0xff,0x00,0x91,0x0f,0xc1,0x3f,0xf6,0x28,0xf8,0x6f,0xff,0x00,0x4c,0xd6,0x54,0x01,0xd7,0x50,0x01,0x40,0x05,0x00,0x14,0x01,0x91,0xe2 + ,0x0f,0xf9,0x00,0xeb,0x7f,0xf6,0x08,0xd4,0xbf,0xf4,0x8e,0x6a,0x00,0xa7,0xe0,0xef,0xf9,0x14,0x7c,0x2d,0xff,0x00,0x62,0xe6,0x87,0xff,0x00,0xa6,0xcb,0x5a,0x00,0xe8 + ,0xe8,0x00,0xa0,0x02,0x80,0x0a,0x00,0xe4,0xbc,0x7d,0xff,0x00,0x22,0x27,0x8d,0x7f,0xec,0x52,0xf1,0x1f,0xfe,0x99,0xef,0x68,0x03,0xff,0xd0,0xfe,0xf6,0x7c,0x29,0xff + ,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0xc6,0xfc,0x2d,0xa3,0x6b,0xf7,0x92,0xf8,0xba,0x7d,0x3f,0xc6,0x17,0xda + ,0x3d,0xb9,0xf1,0xcf,0x8a,0x14,0x59,0x43,0xa4,0x68,0x97,0x88,0xac,0x2f,0xbe,0x67,0x13,0x5e,0xd9,0x4d,0x39,0x2d,0x90,0x36,0x97,0x2a,0x02,0x8c,0x60,0x93,0x40,0x1d + ,0x5f,0xfc,0x23,0x9e,0x2d,0xff,0x00,0xa2,0x89,0xa9,0xff,0x00,0xe1,0x3d,0xe1,0x8f,0xfe,0x56,0xd0,0x01,0xff,0x00,0x08,0xe7,0x8b,0x7f,0xe8,0xa2,0x6a,0x7f,0xf8,0x4f + ,0x78,0x63,0xff,0x00,0x95,0xb4,0x00,0x7f,0xc2,0x39,0xe2,0xdf,0xfa,0x28,0x9a,0x9f,0xfe,0x13,0xde,0x18,0xff,0x00,0xe5,0x6d,0x00,0x1f,0xf0,0x8e,0x78,0xb7,0xfe,0x8a + ,0x26,0xa7,0xff,0x00,0x84,0xf7,0x86,0x3f,0xf9,0x5b,0x40,0x07,0xfc,0x23,0x9e,0x2d,0xff,0x00,0xa2,0x89,0xa9,0xff,0x00,0xe1,0x3d,0xe1,0x8f,0xfe,0x56,0xd0,0x07,0x31 + ,0xe1,0x1d,0x03,0xc5,0x12,0xe9,0x57,0x6d,0x07,0x8f,0x35,0x1b,0x54,0x1e,0x27,0xf1,0xb4,0x6d,0x1a,0xe8,0x5e,0x1d,0x94,0x34,0xd0,0xf8,0xcf,0x5f,0x8a,0xe2,0xe0,0xb4 + ,0xba,0x7b,0xb0,0x6b,0xb9,0xd2,0x5b,0xb7,0x8c,0x11,0x14,0x2f,0x39,0x8a,0x15,0x48,0x51,0x11,0x40,0x3a,0x7f,0xf8,0x47,0x3c,0x5b,0xff,0x00,0x45,0x13,0x53,0xff,0x00 + ,0xc2,0x7b,0xc3,0x1f,0xfc,0xad,0xa0,0x03,0xfe,0x11,0xcf,0x16,0xff,0x00,0xd1,0x44,0xd4,0xff,0x00,0xf0,0x9e,0xf0,0xc7,0xff,0x00,0x2b,0x68,0x00,0xff,0x00,0x84,0x73 + ,0xc5,0xbf,0xf4,0x51,0x35,0x3f,0xfc,0x27,0xbc,0x31,0xff,0x00,0xca,0xda,0x00,0x3f,0xe1,0x1c,0xf1,0x6f,0xfd,0x14,0x4d,0x4f,0xff,0x00,0x09,0xef,0x0c,0x7f,0xf2,0xb6 + ,0x80,0x0f,0xf8,0x47,0x3c,0x5b,0xff,0x00,0x45,0x13,0x53,0xff,0x00,0xc2,0x7b,0xc3,0x1f,0xfc,0xad,0xa0,0x0e,0x37,0xe1,0xf6,0x83,0xe2,0x69,0xfc,0x23,0xa4,0xcb,0x6f + ,0xe3,0xad,0x42,0xca,0x16,0x3a,0x86,0xcb,0x68,0xf4,0x3f,0x0f,0x4e,0x91,0xed,0xd5,0x2f,0x55,0xb1,0x2c,0xfa,0x7b,0xca,0xdb,0xdc,0x34,0x87,0x7b,0x36,0xd2,0xc5,0x47 + ,0xca,0xaa,0x14,0x03,0xb2,0xff,0x00,0x84,0x73,0xc5,0xbf,0xf4,0x51,0x35,0x3f,0xfc,0x27,0xbc,0x31,0xff,0x00,0xca,0xda,0x00,0x3f,0xe1,0x1c,0xf1,0x6f,0xfd,0x14,0x4d + ,0x4f,0xff,0x00,0x09,0xef,0x0c,0x7f,0xf2,0xb6,0x80,0x0f,0xf8,0x47,0x3c,0x5b,0xff,0x00,0x45,0x13,0x53,0xff,0x00,0xc2,0x7b,0xc3,0x1f,0xfc,0xad,0xa0,0x03,0xfe,0x11 + ,0xcf,0x16,0xff,0x00,0xd1,0x44,0xd4,0xff,0x00,0xf0,0x9e,0xf0,0xc7,0xff,0x00,0x2b,0x68,0x00,0xff,0x00,0x84,0x73,0xc5,0xbf,0xf4,0x51,0x35,0x3f,0xfc,0x27,0xbc,0x31 + ,0xff,0x00,0xca,0xda,0x00,0xe6,0x3c,0x13,0xa0,0x78,0xa2,0x6f,0x06,0x78,0x46,0x6b,0x7f,0x1e,0x6a,0x36,0x90,0x4b,0xe1,0x8d,0x02,0x48,0x2d,0x13,0x42,0xf0,0xec,0xc9 + ,0x6b,0x0b,0xe9,0x56,0x8d,0x1d,0xba,0x4b,0x36,0x9e,0xf3,0x4a,0xb0,0xa1,0x11,0x2c,0x92,0xbb,0xca,0xe1,0x43,0x48,0xcc,0xe5,0x8d,0x00,0x74,0xff,0x00,0xf0,0x8e,0x78 + ,0xb7,0xfe,0x8a,0x26,0xa7,0xff,0x00,0x84,0xf7,0x86,0x3f,0xf9,0x5b,0x40,0x07,0xfc,0x23,0x9e,0x2d,0xff,0x00,0xa2,0x89,0xa9,0xff,0x00,0xe1,0x3d,0xe1,0x8f,0xfe,0x56 + ,0xd0,0x01,0xff,0x00,0x08,0xe7,0x8b,0x7f,0xe8,0xa2,0x6a,0x7f,0xf8,0x4f,0x78,0x63,0xff,0x00,0x95,0xb4,0x00,0x7f,0xc2,0x39,0xe2,0xdf,0xfa,0x28,0x9a,0x9f,0xfe,0x13 + ,0xde,0x18,0xff,0x00,0xe5,0x6d,0x00,0x65,0xeb,0x7e,0x1e,0xf1,0x5a,0x68,0xba,0xbb,0xc9,0xf1,0x03,0x52,0x95,0x17,0x4b,0xd4,0x19,0xe2,0x3a,0x07,0x86,0x90,0x4a,0x8b + ,0x69,0x29,0x68,0xcb,0x26,0x9c,0x1d,0x43,0x8c,0xa9,0x65,0x21,0x86,0x72,0xa4,0x11,0x9a,0x00,0xab,0xe1,0x6f,0x0f,0xf8,0xa6,0x4f,0x0c,0x78,0x72,0x48,0x7c,0x7d,0xa8 + ,0xdb,0xc5,0x26,0x83,0xa3,0xbc,0x56,0xeb,0xa0,0xf8,0x72,0x45,0x82,0x37,0xd3,0xed,0xd9,0x21,0x59,0x25,0xd3,0x9a,0x59,0x16,0x25,0x21,0x03,0xc8,0xcc,0xec,0x17,0x73 + ,0x92,0xc4,0x9a,0x00,0xde,0xff,0x00,0x84,0x73,0xc5,0xbf,0xf4,0x51,0x35,0x3f,0xfc,0x27,0xbc,0x31,0xff,0x00,0xca,0xda,0x00,0x3f,0xe1,0x1c,0xf1,0x6f,0xfd,0x14,0x4d + ,0x4f,0xff,0x00,0x09,0xef,0x0c,0x7f,0xf2,0xb6,0x80,0x0f,0xf8,0x47,0x3c,0x5b,0xff,0x00,0x45,0x13,0x53,0xff,0x00,0xc2,0x7b,0xc3,0x1f,0xfc,0xad,0xa0,0x03,0xfe,0x11 + ,0xcf,0x16,0xff,0x00,0xd1,0x44,0xd4,0xff,0x00,0xf0,0x9e,0xf0,0xc7,0xff,0x00,0x2b,0x68,0x03,0x99,0xf1,0xae,0x81,0xe2,0x88,0x7c,0x1b,0xe2,0xd9,0xa7,0xf1,0xe6,0xa3 + ,0x77,0x04,0x5e,0x19,0xd7,0xa4,0x9a,0xd1,0xf4,0x2f,0x0e,0xc4,0x97,0x31,0x26,0x95,0x74,0xd2,0x5b,0xbc,0xb0,0xe9,0xe9,0x34,0x6b,0x32,0x03,0x1b,0x49,0x13,0xa4,0xa8 + ,0x1b,0x74,0x6c,0xae,0x14,0xd0,0x07,0xff,0xd1,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03 + ,0xc8,0xfc,0x25,0xe2,0x6d,0x3b,0x4c,0x7f,0x17,0x5a,0xdc,0x5b,0x78,0x82,0x49,0x57,0xc7,0x5e,0x28,0x62,0xda,0x7f,0x84,0xfc,0x55,0xab,0x5b,0xe1,0xaf,0x86,0x00,0xbc + ,0xd2,0xf4,0x6b,0xdb,0x46,0x6e,0x39,0x45,0x9c,0xba,0x8c,0x12,0xa0,0x30,0xa0,0x0e,0xbf,0xfe,0x13,0x5d,0x1f,0xfe,0x7c,0xbc,0x5b,0xff,0x00,0x84,0x0f,0x8e,0xff,0x00 + ,0xf9,0x9b,0xa0,0x03,0xfe,0x13,0x5d,0x1f,0xfe,0x7c,0xbc,0x5b,0xff,0x00,0x84,0x0f,0x8e,0xff,0x00,0xf9,0x9b,0xa0,0x03,0xfe,0x13,0x5d,0x1f,0xfe,0x7c,0xbc,0x5b,0xff + ,0x00,0x84,0x0f,0x8e,0xff,0x00,0xf9,0x9b,0xa0,0x03,0xfe,0x13,0x5d,0x1f,0xfe,0x7c,0xbc,0x5b,0xff,0x00,0x84,0x0f,0x8e,0xff,0x00,0xf9,0x9b,0xa0,0x03,0xfe,0x13,0x5d + ,0x1f,0xfe,0x7c,0xbc,0x5b,0xff,0x00,0x84,0x0f,0x8e,0xff,0x00,0xf9,0x9b,0xa0,0x0e,0x5b,0xc1,0xfe,0x2f,0xd2,0x60,0xd2,0x6e,0xd1,0xed,0x3c,0x50,0xcc,0xde,0x29,0xf1 + ,0xcc,0xc0,0xc3,0xe0,0x8f,0x1a,0x5c,0xa6,0xcb,0x9f,0x1a,0xf8,0x82,0xe2,0x30,0x64,0xb7,0xf0,0xfc,0xb1,0xac,0xab,0x1c,0xaa,0xb3,0xc0,0xcc,0x27,0xb5,0x9c,0x49,0x6b + ,0x73,0x1c,0x57,0x31,0x4d,0x14,0x40,0x1d,0x4f,0xfc,0x26,0xba,0x3f,0xfc,0xf9,0x78,0xb7,0xff,0x00,0x08,0x1f,0x1d,0xff,0x00,0xf3,0x37,0x40,0x07,0xfc,0x26,0xba,0x3f + ,0xfc,0xf9,0x78,0xb7,0xff,0x00,0x08,0x1f,0x1d,0xff,0x00,0xf3,0x37,0x40,0x07,0xfc,0x26,0xba,0x3f,0xfc,0xf9,0x78,0xb7,0xff,0x00,0x08,0x1f,0x1d,0xff,0x00,0xf3,0x37 + ,0x40,0x07,0xfc,0x26,0xba,0x3f,0xfc,0xf9,0x78,0xb7,0xff,0x00,0x08,0x1f,0x1d,0xff,0x00,0xf3,0x37,0x40,0x07,0xfc,0x26,0xba,0x3f,0xfc,0xf9,0x78,0xb7,0xff,0x00,0x08 + ,0x1f,0x1d,0xff,0x00,0xf3,0x37,0x40,0x1c,0x5f,0xc3,0xcf,0x16,0xe9,0x56,0xbe,0x0f,0xd2,0x20,0x96,0xd3,0xc4,0xcc,0xf1,0x9d,0x47,0x73,0x5b,0x78,0x2b,0xc6,0x57,0x90 + ,0x9d,0xda,0xad,0xf3,0x8d,0x97,0x36,0x9a,0x04,0xf6,0xf2,0x60,0x30,0x0d,0xe5,0xca,0xfb,0x1c,0x34,0x6f,0xb5,0xd5,0xd5,0x40,0x3b,0x4f,0xf8,0x4d,0x74,0x7f,0xf9,0xf2 + ,0xf1,0x6f,0xfe,0x10,0x3e,0x3b,0xff,0x00,0xe6,0x6e,0x80,0x0f,0xf8,0x4d,0x74,0x7f,0xf9,0xf2,0xf1,0x6f,0xfe,0x10,0x3e,0x3b,0xff,0x00,0xe6,0x6e,0x80,0x0f,0xf8,0x4d + ,0x74,0x7f,0xf9,0xf2,0xf1,0x6f,0xfe,0x10,0x3e,0x3b,0xff,0x00,0xe6,0x6e,0x80,0x0f,0xf8,0x4d,0x74,0x7f,0xf9,0xf2,0xf1,0x6f,0xfe,0x10,0x3e,0x3b,0xff,0x00,0xe6,0x6e + ,0x80,0x0f,0xf8,0x4d,0x74,0x7f,0xf9,0xf2,0xf1,0x6f,0xfe,0x10,0x3e,0x3b,0xff,0x00,0xe6,0x6e,0x80,0x39,0x6f,0x03,0x78,0xbf,0x49,0xb6,0xf0,0x57,0x83,0xed,0xe4,0xb4 + ,0xf1,0x43,0x49,0x07,0x85,0xbc,0x3f,0x0b,0xb4,0x1e,0x08,0xf1,0xa5,0xd4,0x0c,0xf1,0x69,0x36,0x88,0xc6,0x1b,0xab,0x5f,0x0f,0xcd,0x6d,0x73,0x11,0x65,0x26,0x39,0xed + ,0xe5,0x96,0x09,0x93,0x12,0x43,0x23,0xc6,0xca,0xf4,0x01,0xd4,0xff,0x00,0xc2,0x6b,0xa3,0xff,0x00,0xcf,0x97,0x8b,0x7f,0xf0,0x81,0xf1,0xdf,0xff,0x00,0x33,0x74,0x00 + ,0x7f,0xc2,0x6b,0xa3,0xff,0x00,0xcf,0x97,0x8b,0x7f,0xf0,0x81,0xf1,0xdf,0xff,0x00,0x33,0x74,0x00,0x7f,0xc2,0x6b,0xa3,0xff,0x00,0xcf,0x97,0x8b,0x7f,0xf0,0x81,0xf1 + ,0xdf,0xff,0x00,0x33,0x74,0x00,0x7f,0xc2,0x6b,0xa3,0xff,0x00,0xcf,0x97,0x8b,0x7f,0xf0,0x81,0xf1,0xdf,0xff,0x00,0x33,0x74,0x01,0x97,0xae,0x78,0xcb,0x48,0x97,0x45 + ,0xd6,0x23,0x5b,0x3f,0x15,0x06,0x93,0x4b,0xd4,0x11,0x4c,0x9e,0x04,0xf1,0xbc,0x51,0x86,0x7b,0x49,0x54,0x17,0x96,0x5f,0x0e,0xa4,0x51,0xa0,0x27,0xe6,0x92,0x47,0x48 + ,0xd0,0x7c,0xce,0xca,0xa0,0x9a,0x00,0xa9,0xe1,0x4f,0x18,0xe9,0x30,0x78,0x5f,0xc3,0x70,0xbd,0x9f,0x8a,0x59,0xe1,0xd0,0x34,0x78,0x9d,0xa1,0xf0,0x37,0x8d,0xae,0x22 + ,0x2d,0x1e,0x9d,0x6c,0x8c,0x62,0x9e,0x0f,0x0f,0x49,0x04,0xd1,0x92,0x09,0x49,0xa1,0x92,0x48,0xa4,0x5c,0x3c,0x6e,0xc8,0x55,0x98,0x03,0x7f,0xfe,0x13,0x5d,0x1f,0xfe + ,0x7c,0xbc,0x5b,0xff,0x00,0x84,0x0f,0x8e,0xff,0x00,0xf9,0x9b,0xa0,0x03,0xfe,0x13,0x5d,0x1f,0xfe,0x7c,0xbc,0x5b,0xff,0x00,0x84,0x0f,0x8e,0xff,0x00,0xf9,0x9b,0xa0 + ,0x03,0xfe,0x13,0x5d,0x1f,0xfe,0x7c,0xbc,0x5b,0xff,0x00,0x84,0x0f,0x8e,0xff,0x00,0xf9,0x9b,0xa0,0x03,0xfe,0x13,0x5d,0x1f,0xfe,0x7c,0xbc,0x5b,0xff,0x00,0x84,0x0f + ,0x8e,0xff,0x00,0xf9,0x9b,0xa0,0x0e,0x5f,0xc6,0xfe,0x2f,0xd2,0x6e,0x7c,0x17,0xe2,0xfb,0x78,0xed,0x3c,0x50,0xb2,0x5c,0x78,0x5f,0x5f,0x85,0x1a,0x7f,0x04,0x78,0xd2 + ,0xd6,0x05,0x79,0x74,0xab,0xb4,0x56,0x9a,0xea,0xeb,0xc3,0xf0,0xdb,0x5b,0x44,0x19,0x81,0x92,0x7b,0x89,0x62,0x82,0x14,0xcc,0x93,0x48,0x91,0xab,0x3d,0x00,0x7f,0xff + ,0xd2,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0x83,0xf0,0x17,0xfa,0xaf,0x16,0x7f,0xd8 + ,0xf9,0xe2,0xaf,0xfd,0x2d,0x5a,0x00,0xef,0x28,0x00,0xa0,0x02,0x80,0x0a,0x00,0x28,0x03,0x91,0xf0,0x4f,0xfc,0x81,0xaf,0x7f,0xec,0x6e,0xf8,0x81,0xff,0x00,0xa9,0xe7 + ,0x89,0x28,0x03,0xae,0xa0,0x02,0x80,0x0a,0x00,0x28,0x00,0xa0,0x0e,0x13,0xe1,0x9f,0xfc,0x89,0x3a,0x2f,0xd7,0x53,0xff,0x00,0xd3,0xc5,0xfd,0x00,0x77,0x74,0x00,0x50 + ,0x01,0x40,0x05,0x00,0x14,0x01,0xc8,0xfc,0x3f,0xff,0x00,0x91,0x0f,0xc1,0x3f,0xf6,0x28,0xf8,0x6f,0xff,0x00,0x4c,0xd6,0x54,0x01,0xd7,0x50,0x01,0x40,0x05,0x00,0x14 + ,0x01,0x91,0xe2,0x0f,0xf9,0x00,0xeb,0x7f,0xf6,0x08,0xd4,0xbf,0xf4,0x8e,0x6a,0x00,0xa7,0xe0,0xef,0xf9,0x14,0x7c,0x2d,0xff,0x00,0x62,0xe6,0x87,0xff,0x00,0xa6,0xcb + ,0x5a,0x00,0xe8,0xe8,0x00,0xa0,0x02,0x80,0x0a,0x00,0xe4,0xbc,0x7d,0xff,0x00,0x22,0x27,0x8d,0x7f,0xec,0x52,0xf1,0x1f,0xfe,0x99,0xef,0x68,0x03,0xff,0xd3,0xfe,0xf6 + ,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0xc7,0x7c,0x2d,0xe1,0xdb,0xad,0x46,0x5f,0x17,0x5c,0xc5 + ,0xe2,0xaf,0x13,0xe9,0x48,0x7c,0x73,0xe2,0x84,0xfb,0x26,0x99,0x36,0x8d,0x1d,0xaa,0x95,0xbd,0x1f,0x3a,0xad,0xe6,0x87,0x7d,0x36,0xf6,0xc8,0xdc,0x4c,0xe4,0x1c,0x0c + ,0x28,0x25,0x8b,0x00,0x75,0x7f,0xf0,0x87,0xdf,0xff,0x00,0xd0,0xf9,0xe3,0x7f,0xfc,0x09,0xf0,0xe7,0xff,0x00,0x32,0xf4,0x00,0x7f,0xc2,0x1f,0x7f,0xff,0x00,0x43,0xe7 + ,0x8d,0xff,0x00,0xf0,0x27,0xc3,0x9f,0xfc,0xcb,0xd0,0x01,0xff,0x00,0x08,0x7d,0xff,0x00,0xfd,0x0f,0x9e,0x37,0xff,0x00,0xc0,0x9f,0x0e,0x7f,0xf3,0x2f,0x40,0x07,0xfc + ,0x21,0xf7,0xff,0x00,0xf4,0x3e,0x78,0xdf,0xff,0x00,0x02,0x7c,0x39,0xff,0x00,0xcc,0xbd,0x00,0x1f,0xf0,0x87,0xdf,0xff,0x00,0xd0,0xf9,0xe3,0x7f,0xfc,0x09,0xf0,0xe7 + ,0xff,0x00,0x32,0xf4,0x01,0xcc,0x78,0x47,0xc2,0x97,0xb3,0xe9,0x57,0x6e,0xbe,0x35,0xf1,0x8d,0xb0,0x5f,0x14,0x78,0xde,0x1f,0x2e,0xde,0xe3,0x40,0x11,0xb3,0x5b,0xf8 + ,0xd3,0x5f,0x81,0xa7,0x6f,0x37,0xc3,0x92,0xb7,0x9f,0x74,0xd1,0x1b,0x9b,0x92,0x18,0x46,0x6e,0x66,0x94,0xc3,0x14,0x30,0x94,0x85,0x00,0x3a,0x7f,0xf8,0x43,0xef,0xff + ,0x00,0xe8,0x7c,0xf1,0xbf,0xfe,0x04,0xf8,0x73,0xff,0x00,0x99,0x7a,0x00,0x3f,0xe1,0x0f,0xbf,0xff,0x00,0xa1,0xf3,0xc6,0xff,0x00,0xf8,0x13,0xe1,0xcf,0xfe,0x65,0xe8 + ,0x00,0xff,0x00,0x84,0x3e,0xff,0x00,0xfe,0x87,0xcf,0x1b,0xff,0x00,0xe0,0x4f,0x87,0x3f,0xf9,0x97,0xa0,0x03,0xfe,0x10,0xfb,0xff,0x00,0xfa,0x1f,0x3c,0x6f,0xff,0x00 + ,0x81,0x3e,0x1c,0xff,0x00,0xe6,0x5e,0x80,0x0f,0xf8,0x43,0xef,0xff,0x00,0xe8,0x7c,0xf1,0xbf,0xfe,0x04,0xf8,0x73,0xff,0x00,0x99,0x7a,0x00,0xe3,0x3e,0x1f,0x78,0x5a + ,0xf2,0xe7,0xc2,0x3a,0x4c,0xe9,0xe3,0x3f,0x17,0xda,0x2b,0x9d,0x43,0x16,0xf6,0x93,0xe8,0x2b,0x6f,0x1e,0xdd,0x52,0xf5,0x0f,0x96,0x27,0xf0,0xed,0xc4,0xa3,0x79,0x53 + ,0x23,0xee,0x99,0xf2,0xee,0xc4,0x6d,0x5d,0xa8,0xa0,0x1d,0x9f,0xfc,0x21,0xf7,0xff,0x00,0xf4,0x3e,0x78,0xdf,0xff,0x00,0x02,0x7c,0x39,0xff,0x00,0xcc,0xbd,0x00,0x1f + ,0xf0,0x87,0xdf,0xff,0x00,0xd0,0xf9,0xe3,0x7f,0xfc,0x09,0xf0,0xe7,0xff,0x00,0x32,0xf4,0x00,0x7f,0xc2,0x1f,0x7f,0xff,0x00,0x43,0xe7,0x8d,0xff,0x00,0xf0,0x27,0xc3 + ,0x9f,0xfc,0xcb,0xd0,0x01,0xff,0x00,0x08,0x7d,0xff,0x00,0xfd,0x0f,0x9e,0x37,0xff,0x00,0xc0,0x9f,0x0e,0x7f,0xf3,0x2f,0x40,0x07,0xfc,0x21,0xf7,0xff,0x00,0xf4,0x3e + ,0x78,0xdf,0xff,0x00,0x02,0x7c,0x39,0xff,0x00,0xcc,0xbd,0x00,0x73,0x1e,0x08,0xf0,0xa5,0xed,0xc7,0x82,0xfc,0x23,0x70,0xbe,0x35,0xf1,0x8d,0xaa,0xcf,0xe1,0x8d,0x02 + ,0x65,0xb6,0xb6,0xb8,0xd0,0x05,0xb5,0xba,0xcb,0xa5,0x5a,0x38,0x82,0xdc,0x4d,0xe1,0xc9,0xa5,0x10,0xc2,0x0f,0x97,0x10,0x96,0x69,0x64,0x08,0xaa,0x1e,0x57,0x6c,0xbb + ,0x00,0x74,0xff,0x00,0xf0,0x87,0xdf,0xff,0x00,0xd0,0xf9,0xe3,0x7f,0xfc,0x09,0xf0,0xe7,0xff,0x00,0x32,0xf4,0x00,0x7f,0xc2,0x1f,0x7f,0xff,0x00,0x43,0xe7,0x8d,0xff + ,0x00,0xf0,0x27,0xc3,0x9f,0xfc,0xcb,0xd0,0x01,0xff,0x00,0x08,0x7d,0xff,0x00,0xfd,0x0f,0x9e,0x37,0xff,0x00,0xc0,0x9f,0x0e,0x7f,0xf3,0x2f,0x40,0x07,0xfc,0x21,0xf7 + ,0xff,0x00,0xf4,0x3e,0x78,0xdf,0xff,0x00,0x02,0x7c,0x39,0xff,0x00,0xcc,0xbd,0x00,0x65,0xeb,0x9e,0x11,0xbe,0x8f,0x45,0xd5,0xe4,0x3e,0x39,0xf1,0xa4,0xa1,0x34,0xbd + ,0x41,0xcc,0x52,0x5c,0x78,0x78,0xc7,0x20,0x5b,0x49,0x49,0x8e,0x40,0x9e,0x19,0x47,0x28,0xe0,0x6d,0x6d,0xae,0x8d,0xb4,0x9d,0xac,0xa7,0x9a,0x00,0xab,0xe1,0x5f,0x09 + ,0xde,0xcd,0xe1,0x8f,0x0e,0x4c,0xbe,0x37,0xf1,0x95,0xba,0xcb,0xa0,0xe8,0xf2,0x08,0x20,0xb8,0xf0,0xf8,0x82,0x10,0xfa,0x7d,0xbb,0x08,0xa1,0x12,0x78,0x6a,0x49,0x04 + ,0x51,0x83,0xb2,0x31,0x24,0x92,0x38,0x45,0x1b,0x9d,0x9b,0x2c,0xc0,0x1b,0xdf,0xf0,0x87,0xdf,0xff,0x00,0xd0,0xf9,0xe3,0x7f,0xfc,0x09,0xf0,0xe7,0xff,0x00,0x32,0xf4 + ,0x00,0x7f,0xc2,0x1f,0x7f,0xff,0x00,0x43,0xe7,0x8d,0xff,0x00,0xf0,0x27,0xc3,0x9f,0xfc,0xcb,0xd0,0x01,0xff,0x00,0x08,0x7d,0xff,0x00,0xfd,0x0f,0x9e,0x37,0xff,0x00 + ,0xc0,0x9f,0x0e,0x7f,0xf3,0x2f,0x40,0x07,0xfc,0x21,0xf7,0xff,0x00,0xf4,0x3e,0x78,0xdf,0xff,0x00,0x02,0x7c,0x39,0xff,0x00,0xcc,0xbd,0x00,0x73,0x3e,0x35,0xf0,0xad + ,0xed,0xbf,0x83,0x7c,0x5b,0x70,0xfe,0x35,0xf1,0x85,0xd2,0xc1,0xe1,0x9d,0x7a,0x66,0xb5,0xb9,0xb8,0xd0,0x0d,0xb5,0xca,0xc5,0xa5,0x5d,0x39,0x82,0xe0,0x43,0xe1,0xc8 + ,0x26,0x30,0x4c,0x17,0xcb,0x94,0x45,0x3c,0x32,0x18,0xd9,0x84,0x72,0xc6,0xe4,0x3a,0x80,0x7f,0xff,0xd4,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec + ,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0xc6,0xfc,0x2f,0xe2,0x69,0x34,0xb9,0x7c,0x5d,0x6a,0xbe,0x18,0xf1,0x4e,0xa8,0x07,0x8e,0x7c,0x50,0xff,0x00 + ,0x6a,0xd2,0xac,0x2d,0x2e,0x2d,0x0e,0xeb,0xec,0x6c,0x12,0x4b,0x7f,0x6e,0xfb,0xd7,0x1f,0x30,0x31,0xf0,0x0a,0x90,0x4e,0x7e,0x50,0x0e,0xab,0xfe,0x13,0x79,0xbf,0xe8 + ,0x48,0xf1,0xd7,0xfe,0x0a,0x6c,0x3f,0xf9,0x6d,0x40,0x07,0xfc,0x26,0xf3,0x7f,0xd0,0x91,0xe3,0xaf,0xfc,0x14,0xd8,0x7f,0xf2,0xda,0x80,0x0f,0xf8,0x4d,0xe6,0xff,0x00 + ,0xa1,0x23,0xc7,0x5f,0xf8,0x29,0xb0,0xff,0x00,0xe5,0xb5,0x00,0x1f,0xf0,0x9b,0xcd,0xff,0x00,0x42,0x47,0x8e,0xbf,0xf0,0x53,0x61,0xff,0x00,0xcb,0x6a,0x00,0x3f,0xe1 + ,0x37,0x9b,0xfe,0x84,0x8f,0x1d,0x7f,0xe0,0xa6,0xc3,0xff,0x00,0x96,0xd4,0x01,0xcc,0x78,0x47,0xc6,0x12,0xdb,0xe9,0x57,0x71,0x8f,0x07,0x78,0xce,0xe3,0x77,0x89,0xfc + ,0x6d,0x3f,0x99,0x6f,0xa6,0x59,0x3c,0x6a,0x6e,0x7c,0x67,0xaf,0xdc,0x98,0x18,0xb6,0xa6,0x84,0x4f,0x6c,0x65,0xfb,0x35,0xd2,0x60,0xaa,0x5c,0xc5,0x2a,0x2b,0x3a,0xa8 + ,0x76,0x00,0xe9,0xff,0x00,0xe1,0x37,0x9b,0xfe,0x84,0x8f,0x1d,0x7f,0xe0,0xa6,0xc3,0xff,0x00,0x96,0xd4,0x00,0x7f,0xc2,0x6f,0x37,0xfd,0x09,0x1e,0x3a,0xff,0x00,0xc1 + ,0x4d,0x87,0xff,0x00,0x2d,0xa8,0x00,0xff,0x00,0x84,0xde,0x6f,0xfa,0x12,0x3c,0x75,0xff,0x00,0x82,0x9b,0x0f,0xfe,0x5b,0x50,0x01,0xff,0x00,0x09,0xbc,0xdf,0xf4,0x24 + ,0x78,0xeb,0xff,0x00,0x05,0x36,0x1f,0xfc,0xb6,0xa0,0x03,0xfe,0x13,0x79,0xbf,0xe8,0x48,0xf1,0xd7,0xfe,0x0a,0x6c,0x3f,0xf9,0x6d,0x40,0x1c,0x6f,0xc3,0xff,0x00,0x17 + ,0xcb,0x69,0xe1,0x1d,0x26,0xdc,0x78,0x43,0xc6,0x37,0x61,0x0e,0xa1,0xfb,0xfb,0x4d,0x36,0xca,0x4b,0x79,0x37,0xea,0x97,0xaf,0xfb,0xb7,0x7d,0x4e,0x36,0x3b,0x37,0x6c + ,0x7c,0xa2,0xe1,0xd5,0x86,0x06,0x06,0xe0,0x0e,0xcb,0xfe,0x13,0x79,0xbf,0xe8,0x48,0xf1,0xd7,0xfe,0x0a,0x6c,0x3f,0xf9,0x6d,0x40,0x07,0xfc,0x26,0xf3,0x7f,0xd0,0x91 + ,0xe3,0xaf,0xfc,0x14,0xd8,0x7f,0xf2,0xda,0x80,0x0f,0xf8,0x4d,0xe6,0xff,0x00,0xa1,0x23,0xc7,0x5f,0xf8,0x29,0xb0,0xff,0x00,0xe5,0xb5,0x00,0x1f,0xf0,0x9b,0xcd,0xff + ,0x00,0x42,0x47,0x8e,0xbf,0xf0,0x53,0x61,0xff,0x00,0xcb,0x6a,0x00,0x3f,0xe1,0x37,0x9b,0xfe,0x84,0x8f,0x1d,0x7f,0xe0,0xa6,0xc3,0xff,0x00,0x96,0xd4,0x01,0xcc,0x78 + ,0x27,0xc6,0x12,0xdb,0x78,0x33,0xc2,0x36,0xc3,0xc1,0xde,0x33,0xb9,0x16,0xfe,0x18,0xd0,0x20,0x17,0x36,0xba,0x65,0x94,0x96,0xd7,0x02,0x2d,0x2a,0xd1,0x3c,0xfb,0x77 + ,0x6d,0x4d,0x19,0xe0,0x97,0x6f,0x99,0x13,0xb2,0x23,0x34,0x6c,0xa4,0xaa,0x92,0x45,0x00,0x74,0xff,0x00,0xf0,0x9b,0xcd,0xff,0x00,0x42,0x47,0x8e,0xbf,0xf0,0x53,0x61 + ,0xff,0x00,0xcb,0x6a,0x00,0x3f,0xe1,0x37,0x9b,0xfe,0x84,0x8f,0x1d,0x7f,0xe0,0xa6,0xc3,0xff,0x00,0x96,0xd4,0x00,0x7f,0xc2,0x6f,0x37,0xfd,0x09,0x1e,0x3a,0xff,0x00 + ,0xc1,0x4d,0x87,0xff,0x00,0x2d,0xa8,0x00,0xff,0x00,0x84,0xde,0x6f,0xfa,0x12,0x3c,0x75,0xff,0x00,0x82,0x9b,0x0f,0xfe,0x5b,0x50,0x06,0x5e,0xb7,0xe3,0x49,0xa4,0xd1 + ,0x75,0x78,0xff,0x00,0xe1,0x0b,0xf1,0xbc,0x7e,0x66,0x97,0x7e,0x9e,0x64,0xba,0x5d,0x8a,0xc7,0x1e,0xfb,0x49,0x57,0x7c,0x8c,0x35,0x46,0x21,0x13,0x3b,0x9c,0x85,0x62 + ,0x14,0x12,0x01,0xc6,0x28,0x02,0xaf,0x85,0xbc,0x65,0x34,0x1e,0x18,0xf0,0xe4,0x23,0xc1,0xbe,0x35,0x9c,0x43,0xa0,0xe9,0x11,0x09,0xe0,0xd2,0xec,0x5e,0x09,0xbc,0xbd + ,0x3e,0xdd,0x3c,0xd8,0x5d,0xb5,0x34,0x66,0x8a,0x4c,0x6f,0x8d,0x8a,0x21,0x64,0x60,0x4a,0xae,0x71,0x40,0x1b,0xdf,0xf0,0x9b,0xcd,0xff,0x00,0x42,0x47,0x8e,0xbf,0xf0 + ,0x53,0x61,0xff,0x00,0xcb,0x6a,0x00,0x3f,0xe1,0x37,0x9b,0xfe,0x84,0x8f,0x1d,0x7f,0xe0,0xa6,0xc3,0xff,0x00,0x96,0xd4,0x00,0x7f,0xc2,0x6f,0x37,0xfd,0x09,0x1e,0x3a + ,0xff,0x00,0xc1,0x4d,0x87,0xff,0x00,0x2d,0xa8,0x00,0xff,0x00,0x84,0xde,0x6f,0xfa,0x12,0x3c,0x75,0xff,0x00,0x82,0x9b,0x0f,0xfe,0x5b,0x50,0x07,0x33,0xe3,0x5f,0x18 + ,0x4b,0x73,0xe0,0xdf,0x16,0xdb,0x9f,0x07,0x78,0xce,0xd8,0x5c,0x78,0x67,0x5e,0x84,0xdc,0xdd,0x69,0x96,0x51,0xdb,0x5b,0x89,0x74,0xab,0xb4,0x33,0xdc,0x3a,0x6a,0x72 + ,0x3a,0x41,0x10,0x6f,0x32,0x57,0x58,0xe4,0x65,0x8d,0x58,0xaa,0x31,0x1b,0x58,0x03,0xff,0xd5,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3 + ,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0x83,0xf0,0x17,0xfa,0xaf,0x16,0x7f,0xd8,0xf9,0xe2,0xaf,0xfd,0x2d,0x5a,0x00,0xef,0x28,0x00,0xa0,0x02,0x80,0x0a,0x00 + ,0x28,0x03,0x91,0xf0,0x4f,0xfc,0x81,0xaf,0x7f,0xec,0x6e,0xf8,0x81,0xff,0x00,0xa9,0xe7,0x89,0x28,0x03,0xae,0xa0,0x02,0x80,0x0a,0x00,0x28,0x00,0xa0,0x0e,0x13,0xe1 + ,0x9f,0xfc,0x89,0x3a,0x2f,0xd7,0x53,0xff,0x00,0xd3,0xc5,0xfd,0x00,0x77,0x74,0x00,0x50,0x01,0x40,0x05,0x00,0x14,0x01,0xc8,0xfc,0x3f,0xff,0x00,0x91,0x0f,0xc1,0x3f + ,0xf6,0x28,0xf8,0x6f,0xff,0x00,0x4c,0xd6,0x54,0x01,0xd7,0x50,0x01,0x40,0x05,0x00,0x14,0x01,0x91,0xe2,0x0f,0xf9,0x00,0xeb,0x7f,0xf6,0x08,0xd4,0xbf,0xf4,0x8e,0x6a + ,0x00,0xa7,0xe0,0xef,0xf9,0x14,0x7c,0x2d,0xff,0x00,0x62,0xe6,0x87,0xff,0x00,0xa6,0xcb,0x5a,0x00,0xe8,0xe8,0x00,0xa0,0x02,0x80,0x0a,0x00,0xe4,0xbc,0x7d,0xff,0x00 + ,0x22,0x27,0x8d,0x7f,0xec,0x52,0xf1,0x1f,0xfe,0x99,0xef,0x68,0x03,0xff,0xd6,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9 + ,0xba,0xda,0x80,0x37,0xe8,0x03,0xc8,0xfc,0x25,0xe1,0x9d,0x3b,0x53,0x7f,0x17,0x5d,0x5c,0x5c,0xf8,0x82,0x39,0x5b,0xc7,0x5e,0x28,0x52,0xba,0x7f,0x8b,0x3c,0x55,0xa4 + ,0xdb,0xe1,0x6f,0x86,0x08,0xb3,0xd2,0xf5,0x9b,0x2b,0x45,0x6e,0x79,0x75,0x80,0x3b,0x0c,0x02,0xc4,0x28,0xa0,0x0e,0xbf,0xfe,0x10,0xad,0x1f,0xfe,0x7f,0x7c,0x5b,0xff + ,0x00,0x85,0xf7,0x8e,0xff,0x00,0xf9,0xa4,0xa0,0x03,0xfe,0x10,0xad,0x1f,0xfe,0x7f,0x7c,0x5b,0xff,0x00,0x85,0xf7,0x8e,0xff,0x00,0xf9,0xa4,0xa0,0x03,0xfe,0x10,0xad + ,0x1f,0xfe,0x7f,0x7c,0x5b,0xff,0x00,0x85,0xf7,0x8e,0xff,0x00,0xf9,0xa4,0xa0,0x03,0xfe,0x10,0xad,0x1f,0xfe,0x7f,0x7c,0x5b,0xff,0x00,0x85,0xf7,0x8e,0xff,0x00,0xf9 + ,0xa4,0xa0,0x03,0xfe,0x10,0xad,0x1f,0xfe,0x7f,0x7c,0x5b,0xff,0x00,0x85,0xf7,0x8e,0xff,0x00,0xf9,0xa4,0xa0,0x0e,0x5b,0xc1,0xfe,0x10,0xd2,0x67,0xd2,0x6e,0xdd,0xee + ,0xfc,0x50,0xac,0xbe,0x29,0xf1,0xcc,0x20,0x43,0xe3,0x7f,0x1a,0x5b,0x26,0xcb,0x6f,0x1a,0xf8,0x82,0xde,0x32,0x63,0xb7,0xf1,0x04,0x51,0xb4,0xad,0x1c,0x4a,0xd3,0xce + ,0xca,0x67,0xba,0x9c,0xc9,0x75,0x73,0x24,0xb7,0x32,0xcd,0x2c,0xa0,0x1d,0x4f,0xfc,0x21,0x5a,0x3f,0xfc,0xfe,0xf8,0xb7,0xff,0x00,0x0b,0xef,0x1d,0xff,0x00,0xf3,0x49 + ,0x40,0x07,0xfc,0x21,0x5a,0x3f,0xfc,0xfe,0xf8,0xb7,0xff,0x00,0x0b,0xef,0x1d,0xff,0x00,0xf3,0x49,0x40,0x07,0xfc,0x21,0x5a,0x3f,0xfc,0xfe,0xf8,0xb7,0xff,0x00,0x0b + ,0xef,0x1d,0xff,0x00,0xf3,0x49,0x40,0x07,0xfc,0x21,0x5a,0x3f,0xfc,0xfe,0xf8,0xb7,0xff,0x00,0x0b,0xef,0x1d,0xff,0x00,0xf3,0x49,0x40,0x07,0xfc,0x21,0x5a,0x3f,0xfc + ,0xfe,0xf8,0xb7,0xff,0x00,0x0b,0xef,0x1d,0xff,0x00,0xf3,0x49,0x40,0x1c,0x5f,0xc3,0xcf,0x09,0x69,0x57,0x5e,0x0f,0xd2,0x27,0x96,0xef,0xc4,0xca,0xf2,0x1d,0x47,0x72 + ,0xdb,0x78,0xd7,0xc6,0x56,0x70,0x8d,0xba,0xad,0xf2,0x0d,0x96,0xd6,0x9a,0xfc,0x16,0xf1,0xe4,0x28,0x2d,0xe5,0xc4,0x9b,0xdc,0xb4,0x8f,0xb9,0xd9,0xd9,0x80,0x3b,0x4f + ,0xf8,0x42,0xb4,0x7f,0xf9,0xfd,0xf1,0x6f,0xfe,0x17,0xde,0x3b,0xff,0x00,0xe6,0x92,0x80,0x0f,0xf8,0x42,0xb4,0x7f,0xf9,0xfd,0xf1,0x6f,0xfe,0x17,0xde,0x3b,0xff,0x00 + ,0xe6,0x92,0x80,0x0f,0xf8,0x42,0xb4,0x7f,0xf9,0xfd,0xf1,0x6f,0xfe,0x17,0xde,0x3b,0xff,0x00,0xe6,0x92,0x80,0x0f,0xf8,0x42,0xb4,0x7f,0xf9,0xfd,0xf1,0x6f,0xfe,0x17 + ,0xde,0x3b,0xff,0x00,0xe6,0x92,0x80,0x0f,0xf8,0x42,0xb4,0x7f,0xf9,0xfd,0xf1,0x6f,0xfe,0x17,0xde,0x3b,0xff,0x00,0xe6,0x92,0x80,0x39,0x6f,0x03,0x78,0x43,0x49,0xb9 + ,0xf0,0x57,0x83,0xee,0x24,0xbb,0xf1,0x42,0xc9,0x3f,0x85,0xbc,0x3f,0x33,0xac,0x1e,0x37,0xf1,0xa5,0xac,0x0a,0xf2,0xe9,0x36,0x8e,0xc2,0x1b,0x5b,0x5f,0x10,0x43,0x6d + ,0x6d,0x10,0x66,0x22,0x38,0x2d,0xe2,0x8a,0x08,0x53,0x11,0xc3,0x1a,0x46,0xaa,0x94,0x01,0xd4,0xff,0x00,0xc2,0x15,0xa3,0xff,0x00,0xcf,0xef,0x8b,0x7f,0xf0,0xbe,0xf1 + ,0xdf,0xff,0x00,0x34,0x94,0x00,0x7f,0xc2,0x15,0xa3,0xff,0x00,0xcf,0xef,0x8b,0x7f,0xf0,0xbe,0xf1,0xdf,0xff,0x00,0x34,0x94,0x00,0x7f,0xc2,0x15,0xa3,0xff,0x00,0xcf + ,0xef,0x8b,0x7f,0xf0,0xbe,0xf1,0xdf,0xff,0x00,0x34,0x94,0x00,0x7f,0xc2,0x15,0xa3,0xff,0x00,0xcf,0xef,0x8b,0x7f,0xf0,0xbe,0xf1,0xdf,0xff,0x00,0x34,0x94,0x01,0x97 + ,0xae,0x78,0x37,0x48,0x8b,0x45,0xd6,0x24,0x5b,0xcf,0x15,0x16,0x8f,0x4b,0xd4,0x1d,0x44,0x9e,0x3b,0xf1,0xbc,0xb1,0x96,0x4b,0x49,0x58,0x07,0x8a,0x5f,0x11,0x3c,0x52 + ,0x21,0x23,0xe6,0x8e,0x44,0x78,0xdc,0x7c,0xae,0xac,0xa4,0x8a,0x00,0xa9,0xe1,0x4f,0x07,0x69,0x33,0xf8,0x5f,0xc3,0x73,0x3d,0xe7,0x8a,0x55,0xe6,0xd0,0x34,0x79,0x5d + ,0x61,0xf1,0xcf,0x8d,0xad,0xe2,0x0d,0x26,0x9d,0x6c,0xec,0x22,0x82,0x0f,0x10,0xc7,0x04,0x31,0x82,0x48,0x48,0x61,0x8e,0x38,0xa3,0x5c,0x24,0x68,0xa8,0x15,0x54,0x03 + ,0x7f,0xfe,0x10,0xad,0x1f,0xfe,0x7f,0x7c,0x5b,0xff,0x00,0x85,0xf7,0x8e,0xff,0x00,0xf9,0xa4,0xa0,0x03,0xfe,0x10,0xad,0x1f,0xfe,0x7f,0x7c,0x5b,0xff,0x00,0x85,0xf7 + ,0x8e,0xff,0x00,0xf9,0xa4,0xa0,0x03,0xfe,0x10,0xad,0x1f,0xfe,0x7f,0x7c,0x5b,0xff,0x00,0x85,0xf7,0x8e,0xff,0x00,0xf9,0xa4,0xa0,0x03,0xfe,0x10,0xad,0x1f,0xfe,0x7f + ,0x7c,0x5b,0xff,0x00,0x85,0xf7,0x8e,0xff,0x00,0xf9,0xa4,0xa0,0x0e,0x5f,0xc6,0xfe,0x10,0xd2,0x6d,0xbc,0x17,0xe2,0xfb,0x88,0xee,0xfc,0x50,0xd2,0x5b,0xf8,0x5f,0x5f + ,0x99,0x16,0x7f,0x1b,0xf8,0xd2,0xea,0x06,0x78,0xb4,0xab,0xb7,0x55,0x9a,0xd6,0xeb,0xc4,0x13,0x5b,0x5c,0xc4,0x59,0x40,0x92,0x0b,0x88,0xa5,0x82,0x64,0xcc,0x73,0x46 + ,0xf1,0xb3,0x25,0x00,0x7f,0xff,0xd7,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0xc7,0xfc + ,0x2b,0xad,0x6b,0x36,0x72,0x78,0xba,0x0b,0x2f,0x08,0x6b,0x1a,0xbc,0x03,0xc7,0x5e,0x28,0x61,0x79,0x67,0xa8,0x78,0x6a,0xde,0x16,0x63,0x7d,0xca,0x08,0xf5,0x2d,0x6a + ,0xce,0xe8,0x15,0xc0,0x24,0xb4,0x01,0x48,0x61,0x82,0x48,0x22,0x80,0x3a,0xcf,0xf8,0x49,0x3c,0x47,0xff,0x00,0x44,0xf7,0xc4,0x5f,0xf8,0x37,0xf0,0x5f,0xff,0x00,0x34 + ,0x94,0x00,0x7f,0xc2,0x49,0xe2,0x3f,0xfa,0x27,0xbe,0x22,0xff,0x00,0xc1,0xbf,0x82,0xff,0x00,0xf9,0xa4,0xa0,0x03,0xfe,0x12,0x4f,0x11,0xff,0x00,0xd1,0x3d,0xf1,0x17 + ,0xfe,0x0d,0xfc,0x17,0xff,0x00,0xcd,0x25,0x00,0x1f,0xf0,0x92,0x78,0x8f,0xfe,0x89,0xef,0x88,0xbf,0xf0,0x6f,0xe0,0xbf,0xfe,0x69,0x28,0x00,0xff,0x00,0x84,0x93,0xc4 + ,0x7f,0xf4,0x4f,0x7c,0x45,0xff,0x00,0x83,0x7f,0x05,0xff,0x00,0xf3,0x49,0x40,0x1c,0xbf,0x84,0x3c,0x41,0xaf,0xc5,0xa4,0xdd,0xac,0x5e,0x04,0xd7,0xae,0x54,0xf8,0xa3 + ,0xc6,0xf2,0x19,0x22,0xd5,0x3c,0x22,0x8a,0xb2,0x4d,0xe3,0x4d,0x7e,0x59,0xad,0xc8,0x9f,0xc4,0x11,0x39,0x92,0xd2,0x57,0x7b,0x59,0x5d,0x54,0xc3,0x24,0xb0,0xbc,0x96 + ,0xf2,0x4b,0x6e,0xd1,0x4b,0x28,0x07,0x51,0xff,0x00,0x09,0x27,0x88,0xff,0x00,0xe8,0x9e,0xf8,0x8b,0xff,0x00,0x06,0xfe,0x0b,0xff,0x00,0xe6,0x92,0x80,0x0f,0xf8,0x49 + ,0x3c,0x47,0xff,0x00,0x44,0xf7,0xc4,0x5f,0xf8,0x37,0xf0,0x5f,0xff,0x00,0x34,0x94,0x00,0x7f,0xc2,0x49,0xe2,0x3f,0xfa,0x27,0xbe,0x22,0xff,0x00,0xc1,0xbf,0x82,0xff + ,0x00,0xf9,0xa4,0xa0,0x03,0xfe,0x12,0x4f,0x11,0xff,0x00,0xd1,0x3d,0xf1,0x17,0xfe,0x0d,0xfc,0x17,0xff,0x00,0xcd,0x25,0x00,0x1f,0xf0,0x92,0x78,0x8f,0xfe,0x89,0xef + ,0x88,0xbf,0xf0,0x6f,0xe0,0xbf,0xfe,0x69,0x28,0x03,0x8c,0xf8,0x7b,0xaf,0xeb,0xd0,0x78,0x43,0x49,0x8a,0x0f,0x03,0xeb,0xb7,0xb1,0x29,0xd4,0x76,0xdc,0xc3,0xa9,0xf8 + ,0x4e,0x28,0xe4,0xdd,0xaa,0xdf,0x31,0xda,0x97,0x5a,0xfc,0x33,0xae,0xc6,0x26,0x36,0xdf,0x12,0xe5,0x90,0x94,0xdc,0x85,0x5d,0x80,0x3b,0x3f,0xf8,0x49,0x3c,0x47,0xff + ,0x00,0x44,0xf7,0xc4,0x5f,0xf8,0x37,0xf0,0x5f,0xff,0x00,0x34,0x94,0x00,0x7f,0xc2,0x49,0xe2,0x3f,0xfa,0x27,0xbe,0x22,0xff,0x00,0xc1,0xbf,0x82,0xff,0x00,0xf9,0xa4 + ,0xa0,0x03,0xfe,0x12,0x4f,0x11,0xff,0x00,0xd1,0x3d,0xf1,0x17,0xfe,0x0d,0xfc,0x17,0xff,0x00,0xcd,0x25,0x00,0x1f,0xf0,0x92,0x78,0x8f,0xfe,0x89,0xef,0x88,0xbf,0xf0 + ,0x6f,0xe0,0xbf,0xfe,0x69,0x28,0x00,0xff,0x00,0x84,0x93,0xc4,0x7f,0xf4,0x4f,0x7c,0x45,0xff,0x00,0x83,0x7f,0x05,0xff,0x00,0xf3,0x49,0x40,0x1c,0xbf,0x82,0x3c,0x41 + ,0xaf,0xc3,0xe0,0xbf,0x08,0x43,0x0f,0x81,0x35,0xeb,0xb8,0xa2,0xf0,0xbe,0x81,0x1c,0x57,0x51,0x6a,0x9e,0x11,0x8e,0x2b,0x98,0xd3,0x4a,0xb4,0x54,0xb8,0x8a,0x3b,0x8f + ,0x10,0x43,0x70,0x91,0xcc,0xa0,0x48,0x89,0x3c,0x51,0x4c,0xaa,0xc0,0x4b,0x1a,0x38,0x64,0xa0,0x0e,0xa3,0xfe,0x12,0x4f,0x11,0xff,0x00,0xd1,0x3d,0xf1,0x17,0xfe,0x0d + ,0xfc,0x17,0xff,0x00,0xcd,0x25,0x00,0x1f,0xf0,0x92,0x78,0x8f,0xfe,0x89,0xef,0x88,0xbf,0xf0,0x6f,0xe0,0xbf,0xfe,0x69,0x28,0x00,0xff,0x00,0x84,0x93,0xc4,0x7f,0xf4 + ,0x4f,0x7c,0x45,0xff,0x00,0x83,0x7f,0x05,0xff,0x00,0xf3,0x49,0x40,0x07,0xfc,0x24,0x9e,0x23,0xff,0x00,0xa2,0x7b,0xe2,0x2f,0xfc,0x1b,0xf8,0x2f,0xff,0x00,0x9a,0x4a + ,0x00,0xcb,0xd7,0x3c,0x45,0xe2,0x17,0xd1,0x75,0x74,0x7f,0x00,0x78,0x82,0x24,0x6d,0x2f,0x50,0x56,0x95,0xf5,0x6f,0x07,0x32,0x44,0xad,0x69,0x28,0x69,0x19,0x63,0xf1 + ,0x13,0xc8,0x55,0x01,0x2c,0xc2,0x34,0x77,0x20,0x61,0x55,0x98,0x81,0x40,0x15,0x7c,0x2b,0xe2,0x1f,0x10,0x45,0xe1,0x7f,0x0d,0xc7,0x1f,0x80,0xf5,0xfb,0x88,0xe3,0xd0 + ,0x74,0x74,0x8e,0xe2,0x3d,0x57,0xc2,0x09,0x1c,0xe8,0x9a,0x7d,0xb2,0xa4,0xd1,0xa4,0xde,0x21,0x8e,0x65,0x49,0x54,0x07,0x55,0x96,0x38,0xe5,0x55,0x60,0x24,0x45,0x70 + ,0xca,0xa0,0x1b,0xdf,0xf0,0x92,0x78,0x8f,0xfe,0x89,0xef,0x88,0xbf,0xf0,0x6f,0xe0,0xbf,0xfe,0x69,0x28,0x00,0xff,0x00,0x84,0x93,0xc4,0x7f,0xf4,0x4f,0x7c,0x45,0xff + ,0x00,0x83,0x7f,0x05,0xff,0x00,0xf3,0x49,0x40,0x07,0xfc,0x24,0x9e,0x23,0xff,0x00,0xa2,0x7b,0xe2,0x2f,0xfc,0x1b,0xf8,0x2f,0xff,0x00,0x9a,0x4a,0x00,0x3f,0xe1,0x24 + ,0xf1,0x1f,0xfd,0x13,0xdf,0x11,0x7f,0xe0,0xdf,0xc1,0x7f,0xfc,0xd2,0x50,0x07,0x31,0xe3,0x6f,0x10,0x6b,0xf3,0x78,0x33,0xc5,0xd0,0xcd,0xe0,0x5d,0x7a,0xd2,0x29,0x7c + ,0x31,0xaf,0xc7,0x2d,0xd4,0xda,0xa7,0x84,0xa4,0x8a,0xda,0x37,0xd2,0xae,0xd5,0xee,0x25,0x4b,0x6f,0x10,0x4d,0x70,0xf1,0xc2,0xa4,0xc8,0xe9,0x04,0x32,0xcc,0xca,0xa4 + ,0x45,0x13,0xb9,0x54,0x60,0x0f,0xff,0xd0,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0x83 + ,0xf0,0x17,0xfa,0xaf,0x16,0x7f,0xd8,0xf9,0xe2,0xaf,0xfd,0x2d,0x5a,0x00,0xef,0x28,0x00,0xa0,0x02,0x80,0x0a,0x00,0x28,0x03,0x91,0xf0,0x4f,0xfc,0x81,0xaf,0x7f,0xec + ,0x6e,0xf8,0x81,0xff,0x00,0xa9,0xe7,0x89,0x28,0x03,0xae,0xa0,0x02,0x80,0x0a,0x00,0x28,0x00,0xa0,0x0e,0x13,0xe1,0x9f,0xfc,0x89,0x3a,0x2f,0xd7,0x53,0xff,0x00,0xd3 + ,0xc5,0xfd,0x00,0x77,0x74,0x00,0x50,0x01,0x40,0x05,0x00,0x14,0x01,0xc8,0xfc,0x3f,0xff,0x00,0x91,0x0f,0xc1,0x3f,0xf6,0x28,0xf8,0x6f,0xff,0x00,0x4c,0xd6,0x54,0x01 + ,0xd7,0x50,0x01,0x40,0x05,0x00,0x14,0x01,0x91,0xe2,0x0f,0xf9,0x00,0xeb,0x7f,0xf6,0x08,0xd4,0xbf,0xf4,0x8e,0x6a,0x00,0xa7,0xe0,0xef,0xf9,0x14,0x7c,0x2d,0xff,0x00 + ,0x62,0xe6,0x87,0xff,0x00,0xa6,0xcb,0x5a,0x00,0xe8,0xe8,0x00,0xa0,0x02,0x80,0x0a,0x00,0xe4,0xbc,0x7d,0xff,0x00,0x22,0x27,0x8d,0x7f,0xec,0x52,0xf1,0x1f,0xfe,0x99 + ,0xef,0x68,0x03,0xff,0xd1,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0xc6,0xfc,0x2f,0xe0 + ,0xbf,0x0c,0x6b,0x72,0xf8,0xba,0xfb,0x54,0xd2,0xa3,0xbb,0xbb,0x6f,0x1c,0xf8,0x9e,0x33,0x33,0x4f,0x77,0x19,0x28,0x97,0xd9,0x55,0xdb,0x0d,0xd4,0x49,0xc6,0xe3,0xce + ,0xdc,0xf3,0x82,0x7a,0x05,0x00,0xea,0xbf,0xe1,0x5a,0x78,0x1f,0xfe,0x80,0x10,0xff,0x00,0xe0,0x56,0xa3,0xff,0x00,0xc9,0xd4,0x00,0x7f,0xc2,0xb4,0xf0,0x3f,0xfd,0x00 + ,0x21,0xff,0x00,0xc0,0xad,0x47,0xff,0x00,0x93,0xa8,0x00,0xff,0x00,0x85,0x69,0xe0,0x7f,0xfa,0x00,0x43,0xff,0x00,0x81,0x5a,0x8f,0xff,0x00,0x27,0x50,0x01,0xff,0x00 + ,0x0a,0xd3,0xc0,0xff,0x00,0xf4,0x00,0x87,0xff,0x00,0x02,0xb5,0x1f,0xfe,0x4e,0xa0,0x03,0xfe,0x15,0xa7,0x81,0xff,0x00,0xe8,0x01,0x0f,0xfe,0x05,0x6a,0x3f,0xfc,0x9d + ,0x40,0x1c,0xc7,0x84,0x7e,0x1e,0xf8,0x3a,0xef,0x4a,0xbb,0x96,0xe3,0x44,0x8a,0x49,0x13,0xc4,0xfe,0x36,0xb6,0x56,0x37,0x37,0xe3,0x10,0x59,0x78,0xcf,0x5f,0xb3,0xb6 + ,0x8f,0x0b,0x7a,0xa3,0x11,0x5b,0x41,0x0c,0x40,0x91,0xb9,0x82,0x02,0xec,0xee,0x5d,0xe8,0x03,0xa7,0xff,0x00,0x85,0x69,0xe0,0x7f,0xfa,0x00,0x43,0xff,0x00,0x81,0x5a + ,0x8f,0xff,0x00,0x27,0x50,0x01,0xff,0x00,0x0a,0xd3,0xc0,0xff,0x00,0xf4,0x00,0x87,0xff,0x00,0x02,0xb5,0x1f,0xfe,0x4e,0xa0,0x03,0xfe,0x15,0xa7,0x81,0xff,0x00,0xe8 + ,0x01,0x0f,0xfe,0x05,0x6a,0x3f,0xfc,0x9d,0x40,0x07,0xfc,0x2b,0x4f,0x03,0xff,0x00,0xd0,0x02,0x1f,0xfc,0x0a,0xd4,0x7f,0xf9,0x3a,0x80,0x0f,0xf8,0x56,0x9e,0x07,0xff + ,0x00,0xa0,0x04,0x3f,0xf8,0x15,0xa8,0xff,0x00,0xf2,0x75,0x00,0x71,0xbf,0x0f,0xbe,0x1f,0xf8,0x3e,0xfb,0xc2,0x3a,0x4d,0xd5,0xd6,0x8b,0x14,0xd3,0xca,0x75,0x0d,0xf2 + ,0x1b,0x9b,0xe5,0x2d,0xe5,0xea,0x97,0xd1,0x27,0x09,0x78,0x8b,0xf2,0xc6,0x8a,0xbc,0x2a,0xe7,0x6e,0x4f,0x27,0x2c,0x01,0xd9,0x7f,0xc2,0xb4,0xf0,0x3f,0xfd,0x00,0x21 + ,0xff,0x00,0xc0,0xad,0x47,0xff,0x00,0x93,0xa8,0x00,0xff,0x00,0x85,0x69,0xe0,0x7f,0xfa,0x00,0x43,0xff,0x00,0x81,0x5a,0x8f,0xff,0x00,0x27,0x50,0x01,0xff,0x00,0x0a + ,0xd3,0xc0,0xff,0x00,0xf4,0x00,0x87,0xff,0x00,0x02,0xb5,0x1f,0xfe,0x4e,0xa0,0x03,0xfe,0x15,0xa7,0x81,0xff,0x00,0xe8,0x01,0x0f,0xfe,0x05,0x6a,0x3f,0xfc,0x9d,0x40 + ,0x07,0xfc,0x2b,0x4f,0x03,0xff,0x00,0xd0,0x02,0x1f,0xfc,0x0a,0xd4,0x7f,0xf9,0x3a,0x80,0x39,0x8f,0x04,0xfc,0x3d,0xf0,0x75,0xef,0x83,0x3c,0x23,0x79,0x73,0xa2,0x45 + ,0x2d,0xcd,0xdf,0x86,0x34,0x0b,0x9b,0x89,0x4d,0xcd,0xf8,0x32,0x4f,0x3e,0x95,0x6b,0x2c,0xb2,0x10,0x97,0xaa,0x80,0xbc,0x8c,0xcc,0x42,0xaa,0xa8,0xce,0x15,0x40,0x18 + ,0x50,0x0e,0x9f,0xfe,0x15,0xa7,0x81,0xff,0x00,0xe8,0x01,0x0f,0xfe,0x05,0x6a,0x3f,0xfc,0x9d,0x40,0x07,0xfc,0x2b,0x4f,0x03,0xff,0x00,0xd0,0x02,0x1f,0xfc,0x0a,0xd4 + ,0x7f,0xf9,0x3a,0x80,0x0f,0xf8,0x56,0x9e,0x07,0xff,0x00,0xa0,0x04,0x3f,0xf8,0x15,0xa8,0xff,0x00,0xf2,0x75,0x00,0x1f,0xf0,0xad,0x3c,0x0f,0xff,0x00,0x40,0x08,0x7f + ,0xf0,0x2b,0x51,0xff,0x00,0xe4,0xea,0x00,0xcb,0xd6,0xfe,0x1c,0x78,0x2a,0x1d,0x17,0x57,0x96,0x3d,0x0a,0x24,0x92,0x2d,0x2f,0x50,0x92,0x37,0x17,0x5a,0x86,0x55,0xd2 + ,0xd2,0x56,0x56,0x19,0xbe,0x23,0x21,0x80,0x3c,0x82,0x3d,0x41,0xe9,0x40,0x15,0x7c,0x2d,0xf0,0xef,0xc1,0x97,0x3e,0x18,0xf0,0xe5,0xcc,0xfa,0x1c,0x52,0x4f,0x71,0xa0 + ,0xe8,0xf3,0xcd,0x21,0xba,0xbf,0x05,0xe5,0x97,0x4f,0xb7,0x92,0x47,0x21,0x6f,0x55,0x41,0x67,0x62,0xd8,0x55,0x51,0xcf,0x0a,0x00,0xc2,0x80,0x6f,0x7f,0xc2,0xb4,0xf0 + ,0x3f,0xfd,0x00,0x21,0xff,0x00,0xc0,0xad,0x47,0xff,0x00,0x93,0xa8,0x00,0xff,0x00,0x85,0x69,0xe0,0x7f,0xfa,0x00,0x43,0xff,0x00,0x81,0x5a,0x8f,0xff,0x00,0x27,0x50 + ,0x01,0xff,0x00,0x0a,0xd3,0xc0,0xff,0x00,0xf4,0x00,0x87,0xff,0x00,0x02,0xb5,0x1f,0xfe,0x4e,0xa0,0x03,0xfe,0x15,0xa7,0x81,0xff,0x00,0xe8,0x01,0x0f,0xfe,0x05,0x6a + ,0x3f,0xfc,0x9d,0x40,0x1c,0xcf,0x8d,0x7e,0x1e,0xf8,0x3a,0xcb,0xc1,0xbe,0x2d,0xbc,0xb6,0xd1,0x22,0x8a,0xe6,0xd3,0xc3,0x3a,0xf5,0xcd,0xbc,0xa2,0xe6,0xfc,0x98,0xe7 + ,0x83,0x4a,0xba,0x96,0x29,0x00,0x7b,0xd6,0x42,0x52,0x45,0x56,0x01,0x95,0x94,0xe3,0x0c,0xa4,0x1c,0x30,0x07,0xff,0xd2,0xfe,0xf6,0x7c,0x29,0xff,0x00,0x22,0xbf,0x86 + ,0xff,0x00,0xec,0x01,0xa3,0xff,0x00,0xe9,0xba,0xda,0x80,0x37,0xe8,0x03,0xe4,0x17,0xf8,0xed,0xff,0x00,0x08,0x2e,0xbb,0xe3,0x2d,0x03,0xfe,0x11,0x5f,0xed,0x4f,0x2b + ,0xc6,0x9e,0x24,0x9f,0xed,0x7f,0xdb,0x9f,0x61,0xdd,0xe6,0xdf,0xba,0xed,0xf2,0x3f,0xb2,0x2e,0xf1,0xb7,0xcb,0xce,0xef,0x38,0xe7,0x76,0x36,0x8d,0xb9,0x60,0x09,0xbf + ,0xe1,0xa9,0xff,0x00,0xea,0x44,0xff,0x00,0xcb,0x9f,0xff,0x00,0xc1,0xea,0x00,0x3f,0xe1,0xa9,0xff,0x00,0xea,0x44,0xff,0x00,0xcb,0x9f,0xff,0x00,0xc1,0xea,0x00,0x3f + ,0xe1,0xa9,0xff,0x00,0xea,0x44,0xff,0x00,0xcb,0x9f,0xff,0x00,0xc1,0xea,0x00,0x3f,0xe1,0xa9,0xff,0x00,0xea,0x44,0xff,0x00,0xcb,0x9f,0xff,0x00,0xc1,0xea,0x00,0x3f + ,0xe1,0xa9,0xff,0x00,0xea,0x44,0xff,0x00,0xcb,0x9f,0xff,0x00,0xc1,0xea,0x00,0xc7,0xd0,0xbf,0x69,0x3f,0xec,0x8b,0x29,0xed,0x3f,0xe1,0x0b,0xfb,0x47,0x9b,0xac,0xf8 + ,0x8b,0x53,0xf3,0x3f,0xe1,0x23,0xf2,0x76,0xff,0x00,0x6d,0xf8,0x83,0x53,0xd6,0x7c,0x8d,0x9f,0xd8,0x52,0x67,0xec,0xbf,0x6f,0xfb,0x37,0x9b,0xb8,0x79,0xde,0x57,0x9d + ,0xe5,0xc5,0xbf,0xca,0x50,0x0d,0x8f,0xf8,0x6a,0x7f,0xfa,0x91,0x3f,0xf2,0xe7,0xff,0x00,0xf0,0x7a,0x80,0x0f,0xf8,0x6a,0x7f,0xfa,0x91,0x3f,0xf2,0xe7,0xff,0x00,0xf0 + ,0x7a,0x80,0x0f,0xf8,0x6a,0x7f,0xfa,0x91,0x3f,0xf2,0xe7,0xff,0x00,0xf0,0x7a,0x80,0x0f,0xf8,0x6a,0x7f,0xfa,0x91,0x3f,0xf2,0xe7,0xff,0x00,0xf0,0x7a,0x80,0x0f,0xf8 + ,0x6a,0x7f,0xfa,0x91,0x3f,0xf2,0xe7,0xff,0x00,0xf0,0x7a,0x80,0x30,0x3c,0x2f,0xfb,0x47,0x7f,0xc2,0x3f,0xa1,0x58,0xe9,0x1f,0xf0,0x86,0xfd,0xaf,0xec,0x86,0xe8,0xfd + ,0xa3,0xfe,0x12,0x2f,0x23,0xcc,0xfb,0x45,0xe5,0xc5,0xd7,0xfa,0xaf,0xec,0x39,0xb6,0x6c,0xf3,0xfc,0xbf,0xf5,0x8d,0xbb,0x6e,0xef,0x97,0x76,0xda,0x00,0xdf,0xff,0x00 + ,0x86,0xa7,0xff,0x00,0xa9,0x13,0xff,0x00,0x2e,0x7f,0xff,0x00,0x07,0xa8,0x00,0xff,0x00,0x86,0xa7,0xff,0x00,0xa9,0x13,0xff,0x00,0x2e,0x7f,0xff,0x00,0x07,0xa8,0x00 + ,0xff,0x00,0x86,0xa7,0xff,0x00,0xa9,0x13,0xff,0x00,0x2e,0x7f,0xff,0x00,0x07,0xa8,0x00,0xff,0x00,0x86,0xa7,0xff,0x00,0xa9,0x13,0xff,0x00,0x2e,0x7f,0xff,0x00,0x07 + ,0xa8,0x00,0xff,0x00,0x86,0xa7,0xff,0x00,0xa9,0x13,0xff,0x00,0x2e,0x7f,0xff,0x00,0x07,0xa8,0x03,0x1f,0xc3,0xbf,0xb4,0x9f,0xf6,0x27,0x87,0xf4,0x2d,0x1b,0xfe,0x10 + ,0xbf,0xb5,0x7f,0x64,0x68,0xfa,0x66,0x99,0xf6,0x9f,0xf8,0x48,0xfc,0x9f,0xb4,0x7d,0x82,0xca,0x0b,0x5f,0x3f,0xc9,0xfe,0xc2,0x97,0xca,0xf3,0x7c,0x9f,0x33,0xca,0xf3 + ,0x64,0xf2,0xf7,0x6d,0xf3,0x1f,0x1b,0x98,0x03,0x63,0xfe,0x1a,0x9f,0xfe,0xa4,0x4f,0xfc,0xb9,0xff,0x00,0xfc,0x1e,0xa0,0x03,0xfe,0x1a,0x9f,0xfe,0xa4,0x4f,0xfc,0xb9 + ,0xff,0x00,0xfc,0x1e,0xa0,0x03,0xfe,0x1a,0x9f,0xfe,0xa4,0x4f,0xfc,0xb9,0xff,0x00,0xfc,0x1e,0xa0,0x03,0xfe,0x1a,0x9f,0xfe,0xa4,0x4f,0xfc,0xb9,0xff,0x00,0xfc,0x1e + ,0xa0,0x0a,0x7a,0x8f,0xed,0x3b,0xf6,0xed,0x3e,0xfa,0xcb,0xfe,0x10,0x8f,0x2b,0xed,0x96,0x77,0x36,0xbe,0x6f,0xfc,0x24,0xbb,0xfc,0xbf,0xb4,0x43,0x24,0x5e,0x66,0xcf + ,0xec,0x05,0xdf,0xb3,0x7e,0xed,0xbb,0x97,0x76,0x31,0xb8,0x67,0x2a,0x01,0x0e,0x8b,0xfb,0x4c,0x7f,0x65,0x68,0xfa,0x4e,0x97,0xff,0x00,0x08,0x57,0x9f,0xfd,0x9b,0xa6 + ,0xd8,0xd8,0x79,0xff,0x00,0xf0,0x92,0x79,0x5e,0x77,0xd8,0xed,0x62,0xb7,0xf3,0x7c,0xaf,0xec,0x19,0x3c,0xbf,0x33,0xcb,0xdf,0xe5,0xef,0x7d,0x9b,0xb6,0xef,0x6c,0x6e + ,0xa0,0x0d,0x2f,0xf8,0x6a,0x7f,0xfa,0x91,0x3f,0xf2,0xe7,0xff,0x00,0xf0,0x7a,0x80,0x0f,0xf8,0x6a,0x7f,0xfa,0x91,0x3f,0xf2,0xe7,0xff,0x00,0xf0,0x7a,0x80,0x0f,0xf8 + ,0x6a,0x7f,0xfa,0x91,0x3f,0xf2,0xe7,0xff,0x00,0xf0,0x7a,0x80,0x0f,0xf8,0x6a,0x7f,0xfa,0x91,0x3f,0xf2,0xe7,0xff,0x00,0xf0,0x7a,0x80,0x32,0x3c,0x41,0xfb,0x49,0xff + ,0x00,0x6e,0x68,0x3a,0xde,0x8b,0xff,0x00,0x08,0x5f,0xd9,0x7f,0xb5,0xf4,0x8d,0x4b,0x4b,0xfb,0x4f,0xfc,0x24,0x7e,0x7f,0xd9,0xff,0x00,0xb4,0x2c,0xe6,0xb4,0xf3,0xfc + ,0x9f,0xec,0x28,0x7c,0xef,0x27,0xce,0xf3,0x3c,0xaf,0x36,0x2f,0x33,0x6e,0xcf,0x31,0x33,0xbe,0x80,0x3f,0xff,0xd9,0x00 + }; + + return *data; +}; + +} // namespace xlnt diff --git a/source/detail/format_impl.hpp b/source/detail/format_impl.hpp new file mode 100644 index 00000000..a7047c02 --- /dev/null +++ b/source/detail/format_impl.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace xlnt { + +class alignment; +class border; +class fill; +class font; +class number_format; +class protection; + +namespace detail { + +struct stylesheet; + +struct format_impl +{ + stylesheet *parent; + + std::size_t formatting_record_id; + + optional alignment; + optional border; + optional fill; + optional font; + optional number_format; + optional protection; +}; + +} // namespace detail +} // namespace xlnt diff --git a/source/detail/formatting_record.hpp b/source/detail/formatting_record.hpp new file mode 100644 index 00000000..183e08b1 --- /dev/null +++ b/source/detail/formatting_record.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include + +namespace xlnt { +namespace detail { + +struct formatting_record +{ + std::size_t index; + + bool pivot_button; + bool quote_prefix; + + bool apply_alignment; + std::size_t alignment_id; + + bool apply_border; + std::size_t border_id; + + bool apply_fill; + std::size_t fill_id; + + bool apply_font; + std::size_t font_id; + + bool apply_number_format; + std::size_t number_format_id; + + bool apply_protection; + std::size_t protection_id; +}; + +} // namespace detail +} // namespace xlnt diff --git a/source/detail/style_impl.hpp b/source/detail/style_impl.hpp new file mode 100644 index 00000000..fb5cf31c --- /dev/null +++ b/source/detail/style_impl.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include +#include + +#include + +namespace xlnt { + +class alignment; +class border; +class fill; +class font; +class number_format; +class protection; + +namespace detail { + +struct stylesheet; + +struct style_impl +{ + stylesheet *parent; + + std::string name; + std::size_t formatting_record_id; + + bool custom_built_in; + bool hidden_style; + + optional built_in_style_id; + optional outline_style; + + optional alignment; + optional border; + optional fill; + optional font; + optional number_format; + optional protection; +}; + +} // namespace detail +} // namespace xlnt diff --git a/source/detail/stylesheet.hpp b/source/detail/stylesheet.hpp index 8427e17b..d55cbb73 100644 --- a/source/detail/stylesheet.hpp +++ b/source/detail/stylesheet.hpp @@ -24,129 +24,77 @@ #pragma once #include -#include #include -#include -#include -#include +#include +#include #include -#include #include - -namespace { - -template -std::size_t index(const std::vector &items, const T &to_find) -{ - auto match = std::find(items.begin(), items.end(), to_find); - - if (match == items.end()) - { - throw std::out_of_range("xlnt::stylesheet index lookup"); - } - - return std::distance(items.begin(), match); -} - -template -bool contains(const std::vector &items, const T &to_find) -{ - auto match = std::find(items.begin(), items.end(), to_find); - return match != items.end(); -} - -} // namespace +#include namespace xlnt { namespace detail { struct stylesheet { - ~stylesheet() {} - - std::size_t index(const std::string &style_name) - { - auto match = std::find_if(styles.begin(), styles.end(), - [&](const style &s) { return s.get_name() == style_name; }); - - if (match == styles.end()) - { - throw std::out_of_range("xlnt::stylesheet style index lookup"); - } - - return std::distance(styles.begin(), match); - } - - std::size_t add_format(const format &f) - { - auto match = std::find(formats.begin(), formats.end(), f); - - if (match != formats.end()) - { - return std::distance(formats.begin(), match); - } - - auto number_format_match = std::find_if(number_formats.begin(), number_formats.end(), [&](const number_format &nf) { return nf.get_format_string() == f.get_number_format().get_format_string(); }); - - if (number_format_match == number_formats.end() && f.get_number_format().get_id() >= 164) - { - number_formats.push_back(f.get_number_format()); - } - - formats.push_back(f); - format_styles.push_back("Normal"); - - if (!contains(borders, f.get_border())) - { - borders.push_back(f.get_border()); - } + ~stylesheet() + { + } - if (!contains(fills, f.get_fill())) + format &create_format() + { + formats.push_back(format_impl()); + return format(&formats.back()); + } + + format &get_format(std::size_t index) + { + return format(&formats.at(index)); + } + + style &create_style() + { + styles.push_back(style_impl()); + return style(&styles.back()); + } + + style &get_style(const std::string &name) + { + for (auto &s : styles) { - fills.push_back(f.get_fill()); + if (s.name == name) + { + return style(&s); + } } - if (!contains(fonts, f.get_font())) + throw key_not_found(); + } + + bool has_style(const std::string &name) + { + for (auto &s : styles) { - fonts.push_back(f.get_font()); + if (s.name == name) + { + return true; + } } - - if (f.get_number_format().get_id() >= 164 && !contains(number_formats, f.get_number_format())) - { - number_formats.push_back(f.get_number_format()); - } - - return formats.size() - 1; - } - - std::size_t add_style(const style &s) - { - auto match = std::find(styles.begin(), styles.end(), s); - - if (match != styles.end()) - { - return std::distance(styles.begin(), match); - } - - styles.push_back(s); - return styles.size() - 1; - } - std::vector formats; - std::vector format_styles; - std::vector