diff options
16 files changed, 4390 insertions, 138 deletions
@@ -24,8 +24,10 @@ cc_library_static { "ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.cc", "ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.cc", "ui/events/ozone/evdev/touch_filter/palm_detection_filter.cc", + "ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.cc", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc", + "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.cc", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.cc", ], visibility: [ diff --git a/copy.bara.sky b/copy.bara.sky index e307a40..c270d38 100644 --- a/copy.bara.sky +++ b/copy.bara.sky @@ -19,6 +19,7 @@ core.workflow( "ui/events/ozone/evdev/touch_filter/palm_detection_filter.cc", "ui/events/ozone/evdev/touch_filter/palm_model/**", "ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.h", + "ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.cc", "ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h", "ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.cc", "ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h", @@ -30,6 +31,8 @@ core.workflow( "ui/events/ozone/evdev/touch_filter/palm_detection_filter.h", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h", + "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.cc", + "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.h", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.cc", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc", @@ -59,6 +62,7 @@ core.workflow( "ui/events/ozone/evdev/touch_filter/palm_detection_filter.cc", "ui/events/ozone/evdev/touch_filter/palm_model/**", "ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.h", + "ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.cc", "ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h", "ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.cc", "ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h", @@ -70,6 +74,8 @@ core.workflow( "ui/events/ozone/evdev/touch_filter/palm_detection_filter.h", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.cc", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h", + "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.cc", + "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.h", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.cc", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h", "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc", diff --git a/ui/events/ozone/evdev/touch_evdev_types.cc b/ui/events/ozone/evdev/touch_evdev_types.cc index 4b20d99..83ee59a 100644 --- a/ui/events/ozone/evdev/touch_evdev_types.cc +++ b/ui/events/ozone/evdev/touch_evdev_types.cc @@ -6,12 +6,28 @@ namespace ui { -InProgressTouchEvdev::InProgressTouchEvdev() { -} +InProgressTouchEvdev::InProgressTouchEvdev() = default; InProgressTouchEvdev::InProgressTouchEvdev(const InProgressTouchEvdev& other) = default; -InProgressTouchEvdev::~InProgressTouchEvdev() {} +InProgressTouchEvdev::~InProgressTouchEvdev() = default; + +std::ostream& operator<<(std::ostream& out, const InProgressTouchEvdev& touch) { + out << "InProgressTouchEvdev(x=" << touch.x << ", y=" << touch.y + << ", tracking_id=" << touch.tracking_id << ", slot=" << touch.slot + << ", pressure=" << touch.pressure << ", major=" << touch.major + << ", minor=" << touch.minor << ", tool_type=" << touch.tool_type + << ", altered=" << touch.altered << "was_touching=" << touch.was_touching + << ", touching=" << touch.touching << ")"; + return out; +} + +InProgressStylusState::InProgressStylusState() = default; + +InProgressStylusState::InProgressStylusState( + const InProgressStylusState& other) = default; + +InProgressStylusState::~InProgressStylusState() = default; -} // namespace ui
\ No newline at end of file +} // namespace ui diff --git a/ui/events/ozone/evdev/touch_evdev_types.h b/ui/events/ozone/evdev/touch_evdev_types.h index 9ad9a29..37e0e0a 100644 --- a/ui/events/ozone/evdev/touch_evdev_types.h +++ b/ui/events/ozone/evdev/touch_evdev_types.h @@ -11,6 +11,7 @@ #include <stddef.h> #include "base/component_export.h" +#include "base/time/time.h" #include "ui/events/event_constants.h" namespace ui { @@ -77,6 +78,23 @@ struct COMPONENT_EXPORT(EVDEV) InProgressTouchEvdev { bool stylus_button = false; }; +std::ostream& operator<<(std::ostream& out, const InProgressTouchEvdev& touch); + +// Contains information about stylus event, the useful relate ddevice info and +// the timestamp. +struct COMPONENT_EXPORT(EVDEV) InProgressStylusState { + InProgressStylusState(); + InProgressStylusState(const InProgressStylusState& other); + ~InProgressStylusState(); + + InProgressTouchEvdev stylus_event; + // Stylus x and y resolution, used for normalization. + int x_res = 1; + int y_res = 1; + + base::TimeTicks timestamp = base::TimeTicks(); +}; + } // namespace ui -#endif // UI_EVENTS_OZONE_EVDEV_TOUCH_EVDEV_TYPES_H_
\ No newline at end of file +#endif // UI_EVENTS_OZONE_EVDEV_TOUCH_EVDEV_TYPES_H_ diff --git a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc index d799fd9..1e5724c 100644 --- a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc +++ b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.cc @@ -161,9 +161,8 @@ void NeuralStylusPalmDetectionFilter::Filter( DCHECK(strokes_.count(tracking_id) == 0) << " Tracking id " << tracking_id; - strokes_.emplace( - std::make_pair(tracking_id, PalmFilterStroke(model_->config()))); - strokes_.find(tracking_id)->second.SetTrackingId(tracking_id); + strokes_.emplace(tracking_id, + PalmFilterStroke(model_->config(), tracking_id)); tracking_ids_[slot] = tracking_id; is_palm_.set(slot, false); is_delay_.set(slot, false); @@ -228,7 +227,7 @@ void NeuralStylusPalmDetectionFilter::Filter( config.early_stage_sample_counts.find(stroke.samples_seen()) != config.early_stage_sample_counts.end()) { VLOG(1) << "About to run a early_stage prediction."; - if (DetectSpuriousStroke(ExtractFeatures(tracking_id), tracking_id, + if (DetectSpuriousStroke(ExtractFeatures(tracking_id), model_->config().output_threshold)) { VLOG(1) << "hold detected."; is_delay_.set(slot, true); @@ -245,15 +244,14 @@ void NeuralStylusPalmDetectionFilter::Filter( LOG(DFATAL) << "Unable to find marked stroke."; continue; } - auto& stroke = lookup->second; + const auto& stroke = lookup->second; if (stroke.samples_seen() < model_->config().min_sample_count) { // in very short strokes: we use a heuristic. is_palm_.set(slot, IsHeuristicPalmStroke(stroke)); continue; } - is_palm_.set(slot, - DetectSpuriousStroke(ExtractFeatures(tracking_id), tracking_id, - model_->config().output_threshold)); + is_palm_.set(slot, DetectSpuriousStroke(ExtractFeatures(tracking_id), + model_->config().output_threshold)); if (is_palm_.test(slot)) { shared_palm_state_->latest_palm_touch_time = time; } @@ -320,7 +318,6 @@ bool NeuralStylusPalmDetectionFilter::IsHeuristicPalmStroke( bool NeuralStylusPalmDetectionFilter::DetectSpuriousStroke( const std::vector<float>& features, - int tracking_id, float threshold) const { auto inference_value = model_->Inference(features); if (VLOG_IS_ON(1)) { @@ -534,4 +531,46 @@ void NeuralStylusPalmDetectionFilter::EraseOldStrokes(base::TimeTicks time) { } previous_report_time_ = time; } -} // namespace ui
\ No newline at end of file + +static std::string addLinePrefix(std::string str, const std::string& prefix) { + std::stringstream ss; + bool newLineStarted = true; + for (const auto& ch : str) { + if (newLineStarted) { + ss << prefix; + newLineStarted = false; + } + if (ch == '\n') { + newLineStarted = true; + } + ss << ch; + } + return ss.str(); +} + +std::ostream& operator<<(std::ostream& out, + const NeuralStylusPalmDetectionFilter& filter) { + out << "NeuralStylusPalmDetectionFilter(\n"; + out << " is_palm_ = " << filter.is_palm_ << "\n"; + out << " is_delay_ = " << filter.is_delay_ << "\n"; + out << " strokes_ =\n"; + std::stringstream strokes; + strokes << filter.strokes_; + out << addLinePrefix(strokes.str(), " ") << "\n"; + out << " previous_report_time_ = " << filter.previous_report_time_ << "\n"; + out << " active_tracking_ids_ = " << filter.active_tracking_ids_ << "\n"; + out << " tracking_ids_count_within_session_ = " + << filter.tracking_ids_count_within_session_ << "\n"; + out << " tracking_ids = ["; + for (int i = 0; i < kNumTouchEvdevSlots; i++) { + out << filter.tracking_ids_[i] << ", "; + } + out << "]\n"; + + out << " palm_filter_dev_info_ = " << filter.palm_filter_dev_info_ << "\n"; + out << ")\n"; + + return out; +} + +} // namespace ui diff --git a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h index 027daea..bab332e 100644 --- a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h +++ b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter.h @@ -27,6 +27,28 @@ namespace ui { +#if defined(__ANDROID__) || defined(__ANDROID_HOST__) +const base::TimeDelta kResamplePeriod = base::Milliseconds(8); +#endif + +template <typename K, typename V> +std::ostream& operator<<(std::ostream& out, const std::map<K, V>& map) { + for (const auto& [k, v] : map) { + out << k << " : " << v << "\n"; + } + return out; +} + +template <typename T> +std::ostream& operator<<(std::ostream& out, const std::unordered_set<T>& set) { + out << "{"; + for (const auto& entry : set) { + out << entry << ", "; + } + out << "}"; + return out; +} + // An implementation of PalmDetectionFilter that relies on a DNN implementation // to decide on palm detection. Requires a configured model as an argument. // Heuristics are added for handling short strokes @@ -82,7 +104,6 @@ class COMPONENT_EXPORT(EVDEV) NeuralStylusPalmDetectionFilter std::vector<std::pair<float, int>>* biggest_strokes) const; bool DetectSpuriousStroke(const std::vector<float>& features, - int tracking_id, float threshold) const; // Extracts the feature vector for the specified stroke. std::vector<float> ExtractFeatures(int tracking_id) const; @@ -105,8 +126,15 @@ class COMPONENT_EXPORT(EVDEV) NeuralStylusPalmDetectionFilter int tracking_ids_[kNumTouchEvdevSlots]; const PalmFilterDeviceInfo palm_filter_dev_info_; std::unique_ptr<NeuralStylusPalmDetectionFilterModel> model_; + + friend std::ostream& operator<<( + std::ostream& out, + const NeuralStylusPalmDetectionFilter& filter); }; +std::ostream& operator<<(std::ostream& out, + const NeuralStylusPalmDetectionFilter& filter); + } // namespace ui -#endif // UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_NEURAL_STYLUS_PALM_DETECTION_FILTER_H_
\ No newline at end of file +#endif // UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_NEURAL_STYLUS_PALM_DETECTION_FILTER_H_ diff --git a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h index f40c36d..c2f4863 100644 --- a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h +++ b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_model.h @@ -14,6 +14,7 @@ #include <vector> #include "base/component_export.h" +#include "base/optional.h" #include "base/time/time.h" namespace ui { @@ -95,16 +96,11 @@ struct COMPONENT_EXPORT(EVDEV) NeuralStylusPalmDetectionFilterModelConfig { // check if it's spurious and mark it held if so. std::unordered_set<uint32_t> early_stage_sample_counts; - // True if the touch data should be resampled. Enable this if your device - // has a non-120 Hz touchscreen. Since the model is hardcoded to assume 8 ms - // between samples, non-120Hz touchscreens will not work correctly without - // resampling. - bool resample_touch = false; - - // Time between resampled values. This must match the period hardcoded - // into the model, so it's made const. It can only be updated at compile - // time, together with the model. - const base::TimeDelta resample_period = base::Milliseconds(8.0); + // If set, time between values to resample. Must match the value coded into + // model. Currently the model is developed for 120Hz touch devices, so this + // value must be set to "8 ms" if your device has a different refresh rate. + // If not set, no resampling is done. + base::Optional<base::TimeDelta> resample_period; }; // An abstract model utilized by NueralStylusPalmDetectionFilter. @@ -123,4 +119,4 @@ class COMPONENT_EXPORT(EVDEV) NeuralStylusPalmDetectionFilterModel { } // namespace ui -#endif // UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_NEURAL_STYLUS_PALM_DETECTION_FILTER_MODEL_H_
\ No newline at end of file +#endif // UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_NEURAL_STYLUS_PALM_DETECTION_FILTER_MODEL_H_ diff --git a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.cc b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.cc index b369ece..d1813ef 100644 --- a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.cc +++ b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.cc @@ -65,13 +65,28 @@ float interpolate(float start_value, float end_value, float proportion) { return start_value + (end_value - start_value) * proportion; } +/** + * During resampling, the later events are used as a basis to populate + * non-resampled fields like major and minor. However, if the requested time is + * within this delay of the earlier event, the earlier event will be used as a + * basis instead. + */ +const static auto kPreferInitialEventDelay = + base::TimeDelta::FromMicroseconds(1); + +/** + * Interpolate between the "before" and "after" events to get a resampled value + * at the timestamp 'time'. Not all fields are interpolated. For fields that are + * not interpolated, the values are taken from the 'after' sample unless the + * requested time is very close to the 'before' sample. + */ PalmFilterSample getSampleAtTime(base::TimeTicks time, const PalmFilterSample& before, const PalmFilterSample& after) { // Use the newest sample as the base, except when the requested time is very // close to the 'before' sample. PalmFilterSample result = after; - if (time - before.time < base::TimeDelta::FromMicroseconds(1)) { + if (time - before.time < kPreferInitialEventDelay) { result = before; } // Only the x and y values are interpolated. We could also interpolate the @@ -127,24 +142,25 @@ PalmFilterSample CreatePalmFilterSample( } PalmFilterStroke::PalmFilterStroke( - const NeuralStylusPalmDetectionFilterModelConfig& model_config) - : model_config_(model_config) {} + const NeuralStylusPalmDetectionFilterModelConfig& model_config, + int tracking_id) + : tracking_id_(tracking_id), + max_sample_count_(model_config.max_sample_count), + resample_period_(model_config.resample_period) {} PalmFilterStroke::PalmFilterStroke(const PalmFilterStroke& other) = default; PalmFilterStroke::PalmFilterStroke(PalmFilterStroke&& other) = default; +PalmFilterStroke::~PalmFilterStroke() {} void PalmFilterStroke::ProcessSample(const PalmFilterSample& sample) { - if (samples_seen_ == 0) { - tracking_id_ = sample.tracking_id; - } DCHECK_EQ(tracking_id_, sample.tracking_id); - if (model_config_.resample_touch) { + if (resample_period_.has_value()) { Resample(sample); return; } AddSample(sample); - while (samples_.size() > model_config_.max_sample_count) { + while (samples_.size() > max_sample_count_) { AddToUnscaledCentroid(-samples_.front().point.OffsetFromOrigin()); samples_.pop_front(); } @@ -171,17 +187,16 @@ void PalmFilterStroke::Resample(const PalmFilterSample& sample) { // We already have a valid last sample here. DCHECK_LE(last_sample_.time, sample.time); // Generate resampled values - base::TimeTicks next_sample_time = - samples_.back().time + model_config_.resample_period; + base::TimeTicks next_sample_time = samples_.back().time + *resample_period_; while (next_sample_time <= sample.time) { AddSample(getSampleAtTime(next_sample_time, last_sample_, sample)); - next_sample_time = samples_.back().time + model_config_.resample_period; + next_sample_time = samples_.back().time + (*resample_period_); } last_sample_ = sample; // Prune the resampled collection while ((samples_.back().time - samples_.front().time) >= - model_config_.resample_period * model_config_.max_sample_count) { + (*resample_period_) * max_sample_count_) { AddToUnscaledCentroid(-samples_.front().point.OffsetFromOrigin()); samples_.pop_front(); } @@ -215,10 +230,6 @@ uint64_t PalmFilterStroke::samples_seen() const { return samples_seen_; } -void PalmFilterStroke::SetTrackingId(int tracking_id) { - tracking_id_ = tracking_id; -} - float PalmFilterStroke::MaxMajorRadius() const { float maximum = 0.0; for (const auto& sample : samples_) { @@ -241,4 +252,76 @@ float PalmFilterStroke::BiggestSize() const { return biggest; } -} // namespace ui
\ No newline at end of file +static std::string addLinePrefix(std::string str, const std::string& prefix) { + std::stringstream ss; + bool newLineStarted = true; + for (const auto& ch : str) { + if (newLineStarted) { + ss << prefix; + newLineStarted = false; + } + if (ch == '\n') { + newLineStarted = true; + } + ss << ch; + } + return ss.str(); +} + +std::ostream& operator<<(std::ostream& out, const gfx::PointF& point) { + out << "PointF(" << point.x() << ", " << point.y() << ")"; + return out; +} + +std::ostream& operator<<(std::ostream& out, const gfx::Vector2dF& vec) { + out << "Vector2dF(" << vec.x() << ", " << vec.y() << ")"; + return out; +} + +std::ostream& operator<<(std::ostream& out, const PalmFilterDeviceInfo& info) { + out << "PalmFilterDeviceInfo(max_x=" << info.max_x; + out << ", max_y=" << info.max_y; + out << ", x_res=" << info.x_res; + out << ", y_res=" << info.y_res; + out << ", major_radius_res=" << info.major_radius_res; + out << ", minor_radius_res=" << info.minor_radius_res; + out << ", minor_radius_supported=" << info.minor_radius_supported; + out << ")"; + return out; +} + +std::ostream& operator<<(std::ostream& out, const PalmFilterSample& sample) { + out << "PalmFilterSample(major=" << sample.major_radius + << ", minor=" << sample.minor_radius << ", pressure=" << sample.pressure + << ", edge=" << sample.edge << ", tracking_id=" << sample.tracking_id + << ", point=" << sample.point << ", time=" << sample.time << ")"; + return out; +} + +std::ostream& operator<<(std::ostream& out, const PalmFilterStroke& stroke) { + out << "PalmFilterStroke(\n"; + out << " GetCentroid() = " << stroke.GetCentroid() << "\n"; + out << " BiggestSize() = " << stroke.BiggestSize() << "\n"; + out << " MaxMajorRadius() = " << stroke.MaxMajorRadius() << "\n"; + std::stringstream stream; + stream << stroke.samples(); + out << " samples (" << stroke.samples().size() << " total): \n" + << addLinePrefix(stream.str(), " ") << "\n"; + out << " samples_seen() = " << stroke.samples_seen() << "\n"; + out << " tracking_id() = " << stroke.tracking_id() << "\n"; + out << " max_sample_count_ = " << stroke.max_sample_count_ << "\n"; + if (stroke.resample_period_) { + out << " resample_period_ = " << *(stroke.resample_period_) << "\n"; + out << " last_sample_ = " << stroke.last_sample_ << "\n"; + } else { + out << " resample_period_ = <not set>\n"; + out << " last_sample_ = <not valid b/c resampling is off>\n"; + } + out << " unscaled_centroid_ = " << stroke.unscaled_centroid_ << "\n"; + out << " unscaled_centroid_sum_error_ = " + << stroke.unscaled_centroid_sum_error_ << "\n"; + out << ")\n"; + return out; +} + +} // namespace ui diff --git a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.h b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.h index 0052364..47f0c33 100644 --- a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.h +++ b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util.h @@ -12,6 +12,7 @@ #if defined(__ANDROID__) || defined(__ANDROID_HOST__) #undef LOG_INFO #undef LOG_WARNING +#include <chrome_to_android_compatibility_test_support.h> #endif #include "base/time/time.h" #if !defined(__ANDROID__) && !defined(__ANDROID_HOST__) @@ -36,6 +37,8 @@ struct COMPONENT_EXPORT(EVDEV) PalmFilterDeviceInfo { #endif }; +std::ostream& operator<<(std::ostream& out, const PalmFilterDeviceInfo& info); + #if !defined(__ANDROID__) && !defined(__ANDROID_HOST__) COMPONENT_EXPORT(EVDEV) PalmFilterDeviceInfo CreatePalmFilterDeviceInfo(const EventDeviceInfo& devinfo); @@ -50,8 +53,17 @@ struct COMPONENT_EXPORT(EVDEV) PalmFilterSample { int tracking_id = 0; gfx::PointF point; base::TimeTicks time; + + bool operator==(const PalmFilterSample& other) const { + return major_radius == other.major_radius && + minor_radius == other.minor_radius && pressure == other.pressure && + edge == other.edge && tracking_id == other.tracking_id && + point == other.point && time == other.time; + } }; +std::ostream& operator<<(std::ostream& out, const PalmFilterSample& sample); + COMPONENT_EXPORT(EVDEV) PalmFilterSample CreatePalmFilterSample( const InProgressTouchEvdev& touch, @@ -62,16 +74,17 @@ PalmFilterSample CreatePalmFilterSample( class COMPONENT_EXPORT(EVDEV) PalmFilterStroke { public: explicit PalmFilterStroke( - const NeuralStylusPalmDetectionFilterModelConfig& model_config); + const NeuralStylusPalmDetectionFilterModelConfig& model_config, + int tracking_id); PalmFilterStroke(const PalmFilterStroke& other); PalmFilterStroke(PalmFilterStroke&& other); + ~PalmFilterStroke(); void ProcessSample(const PalmFilterSample& sample); gfx::PointF GetCentroid() const; float BiggestSize() const; // If no elements in stroke, returns 0.0; float MaxMajorRadius() const; - void SetTrackingId(int tracking_id); const std::deque<PalmFilterSample>& samples() const; uint64_t samples_seen() const; int tracking_id() const; @@ -85,7 +98,7 @@ class COMPONENT_EXPORT(EVDEV) PalmFilterStroke { void Resample(const PalmFilterSample& sample); std::deque<PalmFilterSample> samples_; - int tracking_id_ = 0; + const int tracking_id_; /** * How many total samples have been reported for this stroke. This is * different from samples_.size() because samples_ will get pruned to only @@ -100,13 +113,28 @@ class COMPONENT_EXPORT(EVDEV) PalmFilterStroke { * to compute the resampled value. */ PalmFilterSample last_sample_; - const NeuralStylusPalmDetectionFilterModelConfig& model_config_; + + const uint64_t max_sample_count_; + const base::Optional<base::TimeDelta> resample_period_; + gfx::PointF unscaled_centroid_ = gfx::PointF(0., 0.); // Used in part of the kahan summation. gfx::Vector2dF unscaled_centroid_sum_error_ = gfx::PointF(0., 0.).OffsetFromOrigin(); + friend std::ostream& operator<<(std::ostream& out, + const PalmFilterStroke& stroke); }; +template <typename T> +std::ostream& operator<<(std::ostream& out, const std::deque<T>& queue) { + for (const auto& entry : queue) { + out << entry << "\n"; + } + return out; +} + +std::ostream& operator<<(std::ostream& out, const PalmFilterStroke& filter); + } // namespace ui -#endif // UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_NEURAL_STYLUS_PALM_DETECTION_FILTER_UTIL_H_
\ No newline at end of file +#endif // UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_NEURAL_STYLUS_PALM_DETECTION_FILTER_UTIL_H_ diff --git a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util_unittest.cc b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util_unittest.cc index 18b4d15..ac3c841 100644 --- a/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util_unittest.cc +++ b/ui/events/ozone/evdev/touch_filter/neural_stylus_palm_detection_filter_util_unittest.cc @@ -9,6 +9,7 @@ #include <utility> #include <vector> +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #if defined(__ANDROID__) || defined(__ANDROID_HOST__) #include <linux/input-event-codes.h> @@ -20,6 +21,9 @@ #include "ui/events/ozone/evdev/touch_filter/palm_detection_filter.h" #include "ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.h" +using ::testing::ElementsAre; +using ::testing::IsEmpty; + namespace ui { #if defined(__ANDROID__) || defined(__ANDROID_HOST__) @@ -83,6 +87,11 @@ bool CapabilitiesToDeviceInfo(DeviceType, EventDeviceInfo*) { } #endif +MATCHER_P(SampleTime, time, "Does the sample have given time.") { + *result_listener << "Sample time" << arg.time << " is not " << time; + return time == arg.time; +} + class NeuralStylusPalmDetectionFilterUtilTest : public testing::TestWithParam<bool> { public: @@ -103,7 +112,10 @@ class NeuralStylusPalmDetectionFilterUtilTest touch_.x = 21; touch_.y = 20; model_config_.max_sample_count = 3; - model_config_.resample_touch = GetParam(); + const bool resample_touch = GetParam(); + if (resample_touch) { + model_config_.resample_period = base::Milliseconds(8); + } } protected: @@ -140,8 +152,8 @@ TEST_P(NeuralStylusPalmDetectionFilterUtilTest, DistilledNocturneTest) { } TEST_P(NeuralStylusPalmDetectionFilterUtilTest, NoMinorResTest) { - // Nocturne has minor resolution: but lets pretend it didnt. we should recover - // "1" as the resolution. + // Nocturne has minor resolution, but let's pretend it doesn't. we should + // recover "1" as the resolution. auto abs_info = nocturne_touchscreen_.GetAbsInfoByCode(ABS_MT_TOUCH_MINOR); abs_info.resolution = 0; nocturne_touchscreen_.SetAbsInfo(ABS_MT_TOUCH_MINOR, abs_info); @@ -222,8 +234,8 @@ TEST_P(NeuralStylusPalmDetectionFilterUtilTest, LinkTouchscreenSampleTest) { } TEST_P(NeuralStylusPalmDetectionFilterUtilTest, PalmFilterStrokeTest) { - PalmFilterStroke stroke(model_config_); - EXPECT_EQ(0, stroke.tracking_id()); + PalmFilterStroke stroke(model_config_, /*tracking_id*/ 55); + touch_.tracking_id = 55; // With no points, center is 0. EXPECT_EQ(gfx::PointF(0., 0.), stroke.GetCentroid()); @@ -239,7 +251,7 @@ TEST_P(NeuralStylusPalmDetectionFilterUtilTest, PalmFilterStrokeTest) { touch_.x = 15 + i; PalmFilterSample sample = CreatePalmFilterSample(touch_, time, model_config_, nocturne_distilled); - time += model_config_.resample_period; + time += base::Milliseconds(8); stroke.ProcessSample(std::move(sample)); EXPECT_EQ(touch_.tracking_id, stroke.tracking_id()); if (i < 3) { @@ -260,14 +272,13 @@ TEST_P(NeuralStylusPalmDetectionFilterUtilTest, PalmFilterStrokeTest) { ASSERT_FLOAT_EQ(expected_centroid.x(), stroke.GetCentroid().x()) << "failed at i " << i; } - stroke.SetTrackingId(55); - EXPECT_EQ(55, stroke.tracking_id()); } TEST_P(NeuralStylusPalmDetectionFilterUtilTest, PalmFilterStrokeBiggestSizeTest) { - PalmFilterStroke stroke(model_config_); - PalmFilterStroke no_minor_stroke(model_config_); + PalmFilterStroke stroke(model_config_, /*tracking_id*/ 0); + PalmFilterStroke no_minor_stroke(model_config_, /*tracking_id*/ 0); + touch_.tracking_id = stroke.tracking_id(); EXPECT_EQ(0, stroke.BiggestSize()); base::TimeTicks time = base::TimeTicks() + base::Seconds(30); @@ -292,7 +303,7 @@ TEST_P(NeuralStylusPalmDetectionFilterUtilTest, no_minor_stroke.ProcessSample(std::move(second_sample)); EXPECT_FLOAT_EQ((2 + i) * (2 + i), no_minor_stroke.BiggestSize()); ASSERT_EQ(std::min(3ul, 1ul + i), stroke.samples().size()); - time += model_config_.resample_period; + time += base::Milliseconds(8); } } @@ -315,7 +326,8 @@ TEST_P(NeuralStylusPalmDetectionFilterUtilTest, UnscaledMajorMinorResolution) { } TEST_P(NeuralStylusPalmDetectionFilterUtilTest, StrokeGetMaxMajorTest) { - PalmFilterStroke stroke(model_config_); + PalmFilterStroke stroke(model_config_, /*tracking_id*/ 0); + touch_.tracking_id = stroke.tracking_id(); EXPECT_FLOAT_EQ(0, stroke.MaxMajorRadius()); base::TimeTicks time = base::TimeTicks::UnixEpoch() + base::Seconds(30); const PalmFilterDeviceInfo nocturne_distilled = @@ -362,70 +374,66 @@ TEST_P(NeuralStylusPalmDetectionFilterUtilTest, SampleRadiusConversion) { TEST(PalmFilterStrokeTest, NumberOfResampledValues) { NeuralStylusPalmDetectionFilterModelConfig model_config_; model_config_.max_sample_count = 3; - model_config_.resample_touch = true; + model_config_.resample_period = base::Milliseconds(8); base::TimeTicks down_time = base::TimeTicks::UnixEpoch() + base::Seconds(30); - PalmFilterStroke stroke(model_config_); + PalmFilterStroke stroke(model_config_, /*tracking_id*/ 0); const PalmFilterDeviceInfo device_info; // Initially, no samples - ASSERT_EQ(0u, stroke.samples().size()); + ASSERT_THAT(stroke.samples(), IsEmpty()); ASSERT_EQ(0u, stroke.samples_seen()); // Add first sample at time = T InProgressTouchEvdev touch_; + touch_.tracking_id = stroke.tracking_id(); PalmFilterSample sample = CreatePalmFilterSample(touch_, down_time, model_config_, device_info); stroke.ProcessSample(sample); - ASSERT_EQ(1u, stroke.samples().size()); + ASSERT_THAT(stroke.samples(), ElementsAre(SampleTime(down_time))); ASSERT_EQ(1u, stroke.samples_seen()); - ASSERT_EQ(down_time, stroke.samples().back().time); // Add second sample at time = T + 2ms. It's not yet time for the new frame, // so no new sample should be generated. base::TimeTicks time = down_time + base::Milliseconds(4); sample = CreatePalmFilterSample(touch_, time, model_config_, device_info); stroke.ProcessSample(sample); - ASSERT_EQ(1u, stroke.samples().size()); + ASSERT_THAT(stroke.samples(), ElementsAre(SampleTime(down_time))); ASSERT_EQ(1u, stroke.samples_seen()); - ASSERT_EQ(down_time, stroke.samples().back().time); // Add third sample at time = T + 10ms. An event at time = T + 8ms should be // generated. time = down_time + base::Milliseconds(10); sample = CreatePalmFilterSample(touch_, time, model_config_, device_info); stroke.ProcessSample(sample); - ASSERT_EQ(2u, stroke.samples().size()); + ASSERT_THAT(stroke.samples(), + ElementsAre(SampleTime(down_time), + SampleTime(down_time + base::Milliseconds(8)))); ASSERT_EQ(2u, stroke.samples_seen()); - ASSERT_EQ(down_time + base::Milliseconds(8), stroke.samples().back().time); } TEST(PalmFilterStrokeTest, ResamplingTest) { NeuralStylusPalmDetectionFilterModelConfig model_config_; model_config_.max_sample_count = 3; - model_config_.resample_touch = true; + model_config_.resample_period = base::Milliseconds(8); - PalmFilterStroke stroke(model_config_); + PalmFilterStroke stroke(model_config_, /*tracking_id*/ 0); PalmFilterDeviceInfo device_info; device_info.minor_radius_supported = true; // Add first sample at time = T InProgressTouchEvdev touch_; + touch_.tracking_id = stroke.tracking_id(); touch_.x = 1; touch_.y = 2; touch_.major = 4; touch_.minor = 3; base::TimeTicks down_time = base::TimeTicks::UnixEpoch() + base::Seconds(30); - PalmFilterSample sample = + PalmFilterSample sample1 = CreatePalmFilterSample(touch_, down_time, model_config_, device_info); - stroke.ProcessSample(sample); + stroke.ProcessSample(sample1); // First sample should not be modified - ASSERT_EQ(1u, stroke.samples().size()); - EXPECT_EQ(1, stroke.samples().back().point.x()); - EXPECT_EQ(2, stroke.samples().back().point.y()); - EXPECT_EQ(4, stroke.samples().back().major_radius); - EXPECT_EQ(3, stroke.samples().back().minor_radius); - EXPECT_EQ(down_time, stroke.samples().back().time); + ASSERT_THAT(stroke.samples(), ElementsAre(sample1)); // Add second sample at time = T + 2ms. It's not yet time for the new frame, // so no new sample should be generated. @@ -434,9 +442,11 @@ TEST(PalmFilterStrokeTest, ResamplingTest) { touch_.y = 20; touch_.major = 12; touch_.minor = 11; - sample = CreatePalmFilterSample(touch_, time, model_config_, device_info); - stroke.ProcessSample(sample); - ASSERT_EQ(1u, stroke.samples().size()); + PalmFilterSample sample2 = + CreatePalmFilterSample(touch_, time, model_config_, device_info); + stroke.ProcessSample(sample2); + // The samples should remain unchanged + ASSERT_THAT(stroke.samples(), ElementsAre(sample1)); // Add third sample at time = T + 12ms. A resampled event at time = T + 8ms // should be generated. @@ -445,42 +455,41 @@ TEST(PalmFilterStrokeTest, ResamplingTest) { touch_.y = 24; touch_.major = 14; touch_.minor = 13; - sample = CreatePalmFilterSample(touch_, time, model_config_, device_info); - stroke.ProcessSample(sample); - ASSERT_EQ(2u, stroke.samples().size()); + PalmFilterSample sample3 = + CreatePalmFilterSample(touch_, time, model_config_, device_info); + stroke.ProcessSample(sample3); + ASSERT_THAT( + stroke.samples(), + ElementsAre(sample1, SampleTime(down_time + base::Milliseconds(8)))); + EXPECT_EQ(150, stroke.samples().back().point.x()); EXPECT_EQ(22, stroke.samples().back().point.y()); EXPECT_EQ(14, stroke.samples().back().major_radius); EXPECT_EQ(13, stroke.samples().back().minor_radius); - EXPECT_EQ(down_time + base::Milliseconds(8), stroke.samples().back().time); } TEST(PalmFilterStrokeTest, MultipleResampledValues) { NeuralStylusPalmDetectionFilterModelConfig model_config_; model_config_.max_sample_count = 3; - model_config_.resample_touch = true; + model_config_.resample_period = base::Milliseconds(8); - PalmFilterStroke stroke(model_config_); + PalmFilterStroke stroke(model_config_, /*tracking_id*/ 0); PalmFilterDeviceInfo device_info; device_info.minor_radius_supported = true; // Add first sample at time = T InProgressTouchEvdev touch_; + touch_.tracking_id = stroke.tracking_id(); touch_.x = 0; touch_.y = 10; touch_.major = 200; touch_.minor = 100; base::TimeTicks down_time = base::TimeTicks::UnixEpoch() + base::Seconds(30); - PalmFilterSample sample = + PalmFilterSample sample1 = CreatePalmFilterSample(touch_, down_time, model_config_, device_info); - stroke.ProcessSample(sample); - // First sample should not be modified - ASSERT_EQ(1u, stroke.samples().size()); - EXPECT_EQ(0, stroke.samples().back().point.x()); - EXPECT_EQ(10, stroke.samples().back().point.y()); - EXPECT_EQ(200, stroke.samples().back().major_radius); - EXPECT_EQ(100, stroke.samples().back().minor_radius); - EXPECT_EQ(down_time, stroke.samples().back().time); + stroke.ProcessSample(sample1); + // First sample should go in as is + ASSERT_THAT(stroke.samples(), ElementsAre(sample1)); // Add second sample at time = T + 20ms. Two resampled values should be // generated: 1) at time = T+8ms 2) at time = T+16ms @@ -489,23 +498,25 @@ TEST(PalmFilterStrokeTest, MultipleResampledValues) { touch_.y = 30; touch_.major = 220; touch_.minor = 120; - sample = CreatePalmFilterSample(touch_, time, model_config_, device_info); - stroke.ProcessSample(sample); - ASSERT_EQ(3u, stroke.samples().size()); + PalmFilterSample sample2 = + CreatePalmFilterSample(touch_, time, model_config_, device_info); + stroke.ProcessSample(sample2); + ASSERT_THAT(stroke.samples(), + ElementsAre(SampleTime(down_time), + SampleTime(down_time + base::Milliseconds(8)), + SampleTime(down_time + base::Milliseconds(16)))); // First sample : time = T + 8ms EXPECT_EQ(8, stroke.samples()[1].point.x()); EXPECT_EQ(18, stroke.samples()[1].point.y()); EXPECT_EQ(220, stroke.samples()[1].major_radius); EXPECT_EQ(120, stroke.samples()[1].minor_radius); - EXPECT_EQ(down_time + base::Milliseconds(8), stroke.samples()[1].time); // Second sample : time = T + 16ms EXPECT_EQ(16, stroke.samples().back().point.x()); EXPECT_EQ(26, stroke.samples().back().point.y()); EXPECT_EQ(220, stroke.samples().back().major_radius); EXPECT_EQ(120, stroke.samples().back().minor_radius); - EXPECT_EQ(down_time + base::Milliseconds(16), stroke.samples().back().time); } -} // namespace ui
\ No newline at end of file +} // namespace ui diff --git a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.cc b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.cc new file mode 100644 index 0000000..8edd15b --- /dev/null +++ b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.cc @@ -0,0 +1,3936 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#include "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.h" +#include <algorithm> +#include <cassert> +#include <cmath> +#include <cstdint> +#include <cstring> +#include <limits> +#include <tuple> + +#ifndef USE_EIGEN +#define USE_EIGEN 0 +#endif + +namespace ui::internal_onedevice::beta_model { +namespace { + +// ----------------------------------------------------------------------------- +// OP LIBRARY +// Copied here to make sure that the inference code always stays in sync with +// the lib that it was generated for. +// ----------------------------------------------------------------------------- + +// Default to using std::copy and std::fill over memcpy and memset as they +// are usually faster, thanks to the compiler getting stricter alignment +// guarantees. +#ifndef USE_TYPED_MEMSETMEMCPY +#define USE_TYPED_MEMSETMEMCPY 1 +#endif +#ifndef USE_EIGEN +#error Please define USE_EIGEN to either 0 or 1 +#endif + +// Helper to reinterpret memory as Eigen matrices. +#if USE_EIGEN +template <typename Scalar> +using ConstMatrixMap = typename Eigen::Map< + const Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>>; +template <typename Scalar> +using ConstRowVectorMap = + typename Eigen::Map<const Eigen::Matrix<Scalar, Eigen::Dynamic, 1>>; +template <typename Scalar> +using RowVectorMap = + typename Eigen::Map<Eigen::Matrix<Scalar, Eigen::Dynamic, 1>>; +template <typename Scalar> +using MatrixMap = + typename Eigen::Map<Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic>>; +template <typename Scalar, typename StorageIndex> +using SparseMatrix = Eigen::SparseMatrix<Scalar, Eigen::RowMajor, StorageIndex>; +#endif + +#if OP_LIB_BENCHMARK +class PerOpTimings { + public: + void Add(const std::string& op, absl::Duration time) { + time_per_op_[op] += time; + } + + void Reset() { time_per_op_.clear(); } + + void WriteTimingsToInfoLog() { + std::string message = "Per op totals:\n"; + absl::Duration total; + for (auto& entry : time_per_op_) { + total += entry.second; + absl::StrAppend( + &message, entry.first, ": ", + absl::LegacyPrecision(absl::ToDoubleMilliseconds(entry.second)), + " ms\n"); + } + absl::StrAppend(&message, "Total: ", + absl::LegacyPrecision(absl::ToDoubleMilliseconds(total)), + " ms\n"); + VLOG(1) << message; + } + + private: + std::map<std::string, absl::Duration> time_per_op_; +}; + +// Timer for individual operations. For each operation, add a statement like +// BENCHMARK_TIMER(name_part1, name_part2, ...); +// to the beginning of the code. All name parts will be concatenated together +// and a line will be logged after executing the operation showing the name and +// the elapsed time. +class BenchmarkTimer { + public: + explicit BenchmarkTimer(std::string name) + : name_(std::move(name)), start_(absl::Now()) {} + + ~BenchmarkTimer() { + const absl::Duration elapsed = absl::Now() - start_; + Singleton<PerOpTimings>::get()->Add(name_, elapsed); + VLOG(1) << "Time for " << name_ << ": " + << absl::ToDoubleMilliseconds(elapsed) << " ms"; + } + + private: + const std::string name_; + const absl::Time start_; +}; + +#define BENCHMARK_TIMER(...) BenchmarkTimer timer(absl::StrCat(__VA_ARGS__)); + +#else // OP_LIB_BENCHMARK +#define BENCHMARK_TIMER(...) +#endif // OP_LIB_BENCHMARK + +// The size of a shape in terms of number of coefficients. +inline int32_t ShapeSize(const int32_t rank, const int32_t* shape) { + int32_t size = 1; + for (int32_t i = 0; i < rank; ++i) + size *= shape[i]; + return size; +} + +// For convolutional operations, calculates the output size with VALID padding. +// Returns (height, width). +inline std::tuple<int, int> GetConvOutputSizeVALID(const int32_t* input_shape, + const int32_t* kernel_shape, + int32_t stride_y, + int32_t stride_x) { + return std::make_tuple( + (input_shape[1] + stride_y - kernel_shape[0]) / stride_y, + (input_shape[2] + stride_x - kernel_shape[1]) / stride_x); +} + +// For convolutional operations, calculates the output size with SAME padding. +// Returns (height, width). +inline std::tuple<int, int> GetConvOutputSizeSAME(const int32_t* input_shape, + int32_t stride_y, + int32_t stride_x) { + return std::make_tuple((input_shape[1] + stride_y - 1) / stride_y, + (input_shape[2] + stride_x - 1) / stride_x); +} + +// Helper to compute the size of the inner loop for an op that uses indices to +// specify which axes are reduced. +template <typename Tidx> +int32_t GetReduceInnerSize(int32_t input_tensor_rank, + const int32_t* __restrict input_shape, + int32_t index_tensor_rank, + const int32_t* __restrict index_shape, + const Tidx* __restrict index_values) { + assert(index_tensor_rank <= 1); + const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1; + int32_t inner_size = 1; + for (int32_t i = 0; i < num_indices; ++i) { + Tidx index_value = index_values[i]; + if (index_value < 0) { + index_value = input_tensor_rank + index_value; + } + inner_size *= input_shape[index_value]; + } + return inner_size; +} + +template <typename T> +void ConcatV2Args2(int32_t arg0_rank, + const int32_t* __restrict arg0_shape, + const T* __restrict arg0_values, + int32_t arg1_rank, + const int32_t* __restrict arg1_shape, + const T* __restrict arg1_values, + const int32_t* __restrict axis_value, + T* __restrict output_values) { + BENCHMARK_TIMER("ConcatV2Args2"); + const int32_t axis = axis_value[0]; + const int32_t num_lines = ShapeSize(axis, arg0_shape); + const int32_t arg0_line_size = ShapeSize(arg0_rank - axis, arg0_shape + axis); + const int32_t arg1_line_size = ShapeSize(arg1_rank - axis, arg1_shape + axis); + for (int32_t line = 0; line < num_lines; ++line) { + std::copy(arg0_values, arg0_values + arg0_line_size, output_values); + arg0_values += arg0_line_size; + output_values += arg0_line_size; + std::copy(arg1_values, arg1_values + arg1_line_size, output_values); + arg1_values += arg1_line_size; + output_values += arg1_line_size; + } +} + +template <typename T> +void MatMul(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t* __restrict weight_shape, + const T* __restrict weight_values, + T* __restrict output_values) { + BENCHMARK_TIMER("MatMul"); +#if USE_EIGEN + const auto in = + ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]); + const auto weight = + ConstMatrixMap<T>(weight_values, weight_shape[1], weight_shape[0]); + auto result = MatrixMap<T>(output_values, weight_shape[1], input_shape[0]); + result.noalias() = weight * in; +#else + const int32_t batch_size = input_shape[0]; + const int32_t num_inputs = weight_shape[0]; + const int32_t num_outputs = weight_shape[1]; + assert(input_shape[1] == num_inputs); + for (int32_t batch = 0; batch < batch_size; ++batch) { + for (int32_t out_i = 0; out_i < num_outputs; ++out_i) { + T value = 0; + for (int32_t in_i = 0; in_i < num_inputs; ++in_i) { + value += input_values[batch * num_inputs + in_i] * + weight_values[in_i * num_outputs + out_i]; + } + *output_values++ = value; + } + } +#endif +} + +template <typename T> +void DepthwiseConv2dNative(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t* __restrict kernel_shape, + const T* __restrict kernel_values, + int32_t stride_y, + int32_t stride_x, + int32_t out_height, + int32_t out_width, + T* __restrict output_values) { + BENCHMARK_TIMER("DepthwiseConv2dNative"); + // Give the shape values nicer names. + assert(input_shape[3] == kernel_shape[2]); + const int32_t batch_size = input_shape[0]; + const int32_t kernel_height = kernel_shape[0]; + const int32_t kernel_width = kernel_shape[1]; + const int32_t in_depth = kernel_shape[2]; + const int32_t depth_mul = kernel_shape[3]; + const int32_t in_height = input_shape[1]; + const int32_t in_width = input_shape[2]; + + // Compute the amount of padding needed to get the desired output size. + const int32_t pad_height = + ((out_height - 1) * stride_y + kernel_height - in_height) / 2; + const int32_t pad_width = + ((out_width - 1) * stride_x + kernel_width - in_width) / 2; + + // Cache the strides for address computations. + const int32_t in_strides[4] = { + input_shape[1] * input_shape[2] * input_shape[3], // batch + input_shape[2] * input_shape[3], // y + input_shape[3], // x + 1, // channel + }; + const int32_t kernel_strides[4] = { + kernel_shape[1] * kernel_shape[2] * kernel_shape[3], // y + kernel_shape[2] * kernel_shape[3], // x + kernel_shape[3], // in channels + 1, // channel mult + }; + + T* out_write_ptr = output_values; + for (int32_t batch = 0; batch < batch_size; ++batch) { + for (int32_t out_y = 0; out_y < out_height; ++out_y) { + for (int32_t out_x = 0; out_x < out_width; ++out_x) { + // Compute the input read offsets. + const int32_t in_y_origin = (out_y * stride_y) - pad_height; + const int32_t in_x_origin = (out_x * stride_x) - pad_width; + + // Compute the range of the kernel to be applied (we may need to clip + // when we'd read outside of the valid input region - for SAME). + const int32_t kernel_y_start = + std::max(static_cast<int32_t>(0), -in_y_origin); + const int32_t kernel_y_end = + std::min(kernel_height, in_height - in_y_origin); + const int32_t kernel_x_start = + std::max(static_cast<int32_t>(0), -in_x_origin); + const int32_t kernel_x_end = + std::min(kernel_width, in_width - in_x_origin); + + for (int32_t in_c = 0; in_c < in_depth; ++in_c) { + for (int32_t mul_c = 0; mul_c < depth_mul; ++mul_c, ++out_write_ptr) { + // Convolve. + T sum = 0; + for (int32_t k_y = kernel_y_start; k_y < kernel_y_end; ++k_y) { + const int32_t in_y = in_y_origin + k_y; + assert(in_y >= 0 && in_y < in_height); + for (int32_t k_x = kernel_x_start; k_x < kernel_x_end; ++k_x) { + const int32_t in_x = in_x_origin + k_x; + assert(in_x >= 0 && in_x < in_width); + const T input_value = + input_values[batch * in_strides[0] + // batch + in_y * in_strides[1] + // y + in_x * in_strides[2] + // x + in_c]; // in chan + const T kernel_value = + kernel_values[k_y * kernel_strides[0] + // y + k_x * kernel_strides[1] + // x + in_c * kernel_strides[2] + // in chan + mul_c]; // chan mult + sum += input_value * kernel_value; + } + } + *out_write_ptr = sum; + } // mul_c + } // in_c + } // out_x + } // out_y + } // batch +} + +template <typename T> +void DepthwiseConv2dNativeVALID(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t* __restrict kernel_shape, + const T* __restrict kernel_values, + int32_t stride_y, + int32_t stride_x, + T* __restrict output_values) { + const auto out_size = + GetConvOutputSizeVALID(input_shape, kernel_shape, stride_y, stride_x); + DepthwiseConv2dNative<T>( + input_shape, input_values, kernel_shape, kernel_values, stride_y, + stride_x, std::get<0>(out_size), std::get<1>(out_size), output_values); +} + +template <typename T> +void DepthwiseConv2dNativeSAME(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t* __restrict kernel_shape, + const T* __restrict kernel_values, + int32_t stride_y, + int32_t stride_x, + T* __restrict output_values) { + const auto out_size = GetConvOutputSizeSAME(input_shape, stride_y, stride_x); + DepthwiseConv2dNative<T>( + input_shape, input_values, kernel_shape, kernel_values, stride_y, + stride_x, std::get<0>(out_size), std::get<1>(out_size), output_values); +} + +template <typename T> +void FullyConnected(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t* __restrict weight_shape, + const T* __restrict weight_values, + const int32_t* __restrict bias_shape, + const T* __restrict bias_values, + T* __restrict output_values) { + BENCHMARK_TIMER("FullyConnected"); +#if USE_EIGEN + const auto in = + ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]); + const auto weight = + ConstMatrixMap<T>(weight_values, weight_shape[1], weight_shape[0]); + const auto bias = ConstRowVectorMap<T>(bias_values, bias_shape[0]); + auto result = MatrixMap<T>(output_values, weight_shape[1], input_shape[0]); + result.noalias() = (weight * in).colwise() + bias; +#else + const int32_t batch_size = input_shape[0]; + const int32_t num_inputs = weight_shape[0]; + const int32_t num_outputs = weight_shape[1]; + assert(input_shape[1] == num_inputs); + assert(bias_shape[0] == num_outputs); + for (int32_t batch = 0; batch < batch_size; ++batch) { + for (int32_t out_i = 0; out_i < num_outputs; ++out_i) { + T value = bias_values[out_i]; + for (int32_t in_i = 0; in_i < num_inputs; ++in_i) { + value += input_values[batch * num_inputs + in_i] * + weight_values[in_i * num_outputs + out_i]; + } + output_values[batch * num_outputs + out_i] = value; + } + } +#endif +} + +template <typename T, typename TBlocks, typename TPaddings> +void SpaceToBatchNDRank4(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const TBlocks* __restrict block_shape_values, + const TPaddings* __restrict padding_values, + T* __restrict output_values) { + BENCHMARK_TIMER("SpaceToBatchNDRank4"); + const int32_t input_batch_size = input_shape[0]; + const int32_t input_height = input_shape[1]; + const int32_t input_width = input_shape[2]; + const int32_t input_depth = input_shape[3]; + + const TBlocks block_shape_height = block_shape_values[0]; + const TBlocks block_shape_width = block_shape_values[1]; + const TPaddings padding_top = padding_values[0]; + const TPaddings padding_bottom = padding_values[1]; + const TPaddings padding_left = padding_values[2]; + const TPaddings padding_right = padding_values[3]; + + const int32_t block_size = block_shape_height * block_shape_width; + const int32_t output_depth = input_depth; + const int32_t output_batch_size = input_batch_size * block_size; + const int32_t output_height = + (padding_top + padding_bottom + input_height) / block_shape_height; + const int32_t output_width = + (padding_left + padding_right + input_width) / block_shape_width; + + const T pad_value = 0; + + for (int32_t out_b = 0; out_b < output_batch_size; ++out_b) { + const int32_t input_batch = out_b % input_batch_size; + const int32_t shift_w = (out_b / input_batch_size) % block_shape_width; + const int32_t shift_h = (out_b / input_batch_size) / block_shape_width; + for (int32_t out_h = 0; out_h < output_height; ++out_h) { + for (int32_t out_w = 0; out_w < output_width; ++out_w) { + T* out = output_values + + (((out_b * output_height + out_h) * output_width + out_w) * + output_depth + + 0); + // Check if padding cell are being handled. + if (out_h * block_shape_height + shift_h < padding_top || + out_h * block_shape_height + shift_h >= + padding_top + input_height || + out_w * block_shape_width + shift_w < padding_left || + out_w * block_shape_width + shift_w >= padding_left + input_width) { +// This may not execute correctly when pad_value != 0 and T != uint8. +#if USE_TYPED_MEMSETMEMCPY + std::fill(out, out + input_depth, pad_value); +#else + std::memset(out, pad_value, input_depth * sizeof(T)); +#endif + } else { + const int32_t i0 = input_batch; + const int32_t i1 = + (out_h * block_shape_height + shift_h) - padding_top; + const int32_t i2 = + (out_w * block_shape_width + shift_w) - padding_left; + const T* in = + input_values + + (((i0 * input_height + i1) * input_width + i2) * input_depth + 0); +#if USE_TYPED_MEMSETMEMCPY + std::copy(in, in + input_depth, out); +#else + std::memcpy(out, in, input_depth * sizeof(T)); +#endif + } + } + } + } +} + +template <typename T, typename TBlocks, typename TCrops> +void BatchToSpaceNDRank4(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const TBlocks* __restrict block_shape_values, + const TCrops* __restrict crops_values, + T* __restrict output_values) { + BENCHMARK_TIMER("BatchToSpaceNDRank4"); + const int32_t input_batch_size = input_shape[0]; + const int32_t input_height = input_shape[1]; + const int32_t input_width = input_shape[2]; + const int32_t input_depth = input_shape[3]; + const TBlocks block_shape_height = block_shape_values[0]; + const TBlocks block_shape_width = block_shape_values[1]; + const TCrops crops_top = crops_values[0]; + const TCrops crops_bottom = crops_values[1]; + const TCrops crops_left = crops_values[2]; + const TCrops crops_right = crops_values[3]; + + const int32_t output_depth = input_depth; + const int32_t output_batch_size = + input_batch_size / (block_shape_width * block_shape_height); + const int32_t output_height = + input_height * block_shape_height - crops_top - crops_bottom; + const int32_t output_width = + input_width * block_shape_width - crops_left - crops_right; + + for (int32_t in_batch = 0; in_batch < input_batch_size; ++in_batch) { + const int32_t out_batch = in_batch % output_batch_size; + const int32_t spatial_offset = in_batch / output_batch_size; + for (int32_t in_h = 0; in_h < input_height; ++in_h) { + const int32_t out_h = in_h * block_shape_height + + spatial_offset / block_shape_width - crops_top; + if (out_h < 0 || out_h >= output_height) { + continue; + } + for (int32_t in_w = 0; in_w < input_width; ++in_w) { + const int32_t out_w = in_w * block_shape_width + + spatial_offset % block_shape_width - crops_left; + + if (out_w < 0 || out_w >= output_width) { + continue; + } + T* out = output_values + + (((out_batch * output_height + out_h) * output_width + out_w) * + output_depth + + 0); + const T* in = input_values + + (((in_batch * input_height + in_h) * input_width + in_w) * + input_depth + + 0); +#if USE_TYPED_MEMSETMEMCPY + std::copy(in, in + input_depth, out); +#else + std::memcpy(out, in, input_depth * sizeof(T)); +#endif + } + } + } +} + +#if USE_EIGEN +template <typename T, typename Tidx> +void SparseDenseMatMulCSR(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t num_rows, + const int32_t* __restrict nnz_shape, + const T* __restrict nnz_values, + const Tidx* __restrict outer_index, + const Tidx* __restrict cols, + T* __restrict output_values) { + BENCHMARK_TIMER("SparseDenseMatMulCSR"); + const int32_t num_cols = input_shape[1]; + const auto in = + ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]); + const Eigen::Map<const SparseMatrix<T, Tidx>> weight( + num_rows, num_cols, nnz_shape[0], outer_index, cols, nnz_values); + auto result = MatrixMap<T>(output_values, num_rows, input_shape[0]); + result.noalias() = weight * in; +} + +template <typename T, typename Tidx> +void SparseFullyConnectedCSR(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t num_rows, + const int32_t* __restrict nnz_shape, + const T* __restrict nnz_values, + const Tidx* __restrict outer_index, + const Tidx* __restrict cols, + const int32_t* __restrict bias_shape, + const T* __restrict bias_values, + T* __restrict output_values) { + BENCHMARK_TIMER("SparseFullyConnectedCSR"); + const int32_t num_cols = input_shape[1]; + const auto in = + ConstMatrixMap<T>(input_values, input_shape[1], input_shape[0]); + const auto bias = ConstRowVectorMap<T>(bias_values, bias_shape[0]); + const Eigen::Map<const SparseMatrix<T, Tidx>> weight( + num_rows, num_cols, nnz_shape[0], outer_index, cols, nnz_values); + auto result = MatrixMap<T>(output_values, num_rows, input_shape[0]); + result.noalias() = (weight * in).colwise() + bias; +} +#endif + +template <typename T, typename TIndex> +void Gather(int32_t params_rank, + const int32_t* __restrict params_shape, + const T* __restrict params_values, + int32_t indices_rank, + const int32_t* __restrict indices_shape, + const TIndex* __restrict indices_values, + T* __restrict output_values) { + BENCHMARK_TIMER("Gather"); + const int32_t num_indices = ShapeSize(indices_rank, indices_shape); + const int32_t num_params = params_shape[0]; + const int32_t slice_size = ShapeSize(params_rank - 1, params_shape + 1); + for (int32_t i = 0; i < num_indices; ++i) { + const int32_t index = indices_values[i]; + if (index < 0 || index >= num_params) { + std::fill(output_values, output_values + slice_size, 0); + } else { + std::copy(params_values + index * slice_size, + params_values + index * slice_size + slice_size, output_values); + } + output_values += slice_size; + } +} + +template <typename T> +void Im2Row(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t* __restrict kernel_shape, + int32_t stride_y, + int32_t stride_x, + int32_t out_height, + int32_t out_width, + T* __restrict output_values) { + BENCHMARK_TIMER("Im2Row"); + // Give the shape values nicer names. + assert(input_shape[3] == kernel_shape[2]); + const int32_t batch_size = input_shape[0]; + const int32_t kernel_height = kernel_shape[0]; + const int32_t kernel_width = kernel_shape[1]; + const int32_t in_depth = kernel_shape[2]; + const int32_t in_height = input_shape[1]; + const int32_t in_width = input_shape[2]; + + // Compute the amount of padding needed to get the desired output size. + const int32_t pad_height = + ((out_height - 1) * stride_y + kernel_height - in_height) / 2; + const int32_t pad_width = + ((out_width - 1) * stride_x + kernel_width - in_width) / 2; + + // Cache the strides for address computations. + const int32_t x_stride = input_shape[3]; + const int32_t y_stride = input_shape[2] * x_stride; + const int32_t batch_stride = input_shape[1] * y_stride; + + for (int32_t batch = 0; batch < batch_size; ++batch) { + for (int32_t out_y = 0; out_y < out_height; ++out_y) { + for (int32_t out_x = 0; out_x < out_width; ++out_x) { + // Compute the input read offsets. + const int32_t in_y_origin = (out_y * stride_y) - pad_height; + const int32_t in_x_origin = (out_x * stride_x) - pad_width; + + // Compute the range of the kernel to be applied (we may need to clip + // when we'd read outside of the valid input region - for SAME). + const int32_t kernel_y_start = + std::max(static_cast<int32_t>(0), -in_y_origin); + const int32_t kernel_y_end = + std::min(kernel_height, in_height - in_y_origin); + const int32_t kernel_x_start = + std::max(static_cast<int32_t>(0), -in_x_origin); + const int32_t kernel_x_end = + std::min(kernel_width, in_width - in_x_origin); + + // Padding top. + if (kernel_y_start != 0) { + const int32_t num_lines = kernel_y_start; + const int32_t num_coeffs = num_lines * kernel_width * in_depth; +#if USE_TYPED_MEMSETMEMCPY + std::fill(output_values, output_values + num_coeffs, 0); +#else + std::memset(output_values, 0, num_coeffs * sizeof(T)); +#endif + output_values += num_coeffs; + } + for (int32_t k_y = kernel_y_start; k_y < kernel_y_end; ++k_y) { + // Padding left. + if (kernel_x_start != 0) { + const int32_t num_coeffs = kernel_x_start * in_depth; +#if USE_TYPED_MEMSETMEMCPY + std::fill(output_values, output_values + num_coeffs, 0); +#else + std::memset(output_values, 0, num_coeffs * sizeof(T)); +#endif + output_values += num_coeffs; + } + // Valid values. + { + const int32_t in_y = in_y_origin + k_y; + const int32_t in_x = in_x_origin + kernel_x_start; + const int32_t num_coeffs = + (kernel_x_end - kernel_x_start) * in_depth; +#if USE_TYPED_MEMSETMEMCPY + const int32_t offset = + batch * batch_stride + in_y * y_stride + in_x * x_stride; + std::copy(input_values + offset, input_values + offset + num_coeffs, + output_values); +#else + std::memcpy(output_values, + input_values // Reusing the restricted pointer. + + batch * batch_stride // batch + + in_y * y_stride // y + + in_x * x_stride, // x + num_coeffs * sizeof(T)); +#endif + output_values += num_coeffs; + } + // Padding right. + if (kernel_x_end != kernel_width) { + const int32_t num_coeffs = (kernel_width - kernel_x_end) * in_depth; +#if USE_TYPED_MEMSETMEMCPY + std::fill(output_values, output_values + num_coeffs, 0); +#else + std::memset(output_values, 0, num_coeffs * sizeof(T)); +#endif + output_values += num_coeffs; + } + } + // Padding bottom. + if (kernel_y_end != kernel_height) { + const int32_t num_lines = kernel_height - kernel_y_end; + const int32_t num_coeffs = num_lines * kernel_width * in_depth; +#if USE_TYPED_MEMSETMEMCPY + std::fill(output_values, output_values + num_coeffs, 0); +#else + std::memset(output_values, 0, num_coeffs * sizeof(T)); +#endif + output_values += num_coeffs; + } + } + } + } +} + +template <typename T> +void Im2RowVALID(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t* __restrict kernel_shape, + int32_t stride_y, + int32_t stride_x, + T* __restrict output_values) { + const auto out_size = + GetConvOutputSizeVALID(input_shape, kernel_shape, stride_y, stride_x); + Im2Row<T>(input_shape, input_values, kernel_shape, stride_y, stride_x, + std::get<0>(out_size), std::get<1>(out_size), output_values); +} + +template <typename T> +void Im2RowSAME(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t* __restrict kernel_shape, + int32_t stride_y, + int32_t stride_x, + T* __restrict output_values) { + const auto out_size = GetConvOutputSizeSAME(input_shape, stride_y, stride_x); + Im2Row<T>(input_shape, input_values, kernel_shape, stride_y, stride_x, + std::get<0>(out_size), std::get<1>(out_size), output_values); +} + +// We use macros instead of template functions with templated functors here +// because it's a lot less verbose and easier for the compiler to optimize. +#define POOL_OP(OP_NAME, DEFAULT_VALUE, UPDATE_EXPR, RESULT_EXPR) \ + template <typename T> \ + void OP_NAME##Pool(const int32_t* __restrict input_shape, \ + const T* __restrict input_values, int32_t stride_y, \ + int32_t stride_x, int32_t kernel_height, \ + int32_t kernel_width, int32_t out_height, \ + int32_t out_width, T* __restrict output_values) { \ + BENCHMARK_TIMER(#OP_NAME, "Pool"); \ + const int32_t batch_size = input_shape[0]; \ + const int32_t in_height = input_shape[1]; \ + const int32_t in_width = input_shape[2]; \ + const int32_t depth = input_shape[3]; \ + \ + const int32_t pad_height = \ + ((out_height - 1) * stride_y + kernel_height - in_height) / 2; \ + const int32_t pad_width = \ + ((out_width - 1) * stride_x + kernel_width - in_width) / 2; \ + \ + const int32_t in_strides[4] = { \ + input_shape[1] * input_shape[2] * input_shape[3], \ + input_shape[2] * input_shape[3], \ + input_shape[3], \ + 1, \ + }; \ + \ + T* out_write_ptr = output_values; \ + for (int32_t batch = 0; batch < batch_size; ++batch) { \ + for (int32_t out_y = 0; out_y < out_height; ++out_y) { \ + for (int32_t out_x = 0; out_x < out_width; ++out_x) { \ + const int32_t in_y_origin = (out_y * stride_y) - pad_height; \ + const int32_t in_x_origin = (out_x * stride_x) - pad_width; \ + const int32_t kernel_y_start = \ + std::max(static_cast<int32_t>(0), -in_y_origin); \ + const int32_t kernel_y_end = \ + std::min(kernel_height, in_height - in_y_origin); \ + const int32_t kernel_x_start = \ + std::max(static_cast<int32_t>(0), -in_x_origin); \ + const int32_t kernel_x_end = \ + std::min(kernel_width, in_width - in_x_origin); \ + const int32_t count = (kernel_y_end - kernel_y_start) * \ + (kernel_x_end - kernel_x_start); \ + (void)sizeof(count); \ + \ + for (int32_t chan = 0; chan < depth; ++chan, ++out_write_ptr) { \ + T value = DEFAULT_VALUE; \ + for (int32_t k_y = kernel_y_start; k_y < kernel_y_end; ++k_y) { \ + const int32_t in_y = in_y_origin + k_y; \ + assert(in_y >= 0 && in_y < in_height); \ + for (int32_t k_x = kernel_x_start; k_x < kernel_x_end; ++k_x) { \ + const int32_t in_x = in_x_origin + k_x; \ + assert(in_x >= 0 && in_x < in_width); \ + const T next = input_values[batch * in_strides[0] + \ + in_y * in_strides[1] + \ + in_x * in_strides[2] + chan]; \ + value = UPDATE_EXPR; \ + } \ + } \ + *out_write_ptr = RESULT_EXPR; \ + } \ + } \ + } \ + } \ + } \ + \ + template <typename T> \ + void OP_NAME##PoolVALID(const int32_t* __restrict input_shape, \ + const T* __restrict input_values, int32_t stride_y, \ + int32_t stride_x, int32_t kernel_height, \ + int32_t kernel_width, T* __restrict output_values) { \ + const int32_t kernel_shape[4] = {kernel_height, kernel_width, 1, 1}; \ + const auto out_size = \ + GetConvOutputSizeVALID(input_shape, kernel_shape, stride_y, stride_x); \ + OP_NAME##Pool<T>(input_shape, input_values, stride_y, stride_x, \ + kernel_height, kernel_width, std::get<0>(out_size), \ + std::get<1>(out_size), output_values); \ + } \ + \ + template <typename T> \ + void OP_NAME##PoolSAME(const int32_t* __restrict input_shape, \ + const T* __restrict input_values, int32_t stride_y, \ + int32_t stride_x, int32_t kernel_height, \ + int32_t kernel_width, T* __restrict output_values) { \ + const auto out_size = \ + GetConvOutputSizeSAME(input_shape, stride_y, stride_x); \ + OP_NAME##Pool<T>(input_shape, input_values, stride_y, stride_x, \ + kernel_height, kernel_width, std::get<0>(out_size), \ + std::get<1>(out_size), output_values); \ + } + +POOL_OP(Max, std::numeric_limits<T>::lowest(), std::max(value, next), value) +POOL_OP(Avg, 0, value + next, value / count) + +template <typename T> +void Memcpy(const int32_t rank, + const int32_t* __restrict input_shape, + const T* __restrict input_values, + T* __restrict output_values) { + BENCHMARK_TIMER("Memcpy"); + const int32_t size = ShapeSize(rank, input_shape); + for (int32_t i = 0; i < size; ++i) { + output_values[i] = input_values[i]; + } +} + +template <typename T> +void Softmax(const int32_t rank, + const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t reduce_dim, + T* __restrict output_values, + T* __restrict scratch_values) { + BENCHMARK_TIMER("Softmax"); + const int32_t size = ShapeSize(rank, input_shape); + if (rank == 2 && reduce_dim == 1) { + T logits_max = std::numeric_limits<T>::lowest(); + + // Max. + for (int32_t i = 0; i < size; ++i) { + logits_max = std::max(logits_max, input_values[i]); + } + + // Pre-compute exp. + for (int32_t i = 0; i < size; ++i) { + scratch_values[i] = std::exp(input_values[i] - logits_max); + } + + // Sum over the last dimension, then divide the exps and write out. + for (int32_t offset = 0; offset < size; offset += input_shape[1]) { + const int32_t end_offset = offset + input_shape[1]; + T sum = 0; + for (int32_t i = offset; i < end_offset; ++i) { + sum += scratch_values[i]; + } + const T rcp_denom = static_cast<T>(1) / sum; + for (int32_t i = 0; i < input_shape[1]; ++i) { + output_values[offset + i] = scratch_values[offset + i] * rcp_denom; + } + } + } else { + assert(false && "Generic Softmax not yet supported."); + } +} + +// Returns the start position for a slice in a single dimension. +template <typename T> +int32_t StridedSliceBegin(int32_t range_mask, + const T* __restrict range_values, + const T* __restrict strides, + const int32_t* __restrict input_shape, + int32_t dim) { + const bool is_explicit = 0 == (range_mask & (1 << dim)); + if (is_explicit) { + const T range_value = range_values[dim]; + return (range_value < 0 ? range_value + input_shape[dim] : range_value); + } else { + const bool is_reverse = strides[dim] < 0; + return is_reverse ? input_shape[dim] - 1 : 0; + } +} + +// Returns the end position for a slice in a single dimension. +template <typename T> +int32_t StridedSliceEnd(int32_t range_mask, + const T* __restrict range_values, + const T* __restrict strides, + const int32_t* __restrict input_shape, + int32_t dim) { + const bool is_explicit = 0 == (range_mask & (1 << dim)); + if (is_explicit) { + const T range_value = range_values[dim]; + return (range_value < 0 ? range_value + input_shape[dim] : range_value); + } else { + const bool is_reverse = strides[dim] < 0; + return is_reverse ? -1 : input_shape[dim]; + } +} + +template <typename T, typename TIdx> +void StridedSlice(const int32_t input_rank, + const int32_t* __restrict input_shape, + const T* __restrict input_values, + const TIdx* __restrict begin, + const TIdx* __restrict end, + const TIdx* __restrict strides, + int32_t begin_mask, + int32_t end_mask, + T* __restrict output_values) { + BENCHMARK_TIMER("StridedSlice"); + const int32_t MAX_RANK = 8; + assert(input_rank < MAX_RANK); + + // Compute the address strides for each dimension. + int32_t dim_addr_strides[MAX_RANK] = {0}; + dim_addr_strides[input_rank - 1] = 1; + for (int32_t dim = input_rank - 2; dim >= 0; --dim) { + dim_addr_strides[dim] = dim_addr_strides[dim + 1] * input_shape[dim + 1]; + } + + // Resolve the masks and get explicit ranges for each dimension. + int32_t dim_begin[MAX_RANK]; + int32_t dim_end[MAX_RANK]; + bool dim_is_full_range[MAX_RANK]; + for (int32_t dim = 0; dim < input_rank; ++dim) { + const int32_t stride = strides[dim]; + dim_begin[dim] = + StridedSliceBegin(begin_mask, begin, strides, input_shape, dim); + dim_end[dim] = StridedSliceEnd(end_mask, end, strides, input_shape, dim); + dim_is_full_range[dim] = + dim_begin[dim] == 0 && dim_end[dim] == input_shape[dim] && stride == 1; + // Make sure that the dim_end is always bigger than dim_begin, this + // simplifies the boundary checks below. + if (stride > 0 && dim_begin[dim] > dim_end[dim]) { + dim_end[dim] += input_shape[dim]; + } + + // Our termination criteria for loops is that we hit the end exactly, so + // we need to ensure that we don't step over the end with stride != 1. + const int32_t length_mod = (dim_end[dim] - dim_begin[dim]) % stride; + if (length_mod != 0) { + dim_end[dim] += stride - length_mod; + } + } + + // Find out how large the blocks are that we can copy contiguously. (All + // dimensions on the right for which we fetch the full range) + int32_t last_sliced_dim = input_rank - 1; + int32_t block_size = 1; + for (int32_t dim = input_rank - 1; dim >= 0 && dim_is_full_range[dim]; + --dim) { + block_size *= input_shape[dim]; + last_sliced_dim--; + } + + // Initialize the read pos for each dimension according to the begin offsets. + int32_t read_pos[MAX_RANK] = {0}; + for (int32_t dim = 0; dim < input_rank; ++dim) { + read_pos[dim] = dim_begin[dim]; + } + + while (read_pos[0] != dim_end[0]) { + // Compute the read offset for the current position. + int32_t read_offset = 0; + for (int32_t dim = 0; dim <= last_sliced_dim; ++dim) { + read_offset += (read_pos[dim] % input_shape[dim]) * dim_addr_strides[dim]; + } + +#if USE_TYPED_MEMSETMEMCPY + std::copy(input_values + read_offset, + input_values + read_offset + block_size, output_values); +#else + std::memcpy(output_values, input_values + read_offset, + block_size * sizeof(T)); +#endif + output_values += block_size; + + // Advance the read position. + for (int32_t dim = last_sliced_dim; dim >= 0; --dim) { + read_pos[dim] += strides[dim]; + if (dim == 0 || read_pos[dim] != dim_end[dim]) + break; + read_pos[dim] = dim_begin[dim]; + } + } +} + +template <typename T> +void TransposeRank3(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t* __restrict perm, + T* __restrict output_values) { + BENCHMARK_TIMER("TransposeRank3"); + const int32_t in_strides[3] = { + input_shape[1] * input_shape[2], + input_shape[2], + 1, + }; + const int32_t out_strides[3] = {in_strides[perm[0]], in_strides[perm[1]], + in_strides[perm[2]]}; + const int32_t out_shape[3] = {input_shape[perm[0]], input_shape[perm[1]], + input_shape[perm[2]]}; + + int32_t write_offset = 0; + for (int32_t it0 = 0; it0 < out_shape[0]; ++it0) { + const int32_t read_offset0 = it0 * out_strides[0]; + for (int32_t it1 = 0; it1 < out_shape[1]; ++it1) { + const int32_t read_offset01 = read_offset0 + it1 * out_strides[1]; + for (int32_t it2 = 0; it2 < out_shape[2]; ++it2, ++write_offset) { + const int32_t read_offset = read_offset01 + it2 * out_strides[2]; + output_values[write_offset] = input_values[read_offset]; + } + } + } +} + +template <typename T> +void TransposeRank4(const int32_t* __restrict input_shape, + const T* __restrict input_values, + const int32_t* __restrict perm, + T* __restrict output_values) { + BENCHMARK_TIMER("TransposeRank4"); + const int32_t in_strides[4] = { + input_shape[1] * input_shape[2] * input_shape[3], + input_shape[2] * input_shape[3], + input_shape[3], + 1, + }; + const int32_t out_strides[4] = {in_strides[perm[0]], in_strides[perm[1]], + in_strides[perm[2]], in_strides[perm[3]]}; + const int32_t out_shape[4] = {input_shape[perm[0]], input_shape[perm[1]], + input_shape[perm[2]], input_shape[perm[3]]}; + + int32_t write_offset = 0; + for (int32_t it0 = 0; it0 < out_shape[0]; ++it0) { + const int32_t read_offset0 = it0 * out_strides[0]; + for (int32_t it1 = 0; it1 < out_shape[1]; ++it1) { + const int32_t read_offset01 = read_offset0 + it1 * out_strides[1]; + for (int32_t it2 = 0; it2 < out_shape[2]; ++it2) { + const int32_t read_offset012 = read_offset01 + it2 * out_strides[2]; + for (int32_t it3 = 0; it3 < out_shape[3]; ++it3, ++write_offset) { + const int32_t read_offset = read_offset012 + it3 * out_strides[3]; + output_values[write_offset] = input_values[read_offset]; + } + } + } + } +} + +template <typename T, typename TIdx, typename TDepth> +void OneHot(const int32_t input_rank, + const int32_t* __restrict input_shape, + const TIdx* __restrict input_values, + const TDepth* __restrict depth, + const T* __restrict on_value, + const T* __restrict off_value, + const int32_t axis, + T* __restrict output_values) { + BENCHMARK_TIMER("OneHot"); + const int32_t num_elements = ShapeSize(input_rank, input_shape); + // We can assume axis >= 0 in this implementation. + const int32_t prefix_dim_size = ShapeSize(axis, input_shape); + const int32_t suffix_dim_size = num_elements / prefix_dim_size; + int32_t write_offset = 0; + for (int32_t i = 0; i < prefix_dim_size; ++i) { + const int32_t read_offset_pre = i * suffix_dim_size; + for (TDepth d = 0; d < *depth; ++d) { + for (int32_t j = 0; j < suffix_dim_size; ++j, ++write_offset) { + const int32_t read_offset = read_offset_pre + j; + output_values[write_offset] = + (input_values[read_offset] == d) ? *on_value : *off_value; + } + } + } +} + +template <typename T, typename TIdx, typename TDepth> +void OneHotLastDim(const int32_t input_rank, + const int32_t* __restrict input_shape, + const TIdx* __restrict input_values, + const TDepth* __restrict depth, + const T* __restrict on_value, + const T* __restrict off_value, + T* __restrict output_values) { + BENCHMARK_TIMER("OneHotLastDim"); + const int32_t num_elements = ShapeSize(input_rank, input_shape); + int32_t write_offset = 0; + for (int32_t i = 0; i < num_elements; ++i) { + for (TDepth d = 0; d < *depth; ++d, ++write_offset) { + output_values[write_offset] = + (input_values[i] == d) ? *on_value : *off_value; + } + } +} + +// ----------------------------------------------------------------------------- +// Simple unary ops +// ----------------------------------------------------------------------------- + +// We use macros instead of template functions with templated functors here +// because it's a lot less verbose and easier for the compiler to optimize. + +#if USE_EIGEN + +#define SIMPLE_UNARY_OP(OP_NAME, _, EXPR_EIGEN) \ + template <typename T> \ + void OP_NAME(const int32_t rank, const int32_t* __restrict input_shape, \ + const T* __restrict input_values, \ + T* __restrict output_values) { \ + BENCHMARK_TIMER(#OP_NAME); \ + const int32_t size = ShapeSize(rank, input_shape); \ + auto values = ConstRowVectorMap<T>(input_values, size).array(); \ + auto output = RowVectorMap<T>(output_values, size).array(); \ + output = EXPR_EIGEN; \ + } + +#else + +#define SIMPLE_UNARY_OP(OP_NAME, EXPR, _) \ + template <typename T> \ + void OP_NAME(const int32_t rank, const int32_t* __restrict input_shape, \ + const T* __restrict input_values, \ + T* __restrict output_values) { \ + BENCHMARK_TIMER(#OP_NAME); \ + const int32_t size = ShapeSize(rank, input_shape); \ + for (int32_t i = 0; i < size; ++i) { \ + const T value = input_values[i]; \ + output_values[i] = EXPR; \ + } \ + } + +#endif + +// Second macro param is value expression, third entry is Eigen vector +// expression. +SIMPLE_UNARY_OP(Abs, std::abs(value), values.abs()) +SIMPLE_UNARY_OP(Acos, std::acos(value), values.acos()) +SIMPLE_UNARY_OP(Asin, std::asin(value), values.asin()) +SIMPLE_UNARY_OP(Atan, std::atan(value), values.atan()) +SIMPLE_UNARY_OP(Cos, std::cos(value), values.cos()) +SIMPLE_UNARY_OP(Cosh, std::cosh(value), values.cosh()) +SIMPLE_UNARY_OP(Exp, std::exp(value), values.exp()) +SIMPLE_UNARY_OP(Elu, + value < 0 ? std::expm1(value) : value, + // Use branchless version of Elu: min(ReLU, e^x - 1) + values.max(0).min(values.exp() - 1)) +SIMPLE_UNARY_OP(HardSigmoid, + std::min(std::max((static_cast<T>(0.2) * value + + static_cast<T>(0.5)), + static_cast<T>(0)), + static_cast<T>(1)), + (0.2 * values + 0.5).max(0).min(1)) +SIMPLE_UNARY_OP(Log, std::log(value), values.log()) +SIMPLE_UNARY_OP(Log1p, std::log1p(value), values.log1p()) +SIMPLE_UNARY_OP(Neg, -value, -values) +SIMPLE_UNARY_OP(Reciprocal, static_cast<T>(1) / value, values.cwiseInverse()) +SIMPLE_UNARY_OP(Relu, std::max(value, static_cast<T>(0)), values.max(0)) +SIMPLE_UNARY_OP(Relu6, + std::min(std::max(value, static_cast<T>(0)), static_cast<T>(6)), + values.max(0).min(6)) +SIMPLE_UNARY_OP(Rsqrt, static_cast<T>(1) / std::sqrt(value), values.rsqrt()) +SIMPLE_UNARY_OP(Sigmoid, + static_cast<T>(1) / (1 + std::exp(-value)), + ((-values).exp() + 1).cwiseInverse()) +SIMPLE_UNARY_OP(Sin, std::sin(value), values.sin()) +SIMPLE_UNARY_OP(Sinh, std::sinh(value), values.sinh()) +SIMPLE_UNARY_OP(Sqrt, std::sqrt(value), values.sqrt()) +SIMPLE_UNARY_OP(Square, value* value, values.square()) +SIMPLE_UNARY_OP(Tan, std::tan(value), values.tan()) +SIMPLE_UNARY_OP(Tanh, std::tanh(value), values.tanh()) + +// ----------------------------------------------------------------------------- +// Broadcasting binary ops +// ----------------------------------------------------------------------------- + +template <typename T, typename OP> +void OpNoBroadcast(const int32_t left_rank, + const int32_t* __restrict left_shape, + const T* __restrict left_values, + const int32_t right_rank, + const int32_t* __restrict right_shape, + const T* __restrict right_values, + T* __restrict output_values, + OP op) { + BENCHMARK_TIMER(op.name, "NoBroadcast"); + const int32_t size = ShapeSize(left_rank, left_shape); +#if USE_EIGEN + auto lhs = ConstRowVectorMap<T>(left_values, size).array(); + auto rhs = ConstRowVectorMap<T>(right_values, size).array(); + auto output = RowVectorMap<T>(output_values, size).array(); + op.apply(lhs, rhs, output); +#else + for (int32_t i = 0; i < size; ++i) { + output_values[i] = op(left_values[i], right_values[i]); + } +#endif +} + +template <typename T, typename OP> +void OpInnerBroadcast(int32_t left_rank, + const int32_t* __restrict left_shape, + const T* __restrict left_values, + int32_t right_rank, + const int32_t* __restrict right_shape, + const T* __restrict right_values, + T* __restrict output_values, + OP op) { + BENCHMARK_TIMER(op.name, "InnerBroadcast"); + const int32_t output_size = ShapeSize(left_rank, left_shape); + const int32_t inner_size = ShapeSize(right_rank, right_shape); + const int32_t outer_size = output_size / inner_size; +#if USE_EIGEN + if (inner_size == 1) { + // Apply the same value to all elements. + auto left = ConstMatrixMap<T>(left_values, inner_size, outer_size); + auto output = MatrixMap<T>(output_values, inner_size, outer_size); + op.apply(left.array(), right_values[0], output.array()); + } else { + auto left = ConstMatrixMap<T>(left_values, inner_size, outer_size); + auto right = ConstRowVectorMap<T>(right_values, inner_size); + auto output = MatrixMap<T>(output_values, inner_size, outer_size); + for (int32_t col = 0; col < outer_size; col++) { + op.apply(left.col(col).array(), right.array(), output.col(col).array()); + } + } +#else + for (int32_t idx_out = 0; idx_out < outer_size; ++idx_out) { + for (int32_t idx_in = 0; idx_in < inner_size; ++idx_in) { + const int32_t offset = idx_out * inner_size + idx_in; + output_values[offset] = op(left_values[offset], right_values[idx_in]); + } + } +#endif +} + +// Increments indices according to a shape. +// Returns false if indices can't be incremented because they point to the last +// element. +// +// E.g. if shape is (2, 3) and indices is [1, 2], indices is incremented to [2, +// 0]. +inline bool IncrementIndices(int32_t rank, + const int32_t* shape, + int32_t* indices) { + int32_t i = rank - 1; + while (i >= 0 && indices[i] == shape[i] - 1) { + --i; + } + if (i < 0) { + return false; + } + indices[i] += 1; + for (++i; i < rank; ++i) { + indices[i] = 0; + } + return true; +} + +// Returns the offset in a values array given its shape and indices. +// E.g. if the shape is (2, 3) and indices are [1, 2] the offset is 1*3 + 2. +inline int32_t Offset(int32_t rank, + const int32_t* shape, + const int32_t* indices) { + int32_t offset = 0; + int32_t mul = 1; + for (int32_t i = rank - 1; i >= 0; --i) { + offset += mul * indices[i]; + mul *= shape[i]; + } + return offset; +} + +// Like Offset() but with broadcasting. +// E.g. if the input_shape is (2, 1, 3) and indices are [1, 2, 2] the offset is +// 1*1*3 + 2*0 + 2. +// The indices_rank can be greater than the input_rank and then the first +// indices_rank - input_rank indices are ignored. +// E.g. if the input_shape is (4) and indices are [2, 3, 1] the offset is 1. +inline int32_t BroadcastOffset(int32_t input_rank, + const int32_t* input_shape, + int32_t indices_rank, + const int32_t* indices) { + int32_t offset = 0; + int32_t mul = 1; + for (int32_t i = input_rank - 1; i >= 0; --i) { + int32_t index = + input_shape[i] == 1 ? 0 : indices[i + indices_rank - input_rank]; + offset += mul * index; + mul *= input_shape[i]; + } + return offset; +} + +template <typename T, typename OP> +void OpGenericBroadcast(int32_t left_rank, + const int32_t* __restrict left_shape, + const T* __restrict left_values, + int32_t right_rank, + const int32_t* __restrict right_shape, + const T* __restrict right_values, + T* __restrict output_values, + OP op) { + BENCHMARK_TIMER(op.name, "GenericBroadcast"); + const int32_t output_rank = std::max(left_rank, right_rank); + const int32_t kMaxRank = 8; + assert(output_rank <= kMaxRank); + + int32_t output_shape[kMaxRank]; + for (int32_t i = 0; i < output_rank; ++i) { + int32_t left_i = i - output_rank + left_rank; + int32_t right_i = i - output_rank + right_rank; + output_shape[i] = std::max(left_i >= 0 ? left_shape[left_i] : 0, + right_i >= 0 ? right_shape[right_i] : 0); + } + + int32_t output_indices[kMaxRank]{}; + do { + output_values[Offset(output_rank, output_shape, output_indices)] = + op(left_values[BroadcastOffset(left_rank, left_shape, output_rank, + output_indices)], + right_values[BroadcastOffset(right_rank, right_shape, output_rank, + output_indices)]); + } while (IncrementIndices(output_rank, output_shape, output_indices)); +} + +#define BROADCAST_BINARY_OP(OP_NAME, EXPR, EXPR_EIGEN) \ + template <typename T> \ + struct Op##OP_NAME { \ + const char* name = #OP_NAME; \ + T operator()(const T lhs, const T rhs) { return EXPR; } \ + template <typename X, typename Y, typename Z> \ + void apply(const X& lhs, const Y& rhs, Z out) { \ + out = EXPR_EIGEN; \ + } \ + }; \ + template <typename T> \ + void OP_NAME##NoBroadcast( \ + const int32_t left_rank, const int32_t* __restrict left_shape, \ + const T* __restrict left_values, const int32_t right_rank, \ + const int32_t* __restrict right_shape, const T* __restrict right_values, \ + T* __restrict output_values) { \ + OpNoBroadcast(left_rank, left_shape, left_values, right_rank, right_shape, \ + right_values, output_values, Op##OP_NAME<T>()); \ + } \ + template <typename T> \ + void OP_NAME##InnerBroadcast( \ + const int32_t left_rank, const int32_t* __restrict left_shape, \ + const T* __restrict left_values, const int32_t right_rank, \ + const int32_t* __restrict right_shape, const T* __restrict right_values, \ + T* __restrict output_values) { \ + OpInnerBroadcast(left_rank, left_shape, left_values, right_rank, \ + right_shape, right_values, output_values, \ + Op##OP_NAME<T>()); \ + } \ + template <typename T> \ + void OP_NAME(const int32_t left_rank, const int32_t* __restrict left_shape, \ + const T* __restrict left_values, const int32_t right_rank, \ + const int32_t* __restrict right_shape, \ + const T* __restrict right_values, \ + T* __restrict output_values) { \ + OpGenericBroadcast(left_rank, left_shape, left_values, right_rank, \ + right_shape, right_values, output_values, \ + Op##OP_NAME<T>()); \ + } + +// Second macro param is value expression, third entry is Eigen vector +// expression. +BROADCAST_BINARY_OP(Add, lhs + rhs, lhs + rhs) +BROADCAST_BINARY_OP(Maximum, std::max(lhs, rhs), lhs.max(rhs)) +BROADCAST_BINARY_OP(Minimum, std::min(lhs, rhs), lhs.min(rhs)) +BROADCAST_BINARY_OP(Mul, lhs* rhs, lhs* rhs) +BROADCAST_BINARY_OP(Sub, lhs - rhs, lhs - rhs) +BROADCAST_BINARY_OP(SquaredDifference, + (lhs - rhs) * (lhs - rhs), + (lhs - rhs).square()) + +// ----------------------------------------------------------------------------- +// Reduce ops +// ----------------------------------------------------------------------------- + +// We use macros instead of template functions with templated functors here +// because it's a lot less verbose and easier for the compiler to optimize. +#define REDUCE_OP(OP_NAME, DEFAULT_VALUE, UPDATE_EXPR, RESULT_EXPR) \ + template <typename T, typename Tidx> \ + void OP_NAME##InnerReduce( \ + int32_t input_rank, const int32_t* __restrict input_shape, \ + const T* __restrict input_values, int32_t index_tensor_rank, \ + const int32_t* __restrict index_shape, \ + const Tidx* __restrict index_values, T* __restrict output_values) { \ + BENCHMARK_TIMER(#OP_NAME, "InnerReduce"); \ + const int32_t inner_size = \ + GetReduceInnerSize(input_rank, input_shape, index_tensor_rank, \ + index_shape, index_values); \ + const int32_t input_size = ShapeSize(input_rank, input_shape); \ + const int32_t outer_size = input_size / inner_size; \ + for (int32_t idx_out = 0; idx_out < outer_size; ++idx_out) { \ + T value = DEFAULT_VALUE; \ + for (int32_t idx_in = 0; idx_in < inner_size; ++idx_in) { \ + const T prev = value; \ + const T next = input_values[idx_out * inner_size + idx_in]; \ + value = UPDATE_EXPR; \ + } \ + const T count = inner_size; \ + /* Used by mean reduce. */ \ + (void)sizeof(count); \ + output_values[idx_out] = RESULT_EXPR; \ + } \ + } \ + template <typename T, typename Tidx> \ + void OP_NAME##GenericReduceRank2( \ + int32_t input_rank, const int32_t* __restrict input_shape, \ + const T* __restrict input_values, int32_t index_tensor_rank, \ + const int32_t* __restrict index_shape, \ + const Tidx* __restrict index_values, T* __restrict output_values) { \ + assert(input_rank == 2); \ + assert(index_tensor_rank <= 1); \ + BENCHMARK_TIMER(#OP_NAME, "GenericReduceRank2"); \ + const int32_t output_size = input_shape[1]; \ + std::fill_n(output_values, output_size, DEFAULT_VALUE); \ + for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) { \ + for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1, ++input_values) { \ + T* out_ptr = output_values + dim1; \ + const T prev = *out_ptr; \ + const T next = *input_values; \ + *out_ptr = UPDATE_EXPR; \ + } \ + } \ + const T count = input_shape[0]; \ + /* Used by mean reduce. */ \ + (void)sizeof(count); \ + for (int32_t i = 0; i < output_size; ++i) { \ + const T value = output_values[i]; \ + output_values[i] = RESULT_EXPR; \ + } \ + } \ + template <typename T, typename Tidx> \ + void OP_NAME##GenericReduceRank3( \ + int32_t input_rank, const int32_t* __restrict input_shape, \ + const T* __restrict input_values, int32_t index_tensor_rank, \ + const int32_t* __restrict index_shape, \ + const Tidx* __restrict index_values, T* __restrict output_values) { \ + assert(input_rank == 3); \ + assert(index_tensor_rank <= 1); \ + BENCHMARK_TIMER(#OP_NAME, "GenericReduceRank3"); \ + int32_t out_shape[3] = {input_shape[0], input_shape[1], input_shape[2]}; \ + bool reduce_mask[3] = {false, false, false}; \ + const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1; \ + for (int32_t i = 0; i < num_indices; ++i) { \ + reduce_mask[index_values[i]] = true; \ + out_shape[index_values[i]] = 1; \ + } \ + const int32_t out_strides[3] = { \ + reduce_mask[0] ? 0 : out_shape[1] * out_shape[2], \ + reduce_mask[1] ? 0 : out_shape[2], \ + reduce_mask[2] ? 0 : 1, \ + }; \ + const int32_t output_size = ShapeSize(input_rank, out_shape); \ + std::fill_n(output_values, output_size, DEFAULT_VALUE); \ + for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) { \ + for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1) { \ + for (int32_t dim2 = 0; dim2 < input_shape[2]; \ + ++dim2, ++input_values) { \ + T* out_ptr = output_values + out_strides[0] * dim0 + \ + out_strides[1] * dim1 + out_strides[2] * dim2; \ + const T prev = *out_ptr; \ + const T next = *input_values; \ + *out_ptr = UPDATE_EXPR; \ + } \ + } \ + } \ + const T count = (reduce_mask[0] ? input_shape[0] : 1) * \ + (reduce_mask[1] ? input_shape[1] : 1) * \ + (reduce_mask[2] ? input_shape[2] : 1); \ + /* Used by mean reduce. */ \ + (void)sizeof(count); \ + for (int32_t i = 0; i < output_size; ++i) { \ + const T value = output_values[i]; \ + output_values[i] = RESULT_EXPR; \ + } \ + } \ + template <typename T, typename Tidx> \ + void OP_NAME##GenericReduceRank4( \ + int32_t input_rank, const int32_t* __restrict input_shape, \ + const T* __restrict input_values, int32_t index_tensor_rank, \ + const int32_t* __restrict index_shape, \ + const Tidx* __restrict index_values, T* __restrict output_values) { \ + assert(input_rank == 4); \ + assert(index_tensor_rank <= 1); \ + BENCHMARK_TIMER(#OP_NAME, "GenericReduceRank4"); \ + int32_t out_shape[4] = {input_shape[0], input_shape[1], input_shape[2], \ + input_shape[3]}; \ + bool reduce_mask[4] = {false, false, false, false}; \ + const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1; \ + for (int32_t i = 0; i < num_indices; ++i) { \ + reduce_mask[index_values[i]] = true; \ + out_shape[index_values[i]] = 1; \ + } \ + const int32_t out_strides[4] = { \ + reduce_mask[0] ? 0 : out_shape[1] * out_shape[2] * out_shape[3], \ + reduce_mask[1] ? 0 : out_shape[2] * out_shape[3], \ + reduce_mask[2] ? 0 : out_shape[3], \ + reduce_mask[3] ? 0 : 1, \ + }; \ + const int32_t output_size = ShapeSize(input_rank, out_shape); \ + std::fill_n(output_values, output_size, DEFAULT_VALUE); \ + for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) { \ + for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1) { \ + for (int32_t dim2 = 0; dim2 < input_shape[2]; ++dim2) { \ + for (int32_t dim3 = 0; dim3 < input_shape[3]; \ + ++dim3, ++input_values) { \ + T* out_ptr = output_values + out_strides[0] * dim0 + \ + out_strides[1] * dim1 + out_strides[2] * dim2 + \ + out_strides[3] * dim3; \ + const T prev = *out_ptr; \ + const T next = *input_values; \ + *out_ptr = UPDATE_EXPR; \ + } \ + } \ + } \ + } \ + const T count = (reduce_mask[0] ? input_shape[0] : 1) * \ + (reduce_mask[1] ? input_shape[1] : 1) * \ + (reduce_mask[2] ? input_shape[2] : 1) * \ + (reduce_mask[3] ? input_shape[3] : 1); \ + /* Used by mean reduce. */ \ + (void)sizeof(count); \ + for (int32_t i = 0; i < output_size; ++i) { \ + const T value = output_values[i]; \ + output_values[i] = RESULT_EXPR; \ + } \ + } \ + template <typename T, typename Tidx> \ + void OP_NAME##GenericReduceRank5( \ + int32_t input_rank, const int32_t* __restrict input_shape, \ + const T* __restrict input_values, int32_t index_tensor_rank, \ + const int32_t* __restrict index_shape, \ + const Tidx* __restrict index_values, T* __restrict output_values) { \ + assert(input_rank == 5); \ + assert(index_tensor_rank <= 1); \ + BENCHMARK_TIMER(#OP_NAME, "GenericReduceRank5"); \ + int32_t out_shape[5] = {input_shape[0], input_shape[1], input_shape[2], \ + input_shape[3], input_shape[4]}; \ + /* If true, reduce the input across that dimension. */ \ + bool reduce_mask[5] = {false, false, false, false, false}; \ + const int32_t num_indices = index_tensor_rank > 0 ? index_shape[0] : 1; \ + for (int32_t i = 0; i < num_indices; ++i) { \ + reduce_mask[index_values[i]] = true; \ + out_shape[index_values[i]] = 1; \ + } \ + const int32_t out_strides[5] = { \ + reduce_mask[0] \ + ? 0 \ + : out_shape[1] * out_shape[2] * out_shape[3] * out_shape[4], \ + reduce_mask[1] ? 0 : out_shape[2] * out_shape[3] * out_shape[4], \ + reduce_mask[2] ? 0 : out_shape[3] * out_shape[4], \ + reduce_mask[3] ? 0 : out_shape[4], \ + reduce_mask[4] ? 0 : 1, \ + }; \ + const int32_t output_size = ShapeSize(input_rank, out_shape); \ + std::fill_n(output_values, output_size, DEFAULT_VALUE); \ + for (int32_t dim0 = 0; dim0 < input_shape[0]; ++dim0) { \ + for (int32_t dim1 = 0; dim1 < input_shape[1]; ++dim1) { \ + for (int32_t dim2 = 0; dim2 < input_shape[2]; ++dim2) { \ + for (int32_t dim3 = 0; dim3 < input_shape[3]; ++dim3) { \ + for (int32_t dim4 = 0; dim4 < input_shape[4]; \ + ++dim4, ++input_values) { \ + T* out_ptr = output_values + out_strides[0] * dim0 + \ + out_strides[1] * dim1 + out_strides[2] * dim2 + \ + out_strides[3] * dim3 + out_strides[4] * dim4; \ + const T prev = *out_ptr; \ + const T next = *input_values; \ + *out_ptr = UPDATE_EXPR; \ + } \ + } \ + } \ + } \ + } \ + const T count = (reduce_mask[0] ? input_shape[0] : 1) * \ + (reduce_mask[1] ? input_shape[1] : 1) * \ + (reduce_mask[2] ? input_shape[2] : 1) * \ + (reduce_mask[3] ? input_shape[3] : 1) * \ + (reduce_mask[4] ? input_shape[4] : 1); \ + /* Used by mean reduce. */ \ + (void)sizeof(count); \ + for (int32_t i = 0; i < output_size; ++i) { \ + const T value = output_values[i]; \ + output_values[i] = RESULT_EXPR; \ + } \ + } + +REDUCE_OP(Max, std::numeric_limits<T>::lowest(), std::max(prev, next), value) +REDUCE_OP(Min, std::numeric_limits<T>::infinity(), std::min(prev, next), value) +REDUCE_OP(Sum, 0, prev + next, value) +REDUCE_OP(Mean, 0, prev + next, value / count) + +// ----------------------------------------------------------------------------- +// Dequantize ops +// ----------------------------------------------------------------------------- + +template <typename T> +void DequantizeMinCombined(const int32_t rank, + const int32_t* __restrict input_shape, + const T* __restrict input_values, + const float* __restrict min_range, + const float* __restrict max_range, + float* __restrict output_values) { + BENCHMARK_TIMER("DequantizeMinCombined"); + const int32_t size = ShapeSize(rank, input_shape); + const float offset = + std::is_signed<T>::value + ? (static_cast<float>(std::numeric_limits<T>::max()) - + std::numeric_limits<T>::min() + 1) / + 2.0f + : 0.0f; + const float range_scale = (max_range[0] - min_range[0]) / + (static_cast<float>(std::numeric_limits<T>::max()) - + std::numeric_limits<T>::min()); + for (int32_t i = 0; i < size; ++i) { + output_values[i] = + ((static_cast<int32_t>(input_values[i]) + offset) * range_scale) + + min_range[0]; + } +} + +template <typename T> +void DequantizeMinFirst(const int32_t rank, + const int32_t* __restrict input_shape, + const T* __restrict input_values, + const float* __restrict min_range, + const float* __restrict max_range, + float* __restrict output_values) { + BENCHMARK_TIMER("DequantizeMinFirst"); + const int32_t size = ShapeSize(rank, input_shape); + const float range_scale = (max_range[0] - min_range[0]) / + (static_cast<float>(std::numeric_limits<T>::max()) - + std::numeric_limits<T>::min()); + const float range_min_rounded = + (max_range[0] == min_range[0] + ? min_range[0] + : std::round(min_range[0] / range_scale) * range_scale); + for (int32_t i = 0; i < size; ++i) { + output_values[i] = ((static_cast<int32_t>(input_values[i]) - + std::numeric_limits<T>::min()) * + range_scale) + + range_min_rounded; + } +} + +// ----------------------------------------------------------------------------- +// AddN op +// ----------------------------------------------------------------------------- + +template <typename T> +void AddN(const int32_t rank, + const int32_t* __restrict shape, + std::initializer_list<const T* __restrict> input_values, + T* __restrict output_values) { + BENCHMARK_TIMER("AddN"); + const int32_t size = ShapeSize(rank, shape); +#if USE_EIGEN + auto output = RowVectorMap<T>(output_values, size).array(); + std::fill_n(output_values, size, 0); + for (const auto input_value : input_values) { + output += ConstRowVectorMap<T>(input_value, size).array(); + } +#else + for (int32_t i = 0; i < size; ++i) { + T output_value = 0; + for (auto input_value : input_values) { + output_value += input_value[i]; + } + output_values[i] = output_value; + } +#endif +} + +// ----------------------------------------------------------------------------- +// CONSTANTS +// Note that for now, endianness of the target machine needs to match that of +// the one training was performed on. +// ----------------------------------------------------------------------------- +const int32_t dnn_hiddenlayer_0_bias__0__cf__0_shape[1] = {20}; +const union { + uint8_t bytes[80]; + float values[20]; +} dnn_hiddenlayer_0_bias__0__cf__0 = {{ + 0x93, 0xa2, 0x71, 0x3e, 0x73, 0xa8, 0x38, 0xbf, 0x57, 0xda, 0x8d, 0xbf, + 0x99, 0x04, 0x97, 0x3f, 0xed, 0xf1, 0xef, 0xbf, 0x0f, 0x0f, 0xa0, 0xbf, + 0x44, 0xad, 0x97, 0x3f, 0x4f, 0x01, 0xd0, 0x3f, 0x1a, 0xab, 0x30, 0xbf, + 0x26, 0xec, 0x01, 0x3e, 0x2b, 0x49, 0xfb, 0xbf, 0x01, 0xc6, 0x57, 0x3e, + 0x84, 0xf7, 0x8d, 0x3f, 0xaf, 0x32, 0xd1, 0xbe, 0x95, 0x54, 0xc9, 0x3f, + 0x3c, 0x57, 0x30, 0xc0, 0x90, 0x1a, 0xc9, 0x3f, 0x38, 0x7f, 0xb7, 0x3f, + 0x5d, 0xf7, 0x2a, 0x3c, 0x53, 0x6b, 0x0b, 0xc0, +}}; +const int32_t dnn_hiddenlayer_0_kernel__1__cf__1_shape[2] = {325, 20}; +const union { + uint8_t bytes[26000]; + float values[6500]; +} dnn_hiddenlayer_0_kernel__1__cf__1 = {{ + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0x2d, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0x72, 0xbf, 0x60, 0xb0, 0x8a, 0x3f, 0x70, 0xb1, 0xa4, 0xbf, + 0x80, 0xb2, 0x3e, 0x3f, 0xa0, 0xb4, 0xf2, 0x3e, 0x78, 0x07, 0xb6, 0xbf, + 0x70, 0x5c, 0xad, 0xbf, 0x60, 0x06, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, 0x58, 0xb0, 0x8a, 0xbf, + 0x90, 0x5e, 0x61, 0x3f, 0x70, 0x5c, 0xad, 0xbf, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0x5c, 0xad, 0x3e, 0x68, 0x06, 0x9c, 0xbf, 0x78, 0x07, 0xb6, 0xbf, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0x50, 0xbf, 0x58, 0x05, 0x82, 0xbf, 0x70, 0xb1, 0xa4, 0x3f, + 0xa0, 0xb4, 0xf2, 0xbf, 0x70, 0x5c, 0xad, 0xbf, 0x60, 0xb0, 0x8a, 0x3f, + 0x90, 0xb3, 0xd8, 0x3f, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0xa0, 0xb4, 0xf2, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x58, 0x05, 0x82, 0x3f, + 0x60, 0x5c, 0xad, 0xbe, 0x90, 0xb3, 0xd8, 0x3f, 0x72, 0x5c, 0x2d, 0xc0, + 0x80, 0xb2, 0xbe, 0x3f, 0x88, 0x5d, 0xc7, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x05, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0x5c, 0xad, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x5c, 0xad, 0x3e, 0x58, 0xb0, 0x8a, 0xbf, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0xb2, 0xbe, 0xbf, 0x80, 0x08, 0xd0, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbe, 0x68, 0x06, 0x9c, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x5c, 0xad, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb2, 0x3e, 0xbf, + 0x60, 0x5c, 0xad, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x58, 0x05, 0x82, 0xbf, 0x90, 0x08, 0x50, 0x3f, 0x80, 0xb2, 0xbe, 0xbf, + 0xa0, 0xb4, 0xf2, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x68, 0x06, 0x9c, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0x5d, 0xc7, 0xbf, 0xa0, 0xb4, 0xf2, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3f, 0x84, 0x5d, 0xc7, 0x40, 0x18, 0xb4, 0x65, 0xc0, + 0x80, 0x08, 0xd0, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x68, 0x06, 0x1c, 0xc0, + 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, + 0xe0, 0x05, 0x0f, 0x40, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0xa8, 0x5f, 0xfb, 0x3f, 0xe0, 0x05, 0x0f, 0x40, + 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x5c, 0x2d, 0xbf, 0x60, 0x5b, 0x93, 0xbf, + 0x70, 0xb1, 0xa4, 0x3f, 0x98, 0x09, 0xea, 0xbf, 0x68, 0x06, 0x9c, 0xbf, + 0x60, 0x5b, 0x93, 0x3f, 0x80, 0xb2, 0xbe, 0x3f, 0x80, 0xb2, 0x3e, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0xa8, 0x5f, 0xfb, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0x68, 0x06, 0x9c, 0x3f, 0x60, 0x5c, 0xad, 0xbe, 0x88, 0x08, 0xd0, 0x3f, + 0xf0, 0x06, 0x29, 0xc0, 0x88, 0x5d, 0xc7, 0x3f, 0x70, 0xb1, 0xa4, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x5c, 0xb0, 0x0a, 0xc0, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0x06, 0x1c, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x58, 0xb0, 0x8a, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x5d, 0xc7, 0xbf, 0x80, 0x08, 0xd0, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbe, 0x78, 0x07, 0xb6, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, + 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x58, 0xb0, 0x8a, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x90, 0xb3, 0xd8, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x5c, 0xad, 0xbe, 0x68, 0x06, 0x9c, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x68, 0x06, 0x9c, 0xbf, 0xa0, 0xb4, 0xf2, 0x3e, 0x90, 0x08, 0x50, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x5c, 0xb0, 0x0a, 0x40, 0x70, 0x5c, 0xad, 0x3f, + 0x54, 0x05, 0x02, 0xc0, 0x58, 0x05, 0x82, 0x3f, 0x80, 0xb2, 0x3e, 0x3f, + 0x90, 0x5e, 0x61, 0xbf, 0x60, 0xb0, 0x8a, 0x3f, 0x70, 0x5c, 0x2d, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb2, 0x3e, 0xbf, 0xa0, 0xb4, 0xf2, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x70, 0x5c, 0xad, 0x3f, 0x5c, 0xb0, 0x0a, 0x40, + 0xa0, 0xb4, 0xf2, 0x3e, 0x58, 0x05, 0x82, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0x5c, 0xad, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0x06, 0x1c, 0xbf, + 0x58, 0xb0, 0x8a, 0xbf, 0x68, 0x06, 0x9c, 0x3f, 0x98, 0x5e, 0xe1, 0xbf, + 0x68, 0x06, 0x9c, 0xbf, 0x68, 0x06, 0x9c, 0x3f, 0x90, 0xb3, 0xd8, 0x3f, + 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0x08, 0x50, 0x3e, 0xd8, 0x5a, 0x06, 0xc0, + 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x8a, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb2, 0xbe, 0x3f, 0xf6, 0xb1, 0x31, 0xc0, 0x88, 0x08, 0xd0, 0x3f, + 0x78, 0x07, 0xb6, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x05, 0x0f, 0xc0, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x0a, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x06, 0x1c, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, + 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, 0x98, 0x5e, 0xe1, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x0a, 0x3f, 0xa0, 0xb4, 0xf2, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, 0x90, 0x5e, 0x61, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x90, 0xb3, 0xd8, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, + 0x80, 0x08, 0xd0, 0x3e, 0x60, 0x06, 0x1c, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x68, 0x06, 0x9c, 0x3f, 0x68, 0x06, 0x9c, 0x3f, 0xa0, 0x09, 0xea, 0x3f, + 0x24, 0x0a, 0x77, 0xc0, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb2, 0x3e, 0x3f, 0x60, 0x5b, 0x93, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0x5c, 0x2d, 0xbf, 0x90, 0x5e, 0x61, 0x3f, + 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb2, 0x3e, 0xbf, 0x58, 0xb0, 0x8a, 0xbf, 0x60, 0xb0, 0x8a, 0x3f, + 0xa8, 0x5f, 0xfb, 0xbf, 0x60, 0x5b, 0x93, 0xbf, 0x60, 0x5b, 0x93, 0x3f, + 0x88, 0x5d, 0xc7, 0x3f, 0x80, 0x08, 0x50, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbf, 0x80, 0x5c, 0xad, 0x3e, 0x60, 0x5b, 0x93, 0x3f, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb2, 0xbe, 0x3f, 0xf6, 0xb1, 0x31, 0xc0, + 0x80, 0xb2, 0xbe, 0x3f, 0x78, 0x07, 0xb6, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0xe0, 0x05, 0x0f, 0xc0, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0xb1, 0xa4, 0x3f, + 0x70, 0x5c, 0x2d, 0xbf, 0x60, 0x5b, 0x93, 0xbf, 0x80, 0x08, 0x50, 0xbe, + 0xe4, 0xb0, 0x17, 0xc0, 0x60, 0x5c, 0xad, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x08, 0x50, 0xbf, 0x80, 0xb2, 0xbe, 0x3f, + 0x80, 0x08, 0xd0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x68, 0x06, 0x9c, 0x3f, 0x70, 0x5c, 0x2d, 0xbf, + 0x60, 0x5b, 0x93, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0x5b, 0x13, 0xc0, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb2, 0xbe, 0x3f, 0x70, 0xb1, 0xa4, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x06, 0x1c, 0xbf, 0x70, 0x5c, 0x2d, 0xbf, + 0x58, 0x05, 0x82, 0x3f, 0xa6, 0xdb, 0x99, 0xc0, 0x80, 0xb2, 0xbe, 0xbf, + 0x98, 0x5e, 0xe1, 0x3f, 0x80, 0xb2, 0x3e, 0x3f, 0x90, 0x5e, 0x61, 0x3f, + 0xf0, 0x06, 0x29, 0x40, 0x78, 0x07, 0xb6, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x05, 0x0f, 0x40, 0x80, 0xb2, 0x3e, 0xbf, 0x70, 0x5c, 0xad, 0x3f, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x88, 0x5d, 0xc7, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb2, 0x3e, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x58, 0x05, 0x82, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb2, 0x3e, 0xbf, 0x60, 0x5b, 0x93, 0xbf, + 0x60, 0xb0, 0x8a, 0x3f, 0x98, 0x5e, 0xe1, 0xbf, 0x60, 0x5b, 0x93, 0xbf, + 0x68, 0x06, 0x9c, 0x3f, 0x88, 0x08, 0xd0, 0x3f, 0x80, 0x08, 0x50, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0x98, 0x09, 0xea, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x58, 0x05, 0x82, 0x3f, 0x60, 0x5c, 0xad, 0xbe, 0x88, 0x08, 0xd0, 0x3f, + 0x72, 0x5c, 0x2d, 0xc0, 0x88, 0x5d, 0xc7, 0x3f, 0x78, 0x07, 0xb6, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x54, 0x05, 0x02, 0xc0, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x06, 0x1c, 0xbf, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0x08, 0x50, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0x5c, 0xad, 0x3e, + 0xa0, 0xb4, 0xf2, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb2, 0x3e, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x08, 0x50, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x06, 0x1c, 0x3f, + 0x70, 0x5c, 0x2d, 0xbf, 0x5c, 0xb0, 0x0a, 0x40, 0x80, 0xb0, 0x8a, 0xbd, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, 0x51, 0xde, 0xda, 0xc0, + 0x80, 0xb2, 0xbe, 0xbf, 0xa0, 0xb4, 0xf2, 0x3f, 0x78, 0x07, 0xb6, 0x3f, + 0xf0, 0x06, 0x29, 0x40, 0x60, 0x5b, 0x93, 0x3f, 0x70, 0x5c, 0x2d, 0xbf, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x5c, 0xad, 0x3e, 0x70, 0x5c, 0x2d, 0xbf, + 0x70, 0x5c, 0x2d, 0x3f, 0x70, 0x5c, 0x2d, 0xbf, 0xa8, 0x5f, 0xfb, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0xf2, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0x60, 0x5b, 0x93, 0xbf, + 0xa0, 0xb4, 0xf2, 0xbf, 0x70, 0x5c, 0xad, 0x3f, 0x58, 0xb0, 0x8a, 0xbf, + 0x58, 0x05, 0x82, 0xbf, 0x70, 0xb1, 0xa4, 0x3f, 0x70, 0x5c, 0x2d, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x5c, 0xad, 0x3e, 0x5c, 0xb0, 0x0a, 0xc0, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0x74, 0x5c, 0x2d, 0x40, 0x60, 0x5b, 0x13, 0xc0, 0x60, 0xb0, 0x8a, 0x3f, + 0x80, 0x5c, 0xad, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x7e, 0xb2, 0x3e, 0xc0, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0x50, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0x72, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0x06, 0x1c, 0xbf, 0x90, 0x5e, 0x61, 0xbf, + 0x07, 0xb3, 0xcb, 0xc0, 0xa0, 0xb4, 0x72, 0xbf, 0x60, 0x06, 0x1c, 0xbf, + 0x68, 0x06, 0x9c, 0x3f, 0xa0, 0xb4, 0xf2, 0x3e, 0x14, 0x09, 0x5d, 0x40, + 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x88, 0x08, 0xd0, 0xbf, + 0xa8, 0x5f, 0xfb, 0xbf, 0xa8, 0x5f, 0xfb, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, + 0x54, 0x05, 0x02, 0xc0, 0x98, 0x5e, 0xe1, 0x3f, 0x80, 0xb2, 0x3e, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x5d, 0xc7, 0xbf, 0x68, 0x06, 0x9c, 0xbf, 0x80, 0x08, 0xd0, 0x3e, + 0x90, 0x5e, 0x61, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0x3f, + 0x90, 0x08, 0x50, 0x3f, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb2, 0xbe, 0xbf, 0x80, 0x08, 0xd0, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x78, 0x07, 0x36, 0x40, 0x88, 0x08, 0xd0, 0xbf, + 0x58, 0x05, 0x82, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0x3e, + 0x84, 0x5d, 0x47, 0xc0, 0x80, 0x08, 0xd0, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0x2d, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x70, 0x5c, 0x2d, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0x70, 0x5c, 0xad, 0xbf, + 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x58, 0x05, 0x82, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0xce, 0x88, 0xd6, 0xc0, 0x80, 0x08, 0xd0, 0x3e, + 0x70, 0x5c, 0x2d, 0x3f, 0x60, 0xb0, 0x0a, 0x3f, 0x60, 0x5c, 0xad, 0xbe, + 0x64, 0x5b, 0x13, 0x40, 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x05, 0x82, 0xbf, 0x60, 0x5c, 0xad, 0xbe, 0x90, 0x5e, 0x61, 0xbf, + 0x90, 0xb3, 0xd8, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x18, 0x30, 0x84, 0x40, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0xbe, 0x98, 0x09, 0xea, 0xbf, 0x70, 0xb1, 0xa4, 0xbf, + 0x80, 0x08, 0xd0, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb2, 0x3e, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0x06, 0x1c, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0xad, 0xbf, 0x70, 0x5c, 0x2d, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x5c, 0xad, 0x3e, 0x74, 0x5c, 0x2d, 0x40, + 0x80, 0x08, 0x50, 0xbf, 0xa0, 0xb4, 0x72, 0x3f, 0xa0, 0xb4, 0xf2, 0xbe, + 0x70, 0x5c, 0x2d, 0x3f, 0x00, 0x08, 0x43, 0xc0, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0x5c, 0xad, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0x06, 0x1c, 0xbf, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0x08, 0xd0, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0xe0, 0x05, 0x0f, 0xc0, 0x01, 0x08, 0xc3, 0xc0, + 0x70, 0x5c, 0x2d, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x68, 0x06, 0x9c, 0x3f, + 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0x72, 0x3f, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x70, 0x06, 0x1c, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb2, 0x3e, 0x3f, + 0xf8, 0xb1, 0x31, 0x40, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb2, 0x3e, 0xbf, 0x98, 0x09, 0xea, 0xbf, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x0a, 0x3f, 0xa0, 0xb4, 0xf2, 0x3e, + 0x60, 0x5b, 0x93, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbf, + 0x80, 0xb2, 0x3e, 0xbf, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, + 0x74, 0x5c, 0x2d, 0x40, 0x80, 0xb2, 0x3e, 0xbf, 0x70, 0xb1, 0xa4, 0x3f, + 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb2, 0x3e, 0x3f, 0xf6, 0xb1, 0x31, 0xc0, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, 0x70, 0x5c, 0x2d, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, 0x9a, 0x09, 0x6a, 0xc0, + 0x80, 0x08, 0x50, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, 0xa8, 0x5f, 0xfb, 0x3f, + 0x80, 0xb2, 0xbe, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0x2d, 0x3f, + 0xa0, 0xb4, 0xf2, 0x3e, 0x90, 0x5e, 0x61, 0x3f, 0xa0, 0xb4, 0xf2, 0x3e, + 0x80, 0xb2, 0x3e, 0xbf, 0x90, 0xb3, 0xd8, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbe, + 0x58, 0xb0, 0x8a, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x0a, 0x3f, + 0x80, 0xb0, 0x0a, 0x3e, 0x58, 0x05, 0x82, 0xbf, 0x80, 0xb2, 0x3e, 0xbf, + 0x60, 0x06, 0x1c, 0xbf, 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x0a, 0x3f, 0xe0, 0x05, 0x0f, 0x40, 0x58, 0x05, 0x82, 0xbf, + 0x90, 0xb3, 0xd8, 0x3f, 0x58, 0xb0, 0x8a, 0xbf, 0xa0, 0xb4, 0x72, 0x3f, + 0x7e, 0xb2, 0x3e, 0xc0, 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0x08, 0x50, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x58, 0x05, 0x82, 0xbf, + 0xa0, 0xb4, 0x72, 0xc0, 0x20, 0x5f, 0x6e, 0x40, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x5c, 0xad, 0x3f, 0xe4, 0xb0, 0x17, 0xc0, 0x80, 0x08, 0x50, 0x3e, + 0x58, 0x05, 0x82, 0x3f, 0x90, 0x08, 0x50, 0x3f, 0x80, 0x08, 0xd0, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0xac, 0x86, 0xa2, 0xc0, + 0x70, 0x5c, 0xad, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb2, 0x3e, 0xbf, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0x72, 0xbf, + 0x80, 0x08, 0xd0, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb2, 0x3e, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x0a, 0x3f, 0xa8, 0x5f, 0xfb, 0x3f, + 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb2, 0xbe, 0x3f, 0x68, 0x06, 0x9c, 0xbf, + 0xa0, 0xb4, 0x72, 0x3f, 0xf6, 0xb1, 0x31, 0xc0, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x08, 0xd0, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x78, 0x07, 0xb6, 0x3f, 0x80, 0x08, 0xd0, 0xbe, 0x58, 0xb0, 0x8a, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x90, 0x5e, 0x61, 0x3f, + 0x58, 0x05, 0x82, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x90, 0x5e, 0x61, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x90, 0x5e, 0x61, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0xa0, 0xb4, 0xf2, 0xbe, 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x90, 0x5e, 0x61, 0xbf, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, + 0x70, 0xb1, 0xa4, 0x3f, 0x80, 0x08, 0x50, 0x3e, 0x70, 0xb1, 0xa4, 0x3f, + 0x80, 0xb2, 0xbe, 0xbf, 0x80, 0xb2, 0x3e, 0x3f, 0xe4, 0xb0, 0x17, 0xc0, + 0x80, 0xb0, 0x0a, 0x3e, 0x58, 0xb0, 0x8a, 0xbf, 0x60, 0x5b, 0x93, 0xbf, + 0xa0, 0xb4, 0x72, 0x3f, 0x70, 0x5c, 0xad, 0xbf, 0x58, 0x05, 0x82, 0xbf, + 0x58, 0x05, 0x82, 0x3f, 0x68, 0x06, 0x9c, 0x3f, 0x80, 0x08, 0x50, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0x08, 0x50, 0xbe, 0x5c, 0xb0, 0x0a, 0x40, + 0xf0, 0x06, 0x29, 0xc0, 0x78, 0x07, 0xb6, 0x3f, 0x60, 0xb0, 0x0a, 0x3f, + 0x80, 0x5c, 0xad, 0x3e, 0x6c, 0xb1, 0x24, 0xc0, 0x40, 0xb0, 0x0a, 0xbe, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x68, 0x06, 0x9c, 0x3f, + 0x80, 0x08, 0x50, 0xbf, 0xf0, 0x06, 0xa9, 0xc0, 0xa0, 0xb4, 0xf2, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x90, 0x08, 0x50, 0x3f, 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0x08, 0x50, 0xbf, 0x80, 0x5c, 0xad, 0x3e, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb2, 0x3e, 0x3f, 0x98, 0x09, 0xea, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xb1, 0xa4, 0xbf, 0x68, 0x06, 0x9c, 0xbf, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb2, 0x3e, 0x3f, 0x98, 0x5e, 0x61, 0x40, 0x70, 0x5c, 0x2d, 0xbf, + 0x60, 0xb0, 0x0a, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x60, 0xb0, 0x8a, 0x3f, + 0xa0, 0xb4, 0xf2, 0xbe, 0x58, 0x05, 0x82, 0x3f, 0xfc, 0x5c, 0x3a, 0x40, + 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0x2d, 0x3f, 0x70, 0x5c, 0x2d, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, 0x70, 0x5c, 0x2d, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0x08, 0xd0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0x70, 0x06, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0x08, 0xd0, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb2, 0x3e, 0x3f, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0xd0, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0xb2, 0x3e, 0xbf, 0xe8, 0x5b, 0x20, 0xc0, + 0x60, 0xb0, 0x0a, 0x3f, 0x84, 0x5d, 0x47, 0xc0, 0x70, 0x5c, 0x2d, 0xbf, + 0x60, 0x5b, 0x93, 0xbf, 0x88, 0x5d, 0xc7, 0x3f, 0x90, 0x5e, 0x61, 0x3f, + 0x70, 0x06, 0x1c, 0x3f, 0x68, 0x06, 0x9c, 0x3f, 0x80, 0xb2, 0x3e, 0x40, + 0x98, 0x5e, 0x61, 0x40, 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0x08, 0x50, 0xbe, + 0x90, 0xb3, 0xd8, 0xbf, 0x80, 0xb2, 0xbe, 0x3f, 0xe8, 0x5b, 0x20, 0xc0, + 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0x08, 0x50, 0xbf, 0x80, 0x08, 0xd0, 0xbe, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x70, 0x5c, 0x2d, 0x3f, 0xa8, 0x5f, 0xfb, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0x68, 0x06, 0x9c, 0xbf, 0x70, 0x5c, 0xad, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x90, 0x5e, 0x61, 0x3f, 0x9c, 0x09, 0x6a, 0x40, 0x80, 0x08, 0x50, 0xbf, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x8a, 0x3f, + 0x60, 0xb0, 0x0a, 0xbf, 0x90, 0x5e, 0x61, 0x3f, 0xf8, 0xb1, 0x31, 0x40, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0x08, 0xd0, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb2, 0x3e, 0xbf, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0xd0, 0x3e, 0x90, 0x5e, 0x61, 0x3f, + 0xa0, 0xb4, 0xf2, 0xbe, 0xa0, 0xb4, 0xf2, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0xbf, 0x60, 0xb0, 0x0a, 0x3f, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x70, 0x06, 0x1c, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0x3e, + 0x70, 0x06, 0x1c, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb2, 0xbe, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, + 0xe4, 0xb0, 0x17, 0x40, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, + 0x98, 0x5e, 0xe1, 0xbf, 0x80, 0x5d, 0xc7, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x90, 0x08, 0x50, 0x3f, 0x60, 0xb0, 0x8a, 0x3f, 0x90, 0x5e, 0x61, 0x3f, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0x84, 0x5d, 0x47, 0x40, 0x40, 0xb0, 0x0a, 0xbe, 0x0c, 0x5e, 0x54, 0x40, + 0x74, 0x5c, 0x2d, 0x40, 0x60, 0x06, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x5c, 0xad, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0x5c, 0x2d, 0x3f, 0xa8, 0x5f, 0xfb, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x5b, 0x93, 0xbf, 0x68, 0x06, 0x9c, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, 0x9c, 0x09, 0x6a, 0x40, + 0x70, 0x5c, 0x2d, 0xbf, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, + 0x68, 0x06, 0x9c, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0xb0, 0x8a, 0x3f, + 0xf8, 0xb1, 0x31, 0x40, 0x40, 0xb0, 0x0a, 0xbe, 0x90, 0x08, 0x50, 0x3f, + 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0x08, 0x50, 0xbf, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0x3e, 0x90, 0x08, 0x50, 0x3f, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, + 0x90, 0x5e, 0x61, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x5c, 0xad, 0x3e, 0x90, 0x5e, 0x61, 0xbf, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x06, 0x1c, 0xbf, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0x08, 0xd0, 0x3e, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0x5c, 0xad, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x5b, 0x93, 0xbf, 0x60, 0x5b, 0x93, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x0a, 0x3f, 0xe8, 0x5b, 0x20, 0xc0, 0xa0, 0xb4, 0xf2, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0x72, 0x3f, 0x64, 0x5b, 0x13, 0x40, + 0x60, 0x06, 0x1c, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0xf2, 0x3e, + 0x90, 0x5e, 0x61, 0xbf, 0xa0, 0xb4, 0xf2, 0x3e, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0xb2, 0xbe, 0x3f, 0x80, 0xb2, 0xbe, 0x3f, 0x60, 0x5b, 0x93, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x06, 0x1c, 0x3f, + 0xa8, 0x5f, 0xfb, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x5b, 0x93, 0xbf, + 0x70, 0xb1, 0xa4, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb2, 0x3e, 0x3f, + 0x98, 0x5e, 0x61, 0x40, 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0xb0, 0x0a, 0xbf, 0x68, 0x06, 0x9c, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, + 0x90, 0x08, 0x50, 0x3f, 0xfc, 0x5c, 0x3a, 0x40, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x5c, 0xad, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0xa0, 0xb4, 0xf2, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0xbf, + 0x80, 0xb2, 0x3e, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0x50, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0x08, 0x50, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0x90, 0x08, 0x50, 0x3f, 0x70, 0x5c, 0x2d, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x0a, 0xbf, 0x90, 0x5e, 0x61, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0x5c, 0x2d, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb2, 0x3e, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x90, 0xb3, 0xd8, 0x3f, 0x68, 0x06, 0x9c, 0x3f, 0x58, 0xb0, 0x8a, 0xbf, + 0x62, 0x5b, 0x93, 0xc0, 0x60, 0x5c, 0xad, 0xbe, 0x70, 0x5c, 0xad, 0x3f, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x70, 0xb1, 0xa4, 0x3f, 0x60, 0x5c, 0xad, 0xbe, 0x29, 0x31, 0x9e, 0xc0, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5b, 0x13, 0xc0, 0x90, 0x08, 0x50, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, + 0x70, 0x5c, 0x2d, 0x3f, 0xa8, 0x5f, 0xfb, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x68, 0x06, 0x9c, 0xbf, 0x68, 0x06, 0x9c, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x90, 0x5e, 0x61, 0x3f, 0x98, 0x5e, 0x61, 0x40, 0x80, 0x08, 0x50, 0xbf, + 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0x5b, 0x93, 0x3f, + 0x80, 0x08, 0xd0, 0xbe, 0xa0, 0xb4, 0x72, 0x3f, 0xfc, 0x5c, 0x3a, 0x40, + 0x40, 0xb0, 0x0a, 0xbe, 0x90, 0x08, 0x50, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0x60, 0xb0, 0x0a, 0x3f, 0x90, 0x5e, 0x61, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0xa0, 0xb4, 0xf2, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0xd0, 0x3e, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0xa0, 0xb4, 0xf2, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0x72, 0xbf, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0x08, 0x50, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0x08, 0x50, 0xbe, + 0x58, 0xb0, 0x8a, 0xbf, 0xa0, 0xb4, 0x72, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, + 0xa0, 0xb4, 0xf2, 0xbe, 0x74, 0x5c, 0x2d, 0x40, 0x90, 0xb3, 0xd8, 0x3f, + 0x60, 0x5b, 0x13, 0xc0, 0x6c, 0xb1, 0x24, 0xc0, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x88, 0x5d, 0xc7, 0x3f, 0x58, 0xb0, 0x8a, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x98, 0x5e, 0xe1, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, + 0xdf, 0x05, 0x0f, 0xc1, 0x60, 0xb0, 0x8a, 0x3e, 0xa6, 0x5f, 0x7b, 0xc0, + 0x90, 0x08, 0x50, 0x3f, 0x90, 0xb3, 0xd8, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0x5c, 0x2d, 0x3f, 0xa8, 0x5f, 0xfb, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0xb1, 0xa4, 0xbf, 0x70, 0x5c, 0xad, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x90, 0x5e, 0x61, 0x3f, 0x98, 0x5e, 0x61, 0x40, + 0x90, 0x5e, 0x61, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, + 0x70, 0xb1, 0xa4, 0x3f, 0x80, 0x08, 0xd0, 0xbe, 0x58, 0x05, 0x82, 0x3f, + 0x74, 0x5c, 0x2d, 0x40, 0x40, 0xb0, 0x0a, 0xbe, 0x90, 0x5e, 0x61, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb2, 0xbe, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb2, 0x3e, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0xb1, 0xa4, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb2, 0x3e, 0xbf, 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x08, 0xd0, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x90, 0x08, 0x50, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0x72, 0x3f, + 0x80, 0x08, 0xd0, 0xbe, 0xec, 0x5b, 0x20, 0x40, 0x80, 0xb2, 0x3e, 0xbf, + 0x58, 0x05, 0x02, 0x40, 0x60, 0x06, 0x1c, 0xbf, 0xa0, 0xb4, 0xf2, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0xb0, 0x0a, 0x40, 0xa0, 0xb4, 0xf2, 0x3f, + 0x70, 0x5c, 0x2d, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x74, 0x5c, 0x2d, 0x40, + 0x80, 0xb2, 0xbe, 0xbf, 0x40, 0xdd, 0xc0, 0xc0, 0x80, 0x08, 0x50, 0x3e, + 0xfc, 0x5c, 0x3a, 0xc0, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x0a, 0x3f, + 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x0a, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0x3f, + 0x90, 0xb3, 0xd8, 0xbf, 0x80, 0x08, 0x50, 0x3e, 0x70, 0x5c, 0xad, 0xbf, + 0x60, 0x5b, 0x93, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb2, 0x3e, 0x3f, + 0x84, 0x5d, 0x47, 0x40, 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x5b, 0x93, 0x3f, 0x70, 0x5c, 0x2d, 0xbf, + 0x68, 0x06, 0x9c, 0x3f, 0xe4, 0xb0, 0x17, 0x40, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x58, 0x05, 0x82, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x8a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0xa0, 0xb4, 0x72, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0xd0, 0x3e, 0x90, 0x5e, 0x61, 0x3f, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0x70, 0x5c, 0xad, 0x3f, 0xd8, 0x5a, 0x06, 0x40, + 0x60, 0x5b, 0x93, 0x3f, 0x90, 0xb3, 0x58, 0x40, 0x80, 0xb2, 0x3e, 0xbf, + 0xa0, 0xb4, 0x72, 0xbf, 0x60, 0x5c, 0xad, 0xbe, 0x90, 0xb3, 0xd8, 0x3f, + 0x60, 0xb0, 0x0a, 0x3f, 0x70, 0x06, 0x1c, 0x3f, 0x60, 0x5c, 0xad, 0xbe, + 0xd8, 0x5a, 0x06, 0x40, 0x60, 0xb0, 0x0a, 0x3f, 0xa1, 0xb4, 0xf2, 0xc0, + 0x70, 0x06, 0x1c, 0x3f, 0x68, 0x06, 0x1c, 0xc0, 0x68, 0x06, 0x1c, 0xc0, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x5c, 0xad, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x58, 0x05, 0x82, 0xbf, 0x90, 0x5e, 0x61, 0xbf, 0xa0, 0xb4, 0xf2, 0x3e, + 0x70, 0x5c, 0x2d, 0x3f, 0xf0, 0x06, 0x29, 0x40, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, + 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0x3f, 0x68, 0x06, 0x1c, 0x40, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb2, 0x3e, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x0a, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x0a, 0x3f, + 0x60, 0x5c, 0xad, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0xb1, 0xa4, 0xbf, + 0xa0, 0xb4, 0xf2, 0x3f, 0x68, 0x06, 0x1c, 0x40, 0x80, 0xb2, 0x3e, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0xd0, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x78, 0x07, 0xb6, 0x3f, 0x60, 0x5b, 0x93, 0xbf, 0x70, 0x5c, 0x2d, 0x3f, + 0x80, 0x08, 0xd0, 0xbe, 0x60, 0x5b, 0x93, 0x3f, 0x60, 0xb0, 0x0a, 0x3f, + 0x5c, 0x34, 0xec, 0xc0, 0x80, 0x08, 0xd0, 0xbe, 0xe0, 0x05, 0x0f, 0xc0, + 0x56, 0x05, 0x82, 0xc0, 0x58, 0x05, 0x82, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x68, 0x06, 0x9c, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0xb1, 0xa4, 0xbf, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0xd0, 0x3e, 0xe0, 0x05, 0x0f, 0x40, + 0x40, 0xb0, 0x0a, 0xbe, 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x06, 0x1c, 0x3f, + 0x70, 0x06, 0x1c, 0x3f, 0x80, 0x08, 0xd0, 0xbe, 0x58, 0x05, 0x82, 0x3f, + 0x64, 0x5b, 0x13, 0x40, 0xa0, 0xb4, 0xf2, 0x3e, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0xd0, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0x3e, 0x54, 0x05, 0x02, 0xc0, 0x60, 0x5b, 0x93, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x90, 0xb3, 0xd8, 0x3f, 0x20, 0x5f, 0x6e, 0x40, + 0x88, 0x5d, 0xc7, 0x3f, 0x78, 0x07, 0xb6, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, 0x90, 0xb3, 0xd8, 0xbf, + 0x60, 0x5c, 0xad, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0x72, 0x3f, + 0xa0, 0xb4, 0x72, 0x3f, 0xc3, 0x32, 0xc5, 0xc0, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb2, 0xbe, 0xbf, 0x6c, 0xb1, 0x24, 0xc0, 0x60, 0x5b, 0x93, 0x3f, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x90, 0x5e, 0x61, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x70, 0xb1, 0xa4, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x70, 0xb1, 0xa4, 0xbf, + 0x60, 0x5c, 0xad, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, + 0x88, 0x5d, 0xc7, 0x3f, 0x60, 0x5c, 0xad, 0xbe, 0xa0, 0xb4, 0x72, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0x08, 0x50, 0x3e, 0xd8, 0x5a, 0x06, 0x40, 0x60, 0xb0, 0x0a, 0x3f, + 0x80, 0x08, 0x50, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0xd0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x5b, 0x93, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x58, 0x05, 0x82, 0xbf, + 0x90, 0x08, 0x50, 0x3f, 0x60, 0x5b, 0x93, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, + 0x58, 0x05, 0x82, 0x3f, 0x58, 0xb0, 0x8a, 0xbf, 0x60, 0x06, 0x1c, 0xbf, + 0x70, 0x5c, 0x2d, 0x3f, 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb2, 0x3e, 0x3f, + 0x58, 0xb0, 0x8a, 0xbf, 0x60, 0x5c, 0xad, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x70, 0xb1, 0xa4, 0xbf, 0x80, 0x5c, 0xad, 0x3e, 0xac, 0x86, 0xa2, 0xc0, + 0x90, 0x5e, 0x61, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, 0x23, 0x86, 0x95, 0xc0, + 0x60, 0xb0, 0x8a, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0x5b, 0x93, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0xb1, 0xa4, 0xbf, 0x80, 0x08, 0xd0, 0x3e, + 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0x3e, + 0x60, 0xb0, 0x0a, 0x3f, 0x70, 0x5c, 0xad, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb2, 0x3e, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0x08, 0xd0, 0x3e, 0x98, 0x5e, 0xe1, 0x3f, + 0x70, 0x06, 0x1c, 0x3f, 0x80, 0xb2, 0x3e, 0xbf, 0x60, 0x5c, 0xad, 0xbe, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x70, 0xb1, 0xa4, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x0a, 0x3f, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x70, 0xb1, 0xa4, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb2, 0x3e, 0xbf, 0xa0, 0xb4, 0xf2, 0x3f, 0x80, 0xb2, 0xbe, 0x3f, + 0x90, 0x08, 0x50, 0x3f, 0x80, 0x08, 0xd0, 0x3e, 0x88, 0x08, 0xd0, 0xbf, + 0xa0, 0xb4, 0x72, 0xbf, 0x5c, 0xb0, 0x0a, 0x40, 0x68, 0x06, 0x9c, 0x3f, + 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0xb2, 0xbe, 0xbf, 0xa0, 0xb4, 0x72, 0x3f, + 0x80, 0x08, 0x50, 0xbe, 0xf0, 0x06, 0x29, 0xc0, 0x80, 0xb0, 0x8a, 0xbd, + 0x5c, 0xb0, 0x0a, 0xc0, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x8a, 0x08, 0x50, 0xc0, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x5c, 0xad, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x58, 0xb0, 0x8a, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb2, 0xbe, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0x58, 0x05, 0x82, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, 0x70, 0xb1, 0xa4, 0x3f, + 0x60, 0xb0, 0x8a, 0xbe, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0x08, 0xd0, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x06, 0x1c, 0x3f, + 0x88, 0x08, 0xd0, 0x3f, 0x80, 0xb2, 0x3e, 0x3f, 0x58, 0x05, 0x82, 0xbf, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0x08, 0xd0, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x88, 0x08, 0xd0, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, 0x90, 0x5e, 0x61, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0x3e, 0x70, 0xb1, 0xa4, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x5c, 0xad, 0x3e, 0x60, 0x5c, 0xad, 0xbe, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0x88, 0x08, 0xd0, 0xbf, + 0x80, 0x08, 0xd0, 0xbe, 0x58, 0x05, 0x82, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x06, 0x1c, 0x3f, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x5c, 0xad, 0x3e, 0x78, 0x07, 0xb6, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0x3e, 0x70, 0x06, 0x1c, 0x3f, + 0x60, 0xb0, 0x8a, 0x3e, 0x90, 0x5e, 0x61, 0x3f, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0x78, 0x07, 0xb6, 0xbf, 0xe0, 0x05, 0x0f, 0xc0, + 0x80, 0xb2, 0x3e, 0x3f, 0x90, 0x08, 0x50, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0x60, 0xb0, 0x0a, 0x3f, 0xa0, 0xb4, 0xf2, 0xbe, 0x78, 0x07, 0x36, 0x40, + 0x80, 0x5c, 0xad, 0x3e, 0xec, 0x5b, 0x20, 0x40, 0x60, 0x5c, 0xad, 0xbe, + 0x78, 0x07, 0xb6, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x8a, 0x08, 0x50, 0xc0, + 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0x72, 0xbf, 0x60, 0xb0, 0x0a, 0xbf, + 0xe0, 0x05, 0x0f, 0xc0, 0x70, 0xb1, 0xa4, 0xbf, 0x78, 0x07, 0xb6, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x78, 0x07, 0xb6, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x90, 0x5e, 0x61, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbe, + 0x90, 0x5e, 0x61, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, 0x70, 0xb1, 0xa4, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0xbf, 0x90, 0x08, 0x50, 0x3f, 0x80, 0xb2, 0x3e, 0xbf, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb2, 0x3e, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x90, 0x5e, 0x61, 0x3f, 0x70, 0x5c, 0x2d, 0xbf, 0xa0, 0xb4, 0x72, 0xbf, + 0x90, 0x5e, 0x61, 0x3f, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0x90, 0x08, 0x50, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0xa0, 0xb4, 0x72, 0x3f, 0x58, 0x05, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0xbf, 0xa0, 0xb4, 0xf2, 0x3e, 0x98, 0x5e, 0xe1, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0x70, 0x5c, 0xad, 0xbf, 0x80, 0x08, 0x50, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, 0x78, 0x07, 0x36, 0x40, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x58, 0x05, 0x82, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0x72, 0x3f, + 0xfc, 0x5c, 0x3a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0xa0, 0xb4, 0x72, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x70, 0x06, 0x1c, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, 0x78, 0x07, 0xb6, 0x3f, + 0x90, 0x08, 0x50, 0x3f, 0x80, 0x08, 0xd0, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x70, 0xb1, 0xa4, 0x3f, 0x90, 0x5e, 0x61, 0xbf, 0xa0, 0xb4, 0x72, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x90, 0x5e, 0x61, 0x3f, 0x90, 0x5e, 0x61, 0x3f, + 0xa1, 0xb4, 0xf2, 0xc0, 0x40, 0xb0, 0x0a, 0xbe, 0x5c, 0xb0, 0x0a, 0xc0, + 0x5c, 0xb0, 0x0a, 0xc0, 0x90, 0x5e, 0x61, 0xbf, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb2, 0xbe, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x74, 0x5c, 0x2d, 0x40, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x0a, 0xbf, 0x68, 0x06, 0x9c, 0x3f, 0x70, 0x06, 0x1c, 0x3f, + 0x70, 0x5c, 0x2d, 0xbf, 0x90, 0x5e, 0x61, 0xbf, 0x78, 0x07, 0xb6, 0x3f, + 0x80, 0x08, 0x50, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x70, 0x5c, 0x2d, 0x3f, 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x08, 0xd0, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x5b, 0x93, 0x3f, + 0x90, 0x5e, 0x61, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0xbe, 0x70, 0x5c, 0xad, 0xbf, 0x60, 0x5c, 0xad, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x5c, 0xad, 0xbe, + 0x70, 0x5c, 0xad, 0xbf, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x5c, 0xad, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0x08, 0x50, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, + 0xa8, 0x5f, 0xfb, 0xbf, 0x58, 0x05, 0x82, 0xbf, 0x98, 0x09, 0xea, 0xbf, + 0x70, 0x5c, 0x2d, 0xbf, 0x60, 0xb0, 0x8a, 0x3f, 0xa0, 0xb4, 0xf2, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x8a, 0x08, 0x50, 0xc0, 0xfc, 0x5c, 0x3a, 0x40, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb2, 0x3e, 0x40, 0x58, 0x05, 0x82, 0x3f, + 0x80, 0x08, 0x50, 0xbf, 0x80, 0x08, 0x50, 0xbf, 0xa0, 0xb4, 0x72, 0xbf, + 0x68, 0x06, 0x1c, 0x40, 0xe4, 0xb0, 0x97, 0xc0, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0xf8, 0xb1, 0x31, 0x40, 0x80, 0x08, 0xd0, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0xb0, 0x8a, 0x3f, 0x60, 0xb0, 0x0a, 0x3f, + 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0x08, 0x50, 0xbf, 0x78, 0x07, 0xb6, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x90, 0x08, 0x50, 0x3f, 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0x58, 0x05, 0x82, 0xbf, + 0x60, 0x06, 0x1c, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x60, 0x5c, 0xad, 0xbe, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0xd0, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x58, 0xb0, 0x8a, 0xbf, 0x60, 0xb0, 0x0a, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5b, 0x13, 0xc0, 0x70, 0x5c, 0xad, 0xbf, + 0x88, 0x08, 0xd0, 0x3f, 0x60, 0xb0, 0x8a, 0x3f, 0xa0, 0x09, 0xea, 0x3f, + 0xd0, 0x88, 0xd6, 0x40, 0x70, 0x06, 0x1c, 0x3f, 0xa0, 0xb4, 0xf2, 0x3e, + 0x58, 0x05, 0x82, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x98, 0x5e, 0xe1, 0xbf, + 0x80, 0x5c, 0xad, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x58, 0x05, 0x82, 0x3f, + 0x90, 0x5e, 0x61, 0x3f, 0x6c, 0xb1, 0x24, 0x40, 0x70, 0x5c, 0x2d, 0xbf, + 0x88, 0x08, 0xd0, 0xbf, 0x88, 0x5d, 0xc7, 0x3f, 0x78, 0x07, 0x36, 0xc0, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x70, 0x5c, 0x2d, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0xbe, 0xf8, 0xb1, 0x31, 0x40, 0x80, 0x08, 0xd0, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0x5b, 0x93, 0x3f, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x08, 0x50, 0xbf, 0xa0, 0xb4, 0x72, 0xbf, + 0x78, 0x07, 0xb6, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x5c, 0xad, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb2, 0x3e, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, 0x70, 0x06, 0x1c, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x06, 0x1c, 0xbf, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb2, 0x3e, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0x5c, 0xad, 0xbe, 0xa0, 0xb4, 0xf2, 0x3e, 0x68, 0x06, 0x1c, 0xc0, + 0x90, 0x5e, 0x61, 0xbf, 0x70, 0x5c, 0x2d, 0xbf, 0x70, 0x5c, 0x2d, 0x3f, + 0xa8, 0x5f, 0xfb, 0x3f, 0x9a, 0x85, 0x88, 0x40, 0xd8, 0x5a, 0x06, 0xc0, + 0x90, 0xb3, 0xd8, 0x3f, 0x70, 0x5c, 0xad, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, + 0x60, 0x5b, 0x93, 0x3f, 0x80, 0x5c, 0xad, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x90, 0x5e, 0x61, 0x3f, + 0x70, 0x5c, 0x2d, 0xbf, 0x88, 0x08, 0xd0, 0xbf, 0x80, 0x08, 0x50, 0xbe, + 0x88, 0x08, 0xd0, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x5c, 0xad, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x78, 0x07, 0x36, 0x40, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0x06, 0x1c, 0xbf, + 0x60, 0xb0, 0x8a, 0x3f, 0x70, 0x06, 0x1c, 0x3f, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0x08, 0x50, 0xbf, 0x70, 0xb1, 0xa4, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0x5c, 0xad, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, + 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0x08, 0x50, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0x58, 0x05, 0x82, 0xbf, 0x60, 0x06, 0x1c, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0x06, 0x1c, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0xd0, 0xbe, + 0x60, 0x5b, 0x93, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x0a, 0xbf, 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x5c, 0xad, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0x3f, + 0x90, 0x5e, 0x61, 0xbf, 0x70, 0x5c, 0xad, 0x3f, 0x60, 0x06, 0x1c, 0xbf, + 0x58, 0x05, 0x82, 0x3f, 0xa8, 0x5f, 0xfb, 0x3f, 0xa0, 0x09, 0xea, 0x3f, + 0x60, 0x5c, 0xad, 0xbe, 0x90, 0x08, 0x50, 0x3f, 0x58, 0x05, 0x82, 0x3f, + 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0x08, 0xd0, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x88, 0x08, 0xd0, 0x3f, 0x80, 0x08, 0x50, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb2, 0x3e, 0xbf, 0x88, 0x08, 0xd0, 0xbf, + 0x60, 0x06, 0x1c, 0xbf, 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x06, 0x1c, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, + 0x78, 0x07, 0x36, 0x40, 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0x06, 0x1c, 0xbf, 0x68, 0x06, 0x9c, 0x3f, 0xa0, 0xb4, 0xf2, 0x3e, + 0x80, 0x08, 0x50, 0xbf, 0x90, 0x5e, 0x61, 0xbf, 0x78, 0x07, 0xb6, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb2, 0x3e, 0x3f, 0x60, 0x06, 0x1c, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, 0x60, 0x5b, 0x93, 0xbf, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, + 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0x5c, 0xad, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb2, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0xf2, 0xbe, 0x70, 0xb1, 0xa4, 0xbf, 0x70, 0x5c, 0x2d, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x70, 0x5c, 0x2d, 0xbf, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x70, 0x5c, 0x2d, 0x3f, 0x70, 0x5c, 0xad, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb2, 0xbe, 0x3f, 0xa0, 0x09, 0xea, 0x3f, + 0x78, 0x07, 0xb6, 0xbf, 0x70, 0x5c, 0xad, 0xbf, 0x58, 0x05, 0x82, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbe, 0x78, 0x07, 0xb6, 0x3f, + 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x78, 0x07, 0x36, 0x40, + 0x58, 0x05, 0x82, 0x3f, 0x80, 0xb2, 0x3e, 0x3f, 0x70, 0x5c, 0x2d, 0xbf, + 0x80, 0x5d, 0xc7, 0xbf, 0x90, 0x08, 0x50, 0x3f, 0x70, 0x5c, 0xad, 0x3f, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb2, 0x3e, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x74, 0x5c, 0x2d, 0x40, 0x80, 0x08, 0xd0, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x68, 0x06, 0x9c, 0x3f, + 0x60, 0xb0, 0x0a, 0x3f, 0x70, 0x5c, 0x2d, 0xbf, 0x90, 0x5e, 0x61, 0xbf, + 0x80, 0xb2, 0xbe, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x5c, 0xad, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x90, 0x5e, 0x61, 0x3f, 0x60, 0x06, 0x1c, 0xbf, + 0xa0, 0xb4, 0xf2, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb2, 0x3e, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x78, 0x07, 0xb6, 0xbf, 0xa0, 0xb4, 0x72, 0x3f, + 0x80, 0xb0, 0x0a, 0x3e, 0xc8, 0xdd, 0xcd, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x05, 0x82, 0x3f, 0x90, 0x5e, 0x61, 0x3f, 0xa0, 0xb4, 0xf2, 0xbe, + 0x70, 0xb1, 0xa4, 0xbf, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x07, 0xb6, 0x3f, 0x90, 0x08, 0x50, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, 0x88, 0x08, 0xd0, 0x3f, + 0x70, 0x5c, 0xad, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x5b, 0x20, 0x40, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3f, 0x70, 0x06, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x8a, 0x3f, 0x90, 0x5e, 0x61, 0x3f, + 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb2, 0x3e, 0xbf, 0x60, 0xb0, 0x0a, 0x3f, 0x70, 0x06, 0x1c, 0x3f, + 0x60, 0x06, 0x1c, 0xbf, 0x70, 0x5c, 0x2d, 0xbf, 0x60, 0x5c, 0xad, 0xbe, + 0x60, 0x5c, 0xad, 0xbe, 0x60, 0x5b, 0x93, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb2, 0x3e, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0xd0, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x68, 0x06, 0x9c, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0x5b, 0x93, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, 0xe4, 0xb0, 0x17, 0xc0, + 0x80, 0xb2, 0xbe, 0x3f, 0xa0, 0xb4, 0xf2, 0x3f, 0x54, 0x05, 0x02, 0xc0, + 0x60, 0x06, 0x1c, 0xbf, 0x9a, 0x09, 0x6a, 0xc0, 0x70, 0x5c, 0x2d, 0xbf, + 0x60, 0x5c, 0xad, 0xbe, 0x90, 0x5e, 0x61, 0xbf, 0x68, 0x06, 0x9c, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0x3f, 0x90, 0x5e, 0x61, 0xbf, + 0xd8, 0x5a, 0x06, 0x40, 0x80, 0xb0, 0x0a, 0x3e, 0x88, 0x08, 0xd0, 0x3f, + 0x70, 0xb1, 0xa4, 0x3f, 0xa0, 0xb4, 0xf2, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x5c, 0xb0, 0x0a, 0x40, 0x80, 0xb2, 0x3e, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x90, 0x08, 0x50, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x70, 0xb1, 0xa4, 0x3f, + 0x70, 0xb1, 0xa4, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, + 0x60, 0x06, 0x1c, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0xd0, 0x3e, + 0x60, 0xb0, 0x8a, 0x3f, 0x80, 0x08, 0xd0, 0xbe, 0x60, 0x06, 0x1c, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0xa0, 0xb4, 0x72, 0xbf, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb2, 0x3e, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x58, 0xb0, 0x8a, 0xbf, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0xd0, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0x70, 0xb1, 0xa4, 0xbf, 0x80, 0x08, 0x50, 0x3e, 0x70, 0x06, 0x1c, 0x3f, + 0xa0, 0x30, 0x11, 0xc1, 0x60, 0xb0, 0x8a, 0x3e, 0x1e, 0x5f, 0x6e, 0xc0, + 0x80, 0x08, 0x50, 0xbf, 0x60, 0x5c, 0xad, 0xbe, 0xa8, 0x5f, 0xfb, 0xbf, + 0x80, 0x08, 0xd0, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0xe8, 0x5b, 0x20, 0xc0, + 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0x08, 0xd0, 0xbe, + 0xec, 0x5b, 0x20, 0x40, 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0xe4, 0xb0, 0x17, 0x40, 0x70, 0x5c, 0xad, 0xbf, + 0x70, 0x06, 0x1c, 0x3f, 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x0a, 0x3f, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x70, 0xb1, 0xa4, 0x3f, 0x90, 0x08, 0x50, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x88, 0x5d, 0xc7, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x0a, 0xbf, + 0x58, 0xb0, 0x8a, 0xbf, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0x5b, 0x93, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0xbf, 0x58, 0xb0, 0x8a, 0xbf, + 0x80, 0x08, 0xd0, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x60, 0x5b, 0x13, 0xc0, 0x70, 0x06, 0x1c, 0x3f, + 0x90, 0x08, 0x50, 0x3f, 0xf6, 0xef, 0x00, 0xc1, 0x70, 0xb1, 0xa4, 0xbf, + 0x94, 0x5e, 0x61, 0xc0, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0x50, 0xbe, + 0x72, 0x5c, 0x2d, 0xc0, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0x08, 0x50, 0xbe, + 0x72, 0x5c, 0x2d, 0xc0, 0x60, 0x5c, 0xad, 0xbe, 0x68, 0x06, 0x9c, 0x3f, + 0x80, 0x08, 0xd0, 0xbe, 0x88, 0x5d, 0xc7, 0x3f, 0x68, 0x06, 0x1c, 0x40, + 0x78, 0x07, 0xb6, 0x3f, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, 0x68, 0x06, 0x1c, 0x40, + 0x90, 0xb3, 0xd8, 0xbf, 0x70, 0x06, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x5c, 0x2d, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb2, 0xbe, 0x3f, 0xa0, 0xb4, 0x72, 0x3f, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x5c, 0xad, 0x3e, 0x70, 0x5c, 0xad, 0x3f, + 0x60, 0x5c, 0xad, 0xbe, 0x90, 0x5e, 0x61, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x70, 0x5c, 0x2d, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x5c, 0xad, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x58, 0x05, 0x82, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x0a, 0x3f, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x58, 0x05, 0x82, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x78, 0x07, 0xb6, 0xbf, + 0x80, 0x5c, 0xad, 0x3e, 0xe0, 0x05, 0x0f, 0xc0, 0xb1, 0x31, 0xab, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0xf6, 0xb1, 0x31, 0xc0, 0xa0, 0xb4, 0xf2, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbf, 0x60, 0x5c, 0xad, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0xfb, 0x5c, 0xba, 0xc0, 0x70, 0x5c, 0xad, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x5d, 0xc7, 0xbf, + 0xe0, 0x05, 0x0f, 0x40, 0x80, 0xb2, 0xbe, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0xa0, 0x09, 0xea, 0x3f, 0x68, 0x06, 0x9c, 0xbf, 0x80, 0x5c, 0xad, 0x3e, + 0x60, 0xb0, 0x0a, 0xbf, 0x70, 0xb1, 0xa4, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x5b, 0x93, 0x3f, + 0x90, 0x5e, 0x61, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb2, 0x3e, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x60, 0xb0, 0x8a, 0x3f, 0x90, 0x5e, 0x61, 0xbf, 0x58, 0xb0, 0x8a, 0xbf, + 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x58, 0xb0, 0x8a, 0xbf, 0x80, 0x08, 0xd0, 0x3e, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0x08, 0x50, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb2, 0x3e, 0x3f, + 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x06, 0x1c, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, + 0x60, 0x5c, 0xad, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x58, 0x05, 0x82, 0xbf, + 0x70, 0x06, 0x1c, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0x08, 0x50, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0xd0, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0xd0, 0x3e, 0x58, 0x05, 0x82, 0x3f, + 0x58, 0xb0, 0x8a, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, 0xe0, 0x05, 0x0f, 0xc0, + 0xa0, 0xb4, 0x72, 0xbf, 0x60, 0x06, 0x1c, 0xbf, 0x5c, 0xb0, 0x0a, 0xc0, + 0x80, 0x08, 0x50, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x5b, 0x93, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x94, 0x5e, 0x61, 0xc0, + 0x70, 0x5c, 0x2d, 0xbf, 0x60, 0x5b, 0x13, 0xc0, 0x80, 0xb0, 0x8a, 0xbd, + 0x78, 0x07, 0xb6, 0xbf, 0x88, 0x5d, 0xc7, 0x3f, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0x72, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x5c, 0x2d, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x90, 0xb3, 0xd8, 0x3f, 0x78, 0x07, 0xb6, 0xbf, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0x08, 0xd0, 0xbe, 0x60, 0xb0, 0x8a, 0x3f, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0x5b, 0x93, 0x3f, 0x70, 0x06, 0x1c, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0xf2, 0x3e, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, 0xa0, 0xb4, 0xf2, 0xbe, + 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0xd8, 0x5a, 0x06, 0xc0, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x90, 0x5e, 0x61, 0xbf, 0x80, 0x08, 0x50, 0x3e, 0x70, 0x5c, 0xad, 0x3f, + 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0xb0, 0x8a, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x68, 0x06, 0x9c, 0x3f, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x54, 0x05, 0x02, 0xc0, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x90, 0x5e, 0x61, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x78, 0x07, 0xb6, 0x3f, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0xb1, 0xa4, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x70, 0x5c, 0xad, 0x3f, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0xa0, 0xb4, 0x72, 0xbf, + 0x58, 0x05, 0x82, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x0a, 0x3f, + 0x90, 0xb3, 0xd8, 0xbf, 0x58, 0x05, 0x02, 0x40, 0x60, 0x06, 0x1c, 0xbf, + 0xe4, 0xb0, 0x17, 0xc0, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x90, 0xb3, 0x58, 0xc0, 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x29, 0x31, 0x9e, 0xc0, 0x80, 0xb0, 0x8a, 0xbd, 0x8a, 0x08, 0x50, 0xc0, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb2, 0xbe, 0xbf, 0xa0, 0x09, 0xea, 0x3f, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x90, 0x5e, 0x61, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0xb0, 0x0a, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x58, 0x05, 0x02, 0x40, + 0x80, 0x5d, 0xc7, 0xbf, 0x80, 0x5c, 0xad, 0x3e, 0x90, 0x5e, 0x61, 0x3f, + 0x90, 0x08, 0x50, 0x3f, 0xa0, 0xb4, 0xf2, 0x3e, 0x90, 0x5e, 0x61, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x68, 0x06, 0x9c, 0x3f, 0x70, 0x5c, 0x2d, 0x3f, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0x5c, 0xad, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb2, 0x3e, 0x40, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x58, 0x05, 0x82, 0x3f, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb2, 0x3e, 0xbf, + 0x88, 0x5d, 0xc7, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0x70, 0x5c, 0x2d, 0xbf, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x08, 0xd0, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x5c, 0xad, 0x3e, 0x98, 0x09, 0xea, 0xbf, + 0xe4, 0xb0, 0x17, 0xc0, 0x90, 0x08, 0x50, 0x3f, 0x78, 0x07, 0xb6, 0xbf, + 0x80, 0x5c, 0xad, 0x3e, 0x60, 0x06, 0x1c, 0xbf, 0x60, 0x5b, 0x13, 0xc0, + 0x60, 0x5b, 0x93, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0xad, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x90, 0x5e, 0x61, 0x3f, 0x90, 0x08, 0x50, 0x3f, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x70, 0x06, 0x1c, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x0a, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x0a, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x64, 0x5b, 0x13, 0x40, 0xa0, 0xb4, 0xf2, 0x3e, + 0xa0, 0xb4, 0x72, 0x3f, 0x60, 0x5c, 0xad, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x70, 0x5c, 0x2d, 0x3f, 0xa0, 0xb4, 0xf2, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0x5c, 0xad, 0x3e, 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0x08, 0x50, 0x3e, + 0x70, 0x06, 0x1c, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x90, 0xb3, 0xd8, 0xbf, + 0xa0, 0xb4, 0xf2, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0xd0, 0x3e, 0x90, 0x5e, 0x61, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, 0x90, 0x5e, 0x61, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbe, 0x90, 0xb3, 0xd8, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5c, 0xad, 0x3e, + 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, + 0x90, 0x5e, 0x61, 0xbf, 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0xa0, 0xb4, 0x72, 0xbf, 0x60, 0xb0, 0x8a, 0x3f, 0x60, 0xb0, 0x0a, 0x3f, + 0x84, 0x5d, 0x47, 0xc0, 0x6c, 0xb1, 0x24, 0xc0, 0xa8, 0x5f, 0xfb, 0xbf, + 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0x5d, 0xc7, 0xbf, + 0x60, 0x06, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x17, 0x30, 0x84, 0xc0, + 0x60, 0x5b, 0x93, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb2, 0x3e, 0xbf, + 0xa0, 0xb4, 0xf2, 0xbe, 0x88, 0x08, 0xd0, 0xbf, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0xd0, 0x3e, 0x70, 0xb1, 0xa4, 0x3f, 0x80, 0x5c, 0xad, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x64, 0x5b, 0x13, 0x40, 0x60, 0xb0, 0x8a, 0x3e, + 0x58, 0x05, 0x82, 0x3f, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0x5c, 0x2d, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0xa0, 0xb4, 0xf2, 0x3e, 0x60, 0x5b, 0x93, 0x3f, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x0a, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x1c, 0xbf, + 0x70, 0xb1, 0xa4, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb2, 0x3e, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x70, 0x5c, 0x2d, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0x5b, 0x93, 0xbf, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x08, 0x50, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x08, 0x50, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0x5d, 0xc7, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0xfc, 0x5c, 0x3a, 0xc0, 0x90, 0x5e, 0x61, 0xbf, + 0x68, 0x06, 0x9c, 0x3f, 0xea, 0x5b, 0xa0, 0x40, 0x80, 0x5d, 0xc7, 0xbf, + 0x58, 0x05, 0x82, 0xbf, 0x60, 0x06, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x5c, 0xb0, 0x0a, 0x40, 0x60, 0x5b, 0x93, 0x3f, 0x78, 0x07, 0xb6, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x5c, 0x2d, 0x40, 0x64, 0x5b, 0x13, 0x40, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0xe4, 0xb0, 0x17, 0x40, + 0x60, 0xb0, 0x8a, 0x3e, 0x90, 0x5e, 0x61, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x06, 0x1c, 0x3f, 0x80, 0x08, 0xd0, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0xd0, 0x3e, 0x58, 0x05, 0x82, 0x3f, + 0x80, 0x5c, 0xad, 0x3e, 0x70, 0x06, 0x1c, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0xd0, 0xbe, 0x68, 0x06, 0x9c, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x70, 0x5c, 0x2d, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x0a, 0x3f, 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0x06, 0x1c, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, + 0x60, 0x5c, 0xad, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x70, 0xb1, 0xa4, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0x2d, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0x3e, + 0x80, 0x08, 0x50, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb2, 0x3e, 0xbf, + 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, + 0xa0, 0xb4, 0xf2, 0xbf, 0xa0, 0xb4, 0x72, 0xbf, 0x98, 0x09, 0xea, 0xbf, + 0x58, 0x05, 0x82, 0x3f, 0x78, 0x07, 0xb6, 0x3f, 0x9c, 0x09, 0x6a, 0x40, + 0x70, 0x5c, 0xad, 0xbf, 0x60, 0x5b, 0x93, 0xbf, 0x80, 0xb2, 0x3e, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x0a, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x90, 0x5e, 0x61, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x90, 0x5e, 0x61, 0x3f, 0x58, 0x05, 0x82, 0x3f, + 0x98, 0x5e, 0xe1, 0x3f, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0x5c, 0xad, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x64, 0x5b, 0x13, 0x40, 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0x72, 0x3f, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0x06, 0x1c, 0x3f, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0x3f, + 0x80, 0x08, 0xd0, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x58, 0x05, 0x82, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, 0x70, 0xb1, 0xa4, 0xbf, + 0x80, 0x08, 0xd0, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb2, 0x3e, 0x3f, 0x90, 0x5e, 0x61, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x60, 0x06, 0x1c, 0xbf, 0x60, 0x5b, 0x93, 0xbf, 0x80, 0x08, 0xd0, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb2, 0x3e, 0xbf, 0x60, 0x5c, 0xad, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x90, 0x5e, 0x61, 0x3f, 0x90, 0x5e, 0x61, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x5c, 0xad, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x90, 0xb3, 0x58, 0xc0, 0x68, 0x06, 0x9c, 0xbf, + 0x68, 0x06, 0x9c, 0xbf, 0x70, 0x5c, 0xad, 0x3f, 0xe4, 0xb0, 0x17, 0x40, + 0x18, 0xb4, 0x65, 0x40, 0x60, 0x5b, 0x93, 0xbf, 0xe0, 0x05, 0x0f, 0xc0, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3f, + 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3f, + 0x90, 0x08, 0x50, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, 0x70, 0x5c, 0x2d, 0x3f, + 0x80, 0xb2, 0x3e, 0x3f, 0x5c, 0xb0, 0x0a, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0xe4, 0xb0, 0x17, 0x40, 0x80, 0x08, 0xd0, 0x3e, + 0x58, 0x05, 0x82, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x68, 0x06, 0x9c, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0xb0, 0x0a, 0x3f, 0x60, 0x5b, 0x93, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, + 0xa0, 0xb4, 0xf2, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0xb2, 0xbe, 0xbf, 0x70, 0x06, 0x1c, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0x2d, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb2, 0x3e, 0x3f, + 0x90, 0x5e, 0x61, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0xd0, 0xbe, 0x90, 0xb3, 0xd8, 0xbf, + 0x80, 0x08, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x90, 0x08, 0x50, 0x3f, 0x90, 0x5e, 0x61, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x5b, 0x13, 0xc0, + 0x70, 0xb1, 0xa4, 0xbf, 0x00, 0x08, 0x43, 0xc0, 0x58, 0x05, 0x82, 0x3f, + 0xfc, 0x5c, 0x3a, 0x40, 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x54, 0x05, 0x02, 0xc0, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0xd8, 0x5a, 0x06, 0x40, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x5b, 0x93, 0x3f, 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x0a, 0x3f, + 0xa0, 0xb4, 0x72, 0x3f, 0x60, 0xb0, 0x8a, 0x3f, 0x78, 0x07, 0xb6, 0x3f, + 0x70, 0x06, 0x1c, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0xe0, 0x05, 0x0f, 0x40, + 0x80, 0x5c, 0xad, 0x3e, 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x0a, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, 0x70, 0x5c, 0x2d, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x5b, 0x93, 0x3f, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x60, 0x5b, 0x93, 0x3f, + 0x80, 0x5c, 0xad, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x68, 0x06, 0x9c, 0xbf, 0x60, 0xb0, 0x0a, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0xd0, 0x3e, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x0a, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0x5b, 0x93, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0x3e, + 0x90, 0x5e, 0x61, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x06, 0x1c, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0x3e, 0xe4, 0xb0, 0x17, 0xc0, + 0x58, 0x05, 0x82, 0x3f, 0x78, 0x07, 0xb6, 0x3f, 0xa6, 0x5f, 0xfb, 0xc0, + 0x40, 0xb0, 0x0a, 0xbe, 0x5c, 0xb0, 0x0a, 0xc0, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x78, 0x07, 0xb6, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x58, 0xb0, 0x8a, 0xbf, + 0x68, 0x06, 0x9c, 0x3f, 0x90, 0x08, 0x50, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0x08, 0x50, 0xbf, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0xe4, 0xb0, 0x17, 0x40, 0x60, 0x06, 0x1c, 0xbf, 0x90, 0x08, 0x50, 0x3f, + 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0xf2, 0x3e, 0x70, 0x06, 0x1c, 0x3f, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x0a, 0xbf, + 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, 0x90, 0x5e, 0x61, 0x3f, + 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x5c, 0xad, 0x3e, + 0x70, 0xb1, 0xa4, 0x3f, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, 0x58, 0x05, 0x82, 0xbf, + 0x90, 0x5e, 0x61, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb2, 0x3e, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb2, 0x3e, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0x70, 0x5c, 0x2d, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x58, 0x05, 0x82, 0xbf, 0x90, 0x5e, 0x61, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0xa0, 0xb4, 0xf2, 0x3e, 0x70, 0x5c, 0x2d, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0x90, 0x08, 0x50, 0x3f, 0xa0, 0x09, 0xea, 0x3f, + 0x70, 0x5c, 0x2d, 0xbf, 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, + 0xf0, 0x06, 0x29, 0xc1, 0x70, 0x5c, 0x2d, 0x3f, 0xa8, 0x5f, 0xfb, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0x72, 0x3f, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x5c, 0x2d, 0xbf, + 0xa0, 0xb4, 0xf2, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0xfc, 0x5c, 0x3a, 0xc0, 0xa0, 0xb4, 0xf2, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x0a, 0x3f, 0xe4, 0xb0, 0x17, 0x40, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x06, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x90, 0xb3, 0xd8, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x70, 0x5c, 0x2d, 0xbf, 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x70, 0x06, 0x1c, 0x3f, 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb2, 0x3e, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb2, 0x3e, 0xbf, + 0x58, 0x05, 0x82, 0x3f, 0x80, 0xb2, 0xbe, 0x3f, 0xa0, 0xb4, 0x72, 0x3f, + 0x80, 0x08, 0xd0, 0x3e, 0x62, 0x5b, 0x13, 0xc1, 0x70, 0x5c, 0x2d, 0xbf, + 0xe4, 0xb0, 0x17, 0xc0, 0x60, 0xb0, 0x8a, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x5c, 0xad, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x68, 0x06, 0x9c, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb2, 0x3e, 0x3f, 0x58, 0x05, 0x82, 0xbf, + 0xa8, 0x5f, 0xfb, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x60, 0x5c, 0xad, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, + 0x60, 0x06, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x5c, 0xad, 0x3e, 0xec, 0x5b, 0x20, 0x40, + 0x40, 0xb0, 0x0a, 0xbe, 0x78, 0x07, 0xb6, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0xd0, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, + 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x08, 0x50, 0x3e, + 0x68, 0x06, 0x9c, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x88, 0x08, 0xd0, 0x3f, + 0x80, 0x08, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0x70, 0x5c, 0x2d, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0x5c, 0x2d, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb2, 0x3e, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x5c, 0xad, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x5c, 0x2d, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0x5c, 0xad, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0xfc, 0x5c, 0x3a, 0xc0, 0x56, 0x89, 0xe3, 0xc0, + 0x70, 0x5c, 0x2d, 0x3f, 0xd8, 0x5a, 0x06, 0xc0, 0x88, 0x5d, 0xc7, 0x3f, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb2, 0x3e, 0xbf, 0x70, 0xb1, 0xa4, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb2, 0xbe, 0x3f, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x5d, 0xc7, 0xbf, + 0x18, 0xb4, 0x65, 0xc0, 0x88, 0x08, 0xd0, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb2, 0x3e, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5b, 0x93, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x58, 0x05, 0x02, 0x40, 0x40, 0xb0, 0x0a, 0xbe, 0x58, 0x05, 0x02, 0x40, + 0x60, 0xb0, 0x8a, 0x3e, 0x58, 0x05, 0x82, 0xbf, 0x80, 0x08, 0xd0, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x90, 0x5e, 0x61, 0x3f, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x78, 0x07, 0xb6, 0x3f, 0xa0, 0xb4, 0x72, 0x3f, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0x08, 0x50, 0xbf, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x5c, 0x2d, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0x58, 0x05, 0x82, 0xbf, + 0x80, 0xb2, 0xbe, 0x3f, 0x60, 0xb0, 0x0a, 0x3f, 0xe0, 0x05, 0x0f, 0xc0, + 0xdf, 0x05, 0x0f, 0xc1, 0x70, 0x5c, 0x2d, 0x3f, 0x98, 0x5e, 0xe1, 0xbf, + 0xa0, 0xb4, 0xf2, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x5b, 0x20, 0xc0, + 0x70, 0xb1, 0xa4, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x88, 0x5d, 0xc7, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, + 0x88, 0x08, 0xd0, 0xbf, 0x1d, 0xdb, 0x8c, 0xc0, 0x78, 0x07, 0x36, 0x40, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb2, 0x3e, 0xbf, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0x72, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x64, 0x5b, 0x13, 0x40, 0xa0, 0xb4, 0xf2, 0xbe, + 0x58, 0x05, 0x02, 0x40, 0x60, 0x5c, 0xad, 0xbe, 0x60, 0x06, 0x1c, 0xbf, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x70, 0x5c, 0x2d, 0x3f, 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x90, 0x5e, 0x61, 0x3f, 0x90, 0x08, 0x50, 0x3f, + 0x70, 0x5c, 0x2d, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x5c, 0xad, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0xd0, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x90, 0x5e, 0x61, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0xa0, 0xb4, 0xf2, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x06, 0x1c, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5b, 0x93, 0x3f, + 0x60, 0xb0, 0x8a, 0x3f, 0x68, 0x06, 0x1c, 0x40, 0x80, 0xb0, 0x0a, 0x3e, + 0xfc, 0x5c, 0x3a, 0xc0, 0xd4, 0x33, 0xdf, 0xc0, 0x40, 0xb0, 0x0a, 0xbe, + 0x90, 0xb3, 0xd8, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x5d, 0xc7, 0xbf, 0xe4, 0xb0, 0x17, 0x40, 0x80, 0xb0, 0x8a, 0x3d, + 0x78, 0x07, 0xb6, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0xa0, 0xb4, 0xf2, 0xbf, 0x6c, 0xb1, 0x24, 0xc0, + 0xe4, 0xb0, 0x17, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x1c, 0xbf, + 0xa0, 0xb4, 0xf2, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x68, 0x06, 0x9c, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0xa0, 0x09, 0xea, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0xa0, 0x09, 0xea, 0x3f, 0x58, 0xb0, 0x8a, 0xbf, + 0x80, 0x08, 0xd0, 0xbe, 0xa0, 0xb4, 0xf2, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x90, 0x5e, 0x61, 0x3f, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x90, 0x08, 0x50, 0x3f, 0x80, 0xb2, 0x3e, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x5c, 0xad, 0x3e, 0x60, 0x06, 0x1c, 0xbf, + 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0x72, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x0a, 0x3f, 0x60, 0x06, 0x1c, 0xbf, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x08, 0x50, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0x3e, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0xa0, 0xb4, 0xf2, 0x3e, 0x90, 0x5e, 0x61, 0x3f, 0x98, 0x5e, 0xe1, 0x3f, + 0x80, 0x08, 0xd0, 0xbe, 0xa0, 0xb4, 0xf2, 0xbf, 0xf6, 0xb1, 0x31, 0xc0, + 0x60, 0x5c, 0xad, 0xbe, 0x98, 0x5e, 0xe1, 0xbf, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0xe0, 0x05, 0x0f, 0xc0, 0x98, 0x5e, 0xe1, 0x3f, + 0x80, 0xb0, 0x0a, 0x3e, 0x0c, 0x5e, 0x54, 0xc0, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x94, 0x5e, 0x61, 0xc0, + 0x5c, 0xb0, 0x8a, 0xc0, 0xf8, 0xb1, 0x31, 0x40, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x5b, 0x93, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x68, 0x06, 0x9c, 0x3f, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb2, 0x3e, 0x3f, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0xd0, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, + 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0xe4, 0xb0, 0x17, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x68, 0x06, 0x9c, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0x72, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x90, 0x5e, 0x61, 0x3f, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x5c, 0xad, 0x3e, 0x68, 0x06, 0x9c, 0x3f, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0x08, 0xd0, 0x3e, 0x70, 0x06, 0x1c, 0x3f, 0x58, 0x05, 0x82, 0x3f, + 0x80, 0xb2, 0x3e, 0xbf, 0x60, 0x5b, 0x13, 0xc0, 0x90, 0x08, 0x50, 0x3f, + 0x60, 0x5b, 0x13, 0xc0, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x0a, 0x3f, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0xb2, 0xbe, 0xbf, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, + 0x80, 0x08, 0x50, 0xbf, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb2, 0x3e, 0xbf, + 0x80, 0x08, 0xd0, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x5c, 0xad, 0x3e, + 0x60, 0xb0, 0x0a, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0x90, 0x5e, 0x61, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x5c, 0x2d, 0xbf, + 0x90, 0xb3, 0xd8, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x0a, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x5c, 0x2d, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x70, 0x5c, 0x2d, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5c, 0xad, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x0a, 0x3f, + 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb2, 0x3e, 0x3f, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0x08, 0xd0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x58, 0x05, 0x82, 0x3f, + 0x60, 0xb0, 0x0a, 0x3f, 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb2, 0x3e, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0x72, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0x09, 0xea, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xf6, 0xb1, 0x31, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0x2d, 0xbf, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb2, 0xbe, 0xbf, 0xf0, 0x06, 0x29, 0xc0, + 0x5c, 0xb0, 0x0a, 0xc0, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0x5c, 0xad, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb2, 0x3e, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x0a, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0x2d, 0xbf, + 0x90, 0xb3, 0xd8, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x0a, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x06, 0x1c, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0x72, 0x3f, + 0x80, 0x5c, 0xad, 0x3e, 0x70, 0xb1, 0xa4, 0x3f, 0x18, 0x30, 0x84, 0x40, + 0x80, 0x08, 0x50, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x78, 0x07, 0xb6, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb2, 0x3e, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xb4, 0x65, 0x40, 0x68, 0x06, 0x9c, 0x3f, + 0x68, 0x06, 0x1c, 0x40, 0x60, 0x5c, 0xad, 0xbe, 0x6c, 0xb1, 0x24, 0x40, + 0x68, 0x06, 0x9c, 0x3f, 0x78, 0x07, 0xb6, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb2, 0x3e, 0x3f, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x0a, 0x3f, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x5e, 0x61, 0xbf, 0xa0, 0xb4, 0xf2, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0xf2, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x70, 0x06, 0x1c, 0x3f, + 0xa0, 0xb4, 0xf2, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x0a, 0x3f, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0x5c, 0x2d, 0x3f, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x06, 0x1c, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x5c, 0xad, 0x3e, 0x58, 0x05, 0x82, 0xbf, 0x80, 0xb2, 0x3e, 0xbf, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb2, 0x3e, 0x3f, 0xe0, 0x05, 0x0f, 0x40, + 0x08, 0xb3, 0x4b, 0x40, 0x90, 0xb3, 0xd8, 0xbf, 0x68, 0x06, 0x9c, 0x3f, + 0x60, 0x5b, 0x93, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb2, 0xbe, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0xf0, 0x06, 0x29, 0x40, + 0x70, 0x06, 0x1c, 0x3f, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb2, 0xbe, 0x3f, 0x70, 0x06, 0x1c, 0x3f, 0x60, 0xb0, 0x8a, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x90, 0x08, 0x50, 0x3f, 0x60, 0x5c, 0xad, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0x08, 0xd0, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x90, 0x5e, 0x61, 0xbf, 0x90, 0xb3, 0xd8, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0xa0, 0xb4, 0xf2, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0xb0, 0x0a, 0x3f, 0x90, 0x08, 0x50, 0x3f, + 0x60, 0x06, 0x1c, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0xd0, 0x3e, 0x90, 0x5e, 0x61, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x5e, 0x61, 0x3f, 0x90, 0x5e, 0x61, 0x3f, 0x68, 0x06, 0x9c, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x64, 0x5b, 0x13, 0x40, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x70, 0x5c, 0x2d, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0x60, 0x5b, 0x93, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x5c, 0xad, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0x78, 0x07, 0xb6, 0x3f, 0x80, 0x08, 0xd0, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0x5c, 0xad, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0xb0, 0x0a, 0xbf, 0x90, 0x5e, 0x61, 0x3f, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x06, 0x1c, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x90, 0x5e, 0x61, 0xbf, + 0x90, 0xb3, 0xd8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x70, 0x06, 0x1c, 0x3f, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x5b, 0x93, 0xbf, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb2, 0x3e, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0x06, 0x1c, 0x3f, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x0a, 0xbf, + 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x70, 0xb1, 0xa4, 0xbf, 0x80, 0x08, 0xd0, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, + 0x70, 0xb1, 0xa4, 0xbf, 0x80, 0x5c, 0xad, 0x3e, 0x90, 0x08, 0x50, 0x3f, + 0x60, 0xb0, 0x8a, 0x3e, 0xa8, 0x5f, 0xfb, 0x3f, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0x08, 0xd0, 0x3e, 0x70, 0x5c, 0xad, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb2, 0x3e, 0x3f, 0xa0, 0x09, 0xea, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x98, 0x09, 0xea, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x58, 0xb0, 0x8a, 0xbf, + 0x08, 0xb3, 0x4b, 0x40, 0xa0, 0x09, 0xea, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, 0x70, 0x5c, 0x2d, 0x3f, + 0x80, 0x08, 0xd0, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5c, 0xad, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0x3f, + 0x80, 0x08, 0xd0, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0xbf, 0xa0, 0xb4, 0xf2, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0x3f, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb2, 0x3e, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0xd0, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0x3d, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0xa8, 0x5f, 0xfb, 0xbf, 0x80, 0x08, 0xd0, 0xbe, + 0x90, 0x5e, 0x61, 0xbf, 0x60, 0x5b, 0x93, 0x3f, 0x6c, 0xb1, 0x24, 0x40, + 0xa0, 0xb4, 0xf2, 0xbf, 0x88, 0x08, 0xd0, 0xbf, 0x60, 0x06, 0x1c, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x8a, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x06, 0xa9, 0xc0, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x94, 0x5e, 0x61, 0xc0, 0x58, 0x05, 0x02, 0x40, 0x74, 0x5c, 0x2d, 0x40, + 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0xf2, 0xbe, 0x58, 0x05, 0x82, 0x3f, 0x58, 0xb0, 0x8a, 0xbf, + 0x90, 0x5e, 0x61, 0x3f, 0xa0, 0xb4, 0xf2, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0xd0, 0x3e, 0x60, 0x06, 0x1c, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x98, 0x5e, 0xe1, 0x3f, + 0x80, 0xb0, 0x8a, 0xbd, 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x60, 0xb0, 0x0a, 0x3f, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x0a, 0x3e, + 0x70, 0x06, 0x1c, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0xbe, + 0x90, 0x08, 0x50, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0x5c, 0xad, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb2, 0x3e, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0x08, 0x50, 0xbe, 0x80, 0x08, 0x50, 0xbf, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0xb1, 0xa4, 0xbf, 0x60, 0xb0, 0x8a, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0xac, 0x86, 0xa2, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x68, 0x06, 0x9c, 0xbf, 0x80, 0x08, 0xd0, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x56, 0x05, 0x02, 0xc1, 0x80, 0x5d, 0xc7, 0xbf, 0x68, 0x06, 0x9c, 0x3f, + 0x80, 0xb0, 0x0a, 0x3e, 0x84, 0x5d, 0xc7, 0xc0, 0xbd, 0x87, 0xbc, 0xc0, + 0x70, 0x5c, 0xad, 0x3f, 0x80, 0x08, 0x50, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb2, 0x3e, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, 0x90, 0x08, 0x50, 0x3f, + 0x58, 0xb0, 0x8a, 0xbf, 0x90, 0x5e, 0x61, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0xd0, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0xbe, + 0x98, 0x5e, 0xe1, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, 0xa0, 0xb4, 0xf2, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb2, 0x3e, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0xb0, 0x0a, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0xb0, 0x0a, 0xbf, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0x3e, 0x70, 0xb1, 0xa4, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3f, 0x12, 0x09, 0xdd, 0xc0, + 0xa0, 0xb4, 0x72, 0xbf, 0x78, 0x07, 0xb6, 0xbf, 0x60, 0xb0, 0x8a, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3f, 0xd8, 0x5a, 0x06, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x9a, 0x09, 0x6a, 0xc0, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0x98, 0x09, 0xea, 0xbf, + 0xa6, 0xdb, 0x99, 0xc0, 0x88, 0x5d, 0xc7, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0xd0, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x68, 0x06, 0x9c, 0x3f, 0x80, 0xb2, 0x3e, 0xbf, 0x58, 0x05, 0x82, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0x08, 0xd0, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x5c, 0xad, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb2, 0xbe, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0x72, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x90, 0x08, 0x50, 0x3f, 0xa0, 0xb4, 0x72, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x0a, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x90, 0x5e, 0x61, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, + 0x70, 0x5c, 0x2d, 0x3f, 0x90, 0x5e, 0x61, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0xd0, 0xbe, 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0xb2, 0x3e, 0xbf, 0x70, 0x5c, 0x2d, 0xbf, + 0xa6, 0xdb, 0x19, 0xc1, 0x68, 0x06, 0x9c, 0xbf, 0x78, 0x07, 0xb6, 0xbf, + 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0x3e, + 0x88, 0x08, 0xd0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x90, 0xb3, 0x58, 0xc0, + 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x8a, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0x70, 0x5c, 0xad, 0xbf, 0x9a, 0x85, 0x08, 0xc1, 0x78, 0x07, 0xb6, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0xa0, 0xb4, 0xf2, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0x5c, 0xad, 0x3e, 0x70, 0xb1, 0xa4, 0x3f, 0x60, 0xb0, 0x0a, 0xbf, + 0x68, 0x06, 0x9c, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x06, 0x1c, 0xbf, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0xa0, 0xb4, 0xf2, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x60, 0xb0, 0x8a, 0x3f, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x0a, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, + 0x68, 0x06, 0x9c, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0xf2, 0x3e, + 0x90, 0x5e, 0x61, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0xd0, 0x3e, + 0x90, 0x08, 0x50, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0x06, 0x1c, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, + 0x58, 0x05, 0x82, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0xd0, 0x3e, 0x60, 0xb0, 0x8a, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, 0x90, 0x08, 0x50, 0x3f, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0xa0, 0xb4, 0xf2, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0xd0, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0xb4, 0x72, 0xbf, + 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb2, 0x3e, 0x3f, + 0xa0, 0xb4, 0xf2, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0xe8, 0x5b, 0x20, 0xc0, 0xf6, 0xef, 0x00, 0xc1, 0x60, 0xb0, 0x0a, 0xbf, + 0x78, 0x07, 0xb6, 0xbf, 0x58, 0x05, 0x82, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x8a, 0x3e, 0x58, 0x05, 0x82, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x17, 0x30, 0x84, 0xc0, 0x80, 0xb0, 0x8a, 0xbd, 0x98, 0x5e, 0xe1, 0x3f, + 0x80, 0x08, 0x50, 0xbe, 0xa0, 0xb4, 0xf2, 0xbf, 0xea, 0x5b, 0xa0, 0xc0, + 0x88, 0x08, 0xd0, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x0a, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x50, 0x3e, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x0a, 0x3f, 0x78, 0x07, 0xb6, 0x3f, + 0x80, 0xb0, 0x8a, 0xbd, 0x68, 0x06, 0x9c, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0x08, 0xd0, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0xd0, 0x3e, 0xa0, 0xb4, 0xf2, 0x3e, + 0x60, 0xb0, 0x8a, 0x3f, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x0a, 0x3e, 0xa0, 0xb4, 0x72, 0xbf, 0x60, 0xb0, 0x0a, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x90, 0x5e, 0x61, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x0a, 0x3f, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0x08, 0x50, 0xbe, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb2, 0xbe, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x5d, 0xc7, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x70, 0x5c, 0x2d, 0xbf, + 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0x50, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xb4, 0x72, 0x3f, 0x80, 0xb0, 0x8a, 0x3d, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0x08, 0x50, 0xbf, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x5c, 0xad, 0x3e, + 0x80, 0xb2, 0xbe, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x5d, 0xc7, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb0, 0x0a, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x88, 0x5d, 0xc7, 0x3f, 0xa0, 0x09, 0xea, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x5c, 0x3a, 0xc0, 0xa0, 0xb4, 0x72, 0xc0, + 0x80, 0x08, 0x50, 0x3e, 0x70, 0xb1, 0xa4, 0xbf, 0x70, 0x5c, 0x2d, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x5c, 0xb0, 0x8a, 0xc0, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0x08, 0xd0, 0x3e, 0xa0, 0xb4, 0xf2, 0xbe, 0x90, 0x5e, 0x61, 0xbf, + 0x12, 0x09, 0x5d, 0xc0, 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x0a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x80, 0x08, 0x50, 0xbe, 0x90, 0xb3, 0xd8, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xb0, 0x0a, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, + 0x80, 0x08, 0x50, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0x40, 0xb0, 0x0a, 0xbe, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb2, 0x3e, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x78, 0x07, 0xb6, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, 0xa0, 0x09, 0xea, 0x3f, + 0x60, 0x06, 0x1c, 0xbf, 0x58, 0xb0, 0x8a, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, + 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5c, 0xad, 0x3e, + 0x98, 0x09, 0xea, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x0a, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb2, 0x3e, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0xb0, 0x0a, 0x3f, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, + 0x60, 0xb0, 0x0a, 0xbf, 0x90, 0x5e, 0x61, 0xbf, 0x80, 0x08, 0x50, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, 0x70, 0x5c, 0xad, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0x50, 0xbe, 0x70, 0x5c, 0x2d, 0x3f, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x5c, 0xad, 0x3e, 0xa0, 0xb4, 0x72, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0x08, 0xd0, 0xbe, + 0xa0, 0xb4, 0xf2, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, + 0x80, 0x08, 0x50, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0xa0, 0xb4, 0xf2, 0xbe, + 0x58, 0x05, 0x82, 0xbf, 0x60, 0xb0, 0x8a, 0x3e, 0x60, 0xb0, 0x0a, 0xbf, + 0x40, 0xb0, 0x0a, 0xbe, 0x60, 0x5b, 0x93, 0xbf, 0x80, 0x5c, 0xad, 0x3e, + 0x60, 0xb0, 0x8a, 0xbe, 0x70, 0x06, 0x1c, 0x3f, 0x80, 0xb0, 0x0a, 0x3e, + 0x60, 0xb0, 0x8a, 0x3e, 0xa0, 0xb4, 0x72, 0xbf, 0x80, 0xb0, 0x8a, 0xbd, + 0x90, 0x08, 0x50, 0x3f, 0x60, 0xb0, 0x8a, 0xbe, 0x80, 0x08, 0xd0, 0xbe, + 0x60, 0x5c, 0xad, 0xbe, 0x60, 0xb0, 0x0a, 0xbf, 0x60, 0x5c, 0xad, 0xbe, + 0x60, 0x5c, 0xad, 0xbe, 0xa0, 0xb4, 0x72, 0x3f, 0xfc, 0x5c, 0x3a, 0x40, + 0xa0, 0xb4, 0x72, 0xbf, 0x60, 0x5b, 0x93, 0xbf, 0x80, 0xb2, 0xbe, 0xbf, + 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0x08, 0xd0, 0x3e, 0x78, 0x07, 0xb6, 0xbf, + 0x58, 0x05, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, + 0x80, 0x08, 0x50, 0x3e, 0x40, 0xb0, 0x0a, 0xbe, 0x67, 0x06, 0x9c, 0xc0, + 0x58, 0x05, 0x82, 0x3f, 0x6c, 0xb1, 0x24, 0x40, 0x60, 0xb0, 0x8a, 0xbe, + 0x70, 0x5c, 0xad, 0xbf, 0x80, 0xb2, 0xbe, 0xbf, 0x88, 0x5d, 0xc7, 0x3f, + 0x60, 0xb0, 0x0a, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x06, 0x1c, 0xbf, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0xb0, 0x8a, 0xbd, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0x5c, 0xad, 0xbe, 0x80, 0xb0, 0x8a, 0xbd, + 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0x08, 0x50, 0x3e, 0x70, 0xb1, 0xa4, 0xbf, + 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0x5c, 0xad, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0xb0, 0x8a, 0x3d, 0x80, 0x08, 0x50, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xb0, 0x8a, 0x3d, 0x60, 0xb0, 0x8a, 0xbe, + 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x5b, 0x93, 0x3f, 0x60, 0x06, 0x1c, 0xbf, 0x80, 0xb2, 0x3e, 0xbf, + 0x70, 0x5c, 0x2d, 0xbf, 0x80, 0xb0, 0x8a, 0x3d, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x5c, 0xad, 0x3e, 0x68, 0x06, 0x9c, 0xbf, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, 0x60, 0xb0, 0x8a, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x70, 0x06, 0x1c, 0x3f, 0x80, 0x08, 0x50, 0xbe, + 0x80, 0x08, 0xd0, 0xbe, 0x60, 0x5c, 0xad, 0xbe, 0x60, 0x5c, 0xad, 0xbe, + 0x80, 0x5c, 0xad, 0x3e, 0x60, 0x06, 0x1c, 0xbf, 0x90, 0x5e, 0x61, 0x3f, + 0x60, 0x5c, 0xad, 0xbe, 0x80, 0x08, 0xd0, 0xbe, 0x80, 0x08, 0x50, 0x3e, + 0x80, 0x08, 0xd0, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, 0xa0, 0xb4, 0xf2, 0x3e, + 0xa0, 0xb4, 0xf2, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x60, 0xb0, 0x0a, 0xbf, 0xa8, 0x5f, 0xfb, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, + 0x60, 0xb0, 0x8a, 0xbe, 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x88, 0x08, 0xd0, 0x3f, 0xa0, 0xb4, 0x72, 0x3f, 0x70, 0x06, 0x1c, 0x3f, + 0x80, 0x5c, 0xad, 0x3e, 0x80, 0x5d, 0xc7, 0xbf, 0x70, 0xb1, 0xa4, 0xbf, + 0x70, 0x5c, 0x2d, 0x3f, 0x58, 0xb0, 0x8a, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x8a, 0xbd, 0x60, 0xb0, 0x8a, 0x3e, 0x80, 0xb2, 0x3e, 0x3f, + 0x40, 0xb0, 0x0a, 0xbe, 0x12, 0x09, 0x5d, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x5c, 0x2d, 0x3f, 0x80, 0xb0, 0x8a, 0xbd, 0x80, 0xb0, 0x8a, 0xbd, + 0x98, 0x5e, 0xe1, 0xbf, 0x90, 0x5e, 0x61, 0x3f, 0x80, 0x08, 0xd0, 0x3e, + 0x60, 0x5c, 0xad, 0xbe, 0x60, 0xb0, 0x8a, 0xbe, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x06, 0x1c, 0xbf, 0x80, 0x08, 0x50, 0xbf, 0x70, 0x06, 0x1c, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb4, 0xf2, 0xbe, 0x80, 0xb0, 0x8a, 0x3d, + 0x70, 0x06, 0x1c, 0x3f, 0x58, 0x05, 0x82, 0xbf, 0x40, 0xb0, 0x0a, 0xbe, + 0x80, 0xb0, 0x0a, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0xd0, 0xbe, + 0xa0, 0xb4, 0xf2, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x08, 0x50, 0x3e, 0x60, 0x5c, 0xad, 0xbe, 0x20, 0x5f, 0x6e, 0x40, + 0x68, 0x06, 0x1c, 0xc0, 0x68, 0x06, 0x1c, 0xc0, 0x60, 0xb0, 0x8a, 0xbe, + 0x60, 0xb0, 0x0a, 0x3f, 0x2e, 0xdc, 0xa6, 0xc0, 0x70, 0x06, 0x1c, 0x3f, + 0x60, 0x06, 0x1c, 0xbf, 0x58, 0xb0, 0x8a, 0xbf, 0x70, 0x5c, 0x2d, 0x3f, + 0x60, 0x5b, 0x93, 0xbf, 0x80, 0x5c, 0xad, 0x3e, 0x60, 0xb0, 0x8a, 0xbe, + 0x40, 0xb0, 0x0a, 0xbe, 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0xd0, 0xbe, + 0x90, 0x5e, 0x61, 0x3f, 0x80, 0x08, 0xd0, 0x3e, 0x70, 0xb1, 0xa4, 0x3f, + 0x90, 0x5e, 0x61, 0x3f, 0x60, 0xb0, 0x0a, 0x3f, 0x60, 0x5b, 0x93, 0xbf, + 0x90, 0x5e, 0x61, 0x3f, 0x58, 0x05, 0x82, 0xbf, 0x70, 0x5c, 0xad, 0x3f, + 0xe0, 0x05, 0x0f, 0x40, 0x60, 0xb0, 0x0a, 0xbf, 0xa0, 0xb4, 0x72, 0xbf, + 0x90, 0x08, 0x50, 0x3f, 0xe8, 0x5b, 0x20, 0xc0, 0xfc, 0x5c, 0x3a, 0x40, + 0x80, 0x08, 0x50, 0x3e, 0x80, 0x08, 0x50, 0xbf, 0x90, 0xb3, 0xd8, 0xbf, + 0x90, 0x5e, 0x61, 0x3f, 0x40, 0xb0, 0x0a, 0xbe, 0x70, 0x5c, 0x2d, 0xbf, + 0x90, 0x5e, 0x61, 0x3f, 0x8a, 0x08, 0x50, 0xc0, +}}; +const int32_t dnn_logits_bias__2__cf__2_shape[1] = {1}; +const union { + uint8_t bytes[4]; + float values[1]; +} dnn_logits_bias__2__cf__2 = {{ + 0x6c, + 0xee, + 0x8d, + 0xbf, +}}; +const int32_t dnn_logits_kernel__3__cf__3_shape[2] = {20, 1}; +const union { + uint8_t bytes[80]; + float values[20]; +} dnn_logits_kernel__3__cf__3 = {{ + 0x96, 0x59, 0x45, 0xbd, 0x84, 0x25, 0xf6, 0xbd, 0xe9, 0x7c, 0x89, 0x3e, + 0xa0, 0x66, 0x3c, 0xbe, 0x37, 0x01, 0x89, 0x3d, 0xe4, 0x97, 0x22, 0x3e, + 0x21, 0xf8, 0x84, 0xbe, 0x92, 0x74, 0x8d, 0x3e, 0x30, 0xde, 0x0f, 0xbe, + 0x88, 0x44, 0x3b, 0xbe, 0x42, 0x78, 0xb8, 0x3d, 0x0a, 0xf2, 0xf6, 0xbd, + 0x48, 0x60, 0xd6, 0x3f, 0x2c, 0x86, 0x83, 0x3d, 0x92, 0xcc, 0xb6, 0x3e, + 0xab, 0xc5, 0x4b, 0x3e, 0x6f, 0x6e, 0x1f, 0x3f, 0x07, 0xcd, 0x32, 0x3e, + 0x5d, 0xb3, 0xb2, 0x3d, 0x31, 0x53, 0xf6, 0x3d, +}}; + +} // anonymous namespace + +// ----------------------------------------------------------------------------- +// INFERENCE +// ----------------------------------------------------------------------------- + +int32_t input_from_feature_columns_input_layer_concat_concat0Shape[2] = {1, + 325}; +int32_t logits_MatMul_merged_with_dnn_logits_BiasAdd0Shape[2] = {1, 1}; + +void Inference( + const float* __restrict input_from_feature_columns_input_layer_concat_concat0 /* shape: 1,325 */ + , + float* __restrict logits_MatMul_merged_with_dnn_logits_BiasAdd0 /* shape: + 1,1 */ + , + FixedAllocations* __restrict fixed) { + const int32_t input_from_feature_columns_input_layer_concat_concat0_shape[] = + {1, 325}; + +#if OP_LIB_BENCHMARK + Singleton<PerOpTimings>::get()->Reset(); +#endif + + // dnn/hiddenlayer_0/MatMul_merged_with_dnn/hiddenlayer_0/BiasAdd + FullyConnected<float>( + input_from_feature_columns_input_layer_concat_concat0_shape, + input_from_feature_columns_input_layer_concat_concat0, + dnn_hiddenlayer_0_kernel__1__cf__1_shape, + dnn_hiddenlayer_0_kernel__1__cf__1.values, + dnn_hiddenlayer_0_bias__0__cf__0_shape, + dnn_hiddenlayer_0_bias__0__cf__0.values, fixed->alloc0); + + fixed->shape0[0] = 1; + fixed->shape0[1] = 20; + + // dnn/hiddenlayer_0/Relu + Relu<float>(2, // rank + fixed->shape0, fixed->alloc0, fixed->alloc0); + + // dnn/logits/MatMul_merged_with_dnn/logits/BiasAdd + FullyConnected<float>( + fixed->shape0, fixed->alloc0, dnn_logits_kernel__3__cf__3_shape, + dnn_logits_kernel__3__cf__3.values, dnn_logits_bias__2__cf__2_shape, + dnn_logits_bias__2__cf__2.values, + logits_MatMul_merged_with_dnn_logits_BiasAdd0); + +#if OP_LIB_BENCHMARK + Singleton<PerOpTimings>::get()->WriteTimingsToInfoLog(); +#endif +} + +} // namespace ui::internal_onedevice::beta_model diff --git a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.h b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.h new file mode 100644 index 0000000..efac7f4 --- /dev/null +++ b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.h @@ -0,0 +1,40 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// Code generated by tf.native. +#ifndef UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_PALM_MODEL_ONEDEVICE_TRAIN_PALM_DETECTION_FILTER_INFERENCE_BETA_H_ +#define UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_PALM_MODEL_ONEDEVICE_TRAIN_PALM_DETECTION_FILTER_INFERENCE_BETA_H_ +#include <cstdint> + +namespace ui::internal_onedevice::beta_model { +struct alignas(16) FixedAllocations { + float alloc0[20]; + int32_t shape0[2]; +}; + +extern int32_t input_from_feature_columns_input_layer_concat_concat0Shape[2]; +extern int32_t logits_MatMul_merged_with_dnn_logits_BiasAdd0Shape[2]; + +#define CHROME_KNOWLEDGE_INPUT_FROM_FEATURE_COLUMNS_INPUT_LAYER_CONCAT_CONCAT0_RANK_BETA \ + 2 +#define CHROME_KNOWLEDGE_INPUT_FROM_FEATURE_COLUMNS_INPUT_LAYER_CONCAT_CONCAT0_DIM0_SIZE_BETA \ + 1 +#define CHROME_KNOWLEDGE_INPUT_FROM_FEATURE_COLUMNS_INPUT_LAYER_CONCAT_CONCAT0_DIM1_SIZE_BETA \ + 325 +#define CHROME_KNOWLEDGE_LOGITS_MATMUL_MERGED_WITH_DNN_LOGITS_BIASADD0_RANK_BETA \ + 2 +#define CHROME_KNOWLEDGE_LOGITS_MATMUL_MERGED_WITH_DNN_LOGITS_BIASADD0_DIM0_SIZE_BETA \ + 1 +#define CHROME_KNOWLEDGE_LOGITS_MATMUL_MERGED_WITH_DNN_LOGITS_BIASADD0_DIM1_SIZE_BETA \ + 1 + +void Inference( + const float* __restrict input_from_feature_columns_input_layer_concat_concat0 /* shape: 1,325 */ + , + float* __restrict logits_MatMul_merged_with_dnn_logits_BiasAdd0 /* shape: + 1,1 */ + , + FixedAllocations* __restrict fixed); + +} // namespace ui::internal_onedevice::beta_model +#endif // UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_PALM_MODEL_ONEDEVICE_TRAIN_PALM_DETECTION_FILTER_INFERENCE_BETA_H_ diff --git a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc index cd724da..acf43d8 100644 --- a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc +++ b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.cc @@ -19,20 +19,24 @@ #include "base/feature_list.h" #include "base/logging.h" #include "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference.h" +#include "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_beta.h" #include "ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_inference_v2.h" - #include "ui/events/ozone/features.h" - #define USE_EIGEN 0 namespace ui { +namespace { +const std::string kBetaVersion = "beta"; +} namespace alpha = internal_onedevice::alpha_model; namespace alpha_v2 = internal_onedevice::alpha_model_v2; +namespace beta = internal_onedevice::beta_model; float OneDeviceTrainNeuralStylusPalmDetectionFilterModel::Inference( const std::vector<float>& features) const { DVLOG(1) << "In Inference."; + if (features.size() != expected_feature_size_) { LOG(DFATAL) << "Bad count. Is " << features.size() << " expected " << expected_feature_size_; @@ -45,14 +49,20 @@ float OneDeviceTrainNeuralStylusPalmDetectionFilterModel::Inference( } } float output = 0; - if (base::FeatureList::IsEnabled(kEnableNeuralPalmRejectionModelV2)) { - std::unique_ptr<alpha_v2::FixedAllocations> fixed_allocations( - new alpha_v2::FixedAllocations()); - alpha_v2::Inference(&features[0], &output, fixed_allocations.get()); + if (config_.model_version == kBetaVersion) { + std::unique_ptr<beta::FixedAllocations> fixed_allocations( + new beta::FixedAllocations()); + beta::Inference(&features[0], &output, fixed_allocations.get()); } else { - std::unique_ptr<alpha::FixedAllocations> fixed_allocations( - new alpha::FixedAllocations()); - alpha::Inference(&features[0], &output, fixed_allocations.get()); + if (base::FeatureList::IsEnabled(kEnableNeuralPalmRejectionModelV2)) { + std::unique_ptr<alpha_v2::FixedAllocations> fixed_allocations( + new alpha_v2::FixedAllocations()); + alpha_v2::Inference(&features[0], &output, fixed_allocations.get()); + } else { + std::unique_ptr<alpha::FixedAllocations> fixed_allocations( + new alpha::FixedAllocations()); + alpha::Inference(&features[0], &output, fixed_allocations.get()); + } } return output; } @@ -62,45 +72,57 @@ OneDeviceTrainNeuralStylusPalmDetectionFilterModel::config() const { return config_; } -OneDeviceTrainNeuralStylusPalmDetectionFilterModel:: - OneDeviceTrainNeuralStylusPalmDetectionFilterModel() { +void OneDeviceTrainNeuralStylusPalmDetectionFilterModel::Initialize() { // Common configurations: config_.include_sequence_count_in_strokes = true; - config_.max_neighbor_distance_in_mm = 100.0f; config_.max_dead_neighbor_time = base::Milliseconds(100.0f); config_.heuristic_palm_touch_limit = 20.0f; config_.heuristic_palm_area_limit = 400.0f; config_.max_blank_time = base::Milliseconds(100.0f); config_.nearest_neighbor_count = 0; - config_.biggest_near_neighbor_count = 4; - - if (base::FeatureList::IsEnabled(kEnableNeuralPalmRejectionModelV2)) { - config_.min_sample_count = 3; - config_.max_sample_count = 6; - config_.neighbor_min_sample_count = 1; - config_.output_threshold = 0.90271f; - expected_feature_size_ = 173; - if (base::FeatureList::IsEnabled(kEnableNeuralPalmAdaptiveHold)) { - config_.nn_delay_start_if_palm = true; - config_.early_stage_sample_counts = std::unordered_set<uint32_t>({2}); - } - } else { + if (config_.model_version == kBetaVersion) { + config_.max_neighbor_distance_in_mm = 200.0f; + config_.biggest_near_neighbor_count = 4; config_.min_sample_count = 5; config_.max_sample_count = 12; config_.neighbor_min_sample_count = 5; - config_.output_threshold = 2.519f; - expected_feature_size_ = 323; + config_.output_threshold = 4.465f; + config_.use_tracking_id_count = true; + config_.use_active_tracking_id_count = true; + expected_feature_size_ = 325; + } else { + config_.max_neighbor_distance_in_mm = 100.0f; + config_.biggest_near_neighbor_count = 4; + + if (base::FeatureList::IsEnabled(kEnableNeuralPalmRejectionModelV2)) { + config_.min_sample_count = 3; + config_.max_sample_count = 6; + config_.neighbor_min_sample_count = 1; + config_.output_threshold = 0.90271f; + expected_feature_size_ = 173; + + if (base::FeatureList::IsEnabled(kEnableNeuralPalmAdaptiveHold)) { + config_.nn_delay_start_if_palm = true; + config_.early_stage_sample_counts = std::unordered_set<uint32_t>({2}); + } + } else { + config_.min_sample_count = 5; + config_.max_sample_count = 12; + config_.neighbor_min_sample_count = 5; + config_.output_threshold = 2.519f; + expected_feature_size_ = 323; + } } } OneDeviceTrainNeuralStylusPalmDetectionFilterModel:: OneDeviceTrainNeuralStylusPalmDetectionFilterModel( const std::string& model_version, - const std::vector<float>& radius_poly) - : OneDeviceTrainNeuralStylusPalmDetectionFilterModel() { + const std::vector<float>& radius_poly) { config_.model_version = model_version; config_.radius_polynomial_resize = radius_poly; + Initialize(); } -} // namespace ui
\ No newline at end of file +} // namespace ui diff --git a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h index d514a35..eb020c8 100644 --- a/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h +++ b/ui/events/ozone/evdev/touch_filter/palm_model/onedevice_train_palm_detection_filter_model.h @@ -18,7 +18,6 @@ namespace ui { class COMPONENT_EXPORT(EVDEV) OneDeviceTrainNeuralStylusPalmDetectionFilterModel : public NeuralStylusPalmDetectionFilterModel { public: - OneDeviceTrainNeuralStylusPalmDetectionFilterModel(); explicit OneDeviceTrainNeuralStylusPalmDetectionFilterModel( const std::string& model_version, const std::vector<float>& radius_poly); @@ -32,14 +31,14 @@ class COMPONENT_EXPORT(EVDEV) OneDeviceTrainNeuralStylusPalmDetectionFilterModel const NeuralStylusPalmDetectionFilterModelConfig& config() const override; - // Config is further modified by Android classes inheriting from this class protected: NeuralStylusPalmDetectionFilterModelConfig config_; private: + void Initialize(); size_t expected_feature_size_; }; } // namespace ui -#endif // UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_PALM_MODEL_ONEDEVICE_TRAIN_PALM_DETECTION_FILTER_MODEL_H_
\ No newline at end of file +#endif // UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_PALM_MODEL_ONEDEVICE_TRAIN_PALM_DETECTION_FILTER_MODEL_H_ diff --git a/ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.cc b/ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.cc new file mode 100644 index 0000000..7e843ba --- /dev/null +++ b/ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.cc @@ -0,0 +1,25 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.h" + +namespace ui { + +std::ostream& operator<<(std::ostream& out, + const SharedPalmDetectionFilterState& state) { + base::TimeTicks now = base::TimeTicks::Now(); + out << "SharedPalmDetectionFilterState(\n"; + out << " latest_stylus_touch_time = " << state.latest_stylus_touch_time + << " (" << now - state.latest_stylus_touch_time << " from now)\n"; + out << " latest_finger_touch_time = " << state.latest_finger_touch_time + << "\n"; + out << " active_finger_touches = " << state.active_finger_touches << "\n"; + out << " active_palm_touches = " << state.active_palm_touches << "\n"; + out << " latest_palm_touch_time = " << state.latest_palm_touch_time << "\n"; + out << " Now() = " << now << "\n"; + out << ")"; + return out; +} + +} // namespace ui
\ No newline at end of file diff --git a/ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.h b/ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.h index 942e6d2..bff9abb 100644 --- a/ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.h +++ b/ui/events/ozone/evdev/touch_filter/shared_palm_detection_filter_state.h @@ -29,6 +29,9 @@ struct SharedPalmDetectionFilterState { base::TimeTicks latest_palm_touch_time = base::TimeTicks::UnixEpoch(); }; +std::ostream& operator<<(std::ostream& out, + const SharedPalmDetectionFilterState& state); + } // namespace ui #endif // UI_EVENTS_OZONE_EVDEV_TOUCH_FILTER_SHARED_PALM_DETECTION_FILTER_STATE_H_
\ No newline at end of file |