diff --git a/DEPS b/DEPS index a96095e..496e425a 100644 --- a/DEPS +++ b/DEPS
@@ -39,11 +39,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '4ca2e6034365ad280ec64473f7f1d72ebd8335e4', + 'skia_revision': '5aaef1ff1a18b420b3409ec31b44c2435a4ac988', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '8b8ba9031542c64295ab11f8985f9a9c9f5f170a', + 'v8_revision': '8fb1fca297b6f5ae3db83d89c6b51e73c36cdd73', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -55,11 +55,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling build tools # and whatever else without interference from each other. - 'buildtools_revision': '277db9302c7ff55beee2a9daf380675dc03bea83', + 'buildtools_revision': '818123dac34899ec230840936fc15b8b2b5556f9', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '3f148915d12f54a946a0c0bf526162b79c39d650', + 'pdfium_revision': '76b0104270b0a7f3ce7d40ddde2b6d6c8cb944db', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -148,7 +148,7 @@ Var('chromium_git') + '/external/snappy.git' + '@' + '762bb32f0c9d2f31ba4958c7c0933d22e80c20bf', 'src/tools/gyp': - Var('chromium_git') + '/external/gyp.git' + '@' + '33b351b2eda8facc464c89213fc8cd9919666c05', + Var('chromium_git') + '/external/gyp.git' + '@' + 'e1133480da78cd4a23a8cec604d1d6d46dab35d6', 'src/tools/swarming_client': Var('chromium_git') + '/external/swarming.client.git' + '@' + Var('swarming_revision'), @@ -184,7 +184,7 @@ Var('chromium_git') + '/external/selenium/py.git' + '@' + '5fd78261a75fe08d27ca4835fb6c5ce4b42275bd', 'src/third_party/libvpx_new/source/libvpx': - Var('chromium_git') + '/webm/libvpx.git' + '@' + '0941ff72a00732cea6750477edfe649348e699de', + Var('chromium_git') + '/webm/libvpx.git' + '@' + '204cde580a5f6dd5e7511c932c47c068046d9671', 'src/third_party/ffmpeg': Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '4b95e276f3891020fd3560c973dcc70dd50403c6',
diff --git a/android_webview/java/src/org/chromium/android_webview/AwPdfExporter.java b/android_webview/java/src/org/chromium/android_webview/AwPdfExporter.java index d02ba660..97f84fb 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwPdfExporter.java +++ b/android_webview/java/src/org/chromium/android_webview/AwPdfExporter.java
@@ -78,11 +78,16 @@ @CalledByNative private void setNativeAwPdfExporter(long nativePdfExporter) { mNativeAwPdfExporter = nativePdfExporter; - // Handle the cornercase that Webview.Destroy is called before the native side - // has a chance to complete the pdf exporting. + // Handle the cornercase that the native side is destroyed (for example + // via Webview.Destroy) before it has a chance to complete the pdf exporting. if (nativePdfExporter == 0 && mResultCallback != null) { - mResultCallback.onReceiveValue(false); - mResultCallback = null; + try { + mResultCallback.onReceiveValue(false); + mResultCallback = null; + } catch (IllegalStateException ex) { + // Swallow the illegal state exception here. It is possible that app + // is going away and binder is already finalized. b/25462345 + } } }
diff --git a/ash/test/test_session_state_delegate.cc b/ash/test/test_session_state_delegate.cc index d7e8fbb..afab25d 100644 --- a/ash/test/test_session_state_delegate.cc +++ b/ash/test/test_session_state_delegate.cc
@@ -56,7 +56,7 @@ std::string GetEmail() const override { return display_email_; } - AccountId GetAccountId() const override { return account_id_; } + const AccountId& GetAccountId() const override { return account_id_; } const gfx::ImageSkia& GetImage() const override { return user_image_; }
diff --git a/base/memory/discardable_shared_memory.cc b/base/memory/discardable_shared_memory.cc index 24bd3e3..2b0cfd0 100644 --- a/base/memory/discardable_shared_memory.cc +++ b/base/memory/discardable_shared_memory.cc
@@ -122,8 +122,15 @@ if (!checked_size.IsValid()) return false; +#if defined(OS_MACOSX) && !defined(OS_IOS) + // DiscardableSharedMemory does not yet support a Mach-implementation, so + // force the underlying primitive to be a POSIX fd. https://crbug.com/547239. + if (!shared_memory_.CreateAndMapAnonymousPosix(checked_size.ValueOrDie())) + return false; +#else if (!shared_memory_.CreateAndMapAnonymous(checked_size.ValueOrDie())) return false; +#endif // defined(OS_MACOSX) && !defined(OS_IOS) mapped_size_ = shared_memory_.mapped_size() - AlignToPageSize(sizeof(SharedState));
diff --git a/base/memory/shared_memory_unittest.cc b/base/memory/shared_memory_unittest.cc index 86fb3ac..37b4086 100644 --- a/base/memory/shared_memory_unittest.cc +++ b/base/memory/shared_memory_unittest.cc
@@ -316,6 +316,10 @@ SharedMemoryCreateOptions options; options.size = contents.size(); options.share_read_only = true; +#if defined(OS_MACOSX) && !defined(OS_IOS) + // The Mach functionality is tested in shared_memory_mac_unittest.cc. + options.type = SharedMemoryHandle::POSIX; +#endif ASSERT_TRUE(writable_shmem.Create(options)); ASSERT_TRUE(writable_shmem.Map(options.size)); memcpy(writable_shmem.memory(), contents.data(), contents.size()); @@ -502,6 +506,10 @@ SharedMemory shared_memory; SharedMemoryCreateOptions options; options.size = kTestSize; +#if defined(OS_MACOSX) && !defined(OS_IOS) + // The Mach functionality is tested in shared_memory_mac_unittest.cc. + options.type = SharedMemoryHandle::POSIX; +#endif // Set a file mode creation mask that gives all permissions. ScopedUmaskSetter permissive_mask(S_IWGRP | S_IWOTH); @@ -524,6 +532,10 @@ SharedMemory shared_memory; SharedMemoryCreateOptions options; options.size = kTestSize; +#if defined(OS_MACOSX) && !defined(OS_IOS) + // The Mach functionality is tested in shared_memory_mac_unittest.cc. + options.type = SharedMemoryHandle::POSIX; +#endif // Set a file mode creation mask that gives all permissions. ScopedUmaskSetter permissive_mask(S_IWGRP | S_IWOTH);
diff --git a/base/profiler/OWNERS b/base/profiler/OWNERS new file mode 100644 index 0000000..81ff9fa --- /dev/null +++ b/base/profiler/OWNERS
@@ -0,0 +1,5 @@ +# Stack sampling profiler +per-file native_stack_sampler*=wittman@chromium.org +per-file stack_sampling_profiler*=wittman@chromium.org +per-file test_support_library*=wittman@chromium.org +per-file win32_stack_frame_unwinder*=wittman@chromium.org
diff --git a/base/threading/thread_restrictions.h b/base/threading/thread_restrictions.h index 3fda3ac6..2d78c9b 100644 --- a/base/threading/thread_restrictions.h +++ b/base/threading/thread_restrictions.h
@@ -42,6 +42,7 @@ class NestedMessagePumpAndroid; class ScopedAllowWaitForAndroidLayoutTests; class ScopedAllowWaitForDebugURL; +class SoftwareOutputDeviceMus; class TextInputClientMac; } // namespace content namespace dbus { @@ -217,7 +218,10 @@ friend class net::NetworkChangeNotifierMac; // http://crbug.com/125097 friend class ::BrowserProcessImpl; // http://crbug.com/125207 friend class ::NativeBackendKWallet; // http://crbug.com/125331 - // END USAGE THAT NEEDS TO BE FIXED. +#if !defined(OFFICIAL_BUILD) + friend class content::SoftwareOutputDeviceMus; // Interim non-production code +#endif +// END USAGE THAT NEEDS TO BE FIXED. #if ENABLE_THREAD_RESTRICTIONS static bool SetWaitAllowed(bool allowed);
diff --git a/base/tuple.h b/base/tuple.h index ef51d85f..5a04858 100644 --- a/base/tuple.h +++ b/base/tuple.h
@@ -150,7 +150,7 @@ struct TupleLeaf; template <typename... Ts> -struct Tuple : TupleBase<Ts...> { +struct Tuple final : TupleBase<Ts...> { Tuple() : TupleBase<Ts...>() {} explicit Tuple(typename TupleTraits<Ts>::ParamType... args) : TupleBase<Ts...>(args...) {} @@ -158,7 +158,7 @@ // Avoids ambiguity between Tuple's two constructors. template <> -struct Tuple<> {}; +struct Tuple<> final {}; template <size_t... Ns, typename... Ts> struct TupleBaseImpl<IndexSequence<Ns...>, Ts...> : TupleLeaf<Ns, Ts>... {
diff --git a/blimp/client/compositor/blimp_compositor.cc b/blimp/client/compositor/blimp_compositor.cc index 5f2b1fa2..96bad8c4 100644 --- a/blimp/client/compositor/blimp_compositor.cc +++ b/blimp/client/compositor/blimp_compositor.cc
@@ -18,6 +18,7 @@ #include "blimp/client/compositor/test/dummy_layer_driver.h" #include "blimp/common/compositor/blimp_task_graph_runner.h" #include "cc/layers/layer.h" +#include "cc/layers/layer_settings.h" #include "cc/output/output_surface.h" #include "cc/trees/layer_tree_host.h" #include "ui/gl/gl_surface.h"
diff --git a/blimp/client/compositor/test/dummy_layer_driver.cc b/blimp/client/compositor/test/dummy_layer_driver.cc index 306dd70..f3968ffc 100644 --- a/blimp/client/compositor/test/dummy_layer_driver.cc +++ b/blimp/client/compositor/test/dummy_layer_driver.cc
@@ -9,6 +9,7 @@ #include "base/task_runner.h" #include "base/thread_task_runner_handle.h" #include "cc/layers/layer.h" +#include "cc/layers/layer_settings.h" #include "cc/layers/solid_color_layer.h" #include "cc/trees/layer_tree_settings.h" #include "ui/gfx/geometry/size.h"
diff --git a/blimp/engine/browser/blimp_engine_session.cc b/blimp/engine/browser/blimp_engine_session.cc index f65706a..8f2f1c44 100644 --- a/blimp/engine/browser/blimp_engine_session.cc +++ b/blimp/engine/browser/blimp_engine_session.cc
@@ -138,7 +138,8 @@ scoped_ptr<BlimpMessage> message, const net::CompletionCallback& callback) { DCHECK(message->type() == BlimpMessage::CONTROL || - message->type() == BlimpMessage::NAVIGATION); + message->type() == BlimpMessage::NAVIGATION || + message->type() == BlimpMessage::COMPOSITOR); if (message->type() == BlimpMessage::CONTROL) { switch (message->control().type()) { @@ -233,6 +234,13 @@ contents->GetRenderViewHost()->GetWidget()->Focus(); } +void BlimpEngineSession::ForwardCompositorProto( + const std::vector<uint8_t>& proto) { + // Send the compositor proto over the network layer to the client, which will + // apply the proto to their local compositor instance. + // TODO(dtrainor): Send the compositor proto. +} + void BlimpEngineSession::PlatformSetContents( scoped_ptr<content::WebContents> new_contents) { new_contents->SetDelegate(this);
diff --git a/blimp/engine/browser/blimp_engine_session.h b/blimp/engine/browser/blimp_engine_session.h index 8adaef5..6b117a9 100644 --- a/blimp/engine/browser/blimp_engine_session.h +++ b/blimp/engine/browser/blimp_engine_session.h
@@ -86,6 +86,7 @@ bool last_unlocked_by_target) override; void CloseContents(content::WebContents* source) override; void ActivateContents(content::WebContents* contents) override; + void ForwardCompositorProto(const std::vector<uint8_t>& proto) override; // Sets up and owns |new_contents|. void PlatformSetContents(scoped_ptr<content::WebContents> new_contents);
diff --git a/cc/BUILD.gn b/cc/BUILD.gn index 39d3f7a7..c3b9b8a 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn
@@ -140,6 +140,8 @@ "layers/layer_position_constraint.h", "layers/layer_proto_converter.cc", "layers/layer_proto_converter.h", + "layers/layer_settings.cc", + "layers/layer_settings.h", "layers/layer_utils.cc", "layers/layer_utils.h", "layers/nine_patch_layer.cc", @@ -491,6 +493,7 @@ "trees/proxy_common.h", "trees/proxy_impl.h", "trees/proxy_main.h", + "trees/remote_proto_channel.h", "trees/scoped_abort_remaining_swap_promises.h", "trees/single_thread_proxy.cc", "trees/single_thread_proxy.h",
diff --git a/cc/animation/animation.cc b/cc/animation/animation.cc index 96cb40ae..dfdaeb70 100644 --- a/cc/animation/animation.cc +++ b/cc/animation/animation.cc
@@ -48,16 +48,15 @@ int animation_id, int group_id, TargetProperty target_property) { - return make_scoped_ptr(new Animation(curve.Pass(), - animation_id, - group_id, - target_property)); } + return make_scoped_ptr( + new Animation(std::move(curve), animation_id, group_id, target_property)); +} Animation::Animation(scoped_ptr<AnimationCurve> curve, int animation_id, int group_id, TargetProperty target_property) - : curve_(curve.Pass()), + : curve_(std::move(curve)), id_(animation_id), group_(group_id), target_property_(target_property), @@ -73,8 +72,7 @@ is_controlling_instance_(false), is_impl_only_(false), affects_active_observers_(true), - affects_pending_observers_(true) { -} + affects_pending_observers_(true) {} Animation::~Animation() { if (run_state_ == RUNNING || run_state_ == PAUSED) @@ -271,7 +269,7 @@ to_return->fill_mode_ = fill_mode_; DCHECK(!to_return->is_controlling_instance_); to_return->is_controlling_instance_ = true; - return to_return.Pass(); + return to_return; } void Animation::PushPropertiesTo(Animation* other) const {
diff --git a/cc/animation/animation_host.cc b/cc/animation/animation_host.cc index a5bf5ea..53027e24 100644 --- a/cc/animation/animation_host.cc +++ b/cc/animation/animation_host.cc
@@ -51,7 +51,7 @@ curve->SetInitialValue(current_offset); scoped_ptr<Animation> animation = Animation::Create( - curve.Pass(), AnimationIdProvider::NextAnimationId(), + std::move(curve), AnimationIdProvider::NextAnimationId(), AnimationIdProvider::NextGroupId(), Animation::SCROLL_OFFSET); animation->set_is_impl_only(true); @@ -64,7 +64,7 @@ scroll_offset_animation_player_->AttachLayer(layer_id); } - scroll_offset_animation_player_->AddAnimation(animation.Pass()); + scroll_offset_animation_player_->AddAnimation(std::move(animation)); } bool ScrollAnimationUpdateTarget(int layer_id, @@ -208,7 +208,7 @@ element_animations = new_element_animations.get(); layer_to_element_animations_map_.add(layer_id, - new_element_animations.Pass()); + std::move(new_element_animations)); element_animations->CreateLayerAnimationController(layer_id); } @@ -354,7 +354,7 @@ void AnimationHost::SetAnimationEvents( scoped_ptr<AnimationEventsVector> events) { - return animation_registrar_->SetAnimationEvents(events.Pass()); + return animation_registrar_->SetAnimationEvents(std::move(events)); } bool AnimationHost::ScrollOffsetAnimationWasInterrupted(int layer_id) const {
diff --git a/cc/animation/animation_player.cc b/cc/animation/animation_player.cc index 86a29efe..fb1b8997 100644 --- a/cc/animation/animation_player.cc +++ b/cc/animation/animation_player.cc
@@ -125,10 +125,10 @@ if (element_animations_) { element_animations_->layer_animation_controller()->AddAnimation( - animation.Pass()); + std::move(animation)); SetNeedsCommit(); } else { - animations_.push_back(animation.Pass()); + animations_.push_back(std::move(animation)); } }
diff --git a/cc/animation/animation_unittest.cc b/cc/animation/animation_unittest.cc index 9345c6b1..5a08912 100644 --- a/cc/animation/animation_unittest.cc +++ b/cc/animation/animation_unittest.cc
@@ -26,7 +26,7 @@ 0, 1, Animation::OPACITY)); to_return->set_iterations(iterations); to_return->set_playback_rate(playback_rate); - return to_return.Pass(); + return to_return; } scoped_ptr<Animation> CreateAnimation(double iterations, double duration) {
diff --git a/cc/animation/keyframed_animation_curve.cc b/cc/animation/keyframed_animation_curve.cc index 7e62a4f..0d74135 100644 --- a/cc/animation/keyframed_animation_curve.cc +++ b/cc/animation/keyframed_animation_curve.cc
@@ -21,13 +21,13 @@ if (!keyframes->empty() && keyframe->Time() < keyframes->back()->Time()) { for (size_t i = 0; i < keyframes->size(); ++i) { if (keyframe->Time() < keyframes->at(i)->Time()) { - keyframes->insert(keyframes->begin() + i, keyframe.Pass()); + keyframes->insert(keyframes->begin() + i, std::move(keyframe)); return; } } } - keyframes->push_back(keyframe.Pass()); + keyframes->push_back(std::move(keyframe)); } template <typename KeyframeType> @@ -81,8 +81,7 @@ Keyframe::Keyframe(base::TimeDelta time, scoped_ptr<TimingFunction> timing_function) - : time_(time), timing_function_(timing_function.Pass()) { -} + : time_(time), timing_function_(std::move(timing_function)) {} Keyframe::~Keyframe() {} @@ -95,14 +94,13 @@ SkColor value, scoped_ptr<TimingFunction> timing_function) { return make_scoped_ptr( - new ColorKeyframe(time, value, timing_function.Pass())); + new ColorKeyframe(time, value, std::move(timing_function))); } ColorKeyframe::ColorKeyframe(base::TimeDelta time, SkColor value, scoped_ptr<TimingFunction> timing_function) - : Keyframe(time, timing_function.Pass()), value_(value) { -} + : Keyframe(time, std::move(timing_function)), value_(value) {} ColorKeyframe::~ColorKeyframe() {} @@ -112,7 +110,7 @@ scoped_ptr<TimingFunction> func; if (timing_function()) func = timing_function()->Clone(); - return ColorKeyframe::Create(Time(), Value(), func.Pass()); + return ColorKeyframe::Create(Time(), Value(), std::move(func)); } scoped_ptr<FloatKeyframe> FloatKeyframe::Create( @@ -120,14 +118,13 @@ float value, scoped_ptr<TimingFunction> timing_function) { return make_scoped_ptr( - new FloatKeyframe(time, value, timing_function.Pass())); + new FloatKeyframe(time, value, std::move(timing_function))); } FloatKeyframe::FloatKeyframe(base::TimeDelta time, float value, scoped_ptr<TimingFunction> timing_function) - : Keyframe(time, timing_function.Pass()), value_(value) { -} + : Keyframe(time, std::move(timing_function)), value_(value) {} FloatKeyframe::~FloatKeyframe() {} @@ -139,7 +136,7 @@ scoped_ptr<TimingFunction> func; if (timing_function()) func = timing_function()->Clone(); - return FloatKeyframe::Create(Time(), Value(), func.Pass()); + return FloatKeyframe::Create(Time(), Value(), std::move(func)); } scoped_ptr<TransformKeyframe> TransformKeyframe::Create( @@ -147,14 +144,13 @@ const TransformOperations& value, scoped_ptr<TimingFunction> timing_function) { return make_scoped_ptr( - new TransformKeyframe(time, value, timing_function.Pass())); + new TransformKeyframe(time, value, std::move(timing_function))); } TransformKeyframe::TransformKeyframe(base::TimeDelta time, const TransformOperations& value, scoped_ptr<TimingFunction> timing_function) - : Keyframe(time, timing_function.Pass()), value_(value) { -} + : Keyframe(time, std::move(timing_function)), value_(value) {} TransformKeyframe::~TransformKeyframe() {} @@ -166,7 +162,7 @@ scoped_ptr<TimingFunction> func; if (timing_function()) func = timing_function()->Clone(); - return TransformKeyframe::Create(Time(), Value(), func.Pass()); + return TransformKeyframe::Create(Time(), Value(), std::move(func)); } scoped_ptr<FilterKeyframe> FilterKeyframe::Create( @@ -174,14 +170,13 @@ const FilterOperations& value, scoped_ptr<TimingFunction> timing_function) { return make_scoped_ptr( - new FilterKeyframe(time, value, timing_function.Pass())); + new FilterKeyframe(time, value, std::move(timing_function))); } FilterKeyframe::FilterKeyframe(base::TimeDelta time, const FilterOperations& value, scoped_ptr<TimingFunction> timing_function) - : Keyframe(time, timing_function.Pass()), value_(value) { -} + : Keyframe(time, std::move(timing_function)), value_(value) {} FilterKeyframe::~FilterKeyframe() {} @@ -193,7 +188,7 @@ scoped_ptr<TimingFunction> func; if (timing_function()) func = timing_function()->Clone(); - return FilterKeyframe::Create(Time(), Value(), func.Pass()); + return FilterKeyframe::Create(Time(), Value(), std::move(func)); } scoped_ptr<KeyframedColorAnimationCurve> KeyframedColorAnimationCurve:: @@ -207,7 +202,7 @@ void KeyframedColorAnimationCurve::AddKeyframe( scoped_ptr<ColorKeyframe> keyframe) { - InsertKeyframe(keyframe.Pass(), &keyframes_); + InsertKeyframe(std::move(keyframe), &keyframes_); } base::TimeDelta KeyframedColorAnimationCurve::Duration() const { @@ -223,7 +218,7 @@ if (timing_function_) to_return->SetTimingFunction(timing_function_->Clone()); - return to_return.Pass(); + return std::move(to_return); } SkColor KeyframedColorAnimationCurve::GetValue(base::TimeDelta t) const { @@ -254,7 +249,7 @@ void KeyframedFloatAnimationCurve::AddKeyframe( scoped_ptr<FloatKeyframe> keyframe) { - InsertKeyframe(keyframe.Pass(), &keyframes_); + InsertKeyframe(std::move(keyframe), &keyframes_); } base::TimeDelta KeyframedFloatAnimationCurve::Duration() const { @@ -270,7 +265,7 @@ if (timing_function_) to_return->SetTimingFunction(timing_function_->Clone()); - return to_return.Pass(); + return std::move(to_return); } float KeyframedFloatAnimationCurve::GetValue(base::TimeDelta t) const { @@ -299,7 +294,7 @@ void KeyframedTransformAnimationCurve::AddKeyframe( scoped_ptr<TransformKeyframe> keyframe) { - InsertKeyframe(keyframe.Pass(), &keyframes_); + InsertKeyframe(std::move(keyframe), &keyframes_); } base::TimeDelta KeyframedTransformAnimationCurve::Duration() const { @@ -315,7 +310,7 @@ if (timing_function_) to_return->SetTimingFunction(timing_function_->Clone()); - return to_return.Pass(); + return std::move(to_return); } gfx::Transform KeyframedTransformAnimationCurve::GetValue( @@ -439,7 +434,7 @@ void KeyframedFilterAnimationCurve::AddKeyframe( scoped_ptr<FilterKeyframe> keyframe) { - InsertKeyframe(keyframe.Pass(), &keyframes_); + InsertKeyframe(std::move(keyframe), &keyframes_); } base::TimeDelta KeyframedFilterAnimationCurve::Duration() const { @@ -455,7 +450,7 @@ if (timing_function_) to_return->SetTimingFunction(timing_function_->Clone()); - return to_return.Pass(); + return std::move(to_return); } FilterOperations KeyframedFilterAnimationCurve::GetValue(
diff --git a/cc/animation/keyframed_animation_curve.h b/cc/animation/keyframed_animation_curve.h index ddaaaf7..a589c76 100644 --- a/cc/animation/keyframed_animation_curve.h +++ b/cc/animation/keyframed_animation_curve.h
@@ -122,7 +122,7 @@ void AddKeyframe(scoped_ptr<ColorKeyframe> keyframe); void SetTimingFunction(scoped_ptr<TimingFunction> timing_function) { - timing_function_ = timing_function.Pass(); + timing_function_ = std::move(timing_function); } // AnimationCurve implementation @@ -152,7 +152,7 @@ void AddKeyframe(scoped_ptr<FloatKeyframe> keyframe); void SetTimingFunction(scoped_ptr<TimingFunction> timing_function) { - timing_function_ = timing_function.Pass(); + timing_function_ = std::move(timing_function); } // AnimationCurve implementation @@ -183,7 +183,7 @@ void AddKeyframe(scoped_ptr<TransformKeyframe> keyframe); void SetTimingFunction(scoped_ptr<TimingFunction> timing_function) { - timing_function_ = timing_function.Pass(); + timing_function_ = std::move(timing_function); } // AnimationCurve implementation @@ -223,7 +223,7 @@ void AddKeyframe(scoped_ptr<FilterKeyframe> keyframe); void SetTimingFunction(scoped_ptr<TimingFunction> timing_function) { - timing_function_ = timing_function.Pass(); + timing_function_ = std::move(timing_function); } // AnimationCurve implementation
diff --git a/cc/animation/layer_animation_controller.cc b/cc/animation/layer_animation_controller.cc index 9c66fabc..80ab9eb 100644 --- a/cc/animation/layer_animation_controller.cc +++ b/cc/animation/layer_animation_controller.cc
@@ -304,7 +304,7 @@ void LayerAnimationController::AddAnimation(scoped_ptr<Animation> animation) { bool added_transform_animation = animation->target_property() == Animation::TRANSFORM; - animations_.push_back(animation.Pass()); + animations_.push_back(std::move(animation)); needs_to_start_animations_ = true; UpdateActivation(NORMAL_ACTIVATION); if (added_transform_animation) @@ -708,7 +708,7 @@ animations_[i]->CloneAndInitialize(initial_run_state)); DCHECK(!to_add->needs_synchronized_start_time()); to_add->set_affects_active_observers(false); - controller_impl->AddAnimation(to_add.Pass()); + controller_impl->AddAnimation(std::move(to_add)); } }
diff --git a/cc/animation/layer_animation_controller_unittest.cc b/cc/animation/layer_animation_controller_unittest.cc index 8089ebf..45b2633 100644 --- a/cc/animation/layer_animation_controller_unittest.cc +++ b/cc/animation/layer_animation_controller_unittest.cc
@@ -36,7 +36,7 @@ scoped_ptr<Animation> CreateAnimation(scoped_ptr<AnimationCurve> curve, int group_id, Animation::TargetProperty property) { - return Animation::Create(curve.Pass(), 0, group_id, property); + return Animation::Create(std::move(curve), 0, group_id, property); } TEST(LayerAnimationControllerTest, SyncNewAnimation) { @@ -459,7 +459,7 @@ 1, Animation::OPACITY)); EXPECT_FALSE(controller->needs_to_start_animations_for_testing()); - controller->AddAnimation(to_add.Pass()); + controller->AddAnimation(std::move(to_add)); EXPECT_TRUE(controller->needs_to_start_animations_for_testing()); controller->Animate(kInitialTickTime); EXPECT_FALSE(controller->needs_to_start_animations_for_testing()); @@ -490,7 +490,7 @@ 1, Animation::OPACITY)); to_add->set_is_impl_only(true); - controller_impl->AddAnimation(to_add.Pass()); + controller_impl->AddAnimation(std::move(to_add)); controller_impl->Animate(kInitialTickTime); controller_impl->UpdateState(true, events.get()); EXPECT_TRUE(controller_impl->HasActiveAnimation()); @@ -536,9 +536,9 @@ base::TimeDelta::FromSecondsD(1.0), operations, nullptr)); scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), 1, 0, Animation::TRANSFORM)); + Animation::Create(std::move(curve), 1, 0, Animation::TRANSFORM)); animation->set_is_impl_only(true); - controller_impl->AddAnimation(animation.Pass()); + controller_impl->AddAnimation(std::move(animation)); // Run animation. controller_impl->Animate(kInitialTickTime); @@ -588,8 +588,8 @@ end_filters, nullptr)); scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), 1, 0, Animation::FILTER)); - controller->AddAnimation(animation.Pass()); + Animation::Create(std::move(curve), 1, 0, Animation::FILTER)); + controller->AddAnimation(std::move(animation)); controller->Animate(kInitialTickTime); controller->UpdateState(true, events.get()); @@ -637,9 +637,9 @@ end_filters, nullptr)); scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), 1, 0, Animation::FILTER)); + Animation::Create(std::move(curve), 1, 0, Animation::FILTER)); animation->set_is_impl_only(true); - controller_impl->AddAnimation(animation.Pass()); + controller_impl->AddAnimation(std::move(animation)); // Run animation. controller_impl->Animate(kInitialTickTime); @@ -690,9 +690,9 @@ EaseInOutTimingFunction::Create().Pass())); scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), 1, 0, Animation::SCROLL_OFFSET)); + Animation::Create(std::move(curve), 1, 0, Animation::SCROLL_OFFSET)); animation->set_needs_synchronized_start_time(true); - controller->AddAnimation(animation.Pass()); + controller->AddAnimation(std::move(animation)); dummy_provider_impl.set_scroll_offset(initial_value); controller->PushAnimationUpdatesTo(controller_impl.get()); @@ -769,9 +769,9 @@ EaseInOutTimingFunction::Create().Pass())); scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), 1, 0, Animation::SCROLL_OFFSET)); + Animation::Create(std::move(curve), 1, 0, Animation::SCROLL_OFFSET)); animation->set_needs_synchronized_start_time(true); - controller->AddAnimation(animation.Pass()); + controller->AddAnimation(std::move(animation)); dummy_provider.set_scroll_offset(initial_value); controller->PushAnimationUpdatesTo(controller_impl.get()); @@ -842,9 +842,9 @@ double duration_in_seconds = curve->Duration().InSecondsF(); scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), 1, 0, Animation::SCROLL_OFFSET)); + Animation::Create(std::move(curve), 1, 0, Animation::SCROLL_OFFSET)); animation->set_is_impl_only(true); - controller_impl->AddAnimation(animation.Pass()); + controller_impl->AddAnimation(std::move(animation)); controller_impl->Animate(kInitialTickTime); controller_impl->UpdateState(true, events.get()); @@ -896,9 +896,9 @@ int animation_id = 1; scoped_ptr<Animation> animation(Animation::Create( - curve.Pass(), animation_id, 0, Animation::SCROLL_OFFSET)); + std::move(curve), animation_id, 0, Animation::SCROLL_OFFSET)); animation->set_needs_synchronized_start_time(true); - controller->AddAnimation(animation.Pass()); + controller->AddAnimation(std::move(animation)); controller->PushAnimationUpdatesTo(controller_impl.get()); controller_impl->ActivateAnimations(); EXPECT_FALSE(controller->scroll_offset_animation_was_interrupted()); @@ -917,10 +917,10 @@ // Now, test the 2-argument version of RemoveAnimation. curve = ScrollOffsetAnimationCurve::Create( target_value, EaseInOutTimingFunction::Create().Pass()); - animation = Animation::Create(curve.Pass(), animation_id, 0, + animation = Animation::Create(std::move(curve), animation_id, 0, Animation::SCROLL_OFFSET); animation->set_needs_synchronized_start_time(true); - controller->AddAnimation(animation.Pass()); + controller->AddAnimation(std::move(animation)); controller->PushAnimationUpdatesTo(controller_impl.get()); controller_impl->ActivateAnimations(); EXPECT_FALSE(controller->scroll_offset_animation_was_interrupted()); @@ -1019,7 +1019,7 @@ scoped_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)).Pass(), 1, Animation::OPACITY)); to_add->set_is_impl_only(true); - controller_impl->AddAnimation(to_add.Pass()); + controller_impl->AddAnimation(std::move(to_add)); EXPECT_FALSE(delegate.started()); EXPECT_FALSE(delegate.finished()); @@ -1148,7 +1148,7 @@ // We should pause at the first keyframe indefinitely waiting for that // animation to start. - controller->AddAnimation(to_add.Pass()); + controller->AddAnimation(std::move(to_add)); controller->Animate(kInitialTickTime); controller->UpdateState(true, events.get()); EXPECT_TRUE(controller->HasActiveAnimation()); @@ -1236,7 +1236,7 @@ .Pass(), 2, Animation::OPACITY)); controller->AbortAnimations(Animation::OPACITY); - controller->AddAnimation(to_add.Pass()); + controller->AddAnimation(std::move(to_add)); // Since the previous animation was aborted, the new animation should start // right in this call to animate. @@ -1343,7 +1343,7 @@ scoped_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)).Pass(), 1, Animation::OPACITY)); to_add->set_iterations(3); - controller->AddAnimation(to_add.Pass()); + controller->AddAnimation(std::move(to_add)); controller->Animate(kInitialTickTime); controller->UpdateState(true, events.get()); @@ -1389,7 +1389,7 @@ scoped_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)).Pass(), 1, Animation::OPACITY)); to_add->set_iterations(-1); - controller->AddAnimation(to_add.Pass()); + controller->AddAnimation(std::move(to_add)); controller->Animate(kInitialTickTime); controller->UpdateState(true, events.get()); @@ -1529,7 +1529,7 @@ scoped_ptr<AnimationCurve>(new FakeFloatTransition(2.0, 0.f, 1.f)).Pass(), 0, Animation::OPACITY)); to_add->set_needs_synchronized_start_time(true); - controller->AddAnimation(to_add.Pass()); + controller->AddAnimation(std::move(to_add)); controller->Animate(kInitialTickTime); controller->UpdateState(true, events.get()); @@ -1560,7 +1560,7 @@ scoped_ptr<AnimationCurve>(new FakeTransformTransition(1)).Pass(), 1, Animation::TRANSFORM)); first_animation->set_is_controlling_instance_for_test(true); - controller->AddAnimation(first_animation.Pass()); + controller->AddAnimation(std::move(first_animation)); controller->Animate(kInitialTickTime); controller->UpdateState(true, events.get()); @@ -1569,7 +1569,7 @@ scoped_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)).Pass(), 2, Animation::OPACITY)); second_animation->set_is_controlling_instance_for_test(true); - controller->AddAnimation(second_animation.Pass()); + controller->AddAnimation(std::move(second_animation)); // Animate but don't UpdateState. controller->Animate(kInitialTickTime + TimeDelta::FromMilliseconds(1000)); @@ -1672,8 +1672,8 @@ base::TimeDelta::FromSecondsD(1.0), operations1, nullptr)); scoped_ptr<Animation> animation( - Animation::Create(curve1.Pass(), 1, 1, Animation::TRANSFORM)); - controller_impl->AddAnimation(animation.Pass()); + Animation::Create(std::move(curve1), 1, 1, Animation::TRANSFORM)); + controller_impl->AddAnimation(std::move(animation)); scoped_ptr<KeyframedTransformAnimationCurve> curve2( KeyframedTransformAnimationCurve::Create()); @@ -1685,8 +1685,8 @@ curve2->AddKeyframe(TransformKeyframe::Create( base::TimeDelta::FromSecondsD(1.0), operations2, nullptr)); - animation = Animation::Create(curve2.Pass(), 2, 2, Animation::TRANSFORM); - controller_impl->AddAnimation(animation.Pass()); + animation = Animation::Create(std::move(curve2), 2, 2, Animation::TRANSFORM); + controller_impl->AddAnimation(std::move(animation)); gfx::BoxF box(1.f, 2.f, -1.f, 3.f, 4.f, 5.f); gfx::BoxF bounds; @@ -1720,8 +1720,8 @@ operations3.AppendMatrix(transform3); curve3->AddKeyframe(TransformKeyframe::Create( base::TimeDelta::FromSecondsD(1.0), operations3, nullptr)); - animation = Animation::Create(curve3.Pass(), 3, 3, Animation::TRANSFORM); - controller_impl->AddAnimation(animation.Pass()); + animation = Animation::Create(std::move(curve3), 3, 3, Animation::TRANSFORM); + controller_impl->AddAnimation(std::move(animation)); EXPECT_FALSE(controller_impl->TransformAnimationBoundsForBox(box, &bounds)); } @@ -1875,13 +1875,13 @@ scoped_ptr<AnimationCurve>(new FakeTransformTransition(2.0)).Pass(), 1, group_id, Animation::TRANSFORM)); first_animation->set_is_controlling_instance_for_test(true); - controller_impl->AddAnimation(first_animation.Pass()); + controller_impl->AddAnimation(std::move(first_animation)); scoped_ptr<Animation> second_animation(Animation::Create( scoped_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)).Pass(), 2, group_id, Animation::OPACITY)); second_animation->set_is_controlling_instance_for_test(true); - controller_impl->AddAnimation(second_animation.Pass()); + controller_impl->AddAnimation(std::move(second_animation)); controller_impl->Animate(kInitialTickTime); controller_impl->UpdateState(true, events.get()); @@ -1930,13 +1930,13 @@ scoped_ptr<AnimationCurve>(new FakeTransformTransition(1.0)).Pass(), 1, Animation::TRANSFORM)); first_animation->set_is_controlling_instance_for_test(true); - controller_impl->AddAnimation(first_animation.Pass()); + controller_impl->AddAnimation(std::move(first_animation)); scoped_ptr<Animation> second_animation(CreateAnimation( scoped_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 0.f, 1.f)).Pass(), 1, Animation::OPACITY)); second_animation->set_is_controlling_instance_for_test(true); - controller_impl->AddAnimation(second_animation.Pass()); + controller_impl->AddAnimation(std::move(second_animation)); controller_impl->Animate(kInitialTickTime); controller_impl->UpdateState(true, events.get()); @@ -1986,8 +1986,8 @@ base::TimeDelta::FromSecondsD(1.0), operations1, nullptr)); scoped_ptr<Animation> animation( - Animation::Create(curve1.Pass(), 2, 2, Animation::TRANSFORM)); - controller_impl->AddAnimation(animation.Pass()); + Animation::Create(std::move(curve1), 2, 2, Animation::TRANSFORM)); + controller_impl->AddAnimation(std::move(animation)); // Translations don't affect scale. EXPECT_FALSE(controller_impl->HasAnimationThatAffectsScale()); @@ -2002,8 +2002,8 @@ curve2->AddKeyframe(TransformKeyframe::Create( base::TimeDelta::FromSecondsD(1.0), operations2, nullptr)); - animation = Animation::Create(curve2.Pass(), 3, 3, Animation::TRANSFORM); - controller_impl->AddAnimation(animation.Pass()); + animation = Animation::Create(std::move(curve2), 3, 3, Animation::TRANSFORM); + controller_impl->AddAnimation(std::move(animation)); EXPECT_TRUE(controller_impl->HasAnimationThatAffectsScale()); @@ -2045,8 +2045,8 @@ base::TimeDelta::FromSecondsD(1.0), operations1, nullptr)); scoped_ptr<Animation> animation( - Animation::Create(curve1.Pass(), 2, 2, Animation::TRANSFORM)); - controller_impl->AddAnimation(animation.Pass()); + Animation::Create(std::move(curve1), 2, 2, Animation::TRANSFORM)); + controller_impl->AddAnimation(std::move(animation)); // The only transform animation we've added is a translation. EXPECT_TRUE(controller_impl->HasOnlyTranslationTransforms( @@ -2064,9 +2064,9 @@ curve2->AddKeyframe(TransformKeyframe::Create( base::TimeDelta::FromSecondsD(1.0), operations2, nullptr)); - animation = Animation::Create(curve2.Pass(), 3, 3, Animation::TRANSFORM); + animation = Animation::Create(std::move(curve2), 3, 3, Animation::TRANSFORM); animation->set_affects_active_observers(false); - controller_impl->AddAnimation(animation.Pass()); + controller_impl->AddAnimation(std::move(animation)); // A scale animation is not a translation. EXPECT_FALSE(controller_impl->HasOnlyTranslationTransforms( @@ -2111,9 +2111,9 @@ curve1->AddKeyframe(TransformKeyframe::Create( base::TimeDelta::FromSecondsD(1.0), operations2, nullptr)); scoped_ptr<Animation> animation( - Animation::Create(curve1.Pass(), 1, 1, Animation::TRANSFORM)); + Animation::Create(std::move(curve1), 1, 1, Animation::TRANSFORM)); animation->set_affects_active_observers(false); - controller_impl->AddAnimation(animation.Pass()); + controller_impl->AddAnimation(std::move(animation)); float start_scale = 0.f; EXPECT_TRUE(controller_impl->AnimationStartScale( @@ -2142,12 +2142,12 @@ base::TimeDelta::FromSecondsD(1.0), operations3, nullptr)); controller_impl->RemoveAnimation(1); - animation = Animation::Create(curve2.Pass(), 2, 2, Animation::TRANSFORM); + animation = Animation::Create(std::move(curve2), 2, 2, Animation::TRANSFORM); // Reverse Direction animation->set_direction(Animation::DIRECTION_REVERSE); animation->set_affects_active_observers(false); - controller_impl->AddAnimation(animation.Pass()); + controller_impl->AddAnimation(std::move(animation)); scoped_ptr<KeyframedTransformAnimationCurve> curve3( KeyframedTransformAnimationCurve::Create()); @@ -2160,9 +2160,9 @@ curve3->AddKeyframe(TransformKeyframe::Create( base::TimeDelta::FromSecondsD(1.0), operations5, nullptr)); - animation = Animation::Create(curve3.Pass(), 3, 3, Animation::TRANSFORM); + animation = Animation::Create(std::move(curve3), 3, 3, Animation::TRANSFORM); animation->set_affects_active_observers(false); - controller_impl->AddAnimation(animation.Pass()); + controller_impl->AddAnimation(std::move(animation)); EXPECT_TRUE(controller_impl->AnimationStartScale( LayerAnimationController::ObserverType::PENDING, &start_scale)); @@ -2215,9 +2215,9 @@ base::TimeDelta::FromSecondsD(1.0), operations1, nullptr)); scoped_ptr<Animation> animation( - Animation::Create(curve1.Pass(), 1, 1, Animation::TRANSFORM)); + Animation::Create(std::move(curve1), 1, 1, Animation::TRANSFORM)); animation->set_affects_active_observers(false); - controller_impl->AddAnimation(animation.Pass()); + controller_impl->AddAnimation(std::move(animation)); EXPECT_TRUE(controller_impl->MaximumTargetScale( LayerAnimationController::ObserverType::PENDING, &max_scale)); @@ -2244,9 +2244,9 @@ curve2->AddKeyframe(TransformKeyframe::Create( base::TimeDelta::FromSecondsD(1.0), operations2, nullptr)); - animation = Animation::Create(curve2.Pass(), 2, 2, Animation::TRANSFORM); + animation = Animation::Create(std::move(curve2), 2, 2, Animation::TRANSFORM); animation->set_affects_active_observers(false); - controller_impl->AddAnimation(animation.Pass()); + controller_impl->AddAnimation(std::move(animation)); EXPECT_TRUE(controller_impl->MaximumTargetScale( LayerAnimationController::ObserverType::PENDING, &max_scale)); @@ -2273,9 +2273,9 @@ curve3->AddKeyframe(TransformKeyframe::Create( base::TimeDelta::FromSecondsD(1.0), operations3, nullptr)); - animation = Animation::Create(curve3.Pass(), 3, 3, Animation::TRANSFORM); + animation = Animation::Create(std::move(curve3), 3, 3, Animation::TRANSFORM); animation->set_affects_active_observers(false); - controller_impl->AddAnimation(animation.Pass()); + controller_impl->AddAnimation(std::move(animation)); EXPECT_FALSE(controller_impl->MaximumTargetScale( LayerAnimationController::ObserverType::PENDING, &max_scale)); @@ -2320,9 +2320,9 @@ base::TimeDelta::FromSecondsD(1.0), operations2, nullptr)); scoped_ptr<Animation> animation_owned( - Animation::Create(curve1.Pass(), 1, 1, Animation::TRANSFORM)); + Animation::Create(std::move(curve1), 1, 1, Animation::TRANSFORM)); Animation* animation = animation_owned.get(); - controller_impl->AddAnimation(animation_owned.Pass()); + controller_impl->AddAnimation(std::move(animation_owned)); float max_scale = 0.f; @@ -2819,7 +2819,7 @@ 1, Animation::OPACITY)); animation->set_affects_active_observers(false); - controller->AddAnimation(animation.Pass()); + controller->AddAnimation(std::move(animation)); controller->Animate(kInitialTickTime); EXPECT_TRUE(controller->IsCurrentlyAnimatingProperty( Animation::OPACITY, LayerAnimationController::ObserverType::PENDING)); @@ -2893,7 +2893,7 @@ animation->set_time_offset(TimeDelta::FromMilliseconds(-2000)); animation->set_affects_active_observers(false); - controller->AddAnimation(animation.Pass()); + controller->AddAnimation(std::move(animation)); controller->Animate(kInitialTickTime);
diff --git a/cc/animation/scroll_offset_animation_curve.cc b/cc/animation/scroll_offset_animation_curve.cc index 4a78c78..bb8d712 100644 --- a/cc/animation/scroll_offset_animation_curve.cc +++ b/cc/animation/scroll_offset_animation_curve.cc
@@ -60,7 +60,7 @@ scoped_ptr<TimingFunction> timing_function, DurationBehavior duration_behavior) { return make_scoped_ptr(new ScrollOffsetAnimationCurve( - target_value, timing_function.Pass(), duration_behavior)); + target_value, std::move(timing_function), duration_behavior)); } ScrollOffsetAnimationCurve::ScrollOffsetAnimationCurve( @@ -68,7 +68,7 @@ scoped_ptr<TimingFunction> timing_function, DurationBehavior duration_behavior) : target_value_(target_value), - timing_function_(timing_function.Pass()), + timing_function_(std::move(timing_function)), duration_behavior_(duration_behavior) {} ScrollOffsetAnimationCurve::~ScrollOffsetAnimationCurve() {} @@ -111,11 +111,11 @@ scoped_ptr<TimingFunction> timing_function( static_cast<TimingFunction*>(timing_function_->Clone().release())); scoped_ptr<ScrollOffsetAnimationCurve> curve_clone = - Create(target_value_, timing_function.Pass(), duration_behavior_); + Create(target_value_, std::move(timing_function), duration_behavior_); curve_clone->initial_value_ = initial_value_; curve_clone->total_animation_duration_ = total_animation_duration_; curve_clone->last_retarget_ = last_retarget_; - return curve_clone.Pass(); + return std::move(curve_clone); } void ScrollOffsetAnimationCurve::UpdateTarget(
diff --git a/cc/animation/scrollbar_animation_controller_linear_fade_unittest.cc b/cc/animation/scrollbar_animation_controller_linear_fade_unittest.cc index aa9b74fa..8231c9dd 100644 --- a/cc/animation/scrollbar_animation_controller_linear_fade_unittest.cc +++ b/cc/animation/scrollbar_animation_controller_linear_fade_unittest.cc
@@ -62,7 +62,7 @@ clip_layer_ = LayerImpl::Create(host_impl_.active_tree(), 3); scroll_layer->SetScrollClipLayer(clip_layer_->id()); LayerImpl* scroll_layer_ptr = scroll_layer.get(); - clip_layer_->AddChild(scroll_layer.Pass()); + clip_layer_->AddChild(std::move(scroll_layer)); scrollbar_layer_->SetScrollLayerId(scroll_layer_ptr->id()); clip_layer_->SetBounds(gfx::Size(100, 100));
diff --git a/cc/animation/scrollbar_animation_controller_thinning_unittest.cc b/cc/animation/scrollbar_animation_controller_thinning_unittest.cc index e8f8f90..475b368 100644 --- a/cc/animation/scrollbar_animation_controller_thinning_unittest.cc +++ b/cc/animation/scrollbar_animation_controller_thinning_unittest.cc
@@ -47,7 +47,7 @@ clip_layer_ = LayerImpl::Create(host_impl_.active_tree(), 3); scroll_layer->SetScrollClipLayer(clip_layer_->id()); LayerImpl* scroll_layer_ptr = scroll_layer.get(); - clip_layer_->AddChild(scroll_layer.Pass()); + clip_layer_->AddChild(std::move(scroll_layer)); const int kId = 2; const int kThumbThickness = 10;
diff --git a/cc/base/list_container_helper.cc b/cc/base/list_container_helper.cc index 3bfc4b2..ea30bad 100644 --- a/cc/base/list_container_helper.cc +++ b/cc/base/list_container_helper.cc
@@ -242,7 +242,7 @@ new_list->size = 0; new_list->step = element_size_; new_list->data.reset(new char[list_size * element_size_]); - storage_.push_back(new_list.Pass()); + storage_.push_back(std::move(new_list)); } std::vector<scoped_ptr<InnerList>> storage_;
diff --git a/cc/base/math_util.cc b/cc/base/math_util.cc index fa7eccfb..147b400 100644 --- a/cc/base/math_util.cc +++ b/cc/base/math_util.cc
@@ -709,7 +709,7 @@ scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); res->SetDouble("width", s.width()); res->SetDouble("height", s.height()); - return res.Pass(); + return std::move(res); } scoped_ptr<base::Value> MathUtil::AsValue(const gfx::Rect& r) { @@ -718,7 +718,7 @@ res->AppendInteger(r.y()); res->AppendInteger(r.width()); res->AppendInteger(r.height()); - return res.Pass(); + return std::move(res); } bool MathUtil::FromValue(const base::Value* raw_value, gfx::Rect* out_rect) { @@ -746,7 +746,7 @@ scoped_ptr<base::ListValue> res(new base::ListValue()); res->AppendDouble(pt.x()); res->AppendDouble(pt.y()); - return res.Pass(); + return std::move(res); } void MathUtil::AddToTracedValue(const char* name,
diff --git a/cc/base/region.cc b/cc/base/region.cc index c048c89..3030a17 100644 --- a/cc/base/region.cc +++ b/cc/base/region.cc
@@ -127,7 +127,7 @@ result->AppendInteger(rect.width()); result->AppendInteger(rect.height()); } - return result.Pass(); + return std::move(result); } void Region::AsValueInto(base::trace_event::TracedValue* result) const {
diff --git a/cc/blink/scrollbar_impl.cc b/cc/blink/scrollbar_impl.cc index e7c21b8a..7efd513 100644 --- a/cc/blink/scrollbar_impl.cc +++ b/cc/blink/scrollbar_impl.cc
@@ -16,10 +16,9 @@ scoped_ptr<WebScrollbar> scrollbar, blink::WebScrollbarThemePainter painter, scoped_ptr<blink::WebScrollbarThemeGeometry> geometry) - : scrollbar_(scrollbar.Pass()), + : scrollbar_(std::move(scrollbar)), painter_(painter), - geometry_(geometry.Pass()) { -} + geometry_(std::move(geometry)) {} ScrollbarImpl::~ScrollbarImpl() { }
diff --git a/cc/blink/web_animation_impl.cc b/cc/blink/web_animation_impl.cc index 705c33a9..85b851f 100644 --- a/cc/blink/web_animation_impl.cc +++ b/cc/blink/web_animation_impl.cc
@@ -60,9 +60,7 @@ } } animation_ = Animation::Create( - curve.Pass(), - animation_id, - group_id, + std::move(curve), animation_id, group_id, static_cast<cc::Animation::TargetProperty>(target_property)); } @@ -194,7 +192,7 @@ scoped_ptr<cc::Animation> WebCompositorAnimationImpl::PassAnimation() { animation_->set_needs_synchronized_start_time(true); - return animation_.Pass(); + return std::move(animation_); } } // namespace cc_blink
diff --git a/cc/blink/web_image_layer_impl.cc b/cc/blink/web_image_layer_impl.cc index efa4242..8654549b 100644 --- a/cc/blink/web_image_layer_impl.cc +++ b/cc/blink/web_image_layer_impl.cc
@@ -26,7 +26,7 @@ void WebImageLayerImpl::setImage(const SkImage* image) { skia::RefPtr<const SkImage> imageRef = skia::SharePtr(image); static_cast<cc::PictureImageLayer*>(layer_->layer()) - ->SetImage(imageRef.Pass()); + ->SetImage(std::move(imageRef)); static_cast<WebLayerImplFixedBounds*>(layer_.get()) ->SetFixedBounds(gfx::Size(image->width(), image->height())); }
diff --git a/cc/blink/web_layer_impl.cc b/cc/blink/web_layer_impl.cc index 829b55e..726cfa6 100644 --- a/cc/blink/web_layer_impl.cc +++ b/cc/blink/web_layer_impl.cc
@@ -21,6 +21,7 @@ #include "cc/blink/web_to_cc_animation_delegate_adapter.h" #include "cc/layers/layer.h" #include "cc/layers/layer_position_constraint.h" +#include "cc/layers/layer_settings.h" #include "cc/trees/layer_tree_host.h" #include "third_party/WebKit/public/platform/WebFloatPoint.h" #include "third_party/WebKit/public/platform/WebFloatRect.h"
diff --git a/cc/blink/web_layer_impl_fixed_bounds_unittest.cc b/cc/blink/web_layer_impl_fixed_bounds_unittest.cc index 65433fe..86b6d314 100644 --- a/cc/blink/web_layer_impl_fixed_bounds_unittest.cc +++ b/cc/blink/web_layer_impl_fixed_bounds_unittest.cc
@@ -4,6 +4,7 @@ #include <vector> #include "cc/blink/web_layer_impl_fixed_bounds.h" +#include "cc/layers/layer_settings.h" #include "cc/layers/picture_image_layer.h" #include "cc/test/fake_layer_tree_host.h" #include "cc/test/geometry_test_utils.h"
diff --git a/cc/cc.gyp b/cc/cc.gyp index ed1ffa9..709bfc1e 100644 --- a/cc/cc.gyp +++ b/cc/cc.gyp
@@ -200,6 +200,8 @@ 'layers/layer_position_constraint.h', 'layers/layer_proto_converter.cc', 'layers/layer_proto_converter.h', + 'layers/layer_settings.cc', + 'layers/layer_settings.h', 'layers/layer_utils.cc', 'layers/layer_utils.h', 'layers/nine_patch_layer.cc', @@ -551,6 +553,7 @@ 'trees/proxy_common.h', 'trees/proxy_impl.h', 'trees/proxy_main.h', + 'trees/remote_proto_channel.h', 'trees/scoped_abort_remaining_swap_promises.h', 'trees/single_thread_proxy.cc', 'trees/single_thread_proxy.h', @@ -582,6 +585,7 @@ 'target_name': 'cc_proto', 'type': '<(component)', 'sources': [ + 'proto/compositor_message.proto', 'proto/display_item.proto', 'proto/layer.proto', 'proto/point.proto',
diff --git a/cc/debug/frame_timing_tracker.cc b/cc/debug/frame_timing_tracker.cc index effd67a..e1e7258d 100644 --- a/cc/debug/frame_timing_tracker.cc +++ b/cc/debug/frame_timing_tracker.cc
@@ -91,7 +91,7 @@ return lhs.timestamp < rhs.timestamp; }); } - return composite_events_.Pass(); + return std::move(composite_events_); } scoped_ptr<FrameTimingTracker::MainFrameTimingSet> @@ -105,7 +105,7 @@ return lhs.timestamp < rhs.timestamp; }); } - return main_frame_events_.Pass(); + return std::move(main_frame_events_); } void FrameTimingTracker::PostEvents() {
diff --git a/cc/debug/micro_benchmark.cc b/cc/debug/micro_benchmark.cc index cf6e2698..8077718c 100644 --- a/cc/debug/micro_benchmark.cc +++ b/cc/debug/micro_benchmark.cc
@@ -29,7 +29,7 @@ void MicroBenchmark::DidUpdateLayers(LayerTreeHost* host) {} void MicroBenchmark::NotifyDone(scoped_ptr<base::Value> result) { - callback_.Run(result.Pass()); + callback_.Run(std::move(result)); is_done_ = true; }
diff --git a/cc/debug/micro_benchmark_controller.cc b/cc/debug/micro_benchmark_controller.cc index 5aace9b..78fa561 100644 --- a/cc/debug/micro_benchmark_controller.cc +++ b/cc/debug/micro_benchmark_controller.cc
@@ -27,12 +27,14 @@ scoped_ptr<base::Value> value, const MicroBenchmark::DoneCallback& callback) { if (name == "invalidation_benchmark") { - return make_scoped_ptr(new InvalidationBenchmark(value.Pass(), callback)); + return make_scoped_ptr( + new InvalidationBenchmark(std::move(value), callback)); } else if (name == "rasterize_and_record_benchmark") { return make_scoped_ptr( - new RasterizeAndRecordBenchmark(value.Pass(), callback)); + new RasterizeAndRecordBenchmark(std::move(value), callback)); } else if (name == "unittest_only_benchmark") { - return make_scoped_ptr(new UnittestOnlyBenchmark(value.Pass(), callback)); + return make_scoped_ptr( + new UnittestOnlyBenchmark(std::move(value), callback)); } return nullptr; } @@ -54,11 +56,11 @@ scoped_ptr<base::Value> value, const MicroBenchmark::DoneCallback& callback) { scoped_ptr<MicroBenchmark> benchmark = - CreateBenchmark(micro_benchmark_name, value.Pass(), callback); + CreateBenchmark(micro_benchmark_name, std::move(value), callback); if (benchmark.get()) { int id = GetNextIdAndIncrement(); benchmark->set_id(id); - benchmarks_.push_back(benchmark.Pass()); + benchmarks_.push_back(std::move(benchmark)); host_->SetNeedsCommit(); return id; } @@ -94,7 +96,7 @@ } if (benchmark_impl.get()) - host_impl->ScheduleMicroBenchmark(benchmark_impl.Pass()); + host_impl->ScheduleMicroBenchmark(std::move(benchmark_impl)); } }
diff --git a/cc/debug/micro_benchmark_controller_impl.cc b/cc/debug/micro_benchmark_controller_impl.cc index 31ff2c0..8d917d7 100644 --- a/cc/debug/micro_benchmark_controller_impl.cc +++ b/cc/debug/micro_benchmark_controller_impl.cc
@@ -22,7 +22,7 @@ void MicroBenchmarkControllerImpl::ScheduleRun( scoped_ptr<MicroBenchmarkImpl> benchmark) { - benchmarks_.push_back(benchmark.Pass()); + benchmarks_.push_back(std::move(benchmark)); } void MicroBenchmarkControllerImpl::DidCompleteCommit() {
diff --git a/cc/debug/micro_benchmark_controller_unittest.cc b/cc/debug/micro_benchmark_controller_unittest.cc index c7138cd..6494c866 100644 --- a/cc/debug/micro_benchmark_controller_unittest.cc +++ b/cc/debug/micro_benchmark_controller_unittest.cc
@@ -7,6 +7,7 @@ #include "cc/debug/micro_benchmark.h" #include "cc/debug/micro_benchmark_controller.h" #include "cc/layers/layer.h" +#include "cc/layers/layer_settings.h" #include "cc/test/fake_impl_task_runner_provider.h" #include "cc/test/fake_layer_tree_host.h" #include "cc/test/fake_layer_tree_host_impl.h" @@ -129,8 +130,7 @@ // Schedule a main thread benchmark. int id = layer_tree_host_->ScheduleMicroBenchmark( - "unittest_only_benchmark", - settings.Pass(), + "unittest_only_benchmark", std::move(settings), base::Bind(&IncrementCallCount, base::Unretained(&run_count))); EXPECT_GT(id, 0); @@ -152,7 +152,7 @@ scoped_ptr<base::DictionaryValue> message(new base::DictionaryValue); message->SetBoolean("can_handle", true); bool message_handled = - layer_tree_host_->SendMessageToMicroBenchmark(0, message.Pass()); + layer_tree_host_->SendMessageToMicroBenchmark(0, std::move(message)); EXPECT_FALSE(message_handled); // Schedule a benchmark @@ -167,14 +167,14 @@ message = make_scoped_ptr(new base::DictionaryValue); message->SetBoolean("can_handle", true); message_handled = - layer_tree_host_->SendMessageToMicroBenchmark(id, message.Pass()); + layer_tree_host_->SendMessageToMicroBenchmark(id, std::move(message)); EXPECT_TRUE(message_handled); // Send invalid message to valid benchmark message = make_scoped_ptr(new base::DictionaryValue); message->SetBoolean("can_handle", false); message_handled = - layer_tree_host_->SendMessageToMicroBenchmark(id, message.Pass()); + layer_tree_host_->SendMessageToMicroBenchmark(id, std::move(message)); EXPECT_FALSE(message_handled); }
diff --git a/cc/debug/micro_benchmark_impl.cc b/cc/debug/micro_benchmark_impl.cc index f20f32e..b7d59ae 100644 --- a/cc/debug/micro_benchmark_impl.cc +++ b/cc/debug/micro_benchmark_impl.cc
@@ -17,7 +17,7 @@ void RunCallback(const MicroBenchmarkImpl::DoneCallback& callback, scoped_ptr<base::Value> result) { - callback.Run(result.Pass()); + callback.Run(std::move(result)); } }
diff --git a/cc/debug/rasterize_and_record_benchmark.cc b/cc/debug/rasterize_and_record_benchmark.cc index 9083fe9..cb1c36a 100644 --- a/cc/debug/rasterize_and_record_benchmark.cc +++ b/cc/debug/rasterize_and_record_benchmark.cc
@@ -46,7 +46,7 @@ const MicroBenchmark::DoneCallback& callback) : MicroBenchmark(callback), record_repeat_count_(kDefaultRecordRepeatCount), - settings_(value.Pass()), + settings_(std::move(value)), main_thread_benchmark_done_(false), host_(nullptr), weak_ptr_factory_(this) { @@ -93,7 +93,7 @@ results_->MergeDictionary(results); - NotifyDone(results_.Pass()); + NotifyDone(std::move(results_)); } scoped_ptr<MicroBenchmarkImpl> RasterizeAndRecordBenchmark::CreateBenchmarkImpl(
diff --git a/cc/debug/rasterize_and_record_benchmark_impl.cc b/cc/debug/rasterize_and_record_benchmark_impl.cc index 305cbc5..2d649cc1 100644 --- a/cc/debug/rasterize_and_record_benchmark_impl.cc +++ b/cc/debug/rasterize_and_record_benchmark_impl.cc
@@ -148,7 +148,7 @@ result->SetInteger("total_picture_layers_off_screen", rasterize_results_.total_picture_layers_off_screen); - NotifyDone(result.Pass()); + NotifyDone(std::move(result)); } void RasterizeAndRecordBenchmarkImpl::RunOnLayer(PictureLayerImpl* layer) {
diff --git a/cc/debug/unittest_only_benchmark.cc b/cc/debug/unittest_only_benchmark.cc index 81158122..657c0f6 100644 --- a/cc/debug/unittest_only_benchmark.cc +++ b/cc/debug/unittest_only_benchmark.cc
@@ -49,7 +49,7 @@ } void UnittestOnlyBenchmark::RecordImplResults(scoped_ptr<base::Value> results) { - NotifyDone(results.Pass()); + NotifyDone(std::move(results)); } scoped_ptr<MicroBenchmarkImpl> UnittestOnlyBenchmark::CreateBenchmarkImpl(
diff --git a/cc/input/page_scale_animation.cc b/cc/input/page_scale_animation.cc index 1e29544..d66f60a5 100644 --- a/cc/input/page_scale_animation.cc +++ b/cc/input/page_scale_animation.cc
@@ -49,11 +49,9 @@ const gfx::SizeF& viewport_size, const gfx::SizeF& root_layer_size, scoped_ptr<TimingFunction> timing_function) { - return make_scoped_ptr(new PageScaleAnimation(start_scroll_offset, - start_page_scale_factor, - viewport_size, - root_layer_size, - timing_function.Pass())); + return make_scoped_ptr(new PageScaleAnimation( + start_scroll_offset, start_page_scale_factor, viewport_size, + root_layer_size, std::move(timing_function))); } PageScaleAnimation::PageScaleAnimation( @@ -69,8 +67,7 @@ target_anchor_(), viewport_size_(viewport_size), root_layer_size_(root_layer_size), - timing_function_(timing_function.Pass()) { -} + timing_function_(std::move(timing_function)) {} PageScaleAnimation::~PageScaleAnimation() {}
diff --git a/cc/layers/delegated_frame_provider.cc b/cc/layers/delegated_frame_provider.cc index 5d07cc4e..06b041f 100644 --- a/cc/layers/delegated_frame_provider.cc +++ b/cc/layers/delegated_frame_provider.cc
@@ -18,7 +18,7 @@ RenderPass* root_pass = frame->render_pass_list.back().get(); frame_size_ = root_pass->output_rect.size(); DCHECK(!frame_size_.IsEmpty()); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); } DelegatedFrameProvider::~DelegatedFrameProvider() { @@ -61,7 +61,7 @@ resource_collection_->UnrefResources(returned); } - frame_ = frame.Pass(); + frame_ = std::move(frame); resource_collection_->ReceivedResources(frame_->resource_list); resource_collection_->RefResources(frame_->resource_list);
diff --git a/cc/layers/delegated_frame_provider_unittest.cc b/cc/layers/delegated_frame_provider_unittest.cc index 4248899..5aa8ba3c 100644 --- a/cc/layers/delegated_frame_provider_unittest.cc +++ b/cc/layers/delegated_frame_provider_unittest.cc
@@ -3,8 +3,10 @@ // found in the LICENSE file. #include "cc/layers/delegated_frame_provider.h" + #include "cc/layers/delegated_frame_resource_collection.h" #include "cc/layers/delegated_renderer_layer.h" +#include "cc/layers/layer_settings.h" #include "cc/output/delegated_frame_data.h" #include "cc/quads/texture_draw_quad.h" #include "cc/resources/resource_provider.h" @@ -32,8 +34,8 @@ root_output_rect, root_damage_rect, gfx::Transform()); - frame->render_pass_list.push_back(root_pass.Pass()); - return frame.Pass(); + frame->render_pass_list.push_back(std::move(root_pass)); + return frame; } void AddTransferableResource(DelegatedFrameData* frame, @@ -84,7 +86,7 @@ void SetFrameProvider(scoped_ptr<DelegatedFrameData> frame_data) { frame_provider_ = - new DelegatedFrameProvider(resource_collection_, frame_data.Pass()); + new DelegatedFrameProvider(resource_collection_, std::move(frame_data)); } scoped_refptr<DelegatedFrameResourceCollection> resource_collection_; @@ -99,12 +101,12 @@ CreateFrameData(gfx::Rect(1, 1), gfx::Rect(1, 1)); AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameProvider(frame.Pass()); + SetFrameProvider(std::move(frame)); frame = CreateFrameData(gfx::Rect(1, 1), gfx::Rect(1, 1)); AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameProvider(frame.Pass()); + SetFrameProvider(std::move(frame)); EXPECT_FALSE(ReturnAndResetResourcesAvailable()); EXPECT_EQ(0u, resources_.size()); @@ -121,14 +123,14 @@ CreateFrameData(gfx::Rect(1, 1), gfx::Rect(1, 1)); AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameProvider(frame.Pass()); + SetFrameProvider(std::move(frame)); EXPECT_FALSE(ReturnAndResetResourcesAvailable()); frame = CreateFrameData(gfx::Rect(1, 1), gfx::Rect(1, 1)); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameProvider(frame.Pass()); + SetFrameProvider(std::move(frame)); EXPECT_TRUE(ReturnAndResetResourcesAvailable()); EXPECT_EQ(1u, resources_.size()); @@ -152,7 +154,7 @@ ReturnedResourceArray returned; TransferableResource::ReturnResources(reffed, &returned); - SetFrameProvider(frame.Pass()); + SetFrameProvider(std::move(frame)); scoped_refptr<DelegatedRendererLayer> observer1 = DelegatedRendererLayer::Create(layer_settings_, frame_provider_); @@ -179,7 +181,7 @@ frame = CreateFrameData(gfx::Rect(5, 5), gfx::Rect(2, 2)); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - frame_provider_->SetFrameData(frame.Pass()); + frame_provider_->SetFrameData(std::move(frame)); // The resources from the first frame are still reffed by the observers. EXPECT_FALSE(ReturnAndResetResourcesAvailable()); @@ -210,7 +212,7 @@ ReturnedResourceArray returned; TransferableResource::ReturnResources(reffed, &returned); - SetFrameProvider(frame.Pass()); + SetFrameProvider(std::move(frame)); scoped_refptr<DelegatedRendererLayer> observer1 = DelegatedRendererLayer::Create(layer_settings_, frame_provider_); @@ -235,7 +237,7 @@ frame = CreateFrameData(gfx::Rect(5, 5), gfx::Rect(2, 2)); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - frame_provider_->SetFrameData(frame.Pass()); + frame_provider_->SetFrameData(std::move(frame)); EXPECT_TRUE(ReturnAndResetResourcesAvailable()); EXPECT_EQ(1u, resources_.size()); @@ -252,7 +254,7 @@ ReturnedResourceArray returned; TransferableResource::ReturnResources(reffed, &returned); - SetFrameProvider(frame.Pass()); + SetFrameProvider(std::move(frame)); scoped_refptr<DelegatedRendererLayer> observer1 = DelegatedRendererLayer::Create(layer_settings_, frame_provider_); @@ -296,7 +298,7 @@ ReturnedResourceArray returned; TransferableResource::ReturnResources(reffed, &returned); - SetFrameProvider(frame.Pass()); + SetFrameProvider(std::move(frame)); scoped_refptr<DelegatedRendererLayer> observer1 = DelegatedRendererLayer::Create(layer_settings_, frame_provider_); @@ -320,7 +322,7 @@ frame = CreateFrameData(gfx::Rect(5, 5), gfx::Rect(2, 2)); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - frame_provider_->SetFrameData(frame.Pass()); + frame_provider_->SetFrameData(std::move(frame)); // Both observers get the damage for the new frame. frame_provider_->GetFrameDataAndRefResources(observer1.get(), &damage); @@ -341,7 +343,7 @@ TransferableResourceArray reffed = frame->resource_list; - SetFrameProvider(frame.Pass()); + SetFrameProvider(std::move(frame)); // There is nothing to lose. EXPECT_FALSE(ReturnAndResetResourcesAvailable()); @@ -356,14 +358,14 @@ AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameProvider(frame.Pass()); + SetFrameProvider(std::move(frame)); // Add a second reference on the resource. frame = CreateFrameData(gfx::Rect(5, 5), gfx::Rect(5, 5)); AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameProvider(frame.Pass()); + SetFrameProvider(std::move(frame)); // There is something to lose. EXPECT_FALSE(ReturnAndResetResourcesAvailable()); @@ -380,7 +382,7 @@ CreateFrameData(gfx::Rect(1, 1), gfx::Rect(1, 1)); AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameProvider(frame.Pass()); + SetFrameProvider(std::move(frame)); EXPECT_FALSE(ReturnAndResetResourcesAvailable());
diff --git a/cc/layers/delegated_renderer_layer_impl.cc b/cc/layers/delegated_renderer_layer_impl.cc index 7a5b622c..ca735d0b 100644 --- a/cc/layers/delegated_renderer_layer_impl.cc +++ b/cc/layers/delegated_renderer_layer_impl.cc
@@ -175,12 +175,12 @@ RenderPassList* render_passes_in_draw_order) { ClearRenderPasses(); - for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) { - RenderPassList::iterator to_take = - render_passes_in_draw_order->begin() + i; + size_t i = 0; + for (auto& render_pass : *render_passes_in_draw_order) { render_passes_index_by_id_.insert( - RenderPassToIndexMap::value_type((*to_take)->id, i)); - render_passes_in_draw_order_.push_back(to_take->Pass()); + RenderPassToIndexMap::value_type(render_pass->id, i)); + render_passes_in_draw_order_.push_back(std::move(render_pass)); + ++i; } // Give back an empty array instead of nulls. @@ -265,7 +265,7 @@ render_passes_in_draw_order_[i]->Copy(output_render_pass_id); copy_pass->transform_to_root_target.ConcatTransform( delegated_frame_to_root_transform); - render_pass_sink->AppendRenderPass(copy_pass.Pass()); + render_pass_sink->AppendRenderPass(std::move(copy_pass)); } }
diff --git a/cc/layers/delegated_renderer_layer_impl_unittest.cc b/cc/layers/delegated_renderer_layer_impl_unittest.cc index e14d2a48..2a93a8b 100644 --- a/cc/layers/delegated_renderer_layer_impl_unittest.cc +++ b/cc/layers/delegated_renderer_layer_impl_unittest.cc
@@ -118,13 +118,13 @@ // Force the delegated RenderPasses to come before the RenderPass from // layer_after. - layer_after->AddChild(delegated_renderer_layer.Pass()); - root_layer->AddChild(layer_after.Pass()); + layer_after->AddChild(std::move(delegated_renderer_layer)); + root_layer->AddChild(std::move(layer_after)); // Get the RenderPass generated by layer_before to come before the delegated // RenderPasses. - root_layer->AddChild(layer_before.Pass()); - host_impl_->active_tree()->SetRootLayer(root_layer.Pass()); + root_layer->AddChild(std::move(layer_before)); + host_impl_->active_tree()->SetRootLayer(std::move(root_layer)); } protected: @@ -174,9 +174,9 @@ fake_delegated_renderer_layer_impl = delegated_renderer_layer.get(); - root_layer->AddChild(delegated_renderer_layer.Pass()); + root_layer->AddChild(std::move(delegated_renderer_layer)); - host_impl_->active_tree()->SetRootLayer(root_layer.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root_layer)); LayerTreeHostImpl::FrameData frame; EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); @@ -253,9 +253,9 @@ fake_delegated_renderer_layer_impl = delegated_renderer_layer.get(); - root_layer->AddChild(delegated_renderer_layer.Pass()); + root_layer->AddChild(std::move(delegated_renderer_layer)); - host_impl_->pending_tree()->SetRootLayer(root_layer.Pass()); + host_impl_->pending_tree()->SetRootLayer(std::move(root_layer)); host_impl_->ActivateSyncTree(); LayerTreeHostImpl::FrameData frame; @@ -740,8 +740,8 @@ root_layer_ = root_layer.get(); delegated_renderer_layer_ = delegated_renderer_layer.get(); - root_layer->AddChild(delegated_renderer_layer.Pass()); - host_impl_->active_tree()->SetRootLayer(root_layer.Pass()); + root_layer->AddChild(std::move(delegated_renderer_layer)); + host_impl_->active_tree()->SetRootLayer(std::move(root_layer)); } void VerifyRenderPasses( @@ -1169,14 +1169,14 @@ origin_layer->SetPosition( gfx::PointF(-clip_origin.x(), -clip_origin.y())); - origin_layer->AddChild(delegated_renderer_layer.Pass()); - clip_layer->AddChild(origin_layer.Pass()); - root_layer->AddChild(clip_layer.Pass()); + origin_layer->AddChild(std::move(delegated_renderer_layer)); + clip_layer->AddChild(std::move(origin_layer)); + root_layer->AddChild(std::move(clip_layer)); } else { - root_layer->AddChild(delegated_renderer_layer.Pass()); + root_layer->AddChild(std::move(delegated_renderer_layer)); } - host_impl_->active_tree()->SetRootLayer(root_layer.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root_layer)); } protected:
diff --git a/cc/layers/delegated_renderer_layer_unittest.cc b/cc/layers/delegated_renderer_layer_unittest.cc index 85f0f2e..a7e9c9a1 100644 --- a/cc/layers/delegated_renderer_layer_unittest.cc +++ b/cc/layers/delegated_renderer_layer_unittest.cc
@@ -6,6 +6,7 @@ #include "cc/layers/delegated_frame_provider.h" #include "cc/layers/delegated_frame_resource_collection.h" +#include "cc/layers/layer_settings.h" #include "cc/layers/solid_color_layer.h" #include "cc/output/delegated_frame_data.h" #include "cc/test/fake_delegated_renderer_layer.h" @@ -43,9 +44,9 @@ root_pass->SetNew( RenderPassId(1, 1), gfx::Rect(1, 1), gfx::Rect(1, 1), gfx::Transform()); scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); - frame_data->render_pass_list.push_back(root_pass.Pass()); + frame_data->render_pass_list.push_back(std::move(root_pass)); resources_ = new DelegatedFrameResourceCollection; - provider_ = new DelegatedFrameProvider(resources_, frame_data.Pass()); + provider_ = new DelegatedFrameProvider(resources_, std::move(frame_data)); LayerSettings layer_settings; root_layer_ = SolidColorLayer::Create(layer_settings); layer_before_ = SolidColorLayer::Create(layer_settings);
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc index 964cbf4..b5ba909 100644 --- a/cc/layers/heads_up_display_layer_impl.cc +++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -103,7 +103,7 @@ resource->Allocate(internal_content_bounds_, ResourceProvider::TEXTURE_HINT_IMMUTABLE, resource_provider->best_texture_format()); - resources_.push_back(resource.Pass()); + resources_.push_back(std::move(resource)); } void HeadsUpDisplayLayerImpl::ReleaseUnmatchedSizeResources(
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc index 1c6d8997..68b34dff 100644 --- a/cc/layers/layer.cc +++ b/cc/layers/layer.cc
@@ -22,6 +22,7 @@ #include "cc/layers/layer_client.h" #include "cc/layers/layer_impl.h" #include "cc/layers/layer_proto_converter.h" +#include "cc/layers/layer_settings.h" #include "cc/layers/scrollbar_layer_interface.h" #include "cc/output/copy_output_request.h" #include "cc/output/copy_output_result.h" @@ -422,7 +423,7 @@ } if (request->IsEmpty()) return; - copy_requests_.push_back(request.Pass()); + copy_requests_.push_back(std::move(request)); if (had_no_copy_requests) { UpdateNumCopyRequestsForSubtree(1); } @@ -1161,7 +1162,7 @@ static void RunCopyCallbackOnMainThread(scoped_ptr<CopyOutputRequest> request, scoped_ptr<CopyOutputResult> result) { - request->SendResult(result.Pass()); + request->SendResult(std::move(result)); } static void PostCopyCallbackToMainThread( @@ -1309,7 +1310,7 @@ base::Bind(&PostCopyCallbackToMainThread, main_thread_task_runner, base::Passed(&original_request))); - main_thread_copy_requests.push_back(main_thread_request.Pass()); + main_thread_copy_requests.push_back(std::move(main_thread_request)); } if (!copy_requests_.empty() && layer_tree_host_) layer_tree_host_->property_trees()->needs_rebuild = true; @@ -1659,7 +1660,7 @@ UMA_HISTOGRAM_BOOLEAN("Renderer.AnimationAddedToOrphanLayer", !layer_tree_host_); - layer_animation_controller_->AddAnimation(animation.Pass()); + layer_animation_controller_->AddAnimation(std::move(animation)); SetNeedsCommit(); return true; }
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc index e0b7f44..38cebf6 100644 --- a/cc/layers/layer_impl.cc +++ b/cc/layers/layer_impl.cc
@@ -127,7 +127,7 @@ void LayerImpl::AddChild(scoped_ptr<LayerImpl> child) { child->SetParent(this); DCHECK_EQ(layer_tree_impl(), child->layer_tree_impl()); - children_.push_back(child.Pass()); + children_.push_back(std::move(child)); layer_tree_impl()->set_needs_update_draw_properties(); } @@ -1023,7 +1023,7 @@ return; } - mask_layer_ = mask_layer.Pass(); + mask_layer_ = std::move(mask_layer); mask_layer_id_ = new_layer_id; if (mask_layer_) mask_layer_->SetParent(this); @@ -1032,7 +1032,7 @@ scoped_ptr<LayerImpl> LayerImpl::TakeMaskLayer() { mask_layer_id_ = -1; - return mask_layer_.Pass(); + return std::move(mask_layer_); } void LayerImpl::SetReplicaLayer(scoped_ptr<LayerImpl> replica_layer) { @@ -1045,7 +1045,7 @@ return; } - replica_layer_ = replica_layer.Pass(); + replica_layer_ = std::move(replica_layer); replica_layer_id_ = new_layer_id; if (replica_layer_) replica_layer_->SetParent(this); @@ -1054,7 +1054,7 @@ scoped_ptr<LayerImpl> LayerImpl::TakeReplicaLayer() { replica_layer_id_ = -1; - return replica_layer_.Pass(); + return std::move(replica_layer_); } ScrollbarLayerImplBase* LayerImpl::ToScrollbarLayer() {
diff --git a/cc/layers/layer_impl_unittest.cc b/cc/layers/layer_impl_unittest.cc index 65691b4a..c5b6257 100644 --- a/cc/layers/layer_impl_unittest.cc +++ b/cc/layers/layer_impl_unittest.cc
@@ -99,7 +99,7 @@ scoped_ptr<LayerImpl> root_ptr = LayerImpl::Create(host_impl.active_tree(), 2); LayerImpl* root = root_ptr.get(); - root_clip->AddChild(root_ptr.Pass()); + root_clip->AddChild(std::move(root_ptr)); scoped_ptr<LayerImpl> scroll_parent = LayerImpl::Create(host_impl.active_tree(), 3); LayerImpl* scroll_child = LayerImpl::Create(host_impl.active_tree(), 4).get(); @@ -261,7 +261,7 @@ scoped_ptr<LayerImpl> layer_ptr = LayerImpl::Create(host_impl.active_tree(), 2); LayerImpl* layer = layer_ptr.get(); - root->AddChild(layer_ptr.Pass()); + root->AddChild(std::move(layer_ptr)); layer->SetScrollClipLayer(root->id()); host_impl.active_tree()->BuildPropertyTreesForTesting(); DCHECK(host_impl.CanDraw());
diff --git a/cc/layers/layer_iterator_unittest.cc b/cc/layers/layer_iterator_unittest.cc index 1d71b12..b775767 100644 --- a/cc/layers/layer_iterator_unittest.cc +++ b/cc/layers/layer_iterator_unittest.cc
@@ -130,13 +130,13 @@ TestLayerImpl* third_ptr = third.get(); TestLayerImpl* fourth_ptr = fourth.get(); - root_layer->AddChild(first.Pass()); - root_layer->AddChild(second.Pass()); - root_layer->AddChild(third.Pass()); - root_layer->AddChild(fourth.Pass()); + root_layer->AddChild(std::move(first)); + root_layer->AddChild(std::move(second)); + root_layer->AddChild(std::move(third)); + root_layer->AddChild(std::move(fourth)); root_layer->SetHasRenderSurface(true); - host_impl_.active_tree()->SetRootLayer(root_layer.Pass()); + host_impl_.active_tree()->SetRootLayer(std::move(root_layer)); LayerImplList render_surface_layer_list; LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( @@ -172,17 +172,17 @@ TestLayerImpl* root221_ptr = root221.get(); TestLayerImpl* root231_ptr = root231.get(); - root22->AddChild(root221.Pass()); - root23->AddChild(root231.Pass()); - root2->AddChild(root21.Pass()); - root2->AddChild(root22.Pass()); - root2->AddChild(root23.Pass()); - root_layer->AddChild(root1.Pass()); - root_layer->AddChild(root2.Pass()); - root_layer->AddChild(root3.Pass()); + root22->AddChild(std::move(root221)); + root23->AddChild(std::move(root231)); + root2->AddChild(std::move(root21)); + root2->AddChild(std::move(root22)); + root2->AddChild(std::move(root23)); + root_layer->AddChild(std::move(root1)); + root_layer->AddChild(std::move(root2)); + root_layer->AddChild(std::move(root3)); root_layer->SetHasRenderSurface(true); - host_impl_.active_tree()->SetRootLayer(root_layer.Pass()); + host_impl_.active_tree()->SetRootLayer(std::move(root_layer)); LayerImplList render_surface_layer_list; LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( @@ -223,20 +223,20 @@ TestLayerImpl* root231_ptr = root231.get(); root22->SetHasRenderSurface(true); - root22->AddChild(root221.Pass()); + root22->AddChild(std::move(root221)); root23->SetHasRenderSurface(true); - root23->AddChild(root231.Pass()); + root23->AddChild(std::move(root231)); root2->SetDrawsContent(false); root2->SetHasRenderSurface(true); - root2->AddChild(root21.Pass()); - root2->AddChild(root22.Pass()); - root2->AddChild(root23.Pass()); - root_layer->AddChild(root1.Pass()); - root_layer->AddChild(root2.Pass()); - root_layer->AddChild(root3.Pass()); + root2->AddChild(std::move(root21)); + root2->AddChild(std::move(root22)); + root2->AddChild(std::move(root23)); + root_layer->AddChild(std::move(root1)); + root_layer->AddChild(std::move(root2)); + root_layer->AddChild(std::move(root3)); root_layer->SetHasRenderSurface(true); - host_impl_.active_tree()->SetRootLayer(root_layer.Pass()); + host_impl_.active_tree()->SetRootLayer(std::move(root_layer)); LayerImplList render_surface_layer_list; LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
diff --git a/cc/layers/layer_perftest.cc b/cc/layers/layer_perftest.cc index 720b2c4..e27f0309 100644 --- a/cc/layers/layer_perftest.cc +++ b/cc/layers/layer_perftest.cc
@@ -6,6 +6,7 @@ #include "base/thread_task_runner_handle.h" #include "cc/debug/lap_timer.h" +#include "cc/layers/layer_settings.h" #include "cc/test/fake_impl_task_runner_provider.h" #include "cc/test/fake_layer_tree_host.h" #include "cc/test/fake_layer_tree_host_client.h"
diff --git a/cc/layers/layer_position_constraint_unittest.cc b/cc/layers/layer_position_constraint_unittest.cc index ace3b03e..5d61c01a 100644 --- a/cc/layers/layer_position_constraint_unittest.cc +++ b/cc/layers/layer_position_constraint_unittest.cc
@@ -8,6 +8,7 @@ #include "cc/layers/layer.h" #include "cc/layers/layer_impl.h" +#include "cc/layers/layer_settings.h" #include "cc/test/fake_layer_tree_host.h" #include "cc/test/fake_proxy.h" #include "cc/test/geometry_test_utils.h"
diff --git a/cc/layers/layer_proto_converter.cc b/cc/layers/layer_proto_converter.cc index 7644c7e..65e1b14 100644 --- a/cc/layers/layer_proto_converter.cc +++ b/cc/layers/layer_proto_converter.cc
@@ -6,6 +6,7 @@ #include "base/stl_util.h" #include "cc/layers/layer.h" +#include "cc/layers/layer_settings.h" #include "cc/proto/layer.pb.h" #include "cc/trees/layer_tree_host_common.h" #include "cc/trees/layer_tree_settings.h"
diff --git a/cc/layers/layer_proto_converter_unittest.cc b/cc/layers/layer_proto_converter_unittest.cc index 83f3fa1..1e5fa40 100644 --- a/cc/layers/layer_proto_converter_unittest.cc +++ b/cc/layers/layer_proto_converter_unittest.cc
@@ -5,6 +5,7 @@ #include "cc/layers/layer_proto_converter.h" #include "cc/layers/layer.h" +#include "cc/layers/layer_settings.h" #include "cc/proto/layer.pb.h" #include "cc/trees/layer_tree_settings.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/cc/layers/layer_settings.cc b/cc/layers/layer_settings.cc new file mode 100644 index 0000000..a608bdb --- /dev/null +++ b/cc/layers/layer_settings.cc
@@ -0,0 +1,13 @@ +// Copyright 2015 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 "cc/layers/layer_settings.h" + +namespace cc { + +LayerSettings::LayerSettings() : use_compositor_animation_timelines(false) {} + +LayerSettings::~LayerSettings() {} + +} // namespace cc
diff --git a/cc/layers/layer_settings.h b/cc/layers/layer_settings.h new file mode 100644 index 0000000..4f1ac3ac --- /dev/null +++ b/cc/layers/layer_settings.h
@@ -0,0 +1,22 @@ +// Copyright 2015 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. + +#ifndef CC_LAYERS_LAYER_SETTINGS_H_ +#define CC_LAYERS_LAYER_SETTINGS_H_ + +#include "cc/base/cc_export.h" + +namespace cc { + +class CC_EXPORT LayerSettings { + public: + LayerSettings(); + ~LayerSettings(); + + bool use_compositor_animation_timelines; +}; + +} // namespace cc + +#endif // CC_LAYERS_LAYER_SETTINGS_H_
diff --git a/cc/layers/layer_unittest.cc b/cc/layers/layer_unittest.cc index 8117de82..212dff1 100644 --- a/cc/layers/layer_unittest.cc +++ b/cc/layers/layer_unittest.cc
@@ -8,6 +8,7 @@ #include "cc/animation/keyframed_animation_curve.h" #include "cc/base/math_util.h" #include "cc/layers/layer_impl.h" +#include "cc/layers/layer_settings.h" #include "cc/output/copy_output_request.h" #include "cc/output/copy_output_result.h" #include "cc/proto/layer.pb.h" @@ -1153,9 +1154,9 @@ curve->AddKeyframe( FloatKeyframe::Create(base::TimeDelta::FromSecondsD(1.0), 0.7f, nullptr)); scoped_ptr<Animation> animation = - Animation::Create(curve.Pass(), 0, 0, Animation::OPACITY); + Animation::Create(std::move(curve), 0, 0, Animation::OPACITY); - return layer->AddAnimation(animation.Pass()); + return layer->AddAnimation(std::move(animation)); } TEST_F(LayerLayerTreeHostTest, ShouldNotAddAnimationWithoutAnimationRegistrar) { @@ -1274,11 +1275,11 @@ // layer does not abort either one. scoped_ptr<CopyOutputRequest> request = CopyOutputRequest::CreateRequest( base::Bind(&ReceiveCopyOutputResult, &result_count)); - layer->RequestCopyOfOutput(request.Pass()); + layer->RequestCopyOfOutput(std::move(request)); EXPECT_EQ(0, result_count); request = CopyOutputRequest::CreateRequest( base::Bind(&ReceiveCopyOutputResult, &result_count)); - layer->RequestCopyOfOutput(request.Pass()); + layer->RequestCopyOfOutput(std::move(request)); EXPECT_EQ(0, result_count); // When the layer is destroyed, expect both requests to be aborted. @@ -1295,27 +1296,28 @@ request = CopyOutputRequest::CreateRequest(base::Bind( &ReceiveCopyOutputResult, &did_receive_first_result_from_this_source)); request->set_source(this); - layer->RequestCopyOfOutput(request.Pass()); + layer->RequestCopyOfOutput(std::move(request)); EXPECT_EQ(0, did_receive_first_result_from_this_source); // Make a request from a different source. int did_receive_result_from_different_source = 0; request = CopyOutputRequest::CreateRequest(base::Bind( &ReceiveCopyOutputResult, &did_receive_result_from_different_source)); request->set_source(reinterpret_cast<void*>(0xdeadbee0)); - layer->RequestCopyOfOutput(request.Pass()); + layer->RequestCopyOfOutput(std::move(request)); EXPECT_EQ(0, did_receive_result_from_different_source); // Make a request without specifying the source. int did_receive_result_from_anonymous_source = 0; request = CopyOutputRequest::CreateRequest(base::Bind( &ReceiveCopyOutputResult, &did_receive_result_from_anonymous_source)); - layer->RequestCopyOfOutput(request.Pass()); + layer->RequestCopyOfOutput(std::move(request)); EXPECT_EQ(0, did_receive_result_from_anonymous_source); // Make the second request from |this| source. int did_receive_second_result_from_this_source = 0; request = CopyOutputRequest::CreateRequest(base::Bind( &ReceiveCopyOutputResult, &did_receive_second_result_from_this_source)); request->set_source(this); - layer->RequestCopyOfOutput(request.Pass()); // First request to be aborted. + layer->RequestCopyOfOutput( + std::move(request)); // First request to be aborted. EXPECT_EQ(1, did_receive_first_result_from_this_source); EXPECT_EQ(0, did_receive_result_from_different_source); EXPECT_EQ(0, did_receive_result_from_anonymous_source);
diff --git a/cc/layers/layer_utils_unittest.cc b/cc/layers/layer_utils_unittest.cc index 5459921..455632d1 100644 --- a/cc/layers/layer_utils_unittest.cc +++ b/cc/layers/layer_utils_unittest.cc
@@ -43,7 +43,7 @@ root->AddChild(LayerImpl::Create(host_impl->active_tree(), 2)); root->children()[0]->AddChild( LayerImpl::Create(host_impl->active_tree(), 3)); - return root.Pass(); + return root; } FakeImplTaskRunnerProvider task_runner_provider_;
diff --git a/cc/layers/nine_patch_layer_unittest.cc b/cc/layers/nine_patch_layer_unittest.cc index 75af3be0..5f14c091 100644 --- a/cc/layers/nine_patch_layer_unittest.cc +++ b/cc/layers/nine_patch_layer_unittest.cc
@@ -4,6 +4,7 @@ #include "cc/layers/nine_patch_layer.h" +#include "cc/layers/layer_settings.h" #include "cc/resources/resource_provider.h" #include "cc/resources/scoped_ui_resource.h" #include "cc/test/fake_layer_tree_host.h"
diff --git a/cc/layers/painted_scrollbar_layer.cc b/cc/layers/painted_scrollbar_layer.cc index 8ee3cb75..a0748501 100644 --- a/cc/layers/painted_scrollbar_layer.cc +++ b/cc/layers/painted_scrollbar_layer.cc
@@ -35,15 +35,15 @@ const LayerSettings& settings, scoped_ptr<Scrollbar> scrollbar, int scroll_layer_id) { - return make_scoped_refptr( - new PaintedScrollbarLayer(settings, scrollbar.Pass(), scroll_layer_id)); + return make_scoped_refptr(new PaintedScrollbarLayer( + settings, std::move(scrollbar), scroll_layer_id)); } PaintedScrollbarLayer::PaintedScrollbarLayer(const LayerSettings& settings, scoped_ptr<Scrollbar> scrollbar, int scroll_layer_id) : Layer(settings), - scrollbar_(scrollbar.Pass()), + scrollbar_(std::move(scrollbar)), scroll_layer_id_(scroll_layer_id), internal_contents_scale_(1.f), thumb_thickness_(scrollbar_->ThumbThickness()),
diff --git a/cc/layers/picture_image_layer.cc b/cc/layers/picture_image_layer.cc index f2caeaf..357190b 100644 --- a/cc/layers/picture_image_layer.cc +++ b/cc/layers/picture_image_layer.cc
@@ -44,7 +44,7 @@ if (image_.get() == image.get()) return; - image_ = image.Pass(); + image_ = std::move(image); UpdateDrawsContent(HasDrawableContent()); SetNeedsDisplay(); } @@ -80,7 +80,7 @@ skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecordingAsPicture()); auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>(); - item->SetNew(picture.Pass()); + item->SetNew(std::move(picture)); display_list->Finalize(); return display_list;
diff --git a/cc/layers/picture_image_layer_impl_unittest.cc b/cc/layers/picture_image_layer_impl_unittest.cc index 58d70043..b886e29 100644 --- a/cc/layers/picture_image_layer_impl_unittest.cc +++ b/cc/layers/picture_image_layer_impl_unittest.cc
@@ -133,7 +133,7 @@ EXPECT_EQ(1.f, pending_layer->tilings()->tiling_at(0)->contents_scale()); // Push to active layer. - host_impl_.pending_tree()->SetRootLayer(pending_layer.Pass()); + host_impl_.pending_tree()->SetRootLayer(std::move(pending_layer)); host_impl_.ActivateSyncTree(); TestablePictureImageLayerImpl* active_layer =
diff --git a/cc/layers/picture_image_layer_unittest.cc b/cc/layers/picture_image_layer_unittest.cc index f9379c6e..e5924ca9 100644 --- a/cc/layers/picture_image_layer_unittest.cc +++ b/cc/layers/picture_image_layer_unittest.cc
@@ -4,9 +4,9 @@ #include "cc/layers/picture_image_layer.h" +#include "cc/layers/layer_settings.h" #include "cc/playback/display_item.h" #include "cc/test/skia_common.h" -#include "cc/trees/layer_tree_settings.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColor.h" @@ -35,7 +35,7 @@ skia::RefPtr<const SkImage> image = skia::AdoptRef(image_surface->newImageSnapshot()); - layer->SetImage(image.Pass()); + layer->SetImage(std::move(image)); layer->SetBounds(gfx::Size(layer_rect.width(), layer_rect.height())); scoped_refptr<DisplayItemList> display_list =
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc index 0b92ff4..52559de2 100644 --- a/cc/layers/picture_layer.cc +++ b/cc/layers/picture_layer.cc
@@ -34,7 +34,7 @@ ContentLayerClient* client, scoped_ptr<DisplayListRecordingSource> source) : PictureLayer(settings, client) { - recording_source_ = source.Pass(); + recording_source_ = std::move(source); } PictureLayer::~PictureLayer() {
diff --git a/cc/layers/picture_layer_impl_perftest.cc b/cc/layers/picture_layer_impl_perftest.cc index 92f6282..9820c21 100644 --- a/cc/layers/picture_layer_impl_perftest.cc +++ b/cc/layers/picture_layer_impl_perftest.cc
@@ -67,7 +67,7 @@ raster_source); pending_layer->SetDrawsContent(true); pending_layer->SetHasRenderSurface(true); - pending_tree->SetRootLayer(pending_layer.Pass()); + pending_tree->SetRootLayer(std::move(pending_layer)); pending_layer_ = static_cast<FakePictureLayerImpl*>( host_impl_.pending_tree()->LayerById(7));
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc index fc81bb9..bbb2fb21 100644 --- a/cc/layers/picture_layer_impl_unittest.cc +++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -13,6 +13,7 @@ #include "base/thread_task_runner_handle.h" #include "cc/base/math_util.h" #include "cc/layers/append_quads_data.h" +#include "cc/layers/layer_settings.h" #include "cc/layers/picture_layer.h" #include "cc/quads/draw_quad.h" #include "cc/quads/tile_draw_quad.h" @@ -258,8 +259,8 @@ pending_layer->SetBounds(raster_source->GetSize()); pending_layer->SetRasterSourceOnPending(raster_source, invalidation); - pending_root->AddChild(pending_layer.Pass()); - pending_tree->SetRootLayer(pending_root.Pass()); + pending_root->AddChild(std::move(pending_layer)); + pending_tree->SetRootLayer(std::move(pending_root)); pending_layer_ = static_cast<FakePictureLayerImpl*>( host_impl_.pending_tree()->LayerById(id_)); @@ -1363,7 +1364,7 @@ host_impl_.pending_tree(), 3, valid_raster_source); mask_ptr->SetBounds(layer_bounds); mask_ptr->SetDrawsContent(true); - pending_layer_->SetMaskLayer(mask_ptr.Pass()); + pending_layer_->SetMaskLayer(std::move(mask_ptr)); pending_layer_->SetHasRenderSurface(true); RebuildPropertyTreesOnPendingTree(); @@ -1492,7 +1493,7 @@ host_impl_.pending_tree(), 3, valid_raster_source); mask_ptr->SetBounds(layer_bounds); mask_ptr->SetDrawsContent(true); - pending_layer_->SetMaskLayer(mask_ptr.Pass()); + pending_layer_->SetMaskLayer(std::move(mask_ptr)); pending_layer_->SetHasRenderSurface(true); RebuildPropertyTreesOnPendingTree(); @@ -1580,10 +1581,10 @@ context->set_max_texture_size(140); host_impl_.DidLoseOutputSurface(); scoped_ptr<OutputSurface> new_output_surface = - FakeOutputSurface::Create3d(context.Pass()); + FakeOutputSurface::Create3d(std::move(context)); host_impl_.SetVisible(true); host_impl_.InitializeRenderer(new_output_surface.get()); - output_surface_ = new_output_surface.Pass(); + output_surface_ = std::move(new_output_surface); SetupDrawPropertiesAndUpdateTiles(pending_layer_, 1.f, 1.f, 1.f, 1.f, 0.f, false); @@ -1620,10 +1621,10 @@ context->set_max_texture_size(140); host_impl_.DidLoseOutputSurface(); scoped_ptr<OutputSurface> new_output_surface = - FakeOutputSurface::Create3d(context.Pass()); + FakeOutputSurface::Create3d(std::move(context)); host_impl_.SetVisible(true); host_impl_.InitializeRenderer(new_output_surface.get()); - output_surface_ = new_output_surface.Pass(); + output_surface_ = std::move(new_output_surface); SetupDrawPropertiesAndUpdateTiles(active_layer_, 1.f, 1.f, 1.f, 1.f, 0.f, false); @@ -2287,7 +2288,7 @@ FakePictureLayerImpl::CreateWithRasterSource(pending_tree, id_, pending_raster_source); pending_layer->SetDrawsContent(true); - pending_tree->SetRootLayer(pending_layer.Pass()); + pending_tree->SetRootLayer(std::move(pending_layer)); pending_layer_ = static_cast<FakePictureLayerImpl*>( host_impl_.pending_tree()->LayerById(id_));
diff --git a/cc/layers/picture_layer_unittest.cc b/cc/layers/picture_layer_unittest.cc index 70855b4..ce1cb3d 100644 --- a/cc/layers/picture_layer_unittest.cc +++ b/cc/layers/picture_layer_unittest.cc
@@ -6,6 +6,7 @@ #include "base/thread_task_runner_handle.h" #include "cc/layers/content_layer_client.h" +#include "cc/layers/layer_settings.h" #include "cc/layers/picture_layer_impl.h" #include "cc/playback/display_item_list_settings.h" #include "cc/test/fake_display_list_recording_source.h" @@ -82,7 +83,7 @@ MockContentLayerClient client; scoped_refptr<FakePictureLayer> layer = FakePictureLayer::CreateWithRecordingSource( - LayerSettings(), &client, recording_source_owned.Pass()); + LayerSettings(), &client, std::move(recording_source_owned)); FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D); TestTaskGraphRunner task_graph_runner;
diff --git a/cc/layers/render_surface_impl.cc b/cc/layers/render_surface_impl.cc index 4e88bda..d9eeb842 100644 --- a/cc/layers/render_surface_impl.cc +++ b/cc/layers/render_surface_impl.cc
@@ -190,7 +190,7 @@ gfx::IntersectRects(content_rect_, damage_tracker_->current_damage_rect()), screen_space_transform_); - pass_sink->AppendRenderPass(pass.Pass()); + pass_sink->AppendRenderPass(std::move(pass)); } void RenderSurfaceImpl::AppendQuads(RenderPass* render_pass,
diff --git a/cc/layers/render_surface_unittest.cc b/cc/layers/render_surface_unittest.cc index b4990b1..a237bcb3 100644 --- a/cc/layers/render_surface_unittest.cc +++ b/cc/layers/render_surface_unittest.cc
@@ -101,7 +101,7 @@ owning_layer->SetBlendMode(blend_mode); RenderSurfaceImpl* render_surface = owning_layer->render_surface(); - root_layer->AddChild(owning_layer.Pass()); + root_layer->AddChild(std::move(owning_layer)); gfx::Rect content_rect(0, 0, 50, 50); gfx::Rect clip_rect(5, 5, 40, 40); @@ -138,7 +138,7 @@ class TestRenderPassSink : public RenderPassSink { public: void AppendRenderPass(scoped_ptr<RenderPass> render_pass) override { - render_passes_.push_back(render_pass.Pass()); + render_passes_.push_back(std::move(render_pass)); } const RenderPassList& RenderPasses() const { @@ -165,7 +165,7 @@ owning_layer->draw_properties().render_target = owning_layer.get(); RenderSurfaceImpl* render_surface = owning_layer->render_surface(); - root_layer->AddChild(owning_layer.Pass()); + root_layer->AddChild(std::move(owning_layer)); gfx::Rect content_rect(0, 0, 50, 50); gfx::Transform origin;
diff --git a/cc/layers/scrollbar_layer_unittest.cc b/cc/layers/scrollbar_layer_unittest.cc index 3ebf090..ce30ba0 100644 --- a/cc/layers/scrollbar_layer_unittest.cc +++ b/cc/layers/scrollbar_layer_unittest.cc
@@ -50,8 +50,8 @@ settings, scrollbar->Orientation(), thumb_thickness, track_start, kIsLeftSideVerticalScrollbar, child1->id()); } else { - child2 = - PaintedScrollbarLayer::Create(settings, scrollbar.Pass(), child1->id()); + child2 = PaintedScrollbarLayer::Create(settings, std::move(scrollbar), + child1->id()); } layer_tree_root->AddChild(child1); layer_tree_root->InsertChild(child2, reverse_order ? 0 : 1); @@ -149,8 +149,8 @@ // Create and attach a non-overlay scrollbar. scoped_ptr<Scrollbar> scrollbar(new FakeScrollbar); LayerImpl* layer_impl_tree_root = LayerImplForScrollAreaAndScrollbar( - layer_settings(), layer_tree_host_.get(), scrollbar.Pass(), false, false, - 0, 0); + layer_settings(), layer_tree_host_.get(), std::move(scrollbar), false, + false, 0, 0); PaintedScrollbarLayerImpl* scrollbar_layer_impl = static_cast<PaintedScrollbarLayerImpl*>( layer_impl_tree_root->children()[1].get()); @@ -166,8 +166,8 @@ scrollbar.reset(new FakeScrollbar(false, false, true)); layer_impl_tree_root = LayerImplForScrollAreaAndScrollbar( - layer_settings(), layer_tree_host_.get(), scrollbar.Pass(), false, false, - 0, 0); + layer_settings(), layer_tree_host_.get(), std::move(scrollbar), false, + false, 0, 0); scrollbar_layer_impl = static_cast<PaintedScrollbarLayerImpl*>( layer_impl_tree_root->children()[1].get()); @@ -184,7 +184,7 @@ scoped_refptr<Layer> scroll_layer = Layer::Create(layer_settings()); scoped_refptr<Layer> content_layer = Layer::Create(layer_settings()); scoped_refptr<Layer> scrollbar_layer = PaintedScrollbarLayer::Create( - layer_settings(), scrollbar.Pass(), layer_tree_root->id()); + layer_settings(), std::move(scrollbar), layer_tree_root->id()); // Choose bounds to give max_scroll_offset = (30, 50). layer_tree_root->SetBounds(gfx::Size(70, 150)); @@ -371,8 +371,8 @@ scoped_ptr<Scrollbar> scrollbar(new FakeScrollbar(false, true, true)); LayerImpl* layer_impl_tree_root = LayerImplForScrollAreaAndScrollbar( - layer_settings(), layer_tree_host_.get(), scrollbar.Pass(), false, true, - kThumbThickness, kTrackStart); + layer_settings(), layer_tree_host_.get(), std::move(scrollbar), false, + true, kThumbThickness, kTrackStart); ScrollbarLayerImplBase* scrollbar_layer_impl = static_cast<SolidColorScrollbarLayerImpl*>( layer_impl_tree_root->children()[1].get()); @@ -593,7 +593,7 @@ scoped_ptr<Scrollbar> scrollbar(new FakeScrollbar); scrollbar_layer_ = PaintedScrollbarLayer::Create( - layer_settings(), scrollbar.Pass(), scroll_layer_->id()); + layer_settings(), std::move(scrollbar), scroll_layer_->id()); scrollbar_layer_->SetScrollLayer(scroll_layer_->id()); scrollbar_layer_->SetLayerTreeHost(layer_tree_host()); scrollbar_layer_->SetBounds(bounds_); @@ -664,7 +664,7 @@ kTrackStart, kIsLeftSideVerticalScrollbar, layer_tree_root->id()); } else { scrollbar_layer = PaintedScrollbarLayer::Create( - layer_settings(), scrollbar.Pass(), layer_tree_root->id()); + layer_settings(), std::move(scrollbar), layer_tree_root->id()); } layer_tree_root->AddChild(content_layer); layer_tree_root->AddChild(scrollbar_layer);
diff --git a/cc/layers/solid_color_layer_impl_unittest.cc b/cc/layers/solid_color_layer_impl_unittest.cc index f81713b..3118114 100644 --- a/cc/layers/solid_color_layer_impl_unittest.cc +++ b/cc/layers/solid_color_layer_impl_unittest.cc
@@ -7,6 +7,7 @@ #include <vector> #include "cc/layers/append_quads_data.h" +#include "cc/layers/layer_settings.h" #include "cc/layers/solid_color_layer.h" #include "cc/quads/solid_color_draw_quad.h" #include "cc/test/fake_impl_task_runner_provider.h"
diff --git a/cc/layers/surface_layer.cc b/cc/layers/surface_layer.cc index e186230..8d46188 100644 --- a/cc/layers/surface_layer.cc +++ b/cc/layers/surface_layer.cc
@@ -112,7 +112,7 @@ DCHECK(!destroy_sequence_.is_null()); scoped_ptr<SatisfySwapPromise> satisfy( new SatisfySwapPromise(destroy_sequence_, satisfy_callback_)); - layer_tree_host()->QueueSwapPromise(satisfy.Pass()); + layer_tree_host()->QueueSwapPromise(std::move(satisfy)); destroy_sequence_ = SurfaceSequence(); }
diff --git a/cc/layers/texture_layer.cc b/cc/layers/texture_layer.cc index 5ddc8b66..952078d5 100644 --- a/cc/layers/texture_layer.cc +++ b/cc/layers/texture_layer.cc
@@ -128,7 +128,7 @@ // If we never commited the mailbox, we need to release it here. if (mailbox.IsValid()) { holder_ref_ = - TextureMailboxHolder::Create(mailbox, release_callback.Pass()); + TextureMailboxHolder::Create(mailbox, std::move(release_callback)); } else { holder_ref_ = nullptr; } @@ -150,8 +150,8 @@ scoped_ptr<SingleReleaseCallback> release_callback) { bool requires_commit = true; bool allow_mailbox_reuse = false; - SetTextureMailboxInternal( - mailbox, release_callback.Pass(), requires_commit, allow_mailbox_reuse); + SetTextureMailboxInternal(mailbox, std::move(release_callback), + requires_commit, allow_mailbox_reuse); } static void IgnoreReleaseCallback(const gpu::SyncToken& sync_token, bool lost) { @@ -170,8 +170,8 @@ bool allow_mailbox_reuse = true; if (mailbox.IsValid()) release = SingleReleaseCallback::Create(base::Bind(&IgnoreReleaseCallback)); - SetTextureMailboxInternal( - mailbox, release.Pass(), requires_commit, allow_mailbox_reuse); + SetTextureMailboxInternal(mailbox, std::move(release), requires_commit, + allow_mailbox_reuse); } void TextureLayer::SetNeedsDisplayRect(const gfx::Rect& dirty_rect) { @@ -212,10 +212,8 @@ // Already within a commit, no need to do another one immediately. bool requires_commit = false; bool allow_mailbox_reuse = false; - SetTextureMailboxInternal(mailbox, - release_callback.Pass(), - requires_commit, - allow_mailbox_reuse); + SetTextureMailboxInternal(mailbox, std::move(release_callback), + requires_commit, allow_mailbox_reuse); updated = true; } } @@ -246,7 +244,7 @@ release_callback_impl = holder->GetCallbackForImplThread(); } texture_layer->SetTextureMailbox(texture_mailbox, - release_callback_impl.Pass()); + std::move(release_callback_impl)); needs_set_mailbox_ = false; } } @@ -267,7 +265,7 @@ scoped_ptr<SingleReleaseCallback> release_callback) : internal_references_(0), mailbox_(mailbox), - release_callback_(release_callback.Pass()), + release_callback_(std::move(release_callback)), sync_token_(mailbox.sync_token()), is_lost_(false) {} @@ -280,7 +278,7 @@ const TextureMailbox& mailbox, scoped_ptr<SingleReleaseCallback> release_callback) { return make_scoped_ptr(new MainThreadReference( - new TextureMailboxHolder(mailbox, release_callback.Pass()))); + new TextureMailboxHolder(mailbox, std::move(release_callback)))); } void TextureLayer::TextureMailboxHolder::Return(
diff --git a/cc/layers/texture_layer_impl.cc b/cc/layers/texture_layer_impl.cc index 8433df2..295faf41 100644 --- a/cc/layers/texture_layer_impl.cc +++ b/cc/layers/texture_layer_impl.cc
@@ -42,7 +42,7 @@ DCHECK_EQ(mailbox.IsValid(), !!release_callback); FreeTextureMailbox(); texture_mailbox_ = mailbox; - release_callback_ = release_callback.Pass(); + release_callback_ = std::move(release_callback); own_mailbox_ = true; valid_texture_copy_ = false; SetNeedsPushProperties(); @@ -66,7 +66,7 @@ texture_layer->SetNearestNeighbor(nearest_neighbor_); if (own_mailbox_) { texture_layer->SetTextureMailbox(texture_mailbox_, - release_callback_.Pass()); + std::move(release_callback_)); own_mailbox_ = false; } } @@ -83,7 +83,7 @@ texture_mailbox_.IsSharedMemory())) { external_texture_resource_ = resource_provider->CreateResourceFromTextureMailbox( - texture_mailbox_, release_callback_.Pass()); + texture_mailbox_, std::move(release_callback_)); DCHECK(external_texture_resource_); texture_copy_ = nullptr; valid_texture_copy_ = false;
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc index a04ff66..84ee9d2a 100644 --- a/cc/layers/texture_layer_unittest.cc +++ b/cc/layers/texture_layer_unittest.cc
@@ -92,7 +92,7 @@ return false; *mailbox = mailbox_; - *release_callback = release_callback_.Pass(); + *release_callback = std::move(release_callback_); mailbox_changed_ = false; return true; } @@ -100,7 +100,7 @@ void set_mailbox(const TextureMailbox& mailbox, scoped_ptr<SingleReleaseCallback> release_callback) { mailbox_ = mailbox; - release_callback_ = release_callback.Pass(); + release_callback_ = std::move(release_callback); mailbox_changed_ = true; } @@ -648,7 +648,7 @@ base::Unretained(this))); layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char), gpu::SyncToken(), GL_TEXTURE_2D), - callback.Pass()); + std::move(callback)); } void BeginTest() override { @@ -764,7 +764,7 @@ &TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback)); layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char), gpu::SyncToken(), GL_TEXTURE_2D), - callback.Pass()); + std::move(callback)); } void BeginTest() override { @@ -1352,7 +1352,7 @@ base::Unretained(this))); layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char), gpu::SyncToken(), GL_TEXTURE_2D), - callback.Pass()); + std::move(callback)); } void SetupTree() override { @@ -1421,7 +1421,7 @@ base::Unretained(this))); layer_->SetTextureMailbox(TextureMailbox(MailboxFromChar(mailbox_char), gpu::SyncToken(), GL_TEXTURE_2D), - callback.Pass()); + std::move(callback)); } void SetupTree() override {
diff --git a/cc/layers/ui_resource_layer_impl_unittest.cc b/cc/layers/ui_resource_layer_impl_unittest.cc index ee351e36..c1f9a2e 100644 --- a/cc/layers/ui_resource_layer_impl_unittest.cc +++ b/cc/layers/ui_resource_layer_impl_unittest.cc
@@ -41,7 +41,7 @@ host_impl->CreateUIResource(uid, bitmap); layer->SetUIResourceId(uid); - return layer.Pass(); + return layer; } void QuadSizeTest(scoped_ptr<UIResourceLayerImpl> layer, @@ -77,7 +77,7 @@ layer_size, opaque, uid); - QuadSizeTest(layer.Pass(), expected_quad_size); + QuadSizeTest(std::move(layer), expected_quad_size); // Make sure we're not appending quads when there are invalid values. expected_quad_size = 0; @@ -87,7 +87,7 @@ layer_size, opaque, uid); - QuadSizeTest(layer.Pass(), expected_quad_size); + QuadSizeTest(std::move(layer), expected_quad_size); } void OpaqueBoundsTest(scoped_ptr<UIResourceLayerImpl> layer, @@ -124,7 +124,7 @@ opaque, uid); gfx::Rect expected_opaque_bounds; - OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds); + OpaqueBoundsTest(std::move(layer), expected_opaque_bounds); opaque = true; layer = GenerateUIResourceLayer(&host_impl, @@ -133,7 +133,7 @@ opaque, uid); expected_opaque_bounds = gfx::Rect(layer->bounds()); - OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds); + OpaqueBoundsTest(std::move(layer), expected_opaque_bounds); } TEST(UIResourceLayerImplTest, VerifySetOpaqueOnLayer) { @@ -154,13 +154,13 @@ &host_impl, bitmap_size, layer_size, skbitmap_opaque, uid); layer->SetContentsOpaque(false); gfx::Rect expected_opaque_bounds; - OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds); + OpaqueBoundsTest(std::move(layer), expected_opaque_bounds); layer = GenerateUIResourceLayer( &host_impl, bitmap_size, layer_size, skbitmap_opaque, uid); layer->SetContentsOpaque(true); expected_opaque_bounds = gfx::Rect(layer->bounds()); - OpaqueBoundsTest(layer.Pass(), expected_opaque_bounds); + OpaqueBoundsTest(std::move(layer), expected_opaque_bounds); } TEST(UIResourceLayerImplTest, Occlusion) {
diff --git a/cc/layers/ui_resource_layer_unittest.cc b/cc/layers/ui_resource_layer_unittest.cc index 3d2681e..fa27710 100644 --- a/cc/layers/ui_resource_layer_unittest.cc +++ b/cc/layers/ui_resource_layer_unittest.cc
@@ -5,6 +5,7 @@ #include "cc/layers/ui_resource_layer.h" #include "base/thread_task_runner_handle.h" +#include "cc/layers/layer_settings.h" #include "cc/resources/resource_provider.h" #include "cc/resources/scoped_ui_resource.h" #include "cc/test/fake_layer_tree_host.h"
diff --git a/cc/layers/video_layer.cc b/cc/layers/video_layer.cc index cae00aa..49d6490 100644 --- a/cc/layers/video_layer.cc +++ b/cc/layers/video_layer.cc
@@ -25,9 +25,7 @@ VideoLayer::~VideoLayer() {} scoped_ptr<LayerImpl> VideoLayer::CreateLayerImpl(LayerTreeImpl* tree_impl) { - scoped_ptr<VideoLayerImpl> impl = - VideoLayerImpl::Create(tree_impl, id(), provider_, video_rotation_); - return impl.Pass(); + return VideoLayerImpl::Create(tree_impl, id(), provider_, video_rotation_); } bool VideoLayer::Update() {
diff --git a/cc/layers/video_layer_impl_unittest.cc b/cc/layers/video_layer_impl_unittest.cc index 6efe46d..f8458d9b 100644 --- a/cc/layers/video_layer_impl_unittest.cc +++ b/cc/layers/video_layer_impl_unittest.cc
@@ -105,8 +105,8 @@ video_layer_impl->SetDrawsContent(true); video_layer_impl->SetContentsOpaque(true); - layer_impl->AddChild(video_layer_impl.Pass()); - active_tree->SetRootLayer(layer_impl.Pass()); + layer_impl->AddChild(std::move(video_layer_impl)); + active_tree->SetRootLayer(std::move(layer_impl)); active_tree->BuildPropertyTreesForTesting();
diff --git a/cc/output/bsp_tree.cc b/cc/output/bsp_tree.cc index f24e99bb..6f0b99ea2 100644 --- a/cc/output/bsp_tree.cc +++ b/cc/output/bsp_tree.cc
@@ -13,8 +13,7 @@ namespace cc { -BspNode::BspNode(scoped_ptr<DrawPolygon> data) : node_data(data.Pass()) { -} +BspNode::BspNode(scoped_ptr<DrawPolygon> data) : node_data(std::move(data)) {} BspNode::~BspNode() { } @@ -69,8 +68,8 @@ if (!split_result) { break; } - front_list.push_back(new_front.Pass()); - back_list.push_back(new_back.Pass()); + front_list.push_back(std::move(new_front)); + back_list.push_back(std::move(new_back)); break; } case BSP_COPLANAR_FRONT:
diff --git a/cc/output/bsp_tree_unittest.cc b/cc/output/bsp_tree_unittest.cc index 1e34ea14..f55577b 100644 --- a/cc/output/bsp_tree_unittest.cc +++ b/cc/output/bsp_tree_unittest.cc
@@ -114,9 +114,9 @@ CREATE_DRAW_POLYGON(vertices_c, gfx::Vector3dF(0.0f, 0.0f, 1.0f), 2)); std::deque<scoped_ptr<DrawPolygon>> polygon_list; - polygon_list.push_back(polygon_a.Pass()); - polygon_list.push_back(polygon_b.Pass()); - polygon_list.push_back(polygon_c.Pass()); + polygon_list.push_back(std::move(polygon_a)); + polygon_list.push_back(std::move(polygon_b)); + polygon_list.push_back(std::move(polygon_c)); int compare_ids[] = {1, 0, 2}; std::vector<int> compare_list = INT_VECTOR_FROM_ARRAY(compare_ids); @@ -142,8 +142,8 @@ CREATE_DRAW_POLYGON(vertices_b, gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1)); std::deque<scoped_ptr<DrawPolygon>> polygon_list; - polygon_list.push_back(polygon_a.Pass()); - polygon_list.push_back(polygon_b.Pass()); + polygon_list.push_back(std::move(polygon_a)); + polygon_list.push_back(std::move(polygon_b)); int compare_ids[] = {1, 0, 1}; std::vector<int> compare_list = INT_VECTOR_FROM_ARRAY(compare_ids); @@ -171,8 +171,8 @@ CREATE_DRAW_POLYGON(vertices_b, gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1)); std::deque<scoped_ptr<DrawPolygon>> polygon_list; - polygon_list.push_back(polygon_a.Pass()); - polygon_list.push_back(polygon_b.Pass()); + polygon_list.push_back(std::move(polygon_a)); + polygon_list.push_back(std::move(polygon_b)); int compare_ids[] = {1, 0}; std::vector<int> compare_list = INT_VECTOR_FROM_ARRAY(compare_ids); @@ -200,8 +200,8 @@ CREATE_DRAW_POLYGON(vertices_b, gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1)); std::deque<scoped_ptr<DrawPolygon>> polygon_list; - polygon_list.push_back(polygon_b.Pass()); - polygon_list.push_back(polygon_a.Pass()); + polygon_list.push_back(std::move(polygon_b)); + polygon_list.push_back(std::move(polygon_a)); int compare_ids[] = {0, 1, 0}; std::vector<int> compare_list = INT_VECTOR_FROM_ARRAY(compare_ids); @@ -236,9 +236,9 @@ CREATE_DRAW_POLYGON(vertices_c, gfx::Vector3dF(0.0f, 1.0f, 0.0f), 2)); std::deque<scoped_ptr<DrawPolygon>> polygon_list; - polygon_list.push_back(polygon_a.Pass()); - polygon_list.push_back(polygon_b.Pass()); - polygon_list.push_back(polygon_c.Pass()); + polygon_list.push_back(std::move(polygon_a)); + polygon_list.push_back(std::move(polygon_b)); + polygon_list.push_back(std::move(polygon_c)); int compare_ids[] = {2, 1, 2, 0, 2, 1, 2}; std::vector<int> compare_list = INT_VECTOR_FROM_ARRAY(compare_ids); @@ -277,9 +277,9 @@ { std::deque<scoped_ptr<DrawPolygon>> polygon_list; - polygon_list.push_back(polygon_a.Pass()); - polygon_list.push_back(polygon_b.Pass()); - polygon_list.push_back(polygon_c.Pass()); + polygon_list.push_back(std::move(polygon_a)); + polygon_list.push_back(std::move(polygon_b)); + polygon_list.push_back(std::move(polygon_c)); int compare_ids[] = {0, 1, 2}; std::vector<int> compare_list = INT_VECTOR_FROM_ARRAY(compare_ids); @@ -289,9 +289,9 @@ // Now check a different order and ensure we get that back as well { std::deque<scoped_ptr<DrawPolygon>> polygon_list; - polygon_list.push_back(polygon_f.Pass()); - polygon_list.push_back(polygon_d.Pass()); - polygon_list.push_back(polygon_e.Pass()); + polygon_list.push_back(std::move(polygon_f)); + polygon_list.push_back(std::move(polygon_d)); + polygon_list.push_back(std::move(polygon_e)); int compare_ids[] = {0, 1, 2}; std::vector<int> compare_list = INT_VECTOR_FROM_ARRAY(compare_ids); @@ -334,10 +334,10 @@ CREATE_DRAW_POLYGON(vertices_d, gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 3)); std::deque<scoped_ptr<DrawPolygon>> polygon_list; - polygon_list.push_back(polygon_a.Pass()); - polygon_list.push_back(polygon_b.Pass()); - polygon_list.push_back(polygon_c.Pass()); - polygon_list.push_back(polygon_d.Pass()); + polygon_list.push_back(std::move(polygon_a)); + polygon_list.push_back(std::move(polygon_b)); + polygon_list.push_back(std::move(polygon_c)); + polygon_list.push_back(std::move(polygon_d)); int compare_ids[] = {3, 0, 1, 2, 3}; std::vector<int> compare_list = INT_VECTOR_FROM_ARRAY(compare_ids);
diff --git a/cc/output/compositor_frame.cc b/cc/output/compositor_frame.cc index e612b28..f096a38 100644 --- a/cc/output/compositor_frame.cc +++ b/cc/output/compositor_frame.cc
@@ -11,8 +11,8 @@ CompositorFrame::~CompositorFrame() {} void CompositorFrame::AssignTo(CompositorFrame* target) { - target->delegated_frame_data = delegated_frame_data.Pass(); - target->gl_frame_data = gl_frame_data.Pass(); + target->delegated_frame_data = std::move(delegated_frame_data); + target->gl_frame_data = std::move(gl_frame_data); target->metadata = metadata; }
diff --git a/cc/output/copy_output_request.cc b/cc/output/copy_output_request.cc index fce92a3..7077457 100644 --- a/cc/output/copy_output_request.cc +++ b/cc/output/copy_output_request.cc
@@ -24,7 +24,7 @@ relay->area_ = original_request.area_; relay->has_texture_mailbox_ = original_request.has_texture_mailbox_; relay->texture_mailbox_ = original_request.texture_mailbox_; - return relay.Pass(); + return relay; } CopyOutputRequest::CopyOutputRequest() @@ -52,7 +52,7 @@ void CopyOutputRequest::SendResult(scoped_ptr<CopyOutputResult> result) { bool success = !result->IsEmpty(); - base::ResetAndReturn(&result_callback_).Run(result.Pass()); + base::ResetAndReturn(&result_callback_).Run(std::move(result)); TRACE_EVENT_ASYNC_END1("cc", "CopyOutputRequest", this, "success", success); } @@ -61,7 +61,7 @@ } void CopyOutputRequest::SendBitmapResult(scoped_ptr<SkBitmap> bitmap) { - SendResult(CopyOutputResult::CreateBitmapResult(bitmap.Pass()).Pass()); + SendResult(CopyOutputResult::CreateBitmapResult(std::move(bitmap)).Pass()); } void CopyOutputRequest::SendTextureResult( @@ -70,7 +70,7 @@ scoped_ptr<SingleReleaseCallback> release_callback) { DCHECK(texture_mailbox.IsTexture()); SendResult(CopyOutputResult::CreateTextureResult( - size, texture_mailbox, release_callback.Pass())); + size, texture_mailbox, std::move(release_callback))); } void CopyOutputRequest::SetTextureMailbox(
diff --git a/cc/output/copy_output_result.cc b/cc/output/copy_output_result.cc index 704aa9ab..84e9ef8 100644 --- a/cc/output/copy_output_result.cc +++ b/cc/output/copy_output_result.cc
@@ -13,8 +13,7 @@ CopyOutputResult::CopyOutputResult() {} CopyOutputResult::CopyOutputResult(scoped_ptr<SkBitmap> bitmap) - : size_(bitmap->width(), bitmap->height()), - bitmap_(bitmap.Pass()) { + : size_(bitmap->width(), bitmap->height()), bitmap_(std::move(bitmap)) { DCHECK(bitmap_); } @@ -24,7 +23,7 @@ scoped_ptr<SingleReleaseCallback> release_callback) : size_(size), texture_mailbox_(texture_mailbox), - release_callback_(release_callback.Pass()) { + release_callback_(std::move(release_callback)) { DCHECK(texture_mailbox_.IsTexture()); } @@ -34,14 +33,14 @@ } scoped_ptr<SkBitmap> CopyOutputResult::TakeBitmap() { - return bitmap_.Pass(); + return std::move(bitmap_); } void CopyOutputResult::TakeTexture( TextureMailbox* texture_mailbox, scoped_ptr<SingleReleaseCallback>* release_callback) { *texture_mailbox = texture_mailbox_; - *release_callback = release_callback_.Pass(); + *release_callback = std::move(release_callback_); texture_mailbox_ = TextureMailbox(); }
diff --git a/cc/output/copy_output_result.h b/cc/output/copy_output_result.h index 3662818..57f0cca 100644 --- a/cc/output/copy_output_result.h +++ b/cc/output/copy_output_result.h
@@ -23,14 +23,14 @@ } static scoped_ptr<CopyOutputResult> CreateBitmapResult( scoped_ptr<SkBitmap> bitmap) { - return make_scoped_ptr(new CopyOutputResult(bitmap.Pass())); + return make_scoped_ptr(new CopyOutputResult(std::move(bitmap))); } static scoped_ptr<CopyOutputResult> CreateTextureResult( const gfx::Size& size, const TextureMailbox& texture_mailbox, scoped_ptr<SingleReleaseCallback> release_callback) { - return make_scoped_ptr( - new CopyOutputResult(size, texture_mailbox, release_callback.Pass())); + return make_scoped_ptr(new CopyOutputResult(size, texture_mailbox, + std::move(release_callback))); } ~CopyOutputResult();
diff --git a/cc/output/delegating_renderer.cc b/cc/output/delegating_renderer.cc index a8fbbb70..0a7d91c 100644 --- a/cc/output/delegating_renderer.cc +++ b/cc/output/delegating_renderer.cc
@@ -96,7 +96,7 @@ TRACE_EVENT0("cc,benchmark", "DelegatingRenderer::SwapBuffers"); CompositorFrame compositor_frame; compositor_frame.metadata = metadata; - compositor_frame.delegated_frame_data = delegated_frame_data_.Pass(); + compositor_frame.delegated_frame_data = std::move(delegated_frame_data_); output_surface_->SwapBuffers(&compositor_frame); }
diff --git a/cc/output/delegating_renderer_unittest.cc b/cc/output/delegating_renderer_unittest.cc index ee817ef..df06696 100644 --- a/cc/output/delegating_renderer_unittest.cc +++ b/cc/output/delegating_renderer_unittest.cc
@@ -20,7 +20,7 @@ scoped_ptr<FakeOutputSurface> output_surface = FakeOutputSurface::CreateDelegating3d(); output_surface_ = output_surface.get(); - return output_surface.Pass(); + return std::move(output_surface); } protected:
diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc index 9ec397f..534b97e 100644 --- a/cc/output/direct_renderer.cc +++ b/cc/output/direct_renderer.cc
@@ -183,7 +183,7 @@ scoped_ptr<ScopedResource> texture = ScopedResource::Create(resource_provider_); render_pass_textures_.set(render_passes_in_draw_order[i]->id, - texture.Pass()); + std::move(texture)); } } } @@ -512,7 +512,7 @@ *it, gfx::RectF(quad.visible_rect), quad.shared_quad_state->quad_to_target_transform, next_polygon_id++)); if (new_polygon->points().size() > 2u) { - poly_list.push_back(new_polygon.Pass()); + poly_list.push_back(std::move(new_polygon)); } continue; }
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc index 2b1b1f2..280b5544 100644 --- a/cc/output/gl_renderer.cc +++ b/cc/output/gl_renderer.cc
@@ -847,7 +847,7 @@ device_background_texture->id()); GetFramebufferTexture(lock.texture_id(), RGBA_8888, bounding_rect); } - return device_background_texture.Pass(); + return device_background_texture; } skia::RefPtr<SkImage> GLRenderer::ApplyBackgroundFilters( @@ -2444,7 +2444,7 @@ if (use_sync_query_) { DCHECK(current_sync_query_); current_sync_query_->End(); - pending_sync_queries_.push_back(current_sync_query_.Pass()); + pending_sync_queries_.push_back(std::move(current_sync_query_)); } current_framebuffer_lock_ = nullptr; @@ -2497,7 +2497,7 @@ gfx::Rect copy_rect = frame->current_render_pass->output_rect; if (request->has_area()) copy_rect.Intersect(request->area()); - GetFramebufferPixelsAsync(frame, copy_rect, request.Pass()); + GetFramebufferPixelsAsync(frame, copy_rect, std::move(request)); } void GLRenderer::ToGLMatrix(float* gl_matrix, const gfx::Transform& transform) { @@ -2726,17 +2726,17 @@ gl_->DeleteTextures(1, &texture_id); } - request->SendTextureResult( - window_rect.size(), texture_mailbox, release_callback.Pass()); + request->SendTextureResult(window_rect.size(), texture_mailbox, + std::move(release_callback)); return; } DCHECK(request->force_bitmap_result()); scoped_ptr<PendingAsyncReadPixels> pending_read(new PendingAsyncReadPixels); - pending_read->copy_request = request.Pass(); + pending_read->copy_request = std::move(request); pending_async_read_pixels_.insert(pending_async_read_pixels_.begin(), - pending_read.Pass()); + std::move(pending_read)); bool do_workaround = NeedsIOSurfaceReadbackWorkaround(); @@ -2876,7 +2876,7 @@ } if (bitmap) - current_read->copy_request->SendBitmapResult(bitmap.Pass()); + current_read->copy_request->SendBitmapResult(std::move(bitmap)); // Conversion from reverse iterator to iterator: // Iterator |iter.base() - 1| points to the same element with reverse iterator
diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc index 2140f54..10095e9 100644 --- a/cc/output/gl_renderer_unittest.cc +++ b/cc/output/gl_renderer_unittest.cc
@@ -733,7 +733,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<SharedBitmapManager> shared_bitmap_manager( @@ -778,7 +778,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<SharedBitmapManager> shared_bitmap_manager( @@ -816,7 +816,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::CreateOffscreen(context_owned.Pass())); + FakeOutputSurface::CreateOffscreen(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<SharedBitmapManager> shared_bitmap_manager( @@ -887,7 +887,7 @@ VisibilityChangeIsLastCallTrackingContext* context = context_owned.get(); scoped_refptr<TestContextProvider> provider = - TestContextProvider::Create(context_owned.Pass()); + TestContextProvider::Create(std::move(context_owned)); provider->support()->SetSurfaceVisibleCallback(base::Bind( &VisibilityChangeIsLastCallTrackingContext::set_last_call_was_visibility, @@ -960,7 +960,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<SharedBitmapManager> shared_bitmap_manager( @@ -1046,7 +1046,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(mock_context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(mock_context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<SharedBitmapManager> shared_bitmap_manager( @@ -1137,7 +1137,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<SharedBitmapManager> shared_bitmap_manager( @@ -1210,7 +1210,7 @@ public: explicit NonReshapableOutputSurface( scoped_ptr<TestWebGraphicsContext3D> context3d) - : FakeOutputSurface(TestContextProvider::Create(context3d.Pass()), + : FakeOutputSurface(TestContextProvider::Create(std::move(context3d)), false) { surface_size_ = gfx::Size(500, 500); } @@ -1224,7 +1224,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<NonReshapableOutputSurface> output_surface( - new NonReshapableOutputSurface(context_owned.Pass())); + new NonReshapableOutputSurface(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); output_surface->set_fixed_size(gfx::Size(100, 100)); @@ -1384,7 +1384,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - new NonReshapableOutputSurface(context_owned.Pass())); + new NonReshapableOutputSurface(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<SharedBitmapManager> shared_bitmap_manager( @@ -2069,7 +2069,7 @@ scoped_ptr<DiscardCheckingContext> context_owned(new DiscardCheckingContext); FakeOutputSurfaceClient output_surface_client; scoped_ptr<FakeOutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<SharedBitmapManager> shared_bitmap_manager( @@ -2106,7 +2106,7 @@ scoped_ptr<SingleReleaseCallbackImpl> release_callback = SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( - mailbox, release_callback.Pass()); + mailbox, std::move(release_callback)); bool premultiplied_alpha = false; bool flipped = false; bool nearest_neighbor = false; @@ -2222,7 +2222,7 @@ MockOverlayScheduler overlay_scheduler; scoped_refptr<TestContextProvider> context_provider = - TestContextProvider::Create(context_owned.Pass()); + TestContextProvider::Create(std::move(context_owned)); context_provider->support()->SetScheduleOverlayPlaneCallback(base::Bind( &MockOverlayScheduler::Schedule, base::Unretained(&overlay_scheduler))); @@ -2261,7 +2261,7 @@ scoped_ptr<SingleReleaseCallbackImpl> release_callback = SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( - mailbox, release_callback.Pass()); + mailbox, std::move(release_callback)); bool premultiplied_alpha = false; bool flipped = false; bool nearest_neighbor = false;
diff --git a/cc/output/output_surface.cc b/cc/output/output_surface.cc index d41c195..3430d18 100644 --- a/cc/output/output_surface.cc +++ b/cc/output/output_surface.cc
@@ -122,7 +122,7 @@ : client_(NULL), context_provider_(context_provider), worker_context_provider_(worker_context_provider), - software_device_(software_device.Pass()), + software_device_(std::move(software_device)), device_scale_factor_(-1), external_stencil_test_enabled_(false), weak_ptr_factory_(this) { @@ -141,14 +141,12 @@ } OutputSurface::OutputSurface(scoped_ptr<SoftwareOutputDevice> software_device) - : OutputSurface(nullptr, nullptr, software_device.Pass()) { -} + : OutputSurface(nullptr, nullptr, std::move(software_device)) {} OutputSurface::OutputSurface( const scoped_refptr<ContextProvider>& context_provider, scoped_ptr<SoftwareOutputDevice> software_device) - : OutputSurface(context_provider, nullptr, software_device.Pass()) { -} + : OutputSurface(context_provider, nullptr, std::move(software_device)) {} void OutputSurface::CommitVSyncParameters(base::TimeTicks timebase, base::TimeDelta interval) {
diff --git a/cc/output/output_surface_unittest.cc b/cc/output/output_surface_unittest.cc index b09ead4..3684852 100644 --- a/cc/output/output_surface_unittest.cc +++ b/cc/output/output_surface_unittest.cc
@@ -29,11 +29,11 @@ : OutputSurface(worker_context_provider) {} explicit TestOutputSurface(scoped_ptr<SoftwareOutputDevice> software_device) - : OutputSurface(software_device.Pass()) {} + : OutputSurface(std::move(software_device)) {} TestOutputSurface(scoped_refptr<ContextProvider> context_provider, scoped_ptr<SoftwareOutputDevice> software_device) - : OutputSurface(context_provider, software_device.Pass()) {} + : OutputSurface(context_provider, std::move(software_device)) {} void SwapBuffers(CompositorFrame* frame) override { client_->DidSwapBuffers();
diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc index 444aecf..a170cf93 100644 --- a/cc/output/overlay_unittest.cc +++ b/cc/output/overlay_unittest.cc
@@ -194,7 +194,7 @@ SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState(); shared_state->opacity = 1.f; - return pass.Pass(); + return pass; } ResourceId CreateResource(ResourceProvider* resource_provider, @@ -207,7 +207,7 @@ SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); return resource_provider->CreateResourceFromTextureMailbox( - mailbox, release_callback.Pass()); + mailbox, std::move(release_callback)); } SolidColorDrawQuad* CreateSolidColorQuadAt( @@ -408,7 +408,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Check for potential candidates. OverlayCandidateList candidate_list; @@ -450,7 +450,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Check for potential candidates. OverlayCandidateList candidate_list; @@ -481,7 +481,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -515,7 +515,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -548,7 +548,7 @@ gfx::Rect(kDisplaySize)); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Check for potential candidates. OverlayCandidateList candidate_list; @@ -601,7 +601,7 @@ gfx::Rect(kDisplaySize)); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Run the overlay strategy on that input. RenderPass* main_pass = pass_list.back().get(); @@ -655,7 +655,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Check for potential candidates. OverlayCandidateList candidate_list; @@ -688,7 +688,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Check for potential candidates. OverlayCandidateList candidate_list; @@ -726,7 +726,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Check for potential candidates. OverlayCandidateList candidate_list; @@ -752,7 +752,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); RenderPassList original_pass_list; RenderPass::CopyAll(pass_list, &original_pass_list); @@ -777,7 +777,7 @@ pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); RenderPassList original_pass_list; RenderPass::CopyAll(pass_list, &original_pass_list); @@ -806,7 +806,7 @@ CreateFullscreenOpaqueQuad(resource_provider_.get(), pass->shared_quad_state_list.back(), pass.get()); - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); RenderPassList original_pass_list; RenderPass::CopyAll(pass_list, &original_pass_list); @@ -830,7 +830,7 @@ quad->premultiplied_alpha = true; RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -847,7 +847,7 @@ quad->needs_blending = true; RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -864,7 +864,7 @@ quad->background_color = SK_ColorBLACK; RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -880,7 +880,7 @@ pass->shared_quad_state_list.back()->blend_mode = SkXfermode::kScreen_Mode; RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -896,7 +896,7 @@ pass->shared_quad_state_list.back()->opacity = 0.5f; RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -913,7 +913,7 @@ ->quad_to_target_transform.RotateAboutXAxis(45.f); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -930,7 +930,7 @@ pass->shared_quad_state_list.back()->clip_rect = kOverlayClipRect; RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -949,7 +949,7 @@ -1.0f); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -970,7 +970,7 @@ 2.0f); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -990,7 +990,7 @@ 1.0f); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -1008,7 +1008,7 @@ ->quad_to_target_transform.RotateAboutZAxis(90.f); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -1027,7 +1027,7 @@ ->quad_to_target_transform.RotateAboutZAxis(180.f); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -1046,7 +1046,7 @@ ->quad_to_target_transform.RotateAboutZAxis(270.f); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -1066,7 +1066,7 @@ kOverlayBottomRightRect); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); RenderPassList original_pass_list; RenderPass::CopyAll(pass_list, &original_pass_list); @@ -1090,7 +1090,7 @@ kOverlayBottomRightRect); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); RenderPassList original_pass_list; RenderPass::CopyAll(pass_list, &original_pass_list); @@ -1112,7 +1112,7 @@ kOverlayBottomRightRect); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); RenderPassList original_pass_list; RenderPass::CopyAll(pass_list, &original_pass_list); @@ -1136,7 +1136,7 @@ kOverlayBottomRightRect); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); RenderPassList original_pass_list; RenderPass::CopyAll(pass_list, &original_pass_list); @@ -1158,7 +1158,7 @@ kOverlayBottomRightRect); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); RenderPassList original_pass_list; RenderPass::CopyAll(pass_list, &original_pass_list); @@ -1177,7 +1177,7 @@ pass.get(), kSwapTransform); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -1192,7 +1192,7 @@ pass.get(), kXMirrorTransform); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -1207,7 +1207,7 @@ pass.get(), kBothMirrorTransform); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -1222,7 +1222,7 @@ pass.get(), kNormalTransform); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -1237,7 +1237,7 @@ pass.get(), kYMirrorTransform); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, &candidate_list, &damage_rect_); @@ -1254,7 +1254,7 @@ kOverlayBottomRightRect); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, @@ -1277,7 +1277,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); OverlayCandidateList candidate_list; overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list, @@ -1304,7 +1304,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Check for potential candidates. OverlayCandidateList candidate_list; @@ -1343,7 +1343,7 @@ ->quad_to_target_transform.RotateAboutZAxis(45.f); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); CALayerOverlayList ca_layer_list; OverlayCandidateList overlay_list( BackbufferOverlayList(pass_list.back().get())); @@ -1364,7 +1364,7 @@ ->quad_to_target_transform.RotateAboutXAxis(45.f); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); CALayerOverlayList ca_layer_list; OverlayCandidateList overlay_list( BackbufferOverlayList(pass_list.back().get())); @@ -1385,7 +1385,7 @@ pass->shared_quad_state_list.back()->clip_rect = kOverlayRect; RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); CALayerOverlayList ca_layer_list; OverlayCandidateList overlay_list( BackbufferOverlayList(pass_list.back().get())); @@ -1407,7 +1407,7 @@ gfx::Rect(128, 128, 128, 128); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); CALayerOverlayList ca_layer_list; OverlayCandidateList overlay_list( BackbufferOverlayList(pass_list.back().get())); @@ -1428,7 +1428,7 @@ pass->shared_quad_state_list.back()->clip_rect = gfx::Rect(64, 64, 128, 128); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); CALayerOverlayList ca_layer_list; OverlayCandidateList overlay_list( BackbufferOverlayList(pass_list.back().get())); @@ -1449,7 +1449,7 @@ pass->shared_quad_state_list.back()->opacity = 0; RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); CALayerOverlayList ca_layer_list; OverlayCandidateList overlay_list( BackbufferOverlayList(pass_list.back().get())); @@ -1571,7 +1571,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Candidate pass was taken out and extra skipped pass added, // so only draw 2 quads. @@ -1610,7 +1610,7 @@ pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Candidate quad should fail to be overlaid on top because of occlusion. // Expect to be replaced with transparent hole quad and placed in underlay. @@ -1649,7 +1649,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Should not see the primary surface's overlay. output_surface_->set_is_displayed_as_overlay_plane(false); @@ -1679,7 +1679,7 @@ pass->shared_quad_state_list.back(), pass.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); output_surface_->set_is_displayed_as_overlay_plane(true); EXPECT_CALL(*renderer_, DoDrawQuad(_, _, _)).Times(0); @@ -1704,7 +1704,7 @@ scoped_ptr<RenderPass> pass = CreateRenderPass(); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); DirectRenderer::DrawingFrame frame1; frame1.render_passes_in_draw_order = &pass_list;
diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc index 6f337c3..110f9fe 100644 --- a/cc/output/renderer_pixeltest.cc +++ b/cc/output/renderer_pixeltest.cc
@@ -34,7 +34,7 @@ const gfx::Rect damage_rect = rect; const gfx::Transform transform_to_root_target; pass->SetNew(id, output_rect, damage_rect, transform_to_root_target); - return pass.Pass(); + return pass; } scoped_ptr<RenderPass> CreateTestRenderPass( @@ -45,7 +45,7 @@ const gfx::Rect output_rect = rect; const gfx::Rect damage_rect = rect; pass->SetNew(id, output_rect, damage_rect, transform_to_root_target); - return pass.Pass(); + return pass; } SharedQuadState* CreateTestSharedQuadState( @@ -478,7 +478,7 @@ color_quad->SetNew(shared_state, rect, rect, SK_ColorGREEN, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -514,8 +514,8 @@ RenderPass* child_pass_ptr = child_pass.get(); RenderPassList pass_list; - pass_list.push_back(child_pass.Pass()); - pass_list.push_back(root_pass.Pass()); + pass_list.push_back(std::move(child_pass)); + pass_list.push_back(std::move(root_pass)); EXPECT_TRUE(this->RunPixelTestWithReadbackTarget( &pass_list, @@ -546,7 +546,7 @@ color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -579,7 +579,7 @@ color_quad->SetNew(color_quad_state, rect, rect, SK_ColorWHITE, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -647,7 +647,7 @@ render_pass_->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); background_quad->SetNew(background_quad_state, viewport_rect_, viewport_rect_, SK_ColorWHITE, false); - pass_list_.push_back(render_pass_.Pass()); + pass_list_.push_back(std::move(render_pass_)); const base::FilePath::CharType* fileName = IntersectingQuadImage<T>(); EXPECT_TRUE( this->RunPixelTest(&pass_list_, base::FilePath(fileName), comparator)); @@ -830,8 +830,8 @@ CreateTestRenderPassDrawQuad(this->back_quad_state_, this->quad_rect_, child_pass_id2, this->render_pass_.get()); - this->pass_list_.push_back(child_pass1.Pass()); - this->pass_list_.push_back(child_pass2.Pass()); + this->pass_list_.push_back(std::move(child_pass1)); + this->pass_list_.push_back(std::move(child_pass2)); SCOPED_TRACE("IntersectingRenderQuadsPass"); this->template AppendBackgroundAndRunTest<RenderPassDrawQuad>( FuzzyPixelComparator(false, 2.f, 0.f, 256.f, 256, 0.f)); @@ -887,7 +887,7 @@ color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -921,7 +921,7 @@ color_quad->SetNew(color_quad_state, rect, rect, SK_ColorWHITE, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -965,7 +965,7 @@ background_size, gfx::Rect(background_size), 128, 128, 128, green_rect, 149, 43, 21, pass.get(), video_resource_updater_.get(), resource_provider_.get()); - pass_list->push_back(pass.Pass()); + pass_list->push_back(std::move(pass)); } void SetUp() override { @@ -992,7 +992,7 @@ rect, rect, resource_provider_.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE( this->RunPixelTest(&pass_list, @@ -1017,7 +1017,7 @@ draw_rect, viewport, resource_provider_.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, base::FilePath(FILE_PATH_LITERAL("yuv_stripes_clipped.png")), @@ -1040,7 +1040,7 @@ video_resource_updater_.get(), rect, rect, resource_provider_.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -1064,7 +1064,7 @@ video_resource_updater_.get(), rect, rect, resource_provider_.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // If we didn't get black out of the YUV values above, then we probably have a // color range issue. @@ -1089,7 +1089,7 @@ video_resource_updater_.get(), rect, rect, resource_provider_.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest(&pass_list, base::FilePath(FILE_PATH_LITERAL("green.png")), @@ -1132,7 +1132,7 @@ video_resource_updater_.get(), rect, rect, resource_provider_.get()); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE( this->RunPixelTest(&pass_list, @@ -1159,7 +1159,7 @@ color_quad->SetNew(shared_state, rect, rect, SK_ColorWHITE, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -1186,7 +1186,7 @@ color_quad->SetNew(shared_state, rect, rect, SK_ColorBLACK, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -1275,8 +1275,8 @@ FilterOperations()); RenderPassList pass_list; - pass_list.push_back(child_pass.Pass()); - pass_list.push_back(root_pass.Pass()); + pass_list.push_back(std::move(child_pass)); + pass_list.push_back(std::move(root_pass)); // This test has alpha=254 for the software renderer vs. alpha=255 for the gl // renderer so use a fuzzy comparator. @@ -1347,8 +1347,8 @@ FilterOperations()); RenderPassList pass_list; - pass_list.push_back(child_pass.Pass()); - pass_list.push_back(root_pass.Pass()); + pass_list.push_back(std::move(child_pass)); + pass_list.push_back(std::move(root_pass)); // This test blends slightly differently with the software renderer vs. the gl // renderer so use a fuzzy comparator. @@ -1419,8 +1419,8 @@ FilterOperations()); RenderPassList pass_list; - pass_list.push_back(child_pass.Pass()); - pass_list.push_back(root_pass.Pass()); + pass_list.push_back(std::move(child_pass)); + pass_list.push_back(std::move(root_pass)); // This test blends slightly differently with the software renderer vs. the gl // renderer so use a fuzzy comparator. @@ -1515,8 +1515,8 @@ RenderPassList pass_list; - pass_list.push_back(child_pass.Pass()); - pass_list.push_back(root_pass.Pass()); + pass_list.push_back(std::move(child_pass)); + pass_list.push_back(std::move(root_pass)); // This test has alpha=254 for the software renderer vs. alpha=255 for the gl // renderer so use a fuzzy comparator. @@ -1564,8 +1564,8 @@ pass_shared_state, pass_rect, child_pass_id, root_pass.get()); RenderPassList pass_list; - pass_list.push_back(child_pass.Pass()); - pass_list.push_back(root_pass.Pass()); + pass_list.push_back(std::move(child_pass)); + pass_list.push_back(std::move(root_pass)); this->renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75)); @@ -1626,8 +1626,8 @@ false); RenderPassList pass_list; - pass_list.push_back(child_pass.Pass()); - pass_list.push_back(root_pass.Pass()); + pass_list.push_back(std::move(child_pass)); + pass_list.push_back(std::move(root_pass)); this->renderer_->SetEnlargePassTextureAmountForTesting(gfx::Vector2d(50, 75)); @@ -1723,8 +1723,8 @@ false); RenderPassList pass_list; - pass_list.push_back(child_pass.Pass()); - pass_list.push_back(root_pass.Pass()); + pass_list.push_back(std::move(child_pass)); + pass_list.push_back(std::move(root_pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -1824,8 +1824,8 @@ SK_ColorWHITE, false); - pass_list_.push_back(filter_pass.Pass()); - pass_list_.push_back(root_pass.Pass()); + pass_list_.push_back(std::move(filter_pass)); + pass_list_.push_back(std::move(root_pass)); } RenderPassList pass_list_; @@ -1906,7 +1906,7 @@ blue->SetNew(blue_shared_state, rect, rect, SK_ColorBLUE, false); pass->has_transparent_background = false; RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -1928,7 +1928,7 @@ pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); green->SetNew(green_shared_state, rect, rect, SK_ColorGREEN, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -1972,8 +1972,8 @@ CreateTestRenderPassDrawQuad( pass_shared_state, pass_rect, child_pass_id, root_pass.get()); RenderPassList pass_list; - pass_list.push_back(child_pass.Pass()); - pass_list.push_back(root_pass.Pass()); + pass_list.push_back(std::move(child_pass)); + pass_list.push_back(std::move(root_pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -1997,7 +1997,7 @@ pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); blue->SetNew(blue_shared_state, rect, rect, SK_ColorBLUE, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -2038,7 +2038,7 @@ blue->SetNew(blue_shared_state, rect, rect, SK_ColorBLUE, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -2085,7 +2085,7 @@ blue->SetNew(blue_shared_state, rect, rect, SK_ColorBLUE, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -2124,7 +2124,7 @@ green->SetNew(green_shared_state, rect, rect, SK_ColorGREEN, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -2162,7 +2162,7 @@ blue->SetNew(blue_shared_state, rect, rect, SK_ColorBLUE, false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -2216,7 +2216,7 @@ viewport, // Intentionally bigger than clip. gfx::Rect(), viewport, gfx::RectF(viewport), viewport.size(), nearest_neighbor, texture_format, viewport, - 1.f, blue_raster_source.Pass()); + 1.f, std::move(blue_raster_source)); // One viewport-filling green quad. scoped_ptr<FakeDisplayListRecordingSource> green_recording = @@ -2239,10 +2239,10 @@ green_quad->SetNew(green_shared_state, viewport, gfx::Rect(), viewport, gfx::RectF(0.f, 0.f, 1.f, 1.f), viewport.size(), nearest_neighbor, texture_format, viewport, 1.f, - green_raster_source.Pass()); + std::move(green_raster_source)); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -2304,10 +2304,11 @@ pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); white_quad->SetNew(white_shared_state, viewport, gfx::Rect(), viewport, gfx::RectF(0, 0, 1, 1), viewport.size(), nearest_neighbor, - texture_format, viewport, 1.f, white_raster_source.Pass()); + texture_format, viewport, 1.f, + std::move(white_raster_source)); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -2374,10 +2375,10 @@ PictureDrawQuad* quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); quad->SetNew(shared_state, viewport, gfx::Rect(), viewport, gfx::RectF(0, 0, 2, 2), viewport.size(), nearest_neighbor, - texture_format, viewport, 1.f, raster_source.Pass()); + texture_format, viewport, 1.f, std::move(raster_source)); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); this->disable_picture_quad_image_filtering_ = true; @@ -2426,10 +2427,10 @@ PictureDrawQuad* quad = pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); quad->SetNew(shared_state, viewport, gfx::Rect(), viewport, gfx::RectF(0, 0, 2, 2), viewport.size(), nearest_neighbor, - texture_format, viewport, 1.f, raster_source.Pass()); + texture_format, viewport, 1.f, std::move(raster_source)); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -2479,7 +2480,7 @@ nearest_neighbor); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -2530,7 +2531,7 @@ vertex_opacity, false, nearest_neighbor); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -2581,7 +2582,7 @@ vertex_opacity, false, nearest_neighbor); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Allow for a small amount of error as the blending alogrithm used by Skia is // affected by the offset in the expanded rect. @@ -2643,7 +2644,7 @@ gfx::Rect(), green_rect2, gfx::RectF(gfx::SizeF(green_rect2.size())), green_rect2.size(), nearest_neighbor, texture_format, - green_rect2, 1.f, green_raster_source.Pass()); + green_rect2, 1.f, std::move(green_raster_source)); // Add a green clipped checkerboard in the bottom right to help test // interleaving picture quad content and solid color content. @@ -2714,7 +2715,8 @@ blue_quad->SetNew(blue_shared_state, quad_content_rect, gfx::Rect(), quad_content_rect, gfx::RectF(quad_content_rect), content_union_rect.size(), nearest_neighbor, texture_format, - content_union_rect, contents_scale, raster_source.Pass()); + content_union_rect, contents_scale, + std::move(raster_source)); // Fill left half of viewport with green. gfx::Transform half_green_quad_to_target_transform; @@ -2730,7 +2732,7 @@ false); RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -2780,8 +2782,8 @@ pass_shared_state, pass_rect, child_pass_id, root_pass.get()); RenderPassList pass_list; - pass_list.push_back(child_pass.Pass()); - pass_list.push_back(root_pass.Pass()); + pass_list.push_back(std::move(child_pass)); + pass_list.push_back(std::move(root_pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, @@ -2828,8 +2830,8 @@ pass_shared_state, pass_rect, child_pass_id, root_pass.get()); RenderPassList pass_list; - pass_list.push_back(child_pass.Pass()); - pass_list.push_back(root_pass.Pass()); + pass_list.push_back(std::move(child_pass)); + pass_list.push_back(std::move(root_pass)); // Check that the child pass remains unflipped. EXPECT_TRUE(this->RunPixelTestWithReadbackTarget( @@ -2877,8 +2879,8 @@ pass_shared_state, pass_rect, child_pass_id, root_pass.get()); RenderPassList pass_list; - pass_list.push_back(child_pass.Pass()); - pass_list.push_back(root_pass.Pass()); + pass_list.push_back(std::move(child_pass)); + pass_list.push_back(std::move(root_pass)); // Check that the child pass remains unflipped. gfx::Rect capture_rect(this->device_viewport_size_.width() / 2, @@ -2965,7 +2967,7 @@ } RenderPassList pass_list; - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); EXPECT_TRUE(this->RunPixelTest( &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")),
diff --git a/cc/output/renderer_unittest.cc b/cc/output/renderer_unittest.cc index 4854558..3c8b0b8 100644 --- a/cc/output/renderer_unittest.cc +++ b/cc/output/renderer_unittest.cc
@@ -42,7 +42,7 @@ class MockContextProvider : public TestContextProvider { public: explicit MockContextProvider(scoped_ptr<TestWebGraphicsContext3D> context) - : TestContextProvider(context.Pass()) {} + : TestContextProvider(std::move(context)) {} MOCK_METHOD0(DeleteCachedResources, void()); protected:
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc index 8e92e8d1..b333b79 100644 --- a/cc/output/software_renderer.cc +++ b/cc/output/software_renderer.cc
@@ -586,7 +586,7 @@ current_canvas_->readPixels( bitmap.get(), window_copy_rect.x(), window_copy_rect.y()); - request->SendBitmapResult(bitmap.Pass()); + request->SendBitmapResult(std::move(bitmap)); } void SoftwareRenderer::DiscardBackbuffer() {
diff --git a/cc/output/software_renderer_unittest.cc b/cc/output/software_renderer_unittest.cc index 4658b51..12976623 100644 --- a/cc/output/software_renderer_unittest.cc +++ b/cc/output/software_renderer_unittest.cc
@@ -31,8 +31,8 @@ public: void InitializeRenderer( scoped_ptr<SoftwareOutputDevice> software_output_device) { - output_surface_ = FakeOutputSurface::CreateSoftware( - software_output_device.Pass()); + output_surface_ = + FakeOutputSurface::CreateSoftware(std::move(software_output_device)); CHECK(output_surface_->BindToClient(&output_surface_client_)); shared_bitmap_manager_.reset(new TestSharedBitmapManager()); @@ -69,7 +69,7 @@ device_viewport_rect, false); loop.Run(); - return bitmap_result.Pass(); + return bitmap_result; } static void SaveBitmapResult(scoped_ptr<SkBitmap>* bitmap_result, @@ -123,7 +123,7 @@ shared_quad_state, outer_rect, outer_rect, SK_ColorYELLOW, false); RenderPassList list; - list.push_back(root_render_pass.Pass()); + list.push_back(std::move(root_render_pass)); float device_scale_factor = 1.f; gfx::Rect device_viewport_rect(outer_size); @@ -195,7 +195,7 @@ outer_size, false, false); RenderPassList list; - list.push_back(root_render_pass.Pass()); + list.push_back(std::move(root_render_pass)); float device_scale_factor = 1.f; gfx::Rect device_viewport_rect(outer_size); @@ -257,7 +257,7 @@ quad->visible_rect = visible_rect; RenderPassList list; - list.push_back(root_render_pass.Pass()); + list.push_back(std::move(root_render_pass)); float device_scale_factor = 1.f; gfx::Rect device_viewport_rect(tile_size);
diff --git a/cc/output/texture_mailbox_deleter.cc b/cc/output/texture_mailbox_deleter.cc index 27154c73..8585938 100644 --- a/cc/output/texture_mailbox_deleter.cc +++ b/cc/output/texture_mailbox_deleter.cc
@@ -57,7 +57,7 @@ context_provider, texture_id)); - impl_callbacks_.push_back(impl_callback.Pass()); + impl_callbacks_.push_back(std::move(impl_callback)); // The raw pointer to the impl-side callback is valid as long as this // class is alive. So we guard it with a WeakPtr. @@ -75,7 +75,7 @@ main_callback = SingleReleaseCallback::Create(run_impl_callback); } - return main_callback.Pass(); + return main_callback; } void TextureMailboxDeleter::RunDeleteTextureOnImplThread(
diff --git a/cc/playback/compositing_display_item.cc b/cc/playback/compositing_display_item.cc index 2489d3c3..8095572 100644 --- a/cc/playback/compositing_display_item.cc +++ b/cc/playback/compositing_display_item.cc
@@ -79,7 +79,7 @@ filter = skia::AdoptRef(static_cast<SkColorFilter*>(flattenable)); } - SetNew(alpha, xfermode, bounds.get(), filter.Pass()); + SetNew(alpha, xfermode, bounds.get(), std::move(filter)); } void CompositingDisplayItem::Raster(
diff --git a/cc/playback/display_item_list_unittest.cc b/cc/playback/display_item_list_unittest.cc index cb19e39..c62dce3 100644 --- a/cc/playback/display_item_list_unittest.cc +++ b/cc/playback/display_item_list_unittest.cc
@@ -333,7 +333,7 @@ canvas->drawRectCoords(0.f, 0.f, 60.f, 60.f, red_paint); picture = skia::AdoptRef(recorder.endRecordingAsPicture()); auto* item1 = list->CreateAndAppendItem<DrawingDisplayItem>(); - item1->SetNew(picture.Pass()); + item1->SetNew(std::move(picture)); gfx::Rect clip_rect(60, 60, 10, 10); auto* item2 = list->CreateAndAppendItem<ClipDisplayItem>(); @@ -348,7 +348,7 @@ canvas->drawRectCoords(50.f, 50.f, 75.f, 75.f, blue_paint); picture = skia::AdoptRef(recorder.endRecordingAsPicture()); auto* item3 = list->CreateAndAppendItem<DrawingDisplayItem>(); - item3->SetNew(picture.Pass()); + item3->SetNew(std::move(picture)); list->CreateAndAppendItem<EndClipDisplayItem>(); list->Finalize();
diff --git a/cc/playback/display_list_recording_source_unittest.cc b/cc/playback/display_list_recording_source_unittest.cc index 98f827b..cb9b573e6 100644 --- a/cc/playback/display_list_recording_source_unittest.cc +++ b/cc/playback/display_list_recording_source_unittest.cc
@@ -20,7 +20,7 @@ scoped_ptr<FakeDisplayListRecordingSource> recording_source = FakeDisplayListRecordingSource::CreateRecordingSource(viewport, layer_rect.size()); - return recording_source.Pass(); + return recording_source; } scoped_refptr<DisplayListRasterSource> CreateRasterSource(
diff --git a/cc/playback/drawing_display_item.cc b/cc/playback/drawing_display_item.cc index cee9c1d..e43ad72 100644 --- a/cc/playback/drawing_display_item.cc +++ b/cc/playback/drawing_display_item.cc
@@ -28,7 +28,7 @@ } void DrawingDisplayItem::SetNew(skia::RefPtr<SkPicture> picture) { - picture_ = picture.Pass(); + picture_ = std::move(picture); DisplayItem::SetNew(picture_->suitableForGpuRasterization(NULL), picture_->approximateOpCount(), SkPictureUtils::ApproximateBytesUsed(picture_.get())); @@ -65,7 +65,7 @@ picture = skia::AdoptRef(SkPicture::CreateFromStream(&stream, nullptr)); } - SetNew(picture.Pass()); + SetNew(std::move(picture)); } void DrawingDisplayItem::Raster(SkCanvas* canvas,
diff --git a/cc/proto/BUILD.gn b/cc/proto/BUILD.gn index 31d3cd5..2465cfa5 100644 --- a/cc/proto/BUILD.gn +++ b/cc/proto/BUILD.gn
@@ -29,6 +29,7 @@ sources = [ # TODO(dtrainor): Move protos to their correct packages once it's possible # to include protos from other directories/targets (crbug.com/542423). + "compositor_message.proto", "display_item.proto", "layer.proto", "point.proto",
diff --git a/cc/proto/compositor_message.proto b/cc/proto/compositor_message.proto new file mode 100644 index 0000000..98c781c7 --- /dev/null +++ b/cc/proto/compositor_message.proto
@@ -0,0 +1,25 @@ +// Copyright 2015 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. + +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; + +package cc.proto; + +// A top level message for serialized state used by the compositor remote +// channels. +message CompositorMessage { + // One of these is set based on where the message is going to. + optional CompositorMessageToMain to_main = 1; + optional CompositorMessageToImpl to_impl = 2; +} + +message CompositorMessageToMain { + // Placeholder for compositor message data meant for ChannelMain. +} + +message CompositorMessageToImpl { + // Placeholder for compositor message data meant for ChannelImpl. +} \ No newline at end of file
diff --git a/cc/quads/draw_polygon.cc b/cc/quads/draw_polygon.cc index fc9876e..b4f132a8 100644 --- a/cc/quads/draw_polygon.cc +++ b/cc/quads/draw_polygon.cc
@@ -85,7 +85,7 @@ new_polygon->normal_.set_x(normal_.x()); new_polygon->normal_.set_y(normal_.y()); new_polygon->normal_.set_z(normal_.z()); - return new_polygon.Pass(); + return new_polygon; } float DrawPolygon::SignedPointDistance(const gfx::Point3F& point) const { @@ -294,11 +294,11 @@ DCHECK_GE(poly2->points().size(), 3u); if (SideCompare(*poly1, splitter) == BSP_FRONT) { - *front = poly1.Pass(); - *back = poly2.Pass(); + *front = std::move(poly1); + *back = std::move(poly2); } else { - *front = poly2.Pass(); - *back = poly1.Pass(); + *front = std::move(poly2); + *back = std::move(poly1); } return true; }
diff --git a/cc/quads/render_pass.cc b/cc/quads/render_pass.cc index 3737f3c..ba5806f 100644 --- a/cc/quads/render_pass.cc +++ b/cc/quads/render_pass.cc
@@ -88,7 +88,7 @@ damage_rect, transform_to_root_target, has_transparent_background); - return copy_pass.Pass(); + return copy_pass; } // static @@ -134,7 +134,7 @@ copy_pass->CopyFromAndAppendDrawQuad(quad, copy_shared_quad_state); } } - out->push_back(copy_pass.Pass()); + out->push_back(std::move(copy_pass)); } }
diff --git a/cc/quads/render_pass_unittest.cc b/cc/quads/render_pass_unittest.cc index d4c0bc7..f00c006 100644 --- a/cc/quads/render_pass_unittest.cc +++ b/cc/quads/render_pass_unittest.cc
@@ -220,8 +220,8 @@ gfx::Vector2dF(), FilterOperations()); - pass_list.push_back(pass.Pass()); - pass_list.push_back(contrib.Pass()); + pass_list.push_back(std::move(pass)); + pass_list.push_back(std::move(contrib)); // Make a copy with CopyAll(). RenderPassList copy_list; @@ -303,7 +303,7 @@ gfx::Rect(3, 3, 3, 3), gfx::Rect(3, 3, 3, 3), SkColor(), false); - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); // Make a copy with CopyAll(). RenderPassList copy_list;
diff --git a/cc/raster/one_copy_tile_task_worker_pool.cc b/cc/raster/one_copy_tile_task_worker_pool.cc index dc1d118..c66c2ad5 100644 --- a/cc/raster/one_copy_tile_task_worker_pool.cc +++ b/cc/raster/one_copy_tile_task_worker_pool.cc
@@ -530,7 +530,7 @@ } staging_buffer->last_usage = base::TimeTicks::Now(); - busy_buffers_.push_back(staging_buffer.Pass()); + busy_buffers_.push_back(std::move(staging_buffer)); ScheduleReduceMemoryUsage(); } @@ -693,7 +693,7 @@ free_buffers_.pop_front(); } - return staging_buffer.Pass(); + return staging_buffer; } base::TimeTicks OneCopyTileTaskWorkerPool::GetUsageTimeForLRUBuffer() {
diff --git a/cc/raster/task_graph_runner_unittest.cc b/cc/raster/task_graph_runner_unittest.cc index 31144e72..3e8a339d 100644 --- a/cc/raster/task_graph_runner_unittest.cc +++ b/cc/raster/task_graph_runner_unittest.cc
@@ -174,7 +174,7 @@ scoped_ptr<base::DelegateSimpleThread> worker = make_scoped_ptr(new base::DelegateSimpleThread(this, "TestWorker")); worker->Start(); - workers_.push_back(worker.Pass()); + workers_.push_back(std::move(worker)); } for (int i = 0; i < kNamespaceCount; ++i)
diff --git a/cc/raster/tile_task_worker_pool_perftest.cc b/cc/raster/tile_task_worker_pool_perftest.cc index a67f6b0..7d6706d 100644 --- a/cc/raster/tile_task_worker_pool_perftest.cc +++ b/cc/raster/tile_task_worker_pool_perftest.cc
@@ -146,7 +146,7 @@ public: PerfRasterTaskImpl(scoped_ptr<ScopedResource> resource, ImageDecodeTask::Vector* dependencies) - : RasterTask(dependencies), resource_(resource.Pass()) {} + : RasterTask(dependencies), resource_(std::move(resource)) {} // Overridden from Task: void RunOnWorkerThread() override {} @@ -157,7 +157,7 @@ raster_buffer_ = client->AcquireBufferForRaster(resource_.get(), 0, 0); } void CompleteOnOriginThread(TileTaskClient* client) override { - client->ReleaseBufferForRaster(raster_buffer_.Pass()); + client->ReleaseBufferForRaster(std::move(raster_buffer_)); Reset(); } @@ -209,7 +209,7 @@ ImageDecodeTask::Vector dependencies = image_decode_tasks; raster_tasks->push_back( - new PerfRasterTaskImpl(resource.Pass(), &dependencies)); + new PerfRasterTaskImpl(std::move(resource), &dependencies)); } }
diff --git a/cc/raster/tile_task_worker_pool_unittest.cc b/cc/raster/tile_task_worker_pool_unittest.cc index 9cbbd7e..aff1423 100644 --- a/cc/raster/tile_task_worker_pool_unittest.cc +++ b/cc/raster/tile_task_worker_pool_unittest.cc
@@ -75,7 +75,7 @@ raster_buffer_ = client->AcquireBufferForRaster(resource_, 0, 0); } void CompleteOnOriginThread(TileTaskClient* client) override { - client->ReleaseBufferForRaster(raster_buffer_.Pass()); + client->ReleaseBufferForRaster(std::move(raster_buffer_)); reply_.Run(DisplayListRasterSource::SolidColorAnalysis(), !HasFinishedRunning()); }
diff --git a/cc/resources/resource_pool.cc b/cc/resources/resource_pool.cc index 9897b13..ddf71cf 100644 --- a/cc/resources/resource_pool.cc +++ b/cc/resources/resource_pool.cc
@@ -130,7 +130,7 @@ ++total_resource_count_; Resource* resource = pool_resource.get(); - in_use_resources_.set(resource->id(), pool_resource.Pass()); + in_use_resources_.set(resource->id(), std::move(pool_resource)); in_use_memory_usage_bytes_ += ResourceUtil::UncheckedSizeInBytes<size_t>( resource->size(), resource->format()); return resource; @@ -234,7 +234,7 @@ } void ResourcePool::DidFinishUsingResource(scoped_ptr<PoolResource> resource) { - unused_resources_.push_front(resource.Pass()); + unused_resources_.push_front(std::move(resource)); } void ResourcePool::ScheduleEvictExpiredResourcesIn(
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc index 97d9344..506d1d9 100644 --- a/cc/resources/resource_provider.cc +++ b/cc/resources/resource_provider.cc
@@ -515,8 +515,8 @@ ResourceId ResourceProvider::CreateResourceFromTextureMailbox( const TextureMailbox& mailbox, scoped_ptr<SingleReleaseCallbackImpl> release_callback_impl) { - return CreateResourceFromTextureMailbox(mailbox, release_callback_impl.Pass(), - false); + return CreateResourceFromTextureMailbox( + mailbox, std::move(release_callback_impl), false); } void ResourceProvider::DeleteResource(ResourceId id) {
diff --git a/cc/resources/resource_provider_unittest.cc b/cc/resources/resource_provider_unittest.cc index 77d0ed2..90ec427 100644 --- a/cc/resources/resource_provider_unittest.cc +++ b/cc/resources/resource_provider_unittest.cc
@@ -93,7 +93,7 @@ uint32_t* pixels = reinterpret_cast<uint32_t*>(shared_bitmap->pixels()); CHECK(pixels); std::fill_n(pixels, size.GetArea(), value); - return shared_bitmap.Pass(); + return shared_bitmap; } class TextureStateTrackingContext : public TestWebGraphicsContext3D { @@ -283,7 +283,7 @@ memcpy(pending->mailbox, mailbox, sizeof(pending->mailbox)); base::AutoLock lock_for_texture_access(namespace_->lock); pending->texture = UnboundTexture(texture); - pending_produce_textures_.push_back(pending.Pass()); + pending_produce_textures_.push_back(std::move(pending)); } GLuint createAndConsumeTextureCHROMIUM(GLenum target, @@ -404,7 +404,7 @@ context3d_ = context3d.get(); scoped_refptr<TestContextProvider> context_provider = - TestContextProvider::Create(context3d.Pass()); + TestContextProvider::Create(std::move(context3d)); output_surface_ = FakeOutputSurface::Create3d(context_provider); @@ -413,10 +413,10 @@ child_context_ = child_context_owned.get(); if (child_needs_sync_token) { child_output_surface_ = - FakeOutputSurface::Create3d(child_context_owned.Pass()); + FakeOutputSurface::Create3d(std::move(child_context_owned)); } else { child_output_surface_ = FakeOutputSurface::CreateNoRequireSyncPoint( - child_context_owned.Pass()); + std::move(child_context_owned)); } break; } @@ -484,7 +484,7 @@ release_called, release_sync_token, lost_resource)); return child_resource_provider_->CreateResourceFromTextureMailbox( TextureMailbox(gpu_mailbox, *sync_token, GL_TEXTURE_2D), - callback.Pass()); + std::move(callback)); } else { gfx::Size size(64, 64); scoped_ptr<SharedBitmap> shared_bitmap( @@ -496,7 +496,7 @@ ReleaseSharedBitmapCallback, base::Passed(&shared_bitmap), release_called, release_sync_token, lost_resource)); return child_resource_provider_->CreateResourceFromTextureMailbox( - TextureMailbox(shared_bitmap_ptr, size), callback.Pass()); + TextureMailbox(shared_bitmap_ptr, size), std::move(callback)); } } @@ -1393,7 +1393,7 @@ FakeOutputSurfaceClient child_output_surface_client; scoped_ptr<OutputSurface> child_output_surface( - FakeOutputSurface::Create3d(child_context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(child_context_owned))); CHECK(child_output_surface->BindToClient(&child_output_surface_client)); scoped_ptr<ResourceProvider> child_resource_provider(ResourceProvider::Create( @@ -1875,7 +1875,7 @@ FakeOutputSurfaceClient child_output_surface_client; scoped_ptr<OutputSurface> child_output_surface( - FakeOutputSurface::Create3d(child_context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(child_context_owned))); CHECK(child_output_surface->BindToClient(&child_output_surface_client)); scoped_ptr<SharedBitmapManager> shared_bitmap_manager( new TestSharedBitmapManager()); @@ -1892,7 +1892,7 @@ FakeOutputSurfaceClient parent_output_surface_client; scoped_ptr<OutputSurface> parent_output_surface( - FakeOutputSurface::Create3d(parent_context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(parent_context_owned))); CHECK(parent_output_surface->BindToClient(&parent_output_surface_client)); scoped_ptr<ResourceProvider> parent_resource_provider( @@ -2499,7 +2499,7 @@ base::Bind(ReleaseCallback, &release_sync_token, &lost_resource, &main_thread_task_runner)); resource_provider_->CreateResourceFromTextureMailbox( - TextureMailbox(mailbox, sync_token, GL_TEXTURE_2D), callback.Pass()); + TextureMailbox(mailbox, sync_token, GL_TEXTURE_2D), std::move(callback)); EXPECT_FALSE(release_sync_token.HasData()); EXPECT_FALSE(lost_resource); @@ -2524,7 +2524,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( @@ -2603,7 +2603,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( @@ -2646,7 +2646,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( @@ -2690,7 +2690,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( @@ -2767,7 +2767,7 @@ TextureMailbox mailbox(shared_bitmap.get(), size); ResourceId id = resource_provider->CreateResourceFromTextureMailbox( - mailbox, callback.Pass()); + mailbox, std::move(callback)); EXPECT_NE(0u, id); { @@ -2798,7 +2798,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( @@ -2830,7 +2830,7 @@ mailbox.set_nearest_neighbor(mailbox_nearest_neighbor); ResourceId id = resource_provider->CreateResourceFromTextureMailbox( - mailbox, callback.Pass()); + mailbox, std::move(callback)); EXPECT_NE(0u, id); Mock::VerifyAndClearExpectations(context); @@ -2941,7 +2941,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( @@ -2966,7 +2966,7 @@ TextureMailbox mailbox(gpu_mailbox, sync_token, target); ResourceId id = resource_provider->CreateResourceFromTextureMailbox( - mailbox, callback.Pass()); + mailbox, std::move(callback)); EXPECT_NE(0u, id); Mock::VerifyAndClearExpectations(context); @@ -3011,7 +3011,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( @@ -3036,7 +3036,7 @@ TextureMailbox mailbox(gpu_mailbox, sync_token, target); ResourceId id = resource_provider->CreateResourceFromTextureMailbox( - mailbox, callback.Pass()); + mailbox, std::move(callback)); EXPECT_NE(0u, id); Mock::VerifyAndClearExpectations(context); @@ -3065,7 +3065,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( @@ -3090,7 +3090,7 @@ TextureMailbox mailbox(gpu_mailbox, sync_token, target); ResourceId id = resource_provider->CreateResourceFromTextureMailbox( - mailbox, callback.Pass()); + mailbox, std::move(callback)); EXPECT_NE(0u, id); Mock::VerifyAndClearExpectations(context); @@ -3186,7 +3186,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( @@ -3242,7 +3242,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( @@ -3298,7 +3298,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create( @@ -3349,7 +3349,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); const int kWidth = 2; @@ -3434,7 +3434,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); gfx::Size size(4, 4); @@ -3466,7 +3466,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); gfx::Size size(4, 4); @@ -3517,7 +3517,7 @@ FakeOutputSurfaceClient output_surface_client; scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(context_owned))); CHECK(output_surface->BindToClient(&output_surface_client)); scoped_ptr<SharedBitmapManager> shared_bitmap_manager( new TestSharedBitmapManager());
diff --git a/cc/resources/video_resource_updater_unittest.cc b/cc/resources/video_resource_updater_unittest.cc index 10e81f6..689de68 100644 --- a/cc/resources/video_resource_updater_unittest.cc +++ b/cc/resources/video_resource_updater_unittest.cc
@@ -62,8 +62,7 @@ context3d_ = context3d.get(); - output_surface3d_ = - FakeOutputSurface::Create3d(context3d.Pass()); + output_surface3d_ = FakeOutputSurface::Create3d(std::move(context3d)); CHECK(output_surface3d_->BindToClient(&client_)); output_surface_software_ = FakeOutputSurface::CreateSoftware(
diff --git a/cc/scheduler/begin_frame_source.cc b/cc/scheduler/begin_frame_source.cc index d9cadc83..1ee862b 100644 --- a/cc/scheduler/begin_frame_source.cc +++ b/cc/scheduler/begin_frame_source.cc
@@ -210,12 +210,12 @@ base::TimeDelta initial_vsync_interval) { scoped_ptr<DelayBasedTimeSource> time_source = DelayBasedTimeSource::Create(initial_vsync_interval, task_runner); - return make_scoped_ptr(new SyntheticBeginFrameSource(time_source.Pass())); + return make_scoped_ptr(new SyntheticBeginFrameSource(std::move(time_source))); } SyntheticBeginFrameSource::SyntheticBeginFrameSource( scoped_ptr<DelayBasedTimeSource> time_source) - : BeginFrameSourceBase(), time_source_(time_source.Pass()) { + : BeginFrameSourceBase(), time_source_(std::move(time_source)) { time_source_->SetActive(false); time_source_->SetClient(this); }
diff --git a/cc/scheduler/compositor_timing_history.cc b/cc/scheduler/compositor_timing_history.cc index 8c1bbe3..e82356b 100644 --- a/cc/scheduler/compositor_timing_history.cc +++ b/cc/scheduler/compositor_timing_history.cc
@@ -38,6 +38,7 @@ virtual void AddDrawDuration(base::TimeDelta duration, base::TimeDelta estimate, bool affects_estimate) = 0; + virtual void AddSwapToAckLatency(base::TimeDelta duration) = 0; }; namespace { @@ -179,6 +180,11 @@ REPORT_COMPOSITOR_TIMING_HISTORY_UMA("Renderer", "Draw"); DeprecatedDrawDurationUMA(duration, estimate); } + + void AddSwapToAckLatency(base::TimeDelta duration) override { + UMA_HISTOGRAM_CUSTOM_TIMES_MICROS("Scheduling.Renderer.SwapToAckLatency", + duration); + } }; class BrowserUMAReporter : public CompositorTimingHistory::UMAReporter { @@ -235,6 +241,11 @@ REPORT_COMPOSITOR_TIMING_HISTORY_UMA("Browser", "Draw"); DeprecatedDrawDurationUMA(duration, estimate); } + + void AddSwapToAckLatency(base::TimeDelta duration) override { + UMA_HISTOGRAM_CUSTOM_TIMES_MICROS("Scheduling.Browser.SwapToAckLatency", + duration); + } }; class NullUMAReporter : public CompositorTimingHistory::UMAReporter { @@ -263,6 +274,7 @@ void AddDrawDuration(base::TimeDelta duration, base::TimeDelta estimate, bool affects_estimate) override {} + void AddSwapToAckLatency(base::TimeDelta duration) override {} }; } // namespace @@ -536,4 +548,20 @@ start_draw_time_ = base::TimeTicks(); } +void CompositorTimingHistory::DidSwapBuffers() { + DCHECK_EQ(base::TimeTicks(), swap_start_time_); + swap_start_time_ = Now(); +} + +void CompositorTimingHistory::DidSwapBuffersComplete() { + DCHECK_NE(base::TimeTicks(), swap_start_time_); + base::TimeDelta swap_to_ack_duration = Now() - swap_start_time_; + uma_reporter_->AddSwapToAckLatency(swap_to_ack_duration); + swap_start_time_ = base::TimeTicks(); +} + +void CompositorTimingHistory::DidSwapBuffersReset() { + swap_start_time_ = base::TimeTicks(); +} + } // namespace cc
diff --git a/cc/scheduler/compositor_timing_history.h b/cc/scheduler/compositor_timing_history.h index 757072b8..b09923ab 100644 --- a/cc/scheduler/compositor_timing_history.h +++ b/cc/scheduler/compositor_timing_history.h
@@ -61,6 +61,9 @@ void DidActivate(); void WillDraw(); void DidDraw(); + void DidSwapBuffers(); + void DidSwapBuffersComplete(); + void DidSwapBuffersReset(); protected: static scoped_ptr<UMAReporter> CreateUMAReporter(UMACategory category); @@ -84,6 +87,7 @@ base::TimeTicks start_prepare_tiles_time_; base::TimeTicks start_activate_time_; base::TimeTicks start_draw_time_; + base::TimeTicks swap_start_time_; scoped_ptr<UMAReporter> uma_reporter_; RenderingStatsInstrumentation* rendering_stats_instrumentation_;
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc index eb2c3e14..70884d1 100644 --- a/cc/scheduler/scheduler.cc +++ b/cc/scheduler/scheduler.cc
@@ -42,8 +42,8 @@ BackToBackBeginFrameSource::Create(task_runner); return make_scoped_ptr(new Scheduler( client, settings, layer_tree_host_id, task_runner, external_frame_source, - synthetic_frame_source.Pass(), unthrottled_frame_source.Pass(), - compositor_timing_history.Pass())); + std::move(synthetic_frame_source), std::move(unthrottled_frame_source), + std::move(compositor_timing_history))); } Scheduler::Scheduler( @@ -60,11 +60,11 @@ layer_tree_host_id_(layer_tree_host_id), task_runner_(task_runner), external_frame_source_(external_frame_source), - synthetic_frame_source_(synthetic_frame_source.Pass()), - unthrottled_frame_source_(unthrottled_frame_source.Pass()), + synthetic_frame_source_(std::move(synthetic_frame_source)), + unthrottled_frame_source_(std::move(unthrottled_frame_source)), frame_source_(BeginFrameSourceMultiplexer::Create()), throttle_frame_production_(false), - compositor_timing_history_(compositor_timing_history.Pass()), + compositor_timing_history_(std::move(compositor_timing_history)), begin_impl_frame_deadline_mode_( SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE), begin_impl_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), @@ -194,6 +194,7 @@ } void Scheduler::DidSwapBuffers() { + compositor_timing_history_->DidSwapBuffers(); state_machine_.DidSwapBuffers(); // There is no need to call ProcessScheduledActions here because @@ -205,12 +206,16 @@ void Scheduler::DidSwapBuffersComplete() { DCHECK_GT(state_machine_.pending_swaps(), 0) << AsValue()->ToString(); + compositor_timing_history_->DidSwapBuffersComplete(); state_machine_.DidSwapBuffersComplete(); ProcessScheduledActions(); } -void Scheduler::SetImplLatencyTakesPriority(bool impl_latency_takes_priority) { - state_machine_.SetImplLatencyTakesPriority(impl_latency_takes_priority); +void Scheduler::SetTreePrioritiesAndScrollState( + TreePriority tree_priority, + ScrollHandlerState scroll_handler_state) { + state_machine_.SetTreePrioritiesAndScrollState(tree_priority, + scroll_handler_state); ProcessScheduledActions(); } @@ -254,6 +259,7 @@ TRACE_EVENT0("cc", "Scheduler::DidCreateAndInitializeOutputSurface"); DCHECK(!frame_source_->NeedsBeginFrames()); DCHECK(begin_impl_frame_deadline_task_.IsCancelled()); + compositor_timing_history_->DidSwapBuffersReset(); state_machine_.DidCreateAndInitializeOutputSurface(); UpdateCompositorTimingHistoryRecordingEnabled(); ProcessScheduledActions(); @@ -307,7 +313,6 @@ // TODO(brianderson): Adjust deadline in the DisplayScheduler. BeginFrameArgs adjusted_args(args); adjusted_args.deadline -= EstimatedParentDrawTime(); - adjusted_args.on_critical_path = !ImplLatencyTakesPriority(); // Deliver BeginFrames to children. // TODO(brianderson): Move this responsibility to the DisplayScheduler. @@ -464,11 +469,44 @@ adjusted_args.deadline -= compositor_timing_history_->DrawDurationEstimate(); adjusted_args.deadline -= kDeadlineFudgeFactor; - if (ShouldRecoverMainLatency(adjusted_args)) { + base::TimeDelta bmf_start_to_activate = + compositor_timing_history_ + ->BeginMainFrameStartToCommitDurationEstimate() + + compositor_timing_history_->CommitToReadyToActivateDurationEstimate() + + compositor_timing_history_->ActivateDurationEstimate(); + + base::TimeDelta bmf_to_activate_estimate_if_critical = + bmf_start_to_activate + + compositor_timing_history_->BeginMainFrameQueueDurationCriticalEstimate(); + + bool can_activate_before_deadline_if_critical = + CanBeginMainFrameAndActivateBeforeDeadline( + adjusted_args, bmf_to_activate_estimate_if_critical); + state_machine_.SetCriticalBeginMainFrameToActivateIsFast( + can_activate_before_deadline_if_critical); + + // Update the BeginMainFrame args now that we know whether the main + // thread will be on the critical path or not. + begin_main_frame_args_ = adjusted_args; + begin_main_frame_args_.on_critical_path = !ImplLatencyTakesPriority(); + + bool can_activate_before_deadline = can_activate_before_deadline_if_critical; + if (!begin_main_frame_args_.on_critical_path) { + base::TimeDelta bmf_to_activate_estimate = + bmf_start_to_activate + + compositor_timing_history_ + ->BeginMainFrameQueueDurationNotCriticalEstimate(); + + can_activate_before_deadline = CanBeginMainFrameAndActivateBeforeDeadline( + adjusted_args, bmf_to_activate_estimate); + } + + if (ShouldRecoverMainLatency(adjusted_args, can_activate_before_deadline)) { TRACE_EVENT_INSTANT0("cc", "SkipBeginMainFrameToReduceLatency", TRACE_EVENT_SCOPE_THREAD); state_machine_.SetSkipNextBeginMainFrameToReduceLatency(); - } else if (ShouldRecoverImplLatency(adjusted_args)) { + } else if (ShouldRecoverImplLatency(adjusted_args, + can_activate_before_deadline)) { TRACE_EVENT_INSTANT0("cc", "SkipBeginImplFrameToReduceLatency", TRACE_EVENT_SCOPE_THREAD); frame_source_->DidFinishFrame(begin_retro_frame_args_.size()); @@ -485,6 +523,13 @@ void Scheduler::BeginImplFrameSynchronous(const BeginFrameArgs& args) { TRACE_EVENT1("cc,benchmark", "Scheduler::BeginImplFrame", "args", args.AsValue()); + + // The main thread currently can't commit before we draw with the + // synchronous compositor, so never consider the BeginMainFrame fast. + state_machine_.SetCriticalBeginMainFrameToActivateIsFast(false); + begin_main_frame_args_ = args; + begin_main_frame_args_.on_critical_path = !ImplLatencyTakesPriority(); + BeginImplFrame(args); FinishImplFrame(); } @@ -508,7 +553,6 @@ DCHECK(state_machine_.HasInitializedOutputSurface()); begin_impl_frame_tracker_.Start(args); - begin_main_frame_args_ = args; state_machine_.OnBeginImplFrame(); devtools_instrumentation::DidBeginFrame(layer_tree_host_id_); client_->WillBeginImplFrame(begin_impl_frame_tracker_.Current()); @@ -780,7 +824,9 @@ state_machine_.HasInitializedOutputSurface() && state_machine_.visible()); } -bool Scheduler::ShouldRecoverMainLatency(const BeginFrameArgs& args) const { +bool Scheduler::ShouldRecoverMainLatency( + const BeginFrameArgs& args, + bool can_activate_before_deadline) const { DCHECK(!settings_.using_synchronous_renderer_compositor); if (!state_machine_.main_thread_missed_last_deadline()) @@ -788,13 +834,15 @@ // When prioritizing impl thread latency, we currently put the // main thread in a high latency mode. Don't try to fight it. - if (state_machine_.impl_latency_takes_priority()) + if (state_machine_.ImplLatencyTakesPriority()) return false; - return CanCommitAndActivateBeforeDeadline(args); + return can_activate_before_deadline; } -bool Scheduler::ShouldRecoverImplLatency(const BeginFrameArgs& args) const { +bool Scheduler::ShouldRecoverImplLatency( + const BeginFrameArgs& args, + bool can_activate_before_deadline) const { DCHECK(!settings_.using_synchronous_renderer_compositor); // Disable impl thread latency recovery when using the unthrottled @@ -814,7 +862,7 @@ // When prioritizing impl thread latency, the deadline doesn't wait // for the main thread. - if (state_machine_.impl_latency_takes_priority()) + if (state_machine_.ImplLatencyTakesPriority()) return can_draw_before_deadline; // If we only have impl-side updates, the deadline doesn't wait for @@ -826,18 +874,16 @@ // to the impl thread. In this case, only try to also recover impl thread // latency if both the main and impl threads can run serially before the // deadline. - return CanCommitAndActivateBeforeDeadline(args); + return can_activate_before_deadline; } -bool Scheduler::CanCommitAndActivateBeforeDeadline( - const BeginFrameArgs& args) const { +bool Scheduler::CanBeginMainFrameAndActivateBeforeDeadline( + const BeginFrameArgs& args, + base::TimeDelta bmf_to_activate_estimate) const { // Check if the main thread computation and commit can be finished before the // impl thread's deadline. base::TimeTicks estimated_draw_time = - args.frame_time + - compositor_timing_history_->BeginMainFrameToCommitDurationEstimate() + - compositor_timing_history_->CommitToReadyToActivateDurationEstimate() + - compositor_timing_history_->ActivateDurationEstimate(); + args.frame_time + bmf_to_activate_estimate; return estimated_draw_time < args.deadline; }
diff --git a/cc/scheduler/scheduler.h b/cc/scheduler/scheduler.h index 6f8ba1e..ac0b15f 100644 --- a/cc/scheduler/scheduler.h +++ b/cc/scheduler/scheduler.h
@@ -20,6 +20,7 @@ #include "cc/scheduler/draw_result.h" #include "cc/scheduler/scheduler_settings.h" #include "cc/scheduler/scheduler_state_machine.h" +#include "cc/tiles/tile_priority.h" namespace base { namespace trace_event { @@ -98,7 +99,8 @@ void DidSwapBuffers(); void DidSwapBuffersComplete(); - void SetImplLatencyTakesPriority(bool impl_latency_takes_priority); + void SetTreePrioritiesAndScrollState(TreePriority tree_priority, + ScrollHandlerState scroll_handler_state); void NotifyReadyToCommit(); void BeginMainFrameAborted(CommitEarlyOutReason reason); @@ -125,7 +127,7 @@ return !begin_impl_frame_deadline_task_.IsCancelled(); } bool ImplLatencyTakesPriority() const { - return state_machine_.impl_latency_takes_priority(); + return state_machine_.ImplLatencyTakesPriority(); } // Pass in a main_thread_start_time of base::TimeTicks() if it is not @@ -200,9 +202,13 @@ void DrawAndSwapForced(); void ProcessScheduledActions(); void UpdateCompositorTimingHistoryRecordingEnabled(); - bool ShouldRecoverMainLatency(const BeginFrameArgs& args) const; - bool ShouldRecoverImplLatency(const BeginFrameArgs& args) const; - bool CanCommitAndActivateBeforeDeadline(const BeginFrameArgs& args) const; + bool ShouldRecoverMainLatency(const BeginFrameArgs& args, + bool can_activate_before_deadline) const; + bool ShouldRecoverImplLatency(const BeginFrameArgs& args, + bool can_activate_before_deadline) const; + bool CanBeginMainFrameAndActivateBeforeDeadline( + const BeginFrameArgs& args, + base::TimeDelta bmf_to_activate_estimate) const; void AdvanceCommitStateIfPossible(); bool IsBeginMainFrameSentOrStarted() const; void BeginRetroFrame();
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index d770689..3330bd6 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc
@@ -51,7 +51,10 @@ pending_tree_is_ready_for_activation_(false), active_tree_needs_first_draw_(false), did_create_and_initialize_first_output_surface_(false), - impl_latency_takes_priority_(false), + tree_priority_(NEW_CONTENT_TAKES_PRIORITY), + scroll_handler_state_( + ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER), + critical_begin_main_frame_to_activate_is_fast_(true), main_thread_missed_last_deadline_(false), skip_next_begin_main_frame_to_reduce_latency_(false), children_need_begin_frames_(false), @@ -150,6 +153,17 @@ return "???"; } +const char* ScrollHandlerStateToString(ScrollHandlerState state) { + switch (state) { + case ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER: + return "SCROLL_AFFECTS_SCROLL_HANDLER"; + case ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER: + return "SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER"; + } + NOTREACHED(); + return "???"; +} + const char* SchedulerStateMachine::ActionToString(Action action) { switch (action) { case ACTION_NONE: @@ -240,8 +254,11 @@ state->SetBoolean("wait_for_ready_to_draw", wait_for_ready_to_draw_); state->SetBoolean("did_create_and_initialize_first_output_surface", did_create_and_initialize_first_output_surface_); - state->SetBoolean("impl_latency_takes_priority", - impl_latency_takes_priority_); + state->SetString("tree_priority", TreePriorityToString(tree_priority_)); + state->SetString("scroll_handler_state", + ScrollHandlerStateToString(scroll_handler_state_)); + state->SetBoolean("critical_begin_main_frame_to_activate_is_fast_", + critical_begin_main_frame_to_activate_is_fast_); state->SetBoolean("main_thread_missed_last_deadline", main_thread_missed_last_deadline_); state->SetBoolean("skip_next_begin_main_frame_to_reduce_latency", @@ -435,8 +452,8 @@ return false; // Don't send BeginMainFrame early if we are prioritizing the active tree - // because of impl_latency_takes_priority_. - if (impl_latency_takes_priority_ && + // because of ImplLatencyTakesPriority. + if (ImplLatencyTakesPriority() && (has_pending_tree_ || active_tree_needs_first_draw_)) { return false; } @@ -472,7 +489,7 @@ // SwapAck throttle the BeginMainFrames unless we just swapped to // potentially improve impl-thread latency over main-thread throughput. // TODO(brianderson): Remove this restriction to improve throughput or - // make it conditional on impl_latency_takes_priority_. + // make it conditional on ImplLatencyTakesPriority. bool just_swapped_in_deadline = begin_impl_frame_state_ == BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE && did_perform_swap_in_last_draw_; @@ -903,8 +920,8 @@ !has_pending_tree_) return true; - // Prioritize impl-thread draws in impl_latency_takes_priority_ mode. - if (impl_latency_takes_priority_) + // Prioritize impl-thread draws in ImplLatencyTakesPriority mode. + if (ImplLatencyTakesPriority()) return true; return false; @@ -976,9 +993,31 @@ pending_swaps_--; } -void SchedulerStateMachine::SetImplLatencyTakesPriority( - bool impl_latency_takes_priority) { - impl_latency_takes_priority_ = impl_latency_takes_priority; +void SchedulerStateMachine::SetTreePrioritiesAndScrollState( + TreePriority tree_priority, + ScrollHandlerState scroll_handler_state) { + tree_priority_ = tree_priority; + scroll_handler_state_ = scroll_handler_state; +} + +void SchedulerStateMachine::SetCriticalBeginMainFrameToActivateIsFast( + bool is_fast) { + critical_begin_main_frame_to_activate_is_fast_ = is_fast; +} + +bool SchedulerStateMachine::ImplLatencyTakesPriority() const { + // Attempt to synchronize with the main thread if it has a scroll listener + // and is fast. + if (ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER == + scroll_handler_state_ && + critical_begin_main_frame_to_activate_is_fast_) + return false; + + // Don't wait for the main thread if we are prioritizing smoothness. + if (SMOOTHNESS_TAKES_PRIORITY == tree_priority_) + return true; + + return false; } void SchedulerStateMachine::DidDrawIfPossibleCompleted(DrawResult result) {
diff --git a/cc/scheduler/scheduler_state_machine.h b/cc/scheduler/scheduler_state_machine.h index 3c32dc6..36a60a7 100644 --- a/cc/scheduler/scheduler_state_machine.h +++ b/cc/scheduler/scheduler_state_machine.h
@@ -14,6 +14,7 @@ #include "cc/scheduler/commit_earlyout_reason.h" #include "cc/scheduler/draw_result.h" #include "cc/scheduler/scheduler_settings.h" +#include "cc/tiles/tile_priority.h" namespace base { namespace trace_event { @@ -25,6 +26,12 @@ namespace cc { +enum class ScrollHandlerState { + SCROLL_AFFECTS_SCROLL_HANDLER, + SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, +}; +const char* ScrollHandlerStateToString(ScrollHandlerState state); + // The SchedulerStateMachine decides how to coordinate main thread activites // like painting/running javascript with rendering and input activities on the // impl thread. @@ -190,10 +197,15 @@ // Indicates whether to prioritize impl thread latency (i.e., animation // smoothness) over new content activation. - void SetImplLatencyTakesPriority(bool impl_latency_takes_priority); - bool impl_latency_takes_priority() const { - return impl_latency_takes_priority_; - } + void SetTreePrioritiesAndScrollState(TreePriority tree_priority, + ScrollHandlerState scroll_handler_state); + + // Indicates if the main thread will likely respond within 1 vsync. + void SetCriticalBeginMainFrameToActivateIsFast(bool is_fast); + + // A function of SetTreePrioritiesAndScrollState and + // SetCriticalBeginMainFrameToActivateIsFast. + bool ImplLatencyTakesPriority() const; // Indicates whether ACTION_DRAW_AND_SWAP_IF_POSSIBLE drew to the screen. void DidDrawIfPossibleCompleted(DrawResult result); @@ -330,7 +342,9 @@ bool pending_tree_is_ready_for_activation_; bool active_tree_needs_first_draw_; bool did_create_and_initialize_first_output_surface_; - bool impl_latency_takes_priority_; + TreePriority tree_priority_; + ScrollHandlerState scroll_handler_state_; + bool critical_begin_main_frame_to_activate_is_fast_; bool main_thread_missed_last_deadline_; bool skip_next_begin_main_frame_to_reduce_latency_; bool children_need_begin_frames_;
diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc index fcd4516..90c126a 100644 --- a/cc/scheduler/scheduler_state_machine_unittest.cc +++ b/cc/scheduler/scheduler_state_machine_unittest.cc
@@ -1901,7 +1901,9 @@ // Verify the deadline is not triggered early until we enter // prefer impl latency mode. EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); - state.SetImplLatencyTakesPriority(true); + state.SetTreePrioritiesAndScrollState( + SMOOTHNESS_TAKES_PRIORITY, + ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER); EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); // Trigger the deadline.
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc index 362946f..1392c30 100644 --- a/cc/scheduler/scheduler_unittest.cc +++ b/cc/scheduler/scheduler_unittest.cc
@@ -45,6 +45,9 @@ namespace cc { namespace { +base::TimeDelta kSlowDuration = base::TimeDelta::FromSeconds(1); +base::TimeDelta kFastDuration = base::TimeDelta::FromMilliseconds(1); + class FakeSchedulerClient : public SchedulerClient { public: FakeSchedulerClient() @@ -271,13 +274,12 @@ scheduler_ = TestScheduler::Create( now_src_.get(), client_.get(), scheduler_settings_, 0, task_runner_.get(), fake_external_begin_frame_source_.get(), - fake_compositor_timing_history.Pass()); + std::move(fake_compositor_timing_history)); DCHECK(scheduler_); client_->set_scheduler(scheduler_.get()); // Use large estimates by default to avoid latency recovery in most tests. - base::TimeDelta slow_duration = base::TimeDelta::FromSeconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(slow_duration); + fake_compositor_timing_history_->SetAllEstimatesTo(kSlowDuration); return scheduler_.get(); } @@ -293,7 +295,7 @@ void SetUpScheduler(scoped_ptr<FakeSchedulerClient> client, bool initSurface) { - client_ = client.Pass(); + client_ = std::move(client); if (initSurface) CreateSchedulerAndInitSurface(); else @@ -424,6 +426,9 @@ void BeginFramesNotFromClient_SwapThrottled( bool use_external_begin_frame_source, bool throttle_frame_production); + bool BeginMainFrameOnCriticalPath(TreePriority tree_priority, + ScrollHandlerState scroll_handler_state, + base::TimeDelta durations); scoped_ptr<base::SimpleTestTickClock> now_src_; scoped_refptr<OrderedSimpleTaskRunner> task_runner_; @@ -485,8 +490,9 @@ scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - fake_compositor_timing_history_->SetBeginMainFrameToCommitDurationEstimate( - base::TimeDelta::FromMilliseconds(2)); + fake_compositor_timing_history_ + ->SetBeginMainFrameStartToCommitDurationEstimate( + base::TimeDelta::FromMilliseconds(2)); fake_compositor_timing_history_->SetCommitToReadyToActivateDurationEstimate( base::TimeDelta::FromMilliseconds(4)); fake_compositor_timing_history_->SetDrawDurationEstimate( @@ -1228,7 +1234,7 @@ scoped_ptr<SchedulerClientNeedsPrepareTilesInDraw> client = make_scoped_ptr(new SchedulerClientNeedsPrepareTilesInDraw); scheduler_settings_.use_external_begin_frame_source = true; - SetUpScheduler(client.Pass(), true); + SetUpScheduler(std::move(client), true); // Simulate a few visibility changes and associated PrepareTiles. for (int i = 0; i < 10; i++) { @@ -1381,6 +1387,7 @@ task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(true)); EXPECT_EQ(expect_send_begin_main_frame, scheduler_->MainThreadMissedLastDeadline()); + EXPECT_TRUE(client_->HasAction("WillBeginImplFrame")); EXPECT_EQ(expect_send_begin_main_frame, client_->HasAction("ScheduledActionSendBeginMainFrame")); } @@ -1388,23 +1395,55 @@ TEST_F(SchedulerTest, MainFrameSkippedAfterLateCommit) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); bool expect_send_begin_main_frame = false; EXPECT_SCOPED( CheckMainFrameSkippedAfterLateCommit(expect_send_begin_main_frame)); } +// Response times of BeginMainFrame's without the critical path flag set +// should not affect whether we recover latency or not. +TEST_F( + SchedulerTest, + MainFrameSkippedAfterLateCommit_LongBeginMainFrameQueueDurationNotCritical) { + scheduler_settings_.use_external_begin_frame_source = true; + SetUpScheduler(true); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); + fake_compositor_timing_history_ + ->SetBeginMainFrameQueueDurationNotCriticalEstimate(kSlowDuration); + + bool expect_send_begin_main_frame = false; + EXPECT_SCOPED( + CheckMainFrameSkippedAfterLateCommit(expect_send_begin_main_frame)); +} + +// Response times of BeginMainFrame's with the critical path flag set +// should affect whether we recover latency or not. +TEST_F( + SchedulerTest, + MainFrameNotSkippedAfterLateCommit_LongBeginMainFrameQueueDurationCritical) { + scheduler_settings_.use_external_begin_frame_source = true; + SetUpScheduler(true); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); + fake_compositor_timing_history_ + ->SetBeginMainFrameQueueDurationCriticalEstimate(kSlowDuration); + fake_compositor_timing_history_ + ->SetBeginMainFrameQueueDurationNotCriticalEstimate(kSlowDuration); + + bool expect_send_begin_main_frame = true; + EXPECT_SCOPED( + CheckMainFrameSkippedAfterLateCommit(expect_send_begin_main_frame)); +} + TEST_F(SchedulerTest, MainFrameNotSkippedAfterLateCommitInPreferImplLatencyMode) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - scheduler_->SetImplLatencyTakesPriority(true); - - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); + scheduler_->SetTreePrioritiesAndScrollState( + SMOOTHNESS_TAKES_PRIORITY, + ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); bool expect_send_begin_main_frame = true; EXPECT_SCOPED( @@ -1415,11 +1454,9 @@ MainFrameNotSkippedAfterLateCommit_CommitEstimateTooLong) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); - auto slow_duration = base::TimeDelta::FromSeconds(1); - fake_compositor_timing_history_->SetBeginMainFrameToCommitDurationEstimate( - slow_duration); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); + fake_compositor_timing_history_ + ->SetBeginMainFrameStartToCommitDurationEstimate(kSlowDuration); bool expect_send_begin_main_frame = true; EXPECT_SCOPED( @@ -1430,11 +1467,9 @@ MainFrameNotSkippedAfterLateCommit_ReadyToActivateEstimateTooLong) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); - auto slow_duration = base::TimeDelta::FromSeconds(1); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); fake_compositor_timing_history_->SetCommitToReadyToActivateDurationEstimate( - slow_duration); + kSlowDuration); bool expect_send_begin_main_frame = true; EXPECT_SCOPED( @@ -1445,10 +1480,8 @@ MainFrameNotSkippedAfterLateCommit_ActivateEstimateTooLong) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); - auto slow_duration = base::TimeDelta::FromSeconds(1); - fake_compositor_timing_history_->SetActivateDurationEstimate(slow_duration); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); + fake_compositor_timing_history_->SetActivateDurationEstimate(kSlowDuration); bool expect_send_begin_main_frame = true; EXPECT_SCOPED( @@ -1458,10 +1491,8 @@ TEST_F(SchedulerTest, MainFrameNotSkippedAfterLateCommit_DrawEstimateTooLong) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); - auto slow_duration = base::TimeDelta::FromSeconds(1); - fake_compositor_timing_history_->SetDrawDurationEstimate(slow_duration); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); + fake_compositor_timing_history_->SetDrawDurationEstimate(kSlowDuration); bool expect_send_begin_main_frame = true; EXPECT_SCOPED( @@ -1549,9 +1580,7 @@ ImplFrameSkippedAfterLateSwapAck_FastEstimates_SwapAckThenDeadline) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); bool swap_ack_before_deadline = true; EXPECT_SCOPED(ImplFrameSkippedAfterLateSwapAck(swap_ack_before_deadline)); @@ -1561,9 +1590,20 @@ ImplFrameSkippedAfterLateSwapAck_FastEstimates_DeadlineThenSwapAck) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); + bool swap_ack_before_deadline = false; + EXPECT_SCOPED(ImplFrameSkippedAfterLateSwapAck(swap_ack_before_deadline)); +} + +TEST_F( + SchedulerTest, + ImplFrameSkippedAfterLateSwapAck_LongBeginMainFrameQueueDurationNotCritical) { + scheduler_settings_.use_external_begin_frame_source = true; + SetUpScheduler(true); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); + fake_compositor_timing_history_ + ->SetBeginMainFrameQueueDurationNotCriticalEstimate(kSlowDuration); bool swap_ack_before_deadline = false; EXPECT_SCOPED(ImplFrameSkippedAfterLateSwapAck(swap_ack_before_deadline)); @@ -1577,11 +1617,11 @@ // Even if every estimate related to the main thread is slow, we should // still expect to recover impl thread latency if the draw is fast and we // are in impl latency takes priority. - scheduler_->SetImplLatencyTakesPriority(true); - auto slow_duration = base::TimeDelta::FromSeconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(slow_duration); - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetDrawDurationEstimate(fast_duration); + scheduler_->SetTreePrioritiesAndScrollState( + SMOOTHNESS_TAKES_PRIORITY, + ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER); + fake_compositor_timing_history_->SetAllEstimatesTo(kSlowDuration); + fake_compositor_timing_history_->SetDrawDurationEstimate(kFastDuration); bool swap_ack_before_deadline = false; EXPECT_SCOPED(ImplFrameSkippedAfterLateSwapAck(swap_ack_before_deadline)); @@ -1599,10 +1639,8 @@ // Even if every estimate related to the main thread is slow, we should // still expect to recover impl thread latency if there are no commits from // the main thread. - auto slow_duration = base::TimeDelta::FromSeconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(slow_duration); - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetDrawDurationEstimate(fast_duration); + fake_compositor_timing_history_->SetAllEstimatesTo(kSlowDuration); + fake_compositor_timing_history_->SetDrawDurationEstimate(kFastDuration); // Draw and swap for first BeginFrame client_->Reset(); @@ -1708,15 +1746,26 @@ } } +TEST_F( + SchedulerTest, + ImplFrameIsNotSkippedAfterLateSwapAck_BeginMainFrameQueueDurationCriticalTooLong) { + scheduler_settings_.use_external_begin_frame_source = true; + SetUpScheduler(true); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); + fake_compositor_timing_history_ + ->SetBeginMainFrameQueueDurationCriticalEstimate(kSlowDuration); + fake_compositor_timing_history_ + ->SetBeginMainFrameQueueDurationNotCriticalEstimate(kSlowDuration); + EXPECT_SCOPED(ImplFrameIsNotSkippedAfterLateSwapAck()); +} + TEST_F(SchedulerTest, ImplFrameIsNotSkippedAfterLateSwapAck_CommitEstimateTooLong) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); - auto slow_duration = base::TimeDelta::FromSeconds(1); - fake_compositor_timing_history_->SetBeginMainFrameToCommitDurationEstimate( - slow_duration); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); + fake_compositor_timing_history_ + ->SetBeginMainFrameStartToCommitDurationEstimate(kSlowDuration); EXPECT_SCOPED(ImplFrameIsNotSkippedAfterLateSwapAck()); } @@ -1724,11 +1773,9 @@ ImplFrameIsNotSkippedAfterLateSwapAck_ReadyToActivateEstimateTooLong) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); - auto slow_duration = base::TimeDelta::FromSeconds(1); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); fake_compositor_timing_history_->SetCommitToReadyToActivateDurationEstimate( - slow_duration); + kSlowDuration); EXPECT_SCOPED(ImplFrameIsNotSkippedAfterLateSwapAck()); } @@ -1736,10 +1783,8 @@ ImplFrameIsNotSkippedAfterLateSwapAck_ActivateEstimateTooLong) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); - auto slow_duration = base::TimeDelta::FromSeconds(1); - fake_compositor_timing_history_->SetActivateDurationEstimate(slow_duration); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); + fake_compositor_timing_history_->SetActivateDurationEstimate(kSlowDuration); EXPECT_SCOPED(ImplFrameIsNotSkippedAfterLateSwapAck()); } @@ -1747,10 +1792,8 @@ ImplFrameIsNotSkippedAfterLateSwapAck_DrawEstimateTooLong) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); - auto slow_duration = base::TimeDelta::FromSeconds(1); - fake_compositor_timing_history_->SetDrawDurationEstimate(slow_duration); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); + fake_compositor_timing_history_->SetDrawDurationEstimate(kSlowDuration); EXPECT_SCOPED(ImplFrameIsNotSkippedAfterLateSwapAck()); } @@ -1762,9 +1805,7 @@ // and impl threads are in a high latency mode. scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - - auto slow_duration = base::TimeDelta::FromSeconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(slow_duration); + fake_compositor_timing_history_->SetAllEstimatesTo(kSlowDuration); // To get into a high latency state, this test disables automatic swap acks. client_->SetAutomaticSwapAck(false); @@ -1825,8 +1866,7 @@ EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); // Lower estimates so that the scheduler will attempt latency recovery. - auto fast_duration = base::TimeDelta::FromMilliseconds(1); - fake_compositor_timing_history_->SetAllEstimatesTo(fast_duration); + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); // Now that both threads are in a high latency mode, make sure we // skip the BeginMainFrame, then the BeginImplFrame, but not both @@ -3331,7 +3371,7 @@ scoped_ptr<FakeSchedulerClient> client = make_scoped_ptr(new SchedulerClientSetNeedsPrepareTilesOnDraw); - SetUpScheduler(client.Pass(), true); + SetUpScheduler(std::move(client), true); scheduler_->SetNeedsRedraw(); EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); @@ -3478,39 +3518,112 @@ TEST_F(SchedulerTest, ImplLatencyTakesPriority) { SetUpScheduler(true); - scheduler_->SetImplLatencyTakesPriority(true); + + scheduler_->SetTreePrioritiesAndScrollState( + SMOOTHNESS_TAKES_PRIORITY, + ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER); + scheduler_->SetCriticalBeginMainFrameToActivateIsFast(true); + EXPECT_TRUE(scheduler_->ImplLatencyTakesPriority()); + scheduler_->SetCriticalBeginMainFrameToActivateIsFast(false); EXPECT_TRUE(scheduler_->ImplLatencyTakesPriority()); - scheduler_->SetImplLatencyTakesPriority(false); + scheduler_->SetTreePrioritiesAndScrollState( + SMOOTHNESS_TAKES_PRIORITY, + ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER); + scheduler_->SetCriticalBeginMainFrameToActivateIsFast(true); + EXPECT_FALSE(scheduler_->ImplLatencyTakesPriority()); + scheduler_->SetCriticalBeginMainFrameToActivateIsFast(false); + EXPECT_TRUE(scheduler_->ImplLatencyTakesPriority()); + + scheduler_->SetTreePrioritiesAndScrollState( + SAME_PRIORITY_FOR_BOTH_TREES, + ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER); + scheduler_->SetCriticalBeginMainFrameToActivateIsFast(true); + EXPECT_FALSE(scheduler_->ImplLatencyTakesPriority()); + scheduler_->SetCriticalBeginMainFrameToActivateIsFast(false); + EXPECT_FALSE(scheduler_->ImplLatencyTakesPriority()); + + scheduler_->SetTreePrioritiesAndScrollState( + SAME_PRIORITY_FOR_BOTH_TREES, + ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER); + scheduler_->SetCriticalBeginMainFrameToActivateIsFast(true); + EXPECT_FALSE(scheduler_->ImplLatencyTakesPriority()); + scheduler_->SetCriticalBeginMainFrameToActivateIsFast(false); EXPECT_FALSE(scheduler_->ImplLatencyTakesPriority()); } -TEST_F(SchedulerTest, BeginMainFrameArgs_OnCriticalPath) { +// The three letters appeneded to each version of this test mean the following:s +// tree_priority: B = both trees same priority; A = active tree priority; +// scroll_handler_state: H = affects scroll handler; N = does not affect scroll +// handler; +// durations: F = fast durations; S = slow durations +bool SchedulerTest::BeginMainFrameOnCriticalPath( + TreePriority tree_priority, + ScrollHandlerState scroll_handler_state, + base::TimeDelta durations) { scheduler_settings_.use_external_begin_frame_source = true; SetUpScheduler(true); - - scheduler_->SetImplLatencyTakesPriority(false); - scheduler_->SetNeedsBeginMainFrame(); - + fake_compositor_timing_history_->SetAllEstimatesTo(durations); client_->Reset(); + scheduler_->SetTreePrioritiesAndScrollState(tree_priority, + scroll_handler_state); + scheduler_->SetNeedsBeginMainFrame(); EXPECT_FALSE(client_->last_begin_main_frame_args().IsValid()); EXPECT_SCOPED(AdvanceFrame()); EXPECT_TRUE(client_->last_begin_main_frame_args().IsValid()); - EXPECT_TRUE(client_->last_begin_main_frame_args().on_critical_path); + return client_->last_begin_main_frame_args().on_critical_path; } -TEST_F(SchedulerTest, BeginMainFrameArgs_NotOnCriticalPath) { - scheduler_settings_.use_external_begin_frame_source = true; - SetUpScheduler(true); +TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_BNF) { + EXPECT_TRUE(BeginMainFrameOnCriticalPath( + SAME_PRIORITY_FOR_BOTH_TREES, + ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, + kFastDuration)); +} - scheduler_->SetImplLatencyTakesPriority(true); - scheduler_->SetNeedsBeginMainFrame(); +TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_BNS) { + EXPECT_TRUE(BeginMainFrameOnCriticalPath( + SAME_PRIORITY_FOR_BOTH_TREES, + ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, + kSlowDuration)); +} - client_->Reset(); - EXPECT_FALSE(client_->last_begin_main_frame_args().IsValid()); - EXPECT_SCOPED(AdvanceFrame()); - EXPECT_TRUE(client_->last_begin_main_frame_args().IsValid()); - EXPECT_FALSE(client_->last_begin_main_frame_args().on_critical_path); +TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_BHF) { + EXPECT_TRUE(BeginMainFrameOnCriticalPath( + SAME_PRIORITY_FOR_BOTH_TREES, + ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kFastDuration)); +} + +TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_BHS) { + EXPECT_TRUE(BeginMainFrameOnCriticalPath( + SAME_PRIORITY_FOR_BOTH_TREES, + ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); +} + +TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_ANF) { + EXPECT_FALSE(BeginMainFrameOnCriticalPath( + SMOOTHNESS_TAKES_PRIORITY, + ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, + kFastDuration)); +} + +TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_ANS) { + EXPECT_FALSE(BeginMainFrameOnCriticalPath( + SMOOTHNESS_TAKES_PRIORITY, + ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER, + kSlowDuration)); +} + +TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHF) { + EXPECT_TRUE(BeginMainFrameOnCriticalPath( + SMOOTHNESS_TAKES_PRIORITY, + ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kFastDuration)); +} + +TEST_F(SchedulerTest, BeginMainFrameOnCriticalPath_AHS) { + EXPECT_FALSE(BeginMainFrameOnCriticalPath( + SMOOTHNESS_TAKES_PRIORITY, + ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER, kSlowDuration)); } } // namespace
diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc index ef9802c3..2cdcfcd 100644 --- a/cc/surfaces/display.cc +++ b/cc/surfaces/display.cc
@@ -54,7 +54,7 @@ bool Display::Initialize(scoped_ptr<OutputSurface> output_surface, DisplayScheduler* scheduler) { - output_surface_ = output_surface.Pass(); + output_surface_ = std::move(output_surface); scheduler_ = scheduler; return output_surface_->BindToClient(this); } @@ -118,16 +118,16 @@ texture_mailbox_deleter_.get(), settings_.highp_threshold_min); if (!renderer) return; - renderer_ = renderer.Pass(); + renderer_ = std::move(renderer); } else { scoped_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create( this, &settings_, output_surface_.get(), resource_provider.get()); if (!renderer) return; - renderer_ = renderer.Pass(); + renderer_ = std::move(renderer); } - resource_provider_ = resource_provider.Pass(); + resource_provider_ = std::move(resource_provider); // TODO(jbauman): Outputting an incomplete quad list doesn't work when using // overlays. bool output_partial_list = renderer_->Capabilities().using_partial_swap &&
diff --git a/cc/surfaces/display_unittest.cc b/cc/surfaces/display_unittest.cc index 7b82d961..a92496c 100644 --- a/cc/surfaces/display_unittest.cc +++ b/cc/surfaces/display_unittest.cc
@@ -62,12 +62,13 @@ void SetUpContext(scoped_ptr<TestWebGraphicsContext3D> context) { if (context) { output_surface_ = FakeOutputSurface::Create3d( - TestContextProvider::Create(context.Pass())); + TestContextProvider::Create(std::move(context))); } else { scoped_ptr<TestSoftwareOutputDevice> output_device( new TestSoftwareOutputDevice); software_output_device_ = output_device.get(); - output_surface_ = FakeOutputSurface::CreateSoftware(output_device.Pass()); + output_surface_ = + FakeOutputSurface::CreateSoftware(std::move(output_device)); } shared_bitmap_manager_.reset(new TestSharedBitmapManager); output_surface_ptr_ = output_surface_.get(); @@ -78,9 +79,9 @@ pass_list->swap(frame_data->render_pass_list); scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); + frame->delegated_frame_data = std::move(frame_data); - factory_.SubmitCompositorFrame(surface_id, frame.Pass(), + factory_.SubmitCompositorFrame(surface_id, std::move(frame), SurfaceFactory::DrawCallback()); } @@ -160,7 +161,7 @@ TestDisplayScheduler scheduler(&display, &fake_begin_frame_source_, task_runner_.get()); - display.Initialize(output_surface_.Pass(), &scheduler); + display.Initialize(std::move(output_surface_), &scheduler); SurfaceId surface_id(6); factory_.Create(surface_id); @@ -185,7 +186,7 @@ TestDisplayScheduler scheduler(&display, &fake_begin_frame_source_, task_runner_.get()); - display.Initialize(output_surface_.Pass(), &scheduler); + display.Initialize(std::move(output_surface_), &scheduler); SurfaceId surface_id(7u); EXPECT_FALSE(scheduler.damaged); @@ -209,7 +210,7 @@ pass->output_rect = gfx::Rect(0, 0, 100, 100); pass->damage_rect = gfx::Rect(10, 10, 1, 1); pass->id = RenderPassId(1, 1); - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); scheduler.ResetDamageForTest(); SubmitCompositorFrame(&pass_list, surface_id); @@ -233,7 +234,7 @@ pass->damage_rect = gfx::Rect(10, 10, 1, 1); pass->id = RenderPassId(1, 1); - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); scheduler.ResetDamageForTest(); SubmitCompositorFrame(&pass_list, surface_id); EXPECT_TRUE(scheduler.damaged); @@ -256,7 +257,7 @@ pass->damage_rect = gfx::Rect(10, 10, 0, 0); pass->id = RenderPassId(1, 1); - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); scheduler.ResetDamageForTest(); SubmitCompositorFrame(&pass_list, surface_id); EXPECT_TRUE(scheduler.damaged); @@ -276,7 +277,7 @@ pass->damage_rect = gfx::Rect(10, 10, 10, 10); pass->id = RenderPassId(1, 1); - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); scheduler.ResetDamageForTest(); SubmitCompositorFrame(&pass_list, surface_id); EXPECT_TRUE(scheduler.damaged); @@ -296,7 +297,7 @@ pass->damage_rect = gfx::Rect(10, 10, 0, 0); pass->id = RenderPassId(1, 1); - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); scheduler.ResetDamageForTest(); SubmitCompositorFrame(&pass_list, surface_id); EXPECT_TRUE(scheduler.damaged); @@ -321,7 +322,7 @@ base::Bind(&CopyCallback, ©_called))); pass->id = RenderPassId(1, 1); - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); scheduler.ResetDamageForTest(); SubmitCompositorFrame(&pass_list, surface_id); EXPECT_TRUE(scheduler.damaged); @@ -342,16 +343,16 @@ pass->damage_rect = gfx::Rect(10, 10, 0, 0); pass->id = RenderPassId(1, 1); - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); scheduler.ResetDamageForTest(); scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); pass_list.swap(frame_data->render_pass_list); scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); + frame->delegated_frame_data = std::move(frame_data); frame->metadata.latency_info.push_back(ui::LatencyInfo()); - factory_.SubmitCompositorFrame(surface_id, frame.Pass(), + factory_.SubmitCompositorFrame(surface_id, std::move(frame), SurfaceFactory::DrawCallback()); EXPECT_TRUE(scheduler.damaged); EXPECT_FALSE(scheduler.display_resized_); @@ -375,15 +376,15 @@ pass->damage_rect = gfx::Rect(10, 10, 10, 10); pass->id = RenderPassId(1, 1); - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); scheduler.ResetDamageForTest(); scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); pass_list.swap(frame_data->render_pass_list); scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); + frame->delegated_frame_data = std::move(frame_data); - factory_.SubmitCompositorFrame(surface_id, frame.Pass(), + factory_.SubmitCompositorFrame(surface_id, std::move(frame), SurfaceFactory::DrawCallback()); EXPECT_TRUE(scheduler.damaged); EXPECT_FALSE(scheduler.display_resized_); @@ -406,7 +407,7 @@ TEST_F(DisplayTest, Finish) { scoped_ptr<MockedContext> context(new MockedContext()); MockedContext* context_ptr = context.get(); - SetUpContext(context.Pass()); + SetUpContext(std::move(context)); EXPECT_CALL(*context_ptr, shallowFinishCHROMIUM()).Times(0); TestDisplayClient client; @@ -418,7 +419,7 @@ TestDisplayScheduler scheduler(&display, &fake_begin_frame_source_, task_runner_.get()); - display.Initialize(output_surface_.Pass(), &scheduler); + display.Initialize(std::move(output_surface_), &scheduler); SurfaceId surface_id(7u); display.SetSurfaceId(surface_id, 1.f); @@ -432,7 +433,7 @@ pass->output_rect = gfx::Rect(0, 0, 100, 100); pass->damage_rect = gfx::Rect(10, 10, 1, 1); pass->id = RenderPassId(1, 1); - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); SubmitCompositorFrame(&pass_list, surface_id); } @@ -458,7 +459,7 @@ pass->output_rect = gfx::Rect(0, 0, 200, 200); pass->damage_rect = gfx::Rect(10, 10, 1, 1); pass->id = RenderPassId(1, 1); - pass_list.push_back(pass.Pass()); + pass_list.push_back(std::move(pass)); SubmitCompositorFrame(&pass_list, surface_id); }
diff --git a/cc/surfaces/onscreen_display_client.cc b/cc/surfaces/onscreen_display_client.cc index 06828b05..50b64a7 100644 --- a/cc/surfaces/onscreen_display_client.cc +++ b/cc/surfaces/onscreen_display_client.cc
@@ -21,7 +21,7 @@ gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, const RendererSettings& settings, scoped_refptr<base::SingleThreadTaskRunner> task_runner) - : output_surface_(output_surface.Pass()), + : output_surface_(std::move(output_surface)), task_runner_(task_runner), display_(new Display(this, manager, @@ -52,7 +52,7 @@ new DisplayScheduler(display_.get(), frame_source, task_runner_.get(), output_surface_->capabilities().max_frames_pending)); - return display_->Initialize(output_surface_.Pass(), scheduler_.get()); + return display_->Initialize(std::move(output_surface_), scheduler_.get()); } void OnscreenDisplayClient::CommitVSyncParameters(base::TimeTicks timebase,
diff --git a/cc/surfaces/surface.cc b/cc/surfaces/surface.cc index 351b679..8faff98 100644 --- a/cc/surfaces/surface.cc +++ b/cc/surfaces/surface.cc
@@ -50,8 +50,8 @@ TakeLatencyInfo(&frame->metadata.latency_info); } - scoped_ptr<CompositorFrame> previous_frame = current_frame_.Pass(); - current_frame_ = frame.Pass(); + scoped_ptr<CompositorFrame> previous_frame = std::move(current_frame_); + current_frame_ = std::move(frame); if (current_frame_) { factory_->ReceiveFromChild( @@ -104,25 +104,22 @@ if (current_frame_ && !current_frame_->delegated_frame_data->render_pass_list.empty()) current_frame_->delegated_frame_data->render_pass_list.back() - ->copy_requests.push_back(copy_request.Pass()); + ->copy_requests.push_back(std::move(copy_request)); else copy_request->SendEmptyResult(); } void Surface::TakeCopyOutputRequests( - std::multimap<RenderPassId, CopyOutputRequest*>* copy_requests) { + std::multimap<RenderPassId, scoped_ptr<CopyOutputRequest>>* copy_requests) { DCHECK(copy_requests->empty()); if (current_frame_) { for (const auto& render_pass : current_frame_->delegated_frame_data->render_pass_list) { - while (!render_pass->copy_requests.empty()) { - scoped_ptr<CopyOutputRequest> request = - PopBack(&render_pass->copy_requests); - // TODO(vmpstr): |copy_requests| should store scoped_ptrs. - // crbug.com/557388. + for (auto& request : render_pass->copy_requests) { copy_requests->insert( - std::make_pair(render_pass->id, request.release())); + std::make_pair(render_pass->id, std::move(request))); } + render_pass->copy_requests.clear(); } } }
diff --git a/cc/surfaces/surface.h b/cc/surfaces/surface.h index cbfa42e..267983d 100644 --- a/cc/surfaces/surface.h +++ b/cc/surfaces/surface.h
@@ -48,7 +48,8 @@ // Adds each CopyOutputRequest in the current frame to copy_requests. The // caller takes ownership of them. void TakeCopyOutputRequests( - std::multimap<RenderPassId, CopyOutputRequest*>* copy_requests); + std::multimap<RenderPassId, scoped_ptr<CopyOutputRequest>>* + copy_requests); // Returns the most recent frame that is eligible to be rendered. const CompositorFrame* GetEligibleFrame();
diff --git a/cc/surfaces/surface_aggregator.cc b/cc/surfaces/surface_aggregator.cc index 43c57bcf..4c1441a 100644 --- a/cc/surfaces/surface_aggregator.cc +++ b/cc/surfaces/surface_aggregator.cc
@@ -28,13 +28,12 @@ void MoveMatchingRequests( RenderPassId id, - std::multimap<RenderPassId, CopyOutputRequest*>* copy_requests, + std::multimap<RenderPassId, scoped_ptr<CopyOutputRequest>>* copy_requests, std::vector<scoped_ptr<CopyOutputRequest>>* output_requests) { auto request_range = copy_requests->equal_range(id); for (auto it = request_range.first; it != request_range.second; ++it) { DCHECK(it->second); - output_requests->push_back(scoped_ptr<CopyOutputRequest>(it->second)); - it->second = nullptr; + output_requests->push_back(std::move(it->second)); } copy_requests->erase(request_range.first, request_range.second); } @@ -178,15 +177,13 @@ if (!frame_data) return; - std::multimap<RenderPassId, CopyOutputRequest*> copy_requests; + std::multimap<RenderPassId, scoped_ptr<CopyOutputRequest>> copy_requests; surface->TakeCopyOutputRequests(©_requests); const RenderPassList& render_pass_list = frame_data->render_pass_list; if (!valid_surfaces_.count(surface->surface_id())) { - for (auto& request : copy_requests) { + for (auto& request : copy_requests) request.second->SendEmptyResult(); - delete request.second; - } return; } @@ -231,7 +228,7 @@ child_to_parent_map, gfx::Transform(), ClipData(), copy_pass.get(), surface_id); - dest_pass_list_->push_back(copy_pass.Pass()); + dest_pass_list_->push_back(std::move(copy_pass)); } gfx::Transform surface_transform = @@ -423,7 +420,7 @@ Surface* surface) { // The root surface is allowed to have copy output requests, so grab them // off its render passes. - std::multimap<RenderPassId, CopyOutputRequest*> copy_requests; + std::multimap<RenderPassId, scoped_ptr<CopyOutputRequest>> copy_requests; surface->TakeCopyOutputRequests(©_requests); const RenderPassList& source_pass_list = frame_data->render_pass_list; @@ -457,7 +454,7 @@ child_to_parent_map, gfx::Transform(), ClipData(), copy_pass.get(), surface->surface_id()); - dest_pass_list_->push_back(copy_pass.Pass()); + dest_pass_list_->push_back(std::move(copy_pass)); } } @@ -641,7 +638,7 @@ // TODO(jamesr): Aggregate all resource references into the returned frame's // resource list. - return frame.Pass(); + return frame; } void SurfaceAggregator::ReleaseResources(SurfaceId surface_id) {
diff --git a/cc/surfaces/surface_aggregator_perftest.cc b/cc/surfaces/surface_aggregator_perftest.cc index 95085c3b..c6e4234 100644 --- a/cc/surfaces/surface_aggregator_perftest.cc +++ b/cc/surfaces/surface_aggregator_perftest.cc
@@ -96,10 +96,10 @@ SurfaceId(i - 1)); } - frame_data->render_pass_list.push_back(pass.Pass()); + frame_data->render_pass_list.push_back(std::move(pass)); scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); - factory_.SubmitCompositorFrame(SurfaceId(i), frame.Pass(), + frame->delegated_frame_data = std::move(frame_data); + factory_.SubmitCompositorFrame(SurfaceId(i), std::move(frame), SurfaceFactory::DrawCallback()); } @@ -120,10 +120,11 @@ else pass->damage_rect = gfx::Rect(0, 0, 1, 1); - frame_data->render_pass_list.push_back(pass.Pass()); + frame_data->render_pass_list.push_back(std::move(pass)); scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); - factory_.SubmitCompositorFrame(SurfaceId(num_surfaces + 1), frame.Pass(), + frame->delegated_frame_data = std::move(frame_data); + factory_.SubmitCompositorFrame(SurfaceId(num_surfaces + 1), + std::move(frame), SurfaceFactory::DrawCallback()); scoped_ptr<CompositorFrame> aggregated =
diff --git a/cc/surfaces/surface_aggregator_unittest.cc b/cc/surfaces/surface_aggregator_unittest.cc index 848912e6..53b01e04 100644 --- a/cc/surfaces/surface_aggregator_unittest.cc +++ b/cc/surfaces/surface_aggregator_unittest.cc
@@ -157,9 +157,9 @@ pass_list->swap(frame_data->render_pass_list); scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); + frame->delegated_frame_data = std::move(frame_data); - factory_.SubmitCompositorFrame(surface_id, frame.Pass(), + factory_.SubmitCompositorFrame(surface_id, std::move(frame), SurfaceFactory::DrawCallback()); } @@ -173,12 +173,12 @@ void QueuePassAsFrame(scoped_ptr<RenderPass> pass, SurfaceId surface_id) { scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); - delegated_frame_data->render_pass_list.push_back(pass.Pass()); + delegated_frame_data->render_pass_list.push_back(std::move(pass)); scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); - child_frame->delegated_frame_data = delegated_frame_data.Pass(); + child_frame->delegated_frame_data = std::move(delegated_frame_data); - factory_.SubmitCompositorFrame(surface_id, child_frame.Pass(), + factory_.SubmitCompositorFrame(surface_id, std::move(child_frame), SurfaceFactory::DrawCallback()); } @@ -329,7 +329,7 @@ scoped_ptr<CopyOutputRequest> copy_request( CopyOutputRequest::CreateEmptyRequest()); CopyOutputRequest* copy_request_ptr = copy_request.get(); - factory_.RequestCopyOfSurface(embedded_surface_id, copy_request.Pass()); + factory_.RequestCopyOfSurface(embedded_surface_id, std::move(copy_request)); test::Quad root_quads[] = {test::Quad::SolidColorQuad(SK_ColorWHITE), test::Quad::SurfaceQuad(embedded_surface_id, 1.f), @@ -412,16 +412,16 @@ gfx::Rect(SurfaceSize()), root_passes, arraysize(root_passes)); - pass_list[0]->copy_requests.push_back(copy_request.Pass()); - pass_list[1]->copy_requests.push_back(copy_request2.Pass()); + pass_list[0]->copy_requests.push_back(std::move(copy_request)); + pass_list[1]->copy_requests.push_back(std::move(copy_request2)); scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); pass_list.swap(frame_data->render_pass_list); scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); + frame->delegated_frame_data = std::move(frame_data); - factory_.SubmitCompositorFrame(root_surface_id_, frame.Pass(), + factory_.SubmitCompositorFrame(root_surface_id_, std::move(frame), SurfaceFactory::DrawCallback()); } @@ -887,7 +887,7 @@ pass_id, output_rect, damage_rect, transform_to_root_target); AddSolidColorQuadWithBlendMode( SurfaceSize(), grandchild_pass.get(), blend_modes[2]); - QueuePassAsFrame(grandchild_pass.Pass(), grandchild_surface_id); + QueuePassAsFrame(std::move(grandchild_pass), grandchild_surface_id); SurfaceId child_one_surface_id = allocator_.GenerateId(); factory_.Create(child_one_surface_id); @@ -907,7 +907,7 @@ grandchild_surface_id); AddSolidColorQuadWithBlendMode( SurfaceSize(), child_one_pass.get(), blend_modes[3]); - QueuePassAsFrame(child_one_pass.Pass(), child_one_surface_id); + QueuePassAsFrame(std::move(child_one_pass), child_one_surface_id); SurfaceId child_two_surface_id = allocator_.GenerateId(); factory_.Create(child_two_surface_id); @@ -919,7 +919,7 @@ pass_id, output_rect, damage_rect, transform_to_root_target); AddSolidColorQuadWithBlendMode( SurfaceSize(), child_two_pass.get(), blend_modes[5]); - QueuePassAsFrame(child_two_pass.Pass(), child_two_surface_id); + QueuePassAsFrame(std::move(child_two_pass), child_two_surface_id); scoped_ptr<RenderPass> root_pass = RenderPass::Create(); root_pass->SetNew( @@ -944,7 +944,7 @@ AddSolidColorQuadWithBlendMode( SurfaceSize(), root_pass.get(), blend_modes[6]); - QueuePassAsFrame(root_pass.Pass(), root_surface_id_); + QueuePassAsFrame(std::move(root_pass), root_surface_id_); EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_)); EXPECT_FALSE(surface_aggregator_client_.HasSurface(grandchild_surface)); @@ -1039,9 +1039,9 @@ child_pass_list.swap(child_frame_data->render_pass_list); scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); - child_frame->delegated_frame_data = child_frame_data.Pass(); + child_frame->delegated_frame_data = std::move(child_frame_data); - factory_.SubmitCompositorFrame(child_surface_id, child_frame.Pass(), + factory_.SubmitCompositorFrame(child_surface_id, std::move(child_frame), SurfaceFactory::DrawCallback()); } @@ -1072,9 +1072,9 @@ middle_pass_list.swap(middle_frame_data->render_pass_list); scoped_ptr<CompositorFrame> middle_frame(new CompositorFrame); - middle_frame->delegated_frame_data = middle_frame_data.Pass(); + middle_frame->delegated_frame_data = std::move(middle_frame_data); - factory_.SubmitCompositorFrame(middle_surface_id, middle_frame.Pass(), + factory_.SubmitCompositorFrame(middle_surface_id, std::move(middle_frame), SurfaceFactory::DrawCallback()); } @@ -1108,9 +1108,9 @@ root_pass_list.swap(root_frame_data->render_pass_list); scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); - root_frame->delegated_frame_data = root_frame_data.Pass(); + root_frame->delegated_frame_data = std::move(root_frame_data); - factory_.SubmitCompositorFrame(root_surface_id_, root_frame.Pass(), + factory_.SubmitCompositorFrame(root_surface_id_, std::move(root_frame), SurfaceFactory::DrawCallback()); EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_)); @@ -1223,12 +1223,12 @@ child_pass_list.swap(child_frame_data->render_pass_list); scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); - child_frame->delegated_frame_data = child_frame_data.Pass(); + child_frame->delegated_frame_data = std::move(child_frame_data); SurfaceId child_surface_id = allocator_.GenerateId(); factory_.Create(child_surface_id); Surface* child_surface = manager_.GetSurfaceForId(child_surface_id); - factory_.SubmitCompositorFrame(child_surface_id, child_frame.Pass(), + factory_.SubmitCompositorFrame(child_surface_id, std::move(child_frame), SurfaceFactory::DrawCallback()); test::Quad parent_surface_quads[] = { @@ -1250,12 +1250,14 @@ parent_surface_pass_list.swap(parent_surface_frame_data->render_pass_list); scoped_ptr<CompositorFrame> parent_surface_frame(new CompositorFrame); - parent_surface_frame->delegated_frame_data = parent_surface_frame_data.Pass(); + parent_surface_frame->delegated_frame_data = + std::move(parent_surface_frame_data); SurfaceId parent_surface_id = allocator_.GenerateId(); factory_.Create(parent_surface_id); Surface* parent_surface = manager_.GetSurfaceForId(parent_surface_id); - factory_.SubmitCompositorFrame(parent_surface_id, parent_surface_frame.Pass(), + factory_.SubmitCompositorFrame(parent_surface_id, + std::move(parent_surface_frame), SurfaceFactory::DrawCallback()); test::Quad root_surface_quads[] = { @@ -1285,9 +1287,9 @@ root_pass_list.swap(root_frame_data->render_pass_list); scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); - root_frame->delegated_frame_data = root_frame_data.Pass(); + root_frame->delegated_frame_data = std::move(root_frame_data); - factory_.SubmitCompositorFrame(root_surface_id_, root_frame.Pass(), + factory_.SubmitCompositorFrame(root_surface_id_, std::move(root_frame), SurfaceFactory::DrawCallback()); EXPECT_FALSE(surface_aggregator_client_.HasSurface(root_surface_)); @@ -1330,9 +1332,9 @@ child_pass_list.swap(child_frame_data->render_pass_list); scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); - child_frame->delegated_frame_data = child_frame_data.Pass(); + child_frame->delegated_frame_data = std::move(child_frame_data); - factory_.SubmitCompositorFrame(child_surface_id, child_frame.Pass(), + factory_.SubmitCompositorFrame(child_surface_id, std::move(child_frame), SurfaceFactory::DrawCallback()); EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_)); @@ -1378,9 +1380,9 @@ root_pass_list.swap(root_frame_data->render_pass_list); scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); - root_frame->delegated_frame_data = root_frame_data.Pass(); + root_frame->delegated_frame_data = std::move(root_frame_data); - factory_.SubmitCompositorFrame(root_surface_id_, root_frame.Pass(), + factory_.SubmitCompositorFrame(root_surface_id_, std::move(root_frame), SurfaceFactory::DrawCallback()); } @@ -1400,9 +1402,9 @@ root_pass_list.swap(root_frame_data->render_pass_list); scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); - root_frame->delegated_frame_data = root_frame_data.Pass(); + root_frame->delegated_frame_data = std::move(root_frame_data); - factory_.SubmitCompositorFrame(root_surface_id_, root_frame.Pass(), + factory_.SubmitCompositorFrame(root_surface_id_, std::move(root_frame), SurfaceFactory::DrawCallback()); EXPECT_TRUE(surface_aggregator_client_.HasSurface(root_surface_)); @@ -1794,10 +1796,10 @@ uv_bottom_right, background_color, vertex_opacity, flipped, nearest_neighbor); } - frame_data->render_pass_list.push_back(pass.Pass()); + frame_data->render_pass_list.push_back(std::move(pass)); scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); - factory->SubmitCompositorFrame(surface_id, frame.Pass(), + frame->delegated_frame_data = std::move(frame_data); + factory->SubmitCompositorFrame(surface_id, std::move(frame), SurfaceFactory::DrawCallback()); } @@ -1856,10 +1858,10 @@ // ignored. resource.is_software = false; frame_data->resource_list.push_back(resource); - frame_data->render_pass_list.push_back(pass.Pass()); + frame_data->render_pass_list.push_back(std::move(pass)); scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); - factory.SubmitCompositorFrame(surface_id, frame.Pass(), + frame->delegated_frame_data = std::move(frame_data); + factory.SubmitCompositorFrame(surface_id, std::move(frame), SurfaceFactory::DrawCallback()); EXPECT_FALSE(surface_aggregator_client_.HasSurface(surface));
diff --git a/cc/surfaces/surface_display_output_surface.cc b/cc/surfaces/surface_display_output_surface.cc index c887ca45..53d781f 100644 --- a/cc/surfaces/surface_display_output_surface.cc +++ b/cc/surfaces/surface_display_output_surface.cc
@@ -64,7 +64,7 @@ scoped_ptr<CompositorFrame> frame_copy(new CompositorFrame()); frame->AssignTo(frame_copy.get()); factory_.SubmitCompositorFrame( - surface_id_, frame_copy.Pass(), + surface_id_, std::move(frame_copy), base::Bind(&SurfaceDisplayOutputSurface::SwapBuffersComplete, base::Unretained(this))); }
diff --git a/cc/surfaces/surface_display_output_surface_unittest.cc b/cc/surfaces/surface_display_output_surface_unittest.cc index 2fedf5a..327010b 100644 --- a/cc/surfaces/surface_display_output_surface_unittest.cc +++ b/cc/surfaces/surface_display_output_surface_unittest.cc
@@ -83,10 +83,10 @@ gfx::Transform()); scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); - frame_data->render_pass_list.push_back(render_pass.Pass()); + frame_data->render_pass_list.push_back(std::move(render_pass)); CompositorFrame frame; - frame.delegated_frame_data = frame_data.Pass(); + frame.delegated_frame_data = std::move(frame_data); surface_display_output_surface_.SwapBuffers(&frame); }
diff --git a/cc/surfaces/surface_factory.cc b/cc/surfaces/surface_factory.cc index b35380e..322d7226 100644 --- a/cc/surfaces/surface_factory.cc +++ b/cc/surfaces/surface_factory.cc
@@ -40,7 +40,7 @@ scoped_ptr<Surface> surface(new Surface(surface_id, this)); manager_->RegisterSurface(surface.get()); DCHECK(!surface_map_.count(surface_id)); - surface_map_.add(surface_id, surface.Pass()); + surface_map_.add(surface_id, std::move(surface)); } void SurfaceFactory::Destroy(SurfaceId surface_id) { @@ -62,7 +62,7 @@ OwningSurfaceMap::iterator it = surface_map_.find(surface_id); DCHECK(it != surface_map_.end()); DCHECK(it->second->factory().get() == this); - it->second->QueueFrame(frame.Pass(), callback); + it->second->QueueFrame(std::move(frame), callback); if (!manager_->SurfaceModified(surface_id)) { TRACE_EVENT_INSTANT0("cc", "Damage not visible.", TRACE_EVENT_SCOPE_THREAD); it->second->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED); @@ -78,7 +78,7 @@ return; } DCHECK(it->second->factory().get() == this); - it->second->RequestCopyOfOutput(copy_request.Pass()); + it->second->RequestCopyOfOutput(std::move(copy_request)); manager_->SurfaceModified(surface_id); }
diff --git a/cc/surfaces/surface_factory_unittest.cc b/cc/surfaces/surface_factory_unittest.cc index 9e7bc153..fa05c2e 100644 --- a/cc/surfaces/surface_factory_unittest.cc +++ b/cc/surfaces/surface_factory_unittest.cc
@@ -69,8 +69,8 @@ frame_data->resource_list.push_back(resource); } scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); - factory_->SubmitCompositorFrame(surface_id_, frame.Pass(), + frame->delegated_frame_data = std::move(frame_data); + factory_->SubmitCompositorFrame(surface_id_, std::move(frame), SurfaceFactory::DrawCallback()); } @@ -389,7 +389,7 @@ scoped_ptr<CompositorFrame> frame(new CompositorFrame); frame->delegated_frame_data.reset(new DelegatedFrameData); - factory_->SubmitCompositorFrame(surface_id, frame.Pass(), + factory_->SubmitCompositorFrame(surface_id, std::move(frame), SurfaceFactory::DrawCallback()); EXPECT_EQ(2, surface->frame_index()); factory_->Destroy(surface_id); @@ -413,12 +413,12 @@ resource.mailbox_holder.texture_target = GL_TEXTURE_2D; frame_data->resource_list.push_back(resource); scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); + frame->delegated_frame_data = std::move(frame_data); uint32 execute_count = 0; SurfaceDrawStatus drawn = SurfaceDrawStatus::DRAW_SKIPPED; factory_->SubmitCompositorFrame( - id, frame.Pass(), base::Bind(&DrawCallback, &execute_count, &drawn)); + id, std::move(frame), base::Bind(&DrawCallback, &execute_count, &drawn)); surface_id_ = SurfaceId(); factory_->DestroyAll(); @@ -441,9 +441,9 @@ scoped_ptr<CompositorFrame> frame(new CompositorFrame); frame->metadata.satisfies_sequences.push_back(6); frame->metadata.satisfies_sequences.push_back(4); - frame->delegated_frame_data = frame_data.Pass(); + frame->delegated_frame_data = std::move(frame_data); DCHECK(manager_.GetSurfaceForId(id2)); - factory_->SubmitCompositorFrame(surface_id_, frame.Pass(), + factory_->SubmitCompositorFrame(surface_id_, std::move(frame), SurfaceFactory::DrawCallback()); DCHECK(!manager_.GetSurfaceForId(id2)); @@ -492,10 +492,10 @@ scoped_ptr<RenderPass> render_pass(RenderPass::Create()); render_pass->referenced_surfaces.push_back(surface_id_); scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); - frame_data->render_pass_list.push_back(render_pass.Pass()); + frame_data->render_pass_list.push_back(std::move(render_pass)); scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); - factory_->SubmitCompositorFrame(id2, frame.Pass(), + frame->delegated_frame_data = std::move(frame_data); + factory_->SubmitCompositorFrame(id2, std::move(frame), SurfaceFactory::DrawCallback()); } factory_->Destroy(id2); @@ -505,10 +505,10 @@ scoped_ptr<RenderPass> render_pass(RenderPass::Create()); render_pass->referenced_surfaces.push_back(id2); scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); - frame_data->render_pass_list.push_back(render_pass.Pass()); + frame_data->render_pass_list.push_back(std::move(render_pass)); scoped_ptr<CompositorFrame> frame(new CompositorFrame); - frame->delegated_frame_data = frame_data.Pass(); - factory_->SubmitCompositorFrame(surface_id_, frame.Pass(), + frame->delegated_frame_data = std::move(frame_data); + factory_->SubmitCompositorFrame(surface_id_, std::move(frame), SurfaceFactory::DrawCallback()); } factory_->Destroy(surface_id_);
diff --git a/cc/surfaces/surface_hittest_unittest.cc b/cc/surfaces/surface_hittest_unittest.cc index fde62f3..2b59f0a 100644 --- a/cc/surfaces/surface_hittest_unittest.cc +++ b/cc/surfaces/surface_hittest_unittest.cc
@@ -79,7 +79,7 @@ SurfaceIdAllocator root_allocator(2); SurfaceId root_surface_id = root_allocator.GenerateId(); factory.Create(root_surface_id); - factory.SubmitCompositorFrame(root_surface_id, root_frame.Pass(), + factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), SurfaceFactory::DrawCallback()); { @@ -109,7 +109,7 @@ SurfaceIdAllocator root_allocator(2); SurfaceId root_surface_id = root_allocator.GenerateId(); factory.Create(root_surface_id); - factory.SubmitCompositorFrame(root_surface_id, root_frame.Pass(), + factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), SurfaceFactory::DrawCallback()); TestCase tests[] = { { @@ -153,7 +153,7 @@ SurfaceIdAllocator root_allocator(2); SurfaceId root_surface_id = root_allocator.GenerateId(); factory.Create(root_surface_id); - factory.SubmitCompositorFrame(root_surface_id, root_frame.Pass(), + factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), SurfaceFactory::DrawCallback()); // Creates a child surface. @@ -173,7 +173,7 @@ // Submit the frame. factory.Create(child_surface_id); - factory.SubmitCompositorFrame(child_surface_id, child_frame.Pass(), + factory.SubmitCompositorFrame(child_surface_id, std::move(child_frame), SurfaceFactory::DrawCallback()); TestCase tests[] = { @@ -227,7 +227,7 @@ root_rect, child_rect, child_surface_id); - factory.SubmitCompositorFrame(root_surface_id, root_frame.Pass(), + factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), SurfaceFactory::DrawCallback()); // Verify that point (100, 100) no longer falls on the child surface. @@ -293,7 +293,7 @@ SurfaceIdAllocator root_allocator(2); SurfaceId root_surface_id = root_allocator.GenerateId(); factory.Create(root_surface_id); - factory.SubmitCompositorFrame(root_surface_id, root_frame.Pass(), + factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), SurfaceFactory::DrawCallback()); // Creates a child surface. @@ -313,7 +313,7 @@ // Submit the frame. factory.Create(child_surface_id); - factory.SubmitCompositorFrame(child_surface_id, child_frame.Pass(), + factory.SubmitCompositorFrame(child_surface_id, std::move(child_frame), SurfaceFactory::DrawCallback()); TestCase tests[] = { @@ -412,7 +412,7 @@ SurfaceIdAllocator root_allocator(1); SurfaceId root_surface_id = root_allocator.GenerateId(); factory.Create(root_surface_id); - factory.SubmitCompositorFrame(root_surface_id, root_frame.Pass(), + factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), SurfaceFactory::DrawCallback()); TestCase tests[] = {
diff --git a/cc/surfaces/surfaces_pixeltest.cc b/cc/surfaces/surfaces_pixeltest.cc index f0903f2..053a5636 100644 --- a/cc/surfaces/surfaces_pixeltest.cc +++ b/cc/surfaces/surfaces_pixeltest.cc
@@ -81,14 +81,14 @@ force_anti_aliasing_off); scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); - delegated_frame_data->render_pass_list.push_back(pass.Pass()); + delegated_frame_data->render_pass_list.push_back(std::move(pass)); scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); - root_frame->delegated_frame_data = delegated_frame_data.Pass(); + root_frame->delegated_frame_data = std::move(delegated_frame_data); SurfaceId root_surface_id = allocator_.GenerateId(); factory_.Create(root_surface_id); - factory_.SubmitCompositorFrame(root_surface_id, root_frame.Pass(), + factory_.SubmitCompositorFrame(root_surface_id, std::move(root_frame), SurfaceFactory::DrawCallback()); EmptySurfaceAggregatorClient surface_aggregator_client; @@ -140,12 +140,12 @@ force_anti_aliasing_off); scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); - delegated_frame_data->render_pass_list.push_back(pass.Pass()); + delegated_frame_data->render_pass_list.push_back(std::move(pass)); scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); - root_frame->delegated_frame_data = delegated_frame_data.Pass(); + root_frame->delegated_frame_data = std::move(delegated_frame_data); - factory_.SubmitCompositorFrame(root_surface_id, root_frame.Pass(), + factory_.SubmitCompositorFrame(root_surface_id, std::move(root_frame), SurfaceFactory::DrawCallback()); } @@ -168,12 +168,12 @@ force_anti_aliasing_off); scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); - delegated_frame_data->render_pass_list.push_back(pass.Pass()); + delegated_frame_data->render_pass_list.push_back(std::move(pass)); scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); - child_frame->delegated_frame_data = delegated_frame_data.Pass(); + child_frame->delegated_frame_data = std::move(delegated_frame_data); - factory_.SubmitCompositorFrame(child_surface_id, child_frame.Pass(), + factory_.SubmitCompositorFrame(child_surface_id, std::move(child_frame), SurfaceFactory::DrawCallback()); } @@ -241,12 +241,12 @@ right_child_id); scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); - delegated_frame_data->render_pass_list.push_back(pass.Pass()); + delegated_frame_data->render_pass_list.push_back(std::move(pass)); scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); - root_frame->delegated_frame_data = delegated_frame_data.Pass(); + root_frame->delegated_frame_data = std::move(delegated_frame_data); - factory_.SubmitCompositorFrame(root_surface_id, root_frame.Pass(), + factory_.SubmitCompositorFrame(root_surface_id, std::move(root_frame), SurfaceFactory::DrawCallback()); } @@ -277,12 +277,12 @@ force_anti_aliasing_off); scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); - delegated_frame_data->render_pass_list.push_back(pass.Pass()); + delegated_frame_data->render_pass_list.push_back(std::move(pass)); scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); - child_frame->delegated_frame_data = delegated_frame_data.Pass(); + child_frame->delegated_frame_data = std::move(delegated_frame_data); - factory_.SubmitCompositorFrame(left_child_id, child_frame.Pass(), + factory_.SubmitCompositorFrame(left_child_id, std::move(child_frame), SurfaceFactory::DrawCallback()); } @@ -313,12 +313,12 @@ force_anti_aliasing_off); scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData); - delegated_frame_data->render_pass_list.push_back(pass.Pass()); + delegated_frame_data->render_pass_list.push_back(std::move(pass)); scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); - child_frame->delegated_frame_data = delegated_frame_data.Pass(); + child_frame->delegated_frame_data = std::move(delegated_frame_data); - factory_.SubmitCompositorFrame(right_child_id, child_frame.Pass(), + factory_.SubmitCompositorFrame(right_child_id, std::move(child_frame), SurfaceFactory::DrawCallback()); }
diff --git a/cc/test/animation_test_common.cc b/cc/test/animation_test_common.cc index de1d015..f7e230fb 100644 --- a/cc/test/animation_test_common.cc +++ b/cc/test/animation_test_common.cc
@@ -37,19 +37,19 @@ if (!use_timing_function) func = EaseTimingFunction::Create(); if (duration > 0.0) - curve->AddKeyframe( - FloatKeyframe::Create(base::TimeDelta(), start_opacity, func.Pass())); + curve->AddKeyframe(FloatKeyframe::Create(base::TimeDelta(), start_opacity, + std::move(func))); curve->AddKeyframe(FloatKeyframe::Create( base::TimeDelta::FromSecondsD(duration), end_opacity, nullptr)); int id = AnimationIdProvider::NextAnimationId(); - scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), id, AnimationIdProvider::NextGroupId(), - Animation::OPACITY)); + scoped_ptr<Animation> animation(Animation::Create( + std::move(curve), id, AnimationIdProvider::NextGroupId(), + Animation::OPACITY)); animation->set_needs_synchronized_start_time(true); - target->AddAnimation(animation.Pass()); + target->AddAnimation(std::move(animation)); return id; } @@ -71,12 +71,12 @@ int id = AnimationIdProvider::NextAnimationId(); - scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), id, AnimationIdProvider::NextGroupId(), - Animation::TRANSFORM)); + scoped_ptr<Animation> animation(Animation::Create( + std::move(curve), id, AnimationIdProvider::NextGroupId(), + Animation::TRANSFORM)); animation->set_needs_synchronized_start_time(true); - target->AddAnimation(animation.Pass()); + target->AddAnimation(std::move(animation)); return id; } @@ -118,11 +118,12 @@ int id = AnimationIdProvider::NextAnimationId(); - scoped_ptr<Animation> animation(Animation::Create( - curve.Pass(), id, AnimationIdProvider::NextGroupId(), Animation::FILTER)); + scoped_ptr<Animation> animation( + Animation::Create(std::move(curve), id, + AnimationIdProvider::NextGroupId(), Animation::FILTER)); animation->set_needs_synchronized_start_time(true); - target->AddAnimation(animation.Pass()); + target->AddAnimation(std::move(animation)); return id; } @@ -399,19 +400,19 @@ scoped_ptr<TimingFunction> func = StepsTimingFunction::Create(num_steps, 0.5f); if (duration > 0.0) - curve->AddKeyframe( - FloatKeyframe::Create(base::TimeDelta(), start_opacity, func.Pass())); + curve->AddKeyframe(FloatKeyframe::Create(base::TimeDelta(), start_opacity, + std::move(func))); curve->AddKeyframe(FloatKeyframe::Create( base::TimeDelta::FromSecondsD(duration), end_opacity, nullptr)); int id = AnimationIdProvider::NextAnimationId(); - scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), id, AnimationIdProvider::NextGroupId(), - Animation::OPACITY)); + scoped_ptr<Animation> animation(Animation::Create( + std::move(curve), id, AnimationIdProvider::NextGroupId(), + Animation::OPACITY)); animation->set_needs_synchronized_start_time(true); - target->AddAnimation(animation.Pass()); + target->AddAnimation(std::move(animation)); return id; }
diff --git a/cc/test/animation_timelines_test_common.cc b/cc/test/animation_timelines_test_common.cc index 381f004..9212da61 100644 --- a/cc/test/animation_timelines_test_common.cc +++ b/cc/test/animation_timelines_test_common.cc
@@ -241,7 +241,7 @@ host_->animation_registrar()->AnimateLayers(time); host_->animation_registrar()->UpdateAnimationState(true, nullptr); - host_->animation_registrar()->SetAnimationEvents(events.Pass()); + host_->animation_registrar()->SetAnimationEvents(std::move(events)); } AnimationPlayer* AnimationTimelinesTest::GetPlayerForLayerId(int layer_id) {
diff --git a/cc/test/fake_content_layer_client.cc b/cc/test/fake_content_layer_client.cc index bfa7c19..0238498d 100644 --- a/cc/test/fake_content_layer_client.cc +++ b/cc/test/fake_content_layer_client.cc
@@ -60,7 +60,7 @@ canvas->drawRect(gfx::RectFToSkRect(draw_rect), paint); picture = skia::AdoptRef(recorder.endRecordingAsPicture()); auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>(); - item->SetNew(picture.Pass()); + item->SetNew(std::move(picture)); } for (ImageVector::const_iterator it = draw_images_.begin(); @@ -75,7 +75,7 @@ &it->paint); picture = skia::AdoptRef(recorder.endRecordingAsPicture()); auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>(); - item->SetNew(picture.Pass()); + item->SetNew(std::move(picture)); if (!it->transform.IsIdentity()) { display_list->CreateAndAppendItem<EndTransformDisplayItem>(); } @@ -92,7 +92,7 @@ canvas->drawIRect(gfx::RectToSkIRect(draw_rect), paint); picture = skia::AdoptRef(recorder.endRecordingAsPicture()); auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>(); - item->SetNew(picture.Pass()); + item->SetNew(std::move(picture)); draw_rect.Inset(1, 1); } }
diff --git a/cc/test/fake_layer_tree_host.cc b/cc/test/fake_layer_tree_host.cc index 30083d68..0c4109e 100644 --- a/cc/test/fake_layer_tree_host.cc +++ b/cc/test/fake_layer_tree_host.cc
@@ -49,11 +49,11 @@ scoped_ptr<LayerImpl> old_root_layer_impl = active_tree()->DetachLayerTree(); scoped_ptr<LayerImpl> layer_impl = TreeSynchronizer::SynchronizeTrees( - root_layer(), old_root_layer_impl.Pass(), active_tree()); + root_layer(), std::move(old_root_layer_impl), active_tree()); active_tree()->SetPropertyTrees(*property_trees()); TreeSynchronizer::PushProperties(root_layer(), layer_impl.get()); - active_tree()->SetRootLayer(layer_impl.Pass()); + active_tree()->SetRootLayer(std::move(layer_impl)); if (page_scale_layer() && inner_viewport_scroll_layer()) { active_tree()->SetViewportLayersFromIds(
diff --git a/cc/test/fake_layer_tree_host_client.cc b/cc/test/fake_layer_tree_host_client.cc index a4a5d7e..43e6d2ba 100644 --- a/cc/test/fake_layer_tree_host_client.cc +++ b/cc/test/fake_layer_tree_host_client.cc
@@ -37,7 +37,7 @@ } else { surface = FakeOutputSurface::Create3d(); } - host_->SetOutputSurface(surface.Pass()); + host_->SetOutputSurface(std::move(surface)); } void FakeLayerTreeHostClient::DidFailToInitializeOutputSurface() {
diff --git a/cc/test/fake_output_surface.cc b/cc/test/fake_output_surface.cc index 4855f30..a1f77498 100644 --- a/cc/test/fake_output_surface.cc +++ b/cc/test/fake_output_surface.cc
@@ -44,7 +44,7 @@ FakeOutputSurface::FakeOutputSurface( scoped_ptr<SoftwareOutputDevice> software_device, bool delegated_rendering) - : OutputSurface(software_device.Pass()), + : OutputSurface(std::move(software_device)), client_(NULL), num_sent_frames_(0), has_external_stencil_test_(false), @@ -58,7 +58,7 @@ scoped_refptr<ContextProvider> context_provider, scoped_ptr<SoftwareOutputDevice> software_device, bool delegated_rendering) - : OutputSurface(context_provider, software_device.Pass()), + : OutputSurface(context_provider, std::move(software_device)), client_(NULL), num_sent_frames_(0), has_external_stencil_test_(false),
diff --git a/cc/test/fake_output_surface.h b/cc/test/fake_output_surface.h index 14ec0f20..06e19c9 100644 --- a/cc/test/fake_output_surface.h +++ b/cc/test/fake_output_surface.h
@@ -44,14 +44,14 @@ static scoped_ptr<FakeOutputSurface> Create3d( scoped_ptr<TestWebGraphicsContext3D> context) { return make_scoped_ptr( - new FakeOutputSurface(TestContextProvider::Create(context.Pass()), + new FakeOutputSurface(TestContextProvider::Create(std::move(context)), TestContextProvider::CreateWorker(), false)); } static scoped_ptr<FakeOutputSurface> CreateSoftware( scoped_ptr<SoftwareOutputDevice> software_device) { - return make_scoped_ptr(new FakeOutputSurface(software_device.Pass(), - false)); + return make_scoped_ptr( + new FakeOutputSurface(std::move(software_device), false)); } static scoped_ptr<FakeOutputSurface> CreateDelegating3d() { @@ -69,29 +69,29 @@ static scoped_ptr<FakeOutputSurface> CreateDelegating3d( scoped_ptr<TestWebGraphicsContext3D> context) { return make_scoped_ptr( - new FakeOutputSurface(TestContextProvider::Create(context.Pass()), + new FakeOutputSurface(TestContextProvider::Create(std::move(context)), TestContextProvider::CreateWorker(), true)); } static scoped_ptr<FakeOutputSurface> CreateDelegatingSoftware( scoped_ptr<SoftwareOutputDevice> software_device) { return make_scoped_ptr( - new FakeOutputSurface(software_device.Pass(), true)); + new FakeOutputSurface(std::move(software_device), true)); } static scoped_ptr<FakeOutputSurface> CreateNoRequireSyncPoint( scoped_ptr<TestWebGraphicsContext3D> context) { - scoped_ptr<FakeOutputSurface> surface(Create3d(context.Pass())); + scoped_ptr<FakeOutputSurface> surface(Create3d(std::move(context))); surface->capabilities_.delegated_sync_points_required = false; - return surface.Pass(); + return surface; } static scoped_ptr<FakeOutputSurface> CreateOffscreen( scoped_ptr<TestWebGraphicsContext3D> context) { scoped_ptr<FakeOutputSurface> surface(new FakeOutputSurface( - TestContextProvider::Create(context.Pass()), false)); + TestContextProvider::Create(std::move(context)), false)); surface->capabilities_.uses_default_gl_framebuffer = false; - return surface.Pass(); + return surface; } void set_max_frames_pending(int max) {
diff --git a/cc/test/fake_picture_layer.cc b/cc/test/fake_picture_layer.cc index 8892d4c..50b9e7d4 100644 --- a/cc/test/fake_picture_layer.cc +++ b/cc/test/fake_picture_layer.cc
@@ -22,7 +22,7 @@ const LayerSettings& settings, ContentLayerClient* client, scoped_ptr<DisplayListRecordingSource> source) - : PictureLayer(settings, client, source.Pass()), + : PictureLayer(settings, client, std::move(source)), update_count_(0), push_properties_count_(0), always_update_resources_(false) {
diff --git a/cc/test/fake_picture_layer.h b/cc/test/fake_picture_layer.h index aee328f..96dae06 100644 --- a/cc/test/fake_picture_layer.h +++ b/cc/test/fake_picture_layer.h
@@ -23,7 +23,7 @@ ContentLayerClient* client, scoped_ptr<DisplayListRecordingSource> source) { return make_scoped_refptr( - new FakePictureLayer(settings, client, source.Pass())); + new FakePictureLayer(settings, client, std::move(source))); } scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* tree_impl) override;
diff --git a/cc/test/layer_test_common.h b/cc/test/layer_test_common.h index e322632..85f2f8a 100644 --- a/cc/test/layer_test_common.h +++ b/cc/test/layer_test_common.h
@@ -57,7 +57,7 @@ scoped_ptr<T> layer = T::Create(host_->host_impl()->active_tree(), layer_impl_id_++); T* ptr = layer.get(); - root_layer_impl_->AddChild(layer.Pass()); + root_layer_impl_->AddChild(std::move(layer)); return ptr; } @@ -66,7 +66,7 @@ scoped_ptr<T> layer = T::Create(host_->host_impl()->active_tree(), layer_impl_id_++); T* ptr = layer.get(); - parent->AddChild(layer.Pass()); + parent->AddChild(std::move(layer)); return ptr; } @@ -75,7 +75,7 @@ scoped_ptr<T> layer = T::Create(host_->host_impl()->active_tree(), layer_impl_id_++, a); T* ptr = layer.get(); - root_layer_impl_->AddChild(layer.Pass()); + root_layer_impl_->AddChild(std::move(layer)); return ptr; } @@ -84,7 +84,7 @@ scoped_ptr<T> layer = T::Create(host_->host_impl()->active_tree(), layer_impl_id_++, a, b); T* ptr = layer.get(); - root_layer_impl_->AddChild(layer.Pass()); + root_layer_impl_->AddChild(std::move(layer)); return ptr; } @@ -93,7 +93,7 @@ scoped_ptr<T> layer = T::Create(host_->host_impl()->active_tree(), layer_impl_id_++, a, b, c, d); T* ptr = layer.get(); - root_layer_impl_->AddChild(layer.Pass()); + root_layer_impl_->AddChild(std::move(layer)); return ptr; } @@ -111,7 +111,7 @@ scoped_ptr<T> layer = T::Create(host_->host_impl()->active_tree(), layer_impl_id_++, a, b, c, d, e); T* ptr = layer.get(); - root_layer_impl_->AddChild(layer.Pass()); + root_layer_impl_->AddChild(std::move(layer)); return ptr; }
diff --git a/cc/test/layer_tree_host_common_test.h b/cc/test/layer_tree_host_common_test.h index 4a8f8b85f..f8f1a02f 100644 --- a/cc/test/layer_tree_host_common_test.h +++ b/cc/test/layer_tree_host_common_test.h
@@ -9,6 +9,7 @@ #include "base/memory/scoped_ptr.h" #include "cc/layers/layer_lists.h" +#include "cc/layers/layer_settings.h" #include "cc/test/fake_layer_tree_host_client.h" #include "cc/test/layer_test_common.h" #include "cc/test/test_task_graph_runner.h"
diff --git a/cc/test/layer_tree_json_parser.cc b/cc/test/layer_tree_json_parser.cc index e891290..f2dc8a8 100644 --- a/cc/test/layer_tree_json_parser.cc +++ b/cc/test/layer_tree_json_parser.cc
@@ -7,6 +7,7 @@ #include "base/test/values_test_util.h" #include "base/values.h" #include "cc/layers/layer.h" +#include "cc/layers/layer_settings.h" #include "cc/layers/nine_patch_layer.h" #include "cc/layers/picture_layer.h" #include "cc/layers/solid_color_layer.h"
diff --git a/cc/test/layer_tree_json_parser_unittest.cc b/cc/test/layer_tree_json_parser_unittest.cc index c39423f..d0f7544 100644 --- a/cc/test/layer_tree_json_parser_unittest.cc +++ b/cc/test/layer_tree_json_parser_unittest.cc
@@ -83,9 +83,9 @@ child->SetHaveWheelEventHandlers(true); child->SetHaveScrollEventHandlers(true); - parent->AddChild(child.Pass()); - root_impl->AddChild(parent.Pass()); - tree->SetRootLayer(root_impl.Pass()); + parent->AddChild(std::move(child)); + root_impl->AddChild(std::move(parent)); + tree->SetRootLayer(std::move(root_impl)); std::string json = host_impl.LayerTreeAsJson(); scoped_refptr<Layer> root = ParseTreeFromJson(json, NULL); @@ -112,8 +112,8 @@ touch_region.Union(gfx::Rect(40, 10, 20, 20)); touch_layer->SetTouchEventHandlerRegion(touch_region); - root_impl->AddChild(touch_layer.Pass()); - tree->SetRootLayer(root_impl.Pass()); + root_impl->AddChild(std::move(touch_layer)); + tree->SetRootLayer(std::move(root_impl)); std::string json = host_impl.LayerTreeAsJson(); scoped_refptr<Layer> root = ParseTreeFromJson(json, NULL);
diff --git a/cc/test/layer_tree_pixel_test.cc b/cc/test/layer_tree_pixel_test.cc index b4fafd2..c48b8c0 100644 --- a/cc/test/layer_tree_pixel_test.cc +++ b/cc/test/layer_tree_pixel_test.cc
@@ -46,7 +46,7 @@ software_output_device->set_surface_expansion_size( surface_expansion_size); output_surface = make_scoped_ptr( - new PixelTestOutputSurface(software_output_device.Pass())); + new PixelTestOutputSurface(std::move(software_output_device))); break; } case PIXEL_TEST_GL: { @@ -59,7 +59,7 @@ } output_surface->set_surface_expansion_size(surface_expansion_size); - return output_surface.Pass(); + return std::move(output_surface); } void LayerTreePixelTest::WillCommitCompleteOnThread(LayerTreeHostImpl* impl) { @@ -280,7 +280,7 @@ } } - return bitmap.Pass(); + return bitmap; } void LayerTreePixelTest::Finish() {
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc index b6c8570..0578128 100644 --- a/cc/test/layer_tree_test.cc +++ b/cc/test/layer_tree_test.cc
@@ -122,7 +122,7 @@ scoped_ptr<BeginFrameSource> external_begin_frame_source) { return make_scoped_ptr( new ThreadProxyForTest(test_hooks, host, task_runner_provider, - external_begin_frame_source.Pass())); + std::move(external_begin_frame_source))); } ~ThreadProxyForTest() override {} @@ -295,7 +295,7 @@ void SetAnimationEvents(scoped_ptr<AnimationEventsVector> events) override { test_hooks_->ReceivedSetAnimationEvents(); - ThreadProxy::SetAnimationEvents(events.Pass()); + ThreadProxy::SetAnimationEvents(std::move(events)); } void DidLoseOutputSurface() override { @@ -325,14 +325,14 @@ scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) override { test_hooks_->ReceivedPostFrameTimingEventsOnMain(); - ThreadProxy::PostFrameTimingEventsOnMain(composite_events.Pass(), - main_frame_events.Pass()); + ThreadProxy::PostFrameTimingEventsOnMain(std::move(composite_events), + std::move(main_frame_events)); } void BeginMainFrame(scoped_ptr<BeginMainFrameAndCommitState> begin_main_frame_state) override { test_hooks_->ReceivedBeginMainFrame(); - ThreadProxy::BeginMainFrame(begin_main_frame_state.Pass()); + ThreadProxy::BeginMainFrame(std::move(begin_main_frame_state)); }; ThreadProxyForTest(TestHooks* test_hooks, @@ -341,7 +341,7 @@ scoped_ptr<BeginFrameSource> external_begin_frame_source) : ThreadProxy(host, task_runner_provider, - external_begin_frame_source.Pass()), + std::move(external_begin_frame_source)), test_hooks_(test_hooks) {} }; @@ -356,7 +356,7 @@ scoped_ptr<BeginFrameSource> external_begin_frame_source) { return make_scoped_ptr(new SingleThreadProxyForTest( test_hooks, host, client, task_runner_provider, - external_begin_frame_source.Pass())); + std::move(external_begin_frame_source))); } ~SingleThreadProxyForTest() override {} @@ -416,7 +416,7 @@ : SingleThreadProxy(host, client, task_runner_provider, - external_begin_frame_source.Pass()), + std::move(external_begin_frame_source)), test_hooks_(test_hooks) {} }; @@ -708,17 +708,17 @@ TaskRunnerProvider::Create(main_task_runner, impl_task_runner); scoped_ptr<Proxy> proxy; if (impl_task_runner.get()) { - proxy = ThreadProxyForTest::Create(test_hooks, layer_tree_host.get(), - task_runner_provider.get(), - external_begin_frame_source.Pass()); + proxy = ThreadProxyForTest::Create( + test_hooks, layer_tree_host.get(), task_runner_provider.get(), + std::move(external_begin_frame_source)); } else { proxy = SingleThreadProxyForTest::Create( test_hooks, layer_tree_host.get(), client, task_runner_provider.get(), - external_begin_frame_source.Pass()); + std::move(external_begin_frame_source)); } - layer_tree_host->InitializeForTesting(task_runner_provider.Pass(), - proxy.Pass()); - return layer_tree_host.Pass(); + layer_tree_host->InitializeForTesting(std::move(task_runner_provider), + std::move(proxy)); + return layer_tree_host; } scoped_ptr<LayerTreeHostImpl> CreateLayerTreeHostImpl( @@ -930,7 +930,7 @@ gpu_memory_buffer_manager_.get(), task_graph_runner_.get(), settings_, base::ThreadTaskRunnerHandle::Get(), impl_thread_ ? impl_thread_->task_runner() : NULL, - external_begin_frame_source.Pass()); + std::move(external_begin_frame_source)); ASSERT_TRUE(layer_tree_host_); started_ = true; @@ -1119,7 +1119,7 @@ DCHECK(external_begin_frame_source_); DCHECK(external_begin_frame_source_->is_ready()); } - return output_surface.Pass(); + return std::move(output_surface); } scoped_ptr<FakeOutputSurface> LayerTreeTest::CreateFakeOutputSurface() {
diff --git a/cc/test/layer_tree_test.h b/cc/test/layer_tree_test.h index 0c2dfb10..ba4e7ae 100644 --- a/cc/test/layer_tree_test.h +++ b/cc/test/layer_tree_test.h
@@ -8,6 +8,7 @@ #include "base/memory/ref_counted.h" #include "base/threading/thread.h" #include "cc/animation/animation_delegate.h" +#include "cc/layers/layer_settings.h" #include "cc/trees/layer_tree_host.h" #include "cc/trees/layer_tree_host_impl.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/cc/test/pixel_test.cc b/cc/test/pixel_test.cc index 9adc94d2..93f6341 100644 --- a/cc/test/pixel_test.cc +++ b/cc/test/pixel_test.cc
@@ -72,7 +72,7 @@ run_loop.QuitClosure())); if (copy_rect) request->set_area(*copy_rect); - target->copy_requests.push_back(request.Pass()); + target->copy_requests.push_back(std::move(request)); float device_scale_factor = 1.f; gfx::Rect device_viewport_rect = @@ -170,7 +170,7 @@ void PixelTest::SetUpSoftwareRenderer() { scoped_ptr<SoftwareOutputDevice> device(new PixelTestSoftwareOutputDevice()); - output_surface_.reset(new PixelTestOutputSurface(device.Pass())); + output_surface_.reset(new PixelTestOutputSurface(std::move(device))); output_surface_->BindToClient(output_surface_client_.get()); shared_bitmap_manager_.reset(new TestSharedBitmapManager()); resource_provider_ = ResourceProvider::Create(
diff --git a/cc/test/pixel_test_output_surface.cc b/cc/test/pixel_test_output_surface.cc index c5137393..6d5072c 100644 --- a/cc/test/pixel_test_output_surface.cc +++ b/cc/test/pixel_test_output_surface.cc
@@ -29,8 +29,8 @@ PixelTestOutputSurface::PixelTestOutputSurface( scoped_ptr<SoftwareOutputDevice> software_device) - : OutputSurface(software_device.Pass()), external_stencil_test_(false) { -} + : OutputSurface(std::move(software_device)), + external_stencil_test_(false) {} void PixelTestOutputSurface::Reshape(const gfx::Size& size, float scale_factor) {
diff --git a/cc/test/render_pass_test_utils.cc b/cc/test/render_pass_test_utils.cc index f65ff07..1bb99665 100644 --- a/cc/test/render_pass_test_utils.cc +++ b/cc/test/render_pass_test_utils.cc
@@ -28,7 +28,7 @@ scoped_ptr<RenderPass> pass(RenderPass::Create()); pass->SetNew(id, output_rect, output_rect, root_transform); RenderPass* saved = pass.get(); - pass_list->push_back(pass.Pass()); + pass_list->push_back(std::move(pass)); return saved; } @@ -197,7 +197,7 @@ TextureMailbox mailbox( gpu_mailbox, gpu::SyncToken(*sync_point_for_mailbox_texture), target); ResourceId resource8 = resource_provider->CreateResourceFromTextureMailbox( - mailbox, callback.Pass()); + mailbox, std::move(callback)); resource_provider->AllocateForTesting(resource8); SharedQuadState* shared_state = to_pass->CreateAndAppendSharedQuadState();
diff --git a/cc/test/scheduler_test_common.cc b/cc/test/scheduler_test_common.cc index ffbc2447..c04c1e00 100644 --- a/cc/test/scheduler_test_common.cc +++ b/cc/test/scheduler_test_common.cc
@@ -60,8 +60,7 @@ TestSyntheticBeginFrameSource::TestSyntheticBeginFrameSource( scoped_ptr<DelayBasedTimeSource> time_source) - : SyntheticBeginFrameSource(time_source.Pass()) { -} + : SyntheticBeginFrameSource(std::move(time_source)) {} TestSyntheticBeginFrameSource::~TestSyntheticBeginFrameSource() { } @@ -69,8 +68,8 @@ scoped_ptr<FakeCompositorTimingHistory> FakeCompositorTimingHistory::Create() { scoped_ptr<RenderingStatsInstrumentation> rendering_stats_instrumentation = RenderingStatsInstrumentation::Create(); - return make_scoped_ptr( - new FakeCompositorTimingHistory(rendering_stats_instrumentation.Pass())); + return make_scoped_ptr(new FakeCompositorTimingHistory( + std::move(rendering_stats_instrumentation))); } FakeCompositorTimingHistory::FakeCompositorTimingHistory( @@ -78,13 +77,16 @@ : CompositorTimingHistory(CompositorTimingHistory::NULL_UMA, rendering_stats_instrumentation.get()), rendering_stats_instrumentation_owned_( - rendering_stats_instrumentation.Pass()) {} + std::move(rendering_stats_instrumentation)) {} FakeCompositorTimingHistory::~FakeCompositorTimingHistory() { } void FakeCompositorTimingHistory::SetAllEstimatesTo(base::TimeDelta duration) { begin_main_frame_to_commit_duration_ = duration; + begin_main_frame_queue_duration_critical_ = duration; + begin_main_frame_queue_duration_not_critical_ = duration; + begin_main_frame_start_to_commit_duration_ = duration; commit_to_ready_to_activate_duration_ = duration; prepare_tiles_duration_ = duration; activate_duration_ = duration; @@ -96,6 +98,22 @@ begin_main_frame_to_commit_duration_ = duration; } +void FakeCompositorTimingHistory:: + SetBeginMainFrameQueueDurationCriticalEstimate(base::TimeDelta duration) { + begin_main_frame_queue_duration_critical_ = duration; +} + +void FakeCompositorTimingHistory:: + SetBeginMainFrameQueueDurationNotCriticalEstimate( + base::TimeDelta duration) { + begin_main_frame_queue_duration_not_critical_ = duration; +} + +void FakeCompositorTimingHistory:: + SetBeginMainFrameStartToCommitDurationEstimate(base::TimeDelta duration) { + begin_main_frame_start_to_commit_duration_ = duration; +} + void FakeCompositorTimingHistory::SetCommitToReadyToActivateDurationEstimate( base::TimeDelta duration) { commit_to_ready_to_activate_duration_ = duration; @@ -122,6 +140,24 @@ } base::TimeDelta +FakeCompositorTimingHistory::BeginMainFrameQueueDurationCriticalEstimate() + const { + return begin_main_frame_queue_duration_critical_; +} + +base::TimeDelta +FakeCompositorTimingHistory::BeginMainFrameQueueDurationNotCriticalEstimate() + const { + return begin_main_frame_queue_duration_not_critical_; +} + +base::TimeDelta +FakeCompositorTimingHistory::BeginMainFrameStartToCommitDurationEstimate() + const { + return begin_main_frame_start_to_commit_duration_; +} + +base::TimeDelta FakeCompositorTimingHistory::CommitToReadyToActivateDurationEstimate() const { return commit_to_ready_to_activate_duration_; } @@ -156,8 +192,9 @@ TestBackToBackBeginFrameSource::Create(now_src, task_runner); return make_scoped_ptr(new TestScheduler( now_src, client, settings, layer_tree_host_id, task_runner, - external_frame_source, synthetic_frame_source.Pass(), - unthrottled_frame_source.Pass(), compositor_timing_history.Pass())); + external_frame_source, std::move(synthetic_frame_source), + std::move(unthrottled_frame_source), + std::move(compositor_timing_history))); } TestScheduler::TestScheduler( @@ -175,11 +212,10 @@ layer_tree_host_id, task_runner, external_frame_source, - synthetic_frame_source.Pass(), - unthrottled_frame_source.Pass(), - compositor_timing_history.Pass()), - now_src_(now_src) { -} + std::move(synthetic_frame_source), + std::move(unthrottled_frame_source), + std::move(compositor_timing_history)), + now_src_(now_src) {} base::TimeTicks TestScheduler::Now() const { return now_src_->NowTicks();
diff --git a/cc/test/scheduler_test_common.h b/cc/test/scheduler_test_common.h index 41c21459..5cb3377c 100644 --- a/cc/test/scheduler_test_common.h +++ b/cc/test/scheduler_test_common.h
@@ -150,7 +150,7 @@ TestDelayBasedTimeSource::Create(now_src, initial_interval, task_runner); return make_scoped_ptr( - new TestSyntheticBeginFrameSource(time_source.Pass())); + new TestSyntheticBeginFrameSource(std::move(time_source))); } protected: @@ -169,12 +169,20 @@ void SetAllEstimatesTo(base::TimeDelta duration); void SetBeginMainFrameToCommitDurationEstimate(base::TimeDelta duration); + void SetBeginMainFrameQueueDurationCriticalEstimate(base::TimeDelta duration); + void SetBeginMainFrameQueueDurationNotCriticalEstimate( + base::TimeDelta duration); + void SetBeginMainFrameStartToCommitDurationEstimate(base::TimeDelta duration); void SetCommitToReadyToActivateDurationEstimate(base::TimeDelta duration); void SetPrepareTilesDurationEstimate(base::TimeDelta duration); void SetActivateDurationEstimate(base::TimeDelta duration); void SetDrawDurationEstimate(base::TimeDelta duration); base::TimeDelta BeginMainFrameToCommitDurationEstimate() const override; + base::TimeDelta BeginMainFrameQueueDurationCriticalEstimate() const override; + base::TimeDelta BeginMainFrameQueueDurationNotCriticalEstimate() + const override; + base::TimeDelta BeginMainFrameStartToCommitDurationEstimate() const override; base::TimeDelta CommitToReadyToActivateDurationEstimate() const override; base::TimeDelta PrepareTilesDurationEstimate() const override; base::TimeDelta ActivateDurationEstimate() const override; @@ -188,6 +196,9 @@ rendering_stats_instrumentation_owned_; base::TimeDelta begin_main_frame_to_commit_duration_; + base::TimeDelta begin_main_frame_queue_duration_critical_; + base::TimeDelta begin_main_frame_queue_duration_not_critical_; + base::TimeDelta begin_main_frame_start_to_commit_duration_; base::TimeDelta commit_to_ready_to_activate_duration_; base::TimeDelta prepare_tiles_duration_; base::TimeDelta activate_duration_; @@ -232,6 +243,14 @@ return begin_impl_frame_tracker_.Interval(); } + // Note: This setting will be overriden on the next BeginFrame in the + // scheduler. To control the value it gets on the next BeginFrame + // Pass in a fake CompositorTimingHistory that indicates BeginMainFrame + // to Activation is fast. + void SetCriticalBeginMainFrameToActivateIsFast(bool is_fast) { + state_machine_.SetCriticalBeginMainFrameToActivateIsFast(is_fast); + } + protected: // Overridden from Scheduler. base::TimeTicks Now() const override;
diff --git a/cc/test/solid_color_content_layer_client.cc b/cc/test/solid_color_content_layer_client.cc index ed84bec4..495e069 100644 --- a/cc/test/solid_color_content_layer_client.cc +++ b/cc/test/solid_color_content_layer_client.cc
@@ -39,7 +39,7 @@ skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecordingAsPicture()); - item->SetNew(picture.Pass()); + item->SetNew(std::move(picture)); display_list->Finalize(); return display_list;
diff --git a/cc/test/surface_hittest_test_helpers.cc b/cc/test/surface_hittest_test_helpers.cc index c7d37e5e..8c579597 100644 --- a/cc/test/surface_hittest_test_helpers.cc +++ b/cc/test/surface_hittest_test_helpers.cc
@@ -65,7 +65,7 @@ RenderPassList* render_pass_list) { scoped_ptr<RenderPass> render_pass = RenderPass::Create(); render_pass->SetNew(render_pass_id, rect, rect, transform_to_root_target); - render_pass_list->push_back(render_pass.Pass()); + render_pass_list->push_back(std::move(render_pass)); } scoped_ptr<CompositorFrame> CreateCompositorFrameWithRenderPassList( @@ -74,7 +74,7 @@ new DelegatedFrameData); root_delegated_frame_data->render_pass_list.swap(*render_pass_list); scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); - root_frame->delegated_frame_data = root_delegated_frame_data.Pass(); + root_frame->delegated_frame_data = std::move(root_delegated_frame_data); return root_frame; }
diff --git a/cc/test/test_context_provider.cc b/cc/test/test_context_provider.cc index 0c45e62..3a570cab 100644 --- a/cc/test/test_context_provider.cc +++ b/cc/test/test_context_provider.cc
@@ -40,12 +40,12 @@ scoped_ptr<TestWebGraphicsContext3D> context) { if (!context) return NULL; - return new TestContextProvider(context.Pass()); + return new TestContextProvider(std::move(context)); } TestContextProvider::TestContextProvider( scoped_ptr<TestWebGraphicsContext3D> context) - : context3d_(context.Pass()), + : context3d_(std::move(context)), context_gl_(new TestGLES2Interface(context3d_.get())), bound_(false), weak_ptr_factory_(this) {
diff --git a/cc/test/test_gpu_memory_buffer_manager.cc b/cc/test/test_gpu_memory_buffer_manager.cc index af86cbb..273ed36 100644 --- a/cc/test/test_gpu_memory_buffer_manager.cc +++ b/cc/test/test_gpu_memory_buffer_manager.cc
@@ -21,7 +21,7 @@ size_t stride) : size_(size), format_(format), - shared_memory_(shared_memory.Pass()), + shared_memory_(std::move(shared_memory)), offset_(offset), stride_(stride), mapped_(false) {} @@ -96,7 +96,7 @@ if (!shared_memory->CreateAnonymous(buffer_size)) return nullptr; return make_scoped_ptr<gfx::GpuMemoryBuffer>(new GpuMemoryBufferImpl( - size, format, shared_memory.Pass(), 0, + size, format, std::move(shared_memory), 0, base::checked_cast<int>( gfx::RowSizeForBufferFormat(size.width(), format, 0)))); }
diff --git a/cc/test/test_in_process_context_provider.cc b/cc/test/test_in_process_context_provider.cc index a56560f..a0b4c28 100644 --- a/cc/test/test_in_process_context_provider.cc +++ b/cc/test/test_in_process_context_provider.cc
@@ -55,7 +55,7 @@ image_factory)); DCHECK(context); - return context.Pass(); + return context; } scoped_ptr<gpu::GLInProcessContext> CreateTestInProcessContext() {
diff --git a/cc/test/test_shared_bitmap_manager.cc b/cc/test/test_shared_bitmap_manager.cc index 7e14b2f..ef3b484 100644 --- a/cc/test/test_shared_bitmap_manager.cc +++ b/cc/test/test_shared_bitmap_manager.cc
@@ -14,7 +14,7 @@ OwnedSharedBitmap(scoped_ptr<base::SharedMemory> shared_memory, const SharedBitmapId& id) : SharedBitmap(static_cast<uint8*>(shared_memory->memory()), id), - shared_memory_(shared_memory.Pass()) {} + shared_memory_(std::move(shared_memory)) {} ~OwnedSharedBitmap() override {} @@ -35,7 +35,7 @@ memory->CreateAndMapAnonymous(size.GetArea() * 4); SharedBitmapId id = SharedBitmap::GenerateId(); bitmap_map_[id] = memory.get(); - return make_scoped_ptr(new OwnedSharedBitmap(memory.Pass(), id)); + return make_scoped_ptr(new OwnedSharedBitmap(std::move(memory), id)); } scoped_ptr<SharedBitmap> TestSharedBitmapManager::GetSharedBitmapFromId(
diff --git a/cc/tiles/eviction_tile_priority_queue.cc b/cc/tiles/eviction_tile_priority_queue.cc index 743c982..5668f0f 100644 --- a/cc/tiles/eviction_tile_priority_queue.cc +++ b/cc/tiles/eviction_tile_priority_queue.cc
@@ -72,7 +72,7 @@ new TilingSetEvictionQueue(layer->picture_layer_tiling_set())); // Queues will only contain non empty tiling sets. if (!tiling_set_queue->IsEmpty()) - queues->push_back(tiling_set_queue.Pass()); + queues->push_back(std::move(tiling_set_queue)); } std::make_heap(queues->begin(), queues->end(), EvictionOrderComparator(tree_priority));
diff --git a/cc/tiles/picture_layer_tiling.cc b/cc/tiles/picture_layer_tiling.cc index 4cb66a5c..747dd94 100644 --- a/cc/tiles/picture_layer_tiling.cc +++ b/cc/tiles/picture_layer_tiling.cc
@@ -115,7 +115,7 @@ all_tiles_done_ = false; ScopedTilePtr tile = client_->CreateTile(info); Tile* raw_ptr = tile.get(); - tiles_.add(key, tile.Pass()); + tiles_.add(key, std::move(tile)); return raw_ptr; }
diff --git a/cc/tiles/picture_layer_tiling_set.cc b/cc/tiles/picture_layer_tiling_set.cc index 7e41bcf..77589c1 100644 --- a/cc/tiles/picture_layer_tiling_set.cc +++ b/cc/tiles/picture_layer_tiling_set.cc
@@ -80,7 +80,7 @@ tree_, contents_scale, raster_source, client_, tiling_interest_area_padding_, skewport_target_time_in_seconds_, skewport_extrapolation_limit_in_content_pixels_); - tilings_.push_back(new_tiling.Pass()); + tilings_.push_back(std::move(new_tiling)); this_tiling = tilings_.back().get(); tiling_sort_required = true; }
diff --git a/cc/tiles/raster_tile_priority_queue.cc b/cc/tiles/raster_tile_priority_queue.cc index afa3755..0b47407 100644 --- a/cc/tiles/raster_tile_priority_queue.cc +++ b/cc/tiles/raster_tile_priority_queue.cc
@@ -20,14 +20,14 @@ scoped_ptr<RasterTilePriorityQueueAll> queue( new RasterTilePriorityQueueAll); queue->Build(active_layers, pending_layers, tree_priority); - return queue.Pass(); + return std::move(queue); } case Type::REQUIRED_FOR_ACTIVATION: case Type::REQUIRED_FOR_DRAW: { scoped_ptr<RasterTilePriorityQueueRequired> queue( new RasterTilePriorityQueueRequired); queue->Build(active_layers, pending_layers, type); - return queue.Pass(); + return std::move(queue); } } NOTREACHED();
diff --git a/cc/tiles/raster_tile_priority_queue_all.cc b/cc/tiles/raster_tile_priority_queue_all.cc index beca4d5a..09c5c78 100644 --- a/cc/tiles/raster_tile_priority_queue_all.cc +++ b/cc/tiles/raster_tile_priority_queue_all.cc
@@ -64,7 +64,7 @@ new TilingSetRasterQueueAll(tiling_set, prioritize_low_res)); // Queues will only contain non empty tiling sets. if (!tiling_set_queue->IsEmpty()) - queues->push_back(tiling_set_queue.Pass()); + queues->push_back(std::move(tiling_set_queue)); } std::make_heap(queues->begin(), queues->end(), RasterOrderComparator(tree_priority));
diff --git a/cc/tiles/raster_tile_priority_queue_required.cc b/cc/tiles/raster_tile_priority_queue_required.cc index 5c5fd7e7..24d9789 100644 --- a/cc/tiles/raster_tile_priority_queue_required.cc +++ b/cc/tiles/raster_tile_priority_queue_required.cc
@@ -22,7 +22,7 @@ layer->picture_layer_tiling_set(), RasterTilePriorityQueueRequired::Type::REQUIRED_FOR_ACTIVATION)); if (!tiling_set_queue->IsEmpty()) - queues->push_back(tiling_set_queue.Pass()); + queues->push_back(std::move(tiling_set_queue)); } } @@ -55,7 +55,7 @@ new TilingSetRasterQueueRequired(layer->picture_layer_tiling_set(), Type::REQUIRED_FOR_DRAW)); if (!tiling_set_queue->IsEmpty()) - tiling_set_queues_.push_back(tiling_set_queue.Pass()); + tiling_set_queues_.push_back(std::move(tiling_set_queue)); } }
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc index 898b3e35..d7b91bfc 100644 --- a/cc/tiles/tile_manager.cc +++ b/cc/tiles/tile_manager.cc
@@ -97,7 +97,7 @@ resource_, resource_content_id_, previous_content_id_); } void CompleteOnOriginThread(TileTaskClient* client) override { - client->ReleaseBufferForRaster(raster_buffer_.Pass()); + client->ReleaseBufferForRaster(std::move(raster_buffer_)); reply_.Run(analysis_, !HasFinishedRunning()); } @@ -545,7 +545,7 @@ tile_memory_limit - memory_required_by_tile_to_be_scheduled; eviction_priority_queue = FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( - eviction_priority_queue.Pass(), scheduled_tile_memory_limit, + std::move(eviction_priority_queue), scheduled_tile_memory_limit, priority, &memory_usage); bool memory_usage_is_within_limit = !memory_usage.Exceeds(scheduled_tile_memory_limit); @@ -567,7 +567,7 @@ // didn't reduce memory. This ensures that we always release as many resources // as possible to stay within the memory limit. eviction_priority_queue = FreeTileResourcesUntilUsageIsWithinLimit( - eviction_priority_queue.Pass(), hard_memory_limit, &memory_usage); + std::move(eviction_priority_queue), hard_memory_limit, &memory_usage); UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", !had_enough_memory_to_schedule_tiles_needed_now);
diff --git a/cc/tiles/tile_manager_perftest.cc b/cc/tiles/tile_manager_perftest.cc index 6e7bed3..9bc3c18 100644 --- a/cc/tiles/tile_manager_perftest.cc +++ b/cc/tiles/tile_manager_perftest.cc
@@ -172,7 +172,7 @@ raster_source); pending_layer->SetDrawsContent(true); pending_layer->SetHasRenderSurface(true); - pending_tree->SetRootLayer(pending_layer.Pass()); + pending_tree->SetRootLayer(std::move(pending_layer)); pending_root_layer_ = static_cast<FakePictureLayerImpl*>( host_impl_.pending_tree()->LayerById(id_)); @@ -360,7 +360,7 @@ layer->SetBounds(layer_bounds); layer->SetDrawsContent(true); layers.push_back(layer.get()); - pending_root_layer_->AddChild(layer.Pass()); + pending_root_layer_->AddChild(std::move(layer)); ++next_id; }
diff --git a/cc/tiles/tile_manager_unittest.cc b/cc/tiles/tile_manager_unittest.cc index 347aa6d..5ca49b6c 100644 --- a/cc/tiles/tile_manager_unittest.cc +++ b/cc/tiles/tile_manager_unittest.cc
@@ -140,7 +140,7 @@ } // The bounds() just mirror the raster source size. pending_layer->SetBounds(pending_layer->raster_source()->GetSize()); - pending_tree->SetRootLayer(pending_layer.Pass()); + pending_tree->SetRootLayer(std::move(pending_layer)); pending_layer_ = static_cast<FakePictureLayerImpl*>( host_impl_.pending_tree()->LayerById(id_)); @@ -614,7 +614,7 @@ host_impl_.pending_tree(), id_ + 1, pending_raster_source); FakePictureLayerImpl* pending_child_raw = pending_child.get(); pending_child_raw->SetDrawsContent(true); - pending_layer_->AddChild(pending_child.Pass()); + pending_layer_->AddChild(std::move(pending_child)); // Set a small viewport, so we have soon and eventually tiles. host_impl_.SetViewportSize(gfx::Size(200, 200)); @@ -835,7 +835,7 @@ scoped_ptr<FakePictureLayerImpl> pending_child = FakePictureLayerImpl::CreateWithRasterSource(host_impl_.pending_tree(), 2, pending_raster_source); - pending_layer_->AddChild(pending_child.Pass()); + pending_layer_->AddChild(std::move(pending_child)); FakePictureLayerImpl* pending_child_layer = static_cast<FakePictureLayerImpl*>(pending_layer_->children()[0].get()); @@ -952,7 +952,7 @@ FakePictureLayerImpl::CreateWithRasterSource(host_impl_.pending_tree(), 2, pending_raster_source); FakePictureLayerImpl* pending_child_layer = pending_child.get(); - pending_layer_->AddChild(pending_child.Pass()); + pending_layer_->AddChild(std::move(pending_child)); // Create a fully transparent child layer so that its tile priorities are not // considered to be valid. @@ -1053,7 +1053,7 @@ FakePictureLayerImpl::Create(host_impl_.pending_tree(), id_ + i); pending_layer->SetDrawsContent(true); pending_layer->set_has_valid_tile_priorities(true); - pending_layer_->AddChild(pending_layer.Pass()); + pending_layer_->AddChild(std::move(pending_layer)); } queue = host_impl_.BuildRasterQueue(SAME_PRIORITY_FOR_BOTH_TREES, @@ -1100,7 +1100,7 @@ FakePictureLayerImpl::Create(host_impl_.pending_tree(), id_ + i); pending_layer->SetDrawsContent(true); pending_layer->set_has_valid_tile_priorities(true); - pending_layer_->AddChild(pending_layer.Pass()); + pending_layer_->AddChild(std::move(pending_layer)); } scoped_ptr<EvictionTilePriorityQueue> queue( @@ -1509,7 +1509,7 @@ } // The bounds() just mirror the raster source size. pending_layer->SetBounds(pending_layer->raster_source()->GetSize()); - pending_tree->SetRootLayer(pending_layer.Pass()); + pending_tree->SetRootLayer(std::move(pending_layer)); // Add tilings/tiles for the layer. bool update_lcd_text = false; @@ -1754,7 +1754,7 @@ // The bounds() just mirror the raster source size. pending_layer->SetBounds(pending_layer->raster_source()->GetSize()); - pending_tree->SetRootLayer(pending_layer.Pass()); + pending_tree->SetRootLayer(std::move(pending_layer)); // Add tilings/tiles for the layer. host_impl_->pending_tree()->BuildPropertyTreesForTesting(); @@ -1846,7 +1846,7 @@ // The bounds() just mirror the raster source size. pending_layer->SetBounds(pending_layer->raster_source()->GetSize()); - pending_tree->SetRootLayer(pending_layer.Pass()); + pending_tree->SetRootLayer(std::move(pending_layer)); // Add tilings/tiles for the layer. host_impl->pending_tree()->BuildPropertyTreesForTesting(); @@ -1871,13 +1871,15 @@ // Ensures that the tile manager successfully reuses tiles when partial // raster is enabled. TEST_F(PartialRasterTileManagerTest, PartialRasterSuccessfullyEnabled) { - RunPartialRasterCheck(host_impl_.Pass(), true /* partial_raster_enabled */); + RunPartialRasterCheck(std::move(host_impl_), + true /* partial_raster_enabled */); } // Ensures that the tile manager does not attempt to reuse tiles when partial // raster is disabled. TEST_F(TileManagerTest, PartialRasterSuccessfullyDisabled) { - RunPartialRasterCheck(host_impl_.Pass(), false /* partial_raster_enabled */); + RunPartialRasterCheck(std::move(host_impl_), + false /* partial_raster_enabled */); } } // namespace
diff --git a/cc/trees/damage_tracker_unittest.cc b/cc/trees/damage_tracker_unittest.cc index 70e5eb6..525592d 100644 --- a/cc/trees/damage_tracker_unittest.cc +++ b/cc/trees/damage_tracker_unittest.cc
@@ -98,9 +98,9 @@ child->SetPosition(gfx::PointF(100.f, 100.f)); child->SetBounds(gfx::Size(30, 30)); child->SetDrawsContent(true); - root->AddChild(child.Pass()); + root->AddChild(std::move(child)); - return root.Pass(); + return root; } scoped_ptr<LayerImpl> CreateTestTreeWithTwoSurfaces() { @@ -145,12 +145,12 @@ grand_child2->SetBounds(gfx::Size(6, 8)); grand_child2->SetDrawsContent(true); - child1->AddChild(grand_child1.Pass()); - child1->AddChild(grand_child2.Pass()); - root->AddChild(child1.Pass()); - root->AddChild(child2.Pass()); + child1->AddChild(std::move(grand_child1)); + child1->AddChild(std::move(grand_child2)); + root->AddChild(std::move(child1)); + root->AddChild(std::move(child2)); - return root.Pass(); + return root; } scoped_ptr<LayerImpl> CreateAndSetUpTestTreeWithOneSurface() { @@ -160,7 +160,7 @@ // everything, so that we can actually perform specific tests. EmulateDrawingOneFrame(root.get()); - return root.Pass(); + return root; } scoped_ptr<LayerImpl> CreateAndSetUpTestTreeWithTwoSurfaces() { @@ -170,7 +170,7 @@ // everything, so that we can actually perform specific tests. EmulateDrawingOneFrame(root.get()); - return root.Pass(); + return root; } protected: @@ -718,7 +718,7 @@ child2->SetPosition(gfx::PointF(400.f, 380.f)); child2->SetBounds(gfx::Size(6, 8)); child2->SetDrawsContent(true); - root->AddChild(child2.Pass()); + root->AddChild(std::move(child2)); } EmulateDrawingOneFrame(root.get()); @@ -772,7 +772,7 @@ // scenario. ASSERT_FALSE(child2->LayerPropertyChanged()); ASSERT_TRUE(child2->update_rect().IsEmpty()); - root->AddChild(child2.Pass()); + root->AddChild(std::move(child2)); } EmulateDrawingOneFrame(root.get()); @@ -798,7 +798,7 @@ child2->SetPosition(gfx::PointF(400.f, 380.f)); child2->SetBounds(gfx::Size(6, 8)); child2->SetDrawsContent(true); - root->AddChild(child2.Pass()); + root->AddChild(std::move(child2)); } LayerImpl* child2 = root->children()[1].get(); EmulateDrawingOneFrame(root.get()); @@ -1047,7 +1047,7 @@ grand_child3->SetPosition(gfx::PointF(240.f, 240.f)); grand_child3->SetBounds(gfx::Size(10, 10)); grand_child3->SetDrawsContent(true); - child1->AddChild(grand_child3.Pass()); + child1->AddChild(std::move(grand_child3)); } child1->SetOpacity(0.5f); EmulateDrawingOneFrame(root.get()); @@ -1062,7 +1062,7 @@ gfx::Transform reflection; reflection.Scale3d(-1.0, 1.0, 1.0); grand_child1_replica->SetTransform(reflection); - grand_child1->SetReplicaLayer(grand_child1_replica.Pass()); + grand_child1->SetReplicaLayer(std::move(grand_child1_replica)); grand_child1->SetHasRenderSurface(true); } EmulateDrawingOneFrame(root.get()); @@ -1147,7 +1147,7 @@ LayerImpl::Create(host_impl_.active_tree(), 3); mask_layer->SetPosition(child->position()); mask_layer->SetBounds(child->bounds()); - child->SetMaskLayer(mask_layer.Pass()); + child->SetMaskLayer(std::move(mask_layer)); child->SetHasRenderSurface(true); } LayerImpl* mask_layer = child->mask_layer(); @@ -1160,7 +1160,7 @@ grand_child->SetPosition(gfx::PointF(2.f, 2.f)); grand_child->SetBounds(gfx::Size(2, 2)); grand_child->SetDrawsContent(true); - child->AddChild(grand_child.Pass()); + child->AddChild(std::move(grand_child)); } EmulateDrawingOneFrame(root.get()); @@ -1236,7 +1236,7 @@ gfx::Transform reflection; reflection.Scale3d(-1.0, 1.0, 1.0); grand_child1_replica->SetTransform(reflection); - grand_child1->SetReplicaLayer(grand_child1_replica.Pass()); + grand_child1->SetReplicaLayer(std::move(grand_child1_replica)); grand_child1->SetHasRenderSurface(true); } LayerImpl* grand_child1_replica = grand_child1->replica_layer(); @@ -1247,7 +1247,7 @@ LayerImpl::Create(host_impl_.active_tree(), 7); replica_mask_layer->SetPosition(gfx::PointF()); replica_mask_layer->SetBounds(grand_child1->bounds()); - grand_child1_replica->SetMaskLayer(replica_mask_layer.Pass()); + grand_child1_replica->SetMaskLayer(std::move(replica_mask_layer)); } LayerImpl* replica_mask_layer = grand_child1_replica->mask_layer(); @@ -1313,7 +1313,7 @@ gfx::Transform reflection; reflection.Scale3d(-1.0, 1.0, 1.0); grand_child1_replica->SetTransform(reflection); - grand_child1->SetReplicaLayer(grand_child1_replica.Pass()); + grand_child1->SetReplicaLayer(std::move(grand_child1_replica)); grand_child1->SetHasRenderSurface(true); } LayerImpl* grand_child1_replica = grand_child1->replica_layer(); @@ -1325,7 +1325,7 @@ replica_mask_layer->SetPosition(gfx::PointF()); // Note: this is not the transform origin being tested. replica_mask_layer->SetBounds(grand_child1->bounds()); - grand_child1_replica->SetMaskLayer(replica_mask_layer.Pass()); + grand_child1_replica->SetMaskLayer(std::move(replica_mask_layer)); } LayerImpl* replica_mask_layer = grand_child1_replica->mask_layer();
diff --git a/cc/trees/latency_info_swap_promise_monitor.cc b/cc/trees/latency_info_swap_promise_monitor.cc index a57ae4c..9f2bc82 100644 --- a/cc/trees/latency_info_swap_promise_monitor.cc +++ b/cc/trees/latency_info_swap_promise_monitor.cc
@@ -52,7 +52,7 @@ void LatencyInfoSwapPromiseMonitor::OnSetNeedsCommitOnMain() { if (AddRenderingScheduledComponent(latency_, true /* on_main */)) { scoped_ptr<SwapPromise> swap_promise(new LatencyInfoSwapPromise(*latency_)); - layer_tree_host_->QueueSwapPromise(swap_promise.Pass()); + layer_tree_host_->QueueSwapPromise(std::move(swap_promise)); } } @@ -64,7 +64,7 @@ // promise is pinned so that it is not interrupted by new incoming // activations (which would otherwise break the swap promise). layer_tree_host_impl_->active_tree()->QueuePinnedSwapPromise( - swap_promise.Pass()); + std::move(swap_promise)); } } @@ -96,7 +96,7 @@ scoped_ptr<SwapPromise> swap_promise( new LatencyInfoSwapPromise(new_latency)); layer_tree_host_impl_->QueueSwapPromiseForMainThreadScrollUpdate( - swap_promise.Pass()); + std::move(swap_promise)); } }
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 13e6680..338bb36 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -33,6 +33,7 @@ #include "cc/layers/heads_up_display_layer_impl.h" #include "cc/layers/layer.h" #include "cc/layers/layer_iterator.h" +#include "cc/layers/layer_settings.h" #include "cc/layers/painted_scrollbar_layer.h" #include "cc/resources/ui_resource_request.h" #include "cc/scheduler/begin_frame_source.h" @@ -68,8 +69,8 @@ scoped_ptr<LayerTreeHost> layer_tree_host(new LayerTreeHost(params)); layer_tree_host->InitializeThreaded( params->main_task_runner, impl_task_runner, - params->external_begin_frame_source.Pass()); - return layer_tree_host.Pass(); + std::move(params->external_begin_frame_source)); + return layer_tree_host; } scoped_ptr<LayerTreeHost> LayerTreeHost::CreateSingleThreaded( @@ -79,8 +80,8 @@ scoped_ptr<LayerTreeHost> layer_tree_host(new LayerTreeHost(params)); layer_tree_host->InitializeSingleThreaded( single_thread_client, params->main_task_runner, - params->external_begin_frame_source.Pass()); - return layer_tree_host.Pass(); + std::move(params->external_begin_frame_source)); + return layer_tree_host; } LayerTreeHost::LayerTreeHost(InitParams* params) @@ -140,7 +141,7 @@ task_runner_provider_ = TaskRunnerProvider::Create(main_task_runner, impl_task_runner); InitializeProxy(ThreadProxy::Create(this, task_runner_provider_.get(), - external_begin_frame_source.Pass())); + std::move(external_begin_frame_source))); } void LayerTreeHost::InitializeSingleThreaded( @@ -150,20 +151,20 @@ task_runner_provider_ = TaskRunnerProvider::Create(main_task_runner, nullptr); InitializeProxy(SingleThreadProxy::Create( this, single_thread_client, task_runner_provider_.get(), - external_begin_frame_source.Pass())); + std::move(external_begin_frame_source))); } void LayerTreeHost::InitializeForTesting( scoped_ptr<TaskRunnerProvider> task_runner_provider, scoped_ptr<Proxy> proxy_for_testing) { - task_runner_provider_ = task_runner_provider.Pass(); - InitializeProxy(proxy_for_testing.Pass()); + task_runner_provider_ = std::move(task_runner_provider); + InitializeProxy(std::move(proxy_for_testing)); } void LayerTreeHost::InitializeProxy(scoped_ptr<Proxy> proxy) { TRACE_EVENT0("cc", "LayerTreeHost::InitializeForReal"); - proxy_ = proxy.Pass(); + proxy_ = std::move(proxy); proxy_->Start(); if (settings_.accelerated_animation_enabled) { if (animation_host_) @@ -321,7 +322,7 @@ host_impl->SetDebugState(debug_state_); if (pending_page_scale_animation_) { sync_tree->SetPendingPageScaleAnimation( - pending_page_scale_animation_.Pass()); + std::move(pending_page_scale_animation_)); } if (!ui_resource_request_queue_.empty()) { @@ -387,7 +388,7 @@ DCHECK(surface); DCHECK(!new_output_surface_); - new_output_surface_ = surface.Pass(); + new_output_surface_ = std::move(surface); proxy_->SetOutputSurface(new_output_surface_.get()); } @@ -397,7 +398,7 @@ DidLoseOutputSurface(); proxy_->ReleaseOutputSurface(); - return current_output_surface_.Pass(); + return std::move(current_output_surface_); } void LayerTreeHost::RequestNewOutputSurface() { @@ -407,7 +408,7 @@ void LayerTreeHost::DidInitializeOutputSurface() { DCHECK(new_output_surface_); output_surface_lost_ = false; - current_output_surface_ = new_output_surface_.Pass(); + current_output_surface_ = std::move(new_output_surface_); client_->DidInitializeOutputSurface(); } @@ -436,7 +437,7 @@ gpu_memory_buffer_manager_ = NULL; task_graph_runner_ = NULL; input_handler_weak_ptr_ = host_impl->AsWeakPtr(); - return host_impl.Pass(); + return host_impl; } void LayerTreeHost::DidLoseOutputSurface() { @@ -537,9 +538,9 @@ scoped_ptr<AnimationEventsVector> events) { DCHECK(task_runner_provider_->IsMainThread()); if (animation_host_) - animation_host_->SetAnimationEvents(events.Pass()); + animation_host_->SetAnimationEvents(std::move(events)); else - animation_registrar_->SetAnimationEvents(events.Pass()); + animation_registrar_->SetAnimationEvents(std::move(events)); } void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) { @@ -820,7 +821,7 @@ TRACE_ID_DONT_MANGLE(swap_promise->TraceId()), TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step", "Main thread scroll update"); - QueueSwapPromise(swap_promise.Pass()); + QueueSwapPromise(std::move(swap_promise)); } gfx::Vector2dF inner_viewport_scroll_delta; @@ -999,13 +1000,13 @@ const std::string& benchmark_name, scoped_ptr<base::Value> value, const MicroBenchmark::DoneCallback& callback) { - return micro_benchmark_controller_.ScheduleRun( - benchmark_name, value.Pass(), callback); + return micro_benchmark_controller_.ScheduleRun(benchmark_name, + std::move(value), callback); } bool LayerTreeHost::SendMessageToMicroBenchmark(int id, scoped_ptr<base::Value> value) { - return micro_benchmark_controller_.SendMessage(id, value.Pass()); + return micro_benchmark_controller_.SendMessage(id, std::move(value)); } void LayerTreeHost::InsertSwapPromiseMonitor(SwapPromiseMonitor* monitor) { @@ -1024,7 +1025,7 @@ void LayerTreeHost::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) { DCHECK(swap_promise); - swap_promise_list_.push_back(swap_promise.Pass()); + swap_promise_list_.push_back(std::move(swap_promise)); } void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) { @@ -1064,8 +1065,8 @@ void LayerTreeHost::RecordFrameTimingEvents( scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events, scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) { - client_->RecordFrameTimingEvents(composite_events.Pass(), - main_frame_events.Pass()); + client_->RecordFrameTimingEvents(std::move(composite_events), + std::move(main_frame_events)); } Layer* LayerTreeHost::LayerById(int id) const {
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc index 926b9b0..1392bf6 100644 --- a/cc/trees/layer_tree_host_common_unittest.cc +++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -312,16 +312,16 @@ scroll_layer->SetScrollClipLayer(clip_layer->id()); scroll_layer->SetScrollDelta(kScrollDelta); gfx::Transform impl_transform; - scroll_layer->AddChild(sublayer_scoped_ptr.Pass()); + scroll_layer->AddChild(std::move(sublayer_scoped_ptr)); LayerImpl* scroll_layer_raw_ptr = scroll_layer_scoped_ptr.get(); - clip_layer->AddChild(scroll_layer_scoped_ptr.Pass()); + clip_layer->AddChild(std::move(scroll_layer_scoped_ptr)); scroll_layer_raw_ptr->PushScrollOffsetFromMainThread(kScrollOffset); scoped_ptr<LayerImpl> root(LayerImpl::Create(host_impl.active_tree(), 3)); SetLayerPropertiesForTesting(root.get(), identity_matrix, gfx::Point3F(), gfx::PointF(), gfx::Size(3, 4), true, false, false); - root->AddChild(clip_layer_scoped_ptr.Pass()); + root->AddChild(std::move(clip_layer_scoped_ptr)); root->SetHasRenderSurface(true); ExecuteCalculateDrawProperties( @@ -635,7 +635,7 @@ SetLayerPropertiesForTesting(child_replica.get(), replica_layer_transform, gfx::Point3F(), gfx::PointF(), gfx::Size(), true, false, false); - child->SetReplicaLayer(child_replica.Pass()); + child->SetReplicaLayer(std::move(child_replica)); ExecuteCalculateDrawProperties(root); @@ -775,8 +775,8 @@ gfx::Point3F(2.5f, 0.f, 0.f), gfx::PointF(), gfx::Size(), true, false, false); - render_surface1->SetReplicaLayer(replica_of_rs1.Pass()); - render_surface2->SetReplicaLayer(replica_of_rs2.Pass()); + render_surface1->SetReplicaLayer(std::move(replica_of_rs1)); + render_surface2->SetReplicaLayer(std::move(replica_of_rs2)); ExecuteCalculateDrawProperties(root); // Only layers that are associated with render surfaces should have an actual @@ -2410,7 +2410,7 @@ Animation::TRANSFORM); animation->set_fill_mode(Animation::FILL_MODE_NONE); animation->set_time_offset(base::TimeDelta::FromMilliseconds(-1000)); - grand_child->layer_animation_controller()->AddAnimation(animation.Pass()); + grand_child->layer_animation_controller()->AddAnimation(std::move(animation)); ExecuteCalculateDrawProperties(parent); @@ -3279,10 +3279,10 @@ host_impl.SetViewportSize(root->bounds()); - child->AddChild(grand_child.Pass()); - root->AddChild(child.Pass()); - root->AddChild(occluding_child.Pass()); - host_impl.active_tree()->SetRootLayer(root.Pass()); + child->AddChild(std::move(grand_child)); + root->AddChild(std::move(child)); + root->AddChild(std::move(occluding_child)); + host_impl.active_tree()->SetRootLayer(std::move(root)); host_impl.SetVisible(true); host_impl.InitializeRenderer(output_surface.get()); host_impl.active_tree()->BuildPropertyTreesForTesting(); @@ -4720,7 +4720,7 @@ SetLayerPropertiesForTesting(replica.get(), replica_transform, gfx::Point3F(), gfx::PointF(2.f, 2.f), gfx::Size(10, 10), false, true, false); - child->SetReplicaLayer(replica.Pass()); + child->SetReplicaLayer(std::move(replica)); // This layer should end up in the same surface as child, with the same draw // and screen space transforms. @@ -4831,7 +4831,7 @@ SetLayerPropertiesForTesting(replica.get(), replica_transform, gfx::Point3F(), gfx::PointF(), gfx::Size(13, 11), false, true, false); - child->SetReplicaLayer(replica.Pass()); + child->SetReplicaLayer(std::move(replica)); float device_scale_factor = 1.7f; ExecuteCalculateDrawProperties(parent, device_scale_factor); @@ -4959,7 +4959,7 @@ AddOpacityTransitionToController( child->layer_animation_controller(), 10.0, 0.0f, 1.0f, false); - root->AddChild(child.Pass()); + root->AddChild(std::move(child)); root->SetHasRenderSurface(true); LayerImplList render_surface_layer_list; @@ -5004,9 +5004,9 @@ child_ = child_ptr.get(); grand_child_ = grand_child_ptr.get(); - child_->AddChild(grand_child_ptr.Pass()); - root_->AddChild(child_ptr.Pass()); - host_impl_.active_tree()->SetRootLayer(root_ptr.Pass()); + child_->AddChild(std::move(grand_child_ptr)); + root_->AddChild(std::move(child_ptr)); + host_impl_.active_tree()->SetRootLayer(std::move(root_ptr)); root_->SetContentsOpaque(true); child_->SetContentsOpaque(true); @@ -5229,8 +5229,8 @@ grand_child->SetDrawsContent(true); grand_child->SetHideLayerAndSubtree(true); - child->AddChild(grand_child.Pass()); - root->AddChild(child.Pass()); + child->AddChild(std::move(grand_child)); + root->AddChild(std::move(child)); root->SetHasRenderSurface(true); LayerImplList render_surface_layer_list; @@ -5276,8 +5276,8 @@ true, false, false); grand_child->SetDrawsContent(true); - child->AddChild(grand_child.Pass()); - root->AddChild(child.Pass()); + child->AddChild(std::move(grand_child)); + root->AddChild(std::move(child)); LayerImplList render_surface_layer_list; LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( @@ -5359,12 +5359,12 @@ LayerImpl* copy_grand_parent_sibling_after_layer = copy_grand_parent_sibling_after.get(); - copy_request->AddChild(copy_child.Pass()); - copy_parent->AddChild(copy_request.Pass()); - copy_grand_parent->AddChild(copy_parent.Pass()); - root->AddChild(copy_grand_parent_sibling_before.Pass()); - root->AddChild(copy_grand_parent.Pass()); - root->AddChild(copy_grand_parent_sibling_after.Pass()); + copy_request->AddChild(std::move(copy_child)); + copy_parent->AddChild(std::move(copy_request)); + copy_grand_parent->AddChild(std::move(copy_parent)); + root->AddChild(std::move(copy_grand_parent_sibling_before)); + root->AddChild(std::move(copy_grand_parent)); + root->AddChild(std::move(copy_grand_parent_sibling_after)); // Hide the copy_grand_parent and its subtree. But make a copy request in that // hidden subtree on copy_layer. @@ -5470,9 +5470,9 @@ copy_layer->PassCopyRequests(©_requests); EXPECT_TRUE(copy_layer->HasCopyRequest()); - copy_layer->AddChild(copy_child.Pass()); - copy_parent->AddChild(copy_layer.Pass()); - root->AddChild(copy_parent.Pass()); + copy_layer->AddChild(std::move(copy_child)); + copy_parent->AddChild(std::move(copy_layer)); + root->AddChild(std::move(copy_parent)); LayerImplList render_surface_layer_list; LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( @@ -5969,9 +5969,9 @@ make_scoped_refptr(new LayerWithForcedDrawsContent(layer_settings())); Layer* child3 = child_3.get(); - parent->AddChild(child_1.Pass()); - child1->AddChild(child_2.Pass()); - child2->AddChild(child_3.Pass()); + parent->AddChild(std::move(child_1)); + child1->AddChild(std::move(child_2)); + child2->AddChild(std::move(child_3)); host()->SetRootLayer(root); @@ -6039,9 +6039,9 @@ child2->Set3dSortingContextId(1); child3->Set3dSortingContextId(1); - child2->AddChild(child3.Pass()); - child1->AddChild(child2.Pass()); - root->AddChild(child1.Pass()); + child2->AddChild(std::move(child3)); + child1->AddChild(std::move(child2)); + root->AddChild(std::move(child1)); { LayerImplList render_surface_layer_list; @@ -6651,9 +6651,9 @@ container->SetDrawsContent(true); scroller->SetDrawsContent(true); fixed->SetDrawsContent(true); - scroller->AddChild(fixed.Pass()); - container->AddChild(scroller.Pass()); - root->AddChild(container.Pass()); + scroller->AddChild(std::move(fixed)); + container->AddChild(std::move(scroller)); + root->AddChild(std::move(container)); // Rounded to integers already. { @@ -6792,9 +6792,9 @@ scroll_layer->SetScrollDelta(scroll_delta); scroll_layer->SetScrollCompensationAdjustment(main_scroll_fractional_part); - scroller->AddChild(fixed.Pass()); - container->AddChild(scroller.Pass()); - root->AddChild(container.Pass()); + scroller->AddChild(std::move(fixed)); + container->AddChild(std::move(scroller)); + root->AddChild(std::move(container)); LayerImplList render_surface_layer_list; LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( @@ -6915,9 +6915,9 @@ AnimationScaleFactorTrackingLayerImpl* child_raw = child.get(); AnimationScaleFactorTrackingLayerImpl* grand_child_raw = grand_child.get(); - child->AddChild(grand_child.Pass()); - parent->AddChild(child.Pass()); - grand_parent->AddChild(parent.Pass()); + child->AddChild(std::move(grand_child)); + parent->AddChild(std::move(child)); + grand_parent->AddChild(std::move(parent)); SetLayerPropertiesForTesting(grand_parent.get(), identity_matrix, gfx::Point3F(), gfx::PointF(), gfx::Size(1, 2), @@ -7244,10 +7244,10 @@ LayerImpl* grand_child1_raw = grand_child1.get(); LayerImpl* grand_child2_raw = grand_child2.get(); - child->AddChild(grand_child1.Pass()); - child->AddChild(grand_child2.Pass()); - parent->AddChild(child.Pass()); - grand_parent->AddChild(parent.Pass()); + child->AddChild(std::move(grand_child1)); + child->AddChild(std::move(grand_child2)); + parent->AddChild(std::move(child)); + grand_parent->AddChild(std::move(parent)); SetLayerPropertiesForTesting(grand_parent_raw, identity_matrix, gfx::Point3F(), gfx::PointF(), gfx::Size(1, 2), @@ -7376,7 +7376,7 @@ scoped_ptr<LayerImpl> replica_layer = LayerImpl::Create(host_impl.active_tree(), 20); replica_layer->SetMaskLayer(LayerImpl::Create(host_impl.active_tree(), 21)); - child_raw->SetReplicaLayer(replica_layer.Pass()); + child_raw->SetReplicaLayer(std::move(replica_layer)); child_raw->layer_tree_impl()->property_trees()->needs_rebuild = true; ExecuteCalculateDrawProperties(grand_parent_raw); @@ -7487,8 +7487,8 @@ scoped_ptr<LayerImpl> child2 = LayerImpl::Create(host_impl.active_tree(), 3); LayerImpl* child2_layer = child2.get(); - root->AddChild(child1.Pass()); - root->AddChild(child2.Pass()); + root->AddChild(std::move(child1)); + root->AddChild(std::move(child2)); root->SetHasRenderSurface(true); root->SetDrawsContent(true); @@ -7512,7 +7512,7 @@ LayerImpl::Create(host_impl.active_tree(), 5); replica_layer->SetHasRenderSurface(true); replica_layer->SetMaskLayer(LayerImpl::Create(host_impl.active_tree(), 6)); - child1_layer->SetReplicaLayer(replica_layer.Pass()); + child1_layer->SetReplicaLayer(std::move(replica_layer)); child1_layer->SetHasRenderSurface(true); ExecuteCalculateDrawProperties(root_layer); @@ -7974,10 +7974,10 @@ curve->AddKeyframe(FilterKeyframe::Create( base::TimeDelta::FromMilliseconds(100), end_filters, nullptr)); scoped_ptr<Animation> animation = - Animation::Create(curve.Pass(), 0, 1, Animation::FILTER); + Animation::Create(std::move(curve), 0, 1, Animation::FILTER); animation->set_fill_mode(Animation::FILL_MODE_NONE); animation->set_time_offset(base::TimeDelta::FromMilliseconds(-1000)); - child->layer_animation_controller()->AddAnimation(animation.Pass()); + child->layer_animation_controller()->AddAnimation(std::move(animation)); ExecuteCalculateDrawProperties(root.get()); @@ -8418,7 +8418,7 @@ animation_id, 1, Animation::TRANSFORM); animation->set_fill_mode(Animation::FILL_MODE_NONE); animation->set_time_offset(base::TimeDelta::FromMilliseconds(-1000)); - child->AddAnimation(animation.Pass()); + child->AddAnimation(std::move(animation)); ExecuteCalculateDrawPropertiesWithPropertyTrees(root.get()); EXPECT_EQ(gfx::Rect(10, 10), grandchild->visible_rect_from_property_trees()); grandchild->set_visible_rect_from_property_trees(gfx::Rect()); @@ -8445,7 +8445,7 @@ animation_id, 1, Animation::OPACITY); animation->set_fill_mode(Animation::FILL_MODE_NONE); animation->set_time_offset(base::TimeDelta::FromMilliseconds(-1000)); - child->AddAnimation(animation.Pass()); + child->AddAnimation(std::move(animation)); ExecuteCalculateDrawPropertiesWithPropertyTrees(root.get()); EXPECT_EQ(gfx::Rect(10, 10), grandchild->visible_rect_from_property_trees()); } @@ -8487,9 +8487,9 @@ LayerImpl* grandchild_ptr = grandchild.get(); LayerImpl* greatgrandchild_ptr = greatgrandchild.get(); - grandchild->AddChild(greatgrandchild.Pass()); - child->AddChild(grandchild.Pass()); - root->AddChild(child.Pass()); + grandchild->AddChild(std::move(greatgrandchild)); + child->AddChild(std::move(grandchild)); + root->AddChild(std::move(child)); // Check the non-skipped case. ExecuteCalculateDrawPropertiesWithPropertyTrees(root.get());
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 47ed787..4034179 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -478,7 +478,7 @@ page_scale_animation_ = PageScaleAnimation::Create( ScrollOffsetToVector2dF(scroll_total), active_tree_->current_page_scale_factor(), viewport_size, - scaled_scrollable_size, timing_function.Pass()); + scaled_scrollable_size, std::move(timing_function)); if (anchor_point) { gfx::Vector2dF anchor(target_offset); @@ -611,7 +611,8 @@ void LayerTreeHostImpl::QueueSwapPromiseForMainThreadScrollUpdate( scoped_ptr<SwapPromise> swap_promise) { - swap_promises_for_main_thread_scroll_update_.push_back(swap_promise.Pass()); + swap_promises_for_main_thread_scroll_update_.push_back( + std::move(swap_promise)); } void LayerTreeHostImpl::TrackDamageForAllSurfaces( @@ -659,7 +660,7 @@ void LayerTreeHostImpl::FrameData::AppendRenderPass( scoped_ptr<RenderPass> render_pass) { - render_passes.push_back(render_pass.Pass()); + render_passes.push_back(std::move(render_pass)); } DrawMode LayerTreeHostImpl::GetDrawMode() const { @@ -2224,8 +2225,8 @@ void LayerTreeHostImpl::PostFrameTimingEvents( scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events, scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) { - client_->PostFrameTimingEventsOnImplThread(composite_events.Pass(), - main_frame_events.Pass()); + client_->PostFrameTimingEventsOnImplThread(std::move(composite_events), + std::move(main_frame_events)); } void LayerTreeHostImpl::CleanUpTileManagerAndUIResources() { @@ -3028,7 +3029,7 @@ active_tree_->elastic_overscroll()->PullDeltaForMainThread(); scroll_info->swap_promises.swap(swap_promises_for_main_thread_scroll_update_); - return scroll_info.Pass(); + return scroll_info; } void LayerTreeHostImpl::SetFullRootLayerDamage() { @@ -3155,7 +3156,7 @@ } if (!events->empty()) - client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass()); + client_->PostAnimationEventsToMainThreadOnImplThread(std::move(events)); if (has_active_animations) SetNeedsAnimate(); @@ -3450,7 +3451,7 @@ void LayerTreeHostImpl::ScheduleMicroBenchmark( scoped_ptr<MicroBenchmarkImpl> benchmark) { - micro_benchmark_controller_.ScheduleRun(benchmark.Pass()); + micro_benchmark_controller_.ScheduleRun(std::move(benchmark)); } void LayerTreeHostImpl::InsertSwapPromiseMonitor(SwapPromiseMonitor* monitor) { @@ -3498,11 +3499,11 @@ curve->SetInitialValue(current_offset); scoped_ptr<Animation> animation = Animation::Create( - curve.Pass(), AnimationIdProvider::NextAnimationId(), + std::move(curve), AnimationIdProvider::NextAnimationId(), AnimationIdProvider::NextGroupId(), Animation::SCROLL_OFFSET); animation->set_is_impl_only(true); - layer_impl->layer_animation_controller()->AddAnimation(animation.Pass()); + layer_impl->layer_animation_controller()->AddAnimation(std::move(animation)); } bool LayerTreeHostImpl::ScrollAnimationUpdateTarget(
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc index 80cd967..431a546 100644 --- a/cc/trees/layer_tree_host_impl_unittest.cc +++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -166,7 +166,7 @@ settings, this, &task_runner_provider_, &stats_instrumentation_, &shared_bitmap_manager_, &gpu_memory_buffer_manager_, &task_graph_runner_, 0); - output_surface_ = output_surface.Pass(); + output_surface_ = std::move(output_surface); host_impl_->SetVisible(true); bool init = host_impl_->InitializeRenderer(output_surface_.get()); host_impl_->SetViewportSize(gfx::Size(10, 10)); @@ -185,7 +185,7 @@ root->SetDrawsContent(true); root->draw_properties().visible_layer_rect = gfx::Rect(0, 0, 10, 10); root->SetHasRenderSurface(true); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root)); } static void ExpectClearedScrollDeltasRecursive(LayerImpl* layer) { @@ -282,14 +282,14 @@ contents->SetBounds(content_size); contents->SetPosition(gfx::PointF()); - outer_scroll->AddChild(contents.Pass()); - outer_clip->AddChild(outer_scroll.Pass()); - inner_scroll->AddChild(outer_clip.Pass()); - page_scale->AddChild(inner_scroll.Pass()); - inner_clip->AddChild(page_scale.Pass()); - root->AddChild(inner_clip.Pass()); + outer_scroll->AddChild(std::move(contents)); + outer_clip->AddChild(std::move(outer_scroll)); + inner_scroll->AddChild(std::move(outer_clip)); + page_scale->AddChild(std::move(inner_scroll)); + inner_clip->AddChild(std::move(page_scale)); + root->AddChild(std::move(inner_clip)); - layer_tree_impl->SetRootLayer(root.Pass()); + layer_tree_impl->SetRootLayer(std::move(root)); layer_tree_impl->SetViewportLayersFromIds( Layer::INVALID_ID, kPageScaleLayerId, kInnerViewportScrollLayerId, kOuterViewportScrollLayerId); @@ -345,7 +345,7 @@ layer->SetDrawsContent(true); layer->SetBounds(size); clip_layer->SetBounds(gfx::Size(size.width() / 2, size.height() / 2)); - return layer.Pass(); + return layer; } void DrawFrame() { @@ -497,7 +497,7 @@ LayerImpl::Create(host_impl_->active_tree(), 5)); root->children()[1]->children()[0]->AddChild( LayerImpl::Create(host_impl_->active_tree(), 6)); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root)); } LayerImpl* root = host_impl_->active_tree()->root_layer(); @@ -524,12 +524,12 @@ LayerImpl::Create(host_impl_->active_tree(), 1); root_clip->SetBounds(gfx::Size(10, 10)); LayerImpl* root_layer = root.get(); - root_clip->AddChild(root.Pass()); + root_clip->AddChild(std::move(root)); root_layer->SetBounds(gfx::Size(110, 110)); root_layer->SetScrollClipLayer(root_clip->id()); root_layer->PushScrollOffsetFromMainThread(scroll_offset); root_layer->ScrollBy(scroll_delta); - host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root_clip)); } LayerImpl* root = host_impl_->active_tree()->root_layer()->children()[0].get(); @@ -598,8 +598,9 @@ context_owned->set_context_lost(true); // Initialization will fail. - EXPECT_FALSE(CreateHostImpl( - DefaultSettings(), FakeOutputSurface::Create3d(context_owned.Pass()))); + EXPECT_FALSE( + CreateHostImpl(DefaultSettings(), + FakeOutputSurface::Create3d(std::move(context_owned)))); SetupScrollAndContentsLayers(gfx::Size(100, 100)); @@ -677,7 +678,7 @@ child_layer->SetDrawsContent(true); child_layer->SetPosition(gfx::PointF(0, 20)); child_layer->SetBounds(gfx::Size(50, 50)); - scroll->AddChild(child_layer.Pass()); + scroll->AddChild(std::move(child_layer)); RebuildPropertyTrees(); } @@ -759,8 +760,8 @@ scrollable_child_1->SetPosition(gfx::PointF(5.f, 5.f)); scrollable_child_1->SetHaveWheelEventHandlers(true); scrollable_child_1->SetHaveScrollEventHandlers(true); - scrollable_child_clip_1->AddChild(scrollable_child_1.Pass()); - root_child->AddChild(scrollable_child_clip_1.Pass()); + scrollable_child_clip_1->AddChild(std::move(scrollable_child_1)); + root_child->AddChild(std::move(scrollable_child_clip_1)); RebuildPropertyTrees(); } @@ -774,8 +775,8 @@ scrollable_child_2->SetPosition(gfx::PointF(5.f, 20.f)); scrollable_child_2->SetHaveWheelEventHandlers(true); scrollable_child_2->SetHaveScrollEventHandlers(true); - scrollable_child_clip_2->AddChild(scrollable_child_2.Pass()); - root_child->AddChild(scrollable_child_clip_2.Pass()); + scrollable_child_clip_2->AddChild(std::move(scrollable_child_2)); + root_child->AddChild(std::move(scrollable_child_clip_2)); RebuildPropertyTrees(); } @@ -1571,7 +1572,8 @@ EXPECT_EQ(InputHandler::SCROLL_STARTED, host_impl_->ScrollBegin(gfx::Point(), InputHandler::GESTURE)); host_impl_->ScrollBy(gfx::Point(), gfx::Vector2d(0, 10)); - host_impl_->QueueSwapPromiseForMainThreadScrollUpdate(swap_promise.Pass()); + host_impl_->QueueSwapPromiseForMainThreadScrollUpdate( + std::move(swap_promise)); host_impl_->ScrollEnd(); scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas(); @@ -1597,9 +1599,9 @@ scoped_ptr<LayerImpl> scroll_parent = CreateScrollableLayer( 7, gfx::Size(10, 10), scroll_parent_clip.get()); parent = scroll_parent.get(); - scroll_parent_clip->AddChild(scroll_parent.Pass()); + scroll_parent_clip->AddChild(std::move(scroll_parent)); - viewport_scroll->AddChild(scroll_parent_clip.Pass()); + viewport_scroll->AddChild(std::move(scroll_parent_clip)); scoped_ptr<LayerImpl> scroll_child_clip = LayerImpl::Create(host_impl_->active_tree(), 8); @@ -1607,10 +1609,10 @@ 9, gfx::Size(10, 10), scroll_child_clip.get()); child = scroll_child.get(); scroll_child->SetPosition(gfx::PointF(20.f, 20.f)); - scroll_child_clip->AddChild(scroll_child.Pass()); + scroll_child_clip->AddChild(std::move(scroll_child)); child_clip = scroll_child_clip.get(); - viewport_scroll->AddChild(scroll_child_clip.Pass()); + viewport_scroll->AddChild(std::move(scroll_child_clip)); child_clip->SetScrollParent(parent); scoped_ptr<std::set<LayerImpl*>> scroll_children(new std::set<LayerImpl*>); @@ -2212,7 +2214,7 @@ LayerImpl* scroll = host_impl_->active_tree()->OuterViewportScrollLayer(); LayerImpl* root = host_impl_->active_tree()->InnerViewportContainerLayer(); scrollbar->SetScrollLayerId(scroll->id()); - root->AddChild(scrollbar.Pass()); + root->AddChild(std::move(scrollbar)); host_impl_->active_tree()->DidBecomeActive(); DrawFrame(); @@ -2348,7 +2350,7 @@ LayerImpl* scroll = host_impl_->pending_tree()->OuterViewportScrollLayer(); LayerImpl* root = host_impl_->pending_tree()->InnerViewportContainerLayer(); scrollbar->SetScrollLayerId(scroll->id()); - root->AddChild(scrollbar.Pass()); + root->AddChild(std::move(scrollbar)); host_impl_->pending_tree()->PushPageScaleFromMainThread(1.f, 1.f, 1.f); host_impl_->pending_tree()->BuildPropertyTreesForTesting(); host_impl_->ActivateSyncTree(); @@ -2495,8 +2497,8 @@ // Check scrollbar registration on a sublayer. child->SetScrollClipLayer(child_clip->id()); - child_clip->AddChild(child.Pass()); - root_scroll->AddChild(child_clip.Pass()); + child_clip->AddChild(std::move(child)); + root_scroll->AddChild(std::move(child_clip)); EXPECT_EQ(0ul, host_impl_->ScrollbarsFor(child_scroll_id).size()); EXPECT_EQ(nullptr, host_impl_->ScrollbarAnimationControllerForId(child_scroll_id)); @@ -2574,7 +2576,7 @@ scrollbar->SetBounds(scrollbar_size); scrollbar->SetTouchEventHandlerRegion(gfx::Rect(scrollbar_size)); host_impl_->active_tree()->InnerViewportContainerLayer()->AddChild( - scrollbar.Pass()); + std::move(scrollbar)); host_impl_->active_tree()->DidBecomeActive(); DrawFrame(); @@ -3257,7 +3259,7 @@ scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); root->SetScrollClipLayer(Layer::INVALID_ID); root->SetHasRenderSurface(true); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root)); DrawFrame(); // Scroll event is ignored because layer is not scrollable. @@ -3301,8 +3303,8 @@ bool CreateHostImpl(const LayerTreeSettings& settings, scoped_ptr<OutputSurface> output_surface) override { - bool init = - LayerTreeHostImplTest::CreateHostImpl(settings, output_surface.Pass()); + bool init = LayerTreeHostImplTest::CreateHostImpl( + settings, std::move(output_surface)); if (init) { host_impl_->active_tree()->set_top_controls_height(top_controls_height_); host_impl_->active_tree()->SetCurrentTopControlsShownRatio(1.f); @@ -3350,12 +3352,12 @@ int outer_viewport_scroll_layer_id = outer_scroll->id(); int page_scale_layer_id = page_scale->id(); - outer_clip->AddChild(outer_scroll.Pass()); - root->AddChild(outer_clip.Pass()); - page_scale->AddChild(root.Pass()); - root_clip->AddChild(page_scale.Pass()); + outer_clip->AddChild(std::move(outer_scroll)); + root->AddChild(std::move(outer_clip)); + page_scale->AddChild(std::move(root)); + root_clip->AddChild(std::move(page_scale)); - host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root_clip)); host_impl_->active_tree()->SetViewportLayersFromIds( Layer::INVALID_ID, page_scale_layer_id, inner_viewport_scroll_layer_id, outer_viewport_scroll_layer_id); @@ -3641,8 +3643,8 @@ // scroll child to limit child->SetScrollDelta(gfx::Vector2dF(0, 100.f)); - child_clip->AddChild(child.Pass()); - outer_viewport_scroll_layer->AddChild(child_clip.Pass()); + child_clip->AddChild(std::move(child)); + outer_viewport_scroll_layer->AddChild(std::move(child_clip)); // Scroll 25px to hide top controls gfx::Vector2dF scroll_delta(0.f, 25.f); @@ -4015,11 +4017,11 @@ scroll_layer->SetScrollClipLayer(3); scroll_layer->SetBounds(contents_size); scroll_layer->SetPosition(gfx::PointF()); - scroll_layer->AddChild(content_layer.Pass()); - scroll_clip_layer->AddChild(scroll_layer.Pass()); + scroll_layer->AddChild(std::move(content_layer)); + scroll_clip_layer->AddChild(std::move(scroll_layer)); scroll_clip_layer->SetHasRenderSurface(true); - host_impl_->active_tree()->SetRootLayer(scroll_clip_layer.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(scroll_clip_layer)); host_impl_->SetViewportSize(surface_size); DrawFrame(); @@ -4038,7 +4040,7 @@ root->SetBounds(surface_size); root->AddChild(CreateScrollableLayer(2, contents_size, root.get())); root->SetHasRenderSurface(true); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root)); host_impl_->SetViewportSize(surface_size); DrawFrame(); @@ -4055,7 +4057,7 @@ scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); root->AddChild(CreateScrollableLayer(2, surface_size, root.get())); root->SetHasRenderSurface(true); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root)); host_impl_->SetViewportSize(surface_size); DrawFrame(); @@ -4080,8 +4082,8 @@ child->SetTransform(matrix); child->SetDoubleSided(false); - root->AddChild(child.Pass()); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + root->AddChild(std::move(child)); + host_impl_->active_tree()->SetRootLayer(std::move(root)); DrawFrame(); // Scroll event is ignored because the scrollable layer is not facing the @@ -4105,11 +4107,11 @@ // CreateScrollableLayer() use the same surface size. scoped_ptr<LayerImpl> scroll_layer = CreateScrollableLayer(2, surface_size, clip_layer.get()); - scroll_layer->AddChild(content_layer.Pass()); - clip_layer->AddChild(scroll_layer.Pass()); + scroll_layer->AddChild(std::move(content_layer)); + clip_layer->AddChild(std::move(scroll_layer)); clip_layer->SetHasRenderSurface(true); - host_impl_->active_tree()->SetRootLayer(clip_layer.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(clip_layer)); host_impl_->SetViewportSize(surface_size); DrawFrame(); @@ -4232,8 +4234,8 @@ LayerImpl::Create(host_impl_->active_tree(), 6); scoped_ptr<LayerImpl> scrollable_child = CreateScrollableLayer(7, surface_size, scrollable_child_clip.get()); - scrollable_child_clip->AddChild(scrollable_child.Pass()); - child->AddChild(scrollable_child_clip.Pass()); + scrollable_child_clip->AddChild(std::move(scrollable_child)); + child->AddChild(std::move(scrollable_child_clip)); LayerImpl* grand_child = child->children()[0].get(); grand_child->SetDrawsContent(true); @@ -4316,11 +4318,11 @@ scoped_ptr<LayerImpl> child = CreateScrollableLayer(2, content_size, root.get()); LayerImpl* grand_child_layer = grand_child.get(); - child->AddChild(grand_child.Pass()); + child->AddChild(std::move(grand_child)); LayerImpl* child_layer = child.get(); - root->AddChild(child.Pass()); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + root->AddChild(std::move(child)); + host_impl_->active_tree()->SetRootLayer(std::move(root)); host_impl_->active_tree()->DidBecomeActive(); host_impl_->SetViewportSize(surface_size); grand_child_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 5)); @@ -4366,13 +4368,13 @@ scoped_ptr<LayerImpl> child = CreateScrollableLayer(3, surface_size, root.get()); LayerImpl* grand_child_layer = grand_child.get(); - child->AddChild(grand_child.Pass()); + child->AddChild(std::move(grand_child)); LayerImpl* child_layer = child.get(); - root_scrolling->AddChild(child.Pass()); - root->AddChild(root_scrolling.Pass()); + root_scrolling->AddChild(std::move(child)); + root->AddChild(std::move(root_scrolling)); EXPECT_EQ(viewport_size, root->bounds()); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root)); host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 2, Layer::INVALID_ID); host_impl_->active_tree()->DidBecomeActive(); @@ -4482,11 +4484,11 @@ root->SetBounds(content_size); int root_scroll_id = root->id(); - root->AddChild(child.Pass()); - root_clip->AddChild(root.Pass()); + root->AddChild(std::move(child)); + root_clip->AddChild(std::move(root)); host_impl_->SetViewportSize(surface_size); - host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root_clip)); host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 3, 2, Layer::INVALID_ID); host_impl_->active_tree()->DidBecomeActive(); @@ -4516,8 +4518,8 @@ CreateScrollableLayer(2, surface_size, root_clip.get()); root_scroll->SetIsContainerForFixedPositionLayers(true); root_clip->SetHasRenderSurface(true); - root_clip->AddChild(root_scroll.Pass()); - host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); + root_clip->AddChild(std::move(root_scroll)); + host_impl_->active_tree()->SetRootLayer(std::move(root_clip)); host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 2, Layer::INVALID_ID); host_impl_->active_tree()->DidBecomeActive(); @@ -4532,9 +4534,9 @@ scoped_ptr<LayerImpl> root_scroll2 = CreateScrollableLayer(4, surface_size, root_clip2.get()); root_scroll2->SetIsContainerForFixedPositionLayers(true); - root_clip2->AddChild(root_scroll2.Pass()); + root_clip2->AddChild(std::move(root_scroll2)); root_clip2->SetHasRenderSurface(true); - host_impl_->active_tree()->SetRootLayer(root_clip2.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root_clip2)); host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 3, 4, Layer::INVALID_ID); host_impl_->active_tree()->DidBecomeActive(); @@ -4610,8 +4612,8 @@ clip_layer->SetTransformOrigin(gfx::Point3F( clip_layer->bounds().width() * 0.5f, clip_layer->bounds().height(), 0.f)); LayerImpl* child_ptr = child.get(); - clip_layer->AddChild(child.Pass()); - scroll_layer->AddChild(clip_layer.Pass()); + clip_layer->AddChild(std::move(child)); + scroll_layer->AddChild(std::move(clip_layer)); gfx::Size surface_size(50, 50); host_impl_->SetViewportSize(surface_size); @@ -4688,8 +4690,8 @@ // lines up over the child. clip_layer->SetTransformOrigin(gfx::Point3F( clip_layer->bounds().width(), clip_layer->bounds().height(), 0.f)); - clip_layer->AddChild(child.Pass()); - scroll_layer->AddChild(clip_layer.Pass()); + clip_layer->AddChild(std::move(child)); + scroll_layer->AddChild(std::move(clip_layer)); gfx::Size surface_size(50, 50); host_impl_->SetViewportSize(surface_size); @@ -5116,14 +5118,14 @@ scoped_ptr<LayerImpl> child = CreateScrollableLayer(2, surface_size, root_clip.get()); LayerImpl* grand_child_layer = grand_child.get(); - child->AddChild(grand_child.Pass()); + child->AddChild(std::move(grand_child)); LayerImpl* child_layer = child.get(); - root->AddChild(child.Pass()); - root_clip->AddChild(root.Pass()); + root->AddChild(std::move(child)); + root_clip->AddChild(std::move(root)); child_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 3)); grand_child_layer->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 2)); - host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root_clip)); host_impl_->active_tree()->DidBecomeActive(); host_impl_->SetViewportSize(surface_size); DrawFrame(); @@ -5363,7 +5365,7 @@ root->SetBounds(gfx::Size(10, 10)); root->SetDrawsContent(false); root->SetHasRenderSurface(true); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root)); } LayerImpl* root = host_impl_->active_tree()->root_layer(); @@ -5852,14 +5854,14 @@ scoped_refptr<TestContextProvider> provider(TestContextProvider::Create()); scoped_ptr<OutputSurface> output_surface( FakeOutputSurface::Create3d(provider)); - CreateHostImpl(DefaultSettings(), output_surface.Pass()); + CreateHostImpl(DefaultSettings(), std::move(output_surface)); scoped_ptr<LayerImpl> root = FakeDrawableLayerImpl::Create(host_impl_->active_tree(), 1); root->SetBounds(gfx::Size(10, 10)); root->SetDrawsContent(true); root->SetHasRenderSurface(true); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root)); EXPECT_FALSE(provider->TestContext3d()->reshape_called()); provider->TestContext3d()->clear_reshape_called(); @@ -5932,8 +5934,8 @@ child->SetDrawsContent(true); root->SetBounds(gfx::Size(500, 500)); root->SetDrawsContent(true); - root->AddChild(child.Pass()); - layer_tree_host_impl->active_tree()->SetRootLayer(root.Pass()); + root->AddChild(std::move(child)); + layer_tree_host_impl->active_tree()->SetRootLayer(std::move(root)); LayerTreeHostImpl::FrameData frame; @@ -5991,9 +5993,9 @@ root->SetBounds(gfx::Size(10, 10)); root->SetDrawsContent(true); root->SetHasRenderSurface(true); - root->AddChild(child.Pass()); + root->AddChild(std::move(child)); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root)); LayerTreeHostImpl::FrameData frame; @@ -6125,7 +6127,7 @@ LayerTreeSettings settings = DefaultSettings(); settings.renderer_settings.partial_swap_enabled = false; CreateHostImpl(settings, - FakeOutputSurface::Create3d(mock_context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(mock_context_owned))); SetupRootLayerImpl(FakeLayerWithQuads::Create(host_impl_->active_tree(), 1)); // Without partial swap, and no clipping, no scissor is set. @@ -6160,7 +6162,8 @@ LayerTreeSettings settings = DefaultSettings(); settings.renderer_settings.partial_swap_enabled = true; - CreateHostImpl(settings, FakeOutputSurface::Create3d(context_owned.Pass())); + CreateHostImpl(settings, + FakeOutputSurface::Create3d(std::move(context_owned))); SetupRootLayerImpl(FakeLayerWithQuads::Create(host_impl_->active_tree(), 1)); // The first frame is not a partially-swapped one. No scissor should be set. @@ -6257,12 +6260,12 @@ grand_child->draw_properties().visible_layer_rect = grand_child_rect; grand_child->SetDrawsContent(true); - child->AddChild(grand_child.Pass()); - root->AddChild(child.Pass()); + child->AddChild(std::move(grand_child)); + root->AddChild(std::move(child)); - my_host_impl->active_tree()->SetRootLayer(root.Pass()); + my_host_impl->active_tree()->SetRootLayer(std::move(root)); my_host_impl->active_tree()->BuildPropertyTreesForTesting(); - return my_host_impl.Pass(); + return my_host_impl; } TEST_F(LayerTreeHostImplTest, ContributingLayerEmptyScissorPartialSwap) { @@ -6328,8 +6331,8 @@ TestWebGraphicsContext3D::Create(); TestWebGraphicsContext3D* context3d = context.get(); scoped_ptr<OutputSurface> output_surface( - FakeOutputSurface::Create3d(context.Pass())); - CreateHostImpl(DefaultSettings(), output_surface.Pass()); + FakeOutputSurface::Create3d(std::move(context))); + CreateHostImpl(DefaultSettings(), std::move(output_surface)); scoped_ptr<LayerImpl> root_layer = LayerImpl::Create(host_impl_->active_tree(), 1); @@ -6345,16 +6348,16 @@ host_impl_->active_tree(), 4, &provider, media::VIDEO_ROTATION_0); video_layer->SetBounds(gfx::Size(10, 10)); video_layer->SetDrawsContent(true); - root_layer->AddChild(video_layer.Pass()); + root_layer->AddChild(std::move(video_layer)); scoped_ptr<IOSurfaceLayerImpl> io_surface_layer = IOSurfaceLayerImpl::Create(host_impl_->active_tree(), 5); io_surface_layer->SetBounds(gfx::Size(10, 10)); io_surface_layer->SetDrawsContent(true); io_surface_layer->SetIOSurfaceProperties(1, gfx::Size(10, 10)); - root_layer->AddChild(io_surface_layer.Pass()); + root_layer->AddChild(std::move(io_surface_layer)); - host_impl_->active_tree()->SetRootLayer(root_layer.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root_layer)); EXPECT_EQ(0u, context3d->NumTextures()); @@ -6391,7 +6394,7 @@ LayerTreeSettings settings = DefaultSettings(); settings.renderer_settings.partial_swap_enabled = false; CreateHostImpl(settings, - FakeOutputSurface::Create3d(mock_context_owned.Pass())); + FakeOutputSurface::Create3d(std::move(mock_context_owned))); SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1)); host_impl_->active_tree()->set_background_color(SK_ColorWHITE); @@ -6475,9 +6478,9 @@ child->SetPosition(gfx::PointF(9.f, 9.f)); child->SetBounds(gfx::Size(1, 1)); child->SetDrawsContent(true); - root->AddChild(child.Pass()); + root->AddChild(std::move(child)); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root)); // Draw a frame. In the first frame, the entire viewport should be damaged. gfx::Rect full_frame_damage(host_impl_->DrawViewportSize()); @@ -6543,12 +6546,12 @@ LayerImpl* root = scoped_root.get(); root->SetHasRenderSurface(true); - host_impl_->pending_tree()->SetRootLayer(scoped_root.Pass()); + host_impl_->pending_tree()->SetRootLayer(std::move(scoped_root)); scoped_ptr<LayerImpl> scoped_scrolling_layer = LayerImpl::Create(host_impl_->pending_tree(), 2); LayerImpl* scrolling_layer = scoped_scrolling_layer.get(); - root->AddChild(scoped_scrolling_layer.Pass()); + root->AddChild(std::move(scoped_scrolling_layer)); gfx::Size content_layer_bounds(100000, 100); scoped_refptr<FakeDisplayListRasterSource> raster_source( @@ -6558,7 +6561,7 @@ FakePictureLayerImpl::CreateWithRasterSource(host_impl_->pending_tree(), 3, raster_source); LayerImpl* content_layer = scoped_content_layer.get(); - scrolling_layer->AddChild(scoped_content_layer.Pass()); + scrolling_layer->AddChild(std::move(scoped_content_layer)); content_layer->SetBounds(content_layer_bounds); content_layer->SetDrawsContent(true); @@ -6704,8 +6707,8 @@ host_impl_->active_tree(), 2, &provider, media::VIDEO_ROTATION_0); video_layer->SetBounds(gfx::Size(10, 10)); video_layer->SetDrawsContent(true); - root_layer->AddChild(video_layer.Pass()); - SetupRootLayerImpl(root_layer.Pass()); + root_layer->AddChild(std::move(video_layer)); + SetupRootLayerImpl(std::move(root_layer)); LayerTreeHostImpl::FrameData frame; EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); @@ -6811,7 +6814,7 @@ TestWebGraphicsContext3D::Create(); TestWebGraphicsContext3D* context3d = context.get(); scoped_ptr<FakeOutputSurface> output_surface = FakeOutputSurface::Create3d(); - CreateHostImpl(DefaultSettings(), output_surface.Pass()); + CreateHostImpl(DefaultSettings(), std::move(output_surface)); EXPECT_EQ(0u, context3d->NumTextures()); @@ -6927,12 +6930,12 @@ scoped_ptr<LayerImpl> child = CreateScrollableLayer(2, content_size, root_clip.get()); - root->AddChild(child.Pass()); + root->AddChild(std::move(child)); int root_id = root->id(); - root_clip->AddChild(root.Pass()); + root_clip->AddChild(std::move(root)); host_impl_->SetViewportSize(surface_size); - host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root_clip)); host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 3, 1, Layer::INVALID_ID); host_impl_->active_tree()->DidBecomeActive(); @@ -6974,11 +6977,11 @@ scoped_ptr<LayerImpl> child = CreateScrollableLayer(3, surface_size, root.get()); child->PushScrollOffsetFromMainThread(gfx::ScrollOffset(0, 4)); - child->AddChild(grand_child.Pass()); + child->AddChild(std::move(grand_child)); - root_scrolling->AddChild(child.Pass()); - root->AddChild(root_scrolling.Pass()); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + root_scrolling->AddChild(std::move(child)); + root->AddChild(std::move(root_scrolling)); + host_impl_->active_tree()->SetRootLayer(std::move(root)); host_impl_->active_tree()->DidBecomeActive(); host_impl_->SetViewportSize(surface_size); DrawFrame(); @@ -7041,11 +7044,11 @@ scoped_ptr<LayerImpl> child = CreateScrollableLayer(2, content_size, root_clip.get()); - root_scroll->AddChild(child.Pass()); - root_clip->AddChild(root_scroll.Pass()); + root_scroll->AddChild(std::move(child)); + root_clip->AddChild(std::move(root_scroll)); host_impl_->SetViewportSize(surface_size); - host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root_clip)); host_impl_->active_tree()->DidBecomeActive(); DrawFrame(); { @@ -7092,7 +7095,7 @@ occluder_layer->SetPosition(gfx::PointF()); // The parent of the occluder is *above* the scroller. - page_scale_layer->AddChild(occluder_layer.Pass()); + page_scale_layer->AddChild(std::move(occluder_layer)); DrawFrame(); @@ -7129,8 +7132,8 @@ child_scroll->SetPosition(gfx::PointF(10.f, 10.f)); - child_scroll->AddChild(occluder_layer.Pass()); - scroll_layer->AddChild(child_scroll.Pass()); + child_scroll->AddChild(std::move(occluder_layer)); + scroll_layer->AddChild(std::move(child_scroll)); DrawFrame(); @@ -7153,7 +7156,7 @@ CreateScrollableLayer(child_scroll_layer_id, content_size, root); child_scroll->SetDrawsContent(false); - scroll_layer->AddChild(child_scroll.Pass()); + scroll_layer->AddChild(std::move(child_scroll)); DrawFrame(); @@ -7191,9 +7194,9 @@ // Move the grand child so it's not hit by our test point. grand_child_layer->SetPosition(gfx::PointF(10.f, 10.f)); - child_layer->AddChild(grand_child_layer.Pass()); - invisible_scroll_layer->AddChild(child_layer.Pass()); - root_scroll_layer->AddChild(invisible_scroll_layer.Pass()); + child_layer->AddChild(std::move(grand_child_layer)); + invisible_scroll_layer->AddChild(std::move(child_layer)); + root_scroll_layer->AddChild(std::move(invisible_scroll_layer)); DrawFrame(); @@ -7242,10 +7245,10 @@ scroll_child->SetScrollParent(invisible_scroll.get()); - container->AddChild(invisible_scroll.Pass()); - container->AddChild(scroll_child.Pass()); + container->AddChild(std::move(invisible_scroll)); + container->AddChild(std::move(scroll_child)); - scroll_layer->AddChild(container.Pass()); + scroll_layer->AddChild(std::move(container)); DrawFrame(); @@ -7268,7 +7271,7 @@ root->SetDrawsContent(true); root->SetHasRenderSurface(true); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root)); FakeOutputSurface* fake_output_surface = static_cast<FakeOutputSurface*>(host_impl_->output_surface()); @@ -7282,7 +7285,7 @@ ui::INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT, 0, 0); scoped_ptr<SwapPromise> swap_promise( new LatencyInfoSwapPromise(latency_info)); - host_impl_->active_tree()->QueuePinnedSwapPromise(swap_promise.Pass()); + host_impl_->active_tree()->QueuePinnedSwapPromise(std::move(swap_promise)); host_impl_->SetNeedsRedraw(); gfx::Rect full_frame_damage(host_impl_->DrawViewportSize()); @@ -7308,7 +7311,7 @@ root->SetDrawsContent(true); root->SetHasRenderSurface(true); - host_impl_->active_tree()->SetRootLayer(root.Pass()); + host_impl_->active_tree()->SetRootLayer(std::move(root)); // Ensure the default frame selection bounds are empty. FakeOutputSurface* fake_output_surface = @@ -7935,14 +7938,14 @@ contents->SetBounds(content_size); contents->SetPosition(gfx::PointF()); - outer_scroll->AddChild(contents.Pass()); - outer_clip->AddChild(outer_scroll.Pass()); - inner_scroll->AddChild(outer_clip.Pass()); - page_scale->AddChild(inner_scroll.Pass()); - inner_clip->AddChild(page_scale.Pass()); + outer_scroll->AddChild(std::move(contents)); + outer_clip->AddChild(std::move(outer_scroll)); + inner_scroll->AddChild(std::move(outer_clip)); + page_scale->AddChild(std::move(inner_scroll)); + inner_clip->AddChild(std::move(page_scale)); inner_clip->SetHasRenderSurface(true); - layer_tree_impl->SetRootLayer(inner_clip.Pass()); + layer_tree_impl->SetRootLayer(std::move(inner_clip)); layer_tree_impl->SetViewportLayersFromIds( Layer::INVALID_ID, kPageScaleLayerId, kInnerViewportScrollLayerId, kOuterViewportScrollLayerId); @@ -8107,7 +8110,7 @@ scoped_ptr<LayerImpl> child = CreateScrollableLayer(10, outer_viewport, outer_scroll); LayerImpl* child_scroll = child.get(); - outer_scroll->children()[0]->AddChild(child.Pass()); + outer_scroll->children()[0]->AddChild(std::move(child)); DrawFrame(); { @@ -8164,7 +8167,7 @@ scoped_ptr<LayerImpl> child = CreateScrollableLayer(10, outer_viewport, outer_scroll); LayerImpl* child_scroll = child.get(); - outer_scroll->children()[0]->AddChild(child.Pass()); + outer_scroll->children()[0]->AddChild(std::move(child)); DrawFrame(); @@ -8600,7 +8603,7 @@ layer->tilings()->tiling_at(0)->CreateAllTilesForTesting(); layer->tilings()->tiling_at(0)->ComputeTilePriorityRects( gfx::Rect(gfx::Size(10, 10)), 1.f, 1.0, Occlusion()); - host_impl_->pending_tree()->SetRootLayer(layer.Pass()); + host_impl_->pending_tree()->SetRootLayer(std::move(layer)); FakePictureLayerImpl* root_layer = static_cast<FakePictureLayerImpl*>( host_impl_->pending_tree()->root_layer()); @@ -8628,7 +8631,7 @@ scoped_ptr<FakePictureLayerImpl> pending_layer = FakePictureLayerImpl::Create(pending_tree, 10); FakePictureLayerImpl* raw_pending_layer = pending_layer.get(); - pending_tree->SetRootLayer(pending_layer.Pass()); + pending_tree->SetRootLayer(std::move(pending_layer)); ASSERT_EQ(raw_pending_layer, pending_tree->root_layer()); EXPECT_EQ(0u, raw_pending_layer->did_become_active_call_count()); @@ -8638,7 +8641,7 @@ scoped_ptr<FakePictureLayerImpl> mask_layer = FakePictureLayerImpl::Create(pending_tree, 11); FakePictureLayerImpl* raw_mask_layer = mask_layer.get(); - raw_pending_layer->SetMaskLayer(mask_layer.Pass()); + raw_pending_layer->SetMaskLayer(std::move(mask_layer)); ASSERT_EQ(raw_mask_layer, raw_pending_layer->mask_layer()); EXPECT_EQ(1u, raw_pending_layer->did_become_active_call_count()); @@ -8652,8 +8655,8 @@ scoped_ptr<FakePictureLayerImpl> replica_mask_layer = FakePictureLayerImpl::Create(pending_tree, 13); FakePictureLayerImpl* raw_replica_mask_layer = replica_mask_layer.get(); - replica_layer->SetMaskLayer(replica_mask_layer.Pass()); - raw_pending_layer->SetReplicaLayer(replica_layer.Pass()); + replica_layer->SetMaskLayer(std::move(replica_mask_layer)); + raw_pending_layer->SetReplicaLayer(std::move(replica_layer)); ASSERT_EQ(raw_replica_mask_layer, raw_pending_layer->replica_layer()->mask_layer()); @@ -8951,7 +8954,7 @@ LayerTreeSettings msaaSettings = GpuRasterizationEnabledSettings(); msaaSettings.gpu_rasterization_msaa_sample_count = 4; EXPECT_TRUE(CreateHostImpl( - msaaSettings, FakeOutputSurface::Create3d(context_with_msaa.Pass()))); + msaaSettings, FakeOutputSurface::Create3d(std::move(context_with_msaa)))); host_impl_->SetHasGpuRasterizationTrigger(true); host_impl_->SetContentIsSuitableForGpuRasterization(false); EXPECT_EQ(GpuRasterizationStatus::MSAA_CONTENT, @@ -9009,7 +9012,7 @@ // Hold an unowned pointer to the output surface to use for mock expectations. MockReclaimResourcesOutputSurface* mock_output_surface = output_surface.get(); - CreateHostImpl(DefaultSettings(), output_surface.Pass()); + CreateHostImpl(DefaultSettings(), std::move(output_surface)); EXPECT_CALL(*mock_output_surface, ForceReclaimResources()).Times(1); host_impl_->BeginCommit(); }
diff --git a/cc/trees/layer_tree_host_perftest.cc b/cc/trees/layer_tree_host_perftest.cc index ef4e3eb..99bf3d4 100644 --- a/cc/trees/layer_tree_host_perftest.cc +++ b/cc/trees/layer_tree_host_perftest.cc
@@ -297,7 +297,7 @@ GL_TEXTURE_2D); next_sync_point_++; - tab_contents_->SetTextureMailbox(mailbox, callback.Pass()); + tab_contents_->SetTextureMailbox(mailbox, std::move(callback)); } void DidCommit() override {
diff --git a/cc/trees/layer_tree_host_pixeltest_blending.cc b/cc/trees/layer_tree_host_pixeltest_blending.cc index 688c9fb..29ab0d0a 100644 --- a/cc/trees/layer_tree_host_pixeltest_blending.cc +++ b/cc/trees/layer_tree_host_pixeltest_blending.cc
@@ -145,7 +145,7 @@ layer->SetBounds(gfx::Size(width, height)); skia::RefPtr<const SkImage> image = skia::AdoptRef(backing_store->newImageSnapshot()); - layer->SetImage(image.Pass()); + layer->SetImage(std::move(image)); return layer; } @@ -170,7 +170,7 @@ paint); skia::RefPtr<const SkImage> image = skia::AdoptRef(surface->newImageSnapshot()); - mask->SetImage(image.Pass()); + mask->SetImage(std::move(image)); layer->SetMaskLayer(mask.get()); }
diff --git a/cc/trees/layer_tree_host_pixeltest_masks.cc b/cc/trees/layer_tree_host_pixeltest_masks.cc index 1e395ab..6d3313c7 100644 --- a/cc/trees/layer_tree_host_pixeltest_masks.cc +++ b/cc/trees/layer_tree_host_pixeltest_masks.cc
@@ -61,7 +61,7 @@ skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecordingAsPicture()); - item->SetNew(picture.Pass()); + item->SetNew(std::move(picture)); display_list->Finalize(); return display_list; @@ -115,7 +115,7 @@ mask_display_list->Raster(canvas, nullptr, gfx::Rect(mask_bounds), 1.0f); skia::RefPtr<const SkImage> image = skia::AdoptRef(surface->newImageSnapshot()); - mask->SetImage(image.Pass()); + mask->SetImage(std::move(image)); scoped_refptr<SolidColorLayer> green = CreateSolidColorLayerWithBorder( gfx::Rect(25, 25, 50, 50), kCSSGreen, 1, SK_ColorBLACK); @@ -339,7 +339,7 @@ skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecordingAsPicture()); - item->SetNew(picture.Pass()); + item->SetNew(std::move(picture)); display_list->Finalize(); return display_list; @@ -379,7 +379,7 @@ auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>(); skia::RefPtr<SkPicture> picture = skia::AdoptRef(recorder.endRecordingAsPicture()); - item->SetNew(picture.Pass()); + item->SetNew(std::move(picture)); display_list->Finalize(); return display_list;
diff --git a/cc/trees/layer_tree_host_pixeltest_readback.cc b/cc/trees/layer_tree_host_pixeltest_readback.cc index d7f0a92..da04d42 100644 --- a/cc/trees/layer_tree_host_pixeltest_readback.cc +++ b/cc/trees/layer_tree_host_pixeltest_readback.cc
@@ -83,7 +83,7 @@ if (!copy_subrect_.IsEmpty()) request->set_area(copy_subrect_); - return request.Pass(); + return request; } void BeginTest() override { @@ -125,7 +125,8 @@ CopyTextureMailboxToBitmap(result->size(), texture_mailbox); release_callback->Run(gpu::SyncToken(), false); - ReadbackResultAsBitmap(CopyOutputResult::CreateBitmapResult(bitmap.Pass())); + ReadbackResultAsBitmap( + CopyOutputResult::CreateBitmapResult(std::move(bitmap))); } ReadbackType readback_type_;
diff --git a/cc/trees/layer_tree_host_pixeltest_tiles.cc b/cc/trees/layer_tree_host_pixeltest_tiles.cc index c3dd34e..9329721 100644 --- a/cc/trees/layer_tree_host_pixeltest_tiles.cc +++ b/cc/trees/layer_tree_host_pixeltest_tiles.cc
@@ -134,7 +134,7 @@ skia::AdoptRef(recorder.endRecordingAsPicture()); auto* item = display_list->CreateAndAppendItem<DrawingDisplayItem>(); - item->SetNew(picture.Pass()); + item->SetNew(std::move(picture)); display_list->Finalize(); return display_list;
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc index 5e4e1ef..7d2dbef 100644 --- a/cc/trees/layer_tree_host_unittest.cc +++ b/cc/trees/layer_tree_host_unittest.cc
@@ -441,7 +441,7 @@ SetWorkerContextShouldAggressivelyFreeResources(true)) .After(visibility_true) .WillOnce(testing::Invoke([this](bool is_visible) { EndTest(); })); - return output_surface.Pass(); + return std::move(output_surface); } void InitializeSettings(LayerTreeSettings* settings) override { @@ -1217,12 +1217,12 @@ scoped_ptr<FakeDisplayListRecordingSource> recording( new FakeDisplayListRecordingSource); root_layer_ = FakePictureLayer::CreateWithRecordingSource( - layer_settings(), &client_, recording.Pass()); + layer_settings(), &client_, std::move(recording)); root_layer_->SetBounds(gfx::Size(50, 50)); recording.reset(new FakeDisplayListRecordingSource); child_layer_ = FakePictureLayer::CreateWithRecordingSource( - layer_settings(), &client_, recording.Pass()); + layer_settings(), &client_, std::move(recording)); child_layer_->SetBounds(gfx::Size(25, 25)); child_layer_->SetIsDrawable(true); child_layer_->SetContentsOpaque(true); @@ -2246,9 +2246,10 @@ mock_context_ = mock_context_owned.get(); if (delegating_renderer()) - return FakeOutputSurface::CreateDelegating3d(mock_context_owned.Pass()); + return FakeOutputSurface::CreateDelegating3d( + std::move(mock_context_owned)); else - return FakeOutputSurface::Create3d(mock_context_owned.Pass()); + return FakeOutputSurface::Create3d(std::move(mock_context_owned)); } void SetupTree() override { @@ -3850,7 +3851,7 @@ : first_output_surface_memory_limit_, gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE, ManagedMemoryPolicy::kDefaultNumResourcesLimit))); - return output_surface.Pass(); + return output_surface; } void SetupTree() override { @@ -4015,7 +4016,7 @@ ASSERT_LE(commit_count_, 2); scoped_ptr<SwapPromise> swap_promise( new TestSwapPromise(&swap_promise_result_[commit_count_])); - layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); + layer_tree_host()->QueueSwapPromise(std::move(swap_promise)); } void BeginTest() override { PostSetNeedsCommitToMainThread(); } @@ -4202,7 +4203,7 @@ layer_tree_host()->SetVisible(false); scoped_ptr<SwapPromise> swap_promise( new TestSwapPromise(&swap_promise_result_)); - layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); + layer_tree_host()->QueueSwapPromise(std::move(swap_promise)); } void ScheduledActionWillSendBeginMainFrame() override { @@ -4246,7 +4247,7 @@ layer_tree_host()->DidLoseOutputSurface(); scoped_ptr<SwapPromise> swap_promise( new TestSwapPromise(&swap_promise_result_)); - layer_tree_host()->QueueSwapPromise(swap_promise.Pass()); + layer_tree_host()->QueueSwapPromise(std::move(swap_promise)); } void ScheduledActionWillSendBeginMainFrame() override { @@ -4426,7 +4427,7 @@ scoped_refptr<FakePictureLayer> layer = FakePictureLayer::CreateWithRecordingSource( - layer_settings(), &layer_client_, recording_source.Pass()); + layer_settings(), &layer_client_, std::move(recording_source)); layer_ = layer.get(); layer->SetBounds(gfx::Size(10, 10)); layer->SetIsDrawable(true); @@ -4481,7 +4482,7 @@ scoped_refptr<FakePictureLayer> layer = FakePictureLayer::CreateWithRecordingSource( - layer_settings(), &layer_client_, recording_source.Pass()); + layer_settings(), &layer_client_, std::move(recording_source)); layer_ = layer.get(); layer->SetBounds(gfx::Size()); layer->SetIsDrawable(true); @@ -4538,7 +4539,7 @@ scoped_refptr<FakePictureLayer> layer = FakePictureLayer::CreateWithRecordingSource( - layer_settings(), &layer_client_, recording_source.Pass()); + layer_settings(), &layer_client_, std::move(recording_source)); layer_ = layer.get(); layer->SetBounds(gfx::Size(10, 10)); layer->SetIsDrawable(true); @@ -4607,7 +4608,7 @@ scoped_refptr<FakePictureLayer> layer = FakePictureLayer::CreateWithRecordingSource( - layer_settings(), &layer_client_, recording_source.Pass()); + layer_settings(), &layer_client_, std::move(recording_source)); layer_ = layer.get(); layer->SetBounds(gfx::Size(10, 10)); @@ -4921,20 +4922,20 @@ // Successful composite. scoped_ptr<SwapPromise> swap_promise0( new TestSwapPromise(&swap_promise_result_[0])); - layer_tree_host()->QueueSwapPromise(swap_promise0.Pass()); + layer_tree_host()->QueueSwapPromise(std::move(swap_promise0)); layer_tree_host()->Composite(base::TimeTicks::Now()); // Fail to swap (no damage). scoped_ptr<SwapPromise> swap_promise1( new TestSwapPromise(&swap_promise_result_[1])); - layer_tree_host()->QueueSwapPromise(swap_promise1.Pass()); + layer_tree_host()->QueueSwapPromise(std::move(swap_promise1)); layer_tree_host()->SetNeedsCommit(); layer_tree_host()->Composite(base::TimeTicks::Now()); // Fail to draw (not visible). scoped_ptr<SwapPromise> swap_promise2( new TestSwapPromise(&swap_promise_result_[2])); - layer_tree_host()->QueueSwapPromise(swap_promise2.Pass()); + layer_tree_host()->QueueSwapPromise(std::move(swap_promise2)); layer_tree_host()->SetNeedsDisplayOnAllLayers(); layer_tree_host()->SetVisible(false); layer_tree_host()->Composite(base::TimeTicks::Now()); @@ -5052,7 +5053,7 @@ recording->SetPlaybackAllowedEvent(&playback_allowed_event_); scoped_refptr<FakePictureLayer> layer = FakePictureLayer::CreateWithRecordingSource(layer_settings(), &client_, - recording.Pass()); + std::move(recording)); layer->SetBounds(gfx::Size(500, 500)); layer->SetContentsOpaque(true); // Avoid LCD text on the layer so we don't cause extra commits when we @@ -5226,9 +5227,9 @@ #endif if (delegating_renderer()) - return FakeOutputSurface::CreateDelegating3d(context3d.Pass()); + return FakeOutputSurface::CreateDelegating3d(std::move(context3d)); else - return FakeOutputSurface::Create3d(context3d.Pass()); + return FakeOutputSurface::Create3d(std::move(context3d)); } }; @@ -5254,7 +5255,7 @@ new FakeDisplayListRecordingSource); scoped_refptr<FakePictureLayer> layer = FakePictureLayer::CreateWithRecordingSource(layer_settings(), &client_, - recording.Pass()); + std::move(recording)); layer->SetBounds(gfx::Size(500, 500)); layer->SetContentsOpaque(true); root->AddChild(layer); @@ -5295,7 +5296,7 @@ new FakeDisplayListRecordingSource); scoped_refptr<FakePictureLayer> root = FakePictureLayer::CreateWithRecordingSource(layer_settings(), &client_, - recording.Pass()); + std::move(recording)); root->SetBounds(gfx::Size(10000, 10000)); root->SetContentsOpaque(true); @@ -5348,7 +5349,7 @@ recording->SetPlaybackAllowedEvent(&playback_allowed_event_); scoped_refptr<FakePictureLayer> layer = FakePictureLayer::CreateWithRecordingSource(layer_settings(), &client_, - recording.Pass()); + std::move(recording)); layer->SetBounds(gfx::Size(500, 500)); layer->SetContentsOpaque(true); // Avoid LCD text on the layer so we don't cause extra commits when we
diff --git a/cc/trees/layer_tree_host_unittest_animation.cc b/cc/trees/layer_tree_host_unittest_animation.cc index 4ae38fe..e7cfa62d 100644 --- a/cc/trees/layer_tree_host_unittest_animation.cc +++ b/cc/trees/layer_tree_host_unittest_animation.cc
@@ -414,8 +414,8 @@ // Any valid AnimationCurve will do here. scoped_ptr<AnimationCurve> curve(new FakeFloatAnimationCurve()); scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), 1, 1, Animation::OPACITY)); - layer->layer_animation_controller()->AddAnimation(animation.Pass()); + Animation::Create(std::move(curve), 1, 1, Animation::OPACITY)); + layer->layer_animation_controller()->AddAnimation(std::move(animation)); // We add the animation *before* attaching the layer to the tree. layer_tree_host()->root_layer()->AddChild(layer); @@ -650,10 +650,11 @@ ScrollOffsetAnimationCurve::Create( gfx::ScrollOffset(500.f, 550.f), EaseInOutTimingFunction::Create())); - scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), 1, 0, Animation::SCROLL_OFFSET)); + scoped_ptr<Animation> animation(Animation::Create( + std::move(curve), 1, 0, Animation::SCROLL_OFFSET)); animation->set_needs_synchronized_start_time(true); - bool animation_added = scroll_layer_->AddAnimation(animation.Pass()); + bool animation_added = + scroll_layer_->AddAnimation(std::move(animation)); bool impl_scrolling_supported = layer_tree_host()->proxy()->SupportsImplScrolling(); EXPECT_EQ(impl_scrolling_supported, animation_added); @@ -701,9 +702,9 @@ ScrollOffsetAnimationCurve::Create(gfx::ScrollOffset(6500.f, 7500.f), EaseInOutTimingFunction::Create())); scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), 1, 0, Animation::SCROLL_OFFSET)); + Animation::Create(std::move(curve), 1, 0, Animation::SCROLL_OFFSET)); animation->set_needs_synchronized_start_time(true); - scroll_layer_->AddAnimation(animation.Pass()); + scroll_layer_->AddAnimation(std::move(animation)); } void BeginTest() override { PostSetNeedsCommitToMainThread(); }
diff --git a/cc/trees/layer_tree_host_unittest_animation_timelines.cc b/cc/trees/layer_tree_host_unittest_animation_timelines.cc index 30b69ee..da0c6ef 100644 --- a/cc/trees/layer_tree_host_unittest_animation_timelines.cc +++ b/cc/trees/layer_tree_host_unittest_animation_timelines.cc
@@ -425,8 +425,8 @@ // Any valid AnimationCurve will do here. scoped_ptr<AnimationCurve> curve(new FakeFloatAnimationCurve()); scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), 1, 1, Animation::OPACITY)); - player_->AddAnimation(animation.Pass()); + Animation::Create(std::move(curve), 1, 1, Animation::OPACITY)); + player_->AddAnimation(std::move(animation)); // We add the animation *before* attaching the layer to the tree. layer_tree_host()->root_layer()->AddChild(layer); @@ -559,13 +559,13 @@ ScrollOffsetAnimationCurve::Create( gfx::ScrollOffset(500.f, 550.f), EaseInOutTimingFunction::Create())); - scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), 1, 0, Animation::SCROLL_OFFSET)); + scoped_ptr<Animation> animation(Animation::Create( + std::move(curve), 1, 0, Animation::SCROLL_OFFSET)); animation->set_needs_synchronized_start_time(true); bool impl_scrolling_supported = layer_tree_host()->proxy()->SupportsImplScrolling(); if (impl_scrolling_supported) - player_child_->AddAnimation(animation.Pass()); + player_child_->AddAnimation(std::move(animation)); else EndTest(); break; @@ -611,12 +611,12 @@ ScrollOffsetAnimationCurve::Create(gfx::ScrollOffset(6500.f, 7500.f), EaseInOutTimingFunction::Create())); scoped_ptr<Animation> animation( - Animation::Create(curve.Pass(), 1, 0, Animation::SCROLL_OFFSET)); + Animation::Create(std::move(curve), 1, 0, Animation::SCROLL_OFFSET)); animation->set_needs_synchronized_start_time(true); AttachPlayersToTimeline(); player_child_->AttachLayer(scroll_layer_->id()); - player_child_->AddAnimation(animation.Pass()); + player_child_->AddAnimation(std::move(animation)); } void BeginTest() override { PostSetNeedsCommitToMainThread(); }
diff --git a/cc/trees/layer_tree_host_unittest_context.cc b/cc/trees/layer_tree_host_unittest_context.cc index 3bb2170..86d9992 100644 --- a/cc/trees/layer_tree_host_unittest_context.cc +++ b/cc/trees/layer_tree_host_unittest_context.cc
@@ -100,9 +100,9 @@ } if (delegating_renderer()) - return FakeOutputSurface::CreateDelegating3d(context3d.Pass()); + return FakeOutputSurface::CreateDelegating3d(std::move(context3d)); else - return FakeOutputSurface::Create3d(context3d.Pass()); + return FakeOutputSurface::Create3d(std::move(context3d)); } DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, @@ -194,7 +194,7 @@ scoped_ptr<OutputSurface> surface( LayerTreeHostContextTest::CreateOutputSurface()); CHECK(surface); - layer_tree_host()->SetOutputSurface(surface.Pass()); + layer_tree_host()->SetOutputSurface(std::move(surface)); } void DidInitializeOutputSurface() override { @@ -408,7 +408,7 @@ LayerTreeHostContextTest::CreateOutputSurface(); CHECK(surface); setos_counter_++; - layer_tree_host()->SetOutputSurface(surface.Pass()); + layer_tree_host()->SetOutputSurface(std::move(surface)); } void HideAndReleaseOutputSurface() { @@ -936,12 +936,12 @@ AddOneOfEveryQuadType(pass.get(), child_resource_provider_.get(), RenderPassId(2, 1), &mailbox_sync_point); - frame_data->render_pass_list.push_back(pass_for_quad.Pass()); - frame_data->render_pass_list.push_back(pass.Pass()); + frame_data->render_pass_list.push_back(std::move(pass_for_quad)); + frame_data->render_pass_list.push_back(std::move(pass)); delegated_resource_collection_ = new DelegatedFrameResourceCollection; delegated_frame_provider_ = new DelegatedFrameProvider( - delegated_resource_collection_.get(), frame_data.Pass()); + delegated_resource_collection_.get(), std::move(frame_data)); ResourceId resource = child_resource_provider_->CreateResource( gfx::Size(4, 4), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888);
diff --git a/cc/trees/layer_tree_host_unittest_copyrequest.cc b/cc/trees/layer_tree_host_unittest_copyrequest.cc index 4340241..a11ad95 100644 --- a/cc/trees/layer_tree_host_unittest_copyrequest.cc +++ b/cc/trees/layer_tree_host_unittest_copyrequest.cc
@@ -610,7 +610,7 @@ // Save the result for later. EXPECT_FALSE(result_); - result_ = result.Pass(); + result_ = std::move(result); // Post a commit to lose the output surface. layer_tree_host()->SetNeedsCommit(); @@ -846,7 +846,7 @@ TextureMailbox(mailbox, sync_token_, GL_TEXTURE_2D)); EXPECT_TRUE(request->has_texture_mailbox()); - copy_layer_->RequestCopyOfOutput(request.Pass()); + copy_layer_->RequestCopyOfOutput(std::move(request)); } void AfterTest() override { @@ -907,7 +907,7 @@ base::Bind(&LayerTreeHostCopyRequestTestDestroyBeforeCopy:: CopyOutputCallback, base::Unretained(this))); - copy_layer_->RequestCopyOfOutput(request.Pass()); + copy_layer_->RequestCopyOfOutput(std::move(request)); layer_tree_host()->SetViewportSize(gfx::Size()); break; @@ -984,7 +984,7 @@ base::Bind(&LayerTreeHostCopyRequestTestShutdownBeforeCopy:: CopyOutputCallback, base::Unretained(this))); - copy_layer_->RequestCopyOfOutput(request.Pass()); + copy_layer_->RequestCopyOfOutput(std::move(request)); layer_tree_host()->SetViewportSize(gfx::Size()); break;
diff --git a/cc/trees/layer_tree_host_unittest_delegated.cc b/cc/trees/layer_tree_host_unittest_delegated.cc index 22dff3e..897f225 100644 --- a/cc/trees/layer_tree_host_unittest_delegated.cc +++ b/cc/trees/layer_tree_host_unittest_delegated.cc
@@ -85,8 +85,8 @@ root_output_rect, root_damage_rect, gfx::Transform()); - frame->render_pass_list.push_back(root_pass.Pass()); - return frame.Pass(); + frame->render_pass_list.push_back(std::move(root_pass)); + return frame; } scoped_ptr<DelegatedFrameData> CreateInvalidFrameData( @@ -131,8 +131,8 @@ flipped, nearest_neighbor); - frame->render_pass_list.push_back(root_pass.Pass()); - return frame.Pass(); + frame->render_pass_list.push_back(std::move(root_pass)); + return frame; } void AddTransferableResource(DelegatedFrameData* frame, @@ -257,7 +257,7 @@ gfx::Size frame_size = root_pass->output_rect.size(); if (frame_provider_.get() && frame_size == frame_provider_->frame_size()) { - frame_provider_->SetFrameData(frame_data.Pass()); + frame_provider_->SetFrameData(std::move(frame_data)); return; } @@ -268,7 +268,7 @@ } frame_provider_ = new DelegatedFrameProvider(resource_collection_.get(), - frame_data.Pass()); + std::move(frame_data)); delegated_ = CreateDelegatedLayer(frame_provider_.get()); } @@ -421,7 +421,7 @@ CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame1.get(), 999); AddTransferableResource(frame1.get(), 999); - SetFrameData(frame1.Pass()); + SetFrameData(std::move(frame1)); } void DidInitializeOutputSurface() override { @@ -696,7 +696,7 @@ CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame1.get(), 999); AddTransferableResource(frame1.get(), 999); - SetFrameData(frame1.Pass()); + SetFrameData(std::move(frame1)); // The second frame uses resource 999 still, but also adds 555. scoped_ptr<DelegatedFrameData> frame2 = @@ -705,7 +705,7 @@ AddTransferableResource(frame2.get(), 999); AddTextureQuad(frame2.get(), 555); AddTransferableResource(frame2.get(), 555); - SetFrameData(frame2.Pass()); + SetFrameData(std::move(frame2)); // The resource 999 from frame1 is returned since it is still on the main // thread. @@ -757,7 +757,7 @@ AddTransferableResource(frame.get(), 999); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); PostSetNeedsCommitToMainThread(); } @@ -814,7 +814,7 @@ AddTransferableResource(frame.get(), 999); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: // All of the resources are in use. @@ -828,7 +828,7 @@ AddTransferableResource(frame.get(), 999); AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 3: // 555 is no longer in use. @@ -841,7 +841,7 @@ // Stop using any resources. frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 4: // Postpone collecting resources for a frame. They should still be there @@ -897,7 +897,7 @@ AddTransferableResource(frame.get(), 555); AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: // All of the resources are in use. @@ -909,7 +909,7 @@ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame.get(), 999); AddTransferableResource(frame.get(), 999); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); // Resource are not immediately released. resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -922,7 +922,7 @@ AddTransferableResource(frame.get(), 555); AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 3: // The 999 resource is the only unused one. Two references were sent, so @@ -965,7 +965,7 @@ AddTransferableResource(frame.get(), 555); AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: // All of the resources are in use. @@ -977,7 +977,7 @@ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame.get(), 999); AddTransferableResource(frame.get(), 999); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); // Resource are not immediately released. resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -1000,7 +1000,7 @@ AddTextureQuad(frame.get(), 999); AddTextureQuad(frame.get(), 555); AddTextureQuad(frame.get(), 444); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; } } @@ -1063,7 +1063,7 @@ AddTransferableResource(frame.get(), 555); AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: // All of the resources are in use. @@ -1075,7 +1075,7 @@ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame.get(), 999); AddTransferableResource(frame.get(), 999); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); // Resource are not immediately released. resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -1095,7 +1095,7 @@ AddTransferableResource(frame.get(), 555); AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); // The resources are used by the new frame but are returned anyway since // we passed them again. @@ -1179,7 +1179,7 @@ AddTransferableResource(frame.get(), 999); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: // All of the resources are in use. @@ -1197,7 +1197,7 @@ AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); AddTextureQuad(frame.get(), 775); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); // The parent compositor (this one) does a commit. break; @@ -1209,7 +1209,7 @@ // Now send a good frame with 999 again. frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame.get(), 999); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); // The bad frame's resource is given back to the child compositor. resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -1333,7 +1333,7 @@ AddTransferableResource(frame.get(), 999); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -1342,7 +1342,7 @@ // Now send an empty frame. frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); // The unused resource should be returned. resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -1399,13 +1399,13 @@ AddTransferableResource(frame.get(), 999); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); // But then we immediately stop using 999. frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: // The unused resources should be returned. 555 is still used, but it's @@ -1418,7 +1418,7 @@ } // Send a frame with no resources in it. frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 3: // The now unused resource 555 should be returned. @@ -1478,7 +1478,7 @@ AddTransferableResource(frame.get(), 999); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -1490,7 +1490,7 @@ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 3: // Since 999 is in the grandparent it is not returned. @@ -1618,7 +1618,7 @@ AddTransferableResource(frame.get(), 555); AddTextureQuad(frame.get(), 444); AddTransferableResource(frame.get(), 444); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -1629,7 +1629,7 @@ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); // 999 and 444 will be returned for frame 1, but not 555 since it's in // the current frame. break; @@ -1640,7 +1640,7 @@ AddTransferableResource(frame.get(), 999); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 4: // 555 from frame 1 and 2 isn't returned since it's still in use. 999 @@ -1653,7 +1653,7 @@ } frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); // 555 will be returned 3 times for frames 1 2 and 3, and 999 will be // returned once for frame 3. break; @@ -1728,7 +1728,7 @@ CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame.get(), 999); AddTransferableResource(frame.get(), 999); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); PostSetNeedsCommitToMainThread(); } @@ -1755,7 +1755,7 @@ CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; } case 2: @@ -1768,7 +1768,7 @@ // Finish the test by releasing resources on the next frame. scoped_ptr<DelegatedFrameData> frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; } } @@ -1819,7 +1819,7 @@ AddTransferableResource(frame.get(), 999); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -1838,7 +1838,7 @@ // Use a frame with no resources in it. frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 4: // We gave one frame to the frame provider, so we should get one @@ -1878,7 +1878,7 @@ AddTransferableResource(frame.get(), 999); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -1896,7 +1896,7 @@ delegated_->RemoveFromParent(); delegated_ = NULL; - frame_provider_->SetFrameData(frame.Pass()); + frame_provider_->SetFrameData(std::move(frame)); delegated_ = CreateDelegatedLayer(frame_provider_.get()); break; case 3: @@ -1906,7 +1906,7 @@ // Use a frame with no resources in it. frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 4: // We gave two frames to the frame provider, so we should get two @@ -1949,7 +1949,7 @@ AddTransferableResource(frame.get(), 555); // Create a DelegatedRendererLayer using the frame. - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: // Create a second DelegatedRendererLayer using the same frame provider. @@ -2036,7 +2036,7 @@ AddTransferableResource(frame.get(), 555); // Create a DelegatedRendererLayer using the frame. - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -2066,7 +2066,7 @@ AddTransferableResource(frame.get(), 888); AddTextureQuad(frame.get(), 777); AddTransferableResource(frame.get(), 777); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 5: resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -2127,7 +2127,7 @@ AddTransferableResource(frame.get(), 555); // Create a DelegatedRendererLayer using the frame. - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); @@ -2149,7 +2149,7 @@ AddTransferableResource(frame.get(), 888); AddTextureQuad(frame.get(), 777); AddTransferableResource(frame.get(), 777); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); resource_collection_->TakeUnusedResourcesForChildCompositor(&resources); { @@ -2204,14 +2204,14 @@ frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame.get(), 999); AddTransferableResource(frame.get(), 999); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; case 2: // This frame stops in the pending tree while we redraw the active tree. frame = CreateFrameData(gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1)); AddTextureQuad(frame.get(), 555); AddTransferableResource(frame.get(), 555); - SetFrameData(frame.Pass()); + SetFrameData(std::move(frame)); break; } }
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index 9250ce5..25ec5db 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -221,7 +221,7 @@ } void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) { - root_layer_ = layer.Pass(); + root_layer_ = std::move(layer); layer_tree_host_impl_->OnCanDrawStateChangedForTree(); } @@ -261,7 +261,7 @@ scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { render_surface_layer_list_.clear(); set_needs_update_draw_properties(); - return root_layer_.Pass(); + return std::move(root_layer_); } static void UpdateClipTreeForBoundsDeltaOnLayer(LayerImpl* layer, @@ -325,7 +325,7 @@ target_tree->elastic_overscroll()->PushPendingToActive(); target_tree->pending_page_scale_animation_ = - pending_page_scale_animation_.Pass(); + std::move(pending_page_scale_animation_); target_tree->SetViewportLayersFromIds( overscroll_elasticity_layer_id_, page_scale_layer_id_, @@ -1122,14 +1122,14 @@ void LayerTreeImpl::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) { DCHECK(swap_promise); - swap_promise_list_.push_back(swap_promise.Pass()); + swap_promise_list_.push_back(std::move(swap_promise)); } void LayerTreeImpl::QueuePinnedSwapPromise( scoped_ptr<SwapPromise> swap_promise) { DCHECK(IsActiveTree()); DCHECK(swap_promise); - pinned_swap_promise_list_.push_back(swap_promise.Pass()); + pinned_swap_promise_list_.push_back(std::move(swap_promise)); } void LayerTreeImpl::PassSwapPromises( @@ -1760,12 +1760,12 @@ void LayerTreeImpl::SetPendingPageScaleAnimation( scoped_ptr<PendingPageScaleAnimation> pending_animation) { - pending_page_scale_animation_ = pending_animation.Pass(); + pending_page_scale_animation_ = std::move(pending_animation); } scoped_ptr<PendingPageScaleAnimation> LayerTreeImpl::TakePendingPageScaleAnimation() { - return pending_page_scale_animation_.Pass(); + return std::move(pending_page_scale_animation_); } bool LayerTreeImpl::IsAnimatingFilterProperty(const LayerImpl* layer) const {
diff --git a/cc/trees/layer_tree_impl_unittest.cc b/cc/trees/layer_tree_impl_unittest.cc index a757d86..9a9cfe56 100644 --- a/cc/trees/layer_tree_impl_unittest.cc +++ b/cc/trees/layer_tree_impl_unittest.cc
@@ -72,7 +72,7 @@ root->SetDrawsContent(true); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -130,7 +130,7 @@ root->SetDrawsContent(true); host_impl->SetViewportSize(root->bounds()); - host_impl->active_tree()->SetRootLayer(root.Pass()); + host_impl->active_tree()->SetRootLayer(std::move(root)); host_impl->UpdateNumChildrenAndDrawPropertiesForActiveTree(); EXPECT_EQ( gfx::RectF(gfx::SizeF(bounds)), @@ -170,10 +170,10 @@ hud->SetDrawsContent(true); host_impl().active_tree()->set_hud_layer(hud.get()); - root->AddChild(hud.Pass()); + root->AddChild(std::move(hud)); host_impl().SetViewportSize(hud_bounds); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -227,7 +227,7 @@ root->SetDrawsContent(true); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. ASSERT_EQ(1u, RenderSurfaceLayerList().size()); @@ -288,7 +288,7 @@ root->SetDrawsContent(true); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -340,7 +340,7 @@ root->SetDrawsContent(true); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -404,7 +404,7 @@ root->SetDrawsContent(true); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -468,12 +468,12 @@ SetLayerPropertiesForTesting(child.get(), identity_matrix, transform_origin, position, bounds, true, false, false); child->SetDrawsContent(true); - clipping_layer->AddChild(child.Pass()); - root->AddChild(clipping_layer.Pass()); + clipping_layer->AddChild(std::move(child)); + root->AddChild(std::move(clipping_layer)); } host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -574,13 +574,13 @@ false, false); rotated_leaf->SetDrawsContent(true); - grand_child->AddChild(rotated_leaf.Pass()); - child->AddChild(grand_child.Pass()); - root->AddChild(child.Pass()); + grand_child->AddChild(std::move(rotated_leaf)); + child->AddChild(std::move(grand_child)); + root->AddChild(std::move(child)); } host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // (11, 89) is close to the the bottom left corner within the clip, but it is @@ -664,12 +664,12 @@ SetLayerPropertiesForTesting(child.get(), identity_matrix, transform_origin, position, bounds, true, false, false); child->SetDrawsContent(true); - intermediate_layer->AddChild(child.Pass()); - root->AddChild(intermediate_layer.Pass()); + intermediate_layer->AddChild(std::move(child)); + root->AddChild(std::move(intermediate_layer)); } host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -750,9 +750,9 @@ false, false); grand_child1->SetDrawsContent(true); - child1->AddChild(grand_child1.Pass()); - root->AddChild(child1.Pass()); - root->AddChild(child2.Pass()); + child1->AddChild(std::move(grand_child1)); + root->AddChild(std::move(child1)); + root->AddChild(std::move(child2)); } LayerImpl* child1 = root->children()[0].get(); @@ -760,7 +760,7 @@ LayerImpl* grand_child1 = child1->children()[0].get(); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -870,11 +870,11 @@ right_child->Set3dSortingContextId(right_child_sorting_context); } - root->AddChild(left_child.Pass()); - root->AddChild(right_child.Pass()); + root->AddChild(std::move(left_child)); + root->AddChild(std::move(right_child)); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); CHECK_EQ(1u, RenderSurfaceLayerList().size()); @@ -978,9 +978,9 @@ grand_child1->SetDrawsContent(true); grand_child1->SetShouldFlattenTransform(false); - child1->AddChild(grand_child1.Pass()); - root->AddChild(child1.Pass()); - root->AddChild(child2.Pass()); + child1->AddChild(std::move(grand_child1)); + root->AddChild(std::move(child1)); + root->AddChild(std::move(child2)); } LayerImpl* child1 = root->children()[0].get(); @@ -988,7 +988,7 @@ LayerImpl* grand_child1 = child1->children()[0].get(); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -1079,12 +1079,12 @@ // This should let |grand_child| "escape" |child|'s clip. grand_child->SetClipParent(root.get()); - child->AddChild(grand_child.Pass()); - root->AddChild(child.Pass()); + child->AddChild(std::move(grand_child)); + root->AddChild(std::move(child)); } host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); gfx::PointF test_point(12.f, 52.f); @@ -1138,13 +1138,13 @@ grand_child->SetDrawsContent(true); grand_child->SetHasRenderSurface(true); - scroll_child->AddChild(grand_child.Pass()); - root->AddChild(scroll_child.Pass()); - root->AddChild(child.Pass()); + scroll_child->AddChild(std::move(grand_child)); + root->AddChild(std::move(scroll_child)); + root->AddChild(std::move(child)); } host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); gfx::PointF test_point(12.f, 52.f); @@ -1210,9 +1210,9 @@ grand_child1->SetDrawsContent(true); grand_child1->SetHasRenderSurface(true); - child1->AddChild(grand_child1.Pass()); - root->AddChild(child1.Pass()); - root->AddChild(child2.Pass()); + child1->AddChild(std::move(grand_child1)); + root->AddChild(std::move(child1)); + root->AddChild(std::move(child2)); } LayerImpl* child1 = root->children()[0].get(); @@ -1220,7 +1220,7 @@ LayerImpl* grand_child1 = child1->children()[0].get(); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -1305,7 +1305,7 @@ root->SetDrawsContent(true); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -1390,7 +1390,7 @@ root->SetTouchEventHandlerRegion(touch_handler_region); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -1463,7 +1463,7 @@ root->SetTouchEventHandlerRegion(touch_handler_region); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -1535,7 +1535,7 @@ test_layer->SetDrawsContent(true); test_layer->SetTouchEventHandlerRegion(touch_handler_region); - root->AddChild(test_layer.Pass()); + root->AddChild(std::move(test_layer)); } float device_scale_factor = 3.f; @@ -1549,7 +1549,7 @@ host_impl().active_tree()->PushPageScaleFromMainThread( page_scale_factor, page_scale_factor, max_page_scale_factor); host_impl().active_tree()->SetPageScaleOnActiveTree(page_scale_factor); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 1, Layer::INVALID_ID); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); @@ -1688,12 +1688,12 @@ position, bounds, true, false, false); child->SetDrawsContent(true); child->SetTouchEventHandlerRegion(touch_handler_region); - clipping_layer->AddChild(child.Pass()); - root->AddChild(clipping_layer.Pass()); + clipping_layer->AddChild(std::move(child)); + root->AddChild(std::move(clipping_layer)); } host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -1761,7 +1761,7 @@ false, false); touch_layer->SetDrawsContent(true); touch_layer->SetTouchEventHandlerRegion(gfx::Rect(0, 0, 50, 50)); - root->AddChild(touch_layer.Pass()); + root->AddChild(std::move(touch_layer)); } { @@ -1775,11 +1775,11 @@ transform_origin, position, bounds, true, false, false); notouch_layer->SetDrawsContent(true); - root->AddChild(notouch_layer.Pass()); + root->AddChild(std::move(notouch_layer)); } host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -1843,10 +1843,10 @@ test_layer->SetDrawsContent(false); test_layer->SetTouchEventHandlerRegion(touch_handler_region); - root->AddChild(test_layer.Pass()); + root->AddChild(std::move(test_layer)); } host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); LayerImpl* test_layer = @@ -1915,7 +1915,7 @@ root->SetDrawsContent(true); host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -2013,12 +2013,12 @@ transform_origin, position, bounds, true, false, false); clipped_layer->SetDrawsContent(true); - clipping_layer->AddChild(clipped_layer.Pass()); - root->AddChild(clipping_layer.Pass()); + clipping_layer->AddChild(std::move(clipped_layer)); + root->AddChild(std::move(clipping_layer)); } host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); // Sanity check the scenario we just created. @@ -2101,7 +2101,7 @@ transform_origin, position, bounds, true, false, false); sub_layer->SetDrawsContent(true); - root->AddChild(sub_layer.Pass()); + root->AddChild(std::move(sub_layer)); } float device_scale_factor = 3.f; @@ -2114,7 +2114,7 @@ host_impl().active_tree()->PushPageScaleFromMainThread( page_scale_factor, page_scale_factor, page_scale_factor); host_impl().active_tree()->SetPageScaleOnActiveTree(page_scale_factor); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 1, Layer::INVALID_ID); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); @@ -2191,12 +2191,12 @@ false, false); grand_child->SetDrawsContent(true); - child->AddChild(grand_child.Pass()); - root->AddChild(child.Pass()); + child->AddChild(std::move(grand_child)); + root->AddChild(std::move(child)); } host_impl().SetViewportSize(root->bounds()); - host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->SetRootLayer(std::move(root)); host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree(); LayerSelection input;
diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc index dcafd87c..077f1b3 100644 --- a/cc/trees/layer_tree_settings.cc +++ b/cc/trees/layer_tree_settings.cc
@@ -14,12 +14,6 @@ namespace cc { -LayerSettings::LayerSettings() : use_compositor_animation_timelines(false) { -} - -LayerSettings::~LayerSettings() { -} - LayerTreeSettings::LayerTreeSettings() : single_thread_proxy_scheduler(true), use_external_begin_frame_source(false),
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h index 822de1d..57e679cb 100644 --- a/cc/trees/layer_tree_settings.h +++ b/cc/trees/layer_tree_settings.h
@@ -18,14 +18,6 @@ namespace cc { -class CC_EXPORT LayerSettings { - public: - LayerSettings(); - ~LayerSettings(); - - bool use_compositor_animation_timelines; -}; - class CC_EXPORT LayerTreeSettings { public: LayerTreeSettings();
diff --git a/cc/trees/occlusion_tracker_perftest.cc b/cc/trees/occlusion_tracker_perftest.cc index 7e4a8f8..b7ecf3b 100644 --- a/cc/trees/occlusion_tracker_perftest.cc +++ b/cc/trees/occlusion_tracker_perftest.cc
@@ -46,7 +46,7 @@ scoped_ptr<LayerImpl> root_layer = LayerImpl::Create(active_tree(), 1); root_layer->SetHasRenderSurface(true); - active_tree()->SetRootLayer(root_layer.Pass()); + active_tree()->SetRootLayer(std::move(root_layer)); } LayerTreeImpl* active_tree() { return host_impl_->active_tree(); } @@ -90,7 +90,7 @@ opaque_layer->SetContentsOpaque(true); opaque_layer->SetDrawsContent(true); opaque_layer->SetBounds(viewport_rect.size()); - active_tree()->root_layer()->AddChild(opaque_layer.Pass()); + active_tree()->root_layer()->AddChild(std::move(opaque_layer)); bool update_lcd_text = false; active_tree()->UpdateDrawProperties(update_lcd_text); @@ -159,7 +159,7 @@ opaque_layer->SetBounds( gfx::Size(viewport_rect.width() / 2, viewport_rect.height() / 2)); opaque_layer->SetPosition(gfx::PointF(i, i)); - active_tree()->root_layer()->AddChild(opaque_layer.Pass()); + active_tree()->root_layer()->AddChild(std::move(opaque_layer)); } bool update_lcd_text = false;
diff --git a/cc/trees/occlusion_tracker_unittest.cc b/cc/trees/occlusion_tracker_unittest.cc index 958d532..c8c7d4b 100644 --- a/cc/trees/occlusion_tracker_unittest.cc +++ b/cc/trees/occlusion_tracker_unittest.cc
@@ -104,7 +104,7 @@ SetProperties(layer_ptr, transform, position, bounds); DCHECK(!root_.get()); - root_ = layer.Pass(); + root_ = std::move(layer); layer_ptr->SetHasRenderSurface(true); SetRootLayerOnMainThread(layer_ptr); @@ -121,7 +121,7 @@ scoped_ptr<LayerImpl> layer = LayerImpl::Create(tree, id); LayerImpl* layer_ptr = layer.get(); SetProperties(layer_ptr, transform, position, bounds); - parent->AddChild(layer.Pass()); + parent->AddChild(std::move(layer)); return layer_ptr; } @@ -155,7 +155,7 @@ layer_ptr->SetOpaqueContentsRect(gfx::Rect()); } - parent->AddChild(layer.Pass()); + parent->AddChild(std::move(layer)); return layer_ptr; } @@ -168,7 +168,7 @@ scoped_ptr<TestContentLayerImpl> layer(new TestContentLayerImpl(tree, id)); TestContentLayerImpl* layer_ptr = layer.get(); SetProperties(layer_ptr, transform, position, bounds); - SetReplica(owning_layer, layer.Pass()); + SetReplica(owning_layer, std::move(layer)); return layer_ptr; } @@ -178,7 +178,7 @@ scoped_ptr<TestContentLayerImpl> layer(new TestContentLayerImpl(tree, id)); TestContentLayerImpl* layer_ptr = layer.get(); SetProperties(layer_ptr, identity_matrix, gfx::PointF(), bounds); - SetMask(owning_layer, layer.Pass()); + SetMask(owning_layer, std::move(layer)); return layer_ptr; } @@ -296,11 +296,11 @@ } void SetReplica(LayerImpl* owning_layer, scoped_ptr<LayerImpl> layer) { - owning_layer->SetReplicaLayer(layer.Pass()); + owning_layer->SetReplicaLayer(std::move(layer)); } void SetMask(LayerImpl* owning_layer, scoped_ptr<LayerImpl> layer) { - owning_layer->SetMaskLayer(layer.Pass()); + owning_layer->SetMaskLayer(std::move(layer)); } bool opaque_layers_;
diff --git a/cc/trees/remote_proto_channel.h b/cc/trees/remote_proto_channel.h new file mode 100644 index 0000000..b0f1647 --- /dev/null +++ b/cc/trees/remote_proto_channel.h
@@ -0,0 +1,40 @@ +// Copyright 2015 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. + +#ifndef CC_TREES_REMOTE_PROTO_CHANNEL_H_ +#define CC_TREES_REMOTE_PROTO_CHANNEL_H_ + +#include "base/memory/scoped_ptr.h" + +namespace cc { + +namespace proto { +class CompositorMessage; +} + +// Provides a bridge for getting compositor protobuf messages to/from the +// outside world. +class RemoteProtoChannel { + public: + // Meant to be implemented by a RemoteChannel that needs to receive and parse + // incoming protobufs. + class ProtoReceiver { + public: + virtual void OnProtoReceived( + scoped_ptr<proto::CompositorMessage> proto) = 0; + + protected: + virtual ~ProtoReceiver() {} + }; + + virtual void SetProtoReceiver(ProtoReceiver* receiver) = 0; + virtual void SendCompositorProto(const proto::CompositorMessage& proto) = 0; + + protected: + virtual ~RemoteProtoChannel() {} +}; + +} // namespace cc + +#endif // CC_TREES_REMOTE_PROTO_CHANNEL_H_
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc index 3bcf0180..46f26ff9 100644 --- a/cc/trees/single_thread_proxy.cc +++ b/cc/trees/single_thread_proxy.cc
@@ -29,7 +29,7 @@ scoped_ptr<BeginFrameSource> external_begin_frame_source) { return make_scoped_ptr( new SingleThreadProxy(layer_tree_host, client, task_runner_provider, - external_begin_frame_source.Pass())); + std::move(external_begin_frame_source))); } SingleThreadProxy::SingleThreadProxy( @@ -40,7 +40,7 @@ : layer_tree_host_(layer_tree_host), client_(client), task_runner_provider_(task_runner_provider), - external_begin_frame_source_(external_begin_frame_source.Pass()), + external_begin_frame_source_(std::move(external_begin_frame_source)), next_frame_is_newly_committed_frame_(false), #if DCHECK_IS_ON() inside_impl_frame_(false), @@ -68,10 +68,11 @@ CompositorTimingHistory::BROWSER_UMA, layer_tree_host->rendering_stats_instrumentation())); - scheduler_on_impl_thread_ = Scheduler::Create( - this, scheduler_settings, layer_tree_host_->id(), - task_runner_provider_->MainThreadTaskRunner(), - external_begin_frame_source_.get(), compositor_timing_history.Pass()); + scheduler_on_impl_thread_ = + Scheduler::Create(this, scheduler_settings, layer_tree_host_->id(), + task_runner_provider_->MainThreadTaskRunner(), + external_begin_frame_source_.get(), + std::move(compositor_timing_history)); } } @@ -424,7 +425,7 @@ "cc", "SingleThreadProxy::PostAnimationEventsToMainThreadOnImplThread"); DCHECK(task_runner_provider_->IsImplThread()); DebugScopedSetMainThread main(task_runner_provider_); - layer_tree_host_->SetAnimationEvents(events.Pass()); + layer_tree_host_->SetAnimationEvents(std::move(events)); } bool SingleThreadProxy::IsInsideDraw() { return inside_draw_; } @@ -504,8 +505,8 @@ void SingleThreadProxy::PostFrameTimingEventsOnImplThread( scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events, scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) { - layer_tree_host_->RecordFrameTimingEvents(composite_events.Pass(), - main_frame_events.Pass()); + layer_tree_host_->RecordFrameTimingEvents(std::move(composite_events), + std::move(main_frame_events)); } void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) {
diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc index a1928408..6ce4d47 100644 --- a/cc/trees/thread_proxy.cc +++ b/cc/trees/thread_proxy.cc
@@ -49,8 +49,9 @@ LayerTreeHost* layer_tree_host, TaskRunnerProvider* task_runner_provider, scoped_ptr<BeginFrameSource> external_begin_frame_source) { - return make_scoped_ptr(new ThreadProxy(layer_tree_host, task_runner_provider, - external_begin_frame_source.Pass())); + return make_scoped_ptr( + new ThreadProxy(layer_tree_host, task_runner_provider, + std::move(external_begin_frame_source))); } ThreadProxy::ThreadProxy( @@ -63,7 +64,7 @@ this, layer_tree_host->id(), layer_tree_host->rendering_stats_instrumentation(), - external_begin_frame_source.Pass()) { + std::move(external_begin_frame_source)) { TRACE_EVENT0("cc", "ThreadProxy::ThreadProxy"); DCHECK(task_runner_provider_); DCHECK(task_runner_provider_->IsMainThread()); @@ -111,7 +112,7 @@ base::Bind(&ThreadProxy::RenewTreePriority, base::Unretained(proxy)), base::TimeDelta::FromMilliseconds( kSmoothnessTakesPriorityExpirationDelay * 1000)), - external_begin_frame_source(external_begin_frame_source.Pass()), + external_begin_frame_source(std::move(external_begin_frame_source)), rendering_stats_instrumentation(rendering_stats_instrumentation), weak_factory(proxy) {} @@ -124,7 +125,7 @@ } void ThreadProxy::SetChannel(scoped_ptr<ThreadedChannel> threaded_channel) { - threaded_channel_ = threaded_channel.Pass(); + threaded_channel_ = std::move(threaded_channel); main().channel_main = threaded_channel_.get(); } @@ -376,7 +377,7 @@ TRACE_EVENT0("cc", "ThreadProxy::PostAnimationEventsToMainThreadOnImplThread"); DCHECK(task_runner_provider_->IsImplThread()); - impl().channel_impl->SetAnimationEvents(events.Pass()); + impl().channel_impl->SetAnimationEvents(std::move(events)); } bool ThreadProxy::IsInsideDraw() { return impl().inside_draw; } @@ -574,7 +575,7 @@ // main_frame_before_activation_enabled is set, since we might run this code // twice before recording a duration. crbug.com/469824 impl().last_begin_main_frame_args = begin_main_frame_state->begin_frame_args; - impl().channel_impl->BeginMainFrame(begin_main_frame_state.Pass()); + impl().channel_impl->BeginMainFrame(std::move(begin_main_frame_state)); devtools_instrumentation::DidRequestMainThreadFrame( impl().layer_tree_host_id); } @@ -937,7 +938,7 @@ void ThreadProxy::SetAnimationEvents(scoped_ptr<AnimationEventsVector> events) { TRACE_EVENT0("cc", "ThreadProxy::SetAnimationEvents"); DCHECK(task_runner_provider_->IsMainThread()); - main().layer_tree_host->SetAnimationEvents(events.Pass()); + main().layer_tree_host->SetAnimationEvents(std::move(events)); } void ThreadProxy::InitializeImplOnImpl(CompletionEvent* completion, @@ -964,7 +965,7 @@ Scheduler::Create(this, scheduler_settings, impl().layer_tree_host_id, task_runner_provider_->ImplThreadTaskRunner(), impl().external_begin_frame_source.get(), - compositor_timing_history.Pass()); + std::move(compositor_timing_history)); DCHECK_EQ(impl().scheduler->visible(), impl().layer_tree_host_impl->visible()); @@ -1068,11 +1069,11 @@ impl().smoothness_priority_expiration_notifier.Schedule(); // We use the same priority for both trees by default. - TreePriority priority = SAME_PRIORITY_FOR_BOTH_TREES; + TreePriority tree_priority = SAME_PRIORITY_FOR_BOTH_TREES; // Smoothness takes priority if we have an expiration for it scheduled. if (impl().smoothness_priority_expiration_notifier.HasPendingNotification()) - priority = SMOOTHNESS_TAKES_PRIORITY; + tree_priority = SMOOTHNESS_TAKES_PRIORITY; // New content always takes priority when there is an invalid viewport size or // ui resources have been evicted. @@ -1083,18 +1084,21 @@ // tree might be freed. We need to set RequiresHighResToDraw to ensure that // high res tiles will be required to activate pending tree. impl().layer_tree_host_impl->SetRequiresHighResToDraw(); - priority = NEW_CONTENT_TAKES_PRIORITY; + tree_priority = NEW_CONTENT_TAKES_PRIORITY; } - impl().layer_tree_host_impl->SetTreePriority(priority); + impl().layer_tree_host_impl->SetTreePriority(tree_priority); // Only put the scheduler in impl latency prioritization mode if we don't // have a scroll listener. This gives the scroll listener a better chance of // handling scroll updates within the same frame. The tree itself is still // kept in prefer smoothness mode to allow checkerboarding. - impl().scheduler->SetImplLatencyTakesPriority( - priority == SMOOTHNESS_TAKES_PRIORITY && - !impl().layer_tree_host_impl->scroll_affects_scroll_handler()); + ScrollHandlerState scroll_handler_state = + impl().layer_tree_host_impl->scroll_affects_scroll_handler() + ? ScrollHandlerState::SCROLL_AFFECTS_SCROLL_HANDLER + : ScrollHandlerState::SCROLL_DOES_NOT_AFFECT_SCROLL_HANDLER; + impl().scheduler->SetTreePrioritiesAndScrollState(tree_priority, + scroll_handler_state); // Notify the the client of this compositor via the output surface. // TODO(epenner): Route this to compositor-thread instead of output-surface @@ -1102,7 +1106,8 @@ if (impl().layer_tree_host_impl->output_surface()) { impl() .layer_tree_host_impl->output_surface() - ->UpdateSmoothnessTakesPriority(priority == SMOOTHNESS_TAKES_PRIORITY); + ->UpdateSmoothnessTakesPriority(tree_priority == + SMOOTHNESS_TAKES_PRIORITY); } } @@ -1169,16 +1174,16 @@ scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events, scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) { DCHECK(task_runner_provider_->IsImplThread()); - impl().channel_impl->PostFrameTimingEventsOnMain(composite_events.Pass(), - main_frame_events.Pass()); + impl().channel_impl->PostFrameTimingEventsOnMain( + std::move(composite_events), std::move(main_frame_events)); } void ThreadProxy::PostFrameTimingEventsOnMain( scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events, scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) { DCHECK(task_runner_provider_->IsMainThread()); - main().layer_tree_host->RecordFrameTimingEvents(composite_events.Pass(), - main_frame_events.Pass()); + main().layer_tree_host->RecordFrameTimingEvents(std::move(composite_events), + std::move(main_frame_events)); } base::WeakPtr<ProxyMain> ThreadProxy::GetMainWeakPtr() {
diff --git a/cc/trees/threaded_channel.cc b/cc/trees/threaded_channel.cc index a2cb7831..37ed58f7 100644 --- a/cc/trees/threaded_channel.cc +++ b/cc/trees/threaded_channel.cc
@@ -209,8 +209,8 @@ MainThreadTaskRunner()->PostTask( FROM_HERE, base::Bind(&ProxyMain::PostFrameTimingEventsOnMain, proxy_main_->GetMainWeakPtr(), - base::Passed(composite_events.Pass()), - base::Passed(main_frame_events.Pass()))); + base::Passed(std::move(composite_events)), + base::Passed(std::move(main_frame_events)))); } void ThreadedChannel::BeginMainFrame(
diff --git a/cc/trees/threaded_channel_unittest.cc b/cc/trees/threaded_channel_unittest.cc index e9b6d514..152ff59 100644 --- a/cc/trees/threaded_channel_unittest.cc +++ b/cc/trees/threaded_channel_unittest.cc
@@ -266,7 +266,8 @@ void StartTestOnImplThread() override { scoped_ptr<AnimationEventsVector> events( make_scoped_ptr(new AnimationEventsVector)); - thread_proxy_->PostAnimationEventsToMainThreadOnImplThread(events.Pass()); + thread_proxy_->PostAnimationEventsToMainThreadOnImplThread( + std::move(events)); } void ReceivedSetAnimationEvents() override {
diff --git a/cc/trees/tree_synchronizer.cc b/cc/trees/tree_synchronizer.cc index 4ecf5d3c..99351471 100644 --- a/cc/trees/tree_synchronizer.cc +++ b/cc/trees/tree_synchronizer.cc
@@ -32,7 +32,7 @@ CollectExistingLayerImplRecursive(old_layers, layer_impl->TakeReplicaLayer()); int id = layer_impl->id(); - old_layers->set(id, layer_impl.Pass()); + old_layers->set(id, std::move(layer_impl)); } template <typename LayerType> @@ -46,28 +46,29 @@ ScopedPtrLayerImplMap old_layers; RawPtrLayerImplMap new_layers; - CollectExistingLayerImplRecursive(&old_layers, old_layer_impl_root.Pass()); + CollectExistingLayerImplRecursive(&old_layers, + std::move(old_layer_impl_root)); scoped_ptr<LayerImpl> new_tree = SynchronizeTreesRecursive( &new_layers, &old_layers, layer_root, tree_impl); - return new_tree.Pass(); + return new_tree; } scoped_ptr<LayerImpl> TreeSynchronizer::SynchronizeTrees( Layer* layer_root, scoped_ptr<LayerImpl> old_layer_impl_root, LayerTreeImpl* tree_impl) { - return SynchronizeTreesInternal( - layer_root, old_layer_impl_root.Pass(), tree_impl); + return SynchronizeTreesInternal(layer_root, std::move(old_layer_impl_root), + tree_impl); } scoped_ptr<LayerImpl> TreeSynchronizer::SynchronizeTrees( LayerImpl* layer_root, scoped_ptr<LayerImpl> old_layer_impl_root, LayerTreeImpl* tree_impl) { - return SynchronizeTreesInternal( - layer_root, old_layer_impl_root.Pass(), tree_impl); + return SynchronizeTreesInternal(layer_root, std::move(old_layer_impl_root), + tree_impl); } template <typename LayerType> @@ -81,7 +82,7 @@ layer_impl = layer->CreateLayerImpl(tree_impl); (*new_layers)[layer->id()] = layer_impl.get(); - return layer_impl.Pass(); + return layer_impl; } template <typename LayerType> @@ -107,7 +108,7 @@ layer_impl->SetReplicaLayer(SynchronizeTreesRecursiveInternal( new_layers, old_layers, layer->replica_layer(), tree_impl)); - return layer_impl.Pass(); + return layer_impl; } scoped_ptr<LayerImpl> SynchronizeTreesRecursive(
diff --git a/cc/trees/tree_synchronizer_unittest.cc b/cc/trees/tree_synchronizer_unittest.cc index 6d88157..8782d5d 100644 --- a/cc/trees/tree_synchronizer_unittest.cc +++ b/cc/trees/tree_synchronizer_unittest.cc
@@ -13,6 +13,7 @@ #include "cc/animation/layer_animation_controller.h" #include "cc/layers/layer.h" #include "cc/layers/layer_impl.h" +#include "cc/layers/layer_settings.h" #include "cc/test/animation_test_common.h" #include "cc/test/fake_impl_task_runner_provider.h" #include "cc/test/fake_layer_tree_host.h" @@ -267,10 +268,9 @@ // Synchronize again. After the sync the trees should be equivalent and we // should have created and destroyed one LayerImpl. - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + layer_tree_root.get(), std::move(layer_impl_tree_root), + host_->active_tree()); ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root.get(), host_->active_tree()); @@ -312,10 +312,9 @@ // re-insert the layer and sync again. child2->RemoveFromParent(); layer_tree_root->AddChild(child2); - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + layer_tree_root.get(), std::move(layer_impl_tree_root), + host_->active_tree()); ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root.get(), host_->active_tree()); @@ -429,10 +428,9 @@ // After another synchronize our trees should match and we should not have // destroyed any LayerImpls - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + layer_tree_root.get(), std::move(layer_impl_tree_root), + host_->active_tree()); ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root.get(), host_->active_tree()); @@ -476,10 +474,9 @@ // be deleted. scoped_refptr<Layer> new_layer_tree_root = Layer::Create(layer_settings_); host_->SetRootLayer(new_layer_tree_root); - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(new_layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + new_layer_tree_root.get(), std::move(layer_impl_tree_root), + host_->active_tree()); ExpectTreesAreIdentical(new_layer_tree_root.get(), layer_impl_tree_root.get(), host_->active_tree()); @@ -534,30 +531,27 @@ // Remove the mask layer. layer_tree_root->children()[0]->SetMaskLayer(NULL); - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + layer_tree_root.get(), std::move(layer_impl_tree_root), + host_->active_tree()); ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root.get(), host_->active_tree()); // Remove the replica layer. layer_tree_root->children()[1]->SetReplicaLayer(NULL); - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + layer_tree_root.get(), std::move(layer_impl_tree_root), + host_->active_tree()); ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root.get(), host_->active_tree()); // Remove the replica mask. replica_layer_with_mask->SetMaskLayer(NULL); - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + layer_tree_root.get(), std::move(layer_impl_tree_root), + host_->active_tree()); ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root.get(), host_->active_tree()); @@ -587,10 +581,9 @@ layer_tree_root.get(), nullptr, host_->active_tree()); TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root.get()); - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + layer_tree_root.get(), std::move(layer_impl_tree_root), + host_->active_tree()); EXPECT_TRUE(static_cast<FakeLayerAnimationController*>( layer_tree_root->layer_animation_controller())->SynchronizedAnimations()); @@ -632,10 +625,9 @@ // Remove the first scroll child. layer_tree_root->children()[1]->RemoveFromParent(); - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_impl->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + layer_tree_root.get(), std::move(layer_impl_tree_root), + host_impl->active_tree()); TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root.get()); { @@ -649,10 +641,9 @@ scoped_refptr<Layer> additional_scroll_child = Layer::Create(layer_settings_); layer_tree_root->AddChild(additional_scroll_child); additional_scroll_child->SetScrollParent(scroll_parent.get()); - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_impl->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + layer_tree_root.get(), std::move(layer_impl_tree_root), + host_impl->active_tree()); TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root.get()); { @@ -702,10 +693,9 @@ clip_child1->RemoveFromParent(); clip_child1 = NULL; - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_impl->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + layer_tree_root.get(), std::move(layer_impl_tree_root), + host_impl->active_tree()); TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root.get()); ExpectTreesAreIdentical(layer_tree_root.get(), @@ -716,10 +706,9 @@ scoped_refptr<Layer> additional_clip_child = Layer::Create(layer_settings_); intervening->AddChild(additional_clip_child); additional_clip_child->SetClipParent(clip_parent.get()); - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_impl->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + layer_tree_root.get(), std::move(layer_impl_tree_root), + host_impl->active_tree()); TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root.get()); ExpectTreesAreIdentical(layer_tree_root.get(), @@ -729,10 +718,9 @@ // Remove the nearest clipping ancestor. clip_parent->RemoveFromParent(); clip_parent = NULL; - layer_impl_tree_root = - TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(), - layer_impl_tree_root.Pass(), - host_impl->active_tree()); + layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( + layer_tree_root.get(), std::move(layer_impl_tree_root), + host_impl->active_tree()); TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root.get()); ExpectTreesAreIdentical(layer_tree_root.get(),
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn index cc49543..ed18e51 100644 --- a/chrome/BUILD.gn +++ b/chrome/BUILD.gn
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/config/chrome_build.gni") +import("//build/config/compiler/compiler.gni") import("//build/config/features.gni") import("//build/config/locales.gni") import("//build/config/sanitizers/sanitizers.gni")
diff --git a/chrome/android/java/res/layout/contextual_search_peek_promo_text_view.xml b/chrome/android/java/res/layout/contextual_search_peek_promo_text_view.xml index 5632773..97fcef5 100644 --- a/chrome/android/java/res/layout/contextual_search_peek_promo_text_view.xml +++ b/chrome/android/java/res/layout/contextual_search_peek_promo_text_view.xml
@@ -11,7 +11,8 @@ android:layout_height="wrap_content" android:orientation="horizontal" android:paddingStart="@dimen/contextual_search_peek_promo_padding" - android:paddingEnd="@dimen/contextual_search_peek_promo_padding"> + android:paddingEnd="@dimen/contextual_search_peek_promo_padding" + android:visibility="invisible"> <TextView android:id="@+id/contextual_search_peek_promo_new" android:layout_width="wrap_content"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java index f41d9b04..7e507f7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java
@@ -22,9 +22,6 @@ /** Whether fullscreen support is disabled (auto hiding controls, etc...). */ public static final String DISABLE_FULLSCREEN = "disable-fullscreen"; - /** Show the undo bar for high end UI devices. */ - public static final String ENABLE_HIGH_END_UI_UNDO = "enable-high-end-ui-undo"; - /** Enable toolbar swipe to change tabs in document mode */ public static final String ENABLE_TOOLBAR_SWIPE_IN_DOCUMENT_MODE = "enable-toolbar-swipe-in-document-mode";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 71e65ec..b90cce012 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -762,8 +762,6 @@ } } - commandLine.appendSwitch(ChromeSwitches.ENABLE_HIGH_END_UI_UNDO); - supportRequestWindowFeature(Window.FEATURE_ACTION_MODE_OVERLAY); // We are starting from history with a URL after data has been cleared. On Samsung this
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java index 6f04cde62..0a7c1a68 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java
@@ -7,6 +7,7 @@ import android.view.ViewGroup; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanel.StateChangeReason; +import org.chromium.ui.resources.dynamics.DynamicResourceLoader; import java.util.HashSet; import java.util.Set; @@ -27,14 +28,10 @@ HIGH; } - /** - * A map of panels that this class is managing. - */ + /** A map of panels that this class is managing. */ private final Set<OverlayPanel> mPanelSet; - /** - * The panel that is currently being displayed. - */ + /** The panel that is currently being displayed. */ private OverlayPanel mActivePanel; /** @@ -44,16 +41,21 @@ */ private OverlayPanel mSuppressedPanel; - /** - * When a panel is suppressed, this is the panel waiting for the close animation to finish. - */ + /** When a panel is suppressed, this is the panel waiting for the close animation to finish. */ private OverlayPanel mPendingPanel; - /** - * When a panel is suppressed, this the reason the pending panel is to be shown. - */ + /** When a panel is suppressed, this the reason the pending panel is to be shown. */ private StateChangeReason mPendingReason; + /** This handles communication between each panel and it's host layout. */ + private OverlayPanelHost mOverlayPanelHost; + + /** This handles resource loading for each panels. */ + private DynamicResourceLoader mDynamicResourceLoader; + + /** This is the view group that all views related to the panel will be put into. */ + private ViewGroup mContainerViewGroup; + /** * Default constructor. */ @@ -145,6 +147,11 @@ mPanelSet.clear(); mActivePanel = null; mSuppressedPanel = null; + + // Clear references to held resources. + mOverlayPanelHost = null; + mDynamicResourceLoader = null; + mContainerViewGroup = null; } /** @@ -152,17 +159,29 @@ * @param host The OverlayPanel host. */ public void setPanelHost(OverlayPanelHost host) { - // TODO(mdjones): Possibly store this for late additions to the panel set. + mOverlayPanelHost = host; for (OverlayPanel p : mPanelSet) { p.setHost(host); } } /** + * Set the resource loader for all OverlayPanels. + * @param host The OverlayPanel host. + */ + public void setDynamicResourceLoader(DynamicResourceLoader loader) { + mDynamicResourceLoader = loader; + for (OverlayPanel p : mPanelSet) { + p.setDynamicResourceLoader(loader); + } + } + + /** * Set the ViewGroup for all panels. * @param container The ViewGroup objects will be displayed in. */ public void setContainerView(ViewGroup container) { + mContainerViewGroup = container; for (OverlayPanel p : mPanelSet) { p.setContainerView(container); } @@ -181,10 +200,23 @@ } /** - * Add a panel to the collection that is managed by this class. + * Add a panel to the collection that is managed by this class. If any of the setters for this + * class were called before a panel was added, that panel will still get those resources. * @param panel An OverlayPanel to be managed. */ public void registerPanel(OverlayPanel panel) { + // If any of the setters for this manager were called before some panel registration, + // make sure that panel gets the appropriate resources. + if (mOverlayPanelHost != null) { + panel.setHost(mOverlayPanelHost); + } + if (mDynamicResourceLoader != null) { + panel.setDynamicResourceLoader(mDynamicResourceLoader); + } + if (mContainerViewGroup != null) { + panel.setContainerView(mContainerViewGroup); + } + mPanelSet.add(panel); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java index 9056924..ae8da8ee 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java
@@ -142,7 +142,6 @@ // Initialize Contextual Search Panel mContextualSearchPanel.setManagementDelegate(contextualSearchDelegate); - mContextualSearchPanel.setDynamicResourceLoader(dynamicResourceLoader); // Set back flow communication if (contextualSearchDelegate != null) { @@ -150,13 +149,13 @@ } mReaderModePanel.setManagerDelegate(readerModeDelegate); - // TODO(mdjones): The manager should be responsible for passing the resource loader to all - // panels. - mReaderModePanel.setDynamicResourceLoader(dynamicResourceLoader); if (readerModeDelegate != null) { readerModeDelegate.setReaderModePanel(mReaderModePanel); } + // Set the dynamic resource loader for all overlay panels. + mOverlayPanelManager.setDynamicResourceLoader(dynamicResourceLoader); + mTabModelSelectorTabObserver = new TabModelSelectorTabObserver(selector) { @Override public void onContentChanged(Tab tab) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/device/DeviceClassManager.java b/chrome/android/java/src/org/chromium/chrome/browser/device/DeviceClassManager.java index d1f37b6..6ad59ae 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/device/DeviceClassManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/device/DeviceClassManager.java
@@ -37,7 +37,6 @@ private boolean mEnablePrerendering; private boolean mEnableToolbarSwipe; private boolean mEnableToolbarSwipeInDocumentMode; - private boolean mEnableUndo; private boolean mDisableDomainReliability; private final boolean mEnableFullscreen; @@ -84,7 +83,6 @@ .hasSwitch(ChromeSwitches.ENABLE_ACCESSIBILITY_TAB_SWITCHER); mEnableFullscreen = !commandLine.hasSwitch(ChromeSwitches.DISABLE_FULLSCREEN); - mEnableUndo = commandLine.hasSwitch(ChromeSwitches.ENABLE_HIGH_END_UI_UNDO); mEnableToolbarSwipeInDocumentMode = commandLine.hasSwitch(ChromeSwitches.ENABLE_TOOLBAR_SWIPE_IN_DOCUMENT_MODE); @@ -92,10 +90,6 @@ if (mEnableAccessibilityLayout) { mEnableAnimations = false; } - - if (SysUtils.isLowEndDevice() || mEnableAccessibilityLayout) { - mEnableUndo = true; - } } /** @@ -151,13 +145,6 @@ } /** - * @return Whether or not undo is enabled. - */ - public static boolean enableUndo(Context context) { - return getInstance().mEnableUndo || isAccessibilityModeEnabled(context); - } - - /** * @return Whether or not to disable domain reliability. */ public static boolean disableDomainReliability() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/NotificationTransportControl.java b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/NotificationTransportControl.java index 4f1e1de..683f119f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/NotificationTransportControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/NotificationTransportControl.java
@@ -70,8 +70,9 @@ @Override public void onCreate() { - checkState(sInstance != null); - checkState(sInstance.mService == null); + // If Android recreates the service the state can be wrong, see + // https://crbug.com/555266 + if (sInstance == null || sInstance.mService != null) return; super.onCreate(); sInstance.mService = this; @@ -89,8 +90,7 @@ @Override public void onDestroy() { - checkState(sInstance != null); - checkState(sInstance.mService != null); + if (sInstance == null || sInstance.mService == null) return; stop(); sInstance.mService = null; } @@ -102,7 +102,11 @@ @Override public int onStartCommand(Intent intent, int flags, int startId) { - checkState(sInstance != null); + if (sInstance == null) { + stopSelf(); + return START_NOT_STICKY; + } + if (intent != null) { String action = intent.getAction(); if (action != null && action.startsWith(ACTION_PREFIX)) { @@ -333,19 +337,6 @@ } /** - * Ensures the truth of an expression involving the state of the calling instance, but not - * involving any parameters to the calling method. - * - * @param expression a boolean expression - * @throws IllegalStateException if {@code expression} is false - */ - private static void checkState(boolean expression) { - if (!expression) { - throw new IllegalStateException(); - } - } - - /** * Scale the specified bitmap to the desired with and height while preserving aspect ratio. */ private Bitmap scaleBitmap(Bitmap bitmap, int maxWidth, int maxHeight) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/undo/UndoBarPopupController.java b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/undo/UndoBarPopupController.java index 0fb67a0..a50683d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/undo/UndoBarPopupController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/undo/UndoBarPopupController.java
@@ -64,8 +64,7 @@ mContext = context; mTabModelObserver = new EmptyTabModelObserver() { private boolean disableUndo() { - return !DeviceClassManager.enableUndo(mContext) - || DeviceClassManager.isAccessibilityModeEnabled(mContext) + return DeviceClassManager.isAccessibilityModeEnabled(mContext) || DeviceClassManager.enableAccessibilityLayout(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java index 7869033..7442aa4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java
@@ -8,7 +8,6 @@ import org.chromium.base.ObserverList; import org.chromium.base.TraceEvent; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; -import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.partnercustomizations.HomepageManager; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator; @@ -234,8 +233,7 @@ @Override public boolean supportsPendingClosures() { - return !isIncognito() - && DeviceClassManager.enableUndo(ApplicationStatus.getApplicationContext()); + return !isIncognito(); } @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/UndoIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/UndoIntegrationTest.java index 65323cca..c985c0c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/UndoIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/UndoIntegrationTest.java
@@ -8,11 +8,9 @@ import android.test.suitebuilder.annotation.LargeTest; -import org.chromium.base.CommandLine; import org.chromium.base.ThreadUtils; import org.chromium.base.test.util.Restriction; import org.chromium.base.test.util.UrlUtils; -import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.snackbar.SnackbarManager; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelUtils; @@ -44,7 +42,6 @@ @Override public void startMainActivity() throws InterruptedException { - CommandLine.getInstance().appendSwitch(ChromeSwitches.ENABLE_HIGH_END_UI_UNDO); SnackbarManager.setDurationForTesting(1500); startMainActivityOnBlankPage(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java index 1a91bc2..f464f09 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java
@@ -9,8 +9,6 @@ import android.util.SparseArray; import org.chromium.base.ThreadUtils; -import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.TabState; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator; @@ -443,7 +441,6 @@ * Tests that a real {@link TabModelImpl} will use the {@link TabPersistentStore} to write out * an updated metadata file when a closure is undone. */ - @CommandLineFlags.Add(ChromeSwitches.ENABLE_HIGH_END_UI_UNDO) @SmallTest public void testUndoSingleTabClosureWritesTabListFile() throws Exception { TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V5_NO_M18; @@ -470,7 +467,6 @@ * valid a valid metadata file and the TabModel's associated TabStates after closing and * canceling the closure of all the tabs simultaneously. */ - @CommandLineFlags.Add(ChromeSwitches.ENABLE_HIGH_END_UI_UNDO) @SmallTest public void testUndoCloseAllTabsWritesTabListFile() throws Exception { final TabModelMetaDataInfo info = TestTabModelDirectory.TAB_MODEL_METADATA_V5_NO_M18;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java index d843f53..411d57b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java
@@ -6,9 +6,7 @@ import android.test.suitebuilder.annotation.MediumTest; -import org.chromium.base.CommandLine; import org.chromium.base.ThreadUtils; -import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModel.TabLaunchType; import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType; @@ -26,7 +24,6 @@ @Override public void startMainActivity() throws InterruptedException { - CommandLine.getInstance().appendSwitch(ChromeSwitches.ENABLE_HIGH_END_UI_UNDO); startMainActivityOnBlankPage(); }
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index 981180c..dc60b6f9 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -1049,6 +1049,20 @@ Volume slider </message> +<!-- Audio Player --> + <message name="IDS_AUDIO_PLAYER_SHUFFLE_BUTTON_LABEL" desc="Label for the Shuffle button of audio player."> + Shuffle + </message> + <message name="IDS_AUDIO_PLAYER_REPEAT_BUTTON_LABEL" desc="Label for the Repeat button of audio player"> + Repeat + </message> + <message name="IDS_AUDIO_PLAYER_OPEN_VOLUME_SLIDER_BUTTON_LABEL" desc="Label for a button which is used to open volume slider in audio player."> + Open volume slider + </message> + <message name="IDS_AUDIO_PLAYER_OPEN_PLAY_LIST_BUTTON_LABEL" desc="Label for a button which is used to open play list in audio player."> + Open play list + </message> + <!-- Video Player --> <message name="IDS_VIDEO_PLAYER_PLAY_THIS_COMPUTER" desc="In the video player app, message of menu item which is shown at the top of the list of Chromecasts. This menuitem is to play the video on this computer (locally), intead of on TVs with Chromecast."> This computer
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 2947e73..1d5e9e3 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -1941,8 +1941,8 @@ Keep anyway </message> <message name="IDS_CONFIRM_DOWNLOAD_AGAIN_MALICIOUS" - desc="The text for the button used to confirm that the user DOES want to keep malware. Don't translate the English string literally; for translations, translate 'Recover anyway'"> - Hurt me plenty + desc="The text for the button used to confirm that the user DOES want to keep malware."> + Recover anyway </message> <message name="IDS_CONFIRM_CANCEL_AGAIN_MALICIOUS" desc="Text for the button used to indicate that the user does NOT want to restore a malicious download.">
diff --git a/chrome/app/theme/material_100_percent/common/ash/otr_icon.png b/chrome/app/theme/material_100_percent/common/ash/otr_icon.png deleted file mode 100644 index e5266ba..0000000 --- a/chrome/app/theme/material_100_percent/common/ash/otr_icon.png +++ /dev/null Binary files differ
diff --git a/chrome/app/theme/material_100_percent/common/otr_icon.png b/chrome/app/theme/material_100_percent/common/otr_icon.png deleted file mode 100644 index e5266ba..0000000 --- a/chrome/app/theme/material_100_percent/common/otr_icon.png +++ /dev/null Binary files differ
diff --git a/chrome/app/theme/material_200_percent/common/ash/otr_icon.png b/chrome/app/theme/material_200_percent/common/ash/otr_icon.png deleted file mode 100644 index 4847aae..0000000 --- a/chrome/app/theme/material_200_percent/common/ash/otr_icon.png +++ /dev/null Binary files differ
diff --git a/chrome/app/theme/material_200_percent/common/otr_icon.png b/chrome/app/theme/material_200_percent/common/otr_icon.png deleted file mode 100644 index 4847aae..0000000 --- a/chrome/app/theme/material_200_percent/common/otr_icon.png +++ /dev/null Binary files differ
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd index c39d828..a6461122 100644 --- a/chrome/app/theme/theme_resources.grd +++ b/chrome/app/theme/theme_resources.grd
@@ -542,9 +542,7 @@ <structure type="chrome_scaled_image" name="IDR_OMNIBOX_TTS" file="common/omnibox_tts.png" /> <structure type="chrome_scaled_image" name="IDR_OMNIBOX_TTS_SELECTED" file="common/omnibox_tts_selected.png" /> <if expr="toolkit_views and not is_macosx"> - <!-- In Material Design the Ash image is the same as the common one, so - once that mode is always on, these should be collapsed and the - duplicate image removed from the tree. --> + <!-- This image is not used in Material Design and can be removed when that mode is default. --> <if expr="not use_ash"> <structure type="chrome_scaled_image" name="IDR_OTR_ICON" file="common/otr_icon.png" /> </if>
diff --git a/chrome/browser/after_startup_task_utils.cc b/chrome/browser/after_startup_task_utils.cc index a551046..85fe849 100644 --- a/chrome/browser/after_startup_task_utils.cc +++ b/chrome/browser/after_startup_task_utils.cc
@@ -207,6 +207,10 @@ QueueTask(queued_task.Pass()); } +void AfterStartupTaskUtils::SetBrowserStartupIsCompleteForTesting() { + ::SetBrowserStartupIsComplete(); +} + void AfterStartupTaskUtils::SetBrowserStartupIsComplete() { ::SetBrowserStartupIsComplete(); }
diff --git a/chrome/browser/after_startup_task_utils.h b/chrome/browser/after_startup_task_utils.h index 967de140..83576700 100644 --- a/chrome/browser/after_startup_task_utils.h +++ b/chrome/browser/after_startup_task_utils.h
@@ -7,11 +7,8 @@ #include "base/basictypes.h" #include "base/bind.h" -#include "base/gtest_prod_util.h" #include "base/memory/ref_counted.h" -class ExtensionServiceTest; - namespace android { class AfterStartupTaskUtilsJNI; } @@ -40,16 +37,19 @@ // PostTask() API instead. static bool IsBrowserStartupComplete(); + // For use by unit tests where we don't have normal content loading + // infrastructure and thus StartMonitoringStartup() is unsuitable. + static void SetBrowserStartupIsCompleteForTesting(); + + static void UnsafeResetForTesting(); + private: - friend class AfterStartupTaskTest; + // TODO(wkorman): Look into why Android calls + // SetBrowserStartupIsComplete() directly. Ideally it would use + // StartMonitoringStartup() as the normal approach. friend class android::AfterStartupTaskUtilsJNI; - friend class ::ExtensionServiceTest; - friend class InProcessBrowserTest; - FRIEND_TEST_ALL_PREFIXES(AfterStartupTaskTest, IsStartupComplete); - FRIEND_TEST_ALL_PREFIXES(AfterStartupTaskTest, PostTask); static void SetBrowserStartupIsComplete(); - static void UnsafeResetForTesting(); DISALLOW_IMPLICIT_CONSTRUCTORS(AfterStartupTaskUtils); };
diff --git a/chrome/browser/after_startup_task_utils_unittest.cc b/chrome/browser/after_startup_task_utils_unittest.cc index adc5dba..5d51db4c 100644 --- a/chrome/browser/after_startup_task_utils_unittest.cc +++ b/chrome/browser/after_startup_task_utils_unittest.cc
@@ -139,7 +139,7 @@ // the DCHECK in CancellationFlag::Set(). EXPECT_FALSE(GetIsBrowserStartupCompleteFromDBThread()); EXPECT_FALSE(AfterStartupTaskUtils::IsBrowserStartupComplete()); - AfterStartupTaskUtils::SetBrowserStartupIsComplete(); + AfterStartupTaskUtils::SetBrowserStartupIsCompleteForTesting(); EXPECT_TRUE(AfterStartupTaskUtils::IsBrowserStartupComplete()); EXPECT_TRUE(GetIsBrowserStartupCompleteFromDBThread()); } @@ -167,7 +167,7 @@ EXPECT_EQ(0, db_thread_->total_task_count() + ui_thread_->total_task_count()); // Queued tasks should be posted upon setting the flag. - AfterStartupTaskUtils::SetBrowserStartupIsComplete(); + AfterStartupTaskUtils::SetBrowserStartupIsCompleteForTesting(); EXPECT_EQ(2, db_thread_->posted_task_count()); EXPECT_EQ(2, ui_thread_->posted_task_count()); FlushDBThread();
diff --git a/chrome/browser/android/data_usage/data_use_tab_model.cc b/chrome/browser/android/data_usage/data_use_tab_model.cc index 724f890..bfbebad 100644 --- a/chrome/browser/android/data_usage/data_use_tab_model.cc +++ b/chrome/browser/android/data_usage/data_use_tab_model.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/android/data_usage/data_use_tab_model.h" +#include "base/metrics/histogram_macros.h" #include "base/strings/string_number_conversions.h" #include "base/time/time.h" #include "chrome/browser/android/data_usage/external_data_use_observer.h" @@ -16,6 +17,13 @@ // about. May be overridden by the field trial. const size_t kDefaultMaxTabEntries = 200; +const char kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram[] = + "DataUse.TabModel.ExpiredInactiveTabEntryRemovalDuration"; +const char kUMAExpiredActiveTabEntryRemovalDurationHoursHistogram[] = + "DataUse.TabModel.ExpiredActiveTabEntryRemovalDuration"; +const char kUMAUnexpiredTabEntryRemovalDurationMinutesHistogram[] = + "DataUse.TabModel.UnexpiredTabEntryRemovalDuration"; + // Returns true if |tab_id| is a valid tab ID. bool IsValidTabID(int32_t tab_id) { return tab_id >= 0; @@ -151,6 +159,10 @@ observer_list_->RemoveObserver(observer); } +base::TimeTicks DataUseTabModel::Now() const { + return base::TimeTicks::Now(); +} + void DataUseTabModel::NotifyObserversOfTrackingStarting(int32_t tab_id) { observer_list_->Notify(FROM_HERE, &TabDataUseObserver::NotifyTrackingStarting, tab_id); @@ -194,10 +206,26 @@ // Remove expired tab entries. for (TabEntryMap::iterator tab_entry_iterator = active_tabs_.begin(); tab_entry_iterator != active_tabs_.end();) { - if (tab_entry_iterator->second.IsExpired()) + const auto& tab_entry = tab_entry_iterator->second; + if (tab_entry.IsExpired()) { + // Track the lifetime of expired tab entry. + const base::TimeDelta removal_time = + Now() - tab_entry.GetLatestStartOrEndTime(); + if (!tab_entry.IsTrackingDataUse()) { + UMA_HISTOGRAM_CUSTOM_TIMES( + kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram, + removal_time, base::TimeDelta::FromSeconds(1), + base::TimeDelta::FromHours(1), 50); + } else { + UMA_HISTOGRAM_CUSTOM_TIMES( + kUMAExpiredActiveTabEntryRemovalDurationHoursHistogram, + removal_time, base::TimeDelta::FromHours(1), + base::TimeDelta::FromDays(5), 50); + } active_tabs_.erase(tab_entry_iterator++); - else + } else { ++tab_entry_iterator; + } } if (active_tabs_.size() <= max_tab_entries_) @@ -215,6 +243,10 @@ } } DCHECK(oldest_tab_entry_iterator != active_tabs_.end()); + UMA_HISTOGRAM_CUSTOM_TIMES( + kUMAUnexpiredTabEntryRemovalDurationMinutesHistogram, + Now() - oldest_tab_entry_iterator->second.GetLatestStartOrEndTime(), + base::TimeDelta::FromMinutes(1), base::TimeDelta::FromHours(1), 50); active_tabs_.erase(oldest_tab_entry_iterator); } }
diff --git a/chrome/browser/android/data_usage/data_use_tab_model.h b/chrome/browser/android/data_usage/data_use_tab_model.h index d5635e1..2420de1 100644 --- a/chrome/browser/android/data_usage/data_use_tab_model.h +++ b/chrome/browser/android/data_usage/data_use_tab_model.h
@@ -16,6 +16,7 @@ #include "base/memory/weak_ptr.h" #include "base/observer_list_threadsafe.h" #include "base/threading/thread_checker.h" +#include "base/time/time.h" #include "chrome/browser/android/data_usage/tab_data_use_entry.h" #include "components/data_usage/core/data_use.h" #include "url/gurl.h" @@ -126,9 +127,18 @@ FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, OnTrackingLabelRemoved); FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit); + FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, + UnexpiredTabEntryRemovaltimeHistogram); + FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, + ExpiredInactiveTabEntryRemovaltimeHistogram); + FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, + ExpiredActiveTabEntryRemovaltimeHistogram); typedef base::hash_map<int32_t, TabDataUseEntry> TabEntryMap; + // Virtualized for unit test support. + virtual base::TimeTicks Now() const; + // Notifies the observers that a data usage tracking session started for // |tab_id|. void NotifyObserversOfTrackingStarting(int32_t tab_id);
diff --git a/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc b/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc index ebe702ab..baef615 100644 --- a/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc +++ b/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc
@@ -9,7 +9,9 @@ #include <string> #include "base/message_loop/message_loop.h" +#include "base/single_thread_task_runner.h" #include "base/strings/stringprintf.h" +#include "base/test/histogram_tester.h" #include "base/time/time.h" #include "chrome/browser/android/data_usage/external_data_use_observer.h" #include "chrome/browser/android/data_usage/tab_data_use_entry.h" @@ -42,34 +44,60 @@ namespace android { -class DataUseTabModelTest : public testing::Test { +// Test version of |DataUseTabModel|, which permits overriding of calls to Now. +class DataUseTabModelNowTest : public DataUseTabModel { public: - DataUseTabModelTest() : data_use_tab_model_(nullptr, task_runner_.get()) { - // TODO(rajendrant): Create a mock class for ExternalDataUseObserver to - // spoof the Matches call and test the OnNavigationEvent. + DataUseTabModelNowTest( + const ExternalDataUseObserver* data_use_observer, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) + : DataUseTabModel(data_use_observer, ui_task_runner) {} + + ~DataUseTabModelNowTest() override {} + + void AdvanceTime(base::TimeDelta now_offset) { now_offset_ = now_offset; } + + private: + // Returns the current time advanced by |now_offset_|. + base::TimeTicks Now() const override { + return base::TimeTicks::Now() + now_offset_; } - void SetUp() override {} + // Represents the delta offset to be added to current time that is returned by + // Now. + base::TimeDelta now_offset_; +}; + +class DataUseTabModelTest : public testing::Test { + public: + DataUseTabModelTest() {} + + protected: + void SetUp() override { + // TODO(rajendrant): Create a mock class for ExternalDataUseObserver to + // spoof the Matches call and test the OnNavigationEvent. + data_use_tab_model_.reset( + new DataUseTabModelNowTest(nullptr, task_runner_.get())); + } base::SingleThreadTaskRunner* task_runner() { return task_runner_.get(); } // Returns true if tab entry for |tab_id| exists in |active_tabs_|. bool IsTabEntryExists(int32_t tab_id) const { - return data_use_tab_model_.active_tabs_.find(tab_id) != - data_use_tab_model_.active_tabs_.end(); + return data_use_tab_model_->active_tabs_.find(tab_id) != + data_use_tab_model_->active_tabs_.end(); } // Checks if there are |expected_size| tab entries being tracked in // |active_tabs_|. void ExpectTabEntrySize(uint32_t expected_size) const { - EXPECT_EQ(expected_size, data_use_tab_model_.active_tabs_.size()); + EXPECT_EQ(expected_size, data_use_tab_model_->active_tabs_.size()); } // Returns true if the tracking session for tab with id |tab_id| is currently // active. bool IsTrackingDataUse(int32_t tab_id) const { - auto tab_entry_iterator = data_use_tab_model_.active_tabs_.find(tab_id); - if (tab_entry_iterator == data_use_tab_model_.active_tabs_.end()) + auto tab_entry_iterator = data_use_tab_model_->active_tabs_.find(tab_id); + if (tab_entry_iterator == data_use_tab_model_->active_tabs_.end()) return false; return tab_entry_iterator->second.IsTrackingDataUse(); } @@ -110,13 +138,21 @@ std::string(), 1000, 1000); std::string actual_label; bool actual_return = - data_use_tab_model_.GetLabelForDataUse(data_use, &actual_label); + data_use_tab_model_->GetLabelForDataUse(data_use, &actual_label); EXPECT_EQ(expected_return, actual_return); EXPECT_EQ(expected_label, actual_label); } + void StartTrackingDataUse(int32_t tab_id, const std::string& label) { + data_use_tab_model_->StartTrackingDataUse(tab_id, label); + } + + void EndTrackingDataUse(int32_t tab_id) { + data_use_tab_model_->EndTrackingDataUse(tab_id); + } + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; - DataUseTabModel data_use_tab_model_; + scoped_ptr<DataUseTabModelNowTest> data_use_tab_model_; base::MessageLoop message_loop_; }; @@ -136,14 +172,14 @@ ExpectEmptyDataUseLabel(kTabID1); ExpectEmptyDataUseLabel(kTabID2); - data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); + StartTrackingDataUse(kTabID1, kTestLabel1); ExpectTabEntrySize(TabEntrySize::ONE); EXPECT_TRUE(IsTrackingDataUse(kTabID1)); ExpectDataUseLabel(kTabID1, kTestLabel1); ExpectEmptyDataUseLabel(kTabID2); - data_use_tab_model_.EndTrackingDataUse(kTabID1); + EndTrackingDataUse(kTabID1); ExpectTabEntrySize(TabEntrySize::ONE); EXPECT_FALSE(IsTrackingDataUse(kTabID1)); } @@ -156,9 +192,9 @@ ExpectEmptyDataUseLabel(kTabID2); ExpectEmptyDataUseLabel(kTabID3); - data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); - data_use_tab_model_.StartTrackingDataUse(kTabID2, kTestLabel2); - data_use_tab_model_.StartTrackingDataUse(kTabID3, kTestLabel3); + StartTrackingDataUse(kTabID1, kTestLabel1); + StartTrackingDataUse(kTabID2, kTestLabel2); + StartTrackingDataUse(kTabID3, kTestLabel3); ExpectTabEntrySize(TabEntrySize::THREE); EXPECT_TRUE(IsTrackingDataUse(kTabID1)); @@ -168,9 +204,9 @@ ExpectDataUseLabel(kTabID2, kTestLabel2); ExpectDataUseLabel(kTabID3, kTestLabel3); - data_use_tab_model_.EndTrackingDataUse(kTabID1); - data_use_tab_model_.EndTrackingDataUse(kTabID2); - data_use_tab_model_.EndTrackingDataUse(kTabID3); + EndTrackingDataUse(kTabID1); + EndTrackingDataUse(kTabID2); + EndTrackingDataUse(kTabID3); ExpectTabEntrySize(TabEntrySize::THREE); EXPECT_FALSE(IsTrackingDataUse(kTabID1)); EXPECT_FALSE(IsTrackingDataUse(kTabID2)); @@ -192,9 +228,9 @@ EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1); EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1); - data_use_tab_model_.AddObserver(&mock_observer); - data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); - data_use_tab_model_.EndTrackingDataUse(kTabID1); + data_use_tab_model_->AddObserver(&mock_observer); + StartTrackingDataUse(kTabID1, kTestLabel1); + EndTrackingDataUse(kTabID1); message_loop_.RunUntilIdle(); } @@ -206,7 +242,7 @@ for (auto& mock_observer : mock_observers) { // Add the observer. - data_use_tab_model_.AddObserver(&mock_observer); + data_use_tab_model_->AddObserver(&mock_observer); // Expect start and end events for tab ids 1-3. EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1); @@ -218,12 +254,12 @@ } // Start and end tracking for tab ids 1-3. - data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); - data_use_tab_model_.StartTrackingDataUse(kTabID2, kTestLabel2); - data_use_tab_model_.StartTrackingDataUse(kTabID3, kTestLabel3); - data_use_tab_model_.EndTrackingDataUse(kTabID1); - data_use_tab_model_.EndTrackingDataUse(kTabID2); - data_use_tab_model_.EndTrackingDataUse(kTabID3); + StartTrackingDataUse(kTabID1, kTestLabel1); + StartTrackingDataUse(kTabID2, kTestLabel2); + StartTrackingDataUse(kTabID3, kTestLabel3); + EndTrackingDataUse(kTabID1); + EndTrackingDataUse(kTabID2); + EndTrackingDataUse(kTabID3); message_loop_.RunUntilIdle(); } @@ -237,9 +273,9 @@ EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1); EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1); - data_use_tab_model_.AddObserver(&mock_observer); - data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); - data_use_tab_model_.EndTrackingDataUse(kTabID1); + data_use_tab_model_->AddObserver(&mock_observer); + StartTrackingDataUse(kTabID1, kTestLabel1); + EndTrackingDataUse(kTabID1); message_loop_.RunUntilIdle(); testing::Mock::VerifyAndClear(&mock_observer); @@ -248,35 +284,35 @@ EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(0); EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(0); - data_use_tab_model_.RemoveObserver(&mock_observer); - data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); - data_use_tab_model_.EndTrackingDataUse(kTabID1); + data_use_tab_model_->RemoveObserver(&mock_observer); + StartTrackingDataUse(kTabID1, kTestLabel1); + EndTrackingDataUse(kTabID1); message_loop_.RunUntilIdle(); } // Checks that tab close event updates the close time of the tab entry. TEST_F(DataUseTabModelTest, TabCloseEvent) { - data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); - data_use_tab_model_.EndTrackingDataUse(kTabID1); + StartTrackingDataUse(kTabID1, kTestLabel1); + EndTrackingDataUse(kTabID1); ExpectTabEntrySize(TabEntrySize::ONE); EXPECT_TRUE( - data_use_tab_model_.active_tabs_[kTabID1].tab_close_time_.is_null()); + data_use_tab_model_->active_tabs_[kTabID1].tab_close_time_.is_null()); - data_use_tab_model_.OnTabCloseEvent(kTabID1); + data_use_tab_model_->OnTabCloseEvent(kTabID1); ExpectTabEntrySize(TabEntrySize::ONE); EXPECT_FALSE( - data_use_tab_model_.active_tabs_[kTabID1].tab_close_time_.is_null()); + data_use_tab_model_->active_tabs_[kTabID1].tab_close_time_.is_null()); } // Checks that tab close event ends the active tracking session for the tab. TEST_F(DataUseTabModelTest, TabCloseEventEndsTracking) { - data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); + StartTrackingDataUse(kTabID1, kTestLabel1); EXPECT_TRUE(IsTrackingDataUse(kTabID1)); - data_use_tab_model_.OnTabCloseEvent(kTabID1); + data_use_tab_model_->OnTabCloseEvent(kTabID1); EXPECT_FALSE(IsTrackingDataUse(kTabID1)); // Future data use object should be labeled as an empty string. @@ -288,10 +324,10 @@ TEST_F(DataUseTabModelTest, OnTrackingLabelRemoved) { MockTabDataUseObserver mock_observer; - data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); - data_use_tab_model_.StartTrackingDataUse(kTabID2, kTestLabel2); - data_use_tab_model_.StartTrackingDataUse(kTabID3, kTestLabel3); - data_use_tab_model_.AddObserver(&mock_observer); + StartTrackingDataUse(kTabID1, kTestLabel1); + StartTrackingDataUse(kTabID2, kTestLabel2); + StartTrackingDataUse(kTabID3, kTestLabel3); + data_use_tab_model_->AddObserver(&mock_observer); ExpectTabEntrySize(TabEntrySize::THREE); EXPECT_TRUE(IsTrackingDataUse(kTabID1)); @@ -301,7 +337,7 @@ // Observer notified of end tracking. EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID2)).Times(1); - data_use_tab_model_.OnTrackingLabelRemoved(kTestLabel2); + data_use_tab_model_->OnTrackingLabelRemoved(kTestLabel2); message_loop_.RunUntilIdle(); EXPECT_TRUE(IsTrackingDataUse(kTabID1)); @@ -310,7 +346,7 @@ EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID3)).Times(1); - data_use_tab_model_.OnTrackingLabelRemoved(kTestLabel3); + data_use_tab_model_->OnTrackingLabelRemoved(kTestLabel3); message_loop_.RunUntilIdle(); EXPECT_TRUE(IsTrackingDataUse(kTabID1)); @@ -321,15 +357,15 @@ // Checks that |active_tabs_| does not grow beyond GetMaxTabEntriesForTests tab // entries. TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) { - const size_t max_tab_entries = data_use_tab_model_.max_tab_entries_; + const size_t max_tab_entries = data_use_tab_model_->max_tab_entries_; uint32_t tab_id = 1; ExpectTabEntrySize(TabEntrySize::ZERO); while (tab_id <= max_tab_entries) { - std::string tab_label = base::StringPrintf("track_label_%d", tab_id); - data_use_tab_model_.StartTrackingDataUse(tab_id, tab_label); - data_use_tab_model_.EndTrackingDataUse(tab_id); + std::string tab_label = base::StringPrintf("label_%d", tab_id); + StartTrackingDataUse(tab_id, tab_label); + EndTrackingDataUse(tab_id); ExpectTabEntrySize(tab_id); ++tab_id; @@ -342,8 +378,8 @@ while (tab_id < max_tab_entries + 10) { EXPECT_TRUE(IsTabEntryExists(oldest_tab_id)); std::string tab_label = base::StringPrintf("label_%d", tab_id); - data_use_tab_model_.StartTrackingDataUse(tab_id, tab_label); - data_use_tab_model_.EndTrackingDataUse(tab_id); + StartTrackingDataUse(tab_id, tab_label); + EndTrackingDataUse(tab_id); // Oldest entry got removed. EXPECT_FALSE(IsTabEntryExists(oldest_tab_id)); @@ -358,7 +394,7 @@ while (tab_id < max_tab_entries + 20) { EXPECT_TRUE(IsTabEntryExists(oldest_tab_id)); std::string tab_label = base::StringPrintf("label_%d", tab_id); - data_use_tab_model_.StartTrackingDataUse(tab_id, tab_label); + StartTrackingDataUse(tab_id, tab_label); // Oldest entry got removed. EXPECT_FALSE(IsTabEntryExists(oldest_tab_id)); @@ -369,6 +405,66 @@ } } +TEST_F(DataUseTabModelTest, ExpiredInactiveTabEntryRemovaltimeHistogram) { + const char kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram[] = + "DataUse.TabModel.ExpiredInactiveTabEntryRemovalDuration"; + base::HistogramTester histogram_tester; + + StartTrackingDataUse(kTabID1, kTestLabel1); + EndTrackingDataUse(kTabID1); + EXPECT_FALSE(IsTrackingDataUse(kTabID1)); + data_use_tab_model_->OnTabCloseEvent(kTabID1); + + // Fake tab close time to make it as expired. + EXPECT_TRUE(IsTabEntryExists(kTabID1)); + auto& tab_entry = data_use_tab_model_->active_tabs_[kTabID1]; + EXPECT_FALSE(tab_entry.tab_close_time_.is_null()); + tab_entry.tab_close_time_ -= tab_entry.closed_tab_expiration_duration_ + + base::TimeDelta::FromSeconds(1); + EXPECT_TRUE(tab_entry.IsExpired()); + + // Fast forward 50 seconds. + data_use_tab_model_->AdvanceTime(base::TimeDelta::FromSeconds(50)); + + data_use_tab_model_->CompactTabEntries(); + EXPECT_FALSE(IsTabEntryExists(kTabID1)); + + histogram_tester.ExpectTotalCount( + kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram, 1); + histogram_tester.ExpectBucketCount( + kUMAExpiredInactiveTabEntryRemovalDurationSecondsHistogram, + base::TimeDelta::FromSeconds(50).InMilliseconds(), 1); +} + +TEST_F(DataUseTabModelTest, UnexpiredTabEntryRemovaltimeHistogram) { + const char kUMAUnexpiredTabEntryRemovalDurationMinutesHistogram[] = + "DataUse.TabModel.UnexpiredTabEntryRemovalDuration"; + base::HistogramTester histogram_tester; + const size_t max_tab_entries = data_use_tab_model_->max_tab_entries_; + uint32_t tab_id = 1; + + while (tab_id <= max_tab_entries) { + std::string tab_label = base::StringPrintf("label_%d", tab_id); + StartTrackingDataUse(tab_id, tab_label); + EndTrackingDataUse(tab_id); + ++tab_id; + } + + // Fast forward 10 minutes. + data_use_tab_model_->AdvanceTime(base::TimeDelta::FromMinutes(10)); + + // Adding another tab entry triggers CompactTabEntries. + std::string tab_label = base::StringPrintf("label_%d", tab_id); + StartTrackingDataUse(tab_id, tab_label); + EndTrackingDataUse(tab_id); + + histogram_tester.ExpectTotalCount( + kUMAUnexpiredTabEntryRemovalDurationMinutesHistogram, 1); + histogram_tester.ExpectBucketCount( + kUMAUnexpiredTabEntryRemovalDurationMinutesHistogram, + base::TimeDelta::FromMinutes(10).InMilliseconds(), 1); +} + } // namespace android } // namespace chrome
diff --git a/chrome/browser/android/data_usage/external_data_use_observer.cc b/chrome/browser/android/data_usage/external_data_use_observer.cc index 23ecc6dd..65283e0 100644 --- a/chrome/browser/android/data_usage/external_data_use_observer.cc +++ b/chrome/browser/android/data_usage/external_data_use_observer.cc
@@ -199,7 +199,6 @@ void ExternalDataUseObserver::OnReportDataUseDoneOnIOThread(bool success) { DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(!buffered_data_reports_.empty()); DCHECK(submit_data_report_pending_); // TODO(tbansal): If not successful, record UMA. @@ -386,10 +385,29 @@ if (!gurl.is_valid() || gurl.is_empty()) return false; - for (size_t i = 0; i < matching_rules_.size(); ++i) { - const re2::RE2* pattern = matching_rules_[i]->pattern(); + for (const auto* matching_rule : matching_rules_) { + const re2::RE2* pattern = matching_rule->pattern(); if (re2::RE2::FullMatch(gurl.spec(), *pattern)) { - *label = matching_rules_[i]->label(); + *label = matching_rule->label(); + return true; + } + } + + return false; +} + +bool ExternalDataUseObserver::MatchesAppPackageName( + const std::string& app_package_name, + std::string* label) const { + DCHECK(thread_checker_.CalledOnValidThread()); + *label = ""; + + if (app_package_name.empty()) + return false; + + for (const auto* matching_rule : matching_rules_) { + if (app_package_name == matching_rule->app_package_name()) { + *label = matching_rule->label(); return true; } } @@ -450,6 +468,11 @@ return pattern_.get(); } +const std::string& ExternalDataUseObserver::MatchingRule::app_package_name() + const { + return app_package_name_; +} + const std::string& ExternalDataUseObserver::MatchingRule::label() const { return label_; }
diff --git a/chrome/browser/android/data_usage/external_data_use_observer.h b/chrome/browser/android/data_usage/external_data_use_observer.h index 86706c5..deecd5da 100644 --- a/chrome/browser/android/data_usage/external_data_use_observer.h +++ b/chrome/browser/android/data_usage/external_data_use_observer.h
@@ -91,6 +91,12 @@ // matching rule's label. bool Matches(const GURL& gurl, std::string* label) const; + // Returns true if the |app_package_name| matches the registered package + // names. |label| must not be null. If a match is found, the |label| is set + // to the matching rule's label. + bool MatchesAppPackageName(const std::string& app_package_name, + std::string* label) const; + DataUseTabModel* data_use_tab_model() const { return data_use_tab_model_.get(); } @@ -183,6 +189,7 @@ ~MatchingRule(); const re2::RE2* pattern() const; + const std::string& app_package_name() const; const std::string& label() const; private:
diff --git a/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc b/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc index 844a260..36d58732 100644 --- a/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc +++ b/chrome/browser/android/data_usage/external_data_use_observer_unittest.cc
@@ -106,6 +106,7 @@ std::string label("test"); for (size_t i = 0; i < arraysize(tests); ++i) { external_data_use_observer()->RegisterURLRegexes( + // App package name not specified in the matching rule. std::vector<std::string>(1, std::string()), std::vector<std::string>(1, tests[i].regex), std::vector<std::string>(1, "label")); @@ -119,6 +120,14 @@ expected_label = "label"; EXPECT_EQ(expected_label, label); + EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( + "com.example.helloworld", &label)) + << i; + // Empty package name should not match against empty package name in the + // matching rule. + EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( + std::string(), &label)) + << i; } } @@ -158,16 +167,25 @@ {"https://www.google.com", "http://www.google.com", "", false}, }; - std::string label; + std::string got_label; for (size_t i = 0; i < arraysize(tests); ++i) { std::vector<std::string> url_regexes; url_regexes.push_back(tests[i].regex1 + "|" + tests[i].regex2); + const std::string label("label"); external_data_use_observer()->RegisterURLRegexes( - std::vector<std::string>(url_regexes.size(), std::string()), - url_regexes, std::vector<std::string>(url_regexes.size(), "label")); - EXPECT_EQ(tests[i].expect_match, - external_data_use_observer()->Matches(GURL(tests[i].url), &label)) + std::vector<std::string>(url_regexes.size(), "com.example.helloworld"), + url_regexes, std::vector<std::string>(url_regexes.size(), label)); + EXPECT_EQ(tests[i].expect_match, external_data_use_observer()->Matches( + GURL(tests[i].url), &got_label)) << i; + const std::string expected_label = + tests[i].expect_match ? label : std::string(); + EXPECT_EQ(got_label, expected_label); + + EXPECT_TRUE(external_data_use_observer()->MatchesAppPackageName( + "com.example.helloworld", &got_label)) + << i; + EXPECT_EQ(label, got_label); } } @@ -466,7 +484,8 @@ ->second.end_time.ToJavaTime()); } -// Tests the behavior when multiple matching rules are available. +// Tests the behavior when multiple matching rules are available for URL and +// package name matching. TEST_F(ExternalDataUseObserverTest, MultipleMatchingRules) { std::vector<std::string> url_regexes; url_regexes.push_back( @@ -480,9 +499,14 @@ labels.push_back(label_foo); labels.push_back(label_bar); + std::vector<std::string> app_package_names; + const std::string app_foo("com.example.foo"); + const std::string app_bar("com.example.bar"); + app_package_names.push_back(app_foo); + app_package_names.push_back(app_bar); + external_data_use_observer()->FetchMatchingRulesDoneOnIOThread( - std::vector<std::string>(url_regexes.size(), std::string()), url_regexes, - labels); + app_package_names, url_regexes, labels); EXPECT_EQ(0U, external_data_use_observer()->buffered_data_reports_.size()); EXPECT_FALSE(external_data_use_observer()->submit_data_report_pending_); EXPECT_FALSE(external_data_use_observer()->matching_rules_fetch_pending_); @@ -526,6 +550,26 @@ EXPECT_EQ(label_bar, it.first.label); EXPECT_EQ("mccmnc", it.first.mcc_mnc); } + + // Test if labels are matched properly for app package names. + std::string got_label; + EXPECT_TRUE( + external_data_use_observer()->MatchesAppPackageName(app_foo, &got_label)); + EXPECT_EQ(label_foo, got_label); + + got_label = ""; + EXPECT_TRUE( + external_data_use_observer()->MatchesAppPackageName(app_bar, &got_label)); + EXPECT_EQ(label_bar, got_label); + + got_label = ""; + EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( + "com.example.unmatched", &got_label)); + EXPECT_EQ(std::string(), got_label); + + EXPECT_FALSE(external_data_use_observer()->MatchesAppPackageName( + std::string(), &got_label)); + EXPECT_EQ(std::string(), got_label); } // Tests that hash function reports distinct values. This test may fail if there
diff --git a/chrome/browser/android/data_usage/tab_data_use_entry.cc b/chrome/browser/android/data_usage/tab_data_use_entry.cc index a6e0cc5..356adca 100644 --- a/chrome/browser/android/data_usage/tab_data_use_entry.cc +++ b/chrome/browser/android/data_usage/tab_data_use_entry.cc
@@ -6,6 +6,7 @@ #include "base/gtest_prod_util.h" #include "base/macros.h" +#include "base/metrics/histogram_macros.h" #include "base/strings/string_number_conversions.h" #include "chrome/browser/android/data_usage/external_data_use_observer.h" #include "components/variations/variations_associated_data.h" @@ -24,6 +25,11 @@ const unsigned int kDefaultOpenTabExpirationDurationSeconds = 60 * 60 * 24 * 5; // 5 days. +const char kUMATrackingSessionLifetimeSecondsHistogram[] = + "DataUse.TabModel.TrackingSessionLifetime"; +const char kUMAOldInactiveSessionRemovalDurationSecondsHistogram[] = + "DataUse.TabModel.OldInactiveSessionRemovalDuration"; + // Returns various parameters from the values specified in the field trial. size_t GetMaxSessionsPerTab() { size_t max_sessions_per_tab = -1; @@ -110,6 +116,12 @@ return false; back_iterator->end_time = Now(); + + UMA_HISTOGRAM_CUSTOM_TIMES( + kUMATrackingSessionLifetimeSecondsHistogram, + back_iterator->end_time - back_iterator->start_time, + base::TimeDelta::FromSeconds(1), base::TimeDelta::FromHours(1), 50); + return true; } @@ -135,8 +147,6 @@ const base::TimeTicks latest_session_time = GetLatestStartOrEndTime(); if (latest_session_time.is_null() || ((now - latest_session_time) > open_tab_expiration_duration_)) { - // TODO(rajendrant): Add UMA to track deletion of entries corresponding to - // existing tabs. return true; } return false; @@ -185,9 +195,16 @@ } void TabDataUseEntry::CompactSessionHistory() { - // TODO(rajendrant): Add UMA to track how often old sessions are lost. - while (sessions_.size() > max_sessions_per_tab_) + while (sessions_.size() > max_sessions_per_tab_) { + const auto& front = sessions_.front(); + DCHECK(!front.end_time.is_null()); + // Track how often old sessions are lost. + UMA_HISTOGRAM_CUSTOM_TIMES( + kUMAOldInactiveSessionRemovalDurationSecondsHistogram, + Now() - front.end_time, base::TimeDelta::FromSeconds(1), + base::TimeDelta::FromHours(1), 50); sessions_.pop_front(); + } } } // namespace android
diff --git a/chrome/browser/android/data_usage/tab_data_use_entry.h b/chrome/browser/android/data_usage/tab_data_use_entry.h index c3dd60f..460f799 100644 --- a/chrome/browser/android/data_usage/tab_data_use_entry.h +++ b/chrome/browser/android/data_usage/tab_data_use_entry.h
@@ -88,7 +88,13 @@ FRIEND_TEST_ALL_PREFIXES(TabDataUseEntryTest, MultipleTabSessionCloseEvent); FRIEND_TEST_ALL_PREFIXES(TabDataUseEntryTest, EndTrackingWithLabel); FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, TabCloseEvent); + FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, + ExpiredInactiveTabEntryRemovaltimeHistogram); + FRIEND_TEST_ALL_PREFIXES(DataUseTabModelTest, + ExpiredActiveTabEntryRemovaltimeHistogram); FRIEND_TEST_ALL_PREFIXES(MockTabDataUseEntryTest, CompactTabSessionHistory); + FRIEND_TEST_ALL_PREFIXES(MockTabDataUseEntryTest, + OldInactiveSessionRemovaltimeHistogram); typedef std::deque<TabDataUseTrackingSession> TabSessions;
diff --git a/chrome/browser/android/data_usage/tab_data_use_entry_unittest.cc b/chrome/browser/android/data_usage/tab_data_use_entry_unittest.cc index 5cf09cb4..9927fcd 100644 --- a/chrome/browser/android/data_usage/tab_data_use_entry_unittest.cc +++ b/chrome/browser/android/data_usage/tab_data_use_entry_unittest.cc
@@ -10,6 +10,7 @@ #include "base/memory/scoped_ptr.h" #include "base/strings/stringprintf.h" +#include "base/test/histogram_tester.h" #include "base/time/time.h" #include "testing/gtest/include/gtest/gtest.h" @@ -415,8 +416,8 @@ } // Checks that tracking session history does not grow beyond -// GetMaxSessionsPerTabForTests entries, and automatically compacts itself by -// removing the oldest tracking sessions. +// GetMaxSessionsPerTab entries, and automatically compacts itself by removing +// the oldest tracking sessions. TEST_F(MockTabDataUseEntryTest, CompactTabSessionHistory) { const uint32_t per_session_duration = 10; const uint32_t next_session_start_gap = 10; @@ -471,6 +472,66 @@ } } +TEST_F(MockTabDataUseEntryTest, TrackingSessionLifetimeHistogram) { + const char kUMATrackingSessionLifetimeSecondsHistogram[] = + "DataUse.TabModel.TrackingSessionLifetime"; + base::HistogramTester histogram_tester; + + // Tracking session from time=20 to time=30, lifetime of 10 seconds. + tab_entry_->SetNowOffsetInSeconds(20); + EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1)); + tab_entry_->SetNowOffsetInSeconds(30); + EXPECT_TRUE(tab_entry_->EndTracking()); + + histogram_tester.ExpectTotalCount(kUMATrackingSessionLifetimeSecondsHistogram, + 1); + histogram_tester.ExpectBucketCount( + kUMATrackingSessionLifetimeSecondsHistogram, + base::TimeDelta::FromSeconds(10).InMilliseconds(), 1); + + // Tracking session from time=40 to time=70, lifetime of 30 seconds. + tab_entry_->SetNowOffsetInSeconds(40); + EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1)); + tab_entry_->SetNowOffsetInSeconds(70); + EXPECT_TRUE(tab_entry_->EndTracking()); + + histogram_tester.ExpectTotalCount(kUMATrackingSessionLifetimeSecondsHistogram, + 2); + histogram_tester.ExpectBucketCount( + kUMATrackingSessionLifetimeSecondsHistogram, + base::TimeDelta::FromSeconds(30).InMilliseconds(), 1); +} + +TEST_F(MockTabDataUseEntryTest, OldInactiveSessionRemovaltimeHistogram) { + const char kUMAOldInactiveSessionRemovalDurationSecondsHistogram[] = + "DataUse.TabModel.OldInactiveSessionRemovalDuration"; + base::HistogramTester histogram_tester; + const size_t max_sessions_per_tab = GetMaxSessionsPerTab(); + + // Start a tracking session at time=20, and end it at time=30. + tab_entry_->SetNowOffsetInSeconds(20); + EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1)); + tab_entry_->SetNowOffsetInSeconds(30); + EXPECT_TRUE(tab_entry_->EndTracking()); + + for (size_t session = 1; session < max_sessions_per_tab; ++session) { + EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1)); + EXPECT_TRUE(tab_entry_->EndTracking()); + } + + // Add one more session at time=60. This removes the first inactive tracking + // session that ended at time=30, with removal duration of 30 seconds. + tab_entry_->SetNowOffsetInSeconds(60); + EXPECT_TRUE(tab_entry_->StartTracking(kTestLabel1)); + EXPECT_TRUE(tab_entry_->EndTracking()); + + histogram_tester.ExpectTotalCount( + kUMAOldInactiveSessionRemovalDurationSecondsHistogram, 1); + histogram_tester.ExpectBucketCount( + kUMAOldInactiveSessionRemovalDurationSecondsHistogram, + base::TimeDelta::FromSeconds(30).InMilliseconds(), 1); +} + } // namespace android } // namespace chrome
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc index 1e6fe65..87684e5e 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_strings.cc
@@ -250,6 +250,14 @@ SET_STRING("AUDIO_PLAYER_DEFAULT_ARTIST", IDS_FILE_BROWSER_AUDIO_PLAYER_DEFAULT_ARTIST); SET_STRING("AUDIO_PLAYER_TITLE", IDS_FILE_BROWSER_AUDIO_PLAYER_TITLE); + SET_STRING("AUDIO_PLAYER_SHUFFLE_BUTTON_LABEL", + IDS_AUDIO_PLAYER_SHUFFLE_BUTTON_LABEL); + SET_STRING("AUDIO_PLAYER_REPEAT_BUTTON_LABEL", + IDS_AUDIO_PLAYER_REPEAT_BUTTON_LABEL); + SET_STRING("AUDIO_PLAYER_OPEN_VOLUME_SLIDER_BUTTON_LABEL", + IDS_AUDIO_PLAYER_OPEN_VOLUME_SLIDER_BUTTON_LABEL); + SET_STRING("AUDIO_PLAYER_OPEN_PLAY_LIST_BUTTON_LABEL", + IDS_AUDIO_PLAYER_OPEN_PLAY_LIST_BUTTON_LABEL); } void AddStringsForCloudImport(base::DictionaryValue* dict) {
diff --git a/chrome/browser/chromeos/login/app_launch_signin_screen.cc b/chrome/browser/chromeos/login/app_launch_signin_screen.cc index b841c3d..61fa439 100644 --- a/chrome/browser/chromeos/login/app_launch_signin_screen.cc +++ b/chrome/browser/chromeos/login/app_launch_signin_screen.cc
@@ -214,8 +214,7 @@ webui_handler_->LoadUsers(users_list, false); } -void AppLaunchSigninScreen::CheckUserStatus(const std::string& user_id) { -} +void AppLaunchSigninScreen::CheckUserStatus(const AccountId& account_id) {} bool AppLaunchSigninScreen::IsUserWhitelisted(const std::string& user_id) { NOTREACHED();
diff --git a/chrome/browser/chromeos/login/app_launch_signin_screen.h b/chrome/browser/chromeos/login/app_launch_signin_screen.h index 1e8cbd4..14dfec1 100644 --- a/chrome/browser/chromeos/login/app_launch_signin_screen.h +++ b/chrome/browser/chromeos/login/app_launch_signin_screen.h
@@ -15,6 +15,8 @@ #include "components/user_manager/user.h" #include "components/user_manager/user_manager.h" +class AccountId; + namespace chromeos { class OobeUI; @@ -77,7 +79,7 @@ void SetDisplayEmail(const std::string& email) override; void Signout() override; void HandleGetUsers() override; - void CheckUserStatus(const std::string& user_id) override; + void CheckUserStatus(const AccountId& account_id) override; bool IsUserWhitelisted(const std::string& user_id) override; // AuthStatusConsumer implementation:
diff --git a/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.cc b/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.cc index e309e136..196b81b 100644 --- a/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.cc +++ b/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.cc
@@ -77,19 +77,20 @@ void ChromeUserSelectionScreen::CheckForPublicSessionDisplayNameChange( policy::DeviceLocalAccountPolicyBroker* broker) { - const std::string& user_id = broker->user_id(); + const AccountId& account_id = GetAccountIdOfKnownUser(broker->user_id()); + DCHECK(account_id.is_valid()); const std::string& display_name = broker->GetDisplayName(); - if (display_name == public_session_display_names_[user_id]) + if (display_name == public_session_display_names_[account_id]) return; - public_session_display_names_[user_id] = display_name; + public_session_display_names_[account_id] = display_name; if (!handler_initialized_) return; if (!display_name.empty()) { // If a new display name was set by policy, notify the UI about it. - view_->SetPublicSessionDisplayName(user_id, display_name); + view_->SetPublicSessionDisplayName(account_id, display_name); return; } @@ -101,13 +102,13 @@ base::MessageLoop::current()->PostTask( FROM_HERE, base::Bind(&ChromeUserSelectionScreen::SetPublicSessionDisplayName, - weak_factory_.GetWeakPtr(), - user_id)); + weak_factory_.GetWeakPtr(), account_id)); } void ChromeUserSelectionScreen::CheckForPublicSessionLocalePolicyChange( policy::DeviceLocalAccountPolicyBroker* broker) { - const std::string& user_id = broker->user_id(); + const AccountId& account_id = GetAccountIdOfKnownUser(broker->user_id()); + DCHECK(account_id.is_valid()); const policy::PolicyMap::Entry* entry = broker->core()->store()->policy_map().Get(policy::key::kSessionLocales); @@ -131,30 +132,30 @@ } std::vector<std::string>& recommended_locales = - public_session_recommended_locales_[user_id]; + public_session_recommended_locales_[account_id]; if (new_recommended_locales != recommended_locales) - SetPublicSessionLocales(user_id, new_recommended_locales); + SetPublicSessionLocales(account_id, new_recommended_locales); if (new_recommended_locales.empty()) - public_session_recommended_locales_.erase(user_id); + public_session_recommended_locales_.erase(account_id); else recommended_locales = new_recommended_locales; } void ChromeUserSelectionScreen::SetPublicSessionDisplayName( - const std::string& user_id) { - const user_manager::User* user = user_manager::UserManager::Get()->FindUser( - AccountId::FromUserEmail(user_id)); + const AccountId& account_id) { + const user_manager::User* user = + user_manager::UserManager::Get()->FindUser(account_id); if (!user || user->GetType() != user_manager::USER_TYPE_PUBLIC_ACCOUNT) return; - view_->SetPublicSessionDisplayName(user_id, + view_->SetPublicSessionDisplayName(account_id, base::UTF16ToUTF8(user->GetDisplayName())); } void ChromeUserSelectionScreen::SetPublicSessionLocales( - const std::string& user_id, + const AccountId& account_id, const std::vector<std::string>& recommended_locales) { if (!handler_initialized_) return; @@ -178,7 +179,7 @@ const bool two_or_more_recommended_locales = recommended_locales.size() >= 2; // Notify the UI. - view_->SetPublicSessionLocales(user_id, available_locales.Pass(), + view_->SetPublicSessionLocales(account_id, available_locales.Pass(), default_locale, two_or_more_recommended_locales); }
diff --git a/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.h b/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.h index e276911a..11ab0d3 100644 --- a/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.h +++ b/chrome/browser/chromeos/login/screens/chrome_user_selection_screen.h
@@ -15,6 +15,8 @@ #include "chrome/browser/chromeos/login/screens/user_selection_screen.h" #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h" +class AccountId; + namespace chromeos { class ChromeUserSelectionScreen @@ -45,20 +47,20 @@ // Notify the UI that the display name for a public session has changed, // taking the display name from the |User| owned by |UserManager|. - void SetPublicSessionDisplayName(const std::string& user_id); + void SetPublicSessionDisplayName(const AccountId& account_id); // Send an updated list of locales for a public session to the UI, consisting // of the |recommended_locales| followed by all other available locales. void SetPublicSessionLocales( - const std::string& user_id, + const AccountId& account_id, const std::vector<std::string>& recommended_locales); bool handler_initialized_; policy::DeviceLocalAccountPolicyService* device_local_account_policy_service_; - // Map from public session user IDs to their display names set by policy. - typedef std::map<std::string, std::string> DisplayNamesMap; + // Map from public session account IDs to their display names set by policy. + typedef std::map<AccountId, std::string> DisplayNamesMap; DisplayNamesMap public_session_display_names_; base::WeakPtrFactory<ChromeUserSelectionScreen> weak_factory_;
diff --git a/chrome/browser/chromeos/login/screens/user_selection_screen.cc b/chrome/browser/chromeos/login/screens/user_selection_screen.cc index 37bb77b..645f1002 100644 --- a/chrome/browser/chromeos/login/screens/user_selection_screen.cc +++ b/chrome/browser/chromeos/login/screens/user_selection_screen.cc
@@ -148,7 +148,7 @@ user->GetType() == user_manager::USER_TYPE_SUPERVISED; const bool is_child_user = user->GetType() == user_manager::USER_TYPE_CHILD; - user_dict->SetString(kKeyUsername, user->GetAccountId().GetUserEmail()); + user_dict->SetString(kKeyUsername, user->GetAccountId().Serialize()); user_dict->SetString(kKeyEmailAddress, user->display_email()); user_dict->SetString(kKeyDisplayName, user->GetDisplayName()); user_dict->SetBoolean(kKeyPublicAccount, is_public_session); @@ -246,6 +246,26 @@ (token_status == user_manager::User::OAUTH_TOKEN_STATUS_UNKNOWN); } +// static +AccountId UserSelectionScreen::GetAccountIdOfKnownUser( + const std::string& user_id) { + if (user_id.empty()) + return EmptyAccountId(); + + const AccountId initial_account_id = AccountId::FromUserEmail(user_id); + + user_manager::UserManager* user_manager = user_manager::UserManager::Get(); + if (!user_manager) + return initial_account_id; + + AccountId known_account_id(EmptyAccountId()); + if (user_manager->GetKnownUserAccountId(initial_account_id, + &known_account_id)) + return known_account_id; + + return initial_account_id; +} + void UserSelectionScreen::SetHandler(LoginDisplayWebUIHandler* handler) { handler_ = handler; } @@ -306,18 +326,17 @@ // static const user_manager::UserList UserSelectionScreen::PrepareUserListForSending( const user_manager::UserList& users, - std::string owner, + const AccountId& owner, bool is_signin_to_add) { user_manager::UserList users_to_send; - bool has_owner = owner.size() > 0; + bool has_owner = owner.is_valid(); size_t max_non_owner_users = has_owner ? kMaxUsers - 1 : kMaxUsers; size_t non_owner_count = 0; for (user_manager::UserList::const_iterator it = users.begin(); it != users.end(); ++it) { - const std::string& user_id = (*it)->email(); - bool is_owner = (user_id == owner); + bool is_owner = ((*it)->GetAccountId() == owner); bool is_public_account = ((*it)->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT); @@ -347,8 +366,10 @@ bool single_user = users_.size() == 1; bool is_signin_to_add = LoginDisplayHostImpl::default_host() && user_manager::UserManager::Get()->IsUserLoggedIn(); - std::string owner; - chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, &owner); + std::string owner_email; + chromeos::CrosSettings::Get()->GetString(chromeos::kDeviceOwner, + &owner_email); + const AccountId owner(GetAccountIdOfKnownUser(owner_email)); policy::BrowserPolicyConnectorChromeOS* connector = g_browser_process->platform_part()->browser_policy_connector_chromeos(); @@ -363,22 +384,22 @@ for (user_manager::UserList::const_iterator it = users_to_send.begin(); it != users_to_send.end(); ++it) { - const std::string& user_id = (*it)->email(); - bool is_owner = (user_id == owner); + const AccountId& account_id = (*it)->GetAccountId(); + bool is_owner = (account_id == owner); const bool is_public_account = ((*it)->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT); const AuthType initial_auth_type = is_public_account ? EXPAND_THEN_USER_CLICK : (ShouldForceOnlineSignIn(*it) ? ONLINE_SIGN_IN : OFFLINE_PASSWORD); - user_auth_type_map_[user_id] = initial_auth_type; + user_auth_type_map_[account_id] = initial_auth_type; base::DictionaryValue* user_dict = new base::DictionaryValue(); const std::vector<std::string>* public_session_recommended_locales = - public_session_recommended_locales_.find(user_id) == - public_session_recommended_locales_.end() ? - &kEmptyRecommendedLocales : - &public_session_recommended_locales_[user_id]; + public_session_recommended_locales_.find(account_id) == + public_session_recommended_locales_.end() + ? &kEmptyRecommendedLocales + : &public_session_recommended_locales_[account_id]; FillUserDictionary(*it, is_owner, is_signin_to_add, @@ -391,7 +412,7 @@ // available when running into login screen on first boot. // See http://crosbug.com/12723 bool can_remove_user = - ((!single_user || is_enterprise_managed) && !user_id.empty() && + ((!single_user || is_enterprise_managed) && account_id.is_valid() && !is_owner && !is_public_account && !signed_in && !is_signin_to_add); user_dict->SetBoolean(kKeyCanRemove, can_remove_user); users_list.Append(user_dict); @@ -404,7 +425,7 @@ SendUserList(); } -void UserSelectionScreen::CheckUserStatus(const std::string& user_email) { +void UserSelectionScreen::CheckUserStatus(const AccountId& account_id) { // No checks on lock screen. if (ScreenLocker::default_screen_locker()) return; @@ -414,7 +435,6 @@ new TokenHandleUtil(user_manager::UserManager::Get())); } - const AccountId account_id = AccountId::FromUserEmail(user_email); if (token_handle_util_->HasToken(account_id)) { token_handle_util_->CheckToken( account_id, base::Bind(&UserSelectionScreen::OnUserStatusChecked, @@ -437,19 +457,21 @@ void UserSelectionScreen::SetAuthType(const std::string& user_id, AuthType auth_type, const base::string16& initial_value) { - if (GetAuthType(user_id) == FORCE_OFFLINE_PASSWORD) + const AccountId& account_id = GetAccountIdOfKnownUser(user_id); + if (GetAuthType(account_id.GetUserEmail()) == FORCE_OFFLINE_PASSWORD) return; - DCHECK(GetAuthType(user_id) != FORCE_OFFLINE_PASSWORD || + DCHECK(GetAuthType(account_id.GetUserEmail()) != FORCE_OFFLINE_PASSWORD || auth_type == FORCE_OFFLINE_PASSWORD); - user_auth_type_map_[user_id] = auth_type; - view_->SetAuthType(user_id, auth_type, initial_value); + user_auth_type_map_[account_id] = auth_type; + view_->SetAuthType(account_id, auth_type, initial_value); } proximity_auth::ScreenlockBridge::LockHandler::AuthType UserSelectionScreen::GetAuthType(const std::string& username) const { - if (user_auth_type_map_.find(username) == user_auth_type_map_.end()) + const AccountId& account_id = GetAccountIdOfKnownUser(username); + if (user_auth_type_map_.find(account_id) == user_auth_type_map_.end()) return OFFLINE_PASSWORD; - return user_auth_type_map_.find(username)->second; + return user_auth_type_map_.find(account_id)->second; } proximity_auth::ScreenlockBridge::LockHandler::ScreenType @@ -474,11 +496,13 @@ scoped_ptr<base::DictionaryValue> icon = icon_options.ToDictionaryValue(); if (!icon || icon->empty()) return; - view_->ShowUserPodCustomIcon(user_id, *icon); + const AccountId account_id = GetAccountIdOfKnownUser(user_id); + view_->ShowUserPodCustomIcon(account_id, *icon); } void UserSelectionScreen::HideUserPodCustomIcon(const std::string& user_id) { - view_->HideUserPodCustomIcon(user_id); + const AccountId account_id = GetAccountIdOfKnownUser(user_id); + view_->HideUserPodCustomIcon(account_id); } void UserSelectionScreen::EnableInput() { @@ -499,7 +523,7 @@ const std::string& key_label) { DCHECK_EQ(GetScreenType(), SIGNIN_SCREEN); - UserContext user_context(AccountId::FromUserEmail(user_id)); + UserContext user_context(GetAccountIdOfKnownUser(user_id)); user_context.SetAuthFlow(UserContext::AUTH_FLOW_EASY_UNLOCK); user_context.SetKey(Key(secret)); user_context.GetKey()->SetLabel(key_label); @@ -507,36 +531,36 @@ login_display_delegate_->Login(user_context, SigninSpecifics()); } -void UserSelectionScreen::HardLockPod(const std::string& user_id) { - view_->SetAuthType(user_id, OFFLINE_PASSWORD, base::string16()); - EasyUnlockService* service = GetEasyUnlockServiceForUser(user_id); +void UserSelectionScreen::HardLockPod(const AccountId& account_id) { + view_->SetAuthType(account_id, OFFLINE_PASSWORD, base::string16()); + EasyUnlockService* service = GetEasyUnlockServiceForUser(account_id); if (!service) return; service->SetHardlockState(EasyUnlockScreenlockStateHandler::USER_HARDLOCK); } -void UserSelectionScreen::AttemptEasyUnlock(const std::string& user_id) { - EasyUnlockService* service = GetEasyUnlockServiceForUser(user_id); +void UserSelectionScreen::AttemptEasyUnlock(const AccountId& account_id) { + EasyUnlockService* service = GetEasyUnlockServiceForUser(account_id); if (!service) return; - service->AttemptAuth(user_id); + service->AttemptAuth(account_id.GetUserEmail()); } -void UserSelectionScreen::RecordClickOnLockIcon(const std::string& user_id) { - EasyUnlockService* service = GetEasyUnlockServiceForUser(user_id); +void UserSelectionScreen::RecordClickOnLockIcon(const AccountId& account_id) { + EasyUnlockService* service = GetEasyUnlockServiceForUser(account_id); if (!service) return; service->RecordClickOnLockIcon(); } EasyUnlockService* UserSelectionScreen::GetEasyUnlockServiceForUser( - const std::string& user_id) const { + const AccountId& account_id) const { if (GetScreenType() == OTHER_SCREEN) return nullptr; const user_manager::User* unlock_user = nullptr; for (const user_manager::User* user : users_) { - if (user->email() == user_id) { + if (user->GetAccountId() == account_id) { unlock_user = user; break; }
diff --git a/chrome/browser/chromeos/login/screens/user_selection_screen.h b/chrome/browser/chromeos/login/screens/user_selection_screen.h index 0c2879b5..71dcb990 100644 --- a/chrome/browser/chromeos/login/screens/user_selection_screen.h +++ b/chrome/browser/chromeos/login/screens/user_selection_screen.h
@@ -16,6 +16,7 @@ #include "chrome/browser/chromeos/login/ui/login_display.h" #include "chrome/browser/chromeos/login/ui/models/user_board_model.h" #include "components/proximity_auth/screenlock_bridge.h" +#include "components/signin/core/account_id/account_id.h" #include "components/user_manager/user.h" #include "ui/base/user_activity/user_activity_observer.h" @@ -42,10 +43,9 @@ static const user_manager::UserList PrepareUserListForSending( const user_manager::UserList& users, - std::string owner, + const AccountId& owner, bool is_signin_to_add); - virtual void Init(const user_manager::UserList& users, bool show_guest); void OnUserImageChanged(const user_manager::User& user); void OnBeforeUserRemoved(const std::string& username); @@ -54,7 +54,7 @@ void OnPasswordClearTimerExpired(); void HandleGetUsers(); - void CheckUserStatus(const std::string& user_id); + void CheckUserStatus(const AccountId& account_id); // ui::UserActivityDetector implementation: void OnUserActivity(const ui::Event* event) override; @@ -83,9 +83,9 @@ // UserBoardModel implementation. void SendUserList() override; - void HardLockPod(const std::string& user_id) override; - void AttemptEasyUnlock(const std::string& user_id) override; - void RecordClickOnLockIcon(const std::string& user_id) override; + void HardLockPod(const AccountId& account_id) override; + void AttemptEasyUnlock(const AccountId& account_id) override; + void RecordClickOnLockIcon(const AccountId& account_id) override; // Fills |user_dict| with information about |user|. static void FillUserDictionary( @@ -109,18 +109,22 @@ static bool ShouldForceOnlineSignIn(const user_manager::User* user); protected: + // This call forms full account id of a known user by email. + // This is a temporary call while migrating to AccountId. + static AccountId GetAccountIdOfKnownUser(const std::string& user_id); + LoginDisplayWebUIHandler* handler_; LoginDisplay::Delegate* login_display_delegate_; UserBoardView* view_; - // Map from public session user IDs to recommended locales set by policy. - typedef std::map<std::string, std::vector<std::string> > + // Map from public session account IDs to recommended locales set by policy. + typedef std::map<AccountId, std::vector<std::string> > PublicSessionRecommendedLocaleMap; PublicSessionRecommendedLocaleMap public_session_recommended_locales_; private: EasyUnlockService* GetEasyUnlockServiceForUser( - const std::string& user_id) const; + const AccountId& account_id) const; void OnUserStatusChecked(const AccountId& account_id, TokenHandleUtil::TokenHandleStatus status); @@ -134,9 +138,9 @@ // Set of Users that are visible. user_manager::UserList users_; - // Map of usernames to their current authentication type. If a user is not + // Map of accounnt ids to their current authentication type. If a user is not // contained in the map, it is using the default authentication type. - std::map<std::string, proximity_auth::ScreenlockBridge::LockHandler::AuthType> + std::map<AccountId, proximity_auth::ScreenlockBridge::LockHandler::AuthType> user_auth_type_map_; // Timer for measuring idle state duration before password clear.
diff --git a/chrome/browser/chromeos/login/signin_screen_controller.cc b/chrome/browser/chromeos/login/signin_screen_controller.cc index fdcfd5a..eb098526 100644 --- a/chrome/browser/chromeos/login/signin_screen_controller.cc +++ b/chrome/browser/chromeos/login/signin_screen_controller.cc
@@ -75,8 +75,8 @@ user_selection_screen_->HandleGetUsers(); } -void SignInScreenController::CheckUserStatus(const std::string& user_id) { - user_selection_screen_->CheckUserStatus(user_id); +void SignInScreenController::CheckUserStatus(const AccountId& account_id) { + user_selection_screen_->CheckUserStatus(account_id); } void SignInScreenController::SetWebUIHandler(
diff --git a/chrome/browser/chromeos/login/signin_screen_controller.h b/chrome/browser/chromeos/login/signin_screen_controller.h index 2a8862e..e341062 100644 --- a/chrome/browser/chromeos/login/signin_screen_controller.h +++ b/chrome/browser/chromeos/login/signin_screen_controller.h
@@ -43,7 +43,7 @@ void SendUserList(); // Runs OAauth token validity check. - void CheckUserStatus(const std::string& user_id); + void CheckUserStatus(const AccountId& account_id); // Query to remove user with specified id. // TODO(antrim): move to user selection screen handler.
diff --git a/chrome/browser/chromeos/login/supervised/supervised_user_test_base.cc b/chrome/browser/chromeos/login/supervised/supervised_user_test_base.cc index ab41788..9cd935c 100644 --- a/chrome/browser/chromeos/login/supervised/supervised_user_test_base.cc +++ b/chrome/browser/chromeos/login/supervised/supervised_user_test_base.cc
@@ -294,7 +294,8 @@ // Next button is now enabled. JSExpect("!$('supervised-user-creation-next-button').disabled"); - UserContext user_context(AccountId::FromUserEmail(kTestManager)); + UserContext user_context(AccountId::FromUserEmailGaiaId( + kTestManager, GetGaiaIDForUserID(kTestManager))); user_context.SetGaiaID(GetGaiaIDForUserID(kTestManager)); user_context.SetKey(Key(kTestManagerPassword)); SetExpectedCredentials(user_context);
diff --git a/chrome/browser/chromeos/login/ui/models/user_board_model.h b/chrome/browser/chromeos/login/ui/models/user_board_model.h index 757e558..c69fb30 100644 --- a/chrome/browser/chromeos/login/ui/models/user_board_model.h +++ b/chrome/browser/chromeos/login/ui/models/user_board_model.h
@@ -18,9 +18,9 @@ virtual void SendUserList() = 0; // Methods for easy unlock support. - virtual void HardLockPod(const std::string& user_id) = 0; - virtual void AttemptEasyUnlock(const std::string& user_id) = 0; - virtual void RecordClickOnLockIcon(const std::string& user_id) = 0; + virtual void HardLockPod(const AccountId& account_id) = 0; + virtual void AttemptEasyUnlock(const AccountId& account_id) = 0; + virtual void RecordClickOnLockIcon(const AccountId& account_id) = 0; // BaseScreen implementation: std::string GetName() const override;
diff --git a/chrome/browser/chromeos/login/ui/views/user_board_view.h b/chrome/browser/chromeos/login/ui/views/user_board_view.h index 30fe63f..7febe941 100644 --- a/chrome/browser/chromeos/login/ui/views/user_board_view.h +++ b/chrome/browser/chromeos/login/ui/views/user_board_view.h
@@ -12,6 +12,8 @@ #include "base/values.h" #include "components/proximity_auth/screenlock_bridge.h" +class AccountId; + namespace chromeos { class UserBoardModel; @@ -25,18 +27,18 @@ virtual void Bind(UserBoardModel& model) = 0; virtual void Unbind() = 0; - virtual void SetPublicSessionDisplayName(const std::string& user_id, + virtual void SetPublicSessionDisplayName(const AccountId& account_id, const std::string& display_name) = 0; - virtual void SetPublicSessionLocales(const std::string& user_id, + virtual void SetPublicSessionLocales(const AccountId& account_id, scoped_ptr<base::ListValue> locales, const std::string& default_locale, bool multiple_recommended_locales) = 0; virtual void ShowBannerMessage(const base::string16& message) = 0; - virtual void ShowUserPodCustomIcon(const std::string& user_id, + virtual void ShowUserPodCustomIcon(const AccountId& account_id, const base::DictionaryValue& icon) = 0; - virtual void HideUserPodCustomIcon(const std::string& user_id) = 0; + virtual void HideUserPodCustomIcon(const AccountId& account_id) = 0; virtual void SetAuthType( - const std::string& user_id, + const AccountId& account_id, proximity_auth::ScreenlockBridge::LockHandler::AuthType auth_type, const base::string16& initial_value) = 0; };
diff --git a/chrome/browser/chromeos/login/ui/webui_login_display.cc b/chrome/browser/chromeos/login/ui/webui_login_display.cc index 4d7362d..522ca4e 100644 --- a/chrome/browser/chromeos/login/ui/webui_login_display.cc +++ b/chrome/browser/chromeos/login/ui/webui_login_display.cc
@@ -77,8 +77,8 @@ SignInScreenController::Get()->SendUserList(); } -void WebUILoginDisplay::CheckUserStatus(const std::string& user_id) { - SignInScreenController::Get()->CheckUserStatus(user_id); +void WebUILoginDisplay::CheckUserStatus(const AccountId& account_id) { + SignInScreenController::Get()->CheckUserStatus(account_id); } // ---- Gaia screen methods
diff --git a/chrome/browser/chromeos/login/ui/webui_login_display.h b/chrome/browser/chromeos/login/ui/webui_login_display.h index 8a13724e..408bf28 100644 --- a/chrome/browser/chromeos/login/ui/webui_login_display.h +++ b/chrome/browser/chromeos/login/ui/webui_login_display.h
@@ -78,7 +78,7 @@ void SetDisplayEmail(const std::string& email) override; void HandleGetUsers() override; - void CheckUserStatus(const std::string& user_id) override; + void CheckUserStatus(const AccountId& account_id) override; bool IsUserWhitelisted(const std::string& user_id) override; // ui::UserActivityDetector implementation:
diff --git a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc index 36f8e92..f1d2f1c97 100644 --- a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc +++ b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
@@ -688,7 +688,7 @@ " document.getElementById('pod-row').getPodWithUsername_('%s');" "pod.click();" "domAutomationController.send(pod.classList.contains('advanced'));", - account_id_1_.GetUserEmail().c_str()), + account_id_1_.Serialize().c_str()), &advanced)); // Verify that the pod expanded to its basic/advanced form, as expected. EXPECT_EQ(expect_advanced, advanced); @@ -895,7 +895,7 @@ const std::string get_compact_pod_display_name = base::StringPrintf( "domAutomationController.send(document.getElementById('pod-row')" " .getPodWithUsername_('%s').nameElement.textContent);", - account_id_1_.GetUserEmail().c_str()); + account_id_1_.Serialize().c_str()); std::string display_name; ASSERT_TRUE(content::ExecuteScriptAndExtractString( contents_, @@ -906,7 +906,7 @@ "domAutomationController.send(document.getElementById('pod-row')" " .getPodWithUsername_('%s').querySelector('.expanded-pane-name')" " .textContent);", - account_id_1_.GetUserEmail().c_str()); + account_id_1_.Serialize().c_str()); display_name.clear(); ASSERT_TRUE(content::ExecuteScriptAndExtractString( contents_, @@ -920,7 +920,7 @@ base::StringPrintf( "document.getElementById('pod-row').getPodWithUsername_('%s')" " .click();", - account_id_1_.GetUserEmail().c_str()))); + account_id_1_.Serialize().c_str()))); // Change the display name. device_local_account_policy_.payload().mutable_userdisplayname()->set_value( @@ -957,7 +957,7 @@ base::StringPrintf( "domAutomationController.send(document.getElementById('pod-row')" " .getPodWithUsername_('%s').expanded);", - account_id_1_.GetUserEmail().c_str()), + account_id_1_.Serialize().c_str()), &expanded)); EXPECT_TRUE(expanded); } @@ -1677,7 +1677,7 @@ base::StringPrintf( "document.getElementById('pod-row').getPodWithUsername_('%s')" " .querySelector('.enter-button').click();", - account_id_1_.GetUserEmail().c_str()))); + account_id_1_.Serialize().c_str()))); WaitForSessionStart(); @@ -1706,7 +1706,7 @@ " document.getElementById('pod-row').getPodWithUsername_('%s');" "pod.querySelector('.language-and-input').click();" "domAutomationController.send(pod.classList.contains('advanced'));", - account_id_1_.GetUserEmail().c_str()), + account_id_1_.Serialize().c_str()), &advanced)); EXPECT_FALSE(advanced); @@ -1720,7 +1720,7 @@ "var event = document.createEvent('HTMLEvents');" "event.initEvent('change', false, true);" "languageSelect.dispatchEvent(event);", - account_id_1_.GetUserEmail().c_str(), kPublicSessionLocale))); + account_id_1_.Serialize().c_str(), kPublicSessionLocale))); // The UI will have requested an updated list of keyboard layouts at this // point. Wait for the constructions of this list to finish. @@ -1735,7 +1735,7 @@ " document.getElementById('pod-row').getPodWithUsername_('%s');" "pod.querySelector('.keyboard-select').value = '%s';" "pod.querySelector('.enter-button').click();", - account_id_1_.GetUserEmail().c_str(), + account_id_1_.Serialize().c_str(), public_session_input_method_id_.c_str()))); WaitForSessionStart(); @@ -1768,7 +1768,7 @@ base::StringPrintf( "document.getElementById('pod-row').getPodWithUsername_('%s')" " .querySelector('.enter-button').click();", - account_id_1_.GetUserEmail().c_str()))); + account_id_1_.Serialize().c_str()))); WaitForSessionStart(); @@ -1801,7 +1801,7 @@ "for (var i = 0; i < languageSelect.length; ++i)" " locales.push(languageSelect.options[i].value);" "domAutomationController.send(JSON.stringify(locales));", - account_id_1_.GetUserEmail().c_str()); + account_id_1_.Serialize().c_str()); std::string json; ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents_, get_locale_list, @@ -1836,7 +1836,7 @@ "domAutomationController.send(document.getElementById('pod-row')" " .getPodWithUsername_('%s').querySelector('.language-select')" " .value);", - account_id_1_.GetUserEmail().c_str()); + account_id_1_.Serialize().c_str()); std::string selected_locale; ASSERT_TRUE(content::ExecuteScriptAndExtractString(contents_, get_selected_locale, @@ -1891,7 +1891,7 @@ "var event = document.createEvent('HTMLEvents');" "event.initEvent('change', false, true);" "languageSelect.dispatchEvent(event);", - account_id_1_.GetUserEmail().c_str(), kPublicSessionLocale))); + account_id_1_.Serialize().c_str(), kPublicSessionLocale))); // Change the list of recommended locales. SetRecommendedLocales(kRecommendedLocales2, arraysize(kRecommendedLocales2)); @@ -1917,7 +1917,7 @@ base::StringPrintf( "document.getElementById('pod-row').getPodWithUsername_('%s')" " .querySelector('.keyboard-select').value = '%s';", - account_id_1_.GetUserEmail().c_str(), + account_id_1_.Serialize().c_str(), public_session_input_method_id_.c_str()))); // Click on a different pod, causing focus to shift away and the pod to @@ -1927,7 +1927,7 @@ base::StringPrintf( "document.getElementById('pod-row').getPodWithUsername_('%s')" " .click();", - account_id_2_.GetUserEmail().c_str()))); + account_id_2_.Serialize().c_str()))); // Click on the pod again, causing it to expand again. Verify that the pod has // kept all its state (the advanced form is being shown, the manually selected @@ -1944,7 +1944,7 @@ "state.keyboardLayout = pod.querySelector('.keyboard-select').value;" "console.log(JSON.stringify(state));" "domAutomationController.send(JSON.stringify(state));", - account_id_1_.GetUserEmail().c_str()), + account_id_1_.Serialize().c_str()), &json)); LOG(ERROR) << json; value_ptr = base::JSONReader::Read(json); @@ -1966,7 +1966,7 @@ base::StringPrintf( "document.getElementById('pod-row').getPodWithUsername_('%s')" " .querySelector('.enter-button').click();", - account_id_1_.GetUserEmail().c_str()))); + account_id_1_.Serialize().c_str()))); WaitForSessionStart(); @@ -2000,7 +2000,7 @@ " document.getElementById('pod-row').getPodWithUsername_('%s');" "pod.click();" "domAutomationController.send(pod.classList.contains('advanced'));", - account_id_1_.GetUserEmail().c_str()), + account_id_1_.Serialize().c_str()), &advanced)); EXPECT_FALSE(advanced); EXPECT_EQ(l10n_util::GetLanguage(initial_locale_), @@ -2012,7 +2012,7 @@ base::StringPrintf( "document.getElementById('pod-row').getPodWithUsername_('%s')" " .querySelector('.enter-button').click();", - account_id_1_.GetUserEmail().c_str()))); + account_id_1_.Serialize().c_str()))); WaitForSessionStart(); @@ -2105,7 +2105,7 @@ "var event = document.createEvent('HTMLEvents');" "event.initEvent('change', false, true);" "languageSelect.dispatchEvent(event);", - account_id_1_.GetUserEmail().c_str(), kPublicSessionLocale))); + account_id_1_.Serialize().c_str(), kPublicSessionLocale))); // The UI will have requested an updated list of keyboard layouts at this // point. Wait for the constructions of this list to finish. @@ -2131,7 +2131,7 @@ " document.getElementById('pod-row').getPodWithUsername_('%s');" "pod.querySelector('.keyboard-select').value = '%s';" "pod.querySelector('.enter-button').click();", - account_id_1_.GetUserEmail().c_str(), + account_id_1_.Serialize().c_str(), public_session_input_method_id_.c_str()))); // Spin the loop until the login observer fires. Then, unregister the
diff --git a/chrome/browser/chromeos/system/input_device_settings_impl_ozone.cc b/chrome/browser/chromeos/system/input_device_settings_impl_ozone.cc index 3a3d98e..b32f5f08 100644 --- a/chrome/browser/chromeos/system/input_device_settings_impl_ozone.cc +++ b/chrome/browser/chromeos/system/input_device_settings_impl_ozone.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/chromeos/system/input_device_settings.h" #include "content/public/browser/browser_thread.h" +#include "ui/events/base_event_utils.h" #include "ui/ozone/public/input_controller.h" #include "ui/ozone/public/ozone_platform.h" @@ -136,6 +137,7 @@ void InputDeviceSettingsImplOzone::SetTouchscreensEnabled(bool enabled) { input_controller_->SetTouchscreensEnabled(enabled); + ui::SetTouchEventsCrOsMasterSwitch(enabled); } } // namespace
diff --git a/chrome/browser/chromeos/system/input_device_settings_impl_x11.cc b/chrome/browser/chromeos/system/input_device_settings_impl_x11.cc index 2167403..fb5393c 100644 --- a/chrome/browser/chromeos/system/input_device_settings_impl_x11.cc +++ b/chrome/browser/chromeos/system/input_device_settings_impl_x11.cc
@@ -294,7 +294,7 @@ } void InputDeviceSettingsImplX11::SetTouchscreensEnabled(bool enabled) { - ui::SetTouchEventsEnabled(enabled); + ui::SetTouchEventsCrOsMasterSwitch(enabled); } void InputDeviceSettingsImplX11::GenerateTouchpadArguments(
diff --git a/chrome/browser/chromeos/ui/inline_login_dialog.cc b/chrome/browser/chromeos/ui/inline_login_dialog.cc deleted file mode 100644 index 35548a1..0000000 --- a/chrome/browser/chromeos/ui/inline_login_dialog.cc +++ /dev/null
@@ -1,81 +0,0 @@ -// Copyright 2014 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 "chrome/browser/chromeos/ui/inline_login_dialog.h" - -#include "base/bind.h" -#include "base/logging.h" -#include "chrome/browser/signin/signin_promo.h" -#include "chrome/browser/ui/browser_dialogs.h" -#include "content/public/browser/web_contents.h" -#include "ui/views/controls/webview/webview.h" -#include "ui/views/layout/box_layout.h" -#include "ui/views/widget/widget.h" - -namespace { - -const int kGaiaViewHeight = 400; -const int kGaiaViewWidth = 360; - -} // namespace - -namespace ui { - -// static -void InlineLoginDialog::Show(content::BrowserContext* context) { - InlineLoginDialog* dialog = new InlineLoginDialog(); - chrome::ShowWebDialog(NULL, context, dialog); -} - -InlineLoginDialog::InlineLoginDialog() { -} - -InlineLoginDialog::~InlineLoginDialog() { -} - -ModalType InlineLoginDialog::GetDialogModalType() const { - return MODAL_TYPE_SYSTEM; -} - -base::string16 InlineLoginDialog::GetDialogTitle() const { - return base::string16(); -} - -GURL InlineLoginDialog::GetDialogContentURL() const { - return GURL(signin::GetPromoURL( - signin_metrics::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT, - false /* auto_close */, - true /* is_constrained */)); -} - -void InlineLoginDialog::GetWebUIMessageHandlers( - std::vector<content::WebUIMessageHandler*>* handlers) const { -} - -void InlineLoginDialog::GetDialogSize(gfx::Size* size) const { - *size = gfx::Size(kGaiaViewWidth, kGaiaViewHeight); -} - -std::string InlineLoginDialog::GetDialogArgs() const { - return ""; -} - -bool InlineLoginDialog::CanResizeDialog() const { - return false; -} - -void InlineLoginDialog::OnDialogClosed(const std::string& json_retval) { - delete this; -} - -void InlineLoginDialog::OnCloseContents(content::WebContents* source, - bool* out_close_dialog) { - *out_close_dialog = true; -} - -bool InlineLoginDialog::ShouldShowDialogTitle() const { - return true; -} - -} // namespace ui
diff --git a/chrome/browser/chromeos/ui/inline_login_dialog.h b/chrome/browser/chromeos/ui/inline_login_dialog.h deleted file mode 100644 index 9f93532..0000000 --- a/chrome/browser/chromeos/ui/inline_login_dialog.h +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2014 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. - -#ifndef CHROME_BROWSER_CHROMEOS_UI_INLINE_LOGIN_DIALOG_H_ -#define CHROME_BROWSER_CHROMEOS_UI_INLINE_LOGIN_DIALOG_H_ - -#include "base/compiler_specific.h" -#include "base/macros.h" -#include "ui/web_dialogs/web_dialog_delegate.h" - -namespace content { -class BrowserContext; -} - -namespace ui { - -class InlineLoginDialog : public WebDialogDelegate { - public: - static void Show(content::BrowserContext* context); - - private: - InlineLoginDialog(); - ~InlineLoginDialog() override; - - // Overriden from WebDialogDelegate. - ModalType GetDialogModalType() const override; - base::string16 GetDialogTitle() const override; - GURL GetDialogContentURL() const override; - void GetWebUIMessageHandlers( - std::vector<content::WebUIMessageHandler*>* handlers) const override; - void GetDialogSize(gfx::Size* size) const override; - std::string GetDialogArgs() const override; - bool CanResizeDialog() const override; - void OnDialogClosed(const std::string& json_retval) override; - void OnCloseContents(content::WebContents* source, - bool* out_close_dialog) override; - bool ShouldShowDialogTitle() const override; - - DISALLOW_COPY_AND_ASSIGN(InlineLoginDialog); -}; - -} // namespace ui - -#endif // CHROME_BROWSER_CHROMEOS_UI_INLINE_LOGIN_DIALOG_H_
diff --git a/chrome/browser/devtools/BUILD.gn b/chrome/browser/devtools/BUILD.gn index 9b8f6ea..496e553 100644 --- a/chrome/browser/devtools/BUILD.gn +++ b/chrome/browser/devtools/BUILD.gn
@@ -91,6 +91,8 @@ "device/android_device_manager.cc", "device/android_device_manager.h", "device/android_web_socket.cc", + "device/cast_device_provider.cc", + "device/cast_device_provider.h", "device/devtools_android_bridge.cc", "device/devtools_android_bridge.h", "device/port_forwarding_controller.cc",
diff --git a/chrome/browser/devtools/device/cast_device_provider.cc b/chrome/browser/devtools/device/cast_device_provider.cc new file mode 100644 index 0000000..53ebbf9 --- /dev/null +++ b/chrome/browser/devtools/device/cast_device_provider.cc
@@ -0,0 +1,197 @@ +// Copyright 2015 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 "chrome/browser/devtools/device/cast_device_provider.h" + +#include <map> +#include <set> +#include <string> +#include <vector> + +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_split.h" +#include "base/thread_task_runner_handle.h" +#include "net/base/host_port_pair.h" +#include "net/base/ip_address_number.h" + +using local_discovery::ServiceDiscoverySharedClient; + +namespace { + +const int kCastInspectPort = 9222; +const char kCastServiceType[] = "_googlecast._tcp.local"; +const char kUnknownCastDevice[] = "Unknown Cast Device"; + +typedef std::map<std::string, std::string> ServiceTxtRecordMap; + +// Parses TXT record strings into a map. TXT key-value strings are assumed to +// follow the form "$key(=$value)?", where $key must contain at least one +// character, and $value may be empty. +scoped_ptr<ServiceTxtRecordMap> ParseServiceTxtRecord( + const std::vector<std::string>& record) { + scoped_ptr<ServiceTxtRecordMap> record_map(new ServiceTxtRecordMap()); + for (const auto& key_value_str : record) { + int index = key_value_str.find("=", 0); + if (index < 0 && key_value_str != "") { + // Some strings may only define a key (no '=' in the key/value string). + // The chosen behavior is to assume the value is the empty string. + record_map->insert(std::make_pair(key_value_str, "")); + } else { + std::string key = key_value_str.substr(0, index); + std::string value = key_value_str.substr(index + 1); + record_map->insert(std::make_pair(key, value)); + } + } + return record_map.Pass(); +} + +AndroidDeviceManager::DeviceInfo ServiceDescriptionToDeviceInfo( + const ServiceDescription& service_description) { + scoped_ptr<ServiceTxtRecordMap> record_map = + ParseServiceTxtRecord(service_description.metadata); + + AndroidDeviceManager::DeviceInfo device_info; + device_info.connected = true; + const auto& search = record_map->find("md"); + if (search != record_map->end() && search->second != "") + device_info.model = search->second; + else + device_info.model = kUnknownCastDevice; + + AndroidDeviceManager::BrowserInfo browser_info; + browser_info.socket_name = base::IntToString(kCastInspectPort); + browser_info.display_name = + base::SplitString(service_description.service_name, ".", + base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)[0]; + + browser_info.type = AndroidDeviceManager::BrowserInfo::kTypeChrome; + device_info.browser_info.push_back(browser_info); + return device_info; +} + +} // namespace + +// The purpose of this class is to route lister delegate signals from +// ServiceDiscoveryDeviceLister (on the UI thread) to CastDeviceProvider (on the +// DevTools ADB thread). Cancellable callbacks are necessary since +// CastDeviceProvider and ServiceDiscoveryDeviceLister are destroyed on +// different threads in undefined order. +class CastDeviceProvider::DeviceListerDelegate + : public ServiceDiscoveryDeviceLister::Delegate, + public base::SupportsWeakPtr<DeviceListerDelegate> { + public: + DeviceListerDelegate(base::WeakPtr<CastDeviceProvider> provider, + scoped_refptr<base::SingleThreadTaskRunner> runner) + : provider_(provider), runner_(runner) {} + + virtual ~DeviceListerDelegate() {} + + void StartDiscovery() { + // This must be called on the UI thread; ServiceDiscoverySharedClient and + // ServiceDiscoveryDeviceLister are thread protected. + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + if (device_lister_) + return; + service_discovery_client_ = ServiceDiscoverySharedClient::GetInstance(); + device_lister_.reset(new ServiceDiscoveryDeviceLister( + this, service_discovery_client_.get(), kCastServiceType)); + device_lister_->Start(); + device_lister_->DiscoverNewDevices(true); + } + + // ServiceDiscoveryDeviceLister::Delegate implementation: + void OnDeviceChanged(bool added, + const ServiceDescription& service_description) override { + runner_->PostTask( + FROM_HERE, base::Bind(&CastDeviceProvider::OnDeviceChanged, provider_, + added, service_description)); + } + + void OnDeviceRemoved(const std::string& service_name) override { + runner_->PostTask( + FROM_HERE, base::Bind(&CastDeviceProvider::OnDeviceRemoved, provider_, + service_name)); + } + + void OnDeviceCacheFlushed() override { + runner_->PostTask( + FROM_HERE, + base::Bind(&CastDeviceProvider::OnDeviceCacheFlushed, provider_)); + } + + private: + // The device provider to notify of device changes. + base::WeakPtr<CastDeviceProvider> provider_; + // Runner for the thread the WeakPtr was created on (this is where device + // messages will be posted). + scoped_refptr<base::SingleThreadTaskRunner> runner_; + scoped_refptr<ServiceDiscoverySharedClient> service_discovery_client_; + scoped_ptr<ServiceDiscoveryDeviceLister> device_lister_; +}; + +CastDeviceProvider::CastDeviceProvider() : weak_factory_(this) {} + +CastDeviceProvider::~CastDeviceProvider() {} + +void CastDeviceProvider::QueryDevices(const SerialsCallback& callback) { + if (!lister_delegate_) { + lister_delegate_.reset(new DeviceListerDelegate( + weak_factory_.GetWeakPtr(), base::ThreadTaskRunnerHandle::Get())); + content::BrowserThread::PostTask( + content::BrowserThread::UI, FROM_HERE, + base::Bind(&DeviceListerDelegate::StartDiscovery, + lister_delegate_->AsWeakPtr())); + } + std::set<net::HostPortPair> targets; + for (const auto& device_entry : device_info_map_) + targets.insert(net::HostPortPair(device_entry.first, kCastInspectPort)); + tcp_provider_ = new TCPDeviceProvider(targets); + tcp_provider_->QueryDevices(callback); +} + +void CastDeviceProvider::QueryDeviceInfo(const std::string& serial, + const DeviceInfoCallback& callback) { + auto it_device = device_info_map_.find(serial); + if (it_device == device_info_map_.end()) + return; + callback.Run(it_device->second); +} + +void CastDeviceProvider::OpenSocket(const std::string& serial, + const std::string& socket_name, + const SocketCallback& callback) { + tcp_provider_->OpenSocket(serial, socket_name, callback); +} + +void CastDeviceProvider::OnDeviceChanged( + bool added, + const ServiceDescription& service_description) { + VLOG(1) << "Device " << (added ? "added: " : "changed: ") + << service_description.service_name; + if (service_description.service_type() != kCastServiceType) + return; + std::string name = service_description.service_name; + std::string host = net::IPAddressToString(service_description.ip_address); + service_hostname_map_[name] = host; + device_info_map_[host] = ServiceDescriptionToDeviceInfo(service_description); +} + +void CastDeviceProvider::OnDeviceRemoved(const std::string& service_name) { + VLOG(1) << "Device removed: " << service_name; + auto it_hostname = service_hostname_map_.find(service_name); + if (it_hostname == service_hostname_map_.end()) + return; + std::string hostname = it_hostname->second; + service_hostname_map_.erase(it_hostname); + auto it_device = device_info_map_.find(hostname); + if (it_device == device_info_map_.end()) + return; + device_info_map_.erase(it_device); +} + +void CastDeviceProvider::OnDeviceCacheFlushed() { + VLOG(1) << "Device cache flushed"; + service_hostname_map_.clear(); + device_info_map_.clear(); +}
diff --git a/chrome/browser/devtools/device/cast_device_provider.h b/chrome/browser/devtools/device/cast_device_provider.h new file mode 100644 index 0000000..9d05c42 --- /dev/null +++ b/chrome/browser/devtools/device/cast_device_provider.h
@@ -0,0 +1,66 @@ +// Copyright 2015 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. + +#ifndef CHROME_BROWSER_DEVTOOLS_DEVICE_CAST_DEVICE_PROVIDER_H_ +#define CHROME_BROWSER_DEVTOOLS_DEVICE_CAST_DEVICE_PROVIDER_H_ + +#include <map> +#include <string> + +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "base/single_thread_task_runner.h" +#include "chrome/browser/devtools/device/android_device_manager.h" +#include "chrome/browser/devtools/device/tcp_device_provider.h" +#include "chrome/browser/local_discovery/service_discovery_device_lister.h" +#include "chrome/browser/local_discovery/service_discovery_shared_client.h" +#include "content/public/browser/browser_thread.h" + +using local_discovery::ServiceDescription; +using local_discovery::ServiceDiscoveryDeviceLister; +using local_discovery::ServiceDiscoverySharedClient; + +// Supplies Cast device information for the purposes of remote debugging Cast +// applications over ADB. +class CastDeviceProvider : public AndroidDeviceManager::DeviceProvider, + public ServiceDiscoveryDeviceLister::Delegate { + public: + CastDeviceProvider(); + + // DeviceProvider implementation: + void QueryDevices(const SerialsCallback& callback) override; + void QueryDeviceInfo(const std::string& serial, + const DeviceInfoCallback& callback) override; + void OpenSocket(const std::string& serial, + const std::string& socket_name, + const SocketCallback& callback) override; + + // ServiceDiscoveryDeviceLister::Delegate implementation: + void OnDeviceChanged(bool added, + const ServiceDescription& service_description) override; + void OnDeviceRemoved(const std::string& service_name) override; + void OnDeviceCacheFlushed() override; + + private: + class DeviceListerDelegate; + + ~CastDeviceProvider() override; + + scoped_refptr<TCPDeviceProvider> tcp_provider_; + scoped_ptr<DeviceListerDelegate, content::BrowserThread::DeleteOnUIThread> + lister_delegate_; + + // Keyed on the hostname (IP address). + std::map<std::string, AndroidDeviceManager::DeviceInfo> device_info_map_; + // Maps a service name to the hostname (IP address). + std::map<std::string, std::string> service_hostname_map_; + + base::WeakPtrFactory<CastDeviceProvider> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(CastDeviceProvider); +}; + +#endif // CHROME_BROWSER_DEVTOOLS_DEVICE_CAST_DEVICE_PROVIDER_H_
diff --git a/chrome/browser/devtools/device/cast_device_provider_unittest.cc b/chrome/browser/devtools/device/cast_device_provider_unittest.cc new file mode 100644 index 0000000..51b3096 --- /dev/null +++ b/chrome/browser/devtools/device/cast_device_provider_unittest.cc
@@ -0,0 +1,108 @@ +// Copyright 2015 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 "chrome/browser/devtools/device/cast_device_provider.h" + +#include "chrome/browser/devtools/device/android_device_manager.h" +#include "net/base/host_port_pair.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +typedef AndroidDeviceManager::DeviceInfo DeviceInfo; +typedef AndroidDeviceManager::BrowserInfo BrowserInfo; + +void CompareDeviceInfo(bool* was_run, + const DeviceInfo& expected, + const DeviceInfo& actual) { + EXPECT_EQ(expected.model, actual.model); + EXPECT_EQ(expected.connected, actual.connected); + + BrowserInfo exp_br_info = expected.browser_info[0]; + BrowserInfo act_br_info = actual.browser_info[0]; + EXPECT_EQ(exp_br_info.socket_name, act_br_info.socket_name); + EXPECT_EQ(exp_br_info.display_name, act_br_info.display_name); + EXPECT_EQ(exp_br_info.type, act_br_info.type); + + *was_run = true; +} + +void DummyCallback(bool* was_run, const DeviceInfo& device_info) { + *was_run = true; +} + +} // namespace + +TEST(CastDeviceProviderTest, ServiceDiscovery) { + scoped_refptr<CastDeviceProvider> device_provider_ = new CastDeviceProvider(); + + // Create a cast service. + const std::string cast_service_display_name = "FakeCast1337"; + const std::string cast_service_type = "_googlecast._tcp.local"; + const std::string cast_service_model = "Fake Cast Device"; + + ServiceDescription cast_service; + cast_service.service_name = + cast_service_display_name + "." + cast_service_type; + cast_service.address = net::HostPortPair("192.168.1.101", 8009); + cast_service.metadata.push_back("id=0123456789abcdef0123456789abcdef"); + cast_service.metadata.push_back("ve=00"); + cast_service.metadata.push_back("md=" + cast_service_model); + cast_service.ip_address = {192, 168, 1, 101}; + + device_provider_->OnDeviceChanged(true, cast_service); + + BrowserInfo exp_browser_info; + exp_browser_info.socket_name = "9222"; + exp_browser_info.display_name = cast_service_display_name; + exp_browser_info.type = BrowserInfo::kTypeChrome; + + DeviceInfo expected; + expected.model = cast_service_model; // From metadata::md + expected.connected = true; + expected.browser_info.push_back(exp_browser_info); + + bool was_run = false; + // Callback should be run, and the queried service should match the expected. + device_provider_->QueryDeviceInfo( + cast_service.address.host(), + base::Bind(&CompareDeviceInfo, &was_run, expected)); + ASSERT_TRUE(was_run); + was_run = false; + + // Create a non-cast service. + const std::string other_service_display_name = "OtherDevice"; + const std::string other_service_type = "_other._tcp.local"; + const std::string other_service_model = "Some Other Device"; + + ServiceDescription other_service; + other_service.service_name = + other_service_display_name + "." + other_service_type; + other_service.address = net::HostPortPair("10.64.1.101", 1234); + other_service.metadata.push_back("id=0123456789abcdef0123456789abcdef"); + other_service.metadata.push_back("ve=00"); + other_service.metadata.push_back("md=" + other_service_model); + other_service.ip_address = {10, 64, 1, 101}; + + // Callback should not be run, since this service is not yet discovered. + device_provider_->QueryDeviceInfo(other_service.address.host(), + base::Bind(&DummyCallback, &was_run)); + ASSERT_FALSE(was_run); + + device_provider_->OnDeviceChanged(true, other_service); + + // Callback should not be run, since non-cast services are not discovered by + // this device provider. + device_provider_->QueryDeviceInfo(other_service.address.host(), + base::Bind(&DummyCallback, &was_run)); + ASSERT_FALSE(was_run); + + // Remove the cast service. + device_provider_->OnDeviceRemoved(cast_service.service_name); + + // Callback should not be run, since the cast service has been removed. + device_provider_->QueryDeviceInfo(cast_service.address.host(), + base::Bind(&DummyCallback, &was_run)); + ASSERT_FALSE(was_run); +}
diff --git a/chrome/browser/devtools/device/devtools_android_bridge.cc b/chrome/browser/devtools/device/devtools_android_bridge.cc index ff1868a..9c6ebcb 100644 --- a/chrome/browser/devtools/device/devtools_android_bridge.cc +++ b/chrome/browser/devtools/device/devtools_android_bridge.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/devtools/device/devtools_android_bridge.h" +#include <algorithm> #include <map> #include <set> #include <vector> @@ -25,6 +26,7 @@ #include "base/threading/thread.h" #include "base/values.h" #include "chrome/browser/devtools/device/adb/adb_device_provider.h" +#include "chrome/browser/devtools/device/cast_device_provider.h" #include "chrome/browser/devtools/device/port_forwarding_controller.h" #include "chrome/browser/devtools/device/tcp_device_provider.h" #include "chrome/browser/devtools/device/usb/usb_device_provider.h" @@ -944,6 +946,7 @@ if (scoped_refptr<TCPDeviceProvider> provider = CreateTCPDeviceProvider()) device_providers.push_back(provider); + device_providers.push_back(new CastDeviceProvider()); device_providers.push_back(new AdbDeviceProvider()); PrefService* service = profile_->GetPrefs();
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index 909c81f..14208a9 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn
@@ -105,6 +105,9 @@ rebase_path(gypi_values.chrome_browser_extensions_non_chromeos_sources, ".", "//chrome") + if (is_android) { + sources -= [ "api/messaging/native_process_launcher_posix.cc" ] + } } if (use_ash) {
diff --git a/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc b/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc index 3e45141..bc4f98a4 100644 --- a/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc +++ b/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc
@@ -335,7 +335,8 @@ // // TODO(miu): Now that this test has been long-stable on Release build bots, it // should be enabled for the Debug build bots. http://crbug.com/396413 -#if defined(NDEBUG) +// Disabled in MacOS: https://crbug.com/557929 +#if defined(NDEBUG) && !defined(OS_MACOSX) #define MAYBE_EndToEnd EndToEnd #else #define MAYBE_EndToEnd DISABLED_EndToEnd
diff --git a/chrome/browser/extensions/api/debugger/debugger_api.cc b/chrome/browser/extensions/api/debugger/debugger_api.cc index e01e3a9..bfa4cdc 100644 --- a/chrome/browser/extensions/api/debugger/debugger_api.cc +++ b/chrome/browser/extensions/api/debugger/debugger_api.cc
@@ -151,6 +151,85 @@ return false; } +// ExtensionDevToolsInfoBar --------------------------------------------------- + +class ExtensionDevToolsInfoBar; +using ExtensionInfoBars = + std::map<std::string, ExtensionDevToolsInfoBar*>; +base::LazyInstance<ExtensionInfoBars>::Leaky g_extension_info_bars = + LAZY_INSTANCE_INITIALIZER; + +class ExtensionDevToolsInfoBar { + public: + static ExtensionDevToolsInfoBar* Create( + const std::string& extension_id, + const std::string& extension_name, + ExtensionDevToolsClientHost* client_host, + const base::Closure& dismissed_callback); + void Remove(ExtensionDevToolsClientHost* client_host); + + private: + ExtensionDevToolsInfoBar(const std::string& extension_id, + const std::string& extension_name); + ~ExtensionDevToolsInfoBar(); + void InfoBarDismissed(); + + std::string extension_id_; + std::map<ExtensionDevToolsClientHost*, base::Closure> callbacks_; + base::WeakPtr<GlobalConfirmInfoBar> infobar_; +}; + +// static +ExtensionDevToolsInfoBar* ExtensionDevToolsInfoBar::Create( + const std::string& extension_id, + const std::string& extension_name, + ExtensionDevToolsClientHost* client_host, + const base::Closure& dismissed_callback) { + ExtensionInfoBars::iterator it = + g_extension_info_bars.Get().find(extension_id); + ExtensionDevToolsInfoBar* infobar = nullptr; + if (it != g_extension_info_bars.Get().end()) + infobar = it->second; + else + infobar = new ExtensionDevToolsInfoBar(extension_id, extension_name); + infobar->callbacks_[client_host] = dismissed_callback; + return infobar; +} + +ExtensionDevToolsInfoBar::ExtensionDevToolsInfoBar( + const std::string& extension_id, + const std::string& extension_name) + : extension_id_(extension_id) { + g_extension_info_bars.Get()[extension_id] = this; + + // This class closes the |infobar_|, so it's safe to pass Unretained(this). + scoped_ptr<ExtensionDevToolsInfoBarDelegate> delegate( + new ExtensionDevToolsInfoBarDelegate( + base::Bind(&ExtensionDevToolsInfoBar::InfoBarDismissed, + base::Unretained(this)), + extension_name)); + infobar_ = GlobalConfirmInfoBar::Show(delegate.Pass()); +} + +ExtensionDevToolsInfoBar::~ExtensionDevToolsInfoBar() { + g_extension_info_bars.Get().erase(extension_id_); + if (infobar_) + infobar_->Close(); +} + +void ExtensionDevToolsInfoBar::Remove( + ExtensionDevToolsClientHost* client_host) { + callbacks_.erase(client_host); + if (!callbacks_.size()) + delete this; +} + +void ExtensionDevToolsInfoBar::InfoBarDismissed() { + std::map<ExtensionDevToolsClientHost*, base::Closure> copy = callbacks_; + for (const auto& pair: copy) + pair.second.Run(); +} + } // namespace // ExtensionDevToolsClientHost ------------------------------------------------ @@ -210,7 +289,7 @@ content::NotificationRegistrar registrar_; int last_request_id_; PendingRequests pending_requests_; - base::WeakPtr<GlobalConfirmInfoBar> infobar_; + ExtensionDevToolsInfoBar* infobar_; api::debugger::DetachReason detach_reason_; // Listen to extension unloaded notification. @@ -232,6 +311,7 @@ agent_host_(agent_host), extension_id_(extension_id), last_request_id_(0), + infobar_(nullptr), detach_reason_(api::debugger::DETACH_REASON_TARGET_CLOSED), extension_registry_observer_(this) { CopyDebuggee(&debuggee_, debuggee); @@ -253,19 +333,16 @@ if (!base::CommandLine::ForCurrentProcess()->HasSwitch( ::switches::kSilentDebuggerExtensionAPI)) { - // This class closes the |infobar_|, so it's safe to pass Unretained(this). - scoped_ptr<ExtensionDevToolsInfoBarDelegate> delegate( - new ExtensionDevToolsInfoBarDelegate( - base::Bind(&ExtensionDevToolsClientHost::InfoBarDismissed, - base::Unretained(this)), - extension_name)); - infobar_ = GlobalConfirmInfoBar::Show(delegate.Pass()); + infobar_ = ExtensionDevToolsInfoBar::Create( + extension_id, extension_name, this, + base::Bind(&ExtensionDevToolsClientHost::InfoBarDismissed, + base::Unretained(this))); } } ExtensionDevToolsClientHost::~ExtensionDevToolsClientHost() { if (infobar_) - infobar_->Close(); + infobar_->Remove(this); g_attached_client_hosts.Get().erase(this); }
diff --git a/chrome/browser/extensions/api/debugger/debugger_apitest.cc b/chrome/browser/extensions/api/debugger/debugger_apitest.cc index 82c24e26..1ca4e71f 100644 --- a/chrome/browser/extensions/api/debugger/debugger_apitest.cc +++ b/chrome/browser/extensions/api/debugger/debugger_apitest.cc
@@ -193,6 +193,8 @@ new Browser(Browser::CreateParams(profile(), chrome::GetActiveDesktop())); AddBlankTabAndShow(another_browser); AddBlankTabAndShow(another_browser); + int tab_id2 = SessionTabHelper::IdForTab( + another_browser->tab_strip_model()->GetActiveWebContents()); InfoBarService* service1 = InfoBarService::FromWebContents( browser()->tab_strip_model()->GetActiveWebContents()); @@ -212,6 +214,27 @@ EXPECT_EQ(1u, service2->infobar_count()); EXPECT_EQ(1u, service3->infobar_count()); + // Second attach should not create infobars. + attach_function = new DebuggerAttachFunction(); + attach_function->set_extension(extension()); + ASSERT_TRUE( + RunFunction(attach_function.get(), + base::StringPrintf("[{\"tabId\": %d}, \"1.1\"]", tab_id2), + browser(), extension_function_test_utils::NONE)); + EXPECT_EQ(1u, service1->infobar_count()); + EXPECT_EQ(1u, service2->infobar_count()); + EXPECT_EQ(1u, service3->infobar_count()); + + // Detach from one of the tabs should not remove infobars. + detach_function = new DebuggerDetachFunction(); + detach_function->set_extension(extension()); + ASSERT_TRUE(RunFunction(detach_function.get(), + base::StringPrintf("[{\"tabId\": %d}]", tab_id2), + browser(), extension_function_test_utils::NONE)); + EXPECT_EQ(1u, service1->infobar_count()); + EXPECT_EQ(1u, service2->infobar_count()); + EXPECT_EQ(1u, service3->infobar_count()); + // Detach should remove all infobars. detach_function = new DebuggerDetachFunction(); detach_function->set_extension(extension());
diff --git a/chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.cc b/chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.cc index 3ae118ba..7d0bc96 100644 --- a/chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.cc +++ b/chrome/browser/extensions/api/gcd_private/privet_v3_context_getter.cc
@@ -32,18 +32,35 @@ const net::CompletionCallback& callback, scoped_ptr<Request>* out_req, const net::BoundNetLog& net_log) override { - // Mark certificate as invalid as we didn't check it. verify_result->Reset(); verify_result->verified_cert = cert; - verify_result->cert_status = net::CERT_STATUS_INVALID; - auto it = fingerprints_.find(hostname); - if (it == fingerprints_.end()) - return net::ERR_CERT_INVALID; + // Because no trust anchor checking is being performed, don't indicate that + // it came from an OS-trusted root. + verify_result->is_issued_by_known_root = false; + // Because no trust anchor checking is being performed, don't indicate that + // it came from a supplemental trust anchor. + verify_result->is_issued_by_additional_trust_anchor = false; + // Because no name checking is being performed, don't indicate that it the + // common name was used. + verify_result->common_name_fallback_used = false; + // Because the signature is not checked, do not indicate any deprecated + // signature algorithms were used, even if they might be present. + verify_result->has_md2 = false; + verify_result->has_md4 = false; + verify_result->has_md5 = false; + verify_result->has_sha1 = false; + verify_result->has_sha1_leaf = false; + // Because no chain hashes calculation is being performed, keep hashes + // container clean. + verify_result->public_key_hashes.clear(); - auto fingerprint = - net::X509Certificate::CalculateFingerprint256(cert->os_cert_handle()); - return it->second.Equals(fingerprint) ? net::OK : net::ERR_CERT_INVALID; + verify_result->cert_status = CheckFingerprint(cert, hostname) + ? 0 + : net::CERT_STATUS_AUTHORITY_INVALID; + return net::IsCertStatusError(verify_result->cert_status) + ? net::MapCertStatusToNetError(verify_result->cert_status) + : net::OK; } void AddPairedHost(const std::string& host, @@ -52,6 +69,16 @@ } private: + bool CheckFingerprint(net::X509Certificate* cert, + const std::string& hostname) const { + auto it = fingerprints_.find(hostname); + if (it == fingerprints_.end()) + return false; + + return it->second.Equals( + net::X509Certificate::CalculateFingerprint256(cert->os_cert_handle())); + } + std::map<std::string, net::SHA256HashValue> fingerprints_; DISALLOW_COPY_AND_ASSIGN(CertVerifier);
diff --git a/chrome/browser/extensions/api/messaging/native_process_launcher_android.cc b/chrome/browser/extensions/api/messaging/native_process_launcher_android.cc new file mode 100644 index 0000000..d6c1b17 --- /dev/null +++ b/chrome/browser/extensions/api/messaging/native_process_launcher_android.cc
@@ -0,0 +1,26 @@ +// Copyright 2015 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 "chrome/browser/extensions/api/messaging/native_process_launcher.h" + +namespace extensions { + +// static +base::FilePath NativeProcessLauncher::FindManifest( + const std::string& host_name, + bool allow_user_level_hosts, + std::string* error_message) { + return base::FilePath(); +} + +// static +bool NativeProcessLauncher::LaunchNativeProcess( + const base::CommandLine& command_line, + base::Process* process, + base::File* read_file, + base::File* write_file) { + return false; +} + +} // namespace extensions
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc index 7bcba9bb..e0012e7b 100644 --- a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc +++ b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
@@ -174,7 +174,13 @@ } // Tests that tab capture video frames can be received in a VIDEO element. -IN_PROC_BROWSER_TEST_F(TabCaptureApiPixelTest, EndToEndWithoutRemoting) { +// Disabled in MacOS: https://crbug.com/557929 +#if defined(OS_MACOSX) +#define MAYBE_EndToEndWithoutRemoting DISABLED_EndToEndWithoutRemoting +#else +#define MAYBE_EndToEndWithoutRemoting EndToEndWithoutRemoting +#endif +IN_PROC_BROWSER_TEST_F(TabCaptureApiPixelTest, MAYBE_EndToEndWithoutRemoting) { if (IsTooIntensiveForThisPlatform()) { LOG(WARNING) << "Skipping this CPU-intensive test on this platform/build."; return; @@ -189,7 +195,13 @@ // received in a VIDEO element. More allowance is provided for color deviation // because of the additional layers of video processing performed within // WebRTC. -IN_PROC_BROWSER_TEST_F(TabCaptureApiPixelTest, EndToEndThroughWebRTC) { +// Disabled in MacOS: https://crbug.com/557929 +#if defined(OS_MACOSX) +#define MAYBE_EndToEndThroughWebRTC DISABLED_EndToEndThroughWebRTC +#else +#define MAYBE_EndToEndThroughWebRTC EndToEndThroughWebRTC +#endif +IN_PROC_BROWSER_TEST_F(TabCaptureApiPixelTest, MAYBE_EndToEndThroughWebRTC) { if (IsTooIntensiveForThisPlatform()) { LOG(WARNING) << "Skipping this CPU-intensive test on this platform/build."; return;
diff --git a/chrome/browser/extensions/dev_mode_bubble_delegate.cc b/chrome/browser/extensions/dev_mode_bubble_delegate.cc index 1ac48c9..5f723de 100644 --- a/chrome/browser/extensions/dev_mode_bubble_delegate.cc +++ b/chrome/browser/extensions/dev_mode_bubble_delegate.cc
@@ -19,6 +19,13 @@ namespace extensions { +namespace { + +base::LazyInstance<std::set<Profile*> > g_shown_for_profiles = + LAZY_INSTANCE_INITIALIZER; + +} // namespace + DevModeBubbleDelegate::DevModeBubbleDelegate(Profile* profile) : ExtensionMessageBubbleController::Delegate(profile) { } @@ -98,12 +105,13 @@ action, ExtensionMessageBubbleController::ACTION_BOUNDARY); } -const char* DevModeBubbleDelegate::GetKey() { - return "DevModeBubbleDelegate"; +std::set<Profile*>* DevModeBubbleDelegate::GetProfileSet() { + return g_shown_for_profiles.Pointer(); } -bool DevModeBubbleDelegate::ClearProfileSetAfterAction() { - return false; +// static +void DevModeBubbleDelegate::ClearProfileListForTesting() { + g_shown_for_profiles.Get().clear(); } } // namespace extensions
diff --git a/chrome/browser/extensions/dev_mode_bubble_delegate.h b/chrome/browser/extensions/dev_mode_bubble_delegate.h index 7412aa7a..b8bdaab 100644 --- a/chrome/browser/extensions/dev_mode_bubble_delegate.h +++ b/chrome/browser/extensions/dev_mode_bubble_delegate.h
@@ -40,8 +40,9 @@ bool ShouldLimitToEnabledExtensions() const override; void LogExtensionCount(size_t count) override; void LogAction(ExtensionMessageBubbleController::BubbleAction) override; - const char* GetKey() override; - bool ClearProfileSetAfterAction() override; + std::set<Profile*>* GetProfileSet() override; + + static void ClearProfileListForTesting(); private: DISALLOW_COPY_AND_ASSIGN(DevModeBubbleDelegate);
diff --git a/chrome/browser/extensions/extension_message_bubble_controller.cc b/chrome/browser/extensions/extension_message_bubble_controller.cc index 7c9d2ce..8dd0160 100644 --- a/chrome/browser/extensions/extension_message_bubble_controller.cc +++ b/chrome/browser/extensions/extension_message_bubble_controller.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/extensions/extension_message_bubble_controller.h" #include "base/bind.h" -#include "base/lazy_instance.h" #include "base/metrics/histogram.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" @@ -25,18 +24,12 @@ namespace extensions { namespace { - // How many extensions to show in the bubble (max). const int kMaxExtensionsToShow = 7; // Whether or not to ignore the learn more link navigation for testing. bool g_should_ignore_learn_more_for_testing = false; - -using ProfileSetMap = std::map<std::string, std::set<Profile*>>; -base::LazyInstance<ProfileSetMap> g_shown_for_profiles = - LAZY_INSTANCE_INITIALIZER; - -} // namespace +} //////////////////////////////////////////////////////////////////////////////// // ExtensionMessageBubbleController::Delegate @@ -55,10 +48,6 @@ return l10n_util::GetStringUTF16(IDS_LEARN_MORE); } -bool ExtensionMessageBubbleController::Delegate::ClearProfileSetAfterAction() { - return true; -} - bool ExtensionMessageBubbleController::Delegate::HasBubbleInfoBeenAcknowledged( const std::string& extension_id) { std::string pref_name = get_acknowledged_flag_pref_name(); @@ -82,6 +71,11 @@ value ? new base::FundamentalValue(value) : NULL); } +std::set<Profile*>* +ExtensionMessageBubbleController::Delegate::GetProfileSet() { + return nullptr; +} + std::string ExtensionMessageBubbleController::Delegate::get_acknowledged_flag_pref_name() const { @@ -114,8 +108,8 @@ } bool ExtensionMessageBubbleController::ShouldShow() { - std::set<Profile*>* profiles = GetProfileSet(); - return !profiles->count(profile()->GetOriginalProfile()) && + std::set<Profile*>* profiles = delegate_->GetProfileSet(); + return (!profiles || !profiles->count(profile()->GetOriginalProfile())) && !GetExtensionList().empty(); } @@ -176,7 +170,9 @@ } void ExtensionMessageBubbleController::OnShown() { - GetProfileSet()->insert(profile()->GetOriginalProfile()); + std::set<Profile*>* profiles = delegate_->GetProfileSet(); + if (profiles) + profiles->insert(profile()->GetOriginalProfile()); } void ExtensionMessageBubbleController::OnBubbleAction() { @@ -189,21 +185,18 @@ OnClose(); } -void ExtensionMessageBubbleController::OnBubbleDismiss( - bool closed_by_deactivation) { +void ExtensionMessageBubbleController::OnBubbleDismiss() { // OnBubbleDismiss() can be called twice when we receive multiple // "OnWidgetDestroying" notifications (this can at least happen when we close // a window with a notification open). Handle this gracefully. if (user_action_ != ACTION_BOUNDARY) { - DCHECK(user_action_ == ACTION_DISMISS_USER_ACTION || - user_action_ == ACTION_DISMISS_DEACTIVATION); + DCHECK(user_action_ == ACTION_DISMISS); return; } - user_action_ = closed_by_deactivation ? ACTION_DISMISS_DEACTIVATION - : ACTION_DISMISS_USER_ACTION; + user_action_ = ACTION_DISMISS; - delegate_->LogAction(user_action_); + delegate_->LogAction(ACTION_DISMISS); OnClose(); } @@ -224,10 +217,6 @@ OnClose(); } -void ExtensionMessageBubbleController::ClearProfileListForTesting() { - GetProfileSet()->clear(); -} - // static void ExtensionMessageBubbleController::set_should_ignore_learn_more_for_testing( bool should_ignore) { @@ -263,22 +252,9 @@ } void ExtensionMessageBubbleController::OnClose() { - DCHECK_NE(ACTION_BOUNDARY, user_action_); - // If the bubble was closed due to deactivation, don't treat it as - // acknowledgment so that the user will see the bubble again (until they - // explicitly take an action). - if (user_action_ != ACTION_DISMISS_DEACTIVATION) { - AcknowledgeExtensions(); - if (delegate_->ClearProfileSetAfterAction()) - GetProfileSet()->clear(); - } - + AcknowledgeExtensions(); if (did_highlight_) ToolbarActionsModel::Get(profile())->StopHighlighting(); } -std::set<Profile*>* ExtensionMessageBubbleController::GetProfileSet() { - return &g_shown_for_profiles.Get()[delegate_->GetKey()]; -} - } // namespace extensions
diff --git a/chrome/browser/extensions/extension_message_bubble_controller.h b/chrome/browser/extensions/extension_message_bubble_controller.h index c3059c5..40e5b81be 100644 --- a/chrome/browser/extensions/extension_message_bubble_controller.h +++ b/chrome/browser/extensions/extension_message_bubble_controller.h
@@ -24,9 +24,8 @@ enum BubbleAction { ACTION_LEARN_MORE = 0, ACTION_EXECUTE, - ACTION_DISMISS_USER_ACTION, - ACTION_DISMISS_DEACTIVATION, - ACTION_BOUNDARY, // Must be the last value. + ACTION_DISMISS, + ACTION_BOUNDARY, // Must be the last value. }; class Delegate { @@ -75,22 +74,14 @@ virtual void LogExtensionCount(size_t count) = 0; virtual void LogAction(BubbleAction action) = 0; - // Returns a key unique to the type of bubble that can be used to retrieve - // state specific to the type (e.g., shown for profiles). - virtual const char* GetKey() = 0; - - // Whether the "shown for profiles" set should be cleared if an action is - // taken on the bubble. This defaults to true, since once an action is - // taken, the extension will usually either be acknowledged or removed, and - // the bubble won't show for that extension. - // This should be false in cases where there is no acknowledgment option - // (as in the developer-mode extension warning). - virtual bool ClearProfileSetAfterAction(); - // Has the user acknowledged info about the extension the bubble reports. - bool HasBubbleInfoBeenAcknowledged(const std::string& extension_id); - void SetBubbleInfoBeenAcknowledged(const std::string& extension_id, - bool value); + virtual bool HasBubbleInfoBeenAcknowledged(const std::string& extension_id); + virtual void SetBubbleInfoBeenAcknowledged(const std::string& extension_id, + bool value); + + // Returns the set of profiles for which this bubble has been shown. + // If profiles are not tracked, returns null (default). + virtual std::set<Profile*>* GetProfileSet(); protected: Profile* profile() { return profile_; } @@ -150,11 +141,9 @@ // Callbacks from bubble. Declared virtual for testing purposes. virtual void OnBubbleAction(); - virtual void OnBubbleDismiss(bool dismissed_by_deactivation); + virtual void OnBubbleDismiss(); virtual void OnLinkClicked(); - void ClearProfileListForTesting(); - static void set_should_ignore_learn_more_for_testing( bool should_ignore_learn_more); @@ -168,8 +157,6 @@ // Performs cleanup after the bubble closes. void OnClose(); - std::set<Profile*>* GetProfileSet(); - // A weak pointer to the Browser we are associated with. Not owned by us. Browser* browser_;
diff --git a/chrome/browser/extensions/extension_message_bubble_controller_unittest.cc b/chrome/browser/extensions/extension_message_bubble_controller_unittest.cc index 4af1301aa..129990f 100644 --- a/chrome/browser/extensions/extension_message_bubble_controller_unittest.cc +++ b/chrome/browser/extensions/extension_message_bubble_controller_unittest.cc
@@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/bind_helpers.h" #include "base/command_line.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" @@ -60,9 +59,9 @@ ++action_button_callback_count_; ExtensionMessageBubbleController::OnBubbleAction(); } - void OnBubbleDismiss(bool by_deactivation) override { + void OnBubbleDismiss() override { ++dismiss_button_callback_count_; - ExtensionMessageBubbleController::OnBubbleDismiss(by_deactivation); + ExtensionMessageBubbleController::OnBubbleDismiss(); } void OnLinkClicked() override { ++link_click_callback_count_; @@ -90,12 +89,10 @@ enum ExtensionBubbleAction { BUBBLE_ACTION_CLICK_ACTION_BUTTON = 0, BUBBLE_ACTION_CLICK_DISMISS_BUTTON, - BUBBLE_ACTION_DISMISS_DEACTIVATION, BUBBLE_ACTION_CLICK_LINK, }; - FakeExtensionMessageBubble() - : action_(BUBBLE_ACTION_CLICK_ACTION_BUTTON), controller_(nullptr) {} + FakeExtensionMessageBubble() : controller_(nullptr) {} void set_action_on_show(ExtensionBubbleAction action) { action_ = action; @@ -106,20 +103,12 @@ void Show() { controller_->OnShown(); - switch (action_) { - case BUBBLE_ACTION_CLICK_ACTION_BUTTON: - controller_->OnBubbleAction(); - break; - case BUBBLE_ACTION_CLICK_DISMISS_BUTTON: - controller_->OnBubbleDismiss(false); - break; - case BUBBLE_ACTION_DISMISS_DEACTIVATION: - controller_->OnBubbleDismiss(true); - break; - case BUBBLE_ACTION_CLICK_LINK: - controller_->OnLinkClicked(); - break; - } + if (action_ == BUBBLE_ACTION_CLICK_ACTION_BUTTON) + controller_->OnBubbleAction(); + else if (action_ == BUBBLE_ACTION_CLICK_DISMISS_BUTTON) + controller_->OnBubbleDismiss(); + else if (action_ == BUBBLE_ACTION_CLICK_LINK) + controller_->OnLinkClicked(); } private: @@ -316,70 +305,6 @@ DISALLOW_COPY_AND_ASSIGN(ExtensionMessageBubbleTest); }; -TEST_F(ExtensionMessageBubbleTest, BubbleReshowsOnDeactivationDismissal) { - Init(); - - ASSERT_TRUE(LoadExtensionOverridingNtp("1", kId1, Manifest::INTERNAL)); - ASSERT_TRUE(LoadExtensionOverridingNtp("2", kId2, Manifest::INTERNAL)); - scoped_ptr<TestExtensionMessageBubbleController> controller( - new TestExtensionMessageBubbleController( - new NtpOverriddenBubbleDelegate(browser()->profile()), browser())); - - // The list will contain one enabled unpacked extension (ext 2). - EXPECT_TRUE(controller->ShouldShow()); - std::vector<base::string16> override_extensions = - controller->GetExtensionList(); - ASSERT_EQ(1U, override_extensions.size()); - EXPECT_EQ(base::ASCIIToUTF16("Extension 2"), override_extensions[0]); - EXPECT_EQ(0U, controller->link_click_count()); - EXPECT_EQ(0U, controller->dismiss_click_count()); - EXPECT_EQ(0U, controller->action_click_count()); - - // Simulate showing the bubble and dismissing it due to deactivation. - FakeExtensionMessageBubble bubble; - bubble.set_action_on_show( - FakeExtensionMessageBubble::BUBBLE_ACTION_DISMISS_DEACTIVATION); - bubble.set_controller(controller.get()); - bubble.Show(); - EXPECT_EQ(0U, controller->link_click_count()); - EXPECT_EQ(0U, controller->action_click_count()); - EXPECT_EQ(1U, controller->dismiss_click_count()); - - // No extension should have become disabled. - ExtensionRegistry* registry = ExtensionRegistry::Get(profile()); - EXPECT_TRUE(registry->enabled_extensions().GetByID(kId2)); - // And since it was dismissed due to deactivation, the extension should not - // have been acknowledged. - EXPECT_FALSE(controller->delegate()->HasBubbleInfoBeenAcknowledged(kId2)); - - bubble.set_action_on_show( - FakeExtensionMessageBubble::BUBBLE_ACTION_DISMISS_DEACTIVATION); - controller.reset(new TestExtensionMessageBubbleController( - new NtpOverriddenBubbleDelegate(browser()->profile()), browser())); - // The bubble shouldn't show again for the same profile (we don't want to - // be annoying). - EXPECT_FALSE(controller->ShouldShow()); - controller->ClearProfileListForTesting(); - EXPECT_TRUE(controller->ShouldShow()); - // Explicitly click the dismiss button. The extension should be acknowledged. - bubble.set_controller(controller.get()); - bubble.set_action_on_show( - FakeExtensionMessageBubble::BUBBLE_ACTION_CLICK_DISMISS_BUTTON); - bubble.Show(); - EXPECT_TRUE(controller->delegate()->HasBubbleInfoBeenAcknowledged(kId2)); - - // Uninstall the current ntp-controlling extension, allowing the other to - // take control. - service_->UninstallExtension(kId2, UNINSTALL_REASON_FOR_TESTING, - base::Bind(&base::DoNothing), nullptr); - - // Even though we already showed for the given profile, we should show again, - // because it's a different extension. - controller.reset(new TestExtensionMessageBubbleController( - new NtpOverriddenBubbleDelegate(browser()->profile()), browser())); - EXPECT_TRUE(controller->ShouldShow()); -} - // The feature this is meant to test is only enacted on Windows, but it should // pass on all platforms. TEST_F(ExtensionMessageBubbleTest, WipeoutControllerTest) { @@ -418,7 +343,7 @@ new TestExtensionMessageBubbleController( new SuspiciousExtensionBubbleDelegate(browser()->profile()), browser())); - controller->ClearProfileListForTesting(); + SuspiciousExtensionBubbleDelegate::ClearProfileListForTesting(); EXPECT_TRUE(controller->ShouldShow()); suspicious_extensions = controller->GetExtensionList(); ASSERT_EQ(1U, suspicious_extensions.size()); @@ -443,7 +368,7 @@ new TestExtensionMessageBubbleController( new SuspiciousExtensionBubbleDelegate(browser()->profile()), browser())); - controller->ClearProfileListForTesting(); + SuspiciousExtensionBubbleDelegate::ClearProfileListForTesting(); EXPECT_TRUE(controller->ShouldShow()); suspicious_extensions = controller->GetExtensionList(); ASSERT_EQ(2U, suspicious_extensions.size()); @@ -505,12 +430,7 @@ new TestExtensionMessageBubbleController( new DevModeBubbleDelegate(browser()->profile()), browser())); - // Most bubbles would want to show again as long as the extensions weren't - // acknowledged and the bubble wasn't dismissed due to deactivation. Since dev - // mode extensions can't be (persistently) acknowledged, this isn't the case - // for the dev mode bubble, and we should only show once per profile. - EXPECT_FALSE(controller->ShouldShow()); - controller->ClearProfileListForTesting(); + DevModeBubbleDelegate::ClearProfileListForTesting(); EXPECT_TRUE(controller->ShouldShow()); dev_mode_extensions = controller->GetExtensionList(); EXPECT_EQ(2U, dev_mode_extensions.size()); @@ -533,7 +453,7 @@ new TestExtensionMessageBubbleController( new DevModeBubbleDelegate(browser()->profile()), browser())); - controller->ClearProfileListForTesting(); + DevModeBubbleDelegate::ClearProfileListForTesting(); EXPECT_TRUE(controller->ShouldShow()); dev_mode_extensions = controller->GetExtensionList(); EXPECT_EQ(2U, dev_mode_extensions.size()); @@ -553,7 +473,7 @@ new TestExtensionMessageBubbleController( new DevModeBubbleDelegate(browser()->profile()), browser())); - controller->ClearProfileListForTesting(); + DevModeBubbleDelegate::ClearProfileListForTesting(); EXPECT_FALSE(controller->ShouldShow()); dev_mode_extensions = controller->GetExtensionList(); EXPECT_EQ(0U, dev_mode_extensions.size());
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc index 5c90551c..355da39 100644 --- a/chrome/browser/extensions/extension_service_unittest.cc +++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -438,7 +438,7 @@ // browser startup. There's no StartupObserver as there normally // would be since we're in a unit test, so we have to explicitly // note tasks should be processed. - AfterStartupTaskUtils::SetBrowserStartupIsComplete(); + AfterStartupTaskUtils::SetBrowserStartupIsCompleteForTesting(); } void AddMockExternalProvider(
diff --git a/chrome/browser/extensions/ntp_overridden_bubble_delegate.cc b/chrome/browser/extensions/ntp_overridden_bubble_delegate.cc index c2baee0f..f76ebdc8 100644 --- a/chrome/browser/extensions/ntp_overridden_bubble_delegate.cc +++ b/chrome/browser/extensions/ntp_overridden_bubble_delegate.cc
@@ -129,8 +129,4 @@ ExtensionMessageBubbleController::ACTION_BOUNDARY); } -const char* NtpOverriddenBubbleDelegate::GetKey() { - return "NtpOverriddenBubbleDelegate"; -} - } // namespace extensions
diff --git a/chrome/browser/extensions/ntp_overridden_bubble_delegate.h b/chrome/browser/extensions/ntp_overridden_bubble_delegate.h index 357d09ce..80026ab 100644 --- a/chrome/browser/extensions/ntp_overridden_bubble_delegate.h +++ b/chrome/browser/extensions/ntp_overridden_bubble_delegate.h
@@ -39,7 +39,6 @@ bool ShouldLimitToEnabledExtensions() const override; void LogExtensionCount(size_t count) override; void LogAction(ExtensionMessageBubbleController::BubbleAction) override; - const char* GetKey() override; private: // The ID of the extension we are showing the bubble for.
diff --git a/chrome/browser/extensions/proxy_overridden_bubble_delegate.cc b/chrome/browser/extensions/proxy_overridden_bubble_delegate.cc index b2b3db5b..59c7dd43 100644 --- a/chrome/browser/extensions/proxy_overridden_bubble_delegate.cc +++ b/chrome/browser/extensions/proxy_overridden_bubble_delegate.cc
@@ -143,8 +143,4 @@ ExtensionMessageBubbleController::ACTION_BOUNDARY); } -const char* ProxyOverriddenBubbleDelegate::GetKey() { - return "ProxyOverriddenBubbleDelegate"; -} - } // namespace extensions
diff --git a/chrome/browser/extensions/proxy_overridden_bubble_delegate.h b/chrome/browser/extensions/proxy_overridden_bubble_delegate.h index dedc843..cbd851d1 100644 --- a/chrome/browser/extensions/proxy_overridden_bubble_delegate.h +++ b/chrome/browser/extensions/proxy_overridden_bubble_delegate.h
@@ -40,7 +40,6 @@ bool ShouldLimitToEnabledExtensions() const override; void LogExtensionCount(size_t count) override; void LogAction(ExtensionMessageBubbleController::BubbleAction) override; - const char* GetKey() override; private: // The ID of the extension we are showing the bubble for.
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc index b1018d8c..a4786927 100644 --- a/chrome/browser/extensions/service_worker_apitest.cc +++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -12,7 +12,9 @@ #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/web_contents.h" +#include "content/public/common/content_switches.h" #include "content/public/common/page_type.h" +#include "content/public/test/background_sync_test_util.h" #include "content/public/test/browser_test_utils.h" #include "extensions/browser/extension_host.h" #include "extensions/browser/process_manager.h" @@ -113,6 +115,27 @@ DISALLOW_COPY_AND_ASSIGN(ServiceWorkerTest); }; +class ServiceWorkerBackgroundSyncTest : public ServiceWorkerTest { + public: + ServiceWorkerBackgroundSyncTest() {} + ~ServiceWorkerBackgroundSyncTest() override {} + + void SetUpCommandLine(base::CommandLine* command_line) override { + // ServiceWorkerRegistration.sync requires experimental flag. + command_line->AppendSwitch( + switches::kEnableExperimentalWebPlatformFeatures); + ServiceWorkerTest::SetUpCommandLine(command_line); + } + + void SetUp() override { + content::background_sync_test_util::SetIgnoreNetworkChangeNotifier(true); + ServiceWorkerTest::SetUp(); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ServiceWorkerBackgroundSyncTest); +}; + IN_PROC_BROWSER_TEST_F(ServiceWorkerTest, RegisterSucceedsOnTrunk) { StartTestFromBackgroundPage("register.js", kExpectSuccess); } @@ -342,4 +365,30 @@ "page.html")); } +IN_PROC_BROWSER_TEST_F(ServiceWorkerBackgroundSyncTest, Sync) { + const Extension* extension = LoadExtensionWithFlags( + test_data_dir_.AppendASCII("service_worker/sync"), kFlagNone); + ASSERT_TRUE(extension); + ui_test_utils::NavigateToURL(browser(), + extension->GetResourceURL("page.html")); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + + // Prevent firing by going offline. + content::background_sync_test_util::SetOnline(web_contents, false); + + ExtensionTestMessageListener sync_listener("SYNC: send-chats", false); + sync_listener.set_failure_message("FAIL"); + + std::string result; + ASSERT_TRUE(content::ExecuteScriptAndExtractString( + web_contents, "window.runServiceWorker()", &result)); + ASSERT_EQ("SERVICE_WORKER_READY", result); + + EXPECT_FALSE(sync_listener.was_satisfied()); + // Resume firing by going online. + content::background_sync_test_util::SetOnline(web_contents, true); + EXPECT_TRUE(sync_listener.WaitUntilSatisfied()); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/settings_api_bubble_delegate.cc b/chrome/browser/extensions/settings_api_bubble_delegate.cc index 26ac3da..2641883f 100644 --- a/chrome/browser/extensions/settings_api_bubble_delegate.cc +++ b/chrome/browser/extensions/settings_api_bubble_delegate.cc
@@ -238,17 +238,4 @@ } } -const char* SettingsApiBubbleDelegate::GetKey() { - switch (type_) { - case BUBBLE_TYPE_HOME_PAGE: - return "SettingsApiBubbleDelegate.HomePage"; - case BUBBLE_TYPE_STARTUP_PAGES: - return "SettingsApiBubbleDelegate.StartupPages"; - case BUBBLE_TYPE_SEARCH_ENGINE: - return "SettingsApiBubbleDelegate.SearchEngine"; - } - NOTREACHED(); - return ""; -} - } // namespace extensions
diff --git a/chrome/browser/extensions/settings_api_bubble_delegate.h b/chrome/browser/extensions/settings_api_bubble_delegate.h index aea8350..dde081d3 100644 --- a/chrome/browser/extensions/settings_api_bubble_delegate.h +++ b/chrome/browser/extensions/settings_api_bubble_delegate.h
@@ -39,7 +39,6 @@ bool ShouldLimitToEnabledExtensions() const override; void LogExtensionCount(size_t count) override; void LogAction(ExtensionMessageBubbleController::BubbleAction) override; - const char* GetKey() override; private: // The type of settings override this bubble will report on. This can be, for
diff --git a/chrome/browser/extensions/suspicious_extension_bubble_delegate.cc b/chrome/browser/extensions/suspicious_extension_bubble_delegate.cc index 33381d71d..c4b95ed 100644 --- a/chrome/browser/extensions/suspicious_extension_bubble_delegate.cc +++ b/chrome/browser/extensions/suspicious_extension_bubble_delegate.cc
@@ -26,6 +26,9 @@ // Whether the user has been notified about extension being wiped out. const char kWipeoutAcknowledged[] = "ack_wiped"; +base::LazyInstance<std::set<Profile*> > g_shown_for_profiles = + LAZY_INSTANCE_INITIALIZER; + } // namespace namespace extensions { @@ -129,8 +132,13 @@ action, ExtensionMessageBubbleController::ACTION_BOUNDARY); } -const char* SuspiciousExtensionBubbleDelegate::GetKey() { - return "SuspiciousExtensionBubbleDelegate"; +std::set<Profile*>* SuspiciousExtensionBubbleDelegate::GetProfileSet() { + return g_shown_for_profiles.Pointer(); +} + +// static +void SuspiciousExtensionBubbleDelegate::ClearProfileListForTesting() { + g_shown_for_profiles.Get().clear(); } } // namespace extensions
diff --git a/chrome/browser/extensions/suspicious_extension_bubble_delegate.h b/chrome/browser/extensions/suspicious_extension_bubble_delegate.h index 0d1406e..9ecad2668 100644 --- a/chrome/browser/extensions/suspicious_extension_bubble_delegate.h +++ b/chrome/browser/extensions/suspicious_extension_bubble_delegate.h
@@ -38,7 +38,11 @@ bool ShouldLimitToEnabledExtensions() const override; void LogExtensionCount(size_t count) override; void LogAction(ExtensionMessageBubbleController::BubbleAction) override; - const char* GetKey() override; + std::set<Profile*>* GetProfileSet() override; + + // Clears the list of profiles the bubble has been shown for. Should only be + // used during testing. + static void ClearProfileListForTesting(); private: DISALLOW_COPY_AND_ASSIGN(SuspiciousExtensionBubbleDelegate);
diff --git a/chrome/browser/media/media_browsertest.cc b/chrome/browser/media/media_browsertest.cc index 6aa919e..38b4198 100644 --- a/chrome/browser/media/media_browsertest.cc +++ b/chrome/browser/media/media_browsertest.cc
@@ -15,18 +15,16 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test_utils.h" #include "media/base/test_data_util.h" -#include "net/test/embedded_test_server/embedded_test_server.h" +#include "net/test/spawned_test_server/spawned_test_server.h" // Common test results. const char MediaBrowserTest::kEnded[] = "ENDED"; const char MediaBrowserTest::kError[] = "ERROR"; const char MediaBrowserTest::kFailed[] = "FAILED"; -MediaBrowserTest::MediaBrowserTest() : ignore_plugin_crash_(false) { -} +MediaBrowserTest::MediaBrowserTest() : ignore_plugin_crash_(false) {} -MediaBrowserTest::~MediaBrowserTest() { -} +MediaBrowserTest::~MediaBrowserTest() {} void MediaBrowserTest::RunMediaTestPage(const std::string& html_page, const base::StringPairs& query_params, @@ -34,14 +32,15 @@ bool http) { GURL gurl; std::string query = media::GetURLQueryString(query_params); - scoped_ptr<net::EmbeddedTestServer> http_test_server; + scoped_ptr<net::SpawnedTestServer> http_test_server; if (http) { DVLOG(0) << base::TimeFormatTimeOfDayWithMilliseconds(base::Time::Now()) << " Starting HTTP server"; - http_test_server.reset(new net::EmbeddedTestServer); - http_test_server->ServeFilesFromSourceDirectory(media::GetTestDataPath()); + http_test_server.reset(new net::SpawnedTestServer( + net::SpawnedTestServer::TYPE_HTTP, net::SpawnedTestServer::kLocalhost, + media::GetTestDataPath())); CHECK(http_test_server->Start()); - gurl = http_test_server->GetURL("/" + html_page + "?" + query); + gurl = http_test_server->GetURL("files/" + html_page + "?" + query); } else { gurl = content::GetFileUrlWithQuery(media::GetTestDataFilePath(html_page), query);
diff --git a/chrome/browser/media/media_browsertest.h b/chrome/browser/media/media_browsertest.h index 1ad9c6cc..5d3f2222 100644 --- a/chrome/browser/media/media_browsertest.h +++ b/chrome/browser/media/media_browsertest.h
@@ -16,8 +16,8 @@ } // Class used to automate running media related browser tests. The functions -// assume that media files are located under media/ folder known to the test -// http server. +// assume that media files are located under files/media/ folder known to +// the test http server. class MediaBrowserTest : public InProcessBrowserTest, public content::WebContentsObserver { protected:
diff --git a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc index bf891590..da8046aa7 100644 --- a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.cc
@@ -6,21 +6,12 @@ #include "base/metrics/histogram.h" #include "base/strings/string_util.h" -#include "components/page_load_metrics/browser/page_load_metrics_macros.h" +#include "components/page_load_metrics/browser/page_load_metrics_util.h" #include "components/page_load_metrics/common/page_load_timing.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" namespace { -base::TimeDelta GetFirstContentfulPaint( - const page_load_metrics::PageLoadTiming& timing) { - if (timing.first_text_paint.is_zero()) - return timing.first_image_paint; - if (timing.first_image_paint.is_zero()) - return timing.first_text_paint; - return std::min(timing.first_text_paint, timing.first_image_paint); -} - bool IsFromGoogle(const GURL& url) { const char kGoogleSearchHostnamePrefix[] = "www."; std::string domain = net::registry_controlled_domains::GetDomainAndRegistry(
diff --git a/chrome/browser/page_load_metrics/observers/google_captcha_observer.cc b/chrome/browser/page_load_metrics/observers/google_captcha_observer.cc index dd746a6d..960cc34 100644 --- a/chrome/browser/page_load_metrics/observers/google_captcha_observer.cc +++ b/chrome/browser/page_load_metrics/observers/google_captcha_observer.cc
@@ -6,7 +6,7 @@ #include "base/metrics/histogram.h" #include "base/strings/string_util.h" -#include "components/page_load_metrics/browser/page_load_metrics_macros.h" +#include "components/page_load_metrics/browser/page_load_metrics_util.h" #include "components/page_load_metrics/common/page_load_timing.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
diff --git a/chrome/browser/resources/md_extensions/manager.js b/chrome/browser/resources/md_extensions/manager.js index f7f94d8..0c5a2c3 100644 --- a/chrome/browser/resources/md_extensions/manager.js +++ b/chrome/browser/resources/md_extensions/manager.js
@@ -3,30 +3,57 @@ // found in the LICENSE file. cr.define('extensions', function() { + 'use strict'; + + /** + * Compares two extensions to determine which should come first in the list. + * @param {chrome.developerPrivate.ExtensionInfo} a + * @param {chrome.developerPrivate.ExtensionInfo} b + * @return {number} + */ + var compareExtensions = function(a, b) { + function compare(x, y) { + return x < y ? -1 : (x > y ? 1 : 0); + } + function compareLocation(x, y) { + if (x.location == y.location) + return 0; + if (x.location == chrome.developerPrivate.Location.UNPACKED) + return -1; + if (y.location == chrome.developerPrivate.Location.UNPACKED) + return 1; + return 0; + } + return compareLocation(a, b) || + compare(a.name.toLowerCase(), b.name.toLowerCase()) || + compare(a.id, b.id); + }; + var Manager = Polymer({ is: 'extensions-manager', properties: { + /** @type {extensions.Sidebar} */ sidebar: { type: Object, } }, ready: function() { + /** @type {extensions.Sidebar} */ this.sidebar = this.$$('extensions-sidebar'); extensions.Service.getInstance().managerReady(this); this.sidebar.setScrollDelegate(new ScrollHelper(this)); }, /** - * Creates and adds a new extensions-item element to the list. + * Creates and adds a new extensions-item element to the list, inserting it + * into its sorted position in the relevant section. * @param {!chrome.developerPrivate.ExtensionInfo} extension The extension * the item is representing. * @param {!extensions.ItemDelegate} delegate The delegate for the item. - * @param {!number=} opt_index The index at which to place the item. If - * not present, the item is appended to the end of the list. */ - addItem: function(extension, delegate, opt_index) { + addItem: function(extension, delegate) { var listId; var ExtensionType = chrome.developerPrivate.ExtensionType; switch (extension.type) { @@ -49,9 +76,12 @@ assert(listId); var extensionItem = new extensions.Item(extension, delegate); var itemList = this.$[listId]; - var refNode = opt_index !== undefined ? - itemList.children[opt_index] : undefined; - itemList.insertBefore(extensionItem, refNode); + + var insertBeforeChild = Array.prototype.find.call(itemList.children, + function(item) { + return compareExtensions(item.data, extension) > 0; + }); + itemList.insertBefore(extensionItem, insertBeforeChild); }, /**
diff --git a/chrome/browser/resources/md_extensions/service.js b/chrome/browser/resources/md_extensions/service.js index 5f58f31..cc4d824 100644 --- a/chrome/browser/resources/md_extensions/service.js +++ b/chrome/browser/resources/md_extensions/service.js
@@ -6,30 +6,6 @@ 'use strict'; /** - * Compares two extensions to determine which should come first in the list. - * @param {chrome.developerPrivate.ExtensionInfo} a - * @param {chrome.developerPrivate.ExtensionInfo} b - * @return {number} - */ - var compareExtensions = function(a, b) { - function compare(x, y) { - return x < y ? -1 : (x > y ? 1 : 0); - } - function compareLocation(x, y) { - if (x.location == y.location) - return 0; - if (x.location == chrome.developerPrivate.Location.UNPACKED) - return -1; - if (y.location == chrome.developerPrivate.Location.UNPACKED) - return 1; - return 0; - } - return compareLocation(a, b) || - compare(a.name.toLowerCase(), b.name.toLowerCase()) || - compare(a.id, b.id); - }; - - /** * @constructor * @implements {extensions.ItemDelegate} * @implements {extensions.SidebarDelegate} @@ -42,7 +18,9 @@ /** @param {extensions.Manager} manager */ managerReady: function(manager) { + /** @private {extensions.Manager} */ this.manager_ = manager; + /** @private {extensions.Sidebar} */ this.sidebar_ = manager.sidebar; this.sidebar_.setDelegate(this); chrome.developerPrivate.onProfileStateChanged.addListener( @@ -52,7 +30,7 @@ chrome.developerPrivate.getExtensionsInfo( {includeDisabled: true, includeTerminated: true}, function(extensions) { - extensions.sort(compareExtensions); + /** @private {Array<chrome.developerPrivate.ExtensionInfo>} */ this.extensions_ = extensions; for (let extension of extensions) this.manager_.addItem(extension, this); @@ -66,6 +44,7 @@ * @private */ onProfileStateChanged_: function(profileInfo) { + /** @private {chrome.developerPrivate.ProfileInfo} */ this.profileInfo_ = profileInfo; this.sidebar_.inDevMode = profileInfo.inDeveloperMode; this.manager_.forEachItem(function(item) { @@ -104,13 +83,9 @@ return extension.id == eventData.extensionInfo.id; }); assert(currentIndex == -1); - var newIndex = this.extensions_.findIndex(function(extension) { - return compareExtensions(extension, - assert(eventData.extensionInfo)) > 0; - }); - newIndex = newIndex == -1 ? this.extensions_.length : newIndex; - this.extensions_.splice(newIndex, 0, eventData.extensionInfo); - this.manager_.addItem(eventData.extensionInfo, this, newIndex); + + this.extensions_.push(eventData.extensionInfo); + this.manager_.addItem(eventData.extensionInfo, this); } break; case EventType.UNINSTALLED:
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html index 1f082ab9..d3f09a6 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html +++ b/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.html
@@ -21,7 +21,7 @@ <settings-dropdown-menu id="standardFont" i18n-values="label:standardFont" pref="{{prefs.webkit.webprefs.fonts.standard.Zyyy}}" - menuOptions="[[fontOptions_]]"> + menu-options="[[fontOptions_]]"> </settings-dropdown-menu> <div class="settings-column" style$="[[computeStyle_(defaultFontSize_, @@ -34,7 +34,7 @@ <settings-dropdown-menu id="serifFont" i18n-values="label:serifFont" pref="{{prefs.webkit.webprefs.fonts.serif.Zyyy}}" - menuOptions="[[fontOptions_]]"> + menu-options="[[fontOptions_]]"> </settings-dropdown-menu> <div class="settings-column" style$="[[computeStyle_(defaultFontSize_, @@ -47,7 +47,7 @@ <settings-dropdown-menu id="sansSerifFont" i18n-values="label:sansSerifFont" pref="{{prefs.webkit.webprefs.fonts.sansserif.Zyyy}}" - menuOptions="[[fontOptions_]]"> + menu-options="[[fontOptions_]]"> </settings-dropdown-menu> <div class="settings-column" style$="{{computeStyle_(defaultFontSize_, @@ -60,7 +60,7 @@ <settings-dropdown-menu id="fixedFont" i18n-values="label:fixedWidthFont" pref="{{prefs.webkit.webprefs.fonts.fixed.Zyyy}}" - menuOptions="[[fontOptions_]]"> + menu-options="[[fontOptions_]]"> </settings-dropdown-menu> <div class="settings-column" style$="[[computeStyle_(defaultFontSize_, @@ -87,7 +87,7 @@ <settings-dropdown-menu id="encoding" i18n-values="label:encoding" pref="{{prefs.intl.charset_default}}" - menuOptions="[[encodingOptions_]]"> + menu-options="[[encodingOptions_]]"> </settings-dropdown-menu> </div> </template>
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_page.html b/chrome/browser/resources/settings/appearance_page/appearance_page.html index 185bb3d..613b8cb 100644 --- a/chrome/browser/resources/settings/appearance_page/appearance_page.html +++ b/chrome/browser/resources/settings/appearance_page/appearance_page.html
@@ -72,9 +72,9 @@ </div> <div class="settings-box split"> <div class="start" i18n-content="fontSize"></div> - <settings-dropdown-menu id="defaultFontSize" disabled + <settings-dropdown-menu id="defaultFontSize" pref="{{prefs.webkit.webprefs.default_font_size}}" - menuOptions="[[fontSizeOptions_]]"> + menu-options="[[fontSizeOptions_]]"> </settings-dropdown-menu> </div> <div class="settings-box split"> @@ -84,9 +84,9 @@ </div> <div class="settings-box split"> <div class="start" i18n-content="pageZoom"></div> - <settings-dropdown-menu id="pageZoom" disabled + <settings-dropdown-menu id="pageZoom" pref="{{prefs.partition.default_zoom_level}}" - menuOptions="[[pageZoomOptions_]]"> + menu-options="[[pageZoomOptions_]]"> </settings-dropdown-menu> </div> </neon-animatable>
diff --git a/chrome/browser/resources/settings/clear_browsing_data_page/clear_browsing_data_page.html b/chrome/browser/resources/settings/clear_browsing_data_page/clear_browsing_data_page.html index 218673ade..3371261 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_page/clear_browsing_data_page.html +++ b/chrome/browser/resources/settings/clear_browsing_data_page/clear_browsing_data_page.html
@@ -15,7 +15,7 @@ <span i18n-content="clearFollowingItemsFrom"></span> <settings-dropdown-menu id="clearFrom" pref="{{prefs.browser.clear_data.time_period}}" - menuOptions="[[clearFromOptions_]]" disabled> + menu-options="[[clearFromOptions_]]" disabled> </settings-dropdown-menu> <settings-checkbox id="browsingCheckbox" pref="{{prefs.browser.clear_data.browsing_history}}"
diff --git a/chrome/browser/resources/settings/controls/compiled_resources.gyp b/chrome/browser/resources/settings/controls/compiled_resources.gyp index 2f5bc5a..043d0c72 100644 --- a/chrome/browser/resources/settings/controls/compiled_resources.gyp +++ b/chrome/browser/resources/settings/controls/compiled_resources.gyp
@@ -19,6 +19,22 @@ 'includes': ['../../../../../third_party/closure_compiler/compile_js.gypi'], }, { + 'target_name': 'settings_dropdown_menu', + 'variables': { + 'depends': [ + '../../../../../ui/webui/resources/js/compiled_resources.gyp:assert', + '../../../../../ui/webui/resources/js/compiled_resources.gyp:cr', + '../../../../../ui/webui/resources/js/compiled_resources.gyp:load_time_data', + '../../../../../ui/webui/resources/js/i18n_behavior.js', + '../prefs/pref_util.js', + ], + 'externs': [ + '../../../../../third_party/closure_compiler/externs/settings_private.js' + ], + }, + 'includes': ['../../../../../third_party/closure_compiler/compile_js.gypi'], + }, + { 'target_name': 'settings_input', 'variables': { 'depends': [
diff --git a/chrome/browser/resources/settings/controls/settings_dropdown_menu.html b/chrome/browser/resources/settings/controls/settings_dropdown_menu.html index c061826..2c796421 100644 --- a/chrome/browser/resources/settings/controls/settings_dropdown_menu.html +++ b/chrome/browser/resources/settings/controls/settings_dropdown_menu.html
@@ -3,20 +3,24 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-item/paper-item.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-menu/paper-menu.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> +<link rel="import" href="chrome://md-settings/prefs/pref_util.html"> <dom-module id="settings-dropdown-menu"> <link rel="import" type="css" href="chrome://md-settings/settings_page/settings_page.css"> <template> - <paper-dropdown-menu id="dropdownMenu" - label="[[menuLabel_]]" disabled> - <paper-menu class="dropdown-content" selected="{{selected_}}"> + <paper-dropdown-menu id="dropdownMenu" label="[[menuLabel_]]" + on-iron-select="onSelect_" + disabled="[[shouldDisableMenu_(disabled, menuOptions.*)]]"> + <paper-menu class="dropdown-content" selected="{{selected_}}" + attr-for-selected="data-value"> <template is="dom-repeat" items="[[menuOptions]]"> - <paper-item>[[item.1]]</paper-item> + <paper-item data-value$="[[item.0]]">[[item.1]]</paper-item> </template> - <template is="dom-if" if="[[showNotFoundValue_]]"> - <paper-item>[[i18n('custom')]]</paper-item> - </template> + <paper-item data-value$="[[notFoundValue_]]" + hidden$="[[!isSelectedNotFound_(selected_)]]"> + [[i18n('custom')]] + </paper-item> </paper-menu> </paper-dropdown-menu> </template>
diff --git a/chrome/browser/resources/settings/controls/settings_dropdown_menu.js b/chrome/browser/resources/settings/controls/settings_dropdown_menu.js index 28bddf2..95f86ac 100644 --- a/chrome/browser/resources/settings/controls/settings_dropdown_menu.js +++ b/chrome/browser/resources/settings/controls/settings_dropdown_menu.js
@@ -2,6 +2,23 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. + /** + * This tuple is made up of a (value, name, attribute). The value and name are + * used by the dropdown menu. The attribute is optional 'user data' that is + * ignored by the dropdown menu. + * @typedef {{ + * 0: (number|string), + * 1: string, + * 2: (string|undefined) + * }} + */ +var DropdownMenuOption; + +/** + * @typedef {!Array<!DropdownMenuOption>} + */ +var DropdownMenuOptionList; + /** * 'settings-dropdown-menu' is a control for displaying options * in the settings. @@ -18,33 +35,35 @@ is: 'settings-dropdown-menu', properties: { - /** - * A text label for the drop-down menu. - */ - label: { - type: String, - }, + /** A text label for the drop-down menu. */ + label: String, /** * List of options for the drop-down menu. - * @type {!Array<{0: (Object|number|string), 1: string, - * 2: (string|undefined)}>} + * TODO(michaelpg): use named properties instead of indices. + * @type {DropdownMenuOptionList} */ menuOptions: { - notify: true, type: Array, value: function() { return []; }, }, /** * A single Preference object being tracked. - * @type {?PrefObject} + * @type {!chrome.settingsPrivate.PrefObject|undefined} */ pref: { type: Object, notify: true, }, + /** Whether the dropdown menu should be disabled. */ + disabled: { + type: Boolean, + reflectToAttribute: true, + value: false, + }, + /** * Either loading text or the label for the drop-down menu. * @private @@ -54,124 +73,94 @@ value: function() { return loadTimeData.getString('loading'); }, }, - /** - * A reverse lookup from the menu value back to the index in the - * menuOptions array. - * @private {!Object<string, string>} - */ - menuMap_: { - type: Object, - value: function() { return {}; }, - }, - /** - * The current selected item (an index number as a string). + * The current selected value, as a string. * @private */ - selected_: { - notify: true, - observer: 'onSelectedChanged_', + selected_: String, + + /** + * The value of the 'custom' item. + * @private + */ + notFoundValue_: { type: String, - }, - - /** - * The current selected pref value. - * @private - */ - selectedValue_: { - type: String, - }, - - /** - * Whether to show the 'custom' item. - * @private - */ - showNotFoundValue_: { - type: Boolean, + value: 'SETTINGS_DROPDOWN_NOT_FOUND_ITEM', }, }, behaviors: [ - I18nBehavior + I18nBehavior, ], observers: [ - 'checkSetup_(menuOptions, selectedValue_)', - 'prefChanged_(pref.value)', + 'checkSetup_(menuOptions)', + 'updateSelected_(pref.value)', ], + ready: function() { + this.checkSetup_(this.menuOptions); + }, + /** * Check to see if we have all the pieces needed to enable the control. - * @param {!Array<{0: (Object|number|string), 1: string, - * 2: (string|undefined)}>} menuOptions - * @param {string} selectedValue_ + * @param {DropdownMenuOptionList} menuOptions * @private */ - checkSetup_: function(menuOptions, selectedValue_) { - if (!this.menuOptions.length) { + checkSetup_: function(menuOptions) { + if (!this.menuOptions.length) return; - } - if (!Object.keys(this.menuMap_).length) { - // Create a map from index value [0] back to the index i. - var result = {}; - for (var i = 0; i < this.menuOptions.length; ++i) - result[JSON.stringify(this.menuOptions[i][0])] = i.toString(); - this.menuMap_ = result; - } - - // We need the menuOptions and the selectedValue_. They may arrive - // at different times (each is asynchronous). - this.selected_ = this.getItemIndex(this.selectedValue_); this.menuLabel_ = this.label; - this.$.dropdownMenu.disabled = false; - }, - - /** - * @param {string} item A value from the menuOptions array. - * @return {string} - * @private - */ - getItemIndex: function(item) { - var result = this.menuMap_[item]; - if (result) - return result; - this.showNotFoundValue_ = true; - // The 'not found' item is added as the last of the options. - return (this.menuOptions.length).toString(); - }, - - /** - * @param {string} index An index into the menuOptions array. - * @return {Object|number|string|undefined} - * @private - */ - getItemValue: function(index) { - if (this.menuOptions.length) { - var result = this.menuOptions[index]; - if (result) - return result[0]; - } - return undefined; + this.updateSelected_(); }, /** * Pass the selection change to the pref value. * @private */ - onSelectedChanged_: function() { - var prefValue = this.getItemValue(this.selected_); - if (prefValue !== undefined) { - this.selectedValue_ = JSON.stringify(prefValue); - this.set('pref.value', prefValue); + onSelect_: function() { + if (!this.pref || this.selected_ == undefined || + this.selected_ == this.notFoundValue_) { + return; } + var prefValue = Settings.PrefUtil.stringToPrefValue( + this.selected_, this.pref); + if (prefValue !== undefined) + this.set('pref.value', prefValue); }, /** - * @param {number|string} value A value from the menuOptions array. + * Updates the selected item when the pref or menuOptions change. * @private */ - prefChanged_: function(value) { - this.selectedValue_ = JSON.stringify(value); + updateSelected_: function() { + if (!this.pref) + return; + var prefValue = this.pref.value; + var option = this.menuOptions.find(function(menuItem) { + return menuItem[0] == prefValue; + }); + if (option == undefined) + this.selected_ = this.notFoundValue_; + else + this.selected_ = Settings.PrefUtil.prefToString(this.pref); + }, + + /** + * @param {string} selected + * @return {boolean} + * @private + */ + isSelectedNotFound_: function(selected) { + return this.menuOptions && selected == this.notFoundValue_; + }, + + /** + * @return {boolean} + * @private + */ + shouldDisableMenu_: function() { + return this.disabled || !this.menuOptions.length; }, });
diff --git a/chrome/browser/resources/settings/i18n_setup.html b/chrome/browser/resources/settings/i18n_setup.html new file mode 100644 index 0000000..1bf892e83 --- /dev/null +++ b/chrome/browser/resources/settings/i18n_setup.html
@@ -0,0 +1,2 @@ +<script src="chrome://resources/js/load_time_data.js"></script> +<script src="chrome://md-settings/strings.js"></script>
diff --git a/chrome/browser/resources/settings/settings.html b/chrome/browser/resources/settings/settings.html index ec9542c..8178676 100644 --- a/chrome/browser/resources/settings/settings.html +++ b/chrome/browser/resources/settings/settings.html
@@ -5,8 +5,7 @@ <title>Settings</title> <base href="chrome://md-settings"> <script src="chrome://resources/js/polymer_config.js"></script> - <script src="chrome://resources/js/load_time_data.js"></script> - <script src="chrome://md-settings/strings.js"></script> + <link rel="import" href="chrome://md-settings/i18n_setup.html"> <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> <link rel="import" href="chrome://md-settings/settings_ui/settings_ui.html"> <link rel="import" href="chrome://md-settings/prefs/prefs.html">
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd index 106137a..7577f20 100644 --- a/chrome/browser/resources/settings/settings_resources.grd +++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -223,6 +223,9 @@ <structure name="IDR_SETTINGS_DOWNLOADS_PAGE_JS" file="downloads_page/downloads_page.js" type="chrome_html" /> + <structure name="IDR_SETTINGS_I18n_SETUP_HTML" + file="i18n_setup.html" + type="chrome_html" /> <structure name="IDR_SETTINGS_POWERWASH_DIALOG_HTML" file="reset_page/powerwash_dialog.html" type="chrome_html" />
diff --git a/chrome/browser/site_details.cc b/chrome/browser/site_details.cc index a5daea38..b38c389d 100644 --- a/chrome/browser/site_details.cc +++ b/chrome/browser/site_details.cc
@@ -105,13 +105,20 @@ (*frame_urls)[frame] = site; } +void CollectCurrentSnapshot(SiteData* site_data, RenderFrameHost* frame) { + if (frame->GetParent()) { + if (frame->GetSiteInstance() != frame->GetParent()->GetSiteInstance()) + site_data->out_of_process_frames++; + } +} + } // namespace IsolationScenario::IsolationScenario() : policy(ISOLATE_ALL_SITES) {} IsolationScenario::~IsolationScenario() {} -SiteData::SiteData() { +SiteData::SiteData() : out_of_process_frames(0) { for (int i = 0; i <= ISOLATION_SCENARIO_LAST; i++) scenarios[i].policy = static_cast<IsolationScenarioType>(i); } @@ -149,6 +156,9 @@ base::Bind(&CollectForScenario, base::Unretained(&memo), base::Unretained(primary), base::Unretained(&scenario))); } + + contents->ForEachFrame( + base::Bind(&CollectCurrentSnapshot, base::Unretained(site_data))); } void SiteDetails::UpdateHistograms( @@ -158,10 +168,12 @@ // Reports a set of site-based process metrics to UMA. int process_limit = RenderProcessHost::GetMaxRendererProcessCount(); - // Sum the number of sites and SiteInstances in each BrowserContext. + // Sum the number of sites and SiteInstances in each BrowserContext and + // the total number of out-of-process iframes. int num_sites[ISOLATION_SCENARIO_LAST + 1] = {}; int num_isolated_site_instances[ISOLATION_SCENARIO_LAST + 1] = {}; int num_browsing_instances = 0; + int num_oopifs = 0; for (BrowserContextSiteDataMap::const_iterator i = site_data_map.begin(); i != site_data_map.end(); ++i) { for (const IsolationScenario& scenario : i->second.scenarios) { @@ -173,6 +185,7 @@ } num_browsing_instances += i->second.scenarios[ISOLATE_ALL_SITES] .browsing_instance_site_map.size(); + num_oopifs += i->second.out_of_process_frames; } // Predict the number of processes needed when isolating all sites, when @@ -193,6 +206,7 @@ UMA_HISTOGRAM_COUNTS_100( "SiteIsolation.BrowsingInstanceCount", num_browsing_instances); + UMA_HISTOGRAM_COUNTS_100("SiteIsolation.OutOfProcessIframes", num_oopifs); // ISOLATE_NOTHING metrics. UMA_HISTOGRAM_COUNTS_100("SiteIsolation.IsolateNothingProcessCountNoLimit",
diff --git a/chrome/browser/site_details.h b/chrome/browser/site_details.h index da613373..a81fc37 100644 --- a/chrome/browser/site_details.h +++ b/chrome/browser/site_details.h
@@ -45,6 +45,10 @@ // Global list of all SiteInstances, used for de-duping related instances. std::vector<content::SiteInstance*> instances; + + // A count of all RenderFrameHosts, which are in a different SiteInstance from + // their parents. + int out_of_process_frames; }; // Maps a BrowserContext to information about the sites it contains.
diff --git a/chrome/browser/site_details_browsertest.cc b/chrome/browser/site_details_browsertest.cc index fb5ac9da..1792358 100644 --- a/chrome/browser/site_details_browsertest.cc +++ b/chrome/browser/site_details_browsertest.cc
@@ -56,6 +56,13 @@ // StartFetchAndWait(). base::HistogramTester* uma() { return uma_.get(); } + int GetOutOfProcessIframeCount() { + std::vector<Bucket> buckets = + uma_->GetAllSamples("SiteIsolation.OutOfProcessIframes"); + CHECK_EQ(1U, buckets.size()); + return buckets[0].min; + } + size_t CountPageTitles() { size_t count = 0; for (const ProcessMemoryInformation& process : ChromeBrowser()->processes) { @@ -256,6 +263,10 @@ ElementsAre(Bucket(1, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(1)); EXPECT_THAT(GetRenderProcessCount(), EqualsIfSitePerProcess(9)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(0)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfSitePerProcess(14)); // Navigate to a different, disjoint set of 7 sites. GURL pqrstuv_url = embedded_test_server()->GetURL( @@ -305,6 +316,10 @@ ElementsAre(Bucket(1, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(1)); EXPECT_THAT(GetRenderProcessCount(), EqualsIfSitePerProcess(7)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(0)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfSitePerProcess(11)); // Open a second tab (different BrowsingInstance) with 4 sites (a through d). GURL abcd_url = embedded_test_server()->GetURL( @@ -353,6 +368,10 @@ ElementsAre(Bucket(2, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(2)); EXPECT_THAT(GetRenderProcessCount(), EqualsIfSitePerProcess(11)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(0)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfSitePerProcess(14)); // Open a third tab (different BrowsingInstance) with the same 4 sites. AddTabAtIndex(2, abcd_url, ui::PAGE_TRANSITION_TYPED); @@ -399,6 +418,10 @@ ElementsAre(Bucket(3, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(3)); EXPECT_THAT(GetRenderProcessCount(), EqualsIfSitePerProcess(15)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(0)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfSitePerProcess(17)); // From the third tab, window.open() a fourth tab in the same // BrowsingInstance, to a page using the same four sites "a-d" as third tab, @@ -458,6 +481,10 @@ ElementsAre(Bucket(3, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(3)); EXPECT_THAT(GetRenderProcessCount(), EqualsIfSitePerProcess(16)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(0)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfSitePerProcess(21)); } IN_PROC_BROWSER_TEST_F(SiteDetailsBrowserTest, IsolateExtensions) { @@ -481,6 +508,7 @@ "SiteIsolation.IsolateExtensionsProcessCountNoLimit"), ElementsAre(Bucket(1, 1))); EXPECT_THAT(GetRenderProcessCount(), 1); + EXPECT_EQ(0, details->GetOutOfProcessIframeCount()); // Install one script-injecting extension with background page, and an // extension with web accessible resources. @@ -517,6 +545,9 @@ "SiteIsolation.IsolateExtensionsProcessCountNoLimit"), ElementsAre(Bucket(3, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(3)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(0)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(4)); // Test that "one process per extension" applies even when web content has an // extension iframe. @@ -544,6 +575,9 @@ "SiteIsolation.IsolateExtensionsProcessCountNoLimit"), ElementsAre(Bucket(3, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(3)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(1)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(4)); // Tab2 navigates its first iframe to a resource of extension1. This also // shouldn't result in a new extension process (it should share with the @@ -568,6 +602,9 @@ "SiteIsolation.IsolateExtensionsProcessCountNoLimit"), ElementsAre(Bucket(3, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(3)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(2)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(4)); // Tab1 navigates its second iframe to a resource of extension2. This SHOULD // result in a new process since extension2 had no existing process. @@ -591,6 +628,9 @@ "SiteIsolation.IsolateExtensionsProcessCountNoLimit"), ElementsAre(Bucket(4, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(4)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(3)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(4)); // Tab2 navigates its second iframe to a resource of extension2. This should // share the existing extension2 process. @@ -614,6 +654,9 @@ "SiteIsolation.IsolateExtensionsProcessCountNoLimit"), ElementsAre(Bucket(4, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(4)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(4)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(4)); // Install extension3 (identical config to extension2) const Extension* extension3 = CreateExtension("Extension Three", false); @@ -642,6 +685,9 @@ "SiteIsolation.IsolateExtensionsProcessCountNoLimit"), ElementsAre(Bucket(4, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(4)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(2)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(2)); // Navigate tab2 to a different extension3 page containing a web iframe. The // iframe should get its own process. The lower bound number indicates that, @@ -666,6 +712,9 @@ "SiteIsolation.IsolateExtensionsProcessCountNoLimit"), ElementsAre(Bucket(5, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(5)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(3)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(3)); // Navigate tab1 to an extension3 page with an extension3 iframe. There should // be three processes estimated by IsolateExtensions: one for extension3, one @@ -691,6 +740,9 @@ "SiteIsolation.IsolateExtensionsProcessCountNoLimit"), ElementsAre(Bucket(3, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(3)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(1)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(1)); // Now navigate tab1 to an extension3 page with a web iframe. This could share // a process with tab2's iframe (the LowerBound number), or it could get its @@ -715,6 +767,9 @@ "SiteIsolation.IsolateExtensionsProcessCountNoLimit"), ElementsAre(Bucket(4, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(4)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(2)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(2)); } // Exercises accounting in the case where an extension has two different-site @@ -750,6 +805,9 @@ // TODO(nick): https://crbug.com/512560 Make the number below agree with the // estimates above, which assume consolidation of subframe processes. EXPECT_THAT(GetRenderProcessCount(), EqualsIfExtensionsIsolated(3)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(2)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(2)); } // Verifies that --isolate-extensions doesn't isolate hosted apps. @@ -789,6 +847,9 @@ "SiteIsolation.IsolateAllSitesProcessCountNoLimit"), ElementsAre(Bucket(2, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfSitePerProcess(2)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(0)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(1)); ui_test_utils::NavigateToURL(browser(), app_in_web_iframe_url); details = new TestMemoryDetails(); @@ -819,6 +880,9 @@ "SiteIsolation.IsolateAllSitesProcessCountNoLimit"), ElementsAre(Bucket(2, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfSitePerProcess(2)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(0)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(1)); // Now install app.org as a hosted app. CreateHostedApp("App", GURL("http://app.org")); @@ -854,6 +918,9 @@ "SiteIsolation.IsolateAllSitesProcessCountNoLimit"), ElementsAre(Bucket(2, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfSitePerProcess(2)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(0)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(1)); ui_test_utils::NavigateToURL(browser(), app_in_web_iframe_url); details = new TestMemoryDetails(); @@ -884,4 +951,7 @@ "SiteIsolation.IsolateAllSitesProcessCountNoLimit"), ElementsAre(Bucket(2, 1))); EXPECT_THAT(GetRenderProcessCount(), EqualsIfSitePerProcess(2)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), + EqualsIfExtensionsIsolated(0)); + EXPECT_THAT(details->GetOutOfProcessIframeCount(), EqualsIfSitePerProcess(1)); }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index e2ee391..f89f2b2 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -154,6 +154,10 @@ } } + if (use_aura) { + defines += [ "MOJO_RUNNER_CLIENT" ] + } + if (enable_basic_printing || enable_print_preview) { deps += [ "//printing" ] }
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 4db78df..14de5c7 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -1348,7 +1348,7 @@ security_info.cert_id)); } else if (security_info.sha1_deprecation_status == SecurityStateModel::DEPRECATED_SHA1_MINOR) { - security_style_explanations->warning_explanations.push_back( + security_style_explanations->unauthenticated_explanations.push_back( content::SecurityStyleExplanation( l10n_util::GetStringUTF8(IDS_MINOR_SHA1), l10n_util::GetStringUTF8(IDS_MINOR_SHA1_DESCRIPTION), @@ -1377,7 +1377,8 @@ security_info.cert_id); if (net::IsCertStatusMinorError(security_info.cert_status)) - security_style_explanations->warning_explanations.push_back(explanation); + security_style_explanations->unauthenticated_explanations.push_back( + explanation); else security_style_explanations->broken_explanations.push_back(explanation); } else {
diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc index 0d5915e..de571bcc 100644 --- a/chrome/browser/ui/browser_browsertest.cc +++ b/chrome/browser/ui/browser_browsertest.cc
@@ -403,7 +403,7 @@ const content::SecurityStyleExplanations& expired_explanation = observer.latest_explanations(); - EXPECT_EQ(0u, expired_explanation.warning_explanations.size()); + EXPECT_EQ(0u, expired_explanation.unauthenticated_explanations.size()); ASSERT_EQ(1u, expired_explanation.broken_explanations.size()); // Check that the summary and description are as expected. @@ -2932,7 +2932,8 @@ ui_test_utils::NavigateToURL(browser(), http_url); EXPECT_EQ(content::SECURITY_STYLE_UNAUTHENTICATED, observer.latest_security_style()); - EXPECT_EQ(0u, observer.latest_explanations().warning_explanations.size()); + EXPECT_EQ(0u, + observer.latest_explanations().unauthenticated_explanations.size()); EXPECT_EQ(0u, observer.latest_explanations().broken_explanations.size()); EXPECT_EQ(0u, observer.latest_explanations().secure_explanations.size()); EXPECT_FALSE(observer.latest_explanations().scheme_is_cryptographic); @@ -2952,7 +2953,7 @@ const content::SecurityStyleExplanations& mixed_content_explanation = observer.latest_explanations(); - ASSERT_EQ(0u, mixed_content_explanation.warning_explanations.size()); + ASSERT_EQ(0u, mixed_content_explanation.unauthenticated_explanations.size()); ASSERT_EQ(0u, mixed_content_explanation.broken_explanations.size()); CheckSecureExplanations(mixed_content_explanation.secure_explanations, VALID_CERTIFICATE, browser()); @@ -2985,7 +2986,8 @@ ui_test_utils::NavigateToURL(browser(), valid_https_url); EXPECT_EQ(content::SECURITY_STYLE_AUTHENTICATED, observer.latest_security_style()); - EXPECT_EQ(0u, observer.latest_explanations().warning_explanations.size()); + EXPECT_EQ(0u, + observer.latest_explanations().unauthenticated_explanations.size()); EXPECT_EQ(0u, observer.latest_explanations().broken_explanations.size()); CheckSecureExplanations(observer.latest_explanations().secure_explanations, VALID_CERTIFICATE, browser()); @@ -3046,7 +3048,8 @@ ui_test_utils::NavigateToURL(browser(), valid_https_url); EXPECT_EQ(content::SECURITY_STYLE_AUTHENTICATED, observer.latest_security_style()); - EXPECT_EQ(0u, observer.latest_explanations().warning_explanations.size()); + EXPECT_EQ(0u, + observer.latest_explanations().unauthenticated_explanations.size()); EXPECT_EQ(0u, observer.latest_explanations().broken_explanations.size()); CheckSecureExplanations(observer.latest_explanations().secure_explanations, VALID_CERTIFICATE, browser()); @@ -3086,7 +3089,8 @@ EXPECT_EQ(content::SECURITY_STYLE_AUTHENTICATED, observer.latest_security_style()); - EXPECT_EQ(0u, observer.latest_explanations().warning_explanations.size()); + EXPECT_EQ(0u, + observer.latest_explanations().unauthenticated_explanations.size()); EXPECT_EQ(0u, observer.latest_explanations().broken_explanations.size()); CheckSecureExplanations(observer.latest_explanations().secure_explanations, VALID_CERTIFICATE, browser());
diff --git a/chrome/browser/ui/cocoa/extensions/extension_message_bubble_bridge.mm b/chrome/browser/ui/cocoa/extensions/extension_message_bubble_bridge.mm index 28b77e5e..86f1361 100644 --- a/chrome/browser/ui/cocoa/extensions/extension_message_bubble_bridge.mm +++ b/chrome/browser/ui/cocoa/extensions/extension_message_bubble_bridge.mm
@@ -48,12 +48,9 @@ void ExtensionMessageBubbleBridge::OnBubbleClosed(CloseAction action) { switch(action) { - case CLOSE_DISMISS_USER_ACTION: - case CLOSE_DISMISS_DEACTIVATION: { - bool close_by_deactivate = action == CLOSE_DISMISS_DEACTIVATION; - controller_->OnBubbleDismiss(close_by_deactivate); + case CLOSE_DISMISS: + controller_->OnBubbleDismiss(); break; - } case CLOSE_EXECUTE: controller_->OnBubbleAction(); break;
diff --git a/chrome/browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac.mm b/chrome/browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac.mm index ccba1d80..5e01460 100644 --- a/chrome/browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac.mm +++ b/chrome/browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac.mm
@@ -106,7 +106,7 @@ - (void)windowWillClose:(NSNotification*)notification { if (!acknowledged_) { delegate_->OnBubbleClosed( - ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_DEACTIVATION); + ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS); acknowledged_ = YES; } [super windowWillClose:notification]; @@ -327,7 +327,7 @@ if (learnMoreButton_ && sender == learnMoreButton_) { action = ToolbarActionsBarBubbleDelegate::CLOSE_LEARN_MORE; } else if (dismissButton_ && sender == dismissButton_) { - action = ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_USER_ACTION; + action = ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS; } else { DCHECK_EQ(sender, actionButton_); action = ToolbarActionsBarBubbleDelegate::CLOSE_EXECUTE;
diff --git a/chrome/browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac_unittest.mm b/chrome/browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac_unittest.mm index 4f9a443..6c266f4 100644 --- a/chrome/browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac_unittest.mm +++ b/chrome/browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac_unittest.mm
@@ -117,15 +117,12 @@ case ToolbarActionsBarBubbleDelegate::CLOSE_EXECUTE: button = [bubble actionButton]; break; - case ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_USER_ACTION: + case ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS: button = [bubble dismissButton]; break; case ToolbarActionsBarBubbleDelegate::CLOSE_LEARN_MORE: button = [bubble learnMoreButton]; break; - case ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_DEACTIVATION: - NOTREACHED(); // Deactivation is tested below. - break; } ASSERT_TRUE(button); @@ -147,7 +144,7 @@ TEST_F(ToolbarActionsBarBubbleMacTest, CloseActionAndDismiss) { // Test all the possible actions. TestBubbleButton(ToolbarActionsBarBubbleDelegate::CLOSE_EXECUTE); - TestBubbleButton(ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_USER_ACTION); + TestBubbleButton(ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS); TestBubbleButton(ToolbarActionsBarBubbleDelegate::CLOSE_LEARN_MORE); { @@ -163,7 +160,7 @@ [bubble close]; chrome::testing::NSRunLoopRunAllPending(); ASSERT_TRUE(delegate.close_action()); - EXPECT_EQ(ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_DEACTIVATION, + EXPECT_EQ(ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS, *delegate.close_action()); EXPECT_TRUE([windowObserver windowIsClosing]); }
diff --git a/chrome/browser/ui/libgtk2ui/native_theme_gtk2.cc b/chrome/browser/ui/libgtk2ui/native_theme_gtk2.cc index 109930bb..5cf2fa7 100644 --- a/chrome/browser/ui/libgtk2ui/native_theme_gtk2.cc +++ b/chrome/browser/ui/libgtk2ui/native_theme_gtk2.cc
@@ -412,18 +412,6 @@ return SelectedURLColor( GetSystemColor(kColorId_TextfieldSelectionColor), GetSystemColor(kColorId_TextfieldSelectionBackgroundFocused)); - case kColorId_ResultsTableNormalDivider: - return color_utils::AlphaBlend(GetTextColor(GetWindow(), NORMAL), - GetBGColor(GetWindow(), NORMAL), - 0x34); - case kColorId_ResultsTableHoveredDivider: - return color_utils::AlphaBlend(GetTextColor(GetWindow(), PRELIGHT), - GetBGColor(GetWindow(), PRELIGHT), - 0x34); - case kColorId_ResultsTableSelectedDivider: - return color_utils::AlphaBlend(GetTextColor(GetWindow(), SELECTED), - GetBGColor(GetWindow(), SELECTED), - 0x34); case kColorId_ResultsTablePositiveText: { return color_utils::GetReadableColor(kPositiveTextColor,
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_bar_bubble_delegate.h b/chrome/browser/ui/toolbar/toolbar_actions_bar_bubble_delegate.h index 508371ea..2fb9bc89 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_bar_bubble_delegate.h +++ b/chrome/browser/ui/toolbar/toolbar_actions_bar_bubble_delegate.h
@@ -13,8 +13,7 @@ enum CloseAction { CLOSE_LEARN_MORE, CLOSE_EXECUTE, - CLOSE_DISMISS_USER_ACTION, - CLOSE_DISMISS_DEACTIVATION, + CLOSE_DISMISS }; virtual ~ToolbarActionsBarBubbleDelegate() {}
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_bar_unittest.cc b/chrome/browser/ui/toolbar/toolbar_actions_bar_unittest.cc index b0ce77b..7e793378 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_bar_unittest.cc +++ b/chrome/browser/ui/toolbar/toolbar_actions_bar_unittest.cc
@@ -424,7 +424,7 @@ new ExtensionToolbarIconSurfacingBubbleDelegate(profile())); bubble_delegate->OnBubbleShown(); bubble_delegate->OnBubbleClosed( - ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_USER_ACTION); + ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS); EXPECT_FALSE( ExtensionToolbarIconSurfacingBubbleDelegate::ShouldShowForProfile( profile()));
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_model_unittest.cc b/chrome/browser/ui/toolbar/toolbar_actions_model_unittest.cc index c0e7d26..787e5da 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_model_unittest.cc +++ b/chrome/browser/ui/toolbar/toolbar_actions_model_unittest.cc
@@ -1229,8 +1229,7 @@ scoped_ptr<ToolbarActionsBarBubbleDelegate> bubble( new ExtensionToolbarIconSurfacingBubbleDelegate(profile())); - bubble->OnBubbleClosed( - ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_USER_ACTION); + bubble->OnBubbleClosed(ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS); EXPECT_FALSE(toolbar_model->is_highlighting()); EXPECT_EQ(ToolbarActionsModel::HIGHLIGHT_NONE,
diff --git a/chrome/browser/ui/views/chrome_views_delegate.cc b/chrome/browser/ui/views/chrome_views_delegate.cc index f7efbac7..ef18a76 100644 --- a/chrome/browser/ui/views/chrome_views_delegate.cc +++ b/chrome/browser/ui/views/chrome_views_delegate.cc
@@ -472,7 +472,7 @@ return content::BrowserThread::GetBlockingPool(); } -#if !defined(USE_AURA) && !defined(USE_CHROMEOS) +#if !defined(USE_ASH) views::Widget::InitParams::WindowOpacity ChromeViewsDelegate::GetOpacityForInitParams( const views::Widget::InitParams& params) {
diff --git a/chrome/browser/ui/views/chrome_views_delegate_aura.cc b/chrome/browser/ui/views/chrome_views_delegate_ash.cc similarity index 100% rename from chrome/browser/ui/views/chrome_views_delegate_aura.cc rename to chrome/browser/ui/views/chrome_views_delegate_ash.cc
diff --git a/chrome/browser/ui/views/extensions/extension_message_bubble_view.cc b/chrome/browser/ui/views/extensions/extension_message_bubble_view.cc index fc528bc..c30ba3b 100644 --- a/chrome/browser/ui/views/extensions/extension_message_bubble_view.cc +++ b/chrome/browser/ui/views/extensions/extension_message_bubble_view.cc
@@ -77,10 +77,8 @@ void ExtensionMessageBubbleView::OnWidgetDestroying(views::Widget* widget) { // To catch Esc, we monitor destroy message. Unless the link has been clicked, // we assume Dismiss was the action taken. - if (!link_clicked_ && !action_taken_) { - bool closed_on_deactivation = close_reason() == CloseReason::DEACTIVATION; - controller_->OnBubbleDismiss(closed_on_deactivation); - } + if (!link_clicked_ && !action_taken_) + controller_->OnBubbleDismiss(); } void ExtensionMessageBubbleView::set_bubble_appearance_wait_time_for_testing(
diff --git a/chrome/browser/ui/views/extensions/extension_toolbar_icon_surfacing_bubble_views.cc b/chrome/browser/ui/views/extensions/extension_toolbar_icon_surfacing_bubble_views.cc index 24fefe36..c0ddf62e 100644 --- a/chrome/browser/ui/views/extensions/extension_toolbar_icon_surfacing_bubble_views.cc +++ b/chrome/browser/ui/views/extensions/extension_toolbar_icon_surfacing_bubble_views.cc
@@ -78,11 +78,7 @@ views::Widget* widget) { BubbleDelegateView::OnWidgetDestroying(widget); if (!acknowledged_) { - ToolbarActionsBarBubbleDelegate::CloseAction close_action = - close_reason() == CloseReason::DEACTIVATION - ? ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_DEACTIVATION - : ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_USER_ACTION; - delegate_->OnBubbleClosed(close_action); + delegate_->OnBubbleClosed(ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS); acknowledged_ = true; } }
diff --git a/chrome/browser/ui/views/extensions/extension_toolbar_icon_surfacing_bubble_views_unittest.cc b/chrome/browser/ui/views/extensions/extension_toolbar_icon_surfacing_bubble_views_unittest.cc index ac8a6da6..ab7cbd2 100644 --- a/chrome/browser/ui/views/extensions/extension_toolbar_icon_surfacing_bubble_views_unittest.cc +++ b/chrome/browser/ui/views/extensions/extension_toolbar_icon_surfacing_bubble_views_unittest.cc
@@ -81,12 +81,11 @@ views::test::TestWidgetObserver bubble_observer(bubble_widget); EXPECT_FALSE(delegate.close_action()); - // Close the bubble by activating another widget. The delegate should be - // told it was dismissed. - anchor_widget->Activate(); + // Close the bubble. The delegate should be told it was dismissed. + bubble_widget->Close(); base::RunLoop().RunUntilIdle(); ASSERT_TRUE(delegate.close_action()); - EXPECT_EQ(ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS_DEACTIVATION, + EXPECT_EQ(ToolbarActionsBarBubbleDelegate::CLOSE_DISMISS, *delegate.close_action()); EXPECT_TRUE(bubble_observer.widget_closed()); }
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc index 8e7369b..4ca506c 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
@@ -208,8 +208,7 @@ AddChildView(supervised_user_avatar_label_); } #endif - avatar_button_ = new AvatarMenuButton( - browser_view_->browser(), !browser_view_->IsRegularOrGuestSession()); + avatar_button_ = new AvatarMenuButton(browser_view_); avatar_button_->set_id(VIEW_ID_AVATAR_BUTTON); AddChildView(avatar_button_); // Invalidate here because adding a child does not invalidate the layout. @@ -239,9 +238,9 @@ bool should_show_avatar_menu = avatar_button_ || AvatarMenu::ShouldShowAvatarMenu(); - if (!AvatarMenuButton::GetAvatarImages( - browser_view_->browser()->profile(), should_show_avatar_menu, &avatar, - &taskbar_badge_avatar, &is_rectangle)) { + if (!AvatarMenuButton::GetAvatarImages(browser_view_, should_show_avatar_menu, + &avatar, &taskbar_badge_avatar, + &is_rectangle)) { return; } @@ -307,10 +306,9 @@ // returns false, don't bother trying to update the taskbar decoration since // the returned images are not initialized. This can happen if the user // deletes the current profile. - if (AvatarMenuButton::GetAvatarImages(browser_view_->browser()->profile(), - AvatarMenu::ShouldShowAvatarMenu(), - &avatar, &taskbar_badge_avatar, - &is_rectangle)) { + if (AvatarMenuButton::GetAvatarImages( + browser_view_, AvatarMenu::ShouldShowAvatarMenu(), &avatar, + &taskbar_badge_avatar, &is_rectangle)) { // For popups and panels which don't have the avatar button, we still // need to draw the taskbar decoration. Even though we have an icon on the // window's relaunch details, we draw over it because the user may have
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc index cc6a6bc7..6171a87 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc
@@ -330,16 +330,14 @@ // position of the window controls. header_painter_->LayoutHeader(); - int painted_height = 0; + int painted_height = GetTopInset(false); if (browser_view()->IsTabStripVisible()) { - painted_height = GetTopInset(false) + - browser_view()->tabstrip()->GetPreferredSize().height(); + painted_height += browser_view()->tabstrip()->GetPreferredSize().height(); } else if (browser_view()->IsToolbarVisible()) { // Paint the header so that it overlaps with the top few pixels of the // toolbar because the top few pixels of the toolbar are not opaque. - painted_height = GetTopInset(false) + kFrameShadowThickness * 2; - } else { - painted_height = GetTopInset(false); + const int kToolbarTopEdgeExclusion = 2; + painted_height += kToolbarTopEdgeExclusion; } header_painter_->SetHeaderHeightForPainting(painted_height);
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 1271b2f..ea16798b 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -133,8 +133,10 @@ #include "ui/gfx/canvas.h" #include "ui/gfx/color_utils.h" #include "ui/gfx/geometry/rect_conversions.h" +#include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/scoped_canvas.h" #include "ui/gfx/screen.h" +#include "ui/gfx/vector_icons_public.h" #include "ui/strings/grit/ui_strings.h" #include "ui/views/controls/button/menu_button.h" #include "ui/views/controls/textfield/textfield.h" @@ -156,6 +158,7 @@ #if defined(OS_WIN) #include "base/win/windows_version.h" #include "chrome/browser/jumplist_win.h" +#include "ui/gfx/color_palette.h" #include "ui/views/win/scoped_fullscreen_visibility.h" #endif @@ -681,7 +684,19 @@ } gfx::ImageSkia BrowserView::GetOTRAvatarIcon() const { - return *GetThemeProvider()->GetImageSkiaNamed(IDR_OTR_ICON); + if (ui::MaterialDesignController::IsModeMaterial()) { + SkColor icon_color = SK_ColorWHITE; +#if defined(OS_WIN) + // On Windows 10, we can't change the frame color so must assume it's white. + if (base::win::GetVersion() == base::win::VERSION_WIN10) + icon_color = gfx::kChromeIconGrey; +#endif + return gfx::CreateVectorIcon(gfx::VectorIconId::INCOGNITO, 24, icon_color); + } + + // GetThemeProvider() can return null if this view is not yet part of the + // widget hierarchy, but the frame's theme provider is always valid. + return *frame_->GetThemeProvider()->GetImageSkiaNamed(IDR_OTR_ICON); } ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/views/frame/browser_view_layout.cc b/chrome/browser/ui/views/frame/browser_view_layout.cc index 2535853d..af512ca 100644 --- a/chrome/browser/ui/views/frame/browser_view_layout.cc +++ b/chrome/browser/ui/views/frame/browser_view_layout.cc
@@ -318,23 +318,21 @@ void BrowserViewLayout::Layout(views::View* browser_view) { vertical_layout_rect_ = browser_view->GetLocalBounds(); - int top = delegate_->GetTopInsetInBrowserView(false); - top = LayoutTabStripRegion(top); + int top = LayoutTabStripRegion(delegate_->GetTopInsetInBrowserView(false)); if (delegate_->IsTabStripVisible()) { - // Set the position of the background image in tabs and the new tab button. - int x = tab_strip_->GetMirroredX() + - browser_view_->GetMirroredX() + - delegate_->GetThemeBackgroundXInset(); - // By passing true here, we position the tab background to vertically align - // with the frame background image of a restored-mode frame, even in a - // maximized window. Then in the frame code, we position the frame so the - // portion of the image that's behind the restored-mode tabstrip is always - // behind the tabstrip. Together these ensure that the tab and frame images - // are always aligned, and that their relative alignment with the toolbar - // image is always the same, so themes which try to align all three will - // look correct in both restored and maximized windows. - int y = browser_view_->y() + delegate_->GetTopInsetInBrowserView(true); - tab_strip_->SetBackgroundOffset(gfx::Point(x, y)); + // By passing true to GetTopInsetInBrowserView(), we position the tab + // background to vertically align with the frame background image of a + // restored-mode frame, even in a maximized window. Then in the frame code, + // we position the frame so the portion of the image that's behind the + // restored-mode tabstrip is always behind the tabstrip. Together these + // ensure that the tab and frame images are always aligned, and that their + // relative alignment with the toolbar image is always the same, so themes + // which try to align all three will look correct in both restored and + // maximized windows. + tab_strip_->SetBackgroundOffset(gfx::Point( + tab_strip_->GetMirroredX() + browser_view_->GetMirroredX() + + delegate_->GetThemeBackgroundXInset(), + browser_view_->y() + delegate_->GetTopInsetInBrowserView(true))); } top = LayoutToolbar(top);
diff --git a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc index 119108ed..213d315 100644 --- a/chrome/browser/ui/views/frame/glass_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/glass_browser_frame_view.cc
@@ -51,7 +51,7 @@ const int kResizeCornerWidth = 16; // How far the new avatar button is from the left of the minimize button. const int kNewAvatarButtonOffset = 5; -// The content left/right images have a shadow built into them. +// The content edge images have a shadow built into them. const int kContentEdgeShadowThickness = 2; // In restored mode, the New Tab button isn't at the same height as the caption // buttons, but the space will look cluttered if it actually slides under them, @@ -343,138 +343,117 @@ } void GlassBrowserFrameView::PaintToolbarBackground(gfx::Canvas* canvas) { - ui::ThemeProvider* tp = GetThemeProvider(); - gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds()); gfx::Point toolbar_origin(toolbar_bounds.origin()); - View::ConvertPointToTarget(browser_view(), this, &toolbar_origin); + ConvertPointToTarget(browser_view(), this, &toolbar_origin); toolbar_bounds.set_origin(toolbar_origin); + const int h = toolbar_bounds.height(); + ui::ThemeProvider* tp = GetThemeProvider(); + + // Background. + gfx::ImageSkia* bg = tp->GetImageSkiaNamed(IDR_THEME_TOOLBAR); int x = toolbar_bounds.x(); + const int y = toolbar_bounds.y(); int w = toolbar_bounds.width(); - // Toolbar background. - int y = toolbar_bounds.y(); - // Tile the toolbar image starting at the frame edge on the left and where - // the tabstrip is on the top. - gfx::ImageSkia* theme_toolbar = tp->GetImageSkiaNamed(IDR_THEME_TOOLBAR); - int dest_y = y; - // In the pre-MD world, the toolbar top edge is drawn using the - // IDR_CONTENT_TOP_XXX images, which overlay the toolbar. The top 2 px of - // these images is the actual top edge, and is partly transparent, so the - // toolbar background shouldn't be drawn over it. - const int kPreMDToolbarTopEdgeExclusion = 2; - if (browser_view()->IsTabStripVisible()) - dest_y += kPreMDToolbarTopEdgeExclusion; - canvas->TileImageInt( - *theme_toolbar, x + GetThemeBackgroundXInset(), - dest_y - GetTopInset(false) - Tab::GetYInsetForActiveTabBackground(), - x, dest_y, w, theme_toolbar->height()); + const int split_point = kContentEdgeShadowThickness; + const int split_y = + y + (browser_view()->IsTabStripVisible() ? split_point : 0); + const int bg_y = GetTopInset(false) + Tab::GetYInsetForActiveTabBackground(); + canvas->TileImageInt(*bg, x + GetThemeBackgroundXInset(), split_y - bg_y, x, + split_y, w, bg->height()); - // Toolbar edges. if (browser_view()->IsTabStripVisible()) { - // Pre-Windows 10, we draw toolbar left and right edges and top corners, - // partly atop the window border. In Windows 10+, we don't draw our own - // window border but rather go right to the system border, so we need only - // draw the toolbar top edge. - int center_x = x; - int center_w = w; + // On Windows 10+ where we don't draw our own window border but rather go + // right to the system border, the toolbar has no corners or side strokes. if (base::win::GetVersion() < base::win::VERSION_WIN10) { - // Mask out the top left corner and draw left corner and edge. - const int left_x = center_x - kContentEdgeShadowThickness; + // Mask out the corners. + gfx::ImageSkia* left = tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER); + const int img_w = left->width(); + x -= kContentEdgeShadowThickness; SkPaint paint; paint.setXfermodeMode(SkXfermode::kDstIn_Mode); canvas->DrawImageInt( - *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER_MASK), left_x, y, + *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER_MASK), x, y, paint); - gfx::ImageSkia* toolbar_left = - tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER); - canvas->DrawImageInt(*toolbar_left, left_x, y); - center_x = left_x + toolbar_left->width(); + const int right_x = + toolbar_bounds.right() + kContentEdgeShadowThickness - img_w; + canvas->DrawImageInt( + *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER_MASK), right_x, y, + paint); - // Mask out the top right corner and draw right corner and edge. - gfx::ImageSkia* toolbar_right_mask = - tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER_MASK); - const int right_x = toolbar_bounds.right() + - kContentEdgeShadowThickness - toolbar_right_mask->width(); - canvas->DrawImageInt(*toolbar_right_mask, right_x, y, paint); + // Corner and side strokes. + canvas->DrawImageInt(*left, x, y); canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER), right_x, y); - center_w = right_x - center_x; + + x += img_w; + w = right_x - x; } - // Top edge. + // Top stroke. gfx::ImageSkia* toolbar_center = tp->GetImageSkiaNamed(IDR_CONTENT_TOP_CENTER); - canvas->TileImageInt(*toolbar_center, center_x, y, center_w, - toolbar_center->height()); + canvas->TileImageInt(*toolbar_center, x, y, w, toolbar_center->height()); } // Toolbar/content separator. + const SkColor separator_color = + tp->GetColor(ThemeProperties::COLOR_TOOLBAR_SEPARATOR); if (ui::MaterialDesignController::IsModeMaterial()) { toolbar_bounds.Inset(kClientEdgeThickness, 0); - BrowserView::Paint1pxHorizontalLine( - canvas, - ThemeProperties::GetDefaultColor( - ThemeProperties::COLOR_TOOLBAR_SEPARATOR), - toolbar_bounds); + BrowserView::Paint1pxHorizontalLine(canvas, separator_color, + toolbar_bounds); } else { - canvas->FillRect( - gfx::Rect(x + kClientEdgeThickness, - toolbar_bounds.bottom() - kClientEdgeThickness, - w - (2 * kClientEdgeThickness), kClientEdgeThickness), - ThemeProperties::GetDefaultColor( - ThemeProperties::COLOR_TOOLBAR_SEPARATOR)); + toolbar_bounds.Inset(kClientEdgeThickness, h - kClientEdgeThickness, + kClientEdgeThickness, 0); + canvas->FillRect(toolbar_bounds, separator_color); } } void GlassBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) { ui::ThemeProvider* tp = GetThemeProvider(); - gfx::Rect client_area_bounds = CalculateClientAreaBounds(width(), height()); + int y = frame()->client_view()->y(); + + gfx::Rect client_bounds = CalculateClientAreaBounds(); + const int x = client_bounds.x(); + const int w = client_bounds.width(); + const int right = client_bounds.right(); + const SkColor toolbar_color = tp->GetColor(ThemeProperties::COLOR_TOOLBAR); // The client edges start below the toolbar upper corner images regardless // of how tall the toolbar itself is. - int client_area_top = frame()->client_view()->y() + - browser_view()->GetToolbarBounds().y() + + y += browser_view()->GetToolbarBounds().y() + tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER)->height(); - int client_area_bottom = - std::max(client_area_top, height() - NonClientBorderThickness(false)); - int client_area_height = client_area_bottom - client_area_top; + + const int bottom = std::max(y, height() - NonClientBorderThickness(false)); + int height = bottom - y; // Draw the client edge images. - gfx::ImageSkia* right = tp->GetImageSkiaNamed(IDR_CONTENT_RIGHT_SIDE); - canvas->TileImageInt(*right, client_area_bounds.right(), client_area_top, - right->width(), client_area_height); - canvas->DrawImageInt( - *tp->GetImageSkiaNamed(IDR_CONTENT_BOTTOM_RIGHT_CORNER), - client_area_bounds.right(), client_area_bottom); - gfx::ImageSkia* bottom = tp->GetImageSkiaNamed(IDR_CONTENT_BOTTOM_CENTER); - canvas->TileImageInt(*bottom, client_area_bounds.x(), - client_area_bottom, client_area_bounds.width(), - bottom->height()); - gfx::ImageSkia* bottom_left = - tp->GetImageSkiaNamed(IDR_CONTENT_BOTTOM_LEFT_CORNER); - canvas->DrawImageInt(*bottom_left, - client_area_bounds.x() - bottom_left->width(), client_area_bottom); - gfx::ImageSkia* left = tp->GetImageSkiaNamed(IDR_CONTENT_LEFT_SIDE); - canvas->TileImageInt(*left, client_area_bounds.x() - left->width(), - client_area_top, left->width(), client_area_height); + gfx::ImageSkia* right_image = tp->GetImageSkiaNamed(IDR_CONTENT_RIGHT_SIDE); + const int img_w = right_image->width(); + canvas->TileImageInt(*right_image, right, y, img_w, height); + canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_BOTTOM_RIGHT_CORNER), + right, bottom); + gfx::ImageSkia* bottom_image = + tp->GetImageSkiaNamed(IDR_CONTENT_BOTTOM_CENTER); + canvas->TileImageInt(*bottom_image, x, bottom, w, bottom_image->height()); + canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_BOTTOM_LEFT_CORNER), + x - img_w, bottom); + canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_LEFT_SIDE), x - img_w, + y, img_w, height); // Draw the toolbar color so that the client edges show the right color even // where not covered by the toolbar image. NOTE: We do this after drawing the // images because the images are meant to alpha-blend atop the frame whereas // these rects are meant to be fully opaque, without anything overlaid. - SkColor toolbar_color = tp->GetColor(ThemeProperties::COLOR_TOOLBAR); - canvas->FillRect(gfx::Rect(client_area_bounds.x() - kClientEdgeThickness, - client_area_top, kClientEdgeThickness, - client_area_bottom + kClientEdgeThickness - client_area_top), - toolbar_color); - canvas->FillRect(gfx::Rect(client_area_bounds.x(), client_area_bottom, - client_area_bounds.width(), kClientEdgeThickness), + gfx::Rect side(x - kClientEdgeThickness, y, kClientEdgeThickness, + bottom + kClientEdgeThickness - y); + canvas->FillRect(side, toolbar_color); + canvas->FillRect(gfx::Rect(x, bottom, w, kClientEdgeThickness), toolbar_color); - canvas->FillRect(gfx::Rect(client_area_bounds.right(), client_area_top, - kClientEdgeThickness, - client_area_bottom + kClientEdgeThickness - client_area_top), - toolbar_color); + side.set_x(right); + canvas->FillRect(side, toolbar_color); } void GlassBrowserFrameView::LayoutNewStyleAvatar() { @@ -540,7 +519,7 @@ } void GlassBrowserFrameView::LayoutClientView() { - client_view_bounds_ = CalculateClientAreaBounds(width(), height()); + client_view_bounds_ = CalculateClientAreaBounds(); } gfx::Insets GlassBrowserFrameView::GetClientAreaInsets(bool restored) const { @@ -555,9 +534,8 @@ border_thickness); } -gfx::Rect GlassBrowserFrameView::CalculateClientAreaBounds(int width, - int height) const { - gfx::Rect bounds(0, 0, width, height); +gfx::Rect GlassBrowserFrameView::CalculateClientAreaBounds() const { + gfx::Rect bounds(GetLocalBounds()); bounds.Inset(GetClientAreaInsets(false)); return bounds; }
diff --git a/chrome/browser/ui/views/frame/glass_browser_frame_view.h b/chrome/browser/ui/views/frame/glass_browser_frame_view.h index 0bf9fa57..aa903a0 100644 --- a/chrome/browser/ui/views/frame/glass_browser_frame_view.h +++ b/chrome/browser/ui/views/frame/glass_browser_frame_view.h
@@ -88,7 +88,7 @@ gfx::Insets GetClientAreaInsets(bool restored) const; // Returns the bounds of the client area for the specified view size. - gfx::Rect CalculateClientAreaBounds(int width, int height) const; + gfx::Rect CalculateClientAreaBounds() const; // Starts/Stops the window throbber running. void StartThrobber();
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc index 90d2eac..019b455 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
@@ -74,7 +74,7 @@ // 16 px at the end of each edge triggers diagonal resizing. const int kResizeAreaCornerSize = 16; -// The content left/right images have a shadow built into them. +// The content edge images have a shadow built into them. const int kContentEdgeShadowThickness = 2; #if !defined(OS_WIN) @@ -274,7 +274,8 @@ if (layout_->IsTitleBarCondensed() || frame()->IsFullscreen()) return; - views::GetDefaultWindowMask(size, window_mask); + views::GetDefaultWindowMask( + size, frame()->GetCompositor()->device_scale_factor(), window_mask); } void OpaqueBrowserFrameView::ResetWindowControls() { @@ -436,6 +437,11 @@ return browser_view()->IsTabStripVisible(); } +bool OpaqueBrowserFrameView::IsToolbarVisible() const { + return browser_view()->IsToolbarVisible() && + !browser_view()->toolbar()->GetPreferredSize().IsEmpty(); +} + int OpaqueBrowserFrameView::GetTabStripHeight() const { return browser_view()->GetTabStripHeight(); } @@ -466,10 +472,9 @@ * So we'd need to sample the background color at the right location and * synthesize a good shadow color. */ - if (browser_view()->IsToolbarVisible()) + if (IsToolbarVisible()) PaintToolbarBackground(canvas); - if (!layout_->IsTitleBarCondensed()) - PaintRestoredClientEdge(canvas); + PaintClientEdge(canvas); } // BrowserNonClientFrameView: @@ -644,17 +649,16 @@ gfx::Point toolbar_origin(toolbar_bounds.origin()); ConvertPointToTarget(browser_view(), this, &toolbar_origin); toolbar_bounds.set_origin(toolbar_origin); - int x = toolbar_bounds.x(); - int w = toolbar_bounds.width(); - int y = toolbar_bounds.y(); - int h = toolbar_bounds.height(); + const int y = toolbar_bounds.y(); + const int w = toolbar_bounds.width(); + const int h = toolbar_bounds.height(); + // Background. const bool normal_mode = browser_view()->IsTabStripVisible(); if (normal_mode) { - // Normal mode toolbar. We need to create a separate layer to hold the - // background, so we can mask off the corners before compositing onto the - // frame. + // We need to create a separate layer to hold the background, so we can mask + // off the corners before compositing onto the frame. canvas->sk_canvas()->saveLayer( gfx::RectToSkRect(gfx::Rect(x - kContentEdgeShadowThickness, y, w + kContentEdgeShadowThickness * 2, h)), @@ -669,185 +673,142 @@ // assets at this point, plus manipulating the horizontal offset of the top // pieces, lets us make the toolbar look almost as if it's intended to have // square corners. - const int kPreMDToolbarTopEdgeExclusion = 2; - const int split_point = std::min(kPreMDToolbarTopEdgeExclusion, h); - int bottom_y = y + split_point; - int bottom_edge_height = h - split_point; - + const int split_point = std::min(kContentEdgeShadowThickness, h); + int split_y = y + split_point; + int split_h = h - split_point; ui::ThemeProvider* tp = GetThemeProvider(); - if (bottom_edge_height) { - // Avoid theming popup or app windows. - gfx::ImageSkia* theme_toolbar = normal_mode ? - tp->GetImageSkiaNamed(IDR_THEME_TOOLBAR) : - ResourceBundle::GetSharedInstance().GetImageSkiaNamed( - IDR_THEME_TOOLBAR); + if (split_h) { // Tile the toolbar image starting at the frame edge on the left and where // the horizontal tabstrip is (or would be) on the top. - canvas->TileImageInt( - *theme_toolbar, x + GetThemeBackgroundXInset(), - bottom_y - GetTopInset(false) - Tab::GetYInsetForActiveTabBackground(), - x, bottom_y, w, bottom_edge_height); + const int kToolbarBackground = IDR_THEME_TOOLBAR; + // Avoid theming popup or app windows. + gfx::ImageSkia* bg = normal_mode ? + tp->GetImageSkiaNamed(kToolbarBackground) : + ResourceBundle::GetSharedInstance().GetImageSkiaNamed( + kToolbarBackground); + const int bg_y = + GetTopInset(false) + Tab::GetYInsetForActiveTabBackground(); + canvas->TileImageInt(*bg, x + GetThemeBackgroundXInset(), split_y - bg_y, x, + split_y, w, split_h); } + gfx::ImageSkia* left = tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER); const int left_x = x - kContentEdgeShadowThickness; - gfx::ImageSkia* toolbar_left = - tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER); - gfx::ImageSkia* toolbar_center = - tp->GetImageSkiaNamed(IDR_CONTENT_TOP_CENTER); - gfx::ImageSkia* toolbar_right = - tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER); - const int right_x = - x + w - toolbar_right->width() + kContentEdgeShadowThickness; + int img_w = left->width(); + gfx::ImageSkia* right = tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER); + int right_x = toolbar_bounds.right() + kContentEdgeShadowThickness - img_w; if (normal_mode) { - // Draw rounded corners for the tab. - gfx::ImageSkia* toolbar_left_mask = - tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER_MASK); - gfx::ImageSkia* toolbar_right_mask = - tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER_MASK); - - // We mask out the corners by using the DestinationIn transfer mode, - // which keeps the RGB pixels from the destination and the alpha from - // the source. + // Mask out the corners. SkPaint paint; paint.setXfermodeMode(SkXfermode::kDstIn_Mode); - - // Mask the left edge. - canvas->DrawImageInt(*toolbar_left_mask, 0, 0, toolbar_left_mask->width(), - h, left_x, y, toolbar_left_mask->width(), h, false, - paint); - - // Mask the right edge. - canvas->DrawImageInt(*toolbar_right_mask, 0, 0, toolbar_right_mask->width(), - h, right_x, y, toolbar_right_mask->width(), h, false, - paint); + canvas->DrawImageInt( + *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_LEFT_CORNER_MASK), 0, 0, img_w, + h, left_x, y, img_w, h, false, paint); + canvas->DrawImageInt( + *tp->GetImageSkiaNamed(IDR_CONTENT_TOP_RIGHT_CORNER_MASK), 0, 0, img_w, + h, right_x, y, img_w, h, false, paint); canvas->Restore(); - canvas->DrawImageInt(*toolbar_left, 0, 0, toolbar_left->width(), - h, left_x, y, toolbar_left->width(), h, false); - - canvas->TileImageInt(*toolbar_center, 0, 0, left_x + toolbar_left->width(), - y, right_x - (left_x + toolbar_left->width()), - split_point); - - canvas->DrawImageInt(*toolbar_right, 0, 0, toolbar_right->width(), h, - right_x, y, toolbar_right->width(), h, false); + // Corner and side strokes. + canvas->DrawImageInt(*left, 0, 0, img_w, h, left_x, y, img_w, h, false); + canvas->DrawImageInt(*right, 0, 0, img_w, h, right_x, y, img_w, h, false); } else { - canvas->DrawImageInt(*toolbar_left, 1, 0, toolbar_left->width() - 1, - split_point, left_x, y, toolbar_left->width() - 1, - split_point, false); - const int right_corner_x = right_x + 1; - canvas->DrawImageInt(*toolbar_right, 0, 0, toolbar_right->width() - 1, - split_point, right_corner_x, y, - toolbar_right->width() - 1, split_point, false); - canvas->TileImageInt( - *toolbar_center, 0, 0, left_x + toolbar_left->width() - 1, y, - right_corner_x - (left_x + toolbar_left->width() - 1), split_point); - if (bottom_edge_height) { - canvas->DrawImageInt( - *toolbar_left, 0, toolbar_left->height() - bottom_edge_height, - toolbar_left->width(), bottom_edge_height, left_x, bottom_y, - toolbar_left->width(), bottom_edge_height, false); - canvas->DrawImageInt( - *toolbar_right, 0, toolbar_right->height() - bottom_edge_height, - toolbar_right->width(), bottom_edge_height, right_x, bottom_y, - toolbar_right->width(), bottom_edge_height, false); + // Corner and side strokes. + if (split_h) { + const int img_h = left->height() - split_h; + canvas->DrawImageInt(*left, 0, img_h, img_w, split_h, left_x, split_y, + img_w, split_h, false); + canvas->DrawImageInt(*right, 0, img_h, img_w, split_h, right_x, split_y, + img_w, split_h, false); } + --img_w; + canvas->DrawImageInt(*left, 1, 0, img_w, split_point, left_x, y, img_w, + split_point, false); + ++right_x; + canvas->DrawImageInt(*right, 0, 0, img_w, split_point, right_x, y, img_w, + split_point, false); } - // Draw the content/toolbar separator. + // Top stroke. + x = left_x + img_w; + canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_TOP_CENTER), x, y, + right_x - x, split_point); + + // Toolbar/content separator. + const SkColor separator_color = + tp->GetColor(ThemeProperties::COLOR_TOOLBAR_SEPARATOR); if (ui::MaterialDesignController::IsModeMaterial()) { toolbar_bounds.Inset(kClientEdgeThickness, 0); - BrowserView::Paint1pxHorizontalLine( - canvas, - ThemeProperties::GetDefaultColor( - ThemeProperties::COLOR_TOOLBAR_SEPARATOR), - toolbar_bounds); + BrowserView::Paint1pxHorizontalLine(canvas, separator_color, + toolbar_bounds); } else { - canvas->FillRect( - gfx::Rect(x + kClientEdgeThickness, - toolbar_bounds.bottom() - kClientEdgeThickness, - w - (2 * kClientEdgeThickness), - kClientEdgeThickness), - ThemeProperties::GetDefaultColor( - ThemeProperties::COLOR_TOOLBAR_SEPARATOR)); + toolbar_bounds.Inset(kClientEdgeThickness, h - kClientEdgeThickness, + kClientEdgeThickness, 0); + canvas->FillRect(toolbar_bounds, separator_color); } } -void OpaqueBrowserFrameView::PaintRestoredClientEdge(gfx::Canvas* canvas) { +void OpaqueBrowserFrameView::PaintClientEdge(gfx::Canvas* canvas) { ui::ThemeProvider* tp = GetThemeProvider(); - int client_area_top = frame()->client_view()->y(); - int image_top = client_area_top; + int y = frame()->client_view()->y(); - gfx::Rect client_area_bounds = + gfx::Rect client_bounds = layout_->CalculateClientAreaBounds(width(), height()); - SkColor toolbar_color = tp->GetColor(ThemeProperties::COLOR_TOOLBAR); + const int x = client_bounds.x(); + const int w = client_bounds.width(); + const int right = client_bounds.right(); + const SkColor toolbar_color = tp->GetColor(ThemeProperties::COLOR_TOOLBAR); - if (browser_view()->IsToolbarVisible()) { + if (IsToolbarVisible()) { // The client edge images start below the toolbar. - gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds()); - client_area_top += toolbar_bounds.bottom(); - image_top = client_area_top; - } else if (!browser_view()->IsTabStripVisible()) { - // The toolbar isn't going to draw a client edge for us, so draw one - // ourselves. + y += browser_view()->GetToolbarBounds().bottom(); + } else { + // The toolbar isn't going to draw a top edge for us, so draw one ourselves. gfx::ImageSkia* top_left = tp->GetImageSkiaNamed(IDR_APP_TOP_LEFT); - gfx::ImageSkia* top_center = tp->GetImageSkiaNamed(IDR_APP_TOP_CENTER); - gfx::ImageSkia* top_right = tp->GetImageSkiaNamed(IDR_APP_TOP_RIGHT); - int top_edge_y = client_area_top - top_center->height(); - int height = client_area_top - top_edge_y; - - canvas->DrawImageInt(*top_left, 0, 0, top_left->width(), height, - client_area_bounds.x() - top_left->width(), top_edge_y, - top_left->width(), height, false); - canvas->TileImageInt(*top_center, 0, 0, client_area_bounds.x(), top_edge_y, - client_area_bounds.width(), std::min(height, top_center->height())); - canvas->DrawImageInt(*top_right, 0, 0, top_right->width(), height, - client_area_bounds.right(), top_edge_y, - top_right->width(), height, false); - - // Draw the toolbar color across the top edge. - canvas->FillRect(gfx::Rect(client_area_bounds.x() - kClientEdgeThickness, - client_area_top - kClientEdgeThickness, - client_area_bounds.width() + (2 * kClientEdgeThickness), - kClientEdgeThickness), toolbar_color); + const int img_w = top_left->width(); + const int height = top_left->height(); + const int top_y = y - height; + canvas->DrawImageInt(*top_left, 0, 0, img_w, height, x - img_w, top_y, + img_w, height, false); + canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_APP_TOP_CENTER), 0, 0, x, + top_y, w, height); + canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_APP_TOP_RIGHT), 0, 0, img_w, + height, right, top_y, img_w, height, false); + client_bounds.Inset(-kClientEdgeThickness, -kClientEdgeThickness, + -kClientEdgeThickness, client_bounds.height()); + canvas->FillRect(client_bounds, toolbar_color); } - int client_area_bottom = - std::max(client_area_top, height() - NonClientBorderThickness()); - int image_height = client_area_bottom - image_top; + // In maximized mode, the only edge to draw is the top one, so we're done. + if (layout_->IsTitleBarCondensed()) + return; + + const int bottom = std::max(y, height() - NonClientBorderThickness()); + int height = bottom - y; // Draw the client edge images. - gfx::ImageSkia* right = tp->GetImageSkiaNamed(IDR_CONTENT_RIGHT_SIDE); - canvas->TileImageInt(*right, client_area_bounds.right(), image_top, - right->width(), image_height); - canvas->DrawImageInt( - *tp->GetImageSkiaNamed(IDR_CONTENT_BOTTOM_RIGHT_CORNER), - client_area_bounds.right(), client_area_bottom); - gfx::ImageSkia* bottom = tp->GetImageSkiaNamed(IDR_CONTENT_BOTTOM_CENTER); - canvas->TileImageInt(*bottom, client_area_bounds.x(), - client_area_bottom, client_area_bounds.width(), - bottom->height()); - gfx::ImageSkia* bottom_left = - tp->GetImageSkiaNamed(IDR_CONTENT_BOTTOM_LEFT_CORNER); - canvas->DrawImageInt(*bottom_left, - client_area_bounds.x() - bottom_left->width(), client_area_bottom); - gfx::ImageSkia* left = tp->GetImageSkiaNamed(IDR_CONTENT_LEFT_SIDE); - canvas->TileImageInt(*left, client_area_bounds.x() - left->width(), - image_top, left->width(), image_height); + gfx::ImageSkia* right_image = tp->GetImageSkiaNamed(IDR_CONTENT_RIGHT_SIDE); + const int img_w = right_image->width(); + canvas->TileImageInt(*right_image, right, y, img_w, height); + canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_BOTTOM_RIGHT_CORNER), + right, bottom); + gfx::ImageSkia* bottom_image = + tp->GetImageSkiaNamed(IDR_CONTENT_BOTTOM_CENTER); + canvas->TileImageInt(*bottom_image, x, bottom, w, bottom_image->height()); + canvas->DrawImageInt(*tp->GetImageSkiaNamed(IDR_CONTENT_BOTTOM_LEFT_CORNER), + x - img_w, bottom); + gfx::ImageSkia* left_image = tp->GetImageSkiaNamed(IDR_CONTENT_LEFT_SIDE); + canvas->TileImageInt(*left_image, x - img_w, y, img_w, height); // Draw the toolbar color so that the client edges show the right color even // where not covered by the toolbar image. NOTE: We do this after drawing the // images because the images are meant to alpha-blend atop the frame whereas // these rects are meant to be fully opaque, without anything overlaid. - canvas->FillRect(gfx::Rect(client_area_bounds.x() - kClientEdgeThickness, - client_area_top, kClientEdgeThickness, - client_area_bottom + kClientEdgeThickness - client_area_top), - toolbar_color); - canvas->FillRect(gfx::Rect(client_area_bounds.x(), client_area_bottom, - client_area_bounds.width(), kClientEdgeThickness), + gfx::Rect side(x - kClientEdgeThickness, y, kClientEdgeThickness, + bottom + kClientEdgeThickness - y); + canvas->FillRect(side, toolbar_color); + canvas->FillRect(gfx::Rect(x, bottom, w, kClientEdgeThickness), toolbar_color); - canvas->FillRect(gfx::Rect(client_area_bounds.right(), client_area_top, - kClientEdgeThickness, - client_area_bottom + kClientEdgeThickness - client_area_top), - toolbar_color); + side.set_x(right); + canvas->FillRect(side, toolbar_color); }
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.h b/chrome/browser/ui/views/frame/opaque_browser_frame_view.h index 83647be1..fdea694 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.h +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.h
@@ -84,6 +84,7 @@ bool IsFullscreen() const override; bool IsTabStripVisible() const override; int GetTabStripHeight() const override; + bool IsToolbarVisible() const override; gfx::Size GetTabstripPreferredSize() const override; protected: @@ -142,10 +143,7 @@ void PaintRestoredFrameBorder(gfx::Canvas* canvas); void PaintMaximizedFrameBorder(gfx::Canvas* canvas); void PaintToolbarBackground(gfx::Canvas* canvas); - void PaintRestoredClientEdge(gfx::Canvas* canvas); - - // Returns the bounds of the client area for the specified view size. - gfx::Rect CalculateClientAreaBounds(int width, int height) const; + void PaintClientEdge(gfx::Canvas* canvas); // Our layout manager also calculates various bounds. OpaqueBrowserFrameViewLayout* layout_;
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc index dc93fb7..7739c7ac 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout.cc
@@ -26,7 +26,8 @@ // The titlebar never shrinks too short to show the caption button plus some // padding below it. -const int kCaptionButtonHeightWithPadding = 19; +const int kCaptionButtonHeight = 18; +const int kTitleBarAdditionalPadding = 3; // There is a 5 px gap between the title text and the caption buttons. const int kTitleLogoSpacing = 5; @@ -215,7 +216,7 @@ bool restored) const { if (delegate_->ShouldShowWindowTitle()) { return std::max(FrameBorderThickness(restored) + delegate_->GetIconSize(), - CaptionButtonY(restored) + kCaptionButtonHeightWithPadding) + + CaptionButtonY(restored) + kCaptionButtonHeight) + TitlebarBottomThickness(restored); } @@ -237,9 +238,14 @@ } int OpaqueBrowserFrameViewLayout::TitlebarBottomThickness(bool restored) const { - const int edge = kTitlebarTopAndBottomEdgeThickness; + int thickness = kTitleBarAdditionalPadding; + // If there's a non-empty toolbar, it will render the bottom portion of the + // titlebar. + if (delegate_->IsToolbarVisible()) + return thickness; + thickness += kTitlebarTopAndBottomEdgeThickness; return (!restored && IsTitleBarCondensed()) ? - edge : (edge + views::NonClientFrameView::kClientEdgeThickness); + thickness : (thickness + views::NonClientFrameView::kClientEdgeThickness); } int OpaqueBrowserFrameViewLayout::CaptionButtonY(bool restored) const { @@ -412,9 +418,8 @@ GetLayoutConstant(NEW_TAB_BUTTON_WIDTH) + kNewTabCaptionNormalSpacing; } - // Do not include the 1px padding that is added for the caption buttons. - new_avatar_button_->SetBounds( - button_x, button_y, button_width, kCaptionButtonHeightWithPadding - 1); + new_avatar_button_->SetBounds(button_x, button_y, button_width, + kCaptionButtonHeight); } void OpaqueBrowserFrameViewLayout::LayoutAvatar(views::View* host) {
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h index d128d448..9785ae6 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h
@@ -48,6 +48,7 @@ virtual bool IsTabStripVisible() const = 0; virtual int GetTabStripHeight() const = 0; + virtual bool IsToolbarVisible() const = 0; // Returns the tabstrips preferred size so the frame layout can work around // it.
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc index 0388890..c3bca787 100644 --- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc +++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc
@@ -112,6 +112,8 @@ return IsTabStripVisible() ? Tab::GetMinimumInactiveSize().height() : 0; } + bool IsToolbarVisible() const override { return true; } + gfx::Size GetTabstripPreferredSize() const override { // Measured from Tabstrip::GetPreferredSize(). return IsTabStripVisible() ? gfx::Size(78, 29) : gfx::Size(0, 0);
diff --git a/chrome/browser/ui/views/location_bar/ev_bubble_view.cc b/chrome/browser/ui/views/location_bar/ev_bubble_view.cc index 32a5a3d..a8c2f3ab 100644 --- a/chrome/browser/ui/views/location_bar/ev_bubble_view.cc +++ b/chrome/browser/ui/views/location_bar/ev_bubble_view.cc
@@ -5,6 +5,8 @@ #include "chrome/browser/ui/views/location_bar/ev_bubble_view.h" #include "grit/theme_resources.h" #include "ui/base/resource/material_design/material_design_controller.h" +#include "ui/gfx/paint_vector_icon.h" +#include "ui/gfx/vector_icons_public.h" #include "ui/views/controls/label.h" #include "ui/views/painter.h" @@ -12,7 +14,9 @@ SkColor text_color, SkColor parent_background_color, LocationBarView* location_bar) - : IconLabelBubbleView(IDR_OMNIBOX_HTTPS_VALID, + : IconLabelBubbleView(ui::MaterialDesignController::IsModeMaterial() + ? 0 + : IDR_OMNIBOX_HTTPS_VALID, font_list, text_color, parent_background_color, @@ -57,6 +61,16 @@ } } +void EVBubbleView::OnNativeThemeChanged(const ui::NativeTheme* native_theme) { + if (ui::MaterialDesignController::IsModeMaterial()) { + SetImage(gfx::CreateVectorIcon( + gfx::VectorIconId::LOCATION_BAR_HTTPS_VALID_IN_CHIP, 16, + GetTextColor())); + } + + IconLabelBubbleView::OnNativeThemeChanged(native_theme); +} + gfx::Size EVBubbleView::GetMinimumSizeForLabelText( const base::string16& text) const { views::Label label(text, font_list());
diff --git a/chrome/browser/ui/views/location_bar/ev_bubble_view.h b/chrome/browser/ui/views/location_bar/ev_bubble_view.h index 1874047..1e5d74a1 100644 --- a/chrome/browser/ui/views/location_bar/ev_bubble_view.h +++ b/chrome/browser/ui/views/location_bar/ev_bubble_view.h
@@ -28,6 +28,7 @@ bool OnMousePressed(const ui::MouseEvent& event) override; void OnMouseReleased(const ui::MouseEvent& event) override; void OnGestureEvent(ui::GestureEvent* event) override; + void OnNativeThemeChanged(const ui::NativeTheme* native_theme) override; // Returns what the minimum size would be if the label text were |text|. gfx::Size GetMinimumSizeForLabelText(const base::string16& text) const;
diff --git a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc index 3e2148e..16e46b5 100644 --- a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc +++ b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc
@@ -11,6 +11,7 @@ #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/canvas.h" #include "ui/gfx/color_utils.h" +#include "ui/native_theme/native_theme.h" #include "ui/views/controls/image_view.h" #include "ui/views/painter.h" @@ -123,8 +124,7 @@ label_->SetEnabledColor(GetTextColor()); - bool inverted = - color_utils::GetLuminanceForColor(parent_background_color_) < 128; + bool inverted = color_utils::IsDark(GetParentBackgroundColor()); SkColor border_color = inverted ? SK_ColorWHITE : GetBorderColor(); SkColor background_color = inverted ? SK_ColorWHITE : SkColorSetA(border_color, 0x13); @@ -133,6 +133,13 @@ SetLabelBackgroundColor(background_color); } +SkColor IconLabelBubbleView::GetParentBackgroundColor() const { + return ui::MaterialDesignController::IsModeMaterial() + ? GetNativeTheme()->GetSystemColor( + ui::NativeTheme::kColorId_TextfieldDefaultBackground) + : parent_background_color_; +} + gfx::Size IconLabelBubbleView::GetSizeForLabelWidth(int width) const { gfx::Size size(image_->GetPreferredSize()); if (ShouldShowBackground()) { @@ -166,17 +173,17 @@ } void IconLabelBubbleView::SetLabelBackgroundColor( - SkColor background_image_color) { + SkColor chip_background_color) { // The background images are painted atop |parent_background_color_|. - // Alpha-blend |background_image_color| with |parent_background_color_| to + // Alpha-blend |chip_background_color| with |parent_background_color_| to // determine the actual color the label text will sit atop. - // Tricky bit: We alpha blend an opaque version of |background_image_color| + // Tricky bit: We alpha blend an opaque version of |chip_background_color| // against |parent_background_color_| using the original image grid color's // alpha. This is because AlphaBlend(a, b, 255) always returns |a| unchanged // even if |a| is a color with non-255 alpha. label_->SetBackgroundColor(color_utils::AlphaBlend( - SkColorSetA(background_image_color, 255), parent_background_color_, - SkColorGetA(background_image_color))); + SkColorSetA(chip_background_color, 255), GetParentBackgroundColor(), + SkColorGetA(chip_background_color))); } const char* IconLabelBubbleView::GetClassName() const {
diff --git a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h index 72f0e4a..ebe4ed59 100644 --- a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h +++ b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.h
@@ -79,6 +79,8 @@ const gfx::FontList& font_list() const { return label_->font_list(); } + SkColor GetParentBackgroundColor() const; + gfx::Size GetSizeForLabelWidth(int width) const; private: @@ -90,9 +92,9 @@ // As above, but for Material Design. TODO(estade): remove/replace the above. int GetBubbleOuterPaddingMd(bool leading) const; - // Sets a background color on |label_| based on |background_image_color| and - // |parent_background_color_|. - void SetLabelBackgroundColor(SkColor background_image_color); + // Sets a background color on |label_| based on |chip_background_color| and + // the parent's bg color. + void SetLabelBackgroundColor(SkColor chip_background_color); // views::View: const char* GetClassName() const override; @@ -107,6 +109,9 @@ bool is_extension_icon_; + // This is only used in pre-MD. In MD, the background color is derived from + // the native theme (so it responds to native theme updates). TODO(estade): + // remove when MD is default. SkColor parent_background_color_; DISALLOW_COPY_AND_ASSIGN(IconLabelBubbleView);
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc index eb0f264..609805a 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -339,8 +339,7 @@ SkColor LocationBarView::GetSecureTextColor( SecurityStateModel::SecurityLevel security_level) const { - bool inverted = - color_utils::GetLuminanceForColor(GetColor(BACKGROUND)) < 128; + bool inverted = color_utils::IsDark(GetColor(BACKGROUND)); SkColor color; switch (security_level) { case SecurityStateModel::EV_SECURE: @@ -792,6 +791,7 @@ if (!ui::MaterialDesignController::IsModeMaterial()) return; + RefreshLocationIcon(); set_background(new BackgroundWith1PxBorder( GetColor(BACKGROUND), SkColorSetARGB(0x4D, 0x00, 0x00, 0x00), is_popup_mode_)); @@ -868,6 +868,22 @@ kPopupEdgeThickness : GetLayoutConstant(LOCATION_BAR_VERTICAL_PADDING); } +void LocationBarView::RefreshLocationIcon() { + // |omnibox_view_| may not be ready yet if Init() has not been called. The + // icon will be set soon by OnChanged(). + if (!omnibox_view_) + return; + + if (ui::MaterialDesignController::IsModeMaterial()) { + location_icon_view_->SetImage(gfx::CreateVectorIcon( + omnibox_view_->GetVectorIcon(color_utils::IsDark(GetColor(BACKGROUND))), + 16, color_utils::DeriveDefaultIconColor(GetColor(TEXT)))); + } else { + location_icon_view_->SetImage( + *GetThemeProvider()->GetImageSkiaNamed(omnibox_view_->GetIcon())); + } +} + bool LocationBarView::RefreshContentSettingViews() { bool visibility_changed = false; for (ContentSettingViews::const_iterator i(content_setting_views_.begin()); @@ -1241,8 +1257,10 @@ } void LocationBarView::OnBoundsChanged(const gfx::Rect& previous_bounds) { - InstantServiceFactory::GetForProfile(profile())->OnOmniboxStartMarginChanged( - bounds().x()); + InstantService* instant_service = + InstantServiceFactory::GetForProfile(profile()); + if (instant_service) + instant_service->OnOmniboxStartMarginChanged(bounds().x()); OmniboxPopupView* popup = omnibox_view_->model()->popup_model()->view(); if (popup->IsOpen()) @@ -1357,11 +1375,7 @@ // LocationBarView, private OmniboxEditController implementation: void LocationBarView::OnChanged() { - location_icon_view_->SetImage( - ui::MaterialDesignController::IsModeMaterial() - ? gfx::CreateVectorIcon(omnibox_view_->GetVectorIcon(), 16, - gfx::kChromeIconGrey) - : *GetThemeProvider()->GetImageSkiaNamed(omnibox_view_->GetIcon())); + RefreshLocationIcon(); location_icon_view_->ShowTooltip(!GetOmniboxView()->IsEditingOrEmpty()); Layout();
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.h b/chrome/browser/ui/views/location_bar/location_bar_view.h index f0ad63e..2475079 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.h +++ b/chrome/browser/ui/views/location_bar/location_bar_view.h
@@ -284,6 +284,9 @@ // The vertical padding to be applied to all contained views. int VerticalPadding() const; + // Updates |location_icon_view_| based on the current state and theme. + void RefreshLocationIcon(); + // Updates the visibility state of the Content Blocked icons to reflect what // is actually blocked on the current page. Returns true if the visibility // of at least one of the views in |content_setting_views_| changed.
diff --git a/chrome/browser/ui/views/location_bar/selected_keyword_view.cc b/chrome/browser/ui/views/location_bar/selected_keyword_view.cc index 29ebad1..517a51a 100644 --- a/chrome/browser/ui/views/location_bar/selected_keyword_view.cc +++ b/chrome/browser/ui/views/location_bar/selected_keyword_view.cc
@@ -17,6 +17,8 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/material_design/material_design_controller.h" #include "ui/base/theme_provider.h" +#include "ui/gfx/color_palette.h" +#include "ui/gfx/color_utils.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/vector_icons_public.h" #include "ui/native_theme/native_theme.h" @@ -56,11 +58,15 @@ } SkColor SelectedKeywordView::GetTextColor() const { - return GetNativeTheme()->GetSystemColor( - ui::NativeTheme::kColorId_LinkEnabled); + DCHECK(ui::MaterialDesignController::IsModeMaterial()); + return color_utils::IsDark(GetParentBackgroundColor()) + ? gfx::kGoogleBlue700 + : GetNativeTheme()->GetSystemColor( + ui::NativeTheme::kColorId_LinkEnabled); } SkColor SelectedKeywordView::GetBorderColor() const { + DCHECK(ui::MaterialDesignController::IsModeMaterial()); return GetTextColor(); }
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc index 3154225..79c2b69 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
@@ -75,12 +75,6 @@ OmniboxResultView::HOVERED, OmniboxResultView::URL }, { NativeTheme::kColorId_ResultsTableSelectedUrl, OmniboxResultView::SELECTED, OmniboxResultView::URL }, - { NativeTheme::kColorId_ResultsTableNormalDivider, - OmniboxResultView::NORMAL, OmniboxResultView::DIVIDER }, - { NativeTheme::kColorId_ResultsTableHoveredDivider, - OmniboxResultView::HOVERED, OmniboxResultView::DIVIDER }, - { NativeTheme::kColorId_ResultsTableSelectedDivider, - OmniboxResultView::SELECTED, OmniboxResultView::DIVIDER }, }; struct TextStyle {
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.h b/chrome/browser/ui/views/omnibox/omnibox_result_view.h index 5a05aaa..264092f 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_result_view.h +++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.h
@@ -42,7 +42,6 @@ TEXT, DIMMED_TEXT, URL, - DIVIDER, NUM_KINDS };
diff --git a/chrome/browser/ui/views/profiles/avatar_menu_button.cc b/chrome/browser/ui/views/profiles/avatar_menu_button.cc index 30da45d23..522d128 100644 --- a/chrome/browser/ui/views/profiles/avatar_menu_button.cc +++ b/chrome/browser/ui/views/profiles/avatar_menu_button.cc
@@ -33,10 +33,10 @@ // static const char AvatarMenuButton::kViewClassName[] = "AvatarMenuButton"; -AvatarMenuButton::AvatarMenuButton(Browser* browser, bool disabled) +AvatarMenuButton::AvatarMenuButton(BrowserView* browser_view) : MenuButton(NULL, base::string16(), this, false), - browser_(browser), - disabled_(disabled), + browser_view_(browser_view), + enabled_(browser_view_->IsRegularOrGuestSession()), is_rectangle_(false), old_height_(0), button_on_right_(false) { @@ -94,17 +94,17 @@ } // static -bool AvatarMenuButton::GetAvatarImages(Profile* profile, +bool AvatarMenuButton::GetAvatarImages(BrowserView* browser_view, bool should_show_avatar_menu, gfx::Image* avatar, gfx::Image* taskbar_badge_avatar, bool* is_rectangle) { - ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); + const Profile* profile = browser_view->browser()->profile(); if (profile->GetProfileType() == Profile::GUEST_PROFILE) { - *avatar = rb. - GetImageNamed(profiles::GetPlaceholderAvatarIconResourceID()); + *avatar = ui::ResourceBundle::GetSharedInstance().GetImageNamed( + profiles::GetPlaceholderAvatarIconResourceID()); } else if (profile->GetProfileType() == Profile::INCOGNITO_PROFILE) { - *avatar = rb.GetImageNamed(IDR_OTR_ICON); + *avatar = gfx::Image(browser_view->GetOTRAvatarIcon()); // TODO(nkostylev): Allow this on ChromeOS once the ChromeOS test // environment handles profile directories correctly. #if !defined(OS_CHROMEOS) @@ -143,13 +143,13 @@ bool AvatarMenuButton::DoesIntersectRect(const views::View* target, const gfx::Rect& rect) const { CHECK_EQ(target, this); - return !disabled_ && + return enabled_ && views::ViewTargeterDelegate::DoesIntersectRect(target, rect); } // views::MenuButtonListener implementation void AvatarMenuButton::OnMenuButtonClicked(views::View* source, const gfx::Point& point) { - if (!disabled_) - chrome::ShowAvatarMenu(browser_); + if (enabled_) + chrome::ShowAvatarMenu(browser_view_->browser()); }
diff --git a/chrome/browser/ui/views/profiles/avatar_menu_button.h b/chrome/browser/ui/views/profiles/avatar_menu_button.h index 343e467..a28dc92 100644 --- a/chrome/browser/ui/views/profiles/avatar_menu_button.h +++ b/chrome/browser/ui/views/profiles/avatar_menu_button.h
@@ -17,7 +17,7 @@ class Canvas; class Image; } -class Browser; +class BrowserView; class Profile; // AvatarMenuButton @@ -32,9 +32,8 @@ // Internal class name. static const char kViewClassName[]; - // Creates a new button. Unless |disabled| is true, clicking on the button - // will cause the profile menu to be displayed. - AvatarMenuButton(Browser* browser, bool disabled); + // Creates a new button for the given browser view. + explicit AvatarMenuButton(BrowserView* browser_view); ~AvatarMenuButton() override; @@ -51,12 +50,12 @@ } bool button_on_right() { return button_on_right_; } - // Get avatar images for the profile. |avatar| is used in the browser window - // whereas |taskbar_badge_avatar| is used for the OS taskbar. If + // Get avatar images for the BrowserView. |avatar| is used in the browser + // window whereas |taskbar_badge_avatar| is used for the OS taskbar. If // |taskbar_badge_avatar| is empty then |avatar| should be used for the // taskbar as well. Returns false if the cache doesn't have an entry for a - // Profile::REGULAR_PROFILE type |profile|, otherwise return true. - static bool GetAvatarImages(Profile* profile, + // Profile::REGULAR_PROFILE type Profile, otherwise return true. + static bool GetAvatarImages(BrowserView* browser_view, bool should_show_avatar_menu, gfx::Image* avatar, gfx::Image* taskbar_badge_avatar, @@ -71,8 +70,8 @@ void OnMenuButtonClicked(views::View* source, const gfx::Point& point) override; - Browser* browser_; - bool disabled_; + BrowserView* browser_view_; + bool enabled_; scoped_ptr<ui::MenuModel> menu_model_; // Use a scoped ptr because gfx::Image doesn't have a default constructor.
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc index 38574494..b428633 100644 --- a/chrome/browser/ui/views/tabs/tab.cc +++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -1197,7 +1197,9 @@ // If the theme is providing a custom background image, then its top edge // should be at the top of the tab. Otherwise, we assume that the background - // image is a composited foreground + frame image. + // image is a composited foreground + frame image. Note that if the theme is + // only providing a custom frame image, |has_custom_image| will be true, but + // we should use the |background_offset_| here. const int y_offset = GetThemeProvider()->HasCustomImage(fill_id) ? -GetLayoutConstant(TAB_TOP_EXCLUSION_HEIGHT) : background_offset_.y(); @@ -1515,11 +1517,6 @@ // We're not letting people override tab images just yet. ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); - mask_images_.image_l = rb.GetImageSkiaNamed(IDR_TAB_ALPHA_LEFT); - mask_images_.image_r = rb.GetImageSkiaNamed(IDR_TAB_ALPHA_RIGHT); - mask_images_.l_width = mask_images_.image_l->width(); - mask_images_.r_width = mask_images_.image_r->width(); - active_images_.image_l = rb.GetImageSkiaNamed(IDR_TAB_ACTIVE_LEFT); active_images_.image_c = rb.GetImageSkiaNamed(IDR_TAB_ACTIVE_CENTER); active_images_.image_r = rb.GetImageSkiaNamed(IDR_TAB_ACTIVE_RIGHT); @@ -1531,6 +1528,11 @@ inactive_images_.image_r = rb.GetImageSkiaNamed(IDR_TAB_INACTIVE_RIGHT); inactive_images_.l_width = inactive_images_.image_l->width(); inactive_images_.r_width = inactive_images_.image_r->width(); + + mask_images_.image_l = rb.GetImageSkiaNamed(IDR_TAB_ALPHA_LEFT); + mask_images_.image_r = rb.GetImageSkiaNamed(IDR_TAB_ALPHA_RIGHT); + mask_images_.l_width = mask_images_.image_l->width(); + mask_images_.r_width = mask_images_.image_r->width(); } // static
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index 46fee491..d79c324 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -332,14 +332,14 @@ gfx::ScopedCanvas scoped_canvas(canvas); canvas->Translate(gfx::Vector2d(0, height() - kNewTabButtonHeight)); - const float scale = canvas->image_scale(); - - // Draw the fill. const bool pressed = state() == views::CustomButton::STATE_PRESSED; double hover_value = (state() == views::CustomButton::STATE_HOVERED) ? 1 : 0; if (hover_animation_->is_animating()) hover_value = hover_animation_->GetCurrentValue(); + const float scale = canvas->image_scale(); + + // Fill. gfx::ImageSkia* mask = GetThemeProvider()->GetImageSkiaNamed(IDR_NEWTAB_BUTTON_MASK); // The canvas and mask have to use the same scale factor. @@ -351,8 +351,7 @@ canvas->DrawImageInt( gfx::ImageSkiaOperations::CreateMaskedImage(image, *mask), 0, 0); - // Draw the stroke. - // Draw the button border with a slight alpha. + // Stroke. Draw the button border with a slight alpha. static const SkAlpha kGlassFrameOverlayAlpha = 178; static const SkAlpha kOpaqueFrameOverlayAlpha = 230; const SkAlpha alpha = GetWidget()->ShouldWindowContentsBeTransparent() ?
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc index 89b5f4c4..a158275 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -858,9 +858,11 @@ context.is_enrolling_consumer_management = is_enrolling_consumer_management_; std::string gaia_id; - if (user_manager::UserManager::Get()->FindGaiaID( - AccountId::FromUserEmail(context.email), &gaia_id)) + if (!context.email.empty() && + user_manager::UserManager::Get()->FindGaiaID( + AccountId::FromUserEmail(context.email), &gaia_id)) { context.gaia_id = gaia_id; + } if (Delegate()) { context.show_users = Delegate()->IsShowUsers();
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc index 1f05411..73ee81e 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -874,7 +874,7 @@ void SigninScreenHandler::OnUserImageChanged(const user_manager::User& user) { if (page_is_ready()) - CallJS("login.AccountPickerScreen.updateUserImage", user.email()); + CallJS("login.AccountPickerScreen.updateUserImage", user.GetAccountId()); } void SigninScreenHandler::OnPreferencesChanged() { @@ -988,12 +988,14 @@ AllWhitelistedUsersPresent()); } -void SigninScreenHandler::HandleAuthenticateUser(const std::string& username, +void SigninScreenHandler::HandleAuthenticateUser(const AccountId& account_id, const std::string& password) { if (!delegate_) return; - UserContext user_context( - AccountId::FromUserEmail(gaia::SanitizeEmail(username))); + DCHECK_EQ(account_id.GetUserEmail(), + gaia::SanitizeEmail(account_id.GetUserEmail())); + + UserContext user_context(account_id); user_context.SetKey(Key(password)); delegate_->Login(user_context, SigninSpecifics()); } @@ -1014,13 +1016,14 @@ } void SigninScreenHandler::HandleLaunchPublicSession( - const std::string& user_id, + const AccountId& account_id, const std::string& locale, const std::string& input_method) { if (!delegate_) return; - UserContext context(user_manager::USER_TYPE_PUBLIC_ACCOUNT, user_id); + UserContext context(user_manager::USER_TYPE_PUBLIC_ACCOUNT, + account_id.GetUserEmail()); context.SetPublicSessionLocale(locale), context.SetPublicSessionInputMethod(input_method); delegate_->Login(context, SigninSpecifics()); @@ -1043,22 +1046,22 @@ ash::Shell::GetInstance()->lock_state_controller()->RequestShutdown(); } -void SigninScreenHandler::HandleLoadWallpaper(const std::string& email) { +void SigninScreenHandler::HandleLoadWallpaper(const AccountId& account_id) { if (delegate_) - delegate_->LoadWallpaper(email); + delegate_->LoadWallpaper(account_id.GetUserEmail()); } void SigninScreenHandler::HandleRebootSystem() { chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart(); } -void SigninScreenHandler::HandleRemoveUser(const std::string& email) { +void SigninScreenHandler::HandleRemoveUser(const AccountId& account_id) { ProfileMetrics::LogProfileDeleteUser( ProfileMetrics::DELETE_PROFILE_USER_MANAGER); if (!delegate_) return; - delegate_->RemoveUser(email); + delegate_->RemoveUser(account_id.GetUserEmail()); UpdateAddButtonStatus(); } @@ -1174,10 +1177,10 @@ } void SigninScreenHandler::HandleCancelPasswordChangedFlow( - const std::string& user_id) { - if (!user_id.empty()) - RecordReauthReason(AccountId::FromUserEmail(user_id), - ReauthReason::PASSWORD_UPDATE_SKIPPED); + const AccountId& account_id) { + if (account_id.is_valid()) { + RecordReauthReason(account_id, ReauthReason::PASSWORD_UPDATE_SKIPPED); + } gaia_screen_handler_->StartClearingCookies( base::Bind(&SigninScreenHandler::CancelPasswordChangedFlowInternal, weak_factory_.GetWeakPtr())); @@ -1235,19 +1238,19 @@ UpdateState(NetworkError::ERROR_REASON_LOADING_TIMEOUT); } -void SigninScreenHandler::HandleFocusPod(const std::string& user_id) { - SetUserInputMethod(user_id, ime_state_.get()); - WallpaperManager::Get()->SetUserWallpaperDelayed(user_id); - proximity_auth::ScreenlockBridge::Get()->SetFocusedUser(user_id); +void SigninScreenHandler::HandleFocusPod(const AccountId& account_id) { + SetUserInputMethod(account_id.GetUserEmail(), ime_state_.get()); + WallpaperManager::Get()->SetUserWallpaperDelayed(account_id.GetUserEmail()); + proximity_auth::ScreenlockBridge::Get()->SetFocusedUser( + account_id.GetUserEmail()); if (delegate_) - delegate_->CheckUserStatus(user_id); + delegate_->CheckUserStatus(account_id); if (!test_focus_pod_callback_.is_null()) test_focus_pod_callback_.Run(); bool use_24hour_clock = false; if (user_manager::UserManager::Get()->GetKnownUserBooleanPref( - AccountId::FromUserEmail(user_id), prefs::kUse24HourClock, - &use_24hour_clock)) { + account_id, prefs::kUse24HourClock, &use_24hour_clock)) { g_browser_process->platform_part() ->GetSystemClock() ->SetLastFocusedPodHourClockType(use_24hour_clock ? base::k24HourClock @@ -1256,29 +1259,26 @@ } void SigninScreenHandler::HandleGetPublicSessionKeyboardLayouts( - const std::string& user_id, + const AccountId& account_id, const std::string& locale) { GetKeyboardLayoutsForLocale( base::Bind(&SigninScreenHandler::SendPublicSessionKeyboardLayouts, - weak_factory_.GetWeakPtr(), - user_id, - locale), + weak_factory_.GetWeakPtr(), account_id, locale), locale); } void SigninScreenHandler::SendPublicSessionKeyboardLayouts( - const std::string& user_id, + const AccountId& account_id, const std::string& locale, scoped_ptr<base::ListValue> keyboard_layouts) { CallJS("login.AccountPickerScreen.setPublicSessionKeyboardLayouts", - user_id, - locale, - *keyboard_layouts); + account_id, locale, *keyboard_layouts); } -void SigninScreenHandler::HandleLaunchKioskApp(const std::string& app_id, +void SigninScreenHandler::HandleLaunchKioskApp(const AccountId& app_account_id, bool diagnostic_mode) { - UserContext context(user_manager::USER_TYPE_KIOSK_APP, app_id); + UserContext context(user_manager::USER_TYPE_KIOSK_APP, + app_account_id.GetUserEmail()); SigninSpecifics specifics; specifics.kiosk_diagnostic_mode = diagnostic_mode; if (delegate_) @@ -1309,7 +1309,7 @@ } void SigninScreenHandler::HandleFirstIncorrectPasswordAttempt( - const std::string& email) { + const AccountId& account_id) { // TODO(ginkage): Fix this case once crbug.com/469987 is ready. /* if (user_manager::UserManager::Get()->FindUsingSAML(email)) @@ -1318,9 +1318,8 @@ } void SigninScreenHandler::HandleMaxIncorrectPasswordAttempts( - const std::string& email) { - RecordReauthReason(AccountId::FromUserEmail(email), - ReauthReason::INCORRECT_PASSWORD_ENTERED); + const AccountId& account_id) { + RecordReauthReason(account_id, ReauthReason::INCORRECT_PASSWORD_ENTERED); } bool SigninScreenHandler::AllWhitelistedUsersPresent() {
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h index 86ff5797..0f5b3f02 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h
@@ -185,7 +185,7 @@ virtual void HandleGetUsers() = 0; // Runs an OAuth token validation check for user. - virtual void CheckUserStatus(const std::string& user_id) = 0; + virtual void CheckUserStatus(const AccountId& account_id) = 0; // Returns true if user is allowed to log in by domain policy. virtual bool IsUserWhitelisted(const std::string& user_id) = 0; @@ -319,18 +319,18 @@ // WebUI message handlers. void HandleGetUsers(); - void HandleAuthenticateUser(const std::string& username, + void HandleAuthenticateUser(const AccountId& account_id, const std::string& password); void HandleAttemptUnlock(const std::string& username); void HandleLaunchIncognito(); - void HandleLaunchPublicSession(const std::string& user_id, + void HandleLaunchPublicSession(const AccountId& account_id, const std::string& locale, const std::string& input_method); void HandleOfflineLogin(const base::ListValue* args); void HandleShutdownSystem(); - void HandleLoadWallpaper(const std::string& email); + void HandleLoadWallpaper(const AccountId& account_id); void HandleRebootSystem(); - void HandleRemoveUser(const std::string& email); + void HandleRemoveUser(const AccountId& account_id); void HandleShowAddUser(const base::ListValue* args); void HandleToggleEnrollmentScreen(); void HandleToggleEnableDebuggingScreen(); @@ -342,7 +342,7 @@ void HandleSignOutUser(); void HandleOpenProxySettings(); void HandleLoginVisible(const std::string& source); - void HandleCancelPasswordChangedFlow(const std::string& user_id); + void HandleCancelPasswordChangedFlow(const AccountId& account_id); void HandleCancelUserAdding(); void HandleMigrateUserData(const std::string& password); void HandleResyncUserData(); @@ -351,21 +351,22 @@ void HandleLoginScreenUpdate(); void HandleShowLoadingTimeoutError(); void HandleShowSupervisedUserCreationScreen(); - void HandleFocusPod(const std::string& user_id); + void HandleFocusPod(const AccountId& account_id); void HandleHardlockPod(const std::string& user_id); - void HandleLaunchKioskApp(const std::string& app_id, bool diagnostic_mode); - void HandleGetPublicSessionKeyboardLayouts(const std::string& user_id, + void HandleLaunchKioskApp(const AccountId& app_account_id, + bool diagnostic_mode); + void HandleGetPublicSessionKeyboardLayouts(const AccountId& account_id, const std::string& locale); void HandleCancelConsumerManagementEnrollment(); void HandleGetTouchViewState(); void HandleLogRemoveUserWarningShown(); - void HandleFirstIncorrectPasswordAttempt(const std::string& email); - void HandleMaxIncorrectPasswordAttempts(const std::string& email); + void HandleFirstIncorrectPasswordAttempt(const AccountId& account_id); + void HandleMaxIncorrectPasswordAttempts(const AccountId& account_id); // Sends the list of |keyboard_layouts| available for the |locale| that is // currently selected for the public session identified by |user_id|. void SendPublicSessionKeyboardLayouts( - const std::string& user_id, + const AccountId& account_id, const std::string& locale, scoped_ptr<base::ListValue> keyboard_layouts);
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc b/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc index 0a69c1f..aa8f2ec 100644 --- a/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc +++ b/chrome/browser/ui/webui/chromeos/login/signin_userlist_unittest.cc
@@ -13,6 +13,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile_manager.h" #include "components/proximity_auth/screenlock_bridge.h" +#include "components/signin/core/account_id/account_id.h" #include "components/user_manager/user.h" #include "testing/gtest/include/gtest/gtest.h" @@ -86,7 +87,8 @@ EXPECT_LT(kMaxUsers, fake_user_manager_->GetUsers().size()); user_manager::UserList users_to_send = UserSelectionScreen::PrepareUserListForSending( - fake_user_manager_->GetUsers(), kOwner, true /* is signin to add */); + fake_user_manager_->GetUsers(), AccountId::FromUserEmail(kOwner), + true /* is signin to add */); EXPECT_EQ(kMaxUsers, users_to_send.size()); EXPECT_EQ(kOwner, users_to_send.back()->email()); @@ -96,8 +98,7 @@ fake_user_manager_->RemoveUserFromList( AccountId::FromUserEmail("a17@gmail.com")); users_to_send = UserSelectionScreen::PrepareUserListForSending( - fake_user_manager_->GetUsers(), - kOwner, + fake_user_manager_->GetUsers(), AccountId::FromUserEmail(kOwner), true /* is signin to add */); EXPECT_EQ(kMaxUsers, users_to_send.size()); @@ -108,14 +109,14 @@ TEST_F(SigninPrepareUserListTest, PublicAccounts) { user_manager::UserList users_to_send = UserSelectionScreen::PrepareUserListForSending( - fake_user_manager_->GetUsers(), kOwner, true /* is signin to add */); + fake_user_manager_->GetUsers(), AccountId::FromUserEmail(kOwner), + true /* is signin to add */); EXPECT_EQ(kMaxUsers, users_to_send.size()); EXPECT_EQ("a0@gmail.com", users_to_send.front()->email()); users_to_send = UserSelectionScreen::PrepareUserListForSending( - fake_user_manager_->GetUsers(), - kOwner, + fake_user_manager_->GetUsers(), AccountId::FromUserEmail(kOwner), false /* is signin to add */); EXPECT_EQ(kMaxUsers, users_to_send.size());
diff --git a/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.cc index c672a24..5a6cb430 100644 --- a/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.cc
@@ -18,6 +18,7 @@ #include "chrome/grit/generated_resources.h" #include "chromeos/audio/chromeos_sounds.h" #include "components/login/localized_values_builder.h" +#include "components/signin/core/account_id/account_id.h" #include "components/user_manager/user_manager.h" #include "components/user_manager/user_type.h" #include "google_apis/gaia/gaia_auth_util.h" @@ -298,14 +299,14 @@ } void SupervisedUserCreationScreenHandler::HandleManagerSelected( - const std::string& manager_id) { + const AccountId& manager_id) { if (!delegate_) return; - WallpaperManager::Get()->SetUserWallpaperNow(manager_id); + WallpaperManager::Get()->SetUserWallpaperNow(manager_id.GetUserEmail()); } void SupervisedUserCreationScreenHandler::HandleImportUserSelected( - const std::string& user_id) { + const AccountId& account_id) { if (!delegate_) return; } @@ -368,35 +369,37 @@ } void SupervisedUserCreationScreenHandler::HandleImportSupervisedUser( - const std::string& user_id) { + const AccountId& account_id) { if (!delegate_) return; ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16( IDS_CREATE_SUPERVISED_USER_CREATION_CREATION_PROGRESS_MESSAGE)); - delegate_->ImportSupervisedUser(user_id); + delegate_->ImportSupervisedUser(account_id.GetUserEmail()); } void SupervisedUserCreationScreenHandler:: - HandleImportSupervisedUserWithPassword( - const std::string& user_id, - const std::string& password) { + HandleImportSupervisedUserWithPassword(const AccountId& account_id, + const std::string& password) { if (!delegate_) return; ShowStatusMessage(true /* progress */, l10n_util::GetStringUTF16( IDS_CREATE_SUPERVISED_USER_CREATION_CREATION_PROGRESS_MESSAGE)); - delegate_->ImportSupervisedUserWithPassword(user_id, password); + delegate_->ImportSupervisedUserWithPassword(account_id.GetUserEmail(), + password); } void SupervisedUserCreationScreenHandler::HandleAuthenticateManager( - const std::string& raw_manager_username, + const AccountId& manager_raw_account_id, const std::string& manager_password) { - const std::string manager_username = - gaia::SanitizeEmail(raw_manager_username); - delegate_->AuthenticateManager(manager_username, manager_password); + const AccountId manager_account_id = AccountId::FromUserEmailGaiaId( + gaia::SanitizeEmail(manager_raw_account_id.GetUserEmail()), + manager_raw_account_id.GetGaiaId()); + delegate_->AuthenticateManager(manager_account_id.GetUserEmail(), + manager_password); } // TODO(antrim) : this is an explicit code duplications with UserImageScreen.
diff --git a/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h index 4d9284be8..3af31ea 100644 --- a/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h
@@ -106,8 +106,8 @@ // WebUI message handlers. void HandleCheckSupervisedUserName(const base::string16& name); - void HandleManagerSelected(const std::string& manager_id); - void HandleImportUserSelected(const std::string& user_id); + void HandleManagerSelected(const AccountId& manager_id); + void HandleImportUserSelected(const AccountId& account_id); void HandleFinishLocalSupervisedUserCreation(); void HandleAbortLocalSupervisedUserCreation(); @@ -115,12 +115,12 @@ void HandleRetryLocalSupervisedUserCreation(const base::ListValue* args); void HandleCurrentSupervisedUserPage(const std::string& current_page); - void HandleAuthenticateManager(const std::string& raw_manager_username, + void HandleAuthenticateManager(const AccountId& manager_account_id, const std::string& manager_password); void HandleCreateSupervisedUser(const base::string16& new_raw_user_name, const std::string& new_user_password); - void HandleImportSupervisedUser(const std::string& user_id); - void HandleImportSupervisedUserWithPassword(const std::string& user_id, + void HandleImportSupervisedUser(const AccountId& account_id); + void HandleImportSupervisedUserWithPassword(const AccountId& account_id, const std::string& password); void HandleGetImages();
diff --git a/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc index 18c0ac30..2cd46ed 100644 --- a/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.cc
@@ -37,38 +37,38 @@ model_->SendUserList(); } -void UserBoardScreenHandler::HandleHardlockPod(const std::string& user_id) { +void UserBoardScreenHandler::HandleHardlockPod(const AccountId& account_id) { CHECK(model_); - model_->HardLockPod(user_id); + model_->HardLockPod(account_id); } -void UserBoardScreenHandler::HandleAttemptUnlock(const std::string& user_id) { +void UserBoardScreenHandler::HandleAttemptUnlock(const AccountId& account_id) { CHECK(model_); - model_->AttemptEasyUnlock(user_id); + model_->AttemptEasyUnlock(account_id); } void UserBoardScreenHandler::HandleRecordClickOnLockIcon( - const std::string& user_id) { + const AccountId& account_id) { CHECK(model_); - model_->RecordClickOnLockIcon(user_id); + model_->RecordClickOnLockIcon(account_id); } //----------------- API void UserBoardScreenHandler::SetPublicSessionDisplayName( - const std::string& user_id, + const AccountId& account_id, const std::string& display_name) { - CallJS("login.AccountPickerScreen.setPublicSessionDisplayName", user_id, + CallJS("login.AccountPickerScreen.setPublicSessionDisplayName", account_id, display_name); } void UserBoardScreenHandler::SetPublicSessionLocales( - const std::string& user_id, + const AccountId& account_id, scoped_ptr<base::ListValue> locales, const std::string& default_locale, bool multiple_recommended_locales) { - CallJS("login.AccountPickerScreen.setPublicSessionLocales", user_id, *locales, - default_locale, multiple_recommended_locales); + CallJS("login.AccountPickerScreen.setPublicSessionLocales", account_id, + *locales, default_locale, multiple_recommended_locales); } void UserBoardScreenHandler::ShowBannerMessage(const base::string16& message) { @@ -76,20 +76,21 @@ } void UserBoardScreenHandler::ShowUserPodCustomIcon( - const std::string& user_id, + const AccountId& account_id, const base::DictionaryValue& icon) { - CallJS("login.AccountPickerScreen.showUserPodCustomIcon", user_id, icon); + CallJS("login.AccountPickerScreen.showUserPodCustomIcon", account_id, icon); } -void UserBoardScreenHandler::HideUserPodCustomIcon(const std::string& user_id) { - CallJS("login.AccountPickerScreen.hideUserPodCustomIcon", user_id); +void UserBoardScreenHandler::HideUserPodCustomIcon( + const AccountId& account_id) { + CallJS("login.AccountPickerScreen.hideUserPodCustomIcon", account_id); } void UserBoardScreenHandler::SetAuthType( - const std::string& user_id, + const AccountId& account_id, proximity_auth::ScreenlockBridge::LockHandler::AuthType auth_type, const base::string16& initial_value) { - CallJS("login.AccountPickerScreen.setAuthType", user_id, + CallJS("login.AccountPickerScreen.setAuthType", account_id, static_cast<int>(auth_type), base::StringValue(initial_value)); }
diff --git a/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h index 1c854370..fd8d52e 100644 --- a/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h
@@ -32,23 +32,23 @@ // Handlers void HandleGetUsers(); - void HandleHardlockPod(const std::string& user_id); - void HandleAttemptUnlock(const std::string& user_id); - void HandleRecordClickOnLockIcon(const std::string& user_id); + void HandleHardlockPod(const AccountId& account_id); + void HandleAttemptUnlock(const AccountId& account_id); + void HandleRecordClickOnLockIcon(const AccountId& account_id); // UserBoardView implementation: - void SetPublicSessionDisplayName(const std::string& user_id, + void SetPublicSessionDisplayName(const AccountId& account_id, const std::string& display_name) override; - void SetPublicSessionLocales(const std::string& user_id, + void SetPublicSessionLocales(const AccountId& account_id, scoped_ptr<base::ListValue> locales, const std::string& default_locale, bool multiple_recommended_locales) override; void ShowBannerMessage(const base::string16& message) override; - void ShowUserPodCustomIcon(const std::string& user_id, + void ShowUserPodCustomIcon(const AccountId& account_id, const base::DictionaryValue& icon) override; - void HideUserPodCustomIcon(const std::string& user_id) override; + void HideUserPodCustomIcon(const AccountId& account_id) override; void SetAuthType( - const std::string& user_id, + const AccountId& account_id, proximity_auth::ScreenlockBridge::LockHandler::AuthType auth_type, const base::string16& initial_value) override;
diff --git a/chrome/browser/ui/webui/options/chromeos/user_image_source.cc b/chrome/browser/ui/webui/options/chromeos/user_image_source.cc index 46572be..36ffb10 100644 --- a/chrome/browser/ui/webui/options/chromeos/user_image_source.cc +++ b/chrome/browser/ui/webui/options/chromeos/user_image_source.cc
@@ -21,14 +21,24 @@ namespace { // Parses the user image URL, which looks like -// "chrome://userimage/user@host?key1=value1&...&key_n=value_n", +// "chrome://userimage/serialized-user-id?key1=value1&...&key_n=value_n", // to user email. void ParseRequest(const GURL& url, std::string* email) { DCHECK(url.is_valid()); - *email = net::UnescapeURLComponent(url.path().substr(1), - (net::UnescapeRule::URL_SPECIAL_CHARS | - net::UnescapeRule::SPACES)); + const std::string serialized_account_id = net::UnescapeURLComponent( + url.path().substr(1), + (net::UnescapeRule::URL_SPECIAL_CHARS | net::UnescapeRule::SPACES)); + AccountId account_id(EmptyAccountId()); + const bool status = + AccountId::Deserialize(serialized_account_id, &account_id); + // TODO(alemate): DCHECK(status) - should happen after options page is + // migrated. + if (!status) { + LOG(WARNING) << "Failed to deserialize '" << serialized_account_id << "'"; + account_id = AccountId::FromUserEmail(serialized_account_id); + } + *email = account_id.GetUserEmail(); } } // namespace
diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi index 2ed0784..37250f2f 100644 --- a/chrome/chrome_browser_chromeos.gypi +++ b/chrome/chrome_browser_chromeos.gypi
@@ -992,8 +992,6 @@ 'browser/chromeos/ui/focus_ring_layer.h', 'browser/chromeos/ui/idle_app_name_notification_view.cc', 'browser/chromeos/ui/idle_app_name_notification_view.h', - 'browser/chromeos/ui/inline_login_dialog.cc', - 'browser/chromeos/ui/inline_login_dialog.h', 'browser/chromeos/ui/kiosk_external_update_notification.cc', 'browser/chromeos/ui/kiosk_external_update_notification.h', 'browser/chromeos/ui/mobile_config_ui.cc',
diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi index a901ea1f..0f232530 100644 --- a/chrome/chrome_browser_extensions.gypi +++ b/chrome/chrome_browser_extensions.gypi
@@ -64,6 +64,7 @@ 'browser/extensions/api/messaging/native_message_process_host.h', 'browser/extensions/api/messaging/native_process_launcher.cc', 'browser/extensions/api/messaging/native_process_launcher.h', + 'browser/extensions/api/messaging/native_process_launcher_android.cc', 'browser/extensions/api/messaging/native_process_launcher_posix.cc', 'browser/extensions/api/messaging/native_process_launcher_win.cc', ],
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index 3fca748..85f7522 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi
@@ -630,6 +630,7 @@ 'browser/ui/ash/multi_user/multi_user_context_menu.h', 'browser/ui/ash/session_state_delegate_views.cc', 'browser/ui/ash/session_state_delegate_views.h', + 'browser/ui/views/chrome_views_delegate_ash.cc', ], # Ash + Views. 'chrome_browser_ui_ash_views_sources': [ @@ -691,7 +692,6 @@ 'chrome_browser_ui_aura_non_chromeos': [ 'browser/ui/aura/active_desktop_monitor.cc', 'browser/ui/aura/active_desktop_monitor.h', - 'browser/ui/views/chrome_views_delegate_aura.cc', 'browser/ui/views/frame/desktop_browser_frame_aura.cc', 'browser/ui/views/frame/desktop_browser_frame_aura.h', 'browser/ui/views/message_center/message_center_frame_view.cc',
diff --git a/chrome/chrome_debugger.gypi b/chrome/chrome_debugger.gypi index 50f17ab..31991c6d 100644 --- a/chrome/chrome_debugger.gypi +++ b/chrome/chrome_debugger.gypi
@@ -65,6 +65,8 @@ 'browser/devtools/chrome_devtools_discovery_provider.h', 'browser/devtools/device/adb/adb_client_socket.cc', 'browser/devtools/device/adb/adb_client_socket.h', + 'browser/devtools/device/cast_device_provider.cc', + 'browser/devtools/device/cast_device_provider.h', 'browser/devtools/device/adb/adb_device_provider.cc', 'browser/devtools/device/adb/adb_device_provider.h', 'browser/devtools/device/android_device_info_query.cc',
diff --git a/chrome/chrome_installer.gypi b/chrome/chrome_installer.gypi index 4f323290..6cc5178 100644 --- a/chrome/chrome_installer.gypi +++ b/chrome/chrome_installer.gypi
@@ -309,6 +309,11 @@ }, }, }], + ['win_use_allocator_shim==1', { + 'dependencies': [ + '<(allocator_target)', + ], + }], ], }, { @@ -360,6 +365,7 @@ 'installer/setup/install_worker.cc', # Move to lib 'installer/setup/install_worker.h', # Move to lib 'installer/setup/install_worker_unittest.cc', + 'installer/setup/memory_unittest.cc', 'installer/setup/run_all_unittests.cc', 'installer/setup/setup_constants.cc', # Move to lib 'installer/setup/setup_constants.h', # Move to lib @@ -370,6 +376,13 @@ 'installer/setup/update_active_setup_version_work_item.h', # Move to lib 'installer/setup/update_active_setup_version_work_item_unittest.cc', ], + 'conditions': [ + ['win_use_allocator_shim==1', { + 'dependencies': [ + '<(allocator_target)', + ], + }], + ], # TODO(jschuh): crbug.com/167187 fix size_t to int truncations. 'msvs_disabled_warnings': [ 4267, ], },
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index a95e9c8c..6dd0806b 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi
@@ -991,6 +991,8 @@ 'test/data/webui/print_preview.js', 'test/data/webui/sandboxstatus_browsertest.js', 'test/data/webui/settings/cr_settings_browsertest.js', + 'test/data/webui/settings/main_page_browsertest.js', + 'test/data/webui/settings/settings_page_browsertest.js', ], # TODO(rockot) bug 505926: These should be moved to a target in # //extensions but have old dependencies on chrome files. The chrome
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index 7f9f754..887c7847 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi
@@ -87,6 +87,7 @@ 'browser/custom_handlers/protocol_handler_registry_unittest.cc', 'browser/data_usage/tab_id_annotator_unittest.cc', 'browser/data_usage/tab_id_provider_unittest.cc', + 'browser/devtools/device/cast_device_provider_unittest.cc', 'browser/devtools/device/webrtc/devtools_bridge_instances_request_unittest.cc', 'browser/devtools/devtools_network_controller_unittest.cc', 'browser/download/all_download_item_notifier_unittest.cc', @@ -2674,6 +2675,7 @@ }], ['OS=="android" or OS=="ios"', { 'sources!': [ + 'browser/devtools/device/cast_device_provider_unittest.cc', 'browser/devtools/device/webrtc/devtools_bridge_instances_request_unittest.cc', 'browser/ui/bookmarks/bookmark_ui_utils_desktop_unittest.cc', 'browser/ui/sync/sync_promo_ui_unittest.cc',
diff --git a/chrome/installer/setup/BUILD.gn b/chrome/installer/setup/BUILD.gn index 5a80170..c078292 100644 --- a/chrome/installer/setup/BUILD.gn +++ b/chrome/installer/setup/BUILD.gn
@@ -22,6 +22,7 @@ deps = [ ":lib", + "//base/allocator", "//build/config/sanitizers:deps", "//components/crash/content/app", ] @@ -68,6 +69,7 @@ "archive_patch_helper_unittest.cc", "install_unittest.cc", "install_worker_unittest.cc", + "memory_unittest.cc", "run_all_unittests.cc", "setup_util_unittest.cc", "setup_util_unittest.h", @@ -78,6 +80,7 @@ ":lib", "//base", "//base:i18n", + "//base/allocator", "//base/test:test_support", "//chrome/installer/mini_installer:unit_tests", "//chrome/installer/util:strings",
diff --git a/chrome/installer/setup/memory_unittest.cc b/chrome/installer/setup/memory_unittest.cc new file mode 100644 index 0000000..35cc5e2 --- /dev/null +++ b/chrome/installer/setup/memory_unittest.cc
@@ -0,0 +1,34 @@ +// Copyright 2015 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 <cstddef> +#include <limits> + +#include "base/process/memory.h" +#include "testing/gtest/include/gtest/gtest.h" + +#if defined(ALLOCATOR_SHIM) +// Test that the allocator shim is in-place so that base::UncheckedMalloc works. +TEST(OutOfMemoryHandledTest, UncheckedMalloc) { + // Enable termination on OOM - just as setup.exe does at early initialization + // - and test that UncheckedMalloc properly by-passes this in order to allow + // the caller to handle OOM. + base::EnableTerminationOnOutOfMemory(); + + const size_t kSafeMallocSize = 512; + + void* value = nullptr; + EXPECT_TRUE(base::UncheckedMalloc(kSafeMallocSize, &value)); + EXPECT_NE(nullptr, value); + free(value); + + // Make test size as large as possible minus a few pages so that alignment or + // other rounding doesn't make it wrap. + const size_t kUnsafeMallocSize( + std::numeric_limits<std::size_t>::max() - 12 * 1024); + + EXPECT_FALSE(base::UncheckedMalloc(kUnsafeMallocSize, &value)); + EXPECT_EQ(nullptr, value); +} +#endif // ALLOCATOR_SHIM
diff --git a/chrome/installer/util/module_util_win.cc b/chrome/installer/util/module_util_win.cc index c5892636..a6c81d6 100644 --- a/chrome/installer/util/module_util_win.cc +++ b/chrome/installer/util/module_util_win.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <windows.h> - #include "chrome/installer/util/module_util_win.h" +#include "base/base_paths.h" #include "base/file_version_info.h" #include "base/files/file.h" #include "base/logging.h" #include "base/memory/scoped_ptr.h" +#include "base/path_service.h" #include "base/strings/utf_string_conversions.h" #include "base/version.h" @@ -17,24 +17,14 @@ namespace { -// Returns the directory in which the currently running executable resides. -base::FilePath GetExecutableDir() { - base::char16 path[MAX_PATH]; - ::GetModuleFileNameW(nullptr, path, MAX_PATH); - return base::FilePath(path).DirName(); -} - -// Returns the version in the current module's version resource or the empty -// string if none found. -base::string16 GetCurrentModuleVersion() { +// Returns the version in the current executable's version resource. +base::string16 GetCurrentExecutableVersion() { scoped_ptr<FileVersionInfo> file_version_info( CREATE_FILE_VERSION_INFO_FOR_CURRENT_MODULE()); - if (file_version_info.get()) { - base::string16 version_string(file_version_info->file_version()); - if (Version(base::UTF16ToASCII(version_string)).IsValid()) - return version_string; - } - return base::string16(); + DCHECK(file_version_info.get()); + base::string16 version_string(file_version_info->file_version()); + DCHECK(base::Version(base::UTF16ToASCII(version_string)).IsValid()); + return version_string; } // Indicates whether a file can be opened using the same flags that @@ -50,18 +40,24 @@ base::string16* version) { DCHECK(version); - base::FilePath module_dir = GetExecutableDir(); - base::FilePath module = module_dir.Append(module_name); - if (ModuleCanBeRead(module)) - return module; + base::FilePath exe_dir; + const bool has_path = base::PathService::Get(base::DIR_EXE, &exe_dir); + DCHECK(has_path); - base::string16 version_string(GetCurrentModuleVersion()); - if (version_string.empty()) { - LOG(ERROR) << "No valid Chrome version found"; - return base::FilePath(); - } - *version = version_string; - return module_dir.Append(version_string).Append(module_name); + // Look for the module in the current executable's directory and return the + // path if it can be read. This is the expected location of modules for dev + // builds. + const base::FilePath module_path = exe_dir.Append(module_name); + if (ModuleCanBeRead(module_path)) + return module_path; + + // Othwerwise, return the path to the module in a versioned sub-directory of + // the current executable's directory. This is the expected location of + // modules for proper installs. + *version = GetCurrentExecutableVersion(); + DCHECK(!version->empty()); + + return exe_dir.Append(*version).Append(module_name); } } // namespace installer
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index de5bd57..e043aa1 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2042,6 +2042,7 @@ } if (is_android || is_ios) { sources -= [ + "../browser/devtools/device/cast_device_provider_unittest.cc", "../browser/devtools/device/webrtc/devtools_bridge_instances_request_unittest.cc", "../browser/ui/bookmarks/bookmark_ui_utils_desktop_unittest.cc", "../browser/ui/sync/sync_promo_ui_unittest.cc",
diff --git a/chrome/test/base/in_process_browser_test.cc b/chrome/test/base/in_process_browser_test.cc index 8ddb920..71e7899 100644 --- a/chrome/test/base/in_process_browser_test.cc +++ b/chrome/test/base/in_process_browser_test.cc
@@ -537,7 +537,7 @@ #endif void InProcessBrowserTest::RunTestOnMainThreadLoop() { - AfterStartupTaskUtils::SetBrowserStartupIsComplete(); + AfterStartupTaskUtils::SetBrowserStartupIsCompleteForTesting(); // Pump startup related events. content::RunAllPendingInMessageLoop();
diff --git a/chrome/test/data/extensions/api_test/service_worker/sync/manifest.json b/chrome/test/data/extensions/api_test/service_worker/sync/manifest.json new file mode 100644 index 0000000..2672ac0 --- /dev/null +++ b/chrome/test/data/extensions/api_test/service_worker/sync/manifest.json
@@ -0,0 +1,6 @@ +{ + "name": "Service worker - sync test", + "description": "Tests ServiceWorkerRegistration.sync.register() from an extension", + "version": "1", + "manifest_version": 2 +}
diff --git a/chrome/test/data/extensions/api_test/service_worker/sync/page.html b/chrome/test/data/extensions/api_test/service_worker/sync/page.html new file mode 100644 index 0000000..f6e2de85 --- /dev/null +++ b/chrome/test/data/extensions/api_test/service_worker/sync/page.html
@@ -0,0 +1 @@ +<script src="page.js"></script>
diff --git a/chrome/test/data/extensions/api_test/service_worker/sync/page.js b/chrome/test/data/extensions/api_test/service_worker/sync/page.js new file mode 100644 index 0000000..9bac72b --- /dev/null +++ b/chrome/test/data/extensions/api_test/service_worker/sync/page.js
@@ -0,0 +1,37 @@ +// Copyright 2015 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. + +var registerSyncOnServiceWorker = new Promise(function(resolve, reject) { + var serviceWorker; + navigator.serviceWorker.register('sw.js').then(function() { + // Wait until the service worker is active. + return navigator.serviceWorker.ready; + }).then(function(registration) { + serviceWorker = registration.active; + return registration.sync.register('send-chats'); + }).then(function() { + resolve(serviceWorker); + }).catch(function(err) { + reject(err); + }); +}); + +window.runServiceWorker = function() { + registerSyncOnServiceWorker.then(function(serviceWorker) { + var mc = new MessageChannel(); + // Called when ServiceWorker.onsync fires. + mc.port1.onmessage = function(e) { + if (e.data != 'SYNC: send-chats') { + console.log('SW returned incorrect data: ' + e.data); + chrome.test.sendMessage('FAIL'); // Fails the test fast. + return; + } + chrome.test.sendMessage(e.data); + }; + serviceWorker.postMessage('connect', [mc.port2]); + window.domAutomationController.send('SERVICE_WORKER_READY'); + }).catch(function(err) { + window.domAutomationController.send(err); + }); +};
diff --git a/chrome/test/data/extensions/api_test/service_worker/sync/sw.js b/chrome/test/data/extensions/api_test/service_worker/sync/sw.js new file mode 100644 index 0000000..fc0f26a --- /dev/null +++ b/chrome/test/data/extensions/api_test/service_worker/sync/sw.js
@@ -0,0 +1,24 @@ +// Copyright 2015 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. + +var port = null; +this.onsync = function(e) { + if (port) { + e.waitUntil(new Promise(function(resolve) { + // Add a small delay to respond so we can exercise and test the + // offline->online transition. + // NOTE: the following setTimeout() is not a requirement for this test. It + // is here to just demonstrate that the test passes with a bit of + // asynchrony. + setTimeout(function() { + port.postMessage('SYNC: ' + e.tag); + resolve(); + }, 0); + })); + } +}; + +this.onmessage = function(e) { + port = e.ports[0]; +};
diff --git a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js index 6bc775d..8a6001d 100644 --- a/chrome/test/data/webui/extensions/cr_extensions_browsertest.js +++ b/chrome/test/data/webui/extensions/cr_extensions_browsertest.js
@@ -15,7 +15,8 @@ 'extension_settings_browsertest.h"'); /** - * Test fixture for Polymer Settings elements. + * Basic test fixture for the MD chrome://extensions page. Installs no + * extensions. * @constructor * @extends {PolymerTest} */ @@ -38,6 +39,7 @@ 'extension_item_test.js', 'extension_service_test.js', 'extension_sidebar_test.js', + 'extension_manager_test.js', '../mock_controller.js', '../../../../../ui/webui/resources/js/webui_resource_test.js', ]), @@ -46,6 +48,45 @@ typedefCppFixture: 'ExtensionSettingsUIBrowserTest', }; +/** + * Test fixture with one installed extension. + * @constructor + * @extends {CrExtensionsBrowserTest} + */ +function CrExtensionsBrowserTestWithInstalledExtension() {} + +CrExtensionsBrowserTestWithInstalledExtension.prototype = { + __proto__: CrExtensionsBrowserTest.prototype, + + /** @override */ + testGenPreamble: function() { + GEN(' InstallGoodExtension();'); + GEN(' SetAutoConfirmUninstall();'); + }, +}; + +/** + * Test fixture with multiple installed extensions of different types. + * @constructor + * @extends {CrExtensionsBrowserTest} + */ +function CrExtensionsBrowserTestWithMultipleExtensionTypesInstalled() {} + +CrExtensionsBrowserTestWithMultipleExtensionTypesInstalled.prototype = { + __proto__: CrExtensionsBrowserTest.prototype, + + /** @override */ + testGenPreamble: function() { + GEN(' InstallGoodExtension();'); + GEN(' InstallPackagedApp();'); + GEN(' InstallHostedApp();'); + GEN(' InstallPlatformApp();'); + }, +}; + +//////////////////////////////////////////////////////////////////////////////// +// Extension Sidebar Tests + TEST_F('CrExtensionsBrowserTest', 'ExtensionSidebarLayoutTest', function() { extension_sidebar_tests.registerTests(); mocha.grep(assert(extension_sidebar_tests.TestNames.Layout)).run(); @@ -56,7 +97,8 @@ mocha.grep(assert(extension_sidebar_tests.TestNames.ClickHandlers)).run(); }); -function CrExtensionsBrowserTestWithInstalledExtension() {} +//////////////////////////////////////////////////////////////////////////////// +// Extension Item Tests TEST_F('CrExtensionsBrowserTest', 'ExtensionItemNormalStateTest', function() { extension_item_tests.registerTests(); @@ -84,15 +126,8 @@ mocha.grep(assert(TestNames.ClickableItems)).run(); }); -CrExtensionsBrowserTestWithInstalledExtension.prototype = { - __proto__: CrExtensionsBrowserTest.prototype, - - /** @override */ - testGenPreamble: function() { - GEN(' InstallGoodExtension();'); - GEN(' SetAutoConfirmUninstall();'); - }, -}; +//////////////////////////////////////////////////////////////////////////////// +// Extension Service Tests TEST_F('CrExtensionsBrowserTestWithInstalledExtension', 'ExtensionServiceToggleEnableTest', function() { @@ -116,27 +151,16 @@ mocha.grep(assert(extension_service_tests.TestNames.ProfileSettings)).run(); }); -function CrExtensionsBrowserTestWithMultipleExtensionTypesInstalled() {} - -CrExtensionsBrowserTestWithMultipleExtensionTypesInstalled.prototype = { - __proto__: CrExtensionsBrowserTest.prototype, - - /** @override */ - testGenPreamble: function() { - GEN(' InstallGoodExtension();'); - GEN(' InstallPackagedApp();'); - GEN(' InstallHostedApp();'); - GEN(' InstallPlatformApp();'); - }, - - /** @override */ - extraLibraries: CrExtensionsBrowserTest.prototype.extraLibraries.concat([ - 'extension_manager_test.js', - ]), -}; +//////////////////////////////////////////////////////////////////////////////// +// Extension Manager Tests TEST_F('CrExtensionsBrowserTestWithMultipleExtensionTypesInstalled', 'ExtensionManagerSplitSectionsTest', function() { extension_manager_tests.registerTests(); mocha.grep(assert(extension_manager_tests.TestNames.SplitSections)).run(); }); + +TEST_F('CrExtensionsBrowserTest', 'ExtensionManagerItemOrderTest', function() { + extension_manager_tests.registerTests(); + mocha.grep(assert(extension_manager_tests.TestNames.ItemOrder)).run(); +});
diff --git a/chrome/test/data/webui/extensions/extension_item_test.js b/chrome/test/data/webui/extensions/extension_item_test.js index b837ad7..2226972 100644 --- a/chrome/test/data/webui/extensions/extension_item_test.js +++ b/chrome/test/data/webui/extensions/extension_item_test.js
@@ -34,27 +34,11 @@ inspectItemView: function(id, view) {}, }; - /** @type {string} The mock extension's id. */ - var id = 'a'.repeat(32); - - /** @type {string} The mock extension's base URL. */ - var baseUrl = 'chrome-extension://' + id + '/'; - /** * The data used to populate the extension item. - * @type {ExtensionInfo} + * @type {chrome.developerPrivate.ExtensionInfo} */ - var extensionData = { - description: 'This is an extension', - iconUrl: 'chrome://extension-icon/' + id + '/24/0', - id: id, - incognitoAccess: {isEnabled: true, isActive: false}, - name: 'Wonderful Extension', - state: 'ENABLED', - type: 'EXTENSION', - version: '2.0', - views: [{url: baseUrl + 'foo.html'}, {url: baseUrl + 'bar.html'}], - }; + var extensionData = extension_test_util.createExtensionInfo(); // The normal elements, which should always be shown. var normalElements = [
diff --git a/chrome/test/data/webui/extensions/extension_manager_test.js b/chrome/test/data/webui/extensions/extension_manager_test.js index db452e3f..aadf325d 100644 --- a/chrome/test/data/webui/extensions/extension_manager_test.js +++ b/chrome/test/data/webui/extensions/extension_manager_test.js
@@ -7,6 +7,7 @@ /** @enum {string} */ var TestNames = { SplitSections: 'split sections', + ItemOrder: 'item order', }; function registerTests() { @@ -64,6 +65,58 @@ testVisible(selector, true) expectTrue(!!manager.$$('#websites-list').querySelector(selector)); }); + + test(assert(TestNames.ItemOrder), function() { + var extensionsSection = manager.$['extensions-list']; + var service = extensions.Service.getInstance(); + expectEquals(0, extensionsSection.children.length); + + var alphaFromStore = extension_test_util.createExtensionInfo( + {location: 'FROM_STORE', name: 'Alpha', id: 'a'.repeat(32)}); + manager.addItem(alphaFromStore, service); + + expectEquals(1, extensionsSection.children.length); + expectEquals(alphaFromStore.id, extensionsSection.children[0].id); + + // Unpacked extensions come first. + var betaUnpacked = extension_test_util.createExtensionInfo( + {location: 'UNPACKED', name: 'Beta', id: 'b'.repeat(32)}); + manager.addItem(betaUnpacked, service); + + expectEquals(2, extensionsSection.children.length); + expectEquals(betaUnpacked.id, extensionsSection.children[0].id); + expectEquals(alphaFromStore.id, extensionsSection.children[1].id); + + // Extensions from the same location are sorted by name. + var gammaUnpacked = extension_test_util.createExtensionInfo( + {location: 'UNPACKED', name: 'Gamma', id: 'c'.repeat(32)}); + manager.addItem(gammaUnpacked, service); + + expectEquals(3, extensionsSection.children.length); + expectEquals(betaUnpacked.id, extensionsSection.children[0].id); + expectEquals(gammaUnpacked.id, extensionsSection.children[1].id); + expectEquals(alphaFromStore.id, extensionsSection.children[2].id); + + // The name-sort should be case-insensitive, and should fall back on + // id. + var aaFromStore = extension_test_util.createExtensionInfo( + {location: 'FROM_STORE', name: 'AA', id: 'd'.repeat(32)}); + var AaFromStore = extension_test_util.createExtensionInfo( + {location: 'FROM_STORE', name: 'Aa', id: 'e'.repeat(32)}); + var aAFromStore = extension_test_util.createExtensionInfo( + {location: 'FROM_STORE', name: 'aA', id: 'f'.repeat(32)}); + manager.addItem(aaFromStore, service); + manager.addItem(AaFromStore, service); + manager.addItem(aAFromStore, service); + + expectEquals(6, extensionsSection.children.length); + expectEquals(betaUnpacked.id, extensionsSection.children[0].id); + expectEquals(gammaUnpacked.id, extensionsSection.children[1].id); + expectEquals(aaFromStore.id, extensionsSection.children[2].id); + expectEquals(AaFromStore.id, extensionsSection.children[3].id); + expectEquals(aAFromStore.id, extensionsSection.children[4].id); + expectEquals(alphaFromStore.id, extensionsSection.children[5].id); + }); }); }
diff --git a/chrome/test/data/webui/extensions/extension_test_util.js b/chrome/test/data/webui/extensions/extension_test_util.js index ccea8dfe..72d845a 100644 --- a/chrome/test/data/webui/extensions/extension_test_util.js +++ b/chrome/test/data/webui/extensions/extension_test_util.js
@@ -46,8 +46,33 @@ expectEquals(opt_expected, element.textContent, selector); } + /** + * Creates an ExtensionInfo object. + * @param {Object=} opt_properties A set of properties that will be used on + * the resulting ExtensionInfo (otherwise defaults will be used). + * @return {chrome.developerPrivate.ExtensionInfo} + */ + function createExtensionInfo(opt_properties) { + var id = opt_properties && opt_properties.hasOwnProperty('id') ? + opt_properties[id] : 'a'.repeat(32); + var baseUrl = 'chrome-extension://' + id + '/'; + return Object.assign({ + description: 'This is an extension', + iconUrl: 'chrome://extension-icon/' + id + '/24/0', + id: id, + incognitoAccess: {isEnabled: true, isActive: false}, + location: 'FROM_STORE', + name: 'Wonderful Extension', + state: 'ENABLED', + type: 'EXTENSION', + version: '2.0', + views: [{url: baseUrl + 'foo.html'}, {url: baseUrl + 'bar.html'}], + }, opt_properties); + } + return { ClickMock: ClickMock, testVisible: testVisible, + createExtensionInfo: createExtensionInfo, }; });
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js index 848814c..557ab9d 100644 --- a/chrome/test/data/webui/settings/cr_settings_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -29,6 +29,7 @@ /** @override */ extraLibraries: PolymerTest.getLibraries(ROOT_PATH).concat([ 'checkbox_tests.js', + 'dropdown_menu_tests.js', 'pref_util_tests.js', 'prefs_test_cases.js', 'prefs_tests.js', @@ -49,6 +50,7 @@ TEST_F('CrSettingsBrowserTest', 'MAYBE_CrSettingsTest', function() { // Register mocha tests for each element. settings_checkbox.registerTests(); + settings_dropdown_menu.registerTests(); settings_prefUtil.registerTests(); settings_prefs.registerTests();
diff --git a/chrome/test/data/webui/settings/dropdown_menu_tests.js b/chrome/test/data/webui/settings/dropdown_menu_tests.js new file mode 100644 index 0000000..5dbdbf9 --- /dev/null +++ b/chrome/test/data/webui/settings/dropdown_menu_tests.js
@@ -0,0 +1,101 @@ +// Copyright 2015 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. + +/** @fileoverview Suite of tests for settings-dropdown-menu. */ +cr.define('settings_dropdown_menu', function() { + function registerTests() { + suite('SettingsDropdownMenu', function() { + // Import settings_dropdown_menu.html before running suite. + suiteSetup(function() { + return Promise.all([ + PolymerTest.importHtml('chrome://md-settings/i18n_setup.html'), + PolymerTest.importHtml( + 'chrome://md-settings/controls/settings_dropdown_menu.html'), + ]); + }); + + /** @type {SettingsDropdownMenu} */ + var dropdown; + + /** + * The IronSelectable (paper-menu) used internally by the dropdown menu. + * @type {Polymer.IronSelectableBehavior} + */ + var selectable; + + setup(function() { + PolymerTest.clearBody(); + dropdown = document.createElement('settings-dropdown-menu'); + selectable = dropdown.$$('paper-menu'); + document.body.appendChild(dropdown); + }); + + test('with number options', function testNumberOptions() { + dropdown.pref = { + key: 'test.number', + type: chrome.settingsPrivate.PrefType.NUMBER, + value: 100, + }; + dropdown.menuOptions = [[100, 'Option 100'], [200, 'Option 200'], + [300, 'Option 300'], [400, 'Option 400']]; + + // IronSelectable uses a DOM observer, which uses a debouncer. + Polymer.dom.flush(); + + // Initially selected item. + assertEquals('Option 100', selectable.selectedItem.textContent.trim()); + + // Selecting an item updates the pref. + selectable.selected = '200'; + assertEquals(200, dropdown.pref.value); + + // Updating the pref selects an item. + dropdown.set('pref.value', 400); + assertEquals('400', selectable.selected); + }); + + test('with string options', function testStringOptions() { + dropdown.pref = { + key: 'test.string', + type: chrome.settingsPrivate.PrefType.STRING, + value: 'c', + }; + dropdown.menuOptions = + [['a', 'AAA'], ['b', 'BBB'], ['c', 'CCC'], ['d', 'DDD']]; + Polymer.dom.flush(); + + // Initially selected item. + assertEquals('CCC', selectable.selectedItem.textContent.trim()); + + // Selecting an item updates the pref. + selectable.selected = 'a'; + assertEquals('a', dropdown.pref.value); + + // Updating the pref selects an item. + dropdown.set('pref.value', 'b'); + assertEquals('b', selectable.selected); + }); + + test('with custom value', function testCustomValue() { + dropdown.pref = { + key: 'test.string', + type: chrome.settingsPrivate.PrefType.STRING, + value: 'f', + }; + dropdown.menuOptions = + [['a', 'AAA'], ['b', 'BBB'], ['c', 'CCC'], ['d', 'DDD']]; + Polymer.dom.flush(); + + // "Custom" initially selected. + assertEquals(dropdown.notFoundValue_, selectable.selected); + // Pref should not have changed. + assertEquals('f', dropdown.pref.value); + }); + }); + } + + return { + registerTests: registerTests, + }; +});
diff --git a/chrome/test/data/webui/settings/main_page_browsertest.js b/chrome/test/data/webui/settings/main_page_browsertest.js new file mode 100644 index 0000000..1a8672c --- /dev/null +++ b/chrome/test/data/webui/settings/main_page_browsertest.js
@@ -0,0 +1,63 @@ +// Copyright 2015 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. + +/** @fileoverview Suite of tests for the Settings main page. */ + +GEN_INCLUDE(['settings_page_browsertest.js']); + +/** + * @constructor + * @extends {SettingsPageBrowserTest} +*/ +function SettingsMainPageBrowserTest() {} + +SettingsMainPageBrowserTest.prototype = { + __proto__: SettingsPageBrowserTest.prototype +}; + +TEST_F('SettingsMainPageBrowserTest', 'Main', function() { + // Assign |self| to |this| instead of binding since 'this' in suite() + // and test() will be a Mocha 'Suite' or 'Test' instance. + var self = this; + + // Register mocha tests. + suite('SettingsPage', function() { + test('load page', function() { + // This will fail if there are any asserts or errors in the Settings page. + }); + + test('basic pages', function() { + var page = self.getPage('basic'); + expectTrue(!!self.getSection(page, 'appearance')); + expectTrue(!!self.getSection(page, 'on-startup')); + expectTrue(!!self.getSection(page, 'search')); + if (!cr.isChromeOS) { + expectTrue(!!self.getSection(page, 'people')); + expectTrue(!!self.getSection(page, 'defaultBrowser')); + } else { + expectTrue(!!self.getSection(page, 'internet')); + expectTrue(!!self.getSection(page, 'users')); + } + }); + + test('advanced pages', function() { + var page = self.getPage('advanced'); + expectTrue(!!self.getSection(page, 'location')); + expectTrue(!!self.getSection(page, 'privacy')); + expectTrue(!!self.getSection(page, 'passwordsAndForms')); + expectTrue(!!self.getSection(page, 'languages')); + expectTrue(!!self.getSection(page, 'downloads')); + expectTrue(!!self.getSection(page, 'reset')); + + if (cr.isChromeOS) { + expectTrue(!!self.getSection(page, 'dateTime')); + expectTrue(!!self.getSection(page, 'bluetooth')); + expectTrue(!!self.getSection(page, 'a11y')); + } + }); + }); + + // Run all registered tests. + mocha.run(); +});
diff --git a/chrome/test/data/webui/settings/settings_page_browsertest.js b/chrome/test/data/webui/settings/settings_page_browsertest.js new file mode 100644 index 0000000..2b8e53d2 --- /dev/null +++ b/chrome/test/data/webui/settings/settings_page_browsertest.js
@@ -0,0 +1,69 @@ +// Copyright 2015 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. + +/** @fileoverview Prototype for Settings page tests. */ + +/** @const {string} Path to root from chrome/test/data/webui/settings/. */ +var ROOT_PATH = '../../../../../'; + +// Polymer BrowserTest fixture. +GEN_INCLUDE( + [ROOT_PATH + 'chrome/test/data/webui/polymer_browser_test_base.js']); + +/** + * @constructor + * @extends {PolymerTest} +*/ +function SettingsPageBrowserTest() {} + +SettingsPageBrowserTest.prototype = { + __proto__: PolymerTest.prototype, + + /** @override */ + browsePreload: 'chrome://md-settings/', + + /** @override */ + extraLibraries: PolymerTest.getLibraries(ROOT_PATH), + + /** @override */ + runAccessibilityChecks: false, + + /** + * @param {string} type The settings page type, e.g. 'advanced' or 'basic'. + * @return {Node} The DOM node for the page. + */ + getPage: function(type) { + var settings = document.querySelector('cr-settings'); + assertTrue(!!settings); + var settingsUi = settings.shadowRoot.querySelector('settings-ui'); + assertTrue(!!settingsUi); + var settingsMain = settingsUi.shadowRoot.querySelector('settings-main'); + assertTrue(!!settingsMain); + var pages = settingsMain.$.pageContainer; + assertTrue(!!pages); + var pageType = 'settings-' + type + '-page'; + var page = pages.querySelector(pageType); + assertTrue(!!page); + return page; + }, + + /** + * @param {Node} page The DOM node for the settings page containing |section|. + * @param {string} section The settings page section, e.g. 'appearance'. + * @return {Node} The DOM node for the section. + */ + getSection: function(page, section) { + var sections = page.shadowRoot.querySelectorAll('settings-section'); + assertTrue(!!sections); + var len = sections.length; + assertGT(len, 0); + for (var i = 0; i < len; ++i) { + var s = sections[i]; + if (s.section == section) + return s; + } + assertNotReached('Section not found: ' + section + ' in ' + page); + return undefined; + }, +};
diff --git a/chrome/test/ppapi/ppapi_browsertest.cc b/chrome/test/ppapi/ppapi_browsertest.cc index 6ac6040..6743d1b 100644 --- a/chrome/test/ppapi/ppapi_browsertest.cc +++ b/chrome/test/ppapi/ppapi_browsertest.cc
@@ -945,6 +945,8 @@ RUN_AUDIO_CONFIG_SUBTESTS; } +TEST_PPAPI_NACL(AudioEncoder) + // PPB_Audio tests. #define RUN_AUDIO_SUBTESTS \ RunTestViaHTTP( \
diff --git a/chromeos/network/auto_connect_handler.cc b/chromeos/network/auto_connect_handler.cc index 4665cfe..b444789 100644 --- a/chromeos/network/auto_connect_handler.cc +++ b/chromeos/network/auto_connect_handler.cc
@@ -214,8 +214,12 @@ global_network_config->GetBooleanWithoutPathExpansion( ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect, &only_policy_autoconnect); + bool only_policy_connect = false; + global_network_config->GetBooleanWithoutPathExpansion( + ::onc::global_network_config::kAllowOnlyPolicyNetworksToConnect, + &only_policy_connect); - if (only_policy_autoconnect) + if (only_policy_autoconnect || only_policy_connect) DisconnectFromUnmanagedSharedWiFiNetworks(); }
diff --git a/chromeos/network/auto_connect_handler_unittest.cc b/chromeos/network/auto_connect_handler_unittest.cc index 0181a74..4f7edb6f 100644 --- a/chromeos/network/auto_connect_handler_unittest.cc +++ b/chromeos/network/auto_connect_handler_unittest.cc
@@ -418,6 +418,37 @@ EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); } +TEST_F(AutoConnectHandlerTest, + DisconnectOnPolicyLoadingAllowOnlyPolicyNetworksToConnect) { + EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected)); + EXPECT_TRUE(Configure(kConfigManagedSharedConnectable)); + + // User login and certificate loading shouldn't trigger any change until the + // policy is loaded. + LoginToRegularUser(); + StartCertLoader(); + EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); + EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + + base::DictionaryValue global_config; + global_config.SetBooleanWithoutPathExpansion( + ::onc::global_network_config::kAllowOnlyPolicyNetworksToConnect, true); + + // Applying the policy which restricts autoconnect should disconnect from the + // shared, unmanaged network. + // Because no best service is set, the fake implementation of + // ConnectToBestServices will be a no-op. + SetupPolicy(kPolicy, global_config, false /* load as device policy */); + + // Should not trigger any change until user policy is loaded + EXPECT_EQ(shill::kStateOnline, GetServiceState("wifi0")); + EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); + + SetupPolicy(std::string(), base::DictionaryValue(), true); + EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi0")); + EXPECT_EQ(shill::kStateIdle, GetServiceState("wifi1")); +} + // After login a reconnect is triggered even if there is no managed network. TEST_F(AutoConnectHandlerTest, ReconnectAfterLogin) { EXPECT_TRUE(Configure(kConfigUnmanagedSharedConnected));
diff --git a/chromeos/network/network_connection_handler.cc b/chromeos/network/network_connection_handler.cc index e8c4939..47c1f6b 100644 --- a/chromeos/network/network_connection_handler.cc +++ b/chromeos/network/network_connection_handler.cc
@@ -115,6 +115,8 @@ "connect-canceled"; const char NetworkConnectionHandler::kErrorCertLoadTimeout[] = "cert-load-timeout"; +const char NetworkConnectionHandler::kErrorUnmanagedNetwork[] = + "unmanaged-network"; struct NetworkConnectionHandler::ConnectRequest { ConnectRequest(const std::string& service_path, @@ -285,6 +287,11 @@ // Connect immediately to 'connectable' networks. // TODO(stevenjb): Shill needs to properly set Connectable for VPN. if (network && network->connectable() && network->type() != shill::kTypeVPN) { + if (IsNetworkProhibitedByPolicy(network->guid(), network->profile_path())) { + ErrorCallbackForPendingRequest(service_path, kErrorUnmanagedNetwork); + return; + } + CallShillConnect(service_path); return; } @@ -416,6 +423,11 @@ const base::DictionaryValue* user_policy = managed_configuration_handler_->FindPolicyByGuidAndProfile(guid, profile); + if (IsNetworkProhibitedByPolicy(guid, profile)) { + ErrorCallbackForPendingRequest(service_path, kErrorUnmanagedNetwork); + return; + } + client_cert::ClientCertConfig cert_config_from_policy; if (user_policy) client_cert::OncToClientCertConfig(*user_policy, &cert_config_from_policy); @@ -523,6 +535,27 @@ CallShillConnect(service_path); } +bool NetworkConnectionHandler::IsNetworkProhibitedByPolicy( + const std::string& guid, + const std::string& profile_path) { + if (!logged_in_) + return false; + const base::DictionaryValue* global_network_config = + managed_configuration_handler_->GetGlobalConfigFromPolicy( + std::string() /* no username hash, device policy */); + if (!global_network_config) + return false; + bool policy_prohibites = false; + if (!global_network_config->GetBooleanWithoutPathExpansion( + ::onc::global_network_config::kAllowOnlyPolicyNetworksToConnect, + &policy_prohibites) || + !policy_prohibites) { + return false; + } + return !managed_configuration_handler_->FindPolicyByGuidAndProfile( + guid, profile_path); +} + void NetworkConnectionHandler::QueueConnectRequest( const std::string& service_path) { ConnectRequest* request = GetPendingRequest(service_path);
diff --git a/chromeos/network/network_connection_handler.h b/chromeos/network/network_connection_handler.h index 8b4e93f..c36bb0f 100644 --- a/chromeos/network/network_connection_handler.h +++ b/chromeos/network/network_connection_handler.h
@@ -96,6 +96,9 @@ // Certificate load timed out. static const char kErrorCertLoadTimeout[]; + // Trying to configure an unmanged network but policy prohibits that + static const char kErrorUnmanagedNetwork[]; + ~NetworkConnectionHandler() override; void AddObserver(NetworkConnectionObserver* observer); @@ -167,6 +170,9 @@ const std::string& service_path, const base::DictionaryValue& properties); + bool IsNetworkProhibitedByPolicy(const std::string& guid, + const std::string& profile_path); + // Queues a connect request until certificates have loaded. void QueueConnectRequest(const std::string& service_path);
diff --git a/chromeos/network/network_connection_handler_unittest.cc b/chromeos/network/network_connection_handler_unittest.cc index 1ae00afb9..0c613bed 100644 --- a/chromeos/network/network_connection_handler_unittest.cc +++ b/chromeos/network/network_connection_handler_unittest.cc
@@ -333,6 +333,11 @@ "{ \"GUID\": \"wifi3\", \"Type\": \"wifi\", " " \"PassphraseRequired\": true }"; +const char* kPolicyWifi0 = + "[{ \"GUID\": \"wifi0\", \"IPAddressConfigType\": \"DHCP\", " + " \"Type\": \"WiFi\", \"Name\": \"My WiFi Network\"," + " \"WiFi\": { \"SSID\": \"wifi0\"}}]"; + } // namespace TEST_F(NetworkConnectionHandlerTest, NetworkConnectionHandlerConnectSuccess) { @@ -346,6 +351,23 @@ EXPECT_EQ(kSuccessResult, network_connection_observer_->GetResult(kWifi0)); } +TEST_F(NetworkConnectionHandlerTest, + NetworkConnectionHandlerConnectProhibited) { + EXPECT_TRUE(Configure(kConfigConnectable)); + base::DictionaryValue global_config; + global_config.SetBooleanWithoutPathExpansion( + ::onc::global_network_config::kAllowOnlyPolicyNetworksToConnect, true); + SetupPolicy("[]", global_config, false /* load as device policy */); + LoginToRegularUser(); + Connect(kWifi0); + EXPECT_EQ(NetworkConnectionHandler::kErrorUnmanagedNetwork, + GetResultAndReset()); + + SetupPolicy(kPolicyWifi0, global_config, false /* load as device policy */); + Connect(kWifi0); + EXPECT_EQ(kSuccessResult, GetResultAndReset()); +} + // Handles basic failure cases. TEST_F(NetworkConnectionHandlerTest, NetworkConnectionHandlerConnectFailure) { Connect(kNoNetwork);
diff --git a/components/BUILD.gn b/components/BUILD.gn index 505988d..b0b5bbd 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -30,16 +30,27 @@ "//components/chrome_apps", "//components/component_updater", "//components/compression", + "//components/content_settings/core/browser", + "//components/content_settings/core/common", + "//components/crash/core/browser", + "//components/crash/core/common", "//components/crx_file", "//components/data_reduction_proxy/core/browser", "//components/data_reduction_proxy/core/common", "//components/device_event_log", "//components/dom_distiller/core", + "//components/enhanced_bookmarks", + "//components/favicon/core", + "//components/favicon_base", + "//components/gcm_driver", "//components/google/core/browser", "//components/history/core/browser", "//components/history/core/common", "//components/history/core/test", "//components/keyed_service/core", + "//components/metrics", + "//components/net_log", + "//components/network_time", "//components/password_manager/core/browser", "//components/password_manager/core/common", "//components/password_manager/sync/browser", @@ -48,22 +59,36 @@ "//components/sessions", "//components/sync_bookmarks", "//components/undo", + "//components/update_client", "//components/strings", "//components/leveldb_proto", "//components/pref_registry", + "//components/rappor", + "//components/proxy_config", "//components/omnibox/browser", + "//components/open_from_clipboard", "//components/infobars/core", + "//components/invalidation/impl", + "//components/invalidation/public", "//components/signin/core/browser", + "//components/suggestions", + "//components/sync_driver", + "//components/syncable_prefs", "//components/translate/core/browser", "//components/translate/core/common", + "//components/upload_list", + "//components/variations", + "//components/variations/service", + "//components/version_info", "//components/version_ui", "//components/os_crypt", + "//components/web_resource", + "//components/webdata_services", ] if (!is_ios) { deps += [ "//components/bitmap_uploader", - "//components/enhanced_bookmarks", "//components/certificate_reporting", "//components/cdm/browser", "//components/about_handler", @@ -79,8 +104,6 @@ "//components/cloud_devices/common", "//components/chrome_apps", "//components/compression", - "//components/content_settings/core/browser", - "//components/content_settings/core/common", "//components/cookie_config", "//components/crash/content/app", "//components/crash/content/browser", @@ -91,20 +114,15 @@ "//components/devtools_discovery", "//components/devtools_http_handler", "//components/domain_reliability", - "//components/favicon/core", - "//components/favicon_base", "//components/feedback", - "//components/gcm_driver", "//components/gcm_driver/crypto", "//components/gcm_driver/instance_id", "//components/history/content/browser", - "//components/invalidation/impl", "//components/json_schema", "//components/keyed_service/content", "//components/language_usage_metrics", "//components/login", "//components/memory_pressure", - "//components/metrics", "//components/metrics_services_manager", "//components/mime_util", "//components/navigation_interception", @@ -112,10 +130,8 @@ "//components/network_hints/browser", "//components/network_hints/common", "//components/network_hints/renderer", - "//components/network_time", "//components/offline_pages", "//components/onc", - "//components/open_from_clipboard", "//components/packed_ct_ev_whitelist", "//components/pairing", "//components/password_manager/content/browser", @@ -126,9 +142,7 @@ "//components/power", "//components/precache/core", "//components/precache/content", - "//components/proxy_config", "//components/query_parser", - "//components/rappor", "//components/renderer_context_menu", "//components/resources:components_resources", "//components/safe_browsing_db", @@ -137,7 +151,6 @@ "//components/ssl_config", "//components/startup_metric_utils/common", "//components/startup_metric_utils/browser", - "//components/sync_driver", "//components/sync_sessions", "//components/tracing", "//components/tracing:startup_tracing", @@ -145,16 +158,11 @@ "//components/translate/content/common", "//components/translate/content/renderer", "//components/ui/zoom", - "//components/update_client", - "//components/upload_list", "//components/url_formatter", "//components/url_matcher", "//components/user_manager", "//components/user_prefs", "//components/user_prefs/tracked:user_prefs_tracked", - "//components/variations", - "//components/variations/service", - "//components/version_info", "//components/visitedlink/browser", "//components/visitedlink/common", "//components/visitedlink/renderer", @@ -163,7 +171,6 @@ "//components/web_cache/common", "//components/web_cache/renderer", "//components/web_modal", - "//components/web_resource", "//components/webcrypto", "//components/webdata/common", "//components/wifi", @@ -263,6 +270,7 @@ "//components/history/core/test", # Should work, needs checking. "//components/infobars/core", # Should work, needs checking. "//components/invalidation/impl", # Should work, needs checking. + "//components/invalidation/public", # Should work, needs checking. "//components/json_schema", # Should work, needs checking. "//components/keyed_service/core", # Blocked on content. "//components/keyed_service/content", # Blocked on content. @@ -291,6 +299,7 @@ "//components/visitedlink/renderer", # Blocked on blink "//components/web_cache/browser", # Blocked on content and blink. "//components/web_cache/renderer", # Blocked on content and blink. + "//components/webdata_services", # Should work, needs checking. "//components/web_modal", # Blocked on content. ] } @@ -336,41 +345,56 @@ "//components/bookmarks/browser:unit_tests", "//components/bookmarks/managed:unit_tests", "//components/compression:unit_tests", - "//components/content_settings/core/common", + "//components/content_settings/core/browser:unit_tests", + "//components/content_settings/core/common:unit_tests", "//components/data_usage/core:unit_tests", "//components/dom_distiller/core:unit_tests", + "//components/enhanced_bookmarks:unit_tests", + "//components/favicon/core:unit_tests", + "//components/favicon_base:unit_tests", + "//components/gcm_driver:unit_tests", "//components/google/core/browser:unit_tests", "//components/history/core/browser:unit_tests", "//components/history/core/common:unit_tests", + "//components/invalidation/impl:unit_tests", "//components/keyed_service/core:unit_tests", + "//components/metrics:unit_tests", "//components/net_log:unit_tests", + "//components/network_time:unit_tests", + "//components/open_from_clipboard:unit_tests", "//components/password_manager/core/browser:unit_tests", "//components/password_manager/core/common:unit_tests", "//components/password_manager/sync/browser:unit_tests", + "//components/proxy_config:unit_tests", + "//components/rappor:unit_tests", "//components/search:unit_tests", "//components/sessions:unit_tests", "//components/syncable_prefs:unit_tests", "//components/undo:unit_tests", + "//components/update_client:unit_tests", + "//components/upload_list:unit_tests", "//net", "//ui/base", "//ui/resources:ui_test_pak", "//components/search_engines:unit_tests", - "//components/undo:unit_tests", "//components/leveldb_proto:unit_tests", "//components/signin/core/browser:unit_tests", "//components/suggestions:unit_tests", + "//components/sync_driver:unit_tests", "//components/translate/core/browser:unit_tests", "//components/translate/core/common:unit_tests", "//components/translate/core/language_detection:unit_tests", + "//components/variations:unit_tests", + "//components/variations/service:unit_tests", "//components/omnibox/browser:unit_tests", "//components/os_crypt:unit_tests", + "//components/web_resource:unit_tests", ] if (!is_ios) { deps += [ "//components/certificate_transparency:unit_tests", "//components/data_use_measurement/content:unit_tests", - "//components/enhanced_bookmarks:unit_tests", "//components/error_page/renderer:unit_tests", "//components/guest_view/browser:unit_tests", "//components/navigation_interception:unit_tests", @@ -392,8 +416,6 @@ "//components/captive_portal:unit_tests", "//components/cloud_devices/common:unit_tests", "//components/component_updater:unit_tests", - "//components/content_settings/core/browser:unit_tests", - "//components/content_settings/core/common:unit_tests", "//components/crx_file:unit_tests", "//components/data_reduction_proxy/content/browser:unit_tests", "//components/data_reduction_proxy/core/browser:unit_tests", @@ -403,47 +425,32 @@ "//components/dom_distiller/content:unit_tests", "//components/domain_reliability:unit_tests", "//components/favicon/content:unit_tests", - "//components/favicon/core:unit_tests", - "//components/favicon_base:unit_tests", "//components/gcm_driver/crypto:unit_tests", "//components/gcm_driver/instance_id:unit_tests", - "//components/gcm_driver:unit_tests", "//components/history/content/browser:unit_tests", - "//components/invalidation/impl:unit_tests", "//components/json_schema:unit_tests", "//components/keyed_service/content:unit_tests", "//components/language_usage_metrics:unit_tests", "//components/login:unit_tests", "//components/memory_pressure:unit_tests", - "//components/metrics:unit_tests", "//components/mime_util:unit_tests", - "//components/network_time:unit_tests", "//components/offline_pages:unit_tests", - "//components/open_from_clipboard:unit_tests", "//components/packed_ct_ev_whitelist:unit_tests", "//components/password_manager/content/browser:unit_tests", "//components/precache/content:unit_tests", "//components/precache/core:unit_tests", - "//components/proxy_config:unit_tests", "//components/query_parser:unit_tests", - "//components/rappor:unit_tests", "//components/safe_browsing_db:unit_tests", "//components/search_engines:unit_tests", "//components/search:unit_tests", "//components/search_provider_logos:unit_tests", "//components/ssl_config:unit_tests", "//components/sync_bookmarks:unit_tests", - "//components/sync_driver:unit_tests", "//components/sync_sessions:unit_tests", "//components/url_formatter:unit_tests", "//components/url_matcher:unit_tests", - "//components/update_client:unit_tests", - "//components/upload_list:unit_tests", "//components/user_prefs/tracked:unit_tests", - "//components/variations:unit_tests", - "//components/variations/service:unit_tests", "//components/wallpaper:unit_tests", - "//components/web_resource:unit_tests", "//components/webcrypto:unit_tests", "//components/webdata/common:unit_tests",
diff --git a/components/arc/arc_bridge_service.cc b/components/arc/arc_bridge_service.cc index 34c215e..6565416 100644 --- a/components/arc/arc_bridge_service.cc +++ b/components/arc/arc_bridge_service.cc
@@ -125,7 +125,7 @@ bool ArcBridgeService::RegisterInputDevice(const std::string& name, const std::string& device_type, base::ScopedFD fd) { - DCHECK(ipc_task_runner_->RunsTasksOnCurrentThread()); + DCHECK(origin_task_runner_->RunsTasksOnCurrentThread()); if (state_ != State::READY) { LOG(ERROR) << "Called RegisterInputDevice when the service is not ready"; return false;
diff --git a/components/bitmap_uploader/bitmap_uploader.cc b/components/bitmap_uploader/bitmap_uploader.cc index f6525da..bfa8cd9 100644 --- a/components/bitmap_uploader/bitmap_uploader.cc +++ b/components/bitmap_uploader/bitmap_uploader.cc
@@ -29,6 +29,9 @@ } // namespace +const char kBitmapUploaderForAcceleratedWidget[] = + "__BITMAP_UPLOADER_ACCELERATED_WIDGET__"; + BitmapUploader::BitmapUploader(mus::Window* window) : window_(window), color_(g_transparent_color),
diff --git a/components/bitmap_uploader/bitmap_uploader.h b/components/bitmap_uploader/bitmap_uploader.h index ccb4d7a7..8ced8938 100644 --- a/components/bitmap_uploader/bitmap_uploader.h +++ b/components/bitmap_uploader/bitmap_uploader.h
@@ -20,6 +20,8 @@ namespace bitmap_uploader { +extern const char kBitmapUploaderForAcceleratedWidget[]; + // BitmapUploader is useful if you want to draw a bitmap or color in a // mus::Window. class BitmapUploader : public mus::mojom::SurfaceClient {
diff --git a/components/clipboard/BUILD.gn b/components/clipboard/BUILD.gn index fab02911..a15617b 100644 --- a/components/clipboard/BUILD.gn +++ b/components/clipboard/BUILD.gn
@@ -18,6 +18,7 @@ "//mojo/application/public/cpp", "//mojo/public/cpp/bindings", "//mojo/public/cpp/bindings:callback", + "//mojo/services/tracing/public/cpp", ] }
diff --git a/components/clipboard/DEPS b/components/clipboard/DEPS index 0ade4ce..8db7505 100644 --- a/components/clipboard/DEPS +++ b/components/clipboard/DEPS
@@ -2,5 +2,6 @@ "+mojo/application", "+mojo/common", "+mojo/public", + "+mojo/services/tracing/public/cpp", "+third_party/mojo_services/src/clipboard", ]
diff --git a/components/clipboard/clipboard_application_delegate.cc b/components/clipboard/clipboard_application_delegate.cc index ad8fec0..53eff35e 100644 --- a/components/clipboard/clipboard_application_delegate.cc +++ b/components/clipboard/clipboard_application_delegate.cc
@@ -13,6 +13,10 @@ ClipboardApplicationDelegate::~ClipboardApplicationDelegate() {} +void ClipboardApplicationDelegate::Initialize(mojo::ApplicationImpl* app) { + tracing_.Initialize(app); +} + bool ClipboardApplicationDelegate::ConfigureIncomingConnection( mojo::ApplicationConnection* connection) { connection->AddService(this);
diff --git a/components/clipboard/clipboard_application_delegate.h b/components/clipboard/clipboard_application_delegate.h index 466a02c..d54bd3b 100644 --- a/components/clipboard/clipboard_application_delegate.h +++ b/components/clipboard/clipboard_application_delegate.h
@@ -9,6 +9,7 @@ #include "components/clipboard/public/interfaces/clipboard.mojom.h" #include "mojo/application/public/cpp/application_delegate.h" #include "mojo/application/public/cpp/interface_factory.h" +#include "mojo/services/tracing/public/cpp/tracing_impl.h" namespace mojo { class ApplicationConnection; @@ -24,6 +25,7 @@ ~ClipboardApplicationDelegate() override; // mojo::ApplicationDelegate implementation. + void Initialize(mojo::ApplicationImpl* app) override; bool ConfigureIncomingConnection( mojo::ApplicationConnection* connection) override; @@ -32,6 +34,8 @@ mojo::InterfaceRequest<mojo::Clipboard> request) override; private: + mojo::TracingImpl tracing_; + DISALLOW_COPY_AND_ASSIGN(ClipboardApplicationDelegate); };
diff --git a/components/components_tests.gyp b/components/components_tests.gyp index 4eb1410..e71cf231 100644 --- a/components/components_tests.gyp +++ b/components/components_tests.gyp
@@ -225,9 +225,6 @@ 'copresence/rpc/rpc_handler_unittest.cc', 'copresence/timed_map_unittest.cc', ], - 'cronet_unittest_sources': [ - 'cronet/histogram_manager_unittest.cc', - ], 'data_use_measurement_unittest_sources': [ 'data_use_measurement/content/data_use_measurement_unittest.cc', ], @@ -1287,7 +1284,6 @@ }], ['OS == "android"', { 'sources': [ - '<@(cronet_unittest_sources)', 'data_reduction_proxy/content/browser/data_reduction_proxy_debug_blocking_page_unittest.cc', 'data_reduction_proxy/content/browser/data_reduction_proxy_debug_resource_throttle_unittest.cc', 'data_reduction_proxy/content/browser/data_reduction_proxy_debug_ui_manager_unittest.cc',
diff --git a/components/cronet.gypi b/components/cronet.gypi index 71d2794..1b8894b 100644 --- a/components/cronet.gypi +++ b/components/cronet.gypi
@@ -446,6 +446,36 @@ 'includes': [ '../build/java_apk.gypi' ], }, { + 'target_name': 'cronet_unittests', + 'type': '<(gtest_target_type)', + 'dependencies': [ + 'cronet_static_small', + 'metrics', + '../base/base.gyp:base', + '../base/base.gyp:test_support_base', + '../testing/gtest.gyp:gtest', + '../testing/android/native_test.gyp:native_test_native_code', + ], + 'sources': [ + 'cronet/run_all_unittests.cc', + 'cronet/url_request_context_config_unittest.cc', + 'cronet/histogram_manager_unittest.cc', + ], + }, + { + 'target_name': 'cronet_unittests_apk', + 'type': 'none', + 'dependencies': [ + 'cronet_unittests', + ], + 'variables': { + 'test_suite_name': 'cronet_unittests', + }, + 'includes': [ + '../build/apk_test.gypi', + ], + }, + { 'target_name': 'cronet_package', 'type': 'none', 'dependencies': [
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/QuicTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/QuicTest.java index 349b0030..8301ac1 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/QuicTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/QuicTest.java
@@ -38,8 +38,12 @@ builder.addQuicHint(QuicTestServer.getServerHost(), QuicTestServer.getServerPort(), QuicTestServer.getServerPort()); - JSONObject quicParams = - new JSONObject().put("connection_options", "PACE,IW10,FOO,DEADBEEF"); + JSONObject quicParams = new JSONObject() + .put("connection_options", "PACE,IW10,FOO,DEADBEEF") + .put("store_server_configs_in_properties", true) + .put("delay_tcp_race", true) + .put("max_number_of_lossy_connections", 10) + .put("packet_loss_threshold", 0.5); JSONObject experimentalOptions = new JSONObject().put("QUIC", quicParams); builder.setExperimentalOptions(experimentalOptions.toString());
diff --git a/components/cronet/run_all_unittests.cc b/components/cronet/run_all_unittests.cc new file mode 100644 index 0000000..caf318b3 --- /dev/null +++ b/components/cronet/run_all_unittests.cc
@@ -0,0 +1,14 @@ +// Copyright 2015 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 "base/bind.h" +#include "base/test/launcher/unit_test_launcher.h" +#include "base/test/test_suite.h" + +int main(int argc, char** argv) { + base::TestSuite test_suite(argc, argv); + return base::LaunchUnitTests( + argc, argv, + base::Bind(&base::TestSuite::Run, base::Unretained(&test_suite))); +}
diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc index 5cd24b8..ef94d0d 100644 --- a/components/cronet/url_request_context_config.cc +++ b/components/cronet/url_request_context_config.cc
@@ -22,6 +22,12 @@ // TODO(xunjieli): Refactor constants in io_thread.cc. const char kQuicFieldTrialName[] = "QUIC"; const char kQuicConnectionOptions[] = "connection_options"; +const char kQuicStoreServerConfigsInProperties[] = + "store_server_configs_in_properties"; +const char kQuicDelayTcpRace[] = "delay_tcp_race"; +const char kQuicMaxNumberOfLossyConnections[] = + "max_number_of_lossy_connections"; +const char kQuicPacketLossThreshold[] = "packet_loss_threshold"; // Using a reference to scoped_ptr is unavoidable because of the semantics of // RegisterCustomField. @@ -41,6 +47,7 @@ if (experimental_options.empty()) return; + DVLOG(1) << "Experimental Options:" << experimental_options; scoped_ptr<base::Value> options = base::JSONReader::Read(experimental_options); @@ -67,6 +74,32 @@ context_builder->set_quic_connection_options( net::QuicUtils::ParseQuicConnectionOptions(quic_connection_options)); } + + bool quic_store_server_configs_in_properties = false; + if (quic_args->GetBoolean(kQuicStoreServerConfigsInProperties, + &quic_store_server_configs_in_properties)) { + context_builder->set_quic_store_server_configs_in_properties( + quic_store_server_configs_in_properties); + } + + bool quic_delay_tcp_race = false; + if (quic_args->GetBoolean(kQuicDelayTcpRace, &quic_delay_tcp_race)) { + context_builder->set_quic_delay_tcp_race(quic_delay_tcp_race); + } + + int quic_max_number_of_lossy_connections = 0; + if (quic_args->GetInteger(kQuicMaxNumberOfLossyConnections, + &quic_max_number_of_lossy_connections)) { + context_builder->set_quic_max_number_of_lossy_connections( + quic_max_number_of_lossy_connections); + } + + double quic_packet_loss_threshold = 0.0; + if (quic_args->GetDouble(kQuicPacketLossThreshold, + &quic_packet_loss_threshold)) { + context_builder->set_quic_packet_loss_threshold( + quic_packet_loss_threshold); + } } }
diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc new file mode 100644 index 0000000..ac4ace5 --- /dev/null +++ b/components/cronet/url_request_context_config_unittest.cc
@@ -0,0 +1,62 @@ +// Copyright 2015 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 "components/cronet/url_request_context_config.h" + +#include "net/http/http_network_session.h" +#include "net/proxy/proxy_config.h" +#include "net/proxy/proxy_config_service_fixed.h" +#include "net/url_request/url_request_context.h" +#include "net/url_request/url_request_context_builder.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace cronet { + +TEST(URLRequestContextConfigTest, SetQuicExperimentalOptions) { + URLRequestContextConfig config; + + std::string args = + "{\"QUIC_HINTS\":[{\"QUIC_HINT_ALT_PORT\":6121,\"QUIC_HINT_PORT\":6121," + "\"QUIC_HINT_HOST\":\"test.example.com\"}]," + "\"HTTP_CACHE\":\"HTTP_CACHE_DISK\",\"ENABLE_SDCH\":false," + "\"ENABLE_LEGACY_MODE\":false,\"HTTP_CACHE_MAX_SIZE\":1024000," + "\"NATIVE_LIBRARY_NAME\":\"cronet_tests\",\"USER_AGENT\":\"fake agent\"," + "\"STORAGE_PATH\":" + "\"\\/data\\/data\\/org.chromium.net\\/app_cronet_test\\/test_storage\"," + "\"ENABLE_SPDY\":true," + "\"ENABLE_QUIC\":true,\"LOAD_DISABLE_CACHE\":true," + "\"EXPERIMENTAL_OPTIONS\":" + "\"{\\\"QUIC\\\":{\\\"store_server_configs_in_properties\\\":true," + "\\\"delay_tcp_race\\\":true," + "\\\"max_number_of_lossy_connections\\\":10," + "\\\"packet_loss_threshold\\\":0.5," + "\\\"connection_options\\\":\\\"TIME,TBBR,REJ\\\"}}\"}"; + config.LoadFromJSON(args); + net::URLRequestContextBuilder builder; + config.ConfigureURLRequestContextBuilder(&builder); + // Set a ProxyConfigService to avoid DCHECK failure when building. + builder.set_proxy_config_service(make_scoped_ptr( + new net::ProxyConfigServiceFixed(net::ProxyConfig::CreateDirect()))); + scoped_ptr<net::URLRequestContext> context(builder.Build()); + const net::HttpNetworkSession::Params* params = + context->GetNetworkSessionParams(); + // Check Quic Connection options. + net::QuicTagVector quic_connection_options; + quic_connection_options.push_back(net::kTIME); + quic_connection_options.push_back(net::kTBBR); + quic_connection_options.push_back(net::kREJ); + EXPECT_EQ(quic_connection_options, params->quic_connection_options); + + // Check store_server_configs_in_properties. + EXPECT_TRUE(params->quic_store_server_configs_in_properties); + + // Check delay_tcp_race. + EXPECT_TRUE(params->quic_delay_tcp_race); + + // Check max_number_of_lossy_connections and packet_loss_threshold. + EXPECT_EQ(10, params->quic_max_number_of_lossy_connections); + EXPECT_FLOAT_EQ(0.5f, params->quic_packet_loss_threshold); +} + +} // namespace cronet
diff --git a/components/data_usage/core/data_use_aggregator.cc b/components/data_usage/core/data_use_aggregator.cc index 47c7649..f1fb19e 100644 --- a/components/data_usage/core/data_use_aggregator.cc +++ b/components/data_usage/core/data_use_aggregator.cc
@@ -8,8 +8,6 @@ #include "base/callback.h" #include "base/stl_util.h" #include "components/data_usage/core/data_use.h" -#include "components/data_usage/core/data_use_amortizer.h" -#include "components/data_usage/core/data_use_annotator.h" #include "net/base/load_timing_info.h" #include "net/base/network_change_notifier.h" #include "net/url_request/url_request.h" @@ -34,6 +32,10 @@ DataUseAggregator::~DataUseAggregator() { net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); + + // Reset the callbacks to remove any WeakPtr references to |this| inside them. + annotation_callback_.Reset(); + amortization_callback_.Reset(); } void DataUseAggregator::AddObserver(Observer* observer) { @@ -64,11 +66,14 @@ return; } - // TODO(sclittle): Instead of binding a new callback every time, re-use the - // same callback every time. - annotator_->Annotate( - request, data_use.Pass(), - base::Bind(&DataUseAggregator::PassDataUseToAmortizer, GetWeakPtr())); + // As an optimization, re-use a lazily initialized callback object for every + // call into |annotator_|, so that a new callback object doesn't have to be + // allocated and held onto every time. + if (annotation_callback_.is_null()) { + annotation_callback_ = + base::Bind(&DataUseAggregator::PassDataUseToAmortizer, GetWeakPtr()); + } + annotator_->Annotate(request, data_use.Pass(), annotation_callback_); } void DataUseAggregator::ReportOffTheRecordDataUse(int64_t tx_bytes, @@ -109,11 +114,14 @@ return; } - // TODO(sclittle): Instead of binding a new callback every time, re-use the - // same callback every time. - amortizer_->AmortizeDataUse( - data_use.Pass(), - base::Bind(&DataUseAggregator::OnAmortizationComplete, GetWeakPtr())); + // As an optimization, re-use a lazily initialized callback object for every + // call into |amortizer_|, so that a new callback object doesn't have to be + // allocated and held onto every time. + if (amortization_callback_.is_null()) { + amortization_callback_ = + base::Bind(&DataUseAggregator::OnAmortizationComplete, GetWeakPtr()); + } + amortizer_->AmortizeDataUse(data_use.Pass(), amortization_callback_); } void DataUseAggregator::OnAmortizationComplete(
diff --git a/components/data_usage/core/data_use_aggregator.h b/components/data_usage/core/data_use_aggregator.h index 50bb36e..54d4819c 100644 --- a/components/data_usage/core/data_use_aggregator.h +++ b/components/data_usage/core/data_use_aggregator.h
@@ -15,6 +15,8 @@ #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/threading/thread_checker.h" +#include "components/data_usage/core/data_use_amortizer.h" +#include "components/data_usage/core/data_use_annotator.h" #include "net/base/network_change_notifier.h" namespace net { @@ -23,8 +25,6 @@ namespace data_usage { -class DataUseAmortizer; -class DataUseAnnotator; struct DataUse; // Class that collects and aggregates network usage, reporting the usage to @@ -96,6 +96,12 @@ // even if the current active network is not a cellular network. std::string mcc_mnc_; + // As an optimization, re-use the same callbacks to avoid creating and + // allocating a new Callback object for each call into the |annotator_| or + // |amortizer_|. These callbacks are lazily initialized. + DataUseAnnotator::DataUseConsumerCallback annotation_callback_; + DataUseAmortizer::AmortizationCompleteCallback amortization_callback_; + base::WeakPtrFactory<DataUseAggregator> weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(DataUseAggregator);
diff --git a/components/filesystem/BUILD.gn b/components/filesystem/BUILD.gn index 47782a6..178633b 100644 --- a/components/filesystem/BUILD.gn +++ b/components/filesystem/BUILD.gn
@@ -25,6 +25,7 @@ "//mojo/common", "//mojo/common:common_base", "//mojo/platform_handle", + "//mojo/services/tracing/public/cpp", "//url", ] }
diff --git a/components/filesystem/DEPS b/components/filesystem/DEPS index b3412d0..1d92bb6 100644 --- a/components/filesystem/DEPS +++ b/components/filesystem/DEPS
@@ -2,5 +2,6 @@ "+mojo/application", "+mojo/platform_handle", "+mojo/public", + "+mojo/services/tracing/public/cpp", "+mojo/util", ]
diff --git a/components/filesystem/file_system_app.cc b/components/filesystem/file_system_app.cc index c42b606..be7bd18 100644 --- a/components/filesystem/file_system_app.cc +++ b/components/filesystem/file_system_app.cc
@@ -17,6 +17,7 @@ void FileSystemApp::Initialize(mojo::ApplicationImpl* app) { app_ = app; + tracing_.Initialize(app); } bool FileSystemApp::ConfigureIncomingConnection(
diff --git a/components/filesystem/file_system_app.h b/components/filesystem/file_system_app.h index 56e33aff..b997bb57 100644 --- a/components/filesystem/file_system_app.h +++ b/components/filesystem/file_system_app.h
@@ -11,6 +11,7 @@ #include "components/filesystem/public/interfaces/file_system.mojom.h" #include "mojo/application/public/cpp/application_delegate.h" #include "mojo/application/public/cpp/interface_factory.h" +#include "mojo/services/tracing/public/cpp/tracing_impl.h" namespace mojo { class ApplicationImpl; @@ -59,6 +60,7 @@ std::vector<Client> client_mapping_; mojo::ApplicationImpl* app_; + mojo::TracingImpl tracing_; // Set to true when our shell connection is closed. On connection error, we // then broadcast a notification to all FileSystemClients that they should
diff --git a/components/font_service/BUILD.gn b/components/font_service/BUILD.gn index 2ef5123..49f93907 100644 --- a/components/font_service/BUILD.gn +++ b/components/font_service/BUILD.gn
@@ -17,6 +17,7 @@ "//mojo/common:common_base", "//mojo/platform_handle", "//mojo/public/cpp/bindings", + "//mojo/services/tracing/public/cpp", ] public_deps = [
diff --git a/components/font_service/DEPS b/components/font_service/DEPS index ef585a9..bce6c1c 100644 --- a/components/font_service/DEPS +++ b/components/font_service/DEPS
@@ -4,6 +4,7 @@ "+mojo/message_pump", "+mojo/platform_handle", "+mojo/public", + "+mojo/services/tracing/public/cpp", "+skia", "+third_party/skia/include", ]
diff --git a/components/font_service/font_service_app.cc b/components/font_service/font_service_app.cc index 77f03a4..41a7f9e 100644 --- a/components/font_service/font_service_app.cc +++ b/components/font_service/font_service_app.cc
@@ -56,7 +56,9 @@ FontServiceApp::~FontServiceApp() {} -void FontServiceApp::Initialize(mojo::ApplicationImpl* app) {} +void FontServiceApp::Initialize(mojo::ApplicationImpl* app) { + tracing_.Initialize(app); +} bool FontServiceApp::ConfigureIncomingConnection( mojo::ApplicationConnection* connection) {
diff --git a/components/font_service/font_service_app.h b/components/font_service/font_service_app.h index 9eda20a..7beb4b5f 100644 --- a/components/font_service/font_service_app.h +++ b/components/font_service/font_service_app.h
@@ -9,6 +9,7 @@ #include "mojo/application/public/cpp/application_delegate.h" #include "mojo/application/public/cpp/interface_factory.h" #include "mojo/common/weak_binding_set.h" +#include "mojo/services/tracing/public/cpp/tracing_impl.h" #include "skia/ext/skia_utils_base.h" namespace font_service { @@ -41,6 +42,8 @@ mojo::WeakBindingSet<FontService> bindings_; + mojo::TracingImpl tracing_; + // We don't want to leak paths to our callers; we thus enumerate the paths of // fonts. SkTDArray<SkString*> paths_;
diff --git a/components/login.gypi b/components/login.gypi index e8a6bb1..ac662125 100644 --- a/components/login.gypi +++ b/components/login.gypi
@@ -8,6 +8,7 @@ 'type': '<(component)', 'dependencies': [ '<(DEPTH)/base/base.gyp:base', + '<(DEPTH)/components/components.gyp:signin_core_account_id', '<(DEPTH)/ui/base/ui_base.gyp:ui_base', ], 'export_dependent_settings': [
diff --git a/components/login/BUILD.gn b/components/login/BUILD.gn index 26a28685..8d20888 100644 --- a/components/login/BUILD.gn +++ b/components/login/BUILD.gn
@@ -16,6 +16,7 @@ deps = [ "//ui/base", + "//components/signin/core/account_id", ] public_deps = [
diff --git a/components/login/DEPS b/components/login/DEPS index 6df15b8..da38c4d 100644 --- a/components/login/DEPS +++ b/components/login/DEPS
@@ -1,3 +1,4 @@ include_rules = [ + "+components/signin/core/account_id/account_id.h", "+ui/base/l10n" ]
diff --git a/components/login/base_screen_handler_utils.cc b/components/login/base_screen_handler_utils.cc index 6454cdf..fd977a33 100644 --- a/components/login/base_screen_handler_utils.cc +++ b/components/login/base_screen_handler_utils.cc
@@ -4,6 +4,8 @@ #include "components/login/base_screen_handler_utils.h" +#include "components/signin/core/account_id/account_id.h" + namespace login { namespace { @@ -56,6 +58,20 @@ return ParseStringList(value, out_value); } +bool ParseValue(const base::Value* value, AccountId* out_value) { + std::string serialized; + const bool has_string = value->GetAsString(&serialized); + if (!has_string) + return false; + + if (AccountId::Deserialize(serialized, out_value)) + return true; + + LOG(ERROR) << "Failed to deserialize '" << serialized << "'"; + *out_value = AccountId::FromUserEmail(serialized); + return true; +} + base::FundamentalValue MakeValue(bool v) { return base::FundamentalValue(v); } @@ -76,4 +92,11 @@ return base::StringValue(v); } +base::StringValue MakeValue(const AccountId& v) { + return base::StringValue(v.Serialize()); +} + +ParsedValueContainer<AccountId>::ParsedValueContainer() { +} + } // namespace login
diff --git a/components/login/base_screen_handler_utils.h b/components/login/base_screen_handler_utils.h index 71d2e7f..7d884d2 100644 --- a/components/login/base_screen_handler_utils.h +++ b/components/login/base_screen_handler_utils.h
@@ -14,6 +14,7 @@ #include "base/tuple.h" #include "base/values.h" #include "components/login/login_export.h" +#include "components/signin/core/account_id/account_id.h" namespace login { @@ -40,6 +41,7 @@ const base::DictionaryValue** out_value); bool LOGIN_EXPORT ParseValue(const base::Value* value, StringList* out_value); bool LOGIN_EXPORT ParseValue(const base::Value* value, String16List* out_value); +bool LOGIN_EXPORT ParseValue(const base::Value* value, AccountId* out_value); template <typename T> inline bool GetArg(const base::ListValue* args, size_t index, T* out_value) { @@ -54,17 +56,29 @@ base::FundamentalValue LOGIN_EXPORT MakeValue(double v); base::StringValue LOGIN_EXPORT MakeValue(const std::string& v); base::StringValue LOGIN_EXPORT MakeValue(const base::string16& v); +base::StringValue LOGIN_EXPORT MakeValue(const AccountId& v); template <typename T> inline const T& MakeValue(const T& v) { return v; } +template <typename T> +struct ParsedValueContainer { + T value; +}; + +template <> +struct LOGIN_EXPORT ParsedValueContainer<AccountId> { + ParsedValueContainer(); + AccountId value = EmptyAccountId(); +}; + template <typename Arg, size_t index> typename UnwrapConstRef<Arg>::Type ParseArg(const base::ListValue* args) { - typename UnwrapConstRef<Arg>::Type parsed; - CHECK(GetArg(args, index, &parsed)); - return parsed; + ParsedValueContainer<typename UnwrapConstRef<Arg>::Type> parsed; + CHECK(GetArg(args, index, &parsed.value)); + return parsed.value; } template <typename... Args, size_t... Ns>
diff --git a/components/mus/example/mock_sysui/BUILD.gn b/components/mus/example/mock_sysui/BUILD.gn index b15537a3..2e8305e 100644 --- a/components/mus/example/mock_sysui/BUILD.gn +++ b/components/mus/example/mock_sysui/BUILD.gn
@@ -20,6 +20,7 @@ "//mash/wm/public/interfaces", "//mojo/application/public/cpp", "//mojo/common:common_base", + "//mojo/services/tracing/public/cpp", "//skia", "//ui/views", "//ui/views/mus:for_mojo_application",
diff --git a/components/mus/example/mock_sysui/mock_sysui.cc b/components/mus/example/mock_sysui/mock_sysui.cc index 5d80457..6a0a67f 100644 --- a/components/mus/example/mock_sysui/mock_sysui.cc +++ b/components/mus/example/mock_sysui/mock_sysui.cc
@@ -95,6 +95,8 @@ } void MockSysUI::Initialize(mojo::ApplicationImpl* app) { + tracing_.Initialize(app); + aura_init_.reset(new views::AuraInit(app, "views_mus_resources.pak")); views::WindowManagerConnection::Create(app);
diff --git a/components/mus/example/mock_sysui/mock_sysui.h b/components/mus/example/mock_sysui/mock_sysui.h index f70b97bc..b214c641 100644 --- a/components/mus/example/mock_sysui/mock_sysui.h +++ b/components/mus/example/mock_sysui/mock_sysui.h
@@ -8,6 +8,7 @@ #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "mojo/application/public/cpp/application_delegate.h" +#include "mojo/services/tracing/public/cpp/tracing_impl.h" namespace views { class AuraInit; @@ -24,6 +25,8 @@ bool ConfigureIncomingConnection( mojo::ApplicationConnection* connection) override; + mojo::TracingImpl tracing_; + scoped_ptr<views::AuraInit> aura_init_; DISALLOW_COPY_AND_ASSIGN(MockSysUI);
diff --git a/components/mus/example/views_examples/BUILD.gn b/components/mus/example/views_examples/BUILD.gn index e5cf4de5..c250718 100644 --- a/components/mus/example/views_examples/BUILD.gn +++ b/components/mus/example/views_examples/BUILD.gn
@@ -23,6 +23,7 @@ "//mojo/application/public/cpp:sources", "//mojo/converters/geometry", "//mojo/public/cpp/bindings", + "//mojo/services/tracing/public/cpp", "//skia", "//ui/gfx", "//ui/gfx/geometry",
diff --git a/components/mus/example/views_examples/views_examples_application_delegate.cc b/components/mus/example/views_examples/views_examples_application_delegate.cc index a1ac1f20..176de7f 100644 --- a/components/mus/example/views_examples/views_examples_application_delegate.cc +++ b/components/mus/example/views_examples/views_examples_application_delegate.cc
@@ -17,6 +17,7 @@ } void ViewsExamplesApplicationDelegate::Initialize(mojo::ApplicationImpl* app) { + tracing_.Initialize(app); aura_init_.reset(new views::AuraInit(app, "views_mus_resources.pak")); views::WindowManagerConnection::Create(app);
diff --git a/components/mus/example/views_examples/views_examples_application_delegate.h b/components/mus/example/views_examples/views_examples_application_delegate.h index 6f6e1bb3..c317aa2 100644 --- a/components/mus/example/views_examples/views_examples_application_delegate.h +++ b/components/mus/example/views_examples/views_examples_application_delegate.h
@@ -8,6 +8,7 @@ #include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "mojo/application/public/cpp/application_delegate.h" +#include "mojo/services/tracing/public/cpp/tracing_impl.h" namespace views { class AuraInit; @@ -24,6 +25,8 @@ bool ConfigureIncomingConnection( mojo::ApplicationConnection* connection) override; + mojo::TracingImpl tracing_; + scoped_ptr<views::AuraInit> aura_init_; DISALLOW_COPY_AND_ASSIGN(ViewsExamplesApplicationDelegate);
diff --git a/components/mus/gles2/mojo_gpu_memory_buffer.cc b/components/mus/gles2/mojo_gpu_memory_buffer.cc index c0603e6a..f5172633 100644 --- a/components/mus/gles2/mojo_gpu_memory_buffer.cc +++ b/components/mus/gles2/mojo_gpu_memory_buffer.cc
@@ -28,8 +28,17 @@ gfx::BufferUsage usage) { size_t bytes = gfx::BufferSizeForBufferFormat(size, format); scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory); + +#if defined(OS_MACOSX) + // Mojo IPC does not yet support transfer of Mach primitives, so + // force the underlying primitive to be a POSIX fd. https://crbug.com/547243. + if (!shared_memory->CreateAnonymousPosix(bytes)) + return nullptr; +#else if (!shared_memory->CreateAnonymous(bytes)) return nullptr; +#endif // defined(OS_MACOSX) + return make_scoped_ptr<gfx::GpuMemoryBuffer>( new MojoGpuMemoryBufferImpl(size, format, shared_memory.Pass())); }
diff --git a/components/mus/mus_app.cc b/components/mus/mus_app.cc index f464ba4..df40649f 100644 --- a/components/mus/mus_app.cc +++ b/components/mus/mus_app.cc
@@ -70,6 +70,8 @@ if (!gpu_state_.get()) gpu_state_ = new GpuState(hardware_rendering_available); connection_manager_.reset(new ws::ConnectionManager(this, surfaces_state_)); + + tracing_.Initialize(app); } bool MandolineUIServicesApp::ConfigureIncomingConnection(
diff --git a/components/mus/mus_app.h b/components/mus/mus_app.h index 069e665..fab2e927 100644 --- a/components/mus/mus_app.h +++ b/components/mus/mus_app.h
@@ -91,6 +91,7 @@ scoped_ptr<ws::ConnectionManager> connection_manager_; scoped_refptr<GpuState> gpu_state_; scoped_ptr<ui::PlatformEventSource> event_source_; + mojo::TracingImpl tracing_; using WindowManagerRequests = std::vector<scoped_ptr<mojo::InterfaceRequest<mojom::WindowManager>>>; WindowManagerRequests pending_window_manager_requests_;
diff --git a/components/mus/public/cpp/lib/window.cc b/components/mus/public/cpp/lib/window.cc index 82c077b..e2ac0c8 100644 --- a/components/mus/public/cpp/lib/window.cc +++ b/components/mus/public/cpp/lib/window.cc
@@ -344,16 +344,6 @@ tree_client()->SetImeVisibility(id_, visible, state.Pass()); } -void Window::SetPreferredSize(const gfx::Size& size) { - if (connection_) - tree_client()->SetPreferredSize(id_, size); -} - -void Window::SetResizeBehavior(mojom::ResizeBehavior resize_behavior) { - if (connection_) - tree_client()->SetResizeBehavior(id_, resize_behavior); -} - void Window::SetFocus() { if (connection_) tree_client()->SetFocus(id_);
diff --git a/components/mus/public/cpp/lib/window_tree_client_impl.cc b/components/mus/public/cpp/lib/window_tree_client_impl.cc index 43fc02c..5ce927fc 100644 --- a/components/mus/public/cpp/lib/window_tree_client_impl.cc +++ b/components/mus/public/cpp/lib/window_tree_client_impl.cc
@@ -21,11 +21,6 @@ #include "ui/gfx/geometry/size.h" namespace mus { -namespace { - -void WindowManagerCallback(mojom::WindowManagerErrorCode error_code) {} - -} // namespace Id MakeTransportId(ConnectionSpecificId connection_id, ConnectionSpecificId local_id) { @@ -309,18 +304,6 @@ delete this; } -void WindowTreeClientImpl::SetPreferredSize(Id window_id, - const gfx::Size& size) { - tree_->SetPreferredSize(window_id, mojo::Size::From(size), - base::Bind(&WindowManagerCallback)); -} - -void WindowTreeClientImpl::SetResizeBehavior( - Id window_id, - mojom::ResizeBehavior resize_behavior) { - tree_->SetResizeBehavior(window_id, resize_behavior); -} - InFlightChange* WindowTreeClientImpl::GetOldestInFlightChangeMatching( const InFlightChange& change) { for (auto& pair : in_flight_map_) {
diff --git a/components/mus/public/cpp/lib/window_tree_client_impl.h b/components/mus/public/cpp/lib/window_tree_client_impl.h index 3782101e..f6638ec6 100644 --- a/components/mus/public/cpp/lib/window_tree_client_impl.h +++ b/components/mus/public/cpp/lib/window_tree_client_impl.h
@@ -102,9 +102,6 @@ // is torn down after the root. void OnRootDestroyed(Window* root); - void SetPreferredSize(Id window_id, const gfx::Size& size); - void SetResizeBehavior(Id window_id, mojom::ResizeBehavior resize_behavior); - private: friend class WindowTreeClientImplPrivate;
diff --git a/components/mus/public/cpp/tests/test_window_tree.cc b/components/mus/public/cpp/tests/test_window_tree.cc index c49929f4..3e89776 100644 --- a/components/mus/public/cpp/tests/test_window_tree.cc +++ b/components/mus/public/cpp/tests/test_window_tree.cc
@@ -94,14 +94,6 @@ bool visible, mojo::TextInputStatePtr state) {} -void TestWindowTree::SetPreferredSize( - uint32_t window_id, - mojo::SizePtr size, - const SetPreferredSizeCallback& callback) {} - -void TestWindowTree::SetResizeBehavior(uint32_t window_id, - mojom::ResizeBehavior resize_behavior) {} - void TestWindowTree::WmResponse(uint32_t change_id, bool response) {} } // namespace mus
diff --git a/components/mus/public/cpp/tests/test_window_tree.h b/components/mus/public/cpp/tests/test_window_tree.h index 5cc6762..31a74e3 100644 --- a/components/mus/public/cpp/tests/test_window_tree.h +++ b/components/mus/public/cpp/tests/test_window_tree.h
@@ -70,11 +70,6 @@ void SetImeVisibility(uint32_t window_id, bool visible, mojo::TextInputStatePtr state) override; - void SetPreferredSize(uint32_t window_id, - mojo::SizePtr size, - const SetPreferredSizeCallback& callback) override; - void SetResizeBehavior(uint32_t window_id, - mojom::ResizeBehavior resize_behavior) override; void WmResponse(uint32_t change_id, bool response) override; bool got_change_;
diff --git a/components/mus/public/cpp/window.h b/components/mus/public/cpp/window.h index 77bb18f50..472b0d44 100644 --- a/components/mus/public/cpp/window.h +++ b/components/mus/public/cpp/window.h
@@ -168,11 +168,6 @@ void SetTextInputState(mojo::TextInputStatePtr state); void SetImeVisibility(bool visible, mojo::TextInputStatePtr state); - // The following make their way to the WindowManager. See - // window_manager.mojom for details. - void SetPreferredSize(const gfx::Size& size); - void SetResizeBehavior(mojom::ResizeBehavior resize_behavior); - // Focus. void SetFocus(); bool HasFocus() const;
diff --git a/components/mus/public/interfaces/window_manager.mojom b/components/mus/public/interfaces/window_manager.mojom index 873974e1..9c027424 100644 --- a/components/mus/public/interfaces/window_manager.mojom +++ b/components/mus/public/interfaces/window_manager.mojom
@@ -33,12 +33,5 @@ OpenWindow(WindowTreeClient client, map<string, array<uint8>> properties); - // Updates the window's preferred size and triggers a relayout of the window - // within its container. - SetPreferredSize(uint32 window_id, mojo.Size size) => - (WindowManagerErrorCode result); - - SetResizeBehavior(uint32 window_id, ResizeBehavior resize_behavior); - GetConfig() => (WindowManagerConfig config); };
diff --git a/components/mus/public/interfaces/window_tree.mojom b/components/mus/public/interfaces/window_tree.mojom index c9d4ecf..7c57d2f0 100644 --- a/components/mus/public/interfaces/window_tree.mojom +++ b/components/mus/public/interfaces/window_tree.mojom
@@ -212,15 +212,6 @@ SetImeVisibility(uint32 window_id, bool visible, mojo.TextInputState? state); // -------------------------------------------------------------------------- - // This section is for functions that call through directly to the - // WindowManager. It is expected this will move into an associated interface. - // See window_manager.mojom for details of these functions. - // OpenWindow(WindowTreeClient client); - SetPreferredSize(uint32 window_id, mojo.Size size) => - (WindowManagerErrorCode result); - SetResizeBehavior(uint32 window_id, ResizeBehavior resize_behavior); - - // -------------------------------------------------------------------------- // This section is for functions called from the window manager. It is // expected these will be pulled into an associated interface.
diff --git a/components/mus/ws/forwarding_window_manager.cc b/components/mus/ws/forwarding_window_manager.cc index 62f1397..6b27432 100644 --- a/components/mus/ws/forwarding_window_manager.cc +++ b/components/mus/ws/forwarding_window_manager.cc
@@ -28,19 +28,6 @@ GetActiveWindowManager()->OpenWindow(client.Pass(), properties.Pass()); } -void ForwardingWindowManager::SetPreferredSize( - uint32_t window_id, - mojo::SizePtr size, - const SetPreferredSizeCallback& callback) { - GetActiveWindowManager()->SetPreferredSize(window_id, size.Pass(), callback); -} - -void ForwardingWindowManager::SetResizeBehavior( - uint32_t window_id, - mus::mojom::ResizeBehavior resize_behavior) { - GetActiveWindowManager()->SetResizeBehavior(window_id, resize_behavior); -} - void ForwardingWindowManager::GetConfig(const GetConfigCallback& callback) { return GetActiveWindowManager()->GetConfig(callback); }
diff --git a/components/mus/ws/forwarding_window_manager.h b/components/mus/ws/forwarding_window_manager.h index 23a2cae..9268b1a 100644 --- a/components/mus/ws/forwarding_window_manager.h +++ b/components/mus/ws/forwarding_window_manager.h
@@ -28,11 +28,6 @@ void OpenWindow( mus::mojom::WindowTreeClientPtr client, mojo::Map<mojo::String, mojo::Array<uint8_t>> properties) override; - void SetPreferredSize(uint32_t window_id, - mojo::SizePtr size, - const SetPreferredSizeCallback& callback) override; - void SetResizeBehavior(uint32_t window_id, - mus::mojom::ResizeBehavior resize_behavior) override; void GetConfig(const GetConfigCallback& callback) override; ConnectionManager* connection_manager_;
diff --git a/components/mus/ws/window_tree_impl.cc b/components/mus/ws/window_tree_impl.cc index df89c97..88bc7da 100644 --- a/components/mus/ws/window_tree_impl.cc +++ b/components/mus/ws/window_tree_impl.cc
@@ -825,25 +825,6 @@ window->set_can_focus(can_focus); } -void WindowTreeImpl::SetPreferredSize( - uint32_t window_id, - mojo::SizePtr size, - const SetPreferredSizeCallback& callback) { - ServerWindow* window = GetWindow(WindowIdFromTransportId(window_id)); - if (window && ShouldRouteToWindowManager(window)) { - GetHost()->window_manager()->SetPreferredSize(window_id, size.Pass(), - callback); - } -} - -void WindowTreeImpl::SetResizeBehavior( - uint32_t window_id, - mus::mojom::ResizeBehavior resize_behavior) { - ServerWindow* window = GetWindow(WindowIdFromTransportId(window_id)); - if (window && ShouldRouteToWindowManager(window)) - GetHost()->window_manager()->SetResizeBehavior(window_id, resize_behavior); -} - void WindowTreeImpl::WmResponse(uint32 change_id, bool response) { if (GetHost() && GetHost()->GetWindowTree() == this) connection_manager_->WindowManagerChangeCompleted(change_id, response);
diff --git a/components/mus/ws/window_tree_impl.h b/components/mus/ws/window_tree_impl.h index 56f93ab2..865ae8e 100644 --- a/components/mus/ws/window_tree_impl.h +++ b/components/mus/ws/window_tree_impl.h
@@ -238,11 +238,6 @@ bool visible, mojo::TextInputStatePtr state) override; void SetClientArea(Id transport_window_id, mojo::InsetsPtr insets) override; - void SetPreferredSize(uint32_t window_id, - mojo::SizePtr size, - const SetPreferredSizeCallback& callback) override; - void SetResizeBehavior(uint32_t window_id, - mus::mojom::ResizeBehavior resize_behavior) override; void WmResponse(uint32 change_id, bool response) override; // AccessPolicyDelegate:
diff --git a/components/nacl/browser/nacl_process_host.cc b/components/nacl/browser/nacl_process_host.cc index d70572d..3dfc1d8 100644 --- a/components/nacl/browser/nacl_process_host.cc +++ b/components/nacl/browser/nacl_process_host.cc
@@ -944,6 +944,10 @@ base::SharedMemoryCreateOptions options; options.size = 1; options.executable = true; + + // NaCl expects a POSIX fd. + options.type = base::SharedMemoryHandle::POSIX; + if (!memory_buffer.Create(options)) { DLOG(ERROR) << "Failed to allocate memory buffer"; return false;
diff --git a/components/omnibox/browser/omnibox_view.cc b/components/omnibox/browser/omnibox_view.cc index 9a10d6b..d070f0a 100644 --- a/components/omnibox/browser/omnibox_view.cc +++ b/components/omnibox/browser/omnibox_view.cc
@@ -81,10 +81,18 @@ return (id == IDR_OMNIBOX_HTTP) ? IDR_LOCATION_BAR_HTTP : id; } -gfx::VectorIconId OmniboxView::GetVectorIcon() const { +gfx::VectorIconId OmniboxView::GetVectorIcon(bool invert) const { #if !defined(OS_ANDROID) && !defined(OS_MACOSX) && !defined(OS_IOS) - if (!IsEditingOrEmpty()) - return controller_->GetToolbarModel()->GetVectorIcon(); + if (!IsEditingOrEmpty()) { + gfx::VectorIconId id = controller_->GetToolbarModel()->GetVectorIcon(); + if (invert) { + if (id == gfx::VectorIconId::LOCATION_BAR_HTTPS_VALID) + return gfx::VectorIconId::LOCATION_BAR_HTTPS_VALID_INVERT; + if (id == gfx::VectorIconId::LOCATION_BAR_HTTPS_INVALID) + return gfx::VectorIconId::LOCATION_BAR_HTTPS_INVALID_INVERT; + } + return id; + } // Reuse the dropdown icons... gfx::VectorIconId id = AutocompleteMatch::TypeToVectorIcon( model_ ? model_->CurrentTextType()
diff --git a/components/omnibox/browser/omnibox_view.h b/components/omnibox/browser/omnibox_view.h index 6095561..63be0e8a 100644 --- a/components/omnibox/browser/omnibox_view.h +++ b/components/omnibox/browser/omnibox_view.h
@@ -75,8 +75,10 @@ // Returns the resource ID of the icon to show for the current text. int GetIcon() const; - // Like GetIcon(), but returns a vector icon identifier. - gfx::VectorIconId GetVectorIcon() const; + // Like GetIcon(), but returns a vector icon identifier. If |invert| is true, + // this returns an icon suitable for display in an inverted (light-on-dark) + // color scheme. + gfx::VectorIconId GetVectorIcon(bool invert) const; // The user text is the text the user has manually keyed in. When present, // this is shown in preference to the permanent text; hitting escape will
diff --git a/components/page_load_metrics.gypi b/components/page_load_metrics.gypi index b8b78467..53ec8c2e1 100644 --- a/components/page_load_metrics.gypi +++ b/components/page_load_metrics.gypi
@@ -38,9 +38,10 @@ 'sources': [ 'page_load_metrics/browser/metrics_web_contents_observer.cc', 'page_load_metrics/browser/metrics_web_contents_observer.h', - 'page_load_metrics/browser/page_load_metrics_macros.h', 'page_load_metrics/browser/page_load_metrics_observer.cc', 'page_load_metrics/browser/page_load_metrics_observer.h', + 'page_load_metrics/browser/page_load_metrics_util.cc', + 'page_load_metrics/browser/page_load_metrics_util.h', ], }, {
diff --git a/components/page_load_metrics/browser/BUILD.gn b/components/page_load_metrics/browser/BUILD.gn index 0654106..da7ad51 100644 --- a/components/page_load_metrics/browser/BUILD.gn +++ b/components/page_load_metrics/browser/BUILD.gn
@@ -7,9 +7,10 @@ sources = [ "metrics_web_contents_observer.cc", "metrics_web_contents_observer.h", - "page_load_metrics_macros.h", "page_load_metrics_observer.cc", "page_load_metrics_observer.h", + "page_load_metrics_util.cc", + "page_load_metrics_util.h", ] public_deps = [ "//content/public/browser",
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc index ffda133..c112a714 100644 --- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc +++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
@@ -8,7 +8,7 @@ #include "base/logging.h" #include "base/metrics/histogram.h" #include "base/metrics/user_metrics.h" -#include "components/page_load_metrics/browser/page_load_metrics_macros.h" +#include "components/page_load_metrics/browser/page_load_metrics_util.h" #include "components/page_load_metrics/common/page_load_metrics_messages.h" #include "components/page_load_metrics/common/page_load_timing.h" #include "components/rappor/rappor_service.h" @@ -81,14 +81,6 @@ UMA_HISTOGRAM_ENUMERATION(kErrorEvents, event, ERR_LAST_ENTRY); } -base::TimeDelta GetFirstContentfulPaint(const PageLoadTiming& timing) { - if (timing.first_text_paint.is_zero()) - return timing.first_image_paint; - if (timing.first_image_paint.is_zero()) - return timing.first_text_paint; - return std::min(timing.first_text_paint, timing.first_image_paint); -} - // The number of buckets in the bitfield histogram. These buckets are described // in rappor.xml in PageLoad.CoarseTiming.NavigationToFirstContentfulPaint. // The bucket flag is defined by 1 << bucket_index, and is the bitfield
diff --git a/components/page_load_metrics/browser/page_load_metrics_macros.h b/components/page_load_metrics/browser/page_load_metrics_macros.h deleted file mode 100644 index 80d549b..0000000 --- a/components/page_load_metrics/browser/page_load_metrics_macros.h +++ /dev/null
@@ -1,15 +0,0 @@ -// Copyright 2015 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. - -#ifndef COMPONENTS_PAGE_LOAD_METRICS_BROWSER_PAGE_LOAD_METRICS_MACROS_H_ -#define COMPONENTS_PAGE_LOAD_METRICS_BROWSER_PAGE_LOAD_METRICS_MACROS_H_ - -#include "base/metrics/histogram_macros.h" - -#define PAGE_LOAD_HISTOGRAM(name, sample) \ - UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, \ - base::TimeDelta::FromMilliseconds(10), \ - base::TimeDelta::FromMinutes(10), 100) - -#endif // COMPONENTS_PAGE_LOAD_METRICS_BROWSER_PAGE_LOAD_METRICS_MACROS_H_
diff --git a/components/page_load_metrics/browser/page_load_metrics_util.cc b/components/page_load_metrics/browser/page_load_metrics_util.cc new file mode 100644 index 0000000..9b641e5 --- /dev/null +++ b/components/page_load_metrics/browser/page_load_metrics_util.cc
@@ -0,0 +1,22 @@ +// Copyright 2015 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 "components/page_load_metrics/browser/page_load_metrics_util.h" + +#include <algorithm> + +#include "components/page_load_metrics/common/page_load_timing.h" + +namespace page_load_metrics { + +base::TimeDelta GetFirstContentfulPaint(const PageLoadTiming& timing) { + if (timing.first_text_paint.is_zero()) + return timing.first_image_paint; + if (timing.first_image_paint.is_zero()) + return timing.first_text_paint; + return std::min(timing.first_text_paint, timing.first_image_paint); +} + +} // namespace page_load_metrics +
diff --git a/components/page_load_metrics/browser/page_load_metrics_util.h b/components/page_load_metrics/browser/page_load_metrics_util.h new file mode 100644 index 0000000..b5a56986 --- /dev/null +++ b/components/page_load_metrics/browser/page_load_metrics_util.h
@@ -0,0 +1,27 @@ +// Copyright 2015 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. + +#ifndef COMPONENTS_PAGE_LOAD_METRICS_BROWSER_PAGE_LOAD_METRICS_UTIL_H_ +#define COMPONENTS_PAGE_LOAD_METRICS_BROWSER_PAGE_LOAD_METRICS_UTIL_H_ + +#include "base/metrics/histogram_macros.h" +#include "base/time/time.h" + +#define PAGE_LOAD_HISTOGRAM(name, sample) \ + UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, \ + base::TimeDelta::FromMilliseconds(10), \ + base::TimeDelta::FromMinutes(10), 100) + +namespace page_load_metrics { + +struct PageLoadTiming; + +// Get the time of the first 'contentful' paint. A contentful paint is a paint +// that includes content of some kind (for example, text or image content). +// Painting of a background color is not considered 'contentful'. +base::TimeDelta GetFirstContentfulPaint(const PageLoadTiming& timing); + +} // namespace page_load_metrics + +#endif // COMPONENTS_PAGE_LOAD_METRICS_BROWSER_PAGE_LOAD_METRICS_UTIL_H_
diff --git a/components/resource_provider/BUILD.gn b/components/resource_provider/BUILD.gn index 5e4bc84..c686117 100644 --- a/components/resource_provider/BUILD.gn +++ b/components/resource_provider/BUILD.gn
@@ -92,6 +92,7 @@ "//components/resource_provider/public/interfaces", "//mojo/application/public/cpp", "//mojo/common:common_base", + "//mojo/services/tracing/public/cpp", "//url", ] }
diff --git a/components/resource_provider/DEPS b/components/resource_provider/DEPS index 4146852..5780d73 100644 --- a/components/resource_provider/DEPS +++ b/components/resource_provider/DEPS
@@ -4,4 +4,5 @@ "+mojo/converters", "+mojo/platform_handle", "+mojo/public", + "+mojo/services/tracing/public/cpp", ]
diff --git a/components/resource_provider/resource_provider_app.cc b/components/resource_provider/resource_provider_app.cc index c7cd6fae..60d230f 100644 --- a/components/resource_provider/resource_provider_app.cc +++ b/components/resource_provider/resource_provider_app.cc
@@ -20,6 +20,7 @@ } void ResourceProviderApp::Initialize(mojo::ApplicationImpl* app) { + tracing_.Initialize(app); } bool ResourceProviderApp::ConfigureIncomingConnection(
diff --git a/components/resource_provider/resource_provider_app.h b/components/resource_provider/resource_provider_app.h index b4c13de..6b0a2389 100644 --- a/components/resource_provider/resource_provider_app.h +++ b/components/resource_provider/resource_provider_app.h
@@ -12,6 +12,7 @@ #include "mojo/application/public/cpp/interface_factory.h" #include "mojo/common/weak_binding_set.h" #include "mojo/public/cpp/bindings/binding.h" +#include "mojo/services/tracing/public/cpp/tracing_impl.h" namespace mojo { class ApplicationImpl; @@ -35,6 +36,8 @@ void Create(mojo::ApplicationConnection* connection, mojo::InterfaceRequest<ResourceProvider> request) override; + mojo::TracingImpl tracing_; + mojo::WeakBindingSet<ResourceProvider> bindings_; // The name of the app that the resource provider code lives in. When using
diff --git a/components/signin/core/account_id/account_id.cc b/components/signin/core/account_id/account_id.cc index 65b237fa..e933f4b5 100644 --- a/components/signin/core/account_id/account_id.cc +++ b/components/signin/core/account_id/account_id.cc
@@ -6,7 +6,10 @@ #include <functional> +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" #include "base/memory/singleton.h" +#include "base/values.h" #include "google_apis/gaia/gaia_auth_util.h" namespace { @@ -14,6 +17,10 @@ // Known account types. const char kGoogle[] = "google"; +// Serialization keys +const char kGaiaIdKey[] = "gaia_id"; +const char kEmailKey[] = "email"; + struct GoogleStringSingleton { GoogleStringSingleton() : google(kGoogle) {} @@ -115,6 +122,47 @@ return AccountId(gaia_id, email); } +std::string AccountId::Serialize() const { + base::DictionaryValue value; + value.SetString(kGaiaIdKey, gaia_id_); + value.SetString(kEmailKey, user_email_); + + std::string serialized; + base::JSONWriter::Write(value, &serialized); + return serialized; +} + +// static +bool AccountId::Deserialize(const std::string& serialized, + AccountId* account_id) { + base::JSONReader reader; + scoped_ptr<const base::Value> value(reader.Read(serialized)); + const base::DictionaryValue* dictionary_value = NULL; + + if (!value || !value->GetAsDictionary(&dictionary_value)) + return false; + + std::string gaia_id; + std::string user_email; + + const bool found_gaia_id = dictionary_value->GetString(kGaiaIdKey, &gaia_id); + const bool found_user_email = + dictionary_value->GetString(kEmailKey, &user_email); + + if (!found_gaia_id) + LOG(ERROR) << "gaia_id is not found in '" << serialized << "'"; + + if (!found_user_email) + LOG(ERROR) << "user_email is not found in '" << serialized << "'"; + + if (!found_gaia_id && !found_user_email) + return false; + + *account_id = FromUserEmailGaiaId(user_email, gaia_id); + + return true; +} + const AccountId& EmptyAccountId() { return AccountId::EmptyAccountId::GetInstance()->user_id; }
diff --git a/components/signin/core/account_id/account_id.h b/components/signin/core/account_id/account_id.h index 73be450..9f72030b 100644 --- a/components/signin/core/account_id/account_id.h +++ b/components/signin/core/account_id/account_id.h
@@ -45,8 +45,13 @@ static AccountId FromUserEmailGaiaId(const std::string& user_email, const std::string& gaia_id); - // std::string Serialize() const; - // static AccountId Deserialize(const std::string& serialized); + // These are (for now) unstable and cannot be used to store serialized data to + // persistent storage. Only in-memory storage is safe. + // Serialize() returns JSON dictionary, + // Deserialize() restores AccountId after serialization. + std::string Serialize() const; + static bool Deserialize(const std::string& serialized, + AccountId* out_account_id); private: AccountId();
diff --git a/components/sync_bookmarks/bookmark_change_processor.cc b/components/sync_bookmarks/bookmark_change_processor.cc index dd10e633..0f1a79d3 100644 --- a/components/sync_bookmarks/bookmark_change_processor.cc +++ b/components/sync_bookmarks/bookmark_change_processor.cc
@@ -733,9 +733,6 @@ foster_parent = NULL; } - // The visibility of the mobile node may need to change. - model_associator_->UpdatePermanentNodeVisibility(); - // Notify UI intensive observers of BookmarkModel that all updates have been // applied, and that they may now be consumed. This prevents issues like the // one described in crbug.com/281562, where old and new items on the bookmarks
diff --git a/components/sync_bookmarks/bookmark_model_associator.cc b/components/sync_bookmarks/bookmark_model_associator.cc index 27b5824a..00bf5af 100644 --- a/components/sync_bookmarks/bookmark_model_associator.cc +++ b/components/sync_bookmarks/bookmark_model_associator.cc
@@ -371,26 +371,6 @@ DCHECK(thread_checker_.CalledOnValidThread()); } -void BookmarkModelAssociator::UpdatePermanentNodeVisibility() { - DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(bookmark_model_->loaded()); - - BookmarkNode::Type bookmark_node_types[] = { - BookmarkNode::BOOKMARK_BAR, - BookmarkNode::OTHER_NODE, - BookmarkNode::MOBILE, - }; - for (size_t i = 0; i < arraysize(bookmark_node_types); ++i) { - int64 id = bookmark_model_->PermanentNode(bookmark_node_types[i])->id(); - bookmark_model_->SetPermanentNodeVisible( - bookmark_node_types[i], - id_map_.find(id) != id_map_.end()); - } - - // Note: the root node may have additional extra nodes. Currently their - // visibility is not affected by sync. -} - syncer::SyncError BookmarkModelAssociator::DisassociateModels() { id_map_.clear(); id_map_inverse_.clear(); @@ -437,10 +417,6 @@ const syncer::BaseNode& sync_node) { AddAssociation(node, sync_node.GetId()); - // TODO(stanisc): crbug.com/456876: consider not doing this on every single - // association. - UpdatePermanentNodeVisibility(); - // The same check exists in PersistAssociations. However it is better to // do the check earlier to avoid the cost of decrypting nodes again // in PersistAssociations.
diff --git a/components/sync_bookmarks/bookmark_model_associator.h b/components/sync_bookmarks/bookmark_model_associator.h index 9075a1e..c97e0ad 100644 --- a/components/sync_bookmarks/bookmark_model_associator.h +++ b/components/sync_bookmarks/bookmark_model_associator.h
@@ -60,9 +60,6 @@ bool expect_mobile_bookmarks_folder); ~BookmarkModelAssociator() override; - // Updates the visibility of the permanents node in the BookmarkModel. - void UpdatePermanentNodeVisibility(); - // AssociatorInterface implementation. // // AssociateModels iterates through both the sync and the browser
diff --git a/components/test_runner/test_plugin.cc b/components/test_runner/test_plugin.cc index 76f608c..fed9a2c8 100644 --- a/components/test_runner/test_plugin.cc +++ b/components/test_runner/test_plugin.cc
@@ -312,9 +312,11 @@ gpu::Mailbox mailbox; context_->genMailboxCHROMIUM(mailbox.name); context_->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); + const blink::WGC3Duint64 fence_sync = context_->insertFenceSyncCHROMIUM(); context_->flush(); + gpu::SyncToken sync_token; - context_->insertSyncPoint(sync_token.GetData()); + context_->genSyncTokenCHROMIUM(fence_sync, sync_token.GetData()); texture_mailbox_ = cc::TextureMailbox(mailbox, sync_token, GL_TEXTURE_2D); } else { scoped_ptr<cc::SharedBitmap> bitmap =
diff --git a/components/user_manager/empty_user_info.cc b/components/user_manager/empty_user_info.cc index 08d4a19f..07b4087 100644 --- a/components/user_manager/empty_user_info.cc +++ b/components/user_manager/empty_user_info.cc
@@ -31,7 +31,7 @@ return std::string(); } -AccountId EmptyUserInfo::GetAccountId() const { +const AccountId& EmptyUserInfo::GetAccountId() const { NOTIMPLEMENTED(); return EmptyAccountId(); }
diff --git a/components/user_manager/empty_user_info.h b/components/user_manager/empty_user_info.h index 76c0d16..5fb41c9 100644 --- a/components/user_manager/empty_user_info.h +++ b/components/user_manager/empty_user_info.h
@@ -25,7 +25,7 @@ base::string16 GetDisplayName() const override; base::string16 GetGivenName() const override; std::string GetEmail() const override; - AccountId GetAccountId() const override; + const AccountId& GetAccountId() const override; const gfx::ImageSkia& GetImage() const override; private:
diff --git a/components/user_manager/user.cc b/components/user_manager/user.cc index 39ef430d5..3ead4164 100644 --- a/components/user_manager/user.cc +++ b/components/user_manager/user.cc
@@ -123,9 +123,8 @@ return user_image_.image(); } -AccountId User::GetAccountId() const { - return AccountId::FromUserEmail( - gaia::CanonicalizeEmail(gaia::SanitizeEmail(email()))); +const AccountId& User::GetAccountId() const { + return account_id_; } void User::SetIsChild(bool is_child) {
diff --git a/components/user_manager/user.h b/components/user_manager/user.h index fe0899ef1..71d70166 100644 --- a/components/user_manager/user.h +++ b/components/user_manager/user.h
@@ -97,7 +97,7 @@ base::string16 GetDisplayName() const override; base::string16 GetGivenName() const override; const gfx::ImageSkia& GetImage() const override; - AccountId GetAccountId() const override; + const AccountId& GetAccountId() const override; // Allows managing child status of the user. Used for RegularUser. virtual void SetIsChild(bool is_child);
diff --git a/components/user_manager/user_info.h b/components/user_manager/user_info.h index 2f0cf19..6a692d62 100644 --- a/components/user_manager/user_info.h +++ b/components/user_manager/user_info.h
@@ -36,7 +36,7 @@ virtual std::string GetEmail() const = 0; // Returns AccountId for the user. - virtual AccountId GetAccountId() const = 0; + virtual const AccountId& GetAccountId() const = 0; // Gets the avatar image for the user. virtual const gfx::ImageSkia& GetImage() const = 0;
diff --git a/components/user_manager/user_info_impl.cc b/components/user_manager/user_info_impl.cc index cf6d2ad3..afb2e9d 100644 --- a/components/user_manager/user_info_impl.cc +++ b/components/user_manager/user_info_impl.cc
@@ -10,8 +10,8 @@ namespace user_manager { -UserInfoImpl::UserInfoImpl() { -} +UserInfoImpl::UserInfoImpl() + : account_id_(AccountId::FromUserEmail("stub-user@domain.com")) {} UserInfoImpl::~UserInfoImpl() { } @@ -25,11 +25,11 @@ } std::string UserInfoImpl::GetEmail() const { - return "stub-user@domain.com"; + return account_id_.GetUserEmail(); } -AccountId UserInfoImpl::GetAccountId() const { - return AccountId::FromUserEmail(GetEmail()); +const AccountId& UserInfoImpl::GetAccountId() const { + return account_id_; } const gfx::ImageSkia& UserInfoImpl::GetImage() const {
diff --git a/components/user_manager/user_info_impl.h b/components/user_manager/user_info_impl.h index 4922e36..d2733eb 100644 --- a/components/user_manager/user_info_impl.h +++ b/components/user_manager/user_info_impl.h
@@ -8,6 +8,7 @@ #include <string> #include "base/strings/string16.h" +#include "components/signin/core/account_id/account_id.h" #include "components/user_manager/user_info.h" #include "components/user_manager/user_manager_export.h" #include "ui/gfx/image/image_skia.h" @@ -24,10 +25,11 @@ base::string16 GetDisplayName() const override; base::string16 GetGivenName() const override; std::string GetEmail() const override; - AccountId GetAccountId() const override; + const AccountId& GetAccountId() const override; const gfx::ImageSkia& GetImage() const override; private: + const AccountId account_id_; gfx::ImageSkia user_image_; DISALLOW_COPY_AND_ASSIGN(UserInfoImpl);
diff --git a/components/user_manager/user_manager_base.cc b/components/user_manager/user_manager_base.cc index 81a68ffa2..f51d9b1 100644 --- a/components/user_manager/user_manager_base.cc +++ b/components/user_manager/user_manager_base.cc
@@ -120,13 +120,13 @@ const base::DictionaryValue& dict) { std::string value; - bool has_email = dict.GetString(kCanonicalEmail, &value); - if (has_email && account_id.GetUserEmail() == value) + // TODO(alemate): update code once user id is really a struct. + bool has_gaia_id = dict.GetString(kGAIAIdKey, &value); + if (has_gaia_id && account_id.GetGaiaId() == value) return true; - // TODO(antrim): update code once user id is really a struct. - bool has_gaia_id = dict.GetString(kGAIAIdKey, &value); - if (has_gaia_id && account_id.GetUserEmail() == value) + bool has_email = dict.GetString(kCanonicalEmail, &value); + if (has_email && account_id.GetUserEmail() == value) return true; return false; @@ -582,7 +582,6 @@ UpdateUserAccountLocale(account_id, account_data.locale()); } -// static void UserManagerBase::ParseUserList(const base::ListValue& users_list, const std::set<AccountId>& existing_users, std::vector<AccountId>* users_vector, @@ -595,7 +594,21 @@ LOG(ERROR) << "Corrupt entry in user list at index " << i << "."; continue; } - const AccountId account_id(AccountId::FromUserEmail(email)); + + const AccountId partial_account_id = AccountId::FromUserEmail(email); + AccountId account_id = EmptyAccountId(); + + const bool lookup_result = + GetKnownUserAccountId(partial_account_id, &account_id); + // TODO(alemate): + // DCHECK(lookup_result) << "KnownUser lookup falied for '" << email << "'"; + // (tests do not initialize KnownUserData) + + if (!lookup_result) { + account_id = partial_account_id; + LOG(WARNING) << "KnownUser lookup falied for '" << email << "'"; + } + if (existing_users.find(account_id) != existing_users.end() || !users_set->insert(account_id).second) { LOG(ERROR) << "Duplicate user: " << email; @@ -849,6 +862,7 @@ ChangeUserChildStatus(user, true /* is child */); } } + const AccountId account_id = user->GetAccountId(); user->set_oauth_token_status(LoadUserOAuthStatus(*it)); user->set_force_online_signin(LoadForceOnlineSignin(*it)); user->set_using_saml(FindUsingSAML(*it)); @@ -1152,15 +1166,25 @@ bool UserManagerBase::GetKnownUserAccountId( const AccountId& authenticated_account_id, AccountId* out_account_id) { - DCHECK(!authenticated_account_id.GetGaiaId().empty()); - std::string canonical_email; - if (!GetKnownUserStringPref( - AccountId::FromGaiaId(authenticated_account_id.GetGaiaId()), - kCanonicalEmail, &canonical_email)) + if (!authenticated_account_id.GetGaiaId().empty()) { + std::string canonical_email; + if (!GetKnownUserStringPref( + AccountId::FromGaiaId(authenticated_account_id.GetGaiaId()), + kCanonicalEmail, &canonical_email)) { + return false; + } + + *out_account_id = AccountId::FromUserEmailGaiaId( + canonical_email, authenticated_account_id.GetGaiaId()); + return true; + } + DCHECK(!authenticated_account_id.GetUserEmail().empty()); + std::string gaia_id; + if (!GetKnownUserStringPref(authenticated_account_id, kGAIAIdKey, &gaia_id)) return false; - *out_account_id = authenticated_account_id; - out_account_id->SetUserEmail(canonical_email); + *out_account_id = AccountId::FromUserEmailGaiaId( + authenticated_account_id.GetUserEmail(), gaia_id); return true; }
diff --git a/components/user_manager/user_manager_base.h b/components/user_manager/user_manager_base.h index ead7d449..dd46c5d 100644 --- a/components/user_manager/user_manager_base.h +++ b/components/user_manager/user_manager_base.h
@@ -154,13 +154,13 @@ // TODO(xiyuan): Figure out a better way to expose this info. virtual bool HasPendingBootstrap(const AccountId& account_id) const; - // Helper function that copies users from |users_list| to |users_vector| and + // Helper function that converts users from |users_list| to |users_vector| and // |users_set|. Duplicates and users already present in |existing_users| are // skipped. - static void ParseUserList(const base::ListValue& users_list, - const std::set<AccountId>& existing_users, - std::vector<AccountId>* users_vector, - std::set<AccountId>* users_set); + void ParseUserList(const base::ListValue& users_list, + const std::set<AccountId>& existing_users, + std::vector<AccountId>* users_vector, + std::set<AccountId>* users_set); // Returns true if trusted device policies have successfully been retrieved // and ephemeral users are enabled.
diff --git a/components/web_view/BUILD.gn b/components/web_view/BUILD.gn index cb80c43..569cc4b 100644 --- a/components/web_view/BUILD.gn +++ b/components/web_view/BUILD.gn
@@ -66,6 +66,7 @@ "//mojo/converters/geometry", "//mojo/public/cpp/bindings", "//mojo/services/network/public/interfaces", + "//mojo/services/tracing/public/cpp", "//mojo/services/tracing/public/interfaces", "//url", ]
diff --git a/components/web_view/DEPS b/components/web_view/DEPS index 32714a9..7d07d3d 100644 --- a/components/web_view/DEPS +++ b/components/web_view/DEPS
@@ -11,6 +11,7 @@ "+mojo/converters/geometry", "+mojo/public", "+mojo/services/network/public/interfaces", + "+mojo/services/tracing/public/cpp", "+mojo/services/tracing/public/interfaces", "+mojo/util", ]
diff --git a/components/web_view/web_view_application_delegate.cc b/components/web_view/web_view_application_delegate.cc index ab0f7dd..2a4c48e 100644 --- a/components/web_view/web_view_application_delegate.cc +++ b/components/web_view/web_view_application_delegate.cc
@@ -14,6 +14,7 @@ void WebViewApplicationDelegate::Initialize(mojo::ApplicationImpl* app) { app_ = app; + tracing_.Initialize(app); } bool WebViewApplicationDelegate::ConfigureIncomingConnection(
diff --git a/components/web_view/web_view_application_delegate.h b/components/web_view/web_view_application_delegate.h index c8bbf152..a5482bac 100644 --- a/components/web_view/web_view_application_delegate.h +++ b/components/web_view/web_view_application_delegate.h
@@ -10,6 +10,7 @@ #include "mojo/application/public/cpp/application_delegate.h" #include "mojo/application/public/cpp/interface_factory.h" #include "mojo/common/weak_binding_set.h" +#include "mojo/services/tracing/public/cpp/tracing_impl.h" namespace web_view { @@ -36,6 +37,7 @@ mojo::InterfaceRequest<mojom::WebViewFactory> request) override; mojo::ApplicationImpl* app_; + mojo::TracingImpl tracing_; mojo::WeakBindingSet<WebViewFactory> factory_bindings_;
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 9990e72..e98e681 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -421,7 +421,13 @@ "//ui/strings", "//ui/views/mus:for_component", "//ui/wm", + "//components/bitmap_uploader", ] + sources += [ + "compositor/software_output_device_mus.cc", + "compositor/software_output_device_mus.h", + ] + defines += [ "MOJO_RUNNER_CLIENT" ] } else { # Not aura. sources -= [ "media/capture/cursor_renderer_aura.cc",
diff --git a/content/browser/android/content_startup_flags.cc b/content/browser/android/content_startup_flags.cc index 8c2e541b..04cf9e94 100644 --- a/content/browser/android/content_startup_flags.cc +++ b/content/browser/android/content_startup_flags.cc
@@ -10,7 +10,7 @@ #include "base/logging.h" #include "base/sys_info.h" #include "cc/base/switches.h" -#include "cc/trees/layer_tree_settings.h" +#include "cc/layers/layer_settings.h" #include "content/public/browser/android/compositor.h" #include "content/public/common/content_switches.h" #include "gpu/command_buffer/service/gpu_switches.h"
diff --git a/content/browser/background_sync/background_sync_browsertest.cc b/content/browser/background_sync/background_sync_browsertest.cc index 6e30cc5..1ec713c2 100644 --- a/content/browser/background_sync/background_sync_browsertest.cc +++ b/content/browser/background_sync/background_sync_browsertest.cc
@@ -21,6 +21,7 @@ #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_switches.h" +#include "content/public/test/background_sync_test_util.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test.h" #include "content/public/test/content_browser_test_utils.h" @@ -110,7 +111,8 @@ ~BackgroundSyncBrowserTest() override {} void SetUp() override { - BackgroundSyncNetworkObserver::SetIgnoreNetworkChangeNotifierForTests(true); + background_sync_test_util::SetIgnoreNetworkChangeNotifier(true); + ContentBrowserTest::SetUp(); } @@ -128,6 +130,8 @@ return GetStorage()->GetBackgroundSyncContext(); } + WebContents* web_contents() { return shell_->web_contents(); } + void SetUpCommandLine(base::CommandLine* command_line) override { // TODO(jkarlin): Remove this once background sync is no longer // experimental. @@ -143,7 +147,7 @@ SetIncognitoMode(false); SetMaxSyncAttempts(1); - SetOnline(true); + background_sync_test_util::SetOnline(web_contents(), true); ASSERT_TRUE(LoadTestPage(kDefaultTestURL)); ContentBrowserTest::SetUpOnMainThread(); @@ -156,18 +160,10 @@ } bool RunScript(const std::string& script, std::string* result) { - return content::ExecuteScriptAndExtractString(shell_->web_contents(), - script, result); + return content::ExecuteScriptAndExtractString(web_contents(), script, + result); } - // This runs asynchronously on the IO thread, but we don't need to wait for it - // to complete before running a background sync operation, since those also - // run on the IO thread. - void SetOnline(bool online); - void SetOnlineOnIOThread( - const scoped_refptr<BackgroundSyncContext>& sync_context, - bool online); - // Returns true if the one-shot sync with tag is currently pending. Fails // (assertion failure) if the tag isn't registered. bool OneShotPending(const std::string& tag); @@ -199,31 +195,6 @@ DISALLOW_COPY_AND_ASSIGN(BackgroundSyncBrowserTest); }; -void BackgroundSyncBrowserTest::SetOnline(bool online) { - ASSERT_TRUE(shell_); - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - base::Bind(&BackgroundSyncBrowserTest::SetOnlineOnIOThread, - base::Unretained(this), base::Unretained(GetSyncContext()), - online)); - base::RunLoop().RunUntilIdle(); -} - -void BackgroundSyncBrowserTest::SetOnlineOnIOThread( - const scoped_refptr<BackgroundSyncContext>& sync_context, - bool online) { - BackgroundSyncManager* sync_manager = sync_context->background_sync_manager(); - BackgroundSyncNetworkObserver* network_observer = - sync_manager->GetNetworkObserverForTesting(); - if (online) { - network_observer->NotifyManagerIfNetworkChangedForTesting( - NetworkChangeNotifier::CONNECTION_WIFI); - } else { - network_observer->NotifyManagerIfNetworkChangedForTesting( - NetworkChangeNotifier::CONNECTION_NONE); - } -} - bool BackgroundSyncBrowserTest::OneShotPending(const std::string& tag) { bool is_pending; base::RunLoop run_loop; @@ -406,13 +377,13 @@ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. // Prevent firing by going offline. - SetOnline(false); + background_sync_test_util::SetOnline(web_contents(), false); EXPECT_TRUE(RegisterOneShot("foo")); EXPECT_TRUE(GetRegistrationOneShot("foo")); EXPECT_TRUE(OneShotPending("foo")); // Resume firing by going online. - SetOnline(true); + background_sync_test_util::SetOnline(web_contents(), true); EXPECT_TRUE(PopConsole("foo fired")); EXPECT_FALSE(GetRegistrationOneShot("foo")); } @@ -421,7 +392,7 @@ EXPECT_TRUE(RegisterServiceWorker()); EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. - SetOnline(true); + background_sync_test_util::SetOnline(web_contents(), true); EXPECT_TRUE(RegisterOneShot("delay")); // Verify that it is firing. @@ -440,7 +411,7 @@ EXPECT_TRUE(RegisterServiceWorker()); EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. - SetOnline(true); + background_sync_test_util::SetOnline(web_contents(), true); EXPECT_TRUE(RegisterOneShot("delay")); // Verify that it is firing. @@ -457,7 +428,7 @@ EXPECT_TRUE(RegisterServiceWorker()); EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. - SetOnline(false); + background_sync_test_util::SetOnline(web_contents(), false); EXPECT_TRUE(RegisterOneShot("normal")); EXPECT_TRUE(OneShotPending("normal")); @@ -467,7 +438,7 @@ // Tell the new network observer that we're offline (it initializes from // NetworkChangeNotifier::GetCurrentConnectionType() which is not mocked out // in this test). - SetOnline(false); + background_sync_test_util::SetOnline(web_contents(), false); EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); EXPECT_TRUE(RegisterServiceWorker()); @@ -493,7 +464,7 @@ std::vector<std::string> registered_tags; EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); - SetOnline(false); + background_sync_test_util::SetOnline(web_contents(), false); registered_tags.push_back("foo"); registered_tags.push_back("bar"); @@ -512,7 +483,7 @@ std::vector<std::string> registered_tags; EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); - SetOnline(false); + background_sync_test_util::SetOnline(web_contents(), false); registered_tags.push_back("foo_sw"); registered_tags.push_back("bar_sw"); @@ -533,7 +504,7 @@ std::vector<std::string> registered_tags; EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); - SetOnline(false); + background_sync_test_util::SetOnline(web_contents(), false); EXPECT_TRUE(RegisterOneShotFromServiceWorker("foo_sw")); EXPECT_TRUE(PopConsole("ok - foo_sw registered in SW")); @@ -548,7 +519,7 @@ EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. // Prevent firing by going offline. - SetOnline(false); + background_sync_test_util::SetOnline(web_contents(), false); EXPECT_TRUE(RegisterOneShot("foo")); EXPECT_TRUE(GetRegistrationOneShot("foo")); EXPECT_TRUE(OneShotPending("foo")); @@ -570,7 +541,7 @@ std::vector<std::string> registered_tags; EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); - SetOnline(false); + background_sync_test_util::SetOnline(web_contents(), false); EXPECT_TRUE(RegisterOneShotFromServiceWorker("foo_sw")); EXPECT_TRUE(PopConsole("ok - foo_sw registered in SW")); @@ -593,7 +564,7 @@ std::vector<std::string> registered_tags; EXPECT_TRUE(GetRegistrationsOneShot(registered_tags)); - SetOnline(false); + background_sync_test_util::SetOnline(web_contents(), false); registered_tags.push_back("foo"); registered_tags.push_back("bar"); @@ -620,7 +591,7 @@ EXPECT_TRUE(RegisterServiceWorker()); EXPECT_TRUE(LoadTestPage(kDefaultTestURL)); // Control the page. - SetOnline(true); + background_sync_test_util::SetOnline(web_contents(), true); EXPECT_TRUE(RegisterOneShot("delay")); // Verify that it is firing.
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc index 1e3d416..138f205b 100644 --- a/content/browser/background_sync/background_sync_manager_unittest.cc +++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -25,6 +25,7 @@ #include "content/browser/service_worker/service_worker_storage.h" #include "content/browser/storage_partition_impl.h" #include "content/public/browser/background_sync_controller.h" +#include "content/public/test/background_sync_test_util.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_browser_thread_bundle.h" #include "net/base/network_change_notifier.h" @@ -289,7 +290,7 @@ void SetUp() override { // Don't let the tests be confused by the real-world device connectivity - BackgroundSyncNetworkObserver::SetIgnoreNetworkChangeNotifierForTests(true); + background_sync_test_util::SetIgnoreNetworkChangeNotifier(true); // TODO(jkarlin): Create a new object with all of the necessary SW calls // so that we can inject test versions instead of bringing up all of this @@ -328,8 +329,7 @@ void TearDown() override { // Restore the network observer functionality for subsequent tests - BackgroundSyncNetworkObserver::SetIgnoreNetworkChangeNotifierForTests( - false); + background_sync_test_util::SetIgnoreNetworkChangeNotifier(false); } void RegisterServiceWorkers() {
diff --git a/content/browser/background_sync/background_sync_service_impl_unittest.cc b/content/browser/background_sync/background_sync_service_impl_unittest.cc index 916c4cb..c43937e57 100644 --- a/content/browser/background_sync/background_sync_service_impl_unittest.cc +++ b/content/browser/background_sync/background_sync_service_impl_unittest.cc
@@ -15,6 +15,7 @@ #include "content/browser/service_worker/embedded_worker_test_helper.h" #include "content/browser/service_worker/service_worker_context_wrapper.h" #include "content/public/browser/browser_thread.h" +#include "content/public/test/background_sync_test_util.h" #include "content/public/test/test_browser_thread_bundle.h" #include "mojo/public/cpp/bindings/interface_ptr.h" #include "net/base/network_change_notifier.h" @@ -108,7 +109,7 @@ void SetUp() override { // Don't let the tests be confused by the real-world device connectivity - BackgroundSyncNetworkObserver::SetIgnoreNetworkChangeNotifierForTests(true); + background_sync_test_util::SetIgnoreNetworkChangeNotifier(true); CreateTestHelper(); CreateBackgroundSyncContext(); @@ -125,8 +126,7 @@ background_sync_context_ = nullptr; // Restore the network observer functionality for subsequent tests - BackgroundSyncNetworkObserver::SetIgnoreNetworkChangeNotifierForTests( - false); + background_sync_test_util::SetIgnoreNetworkChangeNotifier(false); } // SetUp helper methods
diff --git a/content/browser/compositor/DEPS b/content/browser/compositor/DEPS index 1701f72..70240ed 100644 --- a/content/browser/compositor/DEPS +++ b/content/browser/compositor/DEPS
@@ -1,3 +1,4 @@ include_rules = [ - "+ui/platform_window", + "+components/bitmap_uploader", + "+ui/platform_window", ]
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc index 7e2c513b9..2b9cd696 100644 --- a/content/browser/compositor/gpu_process_transport_factory.cc +++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -28,6 +28,7 @@ #include "content/browser/compositor/offscreen_browser_compositor_output_surface.h" #include "content/browser/compositor/reflector_impl.h" #include "content/browser/compositor/software_browser_compositor_output_surface.h" +#include "content/browser/compositor/software_output_device_mus.h" #include "content/browser/gpu/browser_gpu_channel_host_factory.h" #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" #include "content/browser/gpu/compositor_util.h" @@ -148,6 +149,14 @@ scoped_ptr<cc::SoftwareOutputDevice> GpuProcessTransportFactory::CreateSoftwareOutputDevice( ui::Compositor* compositor) { +#if defined(MOJO_RUNNER_CLIENT) + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + "mojo-platform-channel-handle")) { + return scoped_ptr<cc::SoftwareOutputDevice>( + new SoftwareOutputDeviceMus(compositor)); + } +#endif + #if defined(OS_WIN) return scoped_ptr<cc::SoftwareOutputDevice>( new SoftwareOutputDeviceWin(software_backing_.get(), compositor)); @@ -192,6 +201,16 @@ } static bool ShouldCreateGpuOutputSurface(ui::Compositor* compositor) { +#if defined(MOJO_RUNNER_CLIENT) + // Chrome running as a mojo app currently can only use software compositing. + // TODO(rjkroege): http://crbug.com/548451 + // TODO(rjkroege): Make IsRunningInMojoRunner callable from content. + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + "mojo-platform-channel-handle")) { + return false; + } +#endif + #if defined(OS_CHROMEOS) // Software fallback does not happen on Chrome OS. return true;
diff --git a/content/browser/compositor/software_output_device_mus.cc b/content/browser/compositor/software_output_device_mus.cc new file mode 100644 index 0000000..6180114f5 --- /dev/null +++ b/content/browser/compositor/software_output_device_mus.cc
@@ -0,0 +1,64 @@ +// Copyright 2015 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 "content/browser/compositor/software_output_device_mus.h" + +#include "components/bitmap_uploader/bitmap_uploader.h" +#include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkDevice.h" +#include "ui/base/view_prop.h" +#include "ui/compositor/compositor.h" +#include "ui/gfx/skia_util.h" + +#if !defined(OFFICIAL_BUILD) +#include "base/threading/thread_restrictions.h" +#endif + +namespace content { + +SoftwareOutputDeviceMus::SoftwareOutputDeviceMus(ui::Compositor* compositor) + : compositor_(compositor) {} + +void SoftwareOutputDeviceMus::EndPaint() { + SoftwareOutputDevice::EndPaint(); +#if !defined(OFFICIAL_BUILD) + base::ThreadRestrictions::ScopedAllowWait wait; +#endif + + if (!surface_) + return; + + gfx::Rect rect = damage_rect_; + rect.Intersect(gfx::Rect(viewport_pixel_size_)); + if (rect.IsEmpty()) + return; + + gfx::AcceleratedWidget widget = compositor_->widget(); + bitmap_uploader::BitmapUploader* uploader = + reinterpret_cast<bitmap_uploader::BitmapUploader*>(ui::ViewProp::GetValue( + widget, bitmap_uploader::kBitmapUploaderForAcceleratedWidget)); + DCHECK(uploader); + + SkImageInfo info; + size_t rowBytes; + const void* addr = surface_->peekPixels(&info, &rowBytes); + + if (!addr) { + LOG(WARNING) << "SoftwareOutputDeviceMus: skia surface did not provide us " + "with pixels"; + return; + } + + const unsigned char* pixels = static_cast<const unsigned char*>(addr); + + // TODO(rjkroege): This makes an additional copy. Improve the + // bitmap_uploader API to remove. + scoped_ptr<std::vector<unsigned char>> data(new std::vector<unsigned char>( + pixels, pixels + rowBytes * viewport_pixel_size_.height())); + uploader->SetBitmap(viewport_pixel_size_.width(), + viewport_pixel_size_.height(), data.Pass(), + bitmap_uploader::BitmapUploader::BGRA); +} + +} // namespace content
diff --git a/content/browser/compositor/software_output_device_mus.h b/content/browser/compositor/software_output_device_mus.h new file mode 100644 index 0000000..d4a2e450 --- /dev/null +++ b/content/browser/compositor/software_output_device_mus.h
@@ -0,0 +1,36 @@ +// Copyright 2015 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. + +#ifndef CONTENT_BROWSER_COMPOSITOR_SOFTWARE_OUTPUT_DEVICE_MUS_H_ +#define CONTENT_BROWSER_COMPOSITOR_SOFTWARE_OUTPUT_DEVICE_MUS_H_ + +#include "base/macros.h" +#include "cc/output/software_output_device.h" +#include "content/common/content_export.h" + +namespace ui { +class Compositor; +} + +namespace content { + +// Mus implementation of software compositing: Chrome will do a software +// composite and ship the resultant bitmap to an instance of the mus +// window server. Remove this upon completion of http://crbug.com/548451 +class SoftwareOutputDeviceMus : public cc::SoftwareOutputDevice { + public: + explicit SoftwareOutputDeviceMus(ui::Compositor* compositor); + + private: + // cc::SoftwareOutputDevice + void EndPaint() override; + + ui::Compositor* compositor_; + + DISALLOW_COPY_AND_ASSIGN(SoftwareOutputDeviceMus); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_COMPOSITOR_SOFTWARE_OUTPUT_DEVICE_MUS_H_
diff --git a/content/browser/devtools/protocol/security_handler.cc b/content/browser/devtools/protocol/security_handler.cc index 50cf64f..7784651 100644 --- a/content/browser/devtools/protocol/security_handler.cc +++ b/content/browser/devtools/protocol/security_handler.cc
@@ -99,8 +99,8 @@ AddExplanations(kSecurityStateInsecure, security_style_explanations.broken_explanations, &explanations); - AddExplanations(kSecurityStateWarning, - security_style_explanations.warning_explanations, + AddExplanations(kSecurityStateNeutral, + security_style_explanations.unauthenticated_explanations, &explanations); AddExplanations(kSecurityStateSecure, security_style_explanations.secure_explanations,
diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.cc b/content/browser/renderer_host/legacy_render_widget_host_win.cc index 7f8abacc..bd0101d1 100644 --- a/content/browser/renderer_host/legacy_render_widget_host_win.cc +++ b/content/browser/renderer_host/legacy_render_widget_host_win.cc
@@ -13,10 +13,10 @@ #include "content/browser/renderer_host/render_widget_host_view_aura.h" #include "content/public/browser/browser_accessibility_state.h" #include "content/public/common/content_switches.h" +#include "ui/base/touch/touch_enabled.h" #include "ui/base/view_prop.h" #include "ui/base/win/internal_constants.h" #include "ui/base/win/window_event_target.h" -#include "ui/events/base_event_utils.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/win/direct_manipulation.h" #include "ui/gfx/win/dpi.h"
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index a3dcee9..29e5e68 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -79,8 +79,8 @@ #include "storage/browser/fileapi/isolated_context.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/base/touch/touch_device.h" +#include "ui/base/touch/touch_enabled.h" #include "ui/base/ui_base_switches.h" -#include "ui/events/base_event_utils.h" #include "ui/gfx/image/image_skia.h" #include "ui/gfx/native_widget_types.h" #include "ui/native_theme/native_theme_switches.h"
diff --git a/content/browser/renderer_host/render_widget_host_delegate.h b/content/browser/renderer_host/render_widget_host_delegate.h index a96428c..604a3ac 100644 --- a/content/browser/renderer_host/render_widget_host_delegate.h +++ b/content/browser/renderer_host/render_widget_host_delegate.h
@@ -5,6 +5,8 @@ #ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_DELEGATE_H_ #define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_DELEGATE_H_ +#include <vector> + #include "base/basictypes.h" #include "build/build_config.h" #include "content/common/content_export.h" @@ -163,6 +165,11 @@ virtual gfx::NativeViewAccessible GetParentNativeViewAccessible(); #endif + // Called when the widget has sent a compositor proto. This is used in Blimp + // mode with the RemoteChannel compositor. + virtual void ForwardCompositorProto(RenderWidgetHostImpl* render_widget_host, + const std::vector<uint8_t>& proto) {} + protected: virtual ~RenderWidgetHostDelegate() {} };
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 7f6269c..14633dc 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -477,6 +477,8 @@ OnImeCompositionRangeChanged) IPC_MESSAGE_HANDLER(ViewHostMsg_DidFirstPaintAfterLoad, OnFirstPaintAfterLoad) + IPC_MESSAGE_HANDLER(ViewHostMsg_ForwardCompositorProto, + OnForwardCompositorProto) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() @@ -1274,6 +1276,12 @@ return false; } +void RenderWidgetHostImpl::HandleCompositorProto( + const std::vector<uint8_t>& proto) { + DCHECK(!proto.empty()); + Send(new ViewMsg_HandleCompositorProto(GetRoutingID(), proto)); +} + void RenderWidgetHostImpl::NotifyScreenInfoChanged() { color_profile_out_of_date_ = true; @@ -1312,6 +1320,12 @@ } } +void RenderWidgetHostImpl::OnForwardCompositorProto( + const std::vector<uint8_t>& proto) { + if (delegate_) + delegate_->ForwardCompositorProto(this, proto); +} + void RenderWidgetHostImpl::UpdateVSyncParameters(base::TimeTicks timebase, base::TimeDelta interval) { Send(new ViewMsg_UpdateVSyncParameters(GetRoutingID(), timebase, interval));
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index 76f1f4d..678c422 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -159,6 +159,7 @@ void RemoveMouseEventCallback(const MouseEventCallback& callback) override; void GetWebScreenInfo(blink::WebScreenInfo* result) override; bool GetScreenColorProfile(std::vector<char>* color_profile) override; + void HandleCompositorProto(const std::vector<uint8_t>& proto) override; // Notification that the screen info has changed. void NotifyScreenInfoChanged(); @@ -589,6 +590,7 @@ const gfx::Range& range); void OnSelectionBoundsChanged( const ViewHostMsg_SelectionBounds_Params& params); + void OnForwardCompositorProto(const std::vector<uint8_t>& proto); // Called (either immediately or asynchronously) after we're done with our // BackingStore and can send an ACK to the renderer so it can paint onto it
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index fdd38e2..878fdb7b 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -880,7 +880,7 @@ } void WebContentsImpl::EnableTreeOnlyAccessibilityMode() { - if (GetAccessibilityMode() == AccessibilityModeTreeOnly) + if (GetAccessibilityMode() != AccessibilityModeOff) ForEachFrame(base::Bind(&ResetAccessibility)); else AddAccessibilityMode(AccessibilityModeTreeOnly); @@ -1696,6 +1696,16 @@ delegate_->LostMouseLock(); } +void WebContentsImpl::ForwardCompositorProto( + RenderWidgetHostImpl* render_widget_host, + const std::vector<uint8_t>& proto) { + if (render_widget_host != GetRenderViewHost()->GetWidget()) + return; + + if (delegate_) + delegate_->ForwardCompositorProto(proto); +} + void WebContentsImpl::CreateNewWindow( SiteInstance* source_site_instance, int32_t route_id,
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 8fc9649..f8d02c9 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -602,6 +602,8 @@ RenderWidgetHostImpl* render_widget_host) const override; void LostCapture(RenderWidgetHostImpl* render_widget_host) override; void LostMouseLock(RenderWidgetHostImpl* render_widget_host) override; + void ForwardCompositorProto(RenderWidgetHostImpl* render_widget_host, + const std::vector<uint8_t>& proto) override; // RenderFrameHostManager::Delegate ------------------------------------------
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index fbe711a..be9766f7 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -5,6 +5,7 @@ import("//build/config/features.gni") import("//build/config/ui.gni") import("//content/common/common.gni") +import("//media/media_options.gni") import("//mojo/public/tools/bindings/mojom.gni") if (is_mac) { import("//build/config/mac/mac_sdk.gni") @@ -368,6 +369,10 @@ "gpu/media/android_video_encode_accelerator.h", ] } + + if (enable_mojo_media == "gpu") { + deps += [ "//media/mojo/services:application" ] + } } if (is_chromeos) {
diff --git a/content/common/gpu/client/gl_helper_unittest.cc b/content/common/gpu/client/gl_helper_unittest.cc index e5382931..15b119c 100644 --- a/content/common/gpu/client/gl_helper_unittest.cc +++ b/content/common/gpu/client/gl_helper_unittest.cc
@@ -1363,8 +1363,12 @@ context_->genMailboxCHROMIUM(mailbox.name); EXPECT_FALSE(mailbox.IsZero()); context_->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); + const blink::WGC3Duint64 fence_sync = context_->insertFenceSyncCHROMIUM(); + context_->shallowFlushCHROMIUM(); + gpu::SyncToken sync_token; - ASSERT_TRUE(context_->insertSyncPoint(sync_token.GetData())); + ASSERT_TRUE(context_->genSyncTokenCHROMIUM(fence_sync, + sync_token.GetData())); std::string message = base::StringPrintf( "input size: %dx%d "
diff --git a/content/common/gpu/client/gpu_context_tests.h b/content/common/gpu/client/gpu_context_tests.h index 814f59a0..372c34e 100644 --- a/content/common/gpu/client/gpu_context_tests.h +++ b/content/common/gpu/client/gpu_context_tests.h
@@ -23,9 +23,9 @@ } // These tests should time out if the callback doesn't get called. - void TestSignalSyncPoint(unsigned sync_point) { + void TestSignalSyncToken(const gpu::SyncToken& sync_token) { base::RunLoop run_loop; - context_support_->SignalSyncPoint(sync_point, run_loop.QuitClosure()); + context_support_->SignalSyncToken(sync_token, run_loop.QuitClosure()); run_loop.Run(); } @@ -40,22 +40,39 @@ } }; -CONTEXT_TEST_F(SignalTest, BasicSignalSyncPointTest) { +CONTEXT_TEST_F(SignalTest, BasicSignalSyncTokenTest) { if (!context_) return; + const blink::WGC3Duint64 fence_sync = context_->insertFenceSyncCHROMIUM(); + context_->shallowFlushCHROMIUM(); + gpu::SyncToken sync_token; - ASSERT_TRUE(context_->insertSyncPoint(sync_token.GetData())); - TestSignalSyncPoint(static_cast<unsigned>(sync_token.release_count())); + ASSERT_TRUE(context_->genSyncTokenCHROMIUM(fence_sync, sync_token.GetData())); + + TestSignalSyncToken(sync_token); }; -CONTEXT_TEST_F(SignalTest, InvalidSignalSyncPointTest) { +CONTEXT_TEST_F(SignalTest, EmptySignalSyncTokenTest) { if (!context_) return; // Signalling something that doesn't exist should run the callback // immediately. - TestSignalSyncPoint(1297824234); + gpu::SyncToken sync_token; + TestSignalSyncToken(sync_token); +}; + +CONTEXT_TEST_F(SignalTest, InvalidSignalSyncTokenTest) { + if (!context_) + return; + + // Signalling something that doesn't exist should run the callback + // immediately. + gpu::SyncToken sync_token(gpu::CommandBufferNamespace::GPU_IO, + 1297824234, + 9123743439); + TestSignalSyncToken(sync_token); }; CONTEXT_TEST_F(SignalTest, BasicSignalQueryTest) {
diff --git a/content/common/gpu/image_transport_surface.cc b/content/common/gpu/image_transport_surface.cc index 2702d8c..6e2bcae 100644 --- a/content/common/gpu/image_transport_surface.cc +++ b/content/common/gpu/image_transport_surface.cc
@@ -166,69 +166,48 @@ } gfx::SwapResult PassThroughImageTransportSurface::SwapBuffers() { - // GetVsyncValues before SwapBuffers to work around Mali driver bug: - // crbug.com/223558. - SendVSyncUpdateIfAvailable(); + scoped_ptr<std::vector<ui::LatencyInfo>> latency_info = StartSwapBuffers(); + gfx::SwapResult result = gfx::GLSurfaceAdapter::SwapBuffers(); + FinishSwapBuffers(latency_info.Pass(), result); + return result; +} - base::TimeTicks swap_time = base::TimeTicks::Now(); - for (auto& latency : latency_info_) { - latency.AddLatencyNumberWithTimestamp( - ui::INPUT_EVENT_GPU_SWAP_BUFFER_COMPONENT, 0, 0, swap_time, 1); - } +void PassThroughImageTransportSurface::SwapBuffersAsync( + const GLSurface::SwapCompletionCallback& callback) { + scoped_ptr<std::vector<ui::LatencyInfo>> latency_info = StartSwapBuffers(); // We use WeakPtr here to avoid manual management of life time of an instance // of this class. Callback will not be called once the instance of this class // is destroyed. However, this also means that the callback can be run on // the calling thread only. - std::vector<ui::LatencyInfo>* latency_info_ptr = - new std::vector<ui::LatencyInfo>(); - latency_info_ptr->swap(latency_info_); - return gfx::GLSurfaceAdapter::SwapBuffersAsync(base::Bind( - &PassThroughImageTransportSurface::SwapBuffersCallBack, - weak_ptr_factory_.GetWeakPtr(), base::Owned(latency_info_ptr))) - ? gfx::SwapResult::SWAP_ACK - : gfx::SwapResult::SWAP_FAILED; + gfx::GLSurfaceAdapter::SwapBuffersAsync(base::Bind( + &PassThroughImageTransportSurface::FinishSwapBuffersAsync, + weak_ptr_factory_.GetWeakPtr(), base::Passed(&latency_info), callback)); } gfx::SwapResult PassThroughImageTransportSurface::PostSubBuffer(int x, int y, int width, int height) { - SendVSyncUpdateIfAvailable(); - - base::TimeTicks swap_time = base::TimeTicks::Now(); - for (auto& latency : latency_info_) { - latency.AddLatencyNumberWithTimestamp( - ui::INPUT_EVENT_GPU_SWAP_BUFFER_COMPONENT, 0, 0, swap_time, 1); - } - - // We use WeakPtr here to avoid manual management of life time of an instance - // of this class. Callback will not be called once the instance of this class - // is destroyed. However, this also means that the callback can be run on - // the calling thread only. - std::vector<ui::LatencyInfo>* latency_info_ptr = - new std::vector<ui::LatencyInfo>(); - latency_info_ptr->swap(latency_info_); - return gfx::GLSurfaceAdapter::PostSubBufferAsync( - x, y, width, height, - base::Bind(&PassThroughImageTransportSurface::SwapBuffersCallBack, - weak_ptr_factory_.GetWeakPtr(), - base::Owned(latency_info_ptr))) - ? gfx::SwapResult::SWAP_ACK - : gfx::SwapResult::SWAP_FAILED; + scoped_ptr<std::vector<ui::LatencyInfo>> latency_info = StartSwapBuffers(); + gfx::SwapResult result = + gfx::GLSurfaceAdapter::PostSubBuffer(x, y, width, height); + FinishSwapBuffers(latency_info.Pass(), result); + return result; } -void PassThroughImageTransportSurface::SwapBuffersCallBack( - std::vector<ui::LatencyInfo>* latency_info_ptr, - gfx::SwapResult result) { - base::TimeTicks swap_ack_time = base::TimeTicks::Now(); - for (auto& latency : *latency_info_ptr) { - latency.AddLatencyNumberWithTimestamp( - ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0, - swap_ack_time, 1); - } - - helper_->stub()->SendSwapBuffersCompleted(*latency_info_ptr, result); +void PassThroughImageTransportSurface::PostSubBufferAsync( + int x, + int y, + int width, + int height, + const GLSurface::SwapCompletionCallback& callback) { + scoped_ptr<std::vector<ui::LatencyInfo>> latency_info = StartSwapBuffers(); + gfx::GLSurfaceAdapter::PostSubBufferAsync( + x, y, width, height, + base::Bind(&PassThroughImageTransportSurface::FinishSwapBuffersAsync, + weak_ptr_factory_.GetWeakPtr(), base::Passed(&latency_info), + callback)); } bool PassThroughImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { @@ -261,4 +240,44 @@ } } +scoped_ptr<std::vector<ui::LatencyInfo>> +PassThroughImageTransportSurface::StartSwapBuffers() { + // GetVsyncValues before SwapBuffers to work around Mali driver bug: + // crbug.com/223558. + SendVSyncUpdateIfAvailable(); + + base::TimeTicks swap_time = base::TimeTicks::Now(); + for (auto& latency : latency_info_) { + latency.AddLatencyNumberWithTimestamp( + ui::INPUT_EVENT_GPU_SWAP_BUFFER_COMPONENT, 0, 0, swap_time, 1); + } + + scoped_ptr<std::vector<ui::LatencyInfo>> latency_info( + new std::vector<ui::LatencyInfo>()); + latency_info->swap(latency_info_); + + return latency_info; +} + +void PassThroughImageTransportSurface::FinishSwapBuffers( + scoped_ptr<std::vector<ui::LatencyInfo>> latency_info, + gfx::SwapResult result) { + base::TimeTicks swap_ack_time = base::TimeTicks::Now(); + for (auto& latency : *latency_info) { + latency.AddLatencyNumberWithTimestamp( + ui::INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT, 0, 0, + swap_ack_time, 1); + } + + helper_->stub()->SendSwapBuffersCompleted(*latency_info, result); +} + +void PassThroughImageTransportSurface::FinishSwapBuffersAsync( + scoped_ptr<std::vector<ui::LatencyInfo>> latency_info, + GLSurface::SwapCompletionCallback callback, + gfx::SwapResult result) { + FinishSwapBuffers(latency_info.Pass(), result); + callback.Run(result); +} + } // namespace content
diff --git a/content/common/gpu/image_transport_surface.h b/content/common/gpu/image_transport_surface.h index f119cd9..97ad4a0 100644 --- a/content/common/gpu/image_transport_surface.h +++ b/content/common/gpu/image_transport_surface.h
@@ -168,7 +168,13 @@ bool Initialize() override; void Destroy() override; gfx::SwapResult SwapBuffers() override; + void SwapBuffersAsync(const SwapCompletionCallback& callback) override; gfx::SwapResult PostSubBuffer(int x, int y, int width, int height) override; + void PostSubBufferAsync(int x, + int y, + int width, + int height, + const SwapCompletionCallback& callback) override; bool OnMakeCurrent(gfx::GLContext* context) override; // ImageTransportSurface implementation. @@ -186,8 +192,14 @@ // If updated vsync parameters can be determined, send this information to // the browser. virtual void SendVSyncUpdateIfAvailable(); - void SwapBuffersCallBack(std::vector<ui::LatencyInfo>* latency_info_ptr, - gfx::SwapResult result); + + scoped_ptr<std::vector<ui::LatencyInfo>> StartSwapBuffers(); + void FinishSwapBuffers(scoped_ptr<std::vector<ui::LatencyInfo>> latency_info, + gfx::SwapResult result); + void FinishSwapBuffersAsync( + scoped_ptr<std::vector<ui::LatencyInfo>> latency_info, + GLSurface::SwapCompletionCallback callback, + gfx::SwapResult result); ImageTransportHelper* GetHelper() { return helper_.get(); }
diff --git a/content/common/gpu/media/android_video_decode_accelerator.cc b/content/common/gpu/media/android_video_decode_accelerator.cc index 8a0f7db1..3f1e8774 100644 --- a/content/common/gpu/media/android_video_decode_accelerator.cc +++ b/content/common/gpu/media/android_video_decode_accelerator.cc
@@ -21,6 +21,11 @@ #include "ui/gl/android/surface_texture.h" #include "ui/gl/gl_bindings.h" +#if defined(ENABLE_MOJO_MEDIA_IN_GPU_PROCESS) +#include "media/base/media_keys.h" +#include "media/mojo/services/mojo_cdm_service.h" +#endif + namespace content { // Max number of bitstreams notified to the client with @@ -138,8 +143,15 @@ return true; } -void AndroidVideoDecodeAccelerator::SetCdm(int /* cdm_id */) { - // TODO(xhwang): Implement CDM setting here. +void AndroidVideoDecodeAccelerator::SetCdm(int cdm_id) { + DVLOG(2) << __FUNCTION__ << ": " << cdm_id; + +#if defined(ENABLE_MOJO_MEDIA_IN_GPU_PROCESS) + // TODO(timav): Implement CDM setting here. See http://crbug.com/542417 + scoped_refptr<media::MediaKeys> cdm = media::MojoCdmService::GetCdm(cdm_id); + DCHECK(cdm); +#endif + NOTIMPLEMENTED(); NotifyCdmAttached(false); }
diff --git a/content/common/gpu/media/rendering_helper.cc b/content/common/gpu/media/rendering_helper.cc index 6358de9..b9817d9 100644 --- a/content/common/gpu/media/rendering_helper.cc +++ b/content/common/gpu/media/rendering_helper.cc
@@ -779,10 +779,13 @@ base::Closure schedule_frame = base::Bind( &RenderingHelper::ScheduleNextRenderContent, base::Unretained(this)); - if (!need_swap_buffer || - !gl_surface_->SwapBuffersAsync( - base::Bind(&WaitForSwapAck, schedule_frame))) + if (!need_swap_buffer) { schedule_frame.Run(); + return; + } + + gl_surface_->SwapBuffersAsync( + base::Bind(&WaitForSwapAck, schedule_frame)); } // Helper function for the LayoutRenderingAreas(). The |lengths| are the
diff --git a/content/common/view_messages.h b/content/common/view_messages.h index 3421e4af..9e9ea06 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h
@@ -975,6 +975,10 @@ IPC_MESSAGE_ROUTED1(ViewMsg_BeginFrame, cc::BeginFrameArgs /* args */) +// Sent by the browser to deliver a compositor proto to the renderer. +IPC_MESSAGE_ROUTED1(ViewMsg_HandleCompositorProto, + std::vector<uint8_t> /* proto */) + // ----------------------------------------------------------------------------- // Messages sent from the renderer to the browser. @@ -1345,6 +1349,10 @@ // See https://crbug.com/537793. IPC_MESSAGE_ROUTED0(ViewHostMsg_DidFirstPaintAfterLoad) +// Sent by the renderer to deliver a compositor proto to the browser. +IPC_MESSAGE_ROUTED1(ViewHostMsg_ForwardCompositorProto, + std::vector<uint8_t> /* proto */) + #if defined(OS_ANDROID) // Response to ViewMsg_FindMatchRects. //
diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi index adc6ba0..360a17c 100644 --- a/content/content_renderer.gypi +++ b/content/content_renderer.gypi
@@ -7,6 +7,7 @@ '../base/base.gyp:base', '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations', '../cc/cc.gyp:cc', + '../cc/cc.gyp:cc_proto', '../cc/blink/cc_blink.gyp:cc_blink', '../components/components.gyp:startup_metric_utils_common', '../components/components.gyp:webusb', @@ -504,6 +505,8 @@ 'renderer/pepper/host_var_tracker.h', 'renderer/pepper/message_channel.cc', 'renderer/pepper/message_channel.h', + 'renderer/pepper/pepper_audio_encoder_host.cc', + 'renderer/pepper/pepper_audio_encoder_host.h', 'renderer/pepper/pepper_audio_input_host.cc', 'renderer/pepper/pepper_audio_input_host.h', 'renderer/pepper/pepper_broker.cc', @@ -897,6 +900,7 @@ '../ppapi/ppapi_internal.gyp:ppapi_host', '../ppapi/ppapi_internal.gyp:ppapi_proxy', '../ppapi/ppapi_internal.gyp:ppapi_shared', + '../third_party/opus/opus.gyp:opus', ], }], ['enable_pepper_cdms != 1', {
diff --git a/content/content_tests.gypi b/content/content_tests.gypi index 7895b59e..ba521a21 100644 --- a/content/content_tests.gypi +++ b/content/content_tests.gypi
@@ -24,6 +24,8 @@ 'browser/geolocation/mock_location_provider.h', 'public/test/async_file_test_helper.cc', 'public/test/async_file_test_helper.h', + 'public/test/background_sync_test_util.cc', + 'public/test/background_sync_test_util.h', 'public/test/browser_test.h', 'public/test/browser_test_base.cc', 'public/test/browser_test_base.h',
diff --git a/content/public/browser/render_widget_host.h b/content/public/browser/render_widget_host.h index fe4361a..2fda607 100644 --- a/content/public/browser/render_widget_host.h +++ b/content/public/browser/render_widget_host.h
@@ -245,6 +245,9 @@ virtual void GetWebScreenInfo(blink::WebScreenInfo* result) = 0; // Get the color profile corresponding to this render widget. virtual bool GetScreenColorProfile(std::vector<char>* color_profile) = 0; + + // Sends a compositor proto to the render widget. + virtual void HandleCompositorProto(const std::vector<uint8_t>& proto) = 0; }; } // namespace content
diff --git a/content/public/browser/security_style_explanations.h b/content/public/browser/security_style_explanations.h index a8c9006..7dc8825 100644 --- a/content/public/browser/security_style_explanations.h +++ b/content/public/browser/security_style_explanations.h
@@ -47,7 +47,7 @@ bool scheme_is_cryptographic; std::vector<SecurityStyleExplanation> secure_explanations; - std::vector<SecurityStyleExplanation> warning_explanations; + std::vector<SecurityStyleExplanation> unauthenticated_explanations; std::vector<SecurityStyleExplanation> broken_explanations; };
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h index 40a49049a..f6a04a5 100644 --- a/content/public/browser/web_contents_delegate.h +++ b/content/public/browser/web_contents_delegate.h
@@ -510,6 +510,10 @@ WebContents* web_contents, int cert_id); + // Called when the active render widget is forwarding a RemoteChannel + // compositor proto. This is used in Blimp mode. + virtual void ForwardCompositorProto(const std::vector<uint8_t>& proto) {} + protected: virtual ~WebContentsDelegate();
diff --git a/content/public/test/background_sync_test_util.cc b/content/public/test/background_sync_test_util.cc new file mode 100644 index 0000000..2f357416 --- /dev/null +++ b/content/public/test/background_sync_test_util.cc
@@ -0,0 +1,66 @@ +// Copyright 2015 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 "content/public/test/background_sync_test_util.h" + +#include "base/run_loop.h" +#include "base/task_runner_util.h" +#include "content/browser/background_sync/background_sync_manager.h" +#include "content/browser/background_sync/background_sync_network_observer.h" +#include "content/browser/background_sync/background_sync_registration_handle.h" +#include "content/public/browser/background_sync_context.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/storage_partition.h" +#include "content/public/browser/web_contents.h" +#include "net/base/network_change_notifier.h" + +namespace content { +namespace background_sync_test_util { + +namespace { + +void SetOnlineOnIOThread( + const scoped_refptr<BackgroundSyncContext>& sync_context, + bool online) { + DCHECK_CURRENTLY_ON(BrowserThread::IO); + + BackgroundSyncManager* sync_manager = sync_context->background_sync_manager(); + BackgroundSyncNetworkObserver* network_observer = + sync_manager->GetNetworkObserverForTesting(); + if (online) { + network_observer->NotifyManagerIfNetworkChangedForTesting( + net::NetworkChangeNotifier::CONNECTION_WIFI); + } else { + network_observer->NotifyManagerIfNetworkChangedForTesting( + net::NetworkChangeNotifier::CONNECTION_NONE); + } +} + +StoragePartition* GetStoragePartition(WebContents* web_contents) { + return BrowserContext::GetStoragePartition(web_contents->GetBrowserContext(), + web_contents->GetSiteInstance()); +} + +} // namespace + +// static +void SetIgnoreNetworkChangeNotifier(bool ignore) { + BackgroundSyncNetworkObserver::SetIgnoreNetworkChangeNotifierForTests(ignore); +} + +// static +void SetOnline(WebContents* web_contents, bool online) { + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::Bind(&SetOnlineOnIOThread, + base::Unretained(GetStoragePartition(web_contents) + ->GetBackgroundSyncContext()), + online)); + base::RunLoop().RunUntilIdle(); +} + +} // namespace background_sync_test_util + +} // namespace content
diff --git a/content/public/test/background_sync_test_util.h b/content/public/test/background_sync_test_util.h new file mode 100644 index 0000000..586dba08 --- /dev/null +++ b/content/public/test/background_sync_test_util.h
@@ -0,0 +1,30 @@ +// Copyright 2015 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. + +#ifndef CONTENT_PUBLIC_TEST_BACKGROUND_SYNC_TEST_UTILS_H_ +#define CONTENT_PUBLIC_TEST_BACKGROUND_SYNC_TEST_UTILS_H_ + +namespace content { +class WebContents; + +// Utility namespace for background sync tests. +namespace background_sync_test_util { + +// Enables or disables notifications coming from the NetworkChangeNotifier. +// (For preventing flakes in tests) +void SetIgnoreNetworkChangeNotifier(bool ignore); + +// Puts background sync manager into online or offline mode for tests. +// +// This eventually (asynchronously) runs on the IO thread. However you can +// start performing background sync operations without waiting for the IO +// thread task to complete, since those background sync operations also run +// on the IO thread. +void SetOnline(WebContents* web_contents, bool online); + +} // namespace background_sync_test_util + +} // namespace content + +#endif // CONTENT_PUBLIC_TEST_BACKGROUND_SYNC_TEST_UTILS_H_
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index 42da81ac..cf164b7 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -28,6 +28,7 @@ "//base/allocator", "//cc", "//cc/blink", + "//cc/proto", "//components/scheduler:scheduler", "//components/startup_metric_utils/common", "//components/url_formatter", @@ -182,6 +183,7 @@ "//ppapi/proxy", "//ppapi/shared_impl", "//third_party/libvpx_new", + "//third_party/opus", ] }
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc index 64194686..0eb8bc0 100644 --- a/content/renderer/gpu/render_widget_compositor.cc +++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -10,6 +10,7 @@ #include "base/command_line.h" #include "base/location.h" #include "base/logging.h" +#include "base/numerics/safe_conversions.h" #include "base/single_thread_task_runner.h" #include "base/strings/string_number_conversions.h" #include "base/synchronization/lock.h" @@ -31,10 +32,12 @@ #include "cc/output/copy_output_result.h" #include "cc/output/latency_info_swap_promise.h" #include "cc/output/swap_promise.h" +#include "cc/proto/compositor_message.pb.h" #include "cc/resources/single_release_callback.h" #include "cc/scheduler/begin_frame_source.h" #include "cc/trees/latency_info_swap_promise_monitor.h" #include "cc/trees/layer_tree_host.h" +#include "cc/trees/remote_proto_channel.h" #include "components/scheduler/renderer/renderer_scheduler.h" #include "content/common/content_switches_internal.h" #include "content/common/gpu/client/context_provider_command_buffer.h" @@ -215,6 +218,7 @@ compositor_deps_(compositor_deps), never_visible_(false), layout_and_paint_async_callback_(nullptr), + remote_proto_channel_receiver_(nullptr), weak_factory_(this) { } @@ -968,6 +972,19 @@ widget_->OnSwapBuffersAborted(); } +void RenderWidgetCompositor::SetProtoReceiver(ProtoReceiver* receiver) { + remote_proto_channel_receiver_ = receiver; +} + +void RenderWidgetCompositor::SendCompositorProto( + const cc::proto::CompositorMessage& proto) { + int signed_size = proto.ByteSize(); + size_t unsigned_size = base::checked_cast<size_t>(signed_size); + std::vector<uint8_t> serialized(unsigned_size); + proto.SerializeToArray(serialized.data(), signed_size); + widget_->ForwardCompositorProto(serialized); +} + void RenderWidgetCompositor::RecordFrameTimingEvents( scoped_ptr<cc::FrameTimingTracker::CompositeTimingSet> composite_events, scoped_ptr<cc::FrameTimingTracker::MainFrameTimingSet> main_frame_events) { @@ -1005,6 +1022,21 @@ layer_tree_host_->set_surface_id_namespace(surface_id_namespace); } +void RenderWidgetCompositor::OnHandleCompositorProto( + const std::vector<uint8_t>& proto) { + DCHECK(remote_proto_channel_receiver_); + + scoped_ptr<cc::proto::CompositorMessage> deserialized( + new cc::proto::CompositorMessage); + int signed_size = base::checked_cast<int>(proto.size()); + if (!deserialized->ParseFromArray(proto.data(), signed_size)) { + LOG(ERROR) << "Unable to parse compositor proto."; + return; + } + + remote_proto_channel_receiver_->OnProtoReceived(deserialized.Pass()); +} + cc::ManagedMemoryPolicy RenderWidgetCompositor::GetGpuMemoryPolicy( const cc::ManagedMemoryPolicy& policy) { cc::ManagedMemoryPolicy actual = policy;
diff --git a/content/renderer/gpu/render_widget_compositor.h b/content/renderer/gpu/render_widget_compositor.h index fa3ba31..3a37e50 100644 --- a/content/renderer/gpu/render_widget_compositor.h +++ b/content/renderer/gpu/render_widget_compositor.h
@@ -15,6 +15,7 @@ #include "cc/trees/layer_tree_host_client.h" #include "cc/trees/layer_tree_host_single_thread_client.h" #include "cc/trees/layer_tree_settings.h" +#include "cc/trees/remote_proto_channel.h" #include "cc/trees/swap_promise_monitor.h" #include "content/common/content_export.h" #include "content/renderer/gpu/compositor_dependencies.h" @@ -31,6 +32,11 @@ class InputHandler; class Layer; class LayerTreeHost; + +namespace proto { +class CompositorMessage; +} + } namespace content { @@ -39,7 +45,8 @@ class CONTENT_EXPORT RenderWidgetCompositor : NON_EXPORTED_BASE(public blink::WebLayerTreeView), NON_EXPORTED_BASE(public cc::LayerTreeHostClient), - NON_EXPORTED_BASE(public cc::LayerTreeHostSingleThreadClient) { + NON_EXPORTED_BASE(public cc::LayerTreeHostSingleThreadClient), + NON_EXPORTED_BASE(public cc::RemoteProtoChannel) { public: // Attempt to construct and initialize a compositor instance for the widget // with the given settings. Returns NULL if initialization fails. @@ -79,6 +86,7 @@ const base::Callback<void(scoped_ptr<base::Value>)>& callback); bool SendMessageToMicroBenchmark(int id, scoped_ptr<base::Value> value); void SetSurfaceIdNamespace(uint32_t surface_id_namespace); + void OnHandleCompositorProto(const std::vector<uint8_t>& proto); cc::ManagedMemoryPolicy GetGpuMemoryPolicy( const cc::ManagedMemoryPolicy& policy); void SetPaintedDeviceScaleFactor(float device_scale); @@ -164,6 +172,10 @@ void DidPostSwapBuffers() override; void DidAbortSwapBuffers() override; + // cc::RemoteProtoChannel implementation. + void SetProtoReceiver(ProtoReceiver* receiver) override; + void SendCompositorProto(const cc::proto::CompositorMessage& proto) override; + enum { OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK = 4, MAX_OUTPUT_SURFACE_RETRIES = 5, @@ -191,6 +203,8 @@ blink::WebLayoutAndPaintAsyncCallback* layout_and_paint_async_callback_; scoped_ptr<cc::CopyOutputRequest> temporary_copy_output_request_; + cc::RemoteProtoChannel::ProtoReceiver* remote_proto_channel_receiver_; + base::WeakPtrFactory<RenderWidgetCompositor> weak_factory_; };
diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc index 6d5a317..b07e2226 100644 --- a/content/renderer/media/android/webmediaplayer_android.cc +++ b/content/renderer/media/android/webmediaplayer_android.cc
@@ -137,12 +137,15 @@ : web_graphics_context_(web_graphics_context) {} ~SyncTokenClientImpl() override {} void GenerateSyncToken(gpu::SyncToken* sync_token) override { - if (!web_graphics_context_->insertSyncPoint(sync_token->GetData())) { + const blink::WGC3Duint64 fence_sync = + web_graphics_context_->insertFenceSyncCHROMIUM(); + if (!web_graphics_context_->genSyncTokenCHROMIUM(fence_sync, + sync_token->GetData())) { sync_token->Clear(); } } void WaitSyncToken(const gpu::SyncToken& sync_token) override { - web_graphics_context_->waitSyncToken(sync_token.GetConstData()); + web_graphics_context_->waitSyncTokenCHROMIUM(sync_token.GetConstData()); } private: @@ -687,7 +690,8 @@ mailbox_holder.texture_target == GL_TEXTURE_EXTERNAL_OES) || (is_remote_ && mailbox_holder.texture_target == GL_TEXTURE_2D)); - web_graphics_context->waitSyncToken(mailbox_holder.sync_token.GetConstData()); + web_graphics_context->waitSyncTokenCHROMIUM( + mailbox_holder.sync_token.GetConstData()); // Ensure the target of texture is set before copyTextureCHROMIUM, otherwise // an invalid texture target may be used for copy texture.
diff --git a/content/renderer/media/rtc_video_encoder.cc b/content/renderer/media/rtc_video_encoder.cc index 43ad247..c19270e 100644 --- a/content/renderer/media/rtc_video_encoder.cc +++ b/content/renderer/media/rtc_video_encoder.cc
@@ -584,6 +584,7 @@ media::GpuVideoAcceleratorFactories* gpu_factories) : video_codec_type_(type), gpu_factories_(gpu_factories), + gpu_task_runner_(gpu_factories->GetTaskRunner()), encoded_image_callback_(NULL), impl_status_(WEBRTC_VIDEO_CODEC_UNINITIALIZED), weak_factory_(this) { @@ -614,7 +615,7 @@ impl_ = new Impl(weak_factory_.GetWeakPtr(), gpu_factories_); base::WaitableEvent initialization_waiter(true, false); int32_t initialization_retval = WEBRTC_VIDEO_CODEC_UNINITIALIZED; - gpu_factories_->GetTaskRunner()->PostTask( + gpu_task_runner_->PostTask( FROM_HERE, base::Bind(&RTCVideoEncoder::Impl::CreateAndInitializeVEA, impl_, @@ -644,7 +645,7 @@ frame_types->front() == webrtc::kVideoFrameKey; base::WaitableEvent encode_waiter(true, false); int32_t encode_retval = WEBRTC_VIDEO_CODEC_UNINITIALIZED; - gpu_factories_->GetTaskRunner()->PostTask( + gpu_task_runner_->PostTask( FROM_HERE, base::Bind(&RTCVideoEncoder::Impl::Enqueue, impl_, @@ -677,8 +678,8 @@ DCHECK(thread_checker_.CalledOnValidThread()); if (impl_.get()) { - gpu_factories_->GetTaskRunner()->PostTask( - FROM_HERE, base::Bind(&RTCVideoEncoder::Impl::Destroy, impl_)); + gpu_task_runner_->PostTask(FROM_HERE, + base::Bind(&RTCVideoEncoder::Impl::Destroy, impl_)); impl_ = NULL; weak_factory_.InvalidateWeakPtrs(); impl_status_ = WEBRTC_VIDEO_CODEC_UNINITIALIZED; @@ -702,7 +703,7 @@ return impl_status_; } - gpu_factories_->GetTaskRunner()->PostTask( + gpu_task_runner_->PostTask( FROM_HERE, base::Bind(&RTCVideoEncoder::Impl::RequestEncodingParametersChange, impl_, @@ -763,7 +764,7 @@ // The call through webrtc::EncodedImageCallback is synchronous, so we can // immediately recycle the output buffer back to the Impl. - gpu_factories_->GetTaskRunner()->PostTask( + gpu_task_runner_->PostTask( FROM_HERE, base::Bind(&RTCVideoEncoder::Impl::UseOutputBitstreamBufferId, impl_, @@ -775,8 +776,8 @@ DVLOG(1) << "NotifyError(): error=" << error; impl_status_ = error; - gpu_factories_->GetTaskRunner()->PostTask( - FROM_HERE, base::Bind(&RTCVideoEncoder::Impl::Destroy, impl_)); + gpu_task_runner_->PostTask(FROM_HERE, + base::Bind(&RTCVideoEncoder::Impl::Destroy, impl_)); impl_ = NULL; }
diff --git a/content/renderer/media/rtc_video_encoder.h b/content/renderer/media/rtc_video_encoder.h index 12c658c5..303c368 100644 --- a/content/renderer/media/rtc_video_encoder.h +++ b/content/renderer/media/rtc_video_encoder.h
@@ -78,6 +78,9 @@ // Factory for creating VEAs, shared memory buffers, etc. media::GpuVideoAcceleratorFactories* gpu_factories_; + // Task runner that the video accelerator runs on. + const scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner_; + // webrtc::VideoEncoder encode complete callback. webrtc::EncodedImageCallback* encoded_image_callback_;
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc index 03abc350..ee7d5fa 100644 --- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc +++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
@@ -46,6 +46,7 @@ #include "content/renderer/render_frame_impl.h" #include "content/renderer/render_thread_impl.h" #include "content/renderer/render_view_impl.h" +#include "crypto/openssl_util.h" #include "jingle/glue/thread_wrapper.h" #include "media/base/media_permission.h" #include "media/renderers/gpu_video_accelerator_factories.h" @@ -360,6 +361,12 @@ CHECK(worker_thread_); // Init SSL, which will be needed by PeerConnection. + // + // TODO(davidben): BoringSSL must be initialized by Chromium code. If the + // initialization requirement is removed or when different libraries are + // allowed to call CRYPTO_library_init concurrently, remove this line and + // initialize within WebRTC. See https://crbug.com/542879. + crypto::EnsureOpenSSLInit(); if (!rtc::InitializeSSL()) { LOG(ERROR) << "Failed on InitializeSSL."; NOTREACHED();
diff --git a/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc b/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc index 1a89a453..35843d0 100644 --- a/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc +++ b/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc
@@ -48,11 +48,11 @@ } void* WebRtcVideoFrameAdapter::native_handle() const { - return (frame_->HasTextures() || - frame_->storage_type() == - media::VideoFrame::STORAGE_GPU_MEMORY_BUFFERS) - ? frame_.get() - : nullptr; + if (frame_->HasTextures() || + frame_->storage_type() == media::VideoFrame::STORAGE_GPU_MEMORY_BUFFERS || + frame_->storage_type() == media::VideoFrame::STORAGE_SHMEM) + return frame_.get(); + return nullptr; } rtc::scoped_refptr<webrtc::VideoFrameBuffer>
diff --git a/content/renderer/pepper/DEPS b/content/renderer/pepper/DEPS index 719545f..34f11e75 100644 --- a/content/renderer/pepper/DEPS +++ b/content/renderer/pepper/DEPS
@@ -8,6 +8,7 @@ "+media/video", "+third_party/libvpx_new", "+third_party/libyuv", + "+third_party/opus", "+ui/base/ime", "+ui/base/range", ]
diff --git a/content/renderer/pepper/content_renderer_pepper_host_factory.cc b/content/renderer/pepper/content_renderer_pepper_host_factory.cc index 0187d7d..c01ae4d 100644 --- a/content/renderer/pepper/content_renderer_pepper_host_factory.cc +++ b/content/renderer/pepper/content_renderer_pepper_host_factory.cc
@@ -9,6 +9,7 @@ #include "content/common/content_switches_internal.h" #include "content/public/common/content_client.h" #include "content/public/renderer/content_renderer_client.h" +#include "content/renderer/pepper/pepper_audio_encoder_host.h" #include "content/renderer/pepper/pepper_audio_input_host.h" #include "content/renderer/pepper/pepper_camera_device_host.h" #include "content/renderer/pepper/pepper_compositor_host.h" @@ -201,6 +202,9 @@ // Dev interfaces. if (GetPermissions().HasPermission(ppapi::PERMISSION_DEV)) { switch (message.type()) { + case PpapiHostMsg_AudioEncoder_Create::ID: + return scoped_ptr<ResourceHost>( + new PepperAudioEncoderHost(host_, instance, resource)); case PpapiHostMsg_AudioInput_Create::ID: return scoped_ptr<ResourceHost>( new PepperAudioInputHost(host_, instance, resource));
diff --git a/content/renderer/pepper/pepper_audio_encoder_host.cc b/content/renderer/pepper/pepper_audio_encoder_host.cc new file mode 100644 index 0000000..b3e59fd3 --- /dev/null +++ b/content/renderer/pepper/pepper_audio_encoder_host.cc
@@ -0,0 +1,495 @@ +// Copyright 2015 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 "base/bind.h" +#include "base/memory/shared_memory.h" +#include "content/public/renderer/renderer_ppapi_host.h" +#include "content/renderer/pepper/host_globals.h" +#include "content/renderer/pepper/pepper_audio_encoder_host.h" +#include "content/renderer/render_thread_impl.h" +#include "media/base/bind_to_current_loop.h" +#include "ppapi/c/pp_codecs.h" +#include "ppapi/c/pp_errors.h" +#include "ppapi/host/dispatch_host_message.h" +#include "ppapi/host/ppapi_host.h" +#include "ppapi/proxy/ppapi_messages.h" +#include "ppapi/shared_impl/media_stream_buffer.h" +#include "third_party/opus/src/include/opus.h" + +using ppapi::proxy::SerializedHandle; + +namespace content { + +namespace { + +// Buffer up to 150ms (15 x 10ms per frame). +const uint32_t kDefaultNumberOfAudioBuffers = 15; + +bool PP_HardwareAccelerationCompatible(bool accelerated, + PP_HardwareAcceleration requested) { + switch (requested) { + case PP_HARDWAREACCELERATION_ONLY: + return accelerated; + case PP_HARDWAREACCELERATION_NONE: + return !accelerated; + case PP_HARDWAREACCELERATION_WITHFALLBACK: + return true; + // No default case, to catch unhandled PP_HardwareAcceleration values. + } + return false; +} + +} // namespace + +// This class should be constructed and initialized on the main renderer +// thread, used and destructed on the media thread. +class PepperAudioEncoderHost::AudioEncoderImpl { + public: + // Callback used to signal encoded data. If |size| is negative, an error + // occurred. + using BitstreamBufferReadyCB = base::Callback<void(int32_t size)>; + + AudioEncoderImpl(); + ~AudioEncoderImpl(); + + // Used on the renderer thread. + static std::vector<PP_AudioProfileDescription> GetSupportedProfiles(); + bool Initialize(const ppapi::proxy::PPB_AudioEncodeParameters& parameters); + int32_t GetNumberOfSamplesPerFrame(); + + // Used on the media thread. + void Encode(uint8_t* input_data, + size_t input_size, + uint8_t* output_data, + size_t output_size, + BitstreamBufferReadyCB callback); + void RequestBitrateChange(uint32_t bitrate); + + private: + scoped_ptr<uint8[]> encoder_memory_; + OpusEncoder* opus_encoder_; + + // Initialization parameters, only valid if |encoder_memory_| is not + // nullptr. + ppapi::proxy::PPB_AudioEncodeParameters parameters_; + + DISALLOW_COPY_AND_ASSIGN(AudioEncoderImpl); +}; + +PepperAudioEncoderHost::AudioEncoderImpl::AudioEncoderImpl() + : opus_encoder_(nullptr) {} + +PepperAudioEncoderHost::AudioEncoderImpl::~AudioEncoderImpl() {} + +// static +std::vector<PP_AudioProfileDescription> +PepperAudioEncoderHost::AudioEncoderImpl::GetSupportedProfiles() { + std::vector<PP_AudioProfileDescription> profiles; + static const uint32_t sampling_rates[] = {8000, 12000, 16000, 24000, 48000}; + + for (uint32_t i = 0; i < arraysize(sampling_rates); ++i) { + PP_AudioProfileDescription profile; + profile.profile = PP_AUDIOPROFILE_OPUS; + profile.max_channels = 2; + profile.sample_size = PP_AUDIOBUFFER_SAMPLESIZE_16_BITS; + profile.sample_rate = sampling_rates[i]; + profile.hardware_accelerated = PP_FALSE; + profiles.push_back(profile); + } + return profiles; +} + +bool PepperAudioEncoderHost::AudioEncoderImpl::Initialize( + const ppapi::proxy::PPB_AudioEncodeParameters& parameters) { + if (parameters.output_profile != PP_AUDIOPROFILE_OPUS) + return false; + + DCHECK(!encoder_memory_); + + int32_t encoder_size = opus_encoder_get_size(parameters.channels); + if (encoder_size < 1) + return false; + + scoped_ptr<uint8[]> encoder_memory(new uint8[encoder_size]); + opus_encoder_ = reinterpret_cast<OpusEncoder*>(encoder_memory.get()); + + if (opus_encoder_init(opus_encoder_, parameters.input_sample_rate, + parameters.channels, OPUS_APPLICATION_AUDIO) != OPUS_OK) + return false; + + if (opus_encoder_ctl(opus_encoder_, + OPUS_SET_BITRATE(parameters.initial_bitrate <= 0 + ? OPUS_AUTO + : parameters.initial_bitrate)) != + OPUS_OK) + return false; + + encoder_memory_.swap(encoder_memory); + parameters_ = parameters; + + return true; +} + +int32_t PepperAudioEncoderHost::AudioEncoderImpl::GetNumberOfSamplesPerFrame() { + DCHECK(encoder_memory_); + // Opus supports 2.5, 5, 10, 20, 40 or 60ms audio frames. We take + // 10ms by default. + return parameters_.input_sample_rate / 100; +} + +void PepperAudioEncoderHost::AudioEncoderImpl::Encode( + uint8_t* input_data, + size_t input_size, + uint8_t* output_data, + size_t output_size, + BitstreamBufferReadyCB callback) { + DCHECK(encoder_memory_); + int32_t result = opus_encode( + opus_encoder_, reinterpret_cast<opus_int16*>(input_data), + (input_size / parameters_.channels) / parameters_.input_sample_size, + output_data, output_size); + callback.Run(result); +} + +void PepperAudioEncoderHost::AudioEncoderImpl::RequestBitrateChange( + uint32_t bitrate) { + DCHECK(encoder_memory_); + opus_encoder_ctl(opus_encoder_, OPUS_SET_BITRATE(bitrate)); +} + +PepperAudioEncoderHost::PepperAudioEncoderHost(RendererPpapiHost* host, + PP_Instance instance, + PP_Resource resource) + : ResourceHost(host->GetPpapiHost(), instance, resource), + renderer_ppapi_host_(host), + initialized_(false), + encoder_last_error_(PP_ERROR_FAILED), + media_task_runner_(RenderThreadImpl::current() + ->GetMediaThreadTaskRunner()), + weak_ptr_factory_(this) {} + +PepperAudioEncoderHost::~PepperAudioEncoderHost() { + Close(); +} + +int32_t PepperAudioEncoderHost::OnResourceMessageReceived( + const IPC::Message& msg, + ppapi::host::HostMessageContext* context) { + PPAPI_BEGIN_MESSAGE_MAP(PepperAudioEncoderHost, msg) + PPAPI_DISPATCH_HOST_RESOURCE_CALL_0( + PpapiHostMsg_AudioEncoder_GetSupportedProfiles, + OnHostMsgGetSupportedProfiles) + PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_AudioEncoder_Initialize, + OnHostMsgInitialize) + PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_AudioEncoder_Encode, + OnHostMsgEncode) + PPAPI_DISPATCH_HOST_RESOURCE_CALL( + PpapiHostMsg_AudioEncoder_RecycleBitstreamBuffer, + OnHostMsgRecycleBitstreamBuffer) + PPAPI_DISPATCH_HOST_RESOURCE_CALL( + PpapiHostMsg_AudioEncoder_RequestBitrateChange, + OnHostMsgRequestBitrateChange) + PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_AudioEncoder_Close, + OnHostMsgClose) + PPAPI_END_MESSAGE_MAP() + return PP_ERROR_FAILED; +} + +int32_t PepperAudioEncoderHost::OnHostMsgGetSupportedProfiles( + ppapi::host::HostMessageContext* context) { + std::vector<PP_AudioProfileDescription> profiles; + GetSupportedProfiles(&profiles); + + host()->SendReply( + context->MakeReplyMessageContext(), + PpapiPluginMsg_AudioEncoder_GetSupportedProfilesReply(profiles)); + + return PP_OK_COMPLETIONPENDING; +} + +int32_t PepperAudioEncoderHost::OnHostMsgInitialize( + ppapi::host::HostMessageContext* context, + const ppapi::proxy::PPB_AudioEncodeParameters& parameters) { + if (initialized_) + return PP_ERROR_FAILED; + + if (!IsInitializationValid(parameters)) + return PP_ERROR_NOTSUPPORTED; + + scoped_ptr<AudioEncoderImpl> encoder(new AudioEncoderImpl); + if (!encoder->Initialize(parameters)) + return PP_ERROR_FAILED; + if (!AllocateBuffers(parameters, encoder->GetNumberOfSamplesPerFrame())) + return PP_ERROR_NOMEMORY; + + initialized_ = true; + encoder_last_error_ = PP_OK; + encoder_.swap(encoder); + + ppapi::host::ReplyMessageContext reply_context = + context->MakeReplyMessageContext(); + reply_context.params.AppendHandle( + SerializedHandle(renderer_ppapi_host_->ShareSharedMemoryHandleWithRemote( + audio_buffer_manager_->shm()->handle()), + audio_buffer_manager_->shm()->mapped_size())); + reply_context.params.AppendHandle( + SerializedHandle(renderer_ppapi_host_->ShareSharedMemoryHandleWithRemote( + bitstream_buffer_manager_->shm()->handle()), + bitstream_buffer_manager_->shm()->mapped_size())); + host()->SendReply(reply_context, + PpapiPluginMsg_AudioEncoder_InitializeReply( + encoder_->GetNumberOfSamplesPerFrame(), + audio_buffer_manager_->number_of_buffers(), + audio_buffer_manager_->buffer_size(), + bitstream_buffer_manager_->number_of_buffers(), + bitstream_buffer_manager_->buffer_size())); + + return PP_OK_COMPLETIONPENDING; +} + +int32_t PepperAudioEncoderHost::OnHostMsgEncode( + ppapi::host::HostMessageContext* context, + int32_t buffer_id) { + if (encoder_last_error_) + return encoder_last_error_; + + if (buffer_id < 0 || buffer_id >= audio_buffer_manager_->number_of_buffers()) + return PP_ERROR_FAILED; + + audio_buffer_manager_->EnqueueBuffer(buffer_id); + + DoEncode(); + + return PP_OK_COMPLETIONPENDING; +} + +int32_t PepperAudioEncoderHost::OnHostMsgRecycleBitstreamBuffer( + ppapi::host::HostMessageContext* context, + int32_t buffer_id) { + if (encoder_last_error_) + return encoder_last_error_; + + if (buffer_id < 0 || + buffer_id >= bitstream_buffer_manager_->number_of_buffers()) + return PP_ERROR_FAILED; + + bitstream_buffer_manager_->EnqueueBuffer(buffer_id); + + DoEncode(); + + return PP_OK; +} + +int32_t PepperAudioEncoderHost::OnHostMsgRequestBitrateChange( + ppapi::host::HostMessageContext* context, + uint32_t bitrate) { + if (encoder_last_error_) + return encoder_last_error_; + + media_task_runner_->PostTask( + FROM_HERE, base::Bind(&AudioEncoderImpl::RequestBitrateChange, + base::Unretained(encoder_.get()), bitrate)); + + return PP_OK; +} + +int32_t PepperAudioEncoderHost::OnHostMsgClose( + ppapi::host::HostMessageContext* context) { + encoder_last_error_ = PP_ERROR_FAILED; + Close(); + + return PP_OK; +} + +void PepperAudioEncoderHost::GetSupportedProfiles( + std::vector<PP_AudioProfileDescription>* profiles) { + DCHECK(RenderThreadImpl::current()); + + *profiles = AudioEncoderImpl::GetSupportedProfiles(); +} + +bool PepperAudioEncoderHost::IsInitializationValid( + const ppapi::proxy::PPB_AudioEncodeParameters& parameters) { + DCHECK(RenderThreadImpl::current()); + + std::vector<PP_AudioProfileDescription> profiles; + GetSupportedProfiles(&profiles); + + for (const PP_AudioProfileDescription& profile : profiles) { + if (parameters.output_profile == profile.profile && + parameters.input_sample_size == profile.sample_size && + parameters.input_sample_rate == profile.sample_rate && + parameters.channels <= profile.max_channels && + PP_HardwareAccelerationCompatible( + profile.hardware_accelerated == PP_TRUE, parameters.acceleration)) + return true; + } + + return false; +} + +bool PepperAudioEncoderHost::AllocateBuffers( + const ppapi::proxy::PPB_AudioEncodeParameters& parameters, + int32_t samples_per_frame) { + DCHECK(RenderThreadImpl::current()); + + // Audio buffers size computation. + base::CheckedNumeric<size_t> audio_buffer_size = samples_per_frame; + audio_buffer_size *= parameters.channels; + audio_buffer_size *= parameters.input_sample_size; + + base::CheckedNumeric<size_t> total_audio_buffer_size = audio_buffer_size; + total_audio_buffer_size += sizeof(ppapi::MediaStreamBuffer::Audio); + base::CheckedNumeric<size_t> total_audio_memory_size = + total_audio_buffer_size; + total_audio_memory_size *= kDefaultNumberOfAudioBuffers; + + // Bitstream buffers size computation (individual bitstream buffers are + // twice the size of the raw data, to handle the worst case where + // compression doesn't work). + base::CheckedNumeric<size_t> bitstream_buffer_size = audio_buffer_size; + bitstream_buffer_size *= 2; + bitstream_buffer_size += sizeof(ppapi::MediaStreamBuffer::Bitstream); + base::CheckedNumeric<size_t> total_bitstream_memory_size = + bitstream_buffer_size; + total_bitstream_memory_size *= kDefaultNumberOfAudioBuffers; + + if (!total_audio_memory_size.IsValid() || + !total_bitstream_memory_size.IsValid()) + return false; + + scoped_ptr<base::SharedMemory> audio_memory( + RenderThreadImpl::current()->HostAllocateSharedMemoryBuffer( + total_audio_memory_size.ValueOrDie())); + if (!audio_memory) + return false; + scoped_ptr<ppapi::MediaStreamBufferManager> audio_buffer_manager( + new ppapi::MediaStreamBufferManager(this)); + if (!audio_buffer_manager->SetBuffers(kDefaultNumberOfAudioBuffers, + total_audio_buffer_size.ValueOrDie(), + audio_memory.Pass(), false)) + return false; + + for (int32_t i = 0; i < audio_buffer_manager->number_of_buffers(); ++i) { + ppapi::MediaStreamBuffer::Audio* buffer = + &(audio_buffer_manager->GetBufferPointer(i)->audio); + buffer->header.size = total_audio_buffer_size.ValueOrDie(); + buffer->header.type = ppapi::MediaStreamBuffer::TYPE_AUDIO; + buffer->sample_rate = + static_cast<PP_AudioBuffer_SampleRate>(parameters.input_sample_rate); + buffer->number_of_channels = parameters.channels; + buffer->number_of_samples = samples_per_frame; + buffer->data_size = audio_buffer_size.ValueOrDie(); + } + + scoped_ptr<base::SharedMemory> bitstream_memory( + RenderThreadImpl::current()->HostAllocateSharedMemoryBuffer( + total_bitstream_memory_size.ValueOrDie())); + if (!bitstream_memory) + return false; + scoped_ptr<ppapi::MediaStreamBufferManager> bitstream_buffer_manager( + new ppapi::MediaStreamBufferManager(this)); + if (!bitstream_buffer_manager->SetBuffers(kDefaultNumberOfAudioBuffers, + bitstream_buffer_size.ValueOrDie(), + bitstream_memory.Pass(), true)) + return false; + + for (int32_t i = 0; i < bitstream_buffer_manager->number_of_buffers(); ++i) { + ppapi::MediaStreamBuffer::Bitstream* buffer = + &(bitstream_buffer_manager->GetBufferPointer(i)->bitstream); + buffer->header.size = bitstream_buffer_size.ValueOrDie(); + buffer->header.type = ppapi::MediaStreamBuffer::TYPE_BITSTREAM; + } + + audio_buffer_manager_.swap(audio_buffer_manager); + bitstream_buffer_manager_.swap(bitstream_buffer_manager); + + return true; +} + +void PepperAudioEncoderHost::DoEncode() { + DCHECK(RenderThreadImpl::current()); + DCHECK(!encoder_last_error_); + + if (!audio_buffer_manager_->HasAvailableBuffer() || + !bitstream_buffer_manager_->HasAvailableBuffer()) + return; + + int32_t audio_buffer_id = audio_buffer_manager_->DequeueBuffer(); + int32_t bitstream_buffer_id = bitstream_buffer_manager_->DequeueBuffer(); + + ppapi::MediaStreamBuffer* audio_buffer = + audio_buffer_manager_->GetBufferPointer(audio_buffer_id); + ppapi::MediaStreamBuffer* bitstream_buffer = + bitstream_buffer_manager_->GetBufferPointer(bitstream_buffer_id); + + media_task_runner_->PostTask( + FROM_HERE, + base::Bind(&AudioEncoderImpl::Encode, base::Unretained(encoder_.get()), + static_cast<uint8_t*>(audio_buffer->audio.data), + audio_buffer_manager_->buffer_size() - + sizeof(ppapi::MediaStreamBuffer::Audio), + static_cast<uint8_t*>(bitstream_buffer->bitstream.data), + bitstream_buffer_manager_->buffer_size() - + sizeof(ppapi::MediaStreamBuffer::Bitstream), + media::BindToCurrentLoop( + base::Bind(&PepperAudioEncoderHost::BitstreamBufferReady, + weak_ptr_factory_.GetWeakPtr(), audio_buffer_id, + bitstream_buffer_id)))); +} + +void PepperAudioEncoderHost::BitstreamBufferReady(int32_t audio_buffer_id, + int32_t bitstream_buffer_id, + int32_t result) { + DCHECK(RenderThreadImpl::current()); + + if (encoder_last_error_) + return; + + if (result < 0) { + NotifyPepperError(PP_ERROR_FAILED); + return; + } + + host()->SendUnsolicitedReply( + pp_resource(), PpapiPluginMsg_AudioEncoder_EncodeReply(audio_buffer_id)); + + ppapi::MediaStreamBuffer::Bitstream* buffer = + &(bitstream_buffer_manager_->GetBufferPointer(bitstream_buffer_id) + ->bitstream); + buffer->data_size = static_cast<uint32_t>(result); + + host()->SendUnsolicitedReply( + pp_resource(), + PpapiPluginMsg_AudioEncoder_BitstreamBufferReady(bitstream_buffer_id)); +} + +void PepperAudioEncoderHost::NotifyPepperError(int32_t error) { + DCHECK(RenderThreadImpl::current()); + + encoder_last_error_ = error; + Close(); + host()->SendUnsolicitedReply( + pp_resource(), + PpapiPluginMsg_AudioEncoder_NotifyError(encoder_last_error_)); +} + +void PepperAudioEncoderHost::Close() { + DCHECK(RenderThreadImpl::current()); + + // Destroy the encoder and the audio/bitstream buffers on the media thread + // to avoid freeing memory the encoder might still be working on. + media_task_runner_->PostTask( + FROM_HERE, base::Bind(&StopAudioEncoder, base::Passed(encoder_.Pass()), + base::Passed(audio_buffer_manager_.Pass()), + base::Passed(bitstream_buffer_manager_.Pass()))); +} + +// static +void PepperAudioEncoderHost::StopAudioEncoder( + scoped_ptr<AudioEncoderImpl> encoder, + scoped_ptr<ppapi::MediaStreamBufferManager> audio_buffer_manager, + scoped_ptr<ppapi::MediaStreamBufferManager> bitstream_buffer_manager) {} + +} // namespace content
diff --git a/content/renderer/pepper/pepper_audio_encoder_host.h b/content/renderer/pepper/pepper_audio_encoder_host.h new file mode 100644 index 0000000..3ad9a0c --- /dev/null +++ b/content/renderer/pepper/pepper_audio_encoder_host.h
@@ -0,0 +1,110 @@ +// Copyright 2015 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. + +#ifndef CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_ENCODER_HOST_H_ +#define CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_ENCODER_HOST_H_ + +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/scoped_vector.h" +#include "base/numerics/safe_math.h" +#include "content/common/content_export.h" +#include "ppapi/c/pp_codecs.h" +#include "ppapi/host/host_message_context.h" +#include "ppapi/host/resource_host.h" +#include "ppapi/proxy/resource_message_params.h" +#include "ppapi/proxy/serialized_structs.h" +#include "ppapi/shared_impl/media_stream_buffer_manager.h" + +namespace content { + +class RendererPpapiHost; + +class CONTENT_EXPORT PepperAudioEncoderHost + : public ppapi::host::ResourceHost, + public ppapi::MediaStreamBufferManager::Delegate { + public: + PepperAudioEncoderHost(RendererPpapiHost* host, + PP_Instance instance, + PP_Resource resource); + ~PepperAudioEncoderHost() override; + + private: + class AudioEncoderImpl; + + // ResourceHost implementation. + int32_t OnResourceMessageReceived( + const IPC::Message& msg, + ppapi::host::HostMessageContext* context) override; + + int32_t OnHostMsgGetSupportedProfiles( + ppapi::host::HostMessageContext* context); + int32_t OnHostMsgInitialize( + ppapi::host::HostMessageContext* context, + const ppapi::proxy::PPB_AudioEncodeParameters& parameters); + int32_t OnHostMsgGetAudioBuffers(ppapi::host::HostMessageContext* context); + int32_t OnHostMsgEncode(ppapi::host::HostMessageContext* context, + int32_t buffer_id); + int32_t OnHostMsgRecycleBitstreamBuffer( + ppapi::host::HostMessageContext* context, + int32_t buffer_id); + int32_t OnHostMsgRequestBitrateChange( + ppapi::host::HostMessageContext* context, + uint32_t bitrate); + int32_t OnHostMsgClose(ppapi::host::HostMessageContext* context); + + void GetSupportedProfiles(std::vector<PP_AudioProfileDescription>* profiles); + bool IsInitializationValid( + const ppapi::proxy::PPB_AudioEncodeParameters& parameters); + bool AllocateBuffers( + const ppapi::proxy::PPB_AudioEncodeParameters& parameters, + int32_t samples_per_frame); + void DoEncode(); + void BitstreamBufferReady(int32_t audio_buffer_id, + int32_t bitstream_buffer_id, + int32_t size); + void NotifyPepperError(int32_t error); + void Close(); + + static void StopAudioEncoder( + scoped_ptr<AudioEncoderImpl> encoder, + scoped_ptr<ppapi::MediaStreamBufferManager> audio_buffer_manager, + scoped_ptr<ppapi::MediaStreamBufferManager> bitstream_buffer_manager); + + // Non-owning pointer. + RendererPpapiHost* renderer_ppapi_host_; + + // Whether the encoder has been successfully initialized. + bool initialized_; + + // Last error reported by the encoder. + // This represents the current error state of the encoder, i.e. PP_OK + // normally, or a Pepper error code if the encoder is uninitialized, + // has been notified of an encoder error, has encountered some + // other unrecoverable error, or has been closed by the plugin. + // This field is checked in most message handlers to decide whether + // operations should proceed or fail. + int32_t encoder_last_error_; + + // Manages buffers containing audio samples from the plugin. + scoped_ptr<ppapi::MediaStreamBufferManager> audio_buffer_manager_; + + // Manages buffers containing encoded audio from the browser. + scoped_ptr<ppapi::MediaStreamBufferManager> bitstream_buffer_manager_; + + // Media task runner used to run the encoder. + scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_; + + // The encoder actually doing the work. + scoped_ptr<AudioEncoderImpl> encoder_; + + base::WeakPtrFactory<PepperAudioEncoderHost> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(PepperAudioEncoderHost); +}; + +} // namespace content + +#endif // CONTENT_RENDERER_PEPPER_PEPPER_AUDIO_ENCODER_HOST_H_
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index e67b589..c0d5b8a 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc
@@ -37,6 +37,7 @@ #include "cc/base/switches.h" #include "cc/blink/web_external_bitmap_impl.h" #include "cc/blink/web_layer_impl.h" +#include "cc/layers/layer_settings.h" #include "cc/raster/task_graph_runner.h" #include "cc/trees/layer_tree_settings.h" #include "components/scheduler/renderer/renderer_scheduler.h"
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc index 9a8aaf1..3f4c190 100644 --- a/content/renderer/render_widget.cc +++ b/content/renderer/render_widget.cc
@@ -753,6 +753,7 @@ IPC_MESSAGE_HANDLER(InputMsg_ImeEventAck, OnImeEventAck) IPC_MESSAGE_HANDLER(ViewMsg_ShowImeIfNeeded, OnShowImeIfNeeded) #endif + IPC_MESSAGE_HANDLER(ViewMsg_HandleCompositorProto, OnHandleCompositorProto) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; @@ -1753,6 +1754,11 @@ compositor_->SetSurfaceIdNamespace(surface_id_namespace); } +void RenderWidget::OnHandleCompositorProto(const std::vector<uint8_t>& proto) { + if (compositor_) + compositor_->OnHandleCompositorProto(proto); +} + void RenderWidget::showImeIfNeeded() { OnShowImeIfNeeded(); } @@ -2047,6 +2053,10 @@ UpdateCompositionInfo(false); } +void RenderWidget::ForwardCompositorProto(const std::vector<uint8_t>& proto) { + Send(new ViewHostMsg_ForwardCompositorProto(routing_id_, proto)); +} + // Check blink::WebTextInputType and ui::TextInputType is kept in sync. #define STATIC_ASSERT_WTIT_ENUM_MATCH(a, b) \ static_assert(int(blink::WebTextInputType##a) \
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h index d062a1f..b7ef993 100644 --- a/content/renderer/render_widget.h +++ b/content/renderer/render_widget.h
@@ -302,6 +302,10 @@ // the new value will be sent to the browser process. void UpdateSelectionBounds(); + // Called by the compositor to forward a proto that represents serialized + // compositor state. + void ForwardCompositorProto(const std::vector<uint8_t>& proto); + virtual void GetSelectionBounds(gfx::Rect* start, gfx::Rect* end); void OnShowHostContextMenu(ContextMenuParams* params); @@ -447,6 +451,7 @@ const gfx::Rect& window_screen_rect); void OnShowImeIfNeeded(); void OnSetSurfaceIdNamespace(uint32_t surface_id_namespace); + void OnHandleCompositorProto(const std::vector<uint8_t>& proto); #if defined(OS_ANDROID) // Called when we send IME event that expects an ACK.
diff --git a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java index c06d032..0774ea2 100644 --- a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java +++ b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java
@@ -4,6 +4,7 @@ package org.chromium.device.bluetooth; +import android.Manifest; import android.annotation.TargetApi; import android.bluetooth.BluetoothAdapter; import android.bluetooth.le.ScanSettings; @@ -168,13 +169,22 @@ // Implementation details: /** + * @return true if Chromium has permission to scan for Bluetooth devices. + */ + private boolean canScan() { + Wrappers.ContextWrapper context = mAdapter.getContext(); + return context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION) + || context.checkPermission(Manifest.permission.ACCESS_FINE_LOCATION); + } + + /** * Starts a Low Energy scan. * @return True on success. */ private boolean startScan() { Wrappers.BluetoothLeScannerWrapper scanner = mAdapter.getBluetoothLeScanner(); - if (!scanner.canScan()) { + if (!canScan()) { return false; }
diff --git a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java index 4e67049f..56e9e7e2 100644 --- a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java +++ b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java
@@ -50,6 +50,7 @@ */ static class BluetoothAdapterWrapper { private final BluetoothAdapter mAdapter; + protected final ContextWrapper mContext; protected final BluetoothLeScannerWrapper mScanner; /** @@ -92,17 +93,22 @@ Log.i(TAG, "BluetoothAdapterWrapper.create failed: Default adapter not found."); return null; } else { - return new BluetoothAdapterWrapper(adapter, - new BluetoothLeScannerWrapper(context, adapter.getBluetoothLeScanner())); + return new BluetoothAdapterWrapper(adapter, new ContextWrapper(context), + new BluetoothLeScannerWrapper(adapter.getBluetoothLeScanner())); } } - public BluetoothAdapterWrapper( - BluetoothAdapter adapter, BluetoothLeScannerWrapper scanner) { + public BluetoothAdapterWrapper(BluetoothAdapter adapter, ContextWrapper context, + BluetoothLeScannerWrapper scanner) { mAdapter = adapter; + mContext = context; mScanner = scanner; } + public ContextWrapper getContext() { + return mContext; + } + public BluetoothLeScannerWrapper getBluetoothLeScanner() { return mScanner; } @@ -129,31 +135,33 @@ } /** + * Wraps android.content.Context. + */ + static class ContextWrapper { + private final Context mContext; + + public ContextWrapper(Context context) { + mContext = context; + } + + public boolean checkPermission(String permission) { + return mContext.checkPermission(permission, Process.myPid(), Process.myUid()) + == PackageManager.PERMISSION_GRANTED; + } + } + + /** * Wraps android.bluetooth.BluetoothLeScanner. */ static class BluetoothLeScannerWrapper { - private final Context mContext; private final BluetoothLeScanner mScanner; private final HashMap<ScanCallbackWrapper, ForwardScanCallbackToWrapper> mCallbacks; - public BluetoothLeScannerWrapper(Context context, BluetoothLeScanner scanner) { - mContext = context; + public BluetoothLeScannerWrapper(BluetoothLeScanner scanner) { mScanner = scanner; mCallbacks = new HashMap<ScanCallbackWrapper, ForwardScanCallbackToWrapper>(); } - // Returns true if we have permission to get results from a scan. - public boolean canScan() { - int myPid = Process.myPid(); - int myUid = Process.myUid(); - return mContext.checkPermission( - Manifest.permission.ACCESS_COARSE_LOCATION, myPid, myUid) - == PackageManager.PERMISSION_GRANTED - || mContext.checkPermission( - Manifest.permission.ACCESS_FINE_LOCATION, myPid, myUid) - == PackageManager.PERMISSION_GRANTED; - } - public void startScan( List<ScanFilter> filters, int scanSettingsScanMode, ScanCallbackWrapper callback) { ScanSettings settings =
diff --git a/device/bluetooth/bluetooth_adapter_unittest.cc b/device/bluetooth/bluetooth_adapter_unittest.cc index fccb128..8b7f86f 100644 --- a/device/bluetooth/bluetooth_adapter_unittest.cc +++ b/device/bluetooth/bluetooth_adapter_unittest.cc
@@ -474,6 +474,28 @@ #endif // defined(OS_ANDROID) #if defined(OS_ANDROID) || defined(OS_MACOSX) +// Checks that discovery fails (instead of hanging) when permissions are denied. +TEST_F(BluetoothTest, NoPermissions) { + if (!PlatformSupportsLowEnergy()) { + LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; + return; + } + InitWithFakeAdapter(); + TestBluetoothAdapterObserver observer(adapter_); + + if (!DenyPermission()) { + // Platform always gives permission to scan. + return; + } + + StartLowEnergyDiscoverySession(); + + EXPECT_EQ(0, callback_count_); + EXPECT_EQ(1, error_callback_count_); +} +#endif // defined(OS_ANDROID) || defined(OS_MACOSX) + +#if defined(OS_ANDROID) || defined(OS_MACOSX) // Discovers a device. TEST_F(BluetoothTest, DiscoverLowEnergyDevice) { if (!PlatformSupportsLowEnergy()) {
diff --git a/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java b/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java index 5a480c79..d01cc1e 100644 --- a/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java +++ b/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java
@@ -4,6 +4,7 @@ package org.chromium.device.bluetooth; +import android.Manifest; import android.annotation.TargetApi; import android.bluetooth.BluetoothDevice; import android.bluetooth.le.ScanFilter; @@ -18,7 +19,9 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.UUID; /** @@ -33,6 +36,7 @@ * Fakes android.bluetooth.BluetoothAdapter. */ static class FakeBluetoothAdapter extends Wrappers.BluetoothAdapterWrapper { + private final FakeContext mFakeContext; private final FakeBluetoothLeScanner mFakeScanner; final long mNativeBluetoothTestAndroid; @@ -46,11 +50,17 @@ } private FakeBluetoothAdapter(long nativeBluetoothTestAndroid) { - super(null, new FakeBluetoothLeScanner()); + super(null, new FakeContext(), new FakeBluetoothLeScanner()); mNativeBluetoothTestAndroid = nativeBluetoothTestAndroid; + mFakeContext = (FakeContext) mContext; mFakeScanner = (FakeBluetoothLeScanner) mScanner; } + @CalledByNative("FakeBluetoothAdapter") + public void denyPermission() { + mFakeContext.mPermissions.clear(); + } + /** * Creates and discovers a new device. */ @@ -130,19 +140,30 @@ } /** + * Fakes android.content.Context. + */ + static class FakeContext extends Wrappers.ContextWrapper { + public final Set<String> mPermissions = new HashSet<String>(); + + public FakeContext() { + super(null); + mPermissions.add(Manifest.permission.ACCESS_COARSE_LOCATION); + } + + @Override + public boolean checkPermission(String permission) { + return mPermissions.contains(permission); + } + } + + /** * Fakes android.bluetooth.le.BluetoothLeScanner. */ static class FakeBluetoothLeScanner extends Wrappers.BluetoothLeScannerWrapper { public Wrappers.ScanCallbackWrapper mScanCallback; - public boolean mCanScan = true; private FakeBluetoothLeScanner() { - super(null, null); - } - - @Override - public boolean canScan() { - return mCanScan; + super(null); } @Override
diff --git a/device/bluetooth/test/bluetooth_test.cc b/device/bluetooth/test/bluetooth_test.cc index 70d457f..c80b824 100644 --- a/device/bluetooth/test/bluetooth_test.cc +++ b/device/bluetooth/test/bluetooth_test.cc
@@ -38,6 +38,10 @@ base::RunLoop().RunUntilIdle(); } +bool BluetoothTestBase::DenyPermission() { + return false; +} + BluetoothDevice* BluetoothTestBase::DiscoverLowEnergyDevice( int device_ordinal) { NOTIMPLEMENTED();
diff --git a/device/bluetooth/test/bluetooth_test.h b/device/bluetooth/test/bluetooth_test.h index c4f8687..e6ccc6c5 100644 --- a/device/bluetooth/test/bluetooth_test.h +++ b/device/bluetooth/test/bluetooth_test.h
@@ -65,6 +65,10 @@ // controlled by this test fixture. virtual void InitWithFakeAdapter(){}; + // Configures the fake adapter to lack the necessary permissions to scan for + // devices. Returns false if the current platform always has permission. + virtual bool DenyPermission(); + // Create a fake Low Energy device and discover it. // |device_ordinal| selects between multiple fake device data sets to produce: // 1: kTestDeviceName with advertised UUIDs kTestUUIDGenericAccess,
diff --git a/device/bluetooth/test/bluetooth_test_android.cc b/device/bluetooth/test/bluetooth_test_android.cc index 28514f7..3e9d83f 100644 --- a/device/bluetooth/test/bluetooth_test_android.cc +++ b/device/bluetooth/test/bluetooth_test_android.cc
@@ -57,6 +57,12 @@ BluetoothAdapterAndroid::Create(j_fake_bluetooth_adapter_.obj()).get(); } +bool BluetoothTestAndroid::DenyPermission() { + Java_FakeBluetoothAdapter_denyPermission(AttachCurrentThread(), + j_fake_bluetooth_adapter_.obj()); + return true; +} + BluetoothDevice* BluetoothTestAndroid::DiscoverLowEnergyDevice( int device_ordinal) { TestBluetoothAdapterObserver observer(adapter_);
diff --git a/device/bluetooth/test/bluetooth_test_android.h b/device/bluetooth/test/bluetooth_test_android.h index d807e4c5..0b917a7 100644 --- a/device/bluetooth/test/bluetooth_test_android.h +++ b/device/bluetooth/test/bluetooth_test_android.h
@@ -26,6 +26,7 @@ void InitWithDefaultAdapter() override; void InitWithoutDefaultAdapter() override; void InitWithFakeAdapter() override; + bool DenyPermission() override; BluetoothDevice* DiscoverLowEnergyDevice(int device_ordinal) override; void SimulateGattConnection(BluetoothDevice* device) override; void SimulateGattConnectionError(BluetoothDevice* device,
diff --git a/extensions/common/file_util.cc b/extensions/common/file_util.cc index 8ec4c99..763fa29 100644 --- a/extensions/common/file_util.cc +++ b/extensions/common/file_util.cc
@@ -67,9 +67,13 @@ // Returns true if the extension installation should flush all files and the // directory. bool UseSafeInstallation() { - const char kFieldTrialName[] = "ExtensionUseSafeInstallation"; - const char kEnable[] = "Enable"; - return base::FieldTrialList::FindFullName(kFieldTrialName) == kEnable; + if (g_use_safe_installation == DEFAULT) { + const char kFieldTrialName[] = "ExtensionUseSafeInstallation"; + const char kEnable[] = "Enable"; + return base::FieldTrialList::FindFullName(kFieldTrialName) == kEnable; + } + + return g_use_safe_installation == ENABLED; } enum FlushOneOrAllFiles {
diff --git a/gpu/blink/webgraphicscontext3d_impl.cc b/gpu/blink/webgraphicscontext3d_impl.cc index 139dace..c73825c 100644 --- a/gpu/blink/webgraphicscontext3d_impl.cc +++ b/gpu/blink/webgraphicscontext3d_impl.cc
@@ -213,16 +213,16 @@ return flush_id_; } -bool WebGraphicsContext3DImpl::insertSyncPoint(WGC3Dbyte* sync_token) { - const uint32_t sync_point = gl_->InsertSyncPointCHROMIUM(); - if (!sync_point) - return false; +DELEGATE_TO_GL_R(insertFenceSyncCHROMIUM, InsertFenceSyncCHROMIUM, WGC3Duint64) - gpu::SyncToken sync_token_data(sync_point); - memcpy(sync_token, &sync_token_data, sizeof(sync_token_data)); +bool WebGraphicsContext3DImpl::genSyncTokenCHROMIUM(WGC3Duint64 fenceSync, + WGC3Dbyte* syncToken) { + gl_->GenSyncTokenCHROMIUM(fenceSync, syncToken); return true; } +DELEGATE_TO_GL_1(waitSyncTokenCHROMIUM, WaitSyncTokenCHROMIUM, const WGC3Dbyte*) + DELEGATE_TO_GL_3(reshapeWithScaleFactor, ResizeCHROMIUM, int, int, float) DELEGATE_TO_GL_4R(mapBufferSubDataCHROMIUM, MapBufferSubDataCHROMIUM, WGC3Denum, @@ -573,6 +573,15 @@ reinterpret_cast<const char*>(gl_->GetString(name))); } +void WebGraphicsContext3DImpl::getSynciv(blink::WGC3Dsync sync, + blink::WGC3Denum pname, + blink::WGC3Dsizei bufSize, + blink::WGC3Dsizei *length, + blink::WGC3Dint *params) { + return gl_->GetSynciv( + reinterpret_cast<GLsync>(sync), pname, bufSize, length, params); +} + DELEGATE_TO_GL_3(getTexParameterfv, GetTexParameterfv, WGC3Denum, WGC3Denum, WGC3Dfloat*) @@ -888,8 +897,6 @@ gl_->ShallowFinishCHROMIUM(); } -DELEGATE_TO_GL_1(waitSyncToken, WaitSyncTokenCHROMIUM, const WGC3Dbyte*) - void WebGraphicsContext3DImpl::loseContextCHROMIUM( WGC3Denum current, WGC3Denum other) { gl_->LoseContextCHROMIUM(current, other);
diff --git a/gpu/blink/webgraphicscontext3d_impl.h b/gpu/blink/webgraphicscontext3d_impl.h index 6a644c9..ec300ef 100644 --- a/gpu/blink/webgraphicscontext3d_impl.h +++ b/gpu/blink/webgraphicscontext3d_impl.h
@@ -37,8 +37,10 @@ uint32_t lastFlushID() override; - bool insertSyncPoint(blink::WGC3Dbyte* sync_token) override; - void waitSyncToken(const blink::WGC3Dbyte* sync_token) override; + blink::WGC3Duint64 insertFenceSyncCHROMIUM() override; + bool genSyncTokenCHROMIUM(blink::WGC3Duint64 fenceSync, + blink::WGC3Dbyte* syncToken) override; + void waitSyncTokenCHROMIUM(const blink::WGC3Dbyte* syncToken) override; void loseContextCHROMIUM(blink::WGC3Denum current, blink::WGC3Denum other) override; @@ -227,6 +229,12 @@ blink::WebString getShaderSource(blink::WebGLId shader) override; blink::WebString getString(blink::WGC3Denum name) override; + void getSynciv(blink::WGC3Dsync sync, + blink::WGC3Denum pname, + blink::WGC3Dsizei bufSize, + blink::WGC3Dsizei *length, + blink::WGC3Dint *params) override; + void getTexParameterfv(blink::WGC3Denum target, blink::WGC3Denum pname, blink::WGC3Dfloat* value) override;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 3c5aa83..fbdd7d3 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -1120,6 +1120,9 @@ // Wrapper for SwapBuffers. void DoSwapBuffers(); + // Callback for async SwapBuffers. + void FinishSwapBuffers(gfx::SwapResult result); + // Wrapper for SwapInterval. void DoSwapInterval(int interval); @@ -2222,6 +2225,7 @@ bool context_was_lost_; bool reset_by_robustness_extension_; bool supports_post_sub_buffer_; + bool supports_async_swap_; ContextType context_type_; @@ -2767,6 +2771,7 @@ context_was_lost_(false), reset_by_robustness_extension_(false), supports_post_sub_buffer_(false), + supports_async_swap_(false), context_type_(CONTEXT_TYPE_OPENGLES2), derivatives_explicitly_enabled_(false), frag_depth_explicitly_enabled_(false), @@ -3217,6 +3222,8 @@ !surface->IsOffscreen()) supports_post_sub_buffer_ = false; + supports_async_swap_ = surface->SupportsAsyncSwap(); + if (feature_info_->workarounds().reverse_point_sprite_coord_origin) { glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT); } @@ -9294,11 +9301,8 @@ glReadPixels(x, y, width, height, format, type, 0); pending_readpixel_fences_.push(linked_ptr<FenceCallback>( new FenceCallback())); - WaitForReadPixels(base::Bind( - &GLES2DecoderImpl::FinishReadPixels, - base::internal::SupportsWeakPtrBase::StaticAsWeakPtr - <GLES2DecoderImpl>(this), - c, buffer)); + WaitForReadPixels(base::Bind(&GLES2DecoderImpl::FinishReadPixels, + base::AsWeakPtr(this), c, buffer)); glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); return error::kNoError; } else { @@ -9385,13 +9389,17 @@ gpu_state_tracer_->TakeSnapshotWithCurrentFramebuffer( is_offscreen ? offscreen_size_ : surface_->GetSize()); } - if (surface_->PostSubBuffer(c.x, c.y, c.width, c.height) != - gfx::SwapResult::SWAP_FAILED) { - return error::kNoError; + + if (supports_async_swap_) { + surface_->PostSubBufferAsync( + c.x, c.y, c.width, c.height, + base::Bind(&GLES2DecoderImpl::FinishSwapBuffers, + base::AsWeakPtr(this))); } else { - LOG(ERROR) << "Context lost because PostSubBuffer failed."; - return error::kLostContext; + FinishSwapBuffers(surface_->PostSubBuffer(c.x, c.y, c.width, c.height)); } + + return error::kNoError; } error::Error GLES2DecoderImpl::HandleScheduleOverlayPlaneCHROMIUM( @@ -9409,12 +9417,16 @@ Texture::ImageState image_state; gl::GLImage* image = ref->texture()->GetLevelImage(ref->texture()->target(), 0, &image_state); - if (!image || image_state != Texture::BOUND) { + if (!image) { LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glScheduleOverlayPlaneCHROMIUM", "unsupported texture format"); return error::kNoError; } + if (image_state != Texture::BOUND) { + // No-op case for pass-through overlays (such as on Chromecast). + return error::kNoError; + } gfx::OverlayTransform transform = GetGFXOverlayTransform(c.plane_transform); if (transform == gfx::OVERLAY_TRANSFORM_INVALID) { LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, @@ -11963,14 +11975,11 @@ if (!feature_info_->gl_version_info().is_angle) glFlush(); } + } else if (supports_async_swap_) { + surface_->SwapBuffersAsync(base::Bind(&GLES2DecoderImpl::FinishSwapBuffers, + base::AsWeakPtr(this))); } else { - if (surface_->SwapBuffers() == gfx::SwapResult::SWAP_FAILED) { - LOG(ERROR) << "Context lost because SwapBuffers failed."; - if (!CheckResetStatus()) { - MarkContextLost(error::kUnknown); - group_->LoseContexts(error::kUnknown); - } - } + FinishSwapBuffers(surface_->SwapBuffers()); } // This may be a slow command. Exit command processing to allow for @@ -11978,6 +11987,16 @@ ExitCommandProcessingEarly(); } +void GLES2DecoderImpl::FinishSwapBuffers(gfx::SwapResult result) { + if (result == gfx::SwapResult::SWAP_FAILED) { + LOG(ERROR) << "Context lost because SwapBuffers failed."; + if (!CheckResetStatus()) { + MarkContextLost(error::kUnknown); + group_->LoseContexts(error::kUnknown); + } + } +} + void GLES2DecoderImpl::DoSwapInterval(int interval) { context_->SetSwapInterval(interval); }
diff --git a/gpu/config/gpu_test_config.cc b/gpu/config/gpu_test_config.cc index 4605f89..a7cc4b41 100644 --- a/gpu/config/gpu_test_config.cc +++ b/gpu/config/gpu_test_config.cc
@@ -61,6 +61,8 @@ return GPUTestConfig::kOsMacMavericks; case 10: return GPUTestConfig::kOsMacYosemite; + case 11: + return GPUTestConfig::kOsMacElCapitan; } } #elif defined(OS_ANDROID) @@ -183,6 +185,7 @@ case kOsMacMountainLion: case kOsMacMavericks: case kOsMacYosemite: + case kOsMacElCapitan: case kOsLinux: case kOsChromeOS: case kOsAndroid:
diff --git a/gpu/config/gpu_test_config.h b/gpu/config/gpu_test_config.h index 10ab9de..b5431e6 100644 --- a/gpu/config/gpu_test_config.h +++ b/gpu/config/gpu_test_config.h
@@ -30,12 +30,14 @@ kOsMacMountainLion = 1 << 7, kOsMacMavericks = 1 << 8, kOsMacYosemite = 1 << 9, + kOsMacElCapitan = 1 << 10, kOsMac = kOsMacLeopard | kOsMacSnowLeopard | kOsMacLion | - kOsMacMountainLion | kOsMacMavericks | kOsMacYosemite, - kOsLinux = 1 << 10, - kOsChromeOS = 1 << 11, - kOsAndroid = 1 << 12, - kOsWin10 = 1 << 13, + kOsMacMountainLion | kOsMacMavericks | kOsMacYosemite | + kOsMacElCapitan, + kOsLinux = 1 << 11, + kOsChromeOS = 1 << 12, + kOsAndroid = 1 << 13, + kOsWin10 = 1 << 14, kOsWin = kOsWinXP | kOsWinVista | kOsWin7 | kOsWin8 | kOsWin10, };
diff --git a/gpu/config/gpu_test_expectations_parser.cc b/gpu/config/gpu_test_expectations_parser.cc index 27a1487..6dac74e 100644 --- a/gpu/config/gpu_test_expectations_parser.cc +++ b/gpu/config/gpu_test_expectations_parser.cc
@@ -39,6 +39,7 @@ kConfigMacMountainLion, kConfigMacMavericks, kConfigMacYosemite, + kConfigMacElCapitan, kConfigMac, kConfigLinux, kConfigChromeOS, @@ -92,6 +93,7 @@ {"mountainlion", GPUTestConfig::kOsMacMountainLion}, {"mavericks", GPUTestConfig::kOsMacMavericks}, {"yosemite", GPUTestConfig::kOsMacYosemite}, + {"elcapitan", GPUTestConfig::kOsMacElCapitan}, {"mac", GPUTestConfig::kOsMac}, {"linux", GPUTestConfig::kOsLinux}, {"chromeos", GPUTestConfig::kOsChromeOS}, @@ -253,6 +255,7 @@ case kConfigMacMountainLion: case kConfigMacMavericks: case kConfigMacYosemite: + case kConfigMacElCapitan: case kConfigMac: case kConfigLinux: case kConfigChromeOS: @@ -311,6 +314,7 @@ case kConfigMacMountainLion: case kConfigMacMavericks: case kConfigMacYosemite: + case kConfigMacElCapitan: case kConfigMac: case kConfigLinux: case kConfigChromeOS: @@ -431,6 +435,7 @@ case kConfigMacMountainLion: case kConfigMacMavericks: case kConfigMacYosemite: + case kConfigMacElCapitan: case kConfigMac: case kConfigLinux: case kConfigChromeOS:
diff --git a/gpu/config/gpu_test_expectations_parser_unittest.cc b/gpu/config/gpu_test_expectations_parser_unittest.cc index 126394ce..b69703e 100644 --- a/gpu/config/gpu_test_expectations_parser_unittest.cc +++ b/gpu/config/gpu_test_expectations_parser_unittest.cc
@@ -33,6 +33,7 @@ { { "MOUNTAINLION", GPUTestConfig::kOsMacMountainLion }, kOsFamilyMac }, { { "MAVERICKS", GPUTestConfig::kOsMacMavericks }, kOsFamilyMac }, { { "YOSEMITE", GPUTestConfig::kOsMacYosemite }, kOsFamilyMac }, + { { "ELCAPITAN", GPUTestConfig::kOsMacElCapitan }, kOsFamilyMac }, { { "LINUX", GPUTestConfig::kOsLinux }, { "LINUX", GPUTestConfig::kOsLinux } }, { { "CHROMEOS", GPUTestConfig::kOsChromeOS },
diff --git a/mandoline/services/core_services/core_services_application_delegate.cc b/mandoline/services/core_services/core_services_application_delegate.cc index 093beac..7c970f29 100644 --- a/mandoline/services/core_services/core_services_application_delegate.cc +++ b/mandoline/services/core_services/core_services_application_delegate.cc
@@ -97,7 +97,6 @@ } void CoreServicesApplicationDelegate::Initialize(mojo::ApplicationImpl* app) { - base::PlatformThread::SetName("CoreServicesDispatcher"); mojo::logging::InitLogging(); tracing_.Initialize(app); }
diff --git a/mandoline/ui/desktop_ui/browser_manager.cc b/mandoline/ui/desktop_ui/browser_manager.cc index 3cb2b69..1049472 100644 --- a/mandoline/ui/desktop_ui/browser_manager.cc +++ b/mandoline/ui/desktop_ui/browser_manager.cc
@@ -49,6 +49,7 @@ void BrowserManager::Initialize(mojo::ApplicationImpl* app) { app_ = app; + tracing_.Initialize(app); mojo::URLRequestPtr request(mojo::URLRequest::New()); request->url = "mojo:mus";
diff --git a/mandoline/ui/desktop_ui/browser_manager.h b/mandoline/ui/desktop_ui/browser_manager.h index 6eee78f8..9066849 100644 --- a/mandoline/ui/desktop_ui/browser_manager.h +++ b/mandoline/ui/desktop_ui/browser_manager.h
@@ -13,6 +13,7 @@ #include "mojo/application/public/cpp/application_impl.h" #include "mojo/application/public/cpp/connect.h" #include "mojo/common/weak_binding_set.h" +#include "mojo/services/tracing/public/cpp/tracing_impl.h" #include "url/gurl.h" namespace mojo { @@ -53,6 +54,7 @@ mojo::InterfaceRequest<LaunchHandler> request) override; mojo::ApplicationImpl* app_; + mojo::TracingImpl tracing_; mus::mojom::WindowTreeHostFactoryPtr host_factory_; mojo::WeakBindingSet<LaunchHandler> launch_handler_bindings_; std::set<BrowserWindow*> browsers_;
diff --git a/mandoline/ui/omnibox/BUILD.gn b/mandoline/ui/omnibox/BUILD.gn index d3d87bf6..42c1fdba 100644 --- a/mandoline/ui/omnibox/BUILD.gn +++ b/mandoline/ui/omnibox/BUILD.gn
@@ -33,6 +33,7 @@ "//mojo/common", "//mojo/converters/geometry", "//mojo/public/cpp/bindings", + "//mojo/services/tracing/public/cpp", "//skia", "//ui/gfx/geometry", "//ui/mojo/init",
diff --git a/mandoline/ui/omnibox/DEPS b/mandoline/ui/omnibox/DEPS index 39647649..838b0a6 100644 --- a/mandoline/ui/omnibox/DEPS +++ b/mandoline/ui/omnibox/DEPS
@@ -5,5 +5,6 @@ "+mojo/common", "+mojo/converters", "+mojo/public", + "+mojo/services/tracing/public/cpp", "+ui", ]
diff --git a/mandoline/ui/omnibox/omnibox_application.cc b/mandoline/ui/omnibox/omnibox_application.cc index 631a3863..69b228b 100644 --- a/mandoline/ui/omnibox/omnibox_application.cc +++ b/mandoline/ui/omnibox/omnibox_application.cc
@@ -82,6 +82,7 @@ void OmniboxApplication::Initialize(mojo::ApplicationImpl* app) { app_ = app; + tracing_.Initialize(app); } bool OmniboxApplication::ConfigureIncomingConnection(
diff --git a/mandoline/ui/omnibox/omnibox_application.h b/mandoline/ui/omnibox/omnibox_application.h index c14dd82..eeeea7f 100644 --- a/mandoline/ui/omnibox/omnibox_application.h +++ b/mandoline/ui/omnibox/omnibox_application.h
@@ -9,6 +9,7 @@ #include "mandoline/ui/desktop_ui/public/interfaces/omnibox.mojom.h" #include "mojo/application/public/cpp/application_delegate.h" #include "mojo/application/public/cpp/interface_factory.h" +#include "mojo/services/tracing/public/cpp/tracing_impl.h" namespace mojo { class ApplicationImpl; @@ -33,6 +34,7 @@ mojo::InterfaceRequest<Omnibox> request) override; mojo::ApplicationImpl* app_; + mojo::TracingImpl tracing_; DISALLOW_COPY_AND_ASSIGN(OmniboxApplication); };
diff --git a/mash/wm/BUILD.gn b/mash/wm/BUILD.gn index f26c2f4..fc8d2e86 100644 --- a/mash/wm/BUILD.gn +++ b/mash/wm/BUILD.gn
@@ -5,6 +5,7 @@ import("//build/config/ui.gni") import("//mojo/public/mojo_application.gni") import("//mojo/public/tools/bindings/mojom.gni") +import("//tools/grit/repack.gni") group("wm") { testonly = true @@ -18,14 +19,26 @@ sources = [ "background_layout.cc", "background_layout.h", + "frame/caption_buttons/caption_button_types.h", + "frame/caption_buttons/frame_caption_button.cc", + "frame/caption_buttons/frame_caption_button.h", + "frame/caption_buttons/frame_caption_button_container_view.cc", + "frame/caption_buttons/frame_caption_button_container_view.h", + "frame/default_header_painter.cc", + "frame/default_header_painter.h", + "frame/frame_border_hit_test_controller.cc", + "frame/frame_border_hit_test_controller.h", + "frame/header_painter.h", + "frame/header_painter_util.cc", + "frame/header_painter_util.h", + "frame/move_loop.cc", + "frame/move_loop.h", + "frame/non_client_frame_view_mash.cc", + "frame/non_client_frame_view_mash.h", "layout_manager.cc", "layout_manager.h", - "move_loop.cc", - "move_loop.h", "non_client_frame_controller.cc", "non_client_frame_controller.h", - "non_client_frame_view_impl.cc", - "non_client_frame_view_impl.h", "property_util.cc", "property_util.h", "shelf_layout.cc", @@ -44,12 +57,19 @@ "//components/mus/public/cpp", "//components/mus/public/interfaces", "//mash/wm/public/interfaces", + "//mash/wm/resources", "//mojo/application/public/cpp", "//mojo/common:common_base", "//mojo/converters/geometry", "//mojo/converters/input_events", + "//mojo/services/tracing/public/cpp", "//skia", + "//ui/aura", + "//ui/events", + "//ui/gfx", + "//ui/gfx/geometry", "//ui/mojo/init", + "//ui/strings", "//ui/views", "//ui/views/mus:for_mojo_application", ] @@ -62,15 +82,33 @@ deps = [ ":example_wm_lib", + ":resources", "//mojo/application/public/cpp", - "//ui/views/mus:resources", ] data_deps = [ "//components/mus", ] - resources = [ "$root_out_dir/views_mus_resources.pak" ] + resources = [ "$root_out_dir/mash_wm_resources.pak" ] +} + +repack("resources") { + sources = [ + "$root_gen_dir/mash/wm/resources/mash_wm_resources_100_percent.pak", + "$root_gen_dir/ui/resources/ui_resources_100_percent.pak", + "$root_gen_dir/ui/strings/app_locale_settings_en-US.pak", + "$root_gen_dir/ui/strings/ui_strings_en-US.pak", + "$root_gen_dir/ui/views/resources/views_resources_100_percent.pak", + ] + output = "$root_out_dir/mash_wm_resources.pak" + deps = [ + "//mash/wm/resources", + "//ui/resources", + "//ui/strings", + "//ui/views/mus:resources", + "//ui/views/resources", + ] } mojo_native_application("apptests") { @@ -104,7 +142,7 @@ testonly = true sources = [ - "move_loop_unittest.cc", + "frame/move_loop_unittest.cc", ] deps = [
diff --git a/mash/wm/DEPS b/mash/wm/DEPS new file mode 100644 index 0000000..810a46a3 --- /dev/null +++ b/mash/wm/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+grit/mash_wm_resources.h", +]
diff --git a/mash/wm/frame/caption_buttons/caption_button_types.h b/mash/wm/frame/caption_buttons/caption_button_types.h new file mode 100644 index 0000000..3bda201 --- /dev/null +++ b/mash/wm/frame/caption_buttons/caption_button_types.h
@@ -0,0 +1,27 @@ +// Copyright 2015 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. + +#ifndef MASH_WM_FRAME_CAPTION_BUTTONS_CAPTION_BUTTON_TYPES_H_ +#define MASH_WM_FRAME_CAPTION_BUTTONS_CAPTION_BUTTON_TYPES_H_ + +namespace mash { +namespace wm { + +// These are the icon types that a caption button can have. The size button's +// action (SnapType) can be different from its icon. +enum CaptionButtonIcon { + CAPTION_BUTTON_ICON_MINIMIZE, + CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE, + CAPTION_BUTTON_ICON_CLOSE, + CAPTION_BUTTON_ICON_LEFT_SNAPPED, + CAPTION_BUTTON_ICON_RIGHT_SNAPPED, + CAPTION_BUTTON_ICON_BACK, + CAPTION_BUTTON_ICON_LOCATION, + CAPTION_BUTTON_ICON_COUNT +}; + +} // namespace wm +} // namespace mash + +#endif // MASH_WM_FRAME_CAPTION_BUTTONS_CAPTION_BUTTON_TYPES_H_
diff --git a/mash/wm/frame/caption_buttons/frame_caption_button.cc b/mash/wm/frame/caption_buttons/frame_caption_button.cc new file mode 100644 index 0000000..ca1501f --- /dev/null +++ b/mash/wm/frame/caption_buttons/frame_caption_button.cc
@@ -0,0 +1,195 @@ +// Copyright 2015 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 "mash/wm/frame/caption_buttons/frame_caption_button.h" + +#include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/animation/slide_animation.h" +#include "ui/gfx/animation/throb_animation.h" +#include "ui/gfx/canvas.h" + +namespace mash { +namespace wm { + +namespace { + +// The duration of the crossfade animation when swapping the button's images. +const int kSwapImagesAnimationDurationMs = 200; + +// The duration of the fade out animation of the old icon during a crossfade +// animation as a ratio of |kSwapImagesAnimationDurationMs|. +const float kFadeOutRatio = 0.5f; + +// The alpha to draw inactive icons with. +const float kInactiveIconAlpha = 0.2f; + +} // namespace + +// static +const char FrameCaptionButton::kViewClassName[] = "FrameCaptionButton"; + +FrameCaptionButton::FrameCaptionButton(views::ButtonListener* listener, + CaptionButtonIcon icon) + : CustomButton(listener), + icon_(icon), + paint_as_active_(false), + alpha_(255), + icon_image_id_(-1), + hovered_background_image_id_(-1), + pressed_background_image_id_(-1), + swap_images_animation_(new gfx::SlideAnimation(this)) { + swap_images_animation_->Reset(1); + + // Do not flip the gfx::Canvas passed to the OnPaint() method. The snap left + // and snap right button icons should not be flipped. The other icons are + // horizontally symmetrical. +} + +FrameCaptionButton::~FrameCaptionButton() {} + +void FrameCaptionButton::SetImages(CaptionButtonIcon icon, + Animate animate, + int icon_image_id, + int hovered_background_image_id, + int pressed_background_image_id) { + // The early return is dependant on |animate| because callers use SetImages() + // with ANIMATE_NO to progress the crossfade animation to the end. + if (icon == icon_ && + (animate == ANIMATE_YES || !swap_images_animation_->is_animating()) && + icon_image_id == icon_image_id_ && + hovered_background_image_id == hovered_background_image_id_ && + pressed_background_image_id == pressed_background_image_id_) { + return; + } + + if (animate == ANIMATE_YES) + crossfade_icon_image_ = icon_image_; + + icon_ = icon; + icon_image_id_ = icon_image_id; + // TODO(sky): it doesn't seem like these are used. + hovered_background_image_id_ = hovered_background_image_id; + pressed_background_image_id_ = pressed_background_image_id; + + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); + icon_image_ = *rb.GetImageSkiaNamed(icon_image_id); + hovered_background_image_ = + *rb.GetImageSkiaNamed(hovered_background_image_id); + pressed_background_image_ = + *rb.GetImageSkiaNamed(pressed_background_image_id); + + if (animate == ANIMATE_YES) { + swap_images_animation_->Reset(0); + swap_images_animation_->SetSlideDuration(kSwapImagesAnimationDurationMs); + swap_images_animation_->Show(); + } else { + swap_images_animation_->Reset(1); + } + PreferredSizeChanged(); + SchedulePaint(); +} + +bool FrameCaptionButton::IsAnimatingImageSwap() const { + return swap_images_animation_->is_animating(); +} + +void FrameCaptionButton::SetAlpha(int alpha) { + if (alpha_ != alpha) { + alpha_ = alpha; + SchedulePaint(); + } +} + +gfx::Size FrameCaptionButton::GetPreferredSize() const { + return hovered_background_image_.isNull() ? gfx::Size() + : hovered_background_image_.size(); +} + +const char* FrameCaptionButton::GetClassName() const { + return kViewClassName; +} + +void FrameCaptionButton::OnPaint(gfx::Canvas* canvas) { + if (hover_animation_->is_animating() || state() == STATE_HOVERED) { + int hovered_background_alpha = + hover_animation_->is_animating() + ? hover_animation_->CurrentValueBetween(0, 255) + : 255; + SkPaint paint; + paint.setAlpha(hovered_background_alpha); + canvas->DrawImageInt(hovered_background_image_, 0, 0, paint); + } else if (state() == STATE_PRESSED) { + canvas->DrawImageInt(pressed_background_image_, 0, 0); + } + + int icon_alpha = swap_images_animation_->CurrentValueBetween(0, 255); + int crossfade_icon_alpha = 0; + if (icon_alpha < static_cast<int>(kFadeOutRatio * 255)) + crossfade_icon_alpha = static_cast<int>(255 - icon_alpha / kFadeOutRatio); + + if (crossfade_icon_alpha > 0 && !crossfade_icon_image_.isNull()) { + gfx::Canvas icon_canvas(icon_image_.size(), canvas->image_scale(), false); + SkPaint paint; + paint.setAlpha(icon_alpha); + icon_canvas.DrawImageInt(icon_image_, 0, 0, paint); + + paint.setAlpha(crossfade_icon_alpha); + paint.setXfermodeMode(SkXfermode::kPlus_Mode); + icon_canvas.DrawImageInt(crossfade_icon_image_, 0, 0, paint); + + PaintCentered(canvas, gfx::ImageSkia(icon_canvas.ExtractImageRep()), + alpha_); + } else { + if (!swap_images_animation_->is_animating()) + icon_alpha = alpha_; + PaintCentered(canvas, icon_image_, icon_alpha); + } +} + +void FrameCaptionButton::OnGestureEvent(ui::GestureEvent* event) { + // CustomButton does not become pressed when the user drags off and then back + // onto the button. Make FrameCaptionButton pressed in this case because this + // behavior is more consistent with AlternateFrameSizeButton. + if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN || + event->type() == ui::ET_GESTURE_SCROLL_UPDATE) { + if (HitTestPoint(event->location())) { + SetState(STATE_PRESSED); + RequestFocus(); + event->StopPropagation(); + } else { + SetState(STATE_NORMAL); + } + } else if (event->type() == ui::ET_GESTURE_SCROLL_END) { + if (HitTestPoint(event->location())) { + SetState(STATE_HOVERED); + NotifyClick(*event); + event->StopPropagation(); + } + } + CustomButton::OnGestureEvent(event); +} + +void FrameCaptionButton::PaintCentered(gfx::Canvas* canvas, + const gfx::ImageSkia& to_center, + int alpha) { + if (!paint_as_active_) { + // Paint icons as active when they are hovered over or pressed. + double inactive_alpha = kInactiveIconAlpha; + if (hover_animation_->is_animating()) { + inactive_alpha = + hover_animation_->CurrentValueBetween(inactive_alpha, 1.0f); + } else if (state() == STATE_PRESSED || state() == STATE_HOVERED) { + inactive_alpha = 1.0f; + } + alpha *= inactive_alpha; + } + + SkPaint paint; + paint.setAlpha(alpha); + canvas->DrawImageInt(to_center, (width() - to_center.width()) / 2, + (height() - to_center.height()) / 2, paint); +} + +} // namespace wm +} // namespace mash
diff --git a/mash/wm/frame/caption_buttons/frame_caption_button.h b/mash/wm/frame/caption_buttons/frame_caption_button.h new file mode 100644 index 0000000..6708327 --- /dev/null +++ b/mash/wm/frame/caption_buttons/frame_caption_button.h
@@ -0,0 +1,102 @@ +// Copyright 2015 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. + +#ifndef MASH_WM_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_H_ +#define MASH_WM_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_H_ + +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "mash/wm/frame/caption_buttons/caption_button_types.h" +#include "ui/gfx/image/image_skia.h" +#include "ui/views/controls/button/custom_button.h" + +namespace gfx { +class SlideAnimation; +} + +namespace mash { +namespace wm { + +// Base class for the window caption buttons (minimize, maximize, restore, +// close). +class FrameCaptionButton : public views::CustomButton { + public: + enum Animate { ANIMATE_YES, ANIMATE_NO }; + + static const char kViewClassName[]; + + FrameCaptionButton(views::ButtonListener* listener, CaptionButtonIcon icon); + ~FrameCaptionButton() override; + + // Sets the images to use to paint the button. If |animate| is ANIMATE_YES, + // the button crossfades to the new visuals. If the image ids match those + // currently used by the button and |animate| is ANIMATE_NO the crossfade + // animation is progressed to the end. + void SetImages(CaptionButtonIcon icon, + Animate animate, + int icon_image_id, + int hovered_background_image_id, + int pressed_background_image_id); + + // Returns true if the button is crossfading to new visuals set in + // SetImages(). + bool IsAnimatingImageSwap() const; + + // Sets the alpha to use for painting. Used to animate visibility changes. + void SetAlpha(int alpha); + + // views::View overrides: + gfx::Size GetPreferredSize() const override; + const char* GetClassName() const override; + void OnPaint(gfx::Canvas* canvas) override; + + void set_paint_as_active(bool paint_as_active) { + paint_as_active_ = paint_as_active; + } + + CaptionButtonIcon icon() const { return icon_; } + + int icon_image_id() const { return icon_image_id_; } + + protected: + // views::CustomButton override: + void OnGestureEvent(ui::GestureEvent* event) override; + + private: + // Paints |to_center| centered within the button with |alpha|. + void PaintCentered(gfx::Canvas* canvas, + const gfx::ImageSkia& to_center, + int alpha); + + // The button's current icon. + CaptionButtonIcon icon_; + + // Whether the button should be painted as active. + bool paint_as_active_; + + // Current alpha to use for painting. + int alpha_; + + // The images and image ids used to paint the button. + int icon_image_id_; + int hovered_background_image_id_; + int pressed_background_image_id_; + gfx::ImageSkia icon_image_; + gfx::ImageSkia hovered_background_image_; + gfx::ImageSkia pressed_background_image_; + + // The icon image to crossfade from. + gfx::ImageSkia crossfade_icon_image_; + + // Crossfade animation started when the button's images are changed by + // SetImages(). + scoped_ptr<gfx::SlideAnimation> swap_images_animation_; + + DISALLOW_COPY_AND_ASSIGN(FrameCaptionButton); +}; + +} // namespace wm +} // namespace mash + +#endif // MASH_WM_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_H_
diff --git a/mash/wm/frame/caption_buttons/frame_caption_button_container_view.cc b/mash/wm/frame/caption_buttons/frame_caption_button_container_view.cc new file mode 100644 index 0000000..3bd443b0 --- /dev/null +++ b/mash/wm/frame/caption_buttons/frame_caption_button_container_view.cc
@@ -0,0 +1,353 @@ +// Copyright 2015 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 "mash/wm/frame/caption_buttons/frame_caption_button_container_view.h" + +#include <cmath> +#include <map> + +#include "mash/wm/frame/caption_buttons/frame_caption_button.h" +#include "ui/base/hit_test.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/gfx/animation/slide_animation.h" +#include "ui/gfx/animation/tween.h" +#include "ui/gfx/canvas.h" +#include "ui/gfx/geometry/insets.h" +#include "ui/gfx/geometry/point.h" +#include "ui/strings/grit/ui_strings.h" // Accessibility names +#include "ui/views/widget/widget.h" +#include "ui/views/widget/widget_delegate.h" + +namespace mash { +namespace wm { + +namespace { + +// Duration of the animation of the position of |minimize_button_|. +const int kPositionAnimationDurationMs = 500; + +// Duration of the animation of the alpha of |size_button_|. +const int kAlphaAnimationDurationMs = 250; + +// Delay during |maximize_mode_animation_| hide to wait before beginning to +// animate the position of |minimize_button_|. +const int kHidePositionDelayMs = 100; + +// Duration of |maximize_mode_animation_| hiding. +// Hiding size button 250 +// |------------------------| +// Delay 100 Slide minimize button 500 +// |---------|-------------------------------------------------| +const int kHideAnimationDurationMs = + kHidePositionDelayMs + kPositionAnimationDurationMs; + +// Delay during |maximize_mode_animation_| show to wait before beginning to +// animate the alpha of |size_button_|. +const int kShowAnimationAlphaDelayMs = 100; + +// Duration of |maximize_mode_animation_| showing. +// Slide minimize button 500 +// |-------------------------------------------------| +// Delay 100 Show size button 250 +// |---------|-----------------------| +const int kShowAnimationDurationMs = kPositionAnimationDurationMs; + +// Value of |maximize_mode_animation_| showing to begin animating alpha of +// |size_button_|. +float SizeButtonShowStartValue() { + return static_cast<float>(kShowAnimationAlphaDelayMs) / + kShowAnimationDurationMs; +} + +// Amount of |maximize_mode_animation_| showing to animate the alpha of +// |size_button_|. +float SizeButtonShowDuration() { + return static_cast<float>(kAlphaAnimationDurationMs) / + kShowAnimationDurationMs; +} + +// Amount of |maximize_mode_animation_| hiding to animate the alpha of +// |size_button_|. +float SizeButtonHideDuration() { + return static_cast<float>(kAlphaAnimationDurationMs) / + kHideAnimationDurationMs; +} + +// Value of |maximize_mode_animation_| hiding to begin animating the position of +// |minimize_button_|. +float HidePositionStartValue() { + return 1.0f - + static_cast<float>(kHidePositionDelayMs) / kHideAnimationDurationMs; +} + +// Converts |point| from |src| to |dst| and hittests against |dst|. +bool ConvertPointToViewAndHitTest(const views::View* src, + const views::View* dst, + const gfx::Point& point) { + gfx::Point converted(point); + views::View::ConvertPointToTarget(src, dst, &converted); + return dst->HitTestPoint(converted); +} + +// Bounds animation values to the range 0.0 - 1.0. Allows for mapping of offset +// animations to the expected range so that gfx::Tween::CalculateValue() can be +// used. +double CapAnimationValue(double value) { + return std::min(1.0, std::max(0.0, value)); +} + +} // namespace + +// static +const char FrameCaptionButtonContainerView::kViewClassName[] = + "FrameCaptionButtonContainerView"; + +FrameCaptionButtonContainerView::FrameCaptionButtonContainerView( + views::Widget* frame) + : frame_(frame), + minimize_button_(NULL), + size_button_(NULL), + close_button_(NULL) { + const bool size_button_visibility = ShouldSizeButtonBeVisible(); + maximize_mode_animation_.reset(new gfx::SlideAnimation(this)); + maximize_mode_animation_->SetTweenType(gfx::Tween::LINEAR); + + // Ensure animation tracks visibility of size button. + if (size_button_visibility) + maximize_mode_animation_->Reset(1.0f); + + // Insert the buttons left to right. + minimize_button_ = new FrameCaptionButton(this, CAPTION_BUTTON_ICON_MINIMIZE); + minimize_button_->SetAccessibleName( + l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MINIMIZE)); + minimize_button_->SetVisible(frame_->widget_delegate()->CanMinimize()); + AddChildView(minimize_button_); + + size_button_ = + new FrameCaptionButton(this, CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE); + size_button_->SetAccessibleName( + l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MAXIMIZE)); + size_button_->SetVisible(size_button_visibility); + AddChildView(size_button_); + + close_button_ = new FrameCaptionButton(this, CAPTION_BUTTON_ICON_CLOSE); + close_button_->SetAccessibleName( + l10n_util::GetStringUTF16(IDS_APP_ACCNAME_CLOSE)); + AddChildView(close_button_); +} + +FrameCaptionButtonContainerView::~FrameCaptionButtonContainerView() {} + +void FrameCaptionButtonContainerView::SetButtonImages( + CaptionButtonIcon icon, + int icon_image_id, + int hovered_background_image_id, + int pressed_background_image_id) { + button_icon_id_map_[icon] = ButtonIconIds( + icon_image_id, hovered_background_image_id, pressed_background_image_id); + FrameCaptionButton* buttons[] = {minimize_button_, size_button_, + close_button_}; + for (size_t i = 0; i < arraysize(buttons); ++i) { + if (buttons[i]->icon() == icon) { + buttons[i]->SetImages(icon, FrameCaptionButton::ANIMATE_NO, icon_image_id, + hovered_background_image_id, + pressed_background_image_id); + } + } +} + +void FrameCaptionButtonContainerView::SetPaintAsActive(bool paint_as_active) { + minimize_button_->set_paint_as_active(paint_as_active); + size_button_->set_paint_as_active(paint_as_active); + close_button_->set_paint_as_active(paint_as_active); +} + +void FrameCaptionButtonContainerView::ResetWindowControls() { + SetButtonsToNormal(ANIMATE_NO); +} + +int FrameCaptionButtonContainerView::NonClientHitTest( + const gfx::Point& point) const { + if (close_button_->visible() && + ConvertPointToViewAndHitTest(this, close_button_, point)) { + return HTCLOSE; + } else if (size_button_->visible() && + ConvertPointToViewAndHitTest(this, size_button_, point)) { + return HTMAXBUTTON; + } else if (minimize_button_->visible() && + ConvertPointToViewAndHitTest(this, minimize_button_, point)) { + return HTMINBUTTON; + } + return HTNOWHERE; +} + +void FrameCaptionButtonContainerView::UpdateSizeButtonVisibility() { + bool visible = ShouldSizeButtonBeVisible(); + if (visible) { + size_button_->SetVisible(true); + maximize_mode_animation_->SetSlideDuration(kShowAnimationDurationMs); + maximize_mode_animation_->Show(); + } else { + maximize_mode_animation_->SetSlideDuration(kHideAnimationDurationMs); + maximize_mode_animation_->Hide(); + } +} + +gfx::Size FrameCaptionButtonContainerView::GetPreferredSize() const { + int width = 0; + for (int i = 0; i < child_count(); ++i) { + const views::View* child = child_at(i); + if (child->visible()) + width += child_at(i)->GetPreferredSize().width(); + } + return gfx::Size(width, close_button_->GetPreferredSize().height()); +} + +void FrameCaptionButtonContainerView::Layout() { + int x = 0; + for (int i = 0; i < child_count(); ++i) { + views::View* child = child_at(i); + if (!child->visible()) + continue; + + gfx::Size size = child->GetPreferredSize(); + child->SetBounds(x, 0, size.width(), size.height()); + x += size.width(); + } + if (maximize_mode_animation_->is_animating()) { + AnimationProgressed(maximize_mode_animation_.get()); + } +} + +const char* FrameCaptionButtonContainerView::GetClassName() const { + return kViewClassName; +} + +void FrameCaptionButtonContainerView::AnimationEnded( + const gfx::Animation* animation) { + // Ensure that position is calculated at least once. + AnimationProgressed(animation); + + double current_value = maximize_mode_animation_->GetCurrentValue(); + if (current_value == 0.0) { + size_button_->SetVisible(false); + PreferredSizeChanged(); + } +} + +void FrameCaptionButtonContainerView::AnimationProgressed( + const gfx::Animation* animation) { + double current_value = animation->GetCurrentValue(); + int size_alpha = 0; + int minimize_x = 0; + if (maximize_mode_animation_->IsShowing()) { + double scaled_value = + CapAnimationValue((current_value - SizeButtonShowStartValue()) / + SizeButtonShowDuration()); + double tweened_value_alpha = + gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, scaled_value); + size_alpha = gfx::Tween::LinearIntValueBetween(tweened_value_alpha, 0, 255); + + double tweened_value_slide = + gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, current_value); + minimize_x = gfx::Tween::LinearIntValueBetween(tweened_value_slide, + size_button_->x(), 0); + } else { + double scaled_value_alpha = + CapAnimationValue((1.0f - current_value) / SizeButtonHideDuration()); + double tweened_value_alpha = + gfx::Tween::CalculateValue(gfx::Tween::EASE_IN, scaled_value_alpha); + size_alpha = gfx::Tween::LinearIntValueBetween(tweened_value_alpha, 255, 0); + + double scaled_value_position = CapAnimationValue( + (HidePositionStartValue() - current_value) / HidePositionStartValue()); + double tweened_value_position = + gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, scaled_value_position); + minimize_x = gfx::Tween::LinearIntValueBetween(tweened_value_position, 0, + size_button_->x()); + } + size_button_->SetAlpha(size_alpha); + minimize_button_->SetX(minimize_x); +} + +void FrameCaptionButtonContainerView::SetButtonIcon(FrameCaptionButton* button, + CaptionButtonIcon icon, + Animate animate) { + // The early return is dependant on |animate| because callers use + // SetButtonIcon() with ANIMATE_NO to progress |button|'s crossfade animation + // to the end. + if (button->icon() == icon && + (animate == ANIMATE_YES || !button->IsAnimatingImageSwap())) { + return; + } + + FrameCaptionButton::Animate fcb_animate = + (animate == ANIMATE_YES) ? FrameCaptionButton::ANIMATE_YES + : FrameCaptionButton::ANIMATE_NO; + std::map<CaptionButtonIcon, ButtonIconIds>::const_iterator it = + button_icon_id_map_.find(icon); + if (it != button_icon_id_map_.end()) { + button->SetImages(icon, fcb_animate, it->second.icon_image_id, + it->second.hovered_background_image_id, + it->second.pressed_background_image_id); + } +} + +bool FrameCaptionButtonContainerView::ShouldSizeButtonBeVisible() const { + return frame_->widget_delegate()->CanMaximize(); +} + +void FrameCaptionButtonContainerView::SetButtonsToNormal(Animate animate) { + SetButtonIcons(CAPTION_BUTTON_ICON_MINIMIZE, CAPTION_BUTTON_ICON_CLOSE, + animate); + minimize_button_->SetState(views::Button::STATE_NORMAL); + size_button_->SetState(views::Button::STATE_NORMAL); + close_button_->SetState(views::Button::STATE_NORMAL); +} + +void FrameCaptionButtonContainerView::SetButtonIcons( + CaptionButtonIcon minimize_button_icon, + CaptionButtonIcon close_button_icon, + Animate animate) { + SetButtonIcon(minimize_button_, minimize_button_icon, animate); + SetButtonIcon(close_button_, close_button_icon, animate); +} + +void FrameCaptionButtonContainerView::ButtonPressed(views::Button* sender, + const ui::Event& event) { + // Abort any animations of the button icons. + SetButtonsToNormal(ANIMATE_NO); + + if (sender == minimize_button_) { + frame_->Minimize(); + } else if (sender == size_button_) { + if (frame_->IsFullscreen()) { // Can be clicked in immersive fullscreen. + frame_->Restore(); + } else if (frame_->IsMaximized()) { + frame_->Restore(); + } else { + frame_->Maximize(); + } + } else if (sender == close_button_) { + frame_->Close(); + } +} + +FrameCaptionButtonContainerView::ButtonIconIds::ButtonIconIds() + : icon_image_id(-1), + hovered_background_image_id(-1), + pressed_background_image_id(-1) {} + +FrameCaptionButtonContainerView::ButtonIconIds::ButtonIconIds( + int icon_id, + int hovered_background_id, + int pressed_background_id) + : icon_image_id(icon_id), + hovered_background_image_id(hovered_background_id), + pressed_background_image_id(pressed_background_id) {} + +FrameCaptionButtonContainerView::ButtonIconIds::~ButtonIconIds() {} + +} // namespace wm +} // namespace mash
diff --git a/mash/wm/frame/caption_buttons/frame_caption_button_container_view.h b/mash/wm/frame/caption_buttons/frame_caption_button_container_view.h new file mode 100644 index 0000000..73ae6a8 --- /dev/null +++ b/mash/wm/frame/caption_buttons/frame_caption_button_container_view.h
@@ -0,0 +1,135 @@ +// Copyright 2015 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. + +#ifndef MASH_WM_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_CONTAINER_VIEW_H_ +#define MASH_WM_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_CONTAINER_VIEW_H_ + +#include <map> + +#include "base/macros.h" +#include "mash/wm/frame/caption_buttons/caption_button_types.h" +#include "ui/gfx/animation/animation_delegate.h" +#include "ui/views/controls/button/button.h" +#include "ui/views/view.h" + +namespace gfx { +class SlideAnimation; +} + +namespace views { +class Widget; +} + +namespace mash { +namespace wm { + +class FrameCaptionButton; + +// Container view for the frame caption buttons. It performs the appropriate +// action when a caption button is clicked. +class FrameCaptionButtonContainerView : public views::View, + public views::ButtonListener, + public gfx::AnimationDelegate { + public: + enum Animate { ANIMATE_YES, ANIMATE_NO }; + + static const char kViewClassName[]; + + // |frame| is the views::Widget that the caption buttons act on. + explicit FrameCaptionButtonContainerView(views::Widget* frame); + ~FrameCaptionButtonContainerView() override; + + // Sets the resource ids of the images to paint the button for |icon|. The + // FrameCaptionButtonContainerView will keep track of the images to use for + // |icon| even if none of the buttons currently use |icon|. + void SetButtonImages(CaptionButtonIcon icon, + int icon_image_id, + int hovered_background_image_id, + int pressed_background_image_id); + + // Sets whether the buttons should be painted as active. Does not schedule + // a repaint. + void SetPaintAsActive(bool paint_as_active); + + // Tell the window controls to reset themselves to the normal state. + void ResetWindowControls(); + + // Determines the window HT* code for the caption button at |point|. Returns + // HTNOWHERE if |point| is not over any of the caption buttons. |point| must + // be in the coordinates of the FrameCaptionButtonContainerView. + int NonClientHitTest(const gfx::Point& point) const; + + // Updates the size button's visibility based on whether |frame_| can be + // maximized and if maximize mode is enabled. A parent view should relayout + // to reflect the change in visibility. + void UpdateSizeButtonVisibility(); + + // views::View: + gfx::Size GetPreferredSize() const override; + void Layout() override; + const char* GetClassName() const override; + + // Overridden from gfx::AnimationDelegate: + void AnimationEnded(const gfx::Animation* animation) override; + void AnimationProgressed(const gfx::Animation* animation) override; + + private: + friend class FrameCaptionButtonContainerViewTest; + + struct ButtonIconIds { + ButtonIconIds(); + ButtonIconIds(int icon_id, + int hovered_background_id, + int pressed_background_id); + ~ButtonIconIds(); + + int icon_image_id; + int hovered_background_image_id; + int pressed_background_image_id; + }; + + // Sets |button|'s icon to |icon|. If |animate| is ANIMATE_YES, the button + // will crossfade to the new icon. If |animate| is ANIMATE_NO and + // |icon| == |button|->icon(), the crossfade animation is progressed to the + // end. + void SetButtonIcon(FrameCaptionButton* button, + CaptionButtonIcon icon, + Animate animate); + + // Returns true if maximize mode is not enabled, and |frame_| widget delegate + // can be maximized. + bool ShouldSizeButtonBeVisible() const; + + void SetButtonsToNormal(Animate animate); + void SetButtonIcons(CaptionButtonIcon minimize_button_icon, + CaptionButtonIcon close_button_icon, + Animate animate); + + // views::ButtonListener: + void ButtonPressed(views::Button* sender, const ui::Event& event) override; + + // The widget that the buttons act on. + views::Widget* frame_; + + // The buttons. In the normal button style, at most one of |minimize_button_| + // and |size_button_| is visible. + FrameCaptionButton* minimize_button_; + FrameCaptionButton* size_button_; + FrameCaptionButton* close_button_; + + // Mapping of the images needed to paint a button for each of the values of + // CaptionButtonIcon. + std::map<CaptionButtonIcon, ButtonIconIds> button_icon_id_map_; + + // Animation that affects the position of |minimize_button_| and the + // visibility of |size_button_|. + scoped_ptr<gfx::SlideAnimation> maximize_mode_animation_; + + DISALLOW_COPY_AND_ASSIGN(FrameCaptionButtonContainerView); +}; + +} // namespace wm +} // namespace mash + +#endif // MASH_WM_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_CONTAINER_VIEW_H_
diff --git a/mash/wm/frame/default_header_painter.cc b/mash/wm/frame/default_header_painter.cc new file mode 100644 index 0000000..755ad7f --- /dev/null +++ b/mash/wm/frame/default_header_painter.cc
@@ -0,0 +1,352 @@ +// Copyright 2015 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 "mash/wm/frame/default_header_painter.h" + +#include "base/debug/leak_annotations.h" +#include "base/logging.h" +#include "grit/mash_wm_resources.h" +#include "mash/wm/frame/caption_buttons/frame_caption_button_container_view.h" +#include "mash/wm/frame/header_painter_util.h" +#include "third_party/skia/include/core/SkPaint.h" +#include "third_party/skia/include/core/SkPath.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/animation/slide_animation.h" +#include "ui/gfx/canvas.h" +#include "ui/gfx/color_utils.h" +#include "ui/gfx/font_list.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/image/image.h" +#include "ui/gfx/scoped_canvas.h" +#include "ui/gfx/skia_util.h" +#include "ui/views/view.h" +#include "ui/views/widget/native_widget_aura.h" +#include "ui/views/widget/widget.h" +#include "ui/views/widget/widget_delegate.h" + +using views::Widget; + +namespace { + +// Color for the window title text. +const SkColor kTitleTextColor = SkColorSetRGB(40, 40, 40); +// Color of the active window header/content separator line. +const SkColor kHeaderContentSeparatorColor = SkColorSetRGB(150, 150, 152); +// Color of the inactive window header/content separator line. +const SkColor kHeaderContentSeparatorInactiveColor = + SkColorSetRGB(180, 180, 182); +// The default color of the frame. +const SkColor kDefaultFrameColor = SkColorSetRGB(242, 242, 242); +// Duration of crossfade animation for activating and deactivating frame. +const int kActivationCrossfadeDurationMs = 200; +// Luminance below which to use white caption buttons. +const int kMaxLuminanceForLightButtons = 125; + +// Tiles an image into an area, rounding the top corners. +void TileRoundRect(gfx::Canvas* canvas, + const SkPaint& paint, + const gfx::Rect& bounds, + int corner_radius) { + SkRect rect = gfx::RectToSkRect(bounds); + const SkScalar corner_radius_scalar = SkIntToScalar(corner_radius); + SkScalar radii[8] = {corner_radius_scalar, + corner_radius_scalar, // top-left + corner_radius_scalar, + corner_radius_scalar, // top-right + 0, + 0, // bottom-right + 0, + 0}; // bottom-left + SkPath path; + path.addRoundRect(rect, radii, SkPath::kCW_Direction); + canvas->DrawPath(path, paint); +} + +// Returns the FontList to use for the title. +const gfx::FontList& GetTitleFontList() { + static const gfx::FontList* title_font_list = + new gfx::FontList(views::NativeWidgetAura::GetWindowTitleFontList()); + ANNOTATE_LEAKING_OBJECT_PTR(title_font_list); + return *title_font_list; +} + +} // namespace + +namespace mash { +namespace wm { + +/////////////////////////////////////////////////////////////////////////////// +// DefaultHeaderPainter, public: + +DefaultHeaderPainter::DefaultHeaderPainter() + : frame_(NULL), + view_(NULL), + left_header_view_(NULL), + left_view_x_inset_(HeaderPainterUtil::GetDefaultLeftViewXInset()), + active_frame_color_(kDefaultFrameColor), + inactive_frame_color_(kDefaultFrameColor), + caption_button_container_(NULL), + painted_height_(0), + mode_(MODE_INACTIVE), + initial_paint_(true), + activation_animation_(new gfx::SlideAnimation(this)) {} + +DefaultHeaderPainter::~DefaultHeaderPainter() {} + +void DefaultHeaderPainter::Init( + views::Widget* frame, + views::View* header_view, + FrameCaptionButtonContainerView* caption_button_container) { + DCHECK(frame); + DCHECK(header_view); + DCHECK(caption_button_container); + frame_ = frame; + view_ = header_view; + caption_button_container_ = caption_button_container; + UpdateAllButtonImages(); +} + +int DefaultHeaderPainter::GetMinimumHeaderWidth() const { + // Ensure we have enough space for the window icon and buttons. We allow + // the title string to collapse to zero width. + return GetTitleBounds().x() + + caption_button_container_->GetMinimumSize().width(); +} + +void DefaultHeaderPainter::PaintHeader(gfx::Canvas* canvas, Mode mode) { + Mode old_mode = mode_; + mode_ = mode; + + if (mode_ != old_mode) { + UpdateAllButtonImages(); + if (!initial_paint_ && HeaderPainterUtil::CanAnimateActivation(frame_)) { + activation_animation_->SetSlideDuration(kActivationCrossfadeDurationMs); + if (mode_ == MODE_ACTIVE) + activation_animation_->Show(); + else + activation_animation_->Hide(); + } else { + if (mode_ == MODE_ACTIVE) + activation_animation_->Reset(1); + else + activation_animation_->Reset(0); + } + initial_paint_ = false; + } + + int corner_radius = (frame_->IsMaximized() || frame_->IsFullscreen()) + ? 0 + : HeaderPainterUtil::GetTopCornerRadiusWhenRestored(); + + SkPaint paint; + int active_alpha = activation_animation_->CurrentValueBetween(0, 255); + paint.setColor(color_utils::AlphaBlend(active_frame_color_, + inactive_frame_color_, active_alpha)); + + TileRoundRect(canvas, paint, GetLocalBounds(), corner_radius); + + if (!frame_->IsMaximized() && !frame_->IsFullscreen() && + mode_ == MODE_INACTIVE && !UsesCustomFrameColors()) { + PaintHighlightForInactiveRestoredWindow(canvas); + } + if (frame_->widget_delegate() && + frame_->widget_delegate()->ShouldShowWindowTitle()) { + PaintTitleBar(canvas); + } + if (!UsesCustomFrameColors()) + PaintHeaderContentSeparator(canvas); +} + +void DefaultHeaderPainter::LayoutHeader() { + UpdateSizeButtonImages(ShouldUseLightImages()); + caption_button_container_->Layout(); + + gfx::Size caption_button_container_size = + caption_button_container_->GetPreferredSize(); + caption_button_container_->SetBounds( + view_->width() - caption_button_container_size.width(), 0, + caption_button_container_size.width(), + caption_button_container_size.height()); + + LayoutLeftHeaderView(); + + // The header/content separator line overlays the caption buttons. + SetHeaderHeightForPainting(caption_button_container_->height()); +} + +int DefaultHeaderPainter::GetHeaderHeight() const { + return caption_button_container_->height(); +} + +int DefaultHeaderPainter::GetHeaderHeightForPainting() const { + return painted_height_; +} + +void DefaultHeaderPainter::SetHeaderHeightForPainting(int height) { + painted_height_ = height; +} + +void DefaultHeaderPainter::SchedulePaintForTitle() { + view_->SchedulePaintInRect(GetTitleBounds()); +} + +void DefaultHeaderPainter::UpdateLeftViewXInset(int left_view_x_inset) { + if (left_view_x_inset_ != left_view_x_inset) { + left_view_x_inset_ = left_view_x_inset; + LayoutLeftHeaderView(); + } +} + +void DefaultHeaderPainter::SetFrameColors(SkColor active_frame_color, + SkColor inactive_frame_color) { + active_frame_color_ = active_frame_color; + inactive_frame_color_ = inactive_frame_color; + UpdateAllButtonImages(); +} + +void DefaultHeaderPainter::UpdateLeftHeaderView(views::View* left_header_view) { + left_header_view_ = left_header_view; +} + +/////////////////////////////////////////////////////////////////////////////// +// gfx::AnimationDelegate overrides: + +void DefaultHeaderPainter::AnimationProgressed( + const gfx::Animation* animation) { + view_->SchedulePaintInRect(GetLocalBounds()); +} + +/////////////////////////////////////////////////////////////////////////////// +// DefaultHeaderPainter, private: + +void DefaultHeaderPainter::PaintHighlightForInactiveRestoredWindow( + gfx::Canvas* canvas) { + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); + gfx::ImageSkia top_edge = + *rb.GetImageSkiaNamed(IDR_MASH_WM_WINDOW_HEADER_SHADE_INACTIVE_TOP); + gfx::ImageSkia left_edge = + *rb.GetImageSkiaNamed(IDR_MASH_WM_WINDOW_HEADER_SHADE_INACTIVE_LEFT); + gfx::ImageSkia right_edge = + *rb.GetImageSkiaNamed(IDR_MASH_WM_WINDOW_HEADER_SHADE_INACTIVE_RIGHT); + gfx::ImageSkia bottom_edge = + *rb.GetImageSkiaNamed(IDR_MASH_WM_WINDOW_HEADER_SHADE_INACTIVE_BOTTOM); + + int left_edge_width = left_edge.width(); + int right_edge_width = right_edge.width(); + canvas->DrawImageInt(left_edge, 0, 0); + canvas->DrawImageInt(right_edge, view_->width() - right_edge_width, 0); + canvas->TileImageInt(top_edge, left_edge_width, 0, + view_->width() - left_edge_width - right_edge_width, + top_edge.height()); + + DCHECK_EQ(left_edge.height(), right_edge.height()); + int bottom = left_edge.height(); + int bottom_height = bottom_edge.height(); + canvas->TileImageInt(bottom_edge, left_edge_width, bottom - bottom_height, + view_->width() - left_edge_width - right_edge_width, + bottom_height); +} + +void DefaultHeaderPainter::PaintTitleBar(gfx::Canvas* canvas) { + // The window icon is painted by its own views::View. + gfx::Rect title_bounds = GetTitleBounds(); + title_bounds.set_x(view_->GetMirroredXForRect(title_bounds)); + canvas->DrawStringRectWithFlags( + frame_->widget_delegate()->GetWindowTitle(), GetTitleFontList(), + kTitleTextColor, title_bounds, gfx::Canvas::NO_SUBPIXEL_RENDERING); +} + +void DefaultHeaderPainter::PaintHeaderContentSeparator(gfx::Canvas* canvas) { + gfx::ScopedCanvas scoped_canvas(canvas); + const float scale = canvas->UndoDeviceScaleFactor(); + gfx::RectF rect(0, painted_height_ * scale - 1, view_->width() * scale, 1); + SkPaint paint; + paint.setColor((mode_ == MODE_ACTIVE) ? kHeaderContentSeparatorColor + : kHeaderContentSeparatorInactiveColor); + canvas->sk_canvas()->drawRect(gfx::RectFToSkRect(rect), paint); +} + +void DefaultHeaderPainter::LayoutLeftHeaderView() { + if (left_header_view_) { + // Vertically center the left header view with respect to the caption button + // container. + // Floor when computing the center of |caption_button_container_|. + gfx::Size size = left_header_view_->GetPreferredSize(); + int icon_offset_y = + caption_button_container_->height() / 2 - size.height() / 2; + left_header_view_->SetBounds(left_view_x_inset_, icon_offset_y, + size.width(), size.height()); + } +} + +bool DefaultHeaderPainter::ShouldUseLightImages() { + int luminance = color_utils::GetLuminanceForColor( + mode_ == MODE_INACTIVE ? inactive_frame_color_ : active_frame_color_); + return luminance < kMaxLuminanceForLightButtons; +} + +void DefaultHeaderPainter::UpdateAllButtonImages() { + bool use_light_images = ShouldUseLightImages(); + caption_button_container_->SetButtonImages( + CAPTION_BUTTON_ICON_MINIMIZE, + use_light_images ? IDR_MASH_WM_WINDOW_CONTROL_ICON_MINIMIZE_WHITE + : IDR_MASH_WM_WINDOW_CONTROL_ICON_MINIMIZE, + IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_H, + IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_P); + + UpdateSizeButtonImages(use_light_images); + + caption_button_container_->SetButtonImages( + CAPTION_BUTTON_ICON_CLOSE, + use_light_images ? IDR_MASH_WM_WINDOW_CONTROL_ICON_CLOSE_WHITE + : IDR_MASH_WM_WINDOW_CONTROL_ICON_CLOSE, + IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_H, + IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_P); + + caption_button_container_->SetButtonImages( + CAPTION_BUTTON_ICON_LEFT_SNAPPED, + use_light_images ? IDR_MASH_WM_WINDOW_CONTROL_ICON_LEFT_SNAPPED_WHITE + : IDR_MASH_WM_WINDOW_CONTROL_ICON_LEFT_SNAPPED, + IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_H, + IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_P); + + caption_button_container_->SetButtonImages( + CAPTION_BUTTON_ICON_RIGHT_SNAPPED, + use_light_images ? IDR_MASH_WM_WINDOW_CONTROL_ICON_RIGHT_SNAPPED_WHITE + : IDR_MASH_WM_WINDOW_CONTROL_ICON_RIGHT_SNAPPED, + IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_H, + IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_P); +} + +void DefaultHeaderPainter::UpdateSizeButtonImages(bool use_light_images) { + int icon_id = 0; + if (frame_->IsMaximized() || frame_->IsFullscreen()) { + icon_id = use_light_images ? IDR_MASH_WM_WINDOW_CONTROL_ICON_RESTORE_WHITE + : IDR_MASH_WM_WINDOW_CONTROL_ICON_RESTORE; + } else { + icon_id = use_light_images ? IDR_MASH_WM_WINDOW_CONTROL_ICON_MAXIMIZE_WHITE + : IDR_MASH_WM_WINDOW_CONTROL_ICON_MAXIMIZE; + } + caption_button_container_->SetButtonImages( + CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE, icon_id, + IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_H, + IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_P); +} + +gfx::Rect DefaultHeaderPainter::GetLocalBounds() const { + return gfx::Rect(view_->width(), painted_height_); +} + +gfx::Rect DefaultHeaderPainter::GetTitleBounds() const { + return HeaderPainterUtil::GetTitleBounds( + left_header_view_, caption_button_container_, GetTitleFontList()); +} + +bool DefaultHeaderPainter::UsesCustomFrameColors() const { + return active_frame_color_ != kDefaultFrameColor || + inactive_frame_color_ != kDefaultFrameColor; +} + +} // namespace wm +} // namespace mash
diff --git a/mash/wm/frame/default_header_painter.h b/mash/wm/frame/default_header_painter.h new file mode 100644 index 0000000..5e59cb8 --- /dev/null +++ b/mash/wm/frame/default_header_painter.h
@@ -0,0 +1,122 @@ +// Copyright 2015 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. + +#ifndef MASH_WM_FRAME_DEFAULT_HEADER_PAINTER_H_ +#define MASH_WM_FRAME_DEFAULT_HEADER_PAINTER_H_ + +#include "base/basictypes.h" +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "mash/wm/frame/header_painter.h" +#include "third_party/skia/include/core/SkColor.h" +#include "ui/gfx/animation/animation_delegate.h" + +namespace gfx { +class ImageSkia; +class Rect; +class SlideAnimation; +} +namespace views { +class View; +class Widget; +} + +namespace mash { +namespace wm { + +class FrameCaptionButtonContainerView; + +// Helper class for painting the default window header. +class DefaultHeaderPainter : public HeaderPainter, + public gfx::AnimationDelegate { + public: + DefaultHeaderPainter(); + ~DefaultHeaderPainter() override; + + // DefaultHeaderPainter does not take ownership of any of the parameters. + void Init(views::Widget* frame, + views::View* header_view, + FrameCaptionButtonContainerView* caption_button_container); + + // HeaderPainter overrides: + int GetMinimumHeaderWidth() const override; + void PaintHeader(gfx::Canvas* canvas, Mode mode) override; + void LayoutHeader() override; + int GetHeaderHeight() const override; + int GetHeaderHeightForPainting() const override; + void SetHeaderHeightForPainting(int height) override; + void SchedulePaintForTitle() override; + void UpdateLeftViewXInset(int left_view_x_inset) override; + + // Sets the left header view for the header. Passing NULL removes the view. + void UpdateLeftHeaderView(views::View* left_header_view); + + // Sets the active and inactive frame colors. Note the inactive frame color + // will have some transparency added when the frame is drawn. + void SetFrameColors(SkColor active_frame_color, SkColor inactive_frame_color); + + private: + // gfx::AnimationDelegate override: + void AnimationProgressed(const gfx::Animation* animation) override; + + // Paints highlight around the edge of the header for inactive restored + // windows. + void PaintHighlightForInactiveRestoredWindow(gfx::Canvas* canvas); + + // Paints the title bar, primarily the title string. + void PaintTitleBar(gfx::Canvas* canvas); + + // Paints the header/content separator. + void PaintHeaderContentSeparator(gfx::Canvas* canvas); + + // Layout the left header view. + void LayoutLeftHeaderView(); + + // Whether light caption images should be used. This is the case when the + // background of the frame is dark. + bool ShouldUseLightImages(); + + // Update all the images in the caption buttons. + void UpdateAllButtonImages(); + + // Updates the size button's images. + void UpdateSizeButtonImages(bool use_light_images); + + // Returns the header bounds in the coordinates of |view_|. The header is + // assumed to be positioned at the top left corner of |view_| and to have the + // same width as |view_|. + gfx::Rect GetLocalBounds() const; + + // Returns the bounds for the title. + gfx::Rect GetTitleBounds() const; + + // Returns whether the frame uses custom frame coloring. + bool UsesCustomFrameColors() const; + + views::Widget* frame_; + views::View* view_; + views::View* left_header_view_; // May be NULL. + int left_view_x_inset_; + SkColor active_frame_color_; + SkColor inactive_frame_color_; + FrameCaptionButtonContainerView* caption_button_container_; + + // The height of the header to paint. + int painted_height_; + + // Whether the header should be painted as active. + Mode mode_; + + // Whether the header is painted for the first time. + bool initial_paint_; + + scoped_ptr<gfx::SlideAnimation> activation_animation_; + + DISALLOW_COPY_AND_ASSIGN(DefaultHeaderPainter); +}; + +} // namespace wm +} // namespace mash + +#endif // MASH_WM_FRAME_DEFAULT_HEADER_PAINTER_H_
diff --git a/mash/wm/frame/frame_border_hit_test_controller.cc b/mash/wm/frame/frame_border_hit_test_controller.cc new file mode 100644 index 0000000..cd233f84 --- /dev/null +++ b/mash/wm/frame/frame_border_hit_test_controller.cc
@@ -0,0 +1,82 @@ +// Copyright 2015 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 "mash/wm/frame/frame_border_hit_test_controller.h" + +#include "mash/wm/frame/caption_buttons/frame_caption_button_container_view.h" +#include "ui/aura/env.h" +#include "ui/aura/window.h" +#include "ui/base/hit_test.h" +#include "ui/views/widget/widget.h" +#include "ui/views/widget/widget_delegate.h" +#include "ui/views/window/non_client_view.h" + +namespace mash { +namespace wm { + +// In the window corners, the resize areas don't actually expand bigger, but the +// 16 px at the end of each edge triggers diagonal resizing. +const int kResizeAreaCornerSize = 16; + +// Windows do not have a traditional visible window frame. Window content +// extends to the edge of the window. We consider a small region outside the +// window bounds and an even smaller region overlapping the window to be the +// "non-client" area and use it for resizing. +const int kResizeOutsideBoundsSize = 6; +const int kResizeOutsideBoundsScaleForTouch = 5; +const int kResizeInsideBoundsSize = 1; + +// static +int FrameBorderHitTestController::NonClientHitTest( + views::NonClientFrameView* view, + FrameCaptionButtonContainerView* caption_button_container, + const gfx::Point& point_in_widget) { + gfx::Rect expanded_bounds = view->bounds(); + int outside_bounds = kResizeOutsideBoundsSize; + + if (aura::Env::GetInstance()->is_touch_down()) + outside_bounds *= kResizeOutsideBoundsScaleForTouch; + expanded_bounds.Inset(-outside_bounds, -outside_bounds); + + if (!expanded_bounds.Contains(point_in_widget)) + return HTNOWHERE; + + // Check the frame first, as we allow a small area overlapping the contents + // to be used for resize handles. + views::Widget* frame = view->GetWidget(); + bool can_ever_resize = frame->widget_delegate()->CanResize(); + // Don't allow overlapping resize handles when the window is maximized or + // fullscreen, as it can't be resized in those states. + int resize_border = kResizeInsideBoundsSize; + if (frame->IsMaximized() || frame->IsFullscreen()) { + resize_border = 0; + can_ever_resize = false; + } + int frame_component = view->GetHTComponentForFrame( + point_in_widget, resize_border, resize_border, kResizeAreaCornerSize, + kResizeAreaCornerSize, can_ever_resize); + if (frame_component != HTNOWHERE) + return frame_component; + + int client_component = + frame->client_view()->NonClientHitTest(point_in_widget); + if (client_component != HTNOWHERE) + return client_component; + + if (caption_button_container->visible()) { + gfx::Point point_in_caption_button_container(point_in_widget); + views::View::ConvertPointFromWidget(caption_button_container, + &point_in_caption_button_container); + int caption_button_component = caption_button_container->NonClientHitTest( + point_in_caption_button_container); + if (caption_button_component != HTNOWHERE) + return caption_button_component; + } + + // Caption is a safe default. + return HTCAPTION; +} + +} // namespace wm +} // namespace mash
diff --git a/mash/wm/frame/frame_border_hit_test_controller.h b/mash/wm/frame/frame_border_hit_test_controller.h new file mode 100644 index 0000000..bcfbb77d --- /dev/null +++ b/mash/wm/frame/frame_border_hit_test_controller.h
@@ -0,0 +1,40 @@ +// Copyright 2015 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. + +#ifndef MASH_WM_FRAME_FRAME_BORDER_HITTEST_CONTROLLER_H_ +#define MASH_WM_FRAME_FRAME_BORDER_HITTEST_CONTROLLER_H_ + +#include "base/macros.h" + +namespace gfx { +class Point; +} + +namespace views { +class NonClientFrameView; +class Widget; +} + +namespace mash { +namespace wm { +class FrameCaptionButtonContainerView; + +// Class which manages the hittest override bounds for |frame|. +class FrameBorderHitTestController { + public: + // Does the non client hit test on behalf of |view|. |point_in_widget| must be + // in the coordinates of |view|'s widget. + static int NonClientHitTest( + views::NonClientFrameView* view, + FrameCaptionButtonContainerView* caption_button_container, + const gfx::Point& point_in_widget); + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(FrameBorderHitTestController); +}; + +} // namespace wm +} // namespace mash + +#endif // MASH_WM_FRAME_FRAME_BORDER_HITTEST_CONTROLLER_H_
diff --git a/mash/wm/frame/header_painter.h b/mash/wm/frame/header_painter.h new file mode 100644 index 0000000..84eef20 --- /dev/null +++ b/mash/wm/frame/header_painter.h
@@ -0,0 +1,52 @@ +// Copyright 2015 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. + +#ifndef MASH_WM_FRAME_HEADER_PAINTER_H_ +#define MASH_WM_FRAME_HEADER_PAINTER_H_ + +namespace gfx { +class Canvas; +} + +namespace mash { +namespace wm { + +// Helper class for painting the window header. +// TODO(sky): keep this only if we're going to actually need different +// subclasses. +class HeaderPainter { + public: + enum Mode { MODE_ACTIVE, MODE_INACTIVE }; + + virtual ~HeaderPainter() {} + + // Returns the header's minimum width. + virtual int GetMinimumHeaderWidth() const = 0; + + // Paints the header. + virtual void PaintHeader(gfx::Canvas* canvas, Mode mode) = 0; + + // Performs layout for the header. + virtual void LayoutHeader() = 0; + + // Get the height of the header. + virtual int GetHeaderHeight() const = 0; + + // Gets / sets how much of the header is painted. This allows the header to + // paint under things (like the tabstrip) which have transparent / + // non-painting sections. This height does not affect LayoutHeader(). + virtual int GetHeaderHeightForPainting() const = 0; + virtual void SetHeaderHeightForPainting(int height_for_painting) = 0; + + // Schedule a re-paint of the entire title. + virtual void SchedulePaintForTitle() = 0; + + // Updates the x inset of the leftmost view in the header. + virtual void UpdateLeftViewXInset(int left_view_x_inset) = 0; +}; + +} // namespace wm +} // namespace mash + +#endif // MASH_WM_FRAME_HEADER_PAINTER_H_
diff --git a/mash/wm/frame/header_painter_util.cc b/mash/wm/frame/header_painter_util.cc new file mode 100644 index 0000000..a658d163 --- /dev/null +++ b/mash/wm/frame/header_painter_util.cc
@@ -0,0 +1,80 @@ +// Copyright 2015 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 "mash/wm/frame/header_painter_util.h" + +#include <algorithm> + +#include "ui/gfx/font_list.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/views/view.h" +#include "ui/views/widget/widget.h" + +namespace { + +// Radius of the header's top corners when the window is restored. +const int kTopCornerRadiusWhenRestored = 2; + +// Distance between left edge of the window and the leftmost view. +const int kDefaultLeftViewXInset = 9; + +// Space between the title text and the caption buttons. +const int kTitleCaptionButtonSpacing = 5; + +// Space between window icon and title text. +const int kTitleIconOffsetX = 5; + +// Space between window edge and title text, when there is no icon. +const int kTitleNoIconOffsetX = 8; + +// In the pre-Ash era the web content area had a frame along the left edge, so +// user-generated theme images for the new tab page assume they are shifted +// right relative to the header. Now that we have removed the left edge frame +// we need to copy the theme image for the window header from a few pixels +// inset to preserve alignment with the NTP image, or else we'll break a bunch +// of existing themes. We do something similar on OS X for the same reason. +const int kThemeFrameImageInsetX = 5; + +} // namespace + +namespace mash { +namespace wm { + +// static +int HeaderPainterUtil::GetTopCornerRadiusWhenRestored() { + return kTopCornerRadiusWhenRestored; +} + +// static +int HeaderPainterUtil::GetDefaultLeftViewXInset() { + return kDefaultLeftViewXInset; +} + +// static +int HeaderPainterUtil::GetThemeBackgroundXInset() { + return kThemeFrameImageInsetX; +} + +// static +gfx::Rect HeaderPainterUtil::GetTitleBounds( + const views::View* left_view, + const views::View* right_view, + const gfx::FontList& title_font_list) { + int x = left_view ? left_view->bounds().right() + kTitleIconOffsetX + : kTitleNoIconOffsetX; + int height = title_font_list.GetHeight(); + // Floor when computing the center of |caption_button_container| and when + // computing the center of the text. + int y = std::max(0, (right_view->height() / 2) - (height / 2)); + int width = std::max(0, right_view->x() - kTitleCaptionButtonSpacing - x); + return gfx::Rect(x, y, width, height); +} + +// static +bool HeaderPainterUtil::CanAnimateActivation(views::Widget* widget) { + return true; +} + +} // namespace wm +} // namespace mash
diff --git a/mash/wm/frame/header_painter_util.h b/mash/wm/frame/header_painter_util.h new file mode 100644 index 0000000..230c832 --- /dev/null +++ b/mash/wm/frame/header_painter_util.h
@@ -0,0 +1,56 @@ +// Copyright 2015 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. + +#ifndef MASH_WM_FRAME_HEADER_PAINTER_UTIL_H_ +#define MASH_WM_FRAME_HEADER_PAINTER_UTIL_H_ + +#include "base/macros.h" + +namespace gfx { +class FontList; +class Rect; +} +namespace views { +class View; +class Widget; +} + +namespace mash { +namespace wm { + +// Static-only helper class for functionality used accross multiple +// implementations of HeaderPainter. +class HeaderPainterUtil { + public: + // Returns the radius of the header's corners when the window is restored. + static int GetTopCornerRadiusWhenRestored(); + + // Returns the default distance between the left edge of the window and the + // leftmost view in the header. + static int GetDefaultLeftViewXInset(); + + // Returns the amount that the frame background is inset from the left edge of + // the window. + static int GetThemeBackgroundXInset(); + + // Returns the bounds for the header's title given the views to the left and + // right of the title, and the font used. + // |left_view| should be NULL if there is no view to the left of the title. + static gfx::Rect GetTitleBounds(const views::View* left_view, + const views::View* right_view, + const gfx::FontList& title_font_list); + + // Returns true if the header for |widget| can animate to new visuals when the + // widget's activation changes. Returns false if the header should switch to + // new visuals instantaneously. + static bool CanAnimateActivation(views::Widget* widget); + + private: + DISALLOW_IMPLICIT_CONSTRUCTORS(HeaderPainterUtil); +}; + +} // namespace wm +} // namespace mash + +#endif // MASH_WM_FRAME_HEADER_PAINTER_UTIL_H_
diff --git a/mash/wm/move_loop.cc b/mash/wm/frame/move_loop.cc similarity index 98% rename from mash/wm/move_loop.cc rename to mash/wm/frame/move_loop.cc index 6c3ee7d..786ff76c 100644 --- a/mash/wm/move_loop.cc +++ b/mash/wm/frame/move_loop.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mash/wm/move_loop.h" +#include "mash/wm/frame/move_loop.h" #include "base/auto_reset.h" #include "components/mus/public/cpp/window.h" @@ -11,6 +11,9 @@ #include "ui/gfx/geometry/point_conversions.h" #include "ui/gfx/geometry/rect.h" +namespace mash { +namespace wm { + namespace { gfx::Point EventLocationToPoint(const mus::mojom::Event& event) { @@ -221,3 +224,6 @@ DCHECK_EQ(window, target_); Cancel(); } + +} // namespace wm +} // namespace mash
diff --git a/mash/wm/move_loop.h b/mash/wm/frame/move_loop.h similarity index 94% rename from mash/wm/move_loop.h rename to mash/wm/frame/move_loop.h index fd1a3e7..12ca46e0 100644 --- a/mash/wm/move_loop.h +++ b/mash/wm/frame/move_loop.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef MASH_WM_MOVE_LOOP_H_ -#define MASH_WM_MOVE_LOOP_H_ +#ifndef MASH_WM_FRAME_MOVE_LOOP_H_ +#define MASH_WM_FRAME_MOVE_LOOP_H_ #include "base/macros.h" #include "base/memory/scoped_ptr.h" @@ -12,6 +12,9 @@ #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/rect.h" +namespace mash { +namespace wm { + // MoveLoop is responsible for moving/resizing windows. class MoveLoop : public mus::WindowObserver { public: @@ -112,4 +115,7 @@ DISALLOW_COPY_AND_ASSIGN(MoveLoop); }; -#endif // MASH_WM_MOVE_LOOP_H_ +} // namespace wm +} // namespace mash + +#endif // MASH_WM_FRAME_MOVE_LOOP_H_
diff --git a/mash/wm/move_loop_unittest.cc b/mash/wm/frame/move_loop_unittest.cc similarity index 97% rename from mash/wm/move_loop_unittest.cc rename to mash/wm/frame/move_loop_unittest.cc index 462c7df7..86ca32c1 100644 --- a/mash/wm/move_loop_unittest.cc +++ b/mash/wm/frame/move_loop_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "mash/wm/move_loop.h" +#include "mash/wm/frame/move_loop.h" #include "components/mus/public/cpp/tests/test_window.h" #include "mojo/converters/input_events/input_events_type_converters.h" @@ -13,6 +13,9 @@ using MoveLoopTest = testing::Test; +namespace mash { +namespace wm { + namespace { // Sets the client area for |window|. Padding is provided on the top so that @@ -177,3 +180,6 @@ ASSERT_EQ(data[i].expected_bounds, window.bounds()); } } + +} // namespace wm +} // namespace mash
diff --git a/mash/wm/frame/non_client_frame_view_mash.cc b/mash/wm/frame/non_client_frame_view_mash.cc new file mode 100644 index 0000000..f3bee2de --- /dev/null +++ b/mash/wm/frame/non_client_frame_view_mash.cc
@@ -0,0 +1,351 @@ +// Copyright 2015 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 "mash/wm/frame/non_client_frame_view_mash.h" + +#include <algorithm> +#include <vector> + +#include "components/mus/public/cpp/window.h" +#include "grit/mash_wm_resources.h" +#include "mash/wm/frame/caption_buttons/frame_caption_button_container_view.h" +#include "mash/wm/frame/default_header_painter.h" +#include "mash/wm/frame/frame_border_hit_test_controller.h" +#include "mash/wm/frame/header_painter.h" +#include "mash/wm/frame/move_loop.h" +#include "mojo/converters/input_events/input_events_type_converters.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/compositor/paint_recorder.h" +#include "ui/gfx/canvas.h" +#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/rect_conversions.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gfx/image/image.h" +#include "ui/views/view.h" +#include "ui/views/widget/widget.h" +#include "ui/views/widget/widget_delegate.h" + +namespace mash { +namespace wm { + +/////////////////////////////////////////////////////////////////////////////// +// NonClientFrameViewMash::HeaderView + +// View which paints the header. +class NonClientFrameViewMash::HeaderView : public views::View { + public: + // |frame| is the widget that the caption buttons act on. + explicit HeaderView(views::Widget* frame); + ~HeaderView() override; + + // Schedules a repaint for the entire title. + void SchedulePaintForTitle(); + + // Tells the window controls to reset themselves to the normal state. + void ResetWindowControls(); + + // Returns the view's preferred height. + int GetPreferredHeight() const; + + // Returns the view's minimum width. + int GetMinimumWidth() const; + + void SizeConstraintsChanged(); + + void SetFrameColors(SkColor active_frame_color, SkColor inactive_frame_color); + + // views::View: + void Layout() override; + void OnPaint(gfx::Canvas* canvas) override; + void ChildPreferredSizeChanged(views::View* child) override; + + FrameCaptionButtonContainerView* caption_button_container() { + return caption_button_container_; + } + + private: + // The widget that the caption buttons act on. + views::Widget* frame_; + + // Helper for painting the header. + scoped_ptr<DefaultHeaderPainter> header_painter_; + + // View which contains the window caption buttons. + FrameCaptionButtonContainerView* caption_button_container_; + + DISALLOW_COPY_AND_ASSIGN(HeaderView); +}; + +NonClientFrameViewMash::HeaderView::HeaderView(views::Widget* frame) + : frame_(frame), + header_painter_(new DefaultHeaderPainter), + caption_button_container_(nullptr) { + caption_button_container_ = new FrameCaptionButtonContainerView(frame_); + caption_button_container_->UpdateSizeButtonVisibility(); + AddChildView(caption_button_container_); + + header_painter_->Init(frame_, this, caption_button_container_); +} + +NonClientFrameViewMash::HeaderView::~HeaderView() {} + +void NonClientFrameViewMash::HeaderView::SchedulePaintForTitle() { + header_painter_->SchedulePaintForTitle(); +} + +void NonClientFrameViewMash::HeaderView::ResetWindowControls() { + caption_button_container_->ResetWindowControls(); +} + +int NonClientFrameViewMash::HeaderView::GetPreferredHeight() const { + return header_painter_->GetHeaderHeightForPainting(); +} + +int NonClientFrameViewMash::HeaderView::GetMinimumWidth() const { + return header_painter_->GetMinimumHeaderWidth(); +} + +void NonClientFrameViewMash::HeaderView::SizeConstraintsChanged() { + caption_button_container_->ResetWindowControls(); + caption_button_container_->UpdateSizeButtonVisibility(); + Layout(); +} + +void NonClientFrameViewMash::HeaderView::SetFrameColors( + SkColor active_frame_color, + SkColor inactive_frame_color) { + header_painter_->SetFrameColors(active_frame_color, inactive_frame_color); +} + +/////////////////////////////////////////////////////////////////////////////// +// NonClientFrameViewMash::HeaderView, views::View overrides: + +void NonClientFrameViewMash::HeaderView::Layout() { + header_painter_->LayoutHeader(); +} + +void NonClientFrameViewMash::HeaderView::OnPaint(gfx::Canvas* canvas) { + bool paint_as_active = + frame_->non_client_view()->frame_view()->ShouldPaintAsActive(); + caption_button_container_->SetPaintAsActive(paint_as_active); + + HeaderPainter::Mode header_mode = paint_as_active + ? HeaderPainter::MODE_ACTIVE + : HeaderPainter::MODE_INACTIVE; + header_painter_->PaintHeader(canvas, header_mode); +} + +void NonClientFrameViewMash::HeaderView::ChildPreferredSizeChanged( + views::View* child) { + // FrameCaptionButtonContainerView animates the visibility changes in + // UpdateSizeButtonVisibility(false). Due to this a new size is not available + // until the completion of the animation. Layout in response to the preferred + // size changes. + if (child != caption_button_container_) + return; + parent()->Layout(); +} + +//////////////////////////////////////////////////////////////////////////////// +// NonClientFrameViewMash, public: + +// static +const char NonClientFrameViewMash::kViewClassName[] = "NonClientFrameViewMash"; + +NonClientFrameViewMash::NonClientFrameViewMash(views::Widget* frame, + mus::Window* window) + : frame_(frame), window_(window), header_view_(new HeaderView(frame)) { + // |header_view_| is set as the non client view's overlay view so that it can + // overlay the web contents in immersive fullscreen. + AddChildView(header_view_); + window_->AddObserver(this); +} + +NonClientFrameViewMash::~NonClientFrameViewMash() { + if (window_) + window_->RemoveObserver(this); +} + +// static +gfx::Insets NonClientFrameViewMash::GetPreferredClientAreaInsets() { + ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); + const int header_height = + rb.GetImageSkiaNamed(IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_P) + ->size() + .height(); + return gfx::Insets(header_height, 0, 0, 0); +} + +void NonClientFrameViewMash::SetFrameColors(SkColor active_frame_color, + SkColor inactive_frame_color) { + header_view_->SetFrameColors(active_frame_color, inactive_frame_color); +} + +//////////////////////////////////////////////////////////////////////////////// +// NonClientFrameViewMash, views::NonClientFrameView overrides: + +gfx::Rect NonClientFrameViewMash::GetBoundsForClientView() const { + gfx::Rect result(GetLocalBounds()); + result.Inset(window_->client_area()); + return result; +} + +gfx::Rect NonClientFrameViewMash::GetWindowBoundsForClientBounds( + const gfx::Rect& client_bounds) const { + gfx::Rect window_bounds = client_bounds; + window_bounds.Inset( + window_->client_area().left(), window_->client_area().top(), + window_->client_area().right(), window_->client_area().bottom()); + return window_bounds; +} + +int NonClientFrameViewMash::NonClientHitTest(const gfx::Point& point) { + return FrameBorderHitTestController::NonClientHitTest( + this, header_view_->caption_button_container(), point); +} + +void NonClientFrameViewMash::GetWindowMask(const gfx::Size& size, + gfx::Path* window_mask) {} + +void NonClientFrameViewMash::ResetWindowControls() { + header_view_->ResetWindowControls(); +} + +void NonClientFrameViewMash::UpdateWindowIcon() {} + +void NonClientFrameViewMash::UpdateWindowTitle() { + header_view_->SchedulePaintForTitle(); +} + +void NonClientFrameViewMash::SizeConstraintsChanged() { + header_view_->SizeConstraintsChanged(); +} + +//////////////////////////////////////////////////////////////////////////////// +// NonClientFrameViewMash, views::View overrides: + +void NonClientFrameViewMash::Layout() { + header_view_->SetBounds(0, 0, width(), header_view_->GetPreferredHeight()); + header_view_->Layout(); +} + +gfx::Size NonClientFrameViewMash::GetPreferredSize() const { + gfx::Size pref = frame_->client_view()->GetPreferredSize(); + return frame_->non_client_view() + ->GetWindowBoundsForClientBounds(gfx::Rect(pref)) + .size(); +} + +const char* NonClientFrameViewMash::GetClassName() const { + return kViewClassName; +} + +gfx::Size NonClientFrameViewMash::GetMinimumSize() const { + gfx::Size min_client_view_size(frame_->client_view()->GetMinimumSize()); + return gfx::Size( + std::max(header_view_->GetMinimumWidth(), min_client_view_size.width()), + NonClientTopBorderHeight() + min_client_view_size.height()); +} + +gfx::Size NonClientFrameViewMash::GetMaximumSize() const { + gfx::Size max_client_size(frame_->client_view()->GetMaximumSize()); + int width = 0; + int height = 0; + + if (max_client_size.width() > 0) + width = std::max(header_view_->GetMinimumWidth(), max_client_size.width()); + if (max_client_size.height() > 0) + height = NonClientTopBorderHeight() + max_client_size.height(); + + return gfx::Size(width, height); +} + +void NonClientFrameViewMash::OnPaint(gfx::Canvas* canvas) { + canvas->Save(); + NonClientFrameView::OnPaint(canvas); + canvas->Restore(); + + // The client app draws the client area. Make ours totally transparent so + // we only see the client apps client area. + canvas->FillRect(GetBoundsForClientView(), SK_ColorBLACK, + SkXfermode::kSrc_Mode); +} + +void NonClientFrameViewMash::PaintChildren(const ui::PaintContext& context) { + NonClientFrameView::PaintChildren(context); + + // The client app draws the client area. Make ours totally transparent so + // we only see the client apps client area. + ui::PaintRecorder recorder(context, size(), &paint_cache_); + recorder.canvas()->FillRect(GetBoundsForClientView(), SK_ColorBLACK, + SkXfermode::kSrc_Mode); +} + +bool NonClientFrameViewMash::OnMousePressed(const ui::MouseEvent& event) { + return StartMoveLoopIfNecessary(event); +} + +bool NonClientFrameViewMash::OnMouseDragged(const ui::MouseEvent& event) { + ContinueMove(event); + return move_loop_.get() != nullptr; +} + +void NonClientFrameViewMash::OnMouseReleased(const ui::MouseEvent& event) { + ContinueMove(event); +} + +void NonClientFrameViewMash::OnMouseCaptureLost() { + StopMove(); +} + +void NonClientFrameViewMash::OnWindowClientAreaChanged( + mus::Window* window, + const gfx::Insets& old_client_area) { + Layout(); + // NonClientView (our parent) positions the client view based on bounds from + // us. We need to layout from parent to trigger a layout of the client view. + if (parent()) + parent()->Layout(); + SchedulePaint(); +} + +void NonClientFrameViewMash::OnWindowDestroyed(mus::Window* window) { + window_->RemoveObserver(this); + window_ = nullptr; +} + +bool NonClientFrameViewMash::StartMoveLoopIfNecessary(const ui::Event& event) { + if (move_loop_) + return false; + // TODO(sky): convert MoveLoop to take ui::Event. + // TODO(sky): pass in hit test result. + move_loop_ = MoveLoop::Create(window_, *mus::mojom::Event::From(event)); + return true; +} + +void NonClientFrameViewMash::ContinueMove(const ui::Event& event) { + // TODO(sky): convert MoveLoop to take ui::Event. + if (move_loop_ && + move_loop_->Move(*mus::mojom::Event::From(event)) == MoveLoop::DONE) { + move_loop_.reset(); + } +} + +void NonClientFrameViewMash::StopMove() { + move_loop_.reset(); +} + +views::View* NonClientFrameViewMash::GetHeaderView() { + return header_view_; +} + +//////////////////////////////////////////////////////////////////////////////// +// NonClientFrameViewMash, private: + +int NonClientFrameViewMash::NonClientTopBorderHeight() const { + return header_view_->GetPreferredHeight(); +} + +} // namespace wm +} // namespace mash
diff --git a/mash/wm/frame/non_client_frame_view_mash.h b/mash/wm/frame/non_client_frame_view_mash.h new file mode 100644 index 0000000..31b6880 --- /dev/null +++ b/mash/wm/frame/non_client_frame_view_mash.h
@@ -0,0 +1,107 @@ +// Copyright 2015 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. + +#ifndef MASH_WM_FRAME_NON_CLIENT_FRAME_VIEW_MASH_H_ +#define MASH_WM_FRAME_NON_CLIENT_FRAME_VIEW_MASH_H_ + +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "components/mus/public/cpp/window_observer.h" +#include "third_party/skia/include/core/SkColor.h" +#include "ui/compositor/paint_cache.h" +#include "ui/views/window/non_client_view.h" + +namespace gfx { +class Insets; +} + +namespace mus { +class Window; +} + +namespace views { +class Widget; +} + +namespace mash { +namespace wm { + +class FrameCaptionButtonContainerView; +class MoveLoop; + +class NonClientFrameViewMash : public views::NonClientFrameView, + public mus::WindowObserver { + public: + // Internal class name. + static const char kViewClassName[]; + + NonClientFrameViewMash(views::Widget* frame, mus::Window* window); + ~NonClientFrameViewMash() override; + + static gfx::Insets GetPreferredClientAreaInsets(); + + // Sets the active and inactive frame colors. Note the inactive frame color + // will have some transparency added when the frame is drawn. + void SetFrameColors(SkColor active_frame_color, SkColor inactive_frame_color); + + // views::NonClientFrameView: + gfx::Rect GetBoundsForClientView() const override; + gfx::Rect GetWindowBoundsForClientBounds( + const gfx::Rect& client_bounds) const override; + int NonClientHitTest(const gfx::Point& point) override; + void GetWindowMask(const gfx::Size& size, gfx::Path* window_mask) override; + void ResetWindowControls() override; + void UpdateWindowIcon() override; + void UpdateWindowTitle() override; + void SizeConstraintsChanged() override; + + // views::View: + void Layout() override; + gfx::Size GetPreferredSize() const override; + const char* GetClassName() const override; + gfx::Size GetMinimumSize() const override; + gfx::Size GetMaximumSize() const override; + void OnPaint(gfx::Canvas* canvas) override; + void PaintChildren(const ui::PaintContext& context) override; + bool OnMousePressed(const ui::MouseEvent& event) override; + bool OnMouseDragged(const ui::MouseEvent& event) override; + void OnMouseReleased(const ui::MouseEvent& event) override; + void OnMouseCaptureLost() override; + + // mus::WindowObserver: + void OnWindowClientAreaChanged(mus::Window* window, + const gfx::Insets& old_client_area) override; + void OnWindowDestroyed(mus::Window* window) override; + + // Get the view of the header. + views::View* GetHeaderView(); + + private: + class OverlayView; + + // Height from top of window to top of client area. + int NonClientTopBorderHeight() const; + + bool StartMoveLoopIfNecessary(const ui::Event& event); + void ContinueMove(const ui::Event& event); + void StopMove(); + + // Not owned. + views::Widget* frame_; + + mus::Window* window_; + ui::PaintCache paint_cache_; + scoped_ptr<MoveLoop> move_loop_; + + // View which contains the title and window controls. + class HeaderView; + HeaderView* header_view_; + + DISALLOW_COPY_AND_ASSIGN(NonClientFrameViewMash); +}; + +} // namespace wm +} // namespace mash + +#endif // MASH_WM_FRAME_NON_CLIENT_FRAME_VIEW_MASH_H_
diff --git a/mash/wm/non_client_frame_controller.cc b/mash/wm/non_client_frame_controller.cc index b9a95ed..b0eef4e 100644 --- a/mash/wm/non_client_frame_controller.cc +++ b/mash/wm/non_client_frame_controller.cc
@@ -5,7 +5,7 @@ #include "mash/wm/non_client_frame_controller.h" #include "components/mus/public/cpp/window.h" -#include "mash/wm/non_client_frame_view_impl.h" +#include "mash/wm/frame/non_client_frame_view_mash.h" #include "mash/wm/property_util.h" #include "ui/views/mus/native_widget_mus.h" #include "ui/views/widget/widget.h" @@ -25,9 +25,10 @@ // NativeWidgetMus: views::NonClientFrameView* CreateNonClientFrameView() override { - NonClientFrameViewImpl* frame_view = new NonClientFrameViewImpl(window()); - frame_view->Init( - static_cast<views::internal::NativeWidgetPrivate*>(this)->GetWidget()); + views::Widget* widget = + static_cast<views::internal::NativeWidgetPrivate*>(this)->GetWidget(); + mash::wm::NonClientFrameViewMash* frame_view = + new mash::wm::NonClientFrameViewMash(widget, window()); return frame_view; } void CenterWindow(const gfx::Size& size) override { @@ -56,6 +57,11 @@ widget_->Show(); } +// static +gfx::Insets NonClientFrameController::GetPreferredClientAreaInsets() { + return mash::wm::NonClientFrameViewMash::GetPreferredClientAreaInsets(); +} + NonClientFrameController::~NonClientFrameController() { if (window_) window_->RemoveObserver(this);
diff --git a/mash/wm/non_client_frame_controller.h b/mash/wm/non_client_frame_controller.h index dfedd07..5e5918c 100644 --- a/mash/wm/non_client_frame_controller.h +++ b/mash/wm/non_client_frame_controller.h
@@ -9,6 +9,10 @@ #include "components/mus/public/cpp/window_observer.h" #include "ui/views/widget/widget_delegate.h" +namespace gfx { +class Insets; +} + namespace mojo { class Shell; } @@ -24,6 +28,9 @@ // NonClientFrameController deletes itself when |window| is destroyed. NonClientFrameController(mojo::Shell* shell, mus::Window* window); + // Returns the preferred client area insets. + static gfx::Insets GetPreferredClientAreaInsets(); + private: ~NonClientFrameController() override;
diff --git a/mash/wm/non_client_frame_view_impl.cc b/mash/wm/non_client_frame_view_impl.cc deleted file mode 100644 index 976143b3..0000000 --- a/mash/wm/non_client_frame_view_impl.cc +++ /dev/null
@@ -1,101 +0,0 @@ -// Copyright 2015 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 "mash/wm/non_client_frame_view_impl.h" - -#include "components/mus/public/cpp/window.h" -#include "mash/wm/move_loop.h" -#include "mojo/converters/input_events/input_events_type_converters.h" -#include "ui/compositor/paint_recorder.h" -#include "ui/gfx/canvas.h" - -NonClientFrameViewImpl::NonClientFrameViewImpl(mus::Window* window) - : window_(window) { - window_->AddObserver(this); -} - -NonClientFrameViewImpl::~NonClientFrameViewImpl() { - if (window_) - window_->RemoveObserver(this); -} - -gfx::Rect NonClientFrameViewImpl::GetBoundsForClientView() const { - gfx::Rect result(GetLocalBounds()); - result.Inset(window_->client_area()); - return result; -} - -void NonClientFrameViewImpl::OnPaint(gfx::Canvas* canvas) { - canvas->Save(); - CustomFrameView::OnPaint(canvas); - canvas->Restore(); - - // The client app draws the client area. Make ours totally transparent so - // we only see the client apps client area. - canvas->FillRect(GetBoundsForClientView(), SK_ColorBLACK, - SkXfermode::kSrc_Mode); -} - -void NonClientFrameViewImpl::PaintChildren(const ui::PaintContext& context) { - CustomFrameView::PaintChildren(context); - - // The client app draws the client area. Make ours totally transparent so - // we only see the client apps client area. - ui::PaintRecorder recorder(context, size(), &paint_cache_); - recorder.canvas()->FillRect(GetBoundsForClientView(), SK_ColorBLACK, - SkXfermode::kSrc_Mode); -} - -bool NonClientFrameViewImpl::OnMousePressed(const ui::MouseEvent& event) { - return StartMoveLoopIfNecessary(event); -} - -bool NonClientFrameViewImpl::OnMouseDragged(const ui::MouseEvent& event) { - ContinueMove(event); - return move_loop_.get() != nullptr; -} - -void NonClientFrameViewImpl::OnMouseReleased(const ui::MouseEvent& event) { - ContinueMove(event); -} - -void NonClientFrameViewImpl::OnMouseCaptureLost() { - StopMove(); -} - -void NonClientFrameViewImpl::OnWindowClientAreaChanged( - mus::Window* window, - const gfx::Insets& old_client_area) { - Layout(); - // NonClientView (our parent) positions the client view based on bounds from - // us. We need to layout from parent to trigger a layout of the client view. - if (parent()) - parent()->Layout(); - SchedulePaint(); -} - -void NonClientFrameViewImpl::OnWindowDestroyed(mus::Window* window) { - window_->RemoveObserver(this); - window_ = nullptr; -} - -bool NonClientFrameViewImpl::StartMoveLoopIfNecessary(const ui::Event& event) { - if (move_loop_) - return false; - // TODO(sky): convert MoveLoop to take ui::Event. - move_loop_ = MoveLoop::Create(window_, *mus::mojom::Event::From(event)); - return true; -} - -void NonClientFrameViewImpl::ContinueMove(const ui::Event& event) { - // TODO(sky): convert MoveLoop to take ui::Event. - if (move_loop_ && - move_loop_->Move(*mus::mojom::Event::From(event)) == MoveLoop::DONE) { - move_loop_.reset(); - } -} - -void NonClientFrameViewImpl::StopMove() { - move_loop_.reset(); -}
diff --git a/mash/wm/non_client_frame_view_impl.h b/mash/wm/non_client_frame_view_impl.h deleted file mode 100644 index e7e3eef..0000000 --- a/mash/wm/non_client_frame_view_impl.h +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2015 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. - -#ifndef MASH_WM_NON_CLIENT_FRAME_VIEW_IMPL_H_ -#define MASH_WM_NON_CLIENT_FRAME_VIEW_IMPL_H_ - -#include "base/macros.h" -#include "base/memory/scoped_ptr.h" -#include "components/mus/public/cpp/window_observer.h" -#include "ui/compositor/paint_cache.h" -#include "ui/views/window/custom_frame_view.h" - -class MoveLoop; - -class NonClientFrameViewImpl : public views::CustomFrameView, - public mus::WindowObserver { - public: - explicit NonClientFrameViewImpl(mus::Window* window); - ~NonClientFrameViewImpl() override; - - private: - // CustomFrameView: - gfx::Rect GetBoundsForClientView() const override; - void OnPaint(gfx::Canvas* canvas) override; - void PaintChildren(const ui::PaintContext& context) override; - bool OnMousePressed(const ui::MouseEvent& event) override; - bool OnMouseDragged(const ui::MouseEvent& event) override; - void OnMouseReleased(const ui::MouseEvent& event) override; - void OnMouseCaptureLost() override; - - // mus::WindowObserver: - void OnWindowClientAreaChanged(mus::Window* window, - const gfx::Insets& old_client_area) override; - void OnWindowDestroyed(mus::Window* window) override; - - private: - bool StartMoveLoopIfNecessary(const ui::Event& event); - void ContinueMove(const ui::Event& event); - void StopMove(); - - mus::Window* window_; - ui::PaintCache paint_cache_; - scoped_ptr<MoveLoop> move_loop_; - - DISALLOW_COPY_AND_ASSIGN(NonClientFrameViewImpl); -}; - -#endif // MASH_WM_NON_CLIENT_FRAME_VIEW_IMPL_H_
diff --git a/mash/wm/resources/BUILD.gn b/mash/wm/resources/BUILD.gn new file mode 100644 index 0000000..86bd617 --- /dev/null +++ b/mash/wm/resources/BUILD.gn
@@ -0,0 +1,14 @@ +# Copyright 2015 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. + +import("//tools/grit/grit_rule.gni") + +grit("resources") { + source = "mash_wm_resources.grd" + outputs = [ + "grit/mash_wm_resources.h", + "mash_wm_resources_100_percent.pak", + "mash_wm_resources_200_percent.pak", + ] +}
diff --git a/mash/wm/resources/default_100_percent/common/window_control_background_hover.png b/mash/wm/resources/default_100_percent/common/window_control_background_hover.png new file mode 100644 index 0000000..f32a78ea --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_background_hover.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_background_pressed.png b/mash/wm/resources/default_100_percent/common/window_control_background_pressed.png new file mode 100644 index 0000000..2aee9da --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_background_pressed.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_icon_close.png b/mash/wm/resources/default_100_percent/common/window_control_icon_close.png new file mode 100644 index 0000000..db26524 --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_icon_close.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_icon_close_white.png b/mash/wm/resources/default_100_percent/common/window_control_icon_close_white.png new file mode 100644 index 0000000..1bc6a84 --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_icon_close_white.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_icon_left_snapped.png b/mash/wm/resources/default_100_percent/common/window_control_icon_left_snapped.png new file mode 100644 index 0000000..4374068dfb --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_icon_left_snapped.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_icon_left_snapped_white.png b/mash/wm/resources/default_100_percent/common/window_control_icon_left_snapped_white.png new file mode 100644 index 0000000..58be13a --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_icon_left_snapped_white.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_icon_maximize.png b/mash/wm/resources/default_100_percent/common/window_control_icon_maximize.png new file mode 100644 index 0000000..ce0cf13 --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_icon_maximize.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_icon_maximize_white.png b/mash/wm/resources/default_100_percent/common/window_control_icon_maximize_white.png new file mode 100644 index 0000000..5dc6ccb --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_icon_maximize_white.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_icon_minimize.png b/mash/wm/resources/default_100_percent/common/window_control_icon_minimize.png new file mode 100644 index 0000000..48c262c --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_icon_minimize.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_icon_minimize_white.png b/mash/wm/resources/default_100_percent/common/window_control_icon_minimize_white.png new file mode 100644 index 0000000..b085916 --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_icon_minimize_white.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_icon_restore.png b/mash/wm/resources/default_100_percent/common/window_control_icon_restore.png new file mode 100644 index 0000000..565dae9c --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_icon_restore.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_icon_restore_white.png b/mash/wm/resources/default_100_percent/common/window_control_icon_restore_white.png new file mode 100644 index 0000000..5b51c15 --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_icon_restore_white.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_icon_right_snapped.png b/mash/wm/resources/default_100_percent/common/window_control_icon_right_snapped.png new file mode 100644 index 0000000..53551d4f --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_icon_right_snapped.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_control_icon_right_snapped_white.png b/mash/wm/resources/default_100_percent/common/window_control_icon_right_snapped_white.png new file mode 100644 index 0000000..b02d33c --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_control_icon_right_snapped_white.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_header_shade_bottom_inactive.png b/mash/wm/resources/default_100_percent/common/window_header_shade_bottom_inactive.png new file mode 100644 index 0000000..69a3e01 --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_header_shade_bottom_inactive.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_header_shade_left_inactive.png b/mash/wm/resources/default_100_percent/common/window_header_shade_left_inactive.png new file mode 100644 index 0000000..06b9749 --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_header_shade_left_inactive.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_header_shade_right_inactive.png b/mash/wm/resources/default_100_percent/common/window_header_shade_right_inactive.png new file mode 100644 index 0000000..3dcc983 --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_header_shade_right_inactive.png Binary files differ
diff --git a/mash/wm/resources/default_100_percent/common/window_header_shade_top_inactive.png b/mash/wm/resources/default_100_percent/common/window_header_shade_top_inactive.png new file mode 100644 index 0000000..0be57ba --- /dev/null +++ b/mash/wm/resources/default_100_percent/common/window_header_shade_top_inactive.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_background_hover.png b/mash/wm/resources/default_200_percent/common/window_control_background_hover.png new file mode 100644 index 0000000..d37f619e9 --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_background_hover.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_background_pressed.png b/mash/wm/resources/default_200_percent/common/window_control_background_pressed.png new file mode 100644 index 0000000..77fcf5f --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_background_pressed.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_icon_close.png b/mash/wm/resources/default_200_percent/common/window_control_icon_close.png new file mode 100644 index 0000000..5c14ecd --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_icon_close.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_icon_close_white.png b/mash/wm/resources/default_200_percent/common/window_control_icon_close_white.png new file mode 100644 index 0000000..27cef0f --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_icon_close_white.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_icon_left_snapped.png b/mash/wm/resources/default_200_percent/common/window_control_icon_left_snapped.png new file mode 100644 index 0000000..f8db919 --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_icon_left_snapped.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_icon_left_snapped_white.png b/mash/wm/resources/default_200_percent/common/window_control_icon_left_snapped_white.png new file mode 100644 index 0000000..6e938b8 --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_icon_left_snapped_white.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_icon_maximize.png b/mash/wm/resources/default_200_percent/common/window_control_icon_maximize.png new file mode 100644 index 0000000..a5947a59 --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_icon_maximize.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_icon_maximize_white.png b/mash/wm/resources/default_200_percent/common/window_control_icon_maximize_white.png new file mode 100644 index 0000000..5e17aaef --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_icon_maximize_white.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_icon_minimize.png b/mash/wm/resources/default_200_percent/common/window_control_icon_minimize.png new file mode 100644 index 0000000..837b433f --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_icon_minimize.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_icon_minimize_white.png b/mash/wm/resources/default_200_percent/common/window_control_icon_minimize_white.png new file mode 100644 index 0000000..cb295d0 --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_icon_minimize_white.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_icon_restore.png b/mash/wm/resources/default_200_percent/common/window_control_icon_restore.png new file mode 100644 index 0000000..5a327bb --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_icon_restore.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_icon_restore_white.png b/mash/wm/resources/default_200_percent/common/window_control_icon_restore_white.png new file mode 100644 index 0000000..a2e02ed --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_icon_restore_white.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_icon_right_snapped.png b/mash/wm/resources/default_200_percent/common/window_control_icon_right_snapped.png new file mode 100644 index 0000000..8eed437a --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_icon_right_snapped.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_control_icon_right_snapped_white.png b/mash/wm/resources/default_200_percent/common/window_control_icon_right_snapped_white.png new file mode 100644 index 0000000..d8d5cfd4 --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_control_icon_right_snapped_white.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_header_shade_bottom_inactive.png b/mash/wm/resources/default_200_percent/common/window_header_shade_bottom_inactive.png new file mode 100644 index 0000000..5c6d4ff1 --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_header_shade_bottom_inactive.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_header_shade_left_inactive.png b/mash/wm/resources/default_200_percent/common/window_header_shade_left_inactive.png new file mode 100644 index 0000000..91f40878 --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_header_shade_left_inactive.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_header_shade_right_inactive.png b/mash/wm/resources/default_200_percent/common/window_header_shade_right_inactive.png new file mode 100644 index 0000000..2ab6d846 --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_header_shade_right_inactive.png Binary files differ
diff --git a/mash/wm/resources/default_200_percent/common/window_header_shade_top_inactive.png b/mash/wm/resources/default_200_percent/common/window_header_shade_top_inactive.png new file mode 100644 index 0000000..576ad9b --- /dev/null +++ b/mash/wm/resources/default_200_percent/common/window_header_shade_top_inactive.png Binary files differ
diff --git a/mash/wm/resources/mash_wm_resources.grd b/mash/wm/resources/mash_wm_resources.grd new file mode 100644 index 0000000..cd5dfc35 --- /dev/null +++ b/mash/wm/resources/mash_wm_resources.grd
@@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<grit latest_public_release="0" current_release="1"> + <outputs> + <output filename="grit/mash_wm_resources.h" type="rc_header" context="default_100_percent"> + <emit emit_type='prepend'></emit> + </output> + <output filename="mash_wm_resources_100_percent.pak" type="data_package" context="default_100_percent" /> + <output filename="mash_wm_resources_200_percent.pak" type="data_package" context="default_200_percent" /> + </outputs> + <release seq="1"> + <structures fallback_to_low_resolution="true"> + <!-- KEEP THESE IN ALPHABETICAL ORDER! DO NOT ADD TO RANDOM PLACES JUST + BECAUSE YOUR RESOURCES ARE FUNCTIONALLY RELATED OR FALL UNDER THE + SAME CONDITIONALS. --> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_H" file="common/window_control_background_hover.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_BACKGROUND_P" file="common/window_control_background_pressed.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_ICON_CLOSE" file="common/window_control_icon_close.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_ICON_CLOSE_WHITE" file="common/window_control_icon_close_white.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_ICON_LEFT_SNAPPED" file="common/window_control_icon_left_snapped.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_ICON_LEFT_SNAPPED_WHITE" file="common/window_control_icon_left_snapped_white.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_ICON_MAXIMIZE" file="common/window_control_icon_maximize.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_ICON_MAXIMIZE_WHITE" file="common/window_control_icon_maximize_white.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_ICON_MINIMIZE" file="common/window_control_icon_minimize.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_ICON_MINIMIZE_WHITE" file="common/window_control_icon_minimize_white.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_ICON_RESTORE" file="common/window_control_icon_restore.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_ICON_RESTORE_WHITE" file="common/window_control_icon_restore_white.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_ICON_RIGHT_SNAPPED" file="common/window_control_icon_right_snapped.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_CONTROL_ICON_RIGHT_SNAPPED_WHITE" file="common/window_control_icon_right_snapped_white.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_HEADER_SHADE_INACTIVE_BOTTOM" file="common/window_header_shade_bottom_inactive.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_HEADER_SHADE_INACTIVE_LEFT" file="common/window_header_shade_left_inactive.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_HEADER_SHADE_INACTIVE_RIGHT" file="common/window_header_shade_right_inactive.png" /> + <structure type="chrome_scaled_image" name="IDR_MASH_WM_WINDOW_HEADER_SHADE_INACTIVE_TOP" file="common/window_header_shade_top_inactive.png" /> + </structures> + </release> +</grit>
diff --git a/mash/wm/window_manager_application.cc b/mash/wm/window_manager_application.cc index 388c55f..bf58d79 100644 --- a/mash/wm/window_manager_application.cc +++ b/mash/wm/window_manager_application.cc
@@ -13,6 +13,7 @@ #include "mash/wm/window_layout.h" #include "mash/wm/window_manager_impl.h" #include "mojo/application/public/cpp/application_connection.h" +#include "mojo/services/tracing/public/cpp/tracing_impl.h" #include "ui/mojo/init/ui_init.h" #include "ui/views/mus/aura_init.h" #include "ui/views/mus/display_converter.h" @@ -34,6 +35,7 @@ void WindowManagerApplication::Initialize(mojo::ApplicationImpl* app) { app_ = app; + tracing_.Initialize(app); mus::mojom::WindowManagerPtr window_manager; requests_.push_back(new mojo::InterfaceRequest<mus::mojom::WindowManager>( mojo::GetProxy(&window_manager))); @@ -61,7 +63,7 @@ window_manager_.reset(new WindowManagerImpl(this)); ui_init_.reset(new ui::mojo::UIInit(views::GetDisplaysFromWindow(root))); - aura_init_.reset(new views::AuraInit(app_, "views_mus_resources.pak")); + aura_init_.reset(new views::AuraInit(app_, "mash_wm_resources.pak")); for (auto request : requests_) window_manager_binding_.AddBinding(window_manager_.get(), request->Pass()); @@ -106,7 +108,9 @@ scoped_ptr<std::vector<uint8_t>>* new_data) { // TODO(sky): constrain this to set of keys we know about, and allowed // values. - return name == mus::mojom::WindowManager::kShowState_Property; + return name == mus::mojom::WindowManager::kShowState_Property || + name == mus::mojom::WindowManager::kPreferredSize_Property || + name == mus::mojom::WindowManager::kResizeBehavior_Property; } void WindowManagerApplication::CreateContainers() {
diff --git a/mash/wm/window_manager_application.h b/mash/wm/window_manager_application.h index 39e04840..95880a3 100644 --- a/mash/wm/window_manager_application.h +++ b/mash/wm/window_manager_application.h
@@ -18,6 +18,7 @@ #include "mojo/application/public/cpp/application_delegate.h" #include "mojo/application/public/cpp/interface_factory_impl.h" #include "mojo/common/weak_binding_set.h" +#include "mojo/services/tracing/public/cpp/tracing_impl.h" class BackgroundLayout; class ShelfLayout; @@ -88,6 +89,8 @@ mojo::ApplicationImpl* app_; + mojo::TracingImpl tracing_; + mus::mojom::WindowTreeHostPtr host_; scoped_ptr<ui::mojo::UIInit> ui_init_;
diff --git a/mash/wm/window_manager_apptest.cc b/mash/wm/window_manager_apptest.cc index fad6d68..37f33f2 100644 --- a/mash/wm/window_manager_apptest.cc +++ b/mash/wm/window_manager_apptest.cc
@@ -44,33 +44,9 @@ DISALLOW_COPY_AND_ASSIGN(WindowManagerAppTest); }; -TEST_F(WindowManagerAppTest, SetPreferredSize) { - // TODO(beng): right now this only verifies that requests from other - // connections are blocked. We need to be able to reliably - // configure the size of the window manager's display before we - // can properly validate that centering actually happened. - mus::mojom::WindowManagerPtr connection1, connection2; - ConnectToWindowManager(&connection1); - ConnectToWindowManager(&connection2); +TEST_F(WindowManagerAppTest, OpenWindow) { + mus::mojom::WindowManagerPtr connection; + ConnectToWindowManager(&connection); - mus::Window* window_from_connection1 = OpenWindow(connection1.get()); - mus::Window* window_from_connection2 = OpenWindow(connection2.get()); - - bool succeeded = false; - connection1->SetPreferredSize( - window_from_connection1->id(), mojo::Size::New(), - [&succeeded](mus::mojom::WindowManagerErrorCode result) { - succeeded = result == mus::mojom::WINDOW_MANAGER_ERROR_CODE_SUCCESS; - }); - ASSERT_TRUE(connection1.WaitForIncomingResponse()); - EXPECT_TRUE(succeeded); - - succeeded = false; - connection1->SetPreferredSize( - window_from_connection2->id(), mojo::Size::New(), - [&succeeded](mus::mojom::WindowManagerErrorCode result) { - succeeded = result == mus::mojom::WINDOW_MANAGER_ERROR_CODE_SUCCESS; - }); - ASSERT_TRUE(connection1.WaitForIncomingResponse()); - EXPECT_FALSE(succeeded); + ASSERT_TRUE(OpenWindow(connection.get())); }
diff --git a/mash/wm/window_manager_impl.cc b/mash/wm/window_manager_impl.cc index 06b6f9aa..46919aa 100644 --- a/mash/wm/window_manager_impl.cc +++ b/mash/wm/window_manager_impl.cc
@@ -10,7 +10,6 @@ #include "components/mus/public/cpp/window_property.h" #include "components/mus/public/cpp/window_tree_connection.h" #include "components/mus/public/interfaces/input_events.mojom.h" -#include "mash/wm/move_loop.h" #include "mash/wm/non_client_frame_controller.h" #include "mash/wm/property_util.h" #include "mash/wm/public/interfaces/container.mojom.h" @@ -85,29 +84,6 @@ state_->IncrementWindowCount(); } -void WindowManagerImpl::SetPreferredSize( - mus::Id window_id, - mojo::SizePtr size, - const WindowManagerErrorCodeCallback& callback) { - mus::Window* window = state_->GetWindowById(window_id); - if (window) - SetWindowPreferredSize(window, size.To<gfx::Size>()); - - callback.Run(window - ? mus::mojom::WINDOW_MANAGER_ERROR_CODE_SUCCESS - : mus::mojom::WINDOW_MANAGER_ERROR_CODE_ERROR_ACCESS_DENIED); -} - -void WindowManagerImpl::SetResizeBehavior( - uint32_t window_id, - mus::mojom::ResizeBehavior resize_behavior) { - mus::Window* window = state_->GetWindowById(window_id); - if (window) { - window->SetSharedProperty<int32_t>( - mus::mojom::WindowManager::kResizeBehavior_Property, resize_behavior); - } -} - void WindowManagerImpl::GetConfig(const GetConfigCallback& callback) { mus::mojom::WindowManagerConfigPtr config( mus::mojom::WindowManagerConfig::New()); @@ -125,17 +101,11 @@ // The insets are roughly what is needed by CustomFrameView. The expectation // is at some point we'll write our own NonClientFrameView and get the insets // from it. - config->normal_client_area_insets = mojo::Insets::New(); - config->normal_client_area_insets->top = 23; - config->normal_client_area_insets->left = 5; - config->normal_client_area_insets->right = 5; - config->normal_client_area_insets->bottom = 5; + const gfx::Insets client_area_insets = + NonClientFrameController::GetPreferredClientAreaInsets(); + config->normal_client_area_insets = mojo::Insets::From(client_area_insets); - config->maximized_client_area_insets = mojo::Insets::New(); - config->maximized_client_area_insets->top = 21; - config->maximized_client_area_insets->left = 0; - config->maximized_client_area_insets->right = 0; - config->maximized_client_area_insets->bottom = 0; + config->maximized_client_area_insets = mojo::Insets::From(client_area_insets); callback.Run(config.Pass()); }
diff --git a/mash/wm/window_manager_impl.h b/mash/wm/window_manager_impl.h index cbea071c..40fa8cdee 100644 --- a/mash/wm/window_manager_impl.h +++ b/mash/wm/window_manager_impl.h
@@ -29,12 +29,6 @@ void OpenWindow( mus::mojom::WindowTreeClientPtr client, mojo::Map<mojo::String, mojo::Array<uint8_t>> properties) override; - void SetPreferredSize( - mus::Id window_id, - mojo::SizePtr size, - const WindowManagerErrorCodeCallback& callback) override; - void SetResizeBehavior(uint32_t window_id, - mus::mojom::ResizeBehavior resize_behavior) override; void GetConfig(const GetConfigCallback& callback) override; mus::Window* GetContainerForChild(mus::Window* child);
diff --git a/media/base/android/media_codec_decoder.cc b/media/base/android/media_codec_decoder.cc index c7b9e2a..cdbaf07 100644 --- a/media/base/android/media_codec_decoder.cc +++ b/media/base/android/media_codec_decoder.cc
@@ -541,6 +541,19 @@ void MediaCodecDecoder::RequestData() { DCHECK(media_task_runner_->BelongsToCurrentThread()); + // We request data only in kPrefetching, kPrerolling and kRunning states. + // For kPrerolling and kRunning this method is posted from Decoder thread, + // and by the time it arrives the player might be doing something else, e.g. + // seeking, in which case we should not request more data + switch (GetState()) { + case kPrefetching: + case kPrerolling: + case kRunning: + break; // continue + default: + return; // skip + } + // Ensure one data request at a time. if (!is_data_request_in_progress_) { is_data_request_in_progress_ = true;
diff --git a/media/base/android/media_source_player.cc b/media/base/android/media_source_player.cc index fd52bba..8aec0ab 100644 --- a/media/base/android/media_source_player.cc +++ b/media/base/android/media_source_player.cc
@@ -182,6 +182,8 @@ void MediaSourcePlayer::Release() { DVLOG(1) << __FUNCTION__; + media_stat_->StopAndReport(GetCurrentTime()); + audio_decoder_job_->ReleaseDecoderResources(); video_decoder_job_->ReleaseDecoderResources(); @@ -479,7 +481,8 @@ DVLOG(1) << __FUNCTION__ << " : decode error"; Release(); manager()->OnError(player_id(), MEDIA_ERROR_DECODE); - media_stat_->StopAndReport(GetCurrentTime()); + if (is_clock_manager) + media_stat_->StopAndReport(GetCurrentTime()); return; } @@ -499,7 +502,9 @@ // any other pending events only after handling EOS detection. if (IsEventPending(SEEK_EVENT_PENDING)) { ProcessPendingEvents(); - media_stat_->StopAndReport(GetCurrentTime()); + // In case of Seek GetCurrentTime() already tells the time to seek to. + if (is_clock_manager) + media_stat_->StopAndReport(current_presentation_timestamp); return; } @@ -521,7 +526,8 @@ } if (status == MEDIA_CODEC_OUTPUT_END_OF_STREAM) { - media_stat_->StopAndReport(GetCurrentTime()); + if (is_clock_manager) + media_stat_->StopAndReport(GetCurrentTime()); return; } @@ -529,7 +535,8 @@ if (is_clock_manager) interpolator_.StopInterpolating(); - media_stat_->StopAndReport(GetCurrentTime()); + if (is_clock_manager) + media_stat_->StopAndReport(GetCurrentTime()); return; } @@ -540,7 +547,8 @@ } else { is_waiting_for_key_ = true; manager()->OnWaitingForDecryptionKey(player_id()); - media_stat_->StopAndReport(GetCurrentTime()); + if (is_clock_manager) + media_stat_->StopAndReport(GetCurrentTime()); } return; } @@ -559,7 +567,8 @@ // in the middle of a seek or stop event and needs to wait for the IPCs to // come. if (status == MEDIA_CODEC_ABORT) { - media_stat_->StopAndReport(GetCurrentTime()); + if (is_clock_manager) + media_stat_->StopAndReport(GetCurrentTime()); return; }
diff --git a/media/base/android/media_statistics.cc b/media/base/android/media_statistics.cc index 19c0298e..d3d36bb 100644 --- a/media/base/android/media_statistics.cc +++ b/media/base/android/media_statistics.cc
@@ -53,6 +53,12 @@ if (start_time_ == kNoTimestamp()) return; // skip if there was no prior Start(). + if (current_playback_time == kNoTimestamp()) { + // Cancel the start event and skip if current time is unknown. + start_time_ = kNoTimestamp(); + return; + } + base::TimeDelta duration = current_playback_time - start_time_; // Reset start time.
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc index 286ed438..f58e4ab 100644 --- a/media/base/video_frame.cc +++ b/media/base/video_frame.cc
@@ -226,8 +226,8 @@ const gfx::Rect& visible_rect, const gfx::Size& natural_size, base::TimeDelta timestamp) { - if (format != PIXEL_FORMAT_ARGB && format != PIXEL_FORMAT_UYVY && - format != PIXEL_FORMAT_NV12) { + if (format != PIXEL_FORMAT_ARGB && format != PIXEL_FORMAT_XRGB && + format != PIXEL_FORMAT_UYVY && format != PIXEL_FORMAT_NV12) { DLOG(ERROR) << "Unsupported pixel format supported, got " << VideoPixelFormatToString(format); return nullptr; @@ -492,6 +492,9 @@ } #endif + if (frame->storage_type() == STORAGE_SHMEM) + wrapping_frame->AddSharedMemoryHandle(frame->shared_memory_handle_); + return wrapping_frame; }
diff --git a/media/blink/BUILD.gn b/media/blink/BUILD.gn index 54d5429..3b9365c 100644 --- a/media/blink/BUILD.gn +++ b/media/blink/BUILD.gn
@@ -48,6 +48,8 @@ "media_blink_export.h", "multibuffer.cc", "multibuffer.h", + "multibuffer_reader.cc", + "multibuffer_reader.h", "new_session_cdm_result_promise.cc", "new_session_cdm_result_promise.h", "texttrack_impl.cc", @@ -122,6 +124,7 @@ "mock_webframeclient.h", "mock_weburlloader.cc", "mock_weburlloader.h", + "multibuffer_unittest.cc", "run_all_unittests.cc", "test_random.h", "test_response_generator.cc",
diff --git a/media/blink/interval_map.h b/media/blink/interval_map.h index e11a03c..74cdca7 100644 --- a/media/blink/interval_map.h +++ b/media/blink/interval_map.h
@@ -124,8 +124,6 @@ // Needed to make the following construct work: // for (const auto& interval_value_pair : interval_map) - // Note however that this will skip the "end" interval, which - // is usually ok since it generally has the default value. std::pair<Interval<KeyType>, ValueType> operator*() const { return std::make_pair(interval(), value()); } @@ -182,8 +180,7 @@ // Increase [from..to) by |how_much|. void IncrementInterval(KeyType from, KeyType to, ValueType how_much) { - DCHECK_GT(to, from); - if (how_much == 0) + if (to <= from || how_much == 0) return; typename MapType::iterator a = MakeEntry(from); typename MapType::iterator b = MakeEntry(to); @@ -197,7 +194,8 @@ // Set [from..to) to |how_much|. void SetInterval(KeyType from, KeyType to, ValueType how_much) { - DCHECK_GT(to, from); + if (to <= from) + return; typename MapType::iterator a = MakeEntry(from); typename MapType::iterator b = MakeEntry(to); a->second = how_much;
diff --git a/media/blink/media_blink.gyp b/media/blink/media_blink.gyp index 17a577d..3b08ee7 100644 --- a/media/blink/media_blink.gyp +++ b/media/blink/media_blink.gyp
@@ -53,6 +53,8 @@ 'media_blink_export.h', 'multibuffer.cc', 'multibuffer.h', + 'multibuffer_reader.cc', + 'multibuffer_reader.h', 'new_session_cdm_result_promise.cc', 'new_session_cdm_result_promise.h', 'texttrack_impl.cc', @@ -128,6 +130,7 @@ 'mock_webframeclient.h', 'mock_weburlloader.cc', 'mock_weburlloader.h', + 'multibuffer_unittest.cc', 'run_all_unittests.cc', 'test_random.h', 'test_response_generator.cc',
diff --git a/media/blink/multibuffer_reader.cc b/media/blink/multibuffer_reader.cc new file mode 100644 index 0000000..8f98167 --- /dev/null +++ b/media/blink/multibuffer_reader.cc
@@ -0,0 +1,237 @@ +// Copyright 2015 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 "base/bind.h" +#include "base/callback_helpers.h" +#include "base/message_loop/message_loop.h" +#include "media/blink/multibuffer_reader.h" +#include "net/base/net_errors.h" + +namespace media { + +MultiBufferReader::MultiBufferReader( + MultiBuffer* multibuffer, + int64_t start, + int64_t end, + const base::Callback<void(int64_t, int64_t)>& progress_callback) + : multibuffer_(multibuffer), + // If end is -1, we use a very large (but still supported) value instead. + end_(end == -1LL ? (1LL << (multibuffer->block_size_shift() + 30)) : end), + preload_high_(0), + preload_low_(0), + max_buffer_forward_(0), + max_buffer_backward_(0), + pos_(start), + preload_pos_(-1), + loading_(true), + current_wait_size_(0), + progress_callback_(progress_callback), + weak_factory_(this) { + DCHECK_GE(start, 0); + DCHECK_GE(end_, 0); +} + +MultiBufferReader::~MultiBufferReader() { + multibuffer_->RemoveReader(preload_pos_, this); + multibuffer_->IncrementMaxSize( + -block_ceil(max_buffer_forward_ + max_buffer_backward_)); + multibuffer_->PinRange(block(pos_ - max_buffer_backward_), + block_ceil(pos_ + max_buffer_forward_), -1); + multibuffer_->CleanupWriters(preload_pos_); +} + +void MultiBufferReader::Seek(int64_t pos) { + DCHECK_GE(pos, 0); + if (pos == pos_) + return; + // Use a rangemap to compute the diff in pinning. + IntervalMap<MultiBuffer::BlockId, int32_t> tmp; + tmp.IncrementInterval(block(pos_ - max_buffer_backward_), + block_ceil(pos_ + max_buffer_forward_), -1); + tmp.IncrementInterval(block(pos - max_buffer_backward_), + block_ceil(pos + max_buffer_forward_), 1); + + multibuffer_->PinRanges(tmp); + + multibuffer_->RemoveReader(preload_pos_, this); + MultiBufferBlockId old_preload_pos = preload_pos_; + preload_pos_ = block(pos); + pos_ = pos; + UpdateInternalState(); + multibuffer_->CleanupWriters(old_preload_pos); +} + +void MultiBufferReader::SetMaxBuffer(int64_t backward, int64_t forward) { + // Safe, because we know this doesn't actually prune the cache right away. + multibuffer_->IncrementMaxSize( + -block_ceil(max_buffer_forward_ + max_buffer_backward_)); + // Use a rangemap to compute the diff in pinning. + IntervalMap<MultiBuffer::BlockId, int32_t> tmp; + tmp.IncrementInterval(block(pos_ - max_buffer_backward_), + block_ceil(pos_ + max_buffer_forward_), -1); + max_buffer_backward_ = backward; + max_buffer_forward_ = forward; + tmp.IncrementInterval(block(pos_ - max_buffer_backward_), + block_ceil(pos_ + max_buffer_forward_), 1); + multibuffer_->PinRanges(tmp); + + multibuffer_->IncrementMaxSize( + block_ceil(max_buffer_forward_ + max_buffer_backward_)); +} + +int64_t MultiBufferReader::Available() const { + int64_t unavailable_byte_pos = + static_cast<int64_t>(multibuffer_->FindNextUnavailable(block(pos_))) + << multibuffer_->block_size_shift(); + return std::max<int64_t>(0, unavailable_byte_pos - pos_); +} + +int64_t MultiBufferReader::TryRead(uint8_t* data, int64_t len) { + DCHECK_GT(len, 0); + current_wait_size_ = 0; + cb_.Reset(); + DCHECK_LE(pos_ + len, end_); + const MultiBuffer::DataMap& data_map = multibuffer_->map(); + MultiBuffer::DataMap::const_iterator i = data_map.find(block(pos_)); + int64_t p = pos_; + int64_t bytes_read = 0; + while (bytes_read < len) { + if (i == data_map.end()) + break; + if (i->first != block(p)) + break; + if (i->second->end_of_stream()) + break; + size_t offset = p & ((1LL << multibuffer_->block_size_shift()) - 1); + size_t tocopy = + std::min<size_t>(len - bytes_read, i->second->data_size() - offset); + memcpy(data, i->second->data() + offset, tocopy); + data += tocopy; + bytes_read += tocopy; + p += tocopy; + ++i; + } + Seek(p); + return bytes_read; +} + +int MultiBufferReader::Wait(int64_t len, const base::Closure& cb) { + DCHECK_LE(pos_ + len, end_); + DCHECK_NE(Available(), -1); + DCHECK_LE(len, max_buffer_forward_); + current_wait_size_ = len; + + cb_.Reset(); + UpdateInternalState(); + + if (Available() >= current_wait_size_) { + return net::OK; + } else { + cb_ = cb; + return net::ERR_IO_PENDING; + } +} + +void MultiBufferReader::SetPreload(int64_t preload_high, int64_t preload_low) { + DCHECK_GE(preload_high, preload_low); + multibuffer_->RemoveReader(preload_pos_, this); + preload_pos_ = block(pos_); + preload_high_ = preload_high; + preload_low_ = preload_low; + UpdateInternalState(); +} + +bool MultiBufferReader::IsLoading() const { + return loading_; +} + +void MultiBufferReader::CheckWait() { + if (!cb_.is_null() && + (Available() >= current_wait_size_ || Available() == -1)) { + // We redirect the call through a weak pointer to ourselves to guarantee + // there are no callbacks from us after we've been destroyed. + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&MultiBufferReader::Call, weak_factory_.GetWeakPtr(), + base::ResetAndReturn(&cb_))); + } +} + +void MultiBufferReader::Call(const base::Closure& cb) const { + cb.Run(); +} + +void MultiBufferReader::NotifyAvailableRange( + const Interval<MultiBufferBlockId>& range) { + // Update end_ if we can. + if (range.end > range.begin) { + auto i = multibuffer_->map().find(range.end - 1); + DCHECK(i != multibuffer_->map().end()); + if (i->second->end_of_stream()) { + // This is an upper limit because the last-to-one block is allowed + // to be smaller than the rest of the blocks. + int64_t size_upper_limit = static_cast<int64_t>(range.end) + << multibuffer_->block_size_shift(); + end_ = std::min(end_, size_upper_limit); + } + } + UpdateInternalState(); + if (!progress_callback_.is_null()) { + // We redirect the call through a weak pointer to ourselves to guarantee + // there are no callbacks from us after we've been destroyed. + base::MessageLoop::current()->PostTask( + FROM_HERE, + base::Bind(&MultiBufferReader::Call, weak_factory_.GetWeakPtr(), + base::Bind(progress_callback_, + static_cast<int64_t>(range.begin) + << multibuffer_->block_size_shift(), + static_cast<int64_t>(range.end) + << multibuffer_->block_size_shift()))); + // We may be destroyed, do not touch |this|. + } +} + +void MultiBufferReader::UpdateInternalState() { + int64_t effective_preload = loading_ ? preload_high_ : preload_low_; + + loading_ = false; + if (preload_pos_ == -1) { + preload_pos_ = block(pos_); + DCHECK_GE(preload_pos_, 0); + } + MultiBuffer::BlockId max_preload = block_ceil( + std::min(end_, pos_ + std::max(effective_preload, current_wait_size_))); + + // Note that we might not have been added to the multibuffer, + // removing ourselves is a no-op in that case. + multibuffer_->RemoveReader(preload_pos_, this); + + // We explicitly allow preloading to go beyond the pinned region in the cache. + // It only happens when we want to preload something into the disk cache. + // Thus it is possible to have blocks between our current reading position + // and preload_pos_ be unavailable. When we get a Seek() call (possibly + // through TryRead()) we reset the preload_pos_ to the current reading + // position, and preload_pos_ will become the first unavailable block after + // our current reading position again. + preload_pos_ = multibuffer_->FindNextUnavailable(preload_pos_); + DCHECK_GE(preload_pos_, 0); + + DVLOG(3) << "UpdateInternalState" + << " pp = " << preload_pos_ + << " block_ceil(end_) = " << block_ceil(end_) << " end_ = " << end_ + << " max_preload " << max_preload; + + if (preload_pos_ < block_ceil(end_)) { + if (preload_pos_ < max_preload) { + loading_ = true; + multibuffer_->AddReader(preload_pos_, this); + } else if (multibuffer_->Contains(preload_pos_ - 1)) { + --preload_pos_; + multibuffer_->AddReader(preload_pos_, this); + } + } + CheckWait(); +} + +} // namespace media
diff --git a/media/blink/multibuffer_reader.h b/media/blink/multibuffer_reader.h new file mode 100644 index 0000000..44f14f9 --- /dev/null +++ b/media/blink/multibuffer_reader.h
@@ -0,0 +1,158 @@ +// Copyright 2015 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. + +#ifndef MEDIA_BLINK_MULTIBUFFER_READER_H_ +#define MEDIA_BLINK_MULTIBUFFER_READER_H_ + +#include <stdint.h> + +#include <limits> +#include <map> +#include <set> + +#include "base/callback.h" +#include "base/memory/weak_ptr.h" +#include "media/blink/media_blink_export.h" +#include "media/blink/multibuffer.h" + +namespace media { + +// Wrapper for MultiBuffer that offers a simple byte-reading +// interface with prefetch. +class MEDIA_BLINK_EXPORT MultiBufferReader + : NON_EXPORTED_BASE(public MultiBuffer::Reader) { + public: + // Note that |progress_callback| is guaranteed to be called if + // a redirect happens and the url_data is updated. Otherwise + // origin checks will become insecure. + // Users probably want to call SetMaxBuffer & SetPreload after + // creating the a MultiBufferReader. + // The progress callback will be called when the "available range" + // changes. (The number of bytes available for reading before and + // after the current position.) The arguments for the progress + // callback is the first byte available (from beginning of file) + // and the last byte available + 1. Note that there may be other + // regions of available data in the cache as well. + // If |end| is not known, use -1. + MultiBufferReader( + MultiBuffer* multibuffer, + int64_t start, + int64_t end, + const base::Callback<void(int64_t, int64_t)>& progress_callback); + + ~MultiBufferReader() override; + + // Returns number of bytes available for reading. When the rest of the file + // is available, the number returned will be greater than the number + // or readable bytes. If an error occurs, -1 is returned. + int64_t Available() const; + + // Seek to a different position. + // If there is a pending Wait(), it will be cancelled. + void Seek(int64_t pos); + + // Returns the current position. + int64_t Tell() const { return pos_; } + + // Tries to read |len| bytes and advance position. + // Returns number of bytes read. + // If there is a pending Wait(), it will be cancelled. + int64_t TryRead(uint8_t* data, int64_t len); + + // Wait until |len| bytes are available for reading. + // Returns net::OK if |len| bytes are already available, otherwise it will + // return net::ERR_IO_PENDING and call |cb| at some point later. + // |len| must be smaller or equal to max_buffer_forward. + int Wait(int64_t len, const base::Closure& cb); + + // Set how much data we try to preload into the cache ahead of our current + // location. Normally, we preload until we have preload_high bytes, then + // stop until we fall below preload_low bytes. Note that preload can be + // set higher than max_buffer_forward, but the result is usually that + // some blocks will be freed between the current position and the preload + // position. + void SetPreload(int64_t preload_high, int64_t preload_low); + + // Change how much data we pin to the cache. + // The range [current_position - backward ... current_position + forward) + // will be locked in the cache. Calling Wait() or TryRead() with values + // larger than |forward| is not supported. + void SetMaxBuffer(int64_t backward, int64_t forward); + + // Returns true if we are currently loading data. + bool IsLoading() const; + + // Reader implementation. + void NotifyAvailableRange(const Interval<MultiBufferBlockId>& range) override; + + // Getters + int64_t preload_high() const { return preload_high_; } + int64_t preload_low() const { return preload_low_; } + + private: + // Returns the block for a particular byte position. + MultiBufferBlockId block(int64_t byte_pos) const { + return byte_pos >> multibuffer_->block_size_shift(); + } + + // Returns the block for a particular byte position, rounding up. + MultiBufferBlockId block_ceil(int64_t byte_pos) const { + return block(byte_pos + (1LL << multibuffer_->block_size_shift()) - 1); + } + + // Check if wait operation can complete now. + void CheckWait(); + + // Recalculate preload_pos_ and update our entry in the multibuffer + // reader index. Also call CheckWait(). This function is basically + // called anything changes, like when we get more data or seek to + // a new position. + void UpdateInternalState(); + + // Indirection function used to call callbacks. When we post a callback + // we indirect it through a weak_ptr and this function to make sure we + // don't call any callbacks after this object has been destroyed. + void Call(const base::Closure& cb) const; + + // The multibuffer we're wrapping, not owned. + MultiBuffer* multibuffer_; + + // We're not interested in reading past this position. + int64_t end_; + + // Defer reading once we have this much data. + int64_t preload_high_; + // Stop deferring once we have this much data. + int64_t preload_low_; + + // Pin this much data in the cache from the current position. + int64_t max_buffer_forward_; + int64_t max_buffer_backward_; + + // Current position in bytes. + int64_t pos_; + + // [block(pos_)..preload_pos_) are known to be in the cache. + // preload_pos_ is only allowed to point to a filled + // cache position if it is equal to end_ or pos_+preload_. + // This is a pointer to a slot in the cache, so the unit is + // blocks. + MultiBufferBlockId preload_pos_; + + // True if we've requested data from the cache by calling WaitFor(). + bool loading_; + + // When Available() > current_wait_size_ we call cb_. + int64_t current_wait_size_; + base::Closure cb_; + + // Progress callback. + base::Callback<void(int64_t, int64_t)> progress_callback_; + + base::WeakPtrFactory<MultiBufferReader> weak_factory_; +}; + +} // namespace media + +#endif // MEDIA_BLINK_MULTIBUFFER_READER_H_
diff --git a/media/blink/multibuffer_unittest.cc b/media/blink/multibuffer_unittest.cc new file mode 100644 index 0000000..96c8c07 --- /dev/null +++ b/media/blink/multibuffer_unittest.cc
@@ -0,0 +1,512 @@ +// Copyright 2015 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 <deque> +#include <string> +#include <vector> + +#include "base/bind.h" +#include "base/callback_helpers.h" +#include "base/message_loop/message_loop.h" +#include "media/blink/multibuffer.h" +#include "media/blink/multibuffer_reader.h" +#include "media/blink/test_random.h" +#include "testing/gtest/include/gtest/gtest.h" + +const int kBlockSizeShift = 8; +const size_t kBlockSize = 1UL << kBlockSizeShift; + +namespace media { +class TestMultiBufferDataProvider; + +std::vector<TestMultiBufferDataProvider*> writers; + +class TestMultiBufferDataProvider : public media::MultiBuffer::DataProvider { + public: + TestMultiBufferDataProvider(MultiBufferBlockId pos, + size_t file_size, + int max_blocks_after_defer, + bool must_read_whole_file, + media::TestRandom* rnd) + : pos_(pos), + blocks_until_deferred_(1 << 30), + max_blocks_after_defer_(max_blocks_after_defer), + file_size_(file_size), + must_read_whole_file_(must_read_whole_file), + rnd_(rnd) { + writers.push_back(this); + } + + ~TestMultiBufferDataProvider() override { + if (must_read_whole_file_) { + CHECK_GE(pos_ * kBlockSize, file_size_); + } + for (size_t i = 0; i < writers.size(); i++) { + if (writers[i] == this) { + writers[i] = writers.back(); + writers.pop_back(); + return; + } + } + LOG(FATAL) << "Couldn't find myself in writers!"; + } + + MultiBufferBlockId Tell() const override { return pos_; } + + bool Available() const override { return !fifo_.empty(); } + + scoped_refptr<DataBuffer> Read() override { + DCHECK(Available()); + scoped_refptr<DataBuffer> ret = fifo_.front(); + fifo_.pop_front(); + ++pos_; + return ret; + } + + void SetAvailableCallback(const base::Closure& cb) override { + DCHECK(!Available()); + cb_ = cb; + } + + void SetDeferred(bool deferred) override { + if (deferred) { + if (max_blocks_after_defer_ > 0) { + blocks_until_deferred_ = rnd_->Rand() % max_blocks_after_defer_; + } else if (max_blocks_after_defer_ < 0) { + blocks_until_deferred_ = -max_blocks_after_defer_; + } else { + blocks_until_deferred_ = 0; + } + } else { + blocks_until_deferred_ = 1 << 30; + } + } + + bool Advance() { + if (blocks_until_deferred_ == 0) + return false; + --blocks_until_deferred_; + + bool ret = true; + scoped_refptr<media::DataBuffer> block = new media::DataBuffer(kBlockSize); + size_t x = 0; + size_t byte_pos = (fifo_.size() + pos_) * kBlockSize; + for (x = 0; x < kBlockSize; x++, byte_pos++) { + if (byte_pos >= file_size_) + break; + block->writable_data()[x] = + static_cast<uint8_t>((byte_pos * 15485863) >> 16); + } + block->set_data_size(static_cast<int>(x)); + fifo_.push_back(block); + if (byte_pos == file_size_) { + fifo_.push_back(DataBuffer::CreateEOSBuffer()); + ret = false; + } + cb_.Run(); + return ret; + } + + private: + std::deque<scoped_refptr<media::DataBuffer>> fifo_; + MultiBufferBlockId pos_; + int32_t blocks_until_deferred_; + int32_t max_blocks_after_defer_; + size_t file_size_; + bool must_read_whole_file_; + base::Closure cb_; + media::TestRandom* rnd_; +}; + +class TestMultiBuffer : public media::MultiBuffer { + public: + explicit TestMultiBuffer( + int32_t shift, + const scoped_refptr<media::MultiBuffer::GlobalLRU>& lru, + media::TestRandom* rnd) + : media::MultiBuffer(shift, lru), + range_supported_(false), + create_ok_(true), + max_writers_(10000), + file_size_(1 << 30), + max_blocks_after_defer_(0), + must_read_whole_file_(false), + writers_created_(0), + rnd_(rnd) {} + + void SetMaxWriters(size_t max_writers) { max_writers_ = max_writers; } + + void CheckPresentState() { + IntervalMap<MultiBufferBlockId, int32_t> tmp; + for (DataMap::iterator i = data_.begin(); i != data_.end(); ++i) { + CHECK(i->second); // Null poineters are not allowed in data_ + CHECK_NE(!!pinned_[i->first], lru_->Contains(this, i->first)) + << " i->first = " << i->first; + tmp.IncrementInterval(i->first, i->first + 1, 1); + } + IntervalMap<MultiBufferBlockId, int32_t>::const_iterator tmp_iterator = + tmp.begin(); + IntervalMap<MultiBufferBlockId, int32_t>::const_iterator present_iterator = + present_.begin(); + while (tmp_iterator != tmp.end() && present_iterator != present_.end()) { + EXPECT_EQ(tmp_iterator.interval_begin(), + present_iterator.interval_begin()); + EXPECT_EQ(tmp_iterator.interval_end(), present_iterator.interval_end()); + EXPECT_EQ(tmp_iterator.value(), present_iterator.value()); + ++tmp_iterator; + ++present_iterator; + } + EXPECT_TRUE(tmp_iterator == tmp.end()); + EXPECT_TRUE(present_iterator == present_.end()); + } + + void CheckLRUState() { + for (DataMap::iterator i = data_.begin(); i != data_.end(); ++i) { + CHECK(i->second); // Null poineters are not allowed in data_ + CHECK_NE(!!pinned_[i->first], lru_->Contains(this, i->first)) + << " i->first = " << i->first; + CHECK_EQ(1, present_[i->first]) << " i->first = " << i->first; + } + } + + void SetFileSize(size_t file_size) { file_size_ = file_size; } + + void SetMaxBlocksAfterDefer(int32_t max_blocks_after_defer) { + max_blocks_after_defer_ = max_blocks_after_defer; + } + + void SetMustReadWholeFile(bool must_read_whole_file) { + must_read_whole_file_ = must_read_whole_file; + } + + int32_t writers_created() const { return writers_created_; } + + void SetRangeSupported(bool supported) { range_supported_ = supported; } + + protected: + DataProvider* CreateWriter(const MultiBufferBlockId& pos) override { + DCHECK(create_ok_); + writers_created_++; + CHECK_LT(writers.size(), max_writers_); + return new TestMultiBufferDataProvider( + pos, file_size_, max_blocks_after_defer_, must_read_whole_file_, rnd_); + } + void Prune(size_t max_to_free) override { + // Prune should not cause additional writers to be spawned. + create_ok_ = false; + MultiBuffer::Prune(max_to_free); + create_ok_ = true; + } + + bool RangeSupported() const override { return range_supported_; } + + private: + bool range_supported_; + bool create_ok_; + size_t max_writers_; + size_t file_size_; + int32_t max_blocks_after_defer_; + bool must_read_whole_file_; + int32_t writers_created_; + media::TestRandom* rnd_; +}; +} + +class MultiBufferTest : public testing::Test { + public: + MultiBufferTest() + : rnd_(42), + lru_(new media::MultiBuffer::GlobalLRU()), + multibuffer_(kBlockSizeShift, lru_, &rnd_) {} + + void Advance() { + CHECK(media::writers.size()); + media::writers[rnd_.Rand() % media::writers.size()]->Advance(); + } + + bool AdvanceAll() { + bool advanced = false; + for (size_t i = 0; i < media::writers.size(); i++) { + advanced |= media::writers[i]->Advance(); + } + multibuffer_.CheckLRUState(); + return advanced; + } + + protected: + media::TestRandom rnd_; + scoped_refptr<media::MultiBuffer::GlobalLRU> lru_; + media::TestMultiBuffer multibuffer_; + base::MessageLoop message_loop_; +}; + +TEST_F(MultiBufferTest, ReadAll) { + multibuffer_.SetMaxWriters(1); + size_t pos = 0; + size_t end = 10000; + multibuffer_.SetFileSize(10000); + multibuffer_.SetMustReadWholeFile(true); + media::MultiBufferReader reader(&multibuffer_, pos, end, + base::Callback<void(int64_t, int64_t)>()); + reader.SetMaxBuffer(2000, 5000); + reader.SetPreload(1000, 1000); + while (pos < end) { + unsigned char buffer[27]; + buffer[17] = 17; + size_t to_read = std::min<size_t>(end - pos, 17); + int64_t bytes_read = reader.TryRead(buffer, to_read); + if (bytes_read) { + EXPECT_EQ(buffer[17], 17); + for (int64_t i = 0; i < bytes_read; i++) { + uint8_t expected = static_cast<uint8_t>((pos * 15485863) >> 16); + EXPECT_EQ(expected, buffer[i]) << " pos = " << pos; + pos++; + } + } else { + Advance(); + } + } +} + +TEST_F(MultiBufferTest, ReadAllAdvanceFirst) { + multibuffer_.SetMaxWriters(1); + size_t pos = 0; + size_t end = 10000; + multibuffer_.SetFileSize(10000); + multibuffer_.SetMustReadWholeFile(true); + media::MultiBufferReader reader(&multibuffer_, pos, end, + base::Callback<void(int64_t, int64_t)>()); + reader.SetMaxBuffer(2000, 5000); + reader.SetPreload(1000, 1000); + while (pos < end) { + unsigned char buffer[27]; + buffer[17] = 17; + size_t to_read = std::min<size_t>(end - pos, 17); + while (AdvanceAll()) + ; + int64_t bytes = reader.TryRead(buffer, to_read); + EXPECT_GT(bytes, 0); + EXPECT_EQ(buffer[17], 17); + for (int64_t i = 0; i < bytes; i++) { + uint8_t expected = static_cast<uint8_t>((pos * 15485863) >> 16); + EXPECT_EQ(expected, buffer[i]) << " pos = " << pos; + pos++; + } + } +} + +// Checks that if the data provider provides too much data after we told it +// to defer, we kill it. +TEST_F(MultiBufferTest, ReadAllAdvanceFirst_NeverDefer) { + multibuffer_.SetMaxWriters(1); + size_t pos = 0; + size_t end = 10000; + multibuffer_.SetFileSize(10000); + multibuffer_.SetMaxBlocksAfterDefer(-10000); + multibuffer_.SetRangeSupported(true); + media::MultiBufferReader reader(&multibuffer_, pos, end, + base::Callback<void(int64_t, int64_t)>()); + reader.SetMaxBuffer(2000, 5000); + reader.SetPreload(1000, 1000); + while (pos < end) { + unsigned char buffer[27]; + buffer[17] = 17; + size_t to_read = std::min<size_t>(end - pos, 17); + while (AdvanceAll()) + ; + int64_t bytes = reader.TryRead(buffer, to_read); + EXPECT_GT(bytes, 0); + EXPECT_EQ(buffer[17], 17); + for (int64_t i = 0; i < bytes; i++) { + uint8_t expected = static_cast<uint8_t>((pos * 15485863) >> 16); + EXPECT_EQ(expected, buffer[i]) << " pos = " << pos; + pos++; + } + } + EXPECT_GT(multibuffer_.writers_created(), 1); +} + +// Same as ReadAllAdvanceFirst_NeverDefer, but the url doesn't support +// ranges, so we don't destroy it no matter how much data it provides. +TEST_F(MultiBufferTest, ReadAllAdvanceFirst_NeverDefer2) { + multibuffer_.SetMaxWriters(1); + size_t pos = 0; + size_t end = 10000; + multibuffer_.SetFileSize(10000); + multibuffer_.SetMustReadWholeFile(true); + multibuffer_.SetMaxBlocksAfterDefer(-10000); + media::MultiBufferReader reader(&multibuffer_, pos, end, + base::Callback<void(int64_t, int64_t)>()); + reader.SetMaxBuffer(2000, 5000); + reader.SetPreload(1000, 1000); + while (pos < end) { + unsigned char buffer[27]; + buffer[17] = 17; + size_t to_read = std::min<size_t>(end - pos, 17); + while (AdvanceAll()) + ; + int64_t bytes = reader.TryRead(buffer, to_read); + EXPECT_GT(bytes, 0); + EXPECT_EQ(buffer[17], 17); + for (int64_t i = 0; i < bytes; i++) { + uint8_t expected = static_cast<uint8_t>((pos * 15485863) >> 16); + EXPECT_EQ(expected, buffer[i]) << " pos = " << pos; + pos++; + } + } +} + +TEST_F(MultiBufferTest, LRUTest) { + int64_t max_size = 17; + int64_t current_size = 0; + lru_->IncrementMaxSize(max_size); + + multibuffer_.SetMaxWriters(1); + size_t pos = 0; + size_t end = 10000; + multibuffer_.SetFileSize(10000); + media::MultiBufferReader reader(&multibuffer_, pos, end, + base::Callback<void(int64_t, int64_t)>()); + reader.SetPreload(10000, 10000); + // Note, no pinning, all data should end up in LRU. + EXPECT_EQ(current_size, lru_->Size()); + current_size += max_size; + while (AdvanceAll()) + ; + EXPECT_EQ(current_size, lru_->Size()); + lru_->IncrementMaxSize(-max_size); + lru_->Prune(3); + current_size -= 3; + EXPECT_EQ(current_size, lru_->Size()); + lru_->Prune(3); + current_size -= 3; + EXPECT_EQ(current_size, lru_->Size()); + lru_->Prune(1000); + EXPECT_EQ(0, lru_->Size()); +} + +class ReadHelper { + public: + ReadHelper(size_t end, + size_t max_read_size, + media::MultiBuffer* multibuffer, + media::TestRandom* rnd) + : pos_(0), + end_(end), + max_read_size_(max_read_size), + read_size_(0), + rnd_(rnd), + reader_(multibuffer, + pos_, + end_, + base::Callback<void(int64_t, int64_t)>()) { + reader_.SetMaxBuffer(2000, 5000); + reader_.SetPreload(1000, 1000); + } + + bool Read() { + if (read_size_ == 0) + return true; + unsigned char buffer[4096]; + CHECK_LE(read_size_, static_cast<int64_t>(sizeof(buffer))); + CHECK_EQ(pos_, reader_.Tell()); + int64_t bytes_read = reader_.TryRead(buffer, read_size_); + if (bytes_read) { + for (int64_t i = 0; i < bytes_read; i++) { + unsigned char expected = (pos_ * 15485863) >> 16; + EXPECT_EQ(expected, buffer[i]) << " pos = " << pos_; + pos_++; + } + CHECK_EQ(pos_, reader_.Tell()); + return true; + } + return false; + } + + void StartRead() { + CHECK_EQ(pos_, reader_.Tell()); + read_size_ = std::min(1 + rnd_->Rand() % (max_read_size_ - 1), end_ - pos_); + if (!Read()) { + reader_.Wait(read_size_, + base::Bind(&ReadHelper::WaitCB, base::Unretained(this))); + } + } + + void WaitCB() { CHECK(Read()); } + + void Seek() { + pos_ = rnd_->Rand() % end_; + reader_.Seek(pos_); + CHECK_EQ(pos_, reader_.Tell()); + } + + private: + int64_t pos_; + int64_t end_; + int64_t max_read_size_; + int64_t read_size_; + media::TestRandom* rnd_; + media::MultiBufferReader reader_; +}; + +TEST_F(MultiBufferTest, RandomTest) { + size_t file_size = 1000000; + multibuffer_.SetFileSize(file_size); + multibuffer_.SetMaxBlocksAfterDefer(10); + std::vector<ReadHelper*> read_helpers; + for (size_t i = 0; i < 20; i++) { + read_helpers.push_back( + new ReadHelper(file_size, 1000, &multibuffer_, &rnd_)); + } + for (int i = 0; i < 100; i++) { + for (int j = 0; j < 100; j++) { + if (rnd_.Rand() & 1) { + if (!media::writers.empty()) + Advance(); + } else { + size_t j = rnd_.Rand() % read_helpers.size(); + if (rnd_.Rand() % 100 < 3) + read_helpers[j]->Seek(); + read_helpers[j]->StartRead(); + } + } + multibuffer_.CheckLRUState(); + } + multibuffer_.CheckPresentState(); + while (!read_helpers.empty()) { + delete read_helpers.back(); + read_helpers.pop_back(); + } +} + +TEST_F(MultiBufferTest, RandomTest_RangeSupported) { + size_t file_size = 1000000; + multibuffer_.SetFileSize(file_size); + multibuffer_.SetMaxBlocksAfterDefer(10); + std::vector<ReadHelper*> read_helpers; + multibuffer_.SetRangeSupported(true); + for (size_t i = 0; i < 20; i++) { + read_helpers.push_back( + new ReadHelper(file_size, 1000, &multibuffer_, &rnd_)); + } + for (int i = 0; i < 100; i++) { + for (int j = 0; j < 100; j++) { + if (rnd_.Rand() & 1) { + if (!media::writers.empty()) + Advance(); + } else { + size_t j = rnd_.Rand() % read_helpers.size(); + if (rnd_.Rand() % 100 < 3) + read_helpers[j]->Seek(); + read_helpers[j]->StartRead(); + } + } + multibuffer_.CheckLRUState(); + } + multibuffer_.CheckPresentState(); + while (!read_helpers.empty()) { + delete read_helpers.back(); + read_helpers.pop_back(); + } +}
diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc index b791be7..b7229f0 100644 --- a/media/filters/gpu_video_decoder.cc +++ b/media/filters/gpu_video_decoder.cc
@@ -121,10 +121,9 @@ return kDecoderName; } -// TODO(xhwang): Support CDM setting using |set_cdm_ready_cb|. void GpuVideoDecoder::Initialize(const VideoDecoderConfig& config, bool /* low_delay */, - const SetCdmReadyCB& /* set_cdm_ready_cb */, + const SetCdmReadyCB& set_cdm_ready_cb, const InitCB& init_cb, const OutputCB& output_cb) { DVLOG(3) << "Initialize()"; @@ -156,6 +155,8 @@ } if (!IsProfileSupported(config.profile(), config.coded_size())) { + DVLOG(1) << "Profile " << config.profile() << " or coded size " + << config.coded_size().ToString() << " not supported."; bound_init_cb.Run(false); return; } @@ -174,14 +175,52 @@ vda_ = factories_->CreateVideoDecodeAccelerator().Pass(); if (!vda_ || !vda_->Initialize(config.profile(), this)) { + DVLOG(1) << "VDA initialization failed."; bound_init_cb.Run(false); return; } + if (config.is_encrypted()) { + init_cb_ = bound_init_cb; + set_cdm_ready_cb_ = set_cdm_ready_cb; + set_cdm_ready_cb_.Run(BindToCurrentLoop( + base::Bind(&GpuVideoDecoder::SetCdm, weak_factory_.GetWeakPtr()))); + return; + } + DVLOG(3) << "GpuVideoDecoder::Initialize() succeeded."; bound_init_cb.Run(true); } +void GpuVideoDecoder::SetCdm(CdmContext* cdm_context, + const CdmAttachedCB& cdm_attached_cb) { + DVLOG(2) << __FUNCTION__; + DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); + + DCHECK(!init_cb_.is_null()); + DCHECK(!set_cdm_ready_cb_.is_null()); + set_cdm_ready_cb_.Reset(); + + if (!cdm_context || cdm_context->GetCdmId() == CdmContext::kInvalidCdmId) { + DVLOG(1) << "CDM ID not available."; + cdm_attached_cb.Run(false); + base::ResetAndReturn(&init_cb_).Run(false); + return; + } + + cdm_attached_cb_ = cdm_attached_cb; + vda_->SetCdm(cdm_context->GetCdmId()); +} + +void GpuVideoDecoder::NotifyCdmAttached(bool success) { + DVLOG_IF(2, !success) << __FUNCTION__ << ": CDM not attached."; + DCHECK(!init_cb_.is_null()); + DCHECK(!cdm_attached_cb_.is_null()); + + base::ResetAndReturn(&cdm_attached_cb_).Run(success); + base::ResetAndReturn(&init_cb_).Run(success); +} + void GpuVideoDecoder::DestroyPictureBuffers(PictureBufferMap* buffers) { DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); for (PictureBufferMap::iterator it = buffers->begin(); it != buffers->end(); @@ -545,6 +584,13 @@ DestroyVDA(); DCHECK(assigned_picture_buffers_.empty()); + if (!set_cdm_ready_cb_.is_null()) + base::ResetAndReturn(&set_cdm_ready_cb_).Run(CdmReadyCB()); + if (!cdm_attached_cb_.is_null()) + base::ResetAndReturn(&cdm_attached_cb_).Run(false); + if (!init_cb_.is_null()) + base::ResetAndReturn(&init_cb_).Run(false); + for (size_t i = 0; i < available_shm_segments_.size(); ++i) { delete available_shm_segments_[i]; }
diff --git a/media/filters/gpu_video_decoder.h b/media/filters/gpu_video_decoder.h index 271d2fb..065ac38d 100644 --- a/media/filters/gpu_video_decoder.h +++ b/media/filters/gpu_video_decoder.h
@@ -58,6 +58,7 @@ int GetMaxDecodeRequests() const override; // VideoDecodeAccelerator::Client implementation. + void NotifyCdmAttached(bool success) override; void ProvidePictureBuffers(uint32 count, const gfx::Size& size, uint32 texture_target) override; @@ -102,6 +103,10 @@ typedef std::map<int32, PictureBuffer> PictureBufferMap; + // Callback to set CDM. |cdm_attached_cb| is called when the decryptor in the + // CDM has been completely attached to the pipeline. + void SetCdm(CdmContext* cdm_context, const CdmAttachedCB& cdm_attached_cb); + void DeliverFrame(const scoped_refptr<VideoFrame>& frame); // Static method is to allow it to run even after GVD is deleted. @@ -145,6 +150,7 @@ // occurs. scoped_ptr<VideoDecodeAccelerator> vda_; + InitCB init_cb_; OutputCB output_cb_; DecodeCB eos_decode_cb_; @@ -156,6 +162,10 @@ VideoDecoderConfig config_; + // Callback to request/cancel CDM ready notification. + SetCdmReadyCB set_cdm_ready_cb_; + CdmAttachedCB cdm_attached_cb_; + // Shared-memory buffer pool. Since allocating SHM segments requires a // round-trip to the browser process, we keep allocation out of the // steady-state of the decoder.
diff --git a/media/filters/opus_audio_decoder.cc b/media/filters/opus_audio_decoder.cc index d1e759bf..01539ab 100644 --- a/media/filters/opus_audio_decoder.cc +++ b/media/filters/opus_audio_decoder.cc
@@ -317,15 +317,12 @@ scoped_refptr<AudioBuffer>* output_buffer) { // Allocate a buffer for the output samples. *output_buffer = AudioBuffer::CreateBuffer( - config_.sample_format(), - config_.channel_layout(), + kSampleFormatF32, config_.channel_layout(), ChannelLayoutToChannelCount(config_.channel_layout()), - config_.samples_per_second(), - kMaxOpusOutputPacketSizeSamples); - const int buffer_size = - output_buffer->get()->channel_count() * - output_buffer->get()->frame_count() * - SampleFormatToBytesPerChannel(config_.sample_format()); + config_.samples_per_second(), kMaxOpusOutputPacketSizeSamples); + const int buffer_size = output_buffer->get()->channel_count() * + output_buffer->get()->frame_count() * + SampleFormatToBytesPerChannel(kSampleFormatF32); float* float_output_buffer = reinterpret_cast<float*>( output_buffer->get()->channel_data()[0]);
diff --git a/media/mojo/services/mojo_cdm_service.cc b/media/mojo/services/mojo_cdm_service.cc index 4a16387..3eea807 100644 --- a/media/mojo/services/mojo_cdm_service.cc +++ b/media/mojo/services/mojo_cdm_service.cc
@@ -4,7 +4,11 @@ #include "media/mojo/services/mojo_cdm_service.h" +#include <map> + #include "base/bind.h" +#include "base/lazy_instance.h" +#include "base/synchronization/lock.h" #include "media/base/cdm_config.h" #include "media/base/cdm_context.h" #include "media/base/cdm_factory.h" @@ -18,12 +22,60 @@ namespace media { +namespace { + +// Manages all CDMs created by MojoCdmService. Can only have one instance per +// process so use a LazyInstance to ensure this. +class CdmManager { + public: + CdmManager() {} + ~CdmManager() {} + + // Returns the CDM associated with |cdm_id|. Can be called on any thread. + scoped_refptr<MediaKeys> GetCdm(int cdm_id) { + base::AutoLock lock(lock_); + auto iter = cdm_map_.find(cdm_id); + return iter == cdm_map_.end() ? nullptr : iter->second; + } + + // Registers the |cdm| for |cdm_id|. + void RegisterCdm(int cdm_id, const scoped_refptr<MediaKeys>& cdm) { + base::AutoLock lock(lock_); + DCHECK(!cdm_map_.count(cdm_id)); + cdm_map_[cdm_id] = cdm; + } + + // Unregisters the CDM associated with |cdm_id|. + void UnregisterCdm(int cdm_id) { + base::AutoLock lock(lock_); + DCHECK(cdm_map_.count(cdm_id)); + cdm_map_.erase(cdm_id); + } + + private: + // Lock to protect |cdm_map_|. + base::Lock lock_; + std::map<int, scoped_refptr<MediaKeys>> cdm_map_; + + DISALLOW_COPY_AND_ASSIGN(CdmManager); +}; + +base::LazyInstance<CdmManager>::Leaky g_cdm_manager = LAZY_INSTANCE_INITIALIZER; + +} // namespace + using SimpleMojoCdmPromise = MojoCdmPromise<>; using CdmIdMojoCdmPromise = MojoCdmPromise<int>; using NewSessionMojoCdmPromise = MojoCdmPromise<std::string>; int MojoCdmService::next_cdm_id_ = CdmContext::kInvalidCdmId + 1; +// static +scoped_refptr<MediaKeys> MojoCdmService::GetCdm(int cdm_id) { + DVLOG(1) << __FUNCTION__ << ": " << cdm_id; + return g_cdm_manager.Get().GetCdm(cdm_id); +} + MojoCdmService::MojoCdmService( base::WeakPtr<MojoCdmServiceContext> context, mojo::ServiceProvider* service_provider, @@ -40,6 +92,8 @@ } MojoCdmService::~MojoCdmService() { + g_cdm_manager.Get().UnregisterCdm(cdm_id_); + if (cdm_id_ != CdmContext::kInvalidCdmId && context_) context_->UnregisterCdm(cdm_id_); } @@ -151,7 +205,11 @@ cdm_ = cdm; cdm_id_ = next_cdm_id_++; + context_->RegisterCdm(cdm_id_, this); + g_cdm_manager.Get().RegisterCdm(cdm_id_, cdm); + + DVLOG(1) << __FUNCTION__ << ": CDM successfully created with ID " << cdm_id_; promise->resolve(cdm_id_); }
diff --git a/media/mojo/services/mojo_cdm_service.h b/media/mojo/services/mojo_cdm_service.h index c669a74b..7df3df6 100644 --- a/media/mojo/services/mojo_cdm_service.h +++ b/media/mojo/services/mojo_cdm_service.h
@@ -25,6 +25,16 @@ // media::MediaKeys. class MojoCdmService : public interfaces::ContentDecryptionModule { public: + // Get the CDM associated with |cdm_id|, which is unique per process. + // Can be called on any thread. The returned CDM is not guaranteed to be + // thread safe. + // Note: This provides a generic hack to get the CDM in the process where + // MojoMediaApplication is running, regardless of which render process or + // render frame the caller is associated with. In the future, we should move + // all out-of-process media players into the MojoMediaApplicaiton so that we + // can use MojoCdmServiceContext (per render frame) to get the CDM. + static scoped_refptr<MediaKeys> GetCdm(int cdm_id); + // Constructs a MojoCdmService and strongly binds it to the |request|. MojoCdmService( base::WeakPtr<MojoCdmServiceContext> context,
diff --git a/mojo/runner/desktop/launcher_process.cc b/mojo/runner/desktop/launcher_process.cc index 4fa6956..b55953c 100644 --- a/mojo/runner/desktop/launcher_process.cc +++ b/mojo/runner/desktop/launcher_process.cc
@@ -15,6 +15,7 @@ #include "base/message_loop/message_loop.h" #include "base/path_service.h" #include "base/synchronization/waitable_event.h" +#include "base/threading/platform_thread.h" #include "mojo/runner/context.h" #include "mojo/runner/switches.h" #include "mojo/shell/switches.h" @@ -31,6 +32,8 @@ // http://crbug.com/546644 command_line->AppendSwitch(switches::kMojoNoSandbox); + base::PlatformThread::SetName("mojo_runner"); + // We want the shell::Context to outlive the MessageLoop so that pipes are // all gracefully closed / error-out before we try to shut the Context down. Context shell_context;
diff --git a/mojo/services/network/BUILD.gn b/mojo/services/network/BUILD.gn index 6b20a9b..76d6bdc 100644 --- a/mojo/services/network/BUILD.gn +++ b/mojo/services/network/BUILD.gn
@@ -100,6 +100,7 @@ "//mojo/public/cpp/system:system", "//mojo/services/network/public/cpp", "//mojo/services/network/public/interfaces", + "//mojo/services/tracing/public/cpp", "//net", "//net:extras", "//net:http_server",
diff --git a/mojo/services/network/network_service_delegate.cc b/mojo/services/network/network_service_delegate.cc index 14e642b5..0a439642 100644 --- a/mojo/services/network/network_service_delegate.cc +++ b/mojo/services/network/network_service_delegate.cc
@@ -129,6 +129,7 @@ worker_thread = io_worker_thread_->task_runner(); #endif context_.reset(new NetworkContext(base_path, worker_thread, this)); + tracing_.Initialize(app); } bool NetworkServiceDelegate::ConfigureIncomingConnection(
diff --git a/mojo/services/network/network_service_delegate.h b/mojo/services/network/network_service_delegate.h index 216f961..16b2f96 100644 --- a/mojo/services/network/network_service_delegate.h +++ b/mojo/services/network/network_service_delegate.h
@@ -16,6 +16,7 @@ #include "mojo/services/network/public/interfaces/network_service.mojom.h" #include "mojo/services/network/public/interfaces/url_loader_factory.mojom.h" #include "mojo/services/network/public/interfaces/web_socket_factory.mojom.h" +#include "mojo/services/tracing/public/cpp/tracing_impl.h" namespace sql { class ScopedMojoFilesystemVFS; @@ -69,6 +70,7 @@ private: ApplicationImpl* app_; + mojo::TracingImpl tracing_; // Observers that want notifications that our worker thread is going away. base::ObserverList<NetworkServiceDelegateObserver> observers_;
diff --git a/mojo/services/tracing/public/cpp/tracing_impl.cc b/mojo/services/tracing/public/cpp/tracing_impl.cc index 788cd31..1cffe03 100644 --- a/mojo/services/tracing/public/cpp/tracing_impl.cc +++ b/mojo/services/tracing/public/cpp/tracing_impl.cc
@@ -4,6 +4,9 @@ #include "mojo/services/tracing/public/cpp/tracing_impl.h" +#include "base/lazy_instance.h" +#include "base/synchronization/lock.h" +#include "base/threading/platform_thread.h" #include "base/trace_event/trace_event_impl.h" #include "mojo/application/public/cpp/application_impl.h" @@ -13,6 +16,22 @@ #endif namespace mojo { +namespace { + +// Controls access to |g_tracing_singleton_created|, which can be accessed from +// different threads. +base::LazyInstance<base::Lock>::Leaky g_singleton_lock = + LAZY_INSTANCE_INITIALIZER; + +// Whether we are the first TracingImpl to be created in this mojo +// application. The first TracingImpl in a physical mojo application connects +// to the mojo:tracing service. +// +// If this is a ContentHandler, it will outlive all its served Applications. If +// this is a raw mojo application, it is the only Application served. +bool g_tracing_singleton_created = false; + +} TracingImpl::TracingImpl() { } @@ -21,6 +40,17 @@ } void TracingImpl::Initialize(ApplicationImpl* app) { + { + base::AutoLock lock(g_singleton_lock.Get()); + if (g_tracing_singleton_created) + return; + g_tracing_singleton_created = true; + } + + // This will only set the name for the first app in a loaded mojo file. It's + // up to something like CoreServices to name its own child threads. + base::PlatformThread::SetName(app->url()); + mojo::URLRequestPtr request(mojo::URLRequest::New()); request->url = mojo::String::From("mojo:tracing"); connection_ = app->ConnectToApplication(request.Pass());
diff --git a/mojo/services/tracing/public/cpp/tracing_impl.h b/mojo/services/tracing/public/cpp/tracing_impl.h index 648023f8..b832ef49 100644 --- a/mojo/services/tracing/public/cpp/tracing_impl.h +++ b/mojo/services/tracing/public/cpp/tracing_impl.h
@@ -15,6 +15,16 @@ class ApplicationConnection; class ApplicationImpl; +// Connects to mojo:tracing during your Application's Initialize() call once +// per process. +// +// We need to deal with multiple ways of packaging mojo applications +// together. We'll need to deal with packages that use the mojo.ContentHandler +// interface to bundle several Applciations into a single physical on disk +// mojo binary, and with those same services each in their own mojo binary. +// +// Have your bundle ContentHandler own a TracingImpl, and each Application own +// a TracingImpl. In bundles, the second TracingImpl will be a no-op. class TracingImpl : public InterfaceFactory<tracing::TraceProvider> { public: TracingImpl();
diff --git a/net/http/transport_security_state_static.h b/net/http/transport_security_state_static.h index 00ace15..16b27d5 100644 --- a/net/http/transport_security_state_static.h +++ b/net/http/transport_security_state_static.h
@@ -726,10 +726,10 @@ // it's a pointer to the n'th element of the array. static const uint8 kHSTSHuffmanTree[] = { 0xf0, 0xe4, 0x00, 0xf2, 0x01, 0x80, 0xe6, 0xae, 0x03, 0xed, 0xe9, 0x04, - 0xb2, 0xf1, 0xb9, 0xb5, 0xb8, 0x07, 0xb4, 0x08, 0x06, 0x09, 0xb0, 0xb1, - 0xb6, 0xb7, 0x0c, 0xb3, 0x0b, 0x0d, 0x0e, 0xea, 0x0a, 0x0f, 0x10, 0xf7, + 0xb2, 0xf1, 0xb9, 0xb5, 0xb8, 0x07, 0xb4, 0x08, 0x06, 0x09, 0xb7, 0xb6, + 0xb0, 0x0b, 0xb1, 0xb3, 0x0c, 0x0d, 0x0e, 0xea, 0x0a, 0x0f, 0x10, 0xf7, 0x11, 0xe7, 0x12, 0xef, 0x05, 0x13, 0x02, 0x14, 0xeb, 0xe2, 0xe3, 0x16, - 0xe1, 0x17, 0x18, 0xff, 0xfa, 0xf8, 0xf6, 0x1a, 0x1b, 0xe8, 0xf3, 0x1c, + 0xe1, 0x17, 0x18, 0xff, 0xfa, 0xf8, 0x1a, 0xf6, 0x1b, 0xe8, 0xf3, 0x1c, 0xe5, 0x1d, 0xec, 0xee, 0xad, 0xf9, 0x20, 0xf5, 0xf4, 0x21, 0x1f, 0x22, 0x1e, 0x23, 0x19, 0x24, 0x15, 0x25, }; @@ -743,3065 +743,3193 @@ 0x1b, 0x12, 0x9a, 0x2b, 0x77, 0x34, 0x75, 0x70, 0xf1, 0x74, 0x5f, 0x7f, 0xfe, 0xfd, 0xfb, 0x83, 0xce, 0x66, 0xf2, 0xf2, 0x2c, 0xeb, 0xd8, 0xd8, 0x3a, 0xff, 0xf4, 0xa3, 0x07, 0xdf, 0xb8, 0x75, 0x0a, 0x1d, 0x7f, 0x04, - 0x61, 0xab, 0xfc, 0xeb, 0xfa, 0x37, 0x0f, 0x1e, 0x47, 0x5f, 0xf3, 0x22, - 0x9a, 0x41, 0xde, 0x47, 0x5e, 0x0a, 0x4e, 0x75, 0x21, 0xea, 0x39, 0xc5, - 0xff, 0xcd, 0xe4, 0x29, 0x03, 0xe6, 0x19, 0x86, 0x62, 0x4e, 0xbf, 0xc9, - 0xd1, 0xfd, 0xd4, 0x69, 0xd5, 0x08, 0x86, 0xc5, 0x3b, 0xff, 0x84, 0x63, - 0x7f, 0xb9, 0xcd, 0x63, 0x27, 0x5f, 0xe6, 0xa6, 0xb9, 0xc8, 0x91, 0xd4, - 0x87, 0xef, 0xd4, 0x5b, 0xb3, 0x72, 0xad, 0x05, 0x58, 0x1c, 0x34, 0xa0, - 0x16, 0xbf, 0xde, 0xce, 0x01, 0x69, 0xa2, 0x95, 0x34, 0xf7, 0xf4, 0xba, - 0x9b, 0x32, 0x63, 0xaa, 0x0f, 0xc9, 0xd0, 0xef, 0xee, 0xa3, 0x61, 0x68, - 0x75, 0xfe, 0x80, 0x4e, 0xf2, 0x86, 0x33, 0xac, 0x30, 0x7c, 0x02, 0x57, - 0x65, 0x58, 0x95, 0xe2, 0x36, 0x1c, 0x2f, 0x10, 0x98, 0x9c, 0xbb, 0x21, - 0xf8, 0xa1, 0x13, 0x55, 0x77, 0x1a, 0x44, 0x99, 0x8b, 0x7b, 0x08, 0x11, - 0x85, 0x36, 0xa1, 0x31, 0xb7, 0x0d, 0xff, 0xb0, 0x80, 0xbf, 0xff, 0xf9, - 0xd6, 0xaa, 0x73, 0x9f, 0xf3, 0x90, 0x38, 0xa2, 0x77, 0xb9, 0xf4, 0xeb, - 0xff, 0xcc, 0x32, 0x8c, 0xb1, 0xce, 0x16, 0x17, 0xcf, 0x9d, 0xdb, 0x3a, - 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x51, 0x5f, 0xa3, 0xb9, 0xcc, 0x3a, 0xff, - 0xfc, 0x09, 0x4e, 0xc3, 0x43, 0x17, 0x3b, 0x79, 0xf3, 0xe7, 0x76, 0xce, - 0xbf, 0xff, 0x3c, 0x86, 0x35, 0x9b, 0xb4, 0x5f, 0x37, 0x69, 0xd6, 0x56, - 0x49, 0xbb, 0xe3, 0x13, 0x4c, 0xfa, 0x4b, 0xb1, 0xaa, 0xff, 0xc1, 0xc5, - 0xab, 0xb7, 0x82, 0x9e, 0x3a, 0xf6, 0x33, 0x87, 0x5f, 0xec, 0xc9, 0xc3, - 0x18, 0x13, 0xaf, 0x76, 0x02, 0x75, 0xfe, 0x88, 0x41, 0x1f, 0xd8, 0xce, - 0xb9, 0xff, 0x3a, 0xfb, 0xa9, 0xd5, 0x58, 0x08, 0xb0, 0x50, 0x6e, 0x63, - 0x1e, 0x8d, 0xb2, 0x67, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0xaf, 0x6f, 0xc9, - 0xb4, 0xdf, 0xe7, 0x3a, 0xe8, 0x91, 0xd7, 0x40, 0x0e, 0xb2, 0xb8, 0x88, - 0x9e, 0x19, 0xb9, 0x60, 0x05, 0x6f, 0xfe, 0x55, 0xe4, 0xae, 0x71, 0xae, - 0xed, 0x34, 0x48, 0xd7, 0xff, 0x95, 0x5b, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, - 0x68, 0x9e, 0x2f, 0xff, 0x2a, 0xb7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, - 0x3f, 0xdf, 0xfe, 0x55, 0x6f, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x86, - 0xbf, 0xf9, 0x6f, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x88, 0xbf, 0xf4, - 0x95, 0xff, 0x5f, 0x23, 0x51, 0x23, 0xa9, 0x54, 0x49, 0x42, 0x85, 0xff, - 0xa6, 0x4e, 0xef, 0x9e, 0x0e, 0x2c, 0xeb, 0xff, 0x0b, 0xab, 0xe1, 0xfd, - 0xe5, 0xa3, 0xaf, 0xdc, 0x6b, 0xbb, 0x4d, 0x14, 0x8d, 0xff, 0xdd, 0xd8, - 0xfc, 0xd3, 0xf7, 0x51, 0x39, 0xd7, 0xff, 0x3e, 0xfa, 0xeb, 0x30, 0x0f, - 0x9f, 0x56, 0x75, 0xff, 0x44, 0xa3, 0x93, 0xc7, 0x27, 0x3a, 0xf3, 0xc9, - 0x5c, 0x47, 0xe3, 0x99, 0x81, 0x18, 0x52, 0xaf, 0xe9, 0x67, 0x7a, 0xf2, - 0x3a, 0xff, 0xfe, 0xc0, 0xf6, 0x3e, 0xab, 0xe1, 0x70, 0x6b, 0x50, 0x02, - 0xac, 0xac, 0x2a, 0x4d, 0x69, 0xfa, 0xe3, 0x3a, 0xf2, 0x66, 0xd9, 0x65, - 0xf3, 0x5d, 0xda, 0x68, 0x94, 0x2f, 0xfd, 0x00, 0x5b, 0xcb, 0xb0, 0xfc, - 0x3a, 0xb8, 0x7d, 0x22, 0x5b, 0x7f, 0xf8, 0x5f, 0xda, 0xfa, 0x3f, 0xc8, - 0x71, 0x67, 0x5f, 0x2a, 0xf2, 0x57, 0x0f, 0xad, 0x64, 0x35, 0x3b, 0x63, - 0x1d, 0x29, 0xe6, 0x20, 0xc6, 0x12, 0xd8, 0xfa, 0xd1, 0x4d, 0x8e, 0x1e, - 0x1c, 0x87, 0x92, 0xd0, 0xba, 0xa2, 0x05, 0x76, 0x0a, 0xbe, 0xa1, 0xd3, - 0xfc, 0xa7, 0x0d, 0xa8, 0xcb, 0xef, 0xff, 0x2a, 0xb7, 0x92, 0xb9, 0xc6, - 0xbb, 0xb4, 0xd1, 0x39, 0xdf, 0xfe, 0x55, 0x6f, 0x25, 0x73, 0x8d, 0x77, - 0x69, 0xa2, 0x89, 0xbf, 0xef, 0xdf, 0x92, 0x62, 0x9b, 0x00, 0x87, 0x5f, - 0xc9, 0xa9, 0xa4, 0x80, 0x3a, 0xff, 0x44, 0xff, 0x76, 0xdc, 0x40, 0x75, - 0xee, 0x49, 0x50, 0xa2, 0x97, 0xa8, 0x3f, 0x4b, 0x6b, 0x89, 0xcc, 0x69, - 0x5f, 0xf8, 0x7e, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x21, 0xcb, 0xfb, 0xf6, - 0xf1, 0x20, 0x4e, 0xb2, 0xb8, 0x7b, 0xfd, 0x33, 0xbf, 0xe8, 0xe6, 0x37, - 0xb1, 0xbc, 0x8e, 0xbe, 0x6b, 0xbb, 0x4d, 0x11, 0x7d, 0xf8, 0x5c, 0x0f, - 0xa3, 0xaf, 0xd9, 0x34, 0x9f, 0x47, 0x57, 0x0f, 0xe7, 0xc5, 0xbf, 0x49, - 0x6f, 0xf6, 0xb0, 0x3d, 0xc0, 0x39, 0xd7, 0x0c, 0xe7, 0x5f, 0xf7, 0x86, - 0x17, 0xf4, 0x3d, 0x83, 0xaa, 0x0f, 0x3d, 0x05, 0xae, 0xd6, 0xe7, 0x5f, - 0x7a, 0x50, 0xa1, 0x54, 0xb3, 0x72, 0xe2, 0xf7, 0xe7, 0x9f, 0xd9, 0xd3, - 0xac, 0xac, 0xea, 0x80, 0xb2, 0x16, 0x33, 0x18, 0xf6, 0x10, 0x02, 0xb3, - 0xb6, 0x41, 0x7f, 0xff, 0xfc, 0x2e, 0xae, 0x7e, 0xc1, 0x45, 0x13, 0xdd, - 0xc4, 0x96, 0xbe, 0x62, 0x91, 0x23, 0xaf, 0xd9, 0xa5, 0x86, 0x0e, 0xbf, - 0xf3, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x99, 0x2c, 0xab, 0x51, 0xe7, - 0xc8, 0x41, 0xac, 0x9a, 0xf7, 0xb1, 0x67, 0x5d, 0xd5, 0x9d, 0x7e, 0xe3, - 0x5d, 0xda, 0x68, 0xb7, 0xac, 0xac, 0x1f, 0x20, 0x46, 0xf0, 0x5a, 0xff, - 0xf2, 0xab, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x14, 0x9d, 0xcc, 0x43, - 0x16, 0x75, 0xfd, 0x9e, 0x18, 0x85, 0x9d, 0x7f, 0x6e, 0x0f, 0xbc, 0x70, - 0x1d, 0x77, 0x55, 0x60, 0x1f, 0xd7, 0x48, 0x1c, 0xaa, 0xa1, 0x75, 0xba, - 0x52, 0x8a, 0xb2, 0x36, 0x0d, 0x42, 0x83, 0x61, 0xa7, 0xd8, 0x68, 0xdf, - 0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x1d, 0xbf, 0x71, 0xae, 0xed, 0x34, - 0x4b, 0x17, 0xd8, 0x05, 0xa1, 0xd7, 0xe5, 0x56, 0xf2, 0x57, 0x0f, 0x4f, - 0x6c, 0xce, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x11, 0x85, 0xf2, 0xb2, - 0xcd, 0x1d, 0x7f, 0xff, 0xd2, 0xd2, 0xad, 0xeb, 0xcc, 0xde, 0xe7, 0x18, - 0x9e, 0xcc, 0xbd, 0x1d, 0x7e, 0xcf, 0x02, 0x1a, 0x75, 0xff, 0xe8, 0xf2, - 0x02, 0x24, 0x1e, 0xc0, 0xb4, 0xeb, 0xf7, 0x1a, 0xee, 0xd3, 0x44, 0x7b, - 0x7d, 0xa7, 0xdf, 0x61, 0xd7, 0x49, 0x5c, 0x3d, 0x7f, 0x19, 0xdf, 0xff, - 0xce, 0xa8, 0xff, 0x9d, 0xc1, 0x06, 0x0f, 0xbb, 0x87, 0x59, 0x5d, 0xd3, - 0xba, 0x99, 0xc3, 0x84, 0xcf, 0x09, 0xe1, 0x2e, 0xbf, 0x71, 0xae, 0xed, - 0x34, 0x58, 0x77, 0xfa, 0x43, 0x19, 0xac, 0x13, 0xac, 0xae, 0x1f, 0x16, - 0xe6, 0x77, 0xff, 0xff, 0xa3, 0x83, 0x11, 0xa5, 0x7c, 0x14, 0x5e, 0xf2, - 0xd6, 0xf2, 0xce, 0x4e, 0x75, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x2e, - 0x7b, 0xff, 0xff, 0xff, 0xa1, 0x87, 0xca, 0x76, 0xf7, 0xe7, 0xce, 0xed, - 0xab, 0x3f, 0xea, 0x30, 0xe8, 0x60, 0x6f, 0x3c, 0xed, 0x5f, 0xcf, 0x9d, - 0xdb, 0x3a, 0xa1, 0x75, 0x56, 0x78, 0x49, 0x49, 0x0d, 0xa7, 0xe9, 0x1e, - 0xe2, 0xe1, 0x73, 0xd2, 0x9f, 0x3d, 0x6d, 0x1f, 0xdf, 0xe5, 0x73, 0x8d, - 0x77, 0x69, 0xa2, 0x1e, 0xbe, 0x6b, 0xbb, 0x4d, 0x11, 0x35, 0xfd, 0x9b, - 0x5f, 0xaf, 0x02, 0x75, 0xfe, 0xf7, 0xef, 0xbf, 0x63, 0x61, 0xd5, 0xc4, - 0x49, 0x89, 0x6f, 0x8c, 0x2f, 0xc0, 0xd7, 0xcc, 0x09, 0xd7, 0xf9, 0x19, - 0xc1, 0xcd, 0xfc, 0x75, 0x21, 0xed, 0xf0, 0xa6, 0xff, 0xfd, 0x1c, 0x07, - 0x63, 0x64, 0xd1, 0x0b, 0xd6, 0x04, 0xeb, 0xfe, 0xef, 0x63, 0x64, 0xb3, - 0x90, 0x75, 0xbd, 0xd4, 0x47, 0xba, 0xb5, 0xff, 0x27, 0x93, 0xd8, 0x08, - 0xe1, 0xd5, 0x87, 0xbc, 0xe5, 0x17, 0xb0, 0x3d, 0x3a, 0xff, 0xfe, 0xf7, - 0x63, 0x80, 0xd6, 0x07, 0xdf, 0xbb, 0x73, 0x87, 0x5d, 0xe5, 0x9d, 0x7f, - 0xfb, 0x3b, 0xf6, 0x7d, 0x42, 0x6f, 0xe8, 0x59, 0xd7, 0xfe, 0x9e, 0x25, - 0xf7, 0x39, 0xac, 0x64, 0xea, 0xc4, 0x7f, 0x6e, 0xb7, 0xd1, 0x6f, 0xd3, - 0x2f, 0xbd, 0xfb, 0xfd, 0x34, 0x42, 0xf7, 0xee, 0xe4, 0xff, 0x89, 0xd7, - 0xcf, 0xc8, 0xd8, 0x75, 0x04, 0xf2, 0x80, 0x51, 0x65, 0x71, 0x5d, 0x67, - 0x21, 0x15, 0xd8, 0xc3, 0x84, 0x83, 0x51, 0x8c, 0xfe, 0x7d, 0xb1, 0xee, - 0xff, 0xdc, 0xfe, 0x7c, 0xec, 0xc3, 0x01, 0x3a, 0xee, 0xb9, 0xd6, 0xfc, - 0xea, 0xc3, 0x4d, 0xa1, 0x5b, 0xc0, 0xd2, 0xb0, 0x88, 0x6f, 0x33, 0x5f, - 0xff, 0x62, 0x4b, 0x4a, 0xe6, 0xf2, 0x79, 0xfe, 0xb4, 0xea, 0x84, 0x44, - 0x74, 0xd6, 0xfc, 0xc4, 0xe9, 0x27, 0x60, 0x1d, 0x7f, 0x31, 0x1f, 0x7b, - 0xdc, 0x9c, 0xeb, 0x74, 0xea, 0x62, 0x0f, 0x17, 0xf3, 0x5b, 0xe0, 0xe0, - 0xcc, 0x75, 0xc9, 0xe3, 0xad, 0xe4, 0x36, 0xdd, 0x21, 0xbf, 0xdb, 0xfb, - 0x79, 0x7e, 0x2a, 0x1d, 0x7f, 0xe8, 0x98, 0x73, 0x63, 0xad, 0x68, 0x75, - 0x39, 0xfa, 0xfe, 0x6f, 0x7f, 0xff, 0xf7, 0x7f, 0x0a, 0x67, 0x26, 0x1c, - 0xd9, 0xdc, 0x0c, 0x6b, 0x50, 0xa1, 0xd7, 0xff, 0x92, 0x69, 0x66, 0xf2, - 0xf8, 0xb7, 0x71, 0x3a, 0xe7, 0xda, 0x3a, 0xcc, 0x0c, 0x4e, 0x51, 0x48, - 0x4d, 0xb4, 0x8b, 0xae, 0x8e, 0x97, 0x76, 0xda, 0x87, 0x5f, 0xba, 0xfe, - 0x79, 0x1d, 0x7f, 0x27, 0x07, 0x33, 0x87, 0x5f, 0xe9, 0x6a, 0x34, 0xc5, - 0x58, 0x86, 0x20, 0xeb, 0xff, 0x97, 0xf3, 0x43, 0x9b, 0xc8, 0x5e, 0x73, - 0xaf, 0x69, 0x00, 0x75, 0x61, 0xf0, 0xa2, 0x35, 0xe6, 0x59, 0x64, 0xab, - 0xf3, 0x8f, 0xbb, 0x85, 0x2a, 0x5f, 0xdf, 0x9f, 0xd3, 0x67, 0x8e, 0xa0, - 0xa2, 0x6c, 0x07, 0xe2, 0x6b, 0x7e, 0xe8, 0xb1, 0x4d, 0xbd, 0xa3, 0xae, - 0x77, 0x3a, 0xdd, 0x43, 0xc7, 0x73, 0x3b, 0xff, 0x80, 0x93, 0x7c, 0xec, - 0x27, 0x3f, 0x63, 0x3a, 0xfe, 0xe2, 0x6d, 0x73, 0x5a, 0x3a, 0xfe, 0x1f, - 0xfc, 0x93, 0xc1, 0xd7, 0xfe, 0x45, 0x20, 0x63, 0x50, 0x8b, 0x3a, 0xfe, - 0xcd, 0x9f, 0xcb, 0x34, 0x75, 0xf6, 0x07, 0x27, 0x3a, 0xf9, 0x8f, 0xe4, - 0x31, 0x27, 0x5d, 0xc8, 0x3a, 0xb1, 0x5c, 0xeb, 0x49, 0xb7, 0x2a, 0x48, - 0xcf, 0xd8, 0xdd, 0xa6, 0x26, 0xe2, 0x52, 0xcc, 0x3a, 0x5a, 0x27, 0x7e, - 0x2f, 0xd8, 0x43, 0xb4, 0x57, 0x7e, 0x66, 0x30, 0x28, 0x75, 0xef, 0xfd, - 0xa3, 0xaf, 0xff, 0xff, 0xfb, 0x5f, 0x3b, 0x93, 0xc3, 0x3b, 0xcb, 0x5f, - 0x3f, 0x6f, 0x39, 0x1f, 0x26, 0x53, 0x7f, 0x9f, 0x3b, 0xb6, 0x75, 0x62, - 0x3b, 0x9a, 0x4d, 0xe1, 0xdb, 0xbf, 0x01, 0xd7, 0x6d, 0xb1, 0x07, 0x5e, - 0xf9, 0x26, 0x9d, 0x50, 0x7a, 0x6a, 0x0b, 0xac, 0x7a, 0xff, 0xfe, 0xe7, - 0xc1, 0xcd, 0x99, 0xc9, 0x7c, 0x80, 0xbc, 0xda, 0x3a, 0xff, 0xff, 0xe1, - 0xde, 0x14, 0x1c, 0x0f, 0x52, 0x6f, 0x9a, 0xcd, 0xe5, 0xcc, 0x64, 0xea, - 0xc4, 0x6b, 0x0b, 0x05, 0xf7, 0xbf, 0x89, 0xce, 0xbf, 0xd2, 0xce, 0xe2, - 0xe1, 0xa7, 0x52, 0x1e, 0xa7, 0x88, 0xef, 0xff, 0xed, 0xe5, 0xa5, 0xe0, - 0xfc, 0xda, 0x4e, 0xce, 0x99, 0xc3, 0xac, 0xc6, 0x75, 0x61, 0xf9, 0xb5, - 0x82, 0xff, 0xff, 0xcc, 0xfc, 0x1c, 0x6f, 0x50, 0x73, 0xfd, 0xfd, 0xf1, - 0xd9, 0xc5, 0x0e, 0xbf, 0xca, 0x07, 0xf8, 0xe8, 0xc1, 0xd7, 0xfb, 0x79, - 0x69, 0x4f, 0xe3, 0x73, 0xaf, 0xf3, 0xb3, 0xfc, 0xd1, 0xe7, 0x3a, 0xa1, - 0x31, 0x0c, 0x72, 0x43, 0x31, 0x37, 0xbf, 0xf4, 0x68, 0x73, 0x67, 0xc9, - 0x2e, 0x47, 0x5f, 0x03, 0xc9, 0x39, 0xd7, 0xfb, 0xdd, 0x41, 0x07, 0xd5, - 0x9d, 0x7f, 0xa7, 0x85, 0x8c, 0x6e, 0x03, 0xad, 0x12, 0x3e, 0x77, 0x34, - 0xbf, 0xf9, 0xf9, 0x2f, 0x9e, 0x18, 0x96, 0x78, 0xea, 0x85, 0x75, 0x18, - 0xea, 0x90, 0x94, 0xe4, 0x66, 0x3d, 0x3a, 0x74, 0x11, 0x84, 0x4f, 0xe4, - 0xd6, 0x63, 0x3a, 0xff, 0xfb, 0x89, 0xfb, 0x06, 0x3e, 0x6b, 0xf0, 0x2f, - 0x3c, 0x75, 0xdf, 0xc8, 0xeb, 0xf4, 0x03, 0x53, 0xf8, 0xeb, 0xcf, 0xed, - 0x1d, 0x77, 0xf3, 0x9d, 0x52, 0x36, 0x7c, 0x1b, 0xbf, 0x64, 0xba, 0xf2, - 0x3a, 0xe1, 0xf4, 0xc7, 0x8f, 0xd2, 0x1b, 0xfc, 0xe3, 0xf7, 0xbd, 0x80, - 0x9d, 0x7f, 0x7e, 0xdf, 0x81, 0xdd, 0x93, 0xaa, 0x11, 0x29, 0xb9, 0x72, - 0x19, 0xdf, 0xee, 0x40, 0x63, 0xb1, 0x23, 0xaf, 0xff, 0xa3, 0xdf, 0x07, - 0xfd, 0xaf, 0x99, 0xed, 0xbc, 0xf1, 0xd4, 0x88, 0x8a, 0xfc, 0xc6, 0xff, - 0xee, 0xc2, 0x9f, 0x3c, 0x2f, 0xe8, 0xf1, 0xd7, 0xfb, 0xe6, 0xf2, 0x4e, - 0xfe, 0xb3, 0xa8, 0x07, 0xf8, 0x28, 0xb7, 0xff, 0x66, 0xcc, 0x0f, 0xcf, - 0x28, 0x8c, 0xe8, 0xeb, 0xff, 0x72, 0x6f, 0x9a, 0x84, 0x9d, 0xfc, 0x75, - 0x42, 0x2a, 0xc2, 0x43, 0xfa, 0x4d, 0xce, 0x03, 0xaf, 0xff, 0xbe, 0x0c, - 0x6a, 0x27, 0x1c, 0x0f, 0x52, 0x63, 0xaf, 0xff, 0xfe, 0xd7, 0x06, 0x26, - 0xf9, 0xf7, 0xc9, 0x2c, 0xdf, 0xd9, 0xb0, 0x73, 0x47, 0x57, 0x11, 0x8e, - 0x2a, 0x15, 0xe4, 0x7f, 0x7f, 0x0d, 0xca, 0x3a, 0xe9, 0xa4, 0x75, 0x41, - 0xa1, 0xe0, 0x55, 0xff, 0xc3, 0xed, 0x6c, 0x4f, 0x46, 0x0c, 0xc7, 0x5f, - 0xb8, 0x9a, 0x8d, 0xce, 0xac, 0x3e, 0xb7, 0x44, 0xbf, 0xd3, 0xb0, 0x26, - 0x92, 0x7b, 0x47, 0x5f, 0x87, 0xdd, 0xcd, 0xa3, 0xaf, 0xd3, 0x69, 0xf8, - 0xa1, 0xd7, 0x9d, 0x9e, 0x41, 0xe9, 0x61, 0x4d, 0x49, 0x1b, 0xa8, 0x41, - 0xc8, 0x45, 0xdf, 0xf7, 0x53, 0x93, 0x75, 0xf3, 0x87, 0x5f, 0xff, 0xff, - 0xc0, 0xd0, 0xe3, 0xef, 0xf0, 0x3d, 0xff, 0xe0, 0xe6, 0xf2, 0xcf, 0xe7, - 0x1c, 0x7d, 0xce, 0xa6, 0xa3, 0x1d, 0x0e, 0x2f, 0x3b, 0xb4, 0xd1, 0x4c, - 0x56, 0x1e, 0x4b, 0x48, 0xaf, 0xfd, 0x83, 0xbc, 0xb5, 0xe8, 0xe4, 0xc7, - 0x5e, 0xc4, 0x01, 0xd6, 0xc3, 0xaf, 0x6e, 0x38, 0x03, 0x53, 0xb0, 0x6a, - 0x91, 0x13, 0x8e, 0xd1, 0x74, 0xf3, 0x1d, 0x70, 0x66, 0x3a, 0xfb, 0x9d, - 0x7f, 0x90, 0x6b, 0xd6, 0x31, 0x7f, 0xbe, 0x6f, 0x21, 0x8c, 0xd1, 0xd4, - 0x87, 0xda, 0xe7, 0x37, 0xff, 0xe0, 0x26, 0xbe, 0x75, 0xf5, 0xe8, 0x9b, - 0x5d, 0xc3, 0xaf, 0xe4, 0xeb, 0xa4, 0xf0, 0x75, 0xe9, 0x46, 0xe7, 0x5f, - 0xe5, 0x87, 0xb1, 0x3e, 0x32, 0x75, 0x61, 0xfd, 0xee, 0x56, 0xe3, 0x97, - 0x6b, 0x47, 0x5b, 0x0e, 0xbf, 0xf4, 0xc8, 0xa2, 0x78, 0x73, 0x6b, 0xe7, - 0x0d, 0x2e, 0xc1, 0x6b, 0xff, 0xfc, 0x38, 0xdf, 0x7a, 0x3d, 0xa9, 0x87, - 0x19, 0xf9, 0x0c, 0x49, 0xd7, 0xfe, 0x6c, 0x2f, 0xb9, 0xac, 0x41, 0x3a, - 0xa1, 0x14, 0x5d, 0x67, 0xbf, 0x72, 0x36, 0x47, 0x0e, 0xbf, 0x9c, 0x7e, - 0x06, 0x04, 0xea, 0x84, 0xdd, 0x32, 0x1f, 0xc8, 0x45, 0xf9, 0x45, 0x31, - 0x6c, 0xc5, 0x28, 0x13, 0x9d, 0x5e, 0x42, 0xe1, 0x8c, 0xd9, 0x48, 0x5c, - 0xb6, 0x34, 0xad, 0xe3, 0x2e, 0x44, 0xa9, 0xa3, 0x68, 0xe4, 0x68, 0x8b, - 0x85, 0xef, 0x61, 0x7a, 0x02, 0x01, 0x86, 0x97, 0xa3, 0xc7, 0xbf, 0xee, - 0x3b, 0x3f, 0x1c, 0x2f, 0x39, 0xd7, 0xf3, 0xb3, 0x30, 0xa0, 0x4e, 0xbf, - 0xff, 0xc1, 0xc9, 0xdc, 0x7d, 0xa8, 0x6f, 0xc5, 0xad, 0x05, 0xa7, 0x5f, - 0xc1, 0xd3, 0xc6, 0xf2, 0x3a, 0xa1, 0x11, 0xce, 0xc3, 0x7f, 0xd1, 0x37, - 0x52, 0x16, 0xe1, 0x3a, 0x94, 0x4d, 0x3b, 0x87, 0x63, 0x0b, 0xbf, 0xc8, - 0x6f, 0xb0, 0x54, 0x63, 0x3a, 0xff, 0xff, 0xfd, 0xd4, 0xf7, 0x73, 0x91, - 0xb3, 0xe2, 0xff, 0xda, 0xf9, 0x9b, 0xcb, 0x3f, 0x10, 0x68, 0xeb, 0x79, - 0x11, 0x65, 0xa2, 0x4b, 0xff, 0x43, 0x7e, 0x0b, 0xe9, 0x70, 0x27, 0x5f, - 0xff, 0xb3, 0x3a, 0x8d, 0xee, 0x7c, 0xd7, 0xfd, 0x86, 0x33, 0xaf, 0xff, - 0xbd, 0xdc, 0x07, 0xc5, 0xc6, 0x78, 0x38, 0x27, 0x5f, 0xce, 0x1e, 0x73, - 0xf9, 0xce, 0xbf, 0x46, 0x0f, 0xb6, 0xce, 0xa6, 0x9e, 0xba, 0xcb, 0xef, - 0xbc, 0x9c, 0xc3, 0xad, 0xbf, 0xc3, 0xc2, 0xc2, 0x2b, 0x6b, 0x13, 0x12, - 0x78, 0x74, 0x52, 0xd3, 0xd5, 0x13, 0xdf, 0x46, 0xd7, 0x7f, 0xff, 0xfe, - 0x1c, 0xde, 0x49, 0xa1, 0xcd, 0x9d, 0xc9, 0xbb, 0x03, 0x37, 0xc7, 0x6a, - 0x6c, 0x3a, 0x91, 0x17, 0xbf, 0x9b, 0x5f, 0xfe, 0x40, 0xfc, 0x5a, 0x7c, - 0x80, 0xbc, 0xda, 0x3a, 0xe9, 0x48, 0xeb, 0x72, 0x0f, 0x8e, 0x74, 0xdb, - 0xf4, 0xa3, 0x79, 0x68, 0xeb, 0xff, 0xff, 0xff, 0x60, 0xa9, 0xf1, 0x3b, - 0xfa, 0xb3, 0x27, 0xa1, 0x62, 0xea, 0x75, 0x15, 0xce, 0xee, 0x08, 0x09, - 0x57, 0xff, 0xff, 0x35, 0x19, 0x0f, 0xfc, 0xf9, 0xfc, 0x4f, 0xa6, 0xf7, - 0xfe, 0xee, 0xec, 0x9d, 0x77, 0xf3, 0xee, 0x9a, 0x1a, 0x14, 0x6a, 0x13, - 0xf5, 0x0b, 0x9d, 0xfd, 0x95, 0x74, 0xf0, 0x86, 0x18, 0xda, 0xef, 0xf3, - 0xcb, 0x16, 0xe2, 0x03, 0xaf, 0xb3, 0xb1, 0x31, 0xd7, 0x96, 0xdf, 0x9d, - 0x3d, 0x17, 0x30, 0xbf, 0xff, 0xfd, 0xc6, 0x8e, 0x6c, 0xf9, 0xa4, 0xc1, - 0x07, 0xc1, 0xcd, 0x83, 0x9a, 0xd8, 0x75, 0xff, 0x37, 0x1d, 0x7f, 0x36, - 0xe1, 0x67, 0x56, 0x22, 0xe7, 0x8f, 0xb7, 0xff, 0xe4, 0x1f, 0x77, 0x36, - 0xbd, 0x36, 0x31, 0xb8, 0x80, 0xeb, 0xf4, 0x33, 0xf3, 0x53, 0x1d, 0x7f, - 0xe1, 0x9c, 0x73, 0x66, 0xbf, 0x8d, 0xce, 0xbf, 0xf0, 0x7b, 0x1b, 0xfc, - 0x62, 0x9b, 0x00, 0x87, 0x54, 0x22, 0x2a, 0x74, 0x1a, 0x44, 0xd4, 0xf4, - 0x45, 0xe5, 0x9f, 0xe1, 0x6b, 0x7f, 0xf3, 0x39, 0xaf, 0xe1, 0x4d, 0x47, - 0x26, 0x3a, 0xff, 0xc3, 0x26, 0xf5, 0x3a, 0x3f, 0xce, 0x75, 0xef, 0x63, - 0x04, 0xea, 0x83, 0xde, 0xc3, 0xfb, 0xdb, 0x79, 0xd3, 0xae, 0xc0, 0x9d, - 0x53, 0xab, 0x7c, 0x94, 0xa4, 0x1c, 0x43, 0xd4, 0x29, 0x7c, 0x41, 0xb0, - 0x7a, 0xfc, 0x9e, 0xd6, 0x00, 0xeb, 0xf7, 0x73, 0x62, 0x6c, 0x3a, 0xf2, - 0x60, 0x0e, 0xbf, 0x83, 0x03, 0xd7, 0x91, 0xd7, 0xa0, 0x30, 0x75, 0xfb, - 0x3d, 0xa7, 0x9b, 0xe1, 0xe2, 0xac, 0xae, 0xf9, 0x8b, 0x62, 0xac, 0x26, - 0x2c, 0xeb, 0xe4, 0x71, 0x09, 0xd6, 0x67, 0xe1, 0xea, 0x84, 0xda, 0xa4, - 0x8c, 0x14, 0x84, 0xb5, 0xff, 0xfb, 0x9f, 0xf3, 0x90, 0x38, 0xa2, 0x77, - 0xb9, 0xf4, 0xeb, 0xef, 0xdf, 0x7f, 0x1d, 0x52, 0x54, 0x22, 0x12, 0x65, - 0x0a, 0xa6, 0x8c, 0x83, 0x84, 0xfd, 0x57, 0xa3, 0xaf, 0xed, 0x35, 0xae, - 0x2a, 0x1d, 0x4c, 0x31, 0xb7, 0xf0, 0x55, 0xfe, 0x1f, 0x9b, 0x37, 0x96, - 0xa6, 0x3a, 0xe9, 0xf7, 0x3a, 0xfd, 0xd7, 0x63, 0x80, 0x1d, 0x41, 0x3f, - 0xa7, 0x39, 0xda, 0x18, 0xbf, 0xdc, 0x98, 0x73, 0xaf, 0xe3, 0xaa, 0x13, - 0x03, 0xc8, 0x50, 0x21, 0x8d, 0xf9, 0x38, 0x1c, 0x13, 0xaf, 0xc0, 0xcf, - 0x7d, 0x9c, 0xeb, 0xfc, 0xcf, 0xb3, 0xbf, 0x37, 0xd1, 0xd5, 0x07, 0xc2, - 0xe5, 0x55, 0x24, 0x6c, 0xf4, 0xcc, 0x61, 0x0d, 0x7f, 0xde, 0xee, 0x49, - 0xc7, 0x37, 0x3a, 0xff, 0xff, 0x85, 0xc1, 0xa9, 0xf1, 0x07, 0xc3, 0x9b, - 0x3e, 0x69, 0x91, 0x3a, 0x85, 0x13, 0xfe, 0x37, 0xbf, 0xf2, 0x64, 0xdf, - 0x35, 0x1d, 0x76, 0x33, 0xaf, 0xfb, 0x7c, 0x8d, 0xe6, 0x18, 0x59, 0xd7, - 0xf6, 0xfa, 0xee, 0x3f, 0x0e, 0xbf, 0xff, 0xf2, 0x2f, 0x89, 0x9b, 0x8f, - 0xfe, 0x8e, 0xfc, 0xd8, 0x9e, 0x9a, 0x0e, 0xa7, 0x44, 0xef, 0x8b, 0x68, - 0x29, 0x9d, 0x75, 0x0b, 0xd0, 0xd6, 0xbf, 0xec, 0xe4, 0xf0, 0x9c, 0xc1, - 0x3a, 0xcb, 0x3b, 0xe1, 0xb6, 0xbc, 0x38, 0x13, 0xaa, 0x0d, 0xe6, 0xe4, - 0x57, 0xf6, 0xfa, 0xcc, 0x15, 0x0e, 0xbe, 0x5f, 0xd8, 0x01, 0xd7, 0xff, - 0xa7, 0x0f, 0x1d, 0xa3, 0x9b, 0x38, 0x9a, 0x3a, 0xb1, 0x13, 0x68, 0x5b, - 0xf9, 0x1d, 0xfe, 0x7f, 0x75, 0xe6, 0xfa, 0xb3, 0xaf, 0x7f, 0xb8, 0x0e, - 0xbf, 0xb5, 0x1b, 0x83, 0x90, 0x75, 0x42, 0xb6, 0xfc, 0x8d, 0x71, 0x21, - 0x51, 0xc8, 0x5e, 0x39, 0x78, 0x9a, 0xe8, 0x7a, 0xfe, 0xf3, 0xf7, 0xe0, - 0x60, 0xeb, 0xff, 0xde, 0xd7, 0xdd, 0x7c, 0xf0, 0xc4, 0xb3, 0xc7, 0x5f, - 0xef, 0x24, 0xf9, 0xdf, 0xfc, 0x75, 0xf7, 0xb5, 0x0a, 0x1d, 0x69, 0x8e, - 0xbf, 0xb3, 0xfc, 0xeb, 0x67, 0x3a, 0xdb, 0xc1, 0xbf, 0xd0, 0x8d, 0x42, - 0x22, 0x31, 0x86, 0xfe, 0xeb, 0xc9, 0x7c, 0x43, 0xaf, 0xfe, 0x51, 0x47, - 0xf6, 0xbc, 0x31, 0xbc, 0x8e, 0xbf, 0xbc, 0x31, 0x2c, 0xf1, 0xd5, 0x07, - 0xe3, 0x24, 0x6b, 0x93, 0x47, 0x59, 0x67, 0x5e, 0xe6, 0x6e, 0x75, 0x04, - 0xf0, 0x7a, 0x2a, 0x01, 0x0b, 0xff, 0xce, 0xa7, 0x94, 0x81, 0x96, 0x75, - 0x16, 0x75, 0xf9, 0x35, 0xa8, 0x59, 0xd4, 0x88, 0x9e, 0x12, 0xfd, 0x89, - 0x35, 0x0a, 0xc9, 0x70, 0xb9, 0x44, 0xd4, 0x85, 0xe0, 0x08, 0x46, 0x13, - 0xbf, 0xc6, 0x01, 0x7e, 0x0a, 0x0b, 0x84, 0xeb, 0xff, 0xf4, 0xbb, 0x93, - 0x76, 0x05, 0x41, 0xcf, 0x77, 0xf3, 0xa9, 0x0f, 0xef, 0x84, 0xb7, 0xff, - 0xf9, 0x33, 0x79, 0x6b, 0xdd, 0x85, 0xc2, 0x07, 0xe4, 0x31, 0x27, 0x5f, - 0xe7, 0x1f, 0x8d, 0xd0, 0x02, 0x75, 0xff, 0xbf, 0xd7, 0xc5, 0xfd, 0xeb, - 0xf6, 0x0e, 0xbf, 0x67, 0xbf, 0xcd, 0xce, 0xbc, 0xa6, 0x6e, 0x75, 0xd1, - 0x37, 0xc3, 0xc5, 0xf1, 0x45, 0x0a, 0x2e, 0x3f, 0x84, 0x45, 0xff, 0xff, - 0xfb, 0xf1, 0xf8, 0xcb, 0xef, 0x2e, 0x38, 0x3e, 0x6b, 0xf8, 0xdf, 0xb8, - 0x83, 0x8a, 0x1d, 0x7f, 0xfe, 0xff, 0x9c, 0xcf, 0x6b, 0xa9, 0x9f, 0x3a, - 0x08, 0x3a, 0xb1, 0x1c, 0x3d, 0x84, 0x55, 0xfb, 0x05, 0xbf, 0x56, 0x75, - 0xff, 0xdd, 0xc8, 0x19, 0x87, 0x3d, 0xa7, 0x3a, 0xd2, 0xf1, 0xf4, 0xed, - 0x14, 0x5f, 0xff, 0x83, 0x8b, 0xf9, 0xb5, 0xe8, 0xd4, 0xd2, 0x7e, 0x4e, - 0x75, 0xff, 0xfd, 0xe4, 0x9f, 0x03, 0xf1, 0x6f, 0x2e, 0x24, 0xee, 0xb3, - 0xaf, 0xf4, 0xee, 0xb1, 0x8e, 0x4c, 0x75, 0xff, 0x6f, 0x8a, 0x01, 0x79, - 0xf3, 0x98, 0x89, 0x04, 0x5d, 0xbf, 0xec, 0x19, 0xfe, 0x01, 0xde, 0x63, - 0xaf, 0xff, 0xb3, 0xfe, 0x7c, 0x9b, 0xbf, 0xa8, 0x98, 0x2a, 0x1d, 0x7f, - 0xdc, 0x9e, 0x27, 0x9f, 0xfe, 0x4e, 0x75, 0xff, 0xbe, 0x4d, 0xdf, 0xd4, - 0x4c, 0x15, 0x0e, 0xbf, 0xc3, 0xf3, 0x5f, 0xed, 0xff, 0xc3, 0xab, 0x0f, - 0xf7, 0xf4, 0x3a, 0x84, 0x6e, 0xea, 0x17, 0x77, 0xff, 0xa7, 0xf9, 0xae, - 0xff, 0xf3, 0xda, 0xd4, 0x70, 0xeb, 0xff, 0xee, 0xc4, 0xff, 0x07, 0x36, - 0x3f, 0x7b, 0x1b, 0x9d, 0x7f, 0xff, 0xdb, 0xe9, 0x31, 0x9f, 0x9d, 0xcf, - 0x6b, 0x27, 0xf9, 0x88, 0x13, 0xa8, 0x28, 0xbe, 0xc5, 0x3b, 0xfa, 0x7f, - 0x4c, 0x30, 0xb3, 0xaf, 0xff, 0xec, 0x9f, 0x10, 0x23, 0xff, 0x7e, 0x40, - 0x5e, 0x6d, 0x1d, 0x58, 0x9d, 0xe2, 0x46, 0x1e, 0xe4, 0x5a, 0x2e, 0xa9, - 0xd7, 0xf9, 0x42, 0xcc, 0xa4, 0x3b, 0x1b, 0x18, 0x4e, 0xf0, 0x90, 0x42, - 0xbe, 0x43, 0xb1, 0x6a, 0x7d, 0x3a, 0xd4, 0x66, 0x5e, 0x8f, 0x8e, 0xff, - 0x78, 0x73, 0xdd, 0xc9, 0xce, 0xbf, 0xf3, 0xf3, 0xb9, 0xe8, 0x14, 0x01, - 0xd7, 0xff, 0xc3, 0x93, 0xfc, 0x07, 0xfe, 0xcc, 0x58, 0x19, 0x3a, 0xfa, - 0x5e, 0x49, 0xce, 0xbf, 0xec, 0x67, 0x79, 0x6b, 0xe7, 0x90, 0xeb, 0xff, - 0x4a, 0x30, 0x1d, 0xcc, 0x16, 0x9d, 0x7f, 0xfb, 0xa8, 0x21, 0xf9, 0xf5, - 0xa3, 0x9d, 0xc3, 0xab, 0x11, 0x0d, 0x31, 0xdd, 0xff, 0x75, 0x17, 0x18, - 0x3e, 0xd1, 0xd7, 0xff, 0xfb, 0xff, 0x73, 0xf9, 0xbe, 0x7a, 0x6e, 0xfe, - 0x0f, 0x26, 0x6d, 0x1d, 0x7d, 0x0d, 0x85, 0xfc, 0x46, 0x2b, 0x48, 0xc4, - 0xda, 0xa1, 0x55, 0x83, 0x4c, 0xb8, 0x76, 0xea, 0x62, 0x45, 0xb5, 0x1c, - 0x3d, 0xff, 0xfd, 0xcc, 0x75, 0xfc, 0x51, 0xf7, 0xee, 0x77, 0xb1, 0xe3, - 0xaf, 0xf4, 0x2f, 0x33, 0x93, 0x48, 0xeb, 0xe4, 0xf2, 0x41, 0xd7, 0xff, - 0xff, 0x85, 0x14, 0xeb, 0xcd, 0xf0, 0x7f, 0xda, 0xf9, 0x9b, 0xcb, 0x3f, - 0x10, 0x68, 0xeb, 0xf7, 0x52, 0x06, 0x73, 0xae, 0xf4, 0x2d, 0x14, 0xfb, - 0x21, 0x03, 0x52, 0x47, 0xda, 0x43, 0x1a, 0xa1, 0x9b, 0x09, 0x94, 0x80, - 0x64, 0x96, 0xdd, 0xc5, 0xfe, 0xae, 0xbc, 0x65, 0xb7, 0xe8, 0x1f, 0x26, - 0xc3, 0xaf, 0xbd, 0xa7, 0x01, 0xd7, 0xff, 0x75, 0x3e, 0x27, 0x3f, 0x9d, - 0xf8, 0xd3, 0xaf, 0x93, 0xaf, 0x39, 0xd7, 0xdb, 0x23, 0xd0, 0x75, 0xfb, - 0x59, 0xe4, 0xd1, 0xd7, 0xff, 0x27, 0xba, 0x99, 0x81, 0x1c, 0x64, 0xeb, - 0xff, 0xfe, 0xcf, 0xe7, 0x1f, 0xf1, 0x3b, 0x8d, 0xea, 0x7c, 0x65, 0x6d, - 0x3a, 0xfd, 0xfb, 0x04, 0x5f, 0xc7, 0x5f, 0xdd, 0x79, 0xfe, 0x4b, 0xc7, - 0x5f, 0x9f, 0x83, 0xba, 0x1d, 0x50, 0x88, 0x14, 0x2b, 0xf1, 0x85, 0x05, - 0x52, 0x96, 0x13, 0xa8, 0x42, 0xd4, 0x74, 0x21, 0x98, 0x89, 0x64, 0xc2, - 0x83, 0xe8, 0x75, 0xdf, 0x0f, 0xa1, 0x67, 0x5f, 0xee, 0xc2, 0x0b, 0xf1, - 0x43, 0xaf, 0xe8, 0x41, 0x7e, 0x28, 0x75, 0xfc, 0xe0, 0xe7, 0x13, 0x9f, - 0x0f, 0x73, 0xa6, 0x37, 0xf9, 0xc5, 0xbf, 0x19, 0xd0, 0x0e, 0xa4, 0x47, - 0xb8, 0x1f, 0x3f, 0x46, 0xbd, 0xaf, 0x21, 0xd7, 0xa6, 0x06, 0xe7, 0x5e, - 0x85, 0x3e, 0x34, 0xdc, 0x80, 0x6e, 0xc0, 0x3a, 0xfe, 0x8e, 0x4f, 0x1c, - 0x9c, 0xeb, 0xdf, 0xbe, 0x8e, 0xa9, 0x1e, 0x57, 0xd2, 0xeb, 0xff, 0xf9, - 0x39, 0xf3, 0x13, 0x05, 0x4e, 0xa6, 0x2f, 0x1a, 0x75, 0xff, 0xff, 0x24, - 0xfc, 0x85, 0xeb, 0xf8, 0xf9, 0x1c, 0x80, 0xf6, 0x16, 0x75, 0x62, 0x30, - 0x78, 0xb3, 0x7e, 0x06, 0x93, 0x76, 0x4e, 0xbf, 0xf7, 0x33, 0x7e, 0xef, - 0x0b, 0x9e, 0x0e, 0xbf, 0xff, 0xfd, 0xce, 0x24, 0xff, 0x3b, 0x9e, 0x18, - 0x9b, 0xb9, 0x3c, 0x6f, 0xef, 0xda, 0x75, 0xff, 0xff, 0xd0, 0xa7, 0x63, - 0xe0, 0xe7, 0xea, 0x7c, 0xde, 0x5a, 0x41, 0xfb, 0x13, 0x9d, 0x7e, 0xdf, - 0x49, 0x82, 0x75, 0x62, 0x28, 0x3f, 0x7a, 0xa4, 0x4d, 0x03, 0xb1, 0x8e, - 0xdf, 0xfd, 0xc1, 0xdf, 0x35, 0xfc, 0xc3, 0x0b, 0x3a, 0xff, 0x91, 0x4e, - 0xc2, 0x4f, 0x0a, 0x1d, 0x69, 0x21, 0xff, 0x69, 0x16, 0xff, 0x87, 0xf9, - 0x87, 0x3a, 0xfe, 0x3a, 0xff, 0x76, 0x19, 0x0f, 0x5d, 0x67, 0x5f, 0xf2, - 0xf3, 0x5f, 0x26, 0x18, 0x59, 0xd4, 0x13, 0xed, 0x59, 0x9d, 0xff, 0xff, - 0x3f, 0x3b, 0x9e, 0x4c, 0x19, 0xf5, 0x18, 0x21, 0xec, 0x1d, 0x7d, 0xef, - 0x93, 0xf0, 0xea, 0xdd, 0x10, 0xee, 0xc5, 0x7f, 0xff, 0xed, 0xf2, 0x7f, - 0xf6, 0xbe, 0x6f, 0x2f, 0x43, 0x3f, 0x33, 0x80, 0x04, 0x1d, 0x7f, 0xf9, - 0x97, 0x19, 0xd7, 0xfa, 0x05, 0x05, 0x0e, 0xbf, 0xa6, 0xde, 0x5f, 0xc7, - 0x8e, 0xbf, 0xb2, 0x5e, 0x1c, 0x91, 0xd7, 0xfd, 0xd7, 0x58, 0xe7, 0x5f, - 0xc7, 0x5f, 0x67, 0x00, 0xc9, 0xd5, 0x08, 0xb3, 0xe9, 0x86, 0x8a, 0xfc, - 0x6d, 0x7f, 0x67, 0xb9, 0xcc, 0x91, 0xd7, 0xf0, 0xe7, 0x47, 0x1a, 0x75, - 0xf0, 0xe6, 0xbe, 0x4c, 0x7a, 0xde, 0x2c, 0xbf, 0xec, 0x5f, 0x61, 0x39, - 0xfb, 0x19, 0xd4, 0x15, 0xe8, 0x6c, 0x22, 0x50, 0xa5, 0xb1, 0xc0, 0x6f, - 0x0a, 0x74, 0x27, 0xe4, 0x29, 0x7b, 0x0a, 0x97, 0x23, 0xd3, 0xc7, 0xa1, - 0xf9, 0xb2, 0x12, 0x5f, 0x4e, 0xef, 0xfd, 0x8c, 0x8e, 0x7f, 0x8a, 0x48, - 0x07, 0x5f, 0xf8, 0x73, 0xe7, 0x33, 0xa3, 0x93, 0x1d, 0x7f, 0xff, 0xba, - 0xe0, 0xd7, 0xc1, 0xcd, 0x83, 0x9a, 0xc5, 0xc3, 0x4e, 0xa1, 0x44, 0xfe, - 0x8f, 0xa9, 0x86, 0x64, 0xce, 0x42, 0xd6, 0x4f, 0xb5, 0xef, 0x0d, 0x77, - 0x86, 0xf5, 0xfd, 0x9d, 0xfa, 0x3b, 0x80, 0xeb, 0xfb, 0xb8, 0x3e, 0x07, - 0xe7, 0x5f, 0xfa, 0x51, 0xad, 0x42, 0x4e, 0xfe, 0x3a, 0xfc, 0x30, 0xb7, - 0x09, 0xd7, 0xfb, 0x26, 0xee, 0x7a, 0x02, 0x75, 0xfc, 0x3e, 0x75, 0xa7, - 0x8e, 0xb4, 0x8e, 0xa8, 0x37, 0x7e, 0x2b, 0xbc, 0x2d, 0x83, 0xaf, 0xff, - 0xff, 0xbb, 0x9e, 0xd3, 0xcd, 0xf0, 0x73, 0x79, 0x67, 0xf3, 0x8e, 0x07, - 0xa9, 0x31, 0xd7, 0x7e, 0xa1, 0xd4, 0x88, 0xb3, 0xe0, 0xd7, 0xa1, 0x03, - 0x7f, 0x64, 0xe3, 0x9b, 0xe8, 0xeb, 0xff, 0x84, 0x1b, 0x79, 0xd4, 0x85, - 0xb8, 0x4e, 0xbf, 0xff, 0xff, 0x4b, 0x5a, 0xfe, 0x3c, 0x81, 0xc1, 0x9b, - 0xe0, 0xe7, 0x20, 0x7d, 0xdc, 0xda, 0x3a, 0xff, 0xed, 0xe5, 0xac, 0x5e, - 0xf1, 0xde, 0xc1, 0xd5, 0xba, 0x32, 0xf9, 0x08, 0x6b, 0x68, 0xea, 0xc4, - 0xd2, 0x3f, 0x8c, 0x3f, 0xe9, 0x4d, 0xfd, 0x9b, 0xca, 0x01, 0x07, 0x5f, - 0x87, 0x3a, 0xfe, 0x3a, 0xd1, 0xb9, 0xe8, 0xac, 0xb2, 0xfb, 0xe3, 0x67, - 0x64, 0xeb, 0xf4, 0xff, 0x3f, 0x89, 0x8e, 0xbf, 0xff, 0xe1, 0x80, 0x6f, - 0x2d, 0x7f, 0x1e, 0x1c, 0x0a, 0x67, 0x26, 0x3a, 0x9d, 0x12, 0x5e, 0x2c, - 0xa8, 0x5d, 0x33, 0x09, 0x7e, 0xe5, 0xa8, 0x7b, 0x31, 0x2f, 0x5b, 0x5e, - 0x1a, 0x62, 0x69, 0xa8, 0xdd, 0x7f, 0x84, 0x56, 0xc2, 0x8f, 0xb0, 0xb8, - 0xbf, 0x49, 0x39, 0x9b, 0x9d, 0x7b, 0x5d, 0xc3, 0xaf, 0xd9, 0xa9, 0xf1, - 0x93, 0xab, 0x73, 0xea, 0x98, 0x9f, 0xa3, 0x77, 0xff, 0xd3, 0xe3, 0x43, - 0xd4, 0xc5, 0x3e, 0x29, 0xfc, 0x1d, 0x7f, 0xf4, 0x93, 0xdd, 0xce, 0x73, - 0x3d, 0xa3, 0xaf, 0xfb, 0xe7, 0xdf, 0x26, 0xc8, 0x16, 0x9d, 0x48, 0x8d, - 0x49, 0x95, 0x3a, 0x87, 0x7f, 0xfa, 0x37, 0x96, 0xbc, 0xf3, 0xed, 0x0e, - 0x6e, 0x75, 0xff, 0x76, 0x74, 0xc1, 0xde, 0x5a, 0x3a, 0xff, 0xb7, 0xee, - 0x34, 0x73, 0xf6, 0x33, 0xaf, 0xff, 0x99, 0xc6, 0xeb, 0x3d, 0x36, 0x28, - 0x38, 0x03, 0xad, 0x28, 0x46, 0x2e, 0x1c, 0xa1, 0xe5, 0xfc, 0x9b, 0x83, - 0x8e, 0x13, 0xaf, 0xd8, 0x99, 0xc0, 0x1d, 0x5d, 0x3d, 0x21, 0x2d, 0xbe, - 0xda, 0xf6, 0x74, 0xeb, 0x91, 0x67, 0x5f, 0xff, 0xfb, 0x79, 0x3e, 0xff, - 0x07, 0xfd, 0xaf, 0x99, 0xbc, 0xb3, 0xf1, 0x06, 0x8e, 0xa5, 0xa2, 0x33, - 0x68, 0x56, 0xf6, 0xda, 0x30, 0x4e, 0xaf, 0x89, 0x8c, 0xce, 0x43, 0x90, - 0xb0, 0xdb, 0x26, 0xbf, 0xff, 0xff, 0x46, 0xfa, 0xfe, 0x37, 0xf9, 0xdc, - 0x0f, 0xc1, 0xcf, 0xd4, 0xf9, 0xa0, 0x01, 0x3c, 0x75, 0xfa, 0x07, 0x77, - 0x9c, 0xeb, 0xff, 0xff, 0xff, 0x63, 0x63, 0xb0, 0xbf, 0x66, 0xb5, 0x1c, - 0xe4, 0x0e, 0x4f, 0x9f, 0xeb, 0xf9, 0x86, 0x16, 0x75, 0xef, 0xf8, 0xa1, - 0xd4, 0xb4, 0x5b, 0xed, 0xc2, 0x66, 0xfc, 0xe0, 0xfa, 0xf3, 0x9d, 0x58, - 0x7a, 0x88, 0x57, 0x79, 0x01, 0x07, 0x5f, 0xc1, 0x1c, 0xeb, 0xf8, 0xeb, - 0xf7, 0xb7, 0x92, 0x70, 0xea, 0xc3, 0xd3, 0xd1, 0x5d, 0x4e, 0x88, 0xe0, - 0x36, 0xdf, 0xe9, 0xff, 0x8f, 0x2d, 0x3c, 0x75, 0xff, 0xa1, 0x4d, 0xaf, - 0xf0, 0x66, 0xfa, 0xb3, 0xab, 0x0f, 0xe7, 0x73, 0x4b, 0xff, 0x66, 0x03, - 0x5f, 0x39, 0xa0, 0xe8, 0xeb, 0xfd, 0xcc, 0x6f, 0x53, 0x93, 0x1d, 0x76, - 0x78, 0x27, 0xe7, 0x88, 0x17, 0xd3, 0xa0, 0xf8, 0xeb, 0xf6, 0x77, 0xaf, - 0x23, 0xaf, 0xef, 0x27, 0x27, 0xc6, 0x9d, 0x50, 0xc8, 0x6d, 0xc8, 0xc1, - 0x54, 0x30, 0xde, 0x31, 0x34, 0x8e, 0x7b, 0x89, 0x0b, 0x84, 0x6f, 0x63, - 0x32, 0x78, 0x57, 0x0c, 0x27, 0x75, 0x09, 0x5f, 0xcb, 0x36, 0xc8, 0x76, - 0x89, 0xaf, 0x3b, 0x70, 0xeb, 0xff, 0x4d, 0xf3, 0xc3, 0x8c, 0xe2, 0x68, - 0xea, 0x61, 0x1e, 0xd4, 0x0d, 0x51, 0xd7, 0xf6, 0x2e, 0x3a, 0xfd, 0x3a, - 0xef, 0x93, 0x1d, 0x5f, 0x0f, 0x10, 0x25, 0x77, 0xff, 0xdb, 0xc8, 0x63, - 0xe2, 0xc6, 0x14, 0xf2, 0x4e, 0x75, 0x42, 0x31, 0x31, 0x39, 0x09, 0x2f, - 0xdc, 0xf8, 0x3b, 0x19, 0x3a, 0xfb, 0xae, 0x08, 0x3a, 0xf7, 0x73, 0x87, - 0x54, 0x1f, 0x3b, 0x96, 0x6d, 0x10, 0x5f, 0xd3, 0xcd, 0x26, 0x17, 0x27, - 0x3a, 0xfc, 0xb4, 0x0e, 0x04, 0xeb, 0x4c, 0x75, 0xd0, 0xb3, 0xad, 0xe3, - 0xab, 0x86, 0x95, 0xc5, 0x68, 0x27, 0xad, 0xd3, 0x6b, 0xdc, 0x89, 0x8e, - 0xbd, 0xa7, 0xdc, 0xea, 0x73, 0x71, 0xe1, 0xcb, 0xa6, 0x73, 0xaf, 0xe7, - 0x66, 0x3d, 0x93, 0x9d, 0x7f, 0x27, 0x37, 0x90, 0xc1, 0xd7, 0xf8, 0x3d, - 0x8d, 0xe5, 0x9e, 0x3a, 0xba, 0x7b, 0xfe, 0x2c, 0xa6, 0x21, 0x3e, 0xf8, - 0x35, 0xc7, 0xc4, 0x5a, 0x59, 0x00, 0x8b, 0x7f, 0x08, 0xcb, 0xfc, 0xce, - 0x48, 0x7f, 0x7d, 0x1d, 0x7e, 0xdd, 0x97, 0x10, 0x1d, 0x70, 0xa8, 0x75, - 0xb4, 0x86, 0xfb, 0xf2, 0x8b, 0xff, 0xfa, 0x16, 0x38, 0xdd, 0xfc, 0x2f, - 0xd5, 0xc6, 0x78, 0xeb, 0xff, 0xf4, 0x72, 0x1b, 0x8b, 0x86, 0xc9, 0x35, - 0xfa, 0xce, 0xa8, 0x4d, 0x12, 0x67, 0x1e, 0x93, 0xed, 0xac, 0x5f, 0xdc, - 0xc8, 0x52, 0x04, 0xeb, 0xc2, 0xeb, 0x3a, 0xe0, 0x41, 0xd7, 0x87, 0xec, - 0xe7, 0x54, 0x8f, 0xe1, 0x0a, 0xc4, 0x6b, 0xc2, 0xb4, 0xc4, 0x3f, 0x37, - 0xab, 0x16, 0xec, 0xc2, 0x8f, 0xc9, 0x87, 0xac, 0xc4, 0xbb, 0x79, 0xe3, - 0xaf, 0x94, 0x20, 0x83, 0x39, 0x5b, 0x94, 0xcd, 0x15, 0x25, 0x34, 0xb6, - 0x77, 0x97, 0x79, 0xc1, 0xc4, 0x94, 0xf1, 0x34, 0xa7, 0x4e, 0x4e, 0x21, - 0x2e, 0x5c, 0xb7, 0x69, 0xce, 0x6f, 0x2a, 0xfc, 0x11, 0xbd, 0xb0, 0x5a, - 0x46, 0x93, 0xa3, 0xa9, 0xd9, 0x6f, 0x52, 0x65, 0xff, 0x8d, 0x37, 0x64, - 0x3a, 0x59, 0x84, 0xa6, 0xdc, 0xa1, 0xff, 0xb1, 0xd8, 0x6d, 0x42, 0xe6, - 0xff, 0xfe, 0xfd, 0xaa, 0xef, 0xee, 0x46, 0x6e, 0xc2, 0x0b, 0xba, 0x87, - 0x52, 0xaa, 0xaf, 0x92, 0x52, 0xdd, 0xfc, 0xe9, 0xed, 0x20, 0x9d, 0x79, - 0x39, 0x87, 0x53, 0x19, 0xe2, 0x68, 0xaa, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, - 0x4e, 0xdd, 0x9b, 0x9d, 0x7f, 0xfb, 0xff, 0xc5, 0x06, 0x3a, 0x8b, 0xcd, - 0x1d, 0x65, 0x61, 0x16, 0xd8, 0x4b, 0xb9, 0x9a, 0xc5, 0xaf, 0xfe, 0x4e, - 0x2b, 0xb6, 0xf3, 0xfb, 0x4e, 0x03, 0xaf, 0xdc, 0x6b, 0xbb, 0x4d, 0x15, - 0x1d, 0xff, 0x9e, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0xd1, 0x7c, 0x31, - 0x9b, 0x9d, 0x58, 0x89, 0xd5, 0x99, 0xf9, 0x2a, 0xff, 0x7d, 0x7d, 0x8a, - 0xf9, 0x27, 0x3a, 0x95, 0x3e, 0x78, 0x2f, 0xbf, 0x71, 0xae, 0xed, 0x34, - 0x55, 0xf7, 0xf6, 0x6c, 0x81, 0xef, 0xe7, 0x5f, 0xc8, 0x10, 0xc7, 0x20, - 0xeb, 0xff, 0xfb, 0x70, 0x0f, 0xeb, 0xfa, 0x10, 0xc0, 0x17, 0x19, 0xe3, - 0xac, 0xae, 0x23, 0xab, 0x86, 0x7d, 0x2e, 0xfa, 0x57, 0x7e, 0xe3, 0x5d, - 0xda, 0x68, 0xad, 0xaf, 0xfa, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0x83, - 0x65, 0x70, 0xfe, 0x1c, 0xce, 0xff, 0xe5, 0x5e, 0x4a, 0xe7, 0x1a, 0xee, - 0xd3, 0x44, 0x87, 0x7f, 0xed, 0x2b, 0x9e, 0x40, 0xe0, 0xcc, 0x75, 0xe7, - 0x76, 0x9e, 0x30, 0x3a, 0x83, 0xe5, 0x69, 0xf5, 0xdd, 0x63, 0x3a, 0xff, - 0xd2, 0xec, 0x7b, 0x4c, 0x4e, 0x98, 0xb1, 0x3a, 0xff, 0xf3, 0x0e, 0x61, - 0xcc, 0x4f, 0x61, 0x62, 0xfd, 0x4e, 0x1d, 0x6d, 0xce, 0xb9, 0x04, 0xeb, - 0xfa, 0x03, 0x1e, 0x70, 0x9d, 0x41, 0x3d, 0x09, 0x84, 0x7c, 0x29, 0x7d, - 0xed, 0x26, 0xc3, 0xaf, 0xfe, 0x41, 0x9e, 0x14, 0xfa, 0x00, 0x46, 0xe7, - 0x5f, 0x60, 0x83, 0x47, 0x5f, 0x4f, 0xad, 0xd0, 0xea, 0xc3, 0xc3, 0xd1, - 0x05, 0xf9, 0xc3, 0xf6, 0x04, 0xeb, 0xff, 0x73, 0xdf, 0x45, 0xdb, 0x82, - 0xd3, 0xaf, 0x9a, 0xee, 0xd3, 0x45, 0x89, 0x7b, 0xf1, 0x91, 0xd7, 0xf9, - 0xb1, 0x9c, 0x00, 0x3c, 0x75, 0x4e, 0x8e, 0x0c, 0x27, 0xe1, 0xf7, 0x8b, - 0x7f, 0x1c, 0xbf, 0x67, 0x20, 0x54, 0x3a, 0xfd, 0xf7, 0x6f, 0x39, 0x07, - 0x5e, 0xd4, 0x09, 0xd6, 0xec, 0x1e, 0x2a, 0x15, 0xdf, 0xfd, 0x19, 0xac, - 0x10, 0xa0, 0x20, 0x4e, 0xbc, 0x31, 0x39, 0xd4, 0x27, 0xb5, 0xf9, 0xfd, - 0xf4, 0x72, 0x16, 0x75, 0x48, 0xf0, 0xb4, 0x45, 0x79, 0x6f, 0xe3, 0xae, - 0x40, 0x1d, 0x5c, 0x36, 0x1b, 0x63, 0x77, 0xe4, 0xd9, 0xfb, 0xe8, 0xeb, - 0xfe, 0x0f, 0x71, 0x78, 0xfc, 0x9c, 0xeb, 0xf7, 0xbc, 0xf2, 0xd1, 0xd7, - 0xfe, 0xff, 0x37, 0x0e, 0xce, 0xe3, 0xcc, 0x75, 0x6e, 0x7d, 0x3b, 0x09, - 0xed, 0x23, 0xaf, 0xb3, 0x19, 0xd1, 0xd5, 0x06, 0xc7, 0xc2, 0x17, 0x7e, - 0x27, 0x54, 0x26, 0x5b, 0x90, 0xa1, 0xe2, 0xb6, 0x88, 0x2f, 0xfa, 0x35, - 0xf7, 0x39, 0x99, 0x31, 0xd7, 0xf7, 0x24, 0x0c, 0xc9, 0x8e, 0xbe, 0x78, - 0x4d, 0xb3, 0xab, 0x0f, 0x3f, 0x85, 0xb7, 0xd2, 0xfb, 0xd8, 0x3a, 0xf7, - 0x22, 0x47, 0x53, 0x9b, 0xed, 0x84, 0x77, 0xf4, 0x2f, 0x13, 0x93, 0x1d, - 0x7d, 0xf6, 0x36, 0xb4, 0x75, 0xfb, 0x03, 0xd8, 0xe9, 0xd7, 0xdc, 0x46, - 0x58, 0xce, 0xa1, 0x3c, 0xbd, 0x13, 0x50, 0x51, 0x25, 0xa7, 0x1a, 0x84, - 0xd8, 0x91, 0x7f, 0xa4, 0x4f, 0x0b, 0xeb, 0xf9, 0x05, 0xd7, 0x1d, 0x3a, - 0xff, 0xf4, 0x2e, 0x24, 0x11, 0x8e, 0xbe, 0x70, 0xea, 0x3a, 0xa4, 0x7a, - 0x1b, 0x68, 0xd7, 0xbd, 0x80, 0x3a, 0xfe, 0x5a, 0x6b, 0x48, 0x13, 0xaf, - 0x3f, 0x14, 0x3a, 0xbf, 0x3c, 0x86, 0x4b, 0x2f, 0xf3, 0x47, 0x36, 0x0e, - 0x68, 0xeb, 0xfe, 0xde, 0x4f, 0x83, 0x9e, 0xd1, 0xd7, 0xfe, 0xcd, 0xe5, - 0xd8, 0xd2, 0x9d, 0x83, 0xaa, 0x49, 0xe7, 0x6e, 0xf5, 0x31, 0x2f, 0x18, - 0xfa, 0x48, 0x26, 0x5b, 0x46, 0xf6, 0xdb, 0x3a, 0xe9, 0x68, 0xeb, 0x3c, - 0x8d, 0x4e, 0xe2, 0x77, 0xde, 0x41, 0x64, 0xab, 0x7e, 0x75, 0xa3, 0x0d, - 0x97, 0x48, 0x6f, 0xf9, 0xc7, 0xda, 0xdf, 0x4e, 0xc6, 0x75, 0x3a, 0x2e, - 0x40, 0xb3, 0xf9, 0x2d, 0xfd, 0xd4, 0xd7, 0x39, 0x87, 0x5f, 0xf9, 0x33, - 0xda, 0xe6, 0x6a, 0x37, 0x3a, 0xff, 0xd0, 0xcf, 0xd9, 0xf5, 0x8b, 0x86, - 0x33, 0xae, 0x76, 0x4e, 0xb6, 0x35, 0x18, 0x7d, 0x2c, 0xf1, 0xee, 0xc4, - 0x4b, 0xff, 0xba, 0xe9, 0xe9, 0x62, 0x83, 0x80, 0x3a, 0xfc, 0x33, 0x47, - 0x60, 0xeb, 0xf0, 0x1f, 0x66, 0x04, 0xeb, 0xf6, 0x77, 0x77, 0x63, 0x3a, - 0xf8, 0x1a, 0x81, 0x3a, 0xff, 0x73, 0xae, 0x9a, 0x4d, 0x87, 0x54, 0x1e, - 0x9e, 0x10, 0x5f, 0xfd, 0xdc, 0x11, 0x7f, 0x7c, 0x94, 0x2c, 0xea, 0x44, - 0xdc, 0x1d, 0x08, 0x04, 0xc2, 0x51, 0xa7, 0xdf, 0x10, 0x5f, 0xcc, 0xc7, - 0x38, 0xf3, 0x1d, 0x7f, 0xc1, 0x86, 0xfd, 0x00, 0x23, 0x73, 0xaf, 0xf9, - 0xf9, 0x8b, 0x4d, 0xb8, 0x59, 0xd4, 0xd3, 0xf4, 0xfc, 0xee, 0xfb, 0xd1, - 0xbc, 0x8e, 0xbf, 0x90, 0x1b, 0x62, 0x80, 0x3a, 0xa7, 0x3d, 0x0e, 0x11, - 0x54, 0x26, 0x71, 0x90, 0xa2, 0x77, 0x3b, 0xfb, 0x67, 0x1e, 0x13, 0x6c, - 0xeb, 0x61, 0xd4, 0xb3, 0x7e, 0x26, 0x17, 0xe7, 0x9f, 0xd8, 0xd3, 0xaf, - 0xfd, 0xdc, 0x08, 0x53, 0x7c, 0xdf, 0xc7, 0x5f, 0xdf, 0x03, 0xf5, 0xf9, - 0xc3, 0xaa, 0x73, 0xf0, 0x09, 0xfd, 0xf3, 0xc2, 0x6d, 0x9d, 0x7f, 0xec, - 0x0f, 0xcc, 0xd4, 0x67, 0x00, 0x75, 0xff, 0x42, 0x07, 0xc2, 0xfb, 0xe8, - 0xea, 0x84, 0x5d, 0x04, 0x8f, 0xa4, 0x42, 0x7d, 0x4c, 0x4b, 0x64, 0x04, - 0xc5, 0x8c, 0xb1, 0x54, 0x88, 0x85, 0x4c, 0xe6, 0x12, 0x23, 0x0c, 0x22, - 0xb2, 0x30, 0x15, 0x12, 0xda, 0xd7, 0xbc, 0x30, 0x91, 0x4a, 0x62, 0x4e, - 0x46, 0xac, 0xb4, 0x1e, 0xc7, 0xd4, 0xf2, 0x83, 0x81, 0x1a, 0x58, 0xc3, - 0xcf, 0x51, 0xda, 0x7a, 0x38, 0xdf, 0xdc, 0xb6, 0xc8, 0x3e, 0xc6, 0xa3, - 0x7e, 0xda, 0x76, 0xc7, 0x0e, 0xbf, 0xf2, 0x47, 0xba, 0xea, 0x60, 0x80, - 0xeb, 0xff, 0xcf, 0xcf, 0x8f, 0xef, 0x9e, 0xdd, 0xa8, 0x27, 0x57, 0x51, - 0x13, 0xb0, 0xf2, 0xfe, 0xcf, 0x42, 0x2f, 0x47, 0x5f, 0xe0, 0xc4, 0xb3, - 0x99, 0xa3, 0xaf, 0x6b, 0xee, 0x8e, 0xbf, 0xfe, 0xcd, 0xe5, 0xef, 0xe7, - 0x57, 0xae, 0xb4, 0xd1, 0xd7, 0xfd, 0xfb, 0xe0, 0x53, 0x71, 0x73, 0xaf, - 0x78, 0x60, 0xeb, 0xba, 0xac, 0x27, 0xeb, 0x90, 0xb2, 0x98, 0x95, 0x65, - 0x6e, 0x62, 0x23, 0xda, 0x53, 0xfa, 0x6f, 0x4a, 0xae, 0x0c, 0x44, 0xb9, - 0x5b, 0xfb, 0x38, 0xd7, 0x76, 0x9a, 0x2c, 0xdb, 0xff, 0x47, 0x01, 0xed, - 0x77, 0x10, 0x27, 0x5f, 0x20, 0xbc, 0xe7, 0x57, 0x4f, 0x77, 0x47, 0xb7, - 0xca, 0xf6, 0x3a, 0x75, 0x2a, 0x78, 0x9b, 0x44, 0x54, 0xaa, 0x3f, 0xde, - 0x1b, 0x37, 0xc8, 0xbf, 0xbc, 0x3a, 0xf9, 0x07, 0x9f, 0x9d, 0x72, 0xd5, - 0x83, 0xc4, 0x98, 0x8e, 0xec, 0x09, 0xd7, 0xfe, 0x79, 0x2b, 0x9c, 0x6b, - 0xbb, 0x4d, 0x14, 0x05, 0xfe, 0x45, 0xc3, 0x1f, 0x72, 0x73, 0xac, 0xae, - 0x22, 0x51, 0x62, 0xbd, 0x4a, 0xbe, 0x7e, 0x6f, 0x23, 0xaf, 0xde, 0xd4, - 0x90, 0x07, 0x56, 0x1e, 0x4b, 0x91, 0x5f, 0xd2, 0x57, 0x26, 0x89, 0x1d, - 0x4a, 0x9e, 0x74, 0x10, 0x5d, 0xff, 0x4e, 0xbf, 0xb5, 0x0b, 0x18, 0x98, - 0xeb, 0x74, 0xeb, 0xdf, 0x46, 0x63, 0xae, 0xcf, 0x61, 0xae, 0x00, 0x85, - 0x01, 0x10, 0xa2, 0xb5, 0x77, 0xcd, 0x1d, 0x7b, 0xf0, 0xe1, 0xd7, 0xfb, - 0x39, 0xe1, 0x85, 0xe8, 0xeb, 0x6d, 0x9d, 0x48, 0x7c, 0x1d, 0x1c, 0x01, - 0x8d, 0xf3, 0x5d, 0xda, 0x68, 0xb7, 0xef, 0x6d, 0xbf, 0x8e, 0xbf, 0xbe, - 0xf9, 0xda, 0xfc, 0x3a, 0xb8, 0x7f, 0x2b, 0x2d, 0x00, 0xf5, 0xf6, 0x0a, - 0x4c, 0x75, 0xee, 0xc7, 0x0e, 0xbf, 0x75, 0x39, 0xd7, 0x3a, 0xff, 0xf7, - 0x62, 0x7f, 0x67, 0x47, 0x3d, 0xd4, 0x3a, 0xf2, 0xf0, 0x27, 0x59, 0x67, - 0x5f, 0xf7, 0x62, 0x70, 0xe3, 0x3a, 0x56, 0x11, 0x69, 0x83, 0x73, 0x13, - 0x3a, 0x47, 0xd1, 0xbb, 0xf7, 0xa5, 0xaf, 0xba, 0x3a, 0xf6, 0xba, 0x13, - 0xaf, 0xdf, 0x7c, 0x30, 0x03, 0xa9, 0x67, 0x89, 0xb0, 0x72, 0xff, 0xef, - 0x69, 0x35, 0x03, 0x9e, 0xea, 0x1d, 0x78, 0x73, 0xa7, 0x52, 0xcf, 0x6f, - 0x62, 0x0d, 0xf8, 0x30, 0xc7, 0xfa, 0xce, 0xbf, 0xe7, 0xd4, 0x60, 0x87, - 0xb0, 0x75, 0xff, 0xd8, 0xbe, 0x66, 0xfd, 0x17, 0x63, 0x9c, 0xeb, 0xb5, - 0xae, 0x1f, 0xe0, 0x9a, 0xd4, 0x26, 0xef, 0x8f, 0xe8, 0x48, 0xf0, 0xa7, - 0xbe, 0x74, 0x1f, 0x1d, 0x7b, 0x91, 0xe3, 0xaf, 0xe9, 0x9c, 0x3d, 0x45, - 0x9d, 0x7f, 0x79, 0x30, 0x30, 0xb3, 0xab, 0xc7, 0xb0, 0xc9, 0x6d, 0xda, - 0x13, 0xaf, 0xed, 0xf5, 0x0d, 0xc5, 0x9d, 0x5c, 0x46, 0xc3, 0xb9, 0xe8, - 0x8f, 0xf1, 0x5b, 0xee, 0xa8, 0x15, 0x9d, 0x76, 0x48, 0xea, 0xc3, 0x70, - 0x24, 0x74, 0xc5, 0xaf, 0x85, 0x44, 0x27, 0x24, 0x44, 0x17, 0x8c, 0x85, - 0x3a, 0x17, 0xcd, 0x0d, 0x4e, 0x3d, 0xf6, 0x3e, 0x50, 0x1f, 0x8c, 0x3d, - 0xfc, 0xeb, 0x7f, 0x3e, 0xea, 0xad, 0xfc, 0x75, 0x2a, 0x8f, 0x21, 0x86, - 0x25, 0xfc, 0x15, 0x75, 0xed, 0x6e, 0x75, 0xcc, 0x43, 0x16, 0x75, 0xe5, - 0xbe, 0xe7, 0x5d, 0xb1, 0x0e, 0xbe, 0xe7, 0x33, 0xe9, 0xd7, 0xed, 0x4f, - 0x8c, 0xaa, 0xc4, 0x9f, 0xb4, 0x10, 0x4c, 0x38, 0xe2, 0xf5, 0x09, 0x83, - 0x24, 0x29, 0xaf, 0xff, 0xf9, 0x82, 0x9e, 0xfd, 0xe7, 0x57, 0x25, 0xd8, - 0xe6, 0x60, 0xa8, 0x75, 0xff, 0xff, 0xe4, 0x6b, 0xf1, 0xfb, 0x2c, 0xf6, - 0x07, 0x4e, 0xbc, 0xe4, 0xf1, 0xb9, 0xd7, 0xee, 0x35, 0xdd, 0xa6, 0x8a, - 0x52, 0xff, 0xf9, 0xfc, 0x39, 0x3f, 0x23, 0xa9, 0xdc, 0xe1, 0xd7, 0x9e, - 0x4a, 0xc2, 0x3d, 0xb1, 0xd8, 0x06, 0x77, 0xfd, 0x25, 0x73, 0x8d, 0x77, - 0x69, 0xa2, 0x4e, 0xb2, 0xab, 0x44, 0x2b, 0xa0, 0x54, 0x42, 0x68, 0x82, - 0x79, 0xc7, 0xe9, 0x47, 0x1a, 0x1b, 0xe9, 0xd5, 0xc8, 0xc9, 0x94, 0x43, - 0x6c, 0x69, 0x89, 0x18, 0x63, 0x1c, 0x2f, 0x66, 0x27, 0xe4, 0x2d, 0x97, - 0x5b, 0x1d, 0xf6, 0x32, 0xc7, 0x6c, 0x04, 0x30, 0xc6, 0x19, 0xba, 0xa4, - 0x0f, 0x7a, 0x32, 0xef, 0xc9, 0xf6, 0x47, 0xcd, 0x7e, 0xe3, 0x5d, 0xda, - 0x68, 0x87, 0xef, 0xfc, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x25, 0x3b, - 0x2b, 0x87, 0xfa, 0xb3, 0x3b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x44, - 0xf7, 0xf4, 0xc9, 0xed, 0x7e, 0xb3, 0xaf, 0xff, 0x30, 0xca, 0x32, 0xc7, - 0x38, 0x58, 0x5f, 0x3e, 0x77, 0x6c, 0xeb, 0xf7, 0x1a, 0xee, 0xd3, 0x44, - 0x63, 0x7d, 0x0b, 0x68, 0x0e, 0xbf, 0xfe, 0x94, 0xec, 0x34, 0x31, 0x73, - 0xb7, 0x9f, 0x3e, 0x77, 0x6c, 0xea, 0xea, 0x21, 0x40, 0x43, 0x7c, 0x9b, - 0xc9, 0x8b, 0x3a, 0xca, 0xc2, 0x72, 0x72, 0x2f, 0xc6, 0x2e, 0xc2, 0xe3, - 0xc4, 0x77, 0xff, 0x95, 0x5b, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x9e, - 0x6f, 0xe5, 0x41, 0x03, 0x2d, 0x1d, 0x50, 0xab, 0x4e, 0x72, 0x89, 0x47, - 0xa5, 0xd5, 0x5f, 0x2b, 0xdf, 0xb8, 0xd7, 0x76, 0x9a, 0x22, 0x0b, 0xff, - 0x3c, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x52, 0xfe, 0xe7, 0xfd, 0x81, - 0x69, 0xd7, 0xf3, 0x53, 0x36, 0xbb, 0x07, 0x54, 0x1e, 0xde, 0x16, 0xd9, - 0x5c, 0x47, 0xc2, 0xcc, 0xc6, 0x14, 0xb7, 0xee, 0x35, 0xdd, 0xa6, 0x88, - 0xa2, 0xf4, 0x03, 0x0e, 0xb2, 0xb8, 0x79, 0xbf, 0x4c, 0xef, 0xf2, 0xb9, - 0xc6, 0xbb, 0xb4, 0xd1, 0x19, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x26, 0x5b, - 0xf4, 0xb3, 0xce, 0xd3, 0xaf, 0xca, 0xad, 0xe4, 0xae, 0x1e, 0xce, 0xe6, - 0x77, 0xee, 0x35, 0xdd, 0xa6, 0x8a, 0x92, 0xc2, 0x75, 0xbe, 0x9d, 0x65, - 0x70, 0xf5, 0x18, 0xcc, 0xff, 0x0f, 0xbf, 0xca, 0xe7, 0x1a, 0xee, 0xd3, - 0x45, 0x75, 0x7f, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x8b, 0x16, 0xff, 0xe5, - 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xea, 0xff, 0x99, 0x55, 0xe1, - 0x36, 0xd3, 0x68, 0xeb, 0xff, 0xff, 0xc1, 0xc6, 0x55, 0x1c, 0x51, 0x47, - 0xf6, 0x90, 0x66, 0x86, 0xf3, 0x37, 0x3a, 0xff, 0xfd, 0x30, 0xc2, 0xd5, - 0xcd, 0x23, 0x21, 0x77, 0x50, 0xeb, 0xb5, 0xe3, 0xae, 0xd0, 0x0e, 0xbf, - 0x0b, 0xac, 0x60, 0xeb, 0xfb, 0xfd, 0x75, 0xe4, 0xab, 0x16, 0x7a, 0x0c, - 0x8b, 0x7d, 0x16, 0xbf, 0x67, 0xb4, 0x8b, 0x3a, 0xff, 0xf4, 0x6f, 0xec, - 0x99, 0x39, 0xed, 0x7e, 0xc6, 0x75, 0xe7, 0xdd, 0x51, 0x3f, 0x5f, 0x13, - 0x56, 0x27, 0x57, 0xc8, 0x53, 0x6a, 0x1a, 0x34, 0x15, 0x4b, 0xfe, 0x94, - 0x4b, 0x4a, 0xab, 0x19, 0x85, 0x04, 0x95, 0x3b, 0x7e, 0x4e, 0x8b, 0xcc, - 0x75, 0xfa, 0x58, 0x1f, 0x98, 0x75, 0x30, 0x0f, 0x3a, 0x09, 0xaf, 0xd9, - 0xe4, 0xff, 0x47, 0x5c, 0xc4, 0xb1, 0x53, 0xa9, 0x8a, 0x9e, 0x43, 0x0c, - 0x4f, 0x7e, 0x61, 0xcc, 0x4e, 0xb9, 0xe3, 0xaf, 0xf7, 0xd1, 0xce, 0x72, - 0x1a, 0x75, 0x31, 0x27, 0xcc, 0xc2, 0x33, 0xbe, 0xe2, 0xfd, 0xb9, 0xd7, - 0xf3, 0x12, 0xc4, 0x30, 0x22, 0x4b, 0x3a, 0xf3, 0x73, 0xa5, 0x5e, 0x5c, - 0x68, 0xeb, 0xc0, 0xe4, 0x1d, 0x7f, 0x60, 0x12, 0x64, 0x64, 0xeb, 0xff, - 0x3e, 0xbe, 0x6b, 0x59, 0x29, 0x41, 0xd7, 0xff, 0xe1, 0x75, 0x13, 0x91, - 0x29, 0x66, 0x80, 0x08, 0x3a, 0x82, 0x8b, 0xf5, 0x0b, 0x7a, 0x7f, 0x7f, - 0xff, 0x71, 0x36, 0x9d, 0x6a, 0xc7, 0x38, 0x9b, 0x4d, 0xfe, 0x73, 0xaf, - 0x93, 0xbf, 0x56, 0x75, 0xff, 0xe4, 0x53, 0xe6, 0x0b, 0xef, 0xa5, 0x14, - 0x73, 0xa9, 0xa7, 0xe0, 0x24, 0x77, 0xff, 0x9f, 0x43, 0x80, 0x57, 0xa8, - 0xd7, 0xe1, 0xd7, 0x0b, 0x27, 0x5f, 0xc1, 0xc5, 0x3d, 0x8d, 0x3a, 0xfb, - 0xb0, 0xb6, 0x9d, 0x50, 0x7c, 0x8e, 0x2d, 0xe2, 0xdb, 0xf0, 0x52, 0x64, - 0x64, 0xeb, 0xff, 0xbe, 0x44, 0x0c, 0x2f, 0xe7, 0xce, 0xed, 0x9d, 0x50, - 0x7e, 0x62, 0x51, 0x7f, 0xee, 0xe4, 0xdd, 0x4e, 0xc7, 0x20, 0xeb, 0x9f, - 0x73, 0xaf, 0xf3, 0xe9, 0xfb, 0xf8, 0xce, 0x75, 0x09, 0xe4, 0xfe, 0x2d, - 0x53, 0xae, 0x17, 0x48, 0x6d, 0x21, 0xb5, 0xc3, 0x15, 0xc3, 0x4f, 0xa4, - 0x23, 0x0a, 0xcf, 0x42, 0x83, 0xe9, 0x06, 0xd4, 0x21, 0xaf, 0x0b, 0xf8, - 0xeb, 0xc2, 0x9a, 0x3a, 0xcc, 0xb0, 0x0d, 0xa4, 0x0d, 0x5d, 0x1d, 0x3a, - 0xfb, 0x9b, 0x1d, 0x67, 0x5f, 0x96, 0x2f, 0xed, 0x1d, 0x7a, 0x33, 0x87, - 0x5f, 0xfe, 0x6b, 0xf1, 0xfc, 0x9a, 0x81, 0x80, 0x1d, 0x69, 0x74, 0xf8, - 0x3e, 0x8d, 0x56, 0xe8, 0xb0, 0xe4, 0x21, 0xab, 0x13, 0x3c, 0x69, 0x5a, - 0x0a, 0xff, 0x0d, 0x3b, 0xda, 0xda, 0xda, 0x3a, 0xff, 0xba, 0xfe, 0x89, - 0xb4, 0x8b, 0x3a, 0xff, 0x44, 0x87, 0x37, 0xf6, 0x1d, 0x7f, 0xfd, 0xed, - 0x07, 0x98, 0x8a, 0x75, 0x97, 0x19, 0xce, 0xbd, 0xdf, 0xd6, 0x75, 0x62, - 0x3e, 0x50, 0x8b, 0x87, 0x1a, 0x31, 0xfd, 0x46, 0xfe, 0xf6, 0xa6, 0x81, - 0x9c, 0xeb, 0xf0, 0xa8, 0x99, 0xa3, 0xaf, 0xcc, 0xbf, 0x9d, 0xa7, 0x5f, - 0xfd, 0x8c, 0xb8, 0x31, 0xbd, 0x70, 0x68, 0xeb, 0xff, 0x69, 0xf7, 0x81, - 0x70, 0xe2, 0x87, 0x52, 0x23, 0x37, 0xa4, 0xc2, 0x4f, 0xe4, 0x3b, 0xa3, - 0xa7, 0x58, 0x27, 0x52, 0xcd, 0x28, 0x8a, 0xdf, 0x08, 0x7e, 0x28, 0x75, - 0xfd, 0x9a, 0x65, 0xc6, 0x73, 0xab, 0x0f, 0xc5, 0xc8, 0x04, 0x92, 0xfd, - 0xfa, 0x9a, 0x0c, 0x1d, 0x79, 0x69, 0xa3, 0xaf, 0xfb, 0x05, 0xe5, 0xa9, - 0x33, 0x39, 0xd7, 0xd2, 0xd2, 0x09, 0xd6, 0x89, 0x1e, 0xce, 0xe7, 0x37, - 0xf9, 0xf9, 0x28, 0x6a, 0x34, 0xea, 0x85, 0x5d, 0xd9, 0x0f, 0xb4, 0x86, - 0x8f, 0x4b, 0x1c, 0xa4, 0x5d, 0x3f, 0x28, 0xbf, 0xfc, 0xa3, 0xe6, 0xfe, - 0xf4, 0x66, 0xc4, 0x69, 0xd7, 0xf8, 0x73, 0x5e, 0x77, 0x13, 0xa9, 0x43, - 0xfa, 0xd8, 0x97, 0x7f, 0xff, 0xe4, 0xe7, 0x23, 0xef, 0x90, 0x7f, 0x96, - 0x68, 0x3f, 0xbf, 0x24, 0x75, 0xff, 0xfc, 0x38, 0xa6, 0x0f, 0xcd, 0x7b, - 0xb8, 0xbf, 0xb0, 0x03, 0xaa, 0x11, 0x97, 0x8d, 0xd7, 0xfb, 0xf7, 0xd2, - 0x4c, 0x8c, 0x9d, 0x48, 0x9a, 0x2f, 0x61, 0xe0, 0x24, 0x37, 0xbb, 0x02, - 0x75, 0xed, 0xfc, 0xb3, 0xa9, 0xa6, 0xdd, 0xc6, 0xaf, 0xd3, 0x87, 0x88, - 0xc9, 0xd7, 0xfb, 0xeb, 0xec, 0x49, 0x91, 0x93, 0xaf, 0xfe, 0x41, 0xcf, - 0xf9, 0x3a, 0xe3, 0x3c, 0x75, 0x41, 0xfd, 0x04, 0xde, 0xfe, 0x0b, 0xf0, - 0x1b, 0x78, 0x75, 0xee, 0xfd, 0xd8, 0x75, 0xff, 0x42, 0xc7, 0x1b, 0xc4, - 0x01, 0xd5, 0x23, 0xd6, 0xd1, 0x05, 0xff, 0x44, 0xb1, 0x35, 0xaf, 0xe0, - 0xeb, 0xff, 0x7a, 0x17, 0xbb, 0x53, 0x7c, 0xe1, 0xd7, 0xee, 0xe7, 0x13, - 0x47, 0x5e, 0x14, 0x96, 0xe7, 0xcb, 0xe3, 0xfb, 0xff, 0x3e, 0x02, 0x05, - 0xc3, 0x8a, 0x1d, 0x53, 0xa6, 0x15, 0x28, 0x4e, 0x00, 0xce, 0xff, 0x3e, - 0xfa, 0xf7, 0xb1, 0x8c, 0xeb, 0xff, 0xc9, 0xce, 0xbe, 0x34, 0x39, 0xc0, - 0x21, 0xd7, 0xfd, 0x12, 0xd0, 0xc0, 0x1d, 0x67, 0x5f, 0xca, 0x7a, 0x30, - 0x5a, 0x75, 0xff, 0x4b, 0xef, 0x93, 0xa8, 0x3e, 0x3a, 0xff, 0xf4, 0x66, - 0xfe, 0xec, 0x78, 0x60, 0x1a, 0x3a, 0xe8, 0x01, 0xd7, 0x75, 0x67, 0x53, - 0x4d, 0x5e, 0x85, 0x69, 0x11, 0xf2, 0xe5, 0x9e, 0x39, 0xfd, 0xce, 0xf4, - 0xe9, 0xc3, 0xaf, 0xef, 0xf5, 0xed, 0x67, 0x8e, 0xbf, 0xbf, 0x60, 0xa4, - 0xc8, 0xc9, 0xd7, 0x67, 0x4e, 0xbc, 0xcb, 0x2c, 0x95, 0x7f, 0xfb, 0xc9, - 0xed, 0x75, 0x36, 0xfe, 0xf2, 0x24, 0x52, 0xa5, 0xfd, 0x28, 0x98, 0x7a, - 0x0e, 0x39, 0x77, 0x8c, 0xff, 0x34, 0xbf, 0xff, 0xe4, 0xf4, 0xa0, 0x73, - 0xdd, 0x4c, 0xf4, 0x2d, 0x39, 0x23, 0xaa, 0x4b, 0xdb, 0x61, 0x6b, 0xc2, - 0x06, 0xc2, 0x8d, 0x08, 0x66, 0x84, 0x2f, 0x23, 0x2c, 0x59, 0xbf, 0x4d, - 0x80, 0x8e, 0x31, 0x97, 0xfa, 0x34, 0xbd, 0x89, 0x77, 0xfd, 0xbc, 0xb5, - 0xac, 0x0b, 0xf8, 0xeb, 0x61, 0xd7, 0xdc, 0x17, 0xd8, 0x75, 0x41, 0xf5, - 0x28, 0x72, 0x81, 0xf7, 0x81, 0xac, 0x3a, 0xce, 0x75, 0xe8, 0xee, 0x8e, - 0xad, 0xcd, 0x52, 0x07, 0xdf, 0xff, 0xcf, 0xe4, 0xeb, 0xaf, 0xe6, 0x6a, - 0x33, 0x98, 0x27, 0x5f, 0xfd, 0xa7, 0xdf, 0x5a, 0xc1, 0x06, 0xde, 0x1d, - 0x7f, 0xf9, 0x1b, 0xa8, 0xdb, 0xcf, 0x4a, 0x59, 0xa3, 0xab, 0x89, 0x85, - 0x09, 0x0f, 0x96, 0x36, 0x23, 0x5f, 0x73, 0xb8, 0x27, 0x52, 0x1e, 0xfb, - 0x9f, 0xdf, 0x7a, 0x37, 0x64, 0xea, 0x6a, 0x7e, 0x3d, 0x8e, 0xb9, 0x92, - 0x0b, 0x99, 0xe9, 0xd7, 0xff, 0xa0, 0x5b, 0xf7, 0x8e, 0x04, 0xf7, 0x60, - 0xeb, 0xfc, 0x8c, 0xeb, 0x30, 0x67, 0x3a, 0xfa, 0x35, 0x1b, 0x0e, 0xbf, - 0xfa, 0x05, 0xfd, 0x28, 0x51, 0xd9, 0xf1, 0xd5, 0xd3, 0xe5, 0xfc, 0x8a, - 0xf7, 0xc7, 0x69, 0xd4, 0xd4, 0xcd, 0xc0, 0x2f, 0xa4, 0x9f, 0x42, 0x5f, - 0x68, 0x8e, 0xf9, 0x7f, 0x60, 0x4e, 0xbe, 0x40, 0xe2, 0xce, 0xbe, 0x77, - 0x10, 0x1d, 0x66, 0x60, 0xdf, 0xa8, 0x41, 0x77, 0xeb, 0x3a, 0xff, 0x32, - 0xf3, 0x64, 0xa1, 0x8c, 0xea, 0x43, 0xf5, 0xe9, 0x46, 0x85, 0xef, 0xf4, - 0x3f, 0x3a, 0xcb, 0x84, 0xab, 0x99, 0x64, 0xaa, 0x09, 0xe5, 0x32, 0x65, - 0x7b, 0xc8, 0xc6, 0x52, 0xa6, 0x8e, 0xfe, 0xdd, 0xa9, 0xae, 0xa1, 0xd7, - 0xdf, 0xcb, 0xff, 0x1d, 0x48, 0x9f, 0x8c, 0xd0, 0xd6, 0xd4, 0x26, 0xfc, - 0x5f, 0xb6, 0x5b, 0x7d, 0xcc, 0x76, 0x33, 0xae, 0x67, 0x47, 0x5b, 0x0e, - 0xb6, 0xf8, 0x69, 0xbc, 0x2f, 0x7d, 0xbc, 0x98, 0x1b, 0x9d, 0x7f, 0xf6, - 0xb4, 0x11, 0x80, 0xf6, 0x3d, 0xa3, 0xaa, 0x11, 0x25, 0x84, 0xff, 0x94, - 0x5f, 0xfb, 0xc9, 0xc7, 0x06, 0xd7, 0xb3, 0xa7, 0x5f, 0xf2, 0x32, 0x39, - 0xe4, 0xfc, 0x07, 0x5f, 0xe7, 0xe7, 0xb4, 0x28, 0xa1, 0xd7, 0xff, 0xb5, - 0x8a, 0x67, 0xfc, 0x70, 0xc7, 0x60, 0xea, 0x92, 0x64, 0x48, 0x5e, 0xc6, - 0x80, 0xe7, 0x1a, 0x32, 0xbf, 0xff, 0xfb, 0xae, 0x9e, 0x8e, 0x8e, 0x7b, - 0xa9, 0xf6, 0x51, 0xb1, 0x04, 0x07, 0x5e, 0xc4, 0xe1, 0xd7, 0xfa, 0x48, - 0xbe, 0xee, 0xec, 0x67, 0x5f, 0x3f, 0x22, 0x47, 0x5f, 0xf3, 0xef, 0xf3, - 0x7d, 0x60, 0xa8, 0x75, 0x4e, 0x8a, 0xcd, 0xc6, 0x96, 0x6d, 0xe2, 0x0b, - 0xee, 0xb1, 0xa2, 0xce, 0xbc, 0x30, 0x03, 0xaf, 0x42, 0xf3, 0xe1, 0xbe, - 0xd1, 0x25, 0xff, 0xa3, 0x7e, 0xc2, 0xdb, 0xd4, 0x98, 0xea, 0x85, 0x41, - 0x99, 0x18, 0xea, 0x3e, 0xf0, 0xce, 0xfe, 0x10, 0xeb, 0x48, 0xb3, 0xaf, + 0x61, 0xab, 0xfc, 0xeb, 0xfa, 0x37, 0x0f, 0x1e, 0x47, 0x5c, 0x10, 0x9d, + 0x7f, 0xcc, 0x8a, 0x69, 0x07, 0x79, 0x1d, 0x72, 0x4e, 0x75, 0xff, 0x7b, + 0xfe, 0x3e, 0x9f, 0x3a, 0x75, 0x04, 0xf3, 0x90, 0x5a, 0xb1, 0x17, 0xa8, + 0x2c, 0xf0, 0x86, 0xbf, 0xf9, 0xbc, 0x85, 0x20, 0x7c, 0xc3, 0x30, 0xcc, + 0x51, 0xd7, 0xf9, 0x3a, 0x3f, 0xba, 0x8d, 0x3a, 0xa1, 0x10, 0xd8, 0xa7, + 0x7f, 0xf0, 0x8c, 0x6f, 0xf7, 0x39, 0xac, 0x64, 0xeb, 0xfc, 0xd4, 0xd7, + 0x39, 0x12, 0x3a, 0xff, 0xfd, 0x80, 0xd2, 0x6e, 0xce, 0x36, 0x07, 0xf7, + 0x91, 0xd4, 0x88, 0xcc, 0xea, 0x28, 0x99, 0x5d, 0x9b, 0x95, 0x68, 0x2a, + 0xc0, 0xe1, 0xa5, 0x00, 0xb5, 0xfe, 0xf6, 0x70, 0x0b, 0x4d, 0x14, 0xa9, + 0xa7, 0xbf, 0xa5, 0xd4, 0xdb, 0x93, 0x1d, 0x50, 0x7e, 0x4e, 0x87, 0x7f, + 0x75, 0x1b, 0x0b, 0x43, 0xaf, 0xf4, 0x02, 0x77, 0x94, 0x31, 0x9d, 0x61, + 0x83, 0xe0, 0x12, 0xbb, 0x2a, 0xc5, 0x2f, 0x80, 0x30, 0xe1, 0x78, 0x84, + 0xc4, 0xe5, 0xd9, 0x0f, 0xc5, 0x08, 0x9a, 0xab, 0xb8, 0xd2, 0x24, 0xcc, + 0x5b, 0xd8, 0x75, 0x0c, 0x2e, 0x35, 0x0e, 0xdd, 0x98, 0x76, 0x7d, 0x84, + 0x05, 0xff, 0xff, 0xce, 0xb5, 0x53, 0x9c, 0xff, 0x9c, 0x81, 0xc5, 0x13, + 0xbd, 0xcf, 0xa7, 0x5f, 0xfe, 0x61, 0x94, 0x65, 0x8e, 0x70, 0xb0, 0xbe, + 0x7c, 0xee, 0xc9, 0xd7, 0xee, 0x35, 0xdd, 0xa6, 0x8a, 0x8a, 0xfb, 0xb9, + 0xcc, 0x3a, 0xf2, 0x4d, 0xb0, 0x75, 0x41, 0xbf, 0xe9, 0x05, 0xff, 0xf8, + 0x12, 0x9d, 0x86, 0x86, 0x2e, 0x76, 0xf3, 0xe7, 0xce, 0xec, 0x9d, 0x7f, + 0xfe, 0x79, 0x0c, 0x6b, 0x37, 0x68, 0xbe, 0x6e, 0xd3, 0xac, 0xac, 0x93, + 0xb1, 0xc6, 0x26, 0xb9, 0x74, 0x83, 0x6b, 0x55, 0xff, 0x83, 0x8b, 0x57, + 0x67, 0x05, 0x3c, 0x75, 0xec, 0x67, 0x0e, 0xbf, 0xd9, 0x93, 0x86, 0x30, + 0x27, 0x5e, 0xec, 0x04, 0xeb, 0xfd, 0x10, 0x82, 0x3f, 0xb1, 0x9d, 0x73, + 0xfe, 0x75, 0xf7, 0x53, 0xaa, 0xb0, 0x11, 0x60, 0xa0, 0xdc, 0xc6, 0x3d, + 0x1b, 0x64, 0xce, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x5e, 0xdf, 0x93, 0x61, + 0xbf, 0xce, 0x75, 0xd1, 0x23, 0xae, 0x80, 0x1d, 0x7f, 0x4f, 0xf7, 0x65, + 0xc4, 0x07, 0x5f, 0xf9, 0xc4, 0x19, 0xe8, 0x14, 0x01, 0xd5, 0x07, 0xd9, + 0xb2, 0x65, 0x65, 0x71, 0x31, 0x9e, 0x19, 0xb9, 0x60, 0x05, 0x7e, 0xc2, + 0x06, 0xff, 0xe5, 0x5e, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0x8d, 0x7f, + 0xf9, 0x55, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xe2, 0xff, 0xf2, + 0xab, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x13, 0xfd, 0xff, 0xe5, 0x56, + 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x28, 0x6b, 0xff, 0x96, 0xf2, 0x57, + 0x38, 0xd7, 0x76, 0x9a, 0x28, 0x8b, 0xff, 0x49, 0x5f, 0xf5, 0xf2, 0x35, + 0x12, 0x3a, 0x95, 0x44, 0x94, 0x28, 0x5f, 0xfa, 0x64, 0xee, 0xf9, 0xe0, + 0xe2, 0xce, 0xbf, 0xf0, 0xba, 0xbe, 0x1f, 0xde, 0x5a, 0x3a, 0xfd, 0xc6, + 0xbb, 0xb4, 0xd1, 0x48, 0xdf, 0xfd, 0xdd, 0xaf, 0xcd, 0x3f, 0x75, 0x13, + 0x9d, 0x7f, 0xf3, 0xef, 0xae, 0xb3, 0x00, 0xf9, 0xf5, 0x67, 0x5f, 0xf4, + 0x4a, 0x39, 0x3c, 0x72, 0x73, 0xaf, 0x3c, 0x95, 0xc4, 0x7e, 0x39, 0x98, + 0x11, 0x85, 0x2a, 0xfe, 0x96, 0x77, 0xaf, 0x23, 0xaf, 0xff, 0xec, 0x0f, + 0x63, 0xea, 0xbe, 0x17, 0x06, 0xb5, 0x00, 0x2a, 0xca, 0xc2, 0xa4, 0xd6, + 0x9f, 0xae, 0x33, 0xaf, 0x26, 0x6c, 0x96, 0x5f, 0x35, 0xdd, 0xa6, 0x89, + 0x42, 0xff, 0xd0, 0x05, 0xbc, 0xbb, 0x0f, 0xc3, 0xab, 0x87, 0xd2, 0x25, + 0xb7, 0xff, 0x85, 0xfd, 0xaf, 0xa3, 0xfc, 0x87, 0x16, 0x75, 0xf2, 0xaf, + 0x25, 0x70, 0xfa, 0xd6, 0x43, 0x53, 0xb6, 0x69, 0x52, 0x9f, 0x3f, 0x0c, + 0x61, 0x2d, 0x94, 0x4a, 0x8a, 0x6c, 0x70, 0xf0, 0xe4, 0x70, 0x4b, 0x57, + 0xea, 0x88, 0x15, 0xd8, 0x2a, 0xfa, 0x87, 0x4f, 0xf2, 0x9c, 0x36, 0x23, + 0x2f, 0xbf, 0xfc, 0xaa, 0xde, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0xe7, + 0x7f, 0xf9, 0x55, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x8a, 0x26, 0xff, + 0xbf, 0x7e, 0x49, 0x89, 0xed, 0x02, 0x1d, 0x7f, 0x26, 0xa6, 0x92, 0x00, + 0xeb, 0xfd, 0x13, 0xfd, 0xd9, 0x71, 0x01, 0xd7, 0xb9, 0x25, 0x42, 0x8a, + 0x5e, 0xa0, 0xfd, 0x2d, 0xae, 0x27, 0x31, 0xa5, 0x7f, 0xe1, 0xf9, 0x7e, + 0xe3, 0x5d, 0xda, 0x68, 0x87, 0x2f, 0xef, 0xdb, 0xc4, 0x81, 0x3a, 0xca, + 0xe1, 0xef, 0xf4, 0xce, 0xff, 0xa3, 0x98, 0xde, 0xc6, 0xf2, 0x3a, 0xf9, + 0xae, 0xed, 0x34, 0x45, 0xf7, 0xe1, 0x70, 0x3e, 0x8e, 0xbf, 0x64, 0xd2, + 0x7d, 0x1d, 0x5c, 0x3f, 0x9f, 0x16, 0xfd, 0x25, 0xbf, 0xda, 0xc0, 0xf7, + 0x00, 0xe7, 0x5c, 0x33, 0x9d, 0x7f, 0xde, 0x18, 0x5f, 0xd0, 0xf6, 0x0e, + 0xa8, 0x3c, 0xf4, 0x16, 0xbb, 0x5b, 0x9d, 0x7d, 0xe9, 0x42, 0x85, 0x52, + 0xcd, 0xcb, 0x8b, 0xdf, 0x9e, 0x7f, 0x67, 0x4e, 0xb2, 0xb3, 0xaa, 0x02, + 0xc8, 0x58, 0xcc, 0x63, 0xd8, 0x40, 0x0a, 0xce, 0xc9, 0x05, 0xff, 0xff, + 0xf0, 0xba, 0xb9, 0xfb, 0x05, 0x14, 0x4f, 0x77, 0x12, 0x5a, 0xf9, 0x8a, + 0x44, 0x8e, 0xbf, 0x66, 0x96, 0x18, 0x3a, 0xff, 0xcf, 0x25, 0x73, 0x8d, + 0x77, 0x69, 0xa2, 0x64, 0xb2, 0xad, 0x47, 0x9f, 0x21, 0x06, 0xb2, 0x6b, + 0xde, 0xc5, 0x9d, 0x77, 0x56, 0x75, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0xde, + 0xb2, 0xb0, 0x7c, 0x81, 0x1b, 0xc1, 0x6b, 0xff, 0xca, 0xad, 0xe4, 0xae, + 0x71, 0xae, 0xed, 0x34, 0x52, 0x77, 0x31, 0x0c, 0x59, 0xd7, 0xf6, 0x78, + 0x62, 0x16, 0x75, 0xfd, 0xb8, 0x3e, 0xf1, 0xc0, 0x75, 0xdd, 0x55, 0x80, + 0x7f, 0x5d, 0x20, 0x72, 0xaa, 0x85, 0xd6, 0xe9, 0x4a, 0x2a, 0xc8, 0xd8, + 0x35, 0x0a, 0x0d, 0xa6, 0x9f, 0x61, 0xa3, 0x7f, 0x95, 0xce, 0x35, 0xdd, + 0xa6, 0x88, 0x76, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x2c, 0x5f, 0x60, 0x16, + 0x87, 0x5f, 0x95, 0x5b, 0xc9, 0x5c, 0x3d, 0x3d, 0x93, 0x3b, 0xfc, 0xae, + 0x71, 0xae, 0xed, 0x34, 0x46, 0x17, 0xca, 0xcb, 0x34, 0x75, 0xff, 0xff, + 0x4b, 0x4a, 0xb7, 0xaf, 0x33, 0x7b, 0x9c, 0x62, 0xbb, 0x32, 0xf4, 0x75, + 0xfb, 0x3c, 0x08, 0x69, 0xd7, 0xff, 0xa3, 0xc8, 0x08, 0x90, 0x7b, 0x02, + 0xd3, 0xaf, 0xdc, 0x6b, 0xbb, 0x4d, 0x11, 0xed, 0xf6, 0x9f, 0x7d, 0xa7, + 0x5d, 0x25, 0x70, 0xf5, 0xfc, 0x67, 0x7f, 0xff, 0x3a, 0xa3, 0xfe, 0x77, + 0x04, 0x18, 0x3e, 0xee, 0x1d, 0x65, 0x77, 0x4e, 0xea, 0x67, 0x0e, 0x13, + 0x3c, 0x27, 0x84, 0xba, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x61, 0xdf, 0xe9, + 0x0c, 0x66, 0xb0, 0x4e, 0xb2, 0xb8, 0x7c, 0x5b, 0x99, 0xdf, 0xff, 0xfe, + 0x8e, 0x0c, 0x46, 0x95, 0xf0, 0x51, 0x7b, 0xcb, 0x5b, 0xcb, 0x39, 0x39, + 0xd7, 0xf9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0xb9, 0xef, 0xff, 0xff, 0xfe, + 0x86, 0x1f, 0x29, 0xdb, 0xdf, 0x9f, 0x3b, 0xb2, 0xac, 0xff, 0xa8, 0xc3, + 0xa1, 0x81, 0xbc, 0xf3, 0xb5, 0x7f, 0x3e, 0x77, 0x64, 0xea, 0x85, 0xd5, + 0x59, 0xe1, 0x25, 0x24, 0x36, 0x9f, 0xa4, 0x7b, 0x8b, 0x85, 0xcf, 0x4a, + 0x7c, 0xf5, 0xb0, 0x7f, 0x7f, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x88, 0x7a, + 0xf9, 0xae, 0xed, 0x34, 0x44, 0xd7, 0xf6, 0x6c, 0x7e, 0xbc, 0x09, 0xd7, + 0xfb, 0xdf, 0xbe, 0xfd, 0x8d, 0xa7, 0x57, 0x11, 0x26, 0x25, 0xbe, 0x30, + 0xbf, 0x03, 0x5f, 0x30, 0x27, 0x5f, 0xe4, 0x67, 0x07, 0x37, 0xf1, 0xd4, + 0x87, 0xb7, 0xc2, 0x9b, 0xff, 0xf4, 0x70, 0x1d, 0x8d, 0xb3, 0x44, 0x2f, + 0x58, 0x13, 0xaf, 0xfb, 0xbd, 0x8d, 0xb2, 0xce, 0x41, 0xd6, 0xf7, 0x51, + 0x1e, 0xea, 0xd7, 0xfc, 0x9e, 0x4f, 0x60, 0x23, 0x87, 0x56, 0x1e, 0xf3, + 0x94, 0x5e, 0xc0, 0xf4, 0xeb, 0xff, 0xfb, 0xdd, 0x8e, 0x03, 0x58, 0x1f, + 0x7e, 0xed, 0xce, 0x1d, 0x77, 0x96, 0x75, 0xff, 0xec, 0xef, 0xd9, 0xf5, + 0x09, 0xbf, 0xa1, 0x67, 0x5f, 0xfa, 0x78, 0x97, 0xdc, 0xe6, 0xb1, 0x93, + 0xab, 0x11, 0xfd, 0xba, 0xdf, 0x45, 0xbf, 0x4c, 0xbe, 0xf7, 0xef, 0xf4, + 0xd1, 0x0b, 0xdf, 0xbb, 0x93, 0xfe, 0x27, 0x5f, 0x3f, 0x23, 0x69, 0xd4, + 0x13, 0xca, 0x01, 0x45, 0xfa, 0x69, 0x63, 0x89, 0xd6, 0x57, 0x15, 0xe9, + 0x72, 0x11, 0x5d, 0x8c, 0x38, 0x48, 0x35, 0x18, 0xcf, 0xe7, 0xdb, 0x5e, + 0xf6, 0x48, 0xaf, 0xfd, 0xcf, 0xe7, 0xce, 0xcc, 0x30, 0x13, 0xae, 0xeb, + 0x9d, 0x6f, 0xce, 0xac, 0x34, 0xda, 0x15, 0xbc, 0x0d, 0x2b, 0x08, 0x86, + 0xf3, 0x35, 0xff, 0xf6, 0x24, 0xb4, 0xae, 0x6f, 0x27, 0x9f, 0xeb, 0x4e, + 0xa8, 0x44, 0x47, 0x4d, 0x6f, 0xcc, 0x56, 0x92, 0x76, 0x01, 0xd7, 0xf3, + 0x11, 0xf7, 0xbd, 0xc9, 0xce, 0xb7, 0x4e, 0xa6, 0x20, 0xf1, 0x7f, 0x35, + 0xbe, 0x0e, 0x0c, 0xc7, 0x5c, 0x9e, 0x3a, 0xde, 0x43, 0x6d, 0xd2, 0x1b, + 0xfd, 0xbf, 0xb7, 0x97, 0xe2, 0xa1, 0xd7, 0xfe, 0x89, 0x87, 0x36, 0xba, + 0xd6, 0x87, 0x53, 0x9f, 0xaf, 0xe6, 0xf7, 0xff, 0xff, 0x77, 0xf0, 0xa6, + 0x72, 0x61, 0xcd, 0xbd, 0xc0, 0xc6, 0xb5, 0x0a, 0x1d, 0x7f, 0xf9, 0x26, + 0x96, 0x6f, 0x2f, 0x8b, 0x77, 0x13, 0xae, 0x7d, 0x83, 0xac, 0xc0, 0xc4, + 0xe5, 0x14, 0x84, 0xdb, 0x48, 0xba, 0xe8, 0xe9, 0x77, 0x6c, 0xa8, 0x75, + 0xf3, 0xca, 0x00, 0x75, 0xfb, 0xaf, 0xe7, 0x91, 0xd7, 0xf2, 0x70, 0x73, + 0x38, 0x75, 0xfe, 0x96, 0xa3, 0x4c, 0x49, 0x88, 0x62, 0x0e, 0xbf, 0xf9, + 0x7f, 0x34, 0x39, 0xbc, 0x85, 0xe7, 0x3a, 0xf6, 0x90, 0x07, 0x56, 0x1f, + 0x0a, 0x23, 0x5e, 0x65, 0x96, 0x4a, 0xbf, 0x38, 0xfb, 0xb8, 0x52, 0xa5, + 0xfd, 0xf9, 0xfd, 0x36, 0x78, 0xea, 0x0a, 0x26, 0xc0, 0x7e, 0x26, 0xb7, + 0xee, 0x8b, 0x13, 0xd9, 0xd8, 0x3a, 0xe7, 0x73, 0xad, 0xd4, 0x3c, 0x77, + 0x33, 0xbf, 0xf8, 0x09, 0x37, 0xce, 0xc2, 0x73, 0xf6, 0x33, 0xaf, 0xee, + 0x26, 0xc7, 0x35, 0xa3, 0xaf, 0xe1, 0xff, 0xc9, 0x3c, 0x1d, 0x7f, 0xe4, + 0x52, 0x06, 0x35, 0x08, 0xb3, 0xaf, 0xec, 0xdb, 0xfc, 0xb3, 0x47, 0x5f, + 0x60, 0x72, 0x73, 0xaf, 0x98, 0xfe, 0x43, 0x14, 0x75, 0xdc, 0x83, 0xa8, + 0x2a, 0xef, 0x70, 0x81, 0xa4, 0xdb, 0x95, 0x24, 0x67, 0xec, 0x6e, 0xd3, + 0x13, 0x71, 0x29, 0x66, 0x1d, 0x2d, 0x13, 0xbf, 0x17, 0xed, 0x21, 0xd8, + 0x2b, 0xbf, 0x33, 0x18, 0x14, 0x3a, 0xf7, 0xfe, 0xd1, 0xd7, 0xff, 0xff, + 0xfd, 0xaf, 0x9d, 0xc9, 0xe1, 0x9d, 0xe5, 0xaf, 0x9f, 0xb7, 0x9c, 0x8f, + 0x93, 0x29, 0xbf, 0xcf, 0x9d, 0xd9, 0x3a, 0xb1, 0x1d, 0xcd, 0x26, 0xf0, + 0xed, 0xdf, 0x80, 0xeb, 0xb6, 0x58, 0x83, 0xaf, 0x7c, 0x93, 0x4e, 0xa8, + 0x3d, 0x35, 0x05, 0xd6, 0x3d, 0x7f, 0xff, 0x73, 0xe0, 0xe6, 0xdc, 0xe4, + 0xbe, 0x40, 0x5e, 0x6d, 0x1d, 0x7f, 0xff, 0xf0, 0xef, 0x0a, 0x0e, 0x07, + 0xa9, 0x37, 0xcd, 0x66, 0xf2, 0xe6, 0x32, 0x75, 0x62, 0x35, 0x85, 0x82, + 0xfb, 0xdf, 0xc4, 0xe7, 0x5f, 0xe9, 0x67, 0x71, 0x70, 0xd3, 0xa9, 0x0f, + 0x53, 0xc4, 0x77, 0xff, 0xf6, 0xf2, 0xd2, 0xf0, 0x7e, 0x6c, 0x27, 0x67, + 0x4c, 0xe1, 0xd6, 0x63, 0x3a, 0xb0, 0xfc, 0xda, 0xc1, 0x7f, 0xff, 0xe6, + 0x7e, 0x0e, 0x37, 0xa8, 0x39, 0xfe, 0xfe, 0xf8, 0xec, 0xe2, 0x87, 0x5f, + 0xe5, 0x03, 0xfc, 0x74, 0x60, 0xeb, 0xfd, 0xbc, 0xb4, 0xa7, 0xf1, 0xb9, + 0xd7, 0xf9, 0xd9, 0xfe, 0x68, 0xf3, 0x9d, 0x50, 0x98, 0x86, 0x39, 0x21, + 0x98, 0x9b, 0xdf, 0xfa, 0x34, 0x39, 0xb7, 0xe4, 0x97, 0x23, 0xaf, 0x81, + 0xe4, 0x9c, 0xeb, 0xfd, 0xee, 0xa0, 0x83, 0xea, 0xce, 0xbf, 0xd3, 0xc2, + 0xc6, 0x37, 0x01, 0xd6, 0x89, 0x1f, 0x3b, 0x9a, 0x5f, 0xfc, 0xfc, 0x97, + 0xcf, 0x0c, 0x4b, 0x3c, 0x75, 0x42, 0xba, 0x8c, 0x75, 0x48, 0x4a, 0x72, + 0x33, 0x1e, 0x9d, 0x3a, 0x08, 0xc2, 0x27, 0xf2, 0x6b, 0x31, 0x9d, 0x7f, + 0xfd, 0xc4, 0xfd, 0x83, 0x1f, 0x35, 0xf8, 0x17, 0x9e, 0x3a, 0xef, 0xe4, + 0x75, 0xfa, 0x01, 0xa9, 0xfc, 0x75, 0xe7, 0xf6, 0x8e, 0xbb, 0xf9, 0xce, + 0xa9, 0x1b, 0x3e, 0x0d, 0xdf, 0xb2, 0x5d, 0x79, 0x1d, 0x70, 0xfa, 0x63, + 0xc7, 0xe9, 0x0d, 0xfe, 0x71, 0xfb, 0xde, 0xc0, 0x4e, 0xbf, 0xbf, 0x6f, + 0xc0, 0xee, 0xc9, 0xd7, 0x72, 0x47, 0x54, 0x22, 0xab, 0x72, 0xe4, 0x33, + 0x59, 0x9d, 0xfe, 0xe4, 0x06, 0x3b, 0x12, 0x3a, 0xff, 0xfa, 0x3d, 0xf0, + 0x7f, 0xd8, 0xf9, 0x9e, 0xd9, 0xcf, 0x1d, 0x48, 0x88, 0xaf, 0xcc, 0x6f, + 0xfe, 0xec, 0x29, 0xf3, 0xc2, 0xfe, 0x8f, 0x1d, 0x7f, 0xbe, 0x6f, 0x24, + 0xef, 0xeb, 0x3a, 0x80, 0x7f, 0x82, 0x8b, 0x7f, 0xf6, 0x6d, 0xc0, 0xfc, + 0xf2, 0x88, 0xce, 0x8e, 0xbf, 0xf7, 0x26, 0xf9, 0xa8, 0x49, 0xdf, 0xc7, + 0x54, 0x22, 0xac, 0x24, 0x3f, 0xa4, 0xdc, 0xe0, 0x3a, 0xff, 0xfb, 0xe0, + 0xc6, 0xa2, 0x71, 0xc0, 0xf5, 0x26, 0x3a, 0xff, 0xff, 0xed, 0x70, 0x62, + 0x6f, 0x9f, 0x7c, 0x92, 0xcd, 0xfd, 0x9b, 0x47, 0x34, 0x75, 0x71, 0x18, + 0xe2, 0xa1, 0x5e, 0x47, 0xf7, 0xf0, 0xdc, 0xa3, 0xae, 0x9a, 0x47, 0x54, + 0x1a, 0x1e, 0x05, 0x5f, 0xfc, 0x3e, 0xd6, 0xd4, 0xf4, 0x60, 0xcc, 0x75, + 0xfb, 0x89, 0xa8, 0xdc, 0xea, 0xc3, 0xeb, 0x74, 0x4b, 0xfd, 0x3b, 0x02, + 0x69, 0x27, 0xb4, 0x75, 0xf8, 0x7d, 0xdc, 0xd8, 0x3a, 0xfd, 0x36, 0x9f, + 0x8a, 0x1d, 0x79, 0xd9, 0xe4, 0x1e, 0x96, 0x14, 0xd4, 0x91, 0xba, 0x84, + 0x1c, 0x84, 0x5d, 0xff, 0x75, 0x39, 0x37, 0x5f, 0x38, 0x75, 0xff, 0xff, + 0xfc, 0x0d, 0x0e, 0x3e, 0xff, 0x03, 0xdf, 0xfe, 0x0e, 0x6f, 0x2c, 0xfe, + 0x71, 0xc7, 0xdc, 0xea, 0x6a, 0x31, 0xd0, 0xe2, 0xf3, 0xbb, 0x4d, 0x14, + 0xc5, 0x61, 0xe4, 0xb4, 0x8a, 0xff, 0xd8, 0x3b, 0xcb, 0x5e, 0x8e, 0x4c, + 0x75, 0xec, 0x40, 0x1d, 0x6c, 0x3a, 0xf6, 0xe3, 0x80, 0x35, 0x3b, 0x46, + 0xa9, 0x11, 0x38, 0xed, 0x17, 0x4f, 0x31, 0xd7, 0x06, 0x63, 0xaf, 0xb9, + 0xd7, 0xf9, 0x06, 0xbd, 0x63, 0x17, 0xfb, 0xe6, 0xf2, 0x18, 0xcd, 0x1d, + 0x48, 0x7d, 0xae, 0x73, 0x7f, 0xfe, 0x02, 0x6b, 0xe7, 0x5f, 0x5e, 0x89, + 0xb5, 0xdc, 0x3a, 0xfe, 0x4e, 0xba, 0x4f, 0x07, 0x5e, 0x94, 0x6e, 0x75, + 0xfe, 0x58, 0x7b, 0x13, 0xe3, 0x27, 0x56, 0x1f, 0xde, 0xe5, 0x6e, 0x39, + 0x76, 0xb4, 0x75, 0xb0, 0xeb, 0xff, 0x4c, 0x8a, 0x27, 0x87, 0x36, 0x3e, + 0x70, 0xd2, 0xed, 0x16, 0xbf, 0xff, 0xc3, 0x8d, 0xf7, 0xa3, 0xda, 0x98, + 0x71, 0x9f, 0x90, 0xc5, 0x1d, 0x7f, 0xe6, 0xc2, 0xfb, 0x9a, 0xc4, 0x13, + 0xaa, 0x11, 0x45, 0xd6, 0x7b, 0xf7, 0x23, 0x6c, 0x70, 0xeb, 0xf9, 0xc7, + 0xe0, 0x60, 0x4e, 0xa8, 0x4d, 0xd3, 0x21, 0xfc, 0x84, 0x5f, 0x94, 0x53, + 0x16, 0xcc, 0x75, 0x81, 0x39, 0xd5, 0xe4, 0x2e, 0x18, 0xd3, 0x14, 0x86, + 0x33, 0x63, 0x4a, 0xde, 0x32, 0xe4, 0x4a, 0x9a, 0x36, 0x8e, 0x46, 0x88, + 0xb8, 0x5e, 0xf6, 0x17, 0xa0, 0x20, 0x18, 0x69, 0x7a, 0x3c, 0x7b, 0xfe, + 0xe3, 0xb3, 0xf1, 0xc2, 0xf3, 0x9d, 0x7f, 0x3b, 0x33, 0x0a, 0x04, 0xeb, + 0xff, 0xfc, 0x1c, 0x9d, 0xc7, 0xda, 0x86, 0xfc, 0x5a, 0xd0, 0x5a, 0x75, + 0xfc, 0x1d, 0x3c, 0x6f, 0x23, 0xaa, 0x11, 0x1c, 0xec, 0x37, 0xfd, 0x13, + 0x75, 0x21, 0x6e, 0x13, 0xa9, 0x44, 0xd3, 0xb8, 0x76, 0x30, 0xbb, 0xfc, + 0x86, 0xfb, 0x05, 0x46, 0x33, 0xaf, 0xff, 0xff, 0xdd, 0x4f, 0x77, 0x39, + 0x1b, 0x7e, 0x2f, 0xfd, 0x8f, 0x99, 0xbc, 0xb3, 0xf1, 0x06, 0x8e, 0xb7, + 0x91, 0x16, 0x5a, 0x24, 0xbf, 0xf4, 0x37, 0xe0, 0xbe, 0x97, 0x02, 0x75, + 0xff, 0xfb, 0x33, 0xa8, 0xde, 0xe7, 0xcd, 0x7f, 0xd8, 0x63, 0x3a, 0xff, + 0xfb, 0xdd, 0xc0, 0x7c, 0x5c, 0x67, 0x83, 0x82, 0x75, 0xfc, 0xe1, 0xe7, + 0x3f, 0x9c, 0xeb, 0xf4, 0x60, 0xfb, 0x64, 0xea, 0x69, 0xeb, 0xac, 0xbe, + 0xfb, 0xc9, 0xcc, 0x3a, 0xdb, 0xfc, 0x3c, 0x2c, 0x22, 0xb6, 0xb1, 0x31, + 0x27, 0x87, 0x45, 0x2d, 0x3d, 0x51, 0x3d, 0xf4, 0x6d, 0x77, 0xff, 0xff, + 0xe1, 0xcd, 0xe4, 0x9a, 0x1c, 0xdb, 0xdc, 0x9b, 0xb0, 0x33, 0x7c, 0x76, + 0xa6, 0xd3, 0xa9, 0x11, 0x7b, 0xf9, 0xb5, 0xff, 0xe4, 0x0f, 0xc5, 0xa7, + 0xc8, 0x0b, 0xcd, 0xa3, 0xae, 0x94, 0x8e, 0xb7, 0x20, 0xf8, 0xe7, 0x4d, + 0xbf, 0x4a, 0x37, 0x96, 0x8e, 0xbf, 0xff, 0xff, 0xf6, 0x0a, 0x9f, 0x13, + 0xbf, 0xab, 0x32, 0x7a, 0x16, 0x2e, 0xa7, 0x51, 0x5c, 0xee, 0xe0, 0x80, + 0x95, 0x7f, 0xff, 0xf3, 0x51, 0x90, 0xff, 0xcf, 0x9f, 0xc4, 0xfa, 0x6f, + 0x7f, 0xee, 0xee, 0xc9, 0xd7, 0x7f, 0x3e, 0xe9, 0xa1, 0xa1, 0x46, 0xa1, + 0x3f, 0x50, 0xb9, 0xdf, 0xd9, 0x57, 0x4f, 0x08, 0x61, 0x8d, 0xae, 0xff, + 0x3c, 0xb1, 0x6e, 0x20, 0x3a, 0xfb, 0x3b, 0x13, 0x1d, 0x79, 0x6d, 0xf9, + 0xd3, 0xd1, 0x73, 0x0b, 0xff, 0xff, 0xdc, 0x68, 0xe6, 0xdf, 0x9a, 0x4c, + 0x10, 0x7c, 0x1c, 0xda, 0x39, 0xad, 0xa7, 0x5f, 0xf3, 0x71, 0xd7, 0xf3, + 0x66, 0x16, 0x75, 0x62, 0x2e, 0x78, 0xfb, 0x7f, 0xfe, 0x41, 0xf7, 0x73, + 0x63, 0xd3, 0x63, 0x1b, 0x88, 0x0e, 0xbf, 0x43, 0x3f, 0x35, 0x31, 0xd7, + 0xfe, 0x19, 0xc7, 0x36, 0xeb, 0xf8, 0xdc, 0xeb, 0xff, 0x07, 0xb1, 0xbf, + 0xc6, 0x27, 0xb4, 0x08, 0x75, 0x42, 0x22, 0xa7, 0x41, 0xa4, 0x4d, 0x4f, + 0x44, 0x5e, 0x59, 0xfe, 0x16, 0xb7, 0xff, 0x33, 0x9a, 0xfe, 0x14, 0xd4, + 0x72, 0x63, 0xaf, 0xb9, 0x27, 0x09, 0xd7, 0xfe, 0x19, 0x37, 0xa9, 0xd1, + 0xfe, 0x73, 0xaf, 0x7b, 0x18, 0x27, 0x54, 0x1e, 0xf6, 0x1f, 0xde, 0xd9, + 0xce, 0x9d, 0x76, 0x04, 0xea, 0x9d, 0x5c, 0xec, 0xa5, 0x20, 0xe2, 0x1b, + 0xa3, 0xe9, 0xff, 0xc4, 0x1b, 0x47, 0xaf, 0xc9, 0xed, 0x60, 0x0e, 0xbf, + 0x77, 0x36, 0xa6, 0xd3, 0xaf, 0x26, 0x00, 0xeb, 0xf8, 0x30, 0x3d, 0x79, + 0x1d, 0x7a, 0x03, 0x07, 0x5f, 0xb3, 0xda, 0x79, 0xbe, 0x1e, 0x2a, 0xca, + 0xef, 0x98, 0xb6, 0x24, 0xc2, 0x62, 0xce, 0xbe, 0x47, 0x10, 0x9d, 0x66, + 0x7e, 0x1e, 0xa8, 0x4d, 0xaa, 0x48, 0xc1, 0x48, 0x4b, 0x5f, 0xff, 0xb9, + 0xff, 0x39, 0x03, 0x8a, 0x27, 0x7b, 0x9f, 0x4e, 0xbe, 0xfd, 0xf7, 0xf1, + 0xd5, 0x25, 0x42, 0x21, 0x26, 0x50, 0xaa, 0x68, 0xc8, 0x38, 0x4f, 0xd5, + 0x7a, 0x3a, 0xfe, 0xd3, 0x5a, 0xe2, 0xa1, 0xd4, 0xc3, 0x1b, 0x7f, 0x05, + 0x5f, 0xe1, 0xf9, 0xb7, 0x79, 0x6a, 0x63, 0xae, 0x9f, 0x73, 0xaf, 0xdd, + 0x76, 0x38, 0x01, 0xd4, 0x13, 0xfa, 0x73, 0x9d, 0x81, 0x8b, 0xfd, 0xc9, + 0x87, 0x3a, 0xfe, 0x3a, 0xa1, 0x30, 0x3c, 0x85, 0x02, 0x18, 0xdf, 0x93, + 0x81, 0xc1, 0x3a, 0xfc, 0x0c, 0xf7, 0xd9, 0xce, 0xbf, 0xcc, 0xfb, 0x3b, + 0xf3, 0x7d, 0x1d, 0x50, 0x7c, 0x2e, 0x55, 0x52, 0x46, 0xcf, 0x4c, 0xc6, + 0x10, 0xd7, 0xfd, 0xee, 0xe4, 0x9c, 0x73, 0x73, 0xaf, 0xff, 0xf8, 0x5c, + 0x1a, 0x9f, 0x10, 0x7c, 0x39, 0xb7, 0xe6, 0x99, 0x13, 0xa8, 0x51, 0x3f, + 0xe3, 0x7b, 0xd8, 0x93, 0x1d, 0x7f, 0xe4, 0xc9, 0xbe, 0x6a, 0x3a, 0xec, + 0x67, 0x5f, 0xf6, 0xf9, 0x1b, 0xcc, 0x30, 0xb3, 0xaf, 0xed, 0xf5, 0xdc, + 0x7e, 0x1d, 0x7f, 0xff, 0xe4, 0x5f, 0x13, 0x37, 0x1f, 0xfd, 0x1d, 0xf9, + 0xb5, 0x3d, 0x34, 0x1d, 0x4e, 0x89, 0xdf, 0x16, 0xd4, 0xe9, 0xaa, 0x84, + 0x6f, 0xa8, 0x5e, 0x86, 0xb5, 0xff, 0x67, 0x27, 0x84, 0xe6, 0x09, 0xd6, + 0x59, 0xdf, 0x0d, 0xb5, 0xe1, 0xc0, 0x9d, 0x50, 0x6f, 0x37, 0x22, 0xbf, + 0xb7, 0xd6, 0x60, 0xa8, 0x75, 0xf2, 0xfe, 0xc0, 0x0e, 0xbf, 0xfd, 0x38, + 0x78, 0xed, 0x1c, 0xdb, 0xc4, 0xd1, 0xd5, 0x88, 0x9b, 0x42, 0xdf, 0xc8, + 0xef, 0xf3, 0xfb, 0xaf, 0x37, 0xd5, 0x9d, 0x7b, 0xfd, 0xc0, 0x75, 0xfd, + 0xa8, 0xdc, 0x1c, 0x83, 0xaa, 0x15, 0xcc, 0x64, 0x6e, 0xe9, 0x0b, 0x6e, + 0x42, 0xf1, 0xcb, 0xc4, 0xd7, 0x43, 0xd7, 0xf7, 0x9f, 0xbf, 0x03, 0x07, + 0x5f, 0xfe, 0xf6, 0xbe, 0xeb, 0xe7, 0x86, 0x25, 0x9e, 0x3a, 0xff, 0x79, + 0x27, 0xce, 0xff, 0xe3, 0xaf, 0xbd, 0xa8, 0x50, 0xeb, 0x4c, 0x75, 0xfd, + 0x9f, 0xe7, 0x5b, 0x39, 0xd6, 0xde, 0x0d, 0xfe, 0x84, 0x6a, 0x11, 0x11, + 0x8c, 0x37, 0xf7, 0x5e, 0x4b, 0xe2, 0x1d, 0x7f, 0xf2, 0x8a, 0x3f, 0xb5, + 0xe1, 0x8d, 0xe4, 0x75, 0xfd, 0xe1, 0x89, 0x67, 0x8e, 0xa8, 0x3f, 0x19, + 0x23, 0x5c, 0x9a, 0x3a, 0xcb, 0x3a, 0xf7, 0x33, 0x73, 0xa8, 0x27, 0x83, + 0xd1, 0x50, 0x08, 0x5f, 0xfe, 0x75, 0x3c, 0xa4, 0x0c, 0xb3, 0xa8, 0xb3, + 0xaf, 0xc9, 0xad, 0x42, 0xce, 0xa4, 0x44, 0xf0, 0x97, 0xed, 0x49, 0xa8, + 0x56, 0x4b, 0x85, 0xca, 0x26, 0xa4, 0x2f, 0x00, 0x42, 0x30, 0x9d, 0xfe, + 0x30, 0x0b, 0xf0, 0x50, 0x5c, 0x27, 0x5f, 0xff, 0xa5, 0xdc, 0x9b, 0xb0, + 0x2a, 0x0e, 0x7b, 0xbf, 0x9d, 0x48, 0x7f, 0x7c, 0x25, 0xbf, 0xff, 0xc9, + 0x9b, 0xcb, 0x5e, 0xec, 0x2e, 0x10, 0x3f, 0x21, 0x8a, 0x3a, 0xff, 0x38, + 0xfc, 0x6e, 0x80, 0x13, 0xaf, 0xfd, 0xfe, 0xbe, 0x2f, 0xef, 0x5f, 0xb0, + 0x75, 0xfb, 0x3d, 0xfe, 0x6e, 0x75, 0xe5, 0x33, 0x73, 0xae, 0x89, 0xbe, + 0x1e, 0x2f, 0x8a, 0x28, 0x51, 0x71, 0xfc, 0x22, 0x2f, 0xff, 0xff, 0xdf, + 0x8f, 0xc6, 0x5f, 0x79, 0x71, 0xc1, 0xf3, 0x5f, 0xc6, 0xfd, 0xc4, 0x1c, + 0x50, 0xeb, 0xff, 0xf7, 0xfc, 0xe6, 0x7b, 0x5d, 0x4c, 0xf9, 0xd0, 0x41, + 0xd5, 0x88, 0xe1, 0xec, 0x22, 0xaf, 0xd8, 0x2d, 0xfa, 0xb3, 0xaf, 0xfe, + 0xee, 0x40, 0xcc, 0x39, 0xed, 0x39, 0xd6, 0x97, 0x8f, 0xa7, 0x60, 0xa2, + 0xff, 0xfc, 0x1c, 0x5f, 0xcd, 0x8f, 0x46, 0xa6, 0x93, 0xf2, 0x73, 0xaf, + 0xff, 0xef, 0x24, 0xf8, 0x1f, 0x8b, 0x79, 0x71, 0x27, 0x75, 0x9d, 0x7f, + 0xa7, 0x75, 0x8c, 0x72, 0x63, 0xaf, 0xfb, 0x7c, 0x50, 0x0b, 0xcf, 0x9c, + 0xc4, 0x48, 0x22, 0xed, 0xff, 0x60, 0xcf, 0xf0, 0x0e, 0xf3, 0x1d, 0x7f, + 0xfd, 0x9f, 0xf3, 0xe4, 0xdd, 0xfd, 0x44, 0xc1, 0x50, 0xeb, 0xfe, 0xe4, + 0xf1, 0x3c, 0xff, 0xf2, 0x73, 0xaf, 0xfd, 0xf2, 0x6e, 0xfe, 0xa2, 0x60, + 0xa8, 0x75, 0xfe, 0x1f, 0x9a, 0xff, 0x67, 0xfe, 0x1d, 0x58, 0x7f, 0xbf, + 0xa1, 0xd4, 0x23, 0x77, 0x50, 0xbb, 0xbf, 0xfd, 0x3f, 0xcd, 0x77, 0xff, + 0x9e, 0xd6, 0xa3, 0x87, 0x5f, 0xff, 0x76, 0x27, 0xf8, 0x39, 0xb5, 0xfb, + 0xd8, 0xdc, 0xeb, 0xff, 0xfe, 0xdf, 0x49, 0x8c, 0xfc, 0xee, 0x7b, 0x59, + 0x3f, 0xcc, 0x40, 0x9d, 0x41, 0x45, 0xf6, 0x29, 0xdf, 0xd3, 0xfa, 0x61, + 0x85, 0x9d, 0x7f, 0xff, 0x64, 0xf8, 0x81, 0x1f, 0xfb, 0xf2, 0x02, 0xf3, + 0x68, 0xea, 0xc4, 0xef, 0x12, 0x30, 0xf7, 0x22, 0xd1, 0x75, 0x4e, 0xbf, + 0xca, 0x16, 0x65, 0x21, 0xd8, 0xd8, 0xc2, 0x77, 0x84, 0x82, 0x15, 0xf2, + 0x1d, 0x8b, 0x53, 0xe9, 0xd6, 0xa3, 0x32, 0xf4, 0x7c, 0x77, 0xfb, 0xc3, + 0x9e, 0xee, 0x4e, 0x75, 0xff, 0x9f, 0x9d, 0xcf, 0x40, 0xa0, 0x0e, 0xbf, + 0xfe, 0x1c, 0x9f, 0xe0, 0x3f, 0xf6, 0x62, 0xc0, 0xc9, 0xd7, 0xd2, 0xf2, + 0x4e, 0x75, 0xff, 0x63, 0x3b, 0xcb, 0x5f, 0x3c, 0x87, 0x5f, 0xfa, 0x51, + 0x80, 0xee, 0x60, 0xb4, 0xeb, 0xff, 0xdd, 0x41, 0x0f, 0xcf, 0xad, 0x1c, + 0xee, 0x1d, 0x58, 0x88, 0x69, 0x8e, 0xef, 0xfb, 0xa8, 0xb8, 0xc1, 0xf6, + 0x8e, 0xbf, 0xff, 0xdf, 0xfb, 0x9f, 0xcd, 0xf3, 0xd3, 0x77, 0xf0, 0x79, + 0x33, 0x60, 0xeb, 0xe8, 0x6c, 0x2f, 0xe2, 0x31, 0x5a, 0x46, 0x26, 0xd5, + 0x0a, 0xac, 0x1a, 0x65, 0xc3, 0xb7, 0x53, 0x12, 0x2d, 0x88, 0xe1, 0xef, + 0xff, 0xee, 0x63, 0xaf, 0xe2, 0x8f, 0xbf, 0x73, 0xbd, 0x8f, 0x1d, 0x7f, + 0xa1, 0x79, 0x9c, 0x9a, 0x47, 0x5a, 0x0e, 0xbe, 0x4e, 0x3e, 0xe7, 0x5c, + 0x9e, 0x43, 0x61, 0xa0, 0xfb, 0xff, 0xff, 0xc2, 0x8a, 0x75, 0xe6, 0xf8, + 0x3f, 0xec, 0x7c, 0xcd, 0xe5, 0x9f, 0x88, 0x34, 0x75, 0xfb, 0xa9, 0x03, + 0x39, 0xd7, 0x7a, 0x16, 0x8a, 0x7d, 0xb0, 0x81, 0xa9, 0x26, 0x0e, 0x90, + 0xd2, 0xa8, 0x66, 0xe0, 0xe5, 0x20, 0x19, 0x25, 0xb7, 0x71, 0x7f, 0xab, + 0xaf, 0x1b, 0x4d, 0xfa, 0x07, 0xc9, 0xb4, 0xeb, 0xef, 0x69, 0xc0, 0x75, + 0xff, 0xdd, 0x4f, 0x89, 0xcf, 0xe7, 0x7e, 0x34, 0xeb, 0xe4, 0xeb, 0xce, + 0x75, 0xf6, 0xd8, 0xf4, 0x1d, 0x7e, 0xd6, 0x79, 0x34, 0x75, 0xff, 0xc9, + 0xee, 0xa6, 0x60, 0x47, 0x19, 0x3a, 0xff, 0xff, 0xb3, 0xf9, 0xc7, 0xfc, + 0x4e, 0xe3, 0x7a, 0x9f, 0x19, 0x5b, 0x4e, 0xbf, 0x7e, 0xc1, 0x17, 0xf1, + 0xd7, 0xf7, 0x5e, 0x7f, 0x92, 0xf1, 0xd7, 0xf3, 0xcd, 0xf7, 0x51, 0x87, + 0x5f, 0x9f, 0x83, 0xba, 0x1d, 0x50, 0x8a, 0xf4, 0x2b, 0xe9, 0x87, 0x8b, + 0xa8, 0x2a, 0xa3, 0x70, 0x9d, 0x42, 0x16, 0xa3, 0xa1, 0x0c, 0xc4, 0x4b, + 0x26, 0x14, 0x1f, 0x46, 0x33, 0x7c, 0x3e, 0x85, 0x9d, 0x7f, 0xbb, 0x08, + 0x2f, 0xc5, 0x0e, 0xbf, 0xa1, 0x05, 0xf8, 0xa1, 0xd7, 0xf3, 0x83, 0x9c, + 0x4e, 0x7c, 0x3d, 0xce, 0x98, 0xdf, 0xe7, 0x16, 0xfc, 0x67, 0x40, 0x3a, + 0x91, 0x1e, 0xe0, 0x7c, 0xfd, 0x1a, 0xf6, 0xbc, 0x87, 0x5e, 0x98, 0x1b, + 0x9d, 0x7a, 0x14, 0xf8, 0xd3, 0x72, 0x01, 0xbb, 0x00, 0xeb, 0xfa, 0x39, + 0x3c, 0x72, 0x73, 0xaf, 0x7e, 0xfa, 0x3a, 0xa4, 0x79, 0x5f, 0x4b, 0xaf, + 0xff, 0xe4, 0xe7, 0xcc, 0x4c, 0x15, 0x3a, 0x98, 0xbc, 0x69, 0xd7, 0xff, + 0xfc, 0x93, 0xf2, 0x17, 0xaf, 0xe3, 0xe4, 0x72, 0x03, 0xd8, 0x59, 0xd5, + 0x88, 0xc1, 0xe2, 0xcd, 0xf8, 0x1a, 0x4d, 0xd9, 0x3a, 0xff, 0xdc, 0xcd, + 0xfb, 0xbc, 0x2e, 0x78, 0x3a, 0xff, 0xff, 0xf7, 0x38, 0x93, 0xfc, 0xee, + 0x78, 0x62, 0x6e, 0xe4, 0xf1, 0xbf, 0xbf, 0x69, 0xd7, 0xff, 0xff, 0x42, + 0x9d, 0x8f, 0x83, 0x9f, 0xa9, 0xf3, 0x79, 0x69, 0x07, 0xec, 0x4e, 0x75, + 0xfb, 0x7d, 0x26, 0x09, 0xd5, 0x88, 0xa0, 0xfd, 0xea, 0x91, 0x34, 0x0e, + 0xc6, 0x3b, 0x7f, 0xf7, 0x07, 0x7c, 0xd7, 0xf3, 0x0c, 0x2c, 0xeb, 0xfe, + 0x45, 0x3b, 0x09, 0x3c, 0x28, 0x75, 0xa4, 0x87, 0xfd, 0xa4, 0x5b, 0xfe, + 0x1f, 0xe6, 0x1c, 0xeb, 0xf8, 0xeb, 0xfd, 0xd8, 0x64, 0x3d, 0x75, 0x9d, + 0x7f, 0xcb, 0xcd, 0x7c, 0x98, 0x61, 0x67, 0x50, 0x4f, 0xb5, 0x66, 0x77, + 0xff, 0xfc, 0xfc, 0xee, 0x79, 0x30, 0x67, 0xd4, 0x60, 0x87, 0xb0, 0x75, + 0xf7, 0xbe, 0x4f, 0xc3, 0xab, 0x74, 0x43, 0xbb, 0x15, 0xff, 0xff, 0xb7, + 0xc9, 0xff, 0xd8, 0xf9, 0xbc, 0xbd, 0x0c, 0xfc, 0xce, 0x00, 0x10, 0x75, + 0xff, 0xe6, 0x5c, 0x67, 0x5f, 0xe8, 0x14, 0x14, 0x3a, 0xfe, 0x9b, 0x79, + 0x7f, 0x1e, 0x3a, 0xfe, 0xc9, 0x78, 0x72, 0x47, 0x5f, 0xf7, 0x5d, 0x63, + 0x9d, 0x7f, 0x1d, 0x7d, 0x9c, 0x03, 0x27, 0x54, 0x22, 0xcf, 0xa6, 0x1a, + 0x2b, 0xf1, 0xb5, 0xfd, 0x9e, 0xe7, 0x32, 0x47, 0x5f, 0xc3, 0x9d, 0x1c, + 0x69, 0xd7, 0xc3, 0x9a, 0xf9, 0x31, 0xeb, 0x78, 0xb2, 0xff, 0xb1, 0x7d, + 0x84, 0xe7, 0xec, 0x67, 0x50, 0x57, 0xa1, 0xb0, 0x89, 0x42, 0x96, 0xc7, + 0x01, 0xbc, 0x29, 0xd0, 0x9f, 0x90, 0xa5, 0xec, 0x2a, 0x5c, 0x8f, 0x4f, + 0x1e, 0x87, 0xe6, 0xd8, 0x49, 0x7d, 0x3b, 0xbf, 0xf6, 0x32, 0x39, 0xfe, + 0x29, 0x20, 0x1d, 0x7f, 0xe1, 0xcf, 0x9c, 0xce, 0x8e, 0x4c, 0x75, 0xff, + 0xfe, 0xeb, 0x83, 0x5f, 0x07, 0x36, 0x8e, 0x6b, 0x17, 0x0d, 0x3a, 0x85, + 0x13, 0xfa, 0x3e, 0xa6, 0x19, 0x93, 0x39, 0x0b, 0x59, 0x3e, 0xd7, 0xbc, + 0x35, 0xde, 0x1b, 0xd7, 0xf6, 0x77, 0xe8, 0xee, 0x03, 0xaf, 0xee, 0xe0, + 0xf8, 0x1f, 0x9d, 0x7f, 0xe4, 0x08, 0x60, 0x1f, 0x33, 0x7f, 0x1d, 0x7f, + 0xe9, 0x46, 0xb5, 0x09, 0x3b, 0xf8, 0xeb, 0xf0, 0xc2, 0xdc, 0x27, 0x5f, + 0xec, 0x9b, 0xb9, 0xe8, 0x09, 0xd7, 0xf0, 0xf9, 0xd6, 0x9e, 0x3a, 0xd2, + 0x3a, 0xa0, 0xdd, 0xf8, 0xae, 0xf0, 0xb6, 0x0e, 0xbf, 0xff, 0xfe, 0xee, + 0x7b, 0x4f, 0x37, 0xc1, 0xcd, 0xe5, 0x9f, 0xce, 0x38, 0x1e, 0xa4, 0xc7, + 0x5d, 0xfa, 0x87, 0x52, 0x22, 0xcf, 0x83, 0x5e, 0x84, 0x0d, 0xfd, 0x93, + 0x8e, 0x6f, 0xa3, 0xaf, 0xfe, 0x10, 0x6c, 0xe7, 0x52, 0x16, 0xe1, 0x3a, + 0xff, 0xff, 0xfd, 0x2d, 0x6b, 0xf8, 0xf2, 0x07, 0x06, 0x6f, 0x83, 0x9c, + 0x81, 0xf7, 0x73, 0x60, 0xeb, 0xff, 0xb7, 0x96, 0xb1, 0x7b, 0xc7, 0x7b, + 0x07, 0x56, 0xe8, 0xcb, 0xe4, 0x21, 0xad, 0xa3, 0xab, 0x13, 0x48, 0xfe, + 0x30, 0xff, 0xa5, 0x37, 0xf0, 0xe7, 0x1b, 0xdc, 0x3a, 0xfe, 0xcd, 0xe5, + 0x00, 0x83, 0xaf, 0xc3, 0x9d, 0x7f, 0x1d, 0x68, 0xdc, 0xf4, 0x56, 0x59, + 0x7d, 0xf1, 0xb3, 0xb2, 0x75, 0xfa, 0x7f, 0x9f, 0xc4, 0xc7, 0x5f, 0xff, + 0xf0, 0xc0, 0x37, 0x96, 0xbf, 0x8f, 0x0e, 0x05, 0x33, 0x93, 0x1d, 0x4e, + 0x89, 0x2f, 0x16, 0x54, 0x2e, 0xcf, 0x04, 0xbf, 0x0b, 0x77, 0x40, 0x43, + 0xd9, 0x89, 0x7a, 0xda, 0xf0, 0xd3, 0x13, 0x4d, 0x46, 0xeb, 0xe3, 0x9f, + 0xdf, 0x36, 0x94, 0x7d, 0x85, 0xc5, 0xfa, 0x49, 0xcc, 0xdc, 0xeb, 0xda, + 0xee, 0x1d, 0x7e, 0xcd, 0x4f, 0x8c, 0x9d, 0x5b, 0x9f, 0x54, 0xc4, 0xfd, + 0x1b, 0xbf, 0xfe, 0x9f, 0x1a, 0x1e, 0xa6, 0x29, 0xf1, 0x4f, 0xe0, 0xeb, + 0xff, 0xa4, 0x9e, 0xee, 0x73, 0x99, 0xed, 0x1d, 0x7f, 0xdf, 0x3e, 0xf9, + 0x36, 0xc0, 0xb4, 0xea, 0x44, 0x6a, 0x4c, 0xa9, 0xd4, 0x3b, 0xff, 0xd1, + 0xbc, 0xb5, 0xe7, 0x9f, 0x60, 0x73, 0x73, 0xaf, 0xfb, 0xb3, 0xa6, 0x0e, + 0xf2, 0xd1, 0xd7, 0xfd, 0xbf, 0x71, 0xa3, 0x9f, 0xb1, 0x9d, 0x7f, 0xfc, + 0xce, 0x37, 0x59, 0xe9, 0xb1, 0x41, 0xc0, 0x1d, 0x69, 0x42, 0x31, 0x70, + 0xe5, 0x0f, 0x2f, 0xe4, 0xdc, 0x1c, 0x70, 0x9d, 0x7e, 0xc4, 0xce, 0x00, + 0xea, 0xe9, 0xe9, 0x09, 0x6d, 0xf6, 0xc7, 0xb3, 0xa7, 0x5c, 0x8b, 0x3a, + 0xff, 0xff, 0xdb, 0xc9, 0xf7, 0xf8, 0x3f, 0xec, 0x7c, 0xcd, 0xe5, 0x9f, + 0x88, 0x34, 0x75, 0x2d, 0x11, 0x9b, 0x02, 0xb7, 0xb6, 0x51, 0x82, 0x75, + 0x7c, 0x4c, 0x66, 0x72, 0x1c, 0x85, 0x86, 0xc9, 0x35, 0xff, 0xff, 0xfa, + 0x37, 0xd7, 0xf1, 0xbf, 0xce, 0xe0, 0x7e, 0x0e, 0x7e, 0xa7, 0xcd, 0x00, + 0x09, 0xe3, 0xaf, 0xd0, 0x3b, 0xbc, 0xe7, 0x5f, 0xff, 0xff, 0xfb, 0x1b, + 0x1d, 0x85, 0xfb, 0x35, 0xa8, 0xe7, 0x20, 0x72, 0x7c, 0xff, 0x5f, 0xcc, + 0x30, 0xb3, 0xaf, 0x7f, 0xc5, 0x0e, 0xa5, 0xa2, 0xdf, 0x66, 0x13, 0x37, + 0xe7, 0x07, 0xd7, 0x9c, 0xea, 0xc3, 0xd4, 0x42, 0xbb, 0xc8, 0x08, 0x3a, + 0xfe, 0x08, 0xe7, 0x5f, 0xc7, 0x5f, 0xbd, 0xbc, 0x93, 0x87, 0x56, 0x1e, + 0x9e, 0x8a, 0xea, 0x74, 0x47, 0x01, 0xb6, 0xff, 0x4f, 0xfc, 0x79, 0x69, + 0xe3, 0xaf, 0xfd, 0x0a, 0x6c, 0x7f, 0x83, 0x37, 0xd5, 0x9d, 0x58, 0x7f, + 0x3b, 0x9a, 0x5f, 0xfb, 0x30, 0x1a, 0xf9, 0xcd, 0x07, 0x47, 0x5f, 0xee, + 0x63, 0x7a, 0x9c, 0x98, 0xeb, 0xb3, 0xc1, 0x3f, 0x3c, 0x40, 0xbe, 0x9d, + 0x07, 0xc7, 0x5f, 0xb3, 0xbd, 0x79, 0x1d, 0x7f, 0x79, 0x39, 0x3e, 0x34, + 0xea, 0x86, 0x43, 0x6e, 0x46, 0x0a, 0xa1, 0x86, 0xf1, 0x89, 0xa4, 0x73, + 0xdc, 0x48, 0x5c, 0x23, 0x7b, 0x19, 0x93, 0xc2, 0xb8, 0x61, 0x3b, 0xa8, + 0x4a, 0xfe, 0x59, 0xb2, 0x43, 0xb0, 0x4d, 0x79, 0xdb, 0x87, 0x5f, 0xfa, + 0x6f, 0x9e, 0x1c, 0x67, 0x13, 0x47, 0x53, 0x08, 0xf6, 0xa0, 0x6a, 0x8e, + 0xbf, 0xb1, 0x71, 0xd7, 0xe9, 0xd7, 0x7c, 0x98, 0xea, 0xf8, 0x78, 0x81, + 0x2b, 0xbf, 0xfe, 0xde, 0x43, 0x1f, 0x16, 0x30, 0xa7, 0x92, 0x73, 0xaa, + 0x11, 0x89, 0x89, 0xc8, 0x49, 0x7e, 0xe7, 0xc1, 0xda, 0xc9, 0xd7, 0xdd, + 0x70, 0x41, 0xd7, 0xbb, 0x9c, 0x3a, 0xa0, 0xf9, 0xdc, 0xb3, 0x60, 0x82, + 0xfe, 0x9e, 0x69, 0x30, 0xb9, 0x39, 0xd7, 0xe5, 0xa0, 0x70, 0x27, 0x5a, + 0x63, 0xae, 0x85, 0x9d, 0x6f, 0x1d, 0x5c, 0x34, 0xae, 0x2b, 0x41, 0x3d, + 0x6e, 0x9b, 0x5e, 0xe4, 0x4c, 0x75, 0xed, 0x3e, 0xe7, 0x53, 0x9b, 0x8f, + 0x0e, 0x5d, 0x33, 0x9d, 0x7f, 0x3b, 0x31, 0xec, 0x9c, 0xeb, 0xf9, 0x39, + 0xbc, 0x86, 0x0e, 0xbf, 0xc1, 0xec, 0x6f, 0x2c, 0xf1, 0xd5, 0xd3, 0xdf, + 0xf1, 0x65, 0xff, 0xb6, 0x60, 0x7d, 0xc4, 0xdb, 0x81, 0x3a, 0x98, 0x85, + 0x46, 0x10, 0x6b, 0x8f, 0x88, 0xb4, 0xb2, 0x01, 0x16, 0xfe, 0x11, 0x9b, + 0x24, 0x57, 0xf9, 0x9c, 0x90, 0xfe, 0xfa, 0x3a, 0xfd, 0xbb, 0x2e, 0x20, + 0x3a, 0xe1, 0x50, 0xeb, 0x69, 0x0d, 0xf7, 0xe5, 0x17, 0xff, 0xf4, 0x2c, + 0x71, 0xbb, 0xf8, 0x5f, 0xab, 0x8c, 0xf1, 0xd7, 0xff, 0xff, 0xc9, 0xdf, + 0xd6, 0xb7, 0x97, 0xcd, 0x81, 0xc5, 0xc3, 0x7e, 0x7d, 0x9e, 0x77, 0xdc, + 0xeb, 0xff, 0xf4, 0x72, 0x1b, 0x8b, 0x86, 0xc9, 0x35, 0xfa, 0xce, 0xa8, + 0x4f, 0x36, 0x67, 0x1e, 0x93, 0xf9, 0x63, 0x66, 0x11, 0x37, 0xf7, 0x32, + 0x14, 0x81, 0x3a, 0xf0, 0xba, 0xce, 0xb8, 0x10, 0x75, 0xe1, 0xfb, 0x39, + 0xd5, 0x23, 0xf8, 0x42, 0xb1, 0x1a, 0xf0, 0xad, 0x31, 0x0f, 0xd2, 0xf6, + 0xc5, 0xbb, 0x30, 0xa3, 0xf2, 0x61, 0xeb, 0x31, 0x2f, 0x5e, 0x78, 0xef, + 0x25, 0x08, 0x20, 0xce, 0x56, 0xe5, 0x33, 0xd1, 0x49, 0x4d, 0x2d, 0x9d, + 0xe5, 0xde, 0x70, 0xf5, 0x25, 0x3f, 0xcd, 0x29, 0xd3, 0x93, 0x8d, 0x6b, + 0x97, 0x2d, 0xda, 0x75, 0x83, 0xca, 0xfa, 0x04, 0x6f, 0x8c, 0x16, 0x91, + 0xa4, 0xe8, 0xea, 0x78, 0x07, 0xd4, 0x9a, 0xbf, 0xe3, 0x4d, 0xdb, 0x0e, + 0x96, 0x61, 0x29, 0xb3, 0x29, 0x83, 0xec, 0xa4, 0xad, 0x88, 0x65, 0xdf, + 0xff, 0xdf, 0xb5, 0x5d, 0xfd, 0xc8, 0xcd, 0xd8, 0x41, 0x77, 0x50, 0xea, + 0x55, 0x55, 0xfa, 0x4a, 0x5c, 0xbf, 0x9d, 0x3d, 0xa4, 0x13, 0xaf, 0x27, + 0x30, 0xea, 0x63, 0x3c, 0x4d, 0x15, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x29, + 0xdb, 0xb3, 0x73, 0xaf, 0xff, 0x7f, 0xf8, 0xa0, 0xc7, 0x51, 0x79, 0xa3, + 0xac, 0xac, 0x22, 0xdb, 0x09, 0x77, 0x33, 0x58, 0xb5, 0xff, 0xc9, 0xc5, + 0x76, 0x5e, 0x7f, 0x69, 0xc0, 0x75, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0xa3, + 0xbf, 0xf3, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x9a, 0x2f, 0x86, 0x33, + 0x73, 0xab, 0x11, 0x3a, 0xb3, 0x3f, 0x25, 0x5f, 0xef, 0xaf, 0xb5, 0x5f, + 0x24, 0xe7, 0x52, 0xa7, 0xcf, 0x05, 0xf7, 0xee, 0x35, 0xdd, 0xa6, 0x8a, + 0xbe, 0xfe, 0xcd, 0xb0, 0x3d, 0xfc, 0xeb, 0xf9, 0x02, 0x18, 0xe4, 0x1d, + 0x7f, 0xff, 0x6e, 0x01, 0xfd, 0x7f, 0x42, 0x18, 0x02, 0xe3, 0x3c, 0x75, + 0x95, 0xc4, 0x75, 0x70, 0xcf, 0xa5, 0xdf, 0x4a, 0xef, 0xdc, 0x6b, 0xbb, + 0x4d, 0x15, 0xb5, 0xff, 0x49, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x90, 0x6c, + 0xae, 0x1f, 0xc3, 0x99, 0xdf, 0xfc, 0xab, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, + 0x68, 0x90, 0xef, 0xfd, 0xa5, 0x73, 0xc8, 0x1c, 0x19, 0x8e, 0xbc, 0xee, + 0xd3, 0xc6, 0x07, 0x50, 0x7c, 0xad, 0x3e, 0xbb, 0xac, 0x67, 0x5f, 0xfa, + 0x5d, 0x8f, 0x69, 0x8a, 0xd3, 0x16, 0x27, 0x5f, 0xfe, 0x61, 0xcc, 0x39, + 0x8a, 0xec, 0x2c, 0x5f, 0xa9, 0xc3, 0xad, 0xb9, 0xd7, 0x20, 0x9d, 0x7f, + 0x40, 0x63, 0xce, 0x13, 0xa8, 0x27, 0xa1, 0x30, 0x8f, 0x85, 0x2f, 0xbd, + 0xa4, 0xda, 0x75, 0xff, 0xc8, 0x33, 0xc2, 0x9f, 0x40, 0x08, 0xdc, 0xeb, + 0xec, 0x10, 0x68, 0xeb, 0xe9, 0xf5, 0xba, 0x1d, 0x58, 0x78, 0x7a, 0x20, + 0xbf, 0x38, 0x7e, 0xc0, 0x9d, 0x7f, 0xee, 0x7b, 0xe8, 0xbb, 0x70, 0x5a, + 0x75, 0xf3, 0x5d, 0xda, 0x68, 0xb1, 0x2f, 0x22, 0x32, 0x75, 0xef, 0xc6, + 0x47, 0x5f, 0xe6, 0xc6, 0x70, 0x00, 0xf1, 0xd5, 0x3a, 0x3e, 0xf0, 0x9f, + 0x87, 0xc2, 0x5b, 0xe1, 0xbf, 0xc7, 0x2f, 0xd9, 0xc8, 0x15, 0x0e, 0xbf, + 0x7d, 0xd9, 0xce, 0x41, 0xd7, 0xb5, 0x02, 0x75, 0xbb, 0x07, 0x8a, 0x85, + 0x77, 0xff, 0x46, 0x6b, 0x04, 0x28, 0x08, 0x13, 0xaf, 0x0c, 0x4e, 0x75, + 0x09, 0xed, 0x7e, 0x7f, 0x7d, 0x1c, 0x85, 0x9d, 0x52, 0x3c, 0x2d, 0x11, + 0x5e, 0x5b, 0xf8, 0xeb, 0xff, 0xef, 0x66, 0xf2, 0x1f, 0xfc, 0xe8, 0x30, + 0x13, 0xae, 0x40, 0x1d, 0x5c, 0x3f, 0xef, 0x0d, 0xec, 0xa7, 0x5f, 0x6d, + 0xfd, 0xf4, 0x75, 0x90, 0xea, 0x43, 0x67, 0x31, 0x25, 0xff, 0x07, 0xb8, + 0xbc, 0x7e, 0x4e, 0x75, 0xfb, 0xde, 0x79, 0x68, 0xeb, 0xff, 0x7f, 0x9b, + 0x87, 0x6f, 0x71, 0xe6, 0x3a, 0xb7, 0x3e, 0x9d, 0xa4, 0xf6, 0x91, 0xd7, + 0xd9, 0x8c, 0xe8, 0xea, 0x83, 0x63, 0xe1, 0x0b, 0xbf, 0x13, 0xaa, 0x13, + 0x2d, 0xc8, 0x50, 0xf1, 0x5b, 0x44, 0x17, 0xfd, 0x1a, 0xfb, 0x9c, 0xcc, + 0x98, 0xeb, 0xfb, 0x92, 0x06, 0x64, 0xc7, 0x5f, 0x3c, 0x26, 0xc9, 0xd5, + 0x87, 0x9f, 0xc2, 0xdb, 0xe9, 0x7d, 0xec, 0x1d, 0x7b, 0x91, 0x23, 0xa9, + 0xcd, 0xf6, 0xd2, 0x3b, 0xfa, 0x17, 0x89, 0xc9, 0x8e, 0xbe, 0xfb, 0x1b, + 0x1a, 0x3a, 0xfd, 0x81, 0xec, 0x74, 0xeb, 0xee, 0x23, 0x2c, 0x67, 0x50, + 0x9e, 0x5e, 0x89, 0xa8, 0x28, 0x92, 0xd3, 0x8d, 0x42, 0x6c, 0x48, 0xbf, + 0xd2, 0x27, 0x85, 0xf5, 0xfc, 0x82, 0xeb, 0x8e, 0x9d, 0x7f, 0xfa, 0x17, + 0x12, 0x08, 0xc7, 0x5f, 0x38, 0x75, 0x1d, 0x52, 0x3d, 0x0d, 0x94, 0x6b, + 0xde, 0xc0, 0x1d, 0x7f, 0x2d, 0x35, 0xa4, 0x09, 0xd7, 0x9f, 0x8a, 0x1d, + 0x5f, 0x9e, 0x43, 0x25, 0x97, 0xf9, 0xa3, 0x9b, 0x47, 0x34, 0x75, 0xff, + 0x6f, 0x27, 0xc1, 0xcf, 0x68, 0xeb, 0xff, 0x66, 0xf2, 0xec, 0x69, 0x4e, + 0xc1, 0xd5, 0x24, 0xf3, 0xb7, 0x7a, 0x98, 0x97, 0x8c, 0x7d, 0x24, 0x13, + 0x2d, 0x83, 0x7b, 0x6c, 0x9d, 0x74, 0xb4, 0x75, 0x9e, 0x46, 0xa7, 0x71, + 0x3b, 0xef, 0x20, 0xb2, 0x55, 0xbf, 0x3a, 0xd1, 0x86, 0xcb, 0xa4, 0x37, + 0xfc, 0xe3, 0xed, 0x6f, 0xa7, 0x63, 0x3a, 0x9d, 0x17, 0x20, 0x59, 0xfc, + 0x96, 0xfe, 0xea, 0x6b, 0x9c, 0xc3, 0xaf, 0xfc, 0x99, 0xed, 0x73, 0x35, + 0x1b, 0x9d, 0x7f, 0xe8, 0x67, 0xec, 0xfa, 0xc5, 0xc3, 0x19, 0xd7, 0x3b, + 0x27, 0x5b, 0x1a, 0x8c, 0x3e, 0x96, 0x78, 0xf7, 0x6a, 0x25, 0xff, 0xdd, + 0x74, 0xf4, 0xb1, 0x41, 0xc0, 0x1d, 0x7e, 0x19, 0xa3, 0xb0, 0x75, 0xf8, + 0x0f, 0xb7, 0x02, 0x75, 0xfb, 0x3b, 0xbb, 0xb1, 0x9d, 0x7c, 0x0d, 0x40, + 0x9d, 0x7f, 0xb9, 0xd7, 0x4d, 0x26, 0xd3, 0xaa, 0x0f, 0x4f, 0x08, 0x2f, + 0xfe, 0xee, 0x08, 0xbf, 0xbe, 0x4a, 0x16, 0x75, 0x22, 0x6e, 0x0e, 0x84, + 0x02, 0x61, 0x28, 0xd3, 0xef, 0x88, 0x2f, 0xe6, 0x63, 0x9c, 0x79, 0x8e, + 0xbf, 0xe0, 0xc3, 0x7e, 0x80, 0x11, 0xb9, 0xd7, 0xfc, 0xfc, 0xc5, 0xa6, + 0xcc, 0x2c, 0xea, 0x69, 0xfa, 0x7e, 0x77, 0x7d, 0xe8, 0xde, 0x47, 0x5f, + 0xc8, 0x0d, 0x91, 0x40, 0x1d, 0x53, 0x9e, 0x87, 0x08, 0xaa, 0x13, 0x38, + 0xc8, 0x51, 0x3b, 0x9d, 0xfd, 0xb7, 0x8f, 0x09, 0xb2, 0x75, 0xb0, 0xea, + 0x59, 0xbf, 0x13, 0x0b, 0xe9, 0xfd, 0x8d, 0x3a, 0xff, 0x3a, 0x9f, 0x7b, + 0xd8, 0x91, 0xd4, 0xe7, 0xaf, 0xb2, 0x45, 0x7f, 0xee, 0xe0, 0x42, 0x9b, + 0xe6, 0xfe, 0x3a, 0xfe, 0xf8, 0x1f, 0xaf, 0xce, 0x1d, 0x53, 0x9f, 0x80, + 0x4f, 0xef, 0x9e, 0x13, 0x64, 0xeb, 0xff, 0x60, 0x7e, 0x66, 0xa3, 0x38, + 0x03, 0xaf, 0xfa, 0x10, 0x3e, 0x17, 0xdf, 0x47, 0x54, 0x22, 0xe8, 0x24, + 0x7d, 0x22, 0x13, 0xea, 0x62, 0x9b, 0x30, 0x46, 0x2c, 0x65, 0x89, 0x24, + 0x44, 0x2a, 0x67, 0x30, 0x91, 0x18, 0x61, 0x15, 0x91, 0x8e, 0x28, 0xae, + 0xd6, 0xbd, 0xe1, 0x84, 0x90, 0xa0, 0x99, 0x97, 0x91, 0xa7, 0x2d, 0x07, + 0xb1, 0xf5, 0x3c, 0xa0, 0xe0, 0x46, 0x96, 0x30, 0xf3, 0xd4, 0x76, 0x9e, + 0x8e, 0x37, 0xf7, 0x2d, 0x97, 0x7f, 0xb1, 0xa7, 0x5f, 0xb6, 0x1d, 0xb1, + 0xc3, 0xaf, 0xfc, 0x91, 0xee, 0xba, 0x98, 0x20, 0x3a, 0xff, 0xf3, 0xf3, + 0xe3, 0xfb, 0xe7, 0xb7, 0x6a, 0x09, 0xd5, 0xd4, 0x44, 0xed, 0x3c, 0xbf, + 0xb3, 0xd0, 0x8b, 0xd1, 0xd7, 0xf8, 0x31, 0x2c, 0xe6, 0x68, 0xeb, 0xda, + 0xfb, 0xa3, 0xaf, 0xff, 0xb3, 0x79, 0x7b, 0xf9, 0xd5, 0xeb, 0xad, 0x34, + 0x75, 0xff, 0x7e, 0xf8, 0x14, 0xdc, 0x5c, 0xeb, 0xde, 0x18, 0x3a, 0xee, + 0xab, 0x09, 0xfa, 0xe4, 0x2c, 0xa6, 0x25, 0x59, 0x5b, 0x98, 0x88, 0xf6, + 0x94, 0xfe, 0x9b, 0xd2, 0xab, 0x83, 0xb1, 0x2e, 0x6a, 0xfe, 0xce, 0x35, + 0xdd, 0xa6, 0x8b, 0x36, 0xff, 0xd1, 0xc0, 0x7b, 0x5d, 0xc4, 0x09, 0xd7, + 0xc8, 0x2f, 0x39, 0xd5, 0xd3, 0xdd, 0xd1, 0xed, 0xf2, 0xbd, 0x8e, 0x9d, + 0x4a, 0x9e, 0x26, 0xc1, 0x15, 0x2a, 0x8f, 0xf7, 0x86, 0xcd, 0xf2, 0x2f, + 0xef, 0x0e, 0xbe, 0x41, 0xe7, 0xe7, 0x5c, 0xb5, 0x60, 0xf1, 0x26, 0x23, + 0xbb, 0x02, 0x75, 0xff, 0x9e, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x45, 0x01, + 0x7f, 0x91, 0x70, 0xc7, 0xdc, 0x9c, 0xeb, 0x2b, 0x88, 0x94, 0x58, 0xaf, + 0x52, 0xaf, 0x9f, 0x9b, 0xc8, 0xeb, 0xf7, 0xb5, 0x24, 0x01, 0xd5, 0x87, + 0x92, 0xe4, 0x57, 0xf4, 0x95, 0xc9, 0xa2, 0x47, 0x52, 0xa7, 0x9d, 0x04, + 0x17, 0x7f, 0xd3, 0xaf, 0xed, 0x42, 0xc6, 0x26, 0x3a, 0xdd, 0x3a, 0xf7, + 0xd1, 0x98, 0xeb, 0xb3, 0xd8, 0x6b, 0x80, 0x21, 0x40, 0x44, 0x28, 0xad, + 0x5d, 0xf3, 0x47, 0x5e, 0xfc, 0x38, 0x75, 0xfe, 0xce, 0x78, 0x61, 0x7a, + 0x3a, 0xdb, 0x27, 0x52, 0x1f, 0x07, 0x47, 0x00, 0x63, 0x7c, 0xd7, 0x76, + 0x9a, 0x2d, 0xfb, 0xdb, 0x2f, 0xe3, 0xaf, 0xef, 0xbe, 0x76, 0xbf, 0x0e, + 0xae, 0x1f, 0xca, 0xcb, 0x40, 0x3d, 0x7d, 0x82, 0x93, 0x1d, 0x7b, 0xb1, + 0xc3, 0xaf, 0xdd, 0x4e, 0x75, 0xce, 0xbf, 0xfd, 0xd8, 0x9f, 0xd9, 0xd1, + 0xcf, 0x75, 0x0e, 0xbc, 0xbc, 0x09, 0xd6, 0x59, 0xd7, 0xfd, 0xd8, 0x9c, + 0x38, 0xce, 0x95, 0x84, 0x5a, 0x60, 0xdc, 0xc4, 0xce, 0x91, 0xf4, 0x6e, + 0xfd, 0xe9, 0x6b, 0xee, 0x8e, 0xbd, 0xae, 0x84, 0xeb, 0xf7, 0xdf, 0x0c, + 0x00, 0xea, 0x59, 0xe2, 0x6d, 0x1c, 0xbf, 0xfb, 0xda, 0x4d, 0x40, 0xe7, + 0xba, 0x87, 0x5e, 0x1c, 0xe9, 0xd4, 0xb3, 0xdb, 0xda, 0x83, 0x7e, 0x0c, + 0x31, 0xfe, 0xb3, 0xaf, 0xf9, 0xf5, 0x18, 0x21, 0xec, 0x1d, 0x7f, 0xf6, + 0x2f, 0x99, 0xbf, 0x45, 0xd8, 0xe7, 0x3a, 0xed, 0x6b, 0x87, 0xf8, 0x26, + 0xb5, 0x09, 0xbb, 0xe3, 0xfa, 0x12, 0x3c, 0x29, 0xef, 0x9d, 0x07, 0xc7, + 0x5e, 0xe4, 0x78, 0xeb, 0xfa, 0x67, 0x0f, 0x51, 0x67, 0x5f, 0xde, 0x4c, + 0x0c, 0x2c, 0xea, 0xf1, 0xec, 0x32, 0x5b, 0x76, 0x84, 0xeb, 0xfb, 0x7d, + 0x43, 0x71, 0x67, 0x57, 0x11, 0xb0, 0xee, 0x7a, 0x23, 0xfc, 0x56, 0xfb, + 0xaa, 0x05, 0x67, 0x5d, 0x92, 0x3a, 0xb0, 0xdc, 0x09, 0x1d, 0x31, 0x6b, + 0xe1, 0x51, 0x09, 0xc9, 0x11, 0x05, 0xe3, 0x21, 0x4e, 0x85, 0xf3, 0x43, + 0x53, 0x8f, 0x7d, 0x8f, 0x94, 0x07, 0xe3, 0x0f, 0x7f, 0x3a, 0xdf, 0xcf, + 0xba, 0xab, 0x7f, 0x1d, 0x4a, 0xa3, 0xc8, 0x61, 0x89, 0x7f, 0x05, 0x5d, + 0x7b, 0x5b, 0x9d, 0x73, 0x10, 0xc5, 0x9d, 0x79, 0x6f, 0xb9, 0xd7, 0x6d, + 0x43, 0xaf, 0xb9, 0xcc, 0xfa, 0x75, 0xfb, 0x53, 0xe3, 0x2a, 0xb1, 0x47, + 0xed, 0x04, 0x13, 0x0e, 0x38, 0xbd, 0x42, 0x60, 0xc9, 0x0a, 0x6b, 0xff, + 0xfe, 0x60, 0xa7, 0xbf, 0x79, 0xd5, 0xc9, 0x76, 0x39, 0x98, 0x2a, 0x1d, + 0x7f, 0xff, 0xf9, 0x1a, 0xfc, 0x7e, 0xcb, 0x3d, 0x81, 0xd3, 0xaf, 0x39, + 0x3c, 0x6e, 0x75, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0x94, 0xbf, 0xfe, 0x7f, + 0x0e, 0x4f, 0xc8, 0xea, 0x77, 0x38, 0x75, 0xe7, 0x92, 0xb0, 0x8f, 0x6c, + 0x76, 0x01, 0x9d, 0xff, 0x49, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x93, 0xac, + 0xaa, 0xd1, 0x0a, 0xe8, 0x15, 0x10, 0x9d, 0xe4, 0x9e, 0x72, 0x92, 0x51, + 0xce, 0x86, 0xfb, 0x17, 0x32, 0x32, 0x65, 0x10, 0xdb, 0x1a, 0x62, 0x46, + 0x18, 0xc7, 0x0b, 0xd9, 0x89, 0xf9, 0x0b, 0x65, 0xd6, 0xe8, 0x5d, 0x8c, + 0xb1, 0xdb, 0x01, 0x0c, 0x31, 0x86, 0x6e, 0xa9, 0x03, 0xde, 0x8c, 0xbb, + 0xf2, 0x7d, 0xb1, 0xf3, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x21, 0xfb, 0xff, + 0x3c, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x4e, 0xca, 0xe1, 0xfe, 0xac, + 0xce, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x11, 0x3d, 0xfd, 0x32, 0x7b, + 0x5f, 0xac, 0xeb, 0xff, 0xcc, 0x32, 0x8c, 0xb1, 0xce, 0x16, 0x17, 0xcf, + 0x9d, 0xd9, 0x3a, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x18, 0xdf, 0x42, 0xda, + 0x03, 0xaf, 0xff, 0xa5, 0x3b, 0x0d, 0x0c, 0x5c, 0xed, 0xe7, 0xcf, 0x9d, + 0xd9, 0x3a, 0xba, 0x88, 0x50, 0x10, 0xdf, 0x26, 0xf2, 0x62, 0xce, 0xb2, + 0xb0, 0x9c, 0x9c, 0x8b, 0xf1, 0x8b, 0xb0, 0xb8, 0xf1, 0x1d, 0xff, 0xe5, + 0x56, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x27, 0x9b, 0xf9, 0x50, 0x40, + 0xcb, 0x47, 0x54, 0x2a, 0xd3, 0x9c, 0xa2, 0x51, 0xe9, 0x75, 0x57, 0xca, + 0xf7, 0xee, 0x35, 0xdd, 0xa6, 0x88, 0x82, 0xff, 0xcf, 0x25, 0x73, 0x8d, + 0x77, 0x69, 0xa2, 0x54, 0xbf, 0xb9, 0xff, 0x60, 0x5a, 0x75, 0xfc, 0xd4, + 0xcd, 0x8e, 0xc1, 0xd5, 0x07, 0xb7, 0x85, 0xb6, 0x57, 0x11, 0xf0, 0xb3, + 0x31, 0x85, 0x2d, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0x28, 0xbd, 0x00, 0xc3, + 0xac, 0xae, 0x1e, 0x6f, 0xd3, 0x3b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, + 0x46, 0x57, 0xee, 0x35, 0xdd, 0xa6, 0x89, 0x96, 0xfd, 0x2c, 0xf3, 0xb4, + 0xeb, 0xf2, 0xab, 0x79, 0x2b, 0x87, 0xb3, 0xb9, 0x9d, 0xfb, 0x8d, 0x77, + 0x69, 0xa2, 0xa4, 0xb0, 0x9d, 0x6f, 0xa7, 0x59, 0x5c, 0x3d, 0x46, 0x33, + 0x3f, 0xc3, 0xef, 0xf2, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x5d, 0x5f, 0xe5, + 0x73, 0x8d, 0x77, 0x69, 0xa2, 0xc5, 0xbf, 0xf9, 0x6f, 0x25, 0x73, 0x8d, + 0x77, 0x69, 0xa2, 0x7a, 0xbf, 0xe6, 0x55, 0x78, 0x4d, 0x94, 0xd8, 0x3a, + 0xff, 0xff, 0xf0, 0x71, 0x95, 0x47, 0x14, 0x51, 0xfd, 0xa4, 0x19, 0xa1, + 0xbc, 0xcd, 0xce, 0xbf, 0xff, 0x4c, 0x30, 0xb5, 0x73, 0x48, 0xc8, 0x5d, + 0xd4, 0x3a, 0xed, 0x78, 0xeb, 0xb4, 0x03, 0xaf, 0xc2, 0xeb, 0x18, 0x3a, + 0xfe, 0xff, 0x5d, 0x79, 0x2a, 0xc5, 0x9e, 0x83, 0x22, 0xdf, 0x45, 0xaf, + 0xd9, 0xed, 0x22, 0xce, 0xbf, 0xfd, 0x1b, 0xfb, 0x26, 0x4e, 0x7b, 0x5f, + 0xb1, 0x9d, 0x79, 0xf7, 0x54, 0x4f, 0xd7, 0xc4, 0xd5, 0x89, 0xd5, 0xf2, + 0x14, 0xda, 0x86, 0x8d, 0x05, 0x52, 0xff, 0xa5, 0x12, 0xd2, 0xaa, 0xc6, + 0x61, 0x41, 0x25, 0x4e, 0xdf, 0x93, 0xa2, 0xf3, 0x1d, 0x7e, 0x96, 0x07, + 0xe6, 0x1d, 0x4c, 0x03, 0xce, 0x82, 0x6b, 0xf6, 0x79, 0x3f, 0xd1, 0xd7, + 0x31, 0x4c, 0x48, 0xea, 0x62, 0x47, 0x90, 0xc3, 0x13, 0xdf, 0x98, 0x73, + 0x15, 0xae, 0x78, 0xeb, 0xfd, 0xf4, 0x73, 0x9c, 0x86, 0x9d, 0x4c, 0x51, + 0xf3, 0x30, 0x8c, 0xef, 0xb8, 0xbf, 0x6e, 0x75, 0xfc, 0xc5, 0x31, 0x0c, + 0x08, 0x92, 0xce, 0xbc, 0xdc, 0xe9, 0x57, 0x97, 0x1a, 0x3a, 0xf0, 0x39, + 0x07, 0x5f, 0xd8, 0x04, 0x99, 0x19, 0x3a, 0xff, 0xcf, 0xaf, 0x9a, 0xd6, + 0x4a, 0x50, 0x75, 0xff, 0xf8, 0x5d, 0x44, 0xe4, 0x4a, 0x59, 0xa0, 0x02, + 0x0e, 0xa0, 0xa2, 0xfd, 0x42, 0xde, 0x9f, 0xdf, 0xff, 0xdc, 0x4d, 0x87, + 0x5a, 0xb1, 0xce, 0x26, 0xc3, 0x7f, 0x9c, 0xeb, 0xe4, 0xef, 0xd5, 0x9d, + 0x7f, 0xf9, 0x14, 0xf9, 0x82, 0xfb, 0xe9, 0x45, 0x1c, 0xea, 0x69, 0xf8, + 0x09, 0x1d, 0xff, 0xe7, 0xd0, 0xe0, 0x15, 0xea, 0x35, 0xf8, 0x75, 0xc2, + 0xc9, 0xd7, 0xf0, 0x71, 0x4f, 0x63, 0x4e, 0xbe, 0xec, 0x2d, 0xa7, 0x54, + 0x1f, 0x23, 0x8b, 0x78, 0xb6, 0xfc, 0x14, 0x99, 0x19, 0x3a, 0xff, 0xef, + 0x91, 0x03, 0x0b, 0xf9, 0xf3, 0xbb, 0x27, 0x54, 0x1f, 0x98, 0x94, 0x5f, + 0xfb, 0xb9, 0x37, 0x53, 0xb1, 0xc8, 0x3a, 0xe7, 0xdc, 0xeb, 0xfc, 0xfa, + 0x7e, 0xfe, 0x33, 0x9d, 0x42, 0x79, 0x3f, 0x8b, 0x54, 0xeb, 0x85, 0xd2, + 0x1b, 0x48, 0x6d, 0x70, 0xc5, 0x70, 0xd3, 0xe9, 0x08, 0xc2, 0xb3, 0xd0, + 0xa0, 0xfa, 0x41, 0xb1, 0x08, 0x6b, 0xc2, 0xfe, 0x3a, 0xf0, 0xa6, 0x8e, + 0xb3, 0x2c, 0x03, 0x69, 0x03, 0x57, 0x47, 0x4e, 0xbe, 0xe6, 0xd7, 0x59, + 0xd7, 0xe1, 0xcf, 0x43, 0x27, 0x5f, 0x96, 0x2f, 0xed, 0x1d, 0x7a, 0x33, + 0x87, 0x5f, 0xfe, 0x6b, 0xf1, 0xfc, 0x9a, 0x81, 0x80, 0x1d, 0x69, 0x74, + 0xf8, 0x3e, 0x8d, 0x56, 0xe8, 0xb0, 0xe4, 0x21, 0xab, 0x13, 0x62, 0x69, + 0x5a, 0x0a, 0xe8, 0x8f, 0xf8, 0x6b, 0x5e, 0xd6, 0xc6, 0xc1, 0xd7, 0xfd, + 0xd7, 0xf4, 0x4d, 0xa4, 0x59, 0xd7, 0xfa, 0x24, 0x39, 0xbf, 0xb0, 0xeb, + 0xff, 0xe4, 0xeb, 0xb6, 0x04, 0x33, 0x4a, 0x39, 0x39, 0xd7, 0xff, 0xde, + 0xd0, 0x79, 0x88, 0xa7, 0x59, 0x71, 0x9c, 0xeb, 0xe1, 0x0e, 0x28, 0x75, + 0xee, 0xfe, 0xb3, 0xab, 0x13, 0x69, 0x42, 0x2e, 0x1c, 0x74, 0xc7, 0x49, + 0xfe, 0x51, 0xfc, 0x86, 0xfe, 0xf6, 0xa6, 0x81, 0x9c, 0xeb, 0xf0, 0xa8, + 0x99, 0xa3, 0xaf, 0xcc, 0xbf, 0x9d, 0xa7, 0x5f, 0xfd, 0x8c, 0xb8, 0x31, + 0xbd, 0x70, 0x68, 0xeb, 0xff, 0x69, 0xf7, 0x81, 0x70, 0xe2, 0x87, 0x52, + 0x23, 0x37, 0xa4, 0xc2, 0x4f, 0xe4, 0x3b, 0xa3, 0xa7, 0x58, 0x27, 0x52, + 0xcd, 0x28, 0x8a, 0xdf, 0x08, 0x7e, 0x28, 0x75, 0xfd, 0x9a, 0x65, 0xc6, + 0x73, 0xab, 0x0f, 0xc5, 0xc8, 0x04, 0x92, 0xfd, 0xfa, 0x9a, 0x0c, 0x1d, + 0x79, 0x69, 0xa3, 0xaf, 0xfb, 0x05, 0xe5, 0xa9, 0x33, 0x39, 0xd7, 0xd2, + 0xd2, 0x09, 0xd6, 0x89, 0x1e, 0xce, 0xe7, 0x37, 0xf9, 0xf9, 0x28, 0x6a, + 0x34, 0xea, 0x85, 0x5d, 0xd9, 0x0f, 0xb4, 0x86, 0x8f, 0x4b, 0x1c, 0xa4, + 0x5d, 0x3f, 0x28, 0xbf, 0xfc, 0xa3, 0xe6, 0xfe, 0xf4, 0x66, 0xd4, 0x69, + 0xd7, 0xf8, 0x73, 0x5e, 0x77, 0x13, 0xa9, 0x43, 0xfa, 0xda, 0x97, 0x7f, + 0xff, 0xe4, 0xe7, 0x23, 0xef, 0x90, 0x7f, 0x96, 0x68, 0x3f, 0xbf, 0x24, + 0x75, 0xff, 0xfc, 0x38, 0xa6, 0x0f, 0xcd, 0x7b, 0xb8, 0xbf, 0xb0, 0x03, + 0xaa, 0x11, 0x97, 0x8d, 0xd7, 0xfb, 0xf7, 0xd2, 0x4c, 0x8c, 0x9d, 0x48, + 0x9a, 0x2f, 0x61, 0xe0, 0x24, 0x37, 0xbb, 0x02, 0x75, 0xed, 0xfc, 0xb3, + 0xa9, 0xa6, 0xdd, 0xc6, 0xaf, 0xd3, 0x87, 0x88, 0xc9, 0xd7, 0xfb, 0xeb, + 0xed, 0x49, 0x91, 0x93, 0xaf, 0xfe, 0x41, 0xcf, 0xf9, 0x3a, 0xe3, 0x3c, + 0x75, 0x41, 0xfd, 0x04, 0xde, 0xfe, 0x0b, 0xf0, 0x1b, 0x38, 0x75, 0xee, + 0xfd, 0xda, 0x75, 0xff, 0x42, 0xc7, 0x1b, 0xc4, 0x01, 0xd5, 0x23, 0xd6, + 0xd1, 0x05, 0xff, 0x44, 0xb1, 0x35, 0xaf, 0xe0, 0xeb, 0xff, 0x7a, 0x17, + 0xbb, 0x53, 0x7c, 0xe1, 0xd7, 0xee, 0xe7, 0x13, 0x47, 0x5e, 0x14, 0x96, + 0xe7, 0xcb, 0xe3, 0xfb, 0xff, 0x3e, 0x02, 0x05, 0xc3, 0x8a, 0x1d, 0x53, + 0xa6, 0x15, 0x28, 0x4e, 0x00, 0xce, 0xff, 0x3e, 0xfa, 0xf7, 0xb1, 0x8c, + 0xeb, 0xff, 0xc9, 0xce, 0xbe, 0x34, 0x39, 0xc0, 0x21, 0xd7, 0xfd, 0x12, + 0xd0, 0xc0, 0x1d, 0x67, 0x5f, 0xca, 0x7a, 0x30, 0x5a, 0x75, 0xff, 0x4b, + 0xef, 0x93, 0xa8, 0x3e, 0x3a, 0xff, 0xf4, 0x66, 0xfe, 0xec, 0x78, 0x60, + 0x1a, 0x3a, 0xe8, 0x01, 0xd7, 0x75, 0x67, 0x53, 0x4d, 0x5e, 0x85, 0x69, + 0x11, 0xf2, 0xe5, 0x9e, 0x39, 0xfd, 0xce, 0xf4, 0xe9, 0xc3, 0xaf, 0xef, + 0xf5, 0xed, 0x67, 0x8e, 0xbf, 0xbf, 0x60, 0xa4, 0xc8, 0xc9, 0xd7, 0x67, + 0x4e, 0xbc, 0xcb, 0x2c, 0x95, 0x7f, 0xfb, 0xc9, 0xed, 0x75, 0x36, 0x7e, + 0xf2, 0x24, 0x52, 0xa5, 0xfd, 0x28, 0x98, 0x7a, 0x0e, 0x39, 0x77, 0x8c, + 0xff, 0x34, 0xbf, 0xff, 0xe4, 0xf4, 0xa0, 0x73, 0xdd, 0x4c, 0xf4, 0x2d, + 0x39, 0x23, 0xaa, 0x4b, 0xdb, 0x61, 0x6b, 0xc2, 0x06, 0xc2, 0x8d, 0x08, + 0x66, 0x84, 0x2f, 0x23, 0x2c, 0x59, 0xbf, 0x4d, 0x80, 0x8e, 0x31, 0x97, + 0xfa, 0x34, 0xbd, 0xa9, 0x77, 0xfd, 0xbc, 0xb5, 0xac, 0x0b, 0xf8, 0xeb, + 0x61, 0xd7, 0xdc, 0x17, 0xda, 0x75, 0x41, 0xf5, 0x28, 0x72, 0x81, 0xf7, + 0x81, 0xac, 0x3a, 0xce, 0x75, 0xe8, 0xee, 0x8e, 0xad, 0xcd, 0x52, 0x07, + 0xdf, 0xff, 0xcf, 0xe4, 0xeb, 0xaf, 0xe6, 0x6a, 0x33, 0x98, 0x27, 0x5f, + 0xfd, 0xa7, 0xdf, 0x5a, 0xc1, 0x06, 0xce, 0x1d, 0x7f, 0xf9, 0x1b, 0xa8, + 0xd9, 0xcf, 0x4a, 0x59, 0xa3, 0xab, 0x89, 0x85, 0x09, 0x0f, 0x96, 0x36, + 0xa3, 0x5f, 0x73, 0xb8, 0x27, 0x52, 0x1e, 0xfb, 0x9f, 0xdf, 0x7a, 0x37, + 0x64, 0xea, 0x6a, 0x7e, 0x3d, 0x8e, 0xb9, 0x92, 0x0b, 0x99, 0xe9, 0xd7, + 0xff, 0xa0, 0x5b, 0xf7, 0x8e, 0x04, 0xf7, 0x60, 0xeb, 0xfc, 0x8c, 0xeb, + 0x30, 0x67, 0x3a, 0xfa, 0x35, 0x1b, 0x4e, 0xbf, 0xfa, 0x05, 0xfd, 0x28, + 0x51, 0xd9, 0xf1, 0xd5, 0xd3, 0xe5, 0xfc, 0x8a, 0xf7, 0xc7, 0x69, 0xd4, + 0xd4, 0xcd, 0xc0, 0x2f, 0xa4, 0x9f, 0x42, 0x5f, 0x60, 0x8e, 0xf9, 0x7f, + 0x60, 0x4e, 0xbe, 0x40, 0xe2, 0xce, 0xbe, 0x77, 0x10, 0x1d, 0x66, 0x60, + 0xdf, 0xa8, 0x41, 0x77, 0xeb, 0x3a, 0xff, 0x32, 0xf3, 0x64, 0xa1, 0x8c, + 0xea, 0x43, 0xf5, 0xe9, 0x46, 0x85, 0xef, 0xf4, 0x3f, 0x3a, 0xcb, 0x84, + 0xab, 0x99, 0x64, 0xaa, 0x09, 0xe5, 0x32, 0x65, 0x7b, 0xc8, 0xc6, 0x52, + 0xa6, 0x8e, 0xfe, 0xdd, 0xa9, 0xae, 0xa1, 0xd7, 0xdf, 0xcb, 0xff, 0x1d, + 0x48, 0x9f, 0x8c, 0xd0, 0xd6, 0xd4, 0x26, 0xfc, 0x5f, 0xb2, 0x5b, 0x7d, + 0xcc, 0x76, 0x33, 0xae, 0x67, 0x47, 0x5b, 0x0e, 0xb6, 0xf8, 0x69, 0xbc, + 0x2f, 0x7d, 0xbc, 0x98, 0x1b, 0x9d, 0x7f, 0xf6, 0xb4, 0x11, 0x80, 0xf6, + 0x3d, 0xa3, 0xaa, 0x11, 0x25, 0x84, 0xff, 0x94, 0x5f, 0xee, 0xa3, 0xcb, + 0xc9, 0x39, 0xd7, 0xfe, 0xf2, 0x71, 0xc1, 0xb1, 0xec, 0xe9, 0xd7, 0xfc, + 0x8c, 0x8e, 0x79, 0x3f, 0x01, 0xd7, 0xf9, 0xf9, 0xed, 0x0a, 0x28, 0x75, + 0xff, 0xed, 0x62, 0x99, 0xff, 0x1c, 0x31, 0xd8, 0x3a, 0xa4, 0x9a, 0xa6, + 0xe5, 0xe8, 0x64, 0xc6, 0x80, 0xe7, 0x1a, 0x32, 0xbf, 0xff, 0xf3, 0xa7, + 0xa3, 0xa3, 0x9e, 0xea, 0x7d, 0x94, 0x6d, 0x41, 0x01, 0xd7, 0xe6, 0xe2, + 0xe3, 0x47, 0x57, 0x51, 0x22, 0xed, 0x77, 0xb1, 0x38, 0x75, 0xfe, 0x92, + 0x2f, 0xbb, 0xbb, 0x19, 0xd7, 0xcf, 0xc8, 0x91, 0xd7, 0xfc, 0xfb, 0xfc, + 0xdf, 0x58, 0x2a, 0x1d, 0x53, 0xa2, 0xb3, 0x71, 0xa5, 0x9b, 0x78, 0x82, + 0xfb, 0xac, 0x68, 0xb3, 0xaf, 0x0c, 0x00, 0xeb, 0xd0, 0xbc, 0xf8, 0x6f, + 0xb4, 0x49, 0x7f, 0xe8, 0xdf, 0xb0, 0xb6, 0xf5, 0x26, 0x3a, 0xa1, 0x3b, + 0xdc, 0x86, 0x72, 0x3e, 0xf0, 0xce, 0xfe, 0x10, 0xeb, 0x48, 0xb3, 0xaf, 0xcd, 0x79, 0xf1, 0x93, 0xaf, 0xd1, 0xc0, 0xe0, 0x9d, 0x58, 0x7f, 0x22, 0x59, 0xe2, 0x8b, 0xff, 0xa0, 0x11, 0xd5, 0x8b, 0xa9, 0xd4, 0x3a, 0xcc, 0x23, 0xaf, 0xee, 0xc0, 0xb2, 0xfb, 0x9d, 0x7f, 0xe1, 0x9a, 0x30, 0x67, 0xcd, 0xfc, 0x75, 0x04, 0xfa, 0xdc, 0xb6, 0xf2, 0x9f, 0x56, 0x75, 0xff, - 0xc8, 0x1e, 0xc3, 0x60, 0x0e, 0x20, 0x3a, 0xff, 0xff, 0x96, 0xe3, 0xbc, - 0x95, 0x67, 0x13, 0x66, 0x0e, 0x05, 0xe4, 0x78, 0xbd, 0x6f, 0xca, 0x79, - 0xdc, 0x4e, 0xbc, 0x3f, 0xce, 0x75, 0x39, 0xe1, 0xf8, 0x9a, 0x91, 0x1b, - 0x03, 0x0b, 0x7a, 0x85, 0x4d, 0xbc, 0x2d, 0x5a, 0x13, 0xbf, 0x89, 0x0e, - 0x87, 0xff, 0x8c, 0x66, 0xe6, 0x25, 0x8b, 0x3a, 0xf2, 0x47, 0x0e, 0xa6, - 0x11, 0xba, 0xe9, 0x05, 0xff, 0xdc, 0x45, 0xc3, 0x18, 0xe2, 0xf7, 0x83, - 0xaa, 0x47, 0xd5, 0x31, 0x2d, 0xf2, 0x0b, 0x84, 0xeb, 0xd3, 0xad, 0x0e, - 0xa0, 0x9b, 0xb1, 0x1f, 0xbf, 0x4b, 0x36, 0x44, 0x8e, 0xbd, 0x9c, 0x83, - 0xab, 0x74, 0x60, 0x22, 0xf7, 0x08, 0x3a, 0x51, 0x7f, 0xfd, 0x9e, 0xd6, - 0x4d, 0xd8, 0xd9, 0x9d, 0xec, 0x1d, 0x7f, 0xff, 0xfe, 0x4c, 0xdf, 0x49, - 0x8c, 0xfc, 0xcd, 0xe5, 0xa4, 0xf6, 0x93, 0x70, 0x87, 0xf9, 0xce, 0xbf, - 0xff, 0x20, 0x87, 0xe7, 0xdf, 0x26, 0x9d, 0x07, 0xf9, 0x1d, 0x42, 0x99, - 0x87, 0x94, 0x36, 0x42, 0x26, 0xf7, 0xfc, 0x91, 0xd7, 0xf3, 0xf8, 0x1f, - 0x46, 0x47, 0x5f, 0xe9, 0x7d, 0x81, 0x1f, 0xd6, 0x75, 0x7c, 0x3f, 0xf9, - 0xc7, 0x5c, 0xba, 0xff, 0x44, 0x91, 0x56, 0x59, 0x64, 0xab, 0xca, 0x60, - 0x4e, 0xbf, 0xba, 0xfc, 0x6c, 0x78, 0xeb, 0x9c, 0x27, 0x5f, 0xdc, 0x7d, - 0x75, 0xe4, 0x75, 0xb7, 0x3a, 0xe4, 0x64, 0xeb, 0xbe, 0x80, 0xea, 0x98, - 0xd7, 0x00, 0x5a, 0xf4, 0x9c, 0x27, 0x5c, 0xcb, 0x27, 0x54, 0x91, 0xab, - 0x82, 0xad, 0x2c, 0x43, 0xfd, 0x11, 0x32, 0x37, 0x7b, 0xdf, 0x40, 0x52, - 0xa7, 0xad, 0x7f, 0xdd, 0xc5, 0xa0, 0x67, 0xff, 0x47, 0x5f, 0xf2, 0x07, - 0x16, 0x93, 0x23, 0x27, 0x5f, 0xfe, 0x70, 0xe6, 0x0a, 0x9a, 0xd6, 0x08, - 0x0e, 0xbe, 0xef, 0xee, 0xa4, 0x1f, 0xfa, 0xce, 0x2f, 0xff, 0xe9, 0x3e, - 0xb5, 0x19, 0x3f, 0xf2, 0x0f, 0x05, 0xd9, 0x3a, 0xd0, 0x14, 0x4b, 0x21, - 0xd5, 0x69, 0x37, 0x6f, 0x46, 0x9f, 0x7e, 0xd3, 0xcf, 0xae, 0x9d, 0x52, - 0x56, 0xd6, 0x11, 0xcd, 0xe3, 0x57, 0x48, 0xe9, 0xbc, 0x55, 0x7e, 0xd9, - 0xf7, 0xa9, 0xe3, 0xaf, 0xfb, 0x3d, 0xd8, 0xe7, 0xb1, 0xa7, 0x5e, 0x8e, - 0x4c, 0x75, 0x42, 0xf6, 0x5e, 0x46, 0xda, 0x90, 0xb6, 0xe9, 0x8b, 0xcb, - 0xa1, 0x02, 0xc0, 0x95, 0xed, 0x9b, 0xde, 0xd3, 0xcc, 0x75, 0xff, 0xc8, - 0x17, 0xf2, 0x6b, 0x25, 0x9d, 0x3a, 0xe7, 0xda, 0x3a, 0xd9, 0xd3, 0xd9, - 0xf2, 0x0d, 0x6e, 0x89, 0xc1, 0x75, 0xbc, 0x2d, 0xda, 0x3a, 0xfb, 0x37, - 0x9f, 0x61, 0xd7, 0xfc, 0x21, 0xc1, 0xfe, 0x59, 0xa3, 0xaf, 0xf7, 0xdf, - 0x0e, 0x4e, 0x9c, 0x3a, 0xfb, 0xc9, 0xa4, 0x3a, 0xb1, 0x19, 0xdc, 0x1e, - 0x72, 0x51, 0x37, 0xfc, 0xd2, 0xff, 0xba, 0x81, 0x46, 0x0c, 0x0a, 0x1d, - 0x7f, 0x9e, 0x58, 0x1e, 0x6b, 0x47, 0x5f, 0x46, 0x7d, 0x09, 0xd7, 0xf9, - 0x44, 0xf3, 0xf5, 0x96, 0x33, 0xaf, 0xf6, 0x4d, 0xdc, 0xd3, 0x89, 0xd7, - 0xfe, 0x0e, 0x6f, 0x2d, 0x7b, 0x4e, 0x03, 0xab, 0x87, 0xe1, 0xf9, 0x8d, - 0xff, 0xc8, 0xbf, 0x8d, 0xea, 0x75, 0xa9, 0xa3, 0xaf, 0xf6, 0x4b, 0x3f, - 0x60, 0xb8, 0x9d, 0x5c, 0x3f, 0xae, 0xa2, 0xdf, 0xff, 0xe4, 0x1c, 0xdf, - 0xca, 0x3f, 0xbb, 0x1d, 0xcd, 0x8f, 0x23, 0xa8, 0x2a, 0x86, 0xda, 0x64, - 0x84, 0x5c, 0x85, 0x3f, 0xa1, 0x3b, 0xb0, 0x8a, 0xff, 0x82, 0x9c, 0x8d, - 0x80, 0xd4, 0x8e, 0xba, 0x16, 0x75, 0xbd, 0x07, 0x9f, 0xd3, 0xab, 0xff, - 0x46, 0x9f, 0xa8, 0x16, 0xa4, 0xe7, 0x54, 0x2b, 0x6b, 0xc9, 0x4a, 0x8f, - 0x0b, 0x3f, 0xc9, 0xef, 0x40, 0xf8, 0xeb, 0xfc, 0x9d, 0x4e, 0x4a, 0x68, - 0x3a, 0xff, 0xfc, 0x9f, 0xb7, 0xee, 0xe0, 0x7d, 0x3f, 0x13, 0x70, 0x1d, - 0x7c, 0xfc, 0x89, 0x1d, 0x7f, 0xff, 0x20, 0xba, 0x08, 0x39, 0x1d, 0x74, - 0xf4, 0x74, 0xea, 0x13, 0xf5, 0xf1, 0x05, 0xf9, 0x3d, 0xaf, 0xe7, 0x3a, - 0xff, 0xf0, 0xa0, 0x3d, 0xbb, 0x53, 0x9f, 0x60, 0x27, 0x5f, 0xf7, 0x7e, - 0x87, 0xff, 0x68, 0x10, 0x75, 0x42, 0x21, 0xdd, 0x2e, 0x82, 0x9e, 0x02, - 0x43, 0x39, 0x64, 0x3e, 0x85, 0x85, 0xfb, 0x9f, 0xb7, 0xb0, 0x75, 0xfd, - 0xc9, 0xa4, 0x9e, 0xd1, 0xd6, 0x18, 0x3d, 0x6c, 0x28, 0xbf, 0xd3, 0x3c, - 0xcf, 0xbc, 0xb4, 0x75, 0xfc, 0xf3, 0xa4, 0xc8, 0xc9, 0xd5, 0x87, 0xc6, - 0xe6, 0xb7, 0xf4, 0xf8, 0x33, 0xe3, 0x27, 0x5f, 0xf4, 0x4f, 0xf6, 0x5d, - 0xfd, 0xe7, 0x3a, 0xb0, 0xfa, 0xf8, 0x5d, 0x66, 0x11, 0xd7, 0xe8, 0xe7, - 0x33, 0xa7, 0x5f, 0xc2, 0xea, 0x42, 0xe0, 0xea, 0x60, 0x1f, 0x2c, 0x85, - 0x3f, 0x26, 0xbe, 0x89, 0xd4, 0x50, 0xeb, 0xff, 0xf2, 0x36, 0x17, 0xa7, - 0xe6, 0x2f, 0xf6, 0xbc, 0x8e, 0xb9, 0x36, 0x1d, 0x6e, 0x9d, 0x52, 0x3f, - 0xb6, 0x35, 0x4f, 0xc5, 0xef, 0x06, 0x16, 0x75, 0xfe, 0xc0, 0x64, 0xd1, - 0xbe, 0x8e, 0xa8, 0x3c, 0xec, 0x1b, 0xbf, 0xba, 0xf2, 0x8d, 0x48, 0xeb, - 0xfe, 0xce, 0xa6, 0xfa, 0xef, 0xfa, 0x3a, 0xec, 0x16, 0x9f, 0x30, 0x0b, - 0x2f, 0xe1, 0x70, 0x07, 0x04, 0xeb, 0xf2, 0x6d, 0xe7, 0x14, 0x3a, 0xe5, - 0x24, 0x75, 0xfb, 0xa9, 0xb1, 0x1a, 0x75, 0xd9, 0xd9, 0x1b, 0xf6, 0x8b, - 0xd2, 0xd1, 0x2b, 0xb6, 0xd3, 0x79, 0x96, 0x59, 0x2a, 0xff, 0xdc, 0x1f, - 0xdf, 0xee, 0x4d, 0x0b, 0x39, 0x52, 0xfe, 0xfd, 0xd4, 0x99, 0x19, 0x3a, - 0xcd, 0x3a, 0xa1, 0x11, 0x18, 0xa1, 0xc2, 0x8b, 0xfd, 0x01, 0xc9, 0x40, - 0xb4, 0xea, 0x86, 0x41, 0x94, 0x86, 0xb2, 0x3f, 0x26, 0x38, 0x4e, 0xcd, - 0x08, 0x8e, 0x42, 0x2d, 0x70, 0x86, 0xe9, 0xa3, 0xc2, 0x7c, 0x61, 0x03, - 0xa8, 0x43, 0x78, 0xb3, 0xf8, 0x5f, 0xb3, 0x0c, 0xdf, 0xa5, 0xd7, 0xdc, - 0xe6, 0x74, 0xeb, 0xfb, 0xa9, 0xb5, 0xb5, 0xfa, 0x87, 0x54, 0x1e, 0xb3, - 0x48, 0x6c, 0xc1, 0x3a, 0xc8, 0x75, 0xff, 0x7a, 0x39, 0xae, 0xc0, 0xf8, - 0xeb, 0x30, 0x4e, 0xbf, 0xef, 0x47, 0x35, 0xd8, 0x1f, 0x1d, 0x76, 0xa0, - 0xeb, 0xcb, 0x0c, 0x1d, 0x7f, 0x87, 0xcf, 0x36, 0xa3, 0xc7, 0x52, 0x1e, - 0x6b, 0x8d, 0xdf, 0x23, 0xe3, 0x4e, 0xbf, 0xf6, 0x6c, 0x1c, 0xd4, 0xc3, - 0x01, 0x3a, 0xf9, 0xa1, 0x89, 0xce, 0xb8, 0x10, 0x75, 0xed, 0x27, 0x0e, - 0xac, 0x3d, 0x20, 0x11, 0x78, 0x56, 0xff, 0x4b, 0x05, 0x03, 0x82, 0x75, - 0xef, 0x69, 0x58, 0x4f, 0x67, 0x05, 0x26, 0x37, 0xeb, 0x10, 0x08, 0x04, - 0x7f, 0x50, 0x90, 0xf1, 0x75, 0xda, 0x83, 0xaf, 0x2c, 0x30, 0x75, 0xfe, - 0x1f, 0x3c, 0xda, 0x8f, 0x1d, 0x48, 0x79, 0xae, 0x37, 0x7c, 0x8f, 0x8d, - 0x3a, 0xff, 0xd9, 0xb0, 0x73, 0x53, 0x0c, 0x04, 0xeb, 0xe6, 0x86, 0x27, - 0x3a, 0xfe, 0x98, 0x08, 0xc6, 0xf3, 0x1d, 0x70, 0x20, 0xeb, 0xda, 0x4e, - 0x1d, 0x58, 0x88, 0x36, 0x91, 0x00, 0xc7, 0xc2, 0xb7, 0xfa, 0x58, 0x28, - 0x1c, 0x13, 0xaf, 0xe1, 0x70, 0xe2, 0x8a, 0xc2, 0xe4, 0x40, 0x45, 0x30, - 0x3d, 0xb2, 0x84, 0x26, 0x84, 0x47, 0x58, 0x80, 0x40, 0x23, 0xfa, 0x86, - 0x0f, 0x8f, 0x2f, 0xfe, 0xe4, 0x6f, 0xa1, 0x85, 0xe6, 0xfe, 0x3a, 0xff, - 0xfc, 0xe1, 0xcc, 0x15, 0x3e, 0x8c, 0x0c, 0xe9, 0xc3, 0xaf, 0x3f, 0x27, - 0x3c, 0x82, 0x57, 0xd2, 0xcd, 0xe4, 0x79, 0x04, 0xaf, 0x69, 0x02, 0x79, - 0x04, 0xae, 0x65, 0x93, 0xc8, 0x25, 0x4d, 0x45, 0x2c, 0xc5, 0x3e, 0x2f, - 0x64, 0xa2, 0xe7, 0xf1, 0x64, 0x12, 0x2a, 0x6f, 0xef, 0xec, 0xee, 0x60, - 0xa8, 0x75, 0xe7, 0x10, 0x7c, 0x5f, 0x44, 0x89, 0xca, 0x9e, 0x43, 0x01, - 0x68, 0x83, 0x19, 0xc7, 0x8d, 0x2f, 0xb6, 0xf1, 0xfa, 0x75, 0xb1, 0x8d, - 0x14, 0x00, 0x7d, 0xb4, 0x8e, 0xbf, 0xd3, 0x4b, 0xf9, 0xfc, 0x93, 0x95, - 0x7f, 0xd0, 0x32, 0x18, 0x03, 0xac, 0xeb, 0x41, 0xd7, 0xf9, 0x25, 0xfb, - 0xeb, 0xa8, 0x75, 0xfd, 0x9b, 0x1d, 0x79, 0xd3, 0xad, 0x22, 0xaf, 0x3f, - 0x27, 0x2a, 0x8a, 0xa8, 0x36, 0xcd, 0x10, 0x58, 0xe5, 0xe8, 0x03, 0x4a, - 0x54, 0xd6, 0xd2, 0xd1, 0x78, 0x30, 0x90, 0xa8, 0x4c, 0x57, 0x21, 0xdd, - 0x7f, 0xfd, 0xf4, 0x65, 0xae, 0x87, 0x38, 0x05, 0xa6, 0x8e, 0xbe, 0xfd, - 0xf9, 0x23, 0xac, 0xb3, 0xae, 0xc9, 0x04, 0xd9, 0x4c, 0x45, 0x7f, 0xf6, - 0x6f, 0xed, 0x20, 0xc0, 0x1d, 0x67, 0x5f, 0x64, 0xc8, 0xb3, 0xaa, 0x73, - 0xe3, 0x65, 0x0a, 0xfe, 0x6c, 0x4d, 0x28, 0x01, 0x56, 0x43, 0xaf, 0xfa, - 0x7f, 0xe4, 0x1e, 0xfe, 0xe2, 0x75, 0xfc, 0x90, 0xb9, 0xf1, 0x93, 0xaf, - 0xd9, 0x3a, 0xf1, 0x67, 0x5e, 0xd2, 0x70, 0xea, 0x13, 0xc2, 0xf1, 0x3d, - 0xfc, 0x2e, 0x00, 0x7f, 0xa3, 0xaf, 0xe4, 0x53, 0xec, 0x2d, 0x50, 0xa6, - 0x0f, 0x81, 0xfc, 0x3b, 0xd3, 0x7f, 0x88, 0x6b, 0x13, 0xc8, 0x42, 0x41, - 0x8c, 0xd2, 0xf8, 0x72, 0x7f, 0xce, 0xbf, 0xec, 0xf7, 0xc1, 0xc0, 0x7d, - 0xdc, 0xea, 0x92, 0xea, 0xf8, 0x4a, 0xf0, 0x41, 0x43, 0x7e, 0x1a, 0xf6, - 0x32, 0x40, 0x13, 0x8c, 0x20, 0xf5, 0x29, 0x63, 0xc6, 0x9b, 0x64, 0x57, - 0xff, 0xe9, 0xf9, 0xcc, 0x0b, 0xaf, 0xaf, 0xe1, 0x89, 0x8e, 0xbf, 0xff, - 0xfd, 0xff, 0x3f, 0x98, 0x5c, 0x1a, 0xd6, 0x29, 0x9f, 0xf1, 0xc3, 0x1d, - 0x83, 0xaf, 0xf9, 0x55, 0xb8, 0x7b, 0x03, 0xf9, 0xd7, 0xdb, 0x5d, 0xff, - 0xe9, 0xd7, 0x99, 0x65, 0x92, 0xae, 0x94, 0x14, 0xa9, 0x7f, 0x50, 0x9b, - 0xa4, 0xea, 0xb8, 0xf5, 0xb9, 0xcf, 0x11, 0xef, 0xe5, 0x23, 0x9c, 0xce, - 0x9d, 0x7f, 0x4f, 0x34, 0x98, 0x5c, 0x9c, 0xeb, 0xe4, 0x81, 0xf1, 0xd7, - 0xa7, 0x71, 0x3a, 0xba, 0x6e, 0xbc, 0x3f, 0x7f, 0xe5, 0x3f, 0xd4, 0x93, - 0x93, 0xfe, 0x03, 0xaf, 0x3e, 0xec, 0x9d, 0x4a, 0x1f, 0x07, 0x50, 0xef, - 0xd3, 0xf1, 0x21, 0x67, 0x5f, 0xff, 0x47, 0xdf, 0x0c, 0x01, 0xfc, 0x0f, - 0xa3, 0x23, 0xa9, 0x88, 0x4e, 0x2f, 0x1b, 0xd2, 0x10, 0x2e, 0x47, 0xe2, - 0x7b, 0xff, 0x3f, 0xb4, 0xce, 0x74, 0x0f, 0xe3, 0xaf, 0xff, 0xfd, 0x9e, - 0x86, 0x8e, 0x60, 0xc4, 0xbd, 0xd7, 0x58, 0xe6, 0xc3, 0xa8, 0x28, 0xa6, - 0x64, 0xfa, 0xf7, 0xd0, 0xcc, 0x75, 0xe9, 0x20, 0x9d, 0x7d, 0x3f, 0xdd, - 0xa6, 0x4e, 0xbf, 0xe8, 0xeb, 0xa7, 0xa6, 0x46, 0x4e, 0xbf, 0xfc, 0xa4, - 0x6b, 0x91, 0xd1, 0xcf, 0x42, 0xce, 0xbf, 0xed, 0x0e, 0x6c, 0x49, 0x91, - 0x93, 0xaf, 0xff, 0xef, 0xde, 0x76, 0xff, 0x3f, 0xb3, 0xa3, 0x9e, 0xea, - 0x1d, 0x7e, 0x89, 0x87, 0xfd, 0x1d, 0x58, 0x98, 0x3a, 0x24, 0x74, 0xeb, - 0xcb, 0xb7, 0x20, 0x9d, 0x7f, 0x38, 0x83, 0x3c, 0xa1, 0xd5, 0x0a, 0x90, - 0x67, 0x24, 0x90, 0xfb, 0x8d, 0x09, 0x4f, 0xa3, 0x3f, 0xd8, 0x79, 0xb6, - 0x29, 0x7d, 0xdf, 0xd7, 0x07, 0x5c, 0xfa, 0x3a, 0xef, 0xd8, 0x27, 0x53, - 0x9e, 0x90, 0x91, 0x7e, 0x2b, 0x73, 0xaa, 0xc0, 0x7d, 0x21, 0xa6, 0x2d, - 0xb5, 0x85, 0x09, 0x36, 0x1e, 0x56, 0xc5, 0x48, 0xd8, 0x71, 0xdc, 0x4e, - 0x24, 0xcf, 0x28, 0x6e, 0x51, 0x9d, 0x86, 0x59, 0xbe, 0x52, 0x41, 0x94, - 0x8c, 0xed, 0xb2, 0x87, 0xf7, 0x8d, 0xbd, 0x25, 0x22, 0x31, 0xac, 0x4d, - 0x1f, 0xef, 0x25, 0x2c, 0x2e, 0x59, 0x47, 0x69, 0x13, 0x2f, 0x19, 0x00, - 0x21, 0xe2, 0x32, 0xec, 0xf5, 0x48, 0x7b, 0xf5, 0x3a, 0x83, 0xf9, 0x44, - 0x6c, 0xa5, 0xed, 0xc7, 0x71, 0xf6, 0x59, 0xce, 0xd4, 0x33, 0xaf, 0xcb, - 0xc4, 0x70, 0x1d, 0x7c, 0xd7, 0x76, 0x9a, 0x28, 0xab, 0xff, 0xf3, 0x82, - 0x1b, 0xd4, 0xd7, 0x53, 0xdd, 0xc1, 0x3a, 0xb8, 0x7f, 0xe2, 0x5b, 0x7e, - 0x55, 0x6f, 0x25, 0x61, 0x18, 0xb9, 0x0a, 0x4b, 0xfc, 0xae, 0x71, 0xae, - 0xed, 0x34, 0x5d, 0x17, 0xff, 0x2a, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, - 0x24, 0xbb, 0xf7, 0x1a, 0xee, 0xd3, 0x45, 0xe5, 0x73, 0xec, 0x3a, 0xca, - 0xe1, 0xe5, 0x6d, 0x99, 0xd4, 0x3e, 0xe6, 0x44, 0xf0, 0x87, 0x91, 0x56, - 0x42, 0x61, 0xb0, 0x95, 0x98, 0xe5, 0x67, 0xfd, 0x96, 0xb0, 0x37, 0xa5, - 0x41, 0xa9, 0x66, 0x1e, 0x45, 0xfc, 0xff, 0x64, 0x26, 0xef, 0xff, 0x2a, - 0xb7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x2c, 0xdd, 0xff, 0x4e, 0xbf, - 0xc8, 0x1e, 0xe2, 0x0a, 0x87, 0x5f, 0x75, 0xfd, 0xf9, 0xd7, 0xdd, 0x86, - 0x35, 0x9d, 0x7b, 0xf6, 0xb9, 0xd5, 0x24, 0x49, 0xa1, 0x8b, 0x19, 0x17, - 0xd2, 0x4b, 0xf8, 0x3e, 0xfd, 0xe5, 0xa3, 0xaf, 0x79, 0xd6, 0x75, 0xff, - 0xbb, 0x1d, 0x45, 0x3d, 0xa7, 0x01, 0xd7, 0xf0, 0xfb, 0x90, 0xed, 0x3a, - 0xf9, 0xae, 0xed, 0x34, 0x46, 0x77, 0xf2, 0x42, 0xe7, 0xc6, 0x4e, 0xb8, - 0x64, 0x75, 0x96, 0x75, 0xf9, 0x39, 0xd7, 0x57, 0x87, 0xa4, 0xb2, 0xdf, - 0xa2, 0xb7, 0xf3, 0xc9, 0x38, 0xfc, 0x3a, 0xff, 0xed, 0x27, 0xfa, 0xc1, - 0xfe, 0x59, 0xa3, 0xaf, 0x6a, 0x37, 0x3a, 0xa4, 0x9e, 0x0e, 0x1f, 0x70, - 0xad, 0x6f, 0xe2, 0x9d, 0xa2, 0xbf, 0x22, 0x5f, 0xf7, 0x1d, 0x9e, 0xa4, - 0x72, 0x0e, 0xbf, 0xe9, 0x6b, 0x23, 0xe4, 0x69, 0x67, 0x5f, 0x6f, 0xd8, - 0xd1, 0xd7, 0xda, 0x8f, 0x68, 0xea, 0xc3, 0xc3, 0xd1, 0x15, 0xff, 0xde, - 0x4e, 0x38, 0x3e, 0x6f, 0x28, 0x59, 0xd7, 0xe1, 0x89, 0x69, 0xce, 0xa4, - 0x3e, 0xbd, 0x88, 0xd7, 0xff, 0xff, 0xd9, 0xef, 0x22, 0xf8, 0x99, 0xb8, - 0xff, 0xe8, 0xef, 0xcd, 0x89, 0xe9, 0xa0, 0xeb, 0xfc, 0xf2, 0xd6, 0x9c, - 0x64, 0x75, 0xf9, 0x4f, 0x7a, 0x16, 0x75, 0xff, 0xef, 0x43, 0x53, 0xc8, - 0xb9, 0xb4, 0x82, 0x75, 0xa4, 0x75, 0x21, 0xec, 0x7d, 0x48, 0xbf, 0x02, - 0x3d, 0x01, 0x3a, 0x91, 0x19, 0x2f, 0x08, 0x0f, 0xc8, 0xef, 0xff, 0xbf, - 0xf6, 0xb7, 0x94, 0x08, 0x35, 0xf3, 0xf1, 0x3a, 0xf4, 0x7a, 0x0e, 0xa0, - 0x9f, 0x76, 0xc5, 0x4b, 0xdd, 0xc1, 0x3a, 0x90, 0xdf, 0x7e, 0x49, 0x77, - 0x66, 0x3a, 0xff, 0x6f, 0xa1, 0xce, 0x06, 0x0e, 0xa4, 0x3c, 0x97, 0x17, - 0xbe, 0xf7, 0x7f, 0xdb, 0x3a, 0xff, 0x64, 0x71, 0xe4, 0x9d, 0x3a, 0xff, - 0x23, 0x3a, 0x8e, 0xbb, 0x19, 0xd5, 0xc3, 0xe5, 0xf1, 0x85, 0x22, 0x2b, - 0x57, 0x08, 0xbb, 0xff, 0xc9, 0xdf, 0xd8, 0xc3, 0xdf, 0xf5, 0xbc, 0x9c, - 0xea, 0xc3, 0xf7, 0x72, 0x7b, 0xdf, 0x71, 0x84, 0x75, 0xff, 0xef, 0xc0, - 0xb4, 0x1c, 0x00, 0xe3, 0xcc, 0x75, 0xfe, 0x4e, 0xa4, 0x0c, 0xdf, 0x9d, - 0x7f, 0x93, 0x99, 0x83, 0xbf, 0x8e, 0xa8, 0x3e, 0x37, 0x32, 0xbf, 0xf7, - 0xe1, 0xe6, 0x7f, 0xd8, 0x5e, 0x1d, 0x58, 0x99, 0x5f, 0x08, 0x7b, 0x0a, - 0xbd, 0x10, 0x5f, 0xff, 0x6f, 0x24, 0xe0, 0x7b, 0xff, 0x31, 0xbd, 0xc3, - 0xae, 0x46, 0x4e, 0xbb, 0x6b, 0x0e, 0xad, 0x1a, 0xef, 0x0b, 0x5f, 0xda, - 0x8f, 0x6b, 0xa8, 0x75, 0xf8, 0x71, 0x7c, 0xc3, 0xaf, 0xb9, 0xb3, 0x02, - 0x75, 0x61, 0xfa, 0x2c, 0xb3, 0xf2, 0x5b, 0xe0, 0x26, 0xf2, 0x3a, 0xff, - 0x40, 0xf9, 0x27, 0x18, 0x3a, 0xff, 0xf2, 0x71, 0x27, 0x81, 0xce, 0xf3, - 0xfd, 0x87, 0x50, 0x11, 0x3a, 0x24, 0x5e, 0x30, 0xa6, 0x2d, 0x98, 0xbf, - 0x10, 0xaa, 0x9d, 0x04, 0x25, 0xd9, 0x1e, 0xe2, 0x8c, 0x7b, 0x9b, 0xa3, - 0xe4, 0xd0, 0x8c, 0xe1, 0x1a, 0xe1, 0x03, 0xd8, 0x7d, 0x3c, 0x38, 0x00, - 0xd4, 0x31, 0xa2, 0x6a, 0x34, 0xbf, 0x21, 0x6c, 0x7f, 0xdb, 0x84, 0xaf, - 0xd8, 0x66, 0x5f, 0xff, 0xfd, 0xfe, 0xf2, 0x55, 0xc7, 0xd8, 0xbd, 0x07, - 0xb1, 0xc0, 0xbb, 0xb2, 0x75, 0x2a, 0x9e, 0x28, 0xc6, 0xa3, 0x7f, 0xf9, - 0x55, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xa6, 0xff, 0xf2, 0xab, - 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x13, 0x8d, 0xff, 0x9e, 0x4a, 0xe7, - 0x1a, 0xee, 0xd3, 0x45, 0x03, 0x7d, 0xa1, 0xde, 0x47, 0x59, 0x55, 0x9f, - 0x67, 0x92, 0xaf, 0xdc, 0x6b, 0xbb, 0x4d, 0x17, 0x05, 0xfc, 0x39, 0xe6, - 0xa6, 0x8e, 0xba, 0x10, 0xeb, 0xfc, 0x32, 0x84, 0x0e, 0x2c, 0xea, 0xc4, - 0x51, 0x2c, 0xcf, 0xa5, 0x7f, 0x8a, 0x5f, 0xa4, 0xaa, 0x8c, 0x05, 0x0e, - 0xa5, 0x4f, 0xb2, 0x0f, 0x6e, 0x70, 0x1d, 0x7e, 0x9a, 0x50, 0x32, 0x3a, - 0x8e, 0xac, 0x36, 0x22, 0x4f, 0x7d, 0x00, 0xc6, 0x4e, 0xb9, 0x15, 0xe2, - 0x21, 0x85, 0x1b, 0xe8, 0xfd, 0xff, 0x49, 0x5c, 0xe3, 0x5d, 0xda, 0x68, - 0x92, 0x6c, 0xaf, 0x51, 0x04, 0xe7, 0xb7, 0x32, 0x03, 0xaf, 0xf3, 0xf8, - 0x72, 0x77, 0x13, 0xaf, 0xe9, 0x3f, 0x27, 0x0c, 0x1d, 0x7f, 0x60, 0xbe, - 0xf2, 0xd1, 0xd7, 0xf4, 0x2f, 0x98, 0x1f, 0x1d, 0x73, 0xaa, 0x14, 0x66, - 0x28, 0x2f, 0x31, 0x87, 0x0b, 0x74, 0x59, 0x53, 0xb6, 0x6d, 0xb2, 0xa7, - 0x3d, 0xb4, 0xaa, 0x65, 0x70, 0x43, 0x0f, 0x51, 0x9b, 0xfa, 0x32, 0xad, - 0x90, 0xf5, 0xbf, 0xf2, 0x8e, 0xae, 0x71, 0xae, 0xed, 0x34, 0x5a, 0x97, - 0xfe, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x12, 0xad, 0xc8, 0xc9, 0xd4, - 0x75, 0x95, 0x51, 0x16, 0xab, 0x4b, 0xf2, 0x56, 0xd0, 0xb5, 0xfd, 0x9c, - 0x6b, 0xbb, 0x4d, 0x11, 0x4d, 0xf2, 0x6a, 0x1c, 0xeb, 0xfc, 0x2e, 0x0d, - 0x7b, 0x1a, 0x75, 0xcb, 0x57, 0x47, 0xa1, 0xe1, 0xfa, 0x55, 0x16, 0xef, - 0x08, 0x8b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x46, 0x97, 0x7f, 0xd3, - 0xaf, 0xfc, 0x1c, 0x5a, 0x73, 0x35, 0x34, 0x1d, 0x7f, 0xff, 0xcf, 0xfe, - 0xbb, 0x81, 0xfb, 0xf7, 0x49, 0xf7, 0xc9, 0xa9, 0xbe, 0x9d, 0x79, 0x1d, - 0x93, 0xa9, 0x11, 0x90, 0xc6, 0x7a, 0xb7, 0x0b, 0xe6, 0xbb, 0xb4, 0xd1, - 0x4f, 0xdd, 0xe8, 0x3a, 0xb8, 0x78, 0x5e, 0x2d, 0xbf, 0xf7, 0xa6, 0x8f, - 0x75, 0xe6, 0xf9, 0x87, 0x5f, 0xfe, 0x45, 0x8f, 0xfd, 0x4e, 0x66, 0xa6, - 0x83, 0xaf, 0xfe, 0xff, 0xdc, 0xfe, 0x6d, 0x35, 0xe6, 0xd1, 0xd7, 0xff, - 0x64, 0xdf, 0x8c, 0xfa, 0x6b, 0xcd, 0xa3, 0xaf, 0xbf, 0xea, 0x70, 0xeb, - 0x2a, 0xc5, 0xaa, 0xb1, 0x88, 0x6f, 0xe3, 0xa2, 0x11, 0x3a, 0x08, 0xa4, - 0xf9, 0x27, 0x6d, 0x1e, 0xff, 0xf2, 0xab, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, - 0x4d, 0x13, 0x55, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x2b, 0xbb, 0xe6, - 0xbb, 0xb4, 0xd1, 0x5f, 0x5e, 0x65, 0x96, 0x4a, 0xb0, 0x94, 0xa9, 0x7f, - 0x5c, 0x3e, 0xb5, 0xa6, 0x5e, 0x94, 0x6e, 0x75, 0xe9, 0xb3, 0xa7, 0x5f, - 0xfb, 0x3a, 0xcb, 0xfb, 0x51, 0x93, 0x9d, 0x6f, 0x1d, 0x7f, 0xc9, 0xcc, - 0x9d, 0x25, 0x81, 0x3a, 0xb8, 0x78, 0xee, 0x21, 0x7e, 0xdf, 0x6b, 0xbf, - 0xfd, 0x3a, 0xdc, 0x3a, 0x8e, 0xb7, 0x50, 0xba, 0xe0, 0x85, 0x95, 0xc4, - 0xdb, 0xa6, 0x22, 0x71, 0xc1, 0x1c, 0xd4, 0x21, 0x7f, 0x21, 0xdb, 0x49, - 0xbf, 0xfc, 0xaa, 0xde, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0xf7, 0x7e, - 0xec, 0x6d, 0x3e, 0xe7, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x2e, 0x1b, 0x2b, - 0x07, 0xbb, 0x85, 0x57, 0xff, 0x2a, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, - 0x24, 0xfa, 0x86, 0x45, 0x3c, 0xf0, 0xff, 0x91, 0x42, 0x92, 0xbc, 0x1b, - 0x08, 0x29, 0x95, 0xf9, 0x28, 0x63, 0xae, 0x7a, 0x85, 0xa6, 0xc2, 0x7b, - 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x45, 0x57, 0xee, 0x35, 0xdd, 0xa6, - 0x8a, 0x66, 0xfe, 0x4e, 0xe3, 0xee, 0x03, 0xac, 0xae, 0x1e, 0xfe, 0xd9, - 0x9d, 0xff, 0xe5, 0x56, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x26, 0x7b, - 0xff, 0xca, 0xad, 0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x51, 0xb5, 0x3a, - 0x6e, 0xe1, 0x84, 0xf2, 0x85, 0x7e, 0x57, 0xbf, 0xf3, 0xc9, 0x5c, 0xe3, - 0x5d, 0xda, 0x68, 0x8e, 0xaf, 0xfe, 0xe4, 0xea, 0xe8, 0x73, 0xda, 0x85, - 0x9d, 0x4a, 0xa2, 0x3e, 0x12, 0xae, 0xff, 0xa7, 0x5f, 0x35, 0xbf, 0xb4, - 0xeb, 0xf6, 0x08, 0x72, 0x73, 0xaf, 0xf4, 0x43, 0x73, 0x9c, 0xc3, 0xa9, - 0x0f, 0x58, 0x49, 0xaf, 0xd9, 0xc6, 0xfe, 0xa1, 0xd7, 0xfe, 0x1c, 0x51, - 0xe6, 0xd7, 0x60, 0x27, 0x5e, 0x99, 0xfc, 0x75, 0xf3, 0x5d, 0xda, 0x68, - 0xa6, 0xaf, 0xd9, 0xbb, 0x2f, 0xd3, 0xaf, 0xfe, 0xd6, 0x08, 0x63, 0xe3, - 0x14, 0xd8, 0x04, 0x3a, 0x82, 0x99, 0x22, 0x14, 0xcc, 0x7d, 0xc1, 0xc1, - 0x2d, 0xd1, 0x45, 0xff, 0xff, 0x60, 0xfb, 0x48, 0xdc, 0x1d, 0x37, 0xa9, - 0xd6, 0xfd, 0x9c, 0xeb, 0xfe, 0xd3, 0xef, 0x93, 0x47, 0x74, 0x75, 0xdd, - 0x41, 0x45, 0x07, 0x99, 0xef, 0xfe, 0x97, 0x50, 0x67, 0xd7, 0xf1, 0xc9, - 0x8e, 0xbf, 0xed, 0x69, 0xa9, 0xce, 0x24, 0xe7, 0x5f, 0xfb, 0x19, 0x70, - 0x3f, 0xbd, 0x9d, 0x3a, 0xff, 0x76, 0x10, 0x0f, 0xef, 0xce, 0xbf, 0xf0, - 0xff, 0xee, 0xe4, 0xd2, 0x8d, 0xce, 0xb4, 0xc7, 0x5f, 0xb3, 0xae, 0x21, - 0x3a, 0xa7, 0x36, 0xc0, 0x11, 0xba, 0x14, 0x3a, 0xfe, 0x70, 0x69, 0x86, - 0x61, 0x98, 0x63, 0xaf, 0xe4, 0x85, 0xcf, 0x8c, 0x9d, 0x7f, 0xfd, 0x9e, - 0xee, 0x4b, 0x8e, 0x3e, 0xeb, 0xc8, 0xeb, 0xa0, 0x07, 0x5f, 0xe7, 0xde, - 0x1a, 0x8d, 0x57, 0x88, 0x8f, 0x12, 0xdf, 0xa9, 0xb5, 0x89, 0xe9, 0xa3, - 0xb7, 0x48, 0x84, 0x5b, 0x50, 0xcb, 0xbc, 0xcb, 0xce, 0x75, 0xff, 0x40, - 0x1f, 0xc0, 0xfa, 0x32, 0x3a, 0xde, 0xe9, 0xeb, 0x08, 0xed, 0x95, 0x62, - 0xd7, 0xa0, 0xe0, 0x5c, 0x2f, 0x39, 0x1a, 0x23, 0x61, 0xef, 0xb9, 0x6f, - 0x11, 0x84, 0xe7, 0x47, 0xbe, 0x94, 0x0b, 0xf6, 0x14, 0x77, 0xee, 0x35, - 0xdd, 0xa6, 0x8a, 0xaa, 0xff, 0xcf, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, - 0x6d, 0xb2, 0xb8, 0x7f, 0xab, 0x33, 0xbf, 0xca, 0xe7, 0x1a, 0xee, 0xd3, - 0x45, 0x7f, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0xb1, 0xae, 0xda, 0x91, 0xd6, - 0x57, 0x0f, 0x32, 0x63, 0x3b, 0xf6, 0x9b, 0xd8, 0x50, 0xeb, 0xfc, 0x3f, - 0xcb, 0x34, 0xfe, 0x3a, 0xfe, 0x62, 0x02, 0xc5, 0xb1, 0x62, 0xa1, 0xd7, - 0xfc, 0x3f, 0xcf, 0x34, 0xa3, 0x93, 0x9d, 0x77, 0x3c, 0x75, 0xf3, 0xcb, - 0x02, 0x75, 0xfd, 0xec, 0xe0, 0x70, 0x4e, 0xb6, 0x04, 0xf2, 0xfc, 0x41, - 0x79, 0x49, 0x61, 0xd6, 0x57, 0x13, 0x4f, 0x59, 0x97, 0x4f, 0x5c, 0xf0, - 0x58, 0x74, 0x4f, 0x64, 0x55, 0x3d, 0x3e, 0x46, 0xef, 0x7e, 0xe3, 0x5d, - 0xda, 0x68, 0xb5, 0x6f, 0xfc, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x28, - 0x2b, 0xf4, 0x33, 0xb7, 0x9c, 0x3a, 0xca, 0xe2, 0x29, 0xd6, 0x67, 0xf5, - 0x2a, 0xff, 0x40, 0x82, 0x18, 0xdd, 0x67, 0x5d, 0xc8, 0x3a, 0xa4, 0x79, - 0x1b, 0x46, 0x77, 0xcd, 0x77, 0x69, 0xa2, 0xe2, 0xbf, 0xbf, 0x7d, 0xc3, - 0x9c, 0x3a, 0xb8, 0x7b, 0x7a, 0x2d, 0xbd, 0xc8, 0x59, 0xd7, 0xcf, 0xb4, - 0x93, 0x9d, 0x7e, 0xef, 0xea, 0x60, 0x9d, 0x7e, 0x0e, 0x31, 0xc7, 0x4e, - 0xbd, 0xb4, 0x8d, 0x3a, 0x82, 0x7d, 0xfc, 0x28, 0xda, 0x29, 0xbf, 0xcb, - 0x79, 0x69, 0x03, 0x87, 0x5d, 0xad, 0xb3, 0xaf, 0xf4, 0x2d, 0xf6, 0x47, - 0x36, 0x8e, 0xbf, 0xb3, 0x8f, 0xef, 0xe0, 0xeb, 0xff, 0xe7, 0x18, 0x4d, - 0xad, 0x26, 0xb3, 0xb9, 0xb6, 0x75, 0x04, 0xff, 0x76, 0x16, 0x5f, 0xfc, - 0x83, 0xfc, 0xb3, 0x5a, 0x40, 0xe1, 0xd5, 0x31, 0xf3, 0x78, 0x92, 0xca, - 0xc2, 0xb0, 0x8c, 0x84, 0x07, 0x08, 0xba, 0x36, 0xf0, 0x93, 0x01, 0x96, - 0x8c, 0x7c, 0x33, 0xf6, 0x31, 0x9b, 0xf3, 0x09, 0x87, 0x81, 0x48, 0x3a, - 0xff, 0xc9, 0xbb, 0x0d, 0xae, 0x7c, 0xf9, 0xdd, 0xb3, 0xaf, 0xbb, 0x1e, - 0x69, 0xd4, 0xc5, 0x4f, 0xb4, 0x29, 0x97, 0xff, 0x98, 0x65, 0x19, 0x63, - 0x9c, 0x2c, 0x2f, 0x9f, 0x3b, 0xb6, 0x75, 0xfb, 0x8d, 0x77, 0x69, 0xa2, - 0xe9, 0xbf, 0x40, 0xb8, 0x60, 0xeb, 0xd1, 0xed, 0xa3, 0xaf, 0xb0, 0x38, - 0x13, 0xaf, 0xf9, 0xf6, 0x47, 0xb5, 0xfb, 0x58, 0x27, 0x59, 0x56, 0x19, - 0x3f, 0xd8, 0x84, 0xfc, 0x8a, 0x31, 0x89, 0x0c, 0xfa, 0x48, 0xe3, 0xc2, - 0x41, 0x7f, 0xfd, 0x83, 0xe4, 0x5f, 0x61, 0x05, 0xf8, 0xa1, 0xd7, 0xf6, - 0x66, 0x9b, 0xe8, 0x3a, 0xfe, 0x9e, 0x3c, 0xea, 0x7e, 0x75, 0x1d, 0x7f, - 0xf4, 0x70, 0x1f, 0x35, 0xd8, 0x5b, 0x89, 0xd7, 0xfa, 0x39, 0xf7, 0xbd, - 0xc0, 0x1d, 0x52, 0x3f, 0x8e, 0xa2, 0x5f, 0xd2, 0x79, 0x38, 0xb4, 0xeb, - 0xff, 0xd9, 0xe8, 0x67, 0xec, 0xfa, 0xc5, 0xc3, 0x19, 0xd6, 0x55, 0x88, - 0x4c, 0x7b, 0x21, 0x05, 0x31, 0x10, 0x95, 0xd7, 0x13, 0x9b, 0x5c, 0x69, - 0xb7, 0xd8, 0xcb, 0x10, 0xb3, 0xaf, 0xf9, 0x38, 0x31, 0xba, 0xdf, 0xc7, - 0x5f, 0xff, 0xf7, 0xfc, 0x96, 0xba, 0xe9, 0xce, 0x73, 0xfd, 0xd3, 0x8f, - 0xa3, 0xaf, 0xfc, 0x2e, 0xcf, 0xb3, 0xaf, 0x33, 0x9d, 0x7f, 0xff, 0x74, - 0x7f, 0x76, 0x3c, 0x97, 0x71, 0x4c, 0x0c, 0xdf, 0x9d, 0x73, 0x70, 0xea, - 0x83, 0xf5, 0x51, 0x82, 0xf2, 0x9a, 0x91, 0xd7, 0xfe, 0x96, 0x73, 0x8f, - 0x29, 0xf1, 0x93, 0xaf, 0xfe, 0xc0, 0xc4, 0xa3, 0x91, 0xf5, 0xc4, 0xeb, - 0xff, 0x6c, 0xc9, 0x2c, 0x29, 0xb2, 0x02, 0x75, 0x2d, 0x10, 0x6e, 0x85, - 0x73, 0xab, 0x3a, 0xa3, 0xe9, 0x9a, 0x79, 0x0b, 0x2d, 0x11, 0x78, 0x77, - 0xec, 0x30, 0xab, 0xaa, 0xba, 0x06, 0x53, 0xad, 0xff, 0xbc, 0x8d, 0x40, - 0xb8, 0xa9, 0x07, 0x5f, 0xf4, 0x6f, 0xd7, 0xd7, 0xa1, 0x93, 0xaa, 0x0f, - 0xd7, 0x87, 0x97, 0x7f, 0xd3, 0xaf, 0xc3, 0x9d, 0x7f, 0x1d, 0x7f, 0x49, - 0xf3, 0x64, 0x04, 0xea, 0x60, 0x1e, 0x93, 0x14, 0x25, 0xbe, 0x4f, 0xe5, - 0x07, 0x5f, 0x9e, 0x69, 0x27, 0x8e, 0xbf, 0xf4, 0x07, 0x91, 0x24, 0xdf, - 0xd8, 0x75, 0x49, 0x10, 0xa0, 0x21, 0xf1, 0x3d, 0xff, 0xa3, 0x9a, 0xea, - 0x35, 0xbf, 0xce, 0x75, 0xff, 0xff, 0x40, 0x7b, 0x9b, 0xf8, 0x5f, 0xa0, - 0x7d, 0x69, 0xf8, 0xd3, 0xaf, 0xf6, 0x66, 0x28, 0xa3, 0xc8, 0xea, 0x51, - 0x12, 0xfe, 0x65, 0xbf, 0x66, 0x9b, 0xe8, 0x3a, 0xff, 0xf2, 0x33, 0xa6, - 0xf5, 0x37, 0xf7, 0x39, 0x07, 0x56, 0x1f, 0x8f, 0x09, 0xaf, 0xdb, 0x13, - 0x98, 0x13, 0xaf, 0xff, 0xb5, 0xd4, 0xd7, 0xbb, 0x81, 0x4d, 0x60, 0x9d, - 0x7b, 0xb0, 0x38, 0x7e, 0xbf, 0x94, 0x5f, 0xe8, 0x5e, 0x22, 0xe1, 0x8c, - 0xeb, 0xfd, 0x25, 0xe9, 0x07, 0x79, 0x1d, 0x4d, 0x3e, 0x69, 0x8c, 0xef, - 0x3b, 0xb4, 0xd1, 0x26, 0x5e, 0xda, 0x4d, 0x1d, 0x4d, 0x3c, 0x5d, 0xa2, - 0x7b, 0xf3, 0x58, 0x66, 0x13, 0x10, 0xc0, 0x3a, 0xff, 0x66, 0xfe, 0xf3, - 0xcb, 0x47, 0x54, 0x1f, 0x6f, 0x0e, 0xaf, 0xf0, 0xbf, 0xb4, 0xdf, 0xc4, - 0xeb, 0xff, 0xfb, 0x98, 0x04, 0x03, 0x38, 0x9b, 0x07, 0x3d, 0xd4, 0x3a, - 0xb1, 0x11, 0x88, 0x65, 0x52, 0x54, 0xc1, 0x90, 0x98, 0xe3, 0x42, 0xe1, - 0x25, 0xd8, 0x56, 0xdf, 0xc1, 0x03, 0x03, 0x40, 0xdb, 0x3a, 0xf6, 0x90, - 0x27, 0x5f, 0xc3, 0x1b, 0xad, 0xfc, 0x75, 0xff, 0x43, 0x7d, 0xff, 0x79, - 0x0c, 0x9d, 0x7f, 0x9a, 0x9c, 0xd4, 0xd0, 0xe7, 0x5f, 0xfd, 0xfe, 0xba, - 0xf2, 0xeb, 0xca, 0x04, 0xea, 0xdc, 0xfd, 0x78, 0x65, 0x77, 0x52, 0x64, - 0xc6, 0x78, 0x36, 0xb2, 0xcf, 0x42, 0xbe, 0xfb, 0xc8, 0xb7, 0x3a, 0xca, - 0x1d, 0x7f, 0x77, 0x51, 0xe8, 0x09, 0xd5, 0x86, 0xf5, 0x04, 0x6b, 0x0f, - 0xf3, 0xcb, 0xb7, 0xfd, 0x1d, 0xf2, 0x4e, 0xb8, 0x69, 0xd7, 0xff, 0xe7, - 0x6f, 0x23, 0xa3, 0x9e, 0xc5, 0x59, 0x65, 0x92, 0xaa, 0x48, 0xb0, 0xd1, - 0x0f, 0x8e, 0x2f, 0xe6, 0xb7, 0xf6, 0x8c, 0x1d, 0x7f, 0xfb, 0x37, 0x90, - 0xc4, 0xb9, 0x1e, 0x7f, 0x1d, 0x7f, 0xe7, 0xf4, 0x73, 0x5d, 0x81, 0xf1, - 0xd7, 0xec, 0x92, 0x3e, 0xc3, 0xa8, 0x4f, 0x8f, 0x47, 0x95, 0x24, 0x66, - 0x7f, 0x0a, 0xbb, 0xcb, 0x7e, 0x9d, 0x7f, 0xf8, 0x62, 0x5c, 0xe7, 0xfb, - 0xa7, 0x1f, 0x47, 0x5f, 0xff, 0x6b, 0x14, 0x1c, 0xf6, 0xb2, 0x42, 0xec, - 0x9d, 0x64, 0xea, 0x26, 0x3c, 0x95, 0x48, 0x8d, 0xbd, 0x90, 0xb3, 0xbe, - 0xda, 0x8e, 0xe8, 0xea, 0x83, 0xcd, 0xc2, 0x9b, 0xfb, 0xc3, 0xfc, 0xfb, - 0xb1, 0x9d, 0x7f, 0xfa, 0x27, 0x1c, 0xc9, 0xfc, 0xa4, 0x0c, 0x8e, 0xbf, - 0xf3, 0x8c, 0xfd, 0x75, 0xa6, 0x90, 0xea, 0x74, 0x5c, 0x09, 0x9b, 0x29, - 0x37, 0x99, 0x65, 0x92, 0xaf, 0xa7, 0x5a, 0x68, 0xa5, 0x4b, 0xfb, 0xa0, - 0x27, 0x5b, 0x8e, 0x78, 0xe2, 0x65, 0x7e, 0x8c, 0x17, 0x59, 0xd7, 0xff, - 0xfe, 0x71, 0x6f, 0x33, 0x64, 0x0f, 0x97, 0x18, 0x21, 0xcd, 0xfc, 0x75, - 0x01, 0x11, 0xdf, 0x92, 0x5f, 0xe9, 0x47, 0x27, 0x8e, 0x4e, 0x75, 0xfd, - 0xad, 0x26, 0x08, 0x0e, 0xbd, 0xcc, 0x63, 0x3a, 0xff, 0xd0, 0xcf, 0xd9, - 0xf5, 0x8b, 0x86, 0x33, 0xab, 0x88, 0x8d, 0x59, 0x5f, 0x87, 0xaa, 0x11, - 0xe3, 0x90, 0xc1, 0xbf, 0x27, 0xa7, 0xc6, 0x4e, 0xbf, 0xe8, 0x6f, 0x47, - 0xff, 0x46, 0x8e, 0xbf, 0xf9, 0x36, 0xa1, 0xb0, 0xbc, 0x0b, 0xac, 0xeb, - 0xff, 0xf7, 0xbb, 0x92, 0xf8, 0xde, 0xa7, 0xb7, 0x6a, 0x70, 0xea, 0xe2, - 0x3f, 0x16, 0x51, 0xd3, 0x81, 0x44, 0xbf, 0xe5, 0xc7, 0x36, 0x67, 0x22, - 0x63, 0xaf, 0xfd, 0xc6, 0xae, 0x37, 0xd6, 0x6c, 0xc3, 0xaf, 0xf0, 0x83, - 0x6f, 0x03, 0x8b, 0x3a, 0xfe, 0x1f, 0x9b, 0x79, 0xc8, 0x3a, 0xa1, 0x14, - 0x98, 0x80, 0xe6, 0x97, 0xfd, 0x8e, 0x0f, 0x98, 0x17, 0x91, 0xd7, 0xff, - 0x9e, 0x7e, 0xa4, 0x0e, 0x4c, 0x9c, 0x43, 0xab, 0x13, 0xc6, 0x01, 0xe6, - 0xa1, 0xbd, 0xe2, 0xd6, 0x4e, 0x2f, 0xc3, 0x9d, 0x7f, 0x1d, 0x7f, 0xe9, - 0x40, 0xcf, 0xf7, 0x83, 0xfc, 0x8e, 0xa6, 0x33, 0xe6, 0x98, 0x96, 0xfb, - 0xd3, 0xe0, 0x4e, 0xbf, 0xe4, 0x53, 0xef, 0x00, 0xb4, 0xd1, 0xd5, 0x31, - 0xee, 0xed, 0x91, 0x5e, 0x65, 0x96, 0x4e, 0xbf, 0xff, 0x62, 0xfc, 0x30, - 0x0c, 0x0e, 0xb1, 0x70, 0xd2, 0x95, 0x2f, 0xef, 0xfd, 0x9b, 0xfc, 0x1c, - 0xd9, 0xc4, 0xd1, 0xd7, 0xf3, 0x7a, 0x90, 0x2d, 0x3a, 0xa0, 0xfb, 0x31, - 0x06, 0xff, 0x72, 0x3c, 0x8d, 0x40, 0x9d, 0x7e, 0x94, 0xd9, 0x8d, 0x3a, - 0xdc, 0x3a, 0x98, 0x93, 0xe8, 0x83, 0x1f, 0xa4, 0xf5, 0x8a, 0x94, 0xd2, - 0x10, 0x7d, 0x45, 0x18, 0x67, 0x6a, 0x11, 0x17, 0xbd, 0x2e, 0x9d, 0x64, - 0x3a, 0xfe, 0xec, 0x7c, 0x6a, 0x4e, 0x75, 0xfd, 0xc7, 0xe0, 0xc4, 0x8e, - 0xbf, 0xfe, 0x85, 0x35, 0xd7, 0x4f, 0x42, 0xc5, 0xd4, 0x3a, 0xff, 0xd9, - 0xb3, 0xa9, 0xf3, 0x5a, 0x45, 0x9d, 0x73, 0xfa, 0x48, 0x8f, 0xea, 0x75, - 0xff, 0x92, 0x49, 0xcd, 0xe0, 0x63, 0x47, 0x53, 0x0f, 0x4d, 0x88, 0x21, - 0xfc, 0x2f, 0x18, 0x5d, 0x78, 0xba, 0xe9, 0x2a, 0xc5, 0xb6, 0xd3, 0x6c, - 0x26, 0x98, 0x85, 0x8c, 0xe6, 0x12, 0x86, 0xb8, 0x61, 0x2b, 0x92, 0xbd, - 0x94, 0x5a, 0x6c, 0x69, 0xdb, 0xc6, 0xf6, 0x86, 0x13, 0x43, 0xe7, 0x91, - 0xa8, 0xf6, 0x1b, 0x0f, 0x09, 0x50, 0x42, 0xd0, 0x63, 0x15, 0xd4, 0xae, - 0x8f, 0x4b, 0x09, 0xdb, 0x58, 0xfb, 0x1b, 0xf5, 0xff, 0xee, 0x63, 0x21, - 0xee, 0x4c, 0x39, 0xc9, 0x1d, 0x7b, 0x98, 0xc6, 0x75, 0xff, 0xa1, 0x9f, - 0xb3, 0xeb, 0x17, 0x0c, 0x67, 0x57, 0x11, 0x58, 0xb4, 0xaf, 0x0f, 0x5f, - 0xff, 0x3a, 0xe3, 0x8d, 0xe7, 0xea, 0x73, 0xf7, 0xd1, 0xd5, 0x88, 0x82, - 0xfc, 0xc2, 0xff, 0x71, 0xbf, 0xb8, 0x57, 0x07, 0x5f, 0xfd, 0x1c, 0xfb, - 0xe4, 0xf7, 0x70, 0x28, 0x75, 0xff, 0xba, 0x31, 0x3f, 0xde, 0xf5, 0xd8, - 0xce, 0xa8, 0x45, 0xd4, 0xe6, 0x78, 0x89, 0x79, 0xf9, 0x39, 0xd7, 0x32, - 0xc9, 0xd7, 0x9d, 0xaa, 0xb4, 0xda, 0x32, 0x39, 0x7f, 0x47, 0x1e, 0x49, - 0xd3, 0xaf, 0xd8, 0xbe, 0xb8, 0x4e, 0xb2, 0xb0, 0xe8, 0x4a, 0x42, 0x99, - 0x91, 0xe3, 0x28, 0x54, 0xd9, 0x61, 0xfc, 0x85, 0x03, 0xd6, 0xd7, 0x83, - 0x2a, 0xf7, 0x50, 0xdd, 0xd8, 0xc6, 0xc9, 0xa6, 0xd1, 0x5d, 0x49, 0xda, - 0x03, 0x06, 0x7a, 0x9b, 0x78, 0xce, 0xf8, 0x50, 0xb8, 0x45, 0xf6, 0x3f, - 0xc0, 0x43, 0x5f, 0x52, 0xe2, 0x3d, 0x2a, 0x4f, 0xfb, 0x43, 0x4f, 0x7f, - 0x6a, 0x26, 0x92, 0x4c, 0x75, 0xff, 0xe8, 0x9f, 0x3d, 0x02, 0x80, 0xcd, - 0xfc, 0x75, 0x95, 0xd1, 0xfb, 0x7d, 0x2e, 0xbf, 0x71, 0xae, 0xed, 0x34, - 0x46, 0xb7, 0x94, 0xdf, 0x47, 0x59, 0x5c, 0x3d, 0x1f, 0x19, 0xdf, 0xb8, - 0xd7, 0x76, 0x9a, 0x2a, 0x5b, 0x9d, 0xa6, 0x88, 0x6a, 0xca, 0xe1, 0xea, - 0xb9, 0x9d, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0x3e, 0xbf, 0xfe, 0x17, 0xf4, - 0xa1, 0x4f, 0x91, 0xed, 0x40, 0x0e, 0xbc, 0xf2, 0x57, 0x11, 0x07, 0xf4, - 0xce, 0xff, 0xcf, 0x3c, 0x75, 0x38, 0x90, 0xb3, 0xaf, 0xf4, 0x73, 0x07, - 0xd9, 0xd3, 0xaf, 0x2f, 0x15, 0xdb, 0x3e, 0xcf, 0xa7, 0x94, 0xaa, 0x36, - 0xe2, 0x14, 0x57, 0xff, 0xfd, 0x2f, 0xf8, 0xa3, 0xeb, 0x03, 0x1b, 0xeb, - 0xef, 0x94, 0x45, 0x0e, 0xbf, 0xbf, 0xdf, 0x79, 0x67, 0x8e, 0xbf, 0xfc, - 0xc3, 0x28, 0xcb, 0x1c, 0xe1, 0x61, 0x7c, 0xf9, 0xdd, 0xb3, 0xaf, 0xdc, - 0x6b, 0xbb, 0x4d, 0x16, 0x3d, 0xcf, 0xa3, 0xaf, 0xe9, 0xfe, 0xf3, 0x99, - 0xc3, 0xaa, 0x47, 0x8a, 0xe2, 0xb7, 0xfc, 0x2e, 0xa7, 0x52, 0x06, 0x73, - 0xaf, 0xff, 0xc0, 0x94, 0xec, 0x34, 0x31, 0x73, 0xb7, 0x9f, 0x3e, 0x77, - 0x6c, 0xeb, 0xf2, 0x7b, 0xc9, 0xe3, 0xaf, 0xb9, 0xcc, 0xdb, 0x3a, 0xb0, - 0xf2, 0x9c, 0x9a, 0xfd, 0x9c, 0xcc, 0x98, 0xeb, 0x2b, 0x0a, 0xb2, 0x67, - 0x6d, 0x91, 0x86, 0x31, 0x23, 0xc4, 0xc4, 0x3d, 0x37, 0xd4, 0x2d, 0x3e, - 0x90, 0x5e, 0x61, 0x96, 0xa1, 0xd7, 0xf3, 0x00, 0x73, 0xaf, 0xe3, 0xaf, - 0xf3, 0x83, 0x4f, 0xef, 0x39, 0xd7, 0x2d, 0xa7, 0x50, 0x9e, 0x3f, 0x8c, - 0x6f, 0xfd, 0x8c, 0xf3, 0x05, 0xf7, 0x96, 0x8e, 0xbe, 0xd7, 0x51, 0x93, - 0xaf, 0xd0, 0xcf, 0xb3, 0xa7, 0x56, 0x1e, 0x48, 0x91, 0x5f, 0x01, 0x69, - 0xc3, 0xaf, 0xff, 0xfa, 0x38, 0x38, 0x1c, 0xef, 0x51, 0xbd, 0x4f, 0x69, - 0xf7, 0x3a, 0x91, 0x10, 0xbd, 0x21, 0xbf, 0xa3, 0x80, 0xdb, 0xff, 0xc7, - 0x5f, 0xf4, 0x0f, 0x98, 0x4f, 0xef, 0xe0, 0xeb, 0xff, 0xd1, 0xd8, 0x5b, - 0x7a, 0x9e, 0xcc, 0x59, 0xd7, 0xc0, 0x02, 0x7d, 0x3a, 0xf3, 0xbb, 0x4d, - 0x16, 0x85, 0xff, 0x9d, 0x9d, 0xa6, 0xbf, 0x27, 0xc6, 0x4e, 0xbf, 0x81, - 0x03, 0x1e, 0xd1, 0xd4, 0xd4, 0x4a, 0xf0, 0x9c, 0x08, 0x77, 0xff, 0xff, - 0xc9, 0xce, 0xb8, 0xa4, 0x79, 0x3b, 0x1a, 0xee, 0x6b, 0x98, 0xdc, 0xf1, - 0xd5, 0x25, 0x42, 0x61, 0x31, 0x69, 0xda, 0x23, 0xf2, 0x17, 0x1d, 0x30, - 0xbb, 0x16, 0x75, 0xff, 0xcf, 0xbe, 0xce, 0xb1, 0xa7, 0x86, 0x16, 0x75, - 0x70, 0xf7, 0x5c, 0x56, 0xff, 0xfc, 0x9e, 0xd3, 0xef, 0xad, 0x67, 0x53, - 0x5f, 0xce, 0x75, 0xff, 0xf7, 0xf3, 0xf1, 0x3d, 0x3f, 0xfc, 0x96, 0x98, - 0xd0, 0xea, 0xea, 0x2b, 0x85, 0x5e, 0xfe, 0xd3, 0xfd, 0xcd, 0xfc, 0x75, - 0xfe, 0x40, 0xe2, 0xfe, 0x60, 0x4e, 0xbf, 0xfe, 0xff, 0x9c, 0x81, 0xc5, - 0x13, 0xbd, 0xcf, 0xa7, 0x59, 0x82, 0x75, 0x70, 0xf9, 0x7f, 0x51, 0xbf, - 0xcb, 0xfc, 0x7d, 0xaf, 0xf8, 0x75, 0x49, 0x1e, 0x1c, 0x84, 0xc6, 0xd9, - 0x1d, 0xfd, 0xb2, 0x6e, 0xe0, 0x1c, 0xeb, 0xff, 0xfd, 0x99, 0xed, 0x44, - 0xdd, 0x8d, 0x83, 0x81, 0xec, 0x68, 0xeb, 0xf0, 0xb5, 0xf4, 0x87, 0x5f, - 0xff, 0xdc, 0x18, 0x8d, 0xfe, 0x6b, 0xc3, 0x01, 0xec, 0x78, 0xeb, 0x93, - 0xa7, 0x5f, 0x48, 0x5f, 0xe9, 0xd7, 0xf8, 0x2e, 0x0e, 0x71, 0xc0, 0x75, - 0xf7, 0x1a, 0xc6, 0xc9, 0xd7, 0xca, 0x30, 0x1d, 0x93, 0xab, 0x0f, 0x35, - 0xc9, 0xa9, 0x11, 0x3e, 0x2f, 0xf5, 0x09, 0xbb, 0xe1, 0x2b, 0x1a, 0xdb, - 0x8a, 0xff, 0x0c, 0x1b, 0xce, 0xc6, 0x87, 0x5f, 0xfb, 0xef, 0x94, 0x45, - 0x23, 0x06, 0x0e, 0xbf, 0x7d, 0xf0, 0xc0, 0x0e, 0xad, 0xd1, 0x09, 0xc1, - 0xdd, 0x87, 0xf7, 0xe8, 0xf6, 0x76, 0x0e, 0xbf, 0xff, 0xfd, 0xd4, 0x0e, - 0x24, 0xfd, 0x88, 0xf9, 0x9b, 0xcb, 0x49, 0xe7, 0x1c, 0x3a, 0xff, 0xd9, - 0xbc, 0xb5, 0x37, 0x1f, 0xda, 0x3a, 0xff, 0xf7, 0xb5, 0x93, 0x76, 0x36, - 0x67, 0x7b, 0x07, 0x5f, 0xe7, 0x06, 0x96, 0xfb, 0xf8, 0xea, 0xc3, 0xfe, - 0x74, 0xbb, 0xfe, 0x18, 0x89, 0xb3, 0x62, 0x70, 0xea, 0x9d, 0x3b, 0x16, - 0x92, 0x81, 0xd8, 0x61, 0x7d, 0xe2, 0x0b, 0xf7, 0xc9, 0xa4, 0x93, 0x1d, - 0x50, 0xa9, 0x7f, 0x23, 0xe4, 0x45, 0x0b, 0xff, 0xba, 0x9f, 0x30, 0x71, - 0x38, 0xfb, 0x0e, 0xbf, 0xf9, 0x05, 0xc2, 0x38, 0x1e, 0xc6, 0x8e, 0xbd, - 0xf6, 0x38, 0x75, 0xff, 0xfe, 0xec, 0x0e, 0x03, 0x58, 0x1e, 0xc4, 0xeb, - 0xfc, 0x42, 0x75, 0x28, 0x98, 0x0b, 0x51, 0x38, 0x81, 0xe1, 0xdb, 0xff, - 0xfa, 0x26, 0xc0, 0xf6, 0x36, 0x77, 0x3c, 0x31, 0x0b, 0x3a, 0xfe, 0xdf, - 0x5f, 0x67, 0xfc, 0x4e, 0xbf, 0xe8, 0x6f, 0x52, 0x67, 0x79, 0xce, 0xa5, - 0xa3, 0x11, 0xd6, 0x80, 0x65, 0x7f, 0xa5, 0x1c, 0x9e, 0x39, 0x39, 0xd7, - 0xfc, 0x9f, 0x8c, 0xb9, 0x18, 0x13, 0xaf, 0xff, 0xfb, 0xb9, 0x26, 0xf5, - 0x3b, 0x19, 0xc9, 0x78, 0x61, 0x7a, 0x3a, 0xb4, 0x89, 0xbf, 0x1b, 0xdf, - 0x6d, 0x47, 0x27, 0x3a, 0xa1, 0x31, 0x7c, 0x86, 0x7b, 0x91, 0xdf, 0xee, - 0x36, 0x6c, 0x4e, 0xfe, 0x75, 0xfe, 0x5c, 0x34, 0x5f, 0x7f, 0x1d, 0x7f, - 0x72, 0x3d, 0x3e, 0x32, 0x75, 0xe7, 0x10, 0x1d, 0x7f, 0xff, 0xfc, 0x9f, - 0xf3, 0xb9, 0x34, 0xcf, 0xc9, 0xbd, 0xdf, 0xc1, 0xac, 0x4d, 0x81, 0x83, - 0xaf, 0xde, 0xeb, 0x8a, 0x87, 0x5f, 0xf0, 0xff, 0x38, 0x7b, 0x83, 0x07, - 0x5b, 0x02, 0x8e, 0x2c, 0x84, 0x1b, 0x49, 0xef, 0xff, 0x70, 0x0d, 0x00, - 0xe7, 0xb4, 0xee, 0x27, 0x54, 0x2a, 0x10, 0xc3, 0x44, 0x32, 0x72, 0xe1, - 0x87, 0xe7, 0xe7, 0x37, 0xfb, 0x3b, 0x32, 0x75, 0x16, 0x75, 0xfe, 0x96, - 0x73, 0x43, 0x13, 0x9d, 0x7b, 0x6f, 0x27, 0x3a, 0xf6, 0x75, 0xce, 0xbf, - 0x4c, 0x1f, 0xff, 0x13, 0xa8, 0x27, 0x88, 0xe3, 0x57, 0xfb, 0x19, 0xc6, - 0xb7, 0x19, 0x3a, 0xff, 0xb7, 0x5e, 0x60, 0xfb, 0x6f, 0x0e, 0xbc, 0xa4, - 0xbf, 0x3a, 0xfd, 0xd8, 0xe4, 0xeb, 0x3a, 0xff, 0x7e, 0xe3, 0xdc, 0x79, - 0x8e, 0xb6, 0xf3, 0x1e, 0xd3, 0x25, 0x14, 0x88, 0xa3, 0x77, 0x8a, 0xc4, - 0xcc, 0x5c, 0xcc, 0x61, 0xbb, 0x58, 0xa9, 0x33, 0x73, 0x24, 0x32, 0x76, - 0x3d, 0x46, 0xa5, 0x78, 0x70, 0x07, 0x5a, 0x0e, 0xa0, 0x1a, 0x9f, 0x0d, - 0x5c, 0xfe, 0x3a, 0xb8, 0x6d, 0xba, 0x43, 0x7c, 0xb8, 0xe6, 0x8e, 0xbf, - 0xee, 0x67, 0x72, 0x7f, 0x89, 0xa3, 0xab, 0x0f, 0xf1, 0x08, 0x7f, 0x21, - 0xbf, 0x90, 0x7f, 0x96, 0x68, 0xeb, 0xff, 0x67, 0xa3, 0x70, 0x3f, 0x7a, - 0x87, 0x59, 0x67, 0x5f, 0xc8, 0x3f, 0xcb, 0x35, 0xf0, 0xf3, 0x76, 0x1e, - 0xd2, 0x88, 0xc1, 0xf3, 0xcd, 0x95, 0x62, 0xdb, 0x6f, 0xc6, 0x11, 0x14, - 0x3b, 0x4e, 0x43, 0x28, 0x43, 0x86, 0x14, 0xb9, 0x28, 0xd5, 0x48, 0x5d, - 0x36, 0x19, 0xfb, 0x91, 0x24, 0x63, 0xf3, 0x1c, 0x70, 0xbd, 0x71, 0xeb, - 0xf6, 0x59, 0xa3, 0xc6, 0x6c, 0x08, 0xc0, 0xc6, 0x34, 0x6d, 0x4a, 0x43, - 0xf4, 0xaa, 0x6d, 0xb8, 0xca, 0xfe, 0xc3, 0xbe, 0xfe, 0xda, 0x40, 0x8c, - 0x4c, 0x75, 0xe8, 0x71, 0x3a, 0xfb, 0x3a, 0xfe, 0x3a, 0xcc, 0x0c, 0x3e, - 0x8e, 0x97, 0x88, 0xcd, 0xff, 0xff, 0xee, 0xb8, 0xfb, 0x50, 0x92, 0xcd, - 0xa1, 0xf4, 0x76, 0x14, 0xfe, 0x36, 0x8e, 0xbe, 0xcd, 0x01, 0x0e, 0xbf, - 0x71, 0xae, 0xed, 0x34, 0x5a, 0xd7, 0xf9, 0x68, 0xb7, 0x9b, 0x3a, 0x75, - 0xfd, 0x9b, 0x5a, 0x71, 0x69, 0xd7, 0xb9, 0x0b, 0x3a, 0xfe, 0xee, 0x6a, - 0x27, 0xda, 0x3a, 0xff, 0xa4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x50, 0x75, - 0x87, 0xea, 0xe6, 0x17, 0xd9, 0x34, 0x78, 0xeb, 0xfe, 0x89, 0x47, 0x27, - 0x8e, 0x4e, 0x75, 0xff, 0xfb, 0xda, 0x49, 0xdf, 0x4e, 0x2f, 0xee, 0xc4, - 0xc7, 0x59, 0x56, 0x12, 0xac, 0x38, 0x37, 0x93, 0xde, 0x10, 0x21, 0x9c, - 0xc6, 0x5c, 0x2e, 0x5c, 0x24, 0x3a, 0x40, 0x24, 0x3f, 0x4e, 0x6f, 0xff, - 0x2a, 0xb7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x45, 0xdf, 0xe5, 0x73, - 0x8d, 0x77, 0x69, 0xa2, 0xea, 0xa8, 0x74, 0x5f, 0x72, 0x7c, 0x6b, 0xea, - 0x47, 0x0a, 0xb9, 0x5e, 0x3d, 0xad, 0xe2, 0x41, 0x39, 0x89, 0xa8, 0x54, - 0xf9, 0x5e, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x10, 0xdd, 0x81, 0x3a, 0xcd, - 0x3a, 0xba, 0x69, 0x44, 0x56, 0xfb, 0x36, 0x27, 0x0e, 0xb2, 0xb8, 0x89, - 0xad, 0xd6, 0x18, 0xc8, 0x2d, 0xb6, 0x75, 0xf4, 0x76, 0x16, 0x75, 0xf3, - 0x5d, 0xda, 0x68, 0x8d, 0xa9, 0xa7, 0x9b, 0xc2, 0x0b, 0x2a, 0x14, 0x41, - 0x63, 0x05, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x29, 0xbb, 0xf7, 0x1a, - 0xee, 0xd3, 0x45, 0x41, 0x7b, 0x37, 0x64, 0xeb, 0x2b, 0x87, 0xa1, 0xd3, - 0x3b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x54, 0xd7, 0xee, 0x35, 0xdd, - 0xa6, 0x8a, 0xc2, 0xfc, 0x8c, 0x87, 0xfe, 0x1d, 0x72, 0xf4, 0x75, 0xfc, - 0x9b, 0x6f, 0x09, 0xb6, 0x75, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x23, - 0xfa, 0x83, 0xef, 0x91, 0x85, 0xec, 0x89, 0xce, 0xbf, 0xd9, 0xbc, 0x9e, - 0x48, 0x27, 0x5c, 0xfe, 0x3a, 0xca, 0xe2, 0x6c, 0x6d, 0x33, 0x59, 0x4b, - 0xc2, 0x14, 0x48, 0x7c, 0x37, 0xb6, 0x63, 0x7f, 0xf9, 0x55, 0xbc, 0x95, - 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xbe, 0xff, 0xe5, 0xbc, 0x95, 0xce, 0x35, - 0xdd, 0xa6, 0x89, 0xfa, 0xfe, 0x7e, 0xe7, 0xa0, 0x27, 0x5c, 0x2d, 0x3a, - 0xfb, 0x53, 0x2f, 0x47, 0x5c, 0xd6, 0x9d, 0x7f, 0x9b, 0xd4, 0xf6, 0x62, - 0xce, 0xbb, 0x63, 0x4f, 0x18, 0x15, 0x42, 0x29, 0x10, 0x54, 0x04, 0x7a, - 0x16, 0xf1, 0x8d, 0xfe, 0x61, 0xcc, 0x48, 0xe4, 0xf1, 0xb9, 0xd7, 0xe6, - 0x21, 0x81, 0xb7, 0x9b, 0x9d, 0x7f, 0x31, 0x2f, 0x3f, 0x51, 0x8c, 0xeb, - 0xf3, 0x16, 0xa2, 0x98, 0xc6, 0x75, 0xdb, 0x1a, 0x78, 0xc0, 0x6d, 0xd3, - 0xa9, 0x88, 0x4c, 0x35, 0x89, 0x3e, 0x60, 0x1a, 0x30, 0xe3, 0x5f, 0x18, - 0xfe, 0x4b, 0x7c, 0xc5, 0xf1, 0xf0, 0xeb, 0xe6, 0x14, 0xeb, 0xd1, 0xd7, - 0xff, 0xf3, 0x16, 0x2f, 0xe8, 0x16, 0xa2, 0xc3, 0xfb, 0xf2, 0x47, 0x5f, - 0xf3, 0xf5, 0x36, 0x2a, 0xcb, 0x2c, 0x95, 0x7f, 0xba, 0xfe, 0xf3, 0xbb, - 0x27, 0x53, 0x09, 0x1e, 0xac, 0x50, 0x9d, 0x8a, 0xaf, 0x30, 0xe3, 0xeb, - 0xff, 0xfc, 0xc4, 0x30, 0x35, 0xc8, 0x4f, 0x77, 0x02, 0x9a, 0xc1, 0x01, - 0xd7, 0xf3, 0x1c, 0x71, 0xde, 0x47, 0x5f, 0xba, 0x8e, 0x06, 0x1c, 0x75, - 0x31, 0x28, 0xc1, 0x61, 0x99, 0xfc, 0x5d, 0x67, 0x3a, 0xf8, 0x71, 0x00, - 0x75, 0xf3, 0x0f, 0x02, 0x90, 0x75, 0x30, 0x0f, 0x1d, 0x84, 0x3f, 0x7f, - 0xe8, 0x88, 0x88, 0x88, 0xdf, 0x47, 0x5e, 0x9a, 0x3c, 0x75, 0xd1, 0x10, - 0x7a, 0xd3, 0x1d, 0x5e, 0x4d, 0xf0, 0xeb, 0xf7, 0x12, 0x77, 0x59, 0x57, - 0x32, 0xc9, 0x55, 0x86, 0xfd, 0x92, 0x7b, 0x7e, 0x52, 0xa6, 0x86, 0xa1, - 0x19, 0x20, 0x2c, 0xd3, 0xdd, 0xf9, 0xdc, 0x63, 0x68, 0xeb, 0xff, 0xc8, - 0x38, 0xb8, 0xd6, 0xb2, 0x5b, 0x78, 0x75, 0xff, 0xd1, 0x27, 0xc0, 0xa6, - 0xcd, 0x01, 0xa7, 0x5f, 0xde, 0xd6, 0x64, 0xf0, 0x75, 0x74, 0xfc, 0x05, - 0x12, 0xff, 0x73, 0xf1, 0xff, 0xdf, 0xf8, 0xeb, 0xdd, 0x81, 0x3a, 0xd0, - 0x87, 0xa1, 0xe3, 0x6a, 0x84, 0x4b, 0xf5, 0xc6, 0xf0, 0xa4, 0x1d, 0x7e, - 0x8f, 0xab, 0xea, 0x1d, 0x5c, 0x3c, 0x11, 0x19, 0xbf, 0xa5, 0xaf, 0x60, - 0xa8, 0x75, 0xe6, 0x5d, 0x93, 0xaf, 0xff, 0x7b, 0x8f, 0x38, 0x7b, 0x1a, - 0xf7, 0xfd, 0x3a, 0xec, 0x5f, 0x4f, 0xa7, 0x43, 0xb7, 0xe7, 0x6f, 0x53, - 0x87, 0x5f, 0xff, 0xfe, 0x17, 0x51, 0x39, 0x12, 0xf9, 0xd4, 0x58, 0x63, - 0xe6, 0xdf, 0xfd, 0x4e, 0x1d, 0x7c, 0xf2, 0x4d, 0xce, 0xbf, 0xf7, 0x53, - 0xd9, 0xce, 0x7f, 0x3e, 0xc3, 0xaf, 0xf9, 0x3d, 0x9c, 0xe7, 0xf3, 0xec, - 0x3a, 0xf6, 0xbf, 0x1f, 0x87, 0xfd, 0xd4, 0x2a, 0x0a, 0x74, 0xdc, 0x2d, - 0xe9, 0x30, 0xbf, 0x6a, 0x13, 0xf7, 0xfb, 0xa9, 0xde, 0x71, 0x27, 0x3a, - 0xe6, 0x7c, 0x75, 0xa0, 0xeb, 0xff, 0xe8, 0xde, 0x4e, 0x20, 0xf8, 0x04, - 0xe2, 0x28, 0x75, 0x41, 0xfb, 0xed, 0x8b, 0xed, 0x07, 0xdf, 0x7b, 0x5d, - 0x43, 0xaf, 0xa7, 0x5a, 0x48, 0xeb, 0xe8, 0x07, 0xd5, 0x9d, 0x7c, 0x3f, - 0xbc, 0x8e, 0xa6, 0x9e, 0x26, 0x88, 0xef, 0xf7, 0x61, 0x6a, 0x80, 0x10, - 0x75, 0x42, 0x2e, 0xf1, 0x99, 0x08, 0xaf, 0xe9, 0x93, 0xbe, 0xc6, 0x9d, - 0x58, 0x99, 0xb7, 0x21, 0xb8, 0xe5, 0xb7, 0xfd, 0xb8, 0x7e, 0xc3, 0x1f, - 0x7f, 0xd1, 0xd7, 0x94, 0x8f, 0x1d, 0x7f, 0xfe, 0x0f, 0x63, 0x88, 0x08, - 0xfb, 0x13, 0x0c, 0x2c, 0xeb, 0xfc, 0xa4, 0x0f, 0xb4, 0xfd, 0x3a, 0x91, - 0x10, 0xee, 0xab, 0x7e, 0x1c, 0x71, 0x9c, 0xea, 0x84, 0xca, 0x5d, 0x00, - 0x61, 0x47, 0xa2, 0x1b, 0xfd, 0xd8, 0x9f, 0x91, 0x81, 0x3a, 0xff, 0xf8, - 0x73, 0x63, 0x5f, 0x93, 0xbf, 0x9f, 0x70, 0x1d, 0x50, 0x88, 0x37, 0x32, - 0xbf, 0xc2, 0xf3, 0xef, 0x28, 0xda, 0x3a, 0xff, 0x6b, 0xaf, 0xf7, 0xb1, - 0x23, 0xaa, 0x73, 0xea, 0xdc, 0xda, 0xf6, 0x64, 0xc7, 0x5f, 0xff, 0xa6, - 0xec, 0x2d, 0x38, 0x9b, 0x51, 0xf6, 0x7c, 0x64, 0xeb, 0xfe, 0x89, 0x0b, - 0xfa, 0x49, 0xb0, 0xeb, 0xdf, 0x60, 0x07, 0x57, 0x4f, 0x57, 0x47, 0x16, - 0x63, 0x3a, 0xf7, 0xa5, 0x87, 0x5d, 0xac, 0x3a, 0xff, 0xed, 0x47, 0x1b, - 0xe1, 0xc9, 0xdc, 0x4e, 0xa8, 0x4d, 0x5f, 0x21, 0x60, 0x84, 0x4e, 0x26, - 0x01, 0xbf, 0x0a, 0xdf, 0xdf, 0xcd, 0xff, 0xa3, 0xa7, 0x5f, 0xfc, 0x18, - 0xf3, 0xeb, 0x3b, 0xd4, 0x59, 0xd7, 0xfa, 0x70, 0xc3, 0xf0, 0x1f, 0x9d, - 0x7b, 0xc9, 0x31, 0xd5, 0x08, 0x92, 0xc4, 0x2d, 0x1a, 0x5f, 0xa1, 0x8d, - 0x19, 0x69, 0xd5, 0x0c, 0xc7, 0xd9, 0xcb, 0xe4, 0x4e, 0x18, 0xd4, 0x31, - 0x8f, 0x72, 0x14, 0x94, 0x78, 0xc6, 0x9f, 0x34, 0x2a, 0xb9, 0x1b, 0x52, - 0xe3, 0x5d, 0xec, 0x30, 0xde, 0x11, 0x60, 0x24, 0x18, 0xdc, 0xb4, 0xb3, - 0xe8, 0x61, 0x7d, 0x2e, 0xbf, 0xff, 0xe6, 0x28, 0xc2, 0x8c, 0x62, 0xbc, - 0x61, 0x30, 0xdb, 0x18, 0xd8, 0x77, 0xff, 0x3e, 0x77, 0x6c, 0xeb, 0xd3, - 0x7d, 0x59, 0xd7, 0xfd, 0x9e, 0xd6, 0x7b, 0xb8, 0x03, 0xa9, 0xcf, 0x58, - 0x47, 0xee, 0x71, 0x3a, 0xb8, 0x6d, 0x16, 0x41, 0x7d, 0x1e, 0xc5, 0x9d, - 0x7e, 0xf4, 0x0a, 0x00, 0xeb, 0xfb, 0x19, 0x70, 0x2f, 0x0e, 0xaf, 0x87, - 0xe3, 0x84, 0x02, 0x4b, 0x7e, 0xe4, 0xf1, 0xed, 0x1d, 0x7c, 0xfc, 0x79, - 0x1d, 0x6e, 0x61, 0xe4, 0x09, 0x45, 0xe6, 0x59, 0x64, 0xeb, 0xe9, 0xc5, - 0x20, 0xa5, 0x4b, 0xfb, 0xfe, 0x63, 0xeb, 0x8c, 0x83, 0x13, 0x9d, 0x76, - 0xf2, 0x3a, 0xff, 0x29, 0x1e, 0xd7, 0x5f, 0xf3, 0xaf, 0xc9, 0x3e, 0x6f, - 0xe3, 0xae, 0x46, 0x9d, 0x50, 0x88, 0x85, 0x05, 0xd6, 0x69, 0xe2, 0x8b, - 0xf2, 0x8f, 0xad, 0x92, 0x3a, 0xb7, 0x3e, 0x7f, 0x1e, 0xd3, 0x0c, 0xaf, - 0xa6, 0x23, 0x1e, 0x0c, 0x24, 0x91, 0xdf, 0xa8, 0xae, 0x61, 0xfc, 0x65, - 0x57, 0xff, 0x6c, 0x67, 0x34, 0x29, 0x1c, 0xc9, 0xce, 0xbf, 0xff, 0xff, - 0xf3, 0x1f, 0xce, 0xe6, 0xf2, 0xea, 0xfe, 0x37, 0xbf, 0xfb, 0xd8, 0x3d, - 0xcf, 0x40, 0x7e, 0x7c, 0xee, 0xd9, 0xd7, 0xfc, 0x1c, 0xfd, 0x82, 0x9d, - 0x75, 0x9d, 0x7e, 0x85, 0x8e, 0x4c, 0x76, 0x1b, 0xcb, 0xdb, 0x30, 0x27, - 0x5f, 0xdd, 0x48, 0x1f, 0xe0, 0xeb, 0xfd, 0x0c, 0x6a, 0x66, 0x9d, 0x8c, - 0xea, 0x50, 0xf8, 0xfa, 0x57, 0x5d, 0x45, 0x1b, 0xc2, 0x02, 0x82, 0x8f, - 0xfd, 0x43, 0x62, 0xfe, 0x89, 0x76, 0x36, 0x21, 0xd7, 0xe5, 0xfe, 0x30, - 0xb3, 0xaf, 0xb9, 0xfb, 0xe8, 0xea, 0x83, 0xc9, 0x72, 0x7b, 0xa5, 0xe3, - 0xaf, 0xa6, 0x8f, 0x39, 0xd7, 0xdf, 0x83, 0x05, 0xa6, 0xdf, 0xf1, 0x6b, - 0x48, 0xea, 0x9c, 0xf2, 0x7a, 0x73, 0x7f, 0xf4, 0x77, 0xe8, 0x7c, 0x99, - 0x34, 0x2c, 0xeb, 0xf3, 0xcb, 0x49, 0xb0, 0xeb, 0xfe, 0xf7, 0x72, 0x5b, - 0xcb, 0x3c, 0x75, 0xf4, 0x7b, 0xf5, 0x9d, 0x46, 0x88, 0x3a, 0xfe, 0x79, - 0xc0, 0xe2, 0x12, 0x56, 0x0d, 0xb6, 0x9a, 0x7a, 0x3b, 0x62, 0xf4, 0xb4, - 0x4f, 0x79, 0xce, 0xff, 0xfc, 0xbd, 0x3c, 0xba, 0x99, 0xed, 0x73, 0x03, - 0x87, 0x5f, 0xf4, 0x78, 0x73, 0x60, 0xe6, 0x8e, 0xa8, 0x45, 0x6e, 0x11, - 0xe9, 0x4e, 0xfe, 0x7e, 0xc3, 0x1f, 0xf2, 0x3a, 0xa4, 0xae, 0x21, 0xae, - 0xdc, 0x85, 0x02, 0xc8, 0xc0, 0x8a, 0x25, 0x1e, 0x8e, 0x13, 0x61, 0x75, - 0xfd, 0x21, 0xcd, 0xfd, 0x87, 0x5f, 0xff, 0xbe, 0x80, 0x11, 0xbe, 0x4e, - 0x17, 0x76, 0xb8, 0x4e, 0xa8, 0x44, 0x1f, 0x0b, 0x2f, 0xf3, 0x8f, 0xa5, - 0x9c, 0xc3, 0xaf, 0xfe, 0x74, 0xf4, 0x0b, 0x73, 0xdd, 0x43, 0xaf, 0xe1, - 0x40, 0x6b, 0xa8, 0x75, 0xdc, 0x09, 0xd7, 0x32, 0xc9, 0xd5, 0x23, 0x5c, - 0xc8, 0xb5, 0xe8, 0x4d, 0x85, 0x2a, 0x68, 0xab, 0xa8, 0xe8, 0x74, 0x0d, - 0x3d, 0xdc, 0x0d, 0x1d, 0x7f, 0x27, 0x51, 0x45, 0x20, 0xeb, 0xb5, 0xf4, - 0x27, 0x87, 0xe1, 0x6a, 0x44, 0x51, 0x7d, 0x72, 0xbc, 0xcb, 0x2c, 0x95, - 0x45, 0x2a, 0x5f, 0xdf, 0x23, 0x29, 0x31, 0x54, 0xd3, 0x78, 0x83, 0x57, - 0xec, 0xe4, 0x6c, 0xc3, 0xaa, 0x19, 0x2f, 0xf3, 0xa2, 0xe4, 0x7c, 0xc9, - 0x2e, 0xc3, 0x91, 0x81, 0x2c, 0x8b, 0xb1, 0xdd, 0x0b, 0xfe, 0x88, 0x2f, - 0xb9, 0x2f, 0xf0, 0xeb, 0xfc, 0x3b, 0xfb, 0xef, 0x5c, 0x07, 0x5e, 0x14, - 0xd1, 0xd7, 0xc1, 0x71, 0x01, 0xd7, 0xff, 0x40, 0x80, 0x63, 0x79, 0xa0, - 0x40, 0x75, 0x62, 0x2c, 0x50, 0xd4, 0x03, 0x5a, 0x20, 0xbf, 0x4d, 0xb6, - 0x0d, 0xbc, 0x3a, 0xc8, 0x75, 0xff, 0x3a, 0x8d, 0xea, 0x05, 0xe4, 0x75, - 0xf4, 0xf3, 0xbe, 0xe7, 0x5c, 0x0d, 0x21, 0xf5, 0x88, 0x7f, 0xd3, 0x8b, - 0xf4, 0x67, 0x3a, 0x87, 0x5f, 0xfe, 0x64, 0x1d, 0xcc, 0x9d, 0x33, 0x64, - 0x6e, 0x75, 0xff, 0xe0, 0x42, 0xf9, 0xc8, 0x9f, 0xce, 0xea, 0x1d, 0x7f, - 0xa5, 0x9d, 0xc5, 0xc3, 0x4e, 0xbd, 0x8b, 0x63, 0x3a, 0xff, 0x66, 0x87, - 0x3d, 0xd4, 0x3a, 0x82, 0x79, 0xc2, 0x3d, 0x58, 0x9c, 0xb4, 0xc7, 0x7d, - 0x25, 0x02, 0x67, 0x92, 0xb6, 0x3f, 0xdf, 0xde, 0xc9, 0x86, 0x16, 0x78, - 0x80, 0xaf, 0xce, 0x21, 0xec, 0x1a, 0x20, 0x25, 0x4d, 0xcd, 0xff, 0xc9, - 0xbe, 0x83, 0x83, 0x03, 0xfc, 0x1d, 0x7f, 0xf7, 0xed, 0x53, 0x99, 0xbe, - 0x80, 0xfe, 0x3a, 0xfd, 0x12, 0x7d, 0xd9, 0x3a, 0xff, 0xcd, 0xf9, 0xce, - 0x67, 0x77, 0x96, 0x8e, 0xac, 0x47, 0x9a, 0x21, 0x71, 0x1d, 0xca, 0x2d, - 0x39, 0xd7, 0xef, 0x99, 0x32, 0x2c, 0xeb, 0xff, 0xdf, 0xc7, 0xcd, 0xaf, - 0x26, 0xbb, 0xbb, 0xb2, 0x75, 0x4e, 0x7f, 0x5a, 0x29, 0xbf, 0xf6, 0x07, - 0xae, 0xac, 0x76, 0x37, 0x3a, 0x98, 0x08, 0xec, 0xe4, 0x22, 0xd6, 0x47, - 0x7f, 0xc2, 0xa7, 0x05, 0x1b, 0xf8, 0x9d, 0x7e, 0xf4, 0x60, 0xc1, 0xd4, - 0x87, 0xb8, 0x27, 0x17, 0xd3, 0xfd, 0x1f, 0x1d, 0x7f, 0xfe, 0x7d, 0xf7, - 0xd4, 0x0f, 0xbe, 0xcd, 0xd4, 0xf6, 0x8e, 0xa8, 0x4c, 0xcb, 0x21, 0x2a, - 0x84, 0x1f, 0x92, 0x5f, 0x2e, 0x31, 0x67, 0x5f, 0xfb, 0x17, 0x0d, 0x4f, - 0x73, 0xf5, 0x9d, 0x79, 0x37, 0xd1, 0xd5, 0x23, 0xda, 0x01, 0xf5, 0xfc, - 0xce, 0xb5, 0x00, 0x62, 0x4e, 0xa8, 0x3d, 0x57, 0x22, 0xbf, 0xdc, 0x9b, - 0x48, 0x3e, 0x43, 0xaf, 0xf7, 0x53, 0x70, 0x71, 0xc2, 0x75, 0xf6, 0xe0, - 0xe4, 0x15, 0x73, 0x2c, 0x95, 0x50, 0x6e, 0x99, 0x22, 0xb8, 0x50, 0xa5, - 0x4d, 0x0d, 0xff, 0xff, 0xc2, 0xae, 0x66, 0xd4, 0x4c, 0x8b, 0x89, 0xbe, - 0x0e, 0xf2, 0xef, 0xe0, 0x3a, 0xf3, 0xf2, 0x5f, 0x13, 0x2c, 0x94, 0x23, - 0xb7, 0x25, 0xa6, 0x2d, 0x94, 0x6d, 0x10, 0xd3, 0x91, 0xde, 0x4a, 0x2f, - 0x48, 0x49, 0xf2, 0x33, 0x6e, 0xca, 0x58, 0x74, 0x11, 0x86, 0x7f, 0x88, - 0x3f, 0x8d, 0x7a, 0xf7, 0x91, 0x93, 0xaf, 0x4e, 0xeb, 0x3a, 0xf7, 0x91, - 0x93, 0xc6, 0x11, 0x7d, 0xef, 0xdf, 0xe9, 0xa2, 0x07, 0xdc, 0xd4, 0xd3, - 0xa2, 0x1f, 0xf4, 0x5b, 0xfd, 0x8d, 0x89, 0xc6, 0x1a, 0x75, 0x80, 0x75, - 0x98, 0xfe, 0x1e, 0x0a, 0x18, 0xdd, 0x1f, 0x9d, 0x7e, 0xfc, 0x41, 0xf6, - 0x47, 0x5f, 0xff, 0x0e, 0x6b, 0xe7, 0xde, 0xc0, 0x16, 0xf2, 0xf9, 0x87, - 0x81, 0xa1, 0x6a, 0xfd, 0x1a, 0xfb, 0x1b, 0x2f, 0xfd, 0xdf, 0xe7, 0x8f, - 0x91, 0xe8, 0x09, 0xd7, 0x9f, 0x93, 0x9d, 0x73, 0x2c, 0x9d, 0x7f, 0xb8, - 0x99, 0xb3, 0xec, 0x95, 0x69, 0xb4, 0x64, 0x72, 0xff, 0xc8, 0xa7, 0xcd, - 0x7e, 0x05, 0xc4, 0x8e, 0xbf, 0xda, 0xcf, 0x3a, 0xf0, 0x4e, 0xa0, 0xa6, - 0x6d, 0xc7, 0x5e, 0xa7, 0xf9, 0x0a, 0xff, 0xda, 0xc1, 0xce, 0xe3, 0x70, - 0x4e, 0xbf, 0xf6, 0x29, 0xd7, 0x97, 0xd7, 0xde, 0x0e, 0xa9, 0x1f, 0xd0, - 0x9d, 0x54, 0x23, 0x67, 0x21, 0x71, 0x7f, 0xf2, 0xd6, 0xf2, 0xce, 0x35, - 0xdd, 0xa6, 0x88, 0x62, 0xff, 0xff, 0xf3, 0xeb, 0x07, 0x1b, 0xd8, 0xde, - 0x5b, 0x79, 0xd6, 0xa6, 0x0b, 0xa8, 0x75, 0x62, 0x31, 0xbf, 0x4f, 0xa4, - 0x56, 0x89, 0xd9, 0x46, 0xa3, 0x0e, 0xcb, 0xfc, 0xbe, 0xbc, 0xe3, 0x12, - 0x2a, 0xed, 0x7e, 0x75, 0xfd, 0x2e, 0xbb, 0x8c, 0x1d, 0x68, 0x69, 0xe0, - 0xee, 0x2f, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0x82, 0xaf, 0x76, 0x16, 0x75, - 0xff, 0xa2, 0x77, 0xf7, 0x32, 0x5b, 0x78, 0x75, 0x62, 0x23, 0x90, 0xcc, - 0x46, 0xef, 0xdd, 0x85, 0xff, 0xb9, 0xd7, 0xde, 0xd4, 0x00, 0xab, 0xcf, - 0xc9, 0xca, 0xbe, 0xfc, 0x5d, 0x42, 0xaf, 0xf2, 0x4f, 0x9e, 0xd4, 0x00, - 0xaa, 0x2a, 0xfe, 0xc6, 0xc7, 0x61, 0x65, 0x5c, 0xcb, 0x25, 0x5f, 0xc3, - 0x03, 0x3a, 0x70, 0xaa, 0xc4, 0xc2, 0x5a, 0x42, 0xb1, 0xce, 0x91, 0x00, - 0xc8, 0x42, 0x99, 0x2b, 0xfa, 0x31, 0x72, 0x70, 0xa5, 0x4f, 0xce, 0xa4, - 0x9f, 0xcc, 0xc5, 0xbd, 0x8e, 0x96, 0xa1, 0x5a, 0xd7, 0x5c, 0xde, 0x55, - 0x7d, 0xfd, 0x83, 0xa4, 0x1c, 0x3a, 0xf7, 0x7f, 0x59, 0xd5, 0xd3, 0xc6, - 0xda, 0x29, 0xbf, 0xce, 0x39, 0xae, 0x46, 0x8e, 0xbf, 0x83, 0x82, 0xfe, - 0xd1, 0xd6, 0x89, 0x1e, 0xde, 0x8c, 0x2f, 0xdc, 0xde, 0x59, 0xe3, 0xaf, - 0xde, 0x4c, 0xdf, 0xc7, 0x5f, 0xff, 0xf7, 0x53, 0x98, 0x17, 0x5e, 0x0f, - 0x86, 0x19, 0xcf, 0x68, 0xeb, 0x41, 0xd7, 0xd1, 0xb0, 0x30, 0xd3, 0xf2, - 0x03, 0x1d, 0xff, 0x9e, 0x5d, 0x7f, 0x6b, 0x06, 0x47, 0x57, 0x4f, 0xdb, - 0xc7, 0x55, 0xc4, 0xd6, 0x74, 0x51, 0xe8, 0xc3, 0xef, 0xf6, 0xf2, 0xdb, - 0x86, 0xe2, 0xce, 0xbf, 0xff, 0xf7, 0x39, 0x1b, 0xcb, 0x7d, 0x27, 0x1b, - 0xdc, 0xfb, 0xc4, 0x80, 0x9d, 0x7f, 0xcf, 0xcc, 0xde, 0x50, 0x08, 0x3a, - 0xa1, 0x1b, 0x98, 0x6d, 0xfb, 0x7d, 0xff, 0xf9, 0xaa, 0x3e, 0xb3, 0x92, - 0x4e, 0xb8, 0xef, 0x23, 0xaf, 0xfc, 0xd8, 0xf6, 0xb3, 0xc9, 0xbb, 0x27, - 0x59, 0xf1, 0x12, 0x8a, 0x2a, 0xd4, 0x27, 0xfd, 0xd8, 0xc4, 0xc6, 0x18, - 0x77, 0xcf, 0x3f, 0xd6, 0x9d, 0x73, 0x80, 0xea, 0x91, 0xb9, 0xf1, 0x25, - 0xff, 0xf9, 0xde, 0x4f, 0xdf, 0x99, 0x3f, 0xfe, 0xfd, 0xfe, 0x9a, 0x2f, - 0xbb, 0xc0, 0x80, 0x9d, 0x7f, 0xed, 0x20, 0xef, 0x2e, 0x7f, 0x1a, 0x3a, - 0xa6, 0x46, 0x0f, 0x19, 0xfc, 0x37, 0x7e, 0xee, 0x4d, 0x0c, 0x67, 0x5f, - 0x83, 0xce, 0x63, 0x27, 0x5a, 0x27, 0x3d, 0x21, 0x2a, 0xb3, 0x4e, 0xbf, - 0xff, 0xc0, 0x4e, 0x29, 0xd8, 0x5c, 0xd2, 0x41, 0xec, 0x72, 0x0e, 0xb7, - 0xb0, 0xfc, 0x34, 0x21, 0x7d, 0xe1, 0xc9, 0x1d, 0x50, 0x78, 0xe8, 0x4f, - 0x7f, 0xe1, 0x49, 0x7b, 0xb9, 0xc4, 0xd1, 0xd7, 0xf4, 0x48, 0x73, 0x27, - 0x3a, 0xff, 0x38, 0x60, 0x10, 0xce, 0x8e, 0xae, 0x9e, 0xeb, 0x95, 0xdf, - 0xdb, 0x6c, 0x57, 0xe7, 0xce, 0xed, 0x9e, 0x20, 0x1b, 0xfd, 0xe0, 0x7d, - 0x19, 0x77, 0x0f, 0x10, 0x0d, 0xe7, 0xe4, 0x8f, 0x10, 0x0d, 0x61, 0xf4, - 0xfe, 0x83, 0x73, 0xc8, 0xf1, 0x00, 0xdf, 0x38, 0xef, 0x23, 0xc4, 0x03, - 0x7f, 0x91, 0xbd, 0xc0, 0x02, 0x0f, 0x10, 0x0d, 0xe4, 0x10, 0x9e, 0x20, - 0x1a, 0x0a, 0x2d, 0x56, 0x45, 0xd2, 0xed, 0x87, 0xd6, 0x50, 0xf1, 0x00, - 0xde, 0xe4, 0x78, 0xf1, 0x00, 0xd1, 0xe2, 0x01, 0xbd, 0xb6, 0x80, 0x3c, - 0x40, 0x37, 0x42, 0xcf, 0x10, 0x0d, 0x04, 0xf9, 0x30, 0x5d, 0x0a, 0xef, - 0x91, 0x61, 0x83, 0xc4, 0x03, 0x7b, 0xce, 0xd3, 0xc4, 0x03, 0x7f, 0xe1, - 0x79, 0x2b, 0xd4, 0x6b, 0xf0, 0xf1, 0x00, 0xdf, 0xfc, 0xfe, 0xfe, 0x74, - 0x1f, 0x75, 0xe4, 0x78, 0x80, 0x6e, 0x70, 0x9e, 0x20, 0x1b, 0xfc, 0x2e, - 0xce, 0xb5, 0x00, 0x3c, 0x40, 0x37, 0xe4, 0x51, 0xc4, 0x07, 0x88, 0x06, - 0xe4, 0xd1, 0xe2, 0x01, 0xae, 0x1e, 0xaf, 0x8c, 0xef, 0xff, 0x75, 0x3d, - 0xec, 0xd7, 0xce, 0x24, 0x2c, 0xf1, 0x00, 0xdf, 0xbc, 0x31, 0xbc, 0x8d, - 0x10, 0x0d, 0xc0, 0x83, 0xc4, 0x02, 0xa9, 0xb4, 0xbf, 0x24, 0x2d, 0xc2, - 0x78, 0x80, 0x6f, 0xbf, 0x71, 0x69, 0xe2, 0x01, 0xbd, 0x1c, 0x69, 0xe2, - 0x01, 0xbf, 0xf6, 0x6f, 0xa0, 0xc6, 0x08, 0x34, 0x78, 0x80, 0x6f, 0xdf, - 0xbc, 0xa5, 0x07, 0x88, 0x06, 0xfc, 0xed, 0xec, 0x6e, 0x78, 0x80, 0x6b, - 0x11, 0x65, 0xd4, 0xaf, 0xcd, 0x2e, 0xe0, 0x0f, 0x10, 0x0d, 0x49, 0x59, - 0x18, 0x48, 0xb2, 0x12, 0x8d, 0x22, 0x48, 0x45, 0xf4, 0xcc, 0x06, 0x5a, - 0x2e, 0xf4, 0x36, 0xbf, 0x30, 0xbf, 0x67, 0xb4, 0xfb, 0x9e, 0x20, 0x1b, - 0xfc, 0x18, 0x6c, 0xdc, 0x8f, 0x1e, 0x20, 0x10, 0x9b, 0x4b, 0xdc, 0x86, - 0x4f, 0x10, 0x0d, 0x34, 0xfe, 0x78, 0xa1, 0x7f, 0xbf, 0x79, 0x4a, 0x3e, - 0xac, 0xf1, 0x00, 0xdf, 0x20, 0xcb, 0x47, 0x88, 0x06, 0xfe, 0x79, 0xa5, - 0x9b, 0xc8, 0xf1, 0x00, 0xd6, 0x23, 0x33, 0xa4, 0x40, 0x42, 0xfc, 0xb6, - 0xff, 0xbb, 0x1a, 0x57, 0x5f, 0xf0, 0x07, 0x88, 0x06, 0xc8, 0x78, 0x80, - 0x6e, 0x79, 0xc2, 0x7c, 0x9d, 0x48, 0xbb, 0x80, 0x3c, 0x40, 0x37, 0xe7, - 0xf6, 0x93, 0x73, 0xc4, 0x03, 0x7f, 0x20, 0xff, 0x2c, 0xd1, 0xe2, 0x01, - 0xa8, 0x44, 0x80, 0x91, 0xf8, 0xd2, 0xa1, 0x94, 0xaa, 0x18, 0x5a, 0x64, - 0x35, 0xd0, 0xfe, 0x61, 0xee, 0x42, 0x33, 0xa5, 0xae, 0x5a, 0x02, 0x81, - 0x4a, 0xd4, 0xb7, 0x4f, 0x4a, 0x14, 0xdb, 0x85, 0x0f, 0xd8, 0x5f, 0x5e, - 0xf2, 0x32, 0x78, 0xc2, 0x6f, 0x3b, 0xb4, 0xd1, 0x00, 0xaa, 0x98, 0xa6, - 0xf0, 0xeb, 0xbe, 0x51, 0x87, 0x85, 0x67, 0x5d, 0xb2, 0x73, 0xaf, 0xdb, - 0x06, 0x03, 0xd3, 0xaa, 0x0f, 0x05, 0x06, 0x6f, 0xfe, 0x90, 0xe3, 0x7a, - 0x80, 0x07, 0xf3, 0x1d, 0x7e, 0xf6, 0x05, 0xfa, 0x75, 0xc0, 0x82, 0xac, - 0xa1, 0x57, 0xbb, 0x13, 0x9d, 0x73, 0x2c, 0x95, 0x48, 0x7b, 0x4c, 0x62, - 0xb3, 0x08, 0xb2, 0x39, 0x6d, 0x14, 0xa9, 0xe0, 0x59, 0x78, 0x8e, 0x24, - 0x86, 0x05, 0xe4, 0xff, 0xc7, 0x5f, 0xfe, 0xf6, 0xb1, 0x44, 0xe7, 0xd0, - 0x02, 0x37, 0x3a, 0xa7, 0x67, 0x6b, 0xc8, 0x80, 0x30, 0x99, 0x6d, 0x2e, - 0x29, 0x13, 0xb8, 0xd4, 0xe4, 0x00, 0x8c, 0x9f, 0xc5, 0x9f, 0x47, 0x2f, - 0xfb, 0x24, 0x81, 0x76, 0xea, 0x47, 0x5f, 0xf2, 0xd0, 0x5a, 0x9c, 0x40, - 0x1d, 0x4d, 0x3e, 0xde, 0x9b, 0xdf, 0xfe, 0x1f, 0x6d, 0xe4, 0xd2, 0x7e, - 0x4e, 0x18, 0x3a, 0xfe, 0xf7, 0xdd, 0x9b, 0x23, 0x47, 0x5f, 0xec, 0xdf, - 0xde, 0x79, 0x68, 0xeb, 0xc3, 0xbc, 0x8f, 0x18, 0x05, 0x42, 0x3f, 0xb0, - 0x89, 0x13, 0x78, 0x66, 0xe6, 0x77, 0xff, 0xf2, 0x08, 0xff, 0xbe, 0x6f, - 0xe0, 0xf1, 0xf7, 0xc9, 0xce, 0xbf, 0x4d, 0x28, 0xe4, 0xe7, 0x5f, 0x42, - 0x90, 0xb3, 0xaa, 0x48, 0xa7, 0xe2, 0xea, 0xca, 0x6f, 0xfd, 0x2d, 0x7c, - 0x1c, 0x5c, 0x71, 0x43, 0xaf, 0xe9, 0x47, 0x01, 0xf5, 0x67, 0x5f, 0xfd, - 0xb0, 0x73, 0x5e, 0xc1, 0x96, 0x68, 0xeb, 0xe5, 0xc7, 0xfe, 0x3a, 0xb0, - 0xf9, 0x5d, 0x0e, 0xee, 0xbe, 0x22, 0xd0, 0x61, 0x29, 0x7f, 0xd0, 0xc6, - 0x1e, 0xc4, 0xee, 0x27, 0x5f, 0xf4, 0x36, 0x16, 0x8b, 0x02, 0x1d, 0x5c, - 0x45, 0x0f, 0x4c, 0x76, 0x8e, 0xaf, 0xef, 0xac, 0xf1, 0x33, 0xa5, 0x5f, - 0xb5, 0xd8, 0xc9, 0xce, 0xbf, 0xf8, 0x02, 0x99, 0xbf, 0xa6, 0x93, 0xf0, - 0xeb, 0xe9, 0xba, 0xf3, 0x1d, 0x7c, 0xd7, 0xe4, 0xe7, 0x5f, 0xb2, 0x69, - 0x46, 0xe7, 0x5e, 0xea, 0x4c, 0x75, 0xe1, 0x89, 0x15, 0x7f, 0xe1, 0x02, - 0x6d, 0x6d, 0x7f, 0x28, 0x63, 0x3a, 0xb0, 0xf8, 0x5c, 0x6a, 0xbe, 0x26, - 0xeb, 0xb9, 0x3f, 0x11, 0x3a, 0x46, 0x24, 0x5e, 0x28, 0xda, 0x7d, 0xa8, - 0x5c, 0x06, 0xc3, 0x04, 0x8e, 0x57, 0xa6, 0x6f, 0x1d, 0x25, 0xfd, 0xbe, - 0xb9, 0xc8, 0xf1, 0xd7, 0xf4, 0xb4, 0xa7, 0x1d, 0xa7, 0x5e, 0x1f, 0x68, - 0xeb, 0xf6, 0xbf, 0x1f, 0xda, 0x75, 0xfd, 0xe9, 0xa5, 0x9b, 0xc8, 0xea, - 0x84, 0x50, 0xa1, 0x77, 0xe3, 0x7f, 0x4a, 0x6f, 0xfe, 0xeb, 0x31, 0xcd, - 0x63, 0x2f, 0xc5, 0x0e, 0xbf, 0x60, 0x43, 0x8b, 0x3a, 0xff, 0xf7, 0xb7, - 0x6a, 0x77, 0x6e, 0x3d, 0xdf, 0xba, 0x3a, 0xe6, 0x0e, 0x8e, 0xb9, 0xa8, - 0x75, 0xf0, 0xa6, 0xf2, 0x3a, 0xff, 0x93, 0x7e, 0xe0, 0x78, 0xed, 0x3a, - 0xa0, 0xf6, 0x78, 0x43, 0x7f, 0xdd, 0x8e, 0x43, 0x50, 0x5a, 0x75, 0xf7, - 0x94, 0x7d, 0x35, 0x18, 0xbc, 0x6e, 0xda, 0x21, 0xa9, 0x27, 0xcd, 0xc4, - 0x65, 0x93, 0x7e, 0xa0, 0xcc, 0x37, 0xef, 0xdb, 0x5f, 0xaf, 0x02, 0x75, - 0xff, 0xbb, 0x9b, 0x4e, 0x2a, 0x66, 0xfe, 0x3a, 0xff, 0xb1, 0xbd, 0x40, - 0xf7, 0xf5, 0x0e, 0xbd, 0xec, 0x69, 0xd4, 0xb3, 0xd5, 0xd1, 0xd5, 0xe9, - 0x2c, 0x07, 0x52, 0x88, 0xd4, 0x04, 0x25, 0xbc, 0x45, 0x7f, 0xca, 0x3f, - 0xc8, 0x58, 0xa2, 0x87, 0x5f, 0xf9, 0xf4, 0xb8, 0x4e, 0x71, 0x19, 0x3a, - 0xda, 0x50, 0xfd, 0xfa, 0x75, 0x7f, 0xd9, 0xef, 0x22, 0x9e, 0xc6, 0x9d, - 0x7f, 0x46, 0xfa, 0xcd, 0xfc, 0x75, 0xdc, 0x83, 0xa8, 0x27, 0x87, 0xe2, - 0xeb, 0xfe, 0x8f, 0x23, 0x50, 0x31, 0xe3, 0xad, 0xa0, 0xa3, 0x4f, 0x1e, - 0xf8, 0x45, 0x5b, 0xa6, 0x63, 0xe8, 0x7e, 0x5f, 0xf7, 0x92, 0x78, 0xdc, - 0x1c, 0x83, 0xaf, 0x6b, 0xd8, 0x75, 0xd9, 0xaf, 0x87, 0xa9, 0xf4, 0xe6, - 0xff, 0xec, 0xf2, 0x6f, 0x21, 0x86, 0x13, 0x14, 0xdb, 0x3a, 0xff, 0xf7, - 0xf2, 0xeb, 0xa7, 0x90, 0x7d, 0xff, 0x4e, 0xbf, 0x67, 0x80, 0xfe, 0x3a, - 0xa4, 0x8c, 0x0e, 0x28, 0x6d, 0xa5, 0x5f, 0xff, 0xa3, 0xaf, 0x83, 0x1c, - 0x50, 0x3f, 0xbf, 0x24, 0x75, 0x49, 0x37, 0x8f, 0x43, 0xc7, 0x68, 0xce, - 0xa1, 0x75, 0x7b, 0x14, 0x92, 0x1f, 0xef, 0x1e, 0xf7, 0xf1, 0xfb, 0x5f, - 0x75, 0x1e, 0x47, 0x5f, 0xec, 0x19, 0x66, 0xbe, 0xac, 0xeb, 0xf2, 0xf4, - 0x07, 0x73, 0xab, 0xc7, 0xb3, 0xf4, 0xce, 0xff, 0xb9, 0x83, 0xf3, 0xb9, - 0xbb, 0x27, 0x5f, 0xf4, 0x87, 0xf0, 0x7c, 0x6a, 0xc0, 0x75, 0x4e, 0x98, - 0xa4, 0x9e, 0x70, 0x93, 0x73, 0xbb, 0xfe, 0x18, 0xcd, 0xfd, 0x9c, 0x83, - 0xaf, 0xfd, 0x1d, 0xfb, 0xa1, 0xcf, 0x77, 0x0e, 0xa8, 0x45, 0x9b, 0x9f, - 0x80, 0xda, 0xfc, 0xfb, 0x02, 0x18, 0x3a, 0xed, 0x68, 0xeb, 0xcc, 0xb2, - 0xc9, 0xd7, 0x01, 0xca, 0x54, 0xbf, 0xae, 0x1e, 0xd6, 0x8d, 0x6f, 0xfd, - 0x9a, 0x17, 0x52, 0x61, 0x49, 0x8e, 0xbf, 0x81, 0x12, 0xef, 0xdd, 0x1d, - 0x7f, 0x20, 0x81, 0xad, 0x43, 0xaf, 0x38, 0x30, 0xaa, 0x92, 0x6a, 0xcb, - 0x84, 0x17, 0x48, 0x80, 0x7d, 0xb0, 0xbf, 0x6c, 0xae, 0xfa, 0x02, 0x81, - 0x3a, 0xfc, 0x1e, 0x27, 0xf3, 0x9d, 0x7f, 0x99, 0xc1, 0xcd, 0x89, 0xc3, - 0xaf, 0xe1, 0xcd, 0xc1, 0xf6, 0x47, 0x54, 0xc8, 0x8b, 0x12, 0x9f, 0x19, - 0xdc, 0xeb, 0x3a, 0xff, 0x66, 0xcc, 0x55, 0x96, 0x59, 0x2a, 0xfd, 0x34, - 0x67, 0x74, 0x75, 0x09, 0xef, 0xfd, 0x38, 0xbf, 0xcc, 0x18, 0xfd, 0xbd, - 0x4e, 0x1d, 0x79, 0x6f, 0xe3, 0xaa, 0x64, 0x74, 0xf5, 0xd3, 0xf2, 0x3d, - 0x86, 0xf7, 0xf0, 0xec, 0x75, 0xa2, 0xce, 0xbf, 0x64, 0xd2, 0x89, 0x1d, - 0x7f, 0x4e, 0x18, 0xc1, 0x09, 0xd5, 0x0a, 0xb9, 0xe4, 0xc4, 0x90, 0xab, - 0x78, 0xc6, 0x74, 0x83, 0xe2, 0xdf, 0xa4, 0xf7, 0x9c, 0x08, 0x75, 0xff, - 0x04, 0x7f, 0xd6, 0x4f, 0x93, 0x9d, 0x7a, 0x38, 0x27, 0x5f, 0xec, 0x08, - 0xbe, 0x90, 0x27, 0x5b, 0xa7, 0x5e, 0xfd, 0xe7, 0x13, 0xc0, 0xd1, 0x85, - 0x93, 0x88, 0x8e, 0xf2, 0xd5, 0x2d, 0x30, 0xa7, 0x1a, 0x60, 0xc3, 0x22, - 0xff, 0xf6, 0x05, 0xd7, 0x9b, 0xcb, 0x01, 0x81, 0x3a, 0xee, 0xb9, 0xd7, - 0x4d, 0xa3, 0xaf, 0xd9, 0xb1, 0x04, 0x38, 0x6b, 0x3e, 0x8a, 0xdf, 0xbb, - 0x9b, 0xfa, 0x0e, 0xbf, 0x6d, 0x3c, 0xff, 0x64, 0x75, 0x7c, 0x4c, 0x1d, - 0x57, 0x4c, 0x3f, 0xfc, 0x9e, 0xf8, 0x39, 0xd7, 0x3a, 0xff, 0xe8, 0xc1, - 0x97, 0x70, 0x46, 0x19, 0x3a, 0xb8, 0x8a, 0x11, 0x41, 0xf1, 0x05, 0xfe, - 0xe6, 0xbb, 0x82, 0x9a, 0x3a, 0x90, 0xf8, 0x1c, 0xbe, 0xff, 0xb0, 0x38, - 0x30, 0x3f, 0xc1, 0xd7, 0x43, 0x27, 0x54, 0x3b, 0x91, 0xb9, 0xe1, 0x47, - 0x29, 0xc7, 0xf0, 0xcb, 0x96, 0xc7, 0xd5, 0x21, 0x00, 0xd9, 0x6f, 0xdb, - 0xb9, 0xa4, 0x38, 0xa6, 0x84, 0x1f, 0x29, 0xf6, 0xab, 0x94, 0x1f, 0xd9, - 0xcf, 0x37, 0x55, 0x04, 0x33, 0xc6, 0x7e, 0x0b, 0x52, 0x88, 0xbd, 0x38, - 0xd7, 0xfc, 0x6f, 0x5b, 0x25, 0x20, 0xfd, 0x20, 0xda, 0x35, 0xbf, 0xec, - 0xe0, 0xc7, 0xa5, 0x9d, 0x3a, 0xfe, 0x10, 0x60, 0x5e, 0x47, 0x5f, 0xfb, - 0xa8, 0x31, 0xbe, 0x91, 0x70, 0x75, 0xed, 0x47, 0x0e, 0xbd, 0xff, 0xb4, - 0xd3, 0xd7, 0xdc, 0xf2, 0xff, 0x34, 0x72, 0x52, 0x7d, 0x1d, 0x7f, 0x3b, - 0x38, 0x0f, 0xbe, 0x3a, 0xfc, 0xf2, 0xf8, 0x14, 0x3a, 0xf4, 0xa0, 0x07, - 0x5f, 0xbe, 0xcd, 0x28, 0x63, 0x2a, 0xa1, 0x3b, 0xec, 0x36, 0x52, 0x10, - 0x48, 0x6d, 0xc3, 0x1e, 0x97, 0xf8, 0xa3, 0xe8, 0xdd, 0x9a, 0x75, 0xff, - 0xca, 0x0f, 0xef, 0xf7, 0x34, 0x90, 0x27, 0x5e, 0xdb, 0x40, 0x9d, 0x5c, - 0x3e, 0x25, 0xa2, 0x5f, 0xfd, 0xbf, 0xbf, 0x5f, 0x61, 0x05, 0xc2, 0x75, - 0xf2, 0x9c, 0x76, 0x4e, 0xb7, 0xd3, 0x44, 0x0b, 0x6f, 0x1a, 0x81, 0x4a, - 0xf1, 0xbc, 0x64, 0x7e, 0xb1, 0x10, 0x28, 0xbf, 0x7f, 0xe4, 0xdb, 0xea, - 0x7d, 0x54, 0x00, 0x82, 0xaf, 0xf8, 0x7d, 0xaf, 0xf7, 0xf2, 0x32, 0x75, - 0xfe, 0xfd, 0xf5, 0x98, 0x2a, 0x1d, 0x50, 0x7d, 0xbd, 0x3b, 0xbf, 0xe8, - 0xf6, 0xbe, 0x62, 0xd0, 0x27, 0x5f, 0xfb, 0xe0, 0xba, 0x9f, 0x34, 0x00, - 0x41, 0xd7, 0xff, 0xa7, 0xfc, 0x1a, 0x92, 0x6b, 0x51, 0xc9, 0x1d, 0x64, - 0x51, 0x11, 0xdc, 0x42, 0xbf, 0xcf, 0xdd, 0xf5, 0x03, 0xe3, 0xab, 0x47, - 0xb7, 0xe2, 0x9b, 0xfd, 0xd4, 0x9a, 0x50, 0x32, 0x3a, 0xff, 0xd0, 0xce, - 0x98, 0x0e, 0xdc, 0xdf, 0xc7, 0x53, 0x4f, 0xd7, 0xc6, 0x57, 0xd2, 0xee, - 0x4e, 0x75, 0xff, 0x46, 0xeb, 0x7f, 0x66, 0xfe, 0x3a, 0xb7, 0x3d, 0xb1, - 0x22, 0xbf, 0xe8, 0x6f, 0xbf, 0xef, 0x21, 0x93, 0xae, 0xe3, 0x9d, 0x7f, - 0xf6, 0xc4, 0xd6, 0xb0, 0x5a, 0xe2, 0x03, 0xaf, 0xf7, 0x50, 0x21, 0xc6, - 0x66, 0x3a, 0xf4, 0x70, 0x18, 0x7e, 0xed, 0x43, 0xae, 0x22, 0xfb, 0xb0, - 0x8c, 0xbf, 0xf3, 0xef, 0xac, 0xf2, 0x2d, 0xe4, 0x75, 0xbc, 0x75, 0x00, - 0xf3, 0x7e, 0x9e, 0xdf, 0xff, 0xfd, 0xfe, 0xba, 0xf2, 0xd4, 0x93, 0xdf, - 0x79, 0x1d, 0x8f, 0x69, 0xf7, 0x3a, 0xfd, 0x18, 0x3e, 0xdb, 0x3a, 0xfe, - 0x4d, 0xc1, 0xc7, 0x09, 0xd6, 0x59, 0xd4, 0xb3, 0xe5, 0xe9, 0x40, 0x96, - 0xde, 0x97, 0xe1, 0x3a, 0xe7, 0xdf, 0xe1, 0xe5, 0xb9, 0x75, 0x71, 0x35, - 0x4d, 0x46, 0x4b, 0x7f, 0xff, 0x60, 0xcf, 0xad, 0x40, 0x33, 0xa9, 0xc7, - 0x67, 0xc7, 0x50, 0x57, 0x78, 0x9a, 0x43, 0xbc, 0x64, 0x53, 0x42, 0x5f, - 0x8f, 0xab, 0x22, 0xec, 0x3e, 0x00, 0xeb, 0xe8, 0xde, 0x19, 0x2a, 0xa8, - 0x5f, 0x39, 0x49, 0xe9, 0x2b, 0xff, 0xf2, 0x4c, 0xef, 0x2d, 0x42, 0xc3, - 0xd8, 0x16, 0x9d, 0x7f, 0xd9, 0x34, 0xa3, 0x7c, 0xdf, 0xc7, 0x5d, 0xc9, - 0xf1, 0x11, 0xa2, 0xa7, 0x7c, 0x1e, 0xff, 0x39, 0xd7, 0xf8, 0x2f, 0x2c, - 0x9f, 0xf1, 0x3a, 0xff, 0xdc, 0xc6, 0x39, 0xba, 0xeb, 0x4d, 0x1d, 0x69, - 0xe1, 0x13, 0x18, 0x49, 0xc3, 0x3b, 0x98, 0x38, 0x75, 0x61, 0xe7, 0x39, - 0xad, 0xfd, 0xed, 0xbf, 0xfb, 0x8d, 0x3a, 0xff, 0x72, 0x3c, 0x80, 0x89, - 0x1d, 0x7a, 0x71, 0x91, 0xd4, 0xc0, 0x65, 0x8f, 0x43, 0x92, 0x11, 0x2e, - 0x18, 0xbd, 0x9f, 0x5a, 0x78, 0x5c, 0x8c, 0x62, 0x9a, 0x20, 0xf1, 0x8f, - 0xe6, 0x37, 0xfe, 0x60, 0x7d, 0x85, 0xb7, 0xaf, 0xb8, 0x0e, 0xbf, 0xd2, - 0x9b, 0x05, 0xfb, 0x87, 0x5f, 0xed, 0x8f, 0x30, 0x60, 0x67, 0x3a, 0xfc, - 0xf1, 0x32, 0x74, 0xeb, 0xe8, 0xfd, 0x82, 0x87, 0x5e, 0xf7, 0xa0, 0xeb, - 0xfc, 0x9c, 0x89, 0xdf, 0x8d, 0x3a, 0xde, 0xf8, 0x89, 0x8e, 0x13, 0x39, - 0x2f, 0x86, 0xef, 0xff, 0x71, 0xa3, 0x9b, 0x07, 0x23, 0x91, 0xa3, 0xaf, - 0xf3, 0xcd, 0xdc, 0x5e, 0x68, 0xea, 0xc3, 0xfa, 0xd8, 0x91, 0x7f, 0x85, - 0x4f, 0x91, 0xb1, 0x36, 0x1d, 0x7e, 0x53, 0xd9, 0x8b, 0x3a, 0xb0, 0xf7, - 0xd0, 0xe2, 0xff, 0xf4, 0xc3, 0x8a, 0x28, 0xfe, 0xd2, 0x0c, 0xc7, 0x5f, - 0xb0, 0x29, 0xcd, 0x1d, 0x7b, 0xde, 0xdc, 0xeb, 0xff, 0xb7, 0x6a, 0x77, - 0xe6, 0xd6, 0x75, 0x16, 0x75, 0x00, 0xf9, 0xbc, 0x3b, 0x77, 0xfc, 0x3a, - 0xb4, 0x6e, 0x76, 0xc8, 0xad, 0x13, 0xa3, 0xa5, 0x98, 0x62, 0xd4, 0x2b, - 0x90, 0xc8, 0x66, 0xa4, 0x2f, 0xbb, 0x08, 0x27, 0x20, 0xf4, 0x66, 0x97, - 0xfe, 0x14, 0xfb, 0xbe, 0x6c, 0xde, 0x3e, 0x9d, 0x7f, 0xf9, 0x33, 0x81, - 0x86, 0x73, 0xb1, 0xbe, 0x8e, 0xbe, 0xfb, 0x1c, 0x01, 0xd7, 0x3f, 0x0e, - 0xbf, 0xbc, 0x93, 0xae, 0x1a, 0x75, 0x04, 0xf0, 0xba, 0x2b, 0x7d, 0xcf, - 0x24, 0xe7, 0x5d, 0x9b, 0x47, 0x5f, 0x03, 0xe8, 0xc8, 0xeb, 0x80, 0xe2, - 0x6e, 0xfc, 0x31, 0x50, 0x8a, 0xa4, 0x22, 0xfd, 0x76, 0xed, 0xe6, 0x3a, - 0xfd, 0xf7, 0xc0, 0x5e, 0x1d, 0x4b, 0x3c, 0x10, 0x0c, 0x5e, 0x6c, 0x68, - 0xeb, 0xfe, 0x93, 0xf3, 0xc3, 0x0b, 0xd1, 0xd7, 0xfa, 0x03, 0x1c, 0xfe, - 0x00, 0x75, 0xcb, 0xd4, 0xc7, 0xd2, 0xb3, 0x7b, 0xff, 0x43, 0x8e, 0x7b, - 0xc8, 0xcf, 0x8e, 0xa8, 0x4c, 0x47, 0x08, 0x92, 0x10, 0x9f, 0x97, 0xd3, - 0x09, 0x7f, 0x3a, 0x11, 0x65, 0x2f, 0x07, 0x1a, 0x9a, 0x89, 0x32, 0x4e, - 0xa3, 0x0f, 0xf4, 0x70, 0x37, 0xf4, 0x7f, 0xba, 0x6f, 0xb4, 0x75, 0xfb, - 0x19, 0xcd, 0xfc, 0x75, 0xb9, 0xf0, 0xf6, 0x90, 0xca, 0xff, 0xf6, 0xb0, - 0x7f, 0x6f, 0x71, 0x73, 0x3b, 0x4e, 0xbf, 0xc2, 0xa7, 0x61, 0x6b, 0x13, - 0xaf, 0xe6, 0x34, 0x8d, 0xaf, 0xfc, 0x75, 0xfa, 0x26, 0xcc, 0x69, 0xd5, - 0x88, 0x8b, 0x43, 0x2e, 0x99, 0xdf, 0xfb, 0xb9, 0x32, 0x4d, 0xfe, 0xd7, - 0xfa, 0x3a, 0xf2, 0x71, 0x43, 0xa9, 0x0f, 0x84, 0x51, 0x6f, 0xd1, 0xb5, - 0xd8, 0x98, 0xea, 0x91, 0xe5, 0x68, 0x82, 0xff, 0xef, 0xe6, 0x4e, 0xc6, - 0xf2, 0x89, 0xa0, 0xeb, 0xf0, 0x5c, 0x63, 0xa7, 0x5f, 0xd2, 0x8d, 0xfd, - 0x9d, 0x3a, 0xff, 0xf7, 0xb4, 0x80, 0x89, 0x6b, 0x33, 0x7f, 0x1d, 0x53, - 0x1f, 0xb6, 0x8b, 0x6c, 0x9d, 0x45, 0xf3, 0x30, 0x9b, 0xbf, 0xff, 0x73, - 0xfe, 0x72, 0x07, 0x14, 0x4e, 0xf7, 0x3e, 0x9d, 0x7f, 0x0b, 0xa0, 0x60, - 0x4e, 0xbe, 0x9e, 0x36, 0xa0, 0xeb, 0xee, 0x81, 0xfc, 0x75, 0xba, 0x75, - 0xb6, 0x39, 0xb1, 0xfc, 0x86, 0xff, 0xe4, 0x5a, 0x6b, 0xb0, 0x9c, 0xfd, - 0x8c, 0xea, 0x84, 0x62, 0x22, 0xab, 0x94, 0xdf, 0xc3, 0xa4, 0xd9, 0x01, - 0x3a, 0xf0, 0xa2, 0x87, 0x5f, 0xde, 0x4e, 0x27, 0xbf, 0x3a, 0xd0, 0xb3, - 0xc8, 0xfa, 0x37, 0x7f, 0x7f, 0xf7, 0xb9, 0xbe, 0x8e, 0xbf, 0xff, 0xff, - 0x72, 0x3c, 0x2e, 0xd4, 0xd4, 0xc9, 0xc6, 0xc6, 0xbd, 0x1b, 0xc7, 0xdc, - 0xd1, 0xd7, 0xfb, 0xb9, 0xbc, 0x71, 0x16, 0x75, 0xff, 0xff, 0xff, 0xb5, - 0xac, 0xf7, 0x5d, 0x7a, 0xe7, 0x13, 0x7f, 0x3b, 0xa9, 0x99, 0x37, 0xfe, - 0x86, 0x77, 0x83, 0xaf, 0x77, 0x38, 0x75, 0xfd, 0xe1, 0x70, 0x60, 0x9d, - 0x7e, 0x17, 0x06, 0x09, 0xd5, 0xf0, 0xf3, 0xbc, 0x55, 0x50, 0x9e, 0xf8, - 0x61, 0x06, 0xe6, 0x5e, 0x84, 0xef, 0xed, 0x37, 0xc0, 0x7d, 0xf4, 0x75, - 0xcc, 0xb2, 0x75, 0x68, 0xdd, 0x32, 0x45, 0x7e, 0x4e, 0xbe, 0x74, 0xa5, - 0x4d, 0x15, 0xff, 0x7f, 0xe8, 0x16, 0xb1, 0x60, 0x59, 0xd7, 0xbb, 0x00, - 0x3a, 0x90, 0xf6, 0x5c, 0xfa, 0xfe, 0x7e, 0xc0, 0xe4, 0xe7, 0x5f, 0xee, - 0xc7, 0xbf, 0x5f, 0xfe, 0x3a, 0xa1, 0x92, 0x13, 0x22, 0x90, 0xc3, 0x57, - 0x78, 0x6c, 0xb1, 0x91, 0x4d, 0x18, 0x27, 0x0b, 0x96, 0xaf, 0xd8, 0x76, - 0xb9, 0x68, 0x1d, 0x58, 0x25, 0x23, 0x28, 0x43, 0x50, 0xb0, 0xf4, 0x23, - 0xf6, 0x10, 0x6d, 0x15, 0xdf, 0x27, 0x3e, 0xcc, 0x75, 0xf3, 0x7a, 0x9f, - 0x4e, 0xae, 0x9e, 0x3f, 0xd2, 0x4b, 0xf4, 0xd1, 0x37, 0x60, 0xeb, 0xbe, - 0xc1, 0xd7, 0x99, 0x65, 0x92, 0xaf, 0xa5, 0xec, 0x69, 0x4a, 0x97, 0xf7, - 0xec, 0x0a, 0x03, 0x47, 0xbb, 0xfa, 0xb8, 0x7c, 0x82, 0x63, 0x50, 0x8e, - 0x3e, 0x14, 0x3c, 0x26, 0xae, 0xf6, 0x8e, 0xbf, 0xef, 0x9e, 0xec, 0x7b, - 0x5d, 0x43, 0xad, 0xa3, 0xaf, 0xf7, 0xb7, 0x97, 0x60, 0x67, 0x2a, 0xff, - 0xd9, 0xbc, 0x93, 0x04, 0x70, 0x27, 0x5f, 0xa7, 0x5f, 0xfb, 0xf8, 0xea, - 0x84, 0x7d, 0x6e, 0x2d, 0xc3, 0xa1, 0x10, 0xd1, 0xa7, 0x8e, 0xef, 0xf8, - 0x61, 0x9d, 0x20, 0xef, 0x23, 0xae, 0x86, 0x9d, 0x42, 0x79, 0xbb, 0x0e, - 0x2f, 0xa7, 0xfb, 0x0c, 0x67, 0x5f, 0xed, 0x04, 0x61, 0x9c, 0x13, 0xab, - 0x87, 0xb1, 0xe2, 0x7a, 0x84, 0xd0, 0x12, 0x14, 0x6e, 0xf7, 0x7f, 0x0e, - 0xfa, 0x9b, 0x3c, 0x75, 0xfc, 0x9e, 0x17, 0x06, 0x8e, 0xbf, 0xfd, 0xe9, - 0xb3, 0x98, 0xeb, 0x8e, 0xa0, 0x4e, 0xbf, 0xbf, 0x5e, 0x77, 0x77, 0x3a, - 0x94, 0x45, 0x08, 0x95, 0xe9, 0x22, 0xff, 0xf2, 0x04, 0x5f, 0x71, 0xcf, - 0x62, 0x00, 0xeb, 0xfa, 0x3d, 0xd9, 0x6b, 0xf3, 0xaf, 0xdd, 0x7e, 0x67, - 0x0e, 0xbb, 0xf7, 0x3a, 0x9a, 0x6f, 0x04, 0x9a, 0xfe, 0xe4, 0x24, 0x9f, - 0x47, 0x5a, 0x27, 0x3c, 0xb1, 0x20, 0xbf, 0x4e, 0xc6, 0x99, 0xb9, 0xd7, - 0xe4, 0xd4, 0x4e, 0xb3, 0xd9, 0xfb, 0x7e, 0x87, 0xe0, 0x3f, 0x3d, 0x9f, - 0xb7, 0x3c, 0x8f, 0x67, 0xed, 0xf7, 0xf2, 0xcd, 0x1e, 0xcf, 0xda, 0x09, - 0xe8, 0x89, 0x15, 0xfa, 0x33, 0x58, 0x27, 0xb3, 0xf6, 0x8f, 0x67, 0xed, - 0xcf, 0xe3, 0xd9, 0xfa, 0xb2, 0xde, 0xd2, 0x13, 0xf9, 0xfd, 0x22, 0xfb, - 0x36, 0xd0, 0x07, 0xb3, 0xf6, 0x8f, 0x67, 0xed, 0xc0, 0x83, 0xd9, 0xfb, - 0x7f, 0xd8, 0x07, 0xe6, 0x6c, 0xc0, 0x9e, 0xcf, 0xdb, 0xfb, 0x3a, 0x9a, - 0xfe, 0x73, 0xd9, 0xfb, 0x40, 0x45, 0x10, 0x91, 0x69, 0x16, 0xfb, 0x93, - 0xc7, 0x8f, 0x67, 0xed, 0x1e, 0xcf, 0xdc, 0x35, 0xf7, 0x32, 0xc9, 0xec, - 0xfd, 0xa9, 0x2b, 0x0d, 0x09, 0xa6, 0x42, 0x17, 0x78, 0x4d, 0x70, 0xa1, - 0x66, 0x1a, 0x85, 0xcf, 0x97, 0x99, 0x26, 0xbd, 0x28, 0x50, 0xb6, 0x7e, - 0x95, 0x44, 0x85, 0xfe, 0xd6, 0x4a, 0x51, 0xed, 0xce, 0xac, 0x3f, 0x0d, - 0x1e, 0xdf, 0xfb, 0x1a, 0x1c, 0xe3, 0x2f, 0xd9, 0x8e, 0xbf, 0xfb, 0x43, - 0x93, 0x44, 0xe0, 0x7d, 0xf4, 0x75, 0xd2, 0x9c, 0xab, 0xe9, 0x9d, 0xf8, - 0x75, 0x4e, 0x8d, 0xdd, 0xc8, 0x7a, 0x7e, 0x28, 0xbb, 0x42, 0xf5, 0xc5, - 0xd6, 0x37, 0x9d, 0x15, 0xbf, 0xcb, 0xd0, 0xe7, 0xb0, 0x07, 0x5f, 0xf3, - 0x60, 0x01, 0xfd, 0xf9, 0x23, 0xaf, 0xfc, 0xef, 0x3e, 0x2d, 0xc7, 0x79, - 0x1d, 0x7e, 0x64, 0x5d, 0x4d, 0x61, 0xfb, 0x4c, 0x73, 0x50, 0x8e, 0x77, - 0x85, 0x3d, 0xf8, 0x7d, 0xdc, 0x9c, 0xeb, 0x82, 0xc9, 0xd5, 0x06, 0xfb, - 0x09, 0xef, 0xff, 0xd2, 0xe4, 0x6c, 0x79, 0xa0, 0x3d, 0x85, 0xbc, 0xc7, - 0x5f, 0xed, 0xa7, 0xd2, 0x6a, 0x6c, 0x3a, 0xb7, 0x44, 0x67, 0x15, 0xea, - 0x19, 0x8d, 0x72, 0x94, 0xdb, 0x86, 0x69, 0x0c, 0xf6, 0x33, 0x0e, 0x23, - 0x76, 0x16, 0xaf, 0x3b, 0x14, 0x31, 0x8a, 0x69, 0x93, 0xf8, 0x55, 0xdf, - 0xff, 0xf2, 0x75, 0xfb, 0x12, 0x57, 0x01, 0x12, 0xd0, 0x7b, 0x1c, 0x3a, - 0xff, 0xca, 0x46, 0xe3, 0x1d, 0xef, 0xed, 0x3a, 0xff, 0xf0, 0x79, 0x18, - 0x39, 0x24, 0xee, 0x6c, 0x3a, 0xfe, 0x17, 0x53, 0xaf, 0x23, 0xaf, 0x32, - 0xcb, 0x25, 0x5e, 0xfb, 0x00, 0x29, 0x52, 0xfe, 0xff, 0x9e, 0x5f, 0x79, - 0x9b, 0x1f, 0x87, 0x5f, 0xff, 0xbb, 0x92, 0xfa, 0x23, 0x93, 0xcd, 0x28, - 0xe4, 0xe7, 0x50, 0xa2, 0x4f, 0xc7, 0x77, 0xfd, 0xe7, 0x1c, 0xd7, 0x23, - 0x47, 0x5f, 0x4a, 0x01, 0xb9, 0xd7, 0xf0, 0x20, 0x73, 0x7f, 0x1d, 0x73, - 0x83, 0xe1, 0xe7, 0x7d, 0x22, 0xa7, 0x45, 0xa8, 0xc2, 0x12, 0xf6, 0xc8, - 0xe1, 0xd5, 0x25, 0x62, 0x41, 0x65, 0xc4, 0x05, 0xa4, 0x01, 0x2c, 0x61, - 0x81, 0xe8, 0x6b, 0xec, 0x26, 0xb9, 0x27, 0x3a, 0xff, 0x0b, 0x42, 0x9b, - 0x20, 0x27, 0x50, 0x4f, 0x27, 0xf1, 0x6b, 0x00, 0xeb, 0xfe, 0xc8, 0x63, - 0xf9, 0xd7, 0xce, 0x1d, 0x7f, 0x81, 0xb6, 0x8b, 0x08, 0x70, 0xeb, 0xfe, - 0xf7, 0x73, 0x5f, 0x3c, 0x93, 0x9d, 0x50, 0x7e, 0x08, 0x6b, 0x7f, 0xc2, - 0x9f, 0xb0, 0x75, 0xb7, 0x1e, 0x3a, 0xa4, 0x98, 0xd4, 0xc2, 0x1d, 0x85, - 0x58, 0x90, 0x5e, 0x65, 0x96, 0x4b, 0x10, 0x82, 0xf9, 0xae, 0xed, 0x2c, - 0x42, 0x05, 0x4d, 0x6d, 0xf3, 0xf3, 0x19, 0x3a, 0xb8, 0x7c, 0x1b, 0x0f, - 0xef, 0x32, 0xcb, 0x25, 0x88, 0x3d, 0x45, 0x88, 0x3c, 0xa9, 0xad, 0xbc, - 0xcb, 0x2c, 0x9d, 0x7b, 0x50, 0xa1, 0x4a, 0x97, 0xf6, 0x5e, 0x23, 0x15, - 0xaa, 0x3e, 0x48, 0xbf, 0xfb, 0xb1, 0x24, 0xf6, 0x75, 0xb0, 0xb3, 0xaa, - 0x0f, 0xdf, 0x61, 0xad, 0xff, 0xec, 0xea, 0x73, 0xaf, 0x9a, 0x47, 0x9c, - 0xeb, 0xe8, 0xf4, 0x2c, 0xea, 0x59, 0xf3, 0xf9, 0x1e, 0xfe, 0x65, 0xc3, - 0xfb, 0xfd, 0x3a, 0xf8, 0x52, 0x14, 0x3a, 0xf7, 0xd8, 0x01, 0xd5, 0x39, - 0xbd, 0x59, 0x05, 0xf9, 0xb1, 0xd8, 0x59, 0x57, 0xe1, 0x71, 0x1c, 0x2a, - 0xec, 0x69, 0x57, 0x32, 0xc9, 0x55, 0x87, 0xed, 0xa2, 0x6f, 0x11, 0xb2, - 0x2b, 0x7f, 0x87, 0xec, 0x03, 0xb9, 0xb4, 0x52, 0xa6, 0xf2, 0xff, 0xf4, - 0xe1, 0xe3, 0xb4, 0x73, 0x67, 0x13, 0x47, 0x54, 0x27, 0xeb, 0x84, 0x48, - 0xda, 0xf0, 0xd4, 0xfd, 0x1e, 0xff, 0xe8, 0x06, 0xb3, 0x02, 0xe2, 0xea, - 0x1d, 0x7f, 0x0c, 0x67, 0x1c, 0x07, 0x5f, 0xfa, 0x39, 0xd8, 0x4e, 0xc0, - 0xa1, 0xd7, 0x4b, 0x5e, 0x3e, 0x46, 0x4a, 0xaf, 0xf4, 0x0e, 0x2d, 0x37, - 0x91, 0xd7, 0xff, 0xda, 0x1c, 0xdc, 0x0f, 0xa7, 0xe2, 0x6e, 0x03, 0xab, - 0x74, 0x57, 0xf8, 0xbd, 0x93, 0x1a, 0xea, 0x70, 0xcf, 0x1a, 0xa5, 0xfd, - 0xaf, 0xa1, 0xfc, 0x64, 0x75, 0xfc, 0x8d, 0x0e, 0x38, 0x0e, 0xbf, 0xff, - 0x7b, 0x5b, 0xfc, 0x0e, 0x06, 0x1f, 0x98, 0x20, 0x3a, 0xff, 0xf6, 0xb3, - 0xdf, 0x1b, 0xd4, 0xef, 0x50, 0x06, 0x84, 0x2e, 0xf4, 0x4e, 0xae, 0x91, - 0x5d, 0xe5, 0x6b, 0xf2, 0xf4, 0xcb, 0xee, 0x75, 0xb4, 0x13, 0xdf, 0xfa, - 0x6d, 0x7f, 0x64, 0xd2, 0x4e, 0x68, 0xea, 0x86, 0x52, 0x48, 0x61, 0x8d, - 0x91, 0x9e, 0xa4, 0xa0, 0xce, 0x4a, 0x7f, 0x78, 0xf4, 0xd8, 0x25, 0x22, - 0x61, 0xa8, 0xce, 0x3c, 0x55, 0x79, 0x96, 0x59, 0x2a, 0xf8, 0x0e, 0x21, - 0x29, 0x52, 0xfe, 0xfb, 0xa8, 0xf2, 0x3a, 0xfb, 0x9c, 0x45, 0x9d, 0x7b, - 0x51, 0xe3, 0xaf, 0x0f, 0xb4, 0x86, 0xf2, 0x62, 0x1b, 0xdf, 0x14, 0xdb, - 0x3a, 0xf7, 0x9c, 0x27, 0x57, 0x0d, 0xee, 0x88, 0xaf, 0xe6, 0xc0, 0x13, - 0x8a, 0x1d, 0x7f, 0x7d, 0xce, 0x66, 0x4c, 0x75, 0xf9, 0xfb, 0xf0, 0x30, - 0x75, 0x49, 0x39, 0xf0, 0x98, 0x62, 0xe2, 0x37, 0x89, 0x0e, 0x8b, 0x7c, - 0x5d, 0x7e, 0x7e, 0x73, 0x37, 0x3a, 0xff, 0xf7, 0xba, 0x8e, 0x0c, 0xe0, - 0x60, 0x64, 0x75, 0xff, 0xed, 0xfe, 0x6e, 0x08, 0x16, 0xbc, 0xe2, 0xe7, - 0x54, 0x22, 0xeb, 0x09, 0xc5, 0x1e, 0xfd, 0x1a, 0xfa, 0x32, 0x3a, 0xff, - 0xff, 0xe7, 0x4f, 0x27, 0x5a, 0x9f, 0x24, 0x9d, 0x71, 0xf4, 0xb3, 0x98, - 0x75, 0xee, 0xe6, 0xd1, 0xd7, 0xef, 0x6b, 0xee, 0xbe, 0x75, 0x11, 0xae, - 0xdf, 0x7f, 0xff, 0xff, 0xd1, 0xa8, 0xf4, 0xf8, 0xcf, 0x33, 0xaf, 0xf7, - 0x58, 0xa3, 0x88, 0x20, 0x62, 0x6e, 0xc1, 0xd7, 0xed, 0x75, 0xdb, 0x07, - 0x50, 0xa2, 0xe9, 0x98, 0x4a, 0x5f, 0xff, 0xfc, 0x8a, 0x6f, 0x2f, 0x60, - 0xfb, 0x5f, 0x35, 0xac, 0xe6, 0x0b, 0xc8, 0xeb, 0xff, 0x95, 0x08, 0xc7, - 0xed, 0xc5, 0x13, 0x87, 0x5d, 0x8c, 0x9d, 0x6c, 0x83, 0xdb, 0xd2, 0x2d, - 0xfe, 0x0f, 0x62, 0x67, 0x7d, 0xce, 0xbd, 0xd0, 0x6c, 0x3a, 0xb8, 0x7a, - 0x3b, 0x46, 0x75, 0x24, 0x4e, 0x3b, 0xbd, 0xff, 0xd9, 0xc0, 0x2d, 0x35, - 0xf7, 0x51, 0x87, 0x5f, 0x83, 0xc8, 0xdd, 0x8c, 0xeb, 0xff, 0xff, 0x7a, - 0x38, 0x06, 0xf5, 0x24, 0x9c, 0x70, 0x78, 0x61, 0x7a, 0x3a, 0xe6, 0x3d, - 0x1d, 0x4a, 0x22, 0x0d, 0xda, 0xaa, 0x49, 0x8a, 0xe2, 0x23, 0xc2, 0xba, - 0xf0, 0x71, 0x67, 0x5f, 0x03, 0xd8, 0x03, 0xa9, 0x0d, 0xe7, 0x06, 0xef, - 0xf9, 0xbd, 0x18, 0xdd, 0x23, 0xa7, 0x54, 0x2f, 0x46, 0x4a, 0x31, 0xc0, - 0x96, 0xe4, 0x2d, 0x52, 0x1f, 0xdc, 0x28, 0x78, 0xda, 0x86, 0x33, 0x7f, - 0xdc, 0x3e, 0x90, 0x5f, 0xf9, 0xd0, 0x3f, 0xfb, 0x53, 0xe3, 0x27, 0x5f, - 0xb5, 0x8a, 0x46, 0x8e, 0xbf, 0x98, 0xf4, 0x83, 0xbc, 0x8e, 0xbf, 0xf3, - 0xf3, 0x6d, 0x3b, 0x8f, 0xb8, 0x0e, 0xbf, 0xff, 0x27, 0xa1, 0x79, 0xbf, - 0xa1, 0x7f, 0x78, 0xe0, 0x3a, 0xf9, 0x05, 0xc2, 0x75, 0xff, 0x6a, 0x39, - 0xe8, 0x54, 0x28, 0x75, 0x49, 0x15, 0xa1, 0x56, 0xd0, 0xfd, 0xff, 0xed, - 0x27, 0x22, 0x5d, 0x89, 0x87, 0xf5, 0x0e, 0xb9, 0xbb, 0x67, 0x5f, 0xca, - 0x7a, 0x3b, 0x1a, 0x3a, 0xfe, 0xea, 0x6f, 0xa7, 0xdc, 0xea, 0x91, 0xfa, - 0x20, 0xc8, 0x0b, 0x6f, 0xfc, 0x2f, 0x37, 0x5f, 0x9c, 0x40, 0x9d, 0x7a, - 0x18, 0xa3, 0x9d, 0x78, 0x28, 0x27, 0x5f, 0xd1, 0xe6, 0x03, 0xc6, 0xe7, - 0x57, 0xc3, 0xca, 0x41, 0xab, 0xe8, 0x06, 0x09, 0xd5, 0x25, 0x69, 0x58, - 0x4e, 0xd3, 0x04, 0x87, 0x6c, 0xc6, 0x1c, 0x85, 0xfa, 0xcb, 0xb4, 0x7a, - 0xcb, 0x56, 0xd9, 0x1d, 0xf9, 0x16, 0xc3, 0x31, 0x46, 0x2c, 0xeb, 0xef, - 0xb0, 0xce, 0x8e, 0xb8, 0x1e, 0x3a, 0xe0, 0x74, 0xeb, 0xee, 0x73, 0x34, - 0x75, 0xd9, 0x31, 0xd6, 0x97, 0xc4, 0x43, 0xce, 0x48, 0xb1, 0x67, 0x16, - 0xfa, 0x43, 0x7e, 0x4f, 0x38, 0xe1, 0xd7, 0xee, 0x07, 0x30, 0x4e, 0xbf, - 0xf9, 0x8d, 0x33, 0xb1, 0xb3, 0x5d, 0x8d, 0xce, 0xbf, 0xb7, 0xe7, 0xfb, - 0xfa, 0x47, 0x53, 0xa2, 0x7b, 0x44, 0xbf, 0xa4, 0x5f, 0xf6, 0x0f, 0x33, - 0x58, 0x9d, 0x3a, 0xff, 0xfa, 0x5e, 0x1c, 0x7f, 0x0e, 0x7b, 0xd8, 0xc9, - 0xd7, 0x66, 0xc3, 0xaf, 0xf9, 0xbd, 0xc0, 0xad, 0x39, 0x87, 0x54, 0xe7, - 0x9d, 0x82, 0xf7, 0xff, 0xbd, 0xac, 0x9b, 0xb1, 0xb3, 0x3b, 0xd8, 0x3a, - 0xfe, 0xe8, 0x53, 0x64, 0x04, 0xea, 0xc3, 0xf9, 0x74, 0xbb, 0xec, 0xf2, - 0x68, 0xeb, 0xf9, 0x89, 0x98, 0x58, 0xb9, 0xff, 0x3a, 0xb4, 0x7b, 0x5e, - 0x20, 0xa9, 0x2a, 0xf9, 0x0c, 0x30, 0x9a, 0x61, 0xb9, 0xaf, 0x21, 0x36, - 0x30, 0x9b, 0xf3, 0xd5, 0xe6, 0x73, 0xa7, 0x5f, 0xed, 0x22, 0x9d, 0x71, - 0x43, 0xaf, 0x93, 0x58, 0x17, 0x3c, 0xdf, 0x0e, 0x5f, 0xf9, 0xd8, 0xc1, - 0xfe, 0x90, 0x77, 0x91, 0xd7, 0xff, 0xf7, 0xb3, 0xa9, 0x1e, 0x40, 0x44, - 0x95, 0x65, 0x96, 0x4a, 0xbf, 0xdd, 0xfd, 0xd6, 0x17, 0x59, 0xd4, 0x28, - 0x90, 0xf2, 0xed, 0xf0, 0x73, 0x14, 0x2a, 0xf9, 0xc0, 0xfe, 0x3a, 0xff, - 0xb8, 0xed, 0xf9, 0xd8, 0xfa, 0x27, 0x5e, 0xfe, 0x38, 0x75, 0xde, 0xd0, - 0x4f, 0x5e, 0x63, 0xbb, 0xd2, 0x1f, 0xcd, 0x10, 0xcd, 0xee, 0xc4, 0xe7, - 0x5e, 0x65, 0x96, 0x4a, 0xbd, 0x82, 0xd2, 0x95, 0x2f, 0xef, 0xfd, 0x93, - 0xe0, 0x5e, 0x43, 0x13, 0x9d, 0x40, 0x3e, 0x71, 0x2a, 0xbe, 0x71, 0x62, - 0xac, 0x23, 0xae, 0x62, 0xac, 0x54, 0xeb, 0xf6, 0x7b, 0xdf, 0xce, 0x75, - 0xa4, 0xc5, 0x4f, 0x2c, 0x48, 0xaf, 0x3b, 0x1c, 0x1d, 0x7e, 0xc0, 0xf5, - 0xd8, 0xce, 0xbf, 0x0e, 0x06, 0x16, 0x75, 0x42, 0xae, 0x29, 0xc8, 0x82, - 0x43, 0x8e, 0xfb, 0x97, 0xcc, 0x53, 0xc8, 0x51, 0x74, 0x85, 0xdd, 0x7f, - 0x2d, 0xd8, 0x3a, 0xc9, 0x4d, 0xfe, 0x85, 0xe2, 0x72, 0x69, 0x1d, 0x7b, - 0xc9, 0x07, 0x5d, 0x82, 0x75, 0x21, 0xae, 0xfc, 0x6a, 0xff, 0xfd, 0xd7, - 0xe6, 0xb1, 0x05, 0xfd, 0xa6, 0x60, 0x4e, 0xbf, 0x05, 0x39, 0x1e, 0x3a, - 0xfd, 0x12, 0xee, 0x6e, 0x75, 0xdb, 0x80, 0xeb, 0xf9, 0x71, 0xa0, 0x23, - 0x4e, 0xbd, 0xa8, 0x50, 0x07, 0x87, 0xa1, 0x7b, 0xfd, 0xfe, 0x70, 0x00, - 0x41, 0x3a, 0xff, 0xd8, 0xb4, 0x0f, 0x30, 0x2e, 0xb3, 0xaf, 0xb1, 0x7f, - 0x42, 0x75, 0x74, 0xf7, 0xc4, 0xf2, 0xff, 0xf2, 0x07, 0xbf, 0x75, 0x9c, - 0x6b, 0xbb, 0x4d, 0x10, 0x65, 0xf7, 0xfd, 0xc6, 0x9d, 0x52, 0x3f, 0x9d, - 0xb5, 0x7b, 0xfd, 0xdf, 0xd4, 0x1c, 0x9f, 0xf3, 0xaf, 0x77, 0xf6, 0x33, - 0xaf, 0xff, 0x71, 0xf6, 0x60, 0xb7, 0xa8, 0x0f, 0xbe, 0x3a, 0xa1, 0x18, - 0xf2, 0x25, 0x60, 0x9b, 0x7e, 0x41, 0x5b, 0xaa, 0x67, 0xe9, 0xa6, 0xa1, - 0x23, 0xe8, 0xd8, 0x6f, 0x3e, 0xcc, 0x3a, 0xff, 0x01, 0x3b, 0xdc, 0x03, - 0x9d, 0x7f, 0xff, 0xcb, 0xcf, 0x79, 0xf8, 0x31, 0xbc, 0xbe, 0xf0, 0x0b, - 0x4d, 0x1d, 0x7f, 0xcb, 0x46, 0x70, 0x43, 0xd8, 0x3a, 0xee, 0xfe, 0x75, - 0xff, 0xfa, 0x48, 0x21, 0xee, 0x6f, 0xf5, 0xc7, 0xc2, 0x13, 0xaf, 0x23, - 0x2c, 0x67, 0x5f, 0xec, 0xd9, 0xaf, 0x7a, 0x16, 0x75, 0x70, 0xf4, 0xfa, - 0x3f, 0x50, 0x9c, 0x06, 0x34, 0x21, 0xbc, 0xc2, 0xfa, 0x85, 0x45, 0xfe, - 0xdb, 0xcd, 0x6d, 0xe7, 0x20, 0xea, 0x92, 0xf0, 0x38, 0x48, 0x71, 0x49, - 0xa4, 0xc9, 0x2b, 0x45, 0x69, 0x60, 0x1c, 0xd4, 0x76, 0x3e, 0x4e, 0xbf, - 0xda, 0xd6, 0x08, 0x36, 0xf0, 0xeb, 0xe1, 0x4d, 0xa8, 0x3a, 0xd3, 0x1d, - 0x7f, 0x6b, 0x04, 0x1b, 0x78, 0x75, 0xb6, 0x7c, 0x44, 0xae, 0x1a, 0x00, - 0x8b, 0x42, 0x37, 0xfd, 0xff, 0x81, 0xfa, 0xe3, 0x3c, 0x75, 0xff, 0xe1, - 0x9f, 0xe4, 0xc8, 0x38, 0x1c, 0x15, 0x0e, 0xbf, 0x93, 0x7d, 0xae, 0xc7, - 0x8e, 0xbd, 0xf7, 0x20, 0xea, 0x84, 0x4b, 0xb1, 0xa5, 0xb9, 0x85, 0xff, - 0xfe, 0xc1, 0x7f, 0x6b, 0x38, 0x00, 0x46, 0x6f, 0xed, 0x21, 0xd7, 0x66, - 0xd9, 0xd6, 0x70, 0x9f, 0xb7, 0x97, 0xaf, 0x47, 0x26, 0x3a, 0xbe, 0x36, - 0xe2, 0xb1, 0x2e, 0x2a, 0x78, 0x4d, 0x06, 0x17, 0xd9, 0x2d, 0x35, 0xb0, - 0xc2, 0xdc, 0xdd, 0x25, 0xda, 0x76, 0x16, 0x0f, 0x3c, 0xce, 0x08, 0xc8, - 0x45, 0x1b, 0xf8, 0x68, 0xb3, 0x0a, 0x7d, 0xb2, 0x7b, 0xdb, 0xcf, 0xb0, - 0xeb, 0xfb, 0xe3, 0x7b, 0x1b, 0xed, 0x1d, 0x7b, 0xe0, 0x19, 0x3a, 0xb7, - 0x3d, 0x2f, 0x19, 0xdf, 0xd8, 0xce, 0x60, 0xa8, 0x75, 0xf2, 0xdf, 0x34, - 0x75, 0x21, 0xe6, 0x39, 0x65, 0xff, 0xf3, 0x63, 0x5a, 0x85, 0xe7, 0x93, - 0x5d, 0x73, 0xaf, 0xf0, 0x8c, 0x49, 0x70, 0x87, 0x5f, 0xef, 0x26, 0xc4, - 0xf4, 0xa0, 0xab, 0x2c, 0xeb, 0xfb, 0x05, 0x4e, 0x42, 0xa8, 0x78, 0x7f, - 0x4c, 0xeb, 0x13, 0x05, 0x44, 0xdd, 0x39, 0x5f, 0x73, 0xfd, 0xe4, 0x75, - 0xfe, 0x19, 0x0e, 0x2e, 0x1a, 0x75, 0xe5, 0x87, 0x0e, 0xa8, 0x3e, 0xfc, - 0x24, 0x73, 0x0b, 0xdb, 0x7f, 0xf8, 0xeb, 0xe7, 0xe3, 0xfd, 0x3a, 0xff, - 0xf7, 0xa1, 0x68, 0x1c, 0x15, 0x3b, 0x0b, 0x3a, 0x9a, 0x88, 0xad, 0x10, - 0x78, 0x8a, 0xff, 0xf9, 0x3d, 0xd8, 0xd4, 0x76, 0x12, 0x78, 0x50, 0xeb, - 0xfd, 0xd8, 0x9a, 0x49, 0xc9, 0x1d, 0x7f, 0xbc, 0x8c, 0xcc, 0x2e, 0xc9, - 0xd7, 0xef, 0x7b, 0x4e, 0x03, 0xaf, 0xd0, 0xbf, 0x63, 0x4e, 0xb9, 0x27, - 0x3a, 0xa1, 0x31, 0x80, 0xa7, 0x6e, 0x66, 0x86, 0x9d, 0x27, 0xf1, 0x35, - 0xf9, 0x94, 0x0e, 0xd2, 0x1d, 0x7f, 0xdd, 0x89, 0x20, 0xe2, 0xe0, 0xeb, - 0xfe, 0xcf, 0x77, 0x16, 0x2f, 0xe3, 0xaf, 0xed, 0x89, 0xcd, 0xe1, 0x8c, - 0xeb, 0x08, 0x4f, 0xa3, 0x0d, 0xaf, 0xcb, 0x86, 0xce, 0x13, 0xaf, 0xa5, - 0x0b, 0x73, 0xaf, 0xdc, 0x02, 0xd3, 0x47, 0x5d, 0xed, 0x61, 0xf7, 0xb9, - 0x47, 0xd2, 0x0a, 0x84, 0x68, 0x7f, 0x09, 0x5b, 0x68, 0xeb, 0xfa, 0x27, - 0xc1, 0x45, 0x0e, 0xae, 0x1b, 0xcd, 0x08, 0x5f, 0xfd, 0x02, 0xfd, 0x80, - 0x2b, 0xcd, 0x68, 0xaa, 0x9d, 0x51, 0xa8, 0x63, 0x6d, 0xc6, 0x45, 0x90, - 0xdf, 0xe7, 0x0e, 0xb5, 0x1c, 0x91, 0xd7, 0x7f, 0x39, 0xd7, 0xfb, 0x79, - 0x6f, 0xa4, 0xf4, 0x1d, 0x79, 0x37, 0xd1, 0xd5, 0x87, 0xa0, 0x86, 0x94, - 0x88, 0x88, 0xeb, 0x45, 0xd8, 0xd3, 0xaf, 0x73, 0x34, 0x77, 0x8b, 0x5b, - 0xff, 0xe0, 0xfc, 0x74, 0xcd, 0x44, 0xf8, 0x28, 0xa1, 0xd7, 0xfb, 0x8b, - 0x8d, 0xfc, 0xed, 0x3a, 0xb1, 0x10, 0x48, 0x9f, 0x7c, 0x8b, 0x89, 0x8e, - 0xbe, 0xc9, 0xff, 0x91, 0xd5, 0x31, 0xe2, 0x32, 0x43, 0x7d, 0xf8, 0x43, - 0x07, 0x54, 0x1e, 0x33, 0x92, 0x5d, 0x8c, 0x9d, 0x45, 0x5f, 0xda, 0xfb, - 0x1c, 0x85, 0x95, 0x45, 0x51, 0x54, 0x55, 0x15, 0x52, 0x3e, 0x04, 0x0a, - 0x01, 0x77, 0xe1, 0x5b, 0x61, 0x5b, 0x41, 0x57, 0x77, 0x0a, 0xbf, 0x9d, - 0xfd, 0x34, 0x2c, 0xaf, 0x85, 0xad, 0x98, 0x25, 0x51, 0x54, 0x55, 0x48, - 0xb4, 0x40, 0xaa, 0x2a, 0x8a, 0xa2, 0xa8, 0xaa, 0x2a, 0x8a, 0xa9, 0xcd, - 0xe0, 0x42, 0x90, 0x28, 0x01, 0x5a, 0x0a, 0xd8, 0x15, 0x45, 0x51, 0x55, - 0x22, 0xd3, 0x41, 0x54, 0x55, 0x15, 0x45, 0x51, 0x55, 0x23, 0x50, 0x00, - 0xaf, 0x05, 0x6d, 0x05, 0x51, 0x54, 0x55, 0x15, 0x45, 0x54, 0xe6, 0xa1, - 0x40, 0xae, 0x05, 0x74, 0x2a, 0xca, 0x15, 0x45, 0x51, 0x54, 0x55, 0x15, - 0x41, 0x35, 0x1b, 0x85, 0x00, 0x2b, 0xf0, 0xaa, 0x2a, 0x8a, 0xa2, 0xaf, - 0xdd, 0x80, 0x6b, 0x0a, 0xa2, 0xaa, 0x47, 0x9c, 0xd0, 0xae, 0x85, 0x38, - 0x50, 0x09, 0xac, 0xd2, 0xa8, 0xaa, 0x2a, 0x8a, 0xa2, 0xaa, 0x46, 0xa3, - 0x70, 0xa4, 0x0a, 0xd8, 0x15, 0x45, 0x51, 0x54, 0x55, 0x15, 0x52, 0x35, - 0x01, 0x0a, 0xe8, 0x50, 0x85, 0x5b, 0xa5, 0x51, 0x54, 0x55, 0xa4, 0x55, - 0x15, 0xb9, 0x61, 0x45, 0x51, 0x54, 0x55, 0x15, 0x53, 0x9f, 0x34, 0x82, - 0x94, 0x1a, 0x68, 0xd4, 0xc1, 0x40, 0x0a, 0xf0, 0x55, 0xb0, 0xaa, 0x2a, - 0x8a, 0xb4, 0x8a, 0xa2, 0xb7, 0x2c, 0x28, 0xaa, 0x2a, 0xa0, 0xf4, 0xa4, - 0x14, 0x83, 0x5c, 0x1a, 0x58, 0x55, 0x15, 0x45, 0x51, 0x54, 0x55, 0x15, - 0x50, 0x6c, 0xb7, 0x0a, 0xe0, 0x52, 0xc2, 0x84, 0x2a, 0x8a, 0xa2, 0xa8, - 0xaa, 0xe1, 0x7d, 0xa0, 0xaf, 0x05, 0x51, 0x54, 0x55, 0x15, 0x4b, 0x2f, - 0x84, 0x2b, 0xc1, 0x56, 0x59, 0x54, 0x55, 0x15, 0x40, 0x2d, 0x3f, 0x0a, - 0xa2, 0xa8, 0xaa, 0x2a, 0x8a, 0xa8, 0x35, 0x13, 0x05, 0x74, 0x2b, 0xf0, - 0xaa, 0x85, 0xfa, 0x59, 0xdc, 0x64, 0x7a, 0x12, 0x8c, 0x5b, 0x6b, 0x5e, - 0xe9, 0x08, 0xcc, 0xc6, 0x7b, 0x31, 0xcf, 0x21, 0x16, 0xb4, 0x8e, 0x9c, - 0x3b, 0x28, 0x0e, 0x85, 0xdb, 0x4c, 0xde, 0x61, 0xfd, 0xe7, 0x63, 0x2b, - 0x29, 0x7b, 0x65, 0x9f, 0x49, 0x36, 0x92, 0x6f, 0xd2, 0x18, 0xcd, 0x17, - 0x10, 0xc2, 0xa9, 0xab, 0x5e, 0x48, 0x59, 0x71, 0x0c, 0x5f, 0x23, 0x5f, - 0x87, 0xc4, 0x32, 0xf2, 0x07, 0x0f, 0x88, 0x65, 0x95, 0xdd, 0x18, 0x7c, - 0x47, 0xe9, 0x47, 0x8b, 0x6d, 0x1b, 0x19, 0x4f, 0x3f, 0x69, 0x46, 0x97, - 0xfb, 0xa8, 0xc8, 0x79, 0x13, 0x9d, 0x79, 0x36, 0x30, 0x4e, 0xad, 0xd1, - 0x1d, 0x31, 0xcf, 0x8d, 0x2f, 0xd9, 0x93, 0x3f, 0xd3, 0xae, 0x04, 0x1d, - 0x7f, 0x71, 0xc7, 0xec, 0x00, 0xeb, 0x9f, 0x87, 0x59, 0x0e, 0x69, 0x6b, - 0x66, 0x9d, 0x65, 0x9d, 0x76, 0xda, 0xa8, 0x89, 0x5e, 0x0a, 0xf5, 0x09, - 0xc7, 0xbe, 0x88, 0x5f, 0xf7, 0x61, 0x79, 0x34, 0x0c, 0xe7, 0x5f, 0xfd, - 0xf1, 0xda, 0x1e, 0xc0, 0x30, 0x40, 0x75, 0xc0, 0x83, 0xab, 0x0f, 0x64, - 0x08, 0x95, 0x89, 0x86, 0x01, 0x6b, 0xf8, 0x48, 0xdf, 0xfc, 0x23, 0x13, - 0x8e, 0x26, 0xc8, 0xdb, 0x3a, 0xf4, 0x6f, 0xa3, 0xa9, 0xcf, 0x87, 0x48, - 0xb7, 0x9f, 0x90, 0x75, 0xf9, 0x36, 0xdc, 0x40, 0x75, 0x48, 0xf0, 0x96, - 0x35, 0x7f, 0xdf, 0x5c, 0x3a, 0xc5, 0xc3, 0x19, 0xd7, 0xb3, 0x76, 0x4e, - 0xbd, 0xb8, 0x33, 0x87, 0xb2, 0x27, 0x97, 0xdb, 0x33, 0x92, 0x3a, 0xf0, - 0x5c, 0x4e, 0xa4, 0x37, 0xae, 0x47, 0x7f, 0xfd, 0x1f, 0x1f, 0x9c, 0x70, - 0x42, 0xac, 0xb2, 0xc9, 0xd5, 0x09, 0xaf, 0x3b, 0xde, 0x9c, 0x3f, 0x1f, - 0xa6, 0x03, 0x73, 0x39, 0x0e, 0x53, 0xb7, 0xca, 0x32, 0x50, 0xc2, 0x7b, - 0x21, 0x6c, 0xd8, 0xd2, 0x37, 0x57, 0x49, 0x4b, 0xec, 0x68, 0xb3, 0x42, - 0xeb, 0x86, 0xeb, 0x85, 0x67, 0x61, 0x56, 0xf4, 0xb2, 0x70, 0x19, 0x0c, - 0x79, 0x3a, 0x84, 0xbf, 0xa3, 0xc1, 0xbc, 0xbd, 0x34, 0xeb, 0xc2, 0xd8, - 0x3a, 0xbe, 0x1b, 0x64, 0x1c, 0xbf, 0x99, 0x7e, 0x71, 0xf7, 0x3a, 0xff, - 0xfd, 0xae, 0x71, 0x26, 0xd7, 0x23, 0xc8, 0xd4, 0x09, 0xd4, 0xb4, 0x52, - 0x89, 0x13, 0x25, 0xd7, 0xcb, 0xf4, 0x68, 0xeb, 0xfd, 0xe8, 0xfd, 0xbd, - 0x4e, 0x1d, 0x7f, 0x63, 0x7b, 0x1b, 0xc8, 0xeb, 0xf9, 0x7a, 0x45, 0x3c, - 0xc9, 0xd7, 0xe8, 0xdf, 0xb1, 0x23, 0xa8, 0x51, 0x6d, 0xe3, 0x3f, 0xa5, - 0xbb, 0x45, 0xf7, 0xfd, 0x9b, 0x8e, 0x7b, 0xd9, 0x39, 0xd7, 0x6f, 0xe3, - 0xaf, 0xde, 0x71, 0xff, 0x0e, 0xbf, 0xda, 0xc5, 0xa7, 0xba, 0xe7, 0x5a, - 0x30, 0xfb, 0x84, 0x5f, 0xc4, 0xd7, 0xd2, 0xf8, 0xb4, 0x3a, 0xf6, 0xd7, - 0x20, 0xeb, 0xfd, 0xc4, 0x98, 0x73, 0x63, 0x9d, 0x76, 0xfa, 0xf8, 0x7e, - 0x90, 0x47, 0xc1, 0xeb, 0xfe, 0x18, 0x79, 0xfb, 0x1c, 0x01, 0xd7, 0xf9, - 0x38, 0x3e, 0xf6, 0x4e, 0x75, 0xcf, 0xb0, 0xeb, 0xfa, 0x42, 0x92, 0xee, - 0x1d, 0x7e, 0x9d, 0x39, 0x12, 0x3a, 0x94, 0x44, 0xdc, 0xc6, 0x5c, 0x17, - 0x12, 0xbb, 0xec, 0x0a, 0x28, 0x75, 0xff, 0xe7, 0x4f, 0x47, 0xb5, 0xd7, - 0x4e, 0xfe, 0x75, 0xf0, 0x8f, 0xf2, 0x3a, 0xff, 0xdd, 0x8e, 0x00, 0x71, - 0x97, 0x01, 0xd7, 0xb3, 0x26, 0x3a, 0xd9, 0xd3, 0xd8, 0x01, 0xed, 0xfd, - 0xff, 0x3f, 0x5b, 0x89, 0xd7, 0xcb, 0x8c, 0x9c, 0xeb, 0xf6, 0x6c, 0x18, - 0xdc, 0xea, 0x43, 0xc9, 0xd1, 0x0d, 0xf4, 0x0f, 0x9a, 0x75, 0x05, 0x56, - 0x8e, 0x43, 0x4b, 0x87, 0xdd, 0x21, 0x74, 0x81, 0x79, 0xd1, 0x3f, 0x9d, - 0xf6, 0xc8, 0x6f, 0xf0, 0x3e, 0xe0, 0x87, 0xb0, 0x75, 0x42, 0x2e, 0x1e, - 0x10, 0xb7, 0xf6, 0xb1, 0x69, 0xd8, 0x3a, 0xf6, 0xf2, 0xd1, 0xd5, 0xb9, - 0xe4, 0x70, 0xae, 0xf6, 0x80, 0xc9, 0xd5, 0x07, 0x81, 0x84, 0x77, 0xdf, - 0xbf, 0x24, 0x75, 0xf4, 0x7e, 0xc1, 0xd1, 0x57, 0xe9, 0x2a, 0xcb, 0x2c, - 0x9d, 0x42, 0x7a, 0x5f, 0x93, 0x5f, 0x3f, 0x97, 0xe3, 0xa8, 0x28, 0xb7, - 0xc7, 0x40, 0x11, 0x5f, 0xef, 0xa2, 0x2e, 0xcb, 0xf4, 0xea, 0x86, 0x42, - 0x0e, 0x18, 0x24, 0x35, 0xf8, 0x82, 0xb8, 0x53, 0x3c, 0x29, 0x81, 0x2f, - 0x18, 0x61, 0x5d, 0xfc, 0x35, 0xd9, 0x2f, 0xbc, 0xc4, 0x31, 0x46, 0x01, - 0xd7, 0xa4, 0x2e, 0x75, 0xb7, 0x62, 0x0f, 0x16, 0x0a, 0xef, 0x79, 0xc0, - 0x75, 0xfd, 0x1c, 0x9e, 0x39, 0x39, 0xd7, 0xfe, 0x81, 0xf7, 0x7f, 0x79, - 0x4a, 0x0e, 0xbf, 0x7e, 0x0c, 0x16, 0x9d, 0x7b, 0x91, 0x31, 0xd7, 0xc8, - 0x2f, 0x31, 0xd7, 0xc9, 0xae, 0x61, 0xd7, 0xfb, 0xd9, 0xf6, 0x26, 0x4d, - 0x1d, 0x53, 0xa6, 0x7b, 0x21, 0xb0, 0x97, 0x70, 0xf5, 0x64, 0xfd, 0x1c, - 0xf1, 0x06, 0xc2, 0x0b, 0xfe, 0x84, 0xec, 0x2e, 0x7c, 0x64, 0xeb, 0xfa, - 0x3a, 0x93, 0xb8, 0x9d, 0x7f, 0xd3, 0x8e, 0x4b, 0xb8, 0x0d, 0x1d, 0x7f, - 0xec, 0x1d, 0xe5, 0xae, 0x7f, 0x00, 0x3a, 0xfd, 0x9e, 0xd6, 0x28, 0x75, - 0x21, 0xf3, 0x2c, 0xfe, 0xfe, 0x1f, 0x7c, 0xee, 0x6d, 0x1d, 0x78, 0x31, - 0xb0, 0xeb, 0xff, 0xec, 0x11, 0x86, 0x42, 0x31, 0xbc, 0x90, 0x4e, 0xbf, - 0xfc, 0xff, 0x26, 0x94, 0x72, 0x7f, 0x8c, 0xe7, 0x4e, 0xa8, 0x47, 0x50, - 0x4c, 0x7a, 0x3a, 0x29, 0x97, 0xfc, 0xbe, 0xe7, 0xb3, 0xfe, 0x4e, 0x75, - 0xff, 0xf2, 0x8f, 0xed, 0x20, 0xcd, 0x0d, 0xe6, 0x6e, 0x75, 0xff, 0x47, - 0xb3, 0x8d, 0x77, 0x69, 0xa2, 0xf8, 0xbf, 0x67, 0x23, 0x79, 0x1d, 0x7b, - 0xb0, 0xb6, 0x9f, 0x57, 0x90, 0xef, 0xff, 0xc2, 0xdf, 0x9d, 0x84, 0xe2, - 0x2d, 0x36, 0xe1, 0x67, 0x5e, 0x7e, 0x4e, 0x68, 0xbf, 0xea, 0x11, 0x67, - 0x86, 0x6d, 0x57, 0xbf, 0xff, 0xdd, 0x7d, 0x24, 0x6b, 0xe7, 0xbb, 0x8b, - 0xc6, 0xbf, 0x0e, 0xba, 0x36, 0x8e, 0xbe, 0xd6, 0x9d, 0x67, 0x57, 0x51, - 0x32, 0x06, 0x0f, 0x0c, 0x5f, 0x6f, 0x2f, 0x39, 0xd7, 0xff, 0xc1, 0x6f, - 0x50, 0x73, 0x63, 0xcb, 0x48, 0x13, 0xad, 0x2c, 0x3f, 0x17, 0x22, 0xbf, - 0xe8, 0x5f, 0xc0, 0xe6, 0x03, 0x47, 0x5f, 0xf2, 0x60, 0x85, 0x44, 0xce, - 0x1d, 0x48, 0x7d, 0xfb, 0x47, 0x37, 0xbd, 0x9b, 0x9d, 0x7f, 0x3f, 0x37, - 0x96, 0x78, 0xeb, 0xff, 0x7b, 0x49, 0xcf, 0x0f, 0xef, 0x23, 0xaf, 0xff, - 0x2e, 0x36, 0xf3, 0xf1, 0xcc, 0xd9, 0x1b, 0x9d, 0x7f, 0xe8, 0xce, 0x67, - 0x00, 0xb4, 0xd1, 0xd7, 0x9f, 0x7d, 0xa3, 0xaf, 0xe7, 0xf6, 0xa3, 0x27, - 0x3a, 0xa1, 0x33, 0xfc, 0x2d, 0x43, 0xe1, 0x4d, 0xd8, 0x78, 0xc8, 0xfd, - 0xff, 0x7f, 0x0b, 0xd6, 0x2e, 0x18, 0xce, 0xbf, 0xf7, 0x27, 0xc0, 0xe7, - 0x7b, 0x8c, 0x67, 0x5f, 0xfb, 0x07, 0xda, 0xfb, 0xb2, 0x33, 0x73, 0xab, - 0x11, 0x05, 0xa4, 0x1b, 0xff, 0xe9, 0x47, 0x27, 0xf2, 0x29, 0xad, 0x38, - 0xc8, 0xeb, 0xfa, 0x7d, 0x62, 0xe1, 0x8c, 0xeb, 0x33, 0x32, 0x20, 0x3e, - 0xa8, 0x5e, 0x4e, 0xa1, 0xd7, 0xd2, 0xe0, 0x64, 0x75, 0xf2, 0xfc, 0x93, - 0x9d, 0x58, 0x78, 0x88, 0x45, 0x7f, 0xf6, 0xcf, 0x29, 0x03, 0x2c, 0xea, - 0x2c, 0xeb, 0xa7, 0xf1, 0xd7, 0xfb, 0x67, 0x5e, 0x51, 0x82, 0x75, 0x41, - 0xe4, 0xe0, 0xbd, 0xff, 0xfa, 0x5d, 0x8e, 0x3f, 0xbf, 0xf2, 0x7b, 0x5d, - 0x43, 0xaf, 0xec, 0x67, 0xef, 0x5f, 0xc7, 0x5f, 0xff, 0xbd, 0xf6, 0x51, - 0xb1, 0x04, 0x1c, 0x48, 0x5e, 0x15, 0x7d, 0xdf, 0xbb, 0xf8, 0xeb, 0xf6, - 0x2f, 0x13, 0x61, 0xd7, 0xa7, 0x99, 0x8c, 0xea, 0x84, 0xd1, 0xe7, 0x55, - 0xc2, 0xf6, 0xab, 0x21, 0x2f, 0xe4, 0xf7, 0x7b, 0x0e, 0xbf, 0x71, 0x27, - 0x75, 0x9a, 0x61, 0x3b, 0xef, 0x7f, 0x0e, 0x69, 0x84, 0xee, 0x04, 0x1a, - 0x81, 0x3b, 0xfc, 0x2e, 0xa7, 0xa3, 0x80, 0x35, 0x02, 0x77, 0xfb, 0x59, - 0xd4, 0xd7, 0xf3, 0x9a, 0x61, 0x3b, 0xb0, 0x26, 0x98, 0x4e, 0xe6, 0x59, - 0x3c, 0xc2, 0x75, 0x89, 0xa5, 0xee, 0x68, 0x85, 0xcb, 0x22, 0xd1, 0xfe, - 0xc4, 0x16, 0x48, 0xad, 0xe2, 0xcc, 0x26, 0x54, 0xf9, 0xec, 0x9b, 0xa7, - 0xee, 0xcc, 0x78, 0xf5, 0x0b, 0xa3, 0xe8, 0x5b, 0xd5, 0xe7, 0x20, 0x18, - 0x47, 0x6a, 0x36, 0x7f, 0x4a, 0x4e, 0xbc, 0x20, 0x59, 0xd7, 0xfd, 0x1f, - 0xf8, 0x53, 0x67, 0xd5, 0x9d, 0x78, 0x73, 0x58, 0x7a, 0xfc, 0x1b, 0xbc, - 0x10, 0x4c, 0x75, 0x43, 0x3b, 0xda, 0x78, 0x4f, 0x06, 0x30, 0xbc, 0x3b, - 0x50, 0xe9, 0xb1, 0xb6, 0xa4, 0x31, 0xe6, 0x85, 0x0f, 0x21, 0x2a, 0xb2, - 0x4e, 0xc6, 0xb6, 0x2a, 0xfa, 0x85, 0xef, 0xa7, 0x70, 0x76, 0x43, 0x33, - 0xe9, 0x8d, 0xf8, 0x39, 0xc4, 0x50, 0xeb, 0xfb, 0xb1, 0xf4, 0x77, 0x01, - 0xd7, 0xef, 0x64, 0xc8, 0xb3, 0xaf, 0xd1, 0xb8, 0x01, 0x07, 0x54, 0x1e, - 0x70, 0x93, 0xdf, 0xa3, 0x64, 0x0f, 0x8e, 0xbf, 0x26, 0xcf, 0x24, 0xe7, - 0x5f, 0x9e, 0x5e, 0xc6, 0x9d, 0x7e, 0x1c, 0xfb, 0x93, 0x1d, 0x7f, 0xfc, - 0x2d, 0x45, 0x87, 0xf7, 0xe4, 0xb3, 0x7f, 0x1d, 0x7f, 0xfb, 0x01, 0xae, - 0xa7, 0xcd, 0xe5, 0x19, 0x39, 0xd7, 0xfd, 0xd7, 0x5f, 0x52, 0x37, 0x91, - 0xd7, 0xf7, 0xd1, 0x96, 0xdb, 0xce, 0x75, 0x42, 0x60, 0xd2, 0x50, 0x44, - 0xc0, 0x1c, 0x54, 0xea, 0x80, 0x02, 0x40, 0xd2, 0x7e, 0x14, 0x89, 0x37, - 0xa3, 0x2e, 0xbf, 0xf6, 0x3f, 0x66, 0x41, 0xee, 0x6e, 0x75, 0xfc, 0x09, - 0xa5, 0x1e, 0xd1, 0xd7, 0xff, 0xff, 0xec, 0xee, 0x08, 0x30, 0x7d, 0xdc, - 0xec, 0x64, 0xc9, 0xc9, 0xba, 0x9b, 0xf8, 0xeb, 0xe1, 0x8c, 0x64, 0xeb, - 0xe8, 0xdf, 0x4e, 0x75, 0x43, 0x6a, 0x2d, 0x3b, 0xa8, 0x4e, 0x32, 0x9e, - 0x42, 0x91, 0x8c, 0x31, 0x93, 0xbc, 0xa7, 0xd1, 0x5f, 0xf1, 0xef, 0xe5, - 0xdb, 0x21, 0x03, 0xf4, 0x82, 0xff, 0xf9, 0x07, 0x17, 0x1f, 0x47, 0xf9, - 0x0e, 0x2c, 0xeb, 0xfe, 0x0a, 0x60, 0xff, 0x2c, 0xd1, 0xd7, 0xfd, 0xd4, - 0x97, 0x5e, 0x48, 0xb3, 0xaf, 0xfd, 0xa4, 0x1d, 0xe5, 0xe4, 0xd2, 0x1d, - 0x58, 0x7e, 0x9e, 0x37, 0xbf, 0x69, 0x70, 0x18, 0x3a, 0xa4, 0x9a, 0x06, - 0x27, 0x2e, 0x15, 0x7e, 0x21, 0xbe, 0x18, 0xe4, 0x8e, 0xbf, 0xee, 0xc4, - 0x90, 0x47, 0xfd, 0xce, 0xbf, 0xe8, 0xcf, 0x7d, 0x00, 0x23, 0x73, 0xad, - 0xc8, 0x44, 0x96, 0x10, 0x2c, 0xe2, 0xff, 0xff, 0xf7, 0x5d, 0x3d, 0x2f, - 0xc7, 0xda, 0xeb, 0xcb, 0xe8, 0xc3, 0x79, 0x12, 0x3a, 0xff, 0xda, 0xfb, - 0xe4, 0x1f, 0xe5, 0x9a, 0x3a, 0xe0, 0xe8, 0xea, 0x63, 0x46, 0x77, 0x5e, - 0x05, 0x02, 0xff, 0xfe, 0xcd, 0xf3, 0x4e, 0x3d, 0x48, 0xf7, 0x7f, 0x75, - 0x9d, 0x50, 0x9c, 0x6b, 0xc6, 0x04, 0x26, 0x57, 0xf0, 0xfe, 0xb4, 0xec, - 0x1d, 0x7f, 0xfe, 0x71, 0xf3, 0xbf, 0x46, 0x3d, 0xa6, 0x73, 0xa7, 0x5f, - 0xfa, 0x77, 0x1d, 0x7b, 0xa9, 0x1a, 0x3a, 0xff, 0xa0, 0x1a, 0x0f, 0xef, - 0xc9, 0x1d, 0x7b, 0x9a, 0xd1, 0xe2, 0x03, 0xbe, 0x6b, 0xbb, 0x4d, 0x10, - 0x1a, 0xa6, 0xa6, 0xfe, 0xe4, 0x76, 0x3e, 0x64, 0x91, 0x41, 0xc6, 0x2a, - 0x74, 0xc8, 0xfe, 0xc3, 0x76, 0x80, 0x9c, 0xff, 0xa3, 0x75, 0xbd, 0xb2, - 0x3a, 0x75, 0x62, 0xa1, 0x24, 0x8f, 0x2f, 0xe9, 0x55, 0xee, 0xbb, 0x19, - 0xd7, 0xd0, 0x0d, 0xbc, 0x3a, 0x80, 0x78, 0x3e, 0x1e, 0xbe, 0x1f, 0x03, - 0xf3, 0xaf, 0xcb, 0x62, 0x18, 0x86, 0x21, 0x89, 0x3a, 0xff, 0xfe, 0x96, - 0x69, 0x39, 0xc4, 0x5f, 0xdf, 0x77, 0x19, 0xf1, 0xd5, 0x88, 0xbb, 0x42, - 0x27, 0x3c, 0xbf, 0xfc, 0xce, 0x0f, 0xb0, 0x65, 0x9a, 0xfa, 0xb3, 0xaf, - 0xff, 0x4b, 0x37, 0x97, 0xd8, 0x02, 0xac, 0xb2, 0xc9, 0x57, 0xe5, 0xb3, - 0x89, 0xb0, 0xeb, 0xd2, 0xc1, 0x98, 0xfe, 0xbe, 0xa8, 0xd4, 0x23, 0xe5, - 0xe1, 0x89, 0x50, 0xa8, 0xa7, 0xb0, 0xdd, 0x18, 0xc9, 0xaf, 0xf9, 0x06, - 0x5a, 0x62, 0xac, 0x4b, 0x10, 0xc4, 0x9d, 0x7d, 0x36, 0xb2, 0x63, 0xaf, - 0xc0, 0x8f, 0x63, 0x19, 0xd7, 0xfa, 0x33, 0x8d, 0x77, 0x69, 0xa2, 0x09, - 0xbf, 0xe8, 0xf6, 0x71, 0xae, 0xed, 0x34, 0x5f, 0x37, 0xe7, 0x0f, 0x61, - 0x43, 0xaf, 0x0e, 0x68, 0x28, 0xa7, 0x69, 0xea, 0xd0, 0xe8, 0x53, 0x10, - 0xd9, 0x0d, 0x0b, 0xff, 0xa3, 0xa8, 0xa6, 0x72, 0x75, 0xff, 0xb9, 0xd5, - 0x89, 0xd2, 0x24, 0x66, 0x7d, 0x2a, 0xbf, 0xdf, 0xf7, 0x6f, 0xa8, 0xde, - 0x9d, 0x7f, 0xe9, 0xdf, 0x7d, 0xbc, 0xf0, 0xbe, 0xc3, 0xaf, 0xff, 0xb3, - 0xd0, 0x3e, 0xd6, 0x62, 0x8a, 0x3c, 0x8e, 0xbf, 0xf6, 0x06, 0x25, 0x1d, - 0xc0, 0x39, 0xd7, 0xf3, 0xcb, 0xf9, 0x38, 0x4e, 0xbc, 0xcb, 0x2c, 0x95, - 0x7e, 0xee, 0x35, 0xf8, 0x52, 0xa5, 0xfd, 0xff, 0xfe, 0x9b, 0x91, 0xb3, - 0xe2, 0x8f, 0xf3, 0xec, 0xda, 0xf9, 0x9b, 0xf8, 0xea, 0xf2, 0x29, 0x7e, - 0x9b, 0x5f, 0xfe, 0x4e, 0x27, 0xbf, 0xcf, 0x3a, 0xf0, 0x4e, 0xa9, 0xd5, - 0x14, 0xb5, 0x0d, 0x69, 0xc0, 0x3b, 0x18, 0x78, 0xf8, 0x96, 0xff, 0xcb, - 0x8d, 0xf4, 0x39, 0x3f, 0xd9, 0x1d, 0x7f, 0xff, 0x93, 0xae, 0x3b, 0xcb, - 0xec, 0xa0, 0x64, 0xeb, 0xc0, 0x9d, 0x7f, 0xfb, 0x33, 0xa1, 0xec, 0x6b, - 0x3a, 0x80, 0x3a, 0xff, 0x29, 0xf2, 0x69, 0x47, 0x34, 0x75, 0x4e, 0x98, - 0xfc, 0x90, 0x42, 0xc0, 0x88, 0xf7, 0xf3, 0x1e, 0x4b, 0xb1, 0xc3, 0xaf, - 0xf7, 0xa1, 0x3a, 0xa4, 0x6e, 0x75, 0xff, 0xed, 0xc7, 0xe3, 0x7a, 0x80, - 0x04, 0x72, 0x47, 0x54, 0x22, 0xb9, 0x0b, 0xfe, 0x99, 0xdf, 0x31, 0xea, - 0x5b, 0x0e, 0xbf, 0xfd, 0x13, 0xfd, 0xec, 0x6f, 0xec, 0x9c, 0x42, 0x75, - 0x39, 0xfa, 0x09, 0x3d, 0xfe, 0x8c, 0x1f, 0x30, 0x19, 0x69, 0xd7, 0xfb, - 0xb9, 0xb3, 0xe6, 0xa4, 0xd3, 0xad, 0xfe, 0x8f, 0xb7, 0xc6, 0xd7, 0xf9, - 0xc7, 0xe7, 0xde, 0x75, 0xce, 0xbf, 0x67, 0x1f, 0x76, 0x4e, 0xbf, 0xff, - 0xd3, 0xe3, 0x23, 0x81, 0xe2, 0x7f, 0x38, 0x7b, 0x03, 0x39, 0xd5, 0x3a, - 0x22, 0xf4, 0x51, 0x79, 0x96, 0x59, 0x2a, 0xff, 0x7d, 0x04, 0x0e, 0x6f, - 0xe2, 0x95, 0x2f, 0xef, 0xff, 0xe6, 0x0f, 0xc6, 0xf5, 0x02, 0x1c, 0x67, - 0xe7, 0xb5, 0x93, 0x9d, 0x5d, 0x45, 0x4f, 0xe8, 0x94, 0x89, 0x88, 0x3c, - 0x3b, 0x2a, 0x76, 0x52, 0x04, 0xa3, 0xf1, 0x09, 0xaa, 0x4a, 0x60, 0xe4, - 0x6f, 0xab, 0x87, 0x67, 0x61, 0x48, 0x30, 0x8d, 0xd1, 0x4f, 0xa3, 0xd0, - 0xbf, 0xf6, 0x20, 0xce, 0xe3, 0xec, 0x59, 0xd7, 0xfe, 0xea, 0x32, 0x1e, - 0xe7, 0xb6, 0xf0, 0xeb, 0xd8, 0x20, 0x3a, 0xfb, 0x3d, 0x34, 0x8e, 0xbf, - 0xfb, 0x68, 0x63, 0x6b, 0x4e, 0x3f, 0x41, 0xa3, 0xab, 0xa7, 0xd8, 0xe4, - 0x57, 0xfe, 0xcf, 0x47, 0x35, 0xd8, 0x1f, 0x1e, 0x20, 0x8b, 0xfb, 0x38, - 0xd7, 0x76, 0x9a, 0x20, 0x85, 0x4f, 0x26, 0xf4, 0x05, 0x0e, 0xa8, 0x3e, - 0x4d, 0x25, 0x5e, 0xd9, 0x0b, 0x3a, 0xfe, 0x7e, 0xf3, 0x88, 0xc9, 0xd7, - 0xf3, 0x18, 0x59, 0x71, 0x91, 0xd5, 0x87, 0xf4, 0x23, 0xbf, 0x96, 0xdf, - 0xff, 0xa0, 0x33, 0x49, 0x07, 0xd0, 0x09, 0x85, 0x26, 0x3a, 0x94, 0x54, - 0xe5, 0xd8, 0x43, 0x02, 0x19, 0xc3, 0x09, 0xbd, 0x85, 0xd7, 0xf7, 0x73, - 0xde, 0x45, 0x9d, 0x7f, 0x7b, 0xee, 0x75, 0xf7, 0x3a, 0xb7, 0x3d, 0xb1, - 0x2c, 0xbf, 0xb3, 0x7f, 0x73, 0x90, 0x75, 0xff, 0xda, 0x17, 0xf3, 0xaf, - 0xec, 0x4f, 0x87, 0x50, 0x4f, 0xc7, 0x45, 0xb5, 0x08, 0xb5, 0xfe, 0x12, - 0x77, 0xf6, 0x37, 0xee, 0xce, 0xe1, 0xd7, 0x42, 0x87, 0x5c, 0x82, 0x75, - 0x99, 0x3a, 0x82, 0x69, 0x7e, 0x8a, 0x5e, 0x1f, 0xe7, 0x3a, 0xfd, 0xd7, - 0x96, 0x09, 0xd7, 0xf2, 0x78, 0x73, 0xa8, 0x75, 0xd9, 0xdf, 0x87, 0x9f, - 0x04, 0xb7, 0x3b, 0x3f, 0x11, 0xf1, 0x87, 0x7d, 0x23, 0xf3, 0x65, 0x49, - 0x39, 0xac, 0x28, 0x18, 0xca, 0x2f, 0xed, 0x20, 0x43, 0x82, 0x75, 0xff, - 0xfd, 0xee, 0xe6, 0xb5, 0x99, 0xff, 0x27, 0xcf, 0xc7, 0xc7, 0x5f, 0xf7, - 0x63, 0x9e, 0x18, 0xcd, 0xce, 0xbf, 0xff, 0xe4, 0x9e, 0x25, 0xae, 0x71, - 0x37, 0x9a, 0x4f, 0xc5, 0xe6, 0xe7, 0x5f, 0xe8, 0x79, 0xdf, 0x8f, 0xf4, - 0xeb, 0xdd, 0xc1, 0x0a, 0x34, 0xfa, 0x6f, 0xe6, 0x9a, 0xc4, 0xe6, 0x90, - 0xaf, 0xd1, 0x97, 0xdf, 0xf9, 0xbd, 0x8c, 0xe4, 0xb5, 0xfa, 0xce, 0xb9, - 0x34, 0x75, 0xff, 0x64, 0xef, 0xe0, 0x7d, 0x19, 0x1d, 0x7f, 0x3f, 0xbe, - 0x44, 0x94, 0x3a, 0xfe, 0xfa, 0xbd, 0x32, 0xfb, 0x9d, 0x50, 0x99, 0x1e, - 0x1a, 0xa8, 0x7f, 0xc1, 0x57, 0x3a, 0xf1, 0x7d, 0xee, 0x67, 0x4e, 0xbd, - 0xa4, 0x59, 0xd6, 0x8e, 0x1b, 0x6f, 0x0d, 0xdf, 0x24, 0xc8, 0xc9, 0xd7, - 0xff, 0x2d, 0xf7, 0xfb, 0xe4, 0xe4, 0x7e, 0xc1, 0x3a, 0xff, 0xfd, 0xfc, - 0xe3, 0x19, 0xd5, 0x63, 0xd9, 0xdf, 0xf8, 0x75, 0xf7, 0xb5, 0xf7, 0x41, - 0x46, 0x26, 0x11, 0x7d, 0x4b, 0xbf, 0x69, 0x79, 0xed, 0x1d, 0x7f, 0xf2, - 0x29, 0x9e, 0x4e, 0xe7, 0xa3, 0x87, 0x5f, 0x9e, 0x42, 0x90, 0x75, 0xfd, - 0x0e, 0x3e, 0xc1, 0x3a, 0xa4, 0x9f, 0x5e, 0x43, 0xa9, 0x12, 0xf8, 0x4e, - 0xb4, 0x21, 0x24, 0xbf, 0x9b, 0xd4, 0xdb, 0x45, 0x0e, 0xbf, 0xfc, 0x80, - 0x8d, 0x2e, 0x13, 0x9c, 0x46, 0x4e, 0xbe, 0x63, 0xee, 0x4e, 0x75, 0xfe, - 0x80, 0xe7, 0x93, 0xbf, 0x9d, 0x65, 0xc1, 0xeb, 0x84, 0x96, 0xff, 0xff, - 0xcb, 0x71, 0x04, 0x93, 0x5f, 0xaf, 0xa9, 0x1e, 0xef, 0xee, 0xb3, 0xaf, - 0xff, 0x87, 0xff, 0x49, 0x01, 0xd7, 0x4f, 0x3a, 0xce, 0xbb, 0xe3, 0x19, - 0xd7, 0xff, 0xe7, 0x4f, 0x20, 0x70, 0x39, 0xe4, 0x5a, 0x70, 0xeb, 0xdc, - 0x7d, 0x62, 0x2e, 0xb8, 0x9d, 0xd1, 0xbb, 0x93, 0xce, 0x9b, 0x37, 0xf1, - 0x93, 0x5d, 0x28, 0x3a, 0xff, 0xf4, 0xe1, 0xec, 0x77, 0x37, 0x06, 0x7b, - 0x47, 0x53, 0x9f, 0x07, 0xe2, 0xb4, 0x15, 0x62, 0x78, 0x60, 0x90, 0x9f, - 0x78, 0xe3, 0x46, 0x12, 0xb7, 0xf7, 0x22, 0x74, 0x1f, 0x1d, 0x78, 0x3f, - 0x56, 0x75, 0xf8, 0x60, 0x39, 0x31, 0xd7, 0xda, 0xff, 0x8a, 0x1d, 0x7e, - 0x8e, 0xfa, 0x24, 0x75, 0xf0, 0x7f, 0xf6, 0xa0, 0xfc, 0x37, 0x26, 0x01, - 0x25, 0xf8, 0x18, 0xb8, 0xe9, 0xd7, 0xf7, 0xf1, 0xf3, 0x83, 0x23, 0xaf, - 0x30, 0x7b, 0x87, 0x50, 0x53, 0x76, 0xc2, 0xc4, 0x84, 0x70, 0xa4, 0x78, - 0x9b, 0xf2, 0xfb, 0xdc, 0xfb, 0xa3, 0xae, 0x86, 0x1e, 0x75, 0xff, 0x9c, - 0x5b, 0x9c, 0x6b, 0xbb, 0x4d, 0x10, 0x8d, 0xd2, 0x9c, 0xea, 0x84, 0x4c, - 0x00, 0x7b, 0xf1, 0xbd, 0x89, 0x17, 0xec, 0x9f, 0x40, 0x73, 0xaf, 0xff, - 0xff, 0x77, 0x3f, 0xe2, 0x9d, 0x4d, 0xe3, 0xdf, 0xf4, 0x73, 0x7f, 0x7e, - 0xfa, 0x3a, 0xff, 0xec, 0xdf, 0xef, 0x90, 0x7f, 0x96, 0x68, 0xeb, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0c, 0xe2, 0xe1, 0x81, 0x9e, 0x38, 0x1c, - 0x1c, 0xf6, 0x91, 0xb8, 0x3f, 0x67, 0xce, 0x46, 0x85, 0xd4, 0xd6, 0x20, - 0x01, 0xf8, 0x05, 0xc3, 0x03, 0x3c, 0x70, 0xea, 0x84, 0xd3, 0xb1, 0x1a, - 0xff, 0xef, 0x38, 0xcf, 0xbc, 0x86, 0x33, 0x47, 0x5f, 0xfb, 0xee, 0x75, - 0xd6, 0xab, 0x2c, 0xb2, 0x75, 0xff, 0xfb, 0x1b, 0xd8, 0x10, 0x8a, 0x4f, - 0x82, 0x8a, 0x1d, 0x73, 0xbc, 0xe8, 0x96, 0x92, 0x25, 0xff, 0xfd, 0x30, - 0xc0, 0x34, 0xde, 0xa7, 0x26, 0x18, 0x06, 0x8e, 0xbf, 0xfb, 0xdd, 0x4d, - 0x9d, 0x79, 0x72, 0x14, 0x3a, 0xfe, 0xff, 0xc9, 0xf8, 0xa8, 0x75, 0xfd, - 0x8c, 0xe0, 0xfe, 0x03, 0xaf, 0xd2, 0xcf, 0x40, 0x0e, 0xba, 0x17, 0x39, - 0xe9, 0xee, 0x5b, 0x7f, 0xff, 0xf0, 0x16, 0xf2, 0xeb, 0xa7, 0x90, 0x38, - 0x1c, 0xf2, 0x2d, 0x38, 0x75, 0x69, 0x13, 0xbf, 0x97, 0xdf, 0xff, 0x87, - 0x35, 0x9d, 0x7d, 0xa6, 0xf5, 0x17, 0x0d, 0x3a, 0xfd, 0x3a, 0xe0, 0x30, - 0x75, 0x49, 0x75, 0x4c, 0x31, 0xe5, 0x6e, 0x45, 0x34, 0x36, 0x78, 0x5d, - 0xd5, 0xbd, 0x23, 0x7a, 0x31, 0xfd, 0x84, 0x9f, 0x55, 0x6f, 0xf4, 0x6b, - 0x51, 0x3e, 0x32, 0x75, 0xfe, 0xee, 0x2f, 0x3b, 0xf8, 0x9d, 0x41, 0x3e, - 0x5f, 0x19, 0xdf, 0x67, 0x14, 0x43, 0xaa, 0x17, 0xb1, 0xf2, 0x75, 0xe9, - 0xe3, 0x0a, 0xfc, 0x8a, 0xf3, 0x2c, 0xb2, 0x55, 0xff, 0x60, 0x1f, 0x99, - 0xb3, 0x02, 0x52, 0xa5, 0xfd, 0xcc, 0xb2, 0x55, 0xe6, 0x59, 0x64, 0xab, - 0xf9, 0xe7, 0x0f, 0x63, 0x45, 0x2a, 0x5f, 0xd0, 0xa2, 0xf1, 0x94, 0x8d, - 0xb3, 0x7b, 0xf3, 0x50, 0x3f, 0x56, 0x52, 0xa6, 0xce, 0xf3, 0x2c, 0xb2, - 0x55, 0xed, 0x47, 0x0a, 0x54, 0xbf, 0xbe, 0x71, 0xdf, 0xc7, 0x58, 0x08, - 0x8a, 0x5f, 0x2c, 0xb2, 0x57, 0x7f, 0x04, 0x62, 0x4e, 0xd3, 0xaf, 0xda, - 0xfe, 0x7d, 0xb1, 0x3a, 0xfc, 0x14, 0xd9, 0x01, 0x3a, 0xfb, 0x07, 0x18, - 0xce, 0xae, 0x1e, 0x52, 0xca, 0x29, 0x11, 0x31, 0xf5, 0xda, 0xff, 0xee, - 0xbc, 0x85, 0xd4, 0x98, 0x52, 0x63, 0xaf, 0xfe, 0xce, 0x4f, 0x1b, 0xe9, - 0x07, 0x00, 0x75, 0xfd, 0xdc, 0xd9, 0x9e, 0xd1, 0xd4, 0xd4, 0x5a, 0x81, - 0x13, 0xc8, 0x75, 0xc4, 0xf3, 0x3b, 0x0c, 0x31, 0x86, 0xcd, 0xd3, 0xf8, - 0xea, 0x85, 0x4a, 0x79, 0x28, 0x08, 0x4e, 0xaf, 0x6e, 0xc5, 0x58, 0x93, - 0xaf, 0xff, 0x63, 0x1b, 0x88, 0x31, 0xb1, 0xd8, 0x59, 0xd7, 0xda, 0xea, - 0x4c, 0x55, 0xff, 0x3e, 0xfe, 0xc9, 0xbf, 0xe2, 0x87, 0x59, 0xa8, 0x7b, - 0xdf, 0x91, 0x5f, 0xe1, 0xcd, 0xe5, 0xa4, 0x50, 0xeb, 0xe7, 0x7e, 0x28, - 0x75, 0x7c, 0x3d, 0x49, 0xcc, 0xef, 0xfb, 0x31, 0xa0, 0x8c, 0xde, 0x47, - 0x5f, 0x43, 0xaf, 0x61, 0x57, 0xff, 0x75, 0x1c, 0x00, 0x80, 0x47, 0x74, - 0x75, 0xfd, 0xdc, 0x5a, 0xde, 0x47, 0x5e, 0x65, 0x96, 0x4a, 0xbf, 0xc3, - 0xee, 0xa4, 0x0c, 0xe5, 0x2a, 0x5f, 0xde, 0x80, 0x64, 0x91, 0x19, 0x89, - 0x75, 0xe4, 0xc0, 0x3e, 0xc3, 0x3a, 0xd8, 0xd4, 0xd3, 0x57, 0x19, 0x15, - 0xfc, 0x08, 0x04, 0x77, 0x47, 0x5f, 0xe8, 0xfb, 0xce, 0x27, 0xb4, 0x75, - 0x42, 0xb8, 0x39, 0x14, 0x6f, 0x0a, 0x74, 0x7c, 0x98, 0x97, 0xb1, 0xc2, - 0x00, 0xbc, 0x4b, 0x2f, 0xc0, 0xc4, 0xea, 0x87, 0x5f, 0xff, 0x63, 0x60, - 0x5f, 0xda, 0x0f, 0xef, 0xc9, 0x1d, 0x5b, 0x9f, 0xaa, 0xc9, 0xef, 0xff, - 0xfe, 0x17, 0x5c, 0x71, 0xa1, 0xec, 0x6b, 0xf7, 0x49, 0x6b, 0xaf, 0x23, - 0xaf, 0x7f, 0xed, 0x1d, 0x79, 0xb1, 0xa3, 0xaf, 0xfe, 0xfb, 0x2c, 0xeb, - 0xf5, 0x39, 0xc8, 0x3a, 0xb0, 0xf7, 0xc0, 0x37, 0x7e, 0x8f, 0x6b, 0x66, - 0x1d, 0x7e, 0xff, 0x8a, 0x75, 0x0e, 0xa8, 0x4e, 0x05, 0xc8, 0xc0, 0xe0, - 0x2f, 0x9e, 0x21, 0xdb, 0x28, 0xbf, 0xc2, 0xec, 0xe0, 0xba, 0x87, 0x5f, - 0xfd, 0x9e, 0xd7, 0xdd, 0x2c, 0x63, 0x90, 0x75, 0xf2, 0x6c, 0xc1, 0x09, - 0xfa, 0xac, 0xc6, 0xff, 0xff, 0x83, 0xd4, 0x67, 0x36, 0x91, 0x6f, 0xed, - 0x7f, 0x2c, 0xdf, 0xc7, 0x56, 0x22, 0x91, 0xce, 0x6f, 0xfa, 0x66, 0xf5, - 0x17, 0x1c, 0x50, 0xeb, 0xf4, 0xff, 0x3f, 0x89, 0x8e, 0xb4, 0x8e, 0xbd, - 0xf4, 0x66, 0x3a, 0xa4, 0x6b, 0x80, 0x21, 0x58, 0x8b, 0x57, 0x3a, 0xd2, - 0xd5, 0x43, 0xb7, 0xff, 0x9e, 0x53, 0x0c, 0xa5, 0x23, 0x06, 0x55, 0x16, - 0x52, 0x9e, 0xd4, 0x85, 0xb3, 0x4e, 0xd2, 0x55, 0x9c, 0xd2, 0xc1, 0xf9, - 0x2b, 0xc9, 0x72, 0x9d, 0xfb, 0x2d, 0xb5, 0xe3, 0xce, 0x04, 0x3c, 0xc6, - 0x7c, 0x1b, 0x53, 0x8a, 0x5e, 0x97, 0x73, 0xfc, 0xa7, 0x36, 0x63, 0x71, - 0xfb, 0x0d, 0x6b, 0xdb, 0x20, 0x4e, 0xbf, 0xfe, 0xc1, 0x57, 0xca, 0x26, - 0xfa, 0xee, 0x01, 0xce, 0xa9, 0x1f, 0x60, 0x47, 0x2f, 0xf3, 0x8b, 0x73, - 0xdd, 0x43, 0xaf, 0xff, 0xfb, 0x3a, 0xff, 0x75, 0x8a, 0x38, 0x82, 0x06, - 0x26, 0xec, 0x1d, 0x68, 0x3a, 0xff, 0xfd, 0x1c, 0xec, 0x2f, 0x6b, 0xf8, - 0x18, 0x9b, 0xb0, 0x75, 0xf9, 0x39, 0x34, 0x77, 0x88, 0xcb, 0x03, 0x28, - 0x87, 0xd6, 0xe9, 0xb4, 0xac, 0x8b, 0xec, 0x3e, 0xec, 0xc3, 0xce, 0xbf, - 0xf3, 0x88, 0x3e, 0x07, 0xf7, 0xe4, 0x8e, 0xbe, 0x41, 0x9e, 0x0e, 0xbd, - 0xee, 0x41, 0xd7, 0xfc, 0x30, 0xb4, 0x1c, 0x5c, 0x1d, 0x72, 0x07, 0x0f, - 0x3e, 0x61, 0xba, 0x63, 0x46, 0xe7, 0x10, 0x05, 0xbe, 0x98, 0xa2, 0x64, - 0x99, 0x0f, 0x2b, 0xd0, 0x33, 0x9d, 0x7c, 0x9d, 0x45, 0x9d, 0x6e, 0xa1, - 0xbb, 0x98, 0x6e, 0xfe, 0x86, 0xc6, 0xbc, 0x87, 0x5f, 0xf4, 0x7b, 0xae, - 0x07, 0xdf, 0x47, 0x50, 0x4f, 0x8c, 0x4a, 0xef, 0xfd, 0xc0, 0x7c, 0xea, - 0x37, 0xfe, 0x00, 0xeb, 0xd3, 0x7f, 0xc3, 0xaf, 0xfc, 0xe9, 0xcc, 0xdd, - 0x56, 0x59, 0x64, 0xea, 0x84, 0x51, 0x3a, 0x16, 0x87, 0xaf, 0xff, 0x86, - 0x25, 0xf3, 0xef, 0x90, 0x7f, 0x96, 0x68, 0xea, 0xc4, 0xf3, 0x5b, 0x08, - 0xae, 0xc3, 0x0c, 0x05, 0xd7, 0x80, 0xeb, 0x3a, 0xec, 0x01, 0xd7, 0x86, - 0x43, 0x06, 0xc3, 0x06, 0xef, 0xb4, 0xd6, 0xa1, 0xd5, 0x07, 0xa0, 0xe5, - 0xf7, 0xee, 0x68, 0x62, 0x73, 0xaf, 0xff, 0x99, 0xc6, 0xeb, 0x3d, 0x36, - 0x28, 0x38, 0x03, 0xab, 0x0f, 0xdd, 0x09, 0xef, 0xe7, 0xf7, 0x5c, 0x40, - 0x75, 0xff, 0x9f, 0xd9, 0x33, 0xc0, 0xc4, 0xc7, 0x5f, 0xfb, 0xa9, 0x9f, - 0x72, 0x66, 0x63, 0x73, 0xac, 0x9c, 0x45, 0x47, 0x4a, 0xf4, 0x79, 0x73, - 0x5a, 0x68, 0xc1, 0x2a, 0x49, 0x90, 0x36, 0x19, 0x00, 0x35, 0xbb, 0x04, - 0xeb, 0xff, 0xde, 0x81, 0x6e, 0x7b, 0xa9, 0xc0, 0x34, 0xeb, 0xf0, 0x53, - 0x5d, 0x43, 0xaf, 0xe4, 0x1c, 0xf7, 0x50, 0xeb, 0x46, 0x1e, 0x86, 0x89, - 0xa8, 0x28, 0xd2, 0xc1, 0x4f, 0xe1, 0x31, 0x7f, 0xa1, 0x7a, 0xd3, 0x8c, - 0xe7, 0x5f, 0xf0, 0x35, 0x24, 0xeb, 0xa4, 0xe7, 0x5f, 0x6b, 0x07, 0xc7, - 0x5e, 0xda, 0x8e, 0x1d, 0x48, 0x7e, 0xce, 0x71, 0xf9, 0x05, 0xef, 0x3b, - 0x19, 0xd7, 0xfb, 0xdd, 0x45, 0x40, 0xe8, 0x75, 0xdf, 0x70, 0xea, 0x0a, - 0x6e, 0x5d, 0x35, 0x18, 0x54, 0x78, 0xbb, 0xf1, 0xef, 0xa6, 0x57, 0xdd, - 0x47, 0x91, 0xd7, 0x82, 0xf2, 0x3a, 0xef, 0xc1, 0x06, 0xef, 0x08, 0x2f, - 0xf9, 0xb9, 0xe8, 0xd8, 0x82, 0x03, 0xaf, 0xff, 0xef, 0xe3, 0xda, 0xc1, - 0xf9, 0xc8, 0x40, 0x8b, 0xc8, 0xeb, 0xf3, 0x7b, 0xbb, 0xb1, 0x9d, 0x7f, - 0xf2, 0x04, 0x7f, 0xf6, 0xa0, 0x63, 0x47, 0x52, 0x23, 0xfc, 0x4e, 0x3f, - 0x5a, 0xd8, 0x57, 0x7f, 0xf0, 0x1f, 0x99, 0xb3, 0x03, 0xc1, 0x64, 0xeb, - 0xff, 0xf8, 0x73, 0x5f, 0xfc, 0xce, 0xb8, 0xe4, 0xd2, 0x8d, 0xce, 0xbf, - 0x71, 0xae, 0xed, 0x34, 0x40, 0xd7, 0xf3, 0xce, 0x07, 0x10, 0x92, 0xb0, - 0x7d, 0xec, 0xd7, 0xf8, 0x7d, 0xbb, 0x66, 0x77, 0xba, 0xf2, 0xf8, 0x8f, - 0xf1, 0x86, 0x4d, 0xff, 0x75, 0x30, 0x71, 0xa1, 0xc3, 0xa9, 0x69, 0xd9, - 0xfa, 0x34, 0x4d, 0x87, 0x57, 0xbd, 0xfc, 0x1d, 0x7f, 0x81, 0xe4, 0x9d, - 0x70, 0xd3, 0xab, 0x73, 0xcf, 0x11, 0xcb, 0xf0, 0x58, 0xb7, 0x0b, 0x16, - 0x75, 0x42, 0xac, 0xcc, 0x8f, 0xc5, 0x21, 0x10, 0xe4, 0x57, 0xfb, 0x37, - 0xf0, 0x73, 0x14, 0x3a, 0xfe, 0xcf, 0x40, 0xa0, 0x0e, 0xbf, 0xe0, 0xf0, - 0x5d, 0x9f, 0xbb, 0xb2, 0x75, 0xe7, 0xe4, 0xe6, 0x8c, 0x16, 0xff, 0xcf, - 0xcc, 0x10, 0x6b, 0xda, 0xdc, 0xeb, 0xff, 0xff, 0xfb, 0x3d, 0xd7, 0x15, - 0x3e, 0x6b, 0x8e, 0xfe, 0xd9, 0x81, 0xf9, 0x8b, 0x71, 0xde, 0x47, 0x88, - 0x2e, 0xff, 0xce, 0xea, 0x35, 0xc3, 0xf1, 0x46, 0x4f, 0x10, 0x5d, 0xff, - 0xdd, 0x4e, 0xa4, 0x0f, 0xbe, 0x28, 0xc9, 0xe2, 0x0b, 0xbf, 0xd0, 0x83, - 0xef, 0x8a, 0x32, 0x78, 0x82, 0xef, 0xe5, 0xe0, 0x7e, 0x28, 0xc9, 0xe2, - 0x0b, 0xbf, 0xff, 0xe7, 0x11, 0x45, 0xfc, 0xd3, 0x7a, 0x9c, 0x45, 0x27, - 0xc6, 0x4f, 0x10, 0x5d, 0xdb, 0xfc, 0x0a, 0x72, 0xed, 0x4f, 0xe2, 0x9b, - 0xa1, 0x09, 0xf5, 0x42, 0xac, 0x7e, 0x9f, 0x0c, 0xa3, 0x1b, 0xfc, 0x90, - 0xa6, 0xbd, 0xad, 0xce, 0xbe, 0x7e, 0x01, 0xce, 0xbf, 0xfb, 0xa9, 0xd4, - 0x81, 0xf7, 0xc5, 0x19, 0x3c, 0x41, 0x77, 0xfd, 0x36, 0x9a, 0x93, 0xfc, - 0x51, 0x93, 0xc4, 0x17, 0x7e, 0xf6, 0xa1, 0x7f, 0x1a, 0x89, 0xff, 0xaa, - 0x77, 0xff, 0xbe, 0x37, 0xa8, 0xd8, 0xf6, 0xbe, 0x28, 0xc9, 0xe2, 0x0b, - 0xbf, 0xff, 0xf8, 0x45, 0x17, 0xf3, 0xfc, 0xf9, 0xa6, 0xf5, 0x38, 0x8a, - 0x4f, 0x8c, 0x9e, 0x20, 0xba, 0xc4, 0xc9, 0x77, 0x44, 0x75, 0xdb, 0xfe, - 0xea, 0x71, 0x14, 0x9f, 0x19, 0x3c, 0x41, 0x77, 0xff, 0xce, 0xfb, 0xcb, - 0x5d, 0x40, 0x86, 0x39, 0x05, 0x5f, 0xfb, 0x25, 0x2f, 0xf5, 0xc1, 0x9f, - 0x6c, 0xf1, 0x05, 0xd3, 0x51, 0xcb, 0xc4, 0x7d, 0x27, 0x5f, 0xf9, 0xa9, - 0xcf, 0x38, 0x35, 0xf1, 0x93, 0xc4, 0x17, 0x7f, 0x75, 0x3b, 0xd4, 0x01, - 0xa0, 0x0b, 0xbf, 0x60, 0x3e, 0x28, 0xc9, 0xe2, 0x0b, 0xbb, 0x3c, 0xd3, - 0xf1, 0xe9, 0xcd, 0x6e, 0x8e, 0xcd, 0x42, 0xfe, 0xfe, 0x5e, 0x07, 0xe2, - 0x8c, 0x9e, 0x20, 0xbb, 0xff, 0x37, 0xa9, 0xc4, 0x52, 0x7c, 0x64, 0xf1, - 0x05, 0xdd, 0x9f, 0x1d, 0x11, 0x7a, 0x3e, 0xbf, 0xdf, 0xa2, 0xdc, 0x77, - 0x91, 0xe2, 0x0b, 0xbf, 0xf6, 0x26, 0xcc, 0x1c, 0x0b, 0xc8, 0xf1, 0x05, - 0xac, 0xf0, 0x28, 0x2b, 0xbf, 0xbc, 0x37, 0x01, 0xa0, 0xc7, 0xc9, 0xa8, - 0xc5, 0x7d, 0x18, 0xe7, 0xf0, 0xb4, 0x65, 0xbe, 0xe0, 0x41, 0xa2, 0x0b, - 0x55, 0x11, 0x97, 0x3b, 0x4e, 0xb6, 0x9a, 0xc9, 0xc3, 0x05, 0x25, 0xe7, - 0xc6, 0xb7, 0x4b, 0x68, 0xeb, 0xd1, 0x2d, 0xa3, 0xaa, 0x0d, 0xb8, 0x8c, - 0xd4, 0xec, 0xaf, 0x60, 0x99, 0xee, 0x54, 0x0a, 0x50, 0x00, 0xbd, 0x5f, - 0xfd, 0x92, 0x1c, 0xf7, 0x53, 0x37, 0xf1, 0xd7, 0xe8, 0xf6, 0xba, 0x87, - 0x5f, 0xfb, 0x53, 0x4b, 0xf0, 0xcd, 0x2f, 0xc2, 0x75, 0x48, 0xfa, 0xbc, - 0x4d, 0x7f, 0xf4, 0x6f, 0x2f, 0xab, 0xd7, 0xa3, 0x76, 0x4e, 0xbf, 0x4b, - 0x6b, 0x6b, 0xf9, 0xce, 0xb7, 0x50, 0xfe, 0x5d, 0x26, 0xfd, 0xc8, 0xde, - 0x5a, 0x3a, 0xa4, 0x79, 0xdc, 0x26, 0xbf, 0xf8, 0x1f, 0xeb, 0x6f, 0x38, - 0x05, 0xa6, 0x8e, 0xbf, 0xc0, 0xff, 0xc3, 0x1e, 0xd1, 0xd4, 0x03, 0xfb, - 0xd2, 0x45, 0x42, 0x75, 0x19, 0x0e, 0x97, 0x84, 0xed, 0xfc, 0xf2, 0x8d, - 0x8f, 0xd3, 0xaf, 0xff, 0x4f, 0x9b, 0xfb, 0x48, 0x30, 0x07, 0x59, 0xd7, - 0xdb, 0xea, 0x37, 0x3a, 0xf2, 0xe2, 0x47, 0x5f, 0xb0, 0x3d, 0xfd, 0x93, - 0xab, 0xe1, 0xf3, 0xb9, 0x18, 0x8d, 0xde, 0x0b, 0xf8, 0xea, 0xe1, 0xe5, - 0x39, 0x7d, 0xe4, 0xdb, 0xc3, 0xaf, 0x3f, 0x00, 0x75, 0xb7, 0x83, 0x71, - 0xe1, 0xdb, 0xe6, 0x73, 0xae, 0x75, 0xf2, 0x9c, 0x46, 0x4e, 0xbf, 0x4e, - 0xfd, 0x86, 0x33, 0xa9, 0x89, 0x3c, 0xdc, 0x23, 0xa8, 0x54, 0x77, 0x85, - 0xa9, 0x0f, 0xa7, 0x59, 0x01, 0x38, 0xb7, 0x5f, 0xfe, 0x11, 0x89, 0xd7, - 0xd4, 0xe7, 0x1e, 0x47, 0x5f, 0xe9, 0xe7, 0x81, 0xdf, 0x3c, 0x75, 0x61, - 0xfe, 0x22, 0x45, 0xff, 0xdc, 0x1f, 0xf7, 0xf0, 0xe4, 0xee, 0x27, 0x5e, - 0x7e, 0x4e, 0x75, 0xc0, 0x83, 0xaf, 0x92, 0x17, 0x87, 0x51, 0xd7, 0xf3, - 0xa9, 0xe8, 0xe0, 0x0e, 0xa0, 0x9b, 0x71, 0x0a, 0xbf, 0xff, 0xd0, 0x81, - 0x18, 0xfd, 0xbe, 0xc6, 0x86, 0x1b, 0xf5, 0x67, 0x5c, 0x08, 0x3a, 0xe8, - 0x50, 0xeb, 0xfe, 0xcf, 0x6a, 0x17, 0xf7, 0x26, 0x3a, 0xff, 0x6b, 0x3a, - 0x9a, 0xfe, 0x73, 0xae, 0x65, 0x92, 0xaf, 0xf8, 0x73, 0x63, 0xcb, 0x48, - 0x13, 0xa9, 0xa9, 0xf8, 0xa0, 0xe7, 0x05, 0x56, 0xad, 0xd2, 0x00, 0x30, - 0xb0, 0x45, 0x44, 0x5b, 0x47, 0x4c, 0x9a, 0x7d, 0x18, 0xbc, 0xcb, 0x2c, - 0x95, 0x65, 0x94, 0xa9, 0x7f, 0x7d, 0x33, 0xbf, 0x0a, 0x55, 0x1b, 0xbf, - 0x61, 0x7b, 0x53, 0xab, 0x5a, 0x79, 0x62, 0x57, 0xf7, 0xa3, 0x3b, 0x93, - 0x9d, 0x76, 0x2c, 0xea, 0xdc, 0xf0, 0x74, 0x59, 0x50, 0xe8, 0x95, 0xa5, - 0x1a, 0xee, 0x4a, 0x36, 0x52, 0x18, 0xfb, 0xc7, 0x6e, 0x92, 0x9e, 0xb9, - 0x09, 0xae, 0xcb, 0xf7, 0x7a, 0x59, 0xe0, 0x16, 0x06, 0x52, 0xa6, 0xa5, - 0x39, 0xfa, 0x1a, 0xbf, 0xcb, 0x7a, 0xd8, 0xdb, 0x7f, 0x60, 0x00, 0x9c, - 0x91, 0xd7, 0x37, 0x0e, 0xa0, 0x9e, 0x0b, 0x96, 0x5d, 0x8c, 0x9d, 0x74, - 0x78, 0xea, 0x9c, 0xd5, 0xb4, 0x5a, 0xcb, 0x3a, 0xb0, 0xd9, 0x78, 0x8a, - 0xff, 0x49, 0x07, 0x17, 0xff, 0x4e, 0xbf, 0xf6, 0x7b, 0x5d, 0x45, 0xbe, - 0x70, 0xea, 0x83, 0xee, 0x13, 0x2b, 0xef, 0x9e, 0x8d, 0x87, 0x5f, 0x62, - 0xf3, 0xc7, 0x5e, 0xf3, 0xa8, 0x75, 0xff, 0xff, 0xcd, 0x79, 0xbf, 0x97, - 0xed, 0xf9, 0xd4, 0xf7, 0xa3, 0x78, 0x9e, 0x34, 0x75, 0xff, 0xff, 0x31, - 0x8b, 0xbe, 0xc8, 0x97, 0x63, 0x93, 0xc7, 0xb4, 0xf2, 0x3a, 0xf2, 0x6f, - 0x31, 0xd7, 0xec, 0xc9, 0xff, 0xd1, 0xd7, 0xdc, 0x14, 0x01, 0xd7, 0xc8, - 0xd7, 0xe1, 0xd7, 0x40, 0x0e, 0xbe, 0xfe, 0x7f, 0xd5, 0xe9, 0xb5, 0xfa, - 0x41, 0x48, 0x89, 0x4e, 0xaa, 0xdf, 0xf7, 0x5f, 0x5d, 0x49, 0xdc, 0x4e, - 0xbe, 0x79, 0xfe, 0xc8, 0xea, 0x61, 0x2b, 0xc4, 0x87, 0xe9, 0x42, 0x3b, - 0x08, 0x37, 0x25, 0x42, 0x0e, 0x0e, 0x3b, 0xc0, 0x1a, 0x74, 0x3b, 0xe8, - 0x5e, 0x7d, 0x22, 0xda, 0x37, 0xbf, 0x87, 0xf0, 0xad, 0xe4, 0x75, 0xe4, - 0x9f, 0xf3, 0xaf, 0xd0, 0x04, 0xdf, 0x0e, 0xb9, 0x7b, 0x0e, 0xb0, 0x60, - 0xdf, 0x09, 0x35, 0xff, 0xe9, 0x0c, 0x7c, 0x58, 0xc2, 0x9e, 0x49, 0xce, - 0xbf, 0x3a, 0xf3, 0xab, 0x3a, 0xb7, 0x3f, 0x1f, 0x25, 0xde, 0xf7, 0x20, - 0xeb, 0xfd, 0xaf, 0x6c, 0xc1, 0xc0, 0x9d, 0x7b, 0xb1, 0xb0, 0xeb, 0xda, - 0x94, 0xe7, 0x56, 0x1b, 0xaf, 0xa3, 0xb5, 0x09, 0xf5, 0xc8, 0xb7, 0x16, - 0xd2, 0x12, 0xcb, 0x23, 0x71, 0xbf, 0x36, 0xde, 0x7f, 0x9f, 0x4e, 0xbd, - 0x32, 0x74, 0xeb, 0xfa, 0x38, 0xf3, 0x27, 0x4e, 0xbf, 0x68, 0x30, 0x33, - 0xb9, 0xe4, 0x68, 0x72, 0xf2, 0xe1, 0x67, 0x56, 0xe7, 0xb2, 0xb3, 0xeb, - 0xff, 0xe1, 0x97, 0xcc, 0x0a, 0x6b, 0x7f, 0x7e, 0xfa, 0x3a, 0xfd, 0xdf, - 0xc6, 0x36, 0x1d, 0x7f, 0x0b, 0xfa, 0x50, 0xa1, 0xd5, 0x07, 0xab, 0xf4, - 0xa6, 0xfb, 0x33, 0x79, 0x1d, 0x7b, 0x49, 0x31, 0xd6, 0x50, 0x4d, 0xee, - 0x88, 0x6f, 0xfe, 0x79, 0xc6, 0x37, 0x40, 0x8c, 0x4e, 0x75, 0x70, 0xfa, - 0x84, 0x9e, 0xfd, 0xf3, 0xb1, 0xc9, 0x1d, 0x5f, 0x15, 0x4f, 0x44, 0x30, - 0x30, 0x8d, 0xb0, 0xa7, 0x78, 0x65, 0x32, 0x43, 0x79, 0x7a, 0x83, 0xaf, - 0xe9, 0xe6, 0x93, 0x0b, 0x93, 0x9d, 0x7c, 0xbc, 0x7e, 0x9d, 0x74, 0xa7, - 0x3a, 0xf7, 0x42, 0x87, 0x5f, 0xbb, 0x89, 0x2d, 0x1d, 0x7f, 0xfd, 0xd8, - 0xfa, 0xaf, 0x85, 0xc1, 0xad, 0x40, 0x0a, 0xbf, 0x71, 0xae, 0xed, 0x3c, - 0x40, 0x97, 0xb5, 0x1b, 0x9d, 0x60, 0x61, 0xe7, 0xee, 0x67, 0x7b, 0xc9, - 0x39, 0xd7, 0xa7, 0x71, 0x3a, 0xa4, 0x99, 0x28, 0x49, 0xb9, 0x0a, 0x05, - 0x94, 0x78, 0x72, 0xfe, 0x16, 0xba, 0x9d, 0x43, 0xae, 0xda, 0x91, 0xd7, - 0xde, 0x9d, 0xc4, 0xeb, 0xc2, 0xea, 0x1d, 0x79, 0x44, 0xf1, 0xd7, 0xb4, - 0xfe, 0x3a, 0x94, 0x36, 0xfb, 0x8e, 0x5d, 0xf3, 0xa7, 0x5f, 0xcb, 0xf2, - 0x07, 0xf8, 0x3a, 0xf2, 0xfc, 0xd3, 0xad, 0xe8, 0x3c, 0x9c, 0x2d, 0xbf, - 0xa1, 0x78, 0xa4, 0x68, 0xea, 0x9d, 0x36, 0x2c, 0x19, 0x69, 0x0f, 0x54, - 0x80, 0x46, 0x2c, 0x3e, 0x26, 0xbb, 0x9f, 0x9d, 0x7f, 0x85, 0xd9, 0xd6, - 0xa0, 0x07, 0x5e, 0xdb, 0x75, 0x0e, 0xbf, 0xe8, 0x5c, 0xb2, 0x7c, 0xfd, - 0x82, 0x75, 0xf3, 0xf9, 0x83, 0x39, 0xd5, 0x88, 0x82, 0x41, 0xf7, 0x3d, - 0xbc, 0xcb, 0x2c, 0x9e, 0xaf, 0xab, 0xce, 0x21, 0x2d, 0x5f, 0x55, 0x4d, - 0x65, 0xf4, 0xbf, 0x85, 0x0e, 0xb0, 0x0e, 0xac, 0x36, 0x6e, 0x47, 0x50, - 0x9d, 0x78, 0x45, 0xf9, 0x0b, 0x40, 0x2c, 0xf9, 0xb2, 0xf9, 0x7c, 0xfe, - 0x73, 0xaf, 0xff, 0x85, 0x14, 0x57, 0x5e, 0xef, 0xef, 0x29, 0x41, 0xd5, - 0x07, 0xeb, 0x84, 0x95, 0x3a, 0x39, 0x14, 0x86, 0x25, 0xf6, 0x05, 0xe4, - 0x75, 0xf9, 0xc4, 0x51, 0x67, 0x5f, 0xf7, 0x53, 0x98, 0x8b, 0x86, 0x33, - 0xaf, 0xc8, 0xb7, 0x1c, 0x3a, 0xbe, 0x2f, 0xb3, 0xb1, 0x03, 0x70, 0x6b, - 0x22, 0x00, 0x8b, 0xe4, 0x68, 0x0a, 0x28, 0x24, 0x71, 0xcf, 0x2b, 0xdc, - 0x05, 0x42, 0x41, 0xf9, 0x26, 0xd9, 0xcd, 0xf9, 0x3d, 0x1e, 0xd1, 0x57, - 0xcd, 0x8f, 0x68, 0xab, 0x99, 0x64, 0xaa, 0x91, 0xef, 0xe1, 0x33, 0x24, - 0x37, 0x63, 0x25, 0x2a, 0x6b, 0xef, 0xff, 0xbd, 0x0d, 0xcc, 0x1f, 0x75, - 0x20, 0x67, 0x3a, 0x8e, 0xac, 0x3d, 0x6d, 0x26, 0x50, 0x11, 0x3c, 0xcb, - 0xed, 0xff, 0xbd, 0xac, 0x6f, 0x5c, 0x7d, 0xa3, 0xaf, 0xd1, 0xb1, 0x04, - 0x07, 0x7c, 0x37, 0xb7, 0xe9, 0x77, 0xf8, 0xe1, 0xd7, 0xff, 0x3a, 0xf9, - 0x1b, 0x13, 0x60, 0xff, 0xa3, 0xab, 0x73, 0xef, 0xe9, 0x45, 0xfb, 0x3f, - 0x5c, 0x68, 0xea, 0x3a, 0xec, 0x9b, 0x86, 0xc7, 0x44, 0xf7, 0xfc, 0x9f, - 0xb0, 0x7b, 0x1f, 0x46, 0x73, 0xaf, 0xfa, 0x27, 0x8d, 0xfc, 0x39, 0x39, - 0xd5, 0x88, 0xa5, 0x69, 0x6a, 0x1f, 0xdf, 0x9d, 0x63, 0x1b, 0x9d, 0x53, - 0x26, 0x9b, 0xc8, 0x7c, 0xf4, 0xba, 0xfb, 0x3b, 0x93, 0x9d, 0x7a, 0x4f, - 0xc3, 0xaf, 0xd2, 0xcf, 0x60, 0x4a, 0xbe, 0x81, 0x18, 0x3a, 0xa6, 0x3d, - 0xff, 0x0d, 0xfd, 0x26, 0xbe, 0x06, 0x97, 0xc3, 0xa9, 0x44, 0x6a, 0x24, - 0x20, 0x3c, 0x65, 0x7f, 0xc3, 0x9d, 0xcf, 0x9d, 0xc9, 0xce, 0xbf, 0xff, - 0xf8, 0x10, 0x2d, 0x7f, 0x3e, 0xe0, 0xdf, 0xc8, 0xbd, 0x76, 0x3e, 0x89, - 0xd7, 0xf7, 0xec, 0x14, 0xe7, 0x30, 0xeb, 0xef, 0x29, 0x9d, 0x3a, 0xff, - 0xc3, 0x9e, 0xf7, 0xf3, 0xfb, 0x1a, 0x75, 0xb4, 0x75, 0xc8, 0x03, 0xae, - 0xea, 0x1d, 0x77, 0xfa, 0xf8, 0x6a, 0xa6, 0x15, 0xa7, 0x3e, 0xb0, 0x1d, - 0x5c, 0x08, 0x3a, 0xe0, 0x41, 0xd7, 0xef, 0xe5, 0x82, 0xaa, 0x1a, 0xa0, - 0x0a, 0xd4, 0x26, 0xaa, 0xa1, 0x10, 0x21, 0x54, 0x29, 0x77, 0xff, 0xd8, - 0x2f, 0xbe, 0x94, 0x51, 0xfe, 0x35, 0x60, 0x3a, 0xff, 0xef, 0x77, 0x17, - 0xf6, 0x01, 0x9b, 0xf8, 0xeb, 0xfd, 0xbb, 0x53, 0x9f, 0x60, 0x27, 0x5f, - 0x01, 0x6f, 0x2f, 0x88, 0xce, 0xd2, 0x9f, 0x91, 0xaf, 0xe0, 0x2f, 0xee, - 0xbe, 0xce, 0x75, 0xfd, 0xa4, 0x11, 0x8d, 0xce, 0xbb, 0x37, 0x3a, 0xb7, - 0x3f, 0x4f, 0x19, 0xed, 0x95, 0xdf, 0x03, 0x89, 0xc3, 0xaa, 0x13, 0x11, - 0x78, 0x5e, 0xb2, 0x67, 0x7d, 0xaf, 0xf7, 0xf1, 0xd7, 0x63, 0x27, 0x5f, - 0xf4, 0x6f, 0x80, 0x8d, 0x99, 0x39, 0xd7, 0xf0, 0xe7, 0xb4, 0xe0, 0x3a, - 0xb8, 0x7f, 0x60, 0x16, 0xd1, 0xd5, 0xff, 0xa6, 0x89, 0xf5, 0xcc, 0x6c, - 0x4e, 0x75, 0xfd, 0x8b, 0xc0, 0xa3, 0x27, 0x5c, 0xb8, 0x3a, 0x96, 0x78, - 0x2e, 0x59, 0x7f, 0x0e, 0x4d, 0xd4, 0xf1, 0xd7, 0xd9, 0x9d, 0xd1, 0xd5, - 0x88, 0xee, 0x78, 0x40, 0xf8, 0x87, 0x68, 0xb2, 0xf3, 0x2c, 0xb2, 0x55, - 0xfb, 0x14, 0x1f, 0xf4, 0x52, 0xa5, 0xfd, 0xf2, 0xac, 0xb2, 0xc9, 0xd7, - 0x60, 0x0e, 0xac, 0x37, 0x7e, 0x26, 0xa8, 0x44, 0x9f, 0x9c, 0xef, 0x93, - 0x80, 0xd1, 0xd7, 0xfd, 0xae, 0x47, 0xfe, 0x14, 0xd8, 0x75, 0xff, 0x87, - 0x34, 0xde, 0xa3, 0x60, 0x4e, 0xbf, 0xff, 0xca, 0x32, 0xfc, 0x51, 0x5d, - 0x64, 0x87, 0xf7, 0xd6, 0x09, 0xd5, 0x08, 0xd8, 0xc3, 0xa4, 0x3b, 0xbe, - 0x65, 0xc6, 0x47, 0x5f, 0xf7, 0xa3, 0x70, 0x3f, 0x7a, 0x87, 0x5b, 0xa7, - 0x56, 0x1e, 0x43, 0x4e, 0x2f, 0x32, 0xcb, 0x25, 0x5f, 0xc8, 0xea, 0x75, - 0x3c, 0x52, 0xa5, 0xfd, 0xef, 0x23, 0x27, 0x5e, 0xd3, 0xf0, 0xea, 0xdc, - 0xdb, 0xf8, 0x72, 0xf7, 0x60, 0x27, 0x52, 0x1b, 0xd7, 0x22, 0xbf, 0x60, - 0x33, 0x26, 0x3a, 0xda, 0xf8, 0x99, 0xaf, 0x10, 0x3b, 0x0b, 0x01, 0x1f, - 0xbb, 0xf9, 0x05, 0x3e, 0x8c, 0x8e, 0x7a, 0xfc, 0xc1, 0xec, 0x4f, 0xf9, - 0xd5, 0x32, 0xb7, 0x1e, 0xc3, 0xe4, 0x65, 0x0a, 0xfe, 0x6d, 0x7a, 0x36, - 0x41, 0xd4, 0x87, 0xd0, 0x29, 0x97, 0x86, 0x36, 0x1d, 0x73, 0x05, 0x0e, - 0xb9, 0x3a, 0x75, 0x9e, 0x73, 0x5d, 0xc1, 0x9b, 0xef, 0x6b, 0xf6, 0x33, - 0xaf, 0xf4, 0x0c, 0x85, 0x23, 0x73, 0xaa, 0x19, 0xf6, 0x32, 0x61, 0xc8, - 0xfd, 0x54, 0x8c, 0x2d, 0xa6, 0xbb, 0x9c, 0xa3, 0x9f, 0x23, 0x86, 0xec, - 0xa2, 0x17, 0x35, 0x04, 0x27, 0xc6, 0x31, 0xdd, 0x43, 0xd7, 0xd2, 0xfe, - 0xf6, 0x10, 0x6d, 0xa5, 0x7d, 0x27, 0xda, 0x26, 0xbf, 0x24, 0xd2, 0x41, - 0x3a, 0xe6, 0x25, 0x0e, 0xbf, 0xe9, 0xbd, 0xb5, 0xa8, 0x9b, 0xfe, 0x1d, - 0x7f, 0x83, 0x02, 0xb8, 0x0c, 0x1d, 0x50, 0x7d, 0xee, 0x7f, 0x7f, 0xf6, - 0x27, 0x60, 0x3d, 0xfe, 0x37, 0xd1, 0xd7, 0x82, 0xa0, 0x0e, 0xbf, 0x2f, - 0x9c, 0x7f, 0x1d, 0x5f, 0x0f, 0x12, 0x07, 0x6f, 0xff, 0x36, 0x67, 0x6f, - 0x62, 0x5e, 0x1c, 0x59, 0xd7, 0xff, 0xc8, 0xbd, 0xe5, 0xaf, 0x98, 0x23, - 0x88, 0x03, 0xaf, 0x27, 0x7f, 0x3a, 0xbe, 0x2a, 0x2e, 0x62, 0x09, 0xa5, - 0x08, 0x9e, 0x10, 0x76, 0x11, 0x0e, 0x47, 0xe4, 0x9d, 0x89, 0xf6, 0x55, - 0x89, 0x8e, 0x29, 0x55, 0x81, 0x0c, 0xf6, 0x2e, 0x35, 0x56, 0x13, 0x6b, - 0x0f, 0x8c, 0x69, 0x8a, 0x46, 0x28, 0xc5, 0x4e, 0x98, 0x65, 0x68, 0xa6, - 0xe3, 0x4f, 0x3a, 0x2d, 0x2a, 0x4f, 0xc8, 0x69, 0x59, 0xd9, 0x6e, 0x78, - 0x54, 0x96, 0xba, 0xda, 0x5c, 0xae, 0xf4, 0x87, 0x64, 0xa4, 0xf6, 0xb1, - 0xc6, 0xc5, 0x35, 0x35, 0xcb, 0x94, 0xe1, 0xa5, 0xd2, 0x3f, 0x7b, 0x5b, - 0xde, 0xbd, 0x75, 0x64, 0x0a, 0x53, 0x63, 0x06, 0x1e, 0x23, 0x5b, 0x40, - 0x6a, 0xdd, 0x04, 0x7a, 0xd2, 0xdd, 0x7f, 0x3a, 0x4b, 0xb2, 0x55, 0x7b, - 0x32, 0xc1, 0x36, 0xe7, 0xf3, 0xfe, 0xd6, 0x35, 0x9b, 0x52, 0xd7, 0x29, - 0x58, 0xe3, 0x6b, 0x25, 0x9c, 0x55, 0x2d, 0xf9, 0x50, 0x2f, 0x3c, 0x75, - 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x2e, 0x3b, 0xfc, 0xae, 0x71, 0xae, - 0xed, 0x34, 0x5d, 0x77, 0xff, 0x2a, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, - 0x25, 0x1a, 0x88, 0xe4, 0xb9, 0x25, 0x0b, 0xc0, 0x94, 0xa9, 0x08, 0xf6, - 0x94, 0x24, 0x74, 0x4c, 0x6e, 0x2f, 0x9c, 0x70, 0x18, 0x0e, 0xf4, 0x51, - 0xe3, 0xfd, 0xa3, 0xfb, 0xff, 0xca, 0xad, 0xe4, 0xae, 0x71, 0xae, 0xed, - 0x34, 0x4b, 0x57, 0xfc, 0xc3, 0xba, 0x8c, 0x6f, 0x1b, 0xed, 0x1d, 0x7e, - 0xe3, 0x5d, 0xda, 0x68, 0x8d, 0xef, 0xfc, 0xf2, 0x57, 0x38, 0xd7, 0x76, - 0x9a, 0x25, 0xfb, 0xfa, 0x3d, 0xf7, 0xaf, 0xe3, 0xaf, 0xf6, 0x7d, 0xe2, - 0x9d, 0xff, 0x47, 0x5e, 0x9b, 0x5c, 0x3a, 0xca, 0xb1, 0x54, 0xd0, 0xf1, - 0x11, 0x66, 0x7d, 0x4a, 0x12, 0xef, 0xa6, 0xf7, 0xf9, 0x5c, 0xe3, 0x5d, - 0xda, 0x68, 0xaa, 0xee, 0x4d, 0xa3, 0xaf, 0x91, 0x6f, 0xb0, 0xea, 0x50, - 0xdd, 0x78, 0x62, 0xf0, 0xed, 0x32, 0x75, 0xfc, 0xfd, 0x98, 0x60, 0x27, - 0x5f, 0xfd, 0xee, 0xc6, 0x85, 0xff, 0x60, 0xa7, 0x0e, 0xbd, 0x12, 0xc3, - 0xa8, 0x28, 0x8d, 0xdc, 0xb2, 0x64, 0x7b, 0xfe, 0x53, 0x07, 0x37, 0xf3, - 0xac, 0xeb, 0x82, 0x87, 0x5f, 0xd9, 0xc6, 0xbb, 0xb4, 0xd1, 0x20, 0x57, - 0xc3, 0xcd, 0x54, 0x56, 0xfd, 0xa7, 0x17, 0xdc, 0xeb, 0xbf, 0x83, 0xaa, - 0x47, 0xc3, 0xb9, 0x2f, 0x09, 0xaf, 0xf4, 0xa3, 0x93, 0xc7, 0x27, 0x3a, - 0xff, 0x72, 0x75, 0xc0, 0xcb, 0x47, 0x54, 0x1f, 0x3e, 0x1a, 0x5f, 0x64, - 0xee, 0x13, 0xaf, 0xff, 0x64, 0xdd, 0x75, 0xfb, 0xb1, 0xef, 0xd6, 0x75, - 0x4e, 0xac, 0x24, 0x24, 0x59, 0x0a, 0xc5, 0x0c, 0x9e, 0x1c, 0xc3, 0x09, - 0x7f, 0x10, 0x7d, 0x21, 0xbf, 0xf8, 0x72, 0x75, 0x76, 0xe0, 0x47, 0x3c, - 0x75, 0x2a, 0x8c, 0x8e, 0x42, 0x0e, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, - 0x16, 0x45, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x2d, 0x7b, 0xff, 0xd9, - 0xf6, 0x27, 0x57, 0x26, 0xf0, 0x60, 0x4e, 0xbf, 0xca, 0xe7, 0x1a, 0xee, - 0xd3, 0x45, 0xc9, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0xbb, 0x2f, 0xfc, 0xf2, - 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x28, 0xeb, 0x2b, 0x87, 0xfa, 0xb3, 0x3b, - 0xe1, 0x89, 0x2c, 0xeb, 0x48, 0xeb, 0xf7, 0x1a, 0xee, 0xd3, 0x45, 0x2b, - 0x7f, 0xcd, 0xea, 0x4d, 0xd8, 0x9f, 0x0e, 0xbf, 0xfd, 0xd8, 0x9e, 0x3a, - 0x9b, 0x1c, 0x3d, 0x43, 0x95, 0x37, 0x37, 0x49, 0x5c, 0x46, 0x3c, 0xcd, - 0x95, 0xba, 0x60, 0xef, 0x0d, 0x7b, 0xff, 0x3a, 0x7a, 0x5f, 0x85, 0xc4, - 0x07, 0x59, 0x50, 0xa7, 0x1a, 0xb8, 0xc9, 0xfa, 0x53, 0x53, 0xb2, 0x7a, - 0xe5, 0x1c, 0xd6, 0xec, 0xa9, 0x38, 0x94, 0xb2, 0x90, 0x1f, 0x89, 0xfe, - 0x93, 0x3d, 0x0b, 0xcd, 0x91, 0xda, 0xdf, 0xf4, 0x95, 0xce, 0x35, 0xdd, - 0xa6, 0x88, 0xe2, 0xff, 0x91, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0xad, 0x6c, - 0xab, 0xa2, 0x27, 0xc8, 0xb7, 0xff, 0x95, 0x5b, 0xc9, 0x5c, 0xe3, 0x5d, - 0xda, 0x68, 0x96, 0xef, 0x7f, 0xc0, 0x1d, 0x76, 0x6e, 0x75, 0xfe, 0x0e, - 0x2d, 0x70, 0x9a, 0x3a, 0xf6, 0xcf, 0xe4, 0x75, 0x35, 0x10, 0x7b, 0x8e, - 0xa0, 0xb6, 0xc3, 0x1b, 0xdd, 0x0c, 0x8e, 0xbf, 0xec, 0xdc, 0x70, 0x00, - 0x79, 0x1d, 0x72, 0xda, 0x75, 0x41, 0xe6, 0xc8, 0xde, 0xf8, 0x63, 0x79, - 0x1d, 0x7f, 0xfe, 0x7d, 0xc0, 0x1e, 0xbc, 0xb3, 0x43, 0xfb, 0xfd, 0x3a, - 0x9a, 0x7f, 0x1d, 0x21, 0xb2, 0x87, 0x5f, 0xc9, 0xc1, 0x4f, 0x68, 0xeb, - 0xf7, 0x1c, 0x72, 0x0e, 0xa3, 0x44, 0x36, 0x87, 0xc1, 0xd1, 0x17, 0x2b, - 0xba, 0x04, 0xeb, 0xf9, 0x04, 0x38, 0x81, 0x3a, 0xa0, 0xdf, 0x48, 0x52, - 0xfb, 0x26, 0x96, 0x1d, 0x7f, 0xe7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, - 0x30, 0x5f, 0x81, 0xa7, 0x10, 0x1d, 0x7f, 0xbf, 0xdf, 0x89, 0x0b, 0xc3, - 0xaf, 0xfa, 0x27, 0xf0, 0xc7, 0xfe, 0xd1, 0xd6, 0xf7, 0x4f, 0xb3, 0x6c, - 0xce, 0xfb, 0x76, 0xa2, 0x87, 0x56, 0x1e, 0x77, 0x8a, 0xef, 0xf6, 0x93, - 0xa8, 0xbc, 0x50, 0xeb, 0xff, 0xcf, 0x3f, 0x52, 0x07, 0x26, 0x4e, 0x21, - 0xd5, 0xe3, 0xf9, 0x64, 0xca, 0xe6, 0xe1, 0xd7, 0x7e, 0x02, 0xa9, 0x0d, - 0x67, 0x05, 0x6f, 0xf6, 0x04, 0x73, 0xdd, 0xc3, 0xae, 0x61, 0x34, 0xf1, - 0x85, 0x5f, 0xd3, 0xfd, 0xdb, 0x71, 0x01, 0xd7, 0xf6, 0x7b, 0xd1, 0xcd, - 0x1d, 0x7f, 0x38, 0x82, 0x70, 0x78, 0xea, 0x84, 0x45, 0x89, 0x96, 0xd9, - 0x65, 0x95, 0x85, 0xdc, 0x89, 0xcf, 0xc2, 0xd3, 0x90, 0x99, 0x6c, 0x20, - 0xb7, 0x7e, 0xe1, 0x02, 0xc8, 0x5d, 0x28, 0x61, 0xc1, 0xa8, 0x4d, 0x79, - 0x3f, 0x61, 0x03, 0x26, 0x1f, 0x61, 0x65, 0x79, 0x7f, 0xf0, 0xab, 0xff, - 0x3c, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x8e, 0xfa, 0x39, 0x1b, 0x47, - 0x59, 0x54, 0x44, 0x52, 0xc7, 0x7a, 0x95, 0x7d, 0x13, 0xc7, 0x0e, 0xbf, - 0x64, 0x4c, 0x8b, 0x3a, 0x90, 0xf1, 0xf8, 0x43, 0x7f, 0x05, 0x71, 0x9e, - 0xd1, 0xd7, 0xfb, 0xb1, 0xc9, 0xfe, 0xfe, 0x03, 0xae, 0x7d, 0x1d, 0x7d, - 0xf3, 0xd9, 0xd3, 0xad, 0x1d, 0x37, 0x1a, 0x15, 0xbd, 0x03, 0x39, 0xd7, - 0xff, 0xff, 0xd2, 0xd7, 0x73, 0xf6, 0x75, 0xdc, 0x6e, 0x6b, 0xe6, 0x6f, - 0x2d, 0x20, 0xa1, 0xd7, 0x9d, 0xda, 0x68, 0xac, 0x6f, 0x9f, 0xec, 0x28, - 0x75, 0x34, 0xf2, 0xb8, 0x4f, 0x7f, 0xed, 0xbc, 0xf0, 0xe7, 0xf0, 0x3e, - 0x3a, 0x94, 0x4d, 0xb1, 0xa4, 0xdb, 0x8d, 0xf2, 0x19, 0x5e, 0x22, 0xbf, - 0xf8, 0x7c, 0xa7, 0xf0, 0x38, 0xd8, 0xe1, 0xd7, 0xfb, 0x93, 0xfb, 0x4f, - 0xbb, 0x4e, 0xa8, 0x3f, 0x87, 0x43, 0xbf, 0xa3, 0x6b, 0xd9, 0xbc, 0xc7, - 0x5f, 0xdf, 0xed, 0xb7, 0xa8, 0xc1, 0x3a, 0xfe, 0xcd, 0x6f, 0x28, 0xe9, - 0xd7, 0x46, 0xc3, 0xac, 0x1e, 0x9e, 0x20, 0x96, 0xdf, 0xf4, 0x6f, 0x29, - 0xa4, 0xfc, 0x9c, 0xea, 0x84, 0x6d, 0xe3, 0xca, 0x13, 0xde, 0x89, 0x78, - 0xeb, 0xff, 0x60, 0x78, 0x9f, 0xce, 0x0d, 0x48, 0xeb, 0xe5, 0xbe, 0xfe, - 0x3a, 0xff, 0xe9, 0xe3, 0xdf, 0x3e, 0xb7, 0xee, 0xd7, 0xdd, 0x1d, 0x7f, - 0xdc, 0x8d, 0x3f, 0x06, 0x24, 0x75, 0x71, 0x10, 0xfb, 0x14, 0x6f, 0x49, - 0xe7, 0x3a, 0xf7, 0xc9, 0xd6, 0x75, 0xc1, 0xf1, 0xd4, 0xc2, 0x4c, 0x7f, - 0x21, 0x53, 0xb9, 0x2a, 0x0e, 0x08, 0xfd, 0xff, 0x85, 0xc3, 0xd8, 0xd9, - 0xd7, 0x13, 0xaf, 0xff, 0xfd, 0xfc, 0xf8, 0xdf, 0x83, 0xfe, 0xd7, 0xcc, - 0xde, 0x59, 0xf8, 0x83, 0x47, 0x5f, 0xfe, 0x9f, 0x37, 0xf6, 0x90, 0x60, - 0x0e, 0xb3, 0xaf, 0xf6, 0xe3, 0x81, 0xeb, 0xb2, 0x75, 0x61, 0xfe, 0x3a, - 0x4d, 0x05, 0x35, 0x01, 0x3d, 0xd4, 0x3c, 0xef, 0xe9, 0xe6, 0x93, 0x0b, - 0x93, 0x9d, 0x7c, 0x23, 0x9e, 0x3a, 0xfc, 0x8c, 0x7c, 0xe2, 0x1d, 0x4c, - 0x41, 0xfe, 0xc1, 0xaf, 0x47, 0xef, 0xe9, 0xfe, 0xed, 0xb8, 0x80, 0xeb, - 0xe6, 0x38, 0xd0, 0x9d, 0x7f, 0xee, 0xba, 0xfd, 0xd8, 0xf7, 0xeb, 0x3a, - 0xb0, 0xf8, 0xa6, 0x23, 0xbf, 0xe4, 0x92, 0x77, 0xf5, 0xad, 0x0e, 0xa8, - 0x47, 0x76, 0x42, 0x53, 0xc4, 0x57, 0xba, 0x8a, 0xc3, 0x25, 0xb6, 0x72, - 0x19, 0x16, 0x64, 0x7b, 0x6d, 0x86, 0x57, 0x08, 0x3b, 0x18, 0x63, 0x96, - 0x88, 0xde, 0xa3, 0x5f, 0xf4, 0x74, 0x5b, 0x70, 0xb2, 0xfb, 0x19, 0x0d, - 0xd2, 0x13, 0xaf, 0xee, 0x72, 0x03, 0x8b, 0x3a, 0xfa, 0x7e, 0x44, 0xe7, - 0x5d, 0xf4, 0x07, 0x5e, 0xea, 0x2c, 0xeb, 0x4c, 0x75, 0x39, 0xac, 0xfc, - 0x6e, 0xfc, 0xe3, 0x3f, 0xfa, 0x3a, 0xff, 0xa0, 0x3d, 0xc0, 0xf1, 0xda, - 0x75, 0x22, 0x62, 0x6e, 0x58, 0x02, 0x31, 0x44, 0xd1, 0x0f, 0x8a, 0x2d, - 0xd3, 0xaf, 0x6b, 0xee, 0x8e, 0xbe, 0xde, 0x78, 0x50, 0xea, 0x9c, 0xf4, - 0x82, 0x21, 0xf8, 0xf5, 0xde, 0x83, 0xaf, 0xf6, 0xfc, 0x84, 0x93, 0xe8, - 0xeb, 0xec, 0x18, 0x91, 0xd5, 0x87, 0xa2, 0xb3, 0x2b, 0xfd, 0x80, 0xd6, - 0x79, 0x38, 0x75, 0xf7, 0xfe, 0xcd, 0x1d, 0x7d, 0x1c, 0x71, 0x3a, 0xff, - 0x3f, 0x24, 0x04, 0xdf, 0x47, 0x5f, 0x6b, 0x50, 0x03, 0xaa, 0x11, 0xcf, - 0x84, 0x28, 0x63, 0xd2, 0x2f, 0xc7, 0xd9, 0x33, 0xbe, 0x90, 0x3f, 0x91, - 0xd7, 0xdc, 0xfb, 0x00, 0x3a, 0xa0, 0xf1, 0x90, 0x8e, 0xff, 0x24, 0xee, - 0xb0, 0x02, 0x0e, 0xbf, 0xe4, 0x6f, 0x72, 0x61, 0x80, 0x9d, 0x7d, 0x2f, - 0x67, 0xd3, 0xaf, 0x36, 0x00, 0x75, 0xee, 0x42, 0xce, 0xa7, 0x3d, 0x9f, - 0xc8, 0xd9, 0x1b, 0xbf, 0x44, 0xff, 0x72, 0x63, 0xaf, 0x40, 0xc8, 0xea, - 0x99, 0x35, 0x6e, 0x10, 0x74, 0xc8, 0x61, 0x21, 0xa3, 0x0f, 0x15, 0x5f, - 0xfa, 0x33, 0x5f, 0x21, 0x03, 0xf6, 0x47, 0x5f, 0xc8, 0xce, 0xa7, 0xc6, - 0x4e, 0xa1, 0x3e, 0xff, 0x20, 0x5f, 0xa0, 0x3e, 0xc6, 0x9d, 0x7d, 0xd8, - 0x16, 0x9d, 0x52, 0x3e, 0x7d, 0x10, 0xf8, 0x9a, 0xf9, 0xc5, 0xe6, 0x3a, - 0xfc, 0x9e, 0x1c, 0x91, 0xd7, 0xd0, 0xcc, 0x4c, 0x75, 0xdf, 0x56, 0x75, - 0xfd, 0xe1, 0x70, 0x60, 0x9d, 0x7e, 0x17, 0x06, 0x09, 0xd6, 0xff, 0xe1, - 0xe7, 0x78, 0xaa, 0xa7, 0x47, 0xc2, 0x84, 0x08, 0x4b, 0xd2, 0x21, 0x66, - 0xbf, 0xd0, 0xc8, 0x7f, 0x7e, 0x48, 0xeb, 0xf9, 0x39, 0xbe, 0xa2, 0x47, - 0x5b, 0x61, 0xd5, 0xc3, 0xf3, 0xe9, 0xa6, 0xd1, 0x6d, 0xe1, 0x45, 0x0e, - 0xbe, 0xc0, 0xa6, 0xc3, 0xae, 0x85, 0xe1, 0xbd, 0x71, 0xbb, 0xfe, 0xc6, - 0x5f, 0x7e, 0xc7, 0xd1, 0x3a, 0xda, 0x3a, 0x90, 0xfd, 0x38, 0x54, 0xe7, - 0x57, 0x02, 0x0a, 0xb9, 0x96, 0x4a, 0xa4, 0x35, 0xac, 0x8a, 0xdf, 0xe7, - 0x90, 0xe7, 0xba, 0x85, 0x2a, 0x68, 0x6f, 0x3e, 0xfa, 0x3a, 0xfb, 0xef, - 0x5f, 0xc7, 0x50, 0x4d, 0xff, 0x87, 0x2f, 0x40, 0xcc, 0x75, 0xc3, 0x07, - 0x5a, 0x63, 0xaa, 0x63, 0xc0, 0xe0, 0xdb, 0x8a, 0x5f, 0xfc, 0xa2, 0x0b, - 0x75, 0x0b, 0x7d, 0xfc, 0x75, 0xe0, 0x66, 0xd1, 0xd4, 0xa1, 0xf1, 0x71, - 0x12, 0xf9, 0x7a, 0xfd, 0x67, 0x59, 0x43, 0xad, 0xb6, 0x75, 0xdc, 0x50, - 0xea, 0x83, 0xde, 0x42, 0x3f, 0xc4, 0x7e, 0x89, 0xdf, 0xff, 0x77, 0x25, - 0xa8, 0xf4, 0xb1, 0x8d, 0xc4, 0x07, 0x5f, 0xfa, 0x49, 0xee, 0xe6, 0xfe, - 0xfe, 0x0e, 0xbb, 0x34, 0x75, 0x41, 0xea, 0x48, 0xfe, 0xb4, 0x8c, 0x5f, - 0x42, 0x92, 0xfc, 0x90, 0xb8, 0x59, 0xd6, 0xc3, 0xa9, 0x0f, 0x73, 0x45, - 0x1b, 0x64, 0xb5, 0x0a, 0xc0, 0xb1, 0x85, 0x21, 0x23, 0xd8, 0x40, 0xbc, - 0x6b, 0xd7, 0xb5, 0x13, 0x1d, 0x47, 0x59, 0x67, 0x57, 0x8b, 0xad, 0x81, - 0x57, 0xe0, 0x27, 0x11, 0x43, 0xae, 0x75, 0x0e, 0xa9, 0x91, 0x2b, 0xd3, - 0x60, 0x11, 0x09, 0x3d, 0xde, 0x83, 0xaf, 0xd1, 0xdc, 0xd8, 0xe7, 0x53, - 0x9b, 0xc0, 0x0a, 0xdf, 0xc9, 0xec, 0xeb, 0xa8, 0x75, 0xfd, 0xdf, 0xde, - 0x7e, 0xa1, 0xd7, 0x99, 0x65, 0x92, 0xaf, 0xf8, 0x31, 0x3f, 0xdc, 0xeb, - 0xee, 0x52, 0xa5, 0xfd, 0xd9, 0x39, 0xd4, 0x14, 0x57, 0x35, 0x35, 0x12, - 0xef, 0x42, 0xd0, 0xea, 0xc3, 0xc9, 0x69, 0x7d, 0xf2, 0x73, 0x68, 0x27, - 0x5f, 0xbb, 0x1b, 0xbb, 0x19, 0xd7, 0xff, 0xd1, 0xed, 0x07, 0x3c, 0x9d, - 0xff, 0x37, 0xf1, 0xd5, 0xd3, 0xfa, 0xf1, 0x55, 0xb8, 0x75, 0xfe, 0xcc, - 0x6f, 0xdd, 0x9d, 0xc3, 0xae, 0xff, 0x47, 0x5f, 0xff, 0xb0, 0x31, 0x9b, - 0xfd, 0xf2, 0x0f, 0xf2, 0xcd, 0x1d, 0x72, 0xc0, 0x75, 0xce, 0x27, 0x57, - 0x4d, 0x53, 0x8b, 0x5f, 0x96, 0x9e, 0x03, 0x9d, 0x53, 0xa7, 0xc5, 0x90, - 0x9e, 0x63, 0x22, 0x98, 0x41, 0xcd, 0x44, 0x5f, 0xd0, 0x80, 0xfc, 0x82, - 0xfb, 0xbe, 0x49, 0xce, 0xbf, 0xcd, 0x4d, 0x0e, 0x6c, 0x73, 0xaf, 0xa2, - 0x77, 0x91, 0xd7, 0x67, 0x8e, 0xbf, 0x64, 0xe3, 0x9b, 0x9d, 0x58, 0x8b, - 0x1d, 0xc8, 0xb8, 0x65, 0xd2, 0x11, 0x15, 0xbe, 0x81, 0x46, 0x33, 0xaf, - 0x76, 0x02, 0x75, 0xdc, 0xd1, 0xd4, 0x72, 0x16, 0xd7, 0xfa, 0x06, 0x4e, - 0xbc, 0x09, 0xd7, 0xde, 0x5a, 0xf8, 0x75, 0xff, 0xc0, 0x81, 0x6b, 0xf8, - 0x1f, 0x46, 0x47, 0x5e, 0x92, 0x74, 0xeb, 0xef, 0x0e, 0x48, 0xeb, 0xf6, - 0x7e, 0xc1, 0xd3, 0x9d, 0x7f, 0xf9, 0x35, 0xdc, 0x08, 0xe6, 0xc1, 0xcd, - 0x1d, 0x52, 0x4d, 0x11, 0x43, 0x0d, 0xc8, 0xa6, 0x44, 0xe0, 0xd8, 0x90, - 0x78, 0xae, 0x98, 0x4d, 0xab, 0x8c, 0x46, 0x51, 0x3c, 0x29, 0xe4, 0x62, - 0x18, 0xd3, 0x72, 0x3f, 0x2d, 0xe3, 0x33, 0x48, 0xc9, 0xe6, 0x85, 0xef, - 0x21, 0xc6, 0xb7, 0xbe, 0xcb, 0x82, 0x78, 0x76, 0x81, 0xe5, 0x82, 0x40, - 0x31, 0x91, 0xea, 0x50, 0x1f, 0xa3, 0x30, 0xd8, 0x92, 0xc9, 0x16, 0xd9, - 0x8f, 0xd8, 0xd7, 0x2f, 0xf9, 0x5f, 0x26, 0x6d, 0x6b, 0xf8, 0x3a, 0xff, - 0xff, 0xbf, 0x85, 0x7d, 0xa4, 0xeb, 0xa7, 0xb3, 0x80, 0x5b, 0xc8, 0xea, - 0x55, 0x51, 0x74, 0xf1, 0xc6, 0x04, 0xf2, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, - 0x5b, 0xdf, 0xf9, 0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x4e, 0x16, 0x57, - 0x0f, 0xf5, 0x66, 0x77, 0x30, 0x82, 0x75, 0xba, 0x75, 0xb4, 0x75, 0x7e, - 0x68, 0x36, 0xc4, 0x2f, 0x9a, 0xee, 0xd3, 0x45, 0xa3, 0x7f, 0xfb, 0x03, - 0xd7, 0x52, 0x69, 0x93, 0x5f, 0xac, 0xea, 0xe1, 0xfd, 0x74, 0xb6, 0xf9, - 0xae, 0x20, 0x3a, 0xff, 0xa6, 0xc6, 0x3d, 0x73, 0x8f, 0xe3, 0xaf, 0xe8, - 0x71, 0xfc, 0x38, 0x75, 0xc8, 0xa1, 0xd7, 0xff, 0xe9, 0xe3, 0xd0, 0x1e, - 0x47, 0x5f, 0x43, 0x80, 0x3a, 0xff, 0xd1, 0xbb, 0xb1, 0xf4, 0x5d, 0x8e, - 0x73, 0xaf, 0xfd, 0x1c, 0x06, 0x26, 0x73, 0xdf, 0x9d, 0x50, 0x8d, 0x4e, - 0xa9, 0xe9, 0x12, 0xd9, 0x32, 0x63, 0x3a, 0x87, 0x55, 0xfe, 0xef, 0x7f, - 0x51, 0x71, 0xa3, 0xaf, 0xff, 0xc9, 0xa1, 0xcd, 0x8f, 0xe1, 0xcd, 0x75, - 0xe6, 0x3a, 0xb1, 0x11, 0x33, 0x1a, 0xdf, 0x60, 0x1f, 0xa7, 0x5d, 0xdd, - 0x1d, 0x65, 0x58, 0x0a, 0xeb, 0x18, 0xb3, 0xac, 0x84, 0xfb, 0x48, 0xa6, - 0x20, 0x59, 0xe7, 0x63, 0x44, 0xf4, 0x2e, 0x36, 0xc8, 0xfe, 0x90, 0x5f, - 0x35, 0xdd, 0xa6, 0x8b, 0x6a, 0xff, 0xfe, 0x87, 0xf4, 0x76, 0x34, 0x89, - 0x24, 0xe6, 0x04, 0xeb, 0xfb, 0xb0, 0xb8, 0x40, 0x9d, 0x5c, 0x45, 0x76, - 0x8b, 0x7c, 0xad, 0x7f, 0xee, 0xa0, 0x5e, 0x41, 0xea, 0x2c, 0xeb, 0xfe, - 0xcc, 0x6e, 0xdf, 0xfd, 0x4e, 0x1d, 0x7d, 0x1b, 0x31, 0x0e, 0xbf, 0xe8, - 0x94, 0x72, 0x78, 0xe4, 0xe7, 0x5f, 0xf4, 0x73, 0xe6, 0xa3, 0xae, 0x87, - 0x5f, 0xee, 0xa3, 0xcb, 0xc9, 0x39, 0xd5, 0x89, 0xb6, 0x34, 0xc2, 0x63, - 0xde, 0x1d, 0x89, 0x0b, 0x27, 0x3b, 0x67, 0x17, 0xf2, 0x8f, 0xc0, 0xfe, - 0x27, 0x5f, 0xc3, 0xb6, 0x9c, 0xc5, 0x0e, 0xbf, 0x24, 0xeb, 0x86, 0x9d, - 0x7e, 0x7d, 0xe5, 0xf7, 0x47, 0x5f, 0xf9, 0x26, 0xd6, 0xc7, 0x19, 0xff, - 0x09, 0xd6, 0x55, 0x44, 0x78, 0x09, 0x77, 0x8b, 0xf6, 0x13, 0xfd, 0x2a, - 0xa5, 0x53, 0xad, 0x04, 0x6b, 0x17, 0x2f, 0xa7, 0x5f, 0xb8, 0xd7, 0x76, - 0x9a, 0x2e, 0x5b, 0x2a, 0x13, 0xc9, 0xc1, 0x6b, 0xf7, 0x1a, 0xee, 0xd3, - 0x45, 0xdb, 0x7f, 0xc9, 0x29, 0x20, 0x82, 0x24, 0x75, 0x95, 0xc3, 0xe9, - 0x73, 0x3a, 0x87, 0x69, 0xe5, 0x39, 0x4c, 0xa7, 0xa8, 0x83, 0x1b, 0xe2, - 0x94, 0x9e, 0xa4, 0xae, 0x24, 0x58, 0xe1, 0x6f, 0xd9, 0x7a, 0x83, 0x38, - 0xf3, 0xa7, 0x4f, 0x42, 0x46, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x15, - 0x3d, 0xf8, 0x55, 0xe6, 0xb4, 0x75, 0xd3, 0xac, 0xeb, 0xf6, 0xeb, 0x77, - 0x13, 0xa8, 0x26, 0xf7, 0xf1, 0x7b, 0x78, 0xeb, 0xfe, 0x87, 0x9f, 0xe6, - 0xfa, 0x80, 0x9d, 0x48, 0x79, 0x62, 0x21, 0x7c, 0xd7, 0x76, 0x9a, 0x2b, - 0x9b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x59, 0xd7, 0x9d, 0xe4, 0x75, - 0xfc, 0x9a, 0xc1, 0x76, 0x4e, 0xae, 0x22, 0xc7, 0xa5, 0xa2, 0x7f, 0xe1, - 0xab, 0xff, 0xde, 0x8d, 0x7c, 0xff, 0x5e, 0x89, 0xa6, 0x43, 0xaf, 0xe4, - 0x5c, 0xff, 0xf2, 0x47, 0x5f, 0xe8, 0xef, 0xc5, 0xb1, 0x6c, 0x0f, 0x1d, - 0x58, 0x8b, 0xbe, 0xa7, 0x6c, 0x2f, 0xbf, 0x73, 0x3c, 0x8b, 0x3a, 0xf9, - 0xc6, 0x02, 0x75, 0xfa, 0x68, 0x5c, 0x7d, 0x3a, 0xe9, 0x2c, 0xea, 0xc3, - 0x7e, 0x25, 0x37, 0xee, 0x35, 0xdd, 0xa6, 0x89, 0x0a, 0xff, 0xd8, 0xbc, - 0x7e, 0x4f, 0xf3, 0x75, 0x9d, 0x7f, 0xc9, 0xbe, 0xbc, 0x30, 0xbd, 0x1d, - 0x74, 0x95, 0xc4, 0x56, 0x74, 0xcc, 0x08, 0x37, 0xff, 0x75, 0x17, 0x9a, - 0xf9, 0xbc, 0xb3, 0xc7, 0x5f, 0x4b, 0xbf, 0x74, 0x75, 0x41, 0xf5, 0x62, - 0x35, 0xf3, 0x17, 0xd8, 0x59, 0xd7, 0xf7, 0x75, 0xac, 0xe4, 0xe7, 0x5d, - 0x0c, 0x9d, 0x58, 0x78, 0x88, 0x5d, 0x79, 0x7b, 0x24, 0x75, 0xff, 0xee, - 0xc0, 0x16, 0xf2, 0xd7, 0xb3, 0x16, 0x75, 0x95, 0x9d, 0x75, 0xac, 0x2d, - 0xb9, 0x0d, 0x14, 0x87, 0xbf, 0x0c, 0x56, 0x4d, 0xd5, 0xe7, 0x86, 0x58, - 0xc2, 0x9b, 0x44, 0x1e, 0x6a, 0xfc, 0x83, 0xe8, 0xf5, 0xff, 0xca, 0xf5, - 0xf4, 0x39, 0xef, 0x40, 0x0e, 0xbf, 0xfc, 0xaa, 0xde, 0x4a, 0xe7, 0x1a, - 0xee, 0xd3, 0x44, 0xf9, 0x4d, 0x5f, 0x79, 0x43, 0xf6, 0x39, 0xdd, 0x05, - 0xc3, 0x43, 0xa8, 0x77, 0x26, 0xe7, 0x5f, 0xff, 0x4a, 0x76, 0x1a, 0x18, - 0xb9, 0xdb, 0xcf, 0x9f, 0x3b, 0xb6, 0x75, 0x48, 0xfe, 0x80, 0x2d, 0x7e, - 0xce, 0x66, 0x4c, 0x75, 0x95, 0xe9, 0xe4, 0x7d, 0x22, 0xbf, 0x71, 0xae, - 0xed, 0x34, 0x56, 0x57, 0xfe, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x13, - 0x75, 0x95, 0xc3, 0xfd, 0x59, 0x9d, 0x35, 0x1a, 0x09, 0x0a, 0x8b, 0xf7, - 0x1a, 0xee, 0xd3, 0x44, 0xad, 0x7e, 0x18, 0x0b, 0xf4, 0xeb, 0xf2, 0xab, - 0x79, 0x2b, 0x87, 0xb0, 0x86, 0x77, 0xfe, 0xf6, 0x2b, 0x9c, 0x49, 0xdd, - 0x67, 0x5f, 0xfe, 0x62, 0x58, 0x86, 0x06, 0xb1, 0xe4, 0x99, 0xcc, 0x3a, - 0xff, 0xc9, 0xaf, 0xd6, 0x29, 0xb3, 0xf7, 0x3a, 0xfe, 0x81, 0x76, 0xbb, - 0x19, 0xd5, 0x23, 0xed, 0x5a, 0x05, 0xc1, 0xe1, 0xd7, 0xee, 0x35, 0xdd, - 0xa6, 0x89, 0x72, 0xff, 0x91, 0xe5, 0xe1, 0x85, 0xe8, 0xeb, 0xf4, 0xb6, - 0xd3, 0xae, 0x75, 0xe8, 0xdb, 0x83, 0xaf, 0x20, 0xc1, 0xd5, 0x23, 0xdf, - 0x09, 0x4e, 0xc1, 0xdb, 0xff, 0xf3, 0xf9, 0x3f, 0x90, 0xa4, 0xa3, 0xc3, - 0xfc, 0x8e, 0xbf, 0xa5, 0xdc, 0x1c, 0x69, 0xd7, 0xa5, 0xdf, 0x1d, 0x77, - 0x61, 0x0f, 0x1f, 0xa5, 0x77, 0xff, 0x0a, 0x03, 0x5c, 0x84, 0x93, 0xe8, - 0xea, 0xc3, 0xed, 0x42, 0xcb, 0xcf, 0x25, 0x58, 0xa2, 0xb1, 0xb8, 0x86, - 0x14, 0x88, 0xb0, 0x5b, 0xa6, 0x6f, 0x09, 0x5d, 0x18, 0xfa, 0x30, 0x8b, - 0x2a, 0x8a, 0xfc, 0x57, 0x2d, 0x66, 0xff, 0xe5, 0x5e, 0x4a, 0xe7, 0x1a, - 0xee, 0xd3, 0x44, 0x77, 0x7f, 0xde, 0xee, 0x49, 0x57, 0x1d, 0x1d, 0x7f, - 0x30, 0x86, 0x1b, 0x82, 0x75, 0xdf, 0xf4, 0xeb, 0xf9, 0x80, 0x39, 0xd7, - 0xf1, 0xd7, 0xff, 0xf7, 0xa4, 0x81, 0xea, 0x6c, 0xf9, 0x81, 0xe2, 0x7e, - 0xd3, 0xaf, 0xf6, 0x33, 0xa8, 0x1f, 0x68, 0xeb, 0xf8, 0x03, 0x9b, 0xfb, - 0x0e, 0xbf, 0x3a, 0x9d, 0xc0, 0x1d, 0x7f, 0x08, 0x1f, 0x8f, 0xf4, 0xea, - 0x84, 0x40, 0x70, 0xb1, 0xc9, 0xef, 0xfc, 0x9c, 0xf9, 0xa1, 0xc5, 0xc3, - 0x4e, 0xbf, 0xf4, 0x0f, 0xfe, 0x47, 0xd8, 0xf2, 0x3a, 0xff, 0xc3, 0xfc, - 0xbe, 0x62, 0x0c, 0x2c, 0xeb, 0xe6, 0xbb, 0xb4, 0xd1, 0x50, 0xdf, 0xf6, - 0x77, 0x05, 0xf9, 0xc4, 0x3a, 0x94, 0x4c, 0x71, 0xa7, 0xc8, 0x7d, 0xc3, - 0xed, 0x16, 0xde, 0x63, 0x78, 0x3a, 0xe9, 0x61, 0xd7, 0xfd, 0x2f, 0x27, - 0x1d, 0xa8, 0x27, 0x5f, 0x48, 0x1a, 0xc3, 0xaf, 0xff, 0x3a, 0xf3, 0x83, - 0x89, 0xb1, 0x38, 0xe7, 0x5f, 0xfd, 0xd1, 0xc9, 0xbd, 0xdc, 0xe2, 0x68, - 0xeb, 0xf6, 0xe2, 0x8b, 0x43, 0xaa, 0x11, 0x61, 0x88, 0xe8, 0x87, 0x7f, - 0xa3, 0xcf, 0xdf, 0x81, 0x83, 0xaf, 0xfd, 0x9e, 0xd7, 0x32, 0x6e, 0xa2, - 0x87, 0x5f, 0xf7, 0xc7, 0x1c, 0xda, 0xf9, 0xdf, 0xce, 0xa4, 0x3f, 0xef, - 0xcf, 0xef, 0xf4, 0xa3, 0x93, 0xc7, 0x27, 0x3a, 0xff, 0xda, 0xc1, 0xf6, - 0xb2, 0x49, 0xd3, 0xaf, 0xed, 0x66, 0xc1, 0x8d, 0xce, 0xad, 0x1f, 0x57, - 0x8f, 0x2f, 0xff, 0xa0, 0x18, 0x3f, 0x1f, 0xdf, 0x3b, 0x80, 0x73, 0xae, - 0x19, 0xce, 0xa8, 0x4c, 0x9b, 0x21, 0x3c, 0x84, 0x42, 0xa1, 0x7f, 0x6c, - 0x75, 0xf5, 0x97, 0x3a, 0xff, 0xff, 0x24, 0x79, 0xfa, 0xae, 0xbb, 0x83, - 0xef, 0x80, 0x96, 0x8e, 0xb6, 0x22, 0x24, 0x44, 0xbe, 0xfb, 0xbe, 0xc9, - 0xce, 0xbf, 0x64, 0xee, 0x3b, 0x0e, 0xbf, 0xff, 0xff, 0xd1, 0x2f, 0x9e, - 0xea, 0x46, 0xbe, 0x67, 0xed, 0x8d, 0x9f, 0x33, 0x9c, 0xcd, 0x9f, 0xbf, - 0x4e, 0xbe, 0xe8, 0xbe, 0xd1, 0xd5, 0x89, 0x82, 0x89, 0x16, 0x8a, 0x3d, - 0x09, 0x8b, 0xff, 0xfe, 0xfd, 0xd8, 0xd2, 0x7e, 0xba, 0x7a, 0x3a, 0x9e, - 0xd6, 0x04, 0xeb, 0x2a, 0xc0, 0x64, 0x8e, 0xb1, 0x65, 0xcc, 0x21, 0x78, - 0x2f, 0x9d, 0x7c, 0x30, 0xb2, 0xc8, 0xd2, 0x94, 0x4b, 0x68, 0xee, 0xe2, - 0xa8, 0x6d, 0xc8, 0x68, 0xac, 0xb7, 0xb0, 0xb1, 0x18, 0xd2, 0x35, 0x0d, - 0x0f, 0x46, 0x57, 0xb6, 0x83, 0x7c, 0xd7, 0x76, 0x9a, 0x2a, 0x8b, 0xfd, - 0xc8, 0xd9, 0xbc, 0xb3, 0xc7, 0x57, 0x0f, 0x8b, 0xf2, 0xdb, 0xff, 0x3c, - 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xae, 0xf2, 0xdf, 0xc7, 0x59, 0x5c, - 0x44, 0x42, 0xc8, 0xdd, 0x2a, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x56, 0x5f, - 0xf4, 0x4a, 0x39, 0x3c, 0x72, 0x73, 0xac, 0xae, 0x1f, 0x60, 0x99, 0xdf, - 0xf7, 0x63, 0x7f, 0x47, 0x5d, 0x8c, 0xeb, 0xff, 0x81, 0x82, 0xac, 0x81, - 0xa9, 0xdc, 0x4e, 0xa5, 0x4f, 0xfe, 0x0e, 0xef, 0xfe, 0x55, 0xe4, 0xae, - 0x71, 0xae, 0xed, 0x34, 0x48, 0x97, 0xee, 0x35, 0xdd, 0xa6, 0x8b, 0x4a, - 0xff, 0xcf, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x7d, 0xb2, 0xb8, 0x7f, - 0xab, 0x33, 0xbf, 0xfc, 0xaa, 0xde, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x45, - 0x09, 0x7f, 0xf6, 0x32, 0xaf, 0x94, 0x7d, 0x27, 0xa0, 0xeb, 0xf7, 0xbf, - 0x6b, 0xe8, 0xeb, 0xe4, 0x9e, 0x38, 0x75, 0x2c, 0xf2, 0x7a, 0x51, 0x7e, - 0xe3, 0x5d, 0xda, 0x68, 0xa3, 0xef, 0xfa, 0x25, 0x1c, 0x9e, 0x39, 0x39, - 0xd7, 0xff, 0xff, 0xfb, 0xea, 0x72, 0x68, 0xef, 0x33, 0xaf, 0xf7, 0x58, - 0xa3, 0x88, 0x20, 0x62, 0x6e, 0xc1, 0xd7, 0xe7, 0xd2, 0x7a, 0x0e, 0xbf, - 0xe8, 0x9a, 0x06, 0x26, 0xec, 0x1d, 0x50, 0x8e, 0xc5, 0x21, 0x20, 0x24, - 0xb7, 0xff, 0xf6, 0x07, 0xb1, 0xf5, 0x5f, 0x0b, 0x83, 0x5a, 0x80, 0x15, - 0x79, 0xe4, 0xac, 0x2a, 0x0a, 0xc2, 0x21, 0x33, 0xf4, 0x64, 0xbb, 0x66, - 0x97, 0xff, 0x67, 0x55, 0xf2, 0x8f, 0xa4, 0xf4, 0x1d, 0x65, 0x67, 0x56, - 0x80, 0xb9, 0x53, 0x1e, 0x64, 0xa8, 0x6d, 0x97, 0x27, 0x9c, 0x30, 0x91, - 0x96, 0x28, 0xa9, 0x49, 0x55, 0x6c, 0xa1, 0xdd, 0xe1, 0x42, 0x90, 0xa6, - 0x98, 0x8b, 0xb0, 0xce, 0x01, 0x47, 0xa5, 0xcb, 0xdf, 0xe5, 0x73, 0x8d, - 0x77, 0x69, 0xa2, 0x22, 0xbf, 0xb3, 0x8d, 0x77, 0x69, 0xa2, 0x2b, 0xbf, - 0xe6, 0x35, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0xb8, 0xa5, 0x51, 0x00, 0xe7, - 0x17, 0xff, 0x81, 0x02, 0xd5, 0x5f, 0xc0, 0xfa, 0x32, 0x3a, 0xf9, 0x59, - 0xe6, 0x63, 0x3a, 0xc9, 0xb9, 0xf9, 0x81, 0x2e, 0xfb, 0x3a, 0xfe, 0x3a, - 0xff, 0x62, 0x70, 0x00, 0xff, 0x47, 0x59, 0x80, 0x27, 0xa7, 0xa2, 0x0b, - 0xff, 0xfb, 0xda, 0x4e, 0xba, 0x49, 0x07, 0xdf, 0xf7, 0x98, 0x75, 0xfb, - 0x8d, 0x77, 0x69, 0xa2, 0x9e, 0xbf, 0xcb, 0x40, 0xfe, 0xfc, 0x91, 0xd7, - 0x2d, 0x0e, 0xa8, 0x3c, 0x86, 0x99, 0xdf, 0xff, 0xe9, 0x47, 0xb5, 0xfa, - 0xda, 0x80, 0x8c, 0xea, 0x7e, 0xd3, 0xaf, 0xff, 0xee, 0x73, 0xfe, 0x72, - 0x07, 0x14, 0x4e, 0xf7, 0x3e, 0x9d, 0x7f, 0xf2, 0x4b, 0x04, 0x10, 0xb4, - 0xe4, 0x8e, 0xbf, 0xd2, 0x8e, 0x4f, 0x1c, 0x9c, 0xeb, 0xef, 0x82, 0xf2, - 0x3a, 0xfc, 0xf9, 0xd4, 0x59, 0xd5, 0xa3, 0xc7, 0xd8, 0x45, 0x50, 0x89, - 0xfc, 0x7b, 0xbf, 0xe8, 0x16, 0xe6, 0xcc, 0xf6, 0x8e, 0xbf, 0x3c, 0xf1, - 0xcf, 0xce, 0xa6, 0x12, 0xb3, 0xf8, 0x2b, 0xc5, 0x96, 0xbd, 0xee, 0x42, - 0x8c, 0x2e, 0xba, 0x30, 0xe0, 0xd8, 0x43, 0xb6, 0x71, 0x7f, 0xf9, 0xe4, - 0xa8, 0x45, 0xd9, 0xd6, 0xa0, 0x07, 0x5f, 0xfe, 0x00, 0x3f, 0xd2, 0xbf, - 0x45, 0xd6, 0x30, 0x75, 0xff, 0xc3, 0x80, 0x71, 0x02, 0xab, 0x45, 0x9d, - 0x5c, 0x44, 0x77, 0x93, 0x29, 0x54, 0xe4, 0x83, 0x09, 0x74, 0x86, 0xc5, - 0xb0, 0xeb, 0xf0, 0xc7, 0xec, 0x1d, 0x1d, 0x7f, 0x29, 0xc7, 0x0b, 0x89, - 0xd4, 0x13, 0xe6, 0xc0, 0xf7, 0x2b, 0xbf, 0xf9, 0x03, 0xc7, 0xdd, 0x5e, - 0x72, 0x27, 0x3a, 0x95, 0x3f, 0x3e, 0x96, 0xdc, 0x18, 0x3a, 0xff, 0xfd, - 0xd8, 0xe6, 0x49, 0x1f, 0xd8, 0x14, 0xfd, 0xa5, 0x5f, 0xa2, 0x40, 0xfe, - 0x47, 0x5f, 0x35, 0xdd, 0xa6, 0x8a, 0xce, 0xa6, 0x3d, 0x5e, 0x14, 0x5f, - 0x79, 0x17, 0xa3, 0xaf, 0xe9, 0xd7, 0x03, 0x2d, 0x1d, 0x7e, 0xcf, 0x6b, - 0xee, 0x8e, 0xbd, 0x13, 0xa1, 0xd7, 0xef, 0x03, 0xe8, 0xc8, 0xeb, 0xdf, - 0xbe, 0x8e, 0xbf, 0xec, 0x92, 0x7e, 0xc6, 0xc5, 0x81, 0x67, 0x5f, 0xb2, - 0x69, 0xff, 0x01, 0xd6, 0x56, 0x15, 0x11, 0x04, 0x57, 0x21, 0x51, 0xb9, - 0x1f, 0x08, 0x56, 0x5b, 0xd2, 0x97, 0x1b, 0x12, 0x9d, 0x0e, 0x7d, 0x41, - 0xbf, 0xf7, 0x53, 0xcf, 0xc9, 0xe1, 0x02, 0x75, 0xfb, 0xc8, 0x38, 0xb3, - 0xaf, 0xa4, 0xe2, 0xae, 0x1f, 0x16, 0xd1, 0xed, 0xff, 0x9e, 0x4a, 0xe7, - 0x1a, 0xee, 0xd3, 0x44, 0x8b, 0x7f, 0xfe, 0xf7, 0x70, 0x55, 0xf3, 0xbe, - 0xfa, 0x51, 0x47, 0x3a, 0xff, 0xcf, 0xe5, 0x61, 0x38, 0x9e, 0xfc, 0xea, - 0x55, 0x1b, 0xf0, 0x94, 0xea, 0xf7, 0xf6, 0x71, 0xae, 0xed, 0x34, 0x59, - 0x37, 0xff, 0xbd, 0xaf, 0xba, 0x57, 0x27, 0x41, 0x96, 0x8e, 0xa5, 0x51, - 0x0b, 0x87, 0x17, 0xff, 0xf9, 0xd3, 0xdf, 0xf1, 0xf4, 0xab, 0x7a, 0x9c, - 0x89, 0x68, 0xeb, 0xfb, 0x38, 0xd7, 0x76, 0x9a, 0x2d, 0x8b, 0xff, 0xf9, - 0x81, 0xdf, 0x83, 0x9c, 0xf6, 0xbb, 0x37, 0xcf, 0x9d, 0xdb, 0x3a, 0xf7, - 0x3f, 0xe9, 0xd7, 0x79, 0x58, 0x44, 0x3f, 0x1a, 0xa9, 0x54, 0x77, 0x24, - 0x2f, 0xef, 0x66, 0xb0, 0xeb, 0xe6, 0xbb, 0xb4, 0xd1, 0x6d, 0xdf, 0x6a, - 0x77, 0xe1, 0xd5, 0xc3, 0xcf, 0xf1, 0x6d, 0xfc, 0x9d, 0xf2, 0x03, 0xf3, - 0xaf, 0xfa, 0x25, 0x1c, 0x9e, 0x39, 0x39, 0xd6, 0x56, 0x48, 0xf1, 0xc6, - 0x99, 0x88, 0x84, 0xb6, 0xff, 0xf6, 0x08, 0x15, 0x5b, 0x87, 0x30, 0x54, - 0x3a, 0xf3, 0x0b, 0xa1, 0x3a, 0xf4, 0xfd, 0x43, 0xaf, 0xfc, 0xc2, 0x61, - 0x30, 0xff, 0x77, 0x06, 0x00, 0x75, 0xfd, 0x03, 0x20, 0xfe, 0xb3, 0xaf, - 0x9a, 0xee, 0xd3, 0x45, 0xe1, 0x7f, 0xe7, 0xf4, 0x6c, 0xe7, 0x33, 0x7d, - 0x1d, 0x5c, 0x3e, 0xd1, 0x2d, 0xbe, 0xf6, 0xde, 0x74, 0xeb, 0xf2, 0xe0, - 0x64, 0xe7, 0x5f, 0xe9, 0x40, 0xfb, 0x63, 0xb4, 0xeb, 0xfd, 0x1e, 0x7e, - 0xfc, 0x0c, 0x1d, 0x7f, 0xef, 0xab, 0xde, 0x5e, 0xc1, 0xf6, 0x8e, 0xbb, - 0x14, 0x3a, 0xa0, 0xf5, 0xf1, 0x06, 0xf9, 0x27, 0xc5, 0x9d, 0x7e, 0xc1, - 0x06, 0xd4, 0x1d, 0x7e, 0x8f, 0xbf, 0xbe, 0x8e, 0xbf, 0xf9, 0x70, 0xdf, - 0x98, 0x3f, 0xcb, 0x34, 0x75, 0xff, 0xff, 0x9d, 0x3c, 0xeb, 0x71, 0x03, - 0x7a, 0x9c, 0x97, 0xd9, 0x60, 0x9d, 0x58, 0x8a, 0xfe, 0xa2, 0xdf, 0xfd, - 0x9d, 0xeb, 0xc9, 0x69, 0x1c, 0x91, 0xd7, 0x40, 0x0e, 0xa9, 0x1e, 0xbf, - 0x90, 0xa9, 0x80, 0xb8, 0x48, 0xc2, 0x20, 0x62, 0x83, 0x93, 0xa5, 0xe4, - 0x26, 0xb7, 0x21, 0x42, 0x49, 0x89, 0x56, 0x67, 0xd8, 0x45, 0x39, 0x00, - 0x08, 0x44, 0xa3, 0x50, 0xd8, 0xf3, 0xcd, 0xfe, 0xdd, 0x5c, 0x03, 0xf3, - 0x47, 0x5f, 0xe0, 0x2b, 0x34, 0xa0, 0x7c, 0x75, 0x2a, 0x9a, 0x9c, 0x43, - 0xaf, 0x86, 0x97, 0x93, 0x37, 0x3a, 0xf9, 0xae, 0xed, 0x34, 0x5e, 0x97, - 0xfe, 0x4f, 0x74, 0x5e, 0x40, 0x70, 0x1d, 0x5c, 0x3e, 0x95, 0x96, 0xde, - 0x5a, 0x78, 0xeb, 0xfe, 0x7f, 0x4a, 0x14, 0xf2, 0x4e, 0x75, 0x2c, 0xf5, - 0x04, 0x6e, 0xfd, 0x8b, 0xeb, 0x84, 0xea, 0x0a, 0x68, 0x39, 0x08, 0x4f, - 0xae, 0xdb, 0x44, 0x37, 0xff, 0xfb, 0x66, 0x0a, 0xa1, 0xc0, 0xf7, 0x16, - 0xb7, 0x96, 0x09, 0xd7, 0xf9, 0x5f, 0x64, 0xd2, 0x70, 0x9d, 0x48, 0x89, - 0x4e, 0xb0, 0x52, 0xa8, 0xfd, 0xc8, 0x6d, 0xd4, 0x36, 0xff, 0x13, 0xc2, - 0xfe, 0x50, 0x96, 0xc9, 0xd4, 0xc6, 0xc6, 0x28, 0x92, 0x91, 0x66, 0x8c, - 0x1f, 0x91, 0x8d, 0x2e, 0x16, 0x9d, 0x23, 0x04, 0x69, 0xe3, 0x18, 0xce, - 0x90, 0xff, 0x9d, 0xbf, 0x66, 0x53, 0xa5, 0xdf, 0xf4, 0xeb, 0xff, 0xbf, - 0x89, 0x87, 0x36, 0x3a, 0xd6, 0x87, 0x5f, 0x67, 0x5f, 0xc7, 0x5f, 0xec, - 0x4e, 0x00, 0x1f, 0xe8, 0xeb, 0x30, 0x14, 0x44, 0xc0, 0xa2, 0xe8, 0x82, - 0xfb, 0xd1, 0xbc, 0xe7, 0x5f, 0xf7, 0xb5, 0x9b, 0xcb, 0xbf, 0xa8, 0x75, - 0x21, 0xef, 0x89, 0x1d, 0xf4, 0x6c, 0x89, 0x1d, 0x7e, 0xe3, 0x5d, 0xda, - 0x68, 0x88, 0xef, 0xff, 0xbb, 0xfe, 0xb5, 0x8b, 0x1c, 0xd9, 0xf2, 0x18, - 0x93, 0xaf, 0xfa, 0x27, 0xe6, 0x7b, 0xc9, 0xe3, 0xaf, 0x0c, 0x6e, 0x75, - 0x48, 0xf4, 0xc2, 0x71, 0x7f, 0xd9, 0xcc, 0xd6, 0x38, 0xce, 0x75, 0xec, - 0x0a, 0xce, 0xbf, 0xff, 0xdd, 0x74, 0xf4, 0x74, 0x73, 0xdd, 0x4e, 0xe2, - 0x32, 0x75, 0xff, 0xff, 0xef, 0x79, 0x17, 0xc4, 0xcd, 0xc7, 0xff, 0x47, - 0x7e, 0x6c, 0x4f, 0x4d, 0x07, 0x54, 0x23, 0x67, 0x17, 0x6f, 0xf3, 0xaf, - 0x39, 0x28, 0x59, 0xd7, 0x4e, 0xb2, 0xae, 0x65, 0x92, 0xaf, 0xfc, 0xab, - 0x7a, 0x93, 0x76, 0x27, 0x54, 0x06, 0xbd, 0x91, 0x7b, 0xed, 0x91, 0xe8, - 0x3a, 0xa4, 0x7f, 0x88, 0xb5, 0x7f, 0x63, 0xaf, 0x37, 0xf1, 0xd7, 0xf9, - 0xd5, 0xd2, 0x71, 0xc0, 0x75, 0x98, 0xce, 0xbf, 0xe8, 0xcd, 0xe1, 0xe4, - 0xf2, 0x3a, 0x98, 0x83, 0xc9, 0x08, 0x9d, 0xfc, 0xc6, 0x39, 0xd7, 0xf1, - 0xd7, 0xf4, 0x29, 0x82, 0x8a, 0x1d, 0x7f, 0x67, 0xb6, 0xbd, 0x9d, 0x3a, - 0xb1, 0x11, 0x22, 0x5d, 0xa2, 0xcb, 0xff, 0xf9, 0xaa, 0xf1, 0xc5, 0x3c, - 0xaf, 0x23, 0xc2, 0xe0, 0x3a, 0x98, 0xb5, 0xeb, 0x16, 0x14, 0x2b, 0xe2, - 0x13, 0x32, 0x20, 0xc2, 0x26, 0x99, 0xef, 0x0a, 0xb4, 0x22, 0x98, 0xdb, - 0x90, 0xf4, 0xe9, 0x0b, 0xc3, 0x70, 0x04, 0x22, 0x59, 0xa7, 0xbf, 0x42, - 0xc3, 0x61, 0x75, 0xdb, 0x5d, 0x3a, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x17, - 0x5f, 0xbc, 0x0f, 0xa3, 0x22, 0xaf, 0xda, 0xf7, 0x60, 0x07, 0x5f, 0x9e, - 0x78, 0xe7, 0xe7, 0x59, 0x59, 0xd1, 0x89, 0x83, 0x2e, 0x67, 0xf9, 0x4e, - 0xd9, 0x3d, 0x2a, 0xa8, 0x9e, 0x51, 0xe9, 0xdf, 0xfc, 0xb7, 0x92, 0xb9, - 0xc6, 0xbb, 0xb4, 0xd1, 0x33, 0x5f, 0xcc, 0x33, 0x0f, 0x60, 0x6a, 0x3c, - 0x75, 0xed, 0xe3, 0x47, 0x5e, 0x6a, 0x2c, 0xeb, 0xe6, 0x17, 0x9c, 0x4e, - 0xbb, 0x6d, 0x88, 0x3a, 0xec, 0xfc, 0xeb, 0xff, 0xdd, 0x85, 0xbf, 0xb3, - 0x70, 0x2f, 0xef, 0x4e, 0xbe, 0x49, 0xff, 0x13, 0xaf, 0xd9, 0x3e, 0x02, - 0x63, 0xab, 0xe1, 0xe5, 0x78, 0x8a, 0xff, 0x7c, 0xc1, 0x7e, 0x03, 0x6c, - 0xeb, 0xff, 0xf2, 0xdf, 0xb9, 0xb8, 0x3a, 0xcb, 0xf6, 0x6e, 0xfe, 0x75, - 0xfd, 0x9a, 0x8f, 0xa3, 0x07, 0x50, 0x51, 0x77, 0x86, 0xdd, 0x59, 0xbb, - 0x58, 0x75, 0xdb, 0x5e, 0x3a, 0xcc, 0x13, 0xac, 0x08, 0x35, 0xbf, 0x8c, - 0xdf, 0xff, 0xf9, 0x06, 0x1a, 0x30, 0xbf, 0x91, 0xce, 0x26, 0xce, 0x3b, - 0x80, 0xea, 0x62, 0x15, 0x56, 0x34, 0x79, 0x05, 0xa6, 0x84, 0xb7, 0x61, - 0xbe, 0xe5, 0xe0, 0x42, 0xf1, 0x3d, 0xfc, 0xcc, 0x08, 0xe7, 0x8e, 0xbe, - 0x7e, 0xa4, 0xc7, 0x5f, 0x76, 0x68, 0x09, 0xd5, 0x87, 0xdc, 0xd2, 0xb7, - 0x21, 0xbf, 0xcd, 0x4c, 0x10, 0xf6, 0x0e, 0xa3, 0xaf, 0xdd, 0x7f, 0x48, - 0x07, 0x5f, 0xfe, 0xf9, 0xd7, 0x4f, 0x03, 0xf1, 0x17, 0x91, 0xd5, 0x88, - 0xab, 0x69, 0x82, 0x05, 0x2c, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x14, - 0x60, 0x63, 0x14, 0x61, 0x30, 0xf6, 0x1e, 0xd6, 0x0c, 0x30, 0xe6, 0x17, - 0x27, 0xda, 0xcf, 0xc2, 0xc5, 0x63, 0x6f, 0x7f, 0xbd, 0x61, 0x44, 0x30, - 0x98, 0xd8, 0x6f, 0x7c, 0xf9, 0xdd, 0xb3, 0xaf, 0xff, 0xc0, 0xde, 0x5d, - 0xfe, 0x38, 0xaf, 0x51, 0xaf, 0xc3, 0xaf, 0xfe, 0xdd, 0x98, 0xf0, 0x51, - 0x8f, 0x50, 0xb3, 0xaf, 0xff, 0xfc, 0x8b, 0x4e, 0x77, 0xfd, 0x4a, 0x36, - 0x72, 0x07, 0xdd, 0xc9, 0x1d, 0x7f, 0xe4, 0xf2, 0x35, 0x03, 0xec, 0x69, - 0xd5, 0x88, 0xf1, 0xf2, 0x46, 0xd3, 0x6d, 0xf7, 0xb6, 0xf3, 0xa7, 0x5f, - 0xff, 0xe7, 0x16, 0x8e, 0x07, 0xbf, 0xfc, 0xec, 0x4b, 0x91, 0x39, 0xd5, - 0x88, 0x86, 0xfc, 0x92, 0xff, 0xff, 0x3a, 0x83, 0x80, 0xff, 0x5f, 0x24, - 0x9d, 0x86, 0x8b, 0x9d, 0x7d, 0xe4, 0xea, 0x1d, 0x7f, 0xcf, 0xc9, 0x7c, - 0xc6, 0x87, 0x0e, 0xa6, 0x12, 0xe0, 0x54, 0x46, 0x59, 0x91, 0xa4, 0xf6, - 0x17, 0x0e, 0x46, 0x2c, 0x3f, 0x90, 0x5b, 0x87, 0x5f, 0xde, 0xc5, 0xef, - 0x8b, 0x3a, 0xdd, 0xc3, 0x7a, 0x82, 0x17, 0xfb, 0xf0, 0xbc, 0xb4, 0x92, - 0x3a, 0xff, 0xfc, 0x14, 0x19, 0xf3, 0x48, 0xfd, 0x55, 0x96, 0x59, 0x2a, - 0xfe, 0xf7, 0x62, 0x7e, 0xfe, 0x75, 0xfd, 0xbc, 0xb4, 0x0f, 0xe6, 0x3a, - 0xff, 0xa7, 0xc0, 0x07, 0xf7, 0xe4, 0x8e, 0xbf, 0x9d, 0xc3, 0xb3, 0x02, - 0x75, 0xe7, 0x76, 0x9a, 0x2c, 0xfb, 0xf8, 0x0e, 0x32, 0x45, 0x9d, 0x53, - 0xa2, 0xe4, 0x27, 0x4d, 0x2d, 0x01, 0x3d, 0xff, 0x93, 0xb1, 0x24, 0xf4, - 0x7b, 0x47, 0x5f, 0xfe, 0xe7, 0x5f, 0xe6, 0x6c, 0x1c, 0xd6, 0x09, 0xd7, - 0xfd, 0x08, 0x1c, 0x5b, 0x39, 0xd3, 0xaf, 0xfe, 0xd7, 0x92, 0x66, 0x5c, - 0x31, 0xbe, 0x8e, 0xa4, 0x46, 0x3b, 0xa5, 0x7e, 0x6f, 0x79, 0x96, 0x59, - 0x2a, 0xff, 0xcf, 0x2d, 0x0e, 0x34, 0x39, 0xc2, 0x95, 0x2f, 0xef, 0xdb, - 0x5f, 0xaf, 0x02, 0x75, 0xfe, 0xf7, 0x73, 0x67, 0xc9, 0x2c, 0xea, 0xc3, - 0xe2, 0xfc, 0xae, 0xff, 0xdb, 0xc8, 0x7f, 0x07, 0xc6, 0xac, 0x07, 0x5d, - 0x0a, 0x1d, 0x7f, 0xc1, 0x81, 0x80, 0x4b, 0xa8, 0x75, 0x42, 0x23, 0xe7, - 0x43, 0x41, 0x6b, 0xfd, 0xd4, 0x08, 0xbb, 0xcc, 0x75, 0xfe, 0x0f, 0x7f, - 0x70, 0x6d, 0xe1, 0xd5, 0x07, 0xce, 0x86, 0x37, 0xfc, 0x82, 0x1f, 0xa1, - 0xff, 0xda, 0x3a, 0xf4, 0x0a, 0x87, 0x54, 0x97, 0x70, 0xc2, 0x4a, 0xd3, - 0x3d, 0xd6, 0x26, 0x2f, 0xe4, 0x3a, 0x96, 0x7d, 0xd8, 0xc0, 0xc0, 0x9c, - 0x30, 0xae, 0xd4, 0x2c, 0x7d, 0x09, 0x6d, 0x84, 0x1f, 0x4e, 0xef, 0xfb, - 0xff, 0x68, 0x72, 0x68, 0x59, 0xd7, 0xf9, 0xd9, 0xea, 0x47, 0x20, 0xea, - 0x50, 0xfa, 0xb8, 0x73, 0x7f, 0xee, 0x26, 0xa5, 0xf7, 0xb0, 0x30, 0x75, - 0xf7, 0x12, 0x16, 0x75, 0xff, 0xfb, 0xca, 0x7f, 0x18, 0x1e, 0xe6, 0xb7, - 0x94, 0x74, 0xea, 0xe2, 0x2d, 0x56, 0x7c, 0x24, 0x17, 0x3c, 0x8e, 0xbf, - 0xff, 0xff, 0x85, 0xd9, 0xf6, 0x74, 0x73, 0xdf, 0x81, 0x6f, 0x27, 0x0c, - 0x0b, 0xf1, 0xe4, 0x75, 0xfe, 0xce, 0xf7, 0xff, 0x38, 0x9d, 0x7f, 0xcd, - 0xce, 0xb5, 0xf8, 0xf2, 0x3a, 0xf2, 0x4d, 0xa3, 0xaa, 0x0f, 0x4d, 0x66, - 0xf6, 0x40, 0xa6, 0x81, 0x30, 0xaf, 0x21, 0x0a, 0xb8, 0x42, 0xdf, 0xdf, - 0x13, 0xae, 0xb4, 0x3a, 0xf6, 0xcc, 0x09, 0xd6, 0xe4, 0xe7, 0x95, 0x31, - 0x6d, 0xff, 0xb1, 0x9d, 0xae, 0x66, 0xd0, 0xfe, 0xc9, 0xd5, 0x0a, 0x9d, - 0xfb, 0x1b, 0x7b, 0xc2, 0x60, 0x4a, 0xaf, 0xff, 0xff, 0x81, 0xac, 0xc1, - 0x53, 0xef, 0x06, 0x33, 0xaa, 0xe8, 0x72, 0x75, 0xe2, 0xce, 0xbf, 0x7d, - 0x81, 0xfa, 0xb3, 0xab, 0x11, 0x51, 0xe7, 0xeb, 0xf6, 0xc7, 0xec, 0x7d, - 0x3a, 0xff, 0xfb, 0xfd, 0xe5, 0xa0, 0xf6, 0x38, 0x17, 0x76, 0x4e, 0xac, - 0x44, 0xf2, 0x11, 0x09, 0x55, 0xed, 0x44, 0xe7, 0x5f, 0xf4, 0x63, 0x7a, - 0x9b, 0x1f, 0x87, 0x5d, 0x9d, 0x3a, 0x84, 0xf3, 0x76, 0xce, 0x2a, 0x48, - 0xba, 0xd1, 0x6f, 0x9a, 0x6f, 0x77, 0xf6, 0x4e, 0xbc, 0x0f, 0xda, 0x75, - 0xef, 0x67, 0xd3, 0xaf, 0xe8, 0xdf, 0x5f, 0x39, 0x07, 0x5e, 0x0f, 0xed, - 0x3a, 0xf8, 0x23, 0x12, 0x3a, 0x90, 0xde, 0xb8, 0xed, 0x05, 0x1c, 0x7b, - 0x8f, 0x20, 0xea, 0xc7, 0x7a, 0xd9, 0x76, 0x34, 0xeb, 0xfb, 0x89, 0xb3, - 0x07, 0x47, 0x5f, 0xdb, 0xfb, 0x3b, 0xfb, 0x19, 0xd7, 0xf7, 0x33, 0xbd, - 0xff, 0xc7, 0x5f, 0xba, 0x31, 0x9c, 0x32, 0xfe, 0xce, 0x4f, 0xfb, 0x84, - 0xd1, 0x06, 0xaa, 0x69, 0x6d, 0xc9, 0xd1, 0x3f, 0x25, 0x3a, 0x84, 0x7d, - 0xa4, 0x34, 0x6f, 0xce, 0xd4, 0x5c, 0x1d, 0x7f, 0x4b, 0xa2, 0xfb, 0xf8, - 0xea, 0x69, 0xe9, 0x09, 0x2d, 0xf7, 0xd1, 0x79, 0xce, 0xac, 0x3c, 0x4d, - 0x10, 0xdf, 0xa3, 0xdf, 0x16, 0xc9, 0xd7, 0xfa, 0x48, 0xb8, 0xef, 0xd0, - 0x9d, 0x7f, 0xfa, 0x30, 0x77, 0xf6, 0x71, 0x27, 0x75, 0x9d, 0x7e, 0x76, - 0x7d, 0x9d, 0xd1, 0xfe, 0x78, 0xd2, 0x98, 0xb5, 0x5f, 0xf0, 0x2b, 0x28, - 0xca, 0x32, 0x17, 0x9c, 0x21, 0x18, 0x53, 0x5e, 0xd6, 0x48, 0xeb, 0xf2, - 0x6f, 0x24, 0x13, 0xaf, 0x27, 0x70, 0xeb, 0xa1, 0x78, 0x78, 0x0d, 0x26, - 0xbf, 0x99, 0xc5, 0xc7, 0x14, 0x3a, 0xf8, 0x3a, 0xec, 0x1d, 0x7e, 0x1e, - 0x32, 0xf3, 0x9d, 0x50, 0x7e, 0xf8, 0x5c, 0xe4, 0x37, 0x7e, 0x27, 0x54, - 0x26, 0x80, 0x8b, 0x7c, 0x85, 0x1e, 0x8b, 0x2f, 0x77, 0x04, 0xeb, 0xfd, - 0x34, 0x4e, 0xb7, 0x9a, 0x0e, 0xbf, 0xfe, 0x75, 0x3d, 0x1c, 0x07, 0x23, - 0xc2, 0xe0, 0x3a, 0xfe, 0x1c, 0x06, 0x0c, 0x8e, 0xbf, 0xfe, 0x53, 0xe7, - 0xd1, 0x7f, 0x69, 0x37, 0xea, 0x32, 0x75, 0x87, 0x0f, 0xfd, 0xca, 0xab, - 0x13, 0x40, 0x71, 0xa1, 0x34, 0xfe, 0x19, 0xb7, 0x6b, 0x61, 0xd7, 0xc8, - 0x2e, 0x13, 0xaf, 0xfc, 0xbc, 0xf6, 0xbe, 0xe9, 0xe5, 0x87, 0x5f, 0xb5, - 0x1c, 0xf4, 0x1c, 0xa9, 0xbf, 0xa0, 0xa2, 0x57, 0x4b, 0xd7, 0xef, 0xb3, - 0x3b, 0xf0, 0xeb, 0xee, 0xe2, 0x6c, 0x3a, 0xfe, 0xd2, 0x73, 0x3f, 0xe1, - 0xd7, 0xff, 0xfa, 0x26, 0xf8, 0x8d, 0xff, 0x9a, 0xff, 0xe2, 0xd3, 0xdd, - 0x43, 0xab, 0x13, 0xaf, 0x48, 0x56, 0xac, 0x8f, 0xa5, 0x3e, 0x22, 0xda, - 0x2d, 0xb9, 0x6c, 0x03, 0x45, 0xf9, 0x7d, 0xae, 0x66, 0x1d, 0x7f, 0xf4, - 0xbd, 0xfc, 0xa4, 0xbf, 0x7a, 0x16, 0x75, 0xfe, 0xf6, 0xa2, 0x7c, 0xd0, - 0x4e, 0xbb, 0xb8, 0x75, 0xff, 0xf7, 0x60, 0x38, 0xdf, 0x98, 0x38, 0x1e, - 0xc1, 0xd7, 0xff, 0x26, 0x0e, 0x66, 0xbe, 0x4b, 0x4b, 0x3a, 0xff, 0xcf, - 0x1b, 0xcb, 0xe6, 0xb7, 0x0c, 0x1d, 0x41, 0x4e, 0x03, 0x72, 0x04, 0x46, - 0x63, 0x33, 0x98, 0x57, 0x49, 0xde, 0x43, 0xbc, 0xa4, 0x70, 0xeb, 0xf8, - 0x30, 0x0e, 0x66, 0xe7, 0x52, 0xa7, 0x92, 0xb1, 0xcb, 0xfd, 0x0b, 0xc4, - 0xe4, 0xd2, 0x3a, 0xe4, 0x98, 0xeb, 0xff, 0xde, 0x8e, 0x8b, 0xcf, 0x1c, - 0xe3, 0xc8, 0xeb, 0xde, 0x49, 0xce, 0xbf, 0x01, 0xf7, 0x89, 0x8e, 0xbc, - 0x30, 0xd3, 0xaf, 0xfe, 0x0a, 0x4d, 0xd8, 0xe6, 0xf2, 0x8e, 0x1d, 0x7f, - 0xf9, 0x05, 0xf7, 0xd6, 0xb3, 0x81, 0xee, 0x1d, 0x5f, 0x13, 0x49, 0x41, - 0x65, 0xa4, 0x38, 0xe0, 0x94, 0x68, 0x6b, 0x69, 0x16, 0xd0, 0x75, 0xee, - 0xa7, 0x8e, 0xb6, 0xcc, 0x35, 0x5f, 0x43, 0xea, 0x17, 0x44, 0x02, 0xbd, - 0x91, 0xd3, 0xa4, 0x2c, 0xba, 0x46, 0xf1, 0xbd, 0x82, 0x12, 0x37, 0xfd, - 0x83, 0x21, 0xc5, 0xc3, 0x4e, 0xbf, 0x75, 0x36, 0x60, 0x4e, 0xbf, 0xf0, - 0x60, 0x70, 0x7f, 0x96, 0x68, 0xeb, 0xf3, 0xad, 0x36, 0xb0, 0xeb, 0xde, - 0x8d, 0xce, 0xac, 0x3c, 0x47, 0x28, 0xbd, 0x09, 0x31, 0xd7, 0x85, 0x88, - 0xda, 0x3a, 0xfd, 0x93, 0xae, 0x34, 0x75, 0xff, 0xff, 0xa3, 0xa8, 0xb5, - 0x66, 0x93, 0xf3, 0xef, 0x53, 0x7d, 0x35, 0x27, 0x3a, 0x82, 0x9e, 0x9a, - 0x86, 0xa8, 0x51, 0x34, 0x20, 0x3a, 0x40, 0x23, 0x7a, 0x23, 0xda, 0x27, - 0xbe, 0xf8, 0xf2, 0x62, 0x4e, 0xbf, 0xfb, 0x36, 0x60, 0x70, 0x7f, 0x96, - 0x68, 0xeb, 0xf7, 0x23, 0xbf, 0x42, 0x75, 0x70, 0xfb, 0x5d, 0x12, 0xfa, - 0x12, 0x78, 0x3a, 0xf9, 0x97, 0xcd, 0x1d, 0x7f, 0xd2, 0x5b, 0xcb, 0xda, - 0x85, 0x0e, 0xa8, 0x3d, 0xa7, 0x21, 0xbd, 0xa4, 0x13, 0xaf, 0xc2, 0xdf, - 0x9a, 0xdc, 0xea, 0xc3, 0xc4, 0x71, 0xaa, 0x63, 0x4e, 0xd1, 0xe1, 0x2a, - 0x02, 0x11, 0x7a, 0xfd, 0x92, 0xe9, 0xe4, 0x75, 0xe4, 0xea, 0x1d, 0x5b, - 0x9b, 0x1f, 0x0b, 0xdf, 0x7d, 0xfd, 0xf4, 0x75, 0xfd, 0xfe, 0xa2, 0x6f, - 0xf8, 0x75, 0xef, 0xf3, 0x73, 0xab, 0xa7, 0x9b, 0xe3, 0x0b, 0xfd, 0x2f, - 0xc6, 0x7d, 0x26, 0xe7, 0x5f, 0x00, 0x19, 0xb9, 0xd7, 0xf6, 0xd7, 0xb1, - 0xc5, 0xa7, 0x5f, 0xf7, 0xef, 0x20, 0xe6, 0x03, 0x47, 0x5f, 0xe0, 0x26, - 0xfb, 0xcb, 0x3c, 0x75, 0x74, 0xfb, 0x34, 0x71, 0x7e, 0xdf, 0x4b, 0x46, - 0x33, 0xaf, 0xff, 0xd9, 0xaf, 0x9d, 0x74, 0xf0, 0x3f, 0x11, 0x79, 0x1d, - 0x50, 0x88, 0x01, 0x2b, 0xbf, 0x9e, 0x70, 0x38, 0x84, 0xea, 0x6a, 0xa0, - 0x29, 0x88, 0xb8, 0x6b, 0xd2, 0x2f, 0x42, 0x6b, 0x64, 0x28, 0xb6, 0xc8, - 0x6f, 0xf7, 0xd8, 0x6e, 0xde, 0x72, 0x0e, 0xbf, 0xa3, 0xa9, 0xc8, 0x59, - 0xd5, 0xd3, 0xe1, 0xf1, 0xb5, 0x42, 0xb6, 0xcc, 0x94, 0xe6, 0xf0, 0xd7, - 0xba, 0x6f, 0xce, 0xb2, 0xce, 0xad, 0xcd, 0x43, 0x04, 0x62, 0xff, 0xe8, - 0xe6, 0x6c, 0x79, 0x03, 0x30, 0x27, 0x5f, 0xcf, 0xbc, 0x86, 0x02, 0x75, - 0xff, 0x46, 0xf2, 0x41, 0x5b, 0xf8, 0xea, 0x73, 0xe3, 0x12, 0xcb, 0xf3, - 0xcb, 0x27, 0x83, 0xaf, 0xfe, 0x8d, 0x6b, 0x17, 0xe1, 0x85, 0xe8, 0xeb, - 0xff, 0x92, 0x34, 0x2f, 0x2f, 0x9a, 0xce, 0x1d, 0x7f, 0xff, 0x93, 0x53, - 0xe3, 0x38, 0x3f, 0xed, 0x42, 0xb8, 0x2f, 0xc3, 0xaf, 0xf6, 0xf2, 0xd4, - 0xd2, 0x89, 0xce, 0xa0, 0xa6, 0x88, 0xd2, 0x61, 0x42, 0xf2, 0x1f, 0xec, - 0x77, 0xff, 0xfe, 0xea, 0x6f, 0xec, 0xdf, 0xdc, 0xe4, 0x78, 0x1f, 0x46, - 0x5d, 0xc3, 0xaf, 0x05, 0xc4, 0xeb, 0xdc, 0x8d, 0x87, 0x50, 0x4d, 0xbf, - 0x06, 0xaf, 0xfd, 0x28, 0x1f, 0x71, 0x36, 0x60, 0x4e, 0xbf, 0xf3, 0xf5, - 0xa8, 0xff, 0x34, 0xfd, 0x3a, 0xfe, 0xeb, 0x8e, 0xf2, 0x43, 0xaf, 0xff, - 0xda, 0x1f, 0x9d, 0x74, 0xf0, 0x3f, 0x11, 0x79, 0x1d, 0x7f, 0xba, 0x8a, - 0x6d, 0xff, 0xc5, 0x0e, 0xbf, 0xe8, 0x65, 0x7d, 0x84, 0x19, 0xce, 0xbf, - 0xfe, 0x1c, 0xd6, 0x2e, 0x1b, 0x9e, 0x4e, 0x61, 0xd6, 0xc6, 0xa2, 0xf3, - 0xc7, 0x3b, 0x0e, 0x2f, 0xe9, 0xf3, 0x88, 0xd8, 0x3a, 0xf8, 0x43, 0x0b, - 0x3a, 0xff, 0xfb, 0xf1, 0xf6, 0xba, 0x93, 0x0c, 0x2d, 0xe4, 0x75, 0xf6, - 0x0f, 0xee, 0x75, 0x2c, 0xfb, 0xf6, 0x27, 0xdf, 0xce, 0x0c, 0x0b, 0xc8, - 0xea, 0x84, 0x6f, 0x64, 0x23, 0xd0, 0x92, 0x91, 0x33, 0xce, 0xc6, 0x15, - 0x50, 0xbd, 0x2f, 0x39, 0x30, 0x61, 0x4d, 0x91, 0xb2, 0x35, 0x2d, 0x21, - 0x4d, 0x31, 0x0f, 0x4f, 0x9c, 0xf8, 0x05, 0x83, 0x18, 0x8f, 0xa3, 0x73, - 0xbf, 0xfb, 0x04, 0x19, 0x9c, 0xd7, 0xa3, 0x0e, 0xbf, 0xed, 0xfd, 0x9c, - 0x49, 0xdd, 0x67, 0x5b, 0x00, 0x7f, 0x22, 0x81, 0x79, 0x83, 0x24, 0x3a, - 0xfa, 0x05, 0xe4, 0x75, 0xfb, 0x18, 0xdc, 0x41, 0xf0, 0xdf, 0x70, 0x7e, - 0xfe, 0xd9, 0xd4, 0x8e, 0x68, 0xeb, 0xff, 0x75, 0x16, 0x1c, 0x9a, 0x33, - 0x87, 0x5f, 0x40, 0x1d, 0x67, 0x5c, 0x32, 0xc3, 0xdd, 0x13, 0xdb, 0xed, - 0x27, 0xa0, 0xea, 0x83, 0xcb, 0x72, 0xbb, 0xe6, 0xf5, 0x26, 0x3a, 0xff, - 0xfc, 0x38, 0xa2, 0x88, 0x1e, 0xa4, 0xdd, 0x4d, 0xfc, 0x75, 0x41, 0xfc, - 0xe1, 0x15, 0xe6, 0xbf, 0x0e, 0xbf, 0x69, 0xb1, 0xc5, 0x0e, 0xae, 0x9e, - 0x18, 0x06, 0xef, 0xf6, 0x4b, 0x10, 0x3d, 0x43, 0xaf, 0xfe, 0xcd, 0xfd, - 0xa4, 0x18, 0x03, 0xac, 0xeb, 0xd2, 0x5f, 0x4e, 0xa9, 0xcf, 0x7b, 0xc8, - 0x57, 0xc8, 0xa2, 0x32, 0x75, 0x61, 0xe2, 0x89, 0x1d, 0xdf, 0x30, 0xeb, - 0xed, 0x0c, 0x2c, 0xea, 0x83, 0x6f, 0xb8, 0xbd, 0xee, 0xc9, 0x67, 0x5d, - 0xd4, 0x3a, 0xb0, 0xd8, 0xf8, 0x72, 0xa1, 0x70, 0xd6, 0x4c, 0x98, 0x82, - 0xa4, 0x35, 0xbb, 0x09, 0x97, 0x63, 0x12, 0x2d, 0x43, 0x4f, 0xf5, 0x7d, - 0xb5, 0x2b, 0xc1, 0x5b, 0x4e, 0xb7, 0x4e, 0xb0, 0x0e, 0xbb, 0x52, 0x3a, - 0x80, 0x6d, 0xb4, 0x21, 0xf8, 0x85, 0xfd, 0x3c, 0xd2, 0x61, 0x72, 0x73, - 0xaf, 0x3e, 0x70, 0xeb, 0xc3, 0x9e, 0x3a, 0xba, 0x6d, 0x04, 0x6a, 0xef, - 0x09, 0xd7, 0xa3, 0x7d, 0x1d, 0x7c, 0x83, 0x2c, 0x3a, 0xf4, 0xee, 0x27, - 0x50, 0x4f, 0x59, 0x63, 0x9e, 0x1f, 0xbf, 0x67, 0xba, 0x9e, 0x3a, 0xfc, - 0xfb, 0xe6, 0xfe, 0x3a, 0xca, 0x74, 0xf3, 0xbc, 0x4d, 0x72, 0x70, 0xeb, - 0xfa, 0x7f, 0x93, 0xbb, 0xf4, 0xea, 0x62, 0x13, 0xdf, 0x86, 0x99, 0x10, - 0x63, 0x5a, 0x3e, 0xf4, 0xa5, 0xc5, 0x6f, 0xfb, 0x02, 0x14, 0xdf, 0x37, - 0xf1, 0xd7, 0xcd, 0x18, 0x91, 0xd5, 0xd3, 0xd9, 0x73, 0x9b, 0xfd, 0x19, - 0xe8, 0xeb, 0x84, 0xea, 0x9c, 0xf4, 0x42, 0x43, 0x7f, 0xf0, 0x60, 0x3c, - 0x8f, 0x23, 0x50, 0x27, 0x5f, 0x4d, 0x1b, 0x52, 0x3a, 0xfe, 0xf3, 0x42, - 0x15, 0xf0, 0xeb, 0xfe, 0x9b, 0x5b, 0x1c, 0x67, 0xfc, 0x27, 0x5f, 0x67, - 0xb1, 0x67, 0x5c, 0x2a, 0x1d, 0x6d, 0x39, 0xb6, 0xfc, 0x82, 0xfe, 0xef, - 0xf3, 0xcd, 0xd4, 0x3a, 0xf8, 0x47, 0x3c, 0x75, 0x42, 0x74, 0x21, 0x23, - 0xc4, 0x25, 0x09, 0x50, 0xba, 0x67, 0x3e, 0x93, 0xf8, 0xc2, 0xfe, 0xf9, - 0x34, 0x78, 0x76, 0x1d, 0x7f, 0xf8, 0x63, 0x67, 0x23, 0x98, 0x9d, 0x80, - 0x9d, 0x78, 0x5d, 0x67, 0x54, 0x91, 0x27, 0x86, 0x28, 0x91, 0x65, 0x58, - 0x87, 0xc1, 0x06, 0x62, 0xcf, 0x18, 0x78, 0xe3, 0x15, 0x1b, 0x89, 0x5a, - 0x13, 0xc3, 0xbe, 0x50, 0xd8, 0x0c, 0xe2, 0x2e, 0x4f, 0x3c, 0xa9, 0x1a, - 0x5b, 0x65, 0xa7, 0xef, 0x29, 0x1d, 0x23, 0x13, 0x9a, 0x5a, 0x4f, 0x23, - 0xab, 0x5c, 0x70, 0x3d, 0x9f, 0x00, 0x79, 0x49, 0x80, 0x94, 0x5c, 0xc1, - 0x84, 0x18, 0xcb, 0x8e, 0xd4, 0xf7, 0xd7, 0xa7, 0x5b, 0xff, 0x84, 0xf3, - 0x2a, 0x5b, 0x72, 0x83, 0xbe, 0xca, 0xb1, 0xda, 0x8c, 0x12, 0x95, 0x7c, - 0x39, 0x5e, 0xde, 0x0a, 0xb5, 0xff, 0xe5, 0x56, 0xf2, 0x57, 0x38, 0xd7, - 0x76, 0x9a, 0x26, 0xcb, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x55, 0xb7, - 0xfa, 0x52, 0xff, 0xc3, 0x12, 0x3a, 0xfb, 0x3a, 0xfe, 0x3a, 0xcc, 0x0c, - 0x3d, 0x31, 0x33, 0xbf, 0xec, 0x1c, 0x5c, 0x4b, 0xfe, 0x1d, 0x7f, 0xb9, - 0x8d, 0x80, 0x7d, 0x59, 0xd7, 0xfd, 0x1d, 0x89, 0xf9, 0x18, 0x13, 0xa9, - 0xa8, 0xa2, 0xe1, 0xbf, 0x4d, 0x2f, 0xd1, 0xc5, 0xf4, 0x27, 0x5e, 0x0e, - 0x09, 0xd7, 0x9d, 0xda, 0x68, 0xad, 0x2f, 0xca, 0x6f, 0xaf, 0xf7, 0x3a, - 0x9a, 0x7a, 0x68, 0x4f, 0x7f, 0xf9, 0x3d, 0x28, 0x6f, 0x53, 0xda, 0x7d, - 0xce, 0xae, 0x1f, 0x56, 0xc2, 0x1b, 0xff, 0xdd, 0x45, 0xc3, 0x71, 0x78, - 0x3e, 0xdb, 0x3a, 0xff, 0xf9, 0xb1, 0xcc, 0x03, 0xad, 0xe5, 0x08, 0xd3, - 0xaf, 0xff, 0xa5, 0xac, 0x18, 0x5b, 0xe7, 0xbd, 0x0b, 0x3a, 0xef, 0x7a, - 0x11, 0x30, 0xe9, 0x97, 0xff, 0xff, 0xa3, 0x62, 0x7b, 0x58, 0xa3, 0x7a, - 0x9e, 0xc9, 0x86, 0x17, 0x3e, 0x32, 0x75, 0xfe, 0x8f, 0x3f, 0x7e, 0x06, - 0x0e, 0xbe, 0x97, 0x92, 0x73, 0xaf, 0xdf, 0x7c, 0x30, 0x03, 0xab, 0x73, - 0xca, 0xd8, 0x45, 0x7f, 0x9e, 0x5e, 0x49, 0xfa, 0x87, 0x54, 0x1e, 0xba, - 0x12, 0xdf, 0xb3, 0xa9, 0x8b, 0x3a, 0xff, 0xe1, 0x74, 0x6f, 0x5f, 0xf9, - 0xf8, 0x87, 0x54, 0xe7, 0xd1, 0xd2, 0x5b, 0xfd, 0x28, 0xe4, 0xf1, 0xc9, - 0xce, 0xbd, 0x9c, 0x01, 0xd7, 0xe9, 0xb0, 0x2b, 0x63, 0x3a, 0xfe, 0x18, - 0x67, 0x79, 0x68, 0xea, 0x43, 0xf4, 0x98, 0x6f, 0x68, 0xae, 0xa1, 0x1b, - 0x59, 0x0a, 0x8b, 0xff, 0xff, 0xfb, 0x11, 0xb9, 0xe8, 0x1f, 0x6b, 0xe4, - 0x20, 0x71, 0x7f, 0x39, 0x09, 0x27, 0xd1, 0xd7, 0xf6, 0x79, 0xc4, 0x1f, - 0x9d, 0x7f, 0x77, 0xe2, 0x4e, 0xe2, 0x75, 0xfe, 0x85, 0xe8, 0x22, 0xec, - 0x9d, 0x52, 0x44, 0x66, 0x16, 0x09, 0x75, 0x95, 0x61, 0x2f, 0xb3, 0xc4, - 0x33, 0x27, 0x30, 0x09, 0x3e, 0x43, 0x5d, 0xa4, 0x89, 0x0e, 0x2e, 0x16, - 0xad, 0xeb, 0xb0, 0xd4, 0x78, 0x44, 0x0c, 0x3f, 0x74, 0x4d, 0xe8, 0xc4, - 0xef, 0xdc, 0x6b, 0xbb, 0x4d, 0x16, 0x05, 0xf9, 0xdb, 0xf7, 0xb3, 0x1d, - 0x65, 0x70, 0xf7, 0x74, 0x67, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0x9d, 0x6f, - 0xff, 0xf7, 0x62, 0x70, 0xe2, 0xd5, 0xd6, 0xb3, 0xa9, 0xaf, 0xe7, 0x3a, - 0xfc, 0xaa, 0xde, 0x4a, 0xe2, 0x25, 0xe6, 0x33, 0xbc, 0xa4, 0x2c, 0xeb, - 0xe7, 0x6f, 0xd5, 0x9d, 0x7a, 0x5a, 0x55, 0x43, 0x7f, 0xb0, 0x72, 0xfd, - 0xc6, 0xbb, 0xb4, 0xd1, 0x6c, 0xdf, 0xde, 0x7e, 0xfc, 0x0c, 0x1d, 0x7f, - 0xff, 0x49, 0x5d, 0x42, 0x60, 0x53, 0x35, 0x9e, 0x18, 0x3a, 0xa1, 0x10, - 0xae, 0x5d, 0x7f, 0xe0, 0x46, 0x95, 0xea, 0x35, 0xf8, 0x75, 0xff, 0x44, - 0xa3, 0x93, 0xc7, 0x27, 0x3a, 0xca, 0xe2, 0x6a, 0x0b, 0x85, 0xc3, 0x90, - 0x89, 0xf5, 0xff, 0x85, 0x55, 0xfe, 0x9e, 0x17, 0xda, 0x3a, 0xff, 0xef, - 0xf4, 0xae, 0x71, 0xf5, 0xd7, 0x91, 0xd7, 0x38, 0x31, 0x10, 0xc0, 0x41, - 0xbe, 0x6b, 0xbb, 0x4d, 0x17, 0x35, 0x96, 0x75, 0x70, 0xde, 0xb2, 0x5b, - 0x7f, 0xb8, 0x39, 0xb8, 0x12, 0x47, 0x5d, 0x32, 0xce, 0xa3, 0xac, 0xae, - 0x1f, 0xaa, 0x11, 0x32, 0x65, 0xb6, 0x2f, 0x7e, 0xe3, 0x5d, 0xda, 0x68, - 0xbb, 0xef, 0xf4, 0x95, 0xd7, 0x38, 0x8c, 0x9d, 0x65, 0x70, 0xfa, 0x1c, - 0xce, 0xf9, 0x55, 0x02, 0x03, 0xaa, 0x1f, 0x4b, 0xf7, 0x2f, 0x0f, 0x05, - 0xa6, 0xfb, 0xab, 0xa4, 0xff, 0xcf, 0x23, 0x4a, 0x5c, 0x2f, 0xde, 0x10, - 0x20, 0x8e, 0x1c, 0x61, 0x9b, 0xa8, 0x6f, 0xfa, 0x15, 0xbf, 0x49, 0xef, - 0xfc, 0xcb, 0x8c, 0xfa, 0x41, 0xde, 0x47, 0x5f, 0xfd, 0x93, 0xe3, 0x3d, - 0xcd, 0x62, 0x09, 0xd7, 0x22, 0xbd, 0x44, 0x08, 0x9f, 0xdf, 0xb5, 0xa5, - 0xbc, 0x8e, 0xbf, 0xff, 0xff, 0xf7, 0x53, 0xa9, 0x03, 0xe1, 0x75, 0x33, - 0xdf, 0xf9, 0x3d, 0xae, 0xa7, 0x22, 0x77, 0xe3, 0x4e, 0xbb, 0x50, 0x75, - 0xff, 0xdb, 0xb7, 0xf7, 0xdf, 0xd9, 0x82, 0xa1, 0xd7, 0x85, 0xd5, 0x84, - 0xc6, 0x9a, 0x4f, 0xa8, 0x4c, 0x78, 0x56, 0xf7, 0xee, 0xb3, 0xaf, 0xd9, - 0xb5, 0xe8, 0x50, 0xeb, 0x6d, 0x1d, 0x53, 0x9b, 0xdc, 0x2a, 0xae, 0x1f, - 0xd0, 0xac, 0xdf, 0xfb, 0x4e, 0xa7, 0x52, 0x07, 0xf8, 0x3a, 0xff, 0xdd, - 0x7f, 0x3f, 0x77, 0x96, 0x78, 0xea, 0xc3, 0xfb, 0x43, 0xdb, 0x9c, 0x07, - 0x5f, 0xff, 0xfe, 0x17, 0x64, 0x73, 0xde, 0xc9, 0xe0, 0x5d, 0x4d, 0x2e, - 0x30, 0x42, 0x75, 0xec, 0xfb, 0xa3, 0xab, 0x11, 0x4d, 0xc1, 0x5d, 0xa7, - 0x4b, 0xfd, 0xdc, 0x0a, 0x6c, 0xe6, 0x1d, 0x79, 0xdd, 0xa6, 0x89, 0x5e, - 0xff, 0x28, 0xe2, 0x0f, 0x67, 0x4e, 0xa6, 0x9e, 0xca, 0x13, 0xdf, 0xfe, - 0xf7, 0x72, 0x4d, 0xea, 0x06, 0x07, 0xc7, 0x54, 0x91, 0xeb, 0xc8, 0x46, - 0x09, 0x0d, 0xd2, 0x9c, 0xeb, 0xff, 0xfc, 0xfb, 0xeb, 0x39, 0xef, 0x3c, - 0xff, 0x56, 0x1e, 0xa2, 0x87, 0x5f, 0xdf, 0xef, 0xee, 0xc0, 0x0e, 0xbf, - 0xf0, 0xbb, 0x21, 0xec, 0x4f, 0x8c, 0x9d, 0x7f, 0xfe, 0xc4, 0x06, 0x2d, - 0x3d, 0xa8, 0x5b, 0xef, 0xe3, 0xaf, 0xfa, 0x17, 0xec, 0x9a, 0x49, 0xe3, - 0xaa, 0x48, 0x8b, 0xf2, 0x9d, 0xf7, 0xef, 0xc9, 0x1d, 0x7f, 0xd0, 0xd1, - 0x89, 0xc0, 0xfe, 0x3a, 0xff, 0xff, 0x27, 0x9d, 0x6e, 0x20, 0xeb, 0x2e, - 0x33, 0xb5, 0x27, 0x3a, 0x82, 0x8b, 0x94, 0x22, 0x73, 0x7b, 0xfe, 0xfc, - 0x0b, 0x79, 0x6b, 0x81, 0x3a, 0xff, 0xff, 0x62, 0x0f, 0xb0, 0x7e, 0x0b, - 0x86, 0x06, 0x78, 0xe1, 0xd6, 0xcf, 0x22, 0x5f, 0x61, 0xd5, 0xff, 0x6e, - 0x0c, 0xe6, 0x67, 0xb4, 0x75, 0x05, 0x56, 0x6e, 0x43, 0x2b, 0xb0, 0xdc, - 0x18, 0x62, 0xfd, 0x2a, 0xbf, 0xec, 0xdf, 0x41, 0x87, 0x19, 0xce, 0xbf, - 0xe7, 0x96, 0xbb, 0x1c, 0xfa, 0x13, 0xab, 0x0f, 0xcb, 0xc7, 0x17, 0xff, - 0x79, 0x36, 0x27, 0xa6, 0x94, 0x0f, 0x8e, 0xbf, 0xfc, 0xf9, 0x2e, 0xe2, - 0x0e, 0x03, 0x6f, 0x0e, 0xbc, 0xf2, 0x56, 0x17, 0xec, 0x25, 0x09, 0xc0, - 0xc3, 0x1b, 0x23, 0x27, 0x59, 0xa0, 0x05, 0xc5, 0x97, 0x52, 0xbf, 0x3d, - 0x0c, 0xdf, 0xa4, 0x3b, 0x48, 0xb7, 0xff, 0xb3, 0xaa, 0x8e, 0x05, 0x07, - 0xd9, 0xd3, 0xaf, 0x7a, 0x02, 0x55, 0xff, 0xee, 0xba, 0x7a, 0x24, 0x9c, - 0x9f, 0xf0, 0x15, 0x7f, 0x9d, 0xaa, 0x87, 0x8c, 0x15, 0x60, 0xf9, 0x74, - 0x37, 0x65, 0x42, 0xcb, 0x8c, 0x6c, 0x69, 0x0b, 0xa4, 0x3e, 0xfa, 0x19, - 0x7b, 0x21, 0x59, 0x7f, 0xf9, 0x55, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, - 0x89, 0x86, 0xff, 0xfe, 0xcd, 0x8e, 0x1e, 0xc2, 0xbe, 0xee, 0x07, 0xff, - 0x68, 0xeb, 0xff, 0xdc, 0x70, 0x2a, 0xa7, 0xa4, 0xcc, 0x6a, 0x47, 0x5d, - 0x8a, 0x8a, 0x2a, 0xfe, 0xaf, 0x5f, 0xfc, 0xc0, 0xcd, 0xe5, 0xfb, 0xf8, - 0x62, 0x47, 0x5f, 0xb1, 0x7f, 0x37, 0x63, 0x3a, 0xfe, 0x85, 0xe0, 0x23, - 0x61, 0xd4, 0x13, 0xda, 0xe9, 0x6d, 0xfe, 0xe6, 0x36, 0x01, 0xf5, 0x67, - 0x5f, 0xbb, 0x01, 0x45, 0x0e, 0xa4, 0x3f, 0xde, 0x11, 0x6d, 0x1a, 0x5f, - 0xe8, 0x79, 0xfc, 0xa3, 0xf0, 0xeb, 0xf3, 0xf2, 0x4e, 0xb3, 0xa8, 0x4f, - 0x67, 0xf3, 0x3b, 0xfd, 0xa8, 0xc1, 0x0f, 0x60, 0xeb, 0xfa, 0x30, 0x43, - 0xd8, 0x3a, 0xf7, 0xfc, 0x9b, 0xe1, 0xed, 0x68, 0xc2, 0xff, 0xf7, 0x13, - 0xfc, 0x53, 0x3d, 0xfc, 0x6e, 0x13, 0xaf, 0xff, 0xc9, 0xce, 0xbf, 0xc0, - 0xe4, 0xbb, 0x1b, 0x03, 0x07, 0x5f, 0xf3, 0x3f, 0x7b, 0x0d, 0xea, 0x4c, - 0x75, 0xf7, 0xeb, 0xc0, 0x9d, 0x6c, 0xdc, 0xf7, 0xb6, 0x8f, 0x2f, 0xe8, - 0xe4, 0x4b, 0x58, 0x75, 0x35, 0x38, 0xfe, 0x1c, 0x75, 0x30, 0x61, 0x6b, - 0xe2, 0xbb, 0xf9, 0x71, 0x83, 0xed, 0xb3, 0xad, 0xa3, 0xaf, 0xd1, 0x83, - 0xed, 0xb3, 0xaf, 0xee, 0xa7, 0xb4, 0xfb, 0xfc, 0x3e, 0x69, 0x8b, 0x96, - 0x21, 0x7f, 0xa5, 0xe8, 0x5e, 0xc0, 0x48, 0xeb, 0xff, 0xfc, 0xce, 0xd7, - 0xb3, 0xbf, 0x07, 0x27, 0x4c, 0x1d, 0xe5, 0xa3, 0xaf, 0xcc, 0xfb, 0x3a, - 0xd3, 0xac, 0x38, 0x88, 0xe7, 0x66, 0xbf, 0xfd, 0xe1, 0x70, 0x77, 0x10, - 0x3f, 0xfb, 0x47, 0x5f, 0xf4, 0x4f, 0xf6, 0x5d, 0xfd, 0xe7, 0x3a, 0xa1, - 0x10, 0xdc, 0x49, 0xbf, 0xfb, 0x37, 0x97, 0xce, 0xbb, 0x60, 0x42, 0x75, - 0xfd, 0xb3, 0xef, 0x86, 0x00, 0x75, 0xff, 0xe8, 0xf0, 0x22, 0x59, 0xbf, - 0xa7, 0xfd, 0x93, 0xaf, 0x69, 0xc0, 0x75, 0x42, 0x26, 0x10, 0xc3, 0xc9, - 0xb7, 0xf3, 0x83, 0x9c, 0x4e, 0x1d, 0x7b, 0xdf, 0x30, 0xea, 0x01, 0xe4, - 0xfd, 0x2c, 0xbf, 0xb4, 0x8a, 0x2d, 0xfc, 0x75, 0xff, 0xff, 0xb9, 0x9b, - 0x20, 0x7d, 0xf3, 0xe8, 0xc7, 0x5d, 0x3d, 0x1e, 0xd1, 0xd7, 0xf0, 0xe6, - 0xbe, 0x35, 0x84, 0x75, 0x6e, 0x8c, 0xde, 0x16, 0xec, 0x6e, 0xbe, 0xf9, - 0xb3, 0x6a, 0x73, 0xab, 0x0f, 0x75, 0x43, 0x3b, 0x31, 0x9d, 0x77, 0xb0, - 0xeb, 0xff, 0xcc, 0x11, 0x85, 0xba, 0x75, 0xfd, 0xd8, 0x3a, 0xa0, 0xf7, - 0xff, 0x15, 0xbf, 0xdd, 0x49, 0x9d, 0xba, 0x91, 0xd7, 0xf0, 0xf9, 0xd6, - 0x9e, 0x3a, 0xff, 0xc9, 0xef, 0xf8, 0xfa, 0xf8, 0xbf, 0x1d, 0x50, 0x7d, - 0x8e, 0x57, 0x7f, 0xd8, 0x98, 0xb1, 0xc9, 0xdc, 0xeb, 0xf4, 0x7b, 0x40, - 0xfc, 0xea, 0x62, 0x13, 0xb0, 0xc7, 0x26, 0x91, 0x76, 0x13, 0xe2, 0x41, - 0xe3, 0x5b, 0xff, 0xf7, 0x47, 0x3d, 0xd4, 0xcd, 0xfd, 0x9b, 0x23, 0x47, - 0x5f, 0xfc, 0xe3, 0xd8, 0x40, 0xa6, 0xb2, 0x47, 0x5e, 0x80, 0x7d, 0x3a, - 0xfe, 0xcd, 0x9d, 0x40, 0x4c, 0x75, 0x62, 0x38, 0x5d, 0x54, 0x50, 0x34, - 0x3b, 0x7b, 0xe8, 0x70, 0xeb, 0xcc, 0x1d, 0x30, 0x8e, 0xa7, 0x3c, 0x1d, - 0x0e, 0xdf, 0x7c, 0x5f, 0xc6, 0x9d, 0x7f, 0x85, 0xd9, 0x8f, 0x64, 0xe7, - 0x5f, 0xb7, 0x66, 0x6d, 0x41, 0xd6, 0x55, 0x84, 0xcd, 0x22, 0x88, 0xc7, - 0xc3, 0x08, 0xac, 0x94, 0x16, 0xd8, 0x5a, 0xee, 0xab, 0x34, 0x30, 0xf9, - 0x0a, 0xc5, 0x91, 0x76, 0x1b, 0xa0, 0x77, 0x18, 0xd3, 0xb5, 0x1e, 0x97, - 0xa3, 0x41, 0xfd, 0xed, 0x92, 0x1d, 0xb2, 0x6f, 0xa6, 0x57, 0xff, 0xdc, - 0x4d, 0xe5, 0xa4, 0xf7, 0x63, 0x9e, 0x83, 0xaf, 0xdc, 0x6b, 0xbb, 0x4d, - 0x15, 0x75, 0xee, 0x42, 0xce, 0xbf, 0xe9, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, - 0x11, 0xe5, 0xff, 0x44, 0xa3, 0x93, 0xc7, 0x27, 0x3a, 0xff, 0xd1, 0xe4, - 0xfd, 0x83, 0x92, 0x9e, 0x63, 0xac, 0xa8, 0x53, 0x5f, 0xc4, 0xfe, 0x19, - 0xb8, 0xd8, 0xa2, 0xe8, 0xe6, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x60, 0xde, - 0x52, 0x27, 0x3a, 0xff, 0xfe, 0x1f, 0xde, 0x75, 0xe6, 0xdf, 0xfc, 0xce, - 0x4b, 0xec, 0x8e, 0xbf, 0x60, 0xe7, 0xb4, 0x75, 0xfe, 0xe3, 0xaf, 0xef, - 0x1f, 0x73, 0xac, 0xae, 0x26, 0x18, 0xa1, 0x9b, 0x47, 0x5d, 0x8b, 0xe9, - 0x2d, 0xfe, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x2c, 0xab, 0xf7, 0x1a, 0xee, - 0xd3, 0x45, 0xa7, 0x7f, 0xce, 0x1e, 0xbc, 0xdd, 0x45, 0x9d, 0x65, 0x70, - 0xfa, 0xd6, 0x67, 0x7e, 0x61, 0xec, 0x51, 0x88, 0x62, 0x18, 0xb3, 0xaf, - 0xf9, 0x85, 0xd4, 0x64, 0x2e, 0xed, 0x3a, 0xfc, 0xc3, 0xd8, 0x1a, 0xc8, - 0x3a, 0xff, 0x7d, 0x5e, 0x7b, 0x49, 0xa3, 0xac, 0x87, 0x53, 0x08, 0xf0, - 0xf6, 0xcd, 0x2f, 0xff, 0xe4, 0xeb, 0x8f, 0xa5, 0x9c, 0xc8, 0x11, 0xcf, - 0x1d, 0x7e, 0xd8, 0xe1, 0xc5, 0x9d, 0x7c, 0xb8, 0xdf, 0x47, 0x5f, 0xfc, - 0x98, 0xe0, 0x89, 0x72, 0x30, 0x4e, 0xa9, 0x23, 0x7b, 0x15, 0x66, 0x28, - 0x12, 0x2b, 0xf7, 0xce, 0x73, 0xfe, 0x9d, 0x7e, 0x45, 0x20, 0x5a, 0x75, - 0xb3, 0x47, 0xa3, 0xe2, 0xbb, 0xff, 0xe1, 0x6f, 0x53, 0xa9, 0xc8, 0x99, - 0x9c, 0xe9, 0xd7, 0xfe, 0x5a, 0xde, 0x5b, 0x7f, 0xf5, 0x38, 0x75, 0xf9, - 0xf5, 0xe8, 0x09, 0xd5, 0x07, 0xd1, 0xfa, 0x15, 0x42, 0x36, 0x7b, 0x0b, - 0x7b, 0xe8, 0xfb, 0x1d, 0x3a, 0xf9, 0xae, 0xed, 0x34, 0x5b, 0x97, 0xd3, - 0x40, 0x70, 0xeb, 0xff, 0x67, 0x30, 0x7e, 0x77, 0x37, 0x64, 0xeb, 0xf0, - 0x81, 0xf7, 0xd1, 0xd5, 0x07, 0xce, 0xe8, 0x15, 0xba, 0x3d, 0xf8, 0x44, - 0xe5, 0xba, 0x84, 0x45, 0xfe, 0x71, 0x04, 0xc3, 0x0b, 0x3a, 0xf2, 0xc5, - 0x0e, 0xb0, 0x9d, 0x7f, 0xdd, 0xfd, 0xf5, 0x98, 0x2a, 0x1d, 0x7e, 0xd3, - 0xee, 0xe1, 0x3a, 0xc8, 0x13, 0xdf, 0xf1, 0xc5, 0x42, 0x2b, 0xf0, 0x6b, - 0xad, 0xd7, 0xfd, 0x0e, 0x3d, 0xcc, 0x16, 0x9d, 0x7f, 0xbd, 0xe4, 0x9d, - 0x70, 0x27, 0x54, 0x8f, 0x9b, 0x0d, 0x2f, 0xfa, 0x07, 0xf5, 0xc6, 0xbc, - 0x87, 0x5e, 0x8c, 0xe1, 0xd7, 0xfb, 0xb1, 0x24, 0xdb, 0xc5, 0x9d, 0x41, - 0x3c, 0xed, 0x0d, 0x5f, 0xbe, 0x6f, 0xa4, 0x50, 0xeb, 0x3c, 0xe7, 0x9b, - 0xb9, 0x15, 0xff, 0xd2, 0xce, 0xa7, 0x03, 0xd8, 0x16, 0x9d, 0x7f, 0xb7, - 0x94, 0x0f, 0xb0, 0x07, 0x5f, 0x68, 0x09, 0xe3, 0xa9, 0xd1, 0x7d, 0xa2, - 0x9f, 0xd0, 0xbe, 0x99, 0x5f, 0xfd, 0xe4, 0x04, 0x48, 0x3d, 0x81, 0x69, - 0xd7, 0xf7, 0xa5, 0x9c, 0xcd, 0x1d, 0x47, 0x5e, 0xfd, 0xfc, 0x75, 0xdf, - 0xc1, 0xd5, 0x23, 0x65, 0xe1, 0xca, 0x3a, 0xfb, 0x76, 0xa7, 0x0e, 0xbd, - 0x0b, 0x57, 0x11, 0x13, 0xb9, 0xe2, 0xc8, 0x7c, 0x15, 0x50, 0x9a, 0x36, - 0x21, 0x24, 0x2d, 0x6f, 0x0f, 0xb6, 0xce, 0xbd, 0xf1, 0x8b, 0x62, 0xce, - 0xbf, 0xe9, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x14, 0x3d, 0x22, 0x22, 0xe6, - 0x1e, 0x72, 0x8b, 0xf0, 0x21, 0xb8, 0xb3, 0xaf, 0xa2, 0x6c, 0x09, 0xd5, - 0xc3, 0xc7, 0xd1, 0x35, 0xff, 0x64, 0x07, 0xb1, 0xb5, 0x13, 0x1d, 0x7f, - 0x80, 0x9d, 0xee, 0x01, 0xce, 0xa5, 0x9f, 0x58, 0x0e, 0xaa, 0x11, 0x5e, - 0xf0, 0x8d, 0xbf, 0xf3, 0x86, 0x03, 0xd4, 0x14, 0x59, 0xd7, 0xfe, 0xd8, - 0xfc, 0xd3, 0xf7, 0x51, 0x39, 0xd7, 0xfb, 0x5f, 0xb7, 0x3c, 0x30, 0x75, - 0x2d, 0x15, 0xbd, 0x3b, 0xf2, 0x05, 0xff, 0xdf, 0xcb, 0xaf, 0xcd, 0xfd, - 0x09, 0x39, 0xd7, 0xfa, 0x51, 0xc9, 0xe3, 0x93, 0x9d, 0x7e, 0x7d, 0x6c, - 0xcd, 0x1d, 0x50, 0x7b, 0x80, 0x34, 0xbf, 0x27, 0xb4, 0xe8, 0x75, 0xff, - 0x70, 0x1c, 0x71, 0xf6, 0x00, 0xea, 0x01, 0xee, 0x7e, 0x4b, 0x7b, 0xef, - 0x24, 0x75, 0xfd, 0xf7, 0xdf, 0xc6, 0x4e, 0x75, 0x48, 0xf3, 0xa6, 0x1e, - 0xbf, 0xf9, 0xa3, 0x1e, 0x1c, 0xd9, 0x9c, 0x91, 0xd7, 0xfd, 0xf8, 0xa9, - 0xf7, 0xbd, 0xff, 0x47, 0x5f, 0xe1, 0x17, 0xf7, 0xd8, 0x69, 0xd7, 0xc2, - 0x09, 0xc0, 0x75, 0x61, 0xea, 0x21, 0x95, 0xfe, 0xd7, 0xcf, 0x7c, 0x0e, - 0x09, 0xd6, 0x01, 0xd6, 0x4d, 0xcf, 0x1b, 0x86, 0xd7, 0xe7, 0xdf, 0x5e, - 0x43, 0xaa, 0x13, 0xad, 0xc2, 0x34, 0x43, 0xec, 0x24, 0x85, 0x9b, 0x45, - 0x17, 0xe7, 0xfd, 0x48, 0xfa, 0x75, 0xf9, 0x85, 0x9c, 0x8d, 0x1d, 0x53, - 0x1e, 0xa0, 0x95, 0x5f, 0xf3, 0xea, 0x26, 0xde, 0x59, 0xb0, 0xeb, 0xff, - 0xf0, 0x7b, 0x1f, 0x55, 0xf0, 0xb8, 0x35, 0xa8, 0x01, 0x57, 0x07, 0x0e, - 0xbf, 0x4f, 0x13, 0xbe, 0x8e, 0xac, 0x44, 0xa2, 0x2b, 0xb8, 0xad, 0xc0, - 0xfc, 0xeb, 0xf9, 0xc1, 0x30, 0xc0, 0x4e, 0xbf, 0xe1, 0xc9, 0xc3, 0xdc, - 0x1f, 0x1d, 0x50, 0x7f, 0x5d, 0x17, 0x12, 0xcb, 0x2a, 0xc4, 0xb6, 0x44, - 0xac, 0x5a, 0x1b, 0x14, 0x3c, 0x61, 0x9c, 0xe2, 0x30, 0x79, 0x42, 0x34, - 0x31, 0x80, 0x64, 0x63, 0xca, 0x21, 0x36, 0x1c, 0x1b, 0xc2, 0x51, 0x08, - 0x66, 0x8e, 0x43, 0x91, 0xc2, 0xae, 0x17, 0xdd, 0x8c, 0x95, 0xe1, 0xa6, - 0x03, 0x01, 0x85, 0x16, 0x9f, 0x7d, 0x28, 0x7b, 0xf8, 0x56, 0xec, 0x22, - 0xdb, 0x86, 0x7f, 0xd8, 0x53, 0xdf, 0x47, 0x24, 0xb3, 0xaf, 0x3f, 0x14, - 0x3a, 0xca, 0xce, 0x6f, 0x59, 0x21, 0xbf, 0xca, 0xe7, 0x1a, 0xee, 0xd3, - 0x45, 0xe7, 0x50, 0xea, 0x22, 0x24, 0xe0, 0x18, 0xc0, 0xb2, 0x9a, 0xa5, - 0xbc, 0xa9, 0xfe, 0x46, 0xd0, 0xb5, 0x3e, 0xc2, 0xa8, 0x6b, 0x24, 0xdd, - 0x4a, 0x0a, 0xd8, 0x55, 0x7f, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x8a, 0x5a, - 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x61, 0x5f, 0xff, 0xa3, 0x04, 0x31, 0xd8, - 0xdf, 0xd8, 0x2e, 0xb3, 0xaf, 0xef, 0xf8, 0x93, 0xba, 0xce, 0xb2, 0xb8, - 0x8b, 0x25, 0x99, 0xed, 0xa8, 0xdf, 0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, - 0xcb, 0xbb, 0x8a, 0x1d, 0x7c, 0xaa, 0x8c, 0x33, 0x12, 0x75, 0x15, 0x79, - 0x5f, 0xab, 0x3a, 0x9a, 0x7a, 0xfa, 0x2e, 0xfc, 0x2a, 0x85, 0x13, 0xda, - 0x6e, 0xba, 0x3a, 0x75, 0x80, 0x75, 0xca, 0x4e, 0x75, 0xb9, 0x23, 0x51, - 0x82, 0x14, 0xd3, 0xe3, 0x73, 0xdb, 0xfe, 0x7d, 0xc7, 0x37, 0xf4, 0x28, - 0x75, 0xfe, 0x9f, 0x7d, 0x40, 0x7c, 0x87, 0x5f, 0xa3, 0x36, 0x46, 0x8e, - 0xb4, 0x39, 0xed, 0xb2, 0x69, 0x4e, 0x8b, 0xb1, 0x84, 0xa5, 0xf3, 0xca, - 0x41, 0x3a, 0xfe, 0x7e, 0x47, 0x9f, 0xa7, 0x5e, 0x65, 0x96, 0x4a, 0xbf, - 0xe8, 0x96, 0xfe, 0xe4, 0x66, 0xe5, 0x2a, 0x5f, 0xdf, 0xf7, 0xef, 0xbe, - 0x79, 0x37, 0x64, 0xeb, 0xa3, 0x47, 0x50, 0x53, 0x04, 0xe9, 0x08, 0xa5, - 0x69, 0x27, 0x61, 0xdd, 0xcc, 0x33, 0x12, 0x75, 0xfc, 0x8f, 0xa0, 0x6b, - 0xf3, 0xaf, 0xfe, 0x49, 0x3e, 0x9c, 0x7f, 0x6e, 0x68, 0xab, 0xff, 0xfb, - 0xa9, 0xee, 0xe6, 0x87, 0x17, 0xfe, 0xba, 0xf2, 0x3a, 0xff, 0x44, 0xbc, - 0xfd, 0x70, 0x9d, 0x50, 0x8c, 0xdc, 0x42, 0xe2, 0xd5, 0xa4, 0x75, 0xa4, - 0x75, 0xa4, 0x75, 0x41, 0xb0, 0x50, 0x41, 0x04, 0x2f, 0xef, 0xf5, 0xd7, - 0x96, 0x1d, 0x7f, 0xfd, 0xa4, 0x6e, 0x0f, 0x20, 0x70, 0x38, 0xa1, 0xd4, - 0xb3, 0xf9, 0xf1, 0x6d, 0xb7, 0x3a, 0xca, 0x1d, 0x6f, 0xce, 0xa1, 0x34, - 0x5a, 0x11, 0xac, 0x3f, 0x5d, 0x11, 0x78, 0xce, 0xe4, 0x83, 0xaf, 0xe1, - 0x85, 0x8c, 0x61, 0xd7, 0x4a, 0x0e, 0xa0, 0x9e, 0x94, 0xc2, 0x9f, 0x94, - 0xdf, 0xff, 0xff, 0x76, 0x3d, 0xa4, 0xd6, 0xa3, 0xdd, 0x48, 0xe0, 0x16, - 0xf2, 0x97, 0x94, 0x3a, 0xe4, 0xdc, 0xeb, 0xa1, 0x67, 0x5f, 0xff, 0xa0, - 0x7f, 0x94, 0xa3, 0xdd, 0xc5, 0xfd, 0x80, 0x1d, 0x7f, 0xfc, 0x83, 0xfc, - 0xb3, 0x5c, 0x84, 0x93, 0xe8, 0xaa, 0x92, 0x28, 0xfc, 0xad, 0x73, 0x55, - 0x85, 0xf8, 0x99, 0xe1, 0x0a, 0x18, 0x6e, 0x64, 0x65, 0x4a, 0x26, 0x34, - 0x83, 0x90, 0xfa, 0x75, 0xe1, 0x8c, 0x6f, 0x50, 0x80, 0xf1, 0x8e, 0xc7, - 0xdd, 0xb1, 0x6f, 0xb0, 0xb8, 0xbf, 0xfc, 0xaa, 0xde, 0x4a, 0xe7, 0x1a, - 0xee, 0xd3, 0x45, 0x19, 0x7e, 0xd9, 0x1c, 0x80, 0x1d, 0x7e, 0x17, 0x04, - 0x7d, 0x3a, 0xff, 0xed, 0xda, 0x9c, 0xee, 0x60, 0xcb, 0x47, 0x59, 0x58, - 0x44, 0x97, 0x4a, 0x3c, 0x4f, 0x52, 0x65, 0xd4, 0x72, 0x1e, 0x2b, 0x39, - 0x7a, 0x43, 0x36, 0xa1, 0xf3, 0xe8, 0x74, 0xdf, 0xfc, 0xab, 0xc9, 0x5c, - 0xe3, 0x5d, 0xda, 0x68, 0x8e, 0x6f, 0xff, 0x2a, 0xb7, 0x92, 0xb9, 0xc6, - 0xbb, 0xb4, 0xd1, 0x39, 0x5f, 0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0xcc, - 0xbf, 0xe9, 0x69, 0xd6, 0xaf, 0x7c, 0x03, 0xaf, 0xf9, 0x87, 0x07, 0x17, - 0x1b, 0xc2, 0xce, 0xbf, 0xdc, 0x8f, 0x75, 0xf7, 0x91, 0xd7, 0xff, 0xff, - 0xd1, 0x37, 0x63, 0xd1, 0xf5, 0x39, 0x34, 0x77, 0x36, 0x67, 0x70, 0x3b, - 0x30, 0xea, 0x02, 0x2d, 0x04, 0xce, 0xff, 0x66, 0xb9, 0xcc, 0xdf, 0x47, - 0x5f, 0xb3, 0xdc, 0xc5, 0x9d, 0x7f, 0xe4, 0x18, 0xd4, 0x7a, 0x7c, 0x64, - 0xeb, 0xfb, 0x8d, 0xeb, 0xa3, 0x04, 0xeb, 0xb7, 0x59, 0xd6, 0x55, 0x89, - 0x4f, 0xc6, 0x21, 0xe5, 0x22, 0x20, 0x99, 0xac, 0x9b, 0xf3, 0xdd, 0xb3, - 0x0b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x5b, 0xb7, 0xf0, 0xba, 0xbc, - 0x9f, 0xa7, 0x5e, 0x4d, 0xc0, 0x75, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0x90, - 0xbf, 0xf6, 0x75, 0x36, 0x77, 0x30, 0x5a, 0x75, 0xe7, 0x92, 0xb8, 0x7e, - 0x1a, 0x33, 0xb2, 0xad, 0x47, 0x6f, 0x0b, 0x97, 0x08, 0xcb, 0xff, 0x95, - 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x12, 0x95, 0x4e, 0xba, 0x89, 0x32, - 0x8a, 0xd5, 0xdc, 0xfc, 0x12, 0x8a, 0xc5, 0xe7, 0xd1, 0x96, 0x6d, 0x1e, - 0x5f, 0xe9, 0x20, 0xfb, 0x10, 0x27, 0x5e, 0xd7, 0xeb, 0x3a, 0xca, 0xee, - 0x79, 0xa8, 0x61, 0x78, 0x5e, 0x47, 0x5f, 0xf9, 0xe4, 0xae, 0x71, 0xae, - 0xed, 0x34, 0x4e, 0xd7, 0x4e, 0xc6, 0x75, 0xff, 0xf9, 0x03, 0xfa, 0xe3, - 0x69, 0xc2, 0x30, 0x38, 0xd3, 0xaf, 0xf4, 0xa3, 0x93, 0xc7, 0x27, 0x3a, - 0xff, 0xdd, 0x17, 0x97, 0xe0, 0x5b, 0xc8, 0xea, 0x83, 0xf2, 0xc3, 0x4b, - 0x2b, 0x89, 0xb2, 0xac, 0x6b, 0xa9, 0x4e, 0x34, 0x30, 0xc7, 0xbf, 0xfe, - 0x57, 0xee, 0xdb, 0x88, 0x33, 0xd0, 0x28, 0x03, 0xaf, 0xfe, 0x75, 0xf7, - 0x1a, 0xfd, 0x8f, 0xb2, 0x3a, 0xf2, 0x05, 0xce, 0xbf, 0xf8, 0x73, 0xaf, - 0x3e, 0x68, 0x5f, 0x73, 0xae, 0xdb, 0x54, 0x28, 0xa0, 0xea, 0x26, 0x86, - 0xaa, 0x4a, 0xc5, 0x17, 0x1c, 0x76, 0x95, 0x36, 0xe1, 0xe5, 0x7f, 0xff, - 0x05, 0xfc, 0xae, 0x6a, 0x07, 0x70, 0x6b, 0x50, 0x03, 0xaf, 0xdc, 0x6b, - 0xbb, 0x4d, 0x11, 0x65, 0xff, 0x9e, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, 0x44, - 0xbb, 0x7f, 0xff, 0x60, 0x7b, 0x1f, 0x55, 0xf0, 0xb8, 0x35, 0xa8, 0x01, - 0x56, 0x57, 0x11, 0xb2, 0xb3, 0x3d, 0xb4, 0xab, 0xff, 0x96, 0xf2, 0x57, - 0x38, 0xd7, 0x76, 0x9a, 0x26, 0x2b, 0xff, 0xec, 0x6c, 0x2b, 0xd7, 0x4d, - 0xb4, 0x06, 0x04, 0xea, 0x55, 0x14, 0x1d, 0x50, 0xbf, 0x71, 0xae, 0xed, - 0x34, 0x55, 0x36, 0xc3, 0xab, 0x0f, 0x09, 0x43, 0x3b, 0xff, 0x7e, 0xfc, - 0x90, 0xe3, 0x2e, 0x03, 0xaf, 0xfe, 0x7d, 0x71, 0x19, 0xf7, 0x53, 0x92, - 0x3a, 0xff, 0xb8, 0xfd, 0xde, 0x59, 0xe5, 0x42, 0x88, 0x2e, 0x9f, 0x52, - 0xa8, 0xf7, 0x78, 0x52, 0x5f, 0xfe, 0x55, 0x6f, 0x25, 0x73, 0x8d, 0x77, - 0x69, 0xa2, 0x74, 0xbf, 0xc8, 0xfc, 0x89, 0x3e, 0xc3, 0xaf, 0xd3, 0x44, - 0xd1, 0xa3, 0xaf, 0xe6, 0x71, 0x36, 0x60, 0x9d, 0x48, 0x7a, 0xba, 0x28, - 0xbc, 0x9d, 0x83, 0x95, 0x34, 0x37, 0xff, 0x7f, 0xaf, 0x46, 0xea, 0xff, - 0x32, 0x2c, 0xea, 0x59, 0xfa, 0x74, 0xae, 0xff, 0xcf, 0x25, 0x73, 0x8d, - 0x77, 0x69, 0xa2, 0x77, 0xbf, 0x7b, 0xf7, 0x5a, 0x15, 0x7f, 0xe1, 0x8f, - 0x66, 0xb3, 0x37, 0x91, 0xd4, 0x14, 0xfa, 0xf2, 0x31, 0xc5, 0x91, 0x3a, - 0x57, 0x89, 0xef, 0xf8, 0x31, 0x28, 0x55, 0x9d, 0x00, 0xeb, 0xfa, 0x15, - 0x00, 0xe0, 0x4e, 0xa5, 0x51, 0x6b, 0x89, 0xe2, 0x75, 0x7f, 0xf9, 0x55, - 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x8a, 0x16, 0xff, 0xff, 0xf7, 0x7f, - 0x5a, 0xde, 0x4a, 0xb7, 0xbf, 0xfa, 0x07, 0x27, 0x53, 0xf8, 0x98, 0xeb, - 0xf7, 0xfb, 0xf9, 0x1a, 0x75, 0xfb, 0x01, 0x8e, 0x27, 0x5f, 0x69, 0x19, - 0xf1, 0xd7, 0xa0, 0x0a, 0xce, 0x7d, 0xe2, 0x53, 0xe2, 0x4a, 0x44, 0xcb, - 0x86, 0x1d, 0xb7, 0xff, 0x95, 0x5b, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, - 0xa4, 0xaf, 0xff, 0xf6, 0x69, 0x5f, 0xb9, 0x37, 0x5d, 0x7e, 0xec, 0x7b, - 0xf5, 0x9d, 0x50, 0xc9, 0x20, 0x9e, 0x33, 0x49, 0x43, 0x65, 0xb1, 0xae, - 0xf0, 0xa1, 0x72, 0xbd, 0xc0, 0x5f, 0xe8, 0xe1, 0x7f, 0x27, 0xdb, 0x57, - 0xbf, 0xca, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0x49, 0x7f, 0xf9, 0x55, 0xbc, - 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x7a, 0xf3, 0x12, 0xb0, 0x1d, 0x7d, - 0xcf, 0xfd, 0xa3, 0xaf, 0xdc, 0x02, 0xd3, 0x47, 0x5e, 0x81, 0xdc, 0xeb, - 0xf7, 0xbe, 0xac, 0x60, 0xeb, 0x27, 0x4f, 0x0c, 0x46, 0xef, 0xff, 0x77, - 0x64, 0x08, 0x18, 0xf0, 0x39, 0xcd, 0xce, 0xba, 0x3c, 0x75, 0xff, 0xef, - 0xc2, 0x9c, 0xfb, 0x36, 0xd7, 0xee, 0x33, 0x1d, 0x52, 0x46, 0xda, 0x13, - 0x01, 0x3b, 0x42, 0xb7, 0xf0, 0x3b, 0x1c, 0x45, 0x9d, 0x7f, 0xe9, 0xb5, - 0x1b, 0x1f, 0xb1, 0xbc, 0xc7, 0x54, 0x1f, 0x73, 0x96, 0x5f, 0xb2, 0x7c, - 0xd2, 0xce, 0xbf, 0xfa, 0x6f, 0x9f, 0x46, 0x36, 0x3e, 0xc8, 0x98, 0xea, - 0x3a, 0xfe, 0x9a, 0x4f, 0xe7, 0xd8, 0x75, 0x42, 0x21, 0x71, 0x31, 0xc2, - 0xae, 0xe4, 0x1d, 0x41, 0x56, 0x40, 0x84, 0x73, 0x46, 0x8b, 0xc8, 0x55, - 0x09, 0x06, 0xc8, 0x56, 0x6d, 0x16, 0xde, 0x0e, 0x09, 0xd7, 0x07, 0x73, - 0xaf, 0xe1, 0xff, 0xd3, 0x42, 0x87, 0x5e, 0x60, 0xa7, 0x0e, 0xb2, 0x39, - 0xe7, 0x7e, 0x5f, 0x7e, 0x1c, 0x9f, 0xee, 0xc3, 0xaf, 0xb2, 0x7f, 0xbb, - 0x0e, 0xbf, 0x06, 0x37, 0x0b, 0xfc, 0x3d, 0x11, 0x2b, 0xbf, 0xfe, 0x4e, - 0x7c, 0xec, 0x27, 0xb5, 0xfb, 0x7f, 0x83, 0xaf, 0x92, 0x70, 0x31, 0x9d, - 0x7c, 0xd7, 0x76, 0x9a, 0x29, 0x7b, 0xe1, 0xf4, 0x70, 0xeb, 0xfe, 0xce, - 0x31, 0xe0, 0x73, 0x9b, 0x9d, 0x48, 0x7b, 0x7b, 0x08, 0x2a, 0x49, 0xb1, - 0x28, 0x81, 0x32, 0x97, 0x09, 0x7b, 0x08, 0x8b, 0xf8, 0x3b, 0xc7, 0x13, - 0x73, 0xaf, 0xbd, 0x3e, 0x32, 0x75, 0x21, 0xe8, 0x89, 0x75, 0xff, 0xa0, - 0x63, 0xbf, 0x3f, 0x1f, 0xda, 0x75, 0xef, 0xdf, 0x47, 0x5f, 0x4d, 0xfb, - 0xcc, 0x75, 0xfa, 0x00, 0xfb, 0xe8, 0xeb, 0xc2, 0x80, 0x3a, 0xf6, 0x7b, - 0x47, 0x54, 0x1b, 0x5d, 0x0d, 0x50, 0x51, 0xf9, 0x32, 0x07, 0x47, 0x00, - 0x49, 0xe5, 0xcb, 0xf3, 0x1b, 0x88, 0x76, 0x8e, 0xbf, 0xe0, 0x6b, 0x91, - 0xbc, 0x91, 0x67, 0x5e, 0xf3, 0xec, 0x3a, 0xfd, 0x3f, 0xf3, 0x43, 0x19, - 0xd7, 0xdf, 0xcd, 0x0c, 0x67, 0x5c, 0xf3, 0xfc, 0x3d, 0x39, 0xcb, 0x6a, - 0x11, 0xb4, 0xe7, 0x3f, 0xb8, 0x5f, 0xf2, 0x6a, 0x64, 0x1f, 0x40, 0x0e, - 0xa9, 0x1f, 0x32, 0xcb, 0xef, 0xf4, 0x31, 0xea, 0x16, 0xfe, 0x3a, 0xe7, - 0x13, 0xaf, 0xfa, 0x01, 0xf3, 0xb0, 0xb7, 0x13, 0xab, 0x73, 0xcc, 0xd8, - 0x29, 0x52, 0x45, 0x2f, 0x21, 0x01, 0x7f, 0x6f, 0x2d, 0x38, 0xee, 0x75, - 0x42, 0xa8, 0x9c, 0x8d, 0xb1, 0x21, 0x8f, 0xf4, 0xa2, 0xf7, 0x21, 0x67, - 0x5f, 0xd0, 0x33, 0x79, 0x14, 0x3a, 0xff, 0xa5, 0x9c, 0x9b, 0x06, 0x16, - 0x75, 0xf8, 0x10, 0xdc, 0x59, 0xd4, 0x87, 0xbb, 0xc3, 0x7b, 0xa5, 0x87, - 0x5f, 0x70, 0x61, 0x67, 0x5e, 0x80, 0x68, 0xea, 0x83, 0xf1, 0x09, 0x0e, - 0x0a, 0xb2, 0x41, 0x7e, 0xef, 0xea, 0x60, 0x9d, 0x7f, 0xd1, 0xdd, 0x3f, - 0xa3, 0x9b, 0x47, 0x5f, 0xf9, 0x6e, 0x1f, 0xb3, 0x4a, 0x07, 0x73, 0xa8, - 0x27, 0xf6, 0x87, 0x57, 0xdc, 0x07, 0xdd, 0x87, 0x5e, 0x46, 0x7c, 0x75, - 0x74, 0xf0, 0xb4, 0x4d, 0x41, 0x4c, 0xa3, 0xb0, 0xa3, 0xf3, 0x1d, 0xff, - 0x01, 0x3b, 0x9c, 0x79, 0xb4, 0x75, 0xff, 0xfa, 0x24, 0x31, 0x3f, 0xd9, - 0xb5, 0xdc, 0xda, 0xe0, 0x0e, 0xbf, 0xbe, 0x2f, 0x3c, 0xfe, 0x3a, 0xcd, - 0x3a, 0xed, 0xf5, 0x86, 0xf9, 0xcb, 0xaf, 0x42, 0x04, 0xea, 0xdd, 0x31, - 0x75, 0x9c, 0x3c, 0x26, 0x74, 0x59, 0x7f, 0xb1, 0x99, 0x26, 0xbf, 0x59, - 0xd7, 0x6c, 0xd1, 0xd7, 0xec, 0x9f, 0x3b, 0xa3, 0xaa, 0x0d, 0xf8, 0x8c, - 0x5e, 0xce, 0x68, 0xea, 0x69, 0xba, 0xd8, 0x3f, 0x7f, 0xc0, 0x80, 0x7d, - 0xd9, 0x03, 0xb4, 0x75, 0x42, 0x61, 0xd9, 0x0a, 0xd4, 0x23, 0xbf, 0xff, - 0xfb, 0xb1, 0xcd, 0xda, 0x9b, 0xfc, 0x51, 0xfe, 0x6b, 0xae, 0xd8, 0x10, - 0x9d, 0x7c, 0x8a, 0x6d, 0xe1, 0xd7, 0xf7, 0xdf, 0x44, 0xe3, 0xb9, 0xd7, - 0x85, 0x16, 0x75, 0x70, 0xfb, 0x80, 0x49, 0xe3, 0x0b, 0xfc, 0x30, 0xe3, - 0xec, 0x13, 0xaf, 0xf7, 0x5e, 0x64, 0xe4, 0x4e, 0x75, 0xd8, 0xb3, 0xa8, - 0x29, 0xc5, 0x64, 0x39, 0x56, 0x5e, 0xe5, 0xdb, 0x0c, 0xef, 0xdb, 0x48, - 0xb8, 0xd1, 0xd7, 0xe7, 0xd9, 0x9c, 0xd1, 0xd4, 0x13, 0xd1, 0x59, 0x4d, - 0xfb, 0xae, 0x28, 0xb3, 0xaf, 0x94, 0x9b, 0x50, 0x75, 0xfc, 0x0d, 0xc1, - 0x9c, 0xc3, 0xaf, 0xe7, 0x02, 0xe3, 0x3c, 0x75, 0x41, 0xec, 0x21, 0x6d, - 0xfe, 0x70, 0x6a, 0x3b, 0x1a, 0x3a, 0xa1, 0x31, 0x3c, 0x22, 0x42, 0x5e, - 0xbd, 0x89, 0x05, 0xc0, 0x69, 0xd6, 0xd1, 0xd7, 0x22, 0x9a, 0x34, 0xdf, - 0x8b, 0x5e, 0x03, 0xb4, 0xeb, 0xe6, 0x66, 0xd4, 0x1d, 0x7f, 0x68, 0x5e, - 0x78, 0xf1, 0xd7, 0xe9, 0xdf, 0x59, 0x23, 0xaf, 0xff, 0x83, 0x9b, 0x1f, - 0x93, 0x7d, 0x93, 0xf9, 0xd6, 0x75, 0x41, 0xfd, 0x21, 0x3d, 0xfc, 0xfb, - 0x81, 0x69, 0xa3, 0xaa, 0x13, 0x31, 0xdc, 0x6e, 0x62, 0x3e, 0x42, 0x9b, - 0xa4, 0x16, 0x55, 0x8b, 0x6d, 0x65, 0x62, 0x5a, 0x0c, 0xef, 0x52, 0x1a, - 0x0b, 0x2e, 0x47, 0xb5, 0xbc, 0x28, 0xd2, 0x31, 0xc9, 0xa5, 0x6a, 0x71, - 0x25, 0x63, 0x7d, 0x87, 0xdb, 0xc6, 0xc6, 0x08, 0xd3, 0x46, 0x35, 0x1d, - 0x47, 0x7b, 0xe8, 0xed, 0x36, 0xdb, 0x7e, 0xc6, 0xbf, 0x7f, 0x95, 0xce, - 0x35, 0xdd, 0xa6, 0x8a, 0x72, 0xff, 0xc9, 0xc7, 0xd7, 0x73, 0x05, 0xa7, - 0x5f, 0x97, 0xce, 0x66, 0x8e, 0xbf, 0xff, 0x77, 0xff, 0x72, 0x3d, 0xac, - 0x6e, 0xa3, 0x8d, 0x3a, 0xff, 0xfe, 0xf6, 0x4c, 0x29, 0xaf, 0x47, 0xd4, - 0xe4, 0xd1, 0xd3, 0xaf, 0xf2, 0x2c, 0x31, 0xaf, 0xc4, 0xeb, 0xfb, 0x3d, - 0xbc, 0xa1, 0x93, 0xaf, 0xfc, 0x9b, 0xe8, 0x70, 0x3d, 0x76, 0x4e, 0xbf, - 0xfe, 0xc9, 0xf3, 0x7f, 0x69, 0x06, 0x00, 0xeb, 0x3a, 0x94, 0x44, 0x66, - 0x8f, 0xaf, 0xfd, 0x9d, 0x8e, 0x62, 0xac, 0xb2, 0xc9, 0x57, 0x23, 0x27, - 0x5d, 0x3a, 0xa1, 0x54, 0xf7, 0x87, 0x6d, 0x27, 0x45, 0x6e, 0xae, 0x09, - 0x97, 0xa1, 0x75, 0xb6, 0x49, 0xb4, 0x83, 0x7e, 0xe3, 0x5d, 0xda, 0x68, - 0xaf, 0x2f, 0xff, 0xec, 0x0f, 0x63, 0xea, 0xbe, 0x17, 0x06, 0xb5, 0x00, - 0x2a, 0xca, 0xe2, 0x23, 0xf6, 0xcc, 0xef, 0xfe, 0x55, 0xe4, 0xae, 0x71, - 0xae, 0xed, 0x34, 0x48, 0xf7, 0x9b, 0x8b, 0x3a, 0xf2, 0x02, 0x0e, 0xbc, - 0xdc, 0x59, 0x4a, 0x97, 0x57, 0xee, 0x35, 0xdd, 0xa6, 0x89, 0x22, 0xff, - 0xfe, 0x84, 0xe2, 0x6d, 0x40, 0xcf, 0x1e, 0x4e, 0xbc, 0xe7, 0x5f, 0xfe, - 0x1c, 0x06, 0xde, 0x72, 0x27, 0x7e, 0x34, 0xeb, 0xa4, 0xac, 0x26, 0x09, - 0x85, 0x7d, 0x33, 0xf2, 0xdd, 0xfb, 0x3a, 0xae, 0x2c, 0xeb, 0x2b, 0x09, - 0xd4, 0xbc, 0x67, 0x3e, 0x49, 0xbf, 0xf9, 0x57, 0x92, 0xb9, 0xc6, 0xbb, - 0xb4, 0xd1, 0x25, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x2f, 0x1b, 0xfe, 0x92, - 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x26, 0xd9, 0x5c, 0x3f, 0x87, 0x33, 0xb9, - 0x9e, 0x9d, 0x7e, 0x40, 0x6b, 0x04, 0xeb, 0xff, 0xef, 0xdf, 0x7c, 0xc5, - 0x14, 0x79, 0x66, 0xfe, 0x3a, 0xa4, 0x7e, 0xfa, 0x25, 0xbd, 0xf4, 0x67, - 0x3a, 0xee, 0x78, 0xeb, 0xd3, 0x0c, 0xe7, 0x58, 0x4e, 0xbb, 0xef, 0xd3, - 0xa8, 0x06, 0xa7, 0xe8, 0x7d, 0xdb, 0x6a, 0xc2, 0x69, 0xb9, 0x08, 0xee, - 0x91, 0x38, 0xf6, 0x85, 0xbe, 0xa3, 0x54, 0x3a, 0x07, 0x19, 0xcf, 0xe5, - 0x5a, 0xf6, 0x06, 0x35, 0xc4, 0x95, 0x75, 0x34, 0x64, 0xab, 0x2c, 0xec, - 0x7f, 0x5e, 0x3c, 0xfe, 0x19, 0x3f, 0x63, 0x74, 0xa8, 0x9c, 0x68, 0x55, - 0x9e, 0x54, 0xbc, 0xa7, 0x81, 0x03, 0x3b, 0x91, 0x98, 0x9a, 0xb3, 0x52, - 0x73, 0x39, 0xb7, 0xbc, 0x25, 0xbd, 0x68, 0xac, 0x94, 0x9f, 0x56, 0x39, - 0x44, 0xf3, 0x5b, 0x4d, 0xae, 0x5a, 0x43, 0xb5, 0xe7, 0x28, 0x49, 0xda, - 0x55, 0xdb, 0xdb, 0x62, 0x50, 0x52, 0x14, 0xd8, 0x31, 0xf7, 0x0d, 0x6d, - 0xb7, 0xaa, 0xe3, 0x47, 0xd7, 0xb9, 0xe3, 0xfd, 0xb5, 0x85, 0xd9, 0x4c, - 0x78, 0x66, 0x76, 0xdb, 0x6e, 0x5f, 0x2f, 0xda, 0x4b, 0x6e, 0xd5, 0xa1, - 0x22, 0xa0, + 0xc8, 0x1e, 0xc3, 0x60, 0x0e, 0x20, 0x3a, 0xfc, 0xfa, 0x9d, 0x38, 0x75, + 0xff, 0xfe, 0x71, 0xde, 0x4a, 0xb3, 0x89, 0xb7, 0x07, 0x02, 0xf2, 0x3c, + 0x5e, 0xb4, 0x14, 0x4a, 0xac, 0x9e, 0xfc, 0xa7, 0x9d, 0xc4, 0xeb, 0xc3, + 0xfc, 0xe7, 0x53, 0x9e, 0x1f, 0x89, 0xa9, 0x11, 0x0e, 0x2c, 0xd5, 0x0a, + 0xab, 0x38, 0x5a, 0xb4, 0x27, 0x7f, 0x12, 0x1d, 0x0f, 0xff, 0x1a, 0xed, + 0xcc, 0x53, 0x16, 0x75, 0xe4, 0x8e, 0x1d, 0x4c, 0x23, 0x75, 0xd2, 0x0b, + 0xff, 0xb8, 0x8b, 0x86, 0x31, 0xc5, 0xef, 0x07, 0x54, 0x8f, 0xaa, 0x62, + 0x5b, 0xe4, 0x17, 0x09, 0xd7, 0xa7, 0x5a, 0x1d, 0x41, 0x37, 0x62, 0x3f, + 0x7e, 0x96, 0x6d, 0x89, 0x1d, 0x7b, 0x39, 0x07, 0x56, 0xe8, 0xc0, 0x45, + 0xee, 0x10, 0x74, 0xa2, 0xff, 0xfb, 0x3d, 0xac, 0x9b, 0xb1, 0xb7, 0x3b, + 0xd8, 0x3a, 0xff, 0xff, 0xfc, 0x99, 0xbe, 0x93, 0x19, 0xf9, 0x9b, 0xcb, + 0x49, 0xed, 0x26, 0xe1, 0x0f, 0xf3, 0x9d, 0x7f, 0xfe, 0x41, 0x0f, 0xcf, + 0xbe, 0x4d, 0x3a, 0x0f, 0xf2, 0x3a, 0x85, 0x33, 0x0f, 0x28, 0x6d, 0x84, + 0x4d, 0xef, 0xf9, 0x23, 0xaf, 0xe7, 0xf0, 0x3e, 0x8c, 0x8e, 0xbf, 0xd2, + 0xfb, 0x02, 0x3f, 0xac, 0xea, 0xf8, 0x7f, 0xf3, 0x8e, 0xb9, 0x75, 0xfe, + 0x89, 0x22, 0xac, 0xb2, 0xc9, 0x57, 0x94, 0xc0, 0x9d, 0x7f, 0x75, 0xf8, + 0xd8, 0xf1, 0xd7, 0x38, 0x4e, 0xbf, 0xb8, 0xfa, 0xeb, 0xc8, 0xeb, 0x6e, + 0x75, 0xc8, 0xc9, 0xd7, 0x7d, 0x01, 0xd5, 0x31, 0xae, 0x00, 0xb5, 0xe9, + 0x38, 0x4e, 0xb9, 0x96, 0x4e, 0xa9, 0x23, 0x57, 0x05, 0x5a, 0x58, 0x87, + 0xfa, 0x22, 0x64, 0x6e, 0xf7, 0xbe, 0x80, 0xa5, 0x4f, 0x5a, 0xff, 0xbb, + 0x8b, 0x40, 0xcf, 0xfe, 0x8e, 0xbf, 0xe4, 0x0e, 0x2d, 0x26, 0x46, 0x4e, + 0xbf, 0xfc, 0xe1, 0xcc, 0x15, 0x35, 0xac, 0x10, 0x1d, 0x7d, 0xdf, 0xdd, + 0x48, 0x3f, 0xf5, 0x9c, 0x5f, 0xff, 0xd2, 0x7d, 0x6a, 0x32, 0x7f, 0xe4, + 0x1e, 0x0b, 0xb2, 0x75, 0xa0, 0x28, 0x96, 0x43, 0xaa, 0xd2, 0x6e, 0xde, + 0x8d, 0x3e, 0xfd, 0xa7, 0x9f, 0x5d, 0x3a, 0xa4, 0xad, 0xac, 0x23, 0x9b, + 0xc6, 0xae, 0x91, 0xd3, 0x78, 0xaa, 0xfd, 0xb7, 0xef, 0x53, 0xc7, 0x5f, + 0xf6, 0x7b, 0xb1, 0xcf, 0x63, 0x4e, 0xbd, 0x1c, 0x98, 0xea, 0x85, 0xec, + 0xbc, 0x8d, 0xb5, 0x21, 0x6d, 0xd3, 0x17, 0x97, 0x42, 0x05, 0x81, 0x2b, + 0xd9, 0x37, 0xbd, 0xa7, 0x98, 0xeb, 0xff, 0x90, 0x2f, 0xe4, 0xd6, 0x4b, + 0x3a, 0x75, 0xcf, 0xb0, 0x75, 0xb3, 0xa7, 0xb3, 0xe4, 0x1a, 0xdd, 0x13, + 0x82, 0xeb, 0x78, 0x5b, 0xb0, 0x75, 0xf6, 0x6f, 0x3e, 0xd3, 0xaf, 0xf8, + 0x43, 0x83, 0xfc, 0xb3, 0x47, 0x5f, 0xef, 0xbe, 0x1c, 0x9d, 0x38, 0x75, + 0xf7, 0x93, 0x48, 0x75, 0x62, 0x33, 0xb8, 0x3c, 0xe4, 0xa2, 0x6f, 0xf9, + 0xa5, 0xff, 0x75, 0x02, 0x8c, 0x18, 0x14, 0x3a, 0xff, 0x3c, 0xb0, 0x3c, + 0xd6, 0x8e, 0xbe, 0x8c, 0xfa, 0x13, 0xaf, 0xf2, 0x89, 0xe7, 0xeb, 0x2c, + 0x67, 0x5f, 0xec, 0x9b, 0xb9, 0xa7, 0x13, 0xaf, 0xfc, 0x1c, 0xde, 0x5a, + 0xf6, 0x9c, 0x07, 0x57, 0x0f, 0xc3, 0xf3, 0x1b, 0xff, 0x91, 0x7f, 0x1b, + 0xd4, 0xeb, 0x53, 0x47, 0x5f, 0xec, 0x96, 0x7e, 0xc1, 0x71, 0x3a, 0xb8, + 0x7f, 0x5d, 0x45, 0xbf, 0xff, 0xc8, 0x39, 0xbf, 0x94, 0x7f, 0x76, 0x3b, + 0x9b, 0x5e, 0x47, 0x50, 0x55, 0x0d, 0xb4, 0xc9, 0x08, 0xb9, 0x0a, 0x7f, + 0x42, 0x77, 0x69, 0x15, 0xff, 0x05, 0x39, 0x1b, 0x41, 0xa9, 0x1d, 0x74, + 0x2c, 0xeb, 0x7a, 0x0f, 0x3f, 0xa7, 0x57, 0xfe, 0x8d, 0x3f, 0x50, 0x2d, + 0x49, 0xce, 0xa8, 0x56, 0xd7, 0x92, 0x95, 0x1e, 0x16, 0x7f, 0x93, 0xde, + 0x81, 0xf1, 0xd7, 0xf9, 0x3a, 0x9c, 0x94, 0xd0, 0x75, 0xff, 0xf9, 0x3f, + 0x6f, 0xdd, 0xc0, 0xfa, 0x7e, 0x26, 0xe0, 0x3a, 0xf9, 0xf9, 0x12, 0x3a, + 0xff, 0xfe, 0x41, 0x74, 0x10, 0x72, 0x3a, 0xe9, 0xe8, 0xe9, 0xd4, 0x27, + 0xeb, 0xe2, 0x0b, 0xf2, 0x7b, 0x5f, 0xce, 0x75, 0xff, 0xe1, 0x40, 0x7b, + 0x76, 0xa7, 0x3e, 0xc0, 0x4e, 0xbf, 0xee, 0xfd, 0x0f, 0xfe, 0xd0, 0x20, + 0xea, 0x84, 0x43, 0xba, 0x5d, 0x05, 0x3c, 0x04, 0x86, 0x72, 0xc8, 0x7d, + 0x0b, 0x0b, 0xf7, 0x3f, 0x6f, 0x60, 0xeb, 0xfb, 0x93, 0x49, 0x3d, 0xa3, + 0xac, 0x30, 0x7a, 0xd8, 0x51, 0x7f, 0xa6, 0x79, 0x9f, 0x79, 0x68, 0xeb, + 0xf9, 0xe7, 0x49, 0x91, 0x93, 0xab, 0x0f, 0x8d, 0xcd, 0x6f, 0xe9, 0xf0, + 0x67, 0xc6, 0x4e, 0xbf, 0xe8, 0x9f, 0xec, 0xbb, 0xfb, 0xce, 0x75, 0x61, + 0xf5, 0xf0, 0xba, 0xcc, 0x23, 0xaf, 0xd1, 0xce, 0x67, 0x4e, 0xbf, 0x85, + 0xd4, 0x85, 0xc1, 0xd4, 0xc0, 0x3e, 0x59, 0x0a, 0x7e, 0x4d, 0x7d, 0x13, + 0xa8, 0xa1, 0xd7, 0xff, 0xe4, 0x6c, 0x2f, 0x4f, 0xcc, 0x5f, 0xed, 0x79, + 0x1d, 0x72, 0x6d, 0x3a, 0xdd, 0x3a, 0xa4, 0x7f, 0x6c, 0x6a, 0x9f, 0x8b, + 0xde, 0x0c, 0x2c, 0xeb, 0xfd, 0x80, 0xc9, 0xa3, 0x7d, 0x1d, 0x50, 0x79, + 0xd8, 0x37, 0x7f, 0x75, 0xe5, 0x1a, 0x91, 0xd7, 0xfd, 0x9d, 0x4d, 0xf5, + 0xdf, 0xf4, 0x75, 0xd8, 0x2d, 0x3e, 0x60, 0x16, 0x5f, 0xc2, 0xe0, 0x0e, + 0x09, 0xd7, 0xe4, 0xd9, 0xce, 0x28, 0x75, 0xca, 0x48, 0xeb, 0xf7, 0x53, + 0x6a, 0x34, 0xeb, 0xb3, 0xb2, 0x37, 0xed, 0x17, 0xa5, 0xa2, 0x57, 0x65, + 0xa6, 0xf3, 0x2c, 0xb2, 0x55, 0xff, 0xb8, 0x3f, 0xbf, 0xdc, 0x9a, 0x16, + 0x72, 0xa5, 0xfd, 0xfb, 0xa9, 0x32, 0x32, 0x75, 0x9a, 0x75, 0x42, 0x22, + 0x31, 0x43, 0x85, 0x17, 0xfa, 0x03, 0x92, 0x81, 0x69, 0xd5, 0x0c, 0x83, + 0x29, 0x0d, 0x64, 0x7e, 0x4c, 0x70, 0x9d, 0x9a, 0x11, 0x1c, 0x84, 0x5a, + 0xe1, 0x0d, 0xd3, 0x47, 0x84, 0xf8, 0xc2, 0x07, 0x50, 0x86, 0xf1, 0x67, + 0xf0, 0xbf, 0x66, 0x19, 0xbf, 0x4b, 0xaf, 0xb9, 0xcc, 0xe9, 0xd7, 0xf7, + 0x53, 0x63, 0x63, 0xf5, 0x0e, 0xa8, 0x3d, 0x66, 0x90, 0xd9, 0x82, 0x75, + 0x90, 0xeb, 0xfe, 0xf4, 0x73, 0x5d, 0x81, 0xf1, 0xd6, 0x60, 0x9d, 0x7f, + 0xde, 0x8e, 0x6b, 0xb0, 0x3e, 0x3a, 0xed, 0x41, 0xd7, 0x96, 0x18, 0x3a, + 0xff, 0x0f, 0x9e, 0x6d, 0x47, 0x8e, 0xa4, 0x3c, 0xd7, 0x1b, 0xbe, 0x47, + 0xc6, 0x9d, 0x7f, 0xec, 0xda, 0x39, 0xa9, 0x86, 0x02, 0x75, 0xf3, 0x43, + 0x13, 0x9d, 0x70, 0x20, 0xeb, 0xda, 0x4e, 0x1d, 0x58, 0x7a, 0x40, 0x22, + 0xf0, 0xad, 0xfe, 0x96, 0x0a, 0x07, 0x04, 0xeb, 0xde, 0xd2, 0xb0, 0x9e, + 0xce, 0x0a, 0x4c, 0x6f, 0xd6, 0x20, 0x10, 0x08, 0xfe, 0xa1, 0x21, 0xe2, + 0xeb, 0xb5, 0x07, 0x5e, 0x58, 0x60, 0xeb, 0xfc, 0x3e, 0x79, 0xb5, 0x1e, + 0x3a, 0x90, 0xf3, 0x5c, 0x6e, 0xf9, 0x1f, 0x1a, 0x75, 0xff, 0xb3, 0x68, + 0xe6, 0xa6, 0x18, 0x09, 0xd7, 0xcd, 0x0c, 0x4e, 0x75, 0xfd, 0x30, 0x11, + 0x8d, 0xe6, 0x3a, 0xe0, 0x41, 0xd7, 0xb4, 0x9c, 0x3a, 0xb1, 0x10, 0x6d, + 0x22, 0x01, 0x8f, 0x85, 0x6f, 0xf4, 0xb0, 0x50, 0x38, 0x27, 0x5f, 0xc2, + 0xe1, 0xc5, 0x15, 0x85, 0xc8, 0x80, 0x8a, 0x60, 0x7b, 0x65, 0x08, 0x4d, + 0x08, 0x8e, 0xb1, 0x00, 0x80, 0x47, 0xf5, 0x0c, 0x1f, 0x1e, 0x5f, 0xfd, + 0xc8, 0xdf, 0x43, 0x0b, 0xcd, 0xfc, 0x75, 0xff, 0xf9, 0xc3, 0x98, 0x2a, + 0x7d, 0x18, 0x19, 0xd3, 0x87, 0x5e, 0x7e, 0x4e, 0x79, 0x04, 0xaf, 0xa5, + 0x9b, 0xc8, 0xf2, 0x09, 0x5e, 0xd2, 0x04, 0xf2, 0x09, 0x5c, 0xcb, 0x27, + 0x90, 0x4a, 0x9a, 0x8a, 0x59, 0x8a, 0x7c, 0x5e, 0xc9, 0x45, 0xcf, 0xe2, + 0xc8, 0x24, 0x54, 0xdf, 0xdf, 0xd9, 0xdc, 0xc1, 0x50, 0xeb, 0xce, 0x20, + 0xf8, 0xbe, 0x89, 0x13, 0x95, 0x3c, 0x86, 0x02, 0xd1, 0x06, 0x33, 0x8f, + 0x1a, 0x5f, 0x6c, 0xe3, 0xf4, 0xeb, 0x63, 0x1a, 0x28, 0x00, 0xfb, 0x69, + 0x1d, 0x7f, 0x4b, 0xf9, 0xfc, 0x93, 0x95, 0x7e, 0x51, 0xc3, 0xdc, 0x3a, + 0xa6, 0x3d, 0x7e, 0x98, 0x5f, 0xf4, 0x0c, 0x86, 0x00, 0xeb, 0x3a, 0xd0, + 0x75, 0xfe, 0x49, 0x7e, 0xfa, 0xea, 0x1d, 0x7f, 0x66, 0xd7, 0x5e, 0x74, + 0xeb, 0x48, 0xab, 0xcf, 0xc9, 0xca, 0xa2, 0xaa, 0x0d, 0xb3, 0x44, 0x16, + 0x39, 0x7a, 0x00, 0xd2, 0x95, 0x35, 0xb4, 0xb4, 0x5e, 0x0c, 0x24, 0x2a, + 0x13, 0x15, 0xc8, 0x77, 0x5f, 0xb8, 0x05, 0xa6, 0x8e, 0xbf, 0xbe, 0x8c, + 0xb5, 0xd0, 0x9d, 0x86, 0x9e, 0xfb, 0xf7, 0xe4, 0x8e, 0xb2, 0xce, 0xbb, + 0x24, 0x13, 0x65, 0x31, 0x15, 0xff, 0xd9, 0xbf, 0xb4, 0x83, 0x00, 0x75, + 0x9d, 0x7d, 0x93, 0x22, 0xce, 0xa9, 0xcf, 0x8d, 0x94, 0x2b, 0xf9, 0xb1, + 0x34, 0xa0, 0x05, 0x59, 0x0e, 0xbf, 0xe9, 0xff, 0x90, 0x7b, 0xfb, 0x89, + 0xd7, 0xf2, 0x42, 0xe7, 0xc6, 0x4e, 0xbf, 0x64, 0xeb, 0xc5, 0x9d, 0x7b, + 0x49, 0xc3, 0xa8, 0x4f, 0x0b, 0xc4, 0xf7, 0xf0, 0xb8, 0x01, 0xfe, 0x8e, + 0xbf, 0x91, 0x4f, 0xb0, 0xb5, 0x42, 0x98, 0x3e, 0x07, 0xf0, 0xef, 0x4d, + 0xfe, 0x21, 0xac, 0x4f, 0x21, 0x09, 0x06, 0x33, 0x4b, 0xe1, 0xc9, 0xff, + 0x3a, 0xff, 0xb3, 0xdf, 0x07, 0x01, 0xf7, 0x73, 0xaa, 0x4b, 0xb6, 0xc1, + 0x2b, 0xc6, 0x75, 0x08, 0xf8, 0x6b, 0xd8, 0xc9, 0x00, 0x9c, 0x2e, 0x1a, + 0x94, 0xb1, 0xe3, 0x4d, 0x92, 0x2b, 0xff, 0xf4, 0xfc, 0xe6, 0x05, 0xd7, + 0xd7, 0xf0, 0xc4, 0xc7, 0x5f, 0xff, 0xfe, 0xff, 0x9f, 0xcc, 0x2e, 0x0d, + 0x6b, 0x14, 0xcf, 0xf8, 0xe1, 0x8e, 0xc1, 0xd7, 0xfc, 0xaa, 0xdc, 0x3d, + 0x81, 0xfc, 0xeb, 0xed, 0x8e, 0xff, 0xf4, 0xeb, 0xcc, 0xb2, 0xc9, 0x57, + 0x4a, 0x0a, 0x54, 0xbf, 0xa8, 0x4d, 0xd2, 0x75, 0x5c, 0x7a, 0xdc, 0xe7, + 0x88, 0xf7, 0xf2, 0x91, 0xce, 0x67, 0x4e, 0xbf, 0xa7, 0x9a, 0x4c, 0x2e, + 0x4e, 0x75, 0xf2, 0x40, 0xf8, 0xeb, 0xd3, 0xb8, 0x9d, 0x5d, 0x37, 0x5e, + 0x1f, 0xbf, 0xf2, 0x9f, 0xea, 0x49, 0xc9, 0xff, 0x01, 0xd7, 0x9f, 0x76, + 0x4e, 0xa5, 0x0f, 0x83, 0xa8, 0x77, 0xe9, 0xf8, 0x90, 0xb3, 0xaf, 0xff, + 0xa3, 0xef, 0x86, 0x00, 0xfe, 0x07, 0xd1, 0x91, 0xd4, 0xc4, 0x27, 0x17, + 0x8d, 0xe9, 0x08, 0x17, 0x23, 0xf1, 0x3d, 0xf7, 0xd0, 0xf5, 0x0e, 0xbf, + 0xf3, 0xfb, 0x4c, 0xe7, 0x40, 0xfe, 0x3a, 0xff, 0xff, 0xd9, 0xe8, 0x68, + 0xe6, 0x0c, 0x4b, 0xdd, 0x75, 0x8e, 0x6d, 0x3a, 0xa7, 0x46, 0x48, 0x48, + 0xd9, 0x3e, 0xbd, 0xf4, 0x33, 0x1d, 0x7a, 0x48, 0x27, 0x5f, 0x4f, 0xf7, + 0x61, 0x93, 0xaf, 0xfa, 0x3a, 0xe9, 0xe9, 0x91, 0x93, 0xaf, 0xfc, 0x0c, + 0xe2, 0x03, 0x01, 0xc5, 0x9d, 0x7f, 0xf9, 0x48, 0xd7, 0x23, 0xa3, 0x9e, + 0x85, 0x9d, 0x7f, 0xda, 0x1c, 0xda, 0x93, 0x23, 0x27, 0x5f, 0xff, 0xdf, + 0xbc, 0xed, 0xfe, 0x7f, 0x67, 0x47, 0x3d, 0xd4, 0x3a, 0xfd, 0x13, 0x0f, + 0xfa, 0x3a, 0xb1, 0x30, 0x74, 0x48, 0xe9, 0xd7, 0x97, 0x6e, 0x41, 0x3a, + 0xfe, 0x71, 0x06, 0x79, 0x43, 0xaa, 0x15, 0x46, 0x4e, 0x65, 0x21, 0xf7, + 0x1a, 0x12, 0x9d, 0x1c, 0x7a, 0x34, 0x4d, 0xa7, 0x9b, 0x22, 0x97, 0xdd, + 0xfd, 0x70, 0x75, 0xcf, 0xa3, 0xae, 0xfd, 0x82, 0x75, 0x39, 0xe9, 0x09, + 0x17, 0xe2, 0xb7, 0x3a, 0xac, 0x07, 0xd4, 0x64, 0x62, 0xdb, 0x58, 0x50, + 0x93, 0x61, 0xe5, 0x6c, 0x48, 0x8d, 0x87, 0x1d, 0xc4, 0xe2, 0x4c, 0xf2, + 0x90, 0x65, 0x1d, 0xc0, 0x65, 0xa9, 0x65, 0x24, 0x19, 0x48, 0xce, 0xdb, + 0x28, 0x7f, 0x78, 0xdb, 0xd2, 0x52, 0x23, 0x1a, 0xc4, 0xd2, 0x8b, 0xf9, + 0x2a, 0xa1, 0x72, 0xd9, 0x7b, 0x48, 0x99, 0x78, 0xc8, 0x01, 0x0f, 0x11, + 0x97, 0x67, 0xaa, 0x43, 0xdf, 0xa9, 0xde, 0xff, 0xca, 0x1e, 0x65, 0x2f, + 0x66, 0x3b, 0x8f, 0xb2, 0xe9, 0xf6, 0x21, 0xb7, 0x7e, 0x5e, 0x23, 0x80, + 0xeb, 0xe6, 0xbb, 0xb4, 0xd1, 0x45, 0x5f, 0xff, 0x9c, 0x10, 0xde, 0xa6, + 0xba, 0x9e, 0xee, 0x09, 0xd5, 0xc3, 0xff, 0x12, 0xdb, 0xf2, 0xab, 0x79, + 0x2b, 0x08, 0xc5, 0xc8, 0x52, 0x5f, 0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, + 0xe8, 0xbf, 0xf9, 0x57, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x25, 0xdf, + 0xb8, 0xd7, 0x76, 0x9a, 0x2f, 0x2b, 0x9f, 0x69, 0xd6, 0x57, 0x0f, 0x2b, + 0x64, 0xce, 0xa1, 0xf7, 0xc4, 0xe7, 0x84, 0x3c, 0x8a, 0xb2, 0x13, 0x0d, + 0x84, 0xac, 0xc7, 0x2b, 0x3f, 0xec, 0xb5, 0x81, 0xbd, 0x4e, 0xad, 0x4b, + 0x31, 0xf2, 0x2f, 0xe7, 0xfb, 0x61, 0x37, 0x7f, 0xf9, 0x55, 0xbc, 0x95, + 0xce, 0x35, 0xdd, 0xa6, 0x89, 0x66, 0xef, 0xfa, 0x75, 0xfe, 0x40, 0xf7, + 0x10, 0x54, 0x3a, 0xfb, 0xaf, 0xef, 0xce, 0xbe, 0xec, 0x31, 0xac, 0xeb, + 0xdf, 0xb5, 0xce, 0xa9, 0x22, 0x4d, 0x0c, 0x58, 0xc8, 0xbe, 0x92, 0x5f, + 0xc1, 0xf7, 0xef, 0x2d, 0x1d, 0x7b, 0xce, 0xb3, 0xaf, 0xfd, 0xd8, 0xea, + 0x29, 0xed, 0x38, 0x0e, 0xbf, 0x87, 0xdc, 0x87, 0x69, 0xd7, 0xcd, 0x77, + 0x69, 0xa2, 0x33, 0xbf, 0x92, 0x17, 0x3e, 0x32, 0x75, 0xc3, 0x23, 0xac, + 0xb3, 0xaf, 0xc9, 0xce, 0xba, 0xbc, 0x3d, 0x25, 0x96, 0xfd, 0x15, 0xbf, + 0x9e, 0x49, 0xc7, 0xe1, 0xd7, 0xff, 0x69, 0x3f, 0xd6, 0x0f, 0xf2, 0xcd, + 0x1d, 0x7b, 0x51, 0xb9, 0xd5, 0x24, 0xf0, 0x70, 0xfb, 0x85, 0x6b, 0x7f, + 0x14, 0xed, 0x15, 0xf9, 0x12, 0xff, 0xb8, 0xec, 0xf5, 0x23, 0x90, 0x75, + 0xff, 0x4b, 0x59, 0x1f, 0x23, 0x4b, 0x3a, 0xfb, 0x7e, 0xc6, 0x8e, 0xbe, + 0xd4, 0x7b, 0x47, 0x56, 0x1e, 0x1e, 0x88, 0xaf, 0xfe, 0xf2, 0x71, 0xc1, + 0xf3, 0x79, 0x42, 0xce, 0xbf, 0x0c, 0x4b, 0x4e, 0x75, 0x21, 0xf5, 0xed, + 0x46, 0xbf, 0xff, 0xfe, 0xcf, 0x79, 0x17, 0xc4, 0xcd, 0xc7, 0xff, 0x47, + 0x7e, 0x6d, 0x4f, 0x4d, 0x07, 0x5f, 0xe7, 0x96, 0xb4, 0xe3, 0x23, 0xaf, + 0xfd, 0xe7, 0x10, 0x7c, 0xfb, 0x9b, 0xb2, 0x75, 0xf7, 0xbd, 0x0b, 0x3a, + 0xb0, 0xf9, 0x14, 0x43, 0xbf, 0xfd, 0xe8, 0x6a, 0x79, 0x17, 0x36, 0x90, + 0x4e, 0xb4, 0x8e, 0xa4, 0x3d, 0x8f, 0xa9, 0x17, 0xe0, 0x47, 0xa0, 0x27, + 0x52, 0x23, 0x0d, 0xde, 0xbf, 0x23, 0xbf, 0xfe, 0xff, 0xda, 0xde, 0x50, + 0x20, 0xd7, 0xcf, 0xc4, 0xeb, 0xd1, 0xe8, 0x3a, 0x82, 0x7d, 0xdb, 0x55, + 0x2f, 0x77, 0x04, 0xea, 0x43, 0x7d, 0xf9, 0x25, 0xdd, 0x98, 0xeb, 0xfd, + 0xbe, 0x87, 0x38, 0x18, 0x3a, 0x90, 0xf2, 0x5c, 0x5e, 0xfb, 0xcf, 0xd8, + 0x3a, 0xfb, 0xdd, 0xff, 0x64, 0xeb, 0xfd, 0x91, 0xc7, 0x92, 0x74, 0xeb, + 0xfc, 0x8c, 0xea, 0x3a, 0xec, 0x67, 0x57, 0x0f, 0x97, 0xc6, 0x15, 0xba, + 0x33, 0x50, 0x81, 0x70, 0x8b, 0xbf, 0xfc, 0x9d, 0xfd, 0x8c, 0x3d, 0xff, + 0x5b, 0xc9, 0xce, 0xac, 0x44, 0x2b, 0x9a, 0xde, 0xfb, 0x8c, 0x23, 0xaf, + 0xff, 0x7e, 0x05, 0xa0, 0xe0, 0x07, 0x1e, 0x63, 0xaf, 0xf2, 0x75, 0x20, + 0x66, 0xfc, 0xeb, 0xfc, 0x9c, 0xcc, 0x1d, 0xfc, 0x75, 0x41, 0xf1, 0xb9, + 0x95, 0xff, 0xbf, 0x0f, 0x33, 0xfe, 0xc2, 0xf0, 0xea, 0xc4, 0xca, 0xf8, + 0x43, 0xd8, 0x55, 0xe8, 0x82, 0xff, 0xfb, 0x79, 0x27, 0x03, 0xdf, 0xf9, + 0x8d, 0xee, 0x1d, 0x72, 0x32, 0x75, 0xdb, 0x18, 0x75, 0x68, 0xd7, 0x78, + 0x5a, 0xfe, 0xd4, 0x7b, 0x5d, 0x43, 0xaf, 0xc3, 0x8b, 0xe6, 0x1d, 0x7d, + 0xcd, 0xb8, 0x13, 0xab, 0x0f, 0xd1, 0x65, 0x9f, 0x92, 0xdf, 0x01, 0x37, + 0x91, 0xd7, 0xfa, 0x07, 0xc9, 0x38, 0xc1, 0xd7, 0xff, 0x93, 0x89, 0x3c, + 0x0e, 0x77, 0x9f, 0xed, 0x3a, 0x80, 0x89, 0xd1, 0x22, 0xf1, 0x85, 0x31, + 0x6c, 0xce, 0x78, 0x85, 0x54, 0xe8, 0x21, 0x2e, 0xc8, 0xf7, 0x14, 0x63, + 0xdc, 0xdd, 0x1f, 0x26, 0x84, 0x67, 0x08, 0xd7, 0x08, 0x1e, 0xc6, 0xb0, + 0xf0, 0xdb, 0x03, 0x50, 0xc6, 0xe5, 0xa8, 0xd3, 0x3c, 0x85, 0xb5, 0xff, + 0x66, 0x12, 0xbf, 0x61, 0x99, 0x7f, 0x79, 0x5e, 0xbb, 0x80, 0xeb, 0xff, + 0xff, 0xbf, 0xde, 0x4a, 0xb8, 0xfb, 0x17, 0xa0, 0xf6, 0x38, 0x17, 0x76, + 0x4e, 0xa5, 0x53, 0xf3, 0xc8, 0xd4, 0x84, 0xb6, 0xff, 0xf2, 0xab, 0x79, + 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x13, 0x4d, 0xff, 0xe5, 0x56, 0xf2, 0x57, + 0x38, 0xd7, 0x76, 0x9a, 0x27, 0x1b, 0xff, 0x3c, 0x95, 0xce, 0x35, 0xdd, + 0xa6, 0x8a, 0x06, 0xfb, 0x43, 0xbc, 0x8e, 0xb2, 0xab, 0x3e, 0xcf, 0x25, + 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x2e, 0x0b, 0xf8, 0x73, 0xcd, 0x4d, 0x1d, + 0x74, 0x21, 0xd7, 0xf8, 0x65, 0x08, 0x1c, 0x59, 0xd5, 0x88, 0xa2, 0x59, + 0x9f, 0x4a, 0xff, 0x14, 0xbf, 0x49, 0x55, 0x18, 0x0a, 0x1d, 0x4a, 0x9f, + 0x64, 0x1e, 0xdc, 0xe0, 0x3a, 0xfd, 0x34, 0xa0, 0x64, 0x75, 0x1d, 0x58, + 0x6c, 0x44, 0x9e, 0xfa, 0x01, 0x8c, 0x9d, 0x72, 0x2b, 0xc4, 0x43, 0x0a, + 0x37, 0xd1, 0xfb, 0xfe, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x24, 0xd9, + 0x5e, 0xa2, 0x09, 0xcf, 0x6e, 0x64, 0x07, 0x5f, 0xe7, 0xf0, 0xe4, 0xee, + 0x27, 0x5f, 0xd2, 0x7e, 0x4e, 0x18, 0x3a, 0xfe, 0xc1, 0x7d, 0xe5, 0xa3, + 0xaf, 0xe8, 0x5f, 0x30, 0x3e, 0x3a, 0xe7, 0x54, 0x28, 0xcc, 0x50, 0x5e, + 0x63, 0x0e, 0x16, 0xe8, 0xb2, 0xa7, 0x6d, 0x0b, 0xe5, 0x4f, 0x31, 0x69, + 0xb4, 0xca, 0xe0, 0x86, 0x1e, 0xa3, 0x37, 0xf4, 0x65, 0x5b, 0x61, 0xeb, + 0x7f, 0xe5, 0x1d, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0xb5, 0x2f, 0xfc, 0xf2, + 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x25, 0x5b, 0x91, 0x93, 0xa8, 0xeb, 0x2a, + 0xa2, 0x2d, 0x56, 0x97, 0xe4, 0xad, 0x81, 0x6b, 0xfb, 0x38, 0xd7, 0x76, + 0x9a, 0x22, 0x9b, 0xe4, 0xd4, 0x39, 0xd7, 0xf8, 0x5c, 0x1a, 0xf6, 0x34, + 0xeb, 0x96, 0xae, 0x8f, 0x43, 0xc3, 0xf4, 0xaa, 0x2d, 0xde, 0x11, 0x17, + 0xf9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x8d, 0x2e, 0xff, 0xa7, 0x5f, 0xf8, + 0x38, 0xb4, 0xe6, 0x6a, 0x68, 0x3a, 0xff, 0xff, 0x9f, 0xfd, 0x77, 0x03, + 0xf7, 0xee, 0x93, 0xef, 0x93, 0x53, 0x7d, 0x3a, 0xf2, 0x3b, 0x27, 0x52, + 0x23, 0x21, 0x8c, 0xf5, 0x6e, 0x17, 0xcd, 0x77, 0x69, 0xa2, 0x9f, 0xbb, + 0xd0, 0x75, 0x70, 0xf0, 0xbc, 0x5b, 0x7f, 0xef, 0x4d, 0x1e, 0xeb, 0xcd, + 0xf3, 0x0e, 0xbf, 0xfc, 0x8b, 0x1f, 0xfa, 0x9c, 0xcd, 0x4d, 0x07, 0x5f, + 0xfd, 0xff, 0xb9, 0xfc, 0xda, 0x6b, 0xcd, 0xa3, 0xaf, 0xfe, 0xc9, 0xbf, + 0x19, 0xf4, 0xd7, 0x9b, 0x47, 0x5f, 0x7f, 0xd4, 0xe1, 0xd6, 0x55, 0x8b, + 0x55, 0x63, 0x10, 0xdf, 0xc7, 0x44, 0x22, 0x74, 0x11, 0x49, 0xf2, 0x4e, + 0xca, 0x3d, 0xff, 0xe5, 0x56, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x26, + 0xab, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x57, 0x77, 0x2c, 0x4e, 0xbe, + 0x6b, 0xbb, 0x4d, 0x15, 0xf5, 0xe6, 0x59, 0x64, 0xab, 0x09, 0x4a, 0x97, + 0xf5, 0xc3, 0xeb, 0x5a, 0x65, 0xe9, 0x46, 0xe7, 0x5e, 0x9b, 0x3a, 0x75, + 0xff, 0xb3, 0xac, 0xbf, 0xb5, 0x19, 0x39, 0xd6, 0xf1, 0xd7, 0xfc, 0x9c, + 0xc9, 0xd2, 0x58, 0x13, 0xab, 0x87, 0x8e, 0xe2, 0x17, 0xed, 0xf6, 0x3b, + 0xff, 0xd3, 0xad, 0xc3, 0xa8, 0xeb, 0x75, 0x0b, 0xae, 0x08, 0x59, 0x59, + 0xd3, 0xee, 0xc8, 0x40, 0x4c, 0x44, 0xe3, 0x82, 0x39, 0xa8, 0x42, 0xfe, + 0x43, 0xb2, 0x93, 0x7f, 0xf9, 0x55, 0xbc, 0x95, 0xce, 0x35, 0xdd, 0xa6, + 0x89, 0xee, 0xfd, 0xd8, 0xd8, 0x7d, 0xce, 0xbf, 0x71, 0xae, 0xed, 0x34, + 0x5c, 0x36, 0x56, 0x0f, 0x77, 0x0a, 0xaf, 0xfe, 0x55, 0xe4, 0xae, 0x71, + 0xae, 0xed, 0x34, 0x49, 0xf5, 0x0c, 0x8c, 0xf9, 0xe1, 0xff, 0x22, 0x85, + 0x25, 0x78, 0x36, 0x10, 0x53, 0x2b, 0xf2, 0x51, 0x6f, 0x61, 0x0d, 0xa8, + 0x5a, 0x6d, 0x27, 0xbf, 0xca, 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0x55, 0x7e, + 0xe3, 0x5d, 0xda, 0x68, 0xa6, 0x6f, 0xe4, 0xee, 0x3e, 0xe0, 0x3a, 0xca, + 0xe1, 0xef, 0xec, 0x99, 0xdf, 0xfe, 0x55, 0x6f, 0x25, 0x73, 0x8d, 0x77, + 0x69, 0xa2, 0x67, 0xbf, 0xfc, 0xaa, 0xde, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, + 0x45, 0x1b, 0x53, 0xa6, 0xee, 0x18, 0x4f, 0x28, 0x57, 0xe5, 0x7b, 0xff, + 0x3c, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x88, 0xea, 0xff, 0xee, 0x4e, 0xae, + 0x87, 0x3d, 0xa8, 0x59, 0xd4, 0xaa, 0x23, 0xe1, 0x2a, 0xef, 0xfa, 0x75, + 0xf3, 0x5b, 0xfb, 0x4e, 0xbf, 0x60, 0x87, 0x27, 0x3a, 0xff, 0x44, 0x37, + 0x39, 0xcc, 0x3a, 0x90, 0xf5, 0x84, 0x9a, 0xfd, 0x9c, 0x6f, 0xea, 0x1d, + 0x7f, 0xe1, 0xc5, 0x1e, 0x6d, 0x76, 0x02, 0x75, 0xe9, 0x9f, 0xc7, 0x5f, + 0x35, 0xdd, 0xa6, 0x8a, 0x6a, 0xfd, 0x9b, 0xb2, 0xfd, 0x3a, 0xff, 0xed, + 0x60, 0x86, 0x3e, 0x31, 0x3d, 0xa0, 0x43, 0xa8, 0x29, 0x92, 0x21, 0x4c, + 0xc7, 0xdc, 0x1c, 0x12, 0xdd, 0x14, 0x5f, 0xff, 0xf6, 0x0f, 0xb4, 0x8d, + 0xc1, 0xd3, 0x7a, 0x9d, 0x6f, 0xd9, 0xce, 0xbf, 0xed, 0x3e, 0xf9, 0x34, + 0x77, 0x47, 0x5d, 0xd4, 0x14, 0x50, 0x79, 0x9e, 0xff, 0xe9, 0x75, 0x06, + 0x7d, 0x7f, 0x1c, 0x98, 0xeb, 0xfe, 0xd6, 0x9a, 0x9c, 0xe2, 0x4e, 0x75, + 0xff, 0x32, 0xe0, 0x7f, 0x7b, 0x3a, 0x75, 0xdd, 0xfc, 0xea, 0xc3, 0xcf, + 0x01, 0xc5, 0xfe, 0xec, 0x20, 0x1f, 0xdf, 0x9d, 0x7f, 0xe1, 0xff, 0xdd, + 0xc9, 0xa5, 0x1b, 0x9d, 0x69, 0x8e, 0xbf, 0x67, 0x5c, 0x42, 0x75, 0x4e, + 0x6d, 0x80, 0x23, 0x74, 0x28, 0x75, 0xfc, 0xe0, 0xd3, 0x0c, 0xc3, 0x30, + 0xc7, 0x5f, 0xc9, 0x0b, 0x9f, 0x19, 0x3a, 0xff, 0xfb, 0x3d, 0xdc, 0x97, + 0x1c, 0x7d, 0xd7, 0x91, 0xd7, 0x40, 0x0e, 0xbf, 0xcf, 0xbc, 0x35, 0x1a, + 0xaf, 0x11, 0x1e, 0x25, 0xbf, 0x53, 0x6b, 0x13, 0xd3, 0x47, 0x6e, 0x91, + 0x08, 0xb6, 0xa1, 0x97, 0x79, 0x97, 0x9c, 0xeb, 0xfe, 0x80, 0x3f, 0x81, + 0xf4, 0x64, 0x75, 0xbd, 0xd3, 0xd6, 0x11, 0xdb, 0x2a, 0xc5, 0xaf, 0x5b, + 0x40, 0xb8, 0x5e, 0x72, 0x34, 0x46, 0xc3, 0xdf, 0x72, 0xde, 0x23, 0x0c, + 0x22, 0x34, 0x43, 0xe9, 0x40, 0xbf, 0x61, 0x47, 0x7e, 0xe3, 0x5d, 0xda, + 0x68, 0xaa, 0xaf, 0xfc, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x26, 0xdb, + 0x2b, 0x87, 0xfa, 0xb3, 0x3b, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x57, + 0xf7, 0xee, 0x35, 0xdd, 0xa6, 0x8b, 0x1a, 0xed, 0x89, 0x1d, 0x65, 0x70, + 0xf3, 0x26, 0x33, 0xbf, 0x69, 0xbd, 0x85, 0x0e, 0xbf, 0xc3, 0xfc, 0xb3, + 0x4f, 0xe3, 0xaf, 0xe6, 0x20, 0x2c, 0x5b, 0x16, 0x2a, 0x1d, 0x7f, 0xc3, + 0xfc, 0xf3, 0x4a, 0x39, 0x39, 0xd7, 0x73, 0xc7, 0x5f, 0x3c, 0xb0, 0x27, + 0x5f, 0xde, 0xce, 0x07, 0x04, 0xeb, 0x60, 0x4f, 0x2f, 0xc4, 0x17, 0x94, + 0x96, 0x1d, 0x65, 0x71, 0x34, 0xf5, 0x99, 0x74, 0xf5, 0xcf, 0x05, 0x87, + 0x44, 0xf6, 0x45, 0x53, 0xd3, 0xe4, 0x6e, 0xf7, 0xee, 0x35, 0xdd, 0xa6, + 0x8b, 0x56, 0xff, 0xcf, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x82, 0xbf, + 0x43, 0x3b, 0x39, 0xc3, 0xac, 0xae, 0x22, 0x9d, 0x66, 0x7f, 0x52, 0xaf, + 0xf4, 0x08, 0x21, 0x8d, 0xd6, 0x75, 0xdc, 0x83, 0xaa, 0x47, 0x91, 0xb0, + 0x67, 0x7c, 0xd7, 0x76, 0x9a, 0x2e, 0x2b, 0xfb, 0xf7, 0xdc, 0x39, 0xc3, + 0xab, 0x87, 0xb7, 0xa2, 0xdb, 0xdc, 0x85, 0x9d, 0x7c, 0xfb, 0x09, 0x39, + 0xd7, 0xee, 0xfe, 0xa6, 0x09, 0xd7, 0xe0, 0xe3, 0x1c, 0x74, 0xeb, 0xdb, + 0x08, 0xd3, 0xa8, 0x27, 0xdf, 0xc2, 0x8d, 0x82, 0x9b, 0xfc, 0xb7, 0x96, + 0x90, 0x38, 0x75, 0xf4, 0x29, 0x1a, 0x3a, 0xed, 0x6c, 0x9d, 0x7f, 0xa1, + 0x6f, 0xb6, 0x39, 0xb0, 0x75, 0xfd, 0x9c, 0x7f, 0x7f, 0x07, 0x5f, 0xff, + 0x38, 0xc2, 0x6c, 0x69, 0x35, 0x9d, 0xcd, 0x93, 0xa8, 0x27, 0xfb, 0xb4, + 0xb2, 0xff, 0xe4, 0x1f, 0xe5, 0x9a, 0xd2, 0x07, 0x0e, 0xa9, 0x8f, 0x9b, + 0xc4, 0x96, 0x56, 0x15, 0x94, 0xe4, 0x20, 0x38, 0x45, 0xd1, 0xb7, 0x84, + 0x98, 0x0c, 0x84, 0xc7, 0x44, 0x3e, 0x19, 0xfb, 0x18, 0xcd, 0xf9, 0x84, + 0xc3, 0xc0, 0xa4, 0x1d, 0x7f, 0xe4, 0xdd, 0x86, 0xd7, 0x3e, 0x7c, 0xee, + 0xc9, 0xd7, 0xdd, 0x8f, 0x34, 0xea, 0x62, 0x47, 0xda, 0x14, 0xcb, 0xff, + 0xcc, 0x32, 0x8c, 0xb1, 0xce, 0x16, 0x17, 0xcf, 0x9d, 0xd9, 0x3a, 0xfd, + 0xc6, 0xbb, 0xb4, 0xd1, 0x74, 0xdf, 0xa0, 0x5c, 0x30, 0x75, 0xe8, 0xf6, + 0xc1, 0xd7, 0xd8, 0x1c, 0x09, 0xd7, 0xfc, 0xfb, 0x63, 0xda, 0xfd, 0xac, + 0x13, 0xaf, 0xb5, 0x3b, 0xfd, 0x3a, 0xca, 0xb0, 0xca, 0x88, 0x62, 0x13, + 0xf2, 0x28, 0xc6, 0x24, 0x33, 0xe9, 0x23, 0x8f, 0x09, 0x07, 0x8f, 0xef, + 0xff, 0xb0, 0x7c, 0x8b, 0xec, 0x20, 0xbf, 0x14, 0x3a, 0xfe, 0xcc, 0xd3, + 0x7d, 0x07, 0x5f, 0xd3, 0xc7, 0x9d, 0x4f, 0xce, 0xa3, 0xaf, 0xfe, 0x8e, + 0x03, 0xe6, 0xbb, 0x0b, 0x71, 0x3a, 0xff, 0x47, 0x3e, 0xf7, 0xb8, 0x03, + 0xaa, 0x47, 0xf1, 0xd4, 0x4b, 0xfa, 0x4f, 0x27, 0x16, 0x9d, 0x7f, 0xfb, + 0x3d, 0x0c, 0xfd, 0x9f, 0x58, 0xb8, 0x63, 0x3a, 0xca, 0xb1, 0x09, 0x8f, + 0x64, 0x20, 0xa6, 0x22, 0x12, 0xba, 0xe2, 0x73, 0x6b, 0x8d, 0x36, 0xfb, + 0x19, 0x62, 0x16, 0x75, 0xff, 0x27, 0x06, 0x37, 0x5b, 0xf8, 0xeb, 0xff, + 0xfe, 0xff, 0x92, 0xd7, 0x5d, 0x39, 0xce, 0x7f, 0xba, 0x71, 0xf4, 0x75, + 0xff, 0x85, 0xd9, 0xf6, 0x75, 0xe6, 0x73, 0xaf, 0xff, 0xee, 0x8f, 0xee, + 0xc7, 0x92, 0xee, 0x29, 0x81, 0x9b, 0xf3, 0xae, 0x6e, 0x1d, 0x50, 0x7e, + 0xaa, 0x30, 0x5f, 0xe7, 0xf6, 0xa3, 0xbf, 0x66, 0x3a, 0xf4, 0xa1, 0x67, + 0x5e, 0x53, 0x52, 0x3a, 0xff, 0xd2, 0xce, 0x71, 0xe5, 0x3e, 0x32, 0x75, + 0xff, 0xd8, 0x18, 0x94, 0x72, 0x3e, 0xb8, 0x9d, 0x7f, 0xed, 0xb9, 0x25, + 0x85, 0x36, 0xc0, 0x4e, 0xa5, 0xa2, 0x0d, 0xd0, 0xae, 0x75, 0x67, 0x55, + 0x1d, 0x33, 0x4f, 0x21, 0x65, 0xd2, 0x27, 0x35, 0xd0, 0xdf, 0x87, 0x7e, + 0xc3, 0x0a, 0xba, 0xad, 0x44, 0x65, 0x62, 0xdf, 0xe9, 0x67, 0xbb, 0x1f, + 0x44, 0xeb, 0xff, 0x79, 0x1a, 0x81, 0x71, 0x52, 0x0e, 0xbf, 0xe8, 0xdf, + 0xaf, 0xaf, 0x43, 0x27, 0x54, 0x1f, 0xaf, 0x0f, 0x2e, 0xff, 0xa7, 0x5f, + 0x87, 0x3a, 0xfe, 0x3a, 0xfe, 0x93, 0xe6, 0xd8, 0x09, 0xd4, 0xc0, 0x3d, + 0x26, 0x26, 0x4b, 0x7c, 0x9f, 0xca, 0x0e, 0xbf, 0x3c, 0xd2, 0x4f, 0x1d, + 0x7f, 0xe8, 0x0f, 0x22, 0x49, 0xbf, 0xb0, 0xea, 0x92, 0x21, 0x40, 0x43, + 0xe2, 0x7b, 0xff, 0x47, 0x35, 0xd4, 0x6b, 0x7f, 0x9c, 0xeb, 0xff, 0xfe, + 0x80, 0xf7, 0x37, 0xf0, 0xbf, 0x40, 0xfa, 0xd3, 0xf1, 0xa7, 0x5f, 0xec, + 0xcc, 0x51, 0x47, 0x91, 0xd4, 0xa2, 0x25, 0xfc, 0xcb, 0x7e, 0xcd, 0x37, + 0xd0, 0x75, 0xff, 0xe4, 0x67, 0x4d, 0xea, 0x6f, 0xee, 0x72, 0x0e, 0xac, + 0x3f, 0x1e, 0x13, 0x5f, 0xb6, 0xa7, 0x30, 0x27, 0x5f, 0xff, 0x6b, 0xa9, + 0xaf, 0x77, 0x02, 0x9a, 0xc1, 0x3a, 0xf7, 0x60, 0x70, 0xfd, 0x7f, 0x28, + 0xbf, 0xd0, 0xbc, 0x45, 0xc3, 0x19, 0xd7, 0xfa, 0x4b, 0xd2, 0x0e, 0xf2, + 0x3a, 0x9a, 0x7c, 0xd3, 0x19, 0xde, 0x77, 0x69, 0xa2, 0x4c, 0xbd, 0xb0, + 0x9a, 0x3a, 0x9a, 0x78, 0xbb, 0x04, 0xf7, 0xe6, 0xb0, 0xcc, 0x26, 0x21, + 0x80, 0x75, 0xfe, 0xcd, 0xfd, 0xe7, 0x96, 0x8e, 0xa8, 0x3e, 0xde, 0x1d, + 0x5f, 0xe1, 0x7f, 0x69, 0xbf, 0x89, 0xd7, 0xff, 0xf7, 0x30, 0x08, 0x06, + 0x71, 0x36, 0x8e, 0x7b, 0xa8, 0x75, 0x62, 0x23, 0x10, 0xca, 0xff, 0xff, + 0x7e, 0xfb, 0xe0, 0xc3, 0x3f, 0x7c, 0x30, 0x0c, 0xdf, 0xc7, 0x54, 0x95, + 0x61, 0xe4, 0x26, 0x38, 0xd0, 0xb8, 0x49, 0x76, 0x15, 0xba, 0x21, 0xbf, + 0x82, 0x06, 0x06, 0x81, 0xb2, 0x75, 0xed, 0x20, 0x4e, 0xbf, 0x86, 0x37, + 0x5b, 0xf8, 0xeb, 0xfe, 0x86, 0xfb, 0xfe, 0xf2, 0x19, 0x3a, 0xff, 0x35, + 0x39, 0xa9, 0xa1, 0xce, 0xbf, 0xfb, 0xfd, 0x75, 0xe5, 0xd7, 0x94, 0x09, + 0xd5, 0xb9, 0xfa, 0xf0, 0xca, 0xee, 0xa4, 0xc9, 0x8c, 0xf0, 0x6d, 0x65, + 0x9e, 0x85, 0x7d, 0xf7, 0x91, 0x6e, 0x75, 0x94, 0x3a, 0xfe, 0xee, 0xa3, + 0xd0, 0x13, 0xab, 0x0d, 0xea, 0x08, 0xd6, 0x1f, 0xe7, 0x97, 0x6f, 0xfa, + 0x3b, 0xe4, 0x9d, 0x70, 0xd3, 0xaf, 0xff, 0xce, 0xde, 0x47, 0x47, 0x3d, + 0x8a, 0xb2, 0xcb, 0x25, 0x54, 0x91, 0x61, 0xa2, 0x1f, 0x1c, 0x5f, 0xcd, + 0x6f, 0xed, 0x18, 0x3a, 0xff, 0xf6, 0x6f, 0x21, 0x89, 0x72, 0x3c, 0xfe, + 0x3a, 0xff, 0xcf, 0xe8, 0xe6, 0xbb, 0x03, 0xe3, 0xaf, 0xd9, 0x24, 0x7d, + 0xa7, 0x50, 0x9f, 0x1e, 0x8f, 0x2a, 0x48, 0xcc, 0xfe, 0x15, 0x77, 0x96, + 0xfd, 0x3a, 0xff, 0xf0, 0xc4, 0xb9, 0xcf, 0xf7, 0x4e, 0x3e, 0x8e, 0xbf, + 0xfe, 0xd6, 0x28, 0x39, 0xed, 0x64, 0x85, 0xd9, 0x3a, 0xc9, 0xd4, 0x4c, + 0x79, 0x2a, 0x91, 0x1b, 0x7b, 0x61, 0x67, 0x7d, 0xb1, 0x1d, 0xd1, 0xd5, + 0x07, 0x9b, 0x85, 0x37, 0xf7, 0x87, 0xf9, 0xf7, 0x63, 0x3a, 0xff, 0xf4, + 0x4e, 0x39, 0x93, 0xf9, 0x48, 0x19, 0x1d, 0x7f, 0xe7, 0x19, 0xfa, 0xeb, + 0x4d, 0x21, 0xd4, 0xe8, 0xb8, 0x13, 0x36, 0x52, 0x6f, 0x32, 0xcb, 0x25, + 0x5f, 0x4e, 0xb4, 0xd1, 0x4a, 0x97, 0xf7, 0x40, 0x4e, 0xb7, 0x1c, 0xf1, + 0xc4, 0xca, 0xfd, 0x18, 0x2e, 0xb3, 0xaf, 0xfc, 0xf2, 0xea, 0x6e, 0x0e, + 0x38, 0x4e, 0xbf, 0xff, 0xf3, 0x8b, 0x79, 0x9b, 0x60, 0x7c, 0xb8, 0xc1, + 0x0e, 0x6f, 0xe3, 0xa8, 0x08, 0xcc, 0x12, 0x4f, 0xcf, 0xaf, 0xf4, 0xa3, + 0x93, 0xc7, 0x27, 0x3a, 0xfe, 0xd6, 0x93, 0x04, 0x07, 0x5e, 0xe6, 0x31, + 0x9d, 0x7f, 0xe8, 0x67, 0xec, 0xfa, 0xc5, 0xc3, 0x19, 0xd5, 0xc4, 0x46, + 0xac, 0xaf, 0xc3, 0xd5, 0x08, 0xf1, 0xc8, 0x60, 0xdf, 0xff, 0xef, 0x0e, + 0x01, 0xc4, 0x1c, 0xe6, 0x33, 0x80, 0x7d, 0xce, 0xbf, 0x27, 0xa7, 0xc6, + 0x4e, 0xbf, 0xe8, 0x6f, 0x47, 0xff, 0x46, 0x8e, 0xbf, 0xf9, 0x36, 0x21, + 0xb0, 0xbc, 0x0b, 0xac, 0xeb, 0xff, 0xf7, 0xbb, 0x92, 0xf8, 0xde, 0xa7, + 0xb7, 0x6a, 0x70, 0xea, 0x44, 0xd6, 0xf8, 0xbe, 0xb2, 0x8e, 0x9c, 0x0a, + 0x25, 0xff, 0xff, 0xce, 0x9e, 0xff, 0x8f, 0xa6, 0xf5, 0x26, 0x17, 0x67, + 0xd9, 0xd5, 0x9d, 0x7f, 0xcb, 0x8e, 0x6d, 0xce, 0x44, 0xc7, 0x5f, 0xfb, + 0x8d, 0x5c, 0x6f, 0xac, 0xdb, 0x87, 0x5f, 0xe1, 0x06, 0xce, 0x07, 0x16, + 0x75, 0xfc, 0x3f, 0x36, 0x73, 0x90, 0x75, 0x42, 0x29, 0x31, 0x01, 0xcd, + 0x2f, 0xfb, 0x1c, 0x1f, 0x30, 0x2f, 0x23, 0xaf, 0xff, 0x3c, 0xfd, 0x48, + 0x1c, 0x99, 0x38, 0x87, 0x56, 0x2a, 0x45, 0xea, 0x48, 0x1c, 0xb5, 0x0d, + 0xef, 0x16, 0xb2, 0x71, 0x7e, 0x1c, 0xeb, 0xf8, 0xeb, 0xff, 0x4a, 0x06, + 0x7f, 0xbc, 0x1f, 0xe4, 0x75, 0xfc, 0x2e, 0x10, 0x6e, 0x03, 0xa9, 0x8d, + 0x12, 0x73, 0x12, 0xe9, 0x06, 0xfb, 0xd3, 0xe0, 0x4e, 0xbf, 0xe4, 0x53, + 0xef, 0x00, 0xb4, 0xd1, 0xd5, 0x31, 0xee, 0xec, 0x91, 0x5e, 0x65, 0x96, + 0x4e, 0xbf, 0xff, 0x62, 0xfc, 0x30, 0x0c, 0x0e, 0xb1, 0x70, 0xd2, 0x95, + 0x2f, 0xef, 0xfd, 0x9b, 0xfc, 0x1c, 0xdb, 0xc4, 0xd1, 0xd7, 0xf3, 0x7a, + 0x90, 0x2d, 0x3a, 0xa0, 0xfb, 0x31, 0x06, 0xff, 0x72, 0x3c, 0x8d, 0x40, + 0x9d, 0x7e, 0x94, 0xd9, 0x8d, 0x3a, 0xdc, 0x3a, 0x98, 0xa3, 0xe8, 0x83, + 0x1f, 0xa4, 0xf5, 0x8a, 0x98, 0x52, 0x12, 0x3d, 0x45, 0x18, 0x67, 0x6a, + 0x11, 0x17, 0xbd, 0x2e, 0x9d, 0x64, 0x3a, 0xfe, 0xec, 0x7c, 0x6a, 0x4e, + 0x75, 0xfd, 0xc7, 0xe0, 0xc4, 0x8e, 0xbf, 0xfe, 0x85, 0x35, 0xd7, 0x4f, + 0x42, 0xc5, 0xd4, 0x3a, 0xff, 0xd9, 0xb7, 0xa9, 0xf3, 0x5a, 0x45, 0x9d, + 0x73, 0xfa, 0x48, 0x8f, 0xea, 0x75, 0xff, 0x92, 0x49, 0xcd, 0xe0, 0x63, + 0x47, 0x53, 0x0f, 0x4d, 0x88, 0x21, 0xfc, 0x2f, 0x18, 0x5d, 0x78, 0xba, + 0xe9, 0x2a, 0xc5, 0xb7, 0x0f, 0x8c, 0x26, 0x98, 0x85, 0x8c, 0xe6, 0x12, + 0x86, 0xb8, 0x61, 0x2b, 0x92, 0xd6, 0x54, 0x67, 0x6c, 0x69, 0xdb, 0xc6, + 0xf6, 0x86, 0x13, 0x43, 0xe7, 0x91, 0xa8, 0xf6, 0x1b, 0x0f, 0x09, 0x50, + 0x43, 0xc8, 0x63, 0x21, 0xd4, 0xbc, 0x6f, 0x4b, 0x52, 0xd9, 0x58, 0xfb, + 0x1b, 0xf5, 0xff, 0xee, 0x63, 0x21, 0xee, 0x4c, 0x39, 0xc9, 0x1d, 0x7b, + 0x98, 0xc6, 0x75, 0xff, 0xa1, 0x9f, 0xb3, 0xeb, 0x17, 0x0c, 0x67, 0x57, + 0x11, 0x58, 0xb4, 0xaf, 0x0f, 0x5f, 0xff, 0x3a, 0xe3, 0x8d, 0xe7, 0xea, + 0x73, 0xf7, 0xd1, 0xd5, 0x88, 0x82, 0xfc, 0xc2, 0xff, 0x71, 0xbf, 0xb8, + 0x57, 0x07, 0x5f, 0xfd, 0x1c, 0xfb, 0xe4, 0xf7, 0x70, 0x28, 0x75, 0xff, + 0xba, 0x31, 0x3f, 0xde, 0xf5, 0xd8, 0xce, 0xa8, 0x45, 0xd4, 0xe6, 0x78, + 0x89, 0x79, 0x89, 0xb1, 0x52, 0x3a, 0xf3, 0xf2, 0x73, 0xae, 0x65, 0x93, + 0xaf, 0x3b, 0x55, 0x69, 0xb4, 0x64, 0x72, 0xfe, 0x8e, 0x3c, 0x93, 0xa7, + 0x5f, 0xb1, 0x7d, 0x70, 0x9d, 0x65, 0x61, 0xd1, 0xe6, 0x85, 0x33, 0x23, + 0xc6, 0x50, 0xa9, 0xb2, 0xde, 0x26, 0x2b, 0xe4, 0x2a, 0x1e, 0xb8, 0x9d, + 0x19, 0x57, 0xba, 0x86, 0xef, 0x8b, 0xf6, 0xad, 0xb2, 0x69, 0xb0, 0x57, + 0x52, 0x76, 0xeb, 0x81, 0x9e, 0xd9, 0xde, 0x34, 0x0e, 0x14, 0x2e, 0x11, + 0x7d, 0x8f, 0xf0, 0x10, 0xd7, 0xd4, 0xba, 0x9f, 0x4a, 0xc3, 0xfe, 0xd2, + 0x2c, 0xdf, 0xda, 0x89, 0xa4, 0x93, 0x1d, 0x7f, 0xfa, 0x27, 0xcf, 0x40, + 0xa0, 0x33, 0x7f, 0x1d, 0x65, 0x74, 0x7e, 0xdf, 0x4b, 0xaf, 0xdc, 0x6b, + 0xbb, 0x4d, 0x11, 0xad, 0xe5, 0x37, 0xd1, 0xd6, 0x57, 0x0f, 0x47, 0xc6, + 0x77, 0xff, 0xfb, 0x6c, 0x0f, 0x95, 0x7d, 0xae, 0x1c, 0x0b, 0xad, 0xc2, + 0x75, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0xa5, 0xb9, 0xda, 0x68, 0x86, 0xac, + 0xae, 0x1e, 0xab, 0x99, 0xdf, 0xb8, 0xd7, 0x76, 0x9a, 0x23, 0xeb, 0xff, + 0xe1, 0x7f, 0x4a, 0x14, 0xf9, 0x1e, 0xd4, 0x00, 0xeb, 0xcf, 0x25, 0x71, + 0x10, 0x7f, 0x4c, 0xef, 0xfc, 0xf3, 0xc7, 0x53, 0x89, 0x0b, 0x3a, 0xff, + 0x47, 0x30, 0x7d, 0x9d, 0x3a, 0xf2, 0xf1, 0x5d, 0x93, 0xec, 0xfa, 0x79, + 0x4a, 0xa3, 0x6e, 0x21, 0x45, 0x7f, 0xff, 0xd2, 0xff, 0x8a, 0x3e, 0xb0, + 0x31, 0xbe, 0xbe, 0xf9, 0x44, 0x50, 0xeb, 0xcc, 0xa8, 0xd3, 0xaf, 0xdb, + 0xef, 0x2c, 0xf1, 0xd5, 0xa3, 0xc7, 0xfc, 0x7a, 0xff, 0xf3, 0x0c, 0xa3, + 0x2c, 0x73, 0x85, 0x85, 0xf3, 0xe7, 0x76, 0x4e, 0xbf, 0x71, 0xae, 0xed, + 0x34, 0x58, 0xf7, 0xfb, 0x10, 0x67, 0xf6, 0x74, 0xeb, 0x9f, 0x47, 0x5f, + 0xd3, 0xfd, 0xe7, 0x33, 0x87, 0x54, 0x8f, 0x15, 0xc5, 0x6f, 0xf8, 0x5d, + 0x4e, 0xa4, 0x0c, 0xe7, 0x5f, 0xff, 0x81, 0x29, 0xd8, 0x68, 0x62, 0xe7, + 0x6f, 0x3e, 0x7c, 0xee, 0xc9, 0xd7, 0xfd, 0x9e, 0x1c, 0xdb, 0xd7, 0x91, + 0xd7, 0xe4, 0xf7, 0x93, 0xc7, 0x5f, 0x73, 0x99, 0xb2, 0x75, 0x61, 0xe5, + 0x39, 0x35, 0xfb, 0x39, 0x99, 0x31, 0xd6, 0x56, 0x15, 0xb6, 0x4f, 0x0b, + 0x49, 0x11, 0xe3, 0x12, 0x86, 0x68, 0xed, 0x31, 0x0f, 0x4d, 0xc5, 0xab, + 0x50, 0x82, 0xfa, 0x41, 0x79, 0x86, 0x5a, 0x87, 0x5f, 0xcc, 0x01, 0xce, + 0xbf, 0x8e, 0xbf, 0xce, 0x0d, 0x3f, 0xbc, 0xe7, 0x5c, 0xb6, 0x9d, 0x42, + 0x78, 0xfe, 0x31, 0xbf, 0xf6, 0x33, 0xcc, 0x17, 0xde, 0x5a, 0x3a, 0xfd, + 0xd7, 0x5c, 0x09, 0xd7, 0xda, 0xea, 0x32, 0x75, 0xfa, 0x19, 0xf6, 0x74, + 0xeb, 0xd1, 0xf7, 0x0e, 0xaf, 0x88, 0x8a, 0xc2, 0x51, 0x22, 0xd1, 0x3d, + 0xf0, 0x16, 0x9c, 0x3a, 0xfe, 0x4f, 0x26, 0x38, 0x9d, 0x7f, 0xff, 0xd1, + 0xc1, 0xc0, 0xe7, 0x7a, 0x8d, 0xea, 0x7b, 0x4f, 0xb9, 0xd7, 0xfc, 0xfb, + 0x8e, 0x7b, 0x58, 0xc9, 0xd4, 0x88, 0xe6, 0x63, 0x21, 0xe9, 0x4f, 0xec, + 0x97, 0xf4, 0x70, 0x1b, 0x3f, 0xf8, 0xeb, 0xfe, 0x81, 0xf3, 0x09, 0xfd, + 0xfc, 0x1d, 0x7f, 0xfa, 0x3b, 0x0b, 0x6f, 0x53, 0xd9, 0x8b, 0x3a, 0xf8, + 0x00, 0x4f, 0xa7, 0x5e, 0x77, 0x69, 0xa2, 0xd0, 0xbf, 0xf3, 0xb3, 0xb0, + 0xd7, 0xe4, 0xf8, 0xc9, 0xd7, 0xf0, 0x20, 0x63, 0xda, 0x3a, 0x9a, 0x89, + 0x5e, 0x13, 0x81, 0x0e, 0xff, 0xff, 0xf9, 0x39, 0xd7, 0x14, 0x8f, 0x27, + 0x63, 0x5d, 0xcd, 0x73, 0x1b, 0x9e, 0x3a, 0xfe, 0x89, 0xd6, 0xee, 0x27, + 0x5f, 0xff, 0xbb, 0x8c, 0xf9, 0x71, 0x9e, 0xee, 0x60, 0xb4, 0xea, 0x92, + 0xa9, 0x10, 0x98, 0xb4, 0xed, 0x11, 0xf9, 0x0b, 0x8e, 0x98, 0x69, 0xe3, + 0xc5, 0x77, 0x62, 0xce, 0xbf, 0xf9, 0xf7, 0xdb, 0xd6, 0x34, 0xf0, 0xc2, + 0xce, 0xae, 0x1e, 0xeb, 0x8a, 0xdf, 0xff, 0x93, 0xda, 0x7d, 0xf5, 0xac, + 0xea, 0x6b, 0xf9, 0xce, 0xbf, 0xfe, 0xfe, 0x7e, 0x27, 0xa7, 0xff, 0x92, + 0xd3, 0x1a, 0x1d, 0x5d, 0x45, 0x70, 0xab, 0xdf, 0xda, 0x7f, 0xb9, 0xbf, + 0x8e, 0xbf, 0xc8, 0x1c, 0x5f, 0xcc, 0x09, 0xd7, 0xff, 0xdf, 0xf3, 0x90, + 0x38, 0xa2, 0x77, 0xb9, 0xf4, 0xeb, 0x30, 0x4e, 0xae, 0x1f, 0x2f, 0xea, + 0x37, 0xf9, 0x7f, 0x8f, 0xb5, 0xff, 0x0e, 0xa9, 0x23, 0xc3, 0x90, 0x98, + 0xd9, 0x23, 0xbf, 0xf9, 0xd9, 0xf6, 0x77, 0x53, 0x66, 0x4e, 0x75, 0xfa, + 0x6e, 0xe0, 0x1c, 0xea, 0x13, 0xec, 0xda, 0x8b, 0x7f, 0xff, 0xb3, 0x3d, + 0xa8, 0x9b, 0xb1, 0xb4, 0x70, 0x3d, 0x8d, 0x1d, 0x7e, 0x16, 0xbe, 0x90, + 0xeb, 0xff, 0xfb, 0x83, 0x11, 0xbf, 0xcd, 0x78, 0x60, 0x3d, 0x8f, 0x1d, + 0x72, 0x74, 0xeb, 0xe9, 0x0b, 0xfd, 0x3a, 0xff, 0x05, 0xc1, 0xce, 0x38, + 0x0e, 0xbe, 0xe3, 0x58, 0xd9, 0x3a, 0xf9, 0x46, 0x03, 0xb2, 0x75, 0x61, + 0xe6, 0xb9, 0x35, 0x22, 0x27, 0xc5, 0xfe, 0xa1, 0x37, 0x7c, 0x25, 0x63, + 0x5b, 0x71, 0x5f, 0xe1, 0x83, 0x79, 0xd8, 0xd0, 0xeb, 0xff, 0x7d, 0xf2, + 0x88, 0xa4, 0x60, 0xc1, 0xd7, 0xef, 0xbe, 0x18, 0x01, 0xd5, 0xba, 0x21, + 0x38, 0x3b, 0xb4, 0xfe, 0xfd, 0x1e, 0xce, 0xc1, 0xd7, 0xff, 0xff, 0xba, + 0x81, 0xc4, 0x9f, 0xb1, 0x1f, 0x33, 0x79, 0x69, 0x3c, 0xe3, 0x87, 0x5f, + 0xfb, 0x37, 0x96, 0xa6, 0xe3, 0xfb, 0x47, 0x5f, 0xfe, 0xf6, 0xb2, 0x6e, + 0xc6, 0xdc, 0xef, 0x60, 0xeb, 0xfc, 0xe0, 0xd2, 0xdf, 0x7f, 0x1d, 0x58, + 0x7f, 0xce, 0x97, 0x7f, 0xc3, 0x11, 0x36, 0x6d, 0x4e, 0x1d, 0x53, 0xa7, + 0x62, 0xd2, 0x50, 0x3b, 0x0c, 0x2f, 0xbc, 0x41, 0x7e, 0xf9, 0x34, 0x92, + 0x63, 0xaa, 0x15, 0x2f, 0xe4, 0x7c, 0x88, 0xa1, 0x7f, 0xf7, 0x53, 0xe6, + 0x0e, 0x27, 0x1f, 0x69, 0xd7, 0xff, 0x20, 0xb8, 0x47, 0x03, 0xd8, 0xd1, + 0xd7, 0xbe, 0xc7, 0x0e, 0xbf, 0xff, 0xdd, 0x81, 0xc0, 0x6b, 0x03, 0xd8, + 0x9d, 0x7f, 0x88, 0x4e, 0xbf, 0x27, 0xbd, 0x12, 0x3a, 0x94, 0x4c, 0x9d, + 0xa8, 0x9c, 0x40, 0xf0, 0xee, 0xd6, 0x0b, 0xff, 0xfa, 0x26, 0xc0, 0xf6, + 0x36, 0xf7, 0x3c, 0x31, 0x0b, 0x3a, 0xfe, 0xdf, 0x5f, 0x67, 0xfc, 0x4e, + 0xbf, 0xe8, 0x6f, 0x52, 0x67, 0x79, 0xce, 0xa5, 0xa3, 0x11, 0xd6, 0x80, + 0x65, 0x7f, 0xa5, 0x1c, 0x9e, 0x39, 0x39, 0xd7, 0xfc, 0x9f, 0x8c, 0xb9, + 0x18, 0x13, 0xaf, 0xff, 0xfb, 0xb9, 0x26, 0xf5, 0x3b, 0x19, 0xc9, 0x78, + 0x61, 0x7a, 0x3a, 0xb4, 0x89, 0xbf, 0x1b, 0xdf, 0x6c, 0x47, 0x27, 0x3a, + 0xa1, 0x31, 0x7c, 0x86, 0x7b, 0x91, 0xdf, 0xee, 0x36, 0x6c, 0x4e, 0xfe, + 0x75, 0xff, 0x93, 0x68, 0xe6, 0xbc, 0xa2, 0x34, 0xeb, 0xfa, 0x1a, 0x2f, + 0xbf, 0x8e, 0xa9, 0x1f, 0x5a, 0xcf, 0xef, 0xee, 0x47, 0xa7, 0xc6, 0x4e, + 0xbc, 0xe2, 0x03, 0xaf, 0xff, 0xff, 0x93, 0xfe, 0x77, 0x26, 0x99, 0xf9, + 0x37, 0xbb, 0xf8, 0x35, 0x89, 0xb4, 0x30, 0x75, 0xfb, 0xdd, 0x71, 0x50, + 0xeb, 0xfe, 0x1f, 0xe7, 0x0f, 0x70, 0x60, 0xeb, 0x60, 0x51, 0xc5, 0x90, + 0x83, 0x69, 0x3d, 0xff, 0xee, 0x01, 0xa0, 0x1c, 0xf6, 0x9d, 0xc4, 0xea, + 0x85, 0x4d, 0x79, 0x09, 0xf4, 0x22, 0x72, 0xe1, 0x87, 0xe7, 0xe7, 0x37, + 0xfb, 0x3b, 0x32, 0x75, 0x16, 0x75, 0xfe, 0x96, 0x73, 0x43, 0x13, 0x9d, + 0x7b, 0x67, 0x27, 0x3a, 0xf6, 0x75, 0xce, 0xbf, 0x4c, 0x1f, 0xff, 0x13, + 0xa8, 0x27, 0x88, 0xe3, 0x57, 0xfb, 0x19, 0xc6, 0xb7, 0x19, 0x3a, 0xff, + 0xb7, 0x5e, 0x60, 0xfb, 0x67, 0x0e, 0xbc, 0xa4, 0xbf, 0x3a, 0xfd, 0xd8, + 0xe4, 0xeb, 0x3a, 0xff, 0x7e, 0xe3, 0xdc, 0x79, 0x8e, 0xb6, 0xf3, 0x1e, + 0xd3, 0x25, 0x14, 0x88, 0xa3, 0x77, 0x8a, 0xc4, 0xcc, 0x5c, 0xcc, 0x61, + 0xbb, 0x58, 0xa9, 0x33, 0x73, 0x24, 0x32, 0x76, 0x3d, 0x46, 0xa5, 0x78, + 0x70, 0x07, 0x5a, 0x0e, 0xa0, 0x1a, 0x9f, 0x0d, 0x5c, 0xfe, 0x3a, 0xb8, + 0x6d, 0xba, 0x43, 0x7c, 0xb8, 0xe6, 0x8e, 0xbf, 0xee, 0x67, 0x72, 0x7f, + 0x89, 0xa3, 0xab, 0x0f, 0xf1, 0x08, 0x7f, 0x21, 0xbf, 0x90, 0x7f, 0x96, + 0x68, 0xeb, 0xff, 0x67, 0xa3, 0x70, 0x3f, 0x7a, 0x87, 0x59, 0x67, 0x5f, + 0xc8, 0x3f, 0xcb, 0x35, 0xf0, 0xf3, 0x76, 0x9e, 0xd2, 0x88, 0xc1, 0xf3, + 0xcd, 0x95, 0x62, 0xdb, 0x96, 0x66, 0x11, 0x14, 0x3b, 0x4e, 0x43, 0x28, + 0x64, 0x06, 0x32, 0x3c, 0x95, 0xa2, 0xa4, 0x35, 0x1b, 0x0c, 0xfd, 0xc8, + 0x92, 0x31, 0xf9, 0xa1, 0x49, 0xc2, 0x35, 0xc7, 0xaf, 0xd9, 0x66, 0x8f, + 0x1a, 0xe0, 0x23, 0x12, 0x18, 0xd1, 0xb5, 0x2a, 0x7b, 0xd2, 0xaa, 0xf6, + 0x63, 0x2b, 0xfb, 0x0e, 0xfb, 0xfb, 0x61, 0x02, 0x31, 0x31, 0xd7, 0xa1, + 0xc4, 0xeb, 0xec, 0xeb, 0xf8, 0xeb, 0x30, 0x30, 0xfa, 0x3a, 0x5e, 0x23, + 0x37, 0xff, 0xff, 0xba, 0xe3, 0xed, 0x42, 0x4b, 0x36, 0x07, 0xd1, 0xd8, + 0x53, 0xf8, 0xd8, 0x3a, 0xfb, 0x34, 0x04, 0x3a, 0xfd, 0xc6, 0xbb, 0xb4, + 0xd1, 0x6b, 0x5f, 0xe5, 0xa2, 0xde, 0x6c, 0xe9, 0xd7, 0xf6, 0x6c, 0x69, + 0xc5, 0xa7, 0x5e, 0xe4, 0x2c, 0xeb, 0xfb, 0xb9, 0xa8, 0x9f, 0x60, 0xeb, + 0xfe, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x41, 0xd6, 0x1f, 0xab, 0x98, + 0x5f, 0x64, 0xd1, 0xe3, 0xaf, 0xfa, 0x25, 0x1c, 0x9e, 0x39, 0x39, 0xd7, + 0xff, 0xda, 0x49, 0xdf, 0x4e, 0x2f, 0xee, 0xc4, 0xc7, 0x5f, 0xf9, 0xc4, + 0x19, 0xe8, 0x14, 0x01, 0xd5, 0xe4, 0x44, 0x6c, 0xa7, 0x59, 0x56, 0x12, + 0xb1, 0xd8, 0x37, 0x93, 0xde, 0x10, 0x21, 0x9c, 0xc6, 0x5c, 0x2e, 0x5c, + 0x24, 0x3a, 0x40, 0x24, 0x3f, 0x61, 0x83, 0x7f, 0xf9, 0x55, 0xbc, 0x95, + 0xce, 0x35, 0xdd, 0xa6, 0x8a, 0x2e, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, + 0x17, 0x55, 0x43, 0xa6, 0xee, 0x93, 0xe6, 0x14, 0x36, 0x16, 0xe9, 0x1c, + 0x2a, 0xe5, 0xca, 0x76, 0xba, 0x12, 0x04, 0xe9, 0x26, 0xa1, 0x5d, 0xe5, + 0x7b, 0xf7, 0x1a, 0xee, 0xd3, 0x44, 0x43, 0x7b, 0xa8, 0x27, 0x5d, 0x81, + 0x3a, 0xcd, 0x3a, 0x9a, 0x6f, 0xfa, 0x34, 0x22, 0xb7, 0xd9, 0xb5, 0x38, + 0x75, 0xf2, 0x73, 0x37, 0x3a, 0xca, 0xe2, 0x38, 0xb7, 0x72, 0x63, 0x2d, + 0xd9, 0x22, 0xb6, 0xc9, 0xd7, 0xd1, 0xd8, 0x59, 0xd7, 0xcd, 0x77, 0x69, + 0xa2, 0x36, 0xa6, 0x9e, 0x6f, 0x08, 0x2c, 0xa8, 0x51, 0x05, 0x8c, 0x17, + 0xf9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0xa6, 0xef, 0xdc, 0x6b, 0xbb, 0x4d, + 0x15, 0x05, 0xec, 0xdd, 0x93, 0xac, 0xae, 0x1e, 0x87, 0x4c, 0xef, 0xf2, + 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x53, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x2b, + 0x0b, 0xf2, 0x32, 0x1f, 0xf8, 0x75, 0xcb, 0xd1, 0xd7, 0xf2, 0x6c, 0xbc, + 0x26, 0xc9, 0xd7, 0xf9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x8f, 0xea, 0x0f, + 0xbe, 0x46, 0x17, 0xb2, 0x27, 0x3a, 0xff, 0x66, 0xf2, 0x79, 0x20, 0x9d, + 0x73, 0xf8, 0xeb, 0x2b, 0x89, 0xb1, 0xb4, 0xcd, 0x65, 0x2f, 0x08, 0x51, + 0x21, 0xf0, 0xde, 0xc9, 0x8d, 0xff, 0xe5, 0x56, 0xf2, 0x57, 0x38, 0xd7, + 0x76, 0x9a, 0x26, 0xfb, 0xff, 0x96, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, + 0x27, 0xeb, 0xcd, 0xfa, 0xb3, 0xaf, 0xdd, 0xcf, 0x40, 0x4e, 0xa6, 0x01, + 0xe2, 0x38, 0xf5, 0xc2, 0xd3, 0xaf, 0xb5, 0x32, 0xf4, 0x75, 0xcd, 0x69, + 0xd7, 0xf9, 0xbd, 0x4f, 0x66, 0x2c, 0xeb, 0xb6, 0xb4, 0xf1, 0x81, 0x54, + 0x22, 0x91, 0x05, 0x40, 0x47, 0xa1, 0x6f, 0x18, 0xdf, 0xe6, 0x1c, 0xc5, + 0x0e, 0x4f, 0x1b, 0x9d, 0x7e, 0x62, 0x18, 0x1b, 0x39, 0xb9, 0xd7, 0xf3, + 0x14, 0xf3, 0xf5, 0x18, 0xce, 0xbf, 0x31, 0x6a, 0x29, 0x8c, 0x67, 0x5d, + 0xb5, 0xa7, 0x8c, 0x06, 0xdd, 0x3a, 0x98, 0x84, 0xc3, 0x58, 0xa3, 0xe6, + 0x01, 0xa3, 0x0e, 0x35, 0xf1, 0x8f, 0xe4, 0xb7, 0xcc, 0x5f, 0x1f, 0x0e, + 0xbe, 0x61, 0x4e, 0xbd, 0x1d, 0x7f, 0xff, 0x31, 0x62, 0xfe, 0x81, 0x6a, + 0x2c, 0x3f, 0xbf, 0x24, 0x75, 0xff, 0x3f, 0x53, 0x6a, 0xac, 0xb2, 0xc9, + 0x57, 0xfb, 0xaf, 0xef, 0x3b, 0xb2, 0x75, 0x30, 0x91, 0xea, 0xc4, 0xc9, + 0xd8, 0x92, 0xf3, 0x0e, 0x3e, 0xbf, 0xff, 0xcc, 0x43, 0x03, 0x5c, 0x84, + 0xf7, 0x70, 0x29, 0xac, 0x10, 0x1d, 0x7f, 0x31, 0xc7, 0x1d, 0xe4, 0x75, + 0xfb, 0xa8, 0xe0, 0x61, 0xc7, 0x53, 0x14, 0x8c, 0x16, 0x19, 0x9f, 0xc5, + 0xd6, 0x73, 0xaf, 0x87, 0x10, 0x07, 0x5f, 0x30, 0xf0, 0x29, 0x07, 0x53, + 0x00, 0xf1, 0xd8, 0x43, 0xf7, 0xfe, 0x88, 0x88, 0x88, 0x8d, 0xf4, 0x75, + 0xe9, 0xa3, 0xc7, 0x5d, 0x11, 0x07, 0xad, 0x31, 0xd5, 0xe4, 0xdf, 0x0e, + 0xbf, 0x71, 0x27, 0x75, 0x95, 0x73, 0x2c, 0x95, 0x58, 0x6f, 0xd9, 0x27, + 0xb7, 0xe5, 0x2a, 0x68, 0x6a, 0x11, 0x92, 0x02, 0xcd, 0x3d, 0xdf, 0x9d, + 0xc6, 0x36, 0x0e, 0xbf, 0xfc, 0x83, 0x8b, 0x8d, 0x6b, 0x25, 0xb3, 0x87, + 0x5f, 0xfd, 0x12, 0x7c, 0x0a, 0x6d, 0xd0, 0x1a, 0x75, 0xfd, 0xed, 0x66, + 0x4f, 0x07, 0x57, 0x4f, 0xc0, 0x51, 0x2f, 0xb4, 0x1f, 0x7e, 0x75, 0xfe, + 0xe7, 0xe3, 0xff, 0xbf, 0xf1, 0xd7, 0xbb, 0x02, 0x75, 0xa1, 0x0f, 0x43, + 0xc6, 0xd5, 0x08, 0xba, 0x69, 0x0f, 0x5c, 0xef, 0x0a, 0x41, 0xd7, 0xe8, + 0xfa, 0xbe, 0xa1, 0xd5, 0xc3, 0xc1, 0x11, 0x9b, 0xfb, 0xaf, 0x3c, 0x3b, + 0x4e, 0xbf, 0xa5, 0xaf, 0x60, 0xa8, 0x75, 0xe6, 0x5d, 0x93, 0xaf, 0xff, + 0x7b, 0x8f, 0x38, 0x7b, 0x1a, 0xf7, 0xfd, 0x3a, 0xec, 0x5f, 0x4f, 0xa7, + 0x43, 0xb7, 0xe7, 0x6f, 0x53, 0x87, 0x5f, 0xff, 0xfe, 0x17, 0x51, 0x39, + 0x12, 0xf9, 0xd4, 0x58, 0x63, 0xe6, 0xcf, 0xfd, 0x4e, 0x1d, 0x7c, 0xf2, + 0x4d, 0xce, 0xbf, 0xf7, 0x53, 0xd9, 0xce, 0x7f, 0x3e, 0xd3, 0xaf, 0xf9, + 0x3d, 0x9c, 0xe7, 0xf3, 0xed, 0x3a, 0xf6, 0xbf, 0x1f, 0x87, 0xfd, 0xd4, + 0x2a, 0x0a, 0x74, 0xdc, 0x2d, 0xe9, 0x30, 0xbf, 0x6a, 0x13, 0xf7, 0xfb, + 0xa9, 0xde, 0x71, 0x27, 0x3a, 0xe6, 0x7c, 0x75, 0xa0, 0xeb, 0xff, 0xe8, + 0xde, 0x4e, 0x20, 0xf8, 0x04, 0xe2, 0x28, 0x75, 0x41, 0xfb, 0xec, 0x8b, + 0xec, 0x07, 0xdf, 0x7b, 0x5d, 0x43, 0xaf, 0xa7, 0x5a, 0x48, 0xeb, 0xe8, + 0x07, 0xd5, 0x9d, 0x7c, 0x3f, 0xbc, 0x8e, 0xa6, 0x9e, 0x26, 0x88, 0xef, + 0xf7, 0x61, 0x6a, 0x80, 0x10, 0x75, 0x42, 0x2e, 0xf1, 0x99, 0x08, 0xaf, + 0xe9, 0x93, 0xbe, 0xc6, 0x9d, 0x58, 0x99, 0xb7, 0x21, 0xb8, 0xe5, 0xb7, + 0xfd, 0xb8, 0x7e, 0xc3, 0x1f, 0x7f, 0xd1, 0xd7, 0x3f, 0x4e, 0xbc, 0xa4, + 0x78, 0xeb, 0xff, 0xf0, 0x7b, 0x1c, 0x40, 0x47, 0xd8, 0x98, 0x61, 0x67, + 0x5f, 0xe5, 0x20, 0x7d, 0xa7, 0xe9, 0xd4, 0x88, 0x87, 0x75, 0x5b, 0xf0, + 0xe3, 0x8c, 0xe7, 0x54, 0x26, 0x7c, 0x88, 0x0e, 0x2a, 0x30, 0xa3, 0xd1, + 0x0d, 0xfe, 0xec, 0x4f, 0xc8, 0xc0, 0x9d, 0x7f, 0xfc, 0x39, 0xb5, 0xaf, + 0xc9, 0xdf, 0xcf, 0xb8, 0x0e, 0xa8, 0x44, 0x1b, 0x99, 0x5f, 0xe1, 0x79, + 0xf7, 0x94, 0x6c, 0x1d, 0x7f, 0xb5, 0xd7, 0xfb, 0xd8, 0x91, 0xd5, 0x39, + 0xf5, 0x6e, 0x6d, 0x7b, 0x32, 0x63, 0xaf, 0xff, 0xd3, 0x76, 0x16, 0x9c, + 0x4d, 0x88, 0xfb, 0x3e, 0x32, 0x75, 0xff, 0x93, 0x91, 0xaf, 0xa2, 0x31, + 0xc3, 0xaf, 0xfa, 0x24, 0x2f, 0xe9, 0x26, 0xd3, 0xaf, 0x7d, 0x80, 0x1d, + 0x5d, 0x3d, 0x5d, 0x1c, 0x59, 0x8c, 0xeb, 0xde, 0x96, 0x1d, 0x76, 0xb0, + 0xeb, 0xff, 0xb5, 0x1c, 0x6f, 0x87, 0x27, 0x71, 0x3a, 0xa1, 0x39, 0x49, + 0xd6, 0xf2, 0x12, 0x48, 0x44, 0xe2, 0x60, 0x1b, 0xf0, 0xad, 0xfd, 0xfc, + 0xdf, 0xfa, 0x3a, 0x75, 0xff, 0xc1, 0x8f, 0x3e, 0xb3, 0xbd, 0x45, 0x9d, + 0x7f, 0xa7, 0x0c, 0x3f, 0x01, 0xf9, 0xd7, 0xbc, 0x93, 0x1d, 0x50, 0x89, + 0x2c, 0x42, 0xd1, 0xa5, 0xfa, 0x18, 0xd1, 0x96, 0x9d, 0x50, 0xcd, 0x45, + 0x9c, 0xbe, 0x44, 0xe1, 0x8d, 0xcf, 0x1c, 0x1a, 0x43, 0xb9, 0x62, 0x4a, + 0x3c, 0x63, 0x4f, 0x9a, 0x15, 0x5c, 0x8d, 0xa9, 0x71, 0xb9, 0x76, 0x19, + 0xef, 0x08, 0xb0, 0x12, 0x0c, 0x75, 0xfa, 0x67, 0xf4, 0x30, 0xbe, 0x97, + 0x5f, 0xff, 0xf3, 0x13, 0x61, 0x46, 0x31, 0x2e, 0x30, 0x98, 0x6d, 0xac, + 0x6c, 0x3b, 0xff, 0x9f, 0x3b, 0xb2, 0x75, 0xe9, 0xbe, 0xac, 0xeb, 0xfe, + 0xcf, 0x6b, 0x3d, 0xdc, 0x01, 0xd4, 0xe7, 0xac, 0x23, 0xf7, 0x38, 0x9d, + 0x5c, 0x36, 0x8b, 0x20, 0xbe, 0x8f, 0x62, 0xce, 0xbf, 0x7a, 0x05, 0x00, + 0x75, 0xfd, 0x8c, 0xb8, 0x17, 0x87, 0x57, 0xc3, 0xf1, 0xc2, 0x01, 0x25, + 0xbf, 0xf3, 0x21, 0x18, 0x67, 0x67, 0x39, 0x07, 0x5f, 0xb9, 0x3c, 0x7b, + 0x47, 0x5f, 0x3f, 0x1e, 0x47, 0x5b, 0x98, 0x79, 0x02, 0x51, 0x79, 0x96, + 0x59, 0x3a, 0xfa, 0x71, 0x48, 0x29, 0x52, 0xfe, 0xff, 0x98, 0xfa, 0xe3, + 0x20, 0xc4, 0xe7, 0x5d, 0xbc, 0x8e, 0xbf, 0xca, 0x47, 0xb5, 0xd7, 0xfc, + 0xeb, 0xf2, 0x4f, 0x9b, 0xf8, 0xeb, 0x91, 0xa7, 0x54, 0x22, 0x21, 0x41, + 0x75, 0x9a, 0x78, 0xa2, 0xfc, 0xa3, 0xeb, 0x6c, 0x8e, 0xad, 0xcf, 0x9f, + 0xc7, 0xb4, 0xc3, 0x2e, 0x15, 0x44, 0x63, 0xc1, 0x84, 0x96, 0x17, 0xa4, + 0x22, 0x7a, 0x8a, 0xe6, 0x1f, 0xc6, 0x55, 0x7f, 0xf6, 0xd6, 0x73, 0x42, + 0x91, 0xcc, 0x9c, 0xeb, 0xff, 0xff, 0xff, 0x31, 0xfc, 0xee, 0x6f, 0x2e, + 0xaf, 0xe3, 0x7b, 0xff, 0xbd, 0x83, 0xdc, 0xf4, 0x07, 0xe7, 0xce, 0xec, + 0x9d, 0x7f, 0xc1, 0xcf, 0xd8, 0x29, 0xd7, 0x59, 0xd7, 0xe8, 0x58, 0xe4, + 0xc7, 0x61, 0xbc, 0xbd, 0xb7, 0x02, 0x75, 0xfd, 0xd4, 0x81, 0xfe, 0x0e, + 0xbf, 0xd0, 0xc6, 0xa6, 0x69, 0xd8, 0xce, 0xa5, 0x0f, 0x8f, 0xa5, 0x75, + 0xd4, 0x51, 0xbc, 0x20, 0x28, 0x28, 0xff, 0xd4, 0x36, 0x2f, 0xe8, 0x97, + 0x63, 0x6a, 0x1d, 0x7e, 0x5f, 0xe3, 0x0b, 0x3a, 0xfb, 0x9f, 0xbe, 0x8e, + 0xa8, 0x3c, 0x97, 0x27, 0xba, 0x5e, 0x3a, 0xfa, 0x68, 0xf3, 0x9d, 0x7d, + 0xf8, 0x30, 0x5a, 0x6d, 0xff, 0x16, 0xb4, 0x8e, 0xa9, 0xcf, 0x27, 0xa7, + 0x37, 0xff, 0x47, 0x7e, 0x87, 0xc9, 0x93, 0x42, 0xce, 0xbf, 0x3c, 0xb4, + 0x9b, 0x4e, 0xbf, 0xec, 0xe6, 0x7c, 0xce, 0x40, 0x4e, 0xbf, 0xb2, 0x5b, + 0xcb, 0x3c, 0x75, 0xbd, 0x23, 0xe5, 0xe9, 0xc5, 0xf4, 0x7b, 0xf5, 0x9d, + 0x46, 0x88, 0x3a, 0xfe, 0x79, 0xc0, 0xe2, 0x12, 0x56, 0x0d, 0xb6, 0x9a, + 0x7a, 0x3b, 0x22, 0xf4, 0xb4, 0x4f, 0x79, 0xce, 0xff, 0xfc, 0xbd, 0x3c, + 0xba, 0x99, 0xed, 0x73, 0x03, 0x87, 0x5f, 0xf4, 0x78, 0x73, 0x68, 0xe6, + 0x8e, 0xa8, 0x45, 0x6e, 0x11, 0xe9, 0x4e, 0xfe, 0x7e, 0xc3, 0x1f, 0xf2, + 0x3a, 0xa4, 0xaf, 0x71, 0xae, 0xdc, 0x85, 0x02, 0xc8, 0xc0, 0x8a, 0x30, + 0x8d, 0xf4, 0x6e, 0x7b, 0x4b, 0xaf, 0xe9, 0x0e, 0x6f, 0xec, 0x3a, 0xff, + 0xfd, 0xf4, 0x00, 0x8d, 0xf2, 0x70, 0xbb, 0xb5, 0xc2, 0x75, 0x42, 0x20, + 0xf8, 0x59, 0x7f, 0x9c, 0x7d, 0x2c, 0xe6, 0x1d, 0x7f, 0xf3, 0xa7, 0xa0, + 0x5b, 0x9e, 0xea, 0x1d, 0x7f, 0x0a, 0x03, 0x5d, 0x43, 0xae, 0xe0, 0x4e, + 0xb9, 0x96, 0x4e, 0xa9, 0x1a, 0xe6, 0x45, 0xaf, 0x42, 0x6d, 0x29, 0x53, + 0x45, 0x7f, 0xc8, 0x28, 0x0d, 0x67, 0x5c, 0xea, 0xea, 0x63, 0xae, 0x81, + 0xa7, 0xbf, 0x16, 0xdc, 0x0d, 0x1d, 0x7f, 0x27, 0x51, 0x45, 0x20, 0xeb, + 0xb5, 0xf4, 0x27, 0x87, 0xe1, 0x6a, 0x44, 0x58, 0x7d, 0x84, 0x05, 0xe6, + 0x59, 0x64, 0xaa, 0x29, 0x52, 0xfe, 0xf9, 0x19, 0x49, 0x8a, 0xa6, 0x9b, + 0xc4, 0x1a, 0xbf, 0x67, 0x23, 0x6e, 0x1d, 0x50, 0xca, 0x20, 0x9d, 0x17, + 0x23, 0xe6, 0x49, 0xc0, 0x4e, 0x46, 0x0e, 0xb2, 0x2e, 0xc7, 0xfa, 0x30, + 0x84, 0xd1, 0x05, 0xf7, 0x25, 0xfe, 0x1d, 0x7f, 0x87, 0x7f, 0x7d, 0xeb, + 0x80, 0xeb, 0xc2, 0x9a, 0x3a, 0xf8, 0x2e, 0x20, 0x3a, 0xff, 0xe8, 0x10, + 0x0c, 0x6f, 0x34, 0x08, 0x0e, 0xac, 0x45, 0x8a, 0x1a, 0x80, 0x6b, 0x44, + 0x17, 0xe9, 0xb6, 0x41, 0xb3, 0x87, 0x59, 0x0e, 0xbf, 0xe7, 0x51, 0xbd, + 0x40, 0xbc, 0x8e, 0xbe, 0x9e, 0x77, 0xdc, 0xeb, 0x81, 0xa4, 0x3e, 0xb1, + 0x0f, 0xfa, 0x71, 0x7e, 0x8c, 0xe7, 0x50, 0xeb, 0xff, 0xcc, 0x83, 0xb9, + 0x93, 0xa6, 0x6d, 0x8d, 0xce, 0xbf, 0xfc, 0x08, 0x5f, 0x39, 0x13, 0xf9, + 0xdd, 0x43, 0xaf, 0xf4, 0xb3, 0xb8, 0xb8, 0x69, 0xd7, 0xb1, 0x6c, 0x67, + 0x5f, 0xf9, 0xf6, 0xe7, 0xd1, 0x8e, 0xa4, 0xe7, 0x5f, 0xec, 0xd0, 0xe7, + 0xba, 0x87, 0x50, 0x51, 0x1d, 0xc1, 0xe1, 0x40, 0xac, 0x4f, 0x92, 0x63, + 0xbe, 0x92, 0x81, 0x33, 0xc9, 0x5b, 0x61, 0x7f, 0x7f, 0x7b, 0x26, 0x18, + 0x59, 0xe2, 0x02, 0xbf, 0x38, 0x87, 0xb0, 0x68, 0x80, 0x95, 0x37, 0x37, + 0xff, 0x26, 0xfa, 0x0e, 0x0c, 0x0f, 0xf0, 0x75, 0xff, 0xdf, 0xb5, 0x4e, + 0x66, 0xfa, 0x03, 0xf8, 0xeb, 0xf4, 0x49, 0xf7, 0x64, 0xeb, 0xff, 0x37, + 0xe7, 0x39, 0x9d, 0xde, 0x5a, 0x3a, 0xb1, 0x1e, 0x68, 0x85, 0xc4, 0x77, + 0x28, 0xb4, 0xe7, 0x5f, 0xbe, 0x64, 0xc8, 0xb3, 0xaf, 0xff, 0x7f, 0x1f, + 0x36, 0x3c, 0x9a, 0xee, 0xee, 0xc9, 0xd5, 0x39, 0xfd, 0x68, 0xa6, 0xff, + 0xd8, 0x1e, 0xba, 0xb1, 0xd8, 0xdc, 0xea, 0x60, 0x23, 0xb3, 0x90, 0x8b, + 0x59, 0x1d, 0xff, 0x0a, 0x9c, 0x14, 0x6f, 0xe2, 0x75, 0xfb, 0xd1, 0x83, + 0x07, 0x52, 0x1e, 0xe0, 0x9c, 0x5f, 0x4f, 0xf4, 0x7c, 0x75, 0xff, 0xf9, + 0xf7, 0xdf, 0x50, 0x3e, 0xfb, 0x37, 0x53, 0xda, 0x3a, 0xa1, 0x33, 0x2c, + 0x84, 0xaa, 0x10, 0x7e, 0x49, 0x7c, 0xb8, 0xc5, 0x9d, 0x7f, 0xec, 0x5c, + 0x35, 0x3d, 0xcf, 0xd6, 0x75, 0xe4, 0xdf, 0x47, 0x54, 0x8f, 0x68, 0x07, + 0xd7, 0xf3, 0x3a, 0xd4, 0x01, 0x8a, 0x3a, 0xa0, 0xf5, 0x5c, 0x8a, 0xff, + 0x72, 0x6d, 0x20, 0xf9, 0x0e, 0xbf, 0xdd, 0x4d, 0xc1, 0xc7, 0x09, 0xd7, + 0xdb, 0x83, 0x90, 0x55, 0xcc, 0xb2, 0x55, 0x41, 0xba, 0x64, 0x8a, 0xe1, + 0x42, 0x95, 0x34, 0x37, 0xff, 0xff, 0x0a, 0xb9, 0x9b, 0x11, 0x32, 0x2e, + 0x26, 0xf8, 0x3b, 0xcb, 0xbf, 0x80, 0xea, 0x3a, 0xf3, 0xf2, 0x5f, 0x13, + 0x36, 0x94, 0x23, 0xb7, 0x25, 0x03, 0xcd, 0x31, 0x6c, 0xaa, 0x08, 0x86, + 0x9c, 0x8e, 0xf2, 0x53, 0xea, 0x42, 0x63, 0x91, 0x9b, 0x76, 0x52, 0xc3, + 0xa0, 0x8c, 0x33, 0xfc, 0x41, 0xfc, 0x6d, 0x17, 0xbc, 0x8c, 0x9d, 0x7a, + 0x77, 0x59, 0xd7, 0xbc, 0x8c, 0x9e, 0x30, 0x8b, 0xef, 0x7e, 0xff, 0x4d, + 0x10, 0x3e, 0xe6, 0xa6, 0x9d, 0x10, 0xff, 0xa2, 0xde, 0x1e, 0x30, 0x4e, + 0xbf, 0xd8, 0xd8, 0x9c, 0x61, 0xa7, 0x58, 0x07, 0x59, 0x8f, 0xe1, 0xe0, + 0xa1, 0x8d, 0xd1, 0xf9, 0xd7, 0xef, 0xc4, 0x1f, 0x64, 0x75, 0xff, 0xf0, + 0xe6, 0xbe, 0x7d, 0xec, 0x01, 0x6f, 0x2f, 0x98, 0x78, 0x1a, 0x16, 0xaf, + 0xd1, 0xaf, 0xb5, 0xb2, 0xff, 0xdd, 0xfe, 0x78, 0xf9, 0x1e, 0x80, 0x9d, + 0x79, 0xf9, 0x39, 0xd7, 0x32, 0xc9, 0xd7, 0xfb, 0x89, 0x9b, 0x7e, 0xc9, + 0x56, 0x9b, 0x46, 0x47, 0x2f, 0xfc, 0x8a, 0x7c, 0xd7, 0xe0, 0x5c, 0x48, + 0xeb, 0xfd, 0xac, 0xf3, 0xaf, 0x04, 0xea, 0x0a, 0x66, 0xdc, 0x75, 0xea, + 0x7f, 0x90, 0xaf, 0xfd, 0xac, 0x1c, 0xee, 0x37, 0x04, 0xeb, 0xff, 0x62, + 0x9d, 0x79, 0x7d, 0x7d, 0xe0, 0xea, 0x91, 0xfd, 0x09, 0xd5, 0x42, 0x36, + 0x72, 0x17, 0x17, 0xff, 0x2d, 0x6f, 0x2c, 0xe3, 0x5d, 0xda, 0x68, 0x86, + 0x2f, 0xff, 0xff, 0x3e, 0xb0, 0x71, 0xbd, 0x8d, 0xe5, 0xb3, 0x9d, 0x6a, + 0x60, 0xba, 0x87, 0x56, 0x23, 0x1b, 0xf4, 0xfa, 0x85, 0xc7, 0xb4, 0x8c, + 0xdf, 0xb2, 0x8d, 0x46, 0x1d, 0x97, 0xf9, 0x7d, 0x79, 0xc6, 0x24, 0x55, + 0xda, 0xfc, 0xeb, 0xfa, 0x5d, 0x77, 0x18, 0x3a, 0xd0, 0xd3, 0xc1, 0xdc, + 0x5e, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x05, 0x5e, 0xec, 0x2c, 0xeb, 0xff, + 0x44, 0xef, 0xee, 0x64, 0xb6, 0x70, 0xea, 0xc4, 0x47, 0x21, 0x98, 0x8d, + 0xdf, 0xbb, 0x0b, 0xff, 0x73, 0xaf, 0xbd, 0xa8, 0x01, 0x57, 0x9f, 0x93, + 0x95, 0x7d, 0xf8, 0xba, 0x85, 0x5f, 0xe4, 0x9f, 0x3d, 0xa8, 0x01, 0x54, + 0x55, 0xfd, 0x8d, 0x8e, 0xc2, 0xca, 0xb9, 0x96, 0x4a, 0xbf, 0x86, 0x06, + 0x74, 0xe1, 0x55, 0x89, 0x84, 0xb4, 0x85, 0x63, 0x9d, 0x22, 0x01, 0x90, + 0x85, 0x32, 0x57, 0xf4, 0x62, 0xe4, 0xe1, 0x4a, 0x9f, 0x9d, 0x49, 0x3f, + 0x99, 0x8b, 0x7b, 0x1d, 0x2d, 0x42, 0xb5, 0xae, 0xb9, 0xbc, 0xaa, 0xfb, + 0xfb, 0x07, 0x48, 0x38, 0x75, 0xee, 0xfe, 0xb3, 0xab, 0xa7, 0x8d, 0xb0, + 0x53, 0x7f, 0x9c, 0x73, 0x5c, 0x8d, 0x1d, 0x7f, 0x07, 0x05, 0xfd, 0xa3, + 0xad, 0x12, 0x3d, 0xbd, 0x18, 0x5f, 0xb9, 0xbc, 0xb3, 0xc7, 0x5f, 0xff, + 0x3a, 0x03, 0x58, 0xa3, 0xaf, 0x91, 0x82, 0x75, 0xfb, 0xc9, 0x9b, 0xf8, + 0xeb, 0xff, 0xfe, 0xea, 0x73, 0x02, 0xeb, 0xc1, 0xf0, 0xc3, 0x39, 0xed, + 0x1d, 0x68, 0x3a, 0xfa, 0x36, 0x86, 0x1a, 0x7e, 0x40, 0x63, 0xbf, 0xf3, + 0xcb, 0xaf, 0xed, 0x60, 0xc8, 0xea, 0xe9, 0xfb, 0x78, 0xea, 0xb8, 0x9d, + 0x2f, 0x4a, 0x34, 0x99, 0xe8, 0xc3, 0xef, 0xf6, 0xf2, 0xd9, 0x86, 0xe2, + 0xce, 0xbf, 0xff, 0xf7, 0x39, 0x1b, 0xcb, 0x7d, 0x27, 0x1b, 0xdc, 0xfb, + 0xc4, 0x80, 0x9d, 0x7f, 0xcf, 0xcc, 0xde, 0x50, 0x08, 0x3a, 0xa1, 0x1b, + 0x98, 0x6d, 0xfb, 0x7d, 0xff, 0xf9, 0xaa, 0x3e, 0xb3, 0x92, 0x4e, 0xb8, + 0xef, 0x23, 0xaf, 0xfc, 0xd8, 0xf6, 0xb3, 0xc9, 0xbb, 0x27, 0x59, 0xf1, + 0x12, 0x8a, 0x2a, 0xd4, 0x2a, 0x0b, 0xec, 0x64, 0x03, 0x0c, 0x3b, 0xe7, + 0x9f, 0xeb, 0x4e, 0xb9, 0xc0, 0x75, 0x48, 0xdc, 0xf8, 0x92, 0xff, 0xfc, + 0xef, 0x27, 0xef, 0xcc, 0x9f, 0xff, 0x7e, 0xff, 0x4d, 0x17, 0xdd, 0xe0, + 0x40, 0x4e, 0xbf, 0xf6, 0x90, 0x77, 0x97, 0x3f, 0x8d, 0x1d, 0x53, 0x23, + 0x07, 0x8c, 0xfe, 0x1b, 0xbf, 0x77, 0x26, 0x86, 0x33, 0xaf, 0xc1, 0xe7, + 0x31, 0x93, 0xad, 0x13, 0x9e, 0x90, 0x95, 0x59, 0xa7, 0x5f, 0xff, 0xe0, + 0x27, 0x14, 0xec, 0x2e, 0x69, 0x20, 0xf6, 0x39, 0x07, 0x5b, 0xd8, 0x7e, + 0x1a, 0x10, 0xbe, 0xf0, 0xe4, 0x8e, 0xa8, 0x3c, 0x74, 0x27, 0xbf, 0xf0, + 0xa4, 0xbd, 0xdc, 0xe2, 0x68, 0xeb, 0xfa, 0x24, 0x39, 0x93, 0x9d, 0x7f, + 0x9c, 0x30, 0x08, 0x67, 0x47, 0x57, 0x4f, 0x75, 0xca, 0xef, 0xed, 0x96, + 0x25, 0xf3, 0xe7, 0x76, 0x4f, 0x10, 0x0d, 0xfe, 0xf0, 0x3e, 0x8c, 0xbb, + 0x87, 0x88, 0x06, 0xf3, 0xf2, 0x47, 0x88, 0x06, 0xb0, 0xfa, 0x7f, 0x41, + 0xb9, 0xe4, 0x78, 0x80, 0x6f, 0x9c, 0x77, 0x91, 0xe2, 0x01, 0xbf, 0xc8, + 0xde, 0xe0, 0x01, 0x07, 0x88, 0x06, 0xf2, 0x08, 0x4f, 0x10, 0x0d, 0x05, + 0x16, 0xab, 0x22, 0xe9, 0x76, 0xd3, 0xeb, 0x28, 0x78, 0x80, 0x6f, 0x72, + 0x3c, 0x78, 0x80, 0x68, 0xf1, 0x00, 0xde, 0xd9, 0x40, 0x1e, 0x20, 0x1b, + 0xa1, 0x67, 0x88, 0x06, 0x82, 0x7c, 0x98, 0x2e, 0x85, 0x77, 0xc8, 0xb0, + 0xc1, 0xe2, 0x01, 0xbd, 0xe7, 0x69, 0xe2, 0x01, 0xbf, 0xf0, 0xbc, 0x95, + 0xea, 0x35, 0xf8, 0x78, 0x80, 0x6f, 0xfe, 0x7f, 0x7f, 0x3a, 0x0f, 0xba, + 0xf2, 0x3c, 0x40, 0x37, 0x38, 0x4f, 0x10, 0x0d, 0xfe, 0x17, 0x67, 0x5a, + 0x80, 0x1e, 0x20, 0x1b, 0xf2, 0x28, 0xe2, 0x03, 0xc4, 0x03, 0x72, 0x68, + 0xf1, 0x00, 0xd7, 0x0f, 0x57, 0xc6, 0x77, 0xff, 0xba, 0x9e, 0xf6, 0x6b, + 0xe7, 0x12, 0x16, 0x78, 0x80, 0x6f, 0xde, 0x18, 0xde, 0x46, 0x88, 0x06, + 0xe0, 0x41, 0xe2, 0x01, 0x54, 0xda, 0x5f, 0x92, 0x16, 0xe1, 0x3c, 0x40, + 0x37, 0xdf, 0xb8, 0xb4, 0xf1, 0x00, 0xde, 0x8e, 0x34, 0xf1, 0x00, 0xdf, + 0xfb, 0x37, 0xd0, 0x63, 0x04, 0x1a, 0x3c, 0x40, 0x37, 0xef, 0xde, 0x52, + 0x83, 0xc4, 0x03, 0x7e, 0x76, 0xf6, 0x37, 0x3c, 0x40, 0x35, 0x88, 0xb2, + 0xea, 0x57, 0xe6, 0x97, 0x70, 0x07, 0x88, 0x06, 0xa4, 0xac, 0x8c, 0x24, + 0x59, 0x09, 0x46, 0x91, 0x24, 0x22, 0xfa, 0x66, 0x03, 0x2d, 0x17, 0x7a, + 0x1b, 0x5f, 0x98, 0x5f, 0xb3, 0xda, 0x7d, 0xcf, 0x10, 0x0d, 0xfe, 0x0c, + 0x36, 0x6e, 0x47, 0x8f, 0x10, 0x08, 0x4d, 0xa5, 0xee, 0x43, 0x27, 0x88, + 0x06, 0x9a, 0x7f, 0x3c, 0x50, 0xbf, 0xdf, 0xbc, 0xa5, 0x1f, 0x56, 0x78, + 0x80, 0x6f, 0x90, 0x65, 0xa3, 0xc4, 0x03, 0x7f, 0x3c, 0xd2, 0xcd, 0xe4, + 0x78, 0x80, 0x6b, 0x11, 0x99, 0xd2, 0x20, 0x21, 0x7e, 0x5b, 0x7f, 0xdd, + 0x8d, 0x2b, 0xaf, 0xf8, 0x03, 0xc4, 0x03, 0x64, 0x3c, 0x40, 0x37, 0x3c, + 0xe1, 0x3e, 0x4e, 0xa4, 0x5d, 0xc0, 0x1e, 0x20, 0x1b, 0xf3, 0xfb, 0x49, + 0xb9, 0xe2, 0x01, 0xbf, 0x90, 0x7f, 0x96, 0x68, 0xf1, 0x00, 0xd4, 0x22, + 0x40, 0x48, 0xfc, 0x69, 0x50, 0xca, 0x55, 0x0c, 0x2d, 0x32, 0x1a, 0xe8, + 0x7f, 0x30, 0xf7, 0x21, 0x19, 0xd2, 0xd7, 0x2d, 0x01, 0x40, 0xa5, 0x6a, + 0x5b, 0xa7, 0xa5, 0x0a, 0x6c, 0xc2, 0x87, 0xec, 0x2f, 0xaf, 0x79, 0x19, + 0x3c, 0x61, 0x37, 0x9d, 0xda, 0x68, 0x80, 0x55, 0x4c, 0x53, 0x78, 0x75, + 0xdf, 0x28, 0xc3, 0xc2, 0xb3, 0xae, 0xdb, 0x39, 0xd7, 0xed, 0xa3, 0x01, + 0xe9, 0xd5, 0x07, 0x82, 0x83, 0x37, 0xff, 0x48, 0x71, 0xbd, 0x40, 0x03, + 0xf9, 0x8e, 0xbf, 0x7b, 0x02, 0xfd, 0x3a, 0xe0, 0x41, 0x56, 0x50, 0xab, + 0xdd, 0x89, 0xce, 0xb9, 0x96, 0x4a, 0xa4, 0x3d, 0xa6, 0x31, 0x59, 0x84, + 0x59, 0x1c, 0xb6, 0x8a, 0x54, 0xf0, 0x2c, 0xbc, 0x47, 0x12, 0x43, 0x02, + 0xf2, 0x7f, 0xe3, 0xaf, 0xff, 0x7b, 0x58, 0xa2, 0x73, 0xe8, 0x01, 0x1b, + 0x9d, 0x53, 0xb3, 0xb5, 0xe4, 0x40, 0x18, 0x4c, 0xb6, 0x97, 0x14, 0x89, + 0xdc, 0x6a, 0x72, 0x00, 0x46, 0x4f, 0xe2, 0xcf, 0xa3, 0x97, 0xfd, 0x92, + 0x40, 0xbb, 0x75, 0x23, 0xaf, 0xf9, 0x68, 0x2d, 0x4e, 0x20, 0x0e, 0xa6, + 0x9f, 0x6f, 0x4d, 0xef, 0x37, 0xa2, 0x75, 0xff, 0xde, 0xd9, 0xc9, 0xa4, + 0xfc, 0x9c, 0x30, 0x75, 0x2c, 0xf8, 0xc4, 0x6e, 0xfe, 0xf7, 0xdd, 0xbb, + 0x63, 0x47, 0x5f, 0xec, 0xdf, 0xde, 0x79, 0x68, 0xeb, 0xc3, 0xbc, 0x8f, + 0x18, 0x05, 0x42, 0x66, 0xb9, 0x08, 0x54, 0x21, 0xe1, 0x9b, 0x99, 0xdf, + 0xff, 0xc8, 0x23, 0xfe, 0xf9, 0xbf, 0x83, 0xc7, 0xdf, 0x27, 0x3a, 0xfd, + 0x34, 0xa3, 0x93, 0x9d, 0x7d, 0x0a, 0x42, 0xce, 0xa9, 0x22, 0x9f, 0x8b, + 0xab, 0x29, 0xbf, 0xf4, 0xb5, 0xf0, 0x71, 0x71, 0xc5, 0x0e, 0xbf, 0xa5, + 0x1c, 0x07, 0xd5, 0x9d, 0x7f, 0xf6, 0xd1, 0xcd, 0x7b, 0x06, 0x59, 0xa3, + 0xaf, 0x97, 0x1f, 0xf8, 0xea, 0xc3, 0xe5, 0x74, 0x3b, 0xba, 0xf8, 0x8b, + 0x41, 0x84, 0xa5, 0xff, 0x43, 0x18, 0x7b, 0x13, 0xb8, 0x9d, 0x7f, 0xd0, + 0xd8, 0x5a, 0x2c, 0x08, 0x75, 0x71, 0x14, 0x3d, 0x31, 0xd8, 0x3a, 0xbf, + 0xbe, 0xb3, 0xc4, 0xce, 0x95, 0x7e, 0xd7, 0x63, 0x27, 0x3a, 0xff, 0xe0, + 0x0a, 0x66, 0xfe, 0x9a, 0x4f, 0xc3, 0xaf, 0xa6, 0xeb, 0xcc, 0x75, 0xf3, + 0x5f, 0x93, 0x9d, 0x7e, 0xc9, 0xa5, 0x1b, 0x9d, 0x7b, 0xa9, 0x31, 0xd7, + 0x86, 0x24, 0x55, 0xff, 0x84, 0x09, 0xb1, 0xb1, 0xfc, 0xa1, 0x8c, 0xea, + 0xc3, 0xe1, 0x71, 0xaa, 0xf8, 0x9b, 0xae, 0xe4, 0xfc, 0x44, 0xe9, 0x18, + 0x91, 0x78, 0xa3, 0x61, 0xf6, 0xa1, 0x70, 0x1b, 0x0c, 0x12, 0x39, 0x5e, + 0x99, 0xbc, 0x74, 0x97, 0xf6, 0xfa, 0xe7, 0x23, 0xc7, 0x5f, 0xd2, 0xd2, + 0x9c, 0x76, 0x9d, 0x78, 0x7d, 0xa3, 0xaf, 0xda, 0xfc, 0x7f, 0x69, 0xd7, + 0xf7, 0xa6, 0x96, 0x6f, 0x23, 0xaa, 0x11, 0x42, 0x85, 0xdf, 0x8d, 0xfd, + 0x29, 0xbf, 0xfb, 0xac, 0xc7, 0x35, 0x8c, 0xbf, 0x14, 0x3a, 0xfd, 0x81, + 0x0e, 0x2c, 0xeb, 0xff, 0xde, 0xdd, 0xa9, 0xdd, 0x98, 0xf7, 0x7e, 0xe8, + 0xeb, 0x98, 0x3a, 0x3a, 0xff, 0xba, 0xfe, 0xd3, 0x47, 0x27, 0x3a, 0xe6, + 0xa1, 0xd7, 0xc2, 0x9b, 0xc8, 0xeb, 0xfe, 0x4d, 0xfb, 0x81, 0xe3, 0xb4, + 0xea, 0x83, 0xd9, 0xe1, 0x0d, 0xff, 0x76, 0x39, 0x0d, 0x41, 0x69, 0xd7, + 0x94, 0x7d, 0x35, 0x18, 0xbc, 0x6e, 0xd8, 0x21, 0xac, 0x4d, 0x0b, 0xd0, + 0xfd, 0xa9, 0x2a, 0x40, 0xe2, 0x32, 0xc9, 0xbf, 0x50, 0x66, 0x35, 0xcb, + 0xf6, 0xc7, 0xeb, 0xc0, 0x9d, 0x7f, 0xee, 0xe6, 0xc3, 0x8a, 0x99, 0xbf, + 0x8e, 0xbf, 0xec, 0x6f, 0x50, 0x3d, 0xfd, 0x43, 0xaf, 0x7b, 0x1a, 0x75, + 0x2c, 0xf5, 0x74, 0x75, 0x7a, 0x4b, 0x01, 0xd4, 0xa2, 0x35, 0x01, 0x09, + 0x6f, 0x11, 0x5f, 0xf2, 0x8f, 0xf2, 0x16, 0x28, 0xa1, 0xd7, 0xfe, 0x7d, + 0x2e, 0x13, 0x9c, 0x46, 0x4e, 0xb6, 0x94, 0x3f, 0x7e, 0x9d, 0x5f, 0xf6, + 0x7b, 0xc8, 0xa7, 0xb1, 0xa7, 0x5f, 0xd1, 0xbe, 0xb3, 0x7f, 0x1d, 0x77, + 0x20, 0xea, 0x09, 0xe1, 0xf8, 0xba, 0xff, 0xa3, 0xc8, 0xd4, 0x0c, 0x78, + 0xeb, 0x68, 0x28, 0xd3, 0xc7, 0xbe, 0x11, 0x56, 0xe9, 0x98, 0xfa, 0x1f, + 0x97, 0xfd, 0xe4, 0x9e, 0x37, 0x07, 0x20, 0xeb, 0xda, 0xf6, 0x1d, 0x76, + 0x6b, 0xe1, 0xea, 0x7d, 0x39, 0xbf, 0xfb, 0x3c, 0x9b, 0xc8, 0x61, 0x84, + 0xc4, 0xf6, 0x4e, 0xbf, 0xfd, 0xfc, 0xba, 0xe9, 0xe4, 0x1f, 0x7f, 0xd3, + 0xaf, 0xd9, 0xe0, 0x3f, 0x8e, 0xa9, 0x23, 0x03, 0x8a, 0x1b, 0x29, 0x57, + 0xff, 0xe8, 0xeb, 0xe0, 0xc7, 0x14, 0x0f, 0xef, 0xc9, 0x1d, 0x52, 0x4d, + 0xe3, 0xd0, 0xf1, 0xd8, 0x33, 0xa8, 0x5d, 0x60, 0xc5, 0x44, 0x87, 0xfb, + 0xc7, 0xbd, 0xfc, 0x7e, 0xd7, 0xdd, 0x47, 0x91, 0xd7, 0xfb, 0x06, 0x59, + 0xaf, 0xab, 0x3a, 0xfc, 0xbd, 0x01, 0xdc, 0xea, 0xf1, 0xec, 0xfd, 0x33, + 0xbf, 0xee, 0x60, 0xfc, 0xee, 0x6e, 0xc9, 0xd7, 0xfd, 0x21, 0xfc, 0x1f, + 0x1a, 0xb0, 0x1d, 0x53, 0xa6, 0x29, 0x27, 0x9c, 0x24, 0xdc, 0xee, 0xff, + 0x86, 0x33, 0x7f, 0x67, 0x20, 0xeb, 0xff, 0x47, 0x7e, 0xe8, 0x73, 0xdd, + 0xc3, 0xaa, 0x11, 0x66, 0xe7, 0xe0, 0x36, 0xbf, 0x3e, 0xd0, 0x86, 0x0e, + 0xbb, 0x5a, 0x3a, 0xf3, 0x2c, 0xb2, 0x75, 0xc0, 0x72, 0x95, 0x2f, 0xeb, + 0x87, 0xb5, 0xa3, 0x5b, 0xff, 0x66, 0x85, 0xd4, 0x98, 0x52, 0x63, 0xaf, + 0xe0, 0x44, 0xbb, 0xf7, 0x47, 0x5f, 0xc8, 0x20, 0x6b, 0x50, 0xeb, 0xce, + 0x0c, 0x2a, 0xa4, 0x9a, 0xb2, 0xe1, 0x05, 0xd2, 0x20, 0x1f, 0x6d, 0x2f, + 0xd9, 0x2b, 0xbe, 0x80, 0xa0, 0x4e, 0xbf, 0x07, 0x89, 0xfc, 0xe7, 0x5f, + 0xe6, 0x70, 0x73, 0x6a, 0x70, 0xeb, 0xf8, 0x73, 0x70, 0x7d, 0x91, 0xd5, + 0x32, 0x22, 0xc4, 0xa7, 0xc6, 0x77, 0x3a, 0xce, 0xbf, 0xd9, 0xb7, 0x15, + 0x65, 0x96, 0x4a, 0xbf, 0x4d, 0x19, 0xdd, 0x1d, 0x42, 0x7b, 0xff, 0x4e, + 0x2f, 0xf3, 0x06, 0x3f, 0x6f, 0x53, 0x87, 0x5e, 0x5b, 0xf8, 0xea, 0x99, + 0x1d, 0x3d, 0x74, 0xfc, 0x8f, 0x69, 0xbd, 0xfc, 0x3b, 0x5d, 0x68, 0xb3, + 0xaf, 0xd9, 0x34, 0xa2, 0x47, 0x5f, 0xd3, 0x86, 0x30, 0x42, 0x75, 0x42, + 0xae, 0x79, 0x31, 0x24, 0x2a, 0xde, 0x31, 0x9d, 0x20, 0xf8, 0xb7, 0xe9, + 0x3d, 0xe7, 0x02, 0x1d, 0x7f, 0xc1, 0x1f, 0xf5, 0x93, 0xe4, 0xe7, 0x5e, + 0x8e, 0x09, 0xd7, 0xfb, 0x02, 0x2f, 0xa4, 0x09, 0xd6, 0xe9, 0xd7, 0xbf, + 0x79, 0xc4, 0xf0, 0x34, 0x61, 0x64, 0xe2, 0x23, 0xbc, 0xb5, 0x4b, 0x4c, + 0x29, 0xc6, 0x98, 0x30, 0xc8, 0xbf, 0x0c, 0x4f, 0x12, 0x3a, 0xff, 0xf6, + 0x05, 0xd7, 0x9b, 0xcb, 0x01, 0x81, 0x3a, 0xee, 0xb9, 0xd7, 0x4d, 0xa3, + 0xaf, 0xd9, 0xb5, 0x04, 0x38, 0x6b, 0x3e, 0x8a, 0xdf, 0xbb, 0x9b, 0xfa, + 0x0e, 0xbf, 0x6c, 0x3c, 0xff, 0x64, 0x75, 0x7c, 0x4c, 0x1d, 0x57, 0x4c, + 0x3f, 0xfc, 0x9e, 0xf8, 0x39, 0xd7, 0x3a, 0xff, 0xd8, 0x32, 0xee, 0x08, + 0xc3, 0x27, 0x5f, 0xfb, 0x39, 0xc7, 0x97, 0xcd, 0xb0, 0xc6, 0x75, 0x41, + 0xff, 0xc8, 0xee, 0xb8, 0x98, 0x08, 0xa0, 0xfa, 0x13, 0xf7, 0xfb, 0x9a, + 0xee, 0x0a, 0x68, 0xea, 0x85, 0x52, 0x89, 0x28, 0xb9, 0xcd, 0x6f, 0xfb, + 0x03, 0x83, 0x03, 0xfc, 0x1d, 0x74, 0x32, 0x75, 0x43, 0xba, 0xe2, 0x9e, + 0x14, 0x72, 0x9c, 0x9e, 0x0c, 0xba, 0x9c, 0x7d, 0x52, 0x10, 0x0d, 0x97, + 0xaf, 0xbb, 0xa2, 0x43, 0x8a, 0x68, 0x41, 0xf2, 0x9f, 0x6a, 0xb9, 0x48, + 0xdd, 0x9c, 0xf9, 0x75, 0x50, 0x43, 0x3c, 0x67, 0xf7, 0xb5, 0x28, 0x8b, + 0xd3, 0x8d, 0x7f, 0xc6, 0xf5, 0xb6, 0x56, 0x6f, 0xd3, 0x6d, 0x83, 0x5b, + 0xfe, 0xce, 0x0c, 0x7a, 0x59, 0xd3, 0xaf, 0xe1, 0x06, 0x05, 0xe4, 0x75, + 0xff, 0xba, 0x83, 0x1b, 0xe9, 0x17, 0x07, 0x5e, 0xd4, 0x70, 0xeb, 0xdf, + 0xfb, 0x4d, 0x3d, 0x7d, 0xcf, 0x2f, 0xf3, 0x47, 0x25, 0x27, 0xd1, 0xd7, + 0xf3, 0xb3, 0x80, 0xfb, 0xe3, 0xaf, 0xcf, 0x2f, 0x81, 0x43, 0xaf, 0x4a, + 0x00, 0x75, 0xfb, 0xec, 0xd2, 0x86, 0x32, 0xaa, 0x13, 0xbe, 0xc3, 0x65, + 0x21, 0x04, 0x86, 0xdc, 0x31, 0xe9, 0x7f, 0x8a, 0x3e, 0x8d, 0xd9, 0xa7, + 0x5f, 0xfc, 0xa0, 0xfe, 0xff, 0x73, 0x49, 0x02, 0x75, 0xed, 0x94, 0x09, + 0xd5, 0xc3, 0xe2, 0x5a, 0x25, 0xff, 0xdb, 0xfb, 0xf5, 0xf6, 0x10, 0x5c, + 0x27, 0x5f, 0x29, 0xc7, 0x64, 0xeb, 0x7d, 0x34, 0x40, 0xb6, 0xf1, 0xa8, + 0x14, 0xaf, 0x1b, 0xc6, 0x47, 0xeb, 0x11, 0x02, 0x8b, 0xf7, 0xfe, 0x4d, + 0x9e, 0xa7, 0xd5, 0x40, 0x08, 0x2a, 0xff, 0x87, 0xda, 0xff, 0x7f, 0x23, + 0x27, 0x5f, 0xef, 0xdf, 0x59, 0x82, 0xa1, 0xd5, 0x07, 0xdb, 0xd3, 0xbb, + 0xfe, 0x8f, 0x6b, 0xe6, 0x2d, 0x02, 0x75, 0xff, 0xbe, 0x0b, 0xa9, 0xf3, + 0x40, 0x04, 0x1d, 0x7f, 0xfa, 0x7f, 0xc1, 0xa9, 0x26, 0xb5, 0x1c, 0x91, + 0xd6, 0x45, 0x11, 0x1d, 0xc4, 0x2b, 0xfc, 0xfd, 0xdf, 0x50, 0x3e, 0x3a, + 0xb4, 0x7b, 0x7e, 0x29, 0xbf, 0xdd, 0x49, 0xa5, 0x03, 0x23, 0xaf, 0xfd, + 0x0c, 0xe9, 0x80, 0xed, 0xcd, 0xfc, 0x75, 0x34, 0xfd, 0x7c, 0x65, 0x7d, + 0x2e, 0xe4, 0xe7, 0x5f, 0xf4, 0x6e, 0xb7, 0xf6, 0x6f, 0xe3, 0xab, 0x73, + 0xdb, 0x12, 0x2b, 0xfe, 0x86, 0xfb, 0xfe, 0xf2, 0x19, 0x3a, 0xee, 0x39, + 0xd7, 0xff, 0x6d, 0x4d, 0x6b, 0x05, 0xae, 0x20, 0x3a, 0xff, 0x75, 0x02, + 0x1c, 0x66, 0x63, 0xaf, 0x47, 0x01, 0x87, 0xee, 0xd4, 0x3a, 0xe2, 0x2f, + 0xbb, 0x08, 0xcb, 0xff, 0x3e, 0xfa, 0xcf, 0x22, 0xde, 0x47, 0x5b, 0xc7, + 0x50, 0x0f, 0x37, 0xe9, 0xed, 0xff, 0xff, 0xdf, 0xeb, 0xaf, 0x2d, 0x49, + 0x3d, 0xf7, 0x91, 0xd8, 0xf6, 0x9f, 0x73, 0xaf, 0xd1, 0x83, 0xed, 0x93, + 0xaf, 0xe4, 0xdc, 0x1c, 0x70, 0x9d, 0x65, 0x9d, 0x4b, 0x3e, 0x5e, 0x94, + 0x09, 0x6d, 0xdc, 0x63, 0x3a, 0xf4, 0xbf, 0x09, 0xd7, 0x3e, 0xff, 0x0f, + 0x92, 0x62, 0xe7, 0x19, 0xae, 0x26, 0xf7, 0xa8, 0xcf, 0xaf, 0xff, 0xec, + 0x19, 0xf5, 0xa8, 0x06, 0x75, 0x38, 0xec, 0xf8, 0xea, 0x0a, 0xf0, 0x4b, + 0x48, 0x77, 0x8c, 0x8a, 0x68, 0x4b, 0xf1, 0xf5, 0x64, 0x5d, 0x87, 0xc0, + 0x1d, 0x7d, 0x1c, 0xfb, 0x25, 0x55, 0x0b, 0xec, 0x09, 0x3d, 0x73, 0x7f, + 0xfe, 0x49, 0x9d, 0xe5, 0xa8, 0x58, 0x7b, 0x02, 0xd3, 0xaf, 0xfb, 0x26, + 0x94, 0x6f, 0x9b, 0xf8, 0xeb, 0xb9, 0x3e, 0x22, 0x34, 0x54, 0xef, 0x83, + 0xdf, 0xe7, 0x3a, 0xff, 0x05, 0xe5, 0x93, 0xfe, 0x27, 0x5f, 0xfb, 0x98, + 0xc7, 0x37, 0x5d, 0x69, 0xa3, 0xad, 0x3c, 0x22, 0x63, 0x09, 0x38, 0x67, + 0x73, 0x07, 0x0e, 0xac, 0x3c, 0xe7, 0x35, 0xbf, 0xbd, 0xb3, 0xff, 0x71, + 0xa7, 0x5f, 0xee, 0x47, 0x90, 0x11, 0x23, 0xaf, 0xed, 0xe7, 0x79, 0x43, + 0x19, 0xd7, 0x0c, 0x8e, 0xa8, 0x3c, 0x69, 0xcc, 0x69, 0x80, 0xcb, 0x91, + 0x87, 0x24, 0x22, 0x5c, 0x31, 0x7b, 0x3f, 0x02, 0xf0, 0xb9, 0x18, 0xc5, + 0x34, 0x41, 0xe3, 0x1f, 0xdd, 0xef, 0xfc, 0xc0, 0xfb, 0x0b, 0x6f, 0x5f, + 0x70, 0x1d, 0x7f, 0xa5, 0x36, 0x0b, 0xf7, 0x0e, 0xbf, 0xdb, 0x5e, 0x60, + 0xc0, 0xce, 0x75, 0xf9, 0xe2, 0x64, 0xe9, 0xd7, 0xd1, 0xfb, 0x05, 0x0e, + 0xbd, 0xef, 0x41, 0xd7, 0xf9, 0x39, 0x13, 0xbf, 0x1a, 0x75, 0xbd, 0xf1, + 0x13, 0x1c, 0x26, 0x72, 0x5f, 0x0d, 0xdf, 0xfe, 0xe3, 0x47, 0x36, 0x8e, + 0x47, 0x23, 0x47, 0x5f, 0xe7, 0x9b, 0xb8, 0xbc, 0xd1, 0xd5, 0x87, 0xf5, + 0xb5, 0x22, 0xff, 0x0a, 0x9f, 0x23, 0x6a, 0x6d, 0x3a, 0xfc, 0xa7, 0xb3, + 0x16, 0x75, 0x61, 0xef, 0xa1, 0xc5, 0xff, 0xe9, 0x87, 0x14, 0x51, 0xfd, + 0xa4, 0x19, 0x8e, 0xbf, 0x60, 0x53, 0x9a, 0x3a, 0xf7, 0xbd, 0xb9, 0xd7, + 0xff, 0x6e, 0xd4, 0xef, 0xcd, 0x8c, 0xea, 0x2c, 0xea, 0x01, 0xf3, 0x78, + 0x76, 0xef, 0xf8, 0x75, 0x68, 0xdc, 0xec, 0x91, 0x5a, 0x27, 0x47, 0x4b, + 0x30, 0xc5, 0xa8, 0x57, 0x21, 0x90, 0xcd, 0x48, 0x5f, 0x76, 0x10, 0x4e, + 0x41, 0xe8, 0xcd, 0x2f, 0xfc, 0x29, 0xf7, 0x7c, 0xdb, 0xbc, 0x7d, 0x3a, + 0xff, 0xf2, 0x67, 0x03, 0x0c, 0xe7, 0x63, 0x7d, 0x1d, 0x7d, 0xf6, 0x38, + 0x03, 0xae, 0x7e, 0x1d, 0x7f, 0x79, 0x27, 0x5c, 0x34, 0xea, 0x09, 0xe1, + 0x74, 0x56, 0xfb, 0x9e, 0x49, 0xce, 0xbb, 0x36, 0x0e, 0xbe, 0x07, 0xd1, + 0x91, 0xd6, 0x71, 0x37, 0x7e, 0x18, 0xbf, 0x6b, 0x58, 0x20, 0x3a, 0x80, + 0x79, 0x62, 0x4b, 0x50, 0x8e, 0xb4, 0x22, 0xfe, 0x15, 0x17, 0x6f, 0x31, + 0xd7, 0xef, 0xbe, 0x02, 0xf0, 0xea, 0x59, 0xe0, 0x80, 0x62, 0xf3, 0x63, + 0x47, 0x5f, 0xf4, 0x9f, 0x9e, 0x18, 0x5e, 0x8e, 0xbf, 0xd0, 0x18, 0xe7, + 0xf0, 0x03, 0xae, 0x5e, 0xa6, 0x3e, 0x95, 0x9b, 0xdf, 0xfa, 0x1c, 0x73, + 0xde, 0x46, 0x7c, 0x75, 0x42, 0x62, 0x38, 0x44, 0x90, 0x84, 0xfc, 0xbe, + 0x98, 0x4c, 0x81, 0x48, 0x45, 0x94, 0xbc, 0x1c, 0x6a, 0x6a, 0x24, 0xc9, + 0x3a, 0x8d, 0x43, 0xd1, 0xc3, 0x5f, 0xd1, 0xfe, 0xe9, 0xbe, 0xc1, 0xd7, + 0xec, 0x67, 0x37, 0xf1, 0xd6, 0xe7, 0xc3, 0xda, 0x43, 0x2b, 0xe5, 0x39, + 0x9a, 0x3a, 0xff, 0xec, 0x1f, 0xdb, 0xdc, 0x5c, 0xce, 0xd3, 0xa9, 0x0f, + 0x9b, 0x44, 0x57, 0xf8, 0x54, 0xec, 0x2d, 0x62, 0x75, 0xfc, 0xc6, 0x91, + 0xb1, 0xff, 0x8e, 0xbf, 0x44, 0xd9, 0x8d, 0x3a, 0xb1, 0x11, 0x68, 0x65, + 0xd3, 0x3b, 0xff, 0x77, 0x26, 0x49, 0xbf, 0xd8, 0xff, 0x47, 0x5e, 0x4e, + 0x28, 0x75, 0x21, 0xf0, 0x8a, 0x2d, 0xfa, 0x36, 0x3b, 0x13, 0x1d, 0x52, + 0x3c, 0xad, 0x10, 0x5f, 0xfd, 0xfc, 0xc9, 0xd8, 0xde, 0x51, 0x34, 0x1d, + 0x7e, 0x0b, 0x8c, 0x74, 0xeb, 0xfa, 0x51, 0xbf, 0xb3, 0xa7, 0x5f, 0xfe, + 0xf6, 0x90, 0x11, 0x2d, 0x66, 0x6f, 0xe3, 0xaa, 0x63, 0xf6, 0xd1, 0x6d, + 0x75, 0x17, 0xcc, 0xc2, 0x6e, 0xff, 0x75, 0xe6, 0xc4, 0xd8, 0x09, 0xd4, + 0x87, 0xbd, 0xa2, 0x9b, 0xff, 0xf7, 0x3f, 0xe7, 0x20, 0x71, 0x44, 0xef, + 0x73, 0xe9, 0xd7, 0xf0, 0xba, 0x06, 0x04, 0xeb, 0xe9, 0xe3, 0x62, 0x0e, + 0xbe, 0xe8, 0x1f, 0xc7, 0x5b, 0xa7, 0x5b, 0x6b, 0x9b, 0x1f, 0xc8, 0x6f, + 0xfe, 0x45, 0xa6, 0xbb, 0x09, 0xcf, 0xd8, 0xce, 0xa8, 0x46, 0x22, 0x2a, + 0xb9, 0x4d, 0xfc, 0x3a, 0x4d, 0xb0, 0x13, 0xaf, 0x0a, 0x28, 0x75, 0xfd, + 0xe4, 0xe2, 0x7b, 0xf3, 0xad, 0x0b, 0x3c, 0x8f, 0xa3, 0x77, 0xf7, 0xff, + 0x7b, 0x9b, 0xe8, 0xeb, 0xff, 0xff, 0xf7, 0x23, 0xc2, 0xed, 0x4d, 0x4c, + 0x9c, 0x6c, 0x6b, 0xd1, 0xbc, 0x7d, 0xcd, 0x1d, 0x7f, 0xbb, 0x9b, 0xc7, + 0x11, 0x67, 0x5f, 0xff, 0xff, 0xfb, 0x5a, 0xcf, 0x75, 0xd7, 0xae, 0x71, + 0x37, 0xf3, 0xba, 0x99, 0x93, 0x7f, 0xe8, 0x67, 0x78, 0x3a, 0xf7, 0x73, + 0x87, 0x5f, 0xde, 0x17, 0x06, 0x09, 0xd7, 0xe1, 0x70, 0x60, 0x9d, 0x5f, + 0x0f, 0x3b, 0xc5, 0x55, 0x09, 0xef, 0x86, 0x10, 0x6e, 0x65, 0xe8, 0x4e, + 0xfe, 0xd3, 0x7c, 0x07, 0xdf, 0x47, 0x5c, 0xcb, 0x27, 0x56, 0x8d, 0xd3, + 0x24, 0x57, 0xe4, 0xeb, 0xe7, 0x4a, 0x54, 0xd1, 0x5f, 0xf7, 0xfe, 0x81, + 0x6b, 0x16, 0x05, 0x9d, 0x7b, 0xb0, 0x03, 0xa9, 0x0f, 0x65, 0xcf, 0xaf, + 0xe7, 0xec, 0x0e, 0x4e, 0x75, 0xfe, 0xec, 0x7b, 0xf5, 0xff, 0xe3, 0xaa, + 0x19, 0x32, 0xf2, 0x84, 0x78, 0x61, 0x59, 0xbc, 0x36, 0x58, 0xc8, 0xa6, + 0x8d, 0x8b, 0x84, 0x2b, 0x57, 0xec, 0x3b, 0x5c, 0xb4, 0x0e, 0xac, 0x12, + 0x91, 0x94, 0x21, 0xa8, 0x58, 0x7a, 0x11, 0xfb, 0x48, 0x36, 0x0a, 0xef, + 0x93, 0x9f, 0x66, 0x3a, 0xec, 0xc3, 0xaf, 0x9b, 0xd4, 0xfa, 0x75, 0x74, + 0xf6, 0xd8, 0x24, 0x9f, 0x45, 0x2f, 0xd3, 0x44, 0xdd, 0x83, 0xae, 0xfb, + 0x07, 0x5e, 0x65, 0x96, 0x4a, 0xbe, 0x97, 0xb1, 0xa5, 0x2a, 0x5f, 0xdf, + 0xb0, 0x28, 0x0d, 0x1e, 0xef, 0xea, 0xe1, 0xf2, 0x09, 0x8d, 0x42, 0x38, + 0xf8, 0x50, 0xf0, 0x9a, 0xbb, 0xda, 0x3a, 0xff, 0xbe, 0x7b, 0xb1, 0xed, + 0x75, 0x0e, 0xb6, 0x8e, 0xbf, 0xde, 0xde, 0x5d, 0x81, 0x9c, 0xab, 0xff, + 0x66, 0xf2, 0x4c, 0x11, 0xc0, 0x9d, 0x7e, 0x9d, 0x7f, 0xef, 0xe3, 0xaa, + 0x11, 0xf5, 0xb8, 0xb7, 0x0e, 0x84, 0x43, 0x46, 0x9e, 0x3b, 0xbf, 0xdb, + 0xcb, 0xf7, 0xfa, 0xe1, 0x3a, 0xff, 0x86, 0x19, 0xd2, 0x0e, 0xf2, 0x3a, + 0xe8, 0x69, 0xd4, 0x27, 0x9b, 0xb4, 0xe2, 0xfa, 0x7f, 0xb0, 0xc6, 0x75, + 0xfe, 0xd0, 0x46, 0x19, 0xc1, 0x3a, 0xb8, 0x7b, 0x1e, 0x27, 0xa8, 0x4d, + 0xdb, 0x15, 0x92, 0x10, 0x6e, 0xf7, 0x7f, 0x0e, 0xfa, 0x9b, 0x3c, 0x75, + 0xfc, 0x9e, 0x17, 0x06, 0x8e, 0xbf, 0xfd, 0xe9, 0xb3, 0x98, 0xeb, 0x8e, + 0xa0, 0x4e, 0xbf, 0xbf, 0x5e, 0x77, 0x77, 0x3a, 0x94, 0x45, 0x08, 0x95, + 0xe9, 0x22, 0xff, 0xf2, 0x04, 0x5f, 0x71, 0xcf, 0x62, 0x00, 0xeb, 0xfa, + 0x3d, 0xd9, 0x6b, 0xf3, 0xaf, 0xdd, 0x7e, 0x67, 0x0e, 0xbb, 0xf7, 0x3a, + 0x9a, 0x6f, 0x04, 0x9a, 0xfe, 0xe4, 0x24, 0x9f, 0x47, 0x5f, 0xfb, 0x7d, + 0x22, 0x99, 0xe4, 0xe6, 0x1d, 0x68, 0x9d, 0x11, 0x22, 0x41, 0xe2, 0xbb, + 0xf4, 0xec, 0x69, 0x9b, 0x9d, 0x7e, 0x4d, 0x44, 0xeb, 0x3d, 0x9f, 0xb7, + 0xe8, 0x7e, 0x03, 0xf3, 0xd9, 0xfb, 0x73, 0xc8, 0xf6, 0x7e, 0xdf, 0x7f, + 0x2c, 0xd1, 0xec, 0xfd, 0xa0, 0x9e, 0x88, 0x91, 0x5f, 0xa3, 0x35, 0x82, + 0x7b, 0x3f, 0x68, 0xf6, 0x7e, 0xdc, 0xfe, 0x3d, 0x9f, 0xab, 0x2d, 0xed, + 0x21, 0x3f, 0x9f, 0xd2, 0x2f, 0xb3, 0x65, 0x00, 0x7b, 0x3f, 0x68, 0xf6, + 0x7e, 0xdc, 0x08, 0x3d, 0x9f, 0xb7, 0xfd, 0x80, 0x7e, 0x66, 0xdc, 0x09, + 0xec, 0xfd, 0xbf, 0xb3, 0xa9, 0xaf, 0xe7, 0x3d, 0x9f, 0xb4, 0x04, 0x51, + 0x09, 0x16, 0x91, 0x6f, 0xb9, 0x3c, 0x78, 0xf6, 0x7e, 0xd1, 0xec, 0xfd, + 0xc3, 0x5f, 0x73, 0x2c, 0x9e, 0xcf, 0xda, 0x92, 0xb0, 0xd0, 0x9a, 0x64, + 0x21, 0x77, 0x84, 0xd7, 0x0a, 0x16, 0x61, 0xa8, 0x5c, 0xf9, 0x79, 0x92, + 0x6b, 0xd2, 0x85, 0x0b, 0x67, 0xe9, 0x54, 0x48, 0x5f, 0xed, 0x64, 0xa5, + 0x1e, 0xdc, 0xea, 0xc3, 0xf0, 0xd1, 0xed, 0xff, 0xb1, 0xa1, 0xce, 0x32, + 0xfd, 0x98, 0xeb, 0xff, 0xb4, 0x39, 0x34, 0x4e, 0x07, 0xdf, 0x47, 0x5d, + 0x29, 0xca, 0xbe, 0x99, 0xdf, 0x87, 0x54, 0xe8, 0xdd, 0xdc, 0x87, 0xa7, + 0xe2, 0x8b, 0xb0, 0x2f, 0x5c, 0x5d, 0x63, 0x79, 0xd1, 0x5b, 0xfc, 0xbd, + 0x0e, 0x7b, 0x00, 0x75, 0xff, 0x36, 0x00, 0x1f, 0xdf, 0x92, 0x3a, 0xff, + 0xce, 0xf3, 0xe2, 0xdc, 0x77, 0x91, 0xd7, 0xe6, 0x45, 0xd4, 0xd6, 0x1f, + 0xb4, 0xc7, 0x35, 0x08, 0xe7, 0x78, 0x53, 0xdf, 0x87, 0xdd, 0xc9, 0xce, + 0xb8, 0x2c, 0x9d, 0x50, 0x6f, 0xb0, 0x9e, 0xff, 0xfd, 0x2e, 0x46, 0xd7, + 0x9a, 0x03, 0xd8, 0x5b, 0xcc, 0x75, 0xfe, 0xd8, 0x7d, 0x26, 0xa6, 0xc3, + 0xab, 0x74, 0x46, 0x71, 0x5e, 0xa1, 0x99, 0xf3, 0x29, 0x54, 0x78, 0x7e, + 0x90, 0xcf, 0x63, 0x30, 0xe2, 0x37, 0x61, 0xe6, 0xf3, 0xb3, 0x03, 0x18, + 0xa6, 0x99, 0x3f, 0x85, 0x5d, 0xff, 0xff, 0x27, 0x5f, 0xb1, 0x25, 0x70, + 0x11, 0x2d, 0x07, 0xb1, 0xc3, 0xaf, 0xfc, 0xa4, 0x6e, 0x31, 0xde, 0xfe, + 0xd3, 0xaf, 0xfe, 0xe4, 0x60, 0xe4, 0x93, 0xb9, 0xb4, 0xeb, 0xff, 0xe1, + 0x75, 0x35, 0x9b, 0x63, 0x7f, 0x6b, 0xf5, 0x9d, 0x41, 0x44, 0xa8, 0xa1, + 0x5f, 0xc2, 0xea, 0x75, 0xe4, 0x75, 0xf9, 0xb8, 0xb8, 0xd1, 0xd7, 0x99, + 0x65, 0x92, 0xaf, 0x7d, 0x80, 0x14, 0xa9, 0x7f, 0x7f, 0xcf, 0x2f, 0xbc, + 0xcd, 0xaf, 0xc3, 0xaf, 0xff, 0xdd, 0xc9, 0x7d, 0x11, 0xc9, 0xe6, 0x94, + 0x72, 0x73, 0xa8, 0x51, 0x27, 0xe3, 0xbb, 0xfe, 0xf3, 0x8e, 0x6b, 0x91, + 0xa3, 0xaf, 0xa5, 0x00, 0xdc, 0xeb, 0xf8, 0x10, 0x39, 0xbf, 0x8e, 0xb9, + 0xc1, 0xf0, 0xf3, 0xbe, 0x91, 0x53, 0xa2, 0xd4, 0x61, 0x09, 0x7b, 0x6c, + 0x70, 0xea, 0x92, 0xba, 0x70, 0xb2, 0xe4, 0x35, 0x56, 0x44, 0xe5, 0x80, + 0x45, 0x18, 0x60, 0x7a, 0x1a, 0xfb, 0x49, 0xae, 0x49, 0xce, 0xbf, 0xc2, + 0xd0, 0xa6, 0xd8, 0x09, 0xd4, 0x13, 0xc9, 0xfc, 0x5a, 0xc0, 0x3a, 0xff, + 0xb2, 0x18, 0xfe, 0x75, 0xf3, 0x87, 0x5e, 0x5a, 0x4c, 0x75, 0xfe, 0x06, + 0xca, 0x2c, 0x21, 0xc3, 0xaf, 0xfb, 0xdd, 0xcd, 0x7c, 0xf2, 0x4e, 0x75, + 0x41, 0xf8, 0x21, 0xad, 0xff, 0x0a, 0x7e, 0xc1, 0xd6, 0xcc, 0x78, 0xea, + 0x92, 0x66, 0xd3, 0x08, 0x2c, 0xef, 0xb0, 0x8c, 0x12, 0x0b, 0xcc, 0xb2, + 0xc9, 0x62, 0x10, 0x5f, 0x35, 0xdd, 0xa5, 0x88, 0x40, 0xa9, 0xad, 0xbe, + 0x7e, 0x63, 0x27, 0x57, 0x0f, 0x83, 0x69, 0xfd, 0xe6, 0x59, 0x64, 0xb1, + 0x07, 0xa8, 0xb1, 0x07, 0x95, 0x35, 0xb7, 0x99, 0x65, 0x93, 0xaf, 0x6a, + 0x14, 0x29, 0x52, 0xfe, 0xcb, 0xc4, 0x62, 0xb5, 0x47, 0xc9, 0x17, 0xff, + 0x76, 0x24, 0x9e, 0xce, 0xb6, 0x16, 0x75, 0x41, 0xfb, 0xed, 0x35, 0xbf, + 0xfd, 0x9d, 0x4e, 0x75, 0xf3, 0x48, 0xf3, 0x9d, 0x7d, 0x1e, 0x85, 0x9d, + 0x4b, 0x3e, 0x7f, 0x23, 0xdf, 0xcc, 0xb8, 0x7f, 0x7f, 0xa7, 0x5f, 0x0a, + 0x42, 0x87, 0x5e, 0xfb, 0x00, 0x3a, 0xa7, 0x37, 0xab, 0x20, 0xbf, 0x36, + 0x3b, 0x0b, 0x2a, 0xfc, 0x2e, 0x23, 0x85, 0x5d, 0x8d, 0x2a, 0xe6, 0x59, + 0x2a, 0xb0, 0xfd, 0xb4, 0x4d, 0xe2, 0x36, 0x45, 0x6f, 0xf0, 0xfd, 0x80, + 0x77, 0x36, 0x0a, 0x54, 0xde, 0x5f, 0xfe, 0x9c, 0x3c, 0x76, 0x8e, 0x6d, + 0xe2, 0x68, 0xea, 0x84, 0xfd, 0x70, 0x89, 0x1b, 0x5e, 0x1a, 0x9f, 0xa3, + 0xdf, 0xfd, 0x00, 0xd6, 0x60, 0x5c, 0x5d, 0x43, 0xaf, 0xe1, 0x8c, 0xe3, + 0x80, 0xeb, 0xff, 0x47, 0x3b, 0x09, 0xd8, 0x14, 0x3a, 0xe9, 0x6b, 0xc7, + 0xc8, 0xc9, 0x55, 0xfe, 0x81, 0xc5, 0xa6, 0xf2, 0x3a, 0xff, 0xfb, 0x43, + 0x9b, 0x81, 0xf4, 0xfc, 0x4d, 0xc0, 0x75, 0x6e, 0x8a, 0xff, 0x17, 0xb2, + 0x63, 0x5d, 0x4e, 0x19, 0xe3, 0x54, 0xbf, 0xb5, 0xf4, 0x3f, 0x8c, 0x8e, + 0xbf, 0x91, 0xa1, 0xc7, 0x01, 0xd7, 0xff, 0xef, 0x6b, 0x7f, 0x81, 0xc0, + 0xc3, 0xf3, 0x04, 0x07, 0x5f, 0xfe, 0xd6, 0x7b, 0xe3, 0x7a, 0x9d, 0xea, + 0x00, 0xd0, 0x85, 0xde, 0x89, 0xd5, 0xd2, 0x2b, 0xbc, 0xad, 0x7e, 0x5e, + 0x99, 0x7d, 0xce, 0xb6, 0x82, 0x7b, 0xff, 0x4d, 0xaf, 0xec, 0x9a, 0x49, + 0xcd, 0x1d, 0x7f, 0x46, 0xff, 0x75, 0x18, 0x75, 0x43, 0x2a, 0xc4, 0x30, + 0xd7, 0xc8, 0xd6, 0x52, 0x50, 0xcf, 0x25, 0x3f, 0xbc, 0x7a, 0x6c, 0x12, + 0x91, 0x30, 0xd4, 0x67, 0x1e, 0x2a, 0xfc, 0xb6, 0xf3, 0x2c, 0xb2, 0x55, + 0xf0, 0x1c, 0x42, 0x52, 0xa5, 0xfd, 0xf7, 0x51, 0xe4, 0x75, 0xf7, 0x38, + 0x8b, 0x3a, 0xf6, 0xa3, 0xc7, 0x5e, 0x1f, 0x69, 0x0d, 0xe4, 0xc4, 0x37, + 0xbe, 0x29, 0xb2, 0x75, 0xef, 0x38, 0x4e, 0xae, 0x1b, 0xdd, 0x11, 0x5f, + 0xcd, 0x80, 0x27, 0x14, 0x3a, 0xfe, 0xfb, 0x9c, 0xcc, 0x98, 0xeb, 0xf3, + 0xf7, 0xe0, 0x60, 0xea, 0x92, 0x73, 0xe1, 0x30, 0xc5, 0xc4, 0x6f, 0x12, + 0x1d, 0x16, 0xf8, 0xba, 0xfc, 0xfc, 0xe6, 0x6e, 0x75, 0xff, 0xef, 0x75, + 0x1c, 0x19, 0xc0, 0xc0, 0xc8, 0xeb, 0xff, 0xdb, 0xfc, 0xdc, 0x10, 0x2d, + 0x79, 0xc5, 0xce, 0xa8, 0x45, 0xd6, 0x13, 0x8a, 0x3d, 0xfa, 0x35, 0xf4, + 0x64, 0x75, 0xff, 0xff, 0xce, 0x9e, 0x4e, 0xb5, 0x3e, 0x49, 0x3a, 0xe3, + 0xe9, 0x67, 0x30, 0xeb, 0xdd, 0xcd, 0x83, 0xab, 0xa8, 0x8d, 0x76, 0xfb, + 0xfe, 0x18, 0xdf, 0x51, 0xe8, 0x09, 0xd7, 0xde, 0xd7, 0xdd, 0x7c, 0x3d, + 0x9c, 0x22, 0xbf, 0xff, 0xff, 0xe8, 0xd4, 0x7a, 0x7c, 0x67, 0x99, 0xd7, + 0xfb, 0xac, 0x51, 0xc4, 0x10, 0x31, 0x37, 0x60, 0xeb, 0xf6, 0xba, 0xed, + 0x83, 0xa8, 0x51, 0x74, 0xcc, 0x25, 0x2f, 0xff, 0xfe, 0x45, 0x37, 0x97, + 0xb0, 0x7d, 0xaf, 0x9a, 0xd6, 0x73, 0x05, 0xe4, 0x75, 0xff, 0xca, 0x84, + 0x63, 0xf6, 0xe2, 0x89, 0xc3, 0xae, 0xc6, 0x4e, 0xb6, 0x41, 0xed, 0xe9, + 0x16, 0xff, 0x07, 0xb1, 0x33, 0xbe, 0xe7, 0x5e, 0xe8, 0x36, 0x9d, 0x5c, + 0x3d, 0x1d, 0x83, 0x3a, 0x92, 0x27, 0x1d, 0xde, 0xff, 0xec, 0xe0, 0x16, + 0x9a, 0xfb, 0xa8, 0xc3, 0xaf, 0xc1, 0xe4, 0x6e, 0xc6, 0x75, 0xff, 0xff, + 0xbd, 0x1c, 0x03, 0x7a, 0x92, 0x4e, 0x38, 0x3c, 0x30, 0xbd, 0x1d, 0x73, + 0x1e, 0x8e, 0xa5, 0x11, 0x06, 0xed, 0x55, 0x24, 0xc5, 0x71, 0x11, 0xe1, + 0x5d, 0x79, 0x8a, 0x10, 0x1d, 0x78, 0x38, 0xb3, 0xaf, 0x81, 0xec, 0x01, + 0xd4, 0x86, 0xf3, 0x83, 0x77, 0xfc, 0xde, 0x8c, 0x6e, 0x91, 0xd3, 0xaa, + 0x17, 0xbf, 0xa5, 0x18, 0xe0, 0x4b, 0x72, 0x30, 0xe4, 0x87, 0xbf, 0x0a, + 0x1e, 0x36, 0xa1, 0x8c, 0xdf, 0x46, 0x9f, 0xae, 0x7d, 0x20, 0xbf, 0xf3, + 0xa0, 0x7f, 0xf6, 0xa7, 0xc6, 0x4e, 0xbf, 0x6b, 0x14, 0x8d, 0x1d, 0x7f, + 0x31, 0xe9, 0x07, 0x79, 0x1d, 0x7f, 0xe7, 0xe6, 0xca, 0x77, 0x1f, 0x70, + 0x1d, 0x7f, 0xfe, 0x4f, 0x42, 0xf3, 0x7f, 0x42, 0xfe, 0xf1, 0xc0, 0x75, + 0xf2, 0x0b, 0x84, 0xeb, 0xfe, 0xd4, 0x73, 0xd0, 0xa8, 0x50, 0xea, 0x92, + 0x2b, 0x42, 0xad, 0xa1, 0xfb, 0xff, 0xda, 0x4e, 0x44, 0xbb, 0x13, 0x0f, + 0xea, 0x1d, 0x73, 0x76, 0x4e, 0xbf, 0x94, 0xf4, 0x76, 0x34, 0x75, 0xfd, + 0xd4, 0xdf, 0x4f, 0xb9, 0xd5, 0x23, 0xf4, 0x41, 0x90, 0x16, 0xdf, 0xf8, + 0x5e, 0x6e, 0xbf, 0x38, 0x81, 0x3a, 0xf4, 0x31, 0x37, 0x3a, 0xfe, 0xfb, + 0x1f, 0xb7, 0xf5, 0x9d, 0x72, 0x09, 0xd7, 0xd2, 0x81, 0x69, 0xd4, 0x13, + 0x69, 0x82, 0x97, 0xf4, 0x79, 0x80, 0xf1, 0xb9, 0xd5, 0xf0, 0xf4, 0x10, + 0x82, 0xfa, 0x01, 0x82, 0x75, 0x49, 0x5d, 0xae, 0x13, 0xb4, 0xc1, 0x21, + 0xdb, 0x31, 0x87, 0x21, 0x7e, 0xb2, 0xed, 0x1e, 0xfe, 0x40, 0xcc, 0x2d, + 0x76, 0x48, 0xef, 0xc8, 0xb6, 0x19, 0x89, 0xb1, 0x67, 0x5f, 0x7d, 0x86, + 0x74, 0x75, 0xc0, 0xf1, 0xd7, 0x03, 0xa7, 0x5f, 0x73, 0x99, 0xa3, 0xae, + 0xc9, 0x8e, 0xb4, 0xbe, 0x22, 0x1e, 0x72, 0x45, 0x8b, 0x38, 0xb7, 0xd2, + 0x1b, 0xf2, 0x79, 0xc7, 0x0e, 0xbf, 0x70, 0x39, 0x82, 0x75, 0xff, 0xcc, + 0x69, 0x9d, 0x8d, 0xba, 0xec, 0x6e, 0x75, 0xfd, 0xbf, 0x3f, 0xdf, 0xd2, + 0x3a, 0x9d, 0x13, 0xda, 0x25, 0xfd, 0x22, 0xff, 0xb0, 0x79, 0x9a, 0xc4, + 0xe9, 0xd7, 0xff, 0xd2, 0xf0, 0xe3, 0xf8, 0x73, 0xde, 0xc6, 0x4e, 0xbb, + 0x36, 0x9d, 0x7f, 0xcd, 0xee, 0x05, 0x69, 0xcc, 0x3a, 0xa7, 0x3c, 0xec, + 0x17, 0xbf, 0xa2, 0x39, 0xd8, 0xda, 0x75, 0xff, 0xef, 0x6b, 0x26, 0xec, + 0x6d, 0xce, 0xf6, 0x0e, 0xbf, 0xba, 0x14, 0xdb, 0x01, 0x3a, 0xb0, 0xfe, + 0x5d, 0x2e, 0xfb, 0x3c, 0x9a, 0x3a, 0xfe, 0x62, 0xa6, 0x16, 0x2e, 0x7f, + 0xce, 0xad, 0x1e, 0xd7, 0x88, 0x2a, 0x4a, 0xc9, 0x83, 0x0c, 0x26, 0x98, + 0x6e, 0x6b, 0xc8, 0x4d, 0xf4, 0x88, 0x61, 0x4d, 0xe7, 0xab, 0xcc, 0xe7, + 0x4e, 0xbf, 0xda, 0x45, 0x3a, 0xe2, 0x87, 0x5f, 0x26, 0xb0, 0x2e, 0x79, + 0xbe, 0x1c, 0xbf, 0xf3, 0xb1, 0x83, 0xfd, 0x20, 0xef, 0x23, 0xaf, 0xff, + 0xba, 0x91, 0xe4, 0x04, 0x49, 0x56, 0x59, 0x64, 0xab, 0xff, 0x92, 0x3c, + 0x08, 0x92, 0xac, 0xb2, 0xc9, 0x56, 0xf6, 0x22, 0x67, 0xaa, 0x57, 0xfb, + 0xbf, 0xba, 0xc2, 0xeb, 0x3a, 0x84, 0xf6, 0xfc, 0x51, 0x7c, 0x1c, 0xc5, + 0x0a, 0xbe, 0x70, 0x3f, 0x8e, 0xbf, 0xee, 0x3b, 0x7e, 0x76, 0x3e, 0x89, + 0xd7, 0xbf, 0x8e, 0x1d, 0x77, 0xb4, 0x13, 0xd7, 0x98, 0xee, 0xf4, 0x87, + 0xf3, 0x44, 0x33, 0x7b, 0xb1, 0x39, 0xd7, 0x99, 0x65, 0x92, 0xaf, 0x60, + 0xb4, 0xa5, 0x4b, 0xfb, 0xff, 0x64, 0xf8, 0x17, 0x90, 0xc4, 0xe7, 0x50, + 0x0f, 0x9c, 0x4a, 0xaf, 0x9c, 0x58, 0x93, 0x08, 0xeb, 0x98, 0x93, 0x12, + 0x3a, 0xfd, 0x9e, 0xf7, 0xf3, 0x9d, 0x69, 0x31, 0x23, 0xcb, 0x12, 0x2b, + 0xce, 0xc7, 0x07, 0x5f, 0xb0, 0x3d, 0x76, 0x33, 0xaf, 0xc3, 0x81, 0x85, + 0x9d, 0x50, 0xab, 0x86, 0x72, 0x10, 0x90, 0xe3, 0xbe, 0xe5, 0xf3, 0x14, + 0xf2, 0x14, 0x5d, 0x21, 0x77, 0x5f, 0xcb, 0x76, 0x8e, 0xb2, 0x53, 0x7f, + 0xa1, 0x78, 0x9c, 0x9a, 0x47, 0x5e, 0xf2, 0x41, 0xd7, 0x60, 0x9d, 0x48, + 0x6b, 0xbf, 0x1a, 0xbf, 0xff, 0x75, 0xf9, 0xac, 0x41, 0x7f, 0x69, 0x98, + 0x13, 0xaf, 0xc1, 0x4e, 0x47, 0x8e, 0xbf, 0x44, 0xbb, 0x9b, 0x9d, 0x76, + 0xe0, 0x3a, 0xfe, 0x5c, 0x68, 0x08, 0xd3, 0xaf, 0x6a, 0x14, 0x01, 0xe1, + 0xe8, 0x5e, 0xff, 0x7f, 0x9c, 0x00, 0x10, 0x4e, 0xbf, 0xf6, 0x2d, 0x03, + 0xcc, 0x0b, 0xac, 0xeb, 0xec, 0x5f, 0xd0, 0x9d, 0x5d, 0x3d, 0xf1, 0x3c, + 0xbf, 0xfc, 0x81, 0xef, 0xdd, 0x67, 0x1a, 0xee, 0xd3, 0x44, 0x19, 0x7d, + 0xff, 0x71, 0xa7, 0x54, 0x8f, 0xe7, 0x65, 0x5e, 0xff, 0x77, 0xf5, 0x07, + 0x27, 0xfc, 0xeb, 0xdd, 0xfd, 0x8c, 0xeb, 0xff, 0xdc, 0x7d, 0xb8, 0x2d, + 0xea, 0x03, 0xef, 0x8e, 0xa8, 0x46, 0x3c, 0x89, 0x58, 0x26, 0xdf, 0x90, + 0x56, 0xea, 0x99, 0xfa, 0x69, 0xa8, 0x48, 0xfa, 0x36, 0x1b, 0xcf, 0xb7, + 0x0e, 0xbf, 0xf0, 0x1b, 0xd4, 0xe0, 0xa7, 0xb4, 0x75, 0xfe, 0x02, 0x77, + 0xb8, 0x07, 0x3a, 0xff, 0xff, 0x97, 0x9e, 0xf3, 0xf0, 0x63, 0x79, 0x7d, + 0xe0, 0x16, 0x9a, 0x3a, 0xff, 0x96, 0x8c, 0xe0, 0x87, 0xb0, 0x75, 0xdd, + 0xfc, 0xeb, 0xff, 0xf4, 0x90, 0x43, 0xdc, 0xdf, 0xeb, 0x8f, 0x84, 0x27, + 0x5e, 0x46, 0x58, 0xce, 0xbf, 0xd9, 0xb7, 0x5e, 0xf4, 0x2c, 0xea, 0xe1, + 0xe9, 0xf4, 0x7e, 0xa1, 0x38, 0x0c, 0x68, 0x43, 0x79, 0x85, 0xf5, 0x0a, + 0x8b, 0xf9, 0x16, 0xdc, 0x16, 0x9d, 0x7f, 0x66, 0xb6, 0x73, 0x90, 0x75, + 0x70, 0xf6, 0x76, 0x4a, 0xea, 0x4b, 0xd1, 0x61, 0x21, 0xc5, 0x26, 0x93, + 0x24, 0xad, 0x15, 0xa5, 0xb8, 0xe0, 0x0f, 0x75, 0x1d, 0x8f, 0xa1, 0x4f, + 0x7f, 0xb5, 0xac, 0x10, 0x6c, 0xe1, 0xd7, 0xc2, 0x9b, 0x10, 0x75, 0xa6, + 0x3a, 0xfe, 0xd6, 0x08, 0x36, 0x70, 0xeb, 0x6d, 0xf8, 0x89, 0x5c, 0x34, + 0x01, 0x16, 0x84, 0x6f, 0xfb, 0xff, 0x03, 0xf5, 0xc6, 0x78, 0xeb, 0xff, + 0xc3, 0x3f, 0xc9, 0x90, 0x70, 0x38, 0x2a, 0x1d, 0x7f, 0x26, 0xfb, 0x1d, + 0x8f, 0x1d, 0x7b, 0xee, 0x41, 0xd5, 0x08, 0x97, 0x63, 0x4b, 0x73, 0x0b, + 0xff, 0xfd, 0x82, 0xfe, 0xd6, 0x70, 0x00, 0x8c, 0xdf, 0xda, 0x43, 0xae, + 0xcd, 0x93, 0xac, 0xe1, 0x3f, 0x6f, 0x2f, 0x5e, 0x8e, 0x4c, 0x75, 0x7c, + 0x6e, 0x31, 0x62, 0x5f, 0xac, 0xf0, 0xad, 0x0c, 0x2f, 0xb2, 0x5b, 0xd3, + 0x61, 0x9f, 0xb9, 0xba, 0x4e, 0x0b, 0xf6, 0x16, 0x0f, 0x3d, 0xd6, 0x08, + 0xcc, 0x85, 0x1b, 0xf8, 0x68, 0xb3, 0x0a, 0x7d, 0x92, 0x7b, 0xdb, 0xcf, + 0xb4, 0xeb, 0xfb, 0xe3, 0x7b, 0x1b, 0xec, 0x1d, 0x7b, 0xe0, 0x19, 0x3a, + 0xb7, 0x3d, 0x2f, 0x19, 0xdf, 0xd8, 0xce, 0x60, 0xa8, 0x75, 0xf2, 0xdf, + 0x34, 0x75, 0x21, 0xe6, 0x39, 0x65, 0xff, 0xf3, 0x63, 0x5a, 0x85, 0xe7, + 0x93, 0x5d, 0x73, 0xaf, 0xf0, 0x8c, 0x49, 0x70, 0x87, 0x5f, 0xef, 0x26, + 0xd4, 0xf4, 0xa0, 0xab, 0x2c, 0xeb, 0xfb, 0x05, 0x4e, 0x42, 0xa8, 0x78, + 0x7f, 0x4c, 0xeb, 0x13, 0x05, 0x44, 0xdd, 0x39, 0x5f, 0x73, 0xfd, 0xe4, + 0x75, 0xfe, 0x19, 0x0e, 0x2e, 0x1a, 0x75, 0xe5, 0x87, 0x0e, 0xa8, 0x3e, + 0xfc, 0x24, 0x73, 0x0b, 0xdb, 0x3f, 0xf8, 0xeb, 0xe7, 0xe3, 0xfd, 0x3a, + 0xff, 0xf7, 0xa1, 0x68, 0x1c, 0x15, 0x3b, 0x0b, 0x3a, 0x9a, 0x88, 0xad, + 0x10, 0x78, 0x8a, 0xff, 0xf9, 0x3d, 0xd8, 0xd4, 0x76, 0x12, 0x78, 0x50, + 0xeb, 0xfd, 0xd8, 0x9a, 0x49, 0xc9, 0x1d, 0x7f, 0xbc, 0x8c, 0xcc, 0x2e, + 0xc9, 0xd7, 0xef, 0x7b, 0x4e, 0x03, 0xaf, 0xd0, 0xbf, 0x63, 0x4e, 0xb9, + 0x27, 0x3a, 0xa1, 0x31, 0x80, 0xa7, 0x6e, 0x66, 0x86, 0x9d, 0x27, 0xf1, + 0x35, 0xf9, 0x94, 0x0e, 0xc2, 0x1d, 0x7f, 0xdd, 0x89, 0x20, 0xe2, 0xe0, + 0xeb, 0xfe, 0xcf, 0x77, 0x16, 0x2f, 0xe3, 0xaf, 0xed, 0xa9, 0xcd, 0xe1, + 0x8c, 0xeb, 0x08, 0x4f, 0xa3, 0x0d, 0xaf, 0xcb, 0x86, 0xce, 0x13, 0xaf, + 0xa5, 0x0b, 0x73, 0xaf, 0xdc, 0x02, 0xd3, 0x47, 0x5d, 0xed, 0x61, 0xf7, + 0xb9, 0x47, 0xd2, 0x0a, 0x84, 0x68, 0x7f, 0x09, 0x5b, 0x68, 0xeb, 0xfa, + 0x27, 0xc1, 0x45, 0x0e, 0xae, 0x1b, 0xcd, 0x08, 0x5f, 0xfd, 0x02, 0xfd, + 0x80, 0x2b, 0xcd, 0x68, 0xaa, 0x9d, 0x51, 0xa8, 0x63, 0x6d, 0xc6, 0x45, + 0x90, 0xdf, 0xe7, 0x0e, 0xb5, 0x1c, 0x91, 0xd7, 0x7f, 0x39, 0xd7, 0xfb, + 0x79, 0x6f, 0xa4, 0xf4, 0x1d, 0x79, 0x37, 0xd1, 0xd5, 0x87, 0xa0, 0x86, + 0x94, 0x88, 0x88, 0xeb, 0x45, 0xd8, 0xd3, 0xaf, 0x73, 0x34, 0x77, 0x8b, + 0x5b, 0xff, 0xe0, 0xfc, 0x74, 0xcd, 0x44, 0xf8, 0x28, 0xa1, 0xd7, 0xfb, + 0x8b, 0x8d, 0xfc, 0xed, 0x3a, 0xff, 0xfe, 0x1c, 0xf7, 0x72, 0x58, 0xd8, + 0x6f, 0x85, 0xd6, 0x75, 0x62, 0x36, 0x51, 0x3f, 0x46, 0x77, 0xc8, 0xb8, + 0x98, 0xeb, 0xec, 0x9f, 0xf9, 0x1d, 0x53, 0x1e, 0x23, 0x24, 0x37, 0xdf, + 0x84, 0x30, 0x75, 0x41, 0xe3, 0x39, 0x25, 0xd8, 0xc9, 0xd4, 0x55, 0xfd, + 0xaf, 0xb1, 0xc8, 0x59, 0x54, 0x55, 0x15, 0x45, 0x51, 0x55, 0x23, 0xe0, + 0x40, 0xa0, 0x17, 0x7e, 0x15, 0xb2, 0x15, 0xb0, 0x15, 0x77, 0x70, 0xab, + 0xf9, 0xdf, 0xd3, 0x42, 0xca, 0xf8, 0x5a, 0xd9, 0x82, 0x55, 0x15, 0x45, + 0x54, 0x8b, 0x44, 0x0a, 0xa2, 0xa8, 0xaa, 0x2a, 0x8a, 0xa2, 0xa8, 0xaa, + 0x9c, 0xde, 0x04, 0x29, 0x02, 0x80, 0x15, 0xa0, 0xad, 0xa1, 0x54, 0x55, + 0x15, 0x52, 0x2d, 0x34, 0x15, 0x45, 0x51, 0x54, 0x55, 0x15, 0x52, 0x35, + 0x00, 0x0a, 0xf0, 0x56, 0xc0, 0x55, 0x15, 0x45, 0x51, 0x54, 0x55, 0x4e, + 0x6a, 0x14, 0x0a, 0xe0, 0x57, 0x42, 0xac, 0xa1, 0x54, 0x55, 0x15, 0x45, + 0x51, 0x54, 0x13, 0x51, 0xb8, 0x50, 0x02, 0xbf, 0x0a, 0xa2, 0xa8, 0xaa, + 0x2a, 0xfd, 0xd8, 0x06, 0xb0, 0xaa, 0x2a, 0xa4, 0x79, 0xcd, 0x0a, 0xe8, + 0x53, 0x85, 0x00, 0x9a, 0xcd, 0x2a, 0x8a, 0xa2, 0xa8, 0xaa, 0x2a, 0xa4, + 0x6a, 0x37, 0x0a, 0x40, 0xad, 0xa1, 0x54, 0x55, 0x15, 0x45, 0x51, 0x55, + 0x23, 0x50, 0x10, 0xae, 0x85, 0x08, 0x55, 0xba, 0x55, 0x15, 0x45, 0x5a, + 0x45, 0x51, 0x5b, 0x96, 0x14, 0x55, 0x15, 0x45, 0x51, 0x55, 0x39, 0xf3, + 0x48, 0x29, 0x41, 0xa6, 0x8d, 0x4c, 0x14, 0x00, 0xaf, 0x05, 0x5b, 0x0a, + 0xa2, 0xa8, 0xab, 0x48, 0xaa, 0x2b, 0x72, 0xc2, 0x8a, 0xa2, 0xaa, 0x0f, + 0x4a, 0x41, 0x48, 0x35, 0xc1, 0xa5, 0x85, 0x51, 0x54, 0x55, 0x15, 0x45, + 0x51, 0x55, 0x06, 0xcb, 0x70, 0xae, 0x05, 0x2c, 0x28, 0x42, 0xa8, 0xaa, + 0x2a, 0x8a, 0xae, 0x17, 0xda, 0x0a, 0xf0, 0x55, 0x15, 0x45, 0x51, 0x54, + 0xb2, 0xf8, 0x42, 0xbc, 0x15, 0x65, 0x95, 0x45, 0x51, 0x54, 0x02, 0xd3, + 0xf0, 0xaa, 0x2a, 0x8a, 0xa2, 0xa8, 0xaa, 0x83, 0x51, 0x30, 0x57, 0x42, + 0xbf, 0x0a, 0xa8, 0x5f, 0xa5, 0x9d, 0xc6, 0x47, 0xa1, 0x28, 0xc5, 0xb6, + 0xb5, 0xee, 0x90, 0x8c, 0xcc, 0x67, 0xb3, 0x1c, 0xf2, 0x11, 0x6b, 0x48, + 0xe9, 0xc3, 0xb2, 0x80, 0xe8, 0x5d, 0xb4, 0xcd, 0xe6, 0x1f, 0xde, 0x76, + 0xb2, 0xb2, 0x97, 0xb2, 0x59, 0xf4, 0x93, 0x61, 0x26, 0xfd, 0x21, 0x8c, + 0xd1, 0x71, 0x0c, 0x2a, 0x9a, 0xb5, 0xe4, 0x85, 0x97, 0x10, 0xc5, 0xf2, + 0x35, 0xf8, 0x7c, 0x43, 0x2f, 0x20, 0x70, 0xf8, 0x86, 0x59, 0x5d, 0xd1, + 0x87, 0xc4, 0x7e, 0x94, 0x78, 0xb6, 0xd1, 0xb5, 0x94, 0xf3, 0xf6, 0x94, + 0x69, 0x7f, 0xba, 0x8c, 0x87, 0x91, 0x39, 0xd7, 0x93, 0x6b, 0x04, 0xea, + 0xdd, 0x11, 0xd3, 0x1c, 0xf8, 0xd2, 0xfd, 0x99, 0x33, 0xfd, 0x3a, 0xe0, + 0x41, 0xd7, 0xf7, 0x1c, 0x7e, 0xc0, 0x0e, 0xb9, 0xf8, 0x75, 0x90, 0xe6, + 0x96, 0xb6, 0x69, 0xd6, 0x59, 0xd7, 0x6c, 0xaa, 0x88, 0x95, 0xe0, 0xaf, + 0x50, 0x9c, 0x7b, 0xe8, 0x85, 0xff, 0x76, 0x17, 0x93, 0x40, 0xce, 0x75, + 0xff, 0xdf, 0x1d, 0xa1, 0xec, 0x03, 0x04, 0x07, 0x5c, 0x08, 0x3a, 0xb0, + 0xf6, 0x40, 0x89, 0x58, 0x98, 0x60, 0x16, 0xbf, 0x84, 0x8d, 0xff, 0xc2, + 0x31, 0x38, 0xe2, 0x6d, 0x8d, 0x93, 0xaf, 0x46, 0xfa, 0x3a, 0x9c, 0xf8, + 0x74, 0x8b, 0x79, 0xf9, 0x07, 0x5f, 0x93, 0x65, 0xc4, 0x07, 0x54, 0x8f, + 0x09, 0x63, 0x57, 0xfd, 0xf5, 0xc3, 0xac, 0x5c, 0x31, 0x9d, 0x7b, 0x37, + 0x64, 0xeb, 0xdb, 0x83, 0x38, 0x7b, 0x22, 0x79, 0x7d, 0xb7, 0x39, 0x23, + 0xaf, 0x05, 0xc4, 0xea, 0x43, 0x7a, 0xe4, 0x77, 0xff, 0xd1, 0xf1, 0xf9, + 0xc7, 0x04, 0x2a, 0xcb, 0x2c, 0x9d, 0x50, 0x9a, 0xf3, 0xbd, 0xe9, 0xc3, + 0xf1, 0xfb, 0xff, 0xbf, 0xfb, 0x37, 0xc8, 0xfa, 0xed, 0x8e, 0x9d, 0x4c, + 0x06, 0xe9, 0x2e, 0x1c, 0xa7, 0x6f, 0x94, 0x64, 0xa1, 0x84, 0xf6, 0x42, + 0xd9, 0xb1, 0xa4, 0x6e, 0xae, 0x92, 0x97, 0xd8, 0xd1, 0x66, 0x85, 0xd7, + 0x0d, 0xd7, 0x18, 0x1f, 0x61, 0x70, 0xf4, 0xb2, 0x70, 0x19, 0x0c, 0x79, + 0x3a, 0x84, 0xbf, 0xa3, 0xc1, 0xfa, 0x7b, 0x79, 0x7a, 0x69, 0xd7, 0x85, + 0xb0, 0x75, 0x7c, 0x36, 0xc8, 0x39, 0x7f, 0x32, 0xfc, 0xe3, 0xee, 0x75, + 0xff, 0xfb, 0x5c, 0xe2, 0x4d, 0xae, 0x47, 0x91, 0xa8, 0x13, 0xa9, 0x68, + 0xa5, 0x12, 0x26, 0x4b, 0xaf, 0x97, 0xe8, 0xd1, 0xd7, 0xdc, 0x41, 0x50, + 0xeb, 0xfd, 0xe8, 0xfd, 0xbd, 0x4e, 0x1d, 0x7f, 0x63, 0x7b, 0x1b, 0xc8, + 0xeb, 0xf9, 0x7a, 0x45, 0x3c, 0xc9, 0xd7, 0xe8, 0xdf, 0xb1, 0x23, 0xab, + 0x88, 0xd7, 0x12, 0x1f, 0x19, 0xfd, 0x2d, 0xd8, 0x2f, 0xbf, 0xec, 0xdc, + 0x73, 0xde, 0xc9, 0xce, 0xbb, 0x7f, 0x1d, 0x7e, 0xc1, 0x9d, 0x38, 0x75, + 0xfb, 0xce, 0x3f, 0xe1, 0xd7, 0xfb, 0x58, 0xb4, 0xf7, 0x5c, 0xeb, 0x46, + 0x22, 0x53, 0x82, 0xe2, 0x4d, 0xe2, 0x6b, 0xdf, 0x16, 0x87, 0x5c, 0x2b, + 0x3a, 0xa4, 0x6c, 0xb4, 0x3b, 0x7b, 0x63, 0x90, 0x75, 0xfe, 0xe2, 0x4c, + 0x39, 0xb5, 0xce, 0xbb, 0x7d, 0x7c, 0x3f, 0x28, 0x21, 0xe0, 0xf5, 0xff, + 0x0c, 0x3c, 0xfd, 0x8e, 0x00, 0xeb, 0xfc, 0x9c, 0x1f, 0x7b, 0x27, 0x3a, + 0xe7, 0xda, 0x75, 0xfd, 0x21, 0x49, 0x77, 0x0e, 0xbf, 0x4e, 0x9c, 0x89, + 0x1d, 0x4a, 0x22, 0x6e, 0x63, 0x2e, 0x0b, 0x89, 0x5d, 0xf6, 0x05, 0x14, + 0x3a, 0xff, 0xf3, 0xa7, 0xa3, 0xda, 0xeb, 0xa7, 0x7f, 0x3a, 0xf8, 0x47, + 0xf9, 0x1d, 0x7f, 0xee, 0xc7, 0x00, 0x38, 0xcb, 0x80, 0xeb, 0xd9, 0x93, + 0x1d, 0x6c, 0xe9, 0xec, 0x00, 0xf6, 0xf4, 0x6e, 0xc9, 0xd7, 0xee, 0x7e, + 0xb7, 0x13, 0xab, 0xc7, 0x89, 0xf8, 0xed, 0xf2, 0xe3, 0x27, 0x3a, 0xfd, + 0x9b, 0x46, 0x37, 0x3a, 0x90, 0xf2, 0x74, 0x43, 0x7d, 0x03, 0xe6, 0x9d, + 0x41, 0x56, 0x15, 0x90, 0xd2, 0xe1, 0xf7, 0x48, 0x5d, 0x20, 0x5e, 0x74, + 0xd7, 0xe6, 0xcd, 0x92, 0x1b, 0xfc, 0x0f, 0xb8, 0x21, 0xec, 0x1d, 0x50, + 0x8b, 0x87, 0x84, 0x2d, 0xfd, 0xac, 0x5a, 0x76, 0x0e, 0xbd, 0xbc, 0xb4, + 0x75, 0x6e, 0x79, 0x1c, 0x2b, 0xbd, 0xa0, 0x32, 0x75, 0x41, 0xe0, 0x61, + 0x1d, 0xf7, 0xef, 0xc9, 0x1d, 0x7d, 0x1f, 0xb0, 0x74, 0x55, 0xfa, 0x4a, + 0xb2, 0xcb, 0x27, 0x50, 0x9e, 0x97, 0xe4, 0xd7, 0xcf, 0xe5, 0xf8, 0xea, + 0x0a, 0x2d, 0xf1, 0xd0, 0x04, 0x57, 0xfb, 0xe8, 0x8b, 0xb2, 0xfd, 0x3a, + 0xa1, 0x92, 0x19, 0x86, 0x09, 0x0f, 0x8e, 0x27, 0x2e, 0x19, 0x8f, 0x0e, + 0x40, 0x4b, 0xff, 0x18, 0x57, 0x7f, 0x0d, 0x76, 0x4b, 0xef, 0x31, 0x0c, + 0x4d, 0x80, 0x75, 0xe9, 0x0b, 0x9d, 0x6d, 0xd8, 0x83, 0xc5, 0x82, 0xbb, + 0xde, 0x70, 0x1d, 0x7f, 0x47, 0x27, 0x8e, 0x4e, 0x75, 0xff, 0xa0, 0x7d, + 0xdf, 0xde, 0x52, 0x83, 0xaf, 0xdf, 0x83, 0x05, 0xa7, 0x5e, 0xe4, 0x4c, + 0x75, 0xf2, 0x0b, 0xcc, 0x75, 0xff, 0x86, 0x14, 0xeb, 0xfb, 0xee, 0x00, + 0xeb, 0xe4, 0xd7, 0x30, 0xeb, 0xfd, 0xec, 0xfb, 0x13, 0x26, 0x8e, 0xa9, + 0xd3, 0x7c, 0x90, 0xd8, 0x4b, 0xb8, 0x7a, 0xb2, 0x7e, 0x8e, 0x09, 0x07, + 0x8f, 0xf6, 0x90, 0x5f, 0xf4, 0x27, 0x61, 0x73, 0xe3, 0x27, 0x5f, 0xd1, + 0xd4, 0x9d, 0xc4, 0xeb, 0xfe, 0x9c, 0x72, 0x5d, 0xc0, 0x68, 0xeb, 0xff, + 0x60, 0xef, 0x2d, 0x73, 0xf8, 0x01, 0xd7, 0xec, 0xf6, 0xb1, 0x43, 0xa9, + 0x0f, 0x99, 0x67, 0xf7, 0xf0, 0xfb, 0xe7, 0x73, 0x60, 0xeb, 0xc1, 0x8d, + 0xa7, 0x5f, 0xff, 0x60, 0x8c, 0x32, 0x11, 0x8d, 0xe4, 0x82, 0x75, 0xff, + 0xe7, 0xf9, 0x34, 0xa3, 0x93, 0xfc, 0x67, 0x3a, 0x75, 0x42, 0x3a, 0x82, + 0x63, 0xd1, 0xd1, 0x4c, 0xbf, 0xe5, 0xf7, 0x3d, 0x9f, 0xf2, 0x73, 0xaf, + 0xff, 0x94, 0x7f, 0x69, 0x06, 0x68, 0x6f, 0x33, 0x73, 0xaf, 0xfa, 0x3d, + 0x9c, 0x6b, 0xbb, 0x4d, 0x17, 0xc5, 0xfb, 0x39, 0x1b, 0xc8, 0xeb, 0xdd, + 0x85, 0xb4, 0xfa, 0xbc, 0x87, 0x7f, 0xfe, 0x16, 0xfc, 0xec, 0x27, 0x11, + 0x69, 0xb3, 0x0b, 0x3a, 0xf3, 0xf2, 0x73, 0x45, 0xff, 0x50, 0x8b, 0x3c, + 0x33, 0x6a, 0xbd, 0xff, 0xfe, 0xeb, 0xe9, 0x23, 0x5f, 0x3d, 0xdc, 0x5e, + 0x35, 0xf8, 0x75, 0xd1, 0xb0, 0x75, 0xf6, 0xb4, 0xeb, 0x3a, 0xba, 0x89, + 0x90, 0x30, 0x78, 0x62, 0xfb, 0x79, 0x79, 0xce, 0xbf, 0xfe, 0x0b, 0x7a, + 0x83, 0x9b, 0x5e, 0x5a, 0x40, 0x9d, 0x69, 0x61, 0xf8, 0xb9, 0x15, 0xff, + 0x42, 0xfe, 0x07, 0x30, 0x1a, 0x3a, 0xff, 0x93, 0x04, 0x2a, 0x26, 0x70, + 0xea, 0x43, 0xef, 0xd8, 0x39, 0xbd, 0xec, 0xdc, 0xeb, 0xf9, 0xf9, 0xbc, + 0xb3, 0xc7, 0x5f, 0xfb, 0xda, 0x4e, 0x78, 0x7f, 0x79, 0x1d, 0x7f, 0xf9, + 0x71, 0xb3, 0x9f, 0x8e, 0x66, 0xd8, 0xdc, 0xeb, 0xff, 0x46, 0x73, 0x38, + 0x05, 0xa6, 0x8e, 0xbc, 0xfb, 0xec, 0x1d, 0x7f, 0x3f, 0xb5, 0x19, 0x39, + 0xd5, 0x09, 0x9f, 0xe1, 0x6a, 0x1f, 0x0a, 0x6e, 0xd3, 0xc6, 0x47, 0xef, + 0xfb, 0xf8, 0x5e, 0xb1, 0x70, 0xc6, 0x75, 0xff, 0xb9, 0x3e, 0x07, 0x3b, + 0xdc, 0x63, 0x3a, 0xff, 0xd8, 0x3e, 0xd7, 0xdd, 0xb1, 0x9b, 0x9d, 0x58, + 0x88, 0x2d, 0x20, 0xdf, 0xff, 0x4a, 0x39, 0x3f, 0x91, 0x4d, 0x69, 0xc6, + 0x47, 0x5f, 0xd3, 0xeb, 0x17, 0x0c, 0x67, 0x59, 0x99, 0x91, 0x01, 0xf5, + 0x42, 0xf2, 0x75, 0x0e, 0xbe, 0x97, 0x03, 0x23, 0xaf, 0x97, 0xe4, 0x9c, + 0xea, 0xc3, 0xc4, 0x42, 0x2b, 0xff, 0xb6, 0xf9, 0x48, 0x19, 0x67, 0x51, + 0x67, 0x5d, 0x3f, 0x8e, 0xbf, 0xdb, 0x7a, 0xf2, 0x8c, 0x13, 0xaa, 0x0f, + 0x27, 0x05, 0xef, 0xff, 0xd2, 0xec, 0x71, 0xfd, 0xff, 0x93, 0xda, 0xea, + 0x1d, 0x7f, 0x63, 0x3f, 0x7a, 0xfe, 0x3a, 0xff, 0xfd, 0xef, 0xb2, 0x8d, + 0xa8, 0x20, 0xe2, 0x42, 0xf0, 0xab, 0xee, 0xfd, 0xdf, 0xc7, 0x5f, 0xb1, + 0x78, 0x9b, 0x4e, 0xbd, 0x3c, 0xcc, 0x67, 0x54, 0x26, 0x8f, 0x3a, 0xae, + 0x17, 0xb5, 0x59, 0x09, 0x7f, 0x27, 0xbb, 0xd8, 0x75, 0xfb, 0x89, 0x3b, + 0xac, 0xd3, 0x09, 0xdf, 0x7b, 0xf8, 0x73, 0x4c, 0x27, 0x70, 0x20, 0xd4, + 0x09, 0xdf, 0xe1, 0x75, 0x3d, 0x1c, 0x01, 0xa8, 0x13, 0xbf, 0xda, 0xce, + 0xa6, 0xbf, 0x9c, 0xd3, 0x09, 0xdd, 0x81, 0x34, 0xc2, 0x77, 0x32, 0xc9, + 0xe6, 0x13, 0xac, 0x4d, 0x2f, 0x73, 0x44, 0x2e, 0x59, 0x16, 0x8f, 0xf6, + 0xa0, 0xb2, 0x45, 0x6f, 0x16, 0x61, 0x32, 0xa7, 0xcf, 0x64, 0xdd, 0x3f, + 0x76, 0x63, 0xc7, 0xa8, 0x5d, 0x1f, 0x42, 0xde, 0xaf, 0x39, 0x00, 0xc2, + 0x3b, 0x51, 0xb3, 0xfa, 0x52, 0x75, 0xe1, 0x02, 0xce, 0xbf, 0xe8, 0xff, + 0xc2, 0x9b, 0x7e, 0xac, 0xeb, 0xc3, 0x9a, 0xc3, 0xd7, 0xe0, 0xdd, 0xe0, + 0x82, 0x63, 0xaa, 0x19, 0xde, 0xd3, 0xc2, 0x78, 0x31, 0x85, 0xe1, 0xda, + 0x87, 0x4d, 0x8d, 0xb5, 0x21, 0x8f, 0x34, 0x28, 0x79, 0x09, 0x55, 0x92, + 0x76, 0x35, 0xb1, 0x57, 0xd4, 0x2f, 0x7d, 0x3b, 0x83, 0xb6, 0x19, 0x9f, + 0x4c, 0x6f, 0xc1, 0xce, 0x22, 0x87, 0x5f, 0xdd, 0x8f, 0xa3, 0xb8, 0x0e, + 0xbc, 0x88, 0xa1, 0xd7, 0xef, 0x64, 0xc8, 0xb3, 0xaf, 0xd1, 0xb8, 0x01, + 0x07, 0x54, 0x1e, 0x70, 0x93, 0xdf, 0xa3, 0x6c, 0x0f, 0x8e, 0xbf, 0x26, + 0xdf, 0x24, 0xe7, 0x5f, 0x9e, 0x5e, 0xc6, 0x9d, 0x7e, 0x1c, 0xfb, 0x93, + 0x1d, 0x7f, 0xfc, 0x2d, 0x45, 0x87, 0xf7, 0xe4, 0xb3, 0x7f, 0x1d, 0x7f, + 0xfb, 0x01, 0xae, 0xa7, 0xcd, 0xe5, 0x19, 0x39, 0xd7, 0xfd, 0xd7, 0x5f, + 0x52, 0x37, 0x91, 0xd7, 0xf7, 0xd1, 0x96, 0xcb, 0xce, 0x75, 0x42, 0x60, + 0xd2, 0x50, 0x44, 0xc0, 0x1c, 0x54, 0xea, 0x80, 0x02, 0x40, 0xd2, 0x7e, + 0x14, 0x89, 0x37, 0xa3, 0x2e, 0xbf, 0xf6, 0x3f, 0x66, 0x41, 0xee, 0x6e, + 0x75, 0xfc, 0x09, 0xa5, 0x1e, 0xd1, 0xd7, 0xff, 0xff, 0xec, 0xee, 0x08, + 0x30, 0x7d, 0xdc, 0xec, 0x64, 0xc9, 0xc9, 0xba, 0x9b, 0xf8, 0xeb, 0xe1, + 0x8c, 0x64, 0xeb, 0xe8, 0xdf, 0x4e, 0x75, 0x43, 0x6a, 0x7b, 0x3c, 0x20, + 0x42, 0x71, 0x94, 0xf2, 0x14, 0x8c, 0x61, 0x8c, 0x9f, 0x85, 0xef, 0x29, + 0xa4, 0x57, 0xfc, 0x7b, 0xf9, 0x76, 0xd8, 0x40, 0xfd, 0x20, 0xbf, 0xfe, + 0x41, 0xc5, 0xc7, 0xd1, 0xfe, 0x43, 0x8b, 0x3a, 0xff, 0x82, 0x98, 0x3f, + 0xcb, 0x34, 0x75, 0xbf, 0x3a, 0xff, 0xba, 0x92, 0xeb, 0xc9, 0x16, 0x75, + 0xff, 0xb4, 0x83, 0xbc, 0xbc, 0x9a, 0x43, 0xab, 0x0f, 0xd3, 0xc6, 0xf7, + 0xed, 0x2e, 0x03, 0x07, 0x54, 0x93, 0x51, 0xc4, 0xe9, 0x8d, 0xd7, 0x08, + 0x5f, 0x10, 0xdf, 0x0c, 0x72, 0x47, 0x5f, 0xf7, 0x62, 0x48, 0x23, 0xfe, + 0xe7, 0x5f, 0xf4, 0x67, 0xbe, 0x80, 0x11, 0xb9, 0xd6, 0xe4, 0x22, 0x4b, + 0x08, 0x16, 0x71, 0x7f, 0x0c, 0x37, 0x91, 0x23, 0xaf, 0xff, 0xba, 0xe9, + 0xe9, 0x7e, 0x3e, 0xd7, 0x5e, 0x47, 0x7d, 0x35, 0x77, 0xfe, 0xd7, 0xdf, + 0x20, 0xff, 0x2c, 0xd1, 0xd7, 0x07, 0x47, 0x53, 0x1a, 0x2d, 0xfa, 0xc2, + 0x28, 0x17, 0xff, 0xf6, 0x6f, 0x9a, 0x71, 0xea, 0x47, 0xbb, 0xfb, 0xac, + 0xea, 0x84, 0xe8, 0x5e, 0x31, 0x61, 0x32, 0xbf, 0x87, 0xf5, 0xa7, 0x60, + 0xeb, 0xff, 0xf3, 0x8f, 0x9d, 0xfa, 0x31, 0xed, 0x33, 0x9d, 0x3a, 0xff, + 0xd3, 0xb8, 0xeb, 0xdd, 0x48, 0xd1, 0xd7, 0xfd, 0x00, 0xd0, 0x7f, 0x7e, + 0x48, 0xeb, 0xdc, 0xd6, 0x8f, 0x10, 0x1d, 0xf3, 0x5d, 0xda, 0x68, 0x80, + 0xd5, 0x35, 0x37, 0xf7, 0x23, 0xb1, 0xf3, 0x24, 0x8a, 0x0e, 0x31, 0x53, + 0xa6, 0x47, 0xf6, 0x1b, 0xb4, 0x04, 0xe7, 0xfd, 0x1b, 0xad, 0xed, 0xb1, + 0xd3, 0xab, 0x15, 0x09, 0x24, 0x79, 0x7f, 0x4a, 0xaf, 0x75, 0xd8, 0xce, + 0xbe, 0x80, 0x6c, 0xe1, 0xd4, 0x03, 0xc1, 0xf0, 0xf5, 0xf0, 0xf8, 0x1f, + 0x9d, 0x7e, 0x5b, 0x10, 0xc4, 0x31, 0x0c, 0x51, 0xd7, 0xff, 0xf4, 0xb3, + 0x49, 0xce, 0x22, 0xfe, 0xfb, 0xb8, 0xcf, 0x8e, 0xac, 0x45, 0xda, 0x11, + 0x39, 0xe5, 0xff, 0xe6, 0x70, 0x7d, 0x83, 0x2c, 0xd7, 0xd5, 0x9d, 0x7f, + 0xfa, 0x59, 0xbc, 0xbe, 0xc0, 0x15, 0x65, 0x96, 0x4a, 0xbf, 0x2d, 0x9c, + 0x4d, 0xa7, 0x5e, 0x96, 0x0c, 0xc7, 0xf5, 0xf5, 0x46, 0xa1, 0x1f, 0x2f, + 0x0c, 0x4a, 0x85, 0x45, 0x3d, 0x86, 0xe8, 0xc6, 0x4d, 0x7f, 0xc8, 0x32, + 0xd3, 0x12, 0x62, 0x98, 0x86, 0x28, 0xeb, 0xe9, 0xb5, 0x93, 0x1d, 0x7e, + 0x04, 0x7b, 0x18, 0xce, 0xbf, 0xd1, 0x9c, 0x6b, 0xbb, 0x4d, 0x10, 0x4d, + 0xff, 0x47, 0xb3, 0x8d, 0x77, 0x69, 0xa2, 0xf9, 0xbf, 0x38, 0x7b, 0x0a, + 0x1d, 0x78, 0x73, 0x41, 0x45, 0x3b, 0x4f, 0x56, 0x87, 0x42, 0x98, 0x86, + 0xd8, 0x68, 0x5f, 0xfd, 0x1d, 0x45, 0x33, 0x93, 0xaf, 0xfd, 0xce, 0xac, + 0x4e, 0x91, 0x23, 0x33, 0xe9, 0x55, 0xfe, 0xff, 0xbb, 0x3d, 0x46, 0xf4, + 0xeb, 0xff, 0x4e, 0xfb, 0xec, 0xe7, 0x85, 0xf6, 0x9d, 0x7f, 0xfd, 0x9e, + 0x81, 0xf6, 0xb3, 0x14, 0x51, 0xe4, 0x75, 0xff, 0xb0, 0x31, 0x28, 0xee, + 0x01, 0xce, 0xbf, 0x9e, 0x5f, 0xc9, 0xc2, 0x75, 0xe6, 0x59, 0x64, 0xab, + 0xf7, 0x71, 0xaf, 0xc2, 0x95, 0x2f, 0xef, 0xff, 0xf4, 0xdc, 0x8d, 0xbf, + 0x14, 0x7f, 0x9f, 0x66, 0xd7, 0xcc, 0xdf, 0xc7, 0x57, 0x91, 0x4b, 0xf4, + 0xda, 0xff, 0xf2, 0x71, 0x3d, 0xfe, 0x79, 0xd7, 0x82, 0x75, 0x4e, 0xa8, + 0xa5, 0xa8, 0x6b, 0x4e, 0x01, 0xd8, 0xc3, 0xc7, 0xc4, 0xb7, 0xfe, 0x5c, + 0x6f, 0xa1, 0xc9, 0xfe, 0xc8, 0xeb, 0xff, 0xfc, 0x9d, 0x71, 0xde, 0x5f, + 0x65, 0x03, 0x27, 0x5e, 0x04, 0xeb, 0xff, 0xd9, 0x9d, 0x0f, 0x63, 0x59, + 0xd4, 0x01, 0xd7, 0xf9, 0x4f, 0x93, 0x4a, 0x39, 0xa3, 0xaa, 0x74, 0xc7, + 0xe4, 0x82, 0x16, 0x04, 0x47, 0xbf, 0x98, 0xf2, 0x5d, 0x8e, 0x1d, 0x7f, + 0xbd, 0x09, 0xd5, 0x23, 0x73, 0xaf, 0xff, 0x6e, 0x3f, 0x1b, 0xd4, 0x00, + 0x23, 0x92, 0x3a, 0xa1, 0x15, 0xc8, 0x5f, 0xf4, 0xce, 0xfe, 0x4d, 0x60, + 0x7e, 0xe1, 0xd7, 0xed, 0x84, 0x1c, 0xda, 0x75, 0xfe, 0xe6, 0x05, 0x3f, + 0x6f, 0x5a, 0x7a, 0xee, 0x5b, 0x7f, 0xb4, 0x39, 0xb7, 0xaf, 0x23, 0xaf, + 0x6a, 0x5b, 0x4e, 0xa4, 0x3d, 0x16, 0x33, 0x3b, 0xff, 0xd1, 0x3f, 0xde, + 0xc6, 0xfe, 0xc9, 0xc4, 0x27, 0x52, 0x26, 0x18, 0xf0, 0x9b, 0x12, 0x4b, + 0xfd, 0x18, 0x3e, 0x60, 0x32, 0xd3, 0xaf, 0xf7, 0x73, 0x6f, 0xcd, 0x49, + 0xa7, 0x5b, 0xfd, 0x1f, 0x6f, 0x8d, 0xaf, 0xf3, 0x8f, 0xcf, 0xbc, 0xeb, + 0x9d, 0x7e, 0xce, 0x3e, 0xec, 0x9d, 0x7f, 0xff, 0xa7, 0xc6, 0x47, 0x03, + 0xc4, 0xfe, 0x70, 0xf6, 0x06, 0x73, 0xaa, 0x74, 0x45, 0xe8, 0xa2, 0xf3, + 0x2c, 0xb2, 0x55, 0xfe, 0xfa, 0x08, 0x1c, 0xdf, 0xc5, 0x2a, 0x5f, 0xdf, + 0xff, 0xcc, 0x1f, 0x8d, 0xea, 0x04, 0x38, 0xcf, 0xcf, 0x6b, 0x27, 0x3a, + 0xba, 0x8a, 0x9f, 0xd1, 0x29, 0x13, 0x10, 0x78, 0x76, 0x54, 0xec, 0xb4, + 0x29, 0x47, 0xe2, 0x13, 0x54, 0x94, 0xc1, 0xc8, 0xdf, 0x57, 0x0e, 0xce, + 0xc7, 0x26, 0x30, 0xa0, 0xd1, 0x4f, 0xa3, 0xd0, 0xbf, 0xf6, 0x20, 0xce, + 0xe3, 0xec, 0x59, 0xd7, 0xff, 0xb8, 0xa7, 0xdf, 0x26, 0x87, 0x36, 0xa0, + 0x4e, 0xbf, 0xe4, 0x64, 0x3d, 0xcf, 0x6c, 0xe1, 0xd5, 0x08, 0x88, 0xea, + 0x6d, 0xf0, 0xbe, 0xfe, 0x3a, 0xf6, 0x08, 0x0e, 0xbe, 0xcf, 0x4d, 0x23, + 0xaf, 0xfe, 0xd8, 0x18, 0xd8, 0xd3, 0x8f, 0xd0, 0x68, 0xea, 0xe9, 0xf6, + 0x39, 0x15, 0xff, 0xb3, 0xd1, 0xcd, 0x76, 0x07, 0xc7, 0x88, 0x22, 0xfe, + 0xce, 0x35, 0xdd, 0xa6, 0x88, 0x21, 0x53, 0xc9, 0xbd, 0x01, 0x43, 0xaa, + 0x0f, 0x93, 0x49, 0x57, 0xb6, 0xc2, 0xce, 0xbf, 0x9f, 0xbc, 0xe2, 0x32, + 0x75, 0xfc, 0xc6, 0x16, 0x5c, 0x64, 0x75, 0x61, 0xfd, 0x08, 0xef, 0xe5, + 0xb7, 0xff, 0xe8, 0x0c, 0xd2, 0x41, 0xf4, 0x02, 0x61, 0x49, 0x8e, 0xa9, + 0xd5, 0x49, 0xa8, 0x43, 0xd8, 0x43, 0x02, 0x19, 0xc3, 0x09, 0xbd, 0xa5, + 0xd7, 0xf7, 0x73, 0xde, 0x45, 0x9d, 0x7f, 0x7b, 0xee, 0x75, 0xf7, 0x3a, + 0xb7, 0x3d, 0xb1, 0x2c, 0xbf, 0xb3, 0x7f, 0x73, 0x90, 0x75, 0xff, 0xda, + 0x17, 0xf3, 0xaf, 0xec, 0x4f, 0x87, 0x50, 0x4f, 0xc7, 0x45, 0xb5, 0x08, + 0xb5, 0xfe, 0x12, 0x77, 0xf6, 0x37, 0xee, 0xde, 0xe1, 0xd7, 0x42, 0x87, + 0x5c, 0x82, 0x75, 0x99, 0x3a, 0x82, 0x69, 0x7e, 0x8a, 0x5e, 0x1f, 0xe7, + 0x3a, 0xfd, 0xd7, 0x96, 0x09, 0xd7, 0xf2, 0x78, 0x73, 0xa8, 0x75, 0xd9, + 0xdf, 0x87, 0x9f, 0x04, 0xb7, 0x3b, 0x3f, 0x11, 0xf1, 0x87, 0x7d, 0x23, + 0xf3, 0x65, 0x49, 0x39, 0xac, 0x28, 0x18, 0xca, 0x2f, 0xed, 0x20, 0x43, + 0x82, 0x75, 0xff, 0xfd, 0xee, 0xe6, 0xb5, 0x99, 0xff, 0x27, 0xcf, 0xc7, + 0xc7, 0x5f, 0xf7, 0x63, 0x9e, 0x18, 0xcd, 0xce, 0xbf, 0xff, 0xe4, 0x9e, + 0x25, 0xae, 0x71, 0x37, 0x9a, 0x4f, 0xc5, 0xe6, 0xe7, 0x5f, 0xe8, 0x79, + 0xdf, 0x8f, 0xf4, 0xeb, 0xdd, 0xc1, 0x0a, 0x34, 0xfa, 0x6f, 0xe6, 0x9a, + 0xc4, 0xe6, 0x90, 0xaf, 0xd1, 0x97, 0xdf, 0xf9, 0xbd, 0x8c, 0xe4, 0xb5, + 0xfa, 0xce, 0xb9, 0x34, 0x75, 0xff, 0x64, 0xef, 0xe0, 0x7d, 0x19, 0x1d, + 0x7f, 0x3f, 0xbe, 0x44, 0x94, 0x3a, 0xfe, 0xfa, 0xbd, 0x32, 0xfb, 0x9d, + 0x50, 0x99, 0x1e, 0x1a, 0xa8, 0x7f, 0xc1, 0x57, 0x3a, 0xf1, 0x7d, 0xee, + 0x67, 0x4e, 0xbd, 0xa4, 0x59, 0xd6, 0x8e, 0x1b, 0x6f, 0x0d, 0xdf, 0xfd, + 0xd4, 0x81, 0xf8, 0xe3, 0x24, 0x59, 0xd7, 0xc9, 0x32, 0x32, 0x75, 0xff, + 0xcb, 0x7d, 0xfe, 0xf9, 0x39, 0x1f, 0xb0, 0x4e, 0xbf, 0xff, 0x7f, 0x38, + 0xc6, 0x75, 0x58, 0xf6, 0x77, 0xfe, 0x1d, 0x7d, 0xed, 0x7d, 0xd7, 0xc4, + 0xc1, 0x82, 0x85, 0x84, 0x5f, 0x52, 0xef, 0xda, 0x5e, 0x7b, 0x47, 0x5f, + 0xfc, 0x8a, 0x67, 0x93, 0xb9, 0xe8, 0xe1, 0xd7, 0xe7, 0x90, 0xa4, 0x1d, + 0x7f, 0x43, 0x8f, 0xb0, 0x4e, 0xa9, 0x2a, 0x3d, 0xc8, 0xcb, 0x11, 0x6f, + 0x84, 0xeb, 0x42, 0x12, 0x4b, 0xf9, 0xbd, 0x4d, 0x94, 0x50, 0xeb, 0xff, + 0xc8, 0x08, 0xd2, 0xe1, 0x39, 0xc4, 0x64, 0xeb, 0xe6, 0x3e, 0xe4, 0xe7, + 0x5f, 0xe8, 0x0e, 0x79, 0x3b, 0xf9, 0xd6, 0x5c, 0x1e, 0xb8, 0x49, 0x6f, + 0xff, 0xfc, 0xb7, 0x10, 0x49, 0x35, 0xfa, 0xfa, 0x91, 0xee, 0xfe, 0xeb, + 0x3a, 0xff, 0xf8, 0x7f, 0xf4, 0x90, 0x1d, 0x74, 0xf3, 0xac, 0xeb, 0xbe, + 0x31, 0x9d, 0x7f, 0xfe, 0x74, 0xf2, 0x07, 0x03, 0x9e, 0x45, 0xa7, 0x0e, + 0xbf, 0xfd, 0x0d, 0x0e, 0x7d, 0xf2, 0x72, 0x3f, 0x60, 0x9d, 0x7b, 0x8f, + 0xac, 0x4c, 0x27, 0x89, 0xdd, 0x1b, 0x15, 0x1b, 0x93, 0xce, 0x9e, 0x17, + 0xf1, 0xba, 0xdd, 0x28, 0x3a, 0xff, 0xf4, 0xe1, 0xec, 0x77, 0x37, 0x06, + 0x7b, 0x47, 0x53, 0x9f, 0x07, 0xe2, 0xb4, 0x15, 0x6d, 0xf8, 0x60, 0x90, + 0x9f, 0x78, 0xfa, 0x46, 0x12, 0xb7, 0xf7, 0x22, 0x74, 0x1f, 0x1d, 0x78, + 0x3f, 0x56, 0x75, 0xf8, 0x60, 0x39, 0x31, 0xd7, 0xda, 0xff, 0x8a, 0x1d, + 0x7e, 0x8e, 0xfa, 0x24, 0x75, 0xf0, 0x7f, 0xf6, 0xa0, 0xfc, 0x37, 0x26, + 0x01, 0x25, 0xf8, 0x18, 0xb8, 0xe9, 0xd7, 0xf7, 0xf1, 0xf3, 0x83, 0x23, + 0xaf, 0x30, 0x7b, 0x87, 0x50, 0x53, 0x76, 0xc2, 0xc4, 0x84, 0x70, 0xa4, + 0x78, 0x9b, 0xf2, 0xfb, 0xdc, 0xfb, 0xa3, 0xae, 0x86, 0x1e, 0x75, 0xff, + 0x9c, 0x5b, 0x9c, 0x6b, 0xbb, 0x4d, 0x10, 0x8d, 0xd2, 0x9c, 0xea, 0x84, + 0x4c, 0x00, 0x7b, 0xf1, 0xbd, 0xa9, 0x17, 0xec, 0x9f, 0x40, 0x73, 0xaf, + 0xff, 0xff, 0x77, 0x3f, 0xe2, 0x9d, 0x4d, 0xe3, 0xdf, 0xf4, 0x73, 0x7f, + 0x7e, 0xfa, 0x3a, 0xff, 0xec, 0xdf, 0xef, 0x90, 0x7f, 0x96, 0x68, 0xeb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0c, 0xe2, 0xe1, 0x81, 0x9e, 0x38, + 0x1c, 0x1c, 0xf6, 0x91, 0xb8, 0x3f, 0x67, 0xce, 0x46, 0x85, 0xd4, 0xd6, + 0x20, 0x01, 0xf8, 0x05, 0xc3, 0x03, 0x3c, 0x70, 0xea, 0x84, 0xd3, 0xb1, + 0x1a, 0xff, 0xef, 0x38, 0xcf, 0xbc, 0x86, 0x33, 0x47, 0x5f, 0xfb, 0xee, + 0x75, 0xd6, 0xab, 0x2c, 0xb2, 0x75, 0xff, 0xfb, 0x1b, 0xd8, 0x10, 0x8a, + 0x4f, 0x82, 0x8a, 0x1d, 0x73, 0xbc, 0xe8, 0x96, 0x92, 0x25, 0xff, 0xfd, + 0x30, 0xc0, 0x34, 0xde, 0xa7, 0x26, 0x18, 0x06, 0x8e, 0xbf, 0xfb, 0xdd, + 0x4d, 0xbd, 0x79, 0x72, 0x14, 0x3a, 0xfe, 0xff, 0xc9, 0xf8, 0xa8, 0x75, + 0xfd, 0x8c, 0xe0, 0xfe, 0x03, 0xaf, 0xd2, 0xcf, 0x40, 0x0e, 0xba, 0x17, + 0x39, 0xe9, 0xee, 0x5b, 0x7f, 0xff, 0xf0, 0x16, 0xf2, 0xeb, 0xa7, 0x90, + 0x38, 0x1c, 0xf2, 0x2d, 0x38, 0x75, 0x69, 0x13, 0xbf, 0x97, 0xdf, 0xff, + 0x87, 0x35, 0x9d, 0x7d, 0x86, 0xf5, 0x17, 0x0d, 0x3a, 0xfd, 0x3a, 0xe0, + 0x30, 0x75, 0x49, 0x75, 0x4c, 0x31, 0xe5, 0x6e, 0x45, 0x34, 0x36, 0x78, + 0x5d, 0xd5, 0xbd, 0x23, 0x7a, 0x31, 0xfd, 0xa4, 0x9f, 0x55, 0x6f, 0xf4, + 0x6b, 0x51, 0x3e, 0x32, 0x75, 0xfe, 0xee, 0x2f, 0x3b, 0xf8, 0x9d, 0x41, + 0x3e, 0x5f, 0x19, 0xdf, 0x67, 0x14, 0x43, 0xaa, 0x17, 0xb1, 0xf2, 0x75, + 0xe9, 0xe3, 0x0a, 0xfc, 0x8a, 0xf3, 0x2c, 0xb2, 0x55, 0xff, 0x60, 0x1f, + 0x99, 0xb7, 0x02, 0x52, 0xa5, 0xfd, 0xcc, 0xb2, 0x55, 0xe6, 0x59, 0x64, + 0xab, 0xf9, 0xe7, 0x0f, 0x63, 0x45, 0x2a, 0x5f, 0xd0, 0xa2, 0xf1, 0x94, + 0x8d, 0x93, 0x7b, 0xf3, 0x50, 0x3f, 0x56, 0x52, 0xa6, 0xce, 0xf3, 0x2c, + 0xb2, 0x55, 0xed, 0x47, 0x0a, 0x54, 0xbf, 0xbe, 0x71, 0xdf, 0xc7, 0x58, + 0x08, 0x8a, 0x5f, 0x2c, 0xb2, 0x57, 0x7f, 0x04, 0x62, 0x4e, 0xd3, 0xaf, + 0xda, 0xfe, 0x7d, 0x91, 0x3a, 0xfc, 0x14, 0xdb, 0x01, 0x3a, 0xfb, 0x07, + 0x18, 0xce, 0xae, 0x1e, 0x52, 0xca, 0x29, 0x11, 0x31, 0xf5, 0xda, 0xff, + 0xee, 0xbc, 0x85, 0xd4, 0x98, 0x52, 0x63, 0xaf, 0xfe, 0xce, 0x4f, 0x1b, + 0xe9, 0x07, 0x00, 0x75, 0xfd, 0xdc, 0xdb, 0x9e, 0xd1, 0xd4, 0xd4, 0x5a, + 0x81, 0x13, 0xc8, 0x75, 0xc4, 0xf3, 0x3b, 0x0c, 0x31, 0x86, 0xcd, 0xd3, + 0xf8, 0xea, 0x85, 0x4a, 0x79, 0x28, 0x08, 0x4e, 0xaf, 0x6e, 0xc4, 0x98, + 0xa3, 0xaf, 0xff, 0x63, 0x1b, 0x88, 0x31, 0xb1, 0xd8, 0x59, 0xd7, 0xda, + 0xea, 0x4c, 0x55, 0xff, 0x3e, 0xfe, 0xc9, 0xbf, 0xe2, 0x87, 0x59, 0xa8, + 0x7b, 0xdf, 0x91, 0x5f, 0xe1, 0xcd, 0xe5, 0xa4, 0x50, 0xeb, 0xe7, 0x7e, + 0x28, 0x75, 0x7c, 0x3d, 0x49, 0xcc, 0xef, 0xfb, 0x31, 0xa0, 0x8c, 0xde, + 0x47, 0x5f, 0x43, 0xaf, 0x69, 0x57, 0xff, 0x75, 0x1c, 0x00, 0x80, 0x47, + 0x74, 0x75, 0xfd, 0xdc, 0x5a, 0xde, 0x47, 0x5e, 0x65, 0x96, 0x4a, 0xbf, + 0xc3, 0xee, 0xa4, 0x0c, 0xe5, 0x2a, 0x5f, 0xde, 0x80, 0x64, 0x91, 0x19, + 0x89, 0x75, 0xe4, 0xc0, 0x3e, 0xc3, 0x3a, 0xd8, 0xd4, 0xd3, 0x57, 0x19, + 0x15, 0xfc, 0x08, 0x04, 0x77, 0x47, 0x5f, 0xe8, 0xfb, 0xce, 0x27, 0xb4, + 0x75, 0x42, 0xb8, 0x39, 0x14, 0x6f, 0x0a, 0x74, 0x7c, 0x98, 0x97, 0xb1, + 0xc2, 0x00, 0xbc, 0x4b, 0x2f, 0xc0, 0xc4, 0xea, 0x87, 0x5f, 0xff, 0x63, + 0x60, 0x5f, 0xda, 0x0f, 0xef, 0xc9, 0x1d, 0x5b, 0x9f, 0xaa, 0xc9, 0xef, + 0xff, 0xfe, 0x17, 0x5c, 0x71, 0xa1, 0xec, 0x6b, 0xf7, 0x49, 0x6b, 0xaf, + 0x23, 0xaf, 0x7f, 0xed, 0x1d, 0x79, 0xb1, 0xa3, 0xaf, 0xfe, 0xfb, 0x2c, + 0xeb, 0xf5, 0x39, 0xc8, 0x3a, 0xb0, 0xf7, 0xc0, 0x37, 0x7e, 0x8f, 0x6b, + 0x6e, 0x1d, 0x7e, 0xff, 0x8a, 0x75, 0x0e, 0xa8, 0x4e, 0x05, 0xc8, 0xc0, + 0xe0, 0x2f, 0x9e, 0x21, 0xd9, 0x28, 0xbf, 0xc2, 0xec, 0xe0, 0xba, 0x87, + 0x5f, 0xfd, 0x9e, 0xd7, 0xdd, 0x2c, 0x63, 0x90, 0x75, 0xf2, 0x6d, 0xc1, + 0x09, 0xfa, 0xac, 0xc6, 0xff, 0xff, 0x83, 0xd4, 0x67, 0x36, 0x11, 0x6f, + 0xed, 0x7f, 0x2c, 0xdf, 0xc7, 0x56, 0x22, 0x91, 0xce, 0x6f, 0xfa, 0x66, + 0xf5, 0x17, 0x1c, 0x50, 0xeb, 0xf4, 0xff, 0x3f, 0x89, 0x8e, 0xb4, 0x8e, + 0xbd, 0xf4, 0x66, 0x3a, 0xa4, 0x6b, 0x80, 0x21, 0x58, 0x8b, 0x57, 0x3a, + 0xd2, 0xd5, 0x43, 0xba, 0x6c, 0x9e, 0x54, 0x1c, 0xa5, 0x23, 0x06, 0x55, + 0x16, 0x52, 0xdf, 0x54, 0x85, 0xbb, 0x61, 0x86, 0x92, 0xad, 0x66, 0x96, + 0x2b, 0xc9, 0x5e, 0x4b, 0x95, 0x93, 0xd9, 0x79, 0x6f, 0x1e, 0x70, 0x21, + 0xe6, 0x33, 0xe0, 0xda, 0x9c, 0x52, 0xf4, 0xbb, 0x9f, 0xe5, 0x39, 0xb3, + 0x1b, 0x8f, 0xd8, 0x6b, 0x5e, 0xdb, 0x02, 0x75, 0xff, 0xf6, 0x0a, 0xbe, + 0x51, 0x37, 0xd7, 0x70, 0x0e, 0x75, 0x48, 0xfb, 0x02, 0x39, 0x7f, 0x9c, + 0x5b, 0x9e, 0xea, 0x1d, 0x7f, 0xff, 0xd9, 0xd7, 0xfb, 0xac, 0x51, 0xc4, + 0x10, 0x31, 0x37, 0x60, 0xeb, 0x41, 0xd7, 0xff, 0xe8, 0xe7, 0x61, 0x7b, + 0x1f, 0xc0, 0xc4, 0xdd, 0x83, 0xaf, 0xc9, 0xc9, 0xa3, 0xbc, 0x46, 0x58, + 0x19, 0x44, 0x3e, 0xb7, 0x4d, 0xa5, 0x64, 0x5f, 0x61, 0xf7, 0x66, 0x1e, + 0x75, 0xff, 0x9c, 0x41, 0xf0, 0x3f, 0xbf, 0x24, 0x75, 0xf2, 0x0c, 0xf0, + 0x75, 0xef, 0x72, 0x0e, 0xbf, 0xe1, 0x85, 0xa0, 0xe2, 0xe0, 0xeb, 0x90, + 0x38, 0x79, 0xf3, 0x0d, 0xd3, 0x1a, 0x37, 0x38, 0x80, 0x2d, 0xf4, 0xc4, + 0xd3, 0x24, 0xc8, 0x79, 0x5e, 0x81, 0x9c, 0xeb, 0xe4, 0xea, 0x2c, 0xeb, + 0x75, 0x0d, 0xdc, 0xc3, 0x77, 0xf4, 0x36, 0x35, 0xe4, 0x3a, 0xff, 0xa3, + 0xdd, 0x70, 0x3e, 0xfa, 0x3a, 0x82, 0x7c, 0x62, 0x57, 0x7f, 0xee, 0x03, + 0xe7, 0x51, 0xbf, 0xf0, 0x07, 0x5e, 0x9b, 0xfe, 0x1d, 0x7f, 0xe7, 0x4e, + 0x66, 0xea, 0xb2, 0xcb, 0x27, 0x54, 0x22, 0x89, 0xd0, 0xb4, 0x3d, 0x7f, + 0xfc, 0x31, 0x2f, 0x9f, 0x7c, 0x83, 0xfc, 0xb3, 0x47, 0x56, 0x27, 0x9a, + 0xd8, 0x45, 0x76, 0x18, 0x60, 0x2e, 0xbc, 0x07, 0x59, 0xd7, 0x60, 0x0e, + 0xbc, 0x32, 0x18, 0x36, 0x18, 0x37, 0x7f, 0x99, 0xd0, 0xe0, 0x45, 0xce, + 0xbe, 0xd3, 0x5a, 0x87, 0x54, 0x22, 0x05, 0x0b, 0xdc, 0xc6, 0xfd, 0xcd, + 0x0c, 0x4e, 0x75, 0xff, 0xf3, 0x38, 0xdd, 0x67, 0xa6, 0xc5, 0x07, 0x00, + 0x75, 0x61, 0xfb, 0xa1, 0x3d, 0xfc, 0xfe, 0xeb, 0x88, 0x0e, 0xbf, 0xf3, + 0xfb, 0x26, 0x78, 0x18, 0x98, 0xeb, 0xff, 0x75, 0x33, 0xee, 0x4c, 0xcc, + 0x6e, 0x75, 0x93, 0x88, 0xa8, 0xe9, 0x5e, 0x8f, 0x2e, 0x6b, 0x4d, 0x18, + 0x25, 0x49, 0x32, 0x06, 0xc3, 0x20, 0x06, 0xb7, 0x60, 0x9d, 0x7f, 0xfb, + 0xd0, 0x2d, 0xcf, 0x75, 0x38, 0x06, 0x9d, 0x7e, 0x0a, 0x6b, 0xa8, 0x75, + 0xfc, 0x83, 0x9e, 0xea, 0x1d, 0x68, 0xc3, 0xd0, 0xd1, 0x35, 0x05, 0x1a, + 0x58, 0x29, 0xfc, 0x26, 0x2f, 0xf4, 0x2f, 0x5a, 0x71, 0x9c, 0xeb, 0xfe, + 0x06, 0xa4, 0x9d, 0x74, 0x9c, 0xeb, 0xed, 0x60, 0xf8, 0xeb, 0xdb, 0x11, + 0xc3, 0xa9, 0x0f, 0xd9, 0xce, 0x3f, 0x20, 0xbd, 0xe7, 0x63, 0x3a, 0xff, + 0x7b, 0xa8, 0xa8, 0x1d, 0x0e, 0xbb, 0xf1, 0x3a, 0xef, 0xb8, 0x75, 0x05, + 0x38, 0x8e, 0x9a, 0x8c, 0x2a, 0x3c, 0x5d, 0xf8, 0xf6, 0xc9, 0x97, 0xd1, + 0x6b, 0xf2, 0x80, 0x49, 0xb4, 0x75, 0xf7, 0x51, 0xe4, 0x75, 0xe0, 0xbc, + 0x8e, 0xa8, 0x37, 0x78, 0x41, 0x6f, 0xe1, 0x10, 0x60, 0x64, 0xbc, 0xfe, + 0xd1, 0xd7, 0xfc, 0xdc, 0xf4, 0x6d, 0x41, 0x01, 0xd7, 0xff, 0xf7, 0xf1, + 0xed, 0x60, 0xfc, 0xe4, 0x20, 0x45, 0xe4, 0x75, 0xf9, 0xbd, 0xdd, 0xd8, + 0xce, 0xbf, 0xf9, 0x02, 0x3f, 0xfb, 0x50, 0x31, 0xa3, 0xa9, 0x11, 0xfe, + 0x27, 0x1f, 0xad, 0x6d, 0x2b, 0xbf, 0xf8, 0x0f, 0xcc, 0xdb, 0x81, 0xe0, + 0xb2, 0x75, 0xff, 0xfc, 0x39, 0xaf, 0xfe, 0x67, 0x5c, 0x72, 0x69, 0x46, + 0xe7, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x20, 0x6b, 0xf9, 0xe7, 0x03, 0x88, + 0x49, 0x58, 0x3e, 0xf6, 0x6b, 0xfc, 0x3e, 0xdd, 0x93, 0x3b, 0xdd, 0x79, + 0x7c, 0x47, 0xf8, 0xc3, 0x26, 0xff, 0xba, 0x98, 0x38, 0xd0, 0xe1, 0xd4, + 0xb4, 0xec, 0xfd, 0x1a, 0x26, 0xd3, 0xab, 0xde, 0xfe, 0x0e, 0xbf, 0xc0, + 0xf2, 0x4e, 0xb8, 0x69, 0xd5, 0xb9, 0xe7, 0x88, 0xe5, 0xf8, 0x2c, 0x5b, + 0x85, 0x8b, 0x3a, 0xa1, 0x56, 0x66, 0x47, 0xe2, 0x90, 0x88, 0x72, 0x2b, + 0xfd, 0x9b, 0xf8, 0x39, 0x8a, 0x1d, 0x7f, 0x67, 0xa0, 0x50, 0x07, 0x5f, + 0xf0, 0x78, 0x2e, 0xcf, 0xdd, 0xd9, 0x3a, 0xf3, 0xf2, 0x73, 0x46, 0x0b, + 0x7f, 0xe7, 0xe6, 0x08, 0x35, 0xed, 0x6e, 0x75, 0xff, 0xff, 0xfd, 0x9e, + 0xeb, 0x8a, 0x9f, 0x35, 0xc7, 0x7f, 0x6d, 0xc0, 0xfc, 0xc5, 0xb8, 0xef, + 0x23, 0xc4, 0x17, 0x7f, 0xe7, 0x75, 0x1a, 0xe1, 0xf8, 0xa3, 0x27, 0x88, + 0x2e, 0xff, 0xee, 0xa7, 0x52, 0x07, 0xdf, 0x14, 0x64, 0xf1, 0x05, 0xdf, + 0xe8, 0x41, 0xf7, 0xc5, 0x19, 0x3c, 0x41, 0x77, 0xf2, 0xf0, 0x3f, 0x14, + 0x64, 0xf1, 0x05, 0xdf, 0xff, 0xf3, 0x88, 0xa2, 0xfe, 0x69, 0xbd, 0x4e, + 0x22, 0x93, 0xe3, 0x27, 0x88, 0x2e, 0xed, 0xfe, 0x05, 0x39, 0x76, 0xa7, + 0xf1, 0x4d, 0xd0, 0x84, 0xfa, 0xa1, 0x56, 0x3f, 0x4f, 0x86, 0x51, 0x8d, + 0xfe, 0x48, 0x53, 0x5e, 0xd6, 0xe7, 0x5f, 0x3f, 0x00, 0xe7, 0x5f, 0xfd, + 0xd4, 0xea, 0x40, 0xfb, 0xe2, 0x8c, 0x9e, 0x20, 0xbb, 0xfe, 0x9b, 0x4d, + 0x49, 0xfe, 0x28, 0xc9, 0xe2, 0x0b, 0xbf, 0x7b, 0x50, 0xbf, 0x8d, 0x44, + 0xff, 0xd5, 0x3b, 0xff, 0xdf, 0x1b, 0xd4, 0x6c, 0x7b, 0x5f, 0x14, 0x64, + 0xf1, 0x05, 0xdf, 0xff, 0xfc, 0x22, 0x8b, 0xf9, 0xfe, 0x7c, 0xd3, 0x7a, + 0x9c, 0x45, 0x27, 0xc6, 0x4f, 0x10, 0x5d, 0x62, 0x64, 0xbb, 0xa2, 0x3a, + 0xed, 0xff, 0x75, 0x38, 0x8a, 0x4f, 0x8c, 0x9e, 0x20, 0xbb, 0xff, 0xe7, + 0x7d, 0xe5, 0xae, 0xa0, 0x43, 0x1c, 0x82, 0xaf, 0xfd, 0x92, 0x97, 0xfa, + 0xe0, 0xcf, 0xb2, 0x78, 0x82, 0xe9, 0xa8, 0xe5, 0xe2, 0x3e, 0x93, 0xaf, + 0xfc, 0xd4, 0xe7, 0x9c, 0x1a, 0xf8, 0xc9, 0xe2, 0x0b, 0xbf, 0xba, 0x9d, + 0xea, 0x00, 0xd0, 0x05, 0xdf, 0xb0, 0x1f, 0x14, 0x64, 0xf1, 0x05, 0xdd, + 0x9e, 0x69, 0xf8, 0xf4, 0xe6, 0xb7, 0x47, 0x66, 0xa1, 0x7f, 0x7f, 0x2f, + 0x03, 0xf1, 0x46, 0x4f, 0x10, 0x5d, 0xff, 0x9b, 0xd4, 0xe2, 0x29, 0x3e, + 0x32, 0x78, 0x82, 0xee, 0xcf, 0x8e, 0x88, 0xbd, 0x1f, 0x5f, 0xef, 0xd1, + 0x6e, 0x3b, 0xc8, 0xf1, 0x05, 0xdf, 0xfb, 0x13, 0x6e, 0x0e, 0x05, 0xe4, + 0x78, 0x82, 0xd6, 0x78, 0x14, 0x15, 0xdf, 0xde, 0x1b, 0x80, 0xd0, 0x63, + 0xe4, 0xd4, 0x62, 0xbe, 0x8c, 0x73, 0xf8, 0x5a, 0x32, 0xdf, 0x70, 0x20, + 0xd1, 0x05, 0xaa, 0x88, 0xcb, 0x9d, 0xa7, 0x5b, 0x4d, 0x64, 0xe1, 0x82, + 0x92, 0xf3, 0xe3, 0x5b, 0xa5, 0xb0, 0x75, 0xe8, 0x96, 0xc1, 0xd5, 0x06, + 0xdc, 0x46, 0x6a, 0x76, 0x57, 0xb0, 0x4c, 0xf7, 0x2a, 0x05, 0x28, 0x00, + 0x5e, 0xaf, 0xfe, 0xc9, 0x0e, 0x7b, 0xa9, 0x9b, 0xf8, 0xeb, 0xfd, 0x1d, + 0x46, 0x77, 0x96, 0x8e, 0xbf, 0x47, 0xb5, 0xd4, 0x3a, 0xff, 0xb7, 0x1c, + 0x45, 0xe0, 0x80, 0xeb, 0xff, 0x6a, 0x69, 0x7e, 0x19, 0xa5, 0xf8, 0x4e, + 0xa9, 0xd1, 0xa9, 0x23, 0x4c, 0x26, 0xf1, 0xb5, 0xff, 0xd1, 0xbc, 0xbe, + 0xaf, 0x5e, 0x8d, 0xd9, 0x3a, 0xfd, 0x2d, 0x8d, 0x8f, 0xe7, 0x3a, 0xdd, + 0x43, 0xf9, 0x74, 0x9b, 0xf7, 0x23, 0x79, 0x68, 0xea, 0x91, 0xe7, 0x70, + 0x9a, 0xff, 0xe0, 0x7f, 0xad, 0x9c, 0xe0, 0x16, 0x9a, 0x3a, 0xff, 0x03, + 0xff, 0x0c, 0x7b, 0x47, 0x50, 0x0f, 0xef, 0x49, 0x15, 0x09, 0xe1, 0xe4, + 0x60, 0x8f, 0x09, 0xdb, 0xf9, 0xe5, 0x1b, 0x5f, 0xa7, 0x5f, 0xfe, 0x9f, + 0x37, 0xf6, 0x90, 0x60, 0x0e, 0xb3, 0xaf, 0xb7, 0xd4, 0x6e, 0x75, 0xe5, + 0xc4, 0x8e, 0xbf, 0x60, 0x7b, 0xfb, 0x27, 0x57, 0xc3, 0xe7, 0x72, 0x31, + 0x1b, 0xbc, 0x17, 0xf1, 0xd5, 0xc3, 0xca, 0x72, 0xfb, 0xc9, 0xb3, 0x87, + 0x5e, 0x7e, 0x00, 0xeb, 0x6f, 0x06, 0xe3, 0xc3, 0xb7, 0xcc, 0xe7, 0x5c, + 0xeb, 0xe5, 0x38, 0x8c, 0x9d, 0x7e, 0x9d, 0xfb, 0x0c, 0x67, 0x53, 0x14, + 0x79, 0xb8, 0x47, 0x50, 0xa8, 0xef, 0x0b, 0x52, 0x1f, 0x4e, 0xb2, 0x02, + 0x71, 0x6e, 0xbf, 0xfc, 0x23, 0x13, 0xaf, 0xa9, 0xce, 0x3c, 0x8e, 0xbf, + 0xd3, 0xcf, 0x03, 0xbe, 0x78, 0xea, 0xc3, 0xfc, 0x44, 0x8b, 0xff, 0xb8, + 0x3f, 0xef, 0xe1, 0xc9, 0xdc, 0x4e, 0xbc, 0xfc, 0x9c, 0xeb, 0x81, 0x07, + 0x5f, 0x24, 0x2f, 0x0e, 0xa3, 0xaf, 0xe7, 0x53, 0xd1, 0xc0, 0x1d, 0x41, + 0x36, 0xe2, 0x15, 0x7f, 0xff, 0xa1, 0x02, 0x31, 0xfb, 0x7d, 0x8d, 0x0c, + 0x37, 0xea, 0xce, 0xb8, 0x10, 0x75, 0xd0, 0xa1, 0xd7, 0xfd, 0x9e, 0xd4, + 0x2f, 0xee, 0x4c, 0x75, 0xfe, 0xd6, 0x75, 0x35, 0xfc, 0xe7, 0x5c, 0xcb, + 0x25, 0x5f, 0xf0, 0xe6, 0xd7, 0x96, 0x90, 0x27, 0x53, 0x53, 0xf1, 0x41, + 0xce, 0x0a, 0xad, 0x5b, 0xa4, 0x00, 0x61, 0x60, 0x8a, 0x88, 0xb6, 0x8e, + 0x99, 0x34, 0xfa, 0x31, 0x79, 0x96, 0x59, 0x2a, 0xcb, 0x29, 0x52, 0xfe, + 0xfa, 0x67, 0x7e, 0x14, 0xaa, 0x37, 0x7e, 0xc2, 0xf6, 0xa7, 0x56, 0xb4, + 0xf2, 0xc4, 0xaf, 0xef, 0x46, 0x77, 0x27, 0x3a, 0xec, 0x59, 0xd5, 0xb9, + 0xe0, 0xe8, 0xb2, 0xa1, 0xd1, 0xd0, 0x4a, 0x35, 0xdc, 0x94, 0x6c, 0xa4, + 0x3e, 0x37, 0x8f, 0x11, 0x25, 0x48, 0x72, 0x1e, 0x4b, 0x29, 0xec, 0xbe, + 0x67, 0xa5, 0x9e, 0x01, 0x60, 0x65, 0x6c, 0xea, 0x53, 0xa7, 0xa1, 0xab, + 0xfc, 0xb7, 0xad, 0xad, 0xb7, 0xf6, 0x00, 0x09, 0xc9, 0x1d, 0x73, 0x70, + 0xea, 0x09, 0xe0, 0xb9, 0x65, 0xd8, 0xc9, 0xd7, 0x47, 0x8e, 0xa9, 0xcd, + 0x5b, 0x45, 0xac, 0xb3, 0xab, 0x0d, 0x97, 0x88, 0xaf, 0xf4, 0x90, 0x71, + 0x7f, 0xf4, 0xeb, 0xff, 0x67, 0xb5, 0xd4, 0x5b, 0xe7, 0x0e, 0xa8, 0x3e, + 0xe1, 0x32, 0xbe, 0xf9, 0xe8, 0xda, 0x75, 0xf6, 0x2f, 0x3c, 0x75, 0xef, + 0x3a, 0x87, 0x5f, 0xff, 0xf9, 0xe6, 0xfe, 0x5f, 0xb7, 0xe7, 0x53, 0xde, + 0x8d, 0xe2, 0x78, 0xd1, 0xd7, 0xd3, 0x6a, 0x3c, 0x75, 0x35, 0x12, 0x9f, + 0xb9, 0x5f, 0xff, 0xf3, 0x18, 0xbb, 0xed, 0x89, 0x76, 0x39, 0x3c, 0x7b, + 0x4f, 0x23, 0xaf, 0x26, 0xf3, 0x1d, 0x7e, 0xcc, 0x9f, 0xfd, 0x1d, 0x7d, + 0xc1, 0x40, 0x1d, 0x7c, 0x8d, 0x7e, 0x1d, 0x74, 0x00, 0xeb, 0xef, 0xe7, + 0xfd, 0x5e, 0x9b, 0x5f, 0xa4, 0x14, 0x88, 0x94, 0xea, 0xad, 0xcc, 0x60, + 0x3a, 0xff, 0xba, 0xfa, 0xea, 0x4e, 0xe2, 0x75, 0xf3, 0xcf, 0xf6, 0x47, + 0x53, 0x09, 0x70, 0x76, 0x1f, 0xa5, 0x08, 0xec, 0x20, 0xdc, 0x95, 0x08, + 0x39, 0x0b, 0x07, 0x24, 0x03, 0x4e, 0x87, 0x7d, 0x0b, 0xcf, 0xc8, 0xbe, + 0x8c, 0xec, 0x1b, 0xdf, 0xc3, 0xf8, 0x56, 0xf2, 0x3a, 0xf2, 0x4f, 0xf9, + 0xd7, 0xe8, 0x02, 0x6f, 0x87, 0x5c, 0xbd, 0xa7, 0x58, 0x30, 0x6f, 0x84, + 0x9a, 0xff, 0xf4, 0x86, 0x3e, 0x2c, 0x61, 0x4f, 0x24, 0xe7, 0x5f, 0x9d, + 0x79, 0xd5, 0x9d, 0x5b, 0x9f, 0x8f, 0x92, 0xef, 0x7b, 0x90, 0x75, 0xfe, + 0xd7, 0xb6, 0xe0, 0xe0, 0x4e, 0xbd, 0xd8, 0xda, 0x75, 0xed, 0x4a, 0x73, + 0xab, 0x0d, 0xd7, 0xd1, 0xda, 0x84, 0xfa, 0xe4, 0x5b, 0x8b, 0x69, 0x09, + 0x65, 0x91, 0xb8, 0xdf, 0x9b, 0x6f, 0x3f, 0xcf, 0xa7, 0x5e, 0x99, 0x3a, + 0x75, 0xfd, 0x1c, 0x79, 0x93, 0xa7, 0x5f, 0xb4, 0x18, 0x19, 0xdc, 0xf2, + 0x34, 0x39, 0x79, 0x70, 0xb3, 0xab, 0x73, 0xd9, 0x59, 0xf5, 0xff, 0xf0, + 0xcb, 0xe6, 0x05, 0x35, 0xbf, 0xbf, 0x7d, 0x1d, 0x7e, 0xef, 0xe3, 0x1b, + 0x4e, 0xbf, 0x85, 0xfd, 0x28, 0x50, 0xea, 0x83, 0xd5, 0xfa, 0x53, 0x7d, + 0x99, 0xbc, 0x8e, 0xbd, 0xa4, 0x98, 0xeb, 0x28, 0x26, 0xf7, 0x44, 0x37, + 0xff, 0x3c, 0xe3, 0x1b, 0xa0, 0x46, 0x27, 0x3a, 0xb8, 0x7d, 0x42, 0x4f, + 0x7e, 0xf9, 0xd8, 0xe4, 0x8e, 0xaf, 0x8a, 0xa7, 0xa2, 0x18, 0x18, 0x46, + 0xd8, 0x53, 0xbc, 0x32, 0x99, 0x21, 0xbc, 0xbd, 0x41, 0xd7, 0xf4, 0xf3, + 0x49, 0x85, 0xc9, 0xce, 0xbe, 0x5e, 0x3f, 0x4e, 0xba, 0x53, 0x9d, 0x7b, + 0xa1, 0x43, 0xaf, 0xdd, 0xc4, 0x96, 0x8e, 0xbf, 0xfe, 0xec, 0x7d, 0x57, + 0xc2, 0xe0, 0xd6, 0xa0, 0x05, 0x5f, 0xb8, 0xd7, 0x76, 0x9e, 0x20, 0x4b, + 0xda, 0x8d, 0xce, 0xb0, 0x30, 0xf3, 0xf7, 0x33, 0xbd, 0xe4, 0x9c, 0xeb, + 0xd3, 0xb8, 0x9d, 0x52, 0x4c, 0x94, 0x24, 0xdc, 0x85, 0x02, 0xca, 0x3c, + 0x39, 0x7f, 0x0b, 0x5d, 0x4e, 0xa1, 0xd7, 0x6c, 0x48, 0xeb, 0xef, 0x4e, + 0xe2, 0x75, 0xe1, 0x75, 0x0e, 0xbc, 0xa2, 0x78, 0xeb, 0xda, 0x7f, 0x1d, + 0x4a, 0x1b, 0x7d, 0xc7, 0x2e, 0xf9, 0xd3, 0xaf, 0xe5, 0xf9, 0x03, 0xfc, + 0x1d, 0x79, 0x7e, 0x69, 0xd6, 0xf4, 0x1e, 0x4e, 0x16, 0xdf, 0xd0, 0xbc, + 0x52, 0x34, 0x75, 0x4e, 0x9b, 0x16, 0x0c, 0xb4, 0x87, 0xaa, 0x40, 0x23, + 0x16, 0x1f, 0x13, 0x5d, 0xcf, 0xce, 0xbf, 0xc2, 0xec, 0xeb, 0x50, 0x03, + 0xaf, 0x6c, 0xba, 0x87, 0x5f, 0xf4, 0x2e, 0x59, 0x3e, 0x7e, 0xc1, 0x3a, + 0xf9, 0xfc, 0xc1, 0x9c, 0xea, 0xc4, 0x41, 0x20, 0xfb, 0x9e, 0xde, 0x65, + 0x96, 0x4f, 0x57, 0xd5, 0xe7, 0x10, 0x96, 0xaf, 0xaa, 0xa6, 0xb2, 0xfa, + 0x5f, 0xc2, 0x87, 0x58, 0x07, 0x56, 0x1b, 0x37, 0x23, 0xa8, 0x4e, 0xbc, + 0x22, 0xfc, 0x85, 0xa0, 0x16, 0x7c, 0xd9, 0x7c, 0xbe, 0x7f, 0x39, 0xd7, + 0xff, 0xc2, 0x8a, 0x2b, 0xaf, 0x77, 0xf7, 0x94, 0xa0, 0xea, 0x83, 0xf5, + 0xc2, 0x4a, 0x9d, 0x1c, 0x8a, 0x43, 0x12, 0xfb, 0x02, 0xf2, 0x3a, 0xfc, + 0xe2, 0x28, 0xb3, 0xaf, 0x05, 0xe4, 0x75, 0xfe, 0x4e, 0x62, 0x2e, 0x18, + 0xce, 0xac, 0x3c, 0xee, 0x8d, 0xdf, 0x91, 0x6e, 0x38, 0x75, 0x7c, 0x5f, + 0x9d, 0x62, 0x06, 0xe0, 0xd6, 0x44, 0x01, 0x17, 0xc8, 0xd0, 0x14, 0x50, + 0x48, 0xe3, 0x9e, 0x57, 0xb8, 0x0a, 0x84, 0x83, 0xf7, 0x2d, 0x92, 0x1b, + 0xfb, 0x3b, 0x8d, 0xff, 0x0e, 0xbf, 0x27, 0xa3, 0xda, 0x2a, 0xf9, 0xb1, + 0xed, 0x15, 0x73, 0x2c, 0x95, 0x52, 0x3d, 0xfc, 0x26, 0x64, 0x86, 0xec, + 0x64, 0xa5, 0x4d, 0x7d, 0xf4, 0xc2, 0xec, 0x9d, 0x7f, 0xfd, 0xe8, 0x6e, + 0x60, 0xfb, 0xa9, 0x03, 0x39, 0xd4, 0x75, 0x61, 0xeb, 0x69, 0x32, 0xa6, + 0x4d, 0xe8, 0x10, 0xba, 0x12, 0x76, 0x5e, 0x2f, 0xfd, 0xed, 0x63, 0x7a, + 0xe3, 0xed, 0x1d, 0x7e, 0x8d, 0xa8, 0x20, 0x3b, 0xe1, 0xbd, 0xbf, 0x4b, + 0xbf, 0xc7, 0x0e, 0xbf, 0xf9, 0xd7, 0xc8, 0xda, 0x9b, 0x47, 0xfd, 0x1d, + 0x5b, 0x9f, 0x7f, 0x4a, 0x2f, 0xd9, 0xfa, 0xe3, 0x47, 0x51, 0xd7, 0x64, + 0xdc, 0x36, 0x3a, 0x27, 0xbf, 0xe4, 0xfd, 0x83, 0xd8, 0xfa, 0x33, 0x9d, + 0x7f, 0xd1, 0x3c, 0x6f, 0xe1, 0xc9, 0xce, 0xac, 0x45, 0x2b, 0x4b, 0x50, + 0xfe, 0xfc, 0xeb, 0x18, 0xdc, 0xea, 0x99, 0x34, 0xde, 0x43, 0xe7, 0xa5, + 0xd7, 0xd9, 0xdc, 0x9c, 0xeb, 0xd2, 0x7e, 0x1d, 0x7e, 0x96, 0x7b, 0x02, + 0x55, 0xf4, 0x08, 0xc1, 0xd5, 0x31, 0xef, 0xf8, 0x6f, 0xe9, 0x35, 0xf0, + 0x34, 0xbe, 0x1d, 0x4a, 0x23, 0x51, 0x21, 0x01, 0xe3, 0x2b, 0xfe, 0x1c, + 0xee, 0x7c, 0xee, 0x4e, 0x75, 0xff, 0xff, 0xc0, 0x81, 0x6b, 0xf9, 0xf7, + 0x06, 0xfe, 0x45, 0xeb, 0xb1, 0xf4, 0x4e, 0xbf, 0xbf, 0x60, 0xa7, 0x39, + 0x87, 0x5f, 0x79, 0x4c, 0xe9, 0xd7, 0xfe, 0x1c, 0xf7, 0xbf, 0x9f, 0xd8, + 0xd3, 0xad, 0xa3, 0xae, 0x40, 0x1d, 0x77, 0x50, 0xeb, 0xbf, 0xd7, 0xc3, + 0x55, 0x30, 0xad, 0x39, 0xf5, 0x80, 0xea, 0xe0, 0x41, 0xd7, 0x02, 0x0e, + 0xbf, 0x7f, 0x2c, 0x15, 0x50, 0xd5, 0x00, 0x56, 0xa1, 0x35, 0x55, 0x08, + 0x81, 0x0a, 0xa1, 0x4b, 0xbf, 0xfe, 0xc1, 0x7d, 0xf4, 0xa2, 0x8f, 0xf1, + 0xab, 0x01, 0xd7, 0xff, 0x7b, 0xb8, 0xbf, 0xb0, 0x0c, 0xdf, 0xc7, 0x5f, + 0xed, 0xda, 0x9c, 0xfb, 0x01, 0x3a, 0xf8, 0x0b, 0x79, 0x7c, 0x46, 0x76, + 0x94, 0xfc, 0x8d, 0x77, 0xfe, 0x3a, 0xfe, 0x02, 0xfe, 0xeb, 0xec, 0xe7, + 0x5f, 0xda, 0x41, 0x18, 0xdc, 0xeb, 0xb3, 0x73, 0xab, 0x73, 0xf4, 0xf1, + 0x9e, 0xc9, 0x5d, 0xf0, 0x38, 0x9c, 0x3a, 0xa1, 0x32, 0x89, 0x24, 0xbc, + 0x22, 0xd9, 0x33, 0xbd, 0xfe, 0xfe, 0x3a, 0xce, 0x75, 0x68, 0xd6, 0xf8, + 0x7a, 0xec, 0x64, 0xeb, 0xfe, 0x8d, 0xf0, 0x11, 0xb7, 0x27, 0x3a, 0xfe, + 0x1c, 0xf6, 0x9c, 0x07, 0x57, 0x0f, 0xec, 0x02, 0xda, 0x3a, 0xbf, 0xf4, + 0xd1, 0x3e, 0xb9, 0x8d, 0x89, 0xce, 0xbf, 0xb1, 0x78, 0x14, 0x64, 0xeb, + 0x97, 0x07, 0x52, 0xcf, 0x05, 0xcb, 0x2f, 0xe1, 0xc9, 0xba, 0x9e, 0x3a, + 0xfb, 0x33, 0xba, 0x3a, 0xb1, 0x1d, 0xcf, 0x08, 0x1f, 0x10, 0xec, 0x16, + 0x5e, 0x65, 0x96, 0x4a, 0xbf, 0x62, 0x83, 0xfe, 0x8a, 0x54, 0xbf, 0xbe, + 0x55, 0x96, 0x59, 0x3a, 0xec, 0x01, 0xd5, 0x86, 0xef, 0xc4, 0xd5, 0x08, + 0x93, 0xf3, 0x9d, 0xf2, 0x70, 0x1a, 0x3a, 0xff, 0xb5, 0xc8, 0xff, 0xc2, + 0x9b, 0x4e, 0xbf, 0xf0, 0xe6, 0x9b, 0xd4, 0x6c, 0x09, 0xd7, 0xff, 0xf9, + 0x46, 0x5f, 0x8a, 0x2b, 0xac, 0x90, 0xfe, 0xfa, 0xc1, 0x3a, 0xa1, 0x1b, + 0x18, 0x74, 0x87, 0x77, 0xcc, 0xb8, 0xc8, 0xeb, 0xfe, 0xf4, 0x6e, 0x07, + 0xef, 0x50, 0xeb, 0x74, 0xea, 0xc3, 0xc8, 0x69, 0xc5, 0xf8, 0x73, 0xd1, + 0xc3, 0xaf, 0x32, 0xcb, 0x25, 0x5f, 0x9d, 0x4e, 0xa7, 0x8a, 0x54, 0xbf, + 0xa8, 0x3f, 0xb4, 0x44, 0xbd, 0xe4, 0x64, 0xeb, 0xda, 0x7e, 0x1d, 0x5b, + 0x9b, 0x7f, 0x0e, 0x5e, 0xec, 0x04, 0xea, 0x43, 0x7a, 0xe4, 0x57, 0xec, + 0x06, 0x64, 0xc7, 0x5b, 0x5f, 0x13, 0x75, 0xe4, 0x27, 0x3b, 0x09, 0x41, + 0x1f, 0xbb, 0xf9, 0x05, 0x51, 0x6e, 0x47, 0xbd, 0x7e, 0x60, 0xf6, 0x27, + 0xfc, 0xea, 0x99, 0x5d, 0xbf, 0x61, 0xf2, 0x32, 0x96, 0xbf, 0x37, 0xbd, + 0x1b, 0x60, 0xea, 0x43, 0xe8, 0x14, 0xcb, 0xc3, 0x1b, 0x4e, 0xb9, 0x82, + 0x87, 0x5c, 0x9d, 0x3a, 0xcf, 0x39, 0xae, 0xe0, 0xcd, 0xf7, 0xb5, 0xfb, + 0x19, 0xd7, 0xfa, 0x06, 0x42, 0x91, 0xb9, 0xd5, 0x0d, 0x83, 0x2c, 0xa1, + 0x03, 0x91, 0xfa, 0xa9, 0x18, 0x5b, 0x4d, 0x77, 0x39, 0x47, 0x3e, 0x47, + 0x0d, 0xd9, 0x47, 0x0e, 0xde, 0x08, 0x4e, 0x0c, 0x63, 0xba, 0x87, 0xaf, + 0xa7, 0x10, 0x76, 0x90, 0x6c, 0xa5, 0x7d, 0x27, 0xd8, 0x26, 0xbf, 0x24, + 0xd2, 0x41, 0x3a, 0xe6, 0x29, 0x0e, 0xbf, 0xe9, 0xbd, 0xb1, 0xa8, 0x9b, + 0xfe, 0x1d, 0x7f, 0x83, 0x02, 0xb8, 0x0c, 0x1d, 0x50, 0x7d, 0xee, 0x7f, + 0x7f, 0xf6, 0x27, 0x60, 0x3d, 0xfe, 0x37, 0xd1, 0xd7, 0x82, 0xa0, 0x0e, + 0xbf, 0x2f, 0x9c, 0x7f, 0x1d, 0x5f, 0x0f, 0x12, 0x07, 0x6f, 0xff, 0x36, + 0x67, 0x6f, 0x62, 0x5e, 0x1c, 0x59, 0xd7, 0xff, 0xc8, 0xbd, 0xe5, 0xaf, + 0x98, 0x23, 0x88, 0x03, 0xaf, 0x27, 0x7f, 0x3a, 0xbe, 0x2a, 0x2e, 0x62, + 0x09, 0xa5, 0x08, 0x9e, 0x10, 0x76, 0x11, 0x0e, 0x47, 0xe4, 0x9d, 0xa9, + 0xf6, 0x55, 0x8a, 0x8e, 0x6c, 0x4d, 0x81, 0x0c, 0x96, 0x2e, 0x35, 0x56, + 0x13, 0x6b, 0x0f, 0x8c, 0x69, 0x89, 0xc6, 0x28, 0xc4, 0x8e, 0x98, 0x65, + 0x68, 0xa7, 0x47, 0x4f, 0x3a, 0xc9, 0x2a, 0x55, 0x60, 0x69, 0x67, 0xd9, + 0x6e, 0xea, 0x14, 0x96, 0xba, 0xda, 0x60, 0x46, 0xf4, 0x8b, 0xc4, 0xa5, + 0x3e, 0x31, 0xc6, 0xf7, 0x35, 0x38, 0x47, 0x94, 0xf1, 0x75, 0xd2, 0x5f, + 0x7b, 0x5c, 0xbd, 0xbd, 0x76, 0xc4, 0x0a, 0x5a, 0x3b, 0x06, 0x1e, 0x23, + 0x5b, 0x73, 0x6a, 0xde, 0x4c, 0x7a, 0xd3, 0x84, 0xff, 0x3b, 0x17, 0xb6, + 0x56, 0x1b, 0x32, 0xc1, 0x36, 0x69, 0x00, 0xbf, 0x6b, 0x2a, 0xed, 0x89, + 0x6c, 0x74, 0xac, 0x73, 0xd5, 0xf2, 0xce, 0x6e, 0x9e, 0xfc, 0xa8, 0x17, + 0x9e, 0x3a, 0xff, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x17, 0x1d, 0xfe, 0x57, + 0x38, 0xd7, 0x76, 0x9a, 0x2e, 0xbb, 0xff, 0x95, 0x79, 0x2b, 0x9c, 0x6b, + 0xbb, 0x4d, 0x12, 0x8d, 0x44, 0x74, 0x7e, 0xf2, 0x86, 0x60, 0x4a, 0x54, + 0x84, 0x7b, 0x4a, 0x12, 0x3a, 0x26, 0x37, 0x17, 0xce, 0x7c, 0x18, 0x07, + 0x7a, 0x28, 0xf1, 0xfe, 0xc1, 0xfd, 0xff, 0xe5, 0x56, 0xf2, 0x57, 0x38, + 0xd7, 0x76, 0x9a, 0x25, 0xab, 0xfe, 0x61, 0xdd, 0x46, 0x37, 0x8d, 0xf6, + 0x0e, 0xbf, 0x71, 0xae, 0xed, 0x34, 0x46, 0xf7, 0xfe, 0x79, 0x2b, 0x9c, + 0x6b, 0xbb, 0x4d, 0x12, 0xfd, 0xfd, 0x1e, 0xfb, 0xd7, 0xf1, 0xd7, 0xfb, + 0x3e, 0xf1, 0x4e, 0xff, 0xa3, 0xaf, 0xbf, 0xea, 0x70, 0xeb, 0xd3, 0x6b, + 0x87, 0x59, 0x56, 0x24, 0x9b, 0x2e, 0x22, 0x2c, 0xcf, 0xa9, 0x42, 0x5d, + 0xb2, 0x6f, 0xf4, 0x8a, 0xff, 0xf6, 0xf2, 0xf2, 0x4c, 0xa8, 0x53, 0x6c, + 0x04, 0xeb, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x55, 0x77, 0x26, 0xc1, + 0xd7, 0xc8, 0xb7, 0xda, 0x75, 0x28, 0x6e, 0xbc, 0x31, 0x78, 0x76, 0x19, + 0x3a, 0xfe, 0x7e, 0xcc, 0x30, 0x13, 0xaf, 0xfe, 0xf7, 0x63, 0x42, 0xff, + 0xb0, 0x53, 0x87, 0x5e, 0x89, 0x61, 0xd4, 0x14, 0x46, 0xee, 0x59, 0x32, + 0x3d, 0xff, 0x29, 0x83, 0x9b, 0xf9, 0xd6, 0x75, 0xc1, 0x43, 0xaf, 0xec, + 0xe3, 0x5d, 0xda, 0x68, 0x90, 0x2b, 0xe1, 0xe6, 0xaa, 0x2b, 0x7e, 0xd3, + 0x8b, 0xee, 0x75, 0xdf, 0xc1, 0xd5, 0x23, 0xe1, 0xdc, 0x97, 0x84, 0xd7, + 0xfa, 0x51, 0xc9, 0xe3, 0x93, 0x9d, 0x7f, 0xb9, 0x3a, 0xe0, 0x65, 0xa3, + 0xaa, 0x0f, 0x9f, 0x0d, 0x2f, 0xb2, 0x77, 0x09, 0xd7, 0xff, 0xb2, 0x6e, + 0xba, 0xfd, 0xd8, 0xf7, 0xeb, 0x3a, 0xa7, 0x56, 0x12, 0x12, 0x2c, 0x85, + 0x62, 0x86, 0x4f, 0x0e, 0x61, 0x84, 0xbf, 0x88, 0x3e, 0x90, 0xdf, 0xfc, + 0x39, 0x3a, 0xbb, 0x30, 0x23, 0x9e, 0x3a, 0x95, 0x46, 0x47, 0x21, 0x07, + 0x7f, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x8b, 0x22, 0xff, 0x2b, 0x9c, 0x6b, + 0xbb, 0x4d, 0x16, 0xbd, 0xff, 0xec, 0xfb, 0x13, 0xab, 0x93, 0x78, 0x30, + 0x27, 0x5f, 0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0xe4, 0xbf, 0x71, 0xae, + 0xed, 0x34, 0x5d, 0x97, 0xfe, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x14, + 0x75, 0x95, 0xc3, 0xfd, 0x59, 0x9d, 0xf0, 0xc4, 0x96, 0x75, 0xff, 0x98, + 0x4c, 0x05, 0xc7, 0x25, 0x89, 0xb4, 0xeb, 0x48, 0xeb, 0xf7, 0x1a, 0xee, + 0xd3, 0x45, 0x2b, 0x7f, 0xcd, 0xea, 0x4d, 0xd8, 0x9f, 0x0e, 0xbf, 0xfd, + 0xd8, 0x9e, 0x3a, 0x9b, 0x5c, 0x3d, 0x43, 0x95, 0x37, 0x37, 0x49, 0x5c, + 0x46, 0x3c, 0xcd, 0x95, 0xba, 0x60, 0xef, 0x0d, 0x7b, 0xff, 0x3a, 0x7a, + 0x5f, 0x85, 0xc4, 0x07, 0x59, 0x50, 0xa7, 0xa9, 0xb9, 0x02, 0xe3, 0x4e, + 0xe9, 0x4d, 0x4e, 0xca, 0xc0, 0x94, 0x77, 0x98, 0xeb, 0xba, 0x72, 0x4e, + 0x25, 0x2c, 0xa4, 0x07, 0xe2, 0x7f, 0xa4, 0xcf, 0x42, 0xf3, 0x6c, 0x7f, + 0x97, 0xfd, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x38, 0xbf, 0xe4, 0x57, + 0x38, 0xd7, 0x76, 0x9a, 0x2b, 0x5b, 0x2a, 0xe8, 0x89, 0xf2, 0x2d, 0xff, + 0xe5, 0x56, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x25, 0xbb, 0xdf, 0xf0, + 0x07, 0x5d, 0x9b, 0x9d, 0x7f, 0x83, 0x8b, 0x5c, 0x26, 0x8e, 0xbd, 0xb7, + 0xf9, 0x1d, 0x4d, 0x44, 0x1e, 0xe3, 0xa8, 0x2d, 0xb4, 0xc6, 0xf7, 0x43, + 0x23, 0xaf, 0xfb, 0x37, 0x1c, 0x00, 0x1e, 0x47, 0x5c, 0xb6, 0x9d, 0x50, + 0x79, 0xb2, 0x37, 0xbe, 0x18, 0xde, 0x47, 0x5f, 0xff, 0x9f, 0x70, 0x07, + 0xaf, 0x2c, 0xd0, 0xfe, 0xff, 0x4e, 0xa6, 0x9f, 0xc7, 0x48, 0x6c, 0xa1, + 0xd7, 0xf2, 0x70, 0x53, 0xda, 0x3a, 0xfd, 0xc7, 0x1c, 0x83, 0xa8, 0xd1, + 0x0d, 0xa1, 0xf0, 0x74, 0x45, 0xca, 0xee, 0x81, 0x3a, 0xfe, 0x41, 0x0e, + 0x20, 0x4e, 0xa8, 0x37, 0xd2, 0x14, 0xbe, 0xc9, 0xa5, 0x87, 0x5f, 0xf9, + 0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x4c, 0x17, 0x99, 0x40, 0x1d, 0x7d, + 0xa7, 0x10, 0x1d, 0x53, 0x1b, 0xc0, 0x0e, 0x5f, 0xef, 0xf7, 0xe2, 0x42, + 0xf0, 0xeb, 0xf7, 0x52, 0x06, 0x73, 0xaf, 0xfa, 0x27, 0xf0, 0xc7, 0xfe, + 0xd1, 0xd6, 0xf7, 0x51, 0x25, 0xa3, 0x3d, 0x92, 0x6b, 0xed, 0xda, 0x8a, + 0x1d, 0x58, 0x7b, 0x9e, 0x39, 0xbf, 0xdc, 0x4f, 0x62, 0xe3, 0xa7, 0x5f, + 0xed, 0x27, 0x51, 0x78, 0xa1, 0xd7, 0xff, 0x9e, 0x7e, 0xa4, 0x0e, 0x4c, + 0x9c, 0x43, 0xab, 0x11, 0x55, 0xe3, 0x16, 0x4c, 0xae, 0x6e, 0x1d, 0x77, + 0xe0, 0x2a, 0x90, 0xd6, 0x70, 0x56, 0xff, 0x60, 0x47, 0x3d, 0xdc, 0x3a, + 0xe6, 0x13, 0x4f, 0x18, 0x55, 0xfd, 0x3f, 0xdd, 0x97, 0x10, 0x1d, 0x7f, + 0x67, 0xbd, 0x1c, 0xd1, 0xd7, 0xf3, 0x88, 0x27, 0x07, 0x8e, 0xa8, 0x44, + 0x58, 0x99, 0x6c, 0x96, 0x59, 0x58, 0x5e, 0x72, 0x9c, 0xfc, 0x2d, 0x39, + 0x09, 0x96, 0xc2, 0x0b, 0x77, 0xee, 0x10, 0x2c, 0x85, 0xe1, 0x0c, 0x31, + 0x88, 0x6a, 0x19, 0x7e, 0x5c, 0xda, 0x40, 0xc9, 0x87, 0xd8, 0x59, 0x5e, + 0x5f, 0xfc, 0x2a, 0xff, 0xcf, 0x25, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x63, + 0xbe, 0x8e, 0x46, 0xc1, 0xd6, 0x55, 0x11, 0x14, 0xb1, 0xde, 0xa5, 0x5f, + 0x44, 0xf1, 0xc3, 0xaf, 0xd9, 0x13, 0x22, 0xce, 0xa4, 0x3c, 0x7e, 0x10, + 0xdf, 0xc1, 0x5c, 0x67, 0xb4, 0x75, 0xfe, 0xec, 0x72, 0x7f, 0xbf, 0x80, + 0xeb, 0x9f, 0x47, 0x5f, 0x7c, 0xf6, 0x74, 0xeb, 0x47, 0x4d, 0xc6, 0x85, + 0x6f, 0x40, 0xce, 0x75, 0xff, 0xff, 0xf4, 0xb5, 0xdc, 0xfd, 0x9d, 0x77, + 0x1b, 0x9a, 0xf9, 0x9b, 0xcb, 0x48, 0x28, 0x75, 0xe7, 0x76, 0x9a, 0x2b, + 0x1b, 0xe7, 0xfb, 0x0a, 0x1d, 0x4d, 0x3c, 0xae, 0x13, 0xdf, 0xfb, 0x67, + 0x3c, 0x39, 0xfc, 0x0f, 0x8e, 0xa5, 0x13, 0x6c, 0x69, 0x36, 0xe3, 0x7c, + 0x86, 0x57, 0x88, 0xaf, 0xfe, 0x1f, 0x29, 0xfc, 0x0e, 0x36, 0x38, 0x75, + 0xfe, 0xe4, 0xfe, 0xd3, 0xee, 0xd3, 0xaa, 0x0f, 0xe1, 0xd0, 0xef, 0xe8, + 0xd8, 0xf6, 0x6f, 0x31, 0xd7, 0xf7, 0xfb, 0x2d, 0xea, 0x30, 0x4e, 0xbf, + 0xb3, 0x5b, 0xca, 0x3a, 0x75, 0xd1, 0xb4, 0xeb, 0x07, 0xa7, 0x88, 0x25, + 0xb7, 0xfd, 0x1b, 0xca, 0x69, 0x3f, 0x27, 0x3a, 0xa1, 0x1b, 0x78, 0xf2, + 0x84, 0xf7, 0xa2, 0x5e, 0x3a, 0xff, 0xd8, 0x1e, 0x27, 0xf3, 0x83, 0x52, + 0x3a, 0xf9, 0x6f, 0xbf, 0x8e, 0xbf, 0xfa, 0x78, 0xf7, 0xcf, 0xad, 0xfb, + 0xb1, 0xf7, 0x47, 0x5f, 0xf7, 0x23, 0x4f, 0xc1, 0x89, 0x1d, 0x5c, 0x44, + 0x3e, 0xd5, 0x1b, 0xd2, 0x79, 0xce, 0xbd, 0xf2, 0x75, 0x9d, 0x70, 0x7c, + 0x75, 0x30, 0x93, 0x1f, 0xc8, 0x54, 0xee, 0x4a, 0x83, 0x82, 0x3f, 0x7f, + 0xe1, 0x70, 0xf6, 0x36, 0xf5, 0xc4, 0xeb, 0xff, 0xff, 0x7f, 0x3e, 0x37, + 0xe0, 0xff, 0xb1, 0xf3, 0x37, 0x96, 0x7e, 0x20, 0xd1, 0xd7, 0xff, 0xa7, + 0xcd, 0xfd, 0xa4, 0x18, 0x03, 0xac, 0xeb, 0xfd, 0xb8, 0xe0, 0x7a, 0xec, + 0x9d, 0x58, 0x7f, 0x8e, 0x93, 0x41, 0x4d, 0x40, 0x4f, 0x75, 0x0f, 0x3b, + 0xfa, 0x79, 0xa4, 0xc2, 0xe4, 0xe7, 0x5f, 0x08, 0xe7, 0x8e, 0xbf, 0x23, + 0x1f, 0x38, 0x87, 0x53, 0x10, 0x7f, 0xb0, 0x6b, 0xd1, 0xfb, 0xfa, 0x7f, + 0xbb, 0x2e, 0x20, 0x3a, 0xf9, 0x8e, 0x34, 0x27, 0x5f, 0xfb, 0xae, 0xbf, + 0x76, 0x3d, 0xfa, 0xce, 0xac, 0x3e, 0x29, 0x88, 0xef, 0xfe, 0xcc, 0x51, + 0x70, 0x9c, 0xe2, 0x32, 0x75, 0xff, 0x24, 0x93, 0xbf, 0xad, 0x68, 0x75, + 0x42, 0x66, 0x39, 0x09, 0x4e, 0x11, 0x79, 0x0e, 0xf7, 0x51, 0x58, 0x64, + 0xdf, 0x4e, 0x43, 0x22, 0xcc, 0x8f, 0x6d, 0xb0, 0xca, 0xe1, 0x07, 0x63, + 0x0c, 0x72, 0xd1, 0x1b, 0xd4, 0x6b, 0xfe, 0x8e, 0x8b, 0x66, 0x16, 0x5f, + 0x63, 0x64, 0xbc, 0xc3, 0xb6, 0x58, 0x83, 0xae, 0x90, 0x9d, 0x7f, 0x73, + 0x90, 0x1c, 0x59, 0xd7, 0xd3, 0xf2, 0x27, 0x3a, 0xef, 0xa0, 0x3a, 0xf7, + 0x51, 0x67, 0x5a, 0x63, 0xa9, 0xcd, 0x67, 0xe3, 0x77, 0xe7, 0x19, 0xff, + 0xd1, 0xd7, 0xfd, 0x01, 0xee, 0x07, 0x8e, 0xd3, 0xa9, 0x13, 0x13, 0x72, + 0xc0, 0x11, 0x8a, 0x26, 0x88, 0x7c, 0x51, 0x6e, 0x9d, 0x7b, 0x5f, 0x74, + 0x75, 0xf6, 0xf3, 0xc2, 0x87, 0x54, 0xe7, 0xa4, 0x11, 0x0f, 0xc7, 0xae, + 0xf4, 0x1d, 0x7f, 0xb7, 0xe4, 0x24, 0x9f, 0x47, 0x5f, 0x60, 0xc4, 0x8e, + 0xac, 0x3d, 0x15, 0x99, 0x5f, 0xec, 0x06, 0xb3, 0xc9, 0xc3, 0xaf, 0xbf, + 0xf6, 0x68, 0xeb, 0xe8, 0xe3, 0x89, 0xd7, 0xf9, 0xf9, 0x20, 0x26, 0xfa, + 0x3a, 0xfb, 0x5a, 0x80, 0x1d, 0x50, 0x8e, 0x7c, 0x21, 0x43, 0x1e, 0x91, + 0x7e, 0x3e, 0xc9, 0x9d, 0xfc, 0x82, 0x39, 0xb5, 0xce, 0xbe, 0x90, 0x3f, + 0x91, 0xd7, 0xdc, 0xfb, 0x00, 0x3a, 0xa0, 0xf1, 0x90, 0x8e, 0xff, 0x24, + 0xee, 0xb0, 0x02, 0x0e, 0xbf, 0xe4, 0x6f, 0x72, 0x61, 0x80, 0x9d, 0x7d, + 0x2f, 0x67, 0xd3, 0xaf, 0x36, 0x00, 0x75, 0xee, 0x42, 0xce, 0xa7, 0x3d, + 0x9f, 0xc8, 0xd9, 0x1b, 0xbf, 0x44, 0xff, 0x72, 0x63, 0xaf, 0x40, 0xc8, + 0xea, 0x0a, 0x78, 0xf3, 0x38, 0xf0, 0x83, 0xa6, 0x43, 0x09, 0x0d, 0x18, + 0x78, 0xaa, 0xff, 0xd1, 0x9a, 0xf9, 0x08, 0x1f, 0xb2, 0x3a, 0xfe, 0x46, + 0x75, 0x3e, 0x32, 0x75, 0x09, 0xf7, 0xf9, 0x02, 0xfd, 0x01, 0xf6, 0x34, + 0xeb, 0xee, 0xc0, 0xb4, 0xea, 0x91, 0xf3, 0xe8, 0x87, 0xc4, 0xd7, 0xce, + 0x2f, 0x31, 0xd7, 0xe4, 0xf0, 0xe4, 0x8e, 0xbe, 0x86, 0x62, 0x63, 0xae, + 0xfa, 0xb3, 0xaf, 0xef, 0x0b, 0x83, 0x04, 0xeb, 0xf0, 0xb8, 0x30, 0x4e, + 0xb7, 0xff, 0x0f, 0x3b, 0xc5, 0x55, 0x3a, 0x3e, 0x14, 0x20, 0x42, 0x5e, + 0x91, 0x0b, 0x35, 0xfe, 0x86, 0x43, 0xfb, 0xf2, 0x47, 0x5f, 0xc9, 0xcd, + 0xf5, 0x12, 0x3a, 0xdb, 0x4e, 0xae, 0x1f, 0x9f, 0x4d, 0x36, 0x0b, 0x6f, + 0x0a, 0x28, 0x75, 0xf6, 0x05, 0x36, 0x9d, 0x74, 0x2f, 0x0d, 0xeb, 0x8d, + 0xdf, 0xf6, 0x32, 0xfb, 0xf6, 0x3e, 0x89, 0xd6, 0xd1, 0xd4, 0x87, 0xe9, + 0xc2, 0xa7, 0x3a, 0xb8, 0x10, 0x55, 0xcc, 0xb2, 0x55, 0x21, 0xad, 0x64, + 0x56, 0xff, 0x3c, 0x87, 0x3d, 0xd4, 0x29, 0x53, 0x43, 0x79, 0xf7, 0xd1, + 0xd7, 0xdf, 0x7a, 0xfe, 0x3a, 0x82, 0x6f, 0xfc, 0x39, 0x7a, 0x06, 0x63, + 0xae, 0x18, 0x3a, 0xd3, 0x1d, 0x53, 0x1e, 0x07, 0x06, 0xdc, 0x52, 0xff, + 0xe5, 0x10, 0x5b, 0xa8, 0x5b, 0xef, 0xe3, 0xaf, 0x03, 0x36, 0x0e, 0xa5, + 0x0f, 0x8b, 0x88, 0x97, 0xcb, 0xd7, 0xeb, 0x3a, 0xca, 0x1d, 0x6d, 0x93, + 0xae, 0xe2, 0x87, 0x54, 0x1e, 0xf2, 0x11, 0xfe, 0x23, 0xf4, 0x4e, 0xff, + 0xfb, 0xb9, 0x2d, 0x47, 0xa5, 0x8c, 0x6e, 0x20, 0x3a, 0xff, 0xd2, 0x4f, + 0x77, 0x37, 0xf7, 0xf0, 0x75, 0xd9, 0xa3, 0xaa, 0x0f, 0x52, 0x47, 0xf5, + 0xa4, 0x62, 0xfa, 0x14, 0x96, 0x01, 0xd7, 0xe4, 0x85, 0xc2, 0xce, 0xb6, + 0x1d, 0x48, 0x7d, 0x8e, 0x51, 0xa1, 0x0d, 0x92, 0x5a, 0x85, 0x63, 0xd8, + 0xc2, 0x90, 0x91, 0xec, 0x20, 0x5e, 0x36, 0xeb, 0xda, 0x89, 0x8e, 0xbf, + 0xb0, 0x39, 0xb5, 0x38, 0x75, 0x1d, 0x65, 0x9d, 0x5e, 0x2e, 0xb6, 0x85, + 0x5f, 0x80, 0x9c, 0x45, 0x0e, 0xb9, 0xd4, 0x3a, 0xa6, 0x46, 0x12, 0xc7, + 0x3a, 0x8e, 0x02, 0x21, 0x27, 0xbb, 0x38, 0x75, 0xde, 0x83, 0xaf, 0xd1, + 0xdc, 0xda, 0xe7, 0x52, 0xcf, 0x45, 0xc5, 0x40, 0x2b, 0x7f, 0x27, 0xb3, + 0xae, 0xa1, 0xd7, 0xf7, 0x7f, 0x79, 0xfa, 0x87, 0x5e, 0x65, 0x96, 0x4a, + 0xbf, 0xe0, 0xc4, 0xff, 0x73, 0xaf, 0xb9, 0x4a, 0x97, 0xf7, 0x64, 0xe7, + 0x5e, 0x94, 0x2c, 0xea, 0x0a, 0x32, 0x5a, 0x9a, 0x89, 0x73, 0x0b, 0x5e, + 0x85, 0xa1, 0xd5, 0x87, 0xae, 0xd3, 0xdb, 0xe4, 0xe6, 0xc0, 0x4e, 0xbf, + 0x76, 0x37, 0x76, 0x33, 0xaf, 0xff, 0xa3, 0xda, 0x0e, 0x79, 0x3b, 0xfe, + 0x6f, 0xe3, 0xab, 0xa7, 0xf5, 0xe2, 0xab, 0x70, 0xeb, 0xfd, 0x98, 0xdf, + 0xbb, 0x7b, 0x87, 0x5f, 0xf9, 0x20, 0x7c, 0x39, 0xe8, 0x64, 0xeb, 0xde, + 0xe7, 0xe7, 0x5b, 0x47, 0x50, 0x9a, 0xdf, 0xc7, 0x6f, 0xff, 0xd8, 0x18, + 0xcd, 0xfe, 0xf9, 0x07, 0xf9, 0x66, 0x8e, 0xb9, 0x60, 0x3a, 0xe7, 0x13, + 0xab, 0xa6, 0xa9, 0xc5, 0xaf, 0xcb, 0x4f, 0x01, 0xce, 0xa9, 0xd5, 0x2a, + 0x64, 0x27, 0x98, 0xc8, 0xa6, 0x10, 0xe1, 0xab, 0xb4, 0x09, 0x0f, 0xa1, + 0x01, 0xf9, 0x05, 0xf7, 0x7c, 0x93, 0x9d, 0x7f, 0x9a, 0x9a, 0x1c, 0xda, + 0xe7, 0x5f, 0x44, 0xef, 0x23, 0xae, 0xcf, 0x1d, 0x7e, 0xc9, 0xc7, 0x37, + 0x3a, 0xb1, 0x16, 0x3b, 0x91, 0x70, 0xcb, 0xa4, 0x22, 0x2b, 0x7d, 0x02, + 0x8c, 0x67, 0x5e, 0xec, 0x04, 0xeb, 0xb9, 0xa3, 0xa8, 0xe4, 0x2d, 0xaf, + 0xf4, 0x0c, 0x9d, 0x78, 0x13, 0xaf, 0xbc, 0xb5, 0xf0, 0xeb, 0xff, 0x81, + 0x02, 0xd7, 0xf0, 0x3e, 0x8c, 0x8e, 0xbd, 0x24, 0xe9, 0xd7, 0xde, 0x1c, + 0x91, 0xd7, 0xec, 0xfd, 0x83, 0xa7, 0x3a, 0xff, 0xf2, 0x6b, 0xb8, 0x11, + 0xcd, 0xa3, 0x9a, 0x3a, 0xa4, 0x9a, 0x22, 0x86, 0x1b, 0x91, 0x4c, 0x89, + 0xc1, 0xb1, 0x20, 0xf1, 0x5d, 0x31, 0x0d, 0xb7, 0xab, 0x08, 0xaa, 0x23, + 0x28, 0x9e, 0x14, 0xf2, 0x31, 0x0c, 0x69, 0xb9, 0x28, 0x77, 0x78, 0xd0, + 0x12, 0x32, 0x79, 0xa1, 0x7b, 0xc8, 0x71, 0xad, 0xef, 0xb2, 0xe7, 0x9e, + 0x31, 0xa0, 0x42, 0x6d, 0x82, 0x5c, 0x31, 0xa6, 0x6a, 0x53, 0xaf, 0xa3, + 0x3e, 0xda, 0x92, 0xc9, 0x16, 0xc9, 0x8f, 0xd8, 0xd7, 0x2f, 0xf9, 0x5f, + 0x26, 0x6c, 0x6b, 0xf8, 0x3a, 0xff, 0xff, 0xbf, 0x85, 0x7d, 0xa4, 0xeb, + 0xa7, 0xb3, 0x80, 0x5b, 0xc8, 0xea, 0x55, 0x52, 0x3c, 0xf1, 0xd2, 0x84, + 0xf2, 0xfd, 0xc6, 0xbb, 0xb4, 0xd1, 0x5b, 0xdf, 0xf9, 0xe4, 0xae, 0x71, + 0xae, 0xed, 0x34, 0x4e, 0x16, 0x57, 0x0f, 0xf5, 0x66, 0x77, 0x30, 0x82, + 0x75, 0xba, 0x75, 0xb4, 0x75, 0x7e, 0x68, 0x36, 0x44, 0x2f, 0x9a, 0xee, + 0xd3, 0x45, 0xa3, 0x7f, 0xfb, 0x03, 0xd7, 0x52, 0x69, 0x93, 0x5f, 0xac, + 0xea, 0xe1, 0xfd, 0x74, 0xb6, 0xf9, 0xae, 0x20, 0x3a, 0xff, 0xa6, 0xc6, + 0x3d, 0x73, 0x8f, 0xe3, 0xaf, 0xe8, 0x71, 0xfc, 0x38, 0x75, 0xc8, 0xa1, + 0xd7, 0xff, 0xe9, 0xe3, 0xd0, 0x1e, 0x47, 0x5f, 0x43, 0x80, 0x3a, 0xff, + 0xd1, 0xbb, 0xb1, 0xf4, 0x5d, 0x8e, 0x73, 0xaf, 0xfd, 0x1c, 0x06, 0x26, + 0x73, 0xdf, 0x9d, 0x50, 0x8d, 0x4e, 0xa9, 0xe9, 0x12, 0xd9, 0x32, 0x63, + 0x3a, 0x87, 0x55, 0xfe, 0xef, 0x7f, 0x51, 0x71, 0xa3, 0xaf, 0xff, 0xc9, + 0xa1, 0xcd, 0xaf, 0xe1, 0xcd, 0x75, 0xe6, 0x3a, 0xb1, 0x11, 0x33, 0x1a, + 0xdf, 0x60, 0x1f, 0xa7, 0x5d, 0xdd, 0x1d, 0x65, 0x58, 0x0a, 0xeb, 0x18, + 0xb3, 0xac, 0x84, 0xfb, 0x48, 0xa6, 0x20, 0x59, 0xe7, 0x63, 0x44, 0xf4, + 0x2e, 0x36, 0x48, 0xfe, 0x90, 0x5f, 0x35, 0xdd, 0xa6, 0x8b, 0x6a, 0xff, + 0xfe, 0x87, 0xf4, 0x76, 0x34, 0x89, 0x24, 0xe6, 0x04, 0xeb, 0xfb, 0xb0, + 0xb8, 0x40, 0x9d, 0x5c, 0x45, 0x76, 0x8b, 0x7c, 0xad, 0x7f, 0xee, 0xa0, + 0x5e, 0x41, 0xea, 0x2c, 0xeb, 0xfe, 0xcc, 0x6e, 0xcf, 0xfd, 0x4e, 0x1d, + 0x7d, 0x1b, 0x71, 0x0e, 0xbb, 0xc0, 0x3a, 0xff, 0xa2, 0x51, 0xc9, 0xe3, + 0x93, 0x9d, 0x7f, 0xfe, 0xfc, 0x53, 0x6a, 0x7b, 0xb1, 0xed, 0x46, 0xd8, + 0x3a, 0xff, 0xa3, 0x9f, 0x35, 0x1d, 0x74, 0x3a, 0xff, 0x75, 0x1e, 0x5e, + 0x49, 0xce, 0xac, 0x4f, 0x65, 0xa6, 0x13, 0x1e, 0xf0, 0xed, 0x64, 0x22, + 0x2d, 0xa3, 0x96, 0x55, 0xf6, 0x4e, 0x2f, 0xe5, 0x1f, 0x81, 0xfc, 0x4e, + 0xbf, 0x87, 0x65, 0x39, 0x8a, 0x1d, 0x7e, 0x49, 0xd7, 0x0d, 0x3a, 0xfc, + 0xfb, 0xcb, 0xee, 0x8e, 0xbf, 0xf2, 0x4d, 0xad, 0xae, 0x33, 0xfe, 0x13, + 0xac, 0xaa, 0x88, 0xf0, 0x12, 0xef, 0x17, 0xed, 0x27, 0xfa, 0x55, 0x4a, + 0xa7, 0x8e, 0x08, 0xdc, 0xae, 0x5f, 0x4e, 0xbf, 0x71, 0xae, 0xed, 0x34, + 0x5c, 0xb6, 0x54, 0x27, 0x93, 0x82, 0xd7, 0xee, 0x35, 0xdd, 0xa6, 0x8b, + 0xb6, 0xff, 0x92, 0x52, 0x41, 0x04, 0x48, 0xeb, 0xe4, 0xe3, 0x80, 0xeb, + 0x2b, 0x88, 0x89, 0x73, 0x3d, 0x1b, 0x54, 0x3b, 0x84, 0x59, 0xca, 0x65, + 0x3e, 0x98, 0x18, 0xe0, 0x94, 0xa5, 0x1d, 0xa5, 0x74, 0x5c, 0xc7, 0x0b, + 0x7e, 0xcb, 0xd4, 0x19, 0xd0, 0x0d, 0x3a, 0x7a, 0x16, 0x37, 0xf9, 0x5c, + 0xe3, 0x5d, 0xda, 0x68, 0xa9, 0xef, 0xc2, 0xaf, 0x35, 0xa3, 0xae, 0x9d, + 0x67, 0x5f, 0xb7, 0x5b, 0xb8, 0x9d, 0x41, 0x37, 0xbf, 0x8b, 0xdb, 0xc7, + 0x5f, 0xf4, 0x3c, 0xff, 0x37, 0xd4, 0x04, 0xea, 0x43, 0xcb, 0x11, 0x0b, + 0xe6, 0xbb, 0xb4, 0xd1, 0x5c, 0xdf, 0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, + 0xce, 0xbc, 0xef, 0x23, 0xaf, 0xe4, 0xd6, 0x0b, 0xb2, 0x75, 0x71, 0x16, + 0x3d, 0x2d, 0x13, 0xff, 0x0d, 0x5f, 0xfe, 0xf4, 0x6b, 0xe7, 0xfa, 0xf4, + 0x4d, 0x32, 0x1d, 0x7f, 0x22, 0xe7, 0xff, 0x92, 0x3a, 0xff, 0x47, 0x7e, + 0x2d, 0x8b, 0x60, 0x78, 0xea, 0xc4, 0x5d, 0xf5, 0x3b, 0x69, 0x7d, 0xfb, + 0x99, 0xe4, 0x59, 0xd7, 0xce, 0x30, 0x13, 0xaf, 0xd3, 0x42, 0xe3, 0xe9, + 0xd7, 0x49, 0x67, 0x56, 0x1b, 0xf1, 0x29, 0xbf, 0x71, 0xae, 0xed, 0x34, + 0x48, 0x57, 0xfe, 0xc5, 0xe3, 0xf2, 0x7f, 0x9b, 0xac, 0xeb, 0xfe, 0x4d, + 0xf5, 0xe1, 0x85, 0xe8, 0xeb, 0xa4, 0xae, 0x22, 0xb3, 0xa6, 0x60, 0x41, + 0xbf, 0xfb, 0xa8, 0xbc, 0xd7, 0xcd, 0xe5, 0x9e, 0x3a, 0xfa, 0x5d, 0xfb, + 0xa3, 0xaa, 0x0f, 0xab, 0x11, 0xaf, 0x98, 0xbe, 0xc2, 0xce, 0xbf, 0xbb, + 0xad, 0x67, 0x27, 0x3a, 0xe8, 0x64, 0xea, 0xc3, 0xc4, 0x42, 0xeb, 0xcb, + 0xdb, 0x23, 0xaf, 0xff, 0x76, 0x00, 0xb7, 0x96, 0xbd, 0x98, 0xb3, 0xac, + 0xac, 0xeb, 0xad, 0x61, 0x6d, 0xc8, 0x68, 0xa4, 0x3d, 0xf8, 0x62, 0xb2, + 0x6e, 0xaf, 0x3c, 0x32, 0xc6, 0x14, 0xda, 0x20, 0xf3, 0x57, 0xe4, 0x1f, + 0x47, 0xaf, 0xfe, 0x57, 0xaf, 0xa1, 0xcf, 0x7a, 0x00, 0x75, 0xff, 0xe5, + 0x56, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x27, 0xca, 0x6a, 0xfb, 0xca, + 0x1f, 0xb1, 0xce, 0xe8, 0x2e, 0x1a, 0x1d, 0x43, 0xb9, 0x37, 0x3a, 0xff, + 0xfa, 0x53, 0xb0, 0xd0, 0xc5, 0xce, 0xde, 0x7c, 0xf9, 0xdd, 0x93, 0xaa, + 0x47, 0xf4, 0x01, 0x6b, 0xf6, 0x73, 0x32, 0x63, 0xac, 0xaf, 0x4f, 0x23, + 0xe9, 0x15, 0xfb, 0x8d, 0x77, 0x69, 0xa2, 0xb2, 0xbf, 0xf3, 0xc9, 0x5c, + 0xe3, 0x5d, 0xda, 0x68, 0x9b, 0xac, 0xae, 0x1f, 0xea, 0xcc, 0xe9, 0xa8, + 0xd0, 0x48, 0x54, 0x5f, 0x35, 0xdd, 0xa6, 0x89, 0x5a, 0xff, 0xfb, 0x93, + 0x8c, 0x71, 0xc2, 0x2f, 0xc8, 0xda, 0x75, 0x70, 0xff, 0x3f, 0x2d, 0xbf, + 0x0c, 0x05, 0xfa, 0x75, 0xf9, 0x55, 0xbc, 0x95, 0xc3, 0xc8, 0x42, 0x3b, + 0xff, 0x7b, 0x15, 0xce, 0x24, 0xee, 0xb3, 0xaf, 0xff, 0x31, 0x4c, 0x43, + 0x03, 0x58, 0xf2, 0x4c, 0xe6, 0x1d, 0x7f, 0xe4, 0xd7, 0xeb, 0x14, 0xdb, + 0xfb, 0x9d, 0x7f, 0x40, 0xbb, 0x5d, 0x8c, 0xea, 0x91, 0xf6, 0xad, 0x02, + 0xe0, 0xf0, 0xeb, 0xf7, 0x1a, 0xee, 0xd3, 0x44, 0xb9, 0x7f, 0xc8, 0xf2, + 0xf0, 0xc2, 0xf4, 0x75, 0xfa, 0x5b, 0x29, 0xd7, 0x3a, 0xf4, 0x6c, 0xc1, + 0xd7, 0x90, 0x60, 0xea, 0x91, 0xef, 0x84, 0xa7, 0x68, 0xed, 0xff, 0xf9, + 0xfc, 0x9f, 0xc8, 0x52, 0x51, 0xe1, 0xfe, 0x47, 0x5f, 0xd2, 0xee, 0x0e, + 0x34, 0xeb, 0xd2, 0xef, 0x8e, 0xbb, 0xb0, 0x87, 0x8f, 0xd2, 0xbb, 0xff, + 0x85, 0x01, 0xae, 0x42, 0x49, 0xf4, 0x75, 0x61, 0xf6, 0xa1, 0x65, 0xe7, + 0x92, 0xac, 0x4d, 0x58, 0xdc, 0x43, 0x0a, 0x44, 0x58, 0x2d, 0xd3, 0x37, + 0x84, 0xae, 0x8c, 0x7d, 0x18, 0x45, 0xff, 0xbf, 0x5a, 0xba, 0x81, 0xf6, + 0x70, 0xeb, 0x2a, 0x8b, 0x86, 0x0b, 0x96, 0xb3, 0xa8, 0x4c, 0x5f, 0xfc, + 0xab, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x8e, 0xef, 0xfb, 0xdd, 0xc9, + 0x2a, 0xe3, 0xa3, 0xaf, 0xe6, 0x10, 0xc3, 0x70, 0x4e, 0xbb, 0xfe, 0x9d, + 0x7f, 0x30, 0x07, 0x3a, 0xfe, 0x3a, 0xff, 0xfe, 0xf4, 0x90, 0x3d, 0x4d, + 0xbf, 0x30, 0x3c, 0x4f, 0xda, 0x75, 0xfe, 0xc6, 0x75, 0x03, 0xed, 0x1d, + 0x7f, 0x00, 0x73, 0x7f, 0x61, 0xd7, 0xe7, 0x53, 0xb8, 0x03, 0xaf, 0xe1, + 0x03, 0xf1, 0xfe, 0x9d, 0x50, 0x88, 0x0e, 0x16, 0x39, 0x3d, 0xff, 0x93, + 0x9f, 0x34, 0x38, 0xb8, 0x69, 0xd7, 0xfe, 0x81, 0xff, 0xc8, 0xfb, 0x5e, + 0x47, 0x5f, 0xf8, 0x7f, 0x97, 0xcc, 0x41, 0x85, 0x9d, 0x7c, 0xd7, 0x76, + 0x9a, 0x2a, 0x1b, 0xfe, 0xce, 0xe0, 0xbf, 0x38, 0x87, 0x52, 0x89, 0x8e, + 0x34, 0xf9, 0x0f, 0xb8, 0x7d, 0xa2, 0xdb, 0xcc, 0x6f, 0x07, 0x5d, 0x2c, + 0x3a, 0xff, 0xa5, 0xe4, 0xe3, 0xb5, 0x04, 0xeb, 0xe9, 0x03, 0x58, 0x75, + 0xff, 0xe7, 0x5e, 0x70, 0x71, 0x36, 0xa7, 0x1c, 0xeb, 0xff, 0xba, 0x39, + 0x37, 0xbb, 0x9c, 0x4d, 0x1d, 0x7e, 0xdc, 0x51, 0x68, 0x75, 0x42, 0x2c, + 0x31, 0x1d, 0x10, 0xef, 0xf4, 0x79, 0xfb, 0xf0, 0x30, 0x75, 0xff, 0xb3, + 0xda, 0xe6, 0x4d, 0xd4, 0x50, 0xeb, 0xfe, 0xf8, 0xe3, 0x9b, 0x1f, 0x3b, + 0xf9, 0xd4, 0x87, 0xfd, 0xf9, 0xfd, 0xfe, 0x94, 0x72, 0x78, 0xe4, 0xe7, + 0x5f, 0xfb, 0x58, 0x3e, 0xd6, 0x49, 0x3a, 0x75, 0xfd, 0xac, 0xda, 0x31, + 0xb9, 0xd5, 0xa3, 0xea, 0xf1, 0xe5, 0xff, 0xf4, 0x03, 0x07, 0xe3, 0xfb, + 0xe7, 0x70, 0x0e, 0x75, 0xc3, 0x39, 0xd5, 0x09, 0x93, 0x64, 0x27, 0x90, + 0x88, 0x54, 0x2f, 0xed, 0xae, 0xbe, 0xb2, 0xe7, 0x5f, 0xff, 0xe4, 0x8f, + 0x3f, 0x55, 0xd7, 0x70, 0x7d, 0xf0, 0x12, 0xd1, 0xd6, 0xc4, 0x44, 0x88, + 0x97, 0xdf, 0x77, 0xd9, 0x39, 0xd7, 0xec, 0x9d, 0xc7, 0x69, 0xd7, 0xff, + 0xff, 0xfa, 0x25, 0xf3, 0xdd, 0x48, 0xd7, 0xcc, 0xfd, 0xb1, 0xb7, 0xe6, + 0x73, 0x99, 0xb7, 0xf7, 0xe9, 0xd7, 0xdd, 0x17, 0xd8, 0x3a, 0xb1, 0x30, + 0x51, 0x22, 0xd1, 0x47, 0xa1, 0x31, 0x7f, 0xff, 0xdf, 0xbb, 0x1a, 0x4f, + 0xd7, 0x4f, 0x47, 0x53, 0xda, 0xc0, 0x9d, 0x65, 0x58, 0x0c, 0x91, 0xd6, + 0x2c, 0xb9, 0x84, 0x2f, 0x05, 0xf3, 0xaf, 0x86, 0x16, 0x59, 0x1a, 0x52, + 0x89, 0x6d, 0x1d, 0xdc, 0x55, 0x0d, 0xb9, 0x0d, 0x15, 0x96, 0xf6, 0x16, + 0x23, 0x1a, 0x46, 0xa1, 0xa1, 0xe8, 0xca, 0xf6, 0x50, 0x6f, 0x9a, 0xee, + 0xd3, 0x45, 0x51, 0x7f, 0xb9, 0x1b, 0x77, 0x96, 0x78, 0xea, 0xe1, 0xf1, + 0x7e, 0x5b, 0x7f, 0xe7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x35, 0xdf, + 0x47, 0x23, 0xc7, 0x5c, 0xfe, 0x3a, 0x82, 0x6d, 0x56, 0x41, 0x65, 0x71, + 0x18, 0x6b, 0x23, 0x77, 0xfb, 0xf7, 0x1a, 0xee, 0xd3, 0x45, 0x59, 0x7f, + 0xd1, 0x28, 0xe4, 0xf1, 0xc9, 0xce, 0xb2, 0xb8, 0x7d, 0x82, 0x67, 0x7f, + 0xdd, 0x8d, 0xfd, 0x1d, 0x76, 0x33, 0xaf, 0xfe, 0x06, 0x0a, 0xb2, 0x06, + 0xa7, 0x71, 0x3a, 0x95, 0x3f, 0xf8, 0x3b, 0xbf, 0xf9, 0x57, 0x92, 0xb9, + 0xc6, 0xbb, 0xb4, 0xd1, 0x22, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x2d, 0x2b, + 0xff, 0x3c, 0x95, 0xce, 0x35, 0xdd, 0xa6, 0x89, 0xf6, 0xca, 0xe1, 0xfe, + 0xac, 0xce, 0xff, 0xf2, 0xab, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x14, + 0x25, 0xff, 0xd8, 0xca, 0xbe, 0x51, 0xf4, 0x9e, 0x83, 0xaf, 0xde, 0xfd, + 0xaf, 0xa3, 0xaf, 0x92, 0x78, 0xe1, 0xd4, 0xb3, 0xc9, 0xe9, 0x45, 0xfb, + 0x8d, 0x77, 0x69, 0xa2, 0x8f, 0xbf, 0xe8, 0x94, 0x72, 0x78, 0xe4, 0xe7, + 0x5f, 0xff, 0xff, 0xef, 0xa9, 0xc9, 0xa3, 0xbc, 0xce, 0xbf, 0xdd, 0x62, + 0x8e, 0x20, 0x81, 0x89, 0xbb, 0x07, 0x5f, 0x9f, 0x49, 0xe8, 0x3a, 0xff, + 0xa2, 0x68, 0x18, 0x9b, 0xb0, 0x75, 0x42, 0x3b, 0x14, 0x84, 0x80, 0x92, + 0xdf, 0xff, 0xd8, 0x1e, 0xc7, 0xd5, 0x7c, 0x2e, 0x0d, 0x6a, 0x00, 0x55, + 0xe7, 0x92, 0xb0, 0xa8, 0x2b, 0x08, 0x84, 0xcf, 0xd1, 0x92, 0xec, 0x9a, + 0x5f, 0xfd, 0x9d, 0x57, 0xca, 0x3e, 0x93, 0xd0, 0x75, 0x95, 0x9d, 0x5a, + 0x02, 0xe5, 0x4c, 0x79, 0x92, 0xa1, 0xb6, 0xe9, 0x9e, 0x71, 0xbe, 0x48, + 0xb8, 0xa2, 0xa5, 0x25, 0x55, 0xb2, 0x96, 0x37, 0x85, 0x0a, 0x42, 0x9a, + 0x62, 0x2e, 0xc3, 0x38, 0x05, 0x1e, 0x97, 0x2f, 0x7f, 0x95, 0xce, 0x35, + 0xdd, 0xa6, 0x88, 0x8a, 0xfe, 0xce, 0x35, 0xdd, 0xa6, 0x88, 0xae, 0xff, + 0x98, 0xd5, 0xce, 0x35, 0xdd, 0xa6, 0x8a, 0xe2, 0x95, 0x44, 0x03, 0x9c, + 0x5f, 0xfe, 0x04, 0x0b, 0x55, 0x7f, 0x03, 0xe8, 0xc8, 0xeb, 0xe5, 0x67, + 0x99, 0x8c, 0xeb, 0x26, 0xe7, 0xe6, 0x04, 0xbb, 0xec, 0xeb, 0xf8, 0xeb, + 0xfd, 0x89, 0xc0, 0x03, 0xfd, 0x1d, 0x66, 0x00, 0x9e, 0x9e, 0x88, 0x2f, + 0xff, 0xef, 0x69, 0x3a, 0xe9, 0x24, 0x1f, 0x7f, 0xde, 0x61, 0xd7, 0xee, + 0x35, 0xdd, 0xa6, 0x8a, 0x7a, 0xff, 0x2d, 0x03, 0xfb, 0xf2, 0x47, 0x5c, + 0xb4, 0x3a, 0xa0, 0xf2, 0x1a, 0x67, 0x7f, 0xff, 0xa5, 0x1e, 0xd7, 0xeb, + 0x6a, 0x02, 0x33, 0xa9, 0xfb, 0x4e, 0xbf, 0xff, 0xb9, 0xcf, 0xf9, 0xc8, + 0x1c, 0x51, 0x3b, 0xdc, 0xfa, 0x75, 0xff, 0xc9, 0x2c, 0x10, 0x42, 0xd3, + 0x92, 0x3a, 0xff, 0x4a, 0x39, 0x3c, 0x72, 0x73, 0xaf, 0xbe, 0x0b, 0xc8, + 0xeb, 0xf3, 0xe7, 0x51, 0x67, 0x56, 0x8f, 0x1f, 0x69, 0x15, 0x42, 0x27, + 0xf1, 0xee, 0xff, 0xc8, 0x30, 0xb8, 0x90, 0xe2, 0xce, 0xbf, 0xe8, 0x16, + 0xe6, 0xdc, 0xf6, 0x8e, 0xbf, 0x3c, 0xf1, 0xcf, 0xce, 0xa6, 0x12, 0xb7, + 0x98, 0x2b, 0xc5, 0x96, 0xbd, 0xee, 0x42, 0x8c, 0x2e, 0xba, 0x30, 0xe0, + 0xd1, 0x0e, 0xd3, 0xad, 0x93, 0x8b, 0xff, 0xcf, 0x25, 0x42, 0x2e, 0xce, + 0xb5, 0x00, 0x3a, 0xff, 0xf0, 0x01, 0xfe, 0x95, 0xfa, 0x2e, 0xb1, 0x83, + 0xaf, 0xfe, 0x1c, 0x03, 0x88, 0x15, 0x5a, 0x2c, 0xea, 0xe2, 0x23, 0xbc, + 0x99, 0x4a, 0xa7, 0x3e, 0x18, 0x52, 0x24, 0x36, 0x2d, 0x87, 0x5f, 0x86, + 0x3f, 0x60, 0xe8, 0xeb, 0xf9, 0x4e, 0x38, 0x5c, 0x4e, 0xa0, 0x9f, 0x36, + 0x07, 0xb9, 0x5d, 0xff, 0xc8, 0x1e, 0x3e, 0xea, 0xf3, 0x91, 0x39, 0xd4, + 0xa9, 0xf9, 0xf4, 0xb6, 0xe0, 0xc1, 0xd7, 0xff, 0xee, 0xc7, 0x32, 0x48, + 0xfe, 0xc0, 0xa7, 0xed, 0x2a, 0xfd, 0x12, 0x07, 0xf2, 0x3a, 0xf9, 0xae, + 0xed, 0x34, 0x56, 0x75, 0x31, 0xea, 0xf0, 0xa2, 0xfb, 0xc8, 0xbd, 0x1d, + 0x7f, 0x4e, 0xb8, 0x19, 0x68, 0xeb, 0xf6, 0x7b, 0x5f, 0x74, 0x75, 0xe8, + 0x9d, 0x0e, 0xbf, 0x78, 0x1f, 0x46, 0x47, 0x5e, 0xfd, 0xf4, 0x75, 0xff, + 0x64, 0x93, 0xf6, 0x36, 0x2c, 0x0b, 0x3a, 0xfd, 0x93, 0x4f, 0xf8, 0x0e, + 0xb2, 0xb0, 0xa8, 0x88, 0x22, 0xb9, 0x0a, 0x8d, 0xc8, 0xf8, 0x42, 0xb2, + 0xde, 0x94, 0xb8, 0xd8, 0x94, 0xe8, 0x73, 0xea, 0x0d, 0xff, 0xba, 0x9e, + 0x7e, 0x4f, 0x08, 0x13, 0xaf, 0xde, 0x41, 0xc5, 0x9d, 0x7d, 0x27, 0x15, + 0x70, 0xf8, 0xb6, 0x0f, 0x6f, 0xfc, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, + 0x24, 0x5b, 0xff, 0xf7, 0xbb, 0x82, 0xaf, 0x9d, 0xf7, 0xd2, 0x8a, 0x39, + 0xd7, 0xfe, 0x7f, 0x2b, 0x09, 0xc4, 0xf7, 0xe7, 0x52, 0xa8, 0xdf, 0x84, + 0xa7, 0x57, 0xbf, 0xb3, 0x8d, 0x77, 0x69, 0xa2, 0xc9, 0xbf, 0xfd, 0xed, + 0x7d, 0xd2, 0xb9, 0x3a, 0x0c, 0xb4, 0x75, 0x2a, 0x88, 0x5c, 0x38, 0xbf, + 0xff, 0xce, 0x9e, 0xff, 0x8f, 0xa5, 0x5b, 0xd4, 0xe4, 0x4b, 0x47, 0x5f, + 0xd9, 0xc6, 0xbb, 0xb4, 0xd1, 0x6c, 0x5f, 0xff, 0xcc, 0x0e, 0xfc, 0x1c, + 0xe7, 0xb5, 0xd9, 0xbe, 0x7c, 0xee, 0xc9, 0xd7, 0xb9, 0xff, 0x4e, 0xbb, + 0xca, 0xc2, 0x21, 0xf8, 0xd5, 0x4a, 0xa3, 0xb9, 0x21, 0x7f, 0x7b, 0x35, + 0x87, 0x5f, 0x35, 0xdd, 0xa6, 0x8b, 0x6e, 0xfb, 0x53, 0xbf, 0x0e, 0xae, + 0x1e, 0x7f, 0x8b, 0x6f, 0xe4, 0xef, 0x90, 0x1f, 0x9d, 0x7f, 0xd1, 0x28, + 0xe4, 0xf1, 0xc9, 0xce, 0xb2, 0xb2, 0x47, 0x8e, 0x34, 0xcc, 0x44, 0x25, + 0xb7, 0xff, 0xb0, 0x40, 0xaa, 0xdc, 0x39, 0x82, 0xa1, 0xd7, 0x98, 0x5d, + 0x09, 0xd7, 0xa7, 0xea, 0x1d, 0x7f, 0xe6, 0x13, 0x09, 0x87, 0xfb, 0xb8, + 0x30, 0x03, 0xaf, 0xe8, 0x19, 0x07, 0xf5, 0x9d, 0x7c, 0xd7, 0x76, 0x9a, + 0x2f, 0x0b, 0xff, 0x3f, 0xa3, 0x6f, 0x39, 0x9b, 0xe8, 0xea, 0xe1, 0xf6, + 0x89, 0x6d, 0xf7, 0xb6, 0x73, 0xa7, 0x5f, 0x97, 0x03, 0x27, 0x3a, 0xfe, + 0x81, 0xf6, 0xd7, 0x69, 0xd7, 0xf4, 0xa3, 0x6c, 0x73, 0x73, 0xaa, 0x47, + 0xb9, 0x85, 0xb7, 0xfa, 0x3c, 0xfd, 0xf8, 0x18, 0x3a, 0xff, 0xdf, 0x57, + 0xbc, 0xbd, 0x83, 0xed, 0x1d, 0x76, 0x28, 0x75, 0x41, 0xeb, 0xe2, 0x0d, + 0xf2, 0x4f, 0x8b, 0x3a, 0xfd, 0x82, 0x0d, 0x88, 0x3a, 0xfd, 0x1f, 0x7f, + 0x7d, 0x1d, 0x7f, 0xf2, 0xe1, 0xbf, 0x30, 0x7f, 0x96, 0x68, 0xeb, 0xff, + 0xff, 0x3a, 0x79, 0xd6, 0xe2, 0x06, 0xf5, 0x39, 0x2f, 0xb2, 0xc1, 0x3a, + 0xfe, 0x8d, 0xf7, 0x93, 0xee, 0x75, 0x62, 0x37, 0xba, 0x8b, 0xfb, 0x55, + 0xff, 0xd9, 0xde, 0xbc, 0x96, 0x91, 0xc9, 0x1d, 0x74, 0x00, 0xea, 0x91, + 0xeb, 0xf9, 0x0a, 0x98, 0x0b, 0x95, 0x6c, 0x22, 0x06, 0x26, 0x39, 0x3a, + 0x5e, 0x42, 0x6b, 0x72, 0x14, 0x24, 0x9a, 0x10, 0x2b, 0x21, 0xec, 0x22, + 0x9c, 0x80, 0x04, 0x22, 0x51, 0xa8, 0xc1, 0xfd, 0x08, 0x7b, 0xfd, 0xba, + 0xb8, 0x07, 0xe6, 0x8e, 0xbf, 0xc0, 0x56, 0x69, 0x40, 0xf8, 0xea, 0x55, + 0x35, 0xe8, 0x87, 0xb7, 0x0d, 0x2f, 0x26, 0x6e, 0x75, 0xf3, 0x5d, 0xda, + 0x68, 0xbd, 0x2f, 0xfc, 0x9e, 0xe8, 0xbc, 0x80, 0xe0, 0x3a, 0xb8, 0x7d, + 0x2b, 0x2d, 0xbc, 0xb4, 0xf1, 0xd7, 0xfc, 0xfe, 0x94, 0x29, 0xe4, 0x9c, + 0xea, 0x59, 0xea, 0x08, 0xdd, 0xfb, 0x17, 0xd7, 0x09, 0xd4, 0x14, 0xd0, + 0x72, 0x10, 0x9f, 0x5d, 0xb6, 0x08, 0x6f, 0xff, 0xf6, 0xdc, 0x15, 0x43, + 0x81, 0xee, 0x2d, 0x6f, 0x2c, 0x13, 0xaf, 0xf2, 0xbe, 0xc9, 0xa4, 0xe1, + 0x3a, 0x91, 0x12, 0x9d, 0x60, 0xa5, 0x51, 0xfb, 0x90, 0xdb, 0xa8, 0x6e, + 0x34, 0x67, 0x85, 0xfc, 0xa1, 0x2d, 0x93, 0xb2, 0x6d, 0x8c, 0x51, 0x25, + 0x22, 0xcd, 0x18, 0x3f, 0x23, 0x1a, 0x5c, 0x2d, 0x3a, 0x46, 0x08, 0xd3, + 0xc6, 0x31, 0x9d, 0x21, 0xff, 0x3c, 0xa2, 0xcc, 0xa7, 0x4b, 0xbf, 0xe9, + 0xd7, 0xff, 0x7f, 0x13, 0x0e, 0x6d, 0x75, 0xad, 0x0e, 0xbe, 0xce, 0xbf, + 0x8e, 0xbf, 0xd8, 0x9c, 0x00, 0x3f, 0xd1, 0xd6, 0x60, 0x28, 0x89, 0x81, + 0x45, 0xd1, 0x05, 0xf7, 0xa3, 0x79, 0xce, 0xbf, 0xef, 0x6b, 0x37, 0x97, + 0x7f, 0x50, 0xea, 0x43, 0xdf, 0x12, 0x3b, 0xe8, 0xdb, 0x12, 0x3a, 0xfd, + 0xc6, 0xbb, 0xb4, 0xd1, 0x11, 0xdf, 0xff, 0x77, 0xfd, 0x6b, 0x16, 0x39, + 0xb7, 0xe4, 0x31, 0x47, 0x5f, 0xf4, 0x4f, 0xcc, 0xf7, 0x93, 0xc7, 0x5e, + 0x18, 0xdc, 0xea, 0x91, 0xe9, 0x84, 0xe2, 0xff, 0xb3, 0x99, 0xac, 0x71, + 0x9c, 0xeb, 0xd8, 0x15, 0x9d, 0x7f, 0xff, 0xba, 0xe9, 0xe8, 0xe8, 0xe7, + 0xba, 0x9d, 0xc4, 0x64, 0xeb, 0xff, 0xff, 0xde, 0xf2, 0x2f, 0x89, 0x9b, + 0x8f, 0xfe, 0x8e, 0xfc, 0xda, 0x9e, 0x9a, 0x0e, 0xa8, 0x46, 0xce, 0x2e, + 0xdf, 0xe7, 0x5e, 0x72, 0x50, 0xb3, 0xae, 0x9d, 0x65, 0x5c, 0xcb, 0x25, + 0x5f, 0xf9, 0x56, 0xf5, 0x26, 0xec, 0x4e, 0xa8, 0x0d, 0x7b, 0x22, 0xf7, + 0xdb, 0x63, 0xd0, 0x75, 0x48, 0xff, 0x11, 0x6a, 0xfe, 0xc7, 0x5e, 0x6f, + 0xe3, 0xaf, 0xfb, 0xf8, 0xee, 0x4d, 0x27, 0x9c, 0xeb, 0xf9, 0x5d, 0x27, + 0x1c, 0x07, 0x56, 0x1f, 0x3b, 0x9d, 0x59, 0x8c, 0xeb, 0xfe, 0x8c, 0xde, + 0x1e, 0x4f, 0x23, 0xa9, 0x88, 0x3c, 0x90, 0x89, 0xdf, 0xcc, 0x63, 0x9d, + 0x7f, 0x1d, 0x7f, 0x42, 0x98, 0x28, 0xa1, 0xd7, 0xf6, 0x7b, 0x63, 0xd9, + 0xd3, 0xab, 0x11, 0x12, 0x25, 0xda, 0x2c, 0xbf, 0xff, 0x9a, 0xaf, 0x1c, + 0x53, 0xca, 0xf2, 0x3c, 0x2e, 0x03, 0xa9, 0x8b, 0x5f, 0x06, 0x61, 0x42, + 0xbe, 0x21, 0x33, 0x22, 0x0c, 0x22, 0x69, 0x9e, 0xf0, 0xab, 0x42, 0x29, + 0x8d, 0xb9, 0x0f, 0x4e, 0x90, 0xbc, 0x37, 0x00, 0x42, 0x30, 0x93, 0xd3, + 0x4f, 0xa1, 0x61, 0xb4, 0xba, 0xed, 0x8e, 0x9d, 0x7e, 0xe3, 0x5d, 0xda, + 0x68, 0x8b, 0xaf, 0xde, 0x07, 0xd1, 0x91, 0x57, 0xed, 0x7b, 0xb0, 0x03, + 0xaf, 0xcf, 0x3c, 0x73, 0xf3, 0xac, 0xac, 0xe8, 0xc4, 0xc1, 0x97, 0x33, + 0xfc, 0xa7, 0x64, 0x9e, 0x95, 0x54, 0x59, 0x28, 0xf6, 0x2f, 0xfe, 0x5b, + 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0x99, 0xaf, 0xe6, 0x19, 0x87, 0xb0, + 0x35, 0x1e, 0x3a, 0xf6, 0xf1, 0xa3, 0xaf, 0x35, 0x16, 0x75, 0xf3, 0x0b, + 0xce, 0x27, 0x5d, 0xb2, 0xc4, 0x1d, 0x76, 0x7e, 0x75, 0xff, 0xee, 0xc2, + 0xdf, 0xd9, 0xb8, 0x17, 0xf7, 0xa7, 0x5f, 0x24, 0xff, 0x89, 0xd7, 0xec, + 0x9f, 0x01, 0x31, 0xd5, 0xf0, 0xf2, 0xbc, 0x45, 0x7f, 0xbe, 0x60, 0xbf, + 0x01, 0xb2, 0x75, 0xff, 0xf9, 0x6f, 0xdc, 0xdc, 0x1d, 0x65, 0xfb, 0x37, + 0x7f, 0x3a, 0xfe, 0xcd, 0x47, 0xd1, 0x83, 0xa8, 0x28, 0xbb, 0xc3, 0x6e, + 0xac, 0xdd, 0xac, 0x3a, 0xed, 0x8f, 0x1d, 0x66, 0x09, 0xd6, 0x04, 0x1a, + 0xdf, 0xc6, 0x6f, 0xff, 0xfc, 0x83, 0x0d, 0x18, 0x5f, 0xc8, 0xe7, 0x13, + 0x6f, 0x1d, 0xc0, 0x75, 0x31, 0x0a, 0xab, 0x1a, 0x3c, 0x82, 0xd3, 0x42, + 0x5b, 0xb0, 0xdf, 0x72, 0xf0, 0x21, 0x78, 0x9e, 0xfe, 0x66, 0x04, 0x73, + 0xc7, 0x5f, 0x3f, 0x52, 0x63, 0xaf, 0xbb, 0x34, 0x04, 0xea, 0xc3, 0xee, + 0x69, 0x5b, 0x90, 0xdf, 0xe6, 0xa6, 0x08, 0x7b, 0x07, 0x51, 0xd7, 0xee, + 0xbf, 0xa4, 0x03, 0xaf, 0xff, 0x7c, 0xeb, 0xa7, 0x81, 0xf8, 0x8b, 0xc8, + 0xea, 0xc4, 0x55, 0xb4, 0xc1, 0x02, 0x96, 0x4f, 0x7f, 0xff, 0xff, 0xff, + 0xf9, 0x89, 0xb0, 0x31, 0x89, 0xb0, 0x98, 0x7b, 0x0f, 0x6b, 0x06, 0x18, + 0x73, 0x0b, 0x93, 0xec, 0x67, 0xe1, 0x62, 0x51, 0xb3, 0xbf, 0xde, 0xb0, + 0xa2, 0x18, 0x4c, 0x6c, 0x37, 0xbe, 0x7c, 0xee, 0xc9, 0xd7, 0xff, 0xe0, + 0x6f, 0x2e, 0xff, 0x1c, 0x57, 0xa8, 0xd7, 0xe1, 0xd7, 0xff, 0x6e, 0xcc, + 0x78, 0x28, 0xc7, 0xa8, 0x59, 0xd7, 0xff, 0xfe, 0x45, 0xa7, 0x3b, 0xfe, + 0xa5, 0x1b, 0x79, 0x03, 0xee, 0xe4, 0x8e, 0xbf, 0xf2, 0x79, 0x1a, 0x81, + 0xf6, 0x34, 0xea, 0xc4, 0x78, 0xf9, 0x23, 0x61, 0xb6, 0xfb, 0xdb, 0x39, + 0xd3, 0xaf, 0xff, 0xf3, 0x8b, 0x47, 0x03, 0xdf, 0xfe, 0x76, 0x25, 0xc8, + 0x9c, 0xea, 0xc4, 0x43, 0x7e, 0x49, 0x7f, 0xff, 0x9d, 0x41, 0xc0, 0x7f, + 0xaf, 0x92, 0x4e, 0xc3, 0x45, 0xce, 0xbe, 0xf2, 0x75, 0x0e, 0xbf, 0xe7, + 0xe4, 0xbe, 0x63, 0x43, 0x87, 0x53, 0x09, 0x70, 0x2a, 0x23, 0x2c, 0xc8, + 0xd2, 0x7b, 0x0b, 0x87, 0x23, 0x16, 0x1f, 0xc8, 0x2d, 0xc3, 0xaf, 0xef, + 0x62, 0xf7, 0xc5, 0x9d, 0x6e, 0xe1, 0xbd, 0x41, 0x0b, 0xfd, 0xf8, 0x5e, + 0x5a, 0x49, 0x1d, 0x7f, 0xfe, 0x0a, 0x0c, 0xf9, 0xa4, 0x7e, 0xaa, 0xcb, + 0x2c, 0x95, 0x7f, 0x7b, 0xb1, 0x3f, 0x7f, 0x3a, 0xfe, 0xde, 0x5a, 0x07, + 0xf3, 0x1d, 0x7f, 0xd3, 0xe0, 0x03, 0xfb, 0xf2, 0x47, 0x5f, 0xce, 0xe1, + 0xdb, 0x81, 0x3a, 0xf3, 0xbb, 0x4d, 0x16, 0x7d, 0xfc, 0x07, 0x19, 0x22, + 0xce, 0xa9, 0xd1, 0x72, 0x13, 0xa6, 0x96, 0x80, 0x9e, 0xff, 0xc9, 0xd8, + 0x92, 0x7a, 0x3d, 0xa3, 0xaf, 0xff, 0x73, 0xaf, 0xf3, 0x36, 0x8e, 0x6b, + 0x04, 0xeb, 0xfe, 0x84, 0x0e, 0x2d, 0x9c, 0xe9, 0xd7, 0xff, 0x6b, 0xc9, + 0x33, 0x2e, 0x18, 0xdf, 0x47, 0x52, 0x23, 0x1d, 0xd2, 0xbf, 0x37, 0xbc, + 0xcb, 0x2c, 0x95, 0x7f, 0xe7, 0x96, 0x87, 0x1a, 0x1c, 0xe1, 0x4a, 0x97, + 0xf7, 0xed, 0x8f, 0xd7, 0x81, 0x3a, 0xff, 0x7b, 0xb9, 0xb7, 0xe4, 0x96, + 0x75, 0x61, 0xf1, 0x7e, 0x57, 0x7f, 0xed, 0xe4, 0x3f, 0x83, 0xe3, 0x56, + 0x03, 0xae, 0x85, 0x0e, 0xbf, 0xe0, 0xc0, 0xc0, 0x25, 0xd4, 0x3a, 0xa1, + 0x11, 0xf3, 0xa1, 0xa0, 0xb5, 0xfe, 0xea, 0x04, 0x5d, 0xe6, 0x3a, 0xff, + 0x07, 0xbf, 0xb8, 0x36, 0x70, 0xea, 0x83, 0xe7, 0x43, 0x1b, 0xfe, 0x41, + 0x0f, 0xd0, 0xff, 0xed, 0x1d, 0x7a, 0x05, 0x43, 0xaa, 0x4b, 0xb8, 0x61, + 0x25, 0x69, 0x9e, 0xeb, 0x13, 0x17, 0xf2, 0x1d, 0x4b, 0x3e, 0xec, 0x60, + 0x60, 0x4e, 0x18, 0x57, 0x6a, 0x16, 0x3e, 0x84, 0xb6, 0xd2, 0x0f, 0xa7, + 0x77, 0x03, 0x47, 0x5f, 0xf7, 0xfe, 0xd0, 0xe4, 0xd0, 0xb3, 0xaf, 0xf3, + 0xb3, 0xd4, 0x8e, 0x41, 0xd4, 0x14, 0x40, 0x28, 0x2d, 0xc3, 0x9b, 0xff, + 0x71, 0x35, 0x2f, 0xbd, 0x81, 0x83, 0xaf, 0xb8, 0x90, 0xb3, 0xaf, 0xff, + 0xde, 0x53, 0xf8, 0xc0, 0xf7, 0x35, 0xbc, 0xa3, 0xa7, 0x57, 0x11, 0x6a, + 0xb3, 0xe1, 0x20, 0xb9, 0xe4, 0x75, 0xff, 0xff, 0xfc, 0x2e, 0xcf, 0xb3, + 0xa3, 0x9e, 0xfc, 0x0b, 0x79, 0x38, 0x60, 0x5f, 0x8f, 0x23, 0xaf, 0xf6, + 0x77, 0xbf, 0xf9, 0xc4, 0xeb, 0xfe, 0x6e, 0x75, 0xaf, 0xc7, 0x91, 0xd7, + 0x92, 0x6d, 0x1d, 0x50, 0x7a, 0x6b, 0x37, 0xb2, 0x05, 0x34, 0x09, 0x85, + 0x79, 0x08, 0x55, 0xc2, 0x16, 0xfe, 0xf8, 0x9d, 0x75, 0xa1, 0xd7, 0xb6, + 0xe0, 0x4e, 0xb7, 0x27, 0x3c, 0xa9, 0x8b, 0x6f, 0xfd, 0x8c, 0xec, 0x73, + 0x36, 0x07, 0xf6, 0x4e, 0xa8, 0x54, 0xef, 0xd8, 0xdb, 0xde, 0x13, 0x02, + 0x55, 0x7f, 0xff, 0xfc, 0x0d, 0x66, 0x0a, 0x9f, 0x78, 0x31, 0x9d, 0x57, + 0x43, 0x93, 0xaf, 0x16, 0x75, 0xfb, 0xec, 0x0f, 0xd5, 0x9d, 0x58, 0x8a, + 0x8f, 0x3f, 0x5f, 0xb6, 0xbf, 0x63, 0xe9, 0xd7, 0xff, 0xdf, 0xef, 0x2d, + 0x07, 0xb1, 0xc0, 0xbb, 0xb2, 0x75, 0x62, 0x27, 0x90, 0x88, 0x4a, 0xaf, + 0x6a, 0x27, 0x3a, 0xff, 0xa3, 0x1b, 0xd4, 0xda, 0xfc, 0x3a, 0xec, 0xe9, + 0xd4, 0x27, 0x9b, 0xb2, 0x71, 0x52, 0x45, 0xd6, 0x8b, 0x7c, 0xd3, 0x7b, + 0xbf, 0xb2, 0x75, 0xe0, 0x7e, 0xd3, 0xaf, 0x7b, 0x3e, 0x9d, 0x7f, 0x46, + 0xfa, 0xf9, 0xc8, 0x3a, 0xf0, 0x7f, 0x69, 0xd7, 0xc1, 0x18, 0x91, 0xd4, + 0x86, 0xf5, 0xc7, 0x68, 0x28, 0xe3, 0xdc, 0x79, 0x07, 0x56, 0x3b, 0xd6, + 0xcb, 0xfc, 0x93, 0x38, 0xa6, 0xfa, 0x3a, 0xec, 0x69, 0xd7, 0xf7, 0x13, + 0x6e, 0x0e, 0x8e, 0xbf, 0xb7, 0xf6, 0x77, 0xf6, 0x33, 0xaf, 0xee, 0x67, + 0x7b, 0xff, 0x8e, 0xbf, 0x74, 0x63, 0x38, 0x65, 0xfd, 0x9c, 0x9f, 0xf7, + 0x09, 0xa2, 0x0d, 0x54, 0xd2, 0xdb, 0x93, 0xa2, 0x7e, 0x4a, 0x75, 0x08, + 0xfb, 0x48, 0x68, 0xdf, 0x9d, 0xa8, 0xb8, 0x3a, 0xfe, 0x97, 0x45, 0xf7, + 0xf1, 0xd4, 0xd3, 0xd2, 0x12, 0x5b, 0xef, 0xa2, 0xf3, 0x9d, 0x58, 0x78, + 0x9a, 0x21, 0xbf, 0x47, 0xbe, 0x2d, 0x93, 0xaf, 0xf4, 0x91, 0x71, 0xdf, + 0xa1, 0x3a, 0xff, 0xf4, 0x60, 0xef, 0xec, 0xe2, 0x4e, 0xeb, 0x3a, 0xfc, + 0xec, 0xfb, 0x3b, 0xa3, 0xfc, 0xf1, 0xa5, 0x7c, 0x56, 0x62, 0xc5, 0x99, + 0x40, 0xac, 0xa3, 0x28, 0xc8, 0x5e, 0x70, 0x84, 0x61, 0x4d, 0x7b, 0x59, + 0x23, 0xaf, 0xc8, 0x0e, 0xc0, 0x4e, 0xbf, 0x26, 0xf2, 0x41, 0x3a, 0xf2, + 0x77, 0x0e, 0xba, 0x17, 0x87, 0x80, 0xd2, 0x6b, 0xf9, 0x9c, 0x5c, 0x71, + 0x43, 0xaf, 0x83, 0xae, 0xc1, 0xd7, 0xe1, 0xe3, 0x2f, 0x39, 0xd5, 0x07, + 0xef, 0x85, 0xce, 0x43, 0x77, 0xe2, 0x75, 0x42, 0x6c, 0xd8, 0x36, 0x8c, + 0xdc, 0x85, 0x1e, 0x8b, 0x2f, 0x77, 0x04, 0xeb, 0xcf, 0xe8, 0x3a, 0xff, + 0x4d, 0x13, 0xad, 0xe6, 0x83, 0xaf, 0xff, 0x9d, 0x4f, 0x47, 0x01, 0xc8, + 0xf0, 0xb8, 0x0e, 0xbf, 0x87, 0x01, 0x83, 0x23, 0xaf, 0xff, 0x94, 0xf9, + 0xf4, 0x5f, 0xda, 0x4d, 0xfa, 0x8c, 0x9d, 0x61, 0xc3, 0xff, 0x72, 0xaa, + 0xc4, 0xd6, 0xb8, 0x34, 0xe3, 0x42, 0x69, 0xfc, 0x33, 0x6e, 0xd6, 0xd3, + 0xaf, 0x90, 0x5c, 0x27, 0x5f, 0xf9, 0x79, 0xed, 0x7d, 0xd3, 0xcb, 0x0e, + 0xbf, 0x6a, 0x39, 0xe8, 0x39, 0x53, 0x7f, 0x41, 0x44, 0xae, 0x97, 0xaf, + 0xdf, 0x66, 0x77, 0xe1, 0xd7, 0xdd, 0xc4, 0xda, 0x75, 0xfd, 0xa4, 0xe6, + 0x7f, 0xc3, 0xaf, 0xff, 0xf4, 0x4d, 0xf1, 0x1b, 0xff, 0x35, 0xff, 0xc5, + 0xa7, 0xba, 0x87, 0x56, 0x27, 0x5e, 0x90, 0xad, 0x59, 0x1f, 0x4a, 0x7c, + 0x45, 0xb0, 0x5b, 0x72, 0xd8, 0x06, 0x8b, 0xf2, 0xfb, 0x5c, 0xcc, 0x3a, + 0xff, 0xe9, 0x7b, 0xf9, 0x49, 0x7e, 0xf4, 0x2c, 0xeb, 0xfd, 0xed, 0x44, + 0xf9, 0xa0, 0x9d, 0x77, 0x70, 0xeb, 0xff, 0xee, 0xc0, 0x71, 0xbf, 0x30, + 0x70, 0x3d, 0x83, 0xaf, 0xfe, 0x4c, 0x1c, 0xcd, 0x7c, 0x96, 0x96, 0x75, + 0xff, 0x9e, 0x37, 0x97, 0xcd, 0x6e, 0x18, 0x3a, 0x82, 0x9c, 0x06, 0xe4, + 0x08, 0x8c, 0xc6, 0x67, 0x30, 0xae, 0x93, 0xbc, 0x87, 0x79, 0x48, 0xe1, + 0xd7, 0xf0, 0x60, 0x1c, 0xcd, 0xce, 0xa5, 0x4f, 0x25, 0x63, 0x97, 0xfa, + 0x17, 0x89, 0xc9, 0xa4, 0x75, 0xc9, 0x31, 0xd7, 0xff, 0xbd, 0x1d, 0x17, + 0x9e, 0x39, 0xc7, 0x91, 0xd7, 0xbc, 0x93, 0x9d, 0x7e, 0x03, 0xef, 0x13, + 0x1d, 0x78, 0x61, 0xa7, 0x5f, 0xfc, 0x14, 0x9b, 0xb1, 0xcd, 0xe5, 0x1c, + 0x3a, 0xff, 0xf2, 0x0b, 0xef, 0xad, 0x67, 0x03, 0xdc, 0x3a, 0xbe, 0x26, + 0x92, 0x82, 0xcb, 0x48, 0x71, 0xc1, 0x28, 0xd0, 0xd6, 0xc2, 0x2d, 0xa0, + 0xeb, 0xdd, 0x4f, 0x1d, 0x6d, 0xb8, 0x6a, 0xbe, 0x87, 0xd4, 0x2e, 0x88, + 0x05, 0x7b, 0x23, 0xa7, 0x48, 0x59, 0x74, 0x8d, 0xe3, 0x7b, 0x04, 0x24, + 0x6f, 0x2d, 0xfe, 0x9d, 0x7f, 0xd8, 0x32, 0x1c, 0x5c, 0x34, 0xeb, 0xf7, + 0x53, 0x6e, 0x04, 0xeb, 0xff, 0x06, 0x07, 0x07, 0xf9, 0x66, 0x8e, 0xbf, + 0x3a, 0xd3, 0x63, 0x0e, 0xbd, 0xe8, 0xdc, 0xea, 0xc3, 0xc4, 0x72, 0x8b, + 0xd0, 0x93, 0x1d, 0x78, 0x58, 0x8d, 0x83, 0xaf, 0xd9, 0x3a, 0xe3, 0x47, + 0x5f, 0xff, 0xfa, 0x3a, 0x8b, 0x56, 0x69, 0x3f, 0x3e, 0xf5, 0x37, 0xd3, + 0x52, 0x73, 0xaa, 0x74, 0xfc, 0x02, 0x3a, 0xa1, 0xaa, 0x14, 0x4d, 0x08, + 0x0e, 0x90, 0x08, 0xde, 0x88, 0xf6, 0x09, 0xef, 0xbe, 0x3c, 0x98, 0xa3, + 0xaf, 0xfe, 0xcd, 0xb8, 0x1c, 0x1f, 0xe5, 0x9a, 0x3a, 0xfd, 0xc8, 0xef, + 0xd0, 0x9d, 0x5c, 0x3e, 0xd7, 0x44, 0xbe, 0x84, 0x9e, 0x0e, 0xbe, 0x65, + 0xf3, 0x47, 0x5f, 0xc1, 0x80, 0x0e, 0x6e, 0x75, 0xff, 0x49, 0x6f, 0x2f, + 0x6a, 0x14, 0x3a, 0xa1, 0x10, 0xd8, 0x42, 0xe5, 0x97, 0xb4, 0x82, 0x75, + 0xf8, 0x5b, 0xf3, 0x5b, 0x9d, 0x58, 0x78, 0x8e, 0x35, 0x4c, 0x69, 0xf6, + 0xbc, 0x25, 0x40, 0x42, 0x30, 0xa6, 0xfd, 0xc6, 0xe9, 0xe4, 0x75, 0xe4, + 0xea, 0x1d, 0x5b, 0x9b, 0x1f, 0x0b, 0xdf, 0x7d, 0xfd, 0xf4, 0x75, 0xff, + 0x22, 0x90, 0x18, 0xdb, 0x9d, 0x3a, 0xfe, 0xff, 0x51, 0x37, 0xfc, 0x3a, + 0xf7, 0xf9, 0xb9, 0xd5, 0xd3, 0xcd, 0xf1, 0x85, 0xfe, 0x97, 0xe3, 0x3e, + 0x93, 0x73, 0xaf, 0x80, 0x0c, 0xdc, 0xeb, 0xfb, 0x63, 0xd8, 0xe2, 0xd3, + 0xaf, 0xfb, 0xf7, 0x90, 0x73, 0x01, 0xa3, 0xaf, 0xf0, 0x13, 0x7d, 0xe5, + 0x9e, 0x3a, 0xba, 0x7d, 0x9a, 0x38, 0xbf, 0x6f, 0xa5, 0xa3, 0x19, 0xd7, + 0xff, 0xec, 0xd7, 0xce, 0xba, 0x78, 0x1f, 0x88, 0xbc, 0x8e, 0xa8, 0x44, + 0x00, 0x95, 0xdf, 0xcf, 0x38, 0x1c, 0x42, 0x75, 0x4e, 0xaa, 0x21, 0xb0, + 0x86, 0x98, 0x8b, 0x86, 0xbd, 0x22, 0xf4, 0x26, 0xb6, 0xc2, 0x8b, 0x64, + 0x86, 0xff, 0x7d, 0x86, 0xec, 0xe7, 0x20, 0xeb, 0xfe, 0x0e, 0x7f, 0xc9, + 0xda, 0x93, 0x9d, 0x7f, 0x47, 0x53, 0x90, 0xb3, 0xab, 0xa8, 0x9c, 0x73, + 0x6f, 0x1d, 0xd4, 0x2e, 0x00, 0x64, 0xaa, 0xc7, 0x8c, 0x96, 0xe9, 0xbf, + 0x3a, 0xcb, 0x3a, 0xb7, 0x35, 0x0c, 0x11, 0x8b, 0xff, 0xa3, 0x99, 0xb5, + 0xe4, 0x0c, 0xc0, 0x9d, 0x7f, 0x3e, 0xf2, 0x18, 0x09, 0xd7, 0xfd, 0x1b, + 0xc9, 0x05, 0x6f, 0xe3, 0xa9, 0xcf, 0x8c, 0x4b, 0x2f, 0xcf, 0x2c, 0x9e, + 0x0e, 0xbf, 0xfa, 0x35, 0xac, 0x5f, 0x86, 0x17, 0xa3, 0xaf, 0xfe, 0x48, + 0xd0, 0xbc, 0xbe, 0x6b, 0x38, 0x75, 0xff, 0xfe, 0x4d, 0x4f, 0x8c, 0xe0, + 0xff, 0xb1, 0x0a, 0xe0, 0xbf, 0x0e, 0xbf, 0xdb, 0xcb, 0x53, 0x4a, 0x27, + 0x3a, 0x82, 0x9a, 0x23, 0x49, 0x85, 0x0b, 0xc8, 0x7f, 0xb1, 0xdf, 0xff, + 0xfb, 0xa9, 0xbf, 0xb3, 0x7f, 0x73, 0x91, 0xe0, 0x7d, 0x19, 0x77, 0x0e, + 0xbc, 0x17, 0x13, 0xaf, 0x72, 0x36, 0x9d, 0x41, 0x36, 0xfc, 0x1a, 0xbf, + 0xf4, 0xa0, 0x7d, 0xc4, 0xdb, 0x81, 0x3a, 0xff, 0xcf, 0xed, 0x7f, 0x2f, + 0xa1, 0x4f, 0x1d, 0x7f, 0xe7, 0xeb, 0x51, 0xfe, 0x69, 0xfa, 0x75, 0xfd, + 0xd7, 0x1d, 0xe4, 0x87, 0x5f, 0xff, 0xb4, 0x3f, 0x3a, 0xe9, 0xe0, 0x7e, + 0x22, 0xf2, 0x3a, 0xff, 0x75, 0x14, 0xd9, 0xff, 0x8a, 0x1d, 0x7f, 0xd0, + 0xca, 0xfb, 0x08, 0x33, 0x9d, 0x7f, 0xfc, 0x39, 0xac, 0x5c, 0x37, 0x3c, + 0x9c, 0xc3, 0xad, 0x8d, 0x45, 0xe7, 0x8e, 0x76, 0x9c, 0x5f, 0xd3, 0xe7, + 0x11, 0xb0, 0x75, 0xf0, 0x86, 0x16, 0x75, 0xff, 0xf7, 0xe3, 0xed, 0x75, + 0x26, 0x18, 0x5b, 0xc8, 0xeb, 0xec, 0x1f, 0xdc, 0xea, 0x59, 0xf7, 0xed, + 0x4f, 0xbf, 0x9c, 0x18, 0x17, 0x91, 0xd5, 0x08, 0xde, 0xc8, 0x47, 0xa1, + 0x25, 0x22, 0x67, 0x9d, 0x8c, 0x2a, 0xa1, 0x7b, 0x62, 0x72, 0x60, 0xc2, + 0x9b, 0x23, 0x64, 0x6a, 0x5a, 0x42, 0x9a, 0x62, 0x15, 0x9f, 0x75, 0x05, + 0xcf, 0x80, 0x58, 0x31, 0x88, 0xfa, 0x37, 0x3b, 0xff, 0xb0, 0x41, 0x99, + 0xcd, 0x7a, 0x30, 0xeb, 0xfe, 0xdf, 0xd9, 0xc4, 0x9d, 0xd6, 0x75, 0xb0, + 0x07, 0xf2, 0x28, 0x17, 0x98, 0x32, 0x43, 0xaf, 0xa0, 0x5e, 0x47, 0x5f, + 0xb1, 0x8d, 0xc4, 0x1f, 0x0d, 0xf7, 0x07, 0xef, 0xed, 0xbd, 0x48, 0xe6, + 0x8e, 0xbf, 0xf7, 0x51, 0x61, 0xc9, 0xa3, 0x38, 0x75, 0xe9, 0x46, 0xe7, + 0x5f, 0x40, 0x1d, 0x67, 0x5c, 0x32, 0xc3, 0xf9, 0x98, 0xf4, 0x47, 0x2f, + 0xb4, 0x9e, 0x83, 0xaa, 0x0f, 0x65, 0xce, 0x6f, 0x9b, 0xd4, 0x98, 0xeb, + 0xff, 0xf0, 0xe2, 0x8a, 0x20, 0x7a, 0x93, 0x75, 0x37, 0xf1, 0xd5, 0x07, + 0xf3, 0x84, 0x57, 0x9a, 0xfc, 0x3a, 0xfd, 0xa6, 0xc7, 0x14, 0x3a, 0xba, + 0x78, 0x60, 0x1b, 0xbf, 0xd9, 0x2c, 0x40, 0xf5, 0x0e, 0xbf, 0xfb, 0x37, + 0xf6, 0x90, 0x60, 0x0e, 0xb3, 0xaf, 0x49, 0x7d, 0x3a, 0xa7, 0x3d, 0xef, + 0x21, 0x5f, 0x22, 0x88, 0xc9, 0xd5, 0x87, 0x8a, 0x24, 0x77, 0x7c, 0xc3, + 0xaf, 0xb4, 0x30, 0xb3, 0xaa, 0x0d, 0xbe, 0xe2, 0xf7, 0xbb, 0x25, 0x9d, + 0x77, 0x50, 0xea, 0xc3, 0x63, 0xe1, 0xca, 0x85, 0xc5, 0xf9, 0x32, 0x62, + 0x0a, 0x91, 0x80, 0x76, 0x13, 0x2e, 0xc6, 0x24, 0x5a, 0x86, 0x9f, 0xea, + 0xfb, 0x2a, 0x57, 0x82, 0xb6, 0x9d, 0x6e, 0x9d, 0x60, 0x1d, 0x76, 0xa4, + 0x75, 0x00, 0xdb, 0x68, 0x43, 0xf1, 0x0b, 0xfa, 0x79, 0xa4, 0xc2, 0xe4, + 0xe7, 0x5e, 0x7c, 0xe1, 0xd7, 0x87, 0x3c, 0x75, 0x74, 0xda, 0x08, 0xd5, + 0xde, 0x13, 0xaf, 0x46, 0xfa, 0x3a, 0xf9, 0x06, 0x58, 0x75, 0xe9, 0xdc, + 0x4e, 0xa0, 0x9e, 0xb2, 0xc7, 0x3c, 0x3f, 0x7e, 0xcf, 0x75, 0x3c, 0x75, + 0xf9, 0xf7, 0xcd, 0xfc, 0x75, 0x94, 0xe9, 0xe7, 0x78, 0x9a, 0xe4, 0xe1, + 0xd7, 0xf4, 0xff, 0x27, 0x77, 0xe9, 0xd4, 0xc4, 0x27, 0xbf, 0x0d, 0x32, + 0x20, 0xc6, 0xb4, 0x7d, 0xe9, 0x4b, 0x8a, 0xdf, 0xf6, 0x04, 0x29, 0xbe, + 0x6f, 0xe3, 0xaf, 0x9a, 0x31, 0x23, 0xab, 0xa7, 0xb2, 0xe7, 0x37, 0xfa, + 0x33, 0xd1, 0xd7, 0x09, 0xd5, 0x39, 0xe8, 0x84, 0x86, 0xff, 0xe0, 0xc0, + 0x79, 0x1e, 0x46, 0xa0, 0x4e, 0xbe, 0x9a, 0x36, 0x24, 0x75, 0xfd, 0xe6, + 0x84, 0x2b, 0xe1, 0xd7, 0xfd, 0x36, 0xb6, 0xb8, 0xcf, 0xf8, 0x4e, 0xbe, + 0xcf, 0x62, 0xce, 0xb8, 0x54, 0x3a, 0xda, 0x73, 0x6d, 0xf9, 0x05, 0xfd, + 0xdf, 0xe7, 0x9b, 0xa8, 0x75, 0xf0, 0x8e, 0x78, 0xea, 0x84, 0xe8, 0x42, + 0x47, 0x88, 0x4a, 0x12, 0xa1, 0x74, 0xce, 0x7d, 0x27, 0xf1, 0x85, 0xfd, + 0xf2, 0x68, 0xf0, 0xed, 0x3a, 0xff, 0xf0, 0xc6, 0xde, 0x47, 0x31, 0x3b, + 0x01, 0x3a, 0xf0, 0xba, 0xce, 0xa9, 0x22, 0x4f, 0x0c, 0x51, 0x22, 0xca, + 0xb1, 0x0f, 0x86, 0x78, 0xc5, 0x9e, 0x30, 0xf1, 0xc6, 0x24, 0x37, 0x12, + 0xb4, 0x27, 0x87, 0x7c, 0xa1, 0xb0, 0x19, 0xc4, 0x5c, 0x9e, 0x79, 0x52, + 0x36, 0x16, 0xcb, 0x5d, 0xde, 0x52, 0x3a, 0x46, 0x27, 0x34, 0xb7, 0xbe, + 0x47, 0xc0, 0xb8, 0xe9, 0xfb, 0x3e, 0x1a, 0xf2, 0x9a, 0x41, 0x29, 0xd5, + 0x83, 0x08, 0x81, 0x9c, 0x22, 0xd4, 0xf9, 0xef, 0xa7, 0x69, 0xbf, 0x84, + 0xfb, 0x2a, 0x5b, 0x32, 0x83, 0xbe, 0xca, 0xb1, 0xd8, 0x8c, 0x12, 0x95, + 0x7c, 0x5c, 0xce, 0xde, 0x1c, 0x65, 0xff, 0xe5, 0x56, 0xf2, 0x57, 0x38, + 0xd7, 0x76, 0x9a, 0x26, 0xcb, 0xfc, 0xae, 0x71, 0xae, 0xed, 0x34, 0x55, + 0xb7, 0xfa, 0x52, 0xff, 0xc3, 0x12, 0x3a, 0xfb, 0x3a, 0xfe, 0x3a, 0xcc, + 0x0c, 0x3d, 0x31, 0x33, 0xbf, 0xec, 0x1c, 0x5c, 0x4b, 0xfe, 0x1d, 0x7f, + 0xb9, 0x8d, 0x80, 0x7d, 0x59, 0xd7, 0xfd, 0x1d, 0x89, 0xf9, 0x18, 0x13, + 0xa9, 0xa8, 0xa2, 0xe1, 0xbf, 0x4d, 0x2f, 0xd1, 0xc5, 0xf4, 0x27, 0x5e, + 0x0e, 0x09, 0xd7, 0x9d, 0xda, 0x68, 0xad, 0x2f, 0xca, 0x6f, 0xaf, 0xf7, + 0x3a, 0x9a, 0x7a, 0x68, 0x4f, 0x7f, 0xf9, 0x3d, 0x28, 0x6f, 0x53, 0xda, + 0x7d, 0xce, 0xae, 0x1f, 0x56, 0xd2, 0x1b, 0xff, 0xdd, 0x45, 0xc3, 0x71, + 0x78, 0x3e, 0xd9, 0x3a, 0xff, 0xf9, 0xb1, 0xcc, 0x03, 0xad, 0xe5, 0x08, + 0xd3, 0xaf, 0xff, 0xa5, 0xac, 0x18, 0x5b, 0xe7, 0xbd, 0x0b, 0x3a, 0xef, + 0x7a, 0x11, 0x30, 0xe9, 0x97, 0xff, 0xff, 0xa3, 0x6a, 0x7b, 0x58, 0xa3, + 0x7a, 0x9e, 0xc9, 0x86, 0x17, 0x3e, 0x32, 0x75, 0xfe, 0x8f, 0x3f, 0x7e, + 0x06, 0x0e, 0xbe, 0x97, 0x92, 0x73, 0xaf, 0xdf, 0x7c, 0x30, 0x03, 0xab, + 0x73, 0xca, 0xda, 0x45, 0x7f, 0x9e, 0x5e, 0x49, 0xfa, 0x87, 0x54, 0x1e, + 0xba, 0x12, 0xdf, 0xb3, 0xa9, 0x8b, 0x3a, 0xff, 0xe1, 0x74, 0x6f, 0x5f, + 0xf9, 0xf8, 0x87, 0x54, 0xe7, 0xd1, 0xd2, 0x5b, 0xfd, 0x28, 0xe4, 0xf1, + 0xc9, 0xce, 0xbe, 0x97, 0x31, 0x67, 0x5e, 0xce, 0x00, 0xeb, 0xf4, 0xd8, + 0x15, 0xb1, 0x9d, 0x7f, 0x0c, 0x33, 0xbc, 0xb4, 0x75, 0x6e, 0x89, 0x54, + 0x21, 0x98, 0x6f, 0x60, 0xae, 0xa1, 0x30, 0xac, 0x86, 0x4d, 0xff, 0xff, + 0xfd, 0x88, 0xdc, 0xf4, 0x0f, 0xb5, 0xf2, 0x10, 0x38, 0xbf, 0x9c, 0x84, + 0x93, 0xe8, 0xeb, 0xfb, 0x3c, 0xe2, 0x0f, 0xce, 0xbf, 0xbb, 0xf1, 0x27, + 0x71, 0x3a, 0xff, 0x42, 0xf4, 0x11, 0x76, 0x4e, 0xa9, 0x22, 0x33, 0x0b, + 0x04, 0xba, 0xca, 0xb0, 0x97, 0xe6, 0x22, 0x19, 0x93, 0x98, 0x04, 0x9f, + 0x21, 0xae, 0xd2, 0x44, 0x87, 0x17, 0x0b, 0x56, 0xf5, 0xd8, 0x6a, 0x3c, + 0x22, 0x06, 0x32, 0xdd, 0x13, 0xfa, 0x31, 0x3b, 0xf7, 0x1a, 0xee, 0xd3, + 0x45, 0x81, 0x7e, 0x76, 0xfd, 0xec, 0xc7, 0x59, 0x5c, 0x3d, 0xdd, 0x19, + 0xdf, 0xb8, 0xd7, 0x76, 0x9a, 0x27, 0x5b, 0xff, 0xfd, 0xd8, 0x9c, 0x38, + 0xb5, 0x75, 0xac, 0xea, 0x6b, 0xf9, 0xce, 0xbf, 0x2a, 0xb7, 0x92, 0xb8, + 0x89, 0x79, 0x8c, 0xef, 0x29, 0x0b, 0x3a, 0xf9, 0xdb, 0xf5, 0x67, 0x5e, + 0x96, 0x95, 0x50, 0xdf, 0xed, 0x1c, 0xbf, 0x71, 0xae, 0xed, 0x34, 0x5b, + 0x37, 0xf7, 0x9f, 0xbf, 0x03, 0x07, 0x5f, 0xff, 0xd2, 0x57, 0x50, 0x98, + 0x14, 0xcd, 0x67, 0x86, 0x0e, 0xa8, 0x44, 0x2b, 0x97, 0x5f, 0xf8, 0x11, + 0xa5, 0x7a, 0x8d, 0x7e, 0x1d, 0x7f, 0xd1, 0x28, 0xe4, 0xf1, 0xc9, 0xce, + 0xb2, 0xb8, 0x9a, 0x82, 0xe1, 0x70, 0xe4, 0x22, 0x7d, 0x7f, 0xe1, 0x55, + 0x7f, 0xa7, 0x85, 0xf6, 0x0e, 0xbf, 0xfb, 0xfd, 0x2b, 0x9c, 0x7d, 0x75, + 0xe4, 0x75, 0xce, 0x0c, 0x44, 0x30, 0x10, 0x6f, 0x9a, 0xee, 0xd3, 0x45, + 0xcd, 0x65, 0x9d, 0x5c, 0x37, 0xac, 0x96, 0xdf, 0xee, 0x0e, 0x6e, 0x04, + 0x91, 0xd7, 0x4c, 0xb3, 0xa8, 0xeb, 0x2b, 0x87, 0xea, 0x84, 0x4c, 0x99, + 0x6c, 0x8b, 0xdf, 0xb8, 0xd7, 0x76, 0x9a, 0x2e, 0xfb, 0xfd, 0x25, 0x75, + 0xce, 0x23, 0x27, 0x59, 0x5c, 0x3e, 0x87, 0x33, 0xbe, 0x55, 0x40, 0x80, + 0xea, 0x87, 0xd5, 0x66, 0xcb, 0xc5, 0xf8, 0x69, 0xbe, 0xea, 0xe9, 0x48, + 0x2a, 0xe4, 0x69, 0x6b, 0x85, 0xfb, 0xc2, 0x04, 0x11, 0xc3, 0x8c, 0x33, + 0x75, 0x0d, 0xff, 0x42, 0xb7, 0xe9, 0x3d, 0xff, 0x99, 0x71, 0x9f, 0x48, + 0x3b, 0xc8, 0xeb, 0xff, 0xb2, 0x7c, 0x67, 0xb9, 0xac, 0x41, 0x3a, 0xe4, + 0x57, 0xa8, 0x81, 0x13, 0xfb, 0xf6, 0xb4, 0xb7, 0x91, 0xd7, 0xff, 0xff, + 0xfe, 0xea, 0x75, 0x20, 0x7c, 0x2e, 0xa6, 0x7b, 0xff, 0x27, 0xb5, 0xd4, + 0xe4, 0x4e, 0xfc, 0x69, 0xd7, 0x6a, 0x0e, 0xbf, 0xfb, 0x76, 0xfe, 0xfb, + 0xfb, 0x30, 0x54, 0x3a, 0xf0, 0xba, 0xb0, 0x98, 0xd3, 0x49, 0xf5, 0x09, + 0x8f, 0x0a, 0xde, 0xfd, 0xd6, 0x75, 0xfb, 0x36, 0x3d, 0x0a, 0x1d, 0x6d, + 0x83, 0xaa, 0x73, 0x7b, 0x85, 0x55, 0xc3, 0xfa, 0x15, 0x9b, 0xff, 0x69, + 0xd4, 0xea, 0x40, 0xff, 0x07, 0x5f, 0xfb, 0xaf, 0xe7, 0xee, 0xf2, 0xcf, + 0x1d, 0x58, 0x7f, 0x68, 0x7b, 0x73, 0x80, 0xeb, 0xff, 0xff, 0xc2, 0xec, + 0x8e, 0x7b, 0xd9, 0x3c, 0x0b, 0xa9, 0xa5, 0xc6, 0x08, 0x4e, 0xbd, 0x9f, + 0x74, 0x75, 0x62, 0x29, 0xb8, 0x2b, 0xb0, 0xe9, 0x7f, 0xbb, 0x81, 0x4d, + 0xbc, 0xc3, 0xaf, 0x3b, 0xb4, 0xd1, 0x2b, 0xdf, 0xe5, 0x1c, 0x41, 0xec, + 0xe9, 0xd4, 0xd3, 0xd9, 0x42, 0x7b, 0xff, 0xde, 0xee, 0x49, 0xbd, 0x40, + 0xc0, 0xf8, 0xea, 0x92, 0x3d, 0x79, 0x08, 0xc1, 0x21, 0xbf, 0xff, 0xfe, + 0xe3, 0x8f, 0xd8, 0x06, 0x4b, 0xb1, 0xb4, 0x30, 0xae, 0x0f, 0xf2, 0xcd, + 0x1d, 0x74, 0xa7, 0x3a, 0xff, 0xff, 0x3e, 0xfa, 0xce, 0x7b, 0xcf, 0x3f, + 0xd5, 0x87, 0xa8, 0xa1, 0xd7, 0xf7, 0xfb, 0xfb, 0xb0, 0x03, 0xaf, 0xfc, + 0x2e, 0xc8, 0x7b, 0x13, 0xe3, 0x27, 0x5f, 0xff, 0xb1, 0x01, 0x8b, 0x4f, + 0x6a, 0x16, 0xfb, 0xf8, 0xeb, 0xfe, 0x85, 0xfb, 0x26, 0x92, 0x78, 0xea, + 0x92, 0x22, 0xfc, 0xa7, 0x7d, 0xfb, 0xf2, 0x47, 0x5f, 0xf4, 0x34, 0x62, + 0x70, 0x3f, 0x8e, 0xbf, 0xff, 0xc9, 0xe7, 0x5b, 0x88, 0x3a, 0xcb, 0x8c, + 0xed, 0x49, 0xce, 0xa0, 0xa2, 0xe5, 0x08, 0x9c, 0xde, 0xff, 0xbf, 0x02, + 0xde, 0x5a, 0xe0, 0x4e, 0xbf, 0xff, 0xd8, 0x83, 0xec, 0x1f, 0x82, 0xe1, + 0x81, 0x9e, 0x38, 0x75, 0xb3, 0xc8, 0x97, 0xda, 0x75, 0x7f, 0xdb, 0x83, + 0x39, 0x99, 0xed, 0x1d, 0x41, 0x55, 0x9b, 0x90, 0xca, 0xec, 0x37, 0x06, + 0x18, 0xbf, 0x4a, 0xaf, 0xfb, 0x37, 0xd0, 0x61, 0xc6, 0x73, 0xaf, 0xf9, + 0xe5, 0xae, 0xc7, 0x3e, 0x84, 0xea, 0xc3, 0xf2, 0xf1, 0xc5, 0xff, 0xde, + 0x4d, 0xa9, 0xe9, 0xa5, 0x03, 0xe3, 0xaf, 0xff, 0x3e, 0x4b, 0xb8, 0x83, + 0x80, 0xd9, 0xc3, 0xaf, 0x3c, 0x95, 0x86, 0x41, 0x7c, 0xa1, 0x38, 0x18, + 0x63, 0x64, 0x64, 0xfc, 0x34, 0x5b, 0xf8, 0x05, 0xc5, 0x97, 0x52, 0xbf, + 0x3d, 0x0c, 0xdf, 0xa4, 0x3b, 0x08, 0xb7, 0xff, 0xb3, 0xaa, 0x8e, 0x05, + 0x07, 0xd9, 0xd3, 0xaf, 0x7a, 0x02, 0x55, 0xff, 0xee, 0xba, 0x7a, 0x24, + 0x9c, 0x9f, 0xf0, 0x15, 0x7f, 0x9d, 0xaa, 0x87, 0x8c, 0x15, 0x60, 0xf9, + 0x74, 0x37, 0x65, 0x42, 0xcc, 0x19, 0x6c, 0x69, 0x0b, 0xa4, 0x7e, 0x7a, + 0x1b, 0x3b, 0x61, 0x59, 0x7f, 0xf9, 0x55, 0xbc, 0x95, 0xce, 0x35, 0xdd, + 0xa6, 0x89, 0x86, 0xff, 0xfe, 0xcd, 0xae, 0x1e, 0xc2, 0xbe, 0xee, 0x07, + 0xff, 0x68, 0xeb, 0xff, 0xdc, 0x70, 0x2a, 0xa7, 0xa4, 0xcc, 0x6a, 0x47, + 0x5d, 0x8a, 0x8a, 0x2a, 0xfe, 0xaf, 0x5c, 0xbd, 0xa7, 0x5f, 0xfc, 0xc0, + 0xcd, 0xe5, 0xfb, 0xf8, 0x62, 0x47, 0x5f, 0xb1, 0x7f, 0x37, 0x63, 0x3a, + 0xfe, 0x85, 0xe0, 0x23, 0x69, 0xd4, 0x13, 0xda, 0xe9, 0x6d, 0xfe, 0xe6, + 0x36, 0x01, 0xf5, 0x67, 0x5f, 0xbb, 0x01, 0x45, 0x0e, 0xa4, 0x3f, 0xde, + 0x11, 0x6c, 0x1a, 0x5f, 0xe8, 0x79, 0xfc, 0xa3, 0xf0, 0xeb, 0xf3, 0xf2, + 0x4e, 0xb3, 0xa8, 0x4f, 0x67, 0xf3, 0x3b, 0xfd, 0xa8, 0xc1, 0x0f, 0x60, + 0xeb, 0xfa, 0x30, 0x43, 0xd8, 0x3a, 0xf7, 0xfc, 0x9b, 0xe1, 0xed, 0x68, + 0xc2, 0xff, 0xf7, 0x13, 0xfc, 0x53, 0x3d, 0xfc, 0x6e, 0x13, 0xaf, 0xff, + 0xc9, 0xce, 0xbf, 0xc0, 0xe4, 0xbb, 0x1b, 0x43, 0x07, 0x5f, 0xf3, 0x3f, + 0x7b, 0x0d, 0xea, 0x4c, 0x75, 0xf7, 0xeb, 0xc0, 0x9d, 0x6c, 0xdc, 0xf7, + 0xb6, 0x0f, 0x2f, 0xe8, 0xe4, 0x4b, 0x58, 0x75, 0x35, 0x38, 0xfe, 0x1c, + 0x75, 0x30, 0x61, 0x6b, 0xe2, 0xbb, 0xf9, 0x71, 0x83, 0xed, 0x93, 0xad, + 0xa3, 0xaf, 0xd1, 0x83, 0xed, 0x93, 0xaf, 0xee, 0xa7, 0xb4, 0xfb, 0xfc, + 0x3e, 0x69, 0x8b, 0x96, 0x21, 0x7f, 0xa5, 0xe8, 0x5e, 0xd0, 0x48, 0xeb, + 0xff, 0xfc, 0xce, 0xc7, 0xb3, 0xbf, 0x07, 0x27, 0x4c, 0x1d, 0xe5, 0xa3, + 0xaf, 0xcc, 0xfb, 0x3a, 0xd3, 0xac, 0x38, 0x88, 0xe7, 0x66, 0xbf, 0xfd, + 0xe1, 0x70, 0x77, 0x10, 0x3f, 0xfb, 0x47, 0x5f, 0xf4, 0x4f, 0xf6, 0x5d, + 0xfd, 0xe7, 0x3a, 0xa1, 0x10, 0xdc, 0x49, 0xbf, 0xfb, 0x37, 0x97, 0xce, + 0xbb, 0x60, 0x42, 0x75, 0xfd, 0xb7, 0xef, 0x86, 0x00, 0x75, 0xff, 0xe8, + 0xf0, 0x22, 0x59, 0xbf, 0xa7, 0xfd, 0x93, 0xaf, 0x69, 0xc0, 0x75, 0x42, + 0x26, 0x10, 0xc3, 0xc9, 0xb7, 0xf3, 0x83, 0x9c, 0x4e, 0x1d, 0x7b, 0xdf, + 0x30, 0xea, 0x01, 0xe4, 0xfd, 0x2c, 0xbf, 0xb4, 0x8a, 0x2d, 0xfc, 0x75, + 0xff, 0xff, 0xb9, 0x9b, 0x60, 0x7d, 0xf3, 0xe8, 0xc7, 0x5d, 0x3d, 0x1e, + 0xd1, 0xd7, 0xf0, 0xe6, 0xbe, 0x35, 0x84, 0x75, 0x6e, 0x8c, 0xde, 0x16, + 0xed, 0x6e, 0xbe, 0xf9, 0xb7, 0x62, 0x73, 0xab, 0x0f, 0x75, 0x43, 0x3b, + 0x31, 0x9d, 0x77, 0xb0, 0xeb, 0xff, 0xcc, 0x11, 0x85, 0xba, 0x75, 0xfd, + 0xd8, 0x3a, 0xa0, 0xf7, 0xff, 0x15, 0xbf, 0xdd, 0x49, 0x9d, 0xba, 0x91, + 0xd7, 0xf0, 0xf9, 0xd6, 0x9e, 0x3a, 0xff, 0xc9, 0xef, 0xf8, 0xfa, 0xf8, + 0xbf, 0x1d, 0x50, 0x7d, 0x8e, 0x57, 0x7f, 0xd8, 0x98, 0xb1, 0xc9, 0xdc, + 0xeb, 0xf4, 0x7b, 0x40, 0xfc, 0xea, 0x62, 0x13, 0xb0, 0xc7, 0x26, 0x91, + 0x76, 0x13, 0xe2, 0x41, 0xe3, 0x5b, 0xff, 0xf7, 0x47, 0x3d, 0xd4, 0xcd, + 0xfd, 0x9b, 0x63, 0x47, 0x5f, 0xfc, 0xe3, 0xd8, 0x40, 0xa6, 0xb2, 0x47, + 0x5e, 0x80, 0x7d, 0x3a, 0xfe, 0xcd, 0xbd, 0x40, 0x4c, 0x75, 0x62, 0x38, + 0x5d, 0x54, 0x50, 0x34, 0x3b, 0x7b, 0xe8, 0x70, 0xeb, 0xcc, 0x1d, 0x30, + 0x8e, 0xa7, 0x3c, 0x1d, 0x0e, 0xdf, 0x7c, 0x5f, 0xc6, 0x9d, 0x7f, 0x85, + 0xd9, 0x8f, 0x64, 0xe7, 0x5f, 0xb7, 0x66, 0x6d, 0x41, 0xd6, 0x55, 0x88, + 0x66, 0x9d, 0x30, 0x86, 0x22, 0x31, 0xf0, 0xc2, 0x2b, 0x25, 0x05, 0xb6, + 0x16, 0xbb, 0xaa, 0xcd, 0x0c, 0x3e, 0x42, 0xb1, 0x64, 0x5d, 0x86, 0xe8, + 0x1d, 0xc6, 0x34, 0xed, 0x47, 0xa5, 0xe8, 0xd0, 0x7f, 0x7b, 0x64, 0x87, + 0x64, 0x9b, 0xe9, 0x95, 0xff, 0xf7, 0x13, 0x79, 0x69, 0x3d, 0xd8, 0xe7, + 0xa0, 0xeb, 0xf7, 0x1a, 0xee, 0xd3, 0x45, 0x5d, 0x7b, 0x90, 0xb3, 0xaf, + 0xf4, 0x73, 0xd0, 0x30, 0x03, 0xaf, 0xfa, 0x4a, 0xe7, 0x1a, 0xee, 0xd3, + 0x44, 0x79, 0x7f, 0xd1, 0x28, 0xe4, 0xf1, 0xc9, 0xce, 0xbf, 0xf4, 0x79, + 0x3f, 0x60, 0xe4, 0xa7, 0x98, 0xeb, 0xfe, 0xdd, 0xa9, 0xae, 0xa7, 0x90, + 0xeb, 0x2a, 0x14, 0xf1, 0xf1, 0x3f, 0x86, 0x7d, 0x1b, 0x73, 0x01, 0x45, + 0xd1, 0xcf, 0x91, 0x2f, 0xdc, 0x6b, 0xbb, 0x4d, 0x16, 0x0d, 0xe5, 0x22, + 0x73, 0xaf, 0xff, 0xe1, 0xfd, 0xe7, 0x5e, 0x6c, 0xff, 0xcc, 0xe4, 0xbe, + 0xc8, 0xeb, 0xf6, 0x0e, 0x7b, 0x47, 0x5f, 0xee, 0x3a, 0xfe, 0xf1, 0xf7, + 0x3a, 0xca, 0xe2, 0x61, 0x8a, 0x19, 0xb4, 0x75, 0xd8, 0xbe, 0x92, 0xdf, + 0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0xca, 0xbf, 0x71, 0xae, 0xed, 0x34, + 0x5a, 0x77, 0xfc, 0xe1, 0xeb, 0xcd, 0xd4, 0x59, 0xd6, 0x57, 0x0f, 0xad, + 0x66, 0x77, 0xe6, 0x1e, 0xc4, 0xd8, 0x86, 0x21, 0x8b, 0x3a, 0xff, 0x98, + 0x5d, 0x46, 0x42, 0xee, 0xd3, 0xaf, 0xcc, 0x3d, 0x81, 0xac, 0x83, 0xaf, + 0xf7, 0xd5, 0xe7, 0xb4, 0x9a, 0x3a, 0xc8, 0x75, 0x30, 0x8f, 0x0f, 0x64, + 0xd2, 0xff, 0xfe, 0x4e, 0xb8, 0xfa, 0x59, 0xcc, 0x81, 0x1c, 0xf1, 0xd7, + 0xed, 0xae, 0x1c, 0x59, 0xd7, 0xcb, 0x8d, 0xf4, 0x75, 0xff, 0xc9, 0x8e, + 0x08, 0x97, 0x23, 0x04, 0xeb, 0xe4, 0xdb, 0xdd, 0xa7, 0x54, 0x93, 0x03, + 0xc5, 0x59, 0x8a, 0x04, 0x8b, 0x47, 0xf7, 0xf9, 0x7f, 0x56, 0x05, 0xa0, + 0x0e, 0xbf, 0x7c, 0xe7, 0x3f, 0xe9, 0xd7, 0xe4, 0x52, 0x05, 0xa7, 0x56, + 0x8f, 0x47, 0xc5, 0x75, 0x08, 0xa8, 0xc8, 0x43, 0x5f, 0xff, 0x0b, 0x7a, + 0x9d, 0x4e, 0x44, 0xcc, 0xe7, 0x4e, 0xbf, 0xf2, 0xd6, 0xf2, 0xd9, 0xff, + 0xa9, 0xc3, 0xaf, 0xcf, 0xaf, 0x40, 0x4e, 0xa8, 0x3e, 0x8f, 0xd0, 0xaa, + 0x11, 0xb3, 0xd8, 0x5b, 0xdf, 0x47, 0xd8, 0xe9, 0xd7, 0xcd, 0x77, 0x69, + 0xa2, 0xdc, 0xbe, 0x9a, 0x03, 0x87, 0x5f, 0xfb, 0x39, 0x83, 0xf3, 0xb9, + 0xbb, 0x27, 0x5f, 0x84, 0x0f, 0xbe, 0x8e, 0xa8, 0x3e, 0x77, 0x40, 0xad, + 0xd1, 0xef, 0xc2, 0x27, 0x2d, 0xd4, 0x22, 0x2f, 0xf3, 0x88, 0x26, 0x18, + 0x59, 0xd7, 0x96, 0x28, 0x75, 0x84, 0xeb, 0xfe, 0xef, 0xef, 0xac, 0xc1, + 0x50, 0xeb, 0xf6, 0x9f, 0x77, 0x09, 0xd6, 0x40, 0x9e, 0xff, 0x8e, 0x2a, + 0x11, 0x5f, 0x83, 0x5d, 0x6e, 0xbf, 0xe8, 0x71, 0xee, 0x60, 0xb4, 0xeb, + 0xfd, 0xef, 0x24, 0xeb, 0x81, 0x3a, 0xa4, 0x7c, 0xd8, 0x69, 0x7f, 0xd0, + 0x3f, 0xae, 0x35, 0xe4, 0x3a, 0xf4, 0x67, 0x0e, 0xbf, 0xdd, 0x89, 0x26, + 0xce, 0x2c, 0xea, 0x09, 0xe7, 0x68, 0x6a, 0xfd, 0xf3, 0x7d, 0x22, 0x87, + 0x59, 0xe7, 0x3c, 0xdd, 0xc8, 0xaf, 0xfe, 0x96, 0x75, 0x38, 0x1e, 0xc0, + 0xb4, 0xeb, 0xfd, 0xbc, 0xa0, 0x7d, 0x80, 0x3a, 0xfb, 0x40, 0x4f, 0x1d, + 0x4e, 0x8b, 0xed, 0x14, 0xfe, 0x85, 0xf4, 0xca, 0xff, 0xef, 0x20, 0x22, + 0x41, 0xec, 0x0b, 0x4e, 0xbf, 0xbd, 0x2c, 0xe6, 0x68, 0xea, 0x3a, 0xf7, + 0xef, 0xe3, 0xae, 0xfe, 0x0e, 0xa9, 0x1b, 0x2f, 0x0e, 0x51, 0xd7, 0xdb, + 0xb5, 0x38, 0x75, 0xe8, 0x5a, 0xb8, 0x88, 0x9d, 0xcf, 0x16, 0x43, 0xe0, + 0xaa, 0x84, 0xd1, 0xb1, 0x09, 0x21, 0x6b, 0x78, 0x7d, 0xb2, 0x75, 0xef, + 0x8c, 0x5b, 0x16, 0x75, 0xff, 0x49, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0xa1, + 0xe9, 0x11, 0x17, 0x30, 0xf3, 0x94, 0x5f, 0x81, 0x0d, 0xc5, 0x9d, 0x7d, + 0x13, 0x60, 0x4e, 0xae, 0x1e, 0x3e, 0x89, 0xaf, 0xfb, 0x20, 0x3d, 0x8d, + 0x88, 0x98, 0xeb, 0xfc, 0x04, 0xef, 0x70, 0x0e, 0x75, 0x2c, 0xfa, 0xc0, + 0x75, 0x50, 0x8a, 0xf7, 0x84, 0x6d, 0xff, 0x9c, 0x30, 0x1e, 0xa0, 0xa2, + 0xce, 0xbf, 0xf6, 0xd7, 0xe6, 0x9f, 0xba, 0x89, 0xce, 0xbf, 0xda, 0xfd, + 0xb9, 0xe1, 0x83, 0xa9, 0x68, 0xad, 0xe9, 0xdf, 0x90, 0x2f, 0xfe, 0xfe, + 0x5d, 0x7e, 0x6f, 0xe8, 0x49, 0xce, 0xbf, 0xd2, 0x8e, 0x4f, 0x1c, 0x9c, + 0xeb, 0xf3, 0xeb, 0x6e, 0x68, 0xea, 0x83, 0xdc, 0x01, 0xa5, 0xf9, 0x3d, + 0xa7, 0x43, 0xaf, 0xfb, 0x80, 0xe3, 0x8f, 0xb0, 0x07, 0x50, 0x0f, 0x73, + 0xf2, 0x5b, 0xdf, 0x79, 0x23, 0xaf, 0xef, 0xbe, 0xfe, 0x32, 0x73, 0xaa, + 0x47, 0x9d, 0x30, 0xf5, 0xff, 0xcd, 0x18, 0xf0, 0xe6, 0xdc, 0xe4, 0x8e, + 0xbf, 0xef, 0xc5, 0x4f, 0xbd, 0xef, 0xfa, 0x3a, 0xff, 0x08, 0xbf, 0xbe, + 0xc3, 0x4e, 0xbe, 0x10, 0x4e, 0x03, 0xab, 0x0f, 0x51, 0x0c, 0xaf, 0xf6, + 0xbe, 0x7b, 0xe0, 0x70, 0x4e, 0xb0, 0x0e, 0xb2, 0x6e, 0x78, 0xdc, 0x36, + 0xbf, 0x3e, 0xfa, 0xf2, 0x1d, 0x50, 0x9d, 0x6e, 0x11, 0xa2, 0x1f, 0x61, + 0x24, 0x2c, 0xda, 0x28, 0xbf, 0x3f, 0xea, 0x47, 0xd3, 0xaf, 0xcc, 0x2c, + 0xe4, 0x68, 0xea, 0x98, 0xf5, 0x04, 0xaa, 0xff, 0x9f, 0x51, 0x36, 0xf2, + 0xcd, 0xa7, 0x5f, 0xff, 0x83, 0xd8, 0xfa, 0xaf, 0x85, 0xc1, 0xad, 0x40, + 0x0a, 0xb8, 0x38, 0x75, 0xfa, 0x78, 0x9d, 0xf4, 0x75, 0x62, 0x25, 0x11, + 0x5d, 0xc5, 0x6e, 0x07, 0xe7, 0x5f, 0xce, 0x09, 0x86, 0x02, 0x75, 0xff, + 0x0e, 0x4e, 0x1e, 0xe0, 0xf8, 0xea, 0x83, 0xfa, 0xe8, 0xb8, 0x96, 0x53, + 0x14, 0xd9, 0x57, 0x31, 0x68, 0x6c, 0x4c, 0xf1, 0x86, 0x73, 0x88, 0xcb, + 0x25, 0x0f, 0x20, 0xc3, 0xff, 0x23, 0x1e, 0x51, 0x09, 0xb0, 0xe0, 0xde, + 0x12, 0x88, 0x43, 0x34, 0x72, 0x1c, 0x8e, 0x15, 0x70, 0xbe, 0xec, 0x64, + 0xaf, 0x0d, 0x30, 0x18, 0x0c, 0x28, 0xb4, 0xfb, 0xe9, 0x43, 0xdf, 0xc2, + 0xb7, 0x69, 0x16, 0xcc, 0x33, 0xfe, 0xc2, 0x9e, 0xff, 0xfc, 0xd5, 0x41, + 0xcc, 0xdd, 0xbd, 0x4f, 0x69, 0xf7, 0x3a, 0x95, 0x54, 0x3b, 0xfc, 0x78, + 0xb7, 0xd1, 0xc9, 0x2c, 0xeb, 0xcf, 0xc5, 0x0e, 0xb2, 0xb3, 0x9b, 0xd6, + 0x48, 0x6f, 0xf2, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x79, 0xd4, 0x3a, 0xa3, + 0xa9, 0x38, 0x06, 0x30, 0x2c, 0xa6, 0xb5, 0x6f, 0x2c, 0x67, 0x91, 0xc1, + 0x2d, 0x4f, 0xb0, 0xaa, 0x1a, 0xd3, 0xcf, 0x4d, 0x5b, 0x4a, 0xaf, 0xf2, + 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x4b, 0x5f, 0xb8, 0xd7, 0x76, 0x9a, 0x2c, + 0x2b, 0xff, 0xf4, 0x60, 0x86, 0x3b, 0x1b, 0xfb, 0x05, 0xd6, 0x75, 0xb4, + 0x75, 0xfd, 0xff, 0x12, 0x77, 0x59, 0xd6, 0x57, 0x11, 0x84, 0xb3, 0x3d, + 0x28, 0xec, 0x88, 0x5f, 0xe5, 0x73, 0x8d, 0x77, 0x69, 0xa2, 0xcb, 0xbb, + 0x8a, 0x1d, 0x7c, 0xaa, 0x8c, 0x33, 0x14, 0x75, 0x15, 0x79, 0x5f, 0xab, + 0x3a, 0x9a, 0x7a, 0xfa, 0x2e, 0xfc, 0x2a, 0x85, 0x13, 0xda, 0x6e, 0xba, + 0x3a, 0x75, 0x80, 0x75, 0xca, 0x4e, 0x75, 0xb9, 0x23, 0x51, 0x82, 0x14, + 0xd3, 0xe3, 0x73, 0xdb, 0xfe, 0x7d, 0xc7, 0x37, 0xf4, 0x28, 0x75, 0xfe, + 0x9f, 0x7d, 0x40, 0x7c, 0x87, 0x5f, 0xa3, 0x36, 0xc6, 0x8e, 0xb4, 0x39, + 0xed, 0xb2, 0x69, 0x4e, 0x8b, 0xb1, 0x84, 0xa5, 0xf3, 0xca, 0x41, 0x3a, + 0xfe, 0x7e, 0x47, 0x9f, 0xa7, 0x5e, 0x65, 0x96, 0x4a, 0xbf, 0xe8, 0x96, + 0xfe, 0xe4, 0x66, 0xe5, 0x2a, 0x5f, 0xdf, 0xf7, 0xef, 0xbe, 0x79, 0x37, + 0x64, 0xeb, 0xa3, 0x47, 0x50, 0x53, 0x04, 0xe9, 0x08, 0xa5, 0x69, 0x27, + 0x69, 0xdd, 0xcc, 0x33, 0x14, 0x75, 0xfc, 0x8f, 0xa0, 0x6b, 0xf3, 0xaf, + 0xfe, 0x49, 0x3e, 0x9c, 0x7f, 0x6e, 0x68, 0xab, 0xff, 0xfb, 0xa9, 0xee, + 0xe6, 0x87, 0x17, 0xfe, 0xba, 0xf2, 0x3a, 0xff, 0x44, 0xbc, 0xfd, 0x70, + 0x9d, 0x50, 0x8c, 0xdc, 0x42, 0xe2, 0xd5, 0xa4, 0x75, 0xa4, 0x75, 0xa4, + 0x75, 0x41, 0xb0, 0x50, 0x41, 0x04, 0x2f, 0xef, 0xf5, 0xd7, 0x96, 0x1d, + 0x7f, 0xfd, 0xa4, 0x6e, 0x0f, 0x20, 0x70, 0x38, 0xa1, 0xd4, 0xb3, 0xf9, + 0xf1, 0x6d, 0xb7, 0x3a, 0xca, 0x1d, 0x6f, 0xce, 0xa1, 0x34, 0x5a, 0x11, + 0xac, 0x3f, 0x5d, 0x11, 0x78, 0xce, 0xed, 0x28, 0x75, 0xb0, 0xeb, 0xbf, + 0x04, 0x1a, 0x60, 0x8b, 0xdc, 0x90, 0x75, 0xfc, 0x30, 0xb1, 0x8c, 0x3a, + 0xe9, 0x41, 0xd5, 0x39, 0xff, 0x84, 0xb6, 0x61, 0x4f, 0xca, 0x6f, 0xff, + 0xff, 0xbb, 0x1e, 0xd2, 0x6b, 0x51, 0xee, 0xa4, 0x70, 0x0b, 0x79, 0x4b, + 0xca, 0x1d, 0x72, 0x6e, 0x75, 0xd0, 0xb3, 0xaf, 0xff, 0xd0, 0x3f, 0xca, + 0x51, 0xee, 0xe2, 0xfe, 0xc0, 0x0e, 0xbf, 0xfe, 0x41, 0xfe, 0x59, 0xae, + 0x42, 0x49, 0xf4, 0x55, 0x49, 0x14, 0x7e, 0x56, 0xb9, 0xaa, 0xc2, 0xff, + 0x54, 0xf0, 0x85, 0x0c, 0x37, 0x32, 0x32, 0xa5, 0x13, 0x1a, 0x41, 0xc8, + 0x7d, 0x3a, 0xf0, 0xc6, 0x37, 0xa8, 0x69, 0xf8, 0xff, 0x6b, 0xee, 0xc8, + 0xb7, 0xd8, 0x5c, 0x5f, 0xfe, 0x55, 0x6f, 0x25, 0x73, 0x8d, 0x77, 0x69, + 0xa2, 0x8c, 0xbf, 0x6d, 0x8e, 0x40, 0x0e, 0xbf, 0x0b, 0x82, 0x3e, 0x9d, + 0x7f, 0xf6, 0xed, 0x4e, 0x77, 0x30, 0x65, 0xa3, 0xac, 0xac, 0x22, 0x4b, + 0xa5, 0x1e, 0x27, 0xa9, 0x33, 0x09, 0xb9, 0x18, 0x0a, 0xd1, 0x9e, 0x91, + 0x8f, 0xa8, 0x7c, 0xfa, 0x1d, 0x37, 0xff, 0x2a, 0xf2, 0x57, 0x38, 0xd7, + 0x76, 0x9a, 0x23, 0x9b, 0xff, 0xca, 0xad, 0xe4, 0xae, 0x71, 0xae, 0xed, + 0x34, 0x4e, 0x57, 0xf9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, 0xb3, 0x2f, 0xfa, + 0x5a, 0x75, 0xab, 0xdf, 0x00, 0xeb, 0xfe, 0x61, 0xc1, 0xc5, 0xc6, 0xf0, + 0xb3, 0xaf, 0xf7, 0x23, 0xdd, 0x7d, 0xe4, 0x75, 0xff, 0xff, 0xf4, 0x4d, + 0xd8, 0xf4, 0x7d, 0x4e, 0x4d, 0x1d, 0xcd, 0xb9, 0xdc, 0x0e, 0xdc, 0x3a, + 0x80, 0x8b, 0x41, 0x33, 0xbf, 0xd9, 0xae, 0x73, 0x37, 0xd1, 0xd7, 0xec, + 0xf7, 0x31, 0x67, 0x5f, 0xf9, 0x06, 0x35, 0x1e, 0x9f, 0x19, 0x3a, 0xfe, + 0xe3, 0x7a, 0xe8, 0xc1, 0x3a, 0xed, 0xd6, 0x75, 0x95, 0x62, 0x93, 0xf1, + 0x88, 0x79, 0x48, 0x88, 0x26, 0x6b, 0x26, 0xfc, 0xf7, 0x64, 0xc2, 0xff, + 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, 0x16, 0xed, 0xfc, 0x2e, 0xaf, 0x27, 0xe9, + 0xd7, 0x93, 0x70, 0x1d, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0xa4, 0x2f, 0xfd, + 0x9d, 0x4d, 0xbd, 0xcc, 0x16, 0x9d, 0x79, 0xe4, 0xae, 0x1f, 0x86, 0x8c, + 0xec, 0xab, 0x51, 0xdb, 0xc2, 0xe5, 0xc2, 0x32, 0xff, 0xe5, 0x5e, 0x4a, + 0xe7, 0x1a, 0xee, 0xd3, 0x44, 0xa5, 0x53, 0xae, 0xa2, 0x4c, 0xa2, 0xb5, + 0x77, 0x3f, 0x04, 0xa2, 0xb1, 0x79, 0xf4, 0x65, 0x9b, 0x07, 0x97, 0xfa, + 0x48, 0x3e, 0xc4, 0x09, 0xd7, 0xb5, 0xfa, 0xce, 0xb2, 0xbb, 0x9e, 0x6a, + 0x18, 0x5e, 0x17, 0x91, 0xd7, 0xfe, 0x79, 0x2b, 0x9c, 0x6b, 0xbb, 0x4d, + 0x13, 0xb5, 0xd3, 0xb1, 0x9d, 0x7f, 0xfe, 0x40, 0xfe, 0xb8, 0xd8, 0x70, + 0x8c, 0x0e, 0x34, 0xeb, 0xfd, 0x28, 0xe4, 0xf1, 0xc9, 0xce, 0xbf, 0xf7, + 0x45, 0xe5, 0xf8, 0x16, 0xf2, 0x3a, 0xa0, 0xfc, 0xb0, 0xd2, 0xca, 0xe2, + 0x6c, 0xab, 0x1a, 0xea, 0x53, 0x8d, 0x0c, 0x31, 0xef, 0xff, 0x95, 0xfb, + 0xb2, 0xe2, 0x0c, 0xf4, 0x0a, 0x00, 0xeb, 0xff, 0x9d, 0x7d, 0xc6, 0xbf, + 0x63, 0xec, 0x8e, 0xbc, 0x81, 0x73, 0xaf, 0xfe, 0x1c, 0xeb, 0xcf, 0x9a, + 0x17, 0xdc, 0xeb, 0xb6, 0x55, 0x0a, 0x28, 0x3a, 0x89, 0xa1, 0xaa, 0x92, + 0xb1, 0x45, 0xc7, 0x1d, 0xa5, 0x4d, 0x98, 0x79, 0x5f, 0xff, 0xc1, 0x7f, + 0x2b, 0x9a, 0x81, 0xdc, 0x1a, 0xd4, 0x00, 0xeb, 0xf7, 0x1a, 0xee, 0xd3, + 0x44, 0x59, 0x7f, 0xe7, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x2e, 0xdf, + 0xff, 0xd8, 0x1e, 0xc7, 0xd5, 0x7c, 0x2e, 0x0d, 0x6a, 0x00, 0x55, 0x95, + 0xc4, 0x6c, 0xac, 0xcf, 0x65, 0x2a, 0xff, 0xe5, 0xbc, 0x95, 0xce, 0x35, + 0xdd, 0xa6, 0x89, 0x8a, 0xff, 0xfb, 0x1b, 0x0a, 0xf5, 0xd3, 0x65, 0x01, + 0x81, 0x3a, 0x95, 0x45, 0x07, 0x54, 0x2f, 0xdc, 0x6b, 0xbb, 0x4d, 0x15, + 0x4d, 0xb0, 0xea, 0xc3, 0xc2, 0x50, 0xce, 0xff, 0xdf, 0xbf, 0x24, 0x38, + 0xcb, 0x80, 0xeb, 0xff, 0x9f, 0x5c, 0x46, 0x7d, 0xd4, 0xe4, 0x8e, 0xbf, + 0xee, 0x3f, 0x77, 0x96, 0x79, 0x50, 0xa2, 0x0b, 0xa7, 0xd4, 0xaa, 0x3d, + 0xde, 0x14, 0x97, 0xff, 0x95, 0x5b, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, 0x68, + 0x9d, 0x2f, 0xf2, 0x3f, 0x22, 0x4f, 0xb4, 0xeb, 0xf4, 0xd1, 0x34, 0x68, + 0xeb, 0xf9, 0x9c, 0x4d, 0xb8, 0x27, 0x52, 0x1e, 0xae, 0x8a, 0x2f, 0x27, + 0x60, 0xe5, 0x4d, 0x0d, 0xff, 0xdf, 0xeb, 0xd1, 0xba, 0xbf, 0xcc, 0x8b, + 0x3a, 0x96, 0x7e, 0x9d, 0x2b, 0xbf, 0xf3, 0xc9, 0x5c, 0xe3, 0x5d, 0xda, + 0x68, 0x9d, 0xef, 0xde, 0xfd, 0xd6, 0x85, 0x5f, 0xf8, 0x63, 0xd9, 0xac, + 0xcd, 0xe4, 0x75, 0x05, 0x3e, 0xbc, 0x8c, 0x71, 0x64, 0x4e, 0x95, 0xe2, + 0x7b, 0xfe, 0x0c, 0x4a, 0x15, 0x67, 0x40, 0x3a, 0xfe, 0x85, 0x40, 0x38, + 0x13, 0xa9, 0x54, 0x5a, 0xe2, 0x78, 0x9d, 0x5f, 0xfe, 0x55, 0x6f, 0x25, + 0x73, 0x8d, 0x77, 0x69, 0xa2, 0x85, 0xbf, 0xff, 0xfd, 0xdf, 0xd6, 0xb7, + 0x92, 0xad, 0xef, 0xfe, 0x81, 0xc9, 0xd4, 0xfe, 0x26, 0x3a, 0xfd, 0xfe, + 0xfe, 0x46, 0x9d, 0x7e, 0xc0, 0x63, 0x89, 0xd7, 0xda, 0x46, 0x7c, 0x75, + 0xe8, 0x02, 0xb3, 0x9f, 0x78, 0x94, 0xf8, 0x92, 0x91, 0x32, 0xe1, 0x87, + 0x6d, 0xff, 0xe5, 0x56, 0xf2, 0x57, 0x38, 0xd7, 0x76, 0x9a, 0x29, 0x2b, + 0xff, 0xfd, 0x9a, 0x57, 0xee, 0x4d, 0xd7, 0x5f, 0xbb, 0x1e, 0xfd, 0x67, + 0x54, 0x32, 0x48, 0x27, 0x8c, 0xd2, 0x50, 0xd9, 0x6c, 0x6b, 0xbc, 0x28, + 0x5c, 0xaf, 0x70, 0x17, 0xfa, 0x38, 0x5f, 0xc9, 0xf6, 0x55, 0xef, 0xf2, + 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x12, 0x5f, 0xfe, 0x55, 0x6f, 0x25, 0x73, + 0x8d, 0x77, 0x69, 0xa2, 0x5e, 0xbc, 0xc5, 0x2c, 0x07, 0x5f, 0x73, 0xff, + 0x68, 0xeb, 0xf7, 0x00, 0xb4, 0xd1, 0xd7, 0xa0, 0x77, 0x3a, 0xfd, 0xef, + 0xab, 0x18, 0x3a, 0xc9, 0xd3, 0xc3, 0x11, 0xbb, 0xff, 0xdd, 0xdb, 0x02, + 0x06, 0x3c, 0x0e, 0x73, 0x73, 0xae, 0x8f, 0x1d, 0x7f, 0xfb, 0xf0, 0xa7, + 0x3e, 0xcd, 0xb1, 0xfb, 0x8c, 0xc7, 0x54, 0x91, 0xb6, 0x84, 0xc0, 0x4e, + 0xd0, 0xad, 0xfc, 0x0e, 0xc7, 0x11, 0x67, 0x5f, 0xfa, 0x6d, 0x46, 0xd7, + 0xec, 0x6f, 0x31, 0xd5, 0x07, 0xdc, 0xe5, 0x97, 0xec, 0x9f, 0x34, 0xb3, + 0xaf, 0xfe, 0x9b, 0xe7, 0xd1, 0x8d, 0xaf, 0xb6, 0x26, 0x3a, 0x8e, 0xbf, + 0x49, 0xfc, 0xfb, 0x4e, 0xbf, 0x3e, 0xa3, 0x6e, 0x1d, 0x53, 0x1e, 0x7e, + 0xd2, 0x8a, 0x84, 0x65, 0x62, 0x63, 0xac, 0xdd, 0xc8, 0x3a, 0x82, 0xad, + 0x95, 0x08, 0xe6, 0x8d, 0x17, 0x90, 0xaa, 0x12, 0x0d, 0xb0, 0xf1, 0xd8, + 0x2d, 0xbb, 0x04, 0xeb, 0xfb, 0xe6, 0xbb, 0x89, 0xe3, 0xa8, 0x27, 0x84, + 0x82, 0x97, 0x07, 0x73, 0xaf, 0xe1, 0xff, 0xd3, 0x42, 0x87, 0x5e, 0x60, + 0xa7, 0x0e, 0xb2, 0x39, 0xe7, 0x7e, 0x5f, 0x7e, 0x1c, 0x9f, 0xee, 0xd3, + 0xaf, 0xb2, 0x7f, 0xbb, 0x4e, 0xbf, 0x06, 0x37, 0x0b, 0xfc, 0x3d, 0x11, + 0x2b, 0xbf, 0xfe, 0x4e, 0x7c, 0xec, 0x27, 0xb5, 0xfb, 0x7f, 0x83, 0xaf, + 0x92, 0x70, 0x31, 0x9d, 0x7c, 0xd7, 0x76, 0x9a, 0x29, 0x7b, 0xe1, 0xf4, + 0x70, 0xeb, 0xfe, 0xce, 0x31, 0xe0, 0x73, 0x9b, 0x9d, 0x48, 0x7b, 0x7b, + 0x48, 0x2a, 0x49, 0xb1, 0x28, 0x81, 0x32, 0x97, 0x09, 0x7b, 0x08, 0x8b, + 0xf8, 0x3b, 0xc7, 0x13, 0x73, 0xaf, 0xbd, 0x3e, 0x32, 0x75, 0x21, 0xe8, + 0x89, 0x75, 0xff, 0xa0, 0x63, 0xbf, 0x3f, 0x1f, 0xda, 0x75, 0xef, 0xdf, + 0x47, 0x5f, 0x4d, 0xfb, 0xcc, 0x75, 0xfa, 0x00, 0xfb, 0xe8, 0xeb, 0xc2, + 0x80, 0x3a, 0xf6, 0x7b, 0x47, 0x54, 0x1b, 0x5d, 0x0d, 0x50, 0x51, 0xf9, + 0x32, 0x07, 0x47, 0x00, 0x49, 0xe5, 0xcb, 0xf3, 0x1b, 0x88, 0x76, 0x0e, + 0xbf, 0xe0, 0x6b, 0x91, 0xbc, 0x91, 0x67, 0x5e, 0xf3, 0xed, 0x3a, 0xfd, + 0x3f, 0xf3, 0x43, 0x19, 0xd7, 0xdf, 0xcd, 0x0c, 0x67, 0x5c, 0xf3, 0xfc, + 0x3d, 0x39, 0xcb, 0x6a, 0x11, 0xb4, 0xe7, 0x3f, 0xb8, 0x5f, 0xf2, 0x6a, + 0x64, 0x1f, 0x40, 0x0e, 0xbf, 0xf8, 0x7d, 0xb6, 0x39, 0xa7, 0x18, 0x63, + 0x3a, 0xa4, 0x8a, 0xc5, 0x97, 0xe8, 0xde, 0xff, 0x43, 0x1e, 0xa1, 0x6f, + 0xe3, 0xae, 0x71, 0x3a, 0xff, 0xa0, 0x1f, 0x3b, 0x0b, 0x71, 0x3a, 0xb7, + 0x3c, 0xcd, 0xa2, 0x95, 0x24, 0x52, 0xf2, 0x10, 0x17, 0xf4, 0x32, 0x9d, + 0xfd, 0x8c, 0xeb, 0xfb, 0x79, 0x69, 0xc7, 0x73, 0xaa, 0x15, 0x87, 0x64, + 0x76, 0x49, 0x0d, 0x5e, 0x14, 0x7d, 0x31, 0xbd, 0xc8, 0x59, 0xd7, 0xf4, + 0x0c, 0xde, 0x45, 0x0e, 0xbf, 0xe9, 0x67, 0x26, 0xc1, 0x85, 0x9d, 0x7e, + 0x04, 0x37, 0x16, 0x75, 0xfe, 0xc9, 0xf5, 0x13, 0x7f, 0xc3, 0xa9, 0x11, + 0x25, 0xc3, 0x71, 0x26, 0xba, 0x58, 0x75, 0xf7, 0x06, 0x16, 0x75, 0xe8, + 0x06, 0x8e, 0xa8, 0x3f, 0xe0, 0x97, 0x60, 0xab, 0x24, 0x17, 0xee, 0xfe, + 0xa6, 0x09, 0xd7, 0xfd, 0x1d, 0xd3, 0xfa, 0x39, 0xb0, 0x75, 0xff, 0x96, + 0xe1, 0xfb, 0x34, 0xa0, 0x77, 0x3a, 0x82, 0x7f, 0x68, 0x75, 0x7d, 0xc0, + 0x7d, 0xda, 0x75, 0xe4, 0x67, 0xc7, 0x57, 0x4f, 0x0b, 0x44, 0xd4, 0x14, + 0xca, 0x3b, 0x0a, 0x3f, 0x31, 0xdf, 0xe1, 0xf6, 0x69, 0x1f, 0xa7, 0x5f, + 0xf0, 0x13, 0xb9, 0xc7, 0x9b, 0x47, 0x5f, 0xff, 0xa2, 0x43, 0x13, 0xfd, + 0x9b, 0x5d, 0xcd, 0x8e, 0x00, 0xeb, 0xfb, 0xe2, 0xf3, 0xcf, 0xe3, 0xac, + 0xd3, 0xae, 0xdf, 0x58, 0x6f, 0x9c, 0xba, 0xf4, 0x20, 0x4e, 0xa8, 0x4d, + 0x1f, 0x73, 0x05, 0x9c, 0x3c, 0x26, 0x74, 0x59, 0x7f, 0xb1, 0x99, 0x26, + 0xbf, 0x59, 0xd7, 0x6d, 0xd1, 0xd7, 0xf7, 0xfa, 0x89, 0xbf, 0xe1, 0xd7, + 0xec, 0x9f, 0x3b, 0xa3, 0xaa, 0x0f, 0xbf, 0xa3, 0x02, 0x61, 0x7b, 0x39, + 0xa3, 0xa9, 0xa7, 0x91, 0xb4, 0xb6, 0xff, 0x81, 0x00, 0xfb, 0xb6, 0x07, + 0x60, 0xea, 0x84, 0xd3, 0x72, 0x1d, 0x68, 0x49, 0x7f, 0xff, 0xf7, 0x63, + 0x9b, 0xb5, 0x37, 0xf8, 0xa3, 0xfc, 0xd7, 0x5d, 0xb0, 0x21, 0x3a, 0xf9, + 0x14, 0xd9, 0xc3, 0xaf, 0xef, 0xbe, 0x89, 0xc7, 0x73, 0xaf, 0x0a, 0x2c, + 0xea, 0xe1, 0xf7, 0x00, 0x93, 0xc6, 0x17, 0xf8, 0x61, 0xc7, 0xd8, 0x27, + 0x5f, 0xee, 0xbc, 0xc9, 0xc8, 0x9c, 0xeb, 0xb1, 0x67, 0x50, 0x53, 0x8a, + 0xc8, 0x72, 0xac, 0xbd, 0xcb, 0xb6, 0x99, 0xdf, 0xb6, 0x11, 0x71, 0xa3, + 0xaf, 0xcf, 0xb7, 0x39, 0xa3, 0xa8, 0x27, 0xa2, 0xb2, 0x9b, 0xf7, 0x5c, + 0x51, 0x67, 0x5f, 0x29, 0x36, 0xa0, 0xeb, 0xf8, 0x1b, 0x83, 0x39, 0x87, + 0x5f, 0xce, 0x05, 0xc6, 0x78, 0xea, 0x83, 0xd8, 0x42, 0xdb, 0xfc, 0xe0, + 0xd4, 0x76, 0x34, 0x75, 0xe1, 0xc9, 0xce, 0xa8, 0x4c, 0xbb, 0x08, 0x90, + 0x97, 0xaf, 0x62, 0x41, 0xa3, 0x1b, 0x80, 0xd3, 0xad, 0xa3, 0xae, 0x45, + 0x34, 0x69, 0xbf, 0x16, 0xbc, 0x07, 0x69, 0xd7, 0xcc, 0xcd, 0xa8, 0x3a, + 0xfe, 0xd0, 0xbc, 0xf1, 0xe3, 0xaf, 0xd3, 0xbe, 0xb2, 0x47, 0x5f, 0xff, + 0x07, 0x36, 0xbf, 0x26, 0xfb, 0x27, 0xf3, 0xac, 0xea, 0x83, 0xfa, 0x42, + 0x7b, 0xf9, 0xf7, 0x02, 0xd3, 0x47, 0x54, 0x26, 0x63, 0xb8, 0xdc, 0xc4, + 0x7c, 0x85, 0x37, 0x48, 0x2f, 0xf7, 0x91, 0x97, 0x9a, 0x16, 0x75, 0x95, + 0x62, 0xdb, 0x7c, 0xd8, 0x97, 0x0d, 0x3c, 0x2f, 0x24, 0x42, 0x16, 0x5c, + 0x8f, 0x6b, 0x78, 0x51, 0xa4, 0x63, 0x93, 0x4b, 0x59, 0xe2, 0xb2, 0xc6, + 0xfb, 0x19, 0xeb, 0xc6, 0xc6, 0x08, 0xdf, 0x46, 0x39, 0xcd, 0x47, 0x7b, + 0xe8, 0xf3, 0xf6, 0x5e, 0xbe, 0xc6, 0xbf, 0xb0, 0xa3, 0x7f, 0x95, 0xce, + 0x35, 0xdd, 0xa6, 0x8a, 0x72, 0xff, 0x2e, 0x17, 0x9b, 0x11, 0xe3, 0xaf, + 0xfc, 0x9c, 0x7d, 0x77, 0x30, 0x5a, 0x75, 0xf9, 0x7c, 0xe6, 0x68, 0xeb, + 0xff, 0xf7, 0x7f, 0xf7, 0x23, 0xda, 0xc6, 0xea, 0x38, 0xd3, 0xaf, 0xff, + 0xef, 0x64, 0xc2, 0x9a, 0xf4, 0x7d, 0x4e, 0x4d, 0x1d, 0x3a, 0xff, 0x22, + 0xc3, 0x1a, 0xfc, 0x4e, 0xbf, 0xb3, 0xdb, 0xca, 0x19, 0x3a, 0xff, 0xc9, + 0xbe, 0x87, 0x03, 0xd7, 0x64, 0xeb, 0xff, 0xec, 0x9f, 0x37, 0xf6, 0x90, + 0x60, 0x0e, 0xb3, 0xa9, 0x44, 0x46, 0x68, 0xfa, 0xff, 0xd9, 0xd8, 0xe6, + 0x2a, 0xcb, 0x2c, 0x95, 0x72, 0x32, 0x75, 0xd3, 0xab, 0x0a, 0xab, 0xc2, + 0x69, 0x87, 0x6d, 0x27, 0x45, 0x6e, 0xae, 0x09, 0x97, 0xa1, 0x75, 0xb2, + 0x49, 0xb0, 0x83, 0x7e, 0xe3, 0x5d, 0xda, 0x68, 0xaf, 0x2f, 0xff, 0xec, + 0x0f, 0x63, 0xea, 0xbe, 0x17, 0x06, 0xb5, 0x00, 0x2a, 0xca, 0xe2, 0x23, + 0xf6, 0x4c, 0xef, 0xfe, 0x55, 0xe4, 0xae, 0x71, 0xae, 0xed, 0x34, 0x48, + 0xf7, 0x9b, 0x8b, 0x3a, 0xf2, 0x02, 0x0e, 0xbc, 0xdc, 0x59, 0x4a, 0x97, + 0x57, 0xee, 0x35, 0xdd, 0xa6, 0x89, 0x22, 0xff, 0xfe, 0x84, 0xe2, 0x6c, + 0x40, 0xcf, 0x1e, 0x4e, 0xbc, 0xe7, 0x5f, 0xfe, 0x1c, 0x06, 0xce, 0x72, + 0x27, 0x7e, 0x34, 0xeb, 0xa4, 0xac, 0x26, 0x09, 0x85, 0x7d, 0x33, 0xf2, + 0xdd, 0xfb, 0x3a, 0xae, 0x2c, 0xeb, 0x2b, 0x09, 0xd4, 0xbc, 0x67, 0x3e, + 0x49, 0xbf, 0xf9, 0x57, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, 0xd1, 0x25, 0x5f, + 0xb8, 0xd7, 0x76, 0x9a, 0x2f, 0x1b, 0xfe, 0x92, 0xb9, 0xc6, 0xbb, 0xb4, + 0xd1, 0x26, 0xd9, 0x5c, 0x3f, 0x87, 0x33, 0xb9, 0x9e, 0x9d, 0x7e, 0x40, + 0x6b, 0x04, 0xeb, 0xff, 0xef, 0xdf, 0x7c, 0xc5, 0x14, 0x79, 0x66, 0xfe, + 0x3a, 0xa4, 0x7e, 0xfa, 0x25, 0xbf, 0xf9, 0xc0, 0xde, 0xa7, 0x05, 0x3d, + 0xa3, 0xae, 0x19, 0xce, 0xa7, 0x3d, 0x8f, 0xa8, 0x57, 0x73, 0xc7, 0x5e, + 0x98, 0x67, 0x3a, 0xff, 0x63, 0x43, 0xfc, 0xff, 0x56, 0x75, 0x84, 0xeb, + 0xbe, 0xfd, 0x3a, 0x80, 0x6a, 0x7e, 0x87, 0xdd, 0xb2, 0xac, 0x27, 0xc3, + 0x90, 0x8e, 0xeb, 0xd3, 0x91, 0xe8, 0x5b, 0xc3, 0xbf, 0x58, 0x2a, 0x1d, + 0x1d, 0x04, 0xe7, 0xf2, 0xae, 0x09, 0x03, 0x1b, 0x92, 0x4a, 0xee, 0x9a, + 0x33, 0x15, 0x96, 0x76, 0x3f, 0xaf, 0x1e, 0x7f, 0x0c, 0x9f, 0xb2, 0x82, + 0x2a, 0x27, 0x25, 0xae, 0xe7, 0x95, 0x33, 0x29, 0xe0, 0x40, 0xce, 0xe4, + 0x66, 0x27, 0x9d, 0xd4, 0x9c, 0xce, 0x6d, 0xf0, 0x2e, 0xef, 0x5a, 0x8c, + 0x25, 0x28, 0x75, 0x8e, 0x51, 0x64, 0xd6, 0xe0, 0xc3, 0x96, 0xa0, 0xb9, + 0x79, 0xd2, 0xc8, 0x76, 0x97, 0x20, 0xf6, 0xe6, 0x10, 0x14, 0x85, 0x36, + 0x0c, 0x7d, 0xc3, 0x5b, 0xea, 0x6a, 0xb9, 0xaa, 0xf5, 0xef, 0xda, 0x7f, + 0x6d, 0xf1, 0x76, 0xd3, 0x3b, 0xd9, 0x9d, 0xb7, 0xd9, 0x97, 0xcb, 0xf6, + 0x92, 0xdb, 0xb1, 0x69, 0x14, 0x68, }; -static const unsigned kPreloadedHSTSBits = 293963; +static const unsigned kPreloadedHSTSBits = 306285; -static const unsigned kHSTSRootPosition = 293347; +static const unsigned kHSTSRootPosition = 305669; #endif // NET_HTTP_TRANSPORT_SECURITY_STATE_STATIC_H_
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index 91edc1f3..f214421 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -4272,7 +4272,195 @@ { "name": "xss.sk", "include_subdomains": true, "mode": "force-https" }, { "name": "yingyj.com", "include_subdomains": true, "mode": "force-https" }, { "name": "zgrep.org", "include_subdomains": true, "mode": "force-https" }, - { "name": "zortium.report", "include_subdomains": true, "mode": "force-https" } + { "name": "zortium.report", "include_subdomains": true, "mode": "force-https" }, + { "name": "0x90.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "alexwardweb.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "another.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "atolm.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "avastantivirus.ro", "include_subdomains": true, "mode": "force-https" }, + { "name": "beeksnetwork.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "bergstoneware.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "berst.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "bigbluedoor.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "binaryevolved.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "bitcoinhk.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "blackdragoninc.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "bockenauer.at", "include_subdomains": true, "mode": "force-https" }, + { "name": "brainster.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "c16t.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "cabarave.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "cannyfoxx.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "cattivo.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "clmde.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "codeux.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "constructionjobs.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "conversiones.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "converter.ml", "include_subdomains": true, "mode": "force-https" }, + { "name": "couragewhispers.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "dale-electric.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "danpiel.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "darioturchetti.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "datasharesystem.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "david.kitchen", "include_subdomains": true, "mode": "force-https" }, + { "name": "dden.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "deviltraxxx.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "diversityflags.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dnscrypt.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "docloh.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "dolphincorp.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "domodedovo.travel", "include_subdomains": true, "mode": "force-https" }, + { "name": "doyoucheck.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "dziekonski.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "easyhaul.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "easykonto.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "edpubs.gov", "include_subdomains": true, "mode": "force-https" }, + { "name": "eeqj.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "elitefishtank.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "endofnet.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "englerts.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "eugenekay.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "evasovova.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "eyasc.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "eydesignguidelines.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fedrtc.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "fiilr.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "frillip.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "fsapubs.gov", "include_subdomains": true, "mode": "force-https" }, + { "name": "gfwsb.ml", "include_subdomains": true, "mode": "force-https" }, + { "name": "giftservices.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "goabonga.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "grace-wan.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "greenteamtwente.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "gregmilton.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "hackcraft.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "helix.am", "include_subdomains": true, "mode": "force-https" }, + { "name": "herpaderp.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "hlavacek.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "hobby-gamerz-community.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "hochhaus.us", "include_subdomains": true, "mode": "force-https" }, + { "name": "holisticon.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "hopewellproperties.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "hostinghelp.guru", "include_subdomains": true, "mode": "force-https" }, + { "name": "ikk.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "indybay.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "itinsight.hu", "include_subdomains": true, "mode": "force-https" }, + { "name": "jacobhaug.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jaroslavtrsek.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "jav-collective.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "jlkhosting.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "juniwalk.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "kiebel.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "kimmel.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "kynaston.org.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "larrysalibra.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lateralsecurity.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "lemp.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "letras.mus.br", "include_subdomains": true, "mode": "force-https" }, + { "name": "librelamp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "libsodium.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "linux.cn", "include_subdomains": true, "mode": "force-https" }, + { "name": "livedemo.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "lukasberan.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "lukasunger.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "macker.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "maco.org.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "makowitz.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "melcher.it", "include_subdomains": true, "mode": "force-https" }, + { "name": "mercamaris.es", "include_subdomains": true, "mode": "force-https" }, + { "name": "micro-rain-systems.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mlpepilepsy.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "mnetworkingsolutions.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "mortgagecentersmo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mrs-shop.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "muguayuan.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "musthavesforreal.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mybudget.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "myg21.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nagoya-kyuyo.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "nametiles.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "neosolution.ca", "include_subdomains": true, "mode": "force-https" }, + { "name": "netbrief.ml", "include_subdomains": true, "mode": "force-https" }, + { "name": "nevadafiber.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "noima.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "noisetrap.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "onespiritinc.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "orderswift.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "otoy.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "override.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "pacoda.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "paratlan.hu", "include_subdomains": true, "mode": "force-https" }, + { "name": "pcloud.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "peytonfarrar.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "phpdorset.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "pimpmymac.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "pirateproxy.la", "include_subdomains": true, "mode": "force-https" }, + { "name": "pirateproxy.pl", "include_subdomains": true, "mode": "force-https" }, + { "name": "piwko.co", "include_subdomains": true, "mode": "force-https" }, + { "name": "pjuu.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "polis.to", "include_subdomains": true, "mode": "force-https" }, + { "name": "poon.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "poon.tech", "include_subdomains": true, "mode": "force-https" }, + { "name": "pr1sm.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "premierheart.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "pressrush.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "proxybay.la", "include_subdomains": true, "mode": "force-https" }, + { "name": "ptm.ro", "include_subdomains": true, "mode": "force-https" }, + { "name": "qlrace.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "qualityedgarsolutions.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ramon-c.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "realmofespionage.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ringh.am", "include_subdomains": true, "mode": "force-https" }, + { "name": "rmb.li", "include_subdomains": true, "mode": "force-https" }, + { "name": "rngmeme.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "roeckx.be", "include_subdomains": true, "mode": "force-https" }, + { "name": "roeitijd.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "roombase.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "ruxit.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ryanteck.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "safar.sk", "include_subdomains": true, "mode": "force-https" }, + { "name": "samegoal.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "samegoal.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "schwinabart.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "selfici.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "shiroki-k.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "skipfault.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "spdf.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "ss.lv", "include_subdomains": true, "mode": "force-https" }, + { "name": "stirlingpoon.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "stirlingpoon.xyz", "include_subdomains": true, "mode": "force-https" }, + { "name": "stomt.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "talado.gr", "include_subdomains": true, "mode": "force-https" }, + { "name": "taskulu.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tazemama.biz", "include_subdomains": true, "mode": "force-https" }, + { "name": "the-paddies.de", "include_subdomains": true, "mode": "force-https" }, + { "name": "thepartywarehouse.co.uk", "include_subdomains": true, "mode": "force-https" }, + { "name": "thorbis.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "tidycustoms.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "tiens-ib.cz", "include_subdomains": true, "mode": "force-https" }, + { "name": "tucny.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ukas.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "ultros.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "unpr.dk", "include_subdomains": true, "mode": "force-https" }, + { "name": "utdsgda.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "valordolarblue.com.ar", "include_subdomains": true, "mode": "force-https" }, + { "name": "vanlaanen.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "verizonguidelines.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "vieclam24h.vn", "include_subdomains": true, "mode": "force-https" }, + { "name": "vm0.eu", "include_subdomains": true, "mode": "force-https" }, + { "name": "vnvisa.ru", "include_subdomains": true, "mode": "force-https" }, + { "name": "watersb.org", "include_subdomains": true, "mode": "force-https" }, + { "name": "watertrails.io", "include_subdomains": true, "mode": "force-https" }, + { "name": "westerhoud.nl", "include_subdomains": true, "mode": "force-https" }, + { "name": "whatsapp.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "whey-protein.ch", "include_subdomains": true, "mode": "force-https" }, + { "name": "wiire.me", "include_subdomains": true, "mode": "force-https" }, + { "name": "williamfeely.info", "include_subdomains": true, "mode": "force-https" }, + { "name": "workray.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "yobst.tk", "include_subdomains": true, "mode": "force-https" }, + { "name": "yombo.net", "include_subdomains": true, "mode": "force-https" }, + { "name": "zking.ga", "include_subdomains": true, "mode": "force-https" }, + { "name": "secure.advancepayroll.com.au", "include_subdomains": true, "mode": "force-https" }, + { "name": "www.captaintrain.com", "mode": "force-https" } ], // |ReportUMAOnPinFailure| uses these to report which domain was associated
diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc index c753507..c0ae180 100644 --- a/net/url_request/url_request_context_builder.cc +++ b/net/url_request/url_request_context_builder.cc
@@ -389,6 +389,14 @@ http_network_session_params_.trusted_spdy_proxy; network_session_params.next_protos = http_network_session_params_.next_protos; network_session_params.enable_quic = http_network_session_params_.enable_quic; + network_session_params.quic_store_server_configs_in_properties = + http_network_session_params_.quic_store_server_configs_in_properties; + network_session_params.quic_delay_tcp_race = + http_network_session_params_.quic_delay_tcp_race; + network_session_params.quic_max_number_of_lossy_connections = + http_network_session_params_.quic_max_number_of_lossy_connections; + network_session_params.quic_packet_loss_threshold = + http_network_session_params_.quic_packet_loss_threshold; network_session_params.quic_connection_options = http_network_session_params_.quic_connection_options;
diff --git a/net/url_request/url_request_context_builder.h b/net/url_request/url_request_context_builder.h index 260eccb7..81962e1 100644 --- a/net/url_request/url_request_context_builder.h +++ b/net/url_request/url_request_context_builder.h
@@ -87,6 +87,10 @@ std::string trusted_spdy_proxy; bool use_alternative_services; bool enable_quic; + bool quic_store_server_configs_in_properties; + bool quic_delay_tcp_race; + int quic_max_number_of_lossy_connections; + float quic_packet_loss_threshold; QuicTagVector quic_connection_options; }; @@ -192,6 +196,27 @@ quic_connection_options; } + void set_quic_store_server_configs_in_properties( + bool quic_store_server_configs_in_properties) { + http_network_session_params_.quic_store_server_configs_in_properties = + quic_store_server_configs_in_properties; + } + + void set_quic_delay_tcp_race(bool quic_delay_tcp_race) { + http_network_session_params_.quic_delay_tcp_race = quic_delay_tcp_race; + } + + void set_quic_max_number_of_lossy_connections( + int quic_max_number_of_lossy_connections) { + http_network_session_params_.quic_max_number_of_lossy_connections = + quic_max_number_of_lossy_connections; + } + + void set_quic_packet_loss_threshold(float quic_packet_loss_threshold) { + http_network_session_params_.quic_packet_loss_threshold = + quic_packet_loss_threshold; + } + void set_throttling_enabled(bool throttling_enabled) { throttling_enabled_ = throttling_enabled; }
diff --git a/ppapi/ppapi_sources.gypi b/ppapi/ppapi_sources.gypi index 2f63f6c..5f5d8ba 100644 --- a/ppapi/ppapi_sources.gypi +++ b/ppapi/ppapi_sources.gypi
@@ -393,6 +393,8 @@ 'tests/test_audio.h', 'tests/test_audio_config.cc', 'tests/test_audio_config.h', + 'tests/test_audio_encoder.cc', + 'tests/test_audio_encoder.h', 'tests/test_case.cc', 'tests/test_case.h', 'tests/test_compositor.cc',
diff --git a/ppapi/proxy/audio_encoder_resource.cc b/ppapi/proxy/audio_encoder_resource.cc index d1576fb6..233af5a 100644 --- a/ppapi/proxy/audio_encoder_resource.cc +++ b/ppapi/proxy/audio_encoder_resource.cc
@@ -2,14 +2,39 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/memory/shared_memory.h" +#include "ppapi/c/pp_array_output.h" +#include "ppapi/c/pp_codecs.h" +#include "ppapi/proxy/audio_buffer_resource.h" #include "ppapi/proxy/audio_encoder_resource.h" +#include "ppapi/proxy/ppapi_messages.h" +#include "ppapi/shared_impl/array_writer.h" +#include "ppapi/shared_impl/media_stream_buffer.h" +#include "ppapi/thunk/enter.h" namespace ppapi { namespace proxy { +namespace { + +void RunCallback(scoped_refptr<TrackedCallback>* callback, int32_t error) { + if (TrackedCallback::IsPending(*callback)) { + scoped_refptr<TrackedCallback> temp; + callback->swap(temp); + temp->Run(error); + } +} + +} // namespace + AudioEncoderResource::AudioEncoderResource(Connection connection, PP_Instance instance) - : PluginResource(connection, instance) { + : PluginResource(connection, instance), + encoder_last_error_(PP_ERROR_FAILED), + initialized_(false), + audio_buffer_manager_(this), + bitstream_buffer_manager_(this) { + SendCreate(RENDERER, PpapiHostMsg_AudioEncoder_Create()); } AudioEncoderResource::~AudioEncoderResource() { @@ -22,7 +47,15 @@ int32_t AudioEncoderResource::GetSupportedProfiles( const PP_ArrayOutput& output, const scoped_refptr<TrackedCallback>& callback) { - return PP_ERROR_NOTSUPPORTED; + if (TrackedCallback::IsPending(get_supported_profiles_callback_)) + return PP_ERROR_INPROGRESS; + + get_supported_profiles_callback_ = callback; + Call<PpapiPluginMsg_AudioEncoder_GetSupportedProfilesReply>( + RENDERER, PpapiHostMsg_AudioEncoder_GetSupportedProfiles(), + base::Bind(&AudioEncoderResource::OnPluginMsgGetSupportedProfilesReply, + this, output)); + return PP_OK_COMPLETIONPENDING; } int32_t AudioEncoderResource::Initialize( @@ -33,39 +66,292 @@ uint32_t initial_bitrate, PP_HardwareAcceleration acceleration, const scoped_refptr<TrackedCallback>& callback) { - return PP_ERROR_NOTSUPPORTED; + if (initialized_) + return PP_ERROR_FAILED; + if (TrackedCallback::IsPending(initialize_callback_)) + return PP_ERROR_INPROGRESS; + + initialize_callback_ = callback; + + PPB_AudioEncodeParameters parameters; + parameters.channels = channels; + parameters.input_sample_rate = input_sample_rate; + parameters.input_sample_size = input_sample_size; + parameters.output_profile = output_profile; + parameters.initial_bitrate = initial_bitrate; + parameters.acceleration = acceleration; + + Call<PpapiPluginMsg_AudioEncoder_InitializeReply>( + RENDERER, PpapiHostMsg_AudioEncoder_Initialize(parameters), + base::Bind(&AudioEncoderResource::OnPluginMsgInitializeReply, this)); + return PP_OK_COMPLETIONPENDING; } int32_t AudioEncoderResource::GetNumberOfSamples() { - return PP_ERROR_NOTSUPPORTED; + if (encoder_last_error_) + return encoder_last_error_; + return number_of_samples_; } int32_t AudioEncoderResource::GetBuffer( PP_Resource* audio_buffer, const scoped_refptr<TrackedCallback>& callback) { - return PP_ERROR_NOTSUPPORTED; + if (encoder_last_error_) + return encoder_last_error_; + if (TrackedCallback::IsPending(get_buffer_callback_)) + return PP_ERROR_INPROGRESS; + + get_buffer_data_ = audio_buffer; + get_buffer_callback_ = callback; + + TryGetAudioBuffer(); + + return PP_OK_COMPLETIONPENDING; } int32_t AudioEncoderResource::Encode( PP_Resource audio_buffer, const scoped_refptr<TrackedCallback>& callback) { - return PP_ERROR_NOTSUPPORTED; + if (encoder_last_error_) + return encoder_last_error_; + + AudioBufferMap::iterator it = audio_buffers_.find(audio_buffer); + if (it == audio_buffers_.end()) + // TODO(llandwerlin): accept MediaStreamAudioTrack's audio buffers. + return PP_ERROR_BADRESOURCE; + + scoped_refptr<AudioBufferResource> buffer_resource = it->second; + + encode_callbacks_.insert( + std::make_pair(buffer_resource->GetBufferIndex(), callback)); + + Post(RENDERER, + PpapiHostMsg_AudioEncoder_Encode(buffer_resource->GetBufferIndex())); + + // Invalidate the buffer to prevent a CHECK failure when the + // AudioBufferResource is destructed. + buffer_resource->Invalidate(); + audio_buffers_.erase(it); + + return PP_OK_COMPLETIONPENDING; } int32_t AudioEncoderResource::GetBitstreamBuffer( PP_AudioBitstreamBuffer* bitstream_buffer, const scoped_refptr<TrackedCallback>& callback) { - return PP_ERROR_NOTSUPPORTED; + if (encoder_last_error_) + return encoder_last_error_; + if (TrackedCallback::IsPending(get_bitstream_buffer_callback_)) + return PP_ERROR_INPROGRESS; + + get_bitstream_buffer_callback_ = callback; + get_bitstream_buffer_data_ = bitstream_buffer; + + TryWriteBitstreamBuffer(); + + return PP_OK_COMPLETIONPENDING; } void AudioEncoderResource::RecycleBitstreamBuffer( const PP_AudioBitstreamBuffer* bitstream_buffer) { + if (encoder_last_error_) + return; + + BufferMap::const_iterator it = + bitstream_buffer_map_.find(bitstream_buffer->buffer); + if (it != bitstream_buffer_map_.end()) + Post(RENDERER, + PpapiHostMsg_AudioEncoder_RecycleBitstreamBuffer(it->second)); } void AudioEncoderResource::RequestBitrateChange(uint32_t bitrate) { + if (encoder_last_error_) + return; + Post(RENDERER, PpapiHostMsg_AudioEncoder_RequestBitrateChange(bitrate)); } void AudioEncoderResource::Close() { + if (encoder_last_error_) + return; + Post(RENDERER, PpapiHostMsg_AudioEncoder_Close()); + if (!encoder_last_error_ || !initialized_) + NotifyError(PP_ERROR_ABORTED); + ReleaseBuffers(); +} + +void AudioEncoderResource::OnReplyReceived( + const ResourceMessageReplyParams& params, + const IPC::Message& msg) { + PPAPI_BEGIN_MESSAGE_MAP(AudioEncoderResource, msg) + PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( + PpapiPluginMsg_AudioEncoder_BitstreamBufferReady, + OnPluginMsgBitstreamBufferReady) + PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(PpapiPluginMsg_AudioEncoder_EncodeReply, + OnPluginMsgEncodeReply) + PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL(PpapiPluginMsg_AudioEncoder_NotifyError, + OnPluginMsgNotifyError) + PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL_UNHANDLED( + PluginResource::OnReplyReceived(params, msg)) + PPAPI_END_MESSAGE_MAP() +} + +void AudioEncoderResource::OnPluginMsgGetSupportedProfilesReply( + const PP_ArrayOutput& output, + const ResourceMessageReplyParams& params, + const std::vector<PP_AudioProfileDescription>& profiles) { + ArrayWriter writer(output); + if (params.result() != PP_OK || !writer.is_valid() || + !writer.StoreVector(profiles)) { + RunCallback(&get_supported_profiles_callback_, PP_ERROR_FAILED); + return; + } + + RunCallback(&get_supported_profiles_callback_, + base::checked_cast<int32_t>(profiles.size())); +} + +void AudioEncoderResource::OnPluginMsgInitializeReply( + const ResourceMessageReplyParams& params, + int32_t number_of_samples, + int32_t audio_buffer_count, + int32_t audio_buffer_size, + int32_t bitstream_buffer_count, + int32_t bitstream_buffer_size) { + DCHECK(!initialized_); + + int32_t error = params.result(); + if (error) { + RunCallback(&initialize_callback_, error); + return; + } + + // Get audio buffers shared memory buffer. + base::SharedMemoryHandle buffer_handle; + if (!params.TakeSharedMemoryHandleAtIndex(0, &buffer_handle) || + !audio_buffer_manager_.SetBuffers( + audio_buffer_count, audio_buffer_size, + make_scoped_ptr(new base::SharedMemory(buffer_handle, false)), + true)) { + RunCallback(&initialize_callback_, PP_ERROR_NOMEMORY); + return; + } + + // Get bitstream buffers shared memory buffer. + if (!params.TakeSharedMemoryHandleAtIndex(1, &buffer_handle) || + !bitstream_buffer_manager_.SetBuffers( + bitstream_buffer_count, bitstream_buffer_size, + make_scoped_ptr(new base::SharedMemory(buffer_handle, false)), + false)) { + RunCallback(&initialize_callback_, PP_ERROR_NOMEMORY); + return; + } + + for (int32_t i = 0; i < bitstream_buffer_manager_.number_of_buffers(); i++) + bitstream_buffer_map_.insert(std::make_pair( + bitstream_buffer_manager_.GetBufferPointer(i)->bitstream.data, i)); + + encoder_last_error_ = PP_OK; + number_of_samples_ = number_of_samples; + initialized_ = true; + + RunCallback(&initialize_callback_, PP_OK); +} + +void AudioEncoderResource::OnPluginMsgEncodeReply( + const ResourceMessageReplyParams& params, + int32_t buffer_id) { + // We need to ensure there are still callbacks to be called before + // processing this message. We might receive an EncodeReply message after + // having sent a Close message to the renderer. In this case, we don't + // have any callback left to call. + if (encode_callbacks_.empty()) + return; + + EncodeMap::iterator it = encode_callbacks_.find(buffer_id); + DCHECK(encode_callbacks_.end() != it); + + scoped_refptr<TrackedCallback> callback = it->second; + encode_callbacks_.erase(it); + RunCallback(&callback, encoder_last_error_); + + audio_buffer_manager_.EnqueueBuffer(buffer_id); + // If the plugin is waiting for an audio buffer, we can give the one + // that just became available again. + if (TrackedCallback::IsPending(get_buffer_callback_)) + TryGetAudioBuffer(); +} + +void AudioEncoderResource::OnPluginMsgBitstreamBufferReady( + const ResourceMessageReplyParams& params, + int32_t buffer_id) { + bitstream_buffer_manager_.EnqueueBuffer(buffer_id); + + if (TrackedCallback::IsPending(get_bitstream_buffer_callback_)) + TryWriteBitstreamBuffer(); +} + +void AudioEncoderResource::OnPluginMsgNotifyError( + const ResourceMessageReplyParams& params, + int32_t error) { + NotifyError(error); +} + +void AudioEncoderResource::NotifyError(int32_t error) { + DCHECK(error); + + encoder_last_error_ = error; + RunCallback(&get_supported_profiles_callback_, error); + RunCallback(&initialize_callback_, error); + RunCallback(&get_buffer_callback_, error); + get_buffer_data_ = nullptr; + RunCallback(&get_bitstream_buffer_callback_, error); + get_bitstream_buffer_data_ = nullptr; + for (EncodeMap::iterator it = encode_callbacks_.begin(); + it != encode_callbacks_.end(); ++it) + RunCallback(&it->second, error); + encode_callbacks_.clear(); +} + +void AudioEncoderResource::TryGetAudioBuffer() { + DCHECK(TrackedCallback::IsPending(get_buffer_callback_)); + + if (!audio_buffer_manager_.HasAvailableBuffer()) + return; + + int32_t buffer_id = audio_buffer_manager_.DequeueBuffer(); + scoped_refptr<AudioBufferResource> resource = new AudioBufferResource( + pp_instance(), buffer_id, + audio_buffer_manager_.GetBufferPointer(buffer_id)); + audio_buffers_.insert( + AudioBufferMap::value_type(resource->pp_resource(), resource)); + + // Take a reference for the plugin. + *get_buffer_data_ = resource->GetReference(); + get_buffer_data_ = nullptr; + RunCallback(&get_buffer_callback_, PP_OK); +} + +void AudioEncoderResource::TryWriteBitstreamBuffer() { + DCHECK(TrackedCallback::IsPending(get_bitstream_buffer_callback_)); + + if (!bitstream_buffer_manager_.HasAvailableBuffer()) + return; + + int32_t buffer_id = bitstream_buffer_manager_.DequeueBuffer(); + MediaStreamBuffer* buffer = + bitstream_buffer_manager_.GetBufferPointer(buffer_id); + + get_bitstream_buffer_data_->buffer = buffer->bitstream.data; + get_bitstream_buffer_data_->size = buffer->bitstream.data_size; + get_bitstream_buffer_data_ = nullptr; + RunCallback(&get_bitstream_buffer_callback_, PP_OK); +} + +void AudioEncoderResource::ReleaseBuffers() { + for (AudioBufferMap::iterator it = audio_buffers_.begin(); + it != audio_buffers_.end(); ++it) + it->second->Invalidate(); + audio_buffers_.clear(); } } // namespace proxy
diff --git a/ppapi/proxy/audio_encoder_resource.h b/ppapi/proxy/audio_encoder_resource.h index 23fcee2..ff13aae 100644 --- a/ppapi/proxy/audio_encoder_resource.h +++ b/ppapi/proxy/audio_encoder_resource.h
@@ -11,6 +11,7 @@ #include "base/memory/scoped_vector.h" #include "ppapi/proxy/connection.h" #include "ppapi/proxy/plugin_resource.h" +#include "ppapi/shared_impl/media_stream_buffer_manager.h" #include "ppapi/shared_impl/resource.h" #include "ppapi/thunk/ppb_audio_encoder_api.h" @@ -20,12 +21,12 @@ namespace proxy { -class SerializedHandle; -class VideoFrameResource; +class AudioBufferResource; class PPAPI_PROXY_EXPORT AudioEncoderResource : public PluginResource, - public thunk::PPB_AudioEncoder_API { + public thunk::PPB_AudioEncoder_API, + public ppapi::MediaStreamBufferManager::Delegate { public: AudioEncoderResource(Connection connection, PP_Instance instance); ~AudioEncoderResource() override; @@ -33,7 +34,10 @@ thunk::PPB_AudioEncoder_API* AsPPB_AudioEncoder_API() override; private: - // PPB_AduioEncoder_API implementation. + // MediaStreamBufferManager::Delegate implementation. + void OnNewBufferEnqueued() override {} + + // PPB_AudioEncoder_API implementation. int32_t GetSupportedProfiles( const PP_ArrayOutput& output, const scoped_refptr<TrackedCallback>& callback) override; @@ -57,6 +61,62 @@ void RequestBitrateChange(uint32_t bitrate) override; void Close() override; + // PluginResource implementation. + void OnReplyReceived(const ResourceMessageReplyParams& params, + const IPC::Message& msg) override; + + // Message handlers for the host's messages. + void OnPluginMsgGetSupportedProfilesReply( + const PP_ArrayOutput& output, + const ResourceMessageReplyParams& params, + const std::vector<PP_AudioProfileDescription>& profiles); + void OnPluginMsgInitializeReply(const ResourceMessageReplyParams& params, + int32_t number_of_samples, + int32_t audio_buffer_count, + int32_t audio_buffer_size, + int32_t bitstream_buffer_count, + int32_t bitstream_buffer_size); + void OnPluginMsgEncodeReply(const ResourceMessageReplyParams& params, + int32_t buffer_id); + void OnPluginMsgBitstreamBufferReady(const ResourceMessageReplyParams& params, + int32_t buffer_id); + void OnPluginMsgNotifyError(const ResourceMessageReplyParams& params, + int32_t error); + + // Internal utility functions. + void NotifyError(int32_t error); + void TryGetAudioBuffer(); + void TryWriteBitstreamBuffer(); + void ReleaseBuffers(); + + int32_t encoder_last_error_; + + bool initialized_; + + uint32_t number_of_samples_; + + using AudioBufferMap = + std::map<PP_Resource, scoped_refptr<AudioBufferResource>>; + AudioBufferMap audio_buffers_; + + scoped_refptr<TrackedCallback> get_supported_profiles_callback_; + scoped_refptr<TrackedCallback> initialize_callback_; + scoped_refptr<TrackedCallback> get_buffer_callback_; + PP_Resource* get_buffer_data_; + + using EncodeMap = std::map<int32_t, scoped_refptr<TrackedCallback>>; + EncodeMap encode_callbacks_; + + scoped_refptr<TrackedCallback> get_bitstream_buffer_callback_; + PP_AudioBitstreamBuffer* get_bitstream_buffer_data_; + + MediaStreamBufferManager audio_buffer_manager_; + MediaStreamBufferManager bitstream_buffer_manager_; + + // Map of bitstream buffer pointers to buffer ids. + using BufferMap = std::map<void*, int32_t>; + BufferMap bitstream_buffer_map_; + DISALLOW_COPY_AND_ASSIGN(AudioEncoderResource); };
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h index a27a3ee..3bc0d5f 100644 --- a/ppapi/proxy/ppapi_messages.h +++ b/ppapi/proxy/ppapi_messages.h
@@ -130,6 +130,7 @@ IPC_ENUM_TRAITS(PP_VideoDecoder_Profile) IPC_ENUM_TRAITS_MAX_VALUE(PP_VideoFrame_Format, PP_VIDEOFRAME_FORMAT_LAST) IPC_ENUM_TRAITS_MAX_VALUE(PP_HardwareAcceleration, PP_HARDWAREACCELERATION_LAST) +IPC_ENUM_TRAITS_MAX_VALUE(PP_AudioProfile, PP_AUDIOPROFILE_MAX) IPC_ENUM_TRAITS_MAX_VALUE(PP_VideoProfile, PP_VIDEOPROFILE_MAX) IPC_STRUCT_TRAITS_BEGIN(PP_Point) @@ -442,6 +443,14 @@ IPC_STRUCT_TRAITS_MEMBER(switch_values) IPC_STRUCT_TRAITS_END() +IPC_STRUCT_TRAITS_BEGIN(PP_AudioProfileDescription) + IPC_STRUCT_TRAITS_MEMBER(profile) + IPC_STRUCT_TRAITS_MEMBER(max_channels) + IPC_STRUCT_TRAITS_MEMBER(sample_size) + IPC_STRUCT_TRAITS_MEMBER(sample_rate) + IPC_STRUCT_TRAITS_MEMBER(hardware_accelerated) +IPC_STRUCT_TRAITS_END() + IPC_STRUCT_TRAITS_BEGIN(PP_VideoProfileDescription) IPC_STRUCT_TRAITS_MEMBER(profile) IPC_STRUCT_TRAITS_MEMBER(max_resolution) @@ -450,6 +459,15 @@ IPC_STRUCT_TRAITS_MEMBER(hardware_accelerated) IPC_STRUCT_TRAITS_END() +IPC_STRUCT_TRAITS_BEGIN(ppapi::proxy::PPB_AudioEncodeParameters) + IPC_STRUCT_TRAITS_MEMBER(channels) + IPC_STRUCT_TRAITS_MEMBER(input_sample_rate) + IPC_STRUCT_TRAITS_MEMBER(input_sample_size) + IPC_STRUCT_TRAITS_MEMBER(output_profile) + IPC_STRUCT_TRAITS_MEMBER(initial_bitrate) + IPC_STRUCT_TRAITS_MEMBER(acceleration) +IPC_STRUCT_TRAITS_END() + #if !defined(OS_NACL) && !defined(NACL_WIN64) IPC_STRUCT_TRAITS_BEGIN(ppapi::proxy::PPPDecryptor_Buffer) @@ -890,6 +908,32 @@ ppapi::HostResource /* audio_id */, bool /* play */) +// PPB_AudioEncoder +IPC_MESSAGE_CONTROL0(PpapiHostMsg_AudioEncoder_Create) +IPC_MESSAGE_CONTROL0(PpapiHostMsg_AudioEncoder_GetSupportedProfiles) +IPC_MESSAGE_CONTROL1(PpapiPluginMsg_AudioEncoder_GetSupportedProfilesReply, + std::vector<PP_AudioProfileDescription> /* results */) +IPC_MESSAGE_CONTROL1(PpapiHostMsg_AudioEncoder_Initialize, + ppapi::proxy::PPB_AudioEncodeParameters /* parameters */) +IPC_MESSAGE_CONTROL5(PpapiPluginMsg_AudioEncoder_InitializeReply, + int32_t /* number_of_samples */, + int32_t /* audio_buffer_count */, + int32_t /* audio_buffer_size */, + int32_t /* bitstream_buffer_count */, + int32_t /* bitstream_buffer_size */) +IPC_MESSAGE_CONTROL1(PpapiHostMsg_AudioEncoder_Encode, int32_t /* buffer_id */) +IPC_MESSAGE_CONTROL1(PpapiPluginMsg_AudioEncoder_EncodeReply, + int32_t /* buffer_id */) +IPC_MESSAGE_CONTROL1(PpapiPluginMsg_AudioEncoder_BitstreamBufferReady, + int32_t /* buffer_id */) +IPC_MESSAGE_CONTROL1(PpapiHostMsg_AudioEncoder_RecycleBitstreamBuffer, + int32_t /* buffer_id */) +IPC_MESSAGE_CONTROL1(PpapiHostMsg_AudioEncoder_RequestBitrateChange, + uint32_t /* bitrate */) +IPC_MESSAGE_CONTROL1(PpapiPluginMsg_AudioEncoder_NotifyError, + int32_t /* error */) +IPC_MESSAGE_CONTROL0(PpapiHostMsg_AudioEncoder_Close) + // PPB_Core. IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBCore_AddRefResource, ppapi::HostResource)
diff --git a/ppapi/proxy/serialized_structs.h b/ppapi/proxy/serialized_structs.h index ac890f8..79c851d 100644 --- a/ppapi/proxy/serialized_structs.h +++ b/ppapi/proxy/serialized_structs.h
@@ -13,6 +13,7 @@ #include "build/build_config.h" #include "ppapi/c/dev/ppb_truetype_font_dev.h" #include "ppapi/c/pp_bool.h" +#include "ppapi/c/pp_codecs.h" #include "ppapi/c/pp_instance.h" #include "ppapi/c/pp_point.h" #include "ppapi/c/pp_rect.h" @@ -121,6 +122,15 @@ base::SharedMemoryHandle handle; }; +struct PPB_AudioEncodeParameters { + uint32_t channels; + uint32_t input_sample_rate; + uint32_t input_sample_size; + PP_AudioProfile output_profile; + uint32_t initial_bitrate; + PP_HardwareAcceleration acceleration; +}; + // TODO(raymes): Make ImageHandle compatible with SerializedHandle. #if defined(OS_WIN) typedef HANDLE ImageHandle;
diff --git a/ppapi/shared_impl/media_stream_buffer.h b/ppapi/shared_impl/media_stream_buffer.h index 8b0ebe1..ddb6729 100644 --- a/ppapi/shared_impl/media_stream_buffer.h +++ b/ppapi/shared_impl/media_stream_buffer.h
@@ -11,7 +11,12 @@ namespace ppapi { union MediaStreamBuffer { - enum Type { TYPE_UNKNOWN = 0, TYPE_AUDIO = 1, TYPE_VIDEO = 2, }; + enum Type { + TYPE_UNKNOWN = 0, + TYPE_AUDIO = 1, + TYPE_VIDEO = 2, + TYPE_BITSTREAM = 3 + }; struct Header { Type type; @@ -41,16 +46,26 @@ uint8_t data[8]; }; + struct Bitstream { + Header header; + uint32_t data_size; + // Uses 8 bytes to make sure the Bitstream struct has consistent size + // between NaCl code and renderer code. + uint8_t data[8]; + }; + // Because these structs are written and read in shared memory, we need // the size and alighment to be consistent between NaCl and its host trusted // platform. PP_COMPILE_ASSERT_SIZE_IN_BYTES(Header, 8); PP_COMPILE_ASSERT_SIZE_IN_BYTES(Audio, 40); PP_COMPILE_ASSERT_SIZE_IN_BYTES(Video, 40); + PP_COMPILE_ASSERT_SIZE_IN_BYTES(Bitstream, 20); Header header; Video video; Audio audio; + Bitstream bitstream; }; } // namespace ppapi
diff --git a/ppapi/tests/test_audio_encoder.cc b/ppapi/tests/test_audio_encoder.cc new file mode 100644 index 0000000..e28721ed --- /dev/null +++ b/ppapi/tests/test_audio_encoder.cc
@@ -0,0 +1,143 @@ +// Copyright 2015 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 "ppapi/tests/test_audio_encoder.h" + +#include "ppapi/c/pp_codecs.h" +#include "ppapi/c/pp_errors.h" +#include "ppapi/cpp/audio_encoder.h" +#include "ppapi/tests/testing_instance.h" + +REGISTER_TEST_CASE(AudioEncoder); + +bool TestAudioEncoder::Init() { + audio_encoder_interface_ = static_cast<const PPB_AudioEncoder_0_1*>( + pp::Module::Get()->GetBrowserInterface(PPB_AUDIOENCODER_INTERFACE_0_1)); + return audio_encoder_interface_ && CheckTestingInterface(); +} + +void TestAudioEncoder::RunTests(const std::string& filter) { + RUN_CALLBACK_TEST(TestAudioEncoder, AvailableCodecs, filter); + RUN_CALLBACK_TEST(TestAudioEncoder, IncorrectParametersFails, filter); + RUN_CALLBACK_TEST(TestAudioEncoder, InitializeTwiceFails, filter); + RUN_CALLBACK_TEST(TestAudioEncoder, InitializeOpusMono, filter); + RUN_CALLBACK_TEST(TestAudioEncoder, InitializeOpusStereo, filter); +} + +std::string TestAudioEncoder::TestAvailableCodecs() { + // Test that we get results for supported formats. We should at + // least get the software supported formats. + pp::AudioEncoder audio_encoder(instance_); + ASSERT_FALSE(audio_encoder.is_null()); + + TestCompletionCallbackWithOutput<std::vector<PP_AudioProfileDescription>> + callback(instance_->pp_instance(), false); + callback.WaitForResult( + audio_encoder.GetSupportedProfiles(callback.GetCallback())); + ASSERT_GE(callback.result(), 1U); + + const std::vector<PP_AudioProfileDescription> audio_profiles = + callback.output(); + ASSERT_GE(audio_profiles.size(), 1U); + + bool found_opus_48hz = false; + for (uint32_t i = 0; i < audio_profiles.size(); ++i) { + const PP_AudioProfileDescription& description = audio_profiles[i]; + if (description.profile == PP_AUDIOPROFILE_OPUS && + description.sample_rate == PP_AUDIOBUFFER_SAMPLERATE_48000 && + description.max_channels >= 2) + found_opus_48hz = true; + } + ASSERT_TRUE(found_opus_48hz); + + PASS(); +} + +std::string TestAudioEncoder::TestIncorrectParametersFails() { + // Test that initializing the encoder with incorrect size fails. + pp::AudioEncoder audio_encoder(instance_); + ASSERT_FALSE(audio_encoder.is_null()); + + // Invalid number of channels. + TestCompletionCallback callback(instance_->pp_instance(), false); + callback.WaitForResult(audio_encoder.Initialize( + 42, PP_AUDIOBUFFER_SAMPLERATE_48000, PP_AUDIOBUFFER_SAMPLESIZE_16_BITS, + PP_AUDIOPROFILE_OPUS, 10000, PP_HARDWAREACCELERATION_WITHFALLBACK, + callback.GetCallback())); + ASSERT_EQ(PP_ERROR_NOTSUPPORTED, callback.result()); + + // Invalid sampling rate. + callback.WaitForResult(audio_encoder.Initialize( + 2, static_cast<PP_AudioBuffer_SampleRate>(123456), + PP_AUDIOBUFFER_SAMPLESIZE_16_BITS, PP_AUDIOPROFILE_OPUS, 10000, + PP_HARDWAREACCELERATION_WITHFALLBACK, callback.GetCallback())); + ASSERT_EQ(PP_ERROR_NOTSUPPORTED, callback.result()); + + // Invalid sample size. + callback.WaitForResult(audio_encoder.Initialize( + 2, static_cast<PP_AudioBuffer_SampleRate>(48000), + static_cast<PP_AudioBuffer_SampleSize>(72), PP_AUDIOPROFILE_OPUS, 10000, + PP_HARDWAREACCELERATION_WITHFALLBACK, callback.GetCallback())); + ASSERT_EQ(PP_ERROR_NOTSUPPORTED, callback.result()); + + PASS(); +} + +std::string TestAudioEncoder::TestInitializeTwiceFails() { + // Test that initializing the encoder with incorrect size fails. + pp::AudioEncoder audio_encoder(instance_); + ASSERT_FALSE(audio_encoder.is_null()); + + TestCompletionCallback callback(instance_->pp_instance(), false); + callback.WaitForResult(audio_encoder.Initialize( + 2, PP_AUDIOBUFFER_SAMPLERATE_48000, PP_AUDIOBUFFER_SAMPLESIZE_16_BITS, + PP_AUDIOPROFILE_OPUS, 10000, PP_HARDWAREACCELERATION_WITHFALLBACK, + callback.GetCallback())); + ASSERT_EQ(PP_OK, callback.result()); + + callback.WaitForResult(audio_encoder.Initialize( + 2, PP_AUDIOBUFFER_SAMPLERATE_48000, PP_AUDIOBUFFER_SAMPLESIZE_16_BITS, + PP_AUDIOPROFILE_OPUS, 10000, PP_HARDWAREACCELERATION_WITHFALLBACK, + callback.GetCallback())); + ASSERT_EQ(PP_ERROR_FAILED, callback.result()); + + PASS(); +} + +std::string TestAudioEncoder::TestInitializeOpusMono() { + return TestInitializeCodec(1, PP_AUDIOBUFFER_SAMPLERATE_48000, + PP_AUDIOBUFFER_SAMPLESIZE_16_BITS, + PP_AUDIOPROFILE_OPUS); +} + +std::string TestAudioEncoder::TestInitializeOpusStereo() { + return TestInitializeCodec(2, PP_AUDIOBUFFER_SAMPLERATE_48000, + PP_AUDIOBUFFER_SAMPLESIZE_16_BITS, + PP_AUDIOPROFILE_OPUS); +} + +std::string TestAudioEncoder::TestInitializeCodec( + uint32_t channels, + PP_AudioBuffer_SampleRate input_sample_rate, + PP_AudioBuffer_SampleSize input_sample_size, + PP_AudioProfile output_profile) { + pp::AudioEncoder audio_encoder(instance_); + ASSERT_FALSE(audio_encoder.is_null()); + pp::Size audio_size(640, 480); + + TestCompletionCallback callback(instance_->pp_instance(), false); + callback.WaitForResult(audio_encoder.Initialize( + channels, input_sample_rate, input_sample_size, output_profile, 10000, + PP_HARDWAREACCELERATION_WITHFALLBACK, callback.GetCallback())); + ASSERT_EQ(PP_OK, callback.result()); + + ASSERT_GE(audio_encoder.GetNumberOfSamples(), 2U); + + TestCompletionCallbackWithOutput<pp::AudioBuffer> get_buffer( + instance_->pp_instance(), false); + get_buffer.WaitForResult(audio_encoder.GetBuffer(get_buffer.GetCallback())); + ASSERT_EQ(PP_OK, get_buffer.result()); + + PASS(); +}
diff --git a/ppapi/tests/test_audio_encoder.h b/ppapi/tests/test_audio_encoder.h new file mode 100644 index 0000000..2dd6f75f --- /dev/null +++ b/ppapi/tests/test_audio_encoder.h
@@ -0,0 +1,38 @@ +// Copyright 2015 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. + +#ifndef PPAPI_TESTS_TEST_AUDIO_ENCODER_H_ +#define PPAPI_TESTS_TEST_AUDIO_ENCODER_H_ + +#include <string> + +#include "ppapi/c/pp_stdint.h" +#include "ppapi/c/ppb_audio_encoder.h" +#include "ppapi/tests/test_case.h" + +class TestAudioEncoder : public TestCase { + public: + explicit TestAudioEncoder(TestingInstance* instance) : TestCase(instance) {} + + private: + // TestCase implementation. + virtual bool Init(); + virtual void RunTests(const std::string& filter); + + std::string TestAvailableCodecs(); + std::string TestIncorrectParametersFails(); + std::string TestInitializeTwiceFails(); + std::string TestInitializeOpusMono(); + std::string TestInitializeOpusStereo(); + + std::string TestInitializeCodec(uint32_t channels, + PP_AudioBuffer_SampleRate input_sample_rate, + PP_AudioBuffer_SampleSize input_sample_size, + PP_AudioProfile output_profile); + + // Used by the tests that access the C API directly. + const PPB_AudioEncoder_0_1* audio_encoder_interface_; +}; + +#endif // PPAPI_TESTS_TEST_AUDIO_ENCODER_H_
diff --git a/printing/pdf_render_settings.h b/printing/pdf_render_settings.h index 3f8f38ba..a2e182e 100644 --- a/printing/pdf_render_settings.h +++ b/printing/pdf_render_settings.h
@@ -5,40 +5,59 @@ #ifndef PRINTING_PDF_RENDER_SETTINGS_H_ #define PRINTING_PDF_RENDER_SETTINGS_H_ -#include "base/tuple.h" +#include "ipc/ipc_message_utils.h" #include "ipc/ipc_param_traits.h" #include "printing/printing_export.h" #include "ui/gfx/geometry/rect.h" +#include "ui/gfx/ipc/gfx_param_traits.h" namespace printing { -// Defining PDF rendering settings here as a Tuple as following: -// gfx::Rect - render area -// int - render dpi -// bool - autorotate pages to fit paper -typedef base::Tuple<gfx::Rect, int, bool> PdfRenderSettingsBase; - -class PdfRenderSettings : public PdfRenderSettingsBase { +// Defining PDF rendering settings. +class PdfRenderSettings { public: - PdfRenderSettings() : PdfRenderSettingsBase() {} + PdfRenderSettings() {} PdfRenderSettings(gfx::Rect area, int dpi, bool autorotate) - : PdfRenderSettingsBase(area, dpi, autorotate) {} + : area_(area), dpi_(dpi), autorotate_(autorotate) {} ~PdfRenderSettings() {} - const gfx::Rect& area() const { return base::get<0>(*this); } - int dpi() const { return base::get<1>(*this); } - bool autorotate() const { return base::get<2>(*this); } + const gfx::Rect& area() const { return area_; } + int dpi() const { return dpi_; } + bool autorotate() const { return autorotate_; } + + gfx::Rect area_; + int dpi_; + bool autorotate_; }; } // namespace printing namespace IPC { template <> -struct SimilarTypeTraits<printing::PdfRenderSettings> { - typedef printing::PdfRenderSettingsBase Type; +struct ParamTraits<printing::PdfRenderSettings> { + typedef printing::PdfRenderSettings param_type; + static void Write(Message* m, const param_type& p) { + WriteParam(m, p.area_); + WriteParam(m, p.dpi_); + WriteParam(m, p.autorotate_); + } + + static bool Read(const Message* m, base::PickleIterator* iter, + param_type* r) { + return ReadParam(m, iter, &r->area_) && + ReadParam(m, iter, &r->dpi_) && + ReadParam(m, iter, &r->autorotate_); + } + + static void Log(const param_type& p, std::string* l) { + LogParam(p.area_, l); + l->append(", "); + LogParam(p.dpi_, l); + l->append(", "); + LogParam(p.autorotate_, l); + } }; } // namespace IPC #endif // PRINTING_PDF_RENDER_SETTINGS_H_ -
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn index f62a03f..5489890 100644 --- a/remoting/host/BUILD.gn +++ b/remoting/host/BUILD.gn
@@ -193,14 +193,7 @@ } if (enable_webrtc) { - deps += [ - # TODO(GYP): crbug.com/481633. We should probably not have to depend on - # libjingle_webrtc; that should be pulled in automatically by - # libpeerconnection instead. - "//third_party/libjingle:libjingle_webrtc", - "//third_party/libjingle:libpeerconnection", - "//third_party/webrtc/modules/desktop_capture", - ] + deps += [ "//third_party/webrtc/modules/desktop_capture" ] sources += rebase_path(remoting_host_srcs_gypi_values.remoting_cast_sources,
diff --git a/remoting/host/desktop_session_agent.cc b/remoting/host/desktop_session_agent.cc index 23d05f2..2e486c5b 100644 --- a/remoting/host/desktop_session_agent.cc +++ b/remoting/host/desktop_session_agent.cc
@@ -74,8 +74,16 @@ size_t size, int id) { scoped_ptr<base::SharedMemory> memory(new base::SharedMemory()); +#if defined(OS_MACOSX) && !defined(OS_IOS) + // Remoting does not yet support Mach primitive backed SharedMemory, so + // force the underlying primitive to be a POSIX fd. + // https://crbug.com/547247. + if (!memory->CreateAndMapAnonymousPosix(size)) + return nullptr; +#else if (!memory->CreateAndMapAnonymous(size)) return nullptr; +#endif // defined(OS_MACOSX) && !defined(OS_IOS) return make_scoped_ptr(new SharedBuffer(agent, memory.Pass(), size, id)); }
diff --git a/remoting/protocol/BUILD.gn b/remoting/protocol/BUILD.gn index f5d79ca..8a81dd2 100644 --- a/remoting/protocol/BUILD.gn +++ b/remoting/protocol/BUILD.gn
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/features.gni") import("//remoting/remoting_srcs.gni") source_set("protocol") { @@ -36,6 +37,18 @@ "chromium_socket_factory.cc", ] } + + if (!is_nacl && enable_webrtc) { + deps += [ + # TODO(GYP): crbug.com/481633. We should probably not have to depend on + # libjingle_webrtc; that should be pulled in automatically by + # libpeerconnection instead. + "//third_party/libjingle:libjingle_webrtc", + "//third_party/libjingle:libpeerconnection", + ] + } else { + sources -= [ "webrtc_transport.cc" ] + } } source_set("test_support") { @@ -95,6 +108,7 @@ "ssl_hmac_channel_authenticator_unittest.cc", "third_party_authenticator_unittest.cc", "v2_authenticator_unittest.cc", + "webrtc_transport_unittest.cc", ] deps = [
diff --git a/remoting/protocol/jingle_session.cc b/remoting/protocol/jingle_session.cc index 46cc311b..fe0dc7e 100644 --- a/remoting/protocol/jingle_session.cc +++ b/remoting/protocol/jingle_session.cc
@@ -277,6 +277,8 @@ } void JingleSession::SendMessage(const JingleMessage& message) { + DCHECK(CalledOnValidThread()); + scoped_ptr<IqRequest> request = session_manager_->iq_sender()->SendIq( message.ToXml(), base::Bind(&JingleSession::OnMessageResponse, @@ -301,6 +303,8 @@ JingleMessage::ActionType request_type, IqRequest* request, const buzz::XmlElement* response) { + DCHECK(CalledOnValidThread()); + // Delete the request from the list of pending requests. pending_requests_.erase(request); delete request; @@ -333,6 +337,8 @@ void JingleSession::OnOutgoingTransportInfo( scoped_ptr<XmlElement> transport_info) { + DCHECK(CalledOnValidThread()); + JingleMessage message(peer_jid_, JingleMessage::TRANSPORT_INFO, session_id_); message.transport_info = transport_info.Pass(); @@ -349,15 +355,27 @@ void JingleSession::OnTransportRouteChange(const std::string& channel_name, const TransportRoute& route) { + DCHECK(CalledOnValidThread()); + event_handler_->OnSessionRouteChange(channel_name, route); } +void JingleSession::OnTransportConnected() { + DCHECK(CalledOnValidThread()); + + // TODO(sergeyu): Add Session::State value to indicate that the transport has + // been connected. +} + void JingleSession::OnTransportError(ErrorCode error) { + DCHECK(CalledOnValidThread()); + Close(error); } void JingleSession::OnTransportInfoResponse(IqRequest* request, const buzz::XmlElement* response) { + DCHECK(CalledOnValidThread()); DCHECK(!transport_info_requests_.empty()); // Consider transport-info requests sent before this one lost and delete
diff --git a/remoting/protocol/jingle_session.h b/remoting/protocol/jingle_session.h index cb8fd96..149aeb5 100644 --- a/remoting/protocol/jingle_session.h +++ b/remoting/protocol/jingle_session.h
@@ -77,6 +77,7 @@ scoped_ptr<buzz::XmlElement> transport_info) override; void OnTransportRouteChange(const std::string& component, const TransportRoute& route) override; + void OnTransportConnected() override; void OnTransportError(ErrorCode error) override; // Response handler for transport-info responses. Transport-info timeouts are
diff --git a/remoting/protocol/transport.h b/remoting/protocol/transport.h index 08d0aa3..00170c5 100644 --- a/remoting/protocol/transport.h +++ b/remoting/protocol/transport.h
@@ -67,6 +67,9 @@ virtual void OnTransportRouteChange(const std::string& channel_name, const TransportRoute& route) = 0; + // Called when the transport is connected. + virtual void OnTransportConnected() = 0; + // Called when there is an error connecting the session. virtual void OnTransportError(ErrorCode error) = 0; };
diff --git a/remoting/protocol/webrtc_transport.cc b/remoting/protocol/webrtc_transport.cc new file mode 100644 index 0000000..4bc629b --- /dev/null +++ b/remoting/protocol/webrtc_transport.cc
@@ -0,0 +1,497 @@ +// Copyright 2015 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 "remoting/protocol/webrtc_transport.h" + +#include "base/callback_helpers.h" +#include "base/single_thread_task_runner.h" +#include "base/strings/string_number_conversions.h" +#include "base/task_runner_util.h" +#include "jingle/glue/thread_wrapper.h" +#include "third_party/libjingle/source/talk/app/webrtc/test/fakeconstraints.h" +#include "third_party/webrtc/libjingle/xmllite/xmlelement.h" +#include "third_party/webrtc/modules/audio_device/include/fake_audio_device.h" + +using buzz::QName; +using buzz::XmlElement; + +namespace remoting { +namespace protocol { + +namespace { + +// Delay after candidate creation before sending transport-info message to +// accumulate multiple candidates. This is an optimization to reduce number of +// transport-info messages. +const int kTransportInfoSendDelayMs = 20; + +// XML namespace for the transport elements. +const char kTransportNamespace[] = "google:remoting:webrtc"; + +rtc::Thread* InitAndGetRtcThread() { + jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); + + // TODO(sergeyu): Investigate if it's possible to avoid Send(). + jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true); + + return jingle_glue::JingleThreadWrapper::current(); +} + +// A webrtc::CreateSessionDescriptionObserver implementation used to receive the +// results of creating descriptions for this end of the PeerConnection. +class CreateSessionDescriptionObserver + : public webrtc::CreateSessionDescriptionObserver { + public: + typedef base::Callback<void( + scoped_ptr<webrtc::SessionDescriptionInterface> description, + const std::string& error)> ResultCallback; + + static CreateSessionDescriptionObserver* Create( + const ResultCallback& result_callback) { + return new rtc::RefCountedObject<CreateSessionDescriptionObserver>( + result_callback); + } + void OnSuccess(webrtc::SessionDescriptionInterface* desc) override { + base::ResetAndReturn(&result_callback_) + .Run(make_scoped_ptr(desc), std::string()); + } + void OnFailure(const std::string& error) override { + base::ResetAndReturn(&result_callback_).Run(nullptr, error); + } + + protected: + explicit CreateSessionDescriptionObserver( + const ResultCallback& result_callback) + : result_callback_(result_callback) {} + ~CreateSessionDescriptionObserver() override {} + + private: + ResultCallback result_callback_; + + DISALLOW_COPY_AND_ASSIGN(CreateSessionDescriptionObserver); +}; + +// A webrtc::SetSessionDescriptionObserver implementation used to receive the +// results of setting local and remote descriptions of the PeerConnection. +class SetSessionDescriptionObserver + : public webrtc::SetSessionDescriptionObserver { + public: + typedef base::Callback<void(bool success, const std::string& error)> + ResultCallback; + + static SetSessionDescriptionObserver* Create( + const ResultCallback& result_callback) { + return new rtc::RefCountedObject<SetSessionDescriptionObserver>( + result_callback); + } + + void OnSuccess() override { + base::ResetAndReturn(&result_callback_).Run(true, std::string()); + } + + void OnFailure(const std::string& error) override { + base::ResetAndReturn(&result_callback_).Run(false, error); + } + + protected: + SetSessionDescriptionObserver(const ResultCallback& result_callback) + : result_callback_(result_callback) {} + ~SetSessionDescriptionObserver() override {} + + private: + ResultCallback result_callback_; + + DISALLOW_COPY_AND_ASSIGN(SetSessionDescriptionObserver); +}; + +} // namespace + +WebrtcTransport::WebrtcTransport( + rtc::scoped_refptr<webrtc::PortAllocatorFactoryInterface> + port_allocator_factory, + TransportRole role, + scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner) + : port_allocator_factory_(port_allocator_factory), + role_(role), + worker_task_runner_(worker_task_runner), + weak_factory_(this) {} + +WebrtcTransport::~WebrtcTransport() {} + +void WebrtcTransport::Start(EventHandler* event_handler, + Authenticator* authenticator) { + DCHECK(thread_checker_.CalledOnValidThread()); + + event_handler_ = event_handler; + + // TODO(sergeyu): Use the |authenticator| to authenticate PeerConnection. + + base::PostTaskAndReplyWithResult( + worker_task_runner_.get(), FROM_HERE, base::Bind(&InitAndGetRtcThread), + base::Bind(&WebrtcTransport::DoStart, weak_factory_.GetWeakPtr())); +} + +bool WebrtcTransport::ProcessTransportInfo(XmlElement* transport_info) { + DCHECK(thread_checker_.CalledOnValidThread()); + + if (transport_info->Name() != QName(kTransportNamespace, "transport")) + return false; + + if (!peer_connection_) + return false; + + XmlElement* session_description = transport_info->FirstNamed( + QName(kTransportNamespace, "session-description")); + if (session_description) { + webrtc::PeerConnectionInterface::SignalingState expected_state = + role_ == TransportRole::SERVER + ? webrtc::PeerConnectionInterface::kStable + : webrtc::PeerConnectionInterface::kHaveLocalOffer; + if (peer_connection_->signaling_state() != expected_state) { + LOG(ERROR) << "Received unexpected WebRTC session_description. "; + return false; + } + + std::string type = session_description->Attr(QName(std::string(), "type")); + std::string sdp = session_description->BodyText(); + if (type.empty() || sdp.empty()) { + LOG(ERROR) << "Incorrect session_description format."; + return false; + } + + webrtc::SdpParseError error; + scoped_ptr<webrtc::SessionDescriptionInterface> session_description( + webrtc::CreateSessionDescription(type, sdp, &error)); + if (!session_description) { + LOG(ERROR) << "Failed to parse the offer: " << error.description + << " line: " << error.line; + return false; + } + + peer_connection_->SetRemoteDescription( + SetSessionDescriptionObserver::Create( + base::Bind(&WebrtcTransport::OnRemoteDescriptionSet, + weak_factory_.GetWeakPtr())), + session_description.release()); + } + + XmlElement* candidate_element; + QName candidate_qname(kTransportNamespace, "candidate"); + for (candidate_element = transport_info->FirstNamed(candidate_qname); + candidate_element; + candidate_element = candidate_element->NextNamed(candidate_qname)) { + std::string candidate_str = candidate_element->BodyText(); + std::string sdp_mid = + candidate_element->Attr(QName(std::string(), "sdpMid")); + std::string sdp_mlineindex_str = + candidate_element->Attr(QName(std::string(), "sdpMLineIndex")); + int sdp_mlineindex; + if (candidate_str.empty() || sdp_mid.empty() || + !base::StringToInt(sdp_mlineindex_str, &sdp_mlineindex)) { + LOG(ERROR) << "Failed to parse incoming candidates."; + return false; + } + + webrtc::SdpParseError error; + scoped_ptr<webrtc::IceCandidateInterface> candidate( + webrtc::CreateIceCandidate(sdp_mid, sdp_mlineindex, candidate_str, + &error)); + if (!candidate) { + LOG(ERROR) << "Failed to parse incoming candidate: " << error.description + << " line: " << error.line; + return false; + } + + if (peer_connection_->signaling_state() == + webrtc::PeerConnectionInterface::kStable) { + if (!peer_connection_->AddIceCandidate(candidate.get())) { + LOG(ERROR) << "Failed to add incoming ICE candidate."; + return false; + } + } else { + pending_incoming_candidates_.push_back(candidate.Pass()); + } + } + + return true; +} + +DatagramChannelFactory* WebrtcTransport::GetDatagramChannelFactory() { + DCHECK(thread_checker_.CalledOnValidThread()); + NOTIMPLEMENTED(); + return nullptr; +} + +StreamChannelFactory* WebrtcTransport::GetStreamChannelFactory() { + DCHECK(thread_checker_.CalledOnValidThread()); + // TODO(sergeyu): Implement data stream support. + NOTIMPLEMENTED(); + return nullptr; +} + +StreamChannelFactory* WebrtcTransport::GetMultiplexedChannelFactory() { + DCHECK(thread_checker_.CalledOnValidThread()); + return GetStreamChannelFactory(); +} + +void WebrtcTransport::DoStart(rtc::Thread* worker_thread) { + DCHECK(thread_checker_.CalledOnValidThread()); + + jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); + + // TODO(sergeyu): Investigate if it's possible to avoid Send(). + jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true); + + fake_audio_device_module_.reset(new webrtc::FakeAudioDeviceModule()); + + peer_connection_factory_ = webrtc::CreatePeerConnectionFactory( + worker_thread, rtc::Thread::Current(), + fake_audio_device_module_.get(), nullptr, nullptr); + + webrtc::PeerConnectionInterface::IceServer stun_server; + stun_server.urls.push_back("stun:stun.l.google.com:19302"); + webrtc::PeerConnectionInterface::RTCConfiguration rtc_config; + rtc_config.servers.push_back(stun_server); + + webrtc::FakeConstraints constraints; + constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, + webrtc::MediaConstraintsInterface::kValueTrue); + + peer_connection_ = peer_connection_factory_->CreatePeerConnection( + rtc_config, &constraints, port_allocator_factory_, nullptr, this); + + if (role_ == TransportRole::CLIENT) { + webrtc::FakeConstraints offer_config; + offer_config.AddMandatory( + webrtc::MediaConstraintsInterface::kOfferToReceiveVideo, + webrtc::MediaConstraintsInterface::kValueTrue); + offer_config.AddMandatory( + webrtc::MediaConstraintsInterface::kOfferToReceiveAudio, + webrtc::MediaConstraintsInterface::kValueFalse); + peer_connection_->CreateOffer( + CreateSessionDescriptionObserver::Create( + base::Bind(&WebrtcTransport::OnLocalSessionDescriptionCreated, + weak_factory_.GetWeakPtr())), + &offer_config); + } +} + +void WebrtcTransport::OnLocalSessionDescriptionCreated( + scoped_ptr<webrtc::SessionDescriptionInterface> description, + const std::string& error) { + DCHECK(thread_checker_.CalledOnValidThread()); + + if (!peer_connection_) + return; + + if (!description) { + LOG(ERROR) << "PeerConnection offer creation failed: " << error; + Close(CHANNEL_CONNECTION_ERROR); + return; + } + + std::string description_sdp; + if (!description->ToString(&description_sdp)) { + LOG(ERROR) << "Failed to serialize description."; + Close(CHANNEL_CONNECTION_ERROR); + return; + } + + // Format and send the session description to the peer. + scoped_ptr<XmlElement> transport_info( + new XmlElement(QName(kTransportNamespace, "transport"), true)); + XmlElement* offer_tag = + new XmlElement(QName(kTransportNamespace, "session-description")); + transport_info->AddElement(offer_tag); + offer_tag->SetAttr(QName(std::string(), "type"), description->type()); + offer_tag->SetBodyText(description_sdp); + + event_handler_->OnOutgoingTransportInfo(transport_info.Pass()); + + peer_connection_->SetLocalDescription( + SetSessionDescriptionObserver::Create(base::Bind( + &WebrtcTransport::OnLocalDescriptionSet, weak_factory_.GetWeakPtr())), + description.release()); +} + +void WebrtcTransport::OnLocalDescriptionSet(bool success, + const std::string& error) { + DCHECK(thread_checker_.CalledOnValidThread()); + + if (!peer_connection_) + return; + + if (!success) { + LOG(ERROR) << "Failed to set local description: " << error; + Close(CHANNEL_CONNECTION_ERROR); + return; + } + + AddPendingCandidatesIfPossible(); +} + +void WebrtcTransport::OnRemoteDescriptionSet(bool success, + const std::string& error) { + DCHECK(thread_checker_.CalledOnValidThread()); + + if (!peer_connection_) + return; + + if (!success) { + LOG(ERROR) << "Failed to set local description: " << error; + Close(CHANNEL_CONNECTION_ERROR); + return; + } + + // Create and send answer on the server. + if (role_ == TransportRole::SERVER) { + peer_connection_->CreateAnswer( + CreateSessionDescriptionObserver::Create( + base::Bind(&WebrtcTransport::OnLocalSessionDescriptionCreated, + weak_factory_.GetWeakPtr())), + nullptr); + } + + AddPendingCandidatesIfPossible(); +} + +void WebrtcTransport::Close(ErrorCode error) { + DCHECK(thread_checker_.CalledOnValidThread()); + + weak_factory_.InvalidateWeakPtrs(); + peer_connection_->Close(); + peer_connection_ = nullptr; + peer_connection_factory_ = nullptr; + + if (error != OK) + event_handler_->OnTransportError(error); +} + +void WebrtcTransport::OnSignalingChange( + webrtc::PeerConnectionInterface::SignalingState new_state) { + DCHECK(thread_checker_.CalledOnValidThread()); +} + +void WebrtcTransport::OnAddStream(webrtc::MediaStreamInterface* stream) { + DCHECK(thread_checker_.CalledOnValidThread()); + LOG(ERROR) << "Stream added " << stream->label(); +} + +void WebrtcTransport::OnRemoveStream(webrtc::MediaStreamInterface* stream) { + DCHECK(thread_checker_.CalledOnValidThread()); + LOG(ERROR) << "Stream removed " << stream->label(); +} + +void WebrtcTransport::OnDataChannel( + webrtc::DataChannelInterface* data_channel) { + DCHECK(thread_checker_.CalledOnValidThread()); + // TODO(sergeyu): Use the data channel. +} + +void WebrtcTransport::OnRenegotiationNeeded() { + DCHECK(thread_checker_.CalledOnValidThread()); + // TODO(sergeyu): Figure out what needs to happen here. +} + +void WebrtcTransport::OnIceConnectionChange( + webrtc::PeerConnectionInterface::IceConnectionState new_state) { + DCHECK(thread_checker_.CalledOnValidThread()); + + if (new_state == webrtc::PeerConnectionInterface::kIceConnectionConnected) + event_handler_->OnTransportConnected(); +} + +void WebrtcTransport::OnIceGatheringChange( + webrtc::PeerConnectionInterface::IceGatheringState new_state) { + DCHECK(thread_checker_.CalledOnValidThread()); +} + +void WebrtcTransport::OnIceCandidate( + const webrtc::IceCandidateInterface* candidate) { + DCHECK(thread_checker_.CalledOnValidThread()); + + scoped_ptr<XmlElement> candidate_element( + new XmlElement(QName(kTransportNamespace, "candidate"))); + std::string candidate_str; + if (!candidate->ToString(&candidate_str)) { + LOG(ERROR) << "Failed to serialize local candidate."; + return; + } + candidate_element->SetBodyText(candidate_str); + candidate_element->SetAttr(QName(std::string(), "sdpMid"), + candidate->sdp_mid()); + candidate_element->SetAttr(QName(std::string(), "sdpMLineIndex"), + base::IntToString(candidate->sdp_mline_index())); + + EnsurePendingTransportInfoMessage(); + pending_transport_info_message_->AddElement(candidate_element.release()); +} + +void WebrtcTransport::EnsurePendingTransportInfoMessage() { + DCHECK(thread_checker_.CalledOnValidThread()); + + // |transport_info_timer_| must be running iff + // |pending_transport_info_message_| exists. + DCHECK_EQ(pending_transport_info_message_ != nullptr, + transport_info_timer_.IsRunning()); + + if (!pending_transport_info_message_) { + pending_transport_info_message_.reset( + new XmlElement(QName(kTransportNamespace, "transport"), true)); + + // Delay sending the new candidates in case we get more candidates + // that we can send in one message. + transport_info_timer_.Start( + FROM_HERE, base::TimeDelta::FromMilliseconds(kTransportInfoSendDelayMs), + this, &WebrtcTransport::SendTransportInfo); + } +} + +void WebrtcTransport::SendTransportInfo() { + DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK(pending_transport_info_message_); + + event_handler_->OnOutgoingTransportInfo( + pending_transport_info_message_.Pass()); + pending_transport_info_message_.reset(); +} + +void WebrtcTransport::AddPendingCandidatesIfPossible() { + DCHECK(thread_checker_.CalledOnValidThread()); + + if (peer_connection_->signaling_state() == + webrtc::PeerConnectionInterface::kStable) { + for (auto candidate : pending_incoming_candidates_) { + if (!peer_connection_->AddIceCandidate(candidate)) { + LOG(ERROR) << "Failed to add incoming candidate"; + Close(INCOMPATIBLE_PROTOCOL); + return; + } + } + pending_incoming_candidates_.clear(); + } +} + +WebrtcTransportFactory::WebrtcTransportFactory( + SignalStrategy* signal_strategy, + rtc::scoped_refptr<webrtc::PortAllocatorFactoryInterface> + port_allocator_factory, + TransportRole role) + : signal_strategy_(signal_strategy), + port_allocator_factory_(port_allocator_factory), + role_(role), + worker_thread_("ChromotingWebrtcWorkerThread") { + worker_thread_.StartWithOptions( + base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); +} + +WebrtcTransportFactory::~WebrtcTransportFactory() {} + +scoped_ptr<Transport> WebrtcTransportFactory::CreateTransport() { + return make_scoped_ptr(new WebrtcTransport(port_allocator_factory_, role_, + worker_thread_.task_runner())); +} + +} // namespace protocol +} // namespace remoting
diff --git a/remoting/protocol/webrtc_transport.h b/remoting/protocol/webrtc_transport.h new file mode 100644 index 0000000..cbc6458d --- /dev/null +++ b/remoting/protocol/webrtc_transport.h
@@ -0,0 +1,124 @@ +// Copyright 2015 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. + +#ifndef REMOTING_PROTOCOL_WEBRTC_TRANSPORT_H_ +#define REMOTING_PROTOCOL_WEBRTC_TRANSPORT_H_ + +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/scoped_vector.h" +#include "base/memory/weak_ptr.h" +#include "base/threading/thread.h" +#include "base/threading/thread_checker.h" +#include "base/timer/timer.h" +#include "remoting/protocol/transport.h" +#include "remoting/signaling/signal_strategy.h" +#include "third_party/libjingle/source/talk/app/webrtc/peerconnectioninterface.h" + +namespace webrtc { +class FakeAudioDeviceModule; +} // namespace webrtc + +namespace remoting { +namespace protocol { + +class WebrtcTransport : public Transport, + public webrtc::PeerConnectionObserver { + public: + WebrtcTransport( + rtc::scoped_refptr<webrtc::PortAllocatorFactoryInterface> + port_allocator_factory, + TransportRole role, + scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner); + ~WebrtcTransport() override; + + // Transport interface. + void Start(EventHandler* event_handler, + Authenticator* authenticator) override; + bool ProcessTransportInfo(buzz::XmlElement* transport_info) override; + DatagramChannelFactory* GetDatagramChannelFactory() override; + StreamChannelFactory* GetStreamChannelFactory() override; + StreamChannelFactory* GetMultiplexedChannelFactory() override; + + private: + void DoStart(rtc::Thread* worker_thread); + void OnLocalSessionDescriptionCreated( + scoped_ptr<webrtc::SessionDescriptionInterface> description, + const std::string& error); + void OnLocalDescriptionSet(bool success, const std::string& error); + void OnRemoteDescriptionSet(bool success, const std::string& error); + + // webrtc::PeerConnectionObserver interface. + void OnSignalingChange( + webrtc::PeerConnectionInterface::SignalingState new_state) override; + void OnAddStream(webrtc::MediaStreamInterface* stream) override; + void OnRemoveStream(webrtc::MediaStreamInterface* stream) override; + void OnDataChannel(webrtc::DataChannelInterface* data_channel) override; + void OnRenegotiationNeeded() override; + void OnIceConnectionChange( + webrtc::PeerConnectionInterface::IceConnectionState new_state) override; + void OnIceGatheringChange( + webrtc::PeerConnectionInterface::IceGatheringState new_state) override; + void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override; + + void EnsurePendingTransportInfoMessage(); + void SendTransportInfo(); + void AddPendingCandidatesIfPossible(); + + void Close(ErrorCode error); + + base::ThreadChecker thread_checker_; + + rtc::scoped_refptr<webrtc::PortAllocatorFactoryInterface> + port_allocator_factory_; + TransportRole role_; + EventHandler* event_handler_ = nullptr; + scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner_; + + scoped_ptr<webrtc::FakeAudioDeviceModule> fake_audio_device_module_; + + rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> + peer_connection_factory_; + rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_; + + scoped_ptr<buzz::XmlElement> pending_transport_info_message_; + base::OneShotTimer transport_info_timer_; + + ScopedVector<webrtc::IceCandidateInterface> pending_incoming_candidates_; + + std::list<rtc::scoped_refptr<webrtc::MediaStreamInterface>> + unclaimed_streams_; + + base::WeakPtrFactory<WebrtcTransport> weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(WebrtcTransport); +}; + +class WebrtcTransportFactory : public TransportFactory { + public: + WebrtcTransportFactory( + SignalStrategy* signal_strategy, + rtc::scoped_refptr<webrtc::PortAllocatorFactoryInterface> + port_allocator_factory, + TransportRole role); + ~WebrtcTransportFactory() override; + + // TransportFactory interface. + scoped_ptr<Transport> CreateTransport() override; + + private: + SignalStrategy* signal_strategy_; + rtc::scoped_refptr<webrtc::PortAllocatorFactoryInterface> + port_allocator_factory_; + TransportRole role_; + + base::Thread worker_thread_; + + DISALLOW_COPY_AND_ASSIGN(WebrtcTransportFactory); +}; + +} // namespace protocol +} // namespace remoting + +#endif // REMOTING_PROTOCOL_WEBRTC_TRANSPORT_H_
diff --git a/remoting/protocol/webrtc_transport_unittest.cc b/remoting/protocol/webrtc_transport_unittest.cc new file mode 100644 index 0000000..8f21cca --- /dev/null +++ b/remoting/protocol/webrtc_transport_unittest.cc
@@ -0,0 +1,171 @@ +// Copyright 2015 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 "remoting/protocol/webrtc_transport.h" + +#include "base/message_loop/message_loop.h" +#include "base/run_loop.h" +#include "jingle/glue/thread_wrapper.h" +#include "net/url_request/url_request_context_getter.h" +#include "remoting/protocol/chromium_port_allocator_factory.h" +#include "remoting/protocol/fake_authenticator.h" +#include "remoting/protocol/network_settings.h" +#include "remoting/signaling/fake_signal_strategy.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/webrtc/libjingle/xmllite/xmlelement.h" + +namespace remoting { +namespace protocol { + +namespace { + +const char kTestJid[] = "client@gmail.com/321"; + +class TestTransportEventHandler : public Transport::EventHandler { + public: + typedef base::Callback<void(scoped_ptr<buzz::XmlElement> message)> + TransportInfoCallback; + typedef base::Callback<void(ErrorCode error)> ErrorCallback; + + TestTransportEventHandler() {} + ~TestTransportEventHandler() {} + + // Both callback must be set before the test handler is passed to a Transport + // object. + void set_transport_info_callback(const TransportInfoCallback& callback) { + transport_info_callback_ = callback; + } + void set_connected_callback(const base::Closure& callback) { + connected_callback_ = callback; + } + void set_error_callback(const ErrorCallback& callback) { + error_callback_ = callback; + } + + // Transport::EventHandler interface. + void OnOutgoingTransportInfo(scoped_ptr<buzz::XmlElement> message) override { + transport_info_callback_.Run(message.Pass()); + } + void OnTransportRouteChange(const std::string& channel_name, + const TransportRoute& route) override {} + void OnTransportConnected() override { + connected_callback_.Run(); + } + void OnTransportError(ErrorCode error) override { + error_callback_.Run(error); + } + + private: + TransportInfoCallback transport_info_callback_; + base::Closure connected_callback_; + ErrorCallback error_callback_; + + DISALLOW_COPY_AND_ASSIGN(TestTransportEventHandler); +}; + +} // namespace + +class WebrtcTransportTest : public testing::Test { + public: + WebrtcTransportTest() { + jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop(); + network_settings_ = + NetworkSettings(NetworkSettings::NAT_TRAVERSAL_OUTGOING); + } + + void ProcessTransportInfo(scoped_ptr<Transport>* target_transport, + scoped_ptr<buzz::XmlElement> transport_info) { + ASSERT_TRUE(target_transport); + EXPECT_TRUE((*target_transport) + ->ProcessTransportInfo(transport_info.get())); + } + + protected: + void WaitUntilConnected() { + host_event_handler_.set_error_callback(base::Bind( + &WebrtcTransportTest::QuitRunLoopOnError, base::Unretained(this))); + client_event_handler_.set_error_callback(base::Bind( + &WebrtcTransportTest::QuitRunLoopOnError, base::Unretained(this))); + + int counter = 2; + host_event_handler_.set_connected_callback( + base::Bind(&WebrtcTransportTest::QuitRunLoopOnCounter, + base::Unretained(this), &counter)); + client_event_handler_.set_connected_callback( + base::Bind(&WebrtcTransportTest::QuitRunLoopOnCounter, + base::Unretained(this), &counter)); + + run_loop_.reset(new base::RunLoop()); + run_loop_->Run(); + + EXPECT_EQ(OK, error_); + } + + void QuitRunLoopOnError(ErrorCode error) { + error_ = error; + run_loop_->Quit(); + } + + void QuitRunLoopOnCounter(int* counter) { + --(*counter); + if (*counter == 0) + run_loop_->Quit(); + } + + protected: + base::MessageLoopForIO message_loop_; + scoped_ptr<base::RunLoop> run_loop_; + + NetworkSettings network_settings_; + + scoped_ptr< FakeSignalStrategy> signal_strategy_; + + scoped_ptr<WebrtcTransportFactory> host_transport_factory_; + scoped_ptr<Transport> host_transport_; + TestTransportEventHandler host_event_handler_; + scoped_ptr<FakeAuthenticator> host_authenticator_; + + scoped_ptr<WebrtcTransportFactory> client_transport_factory_; + scoped_ptr<Transport> client_transport_; + TestTransportEventHandler client_event_handler_; + scoped_ptr<FakeAuthenticator> client_authenticator_; + + ErrorCode error_ = OK; +}; + +TEST_F(WebrtcTransportTest, Connects) { + signal_strategy_.reset(new FakeSignalStrategy(kTestJid)); + + host_transport_factory_.reset(new WebrtcTransportFactory( + signal_strategy_.get(), + ChromiumPortAllocatorFactory::Create(network_settings_, nullptr), + TransportRole::SERVER)); + host_transport_ = host_transport_factory_->CreateTransport(); + host_authenticator_.reset(new FakeAuthenticator( + FakeAuthenticator::HOST, 0, FakeAuthenticator::ACCEPT, false)); + + client_transport_factory_.reset(new WebrtcTransportFactory( + signal_strategy_.get(), + ChromiumPortAllocatorFactory::Create(network_settings_, nullptr), + TransportRole::CLIENT)); + client_transport_ = client_transport_factory_->CreateTransport(); + host_authenticator_.reset(new FakeAuthenticator( + FakeAuthenticator::CLIENT, 0, FakeAuthenticator::ACCEPT, false)); + + // Connect signaling between the two WebrtcTransport objects. + host_event_handler_.set_transport_info_callback( + base::Bind(&WebrtcTransportTest::ProcessTransportInfo, + base::Unretained(this), &client_transport_)); + client_event_handler_.set_transport_info_callback( + base::Bind(&WebrtcTransportTest::ProcessTransportInfo, + base::Unretained(this), &host_transport_)); + + host_transport_->Start(&host_event_handler_, host_authenticator_.get()); + client_transport_->Start(&client_event_handler_, client_authenticator_.get()); + + WaitUntilConnected(); +} + +} // namespace protocol +} // namespace remoting
diff --git a/remoting/remoting.gyp b/remoting/remoting.gyp index 7d7b992..005823cc 100644 --- a/remoting/remoting.gyp +++ b/remoting/remoting.gyp
@@ -237,6 +237,8 @@ '../net/net.gyp:net', '../third_party/expat/expat.gyp:expat', '../third_party/libjingle/libjingle.gyp:libjingle', + '../third_party/libjingle/libjingle.gyp:libjingle_webrtc', + '../third_party/libjingle/libjingle.gyp:libpeerconnection', 'remoting_base', ], 'export_dependent_settings': [
diff --git a/remoting/remoting_host.gypi b/remoting/remoting_host.gypi index 99794b22..4ec28b1 100644 --- a/remoting/remoting_host.gypi +++ b/remoting/remoting_host.gypi
@@ -182,7 +182,6 @@ ['enable_webrtc==1', { 'dependencies': [ '../third_party/webrtc/modules/modules.gyp:desktop_capture', - '../third_party/libjingle/libjingle.gyp:libpeerconnection', ], 'sources': [ '<@(remoting_cast_sources)',
diff --git a/remoting/remoting_nacl.gyp b/remoting/remoting_nacl.gyp index d5cb7be..7ea8e1a 100644 --- a/remoting/remoting_nacl.gyp +++ b/remoting/remoting_nacl.gyp
@@ -125,6 +125,7 @@ 'base/url_request_context_getter.cc', 'protocol/chromium_socket_factory.cc', 'protocol/chromium_port_allocator_factory.cc', + 'protocol/webrtc_transport.cc', ], # Include normalizing_input_filter_*.cc excluded by the filename
diff --git a/remoting/remoting_srcs.gypi b/remoting/remoting_srcs.gypi index 04d3738..928a1b8 100644 --- a/remoting/remoting_srcs.gypi +++ b/remoting/remoting_srcs.gypi
@@ -207,6 +207,8 @@ 'protocol/v2_authenticator.cc', 'protocol/v2_authenticator.h', 'protocol/video_stub.h', + 'protocol/webrtc_transport.cc', + 'protocol/webrtc_transport.h', ], 'remoting_signaling_sources': [
diff --git a/remoting/remoting_test.gypi b/remoting/remoting_test.gypi index 67020539..33e60ac 100644 --- a/remoting/remoting_test.gypi +++ b/remoting/remoting_test.gypi
@@ -330,6 +330,7 @@ 'protocol/ssl_hmac_channel_authenticator_unittest.cc', 'protocol/third_party_authenticator_unittest.cc', 'protocol/v2_authenticator_unittest.cc', + 'protocol/webrtc_transport_unittest.cc', 'signaling/iq_sender_unittest.cc', 'signaling/jid_util_unittest.cc', 'signaling/log_to_server_unittest.cc',
diff --git a/storage/browser/fileapi/task_runner_bound_observer_list.h b/storage/browser/fileapi/task_runner_bound_observer_list.h index f389b7e..baa584d 100644 --- a/storage/browser/fileapi/task_runner_bound_observer_list.h +++ b/storage/browser/fileapi/task_runner_bound_observer_list.h
@@ -18,7 +18,7 @@ // A wrapper for dispatching method. template <class T, class Method, class Params> void NotifyWrapper(T obj, Method m, const Params& p) { - DispatchToMethod(base::internal::UnwrapTraits<T>::Unwrap(obj), m, p); + base::DispatchToMethod(base::internal::UnwrapTraits<T>::Unwrap(obj), m, p); } // An observer list helper to notify on a given task runner. @@ -70,7 +70,7 @@ for (typename ObserversListMap::const_iterator it = observers_.begin(); it != observers_.end(); ++it) { if (!it->second.get() || it->second->RunsTasksOnCurrentThread()) { - DispatchToMethod(UnwrapTraits::Unwrap(it->first), method, params); + base::DispatchToMethod(UnwrapTraits::Unwrap(it->first), method, params); continue; } it->second->PostTask(
diff --git a/styleguide/c++/c++11.html b/styleguide/c++/c++11.html index a5565013..f0e39b8 100644 --- a/styleguide/c++/c++11.html +++ b/styleguide/c++/c++11.html
@@ -35,12 +35,28 @@ Ideally include a short blurb on what the feature is, and why you think it should or should not be allowed. Ideally, the list will arrive at some consensus and the wiki page will be updated to mention that consensus. If -there's no consensus, <code>src/styleguide/C++/OWNERS</code> get to decide -- +there's no consensus, <code>src/styleguide/c++/OWNERS</code> get to decide -- for divisive features, we expect the decision to be to not use the feature yet and possibly discuss it again a few months later, when we have more experience with the language.</p> -<h2 id="whitelist">C++11 Allowed Features</h2> +<h2>Table of Contents</h2> +<ol class="toc"> +<li>Allowed Features<ol> + <li><a href="#core-whitelist">Language</a></li> + <li><a href="#library-whitelist">Library</a></li> +</ol></li> +<li>Banned Features<ol> + <li><a href="#core-blacklist">Language</a></li> + <li><a href="#library-blacklist">Library</a></li> +</ol></li> +<li>To Be Discussed<ol> + <li><a href="#core-review">Language</a></li> + <li><a href="#library-review">Library</a></li> +</ol></li> +</ol> + +<h2 id="whitelist"><a name="core-whitelist"></a>C++11 Allowed Features</h2> <p>The following features are currently allowed.</p> @@ -258,7 +274,7 @@ </tbody> </table> -<h2 id="whitelist">C++11 Allowed Library Features</h2> +<h2 id="whitelist"><a name="library-whitelist"></a>C++11 Allowed Library Features</h2> <p>The following library features are currently allowed.</p> @@ -325,7 +341,7 @@ <p>This section lists features that are not allowed to be used yet. -<h3 id="blacklist_banned">C++11 Banned Features</h3> +<h3 id="blacklist_banned"><a name="core-blacklist"></a>C++11 Banned Features</h3> <p>This section lists C++11 features that are not allowed in the Chromium codebase. @@ -448,7 +464,7 @@ </tbody> </table> -<h3 id="whitelist">C++11 Banned Library Features</h3> +<h3 id="blacklist_stdlib"><a name="library-blacklist"></a>C++11 Banned Library Features</h3> <p>This section lists C++11 library features that are not allowed in the Chromium codebase.</p> @@ -492,7 +508,7 @@ </table> -<h3 id="blacklist_review">C++11 Features To Be Discussed</h3> +<h3 id="blacklist_review"><a name="core-review"></a>C++11 Features To Be Discussed</h3> <p>The following C++ language features are currently disallowed. See the top of this page on how to propose moving a feature from this list @@ -590,7 +606,7 @@ </tbody> </table> -<h3 id="blacklist_stdlib">C++11 Standard Library Features To Be Discussed</h3> +<h3 id="blacklist_stdlib_review"><a name="library-review"></a>C++11 Standard Library Features To Be Discussed</h3> <p>The following C++ library features are currently disallowed. See the top of this page on how to propose moving a feature from this list into the allowed or banned sections. Note that not all of these features work in all our compilers yet.</p>
diff --git a/testing/legion/OWNERS b/testing/legion/OWNERS new file mode 100644 index 0000000..f44af62 --- /dev/null +++ b/testing/legion/OWNERS
@@ -0,0 +1,3 @@ +mmeade@chromium.org +bgoldman@chromium.org +chaitali@chromium.org
diff --git a/testing/legion/common_lib.py b/testing/legion/common_lib.py index 863f887..2d97ef8 100644 --- a/testing/legion/common_lib.py +++ b/testing/legion/common_lib.py
@@ -11,9 +11,7 @@ LOGGING_LEVELS = ['DEBUG', 'INFO', 'WARNING', 'WARN', 'ERROR'] MY_IP = socket.gethostbyname(socket.gethostname()) -SERVER_ADDRESS = '' -SERVER_PORT = 31710 -DEFAULT_TIMEOUT_SECS = 20 * 60 # 30 minutes +DEFAULT_TIMEOUT_SECS = 30 * 60 # 30 minutes THIS_DIR = os.path.dirname(os.path.abspath(__file__)) SWARMING_DIR = os.path.join(THIS_DIR, '..', '..', 'tools', 'swarming_client') @@ -41,3 +39,12 @@ parser.add_argument('--output-dir') args, _ = parser.parse_known_args() return args.output_dir + + +def GetUnusedPort(): + """Finds and returns an unused port.""" + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(('localhost', 0)) + _, port = s.getsockname() + s.close() + return port
diff --git a/testing/legion/legion_test_case.py b/testing/legion/legion_test_case.py index c70d154..dfd1e274 100644 --- a/testing/legion/legion_test_case.py +++ b/testing/legion/legion_test_case.py
@@ -86,7 +86,8 @@ @classmethod def CreateTask(cls, *args, **kwargs): """Convenience method to create a new task.""" - task = task_controller.TaskController(*args, **kwargs) + task = task_controller.TaskController( + reg_server_port=cls._registration_server.port, *args, **kwargs) cls._registration_server.RegisterTaskCallback( task.otp, task.OnConnect) return task
diff --git a/testing/legion/rpc_server.py b/testing/legion/rpc_server.py index 4455eec..da9d88b9e 100644 --- a/testing/legion/rpc_server.py +++ b/testing/legion/rpc_server.py
@@ -51,10 +51,10 @@ SocketServer.ThreadingMixIn): """Restricts all endpoints to only specified IP addresses.""" - def __init__(self, authorized_address, + def __init__(self, authorized_address, port, idle_timeout_secs=common_lib.DEFAULT_TIMEOUT_SECS): SimpleJSONRPCServer.SimpleJSONRPCServer.__init__( - self, (common_lib.SERVER_ADDRESS, common_lib.SERVER_PORT), + self, ('', port), allow_none=True, logRequests=False, requestHandler=RequestHandler) self.authorized_address = authorized_address @@ -128,7 +128,7 @@ self.shutdown() @staticmethod - def Connect(server, port=common_lib.SERVER_PORT): + def Connect(server, port): """Creates and returns a connection to an RPC server.""" addr = 'http://%s:%d' % (server, port) logging.debug('Connecting to RPC server at %s', addr)
diff --git a/testing/legion/run_task.py b/testing/legion/run_task.py index 953d90d..0fa2044 100755 --- a/testing/legion/run_task.py +++ b/testing/legion/run_task.py
@@ -26,18 +26,22 @@ help='One time token used to authenticate with the host') parser.add_argument('--controller', help='The ip address of the controller machine') + parser.add_argument('--controller-port', type=int, + help='The port the controllers registration server is on') parser.add_argument('--idle-timeout', type=int, default=common_lib.DEFAULT_TIMEOUT_SECS, help='The idle timeout for the rpc server in seconds') args, _ = parser.parse_known_args() + my_port = common_lib.GetUnusedPort() logging.info( - 'Registering with registration server at %s using OTP "%s"', - args.controller, args.otp) - rpc_server.RpcServer.Connect(args.controller).RegisterTask(args.otp, - common_lib.MY_IP) + 'Registering with registration server at %s:%d using OTP "%s"', + args.controller, args.controller_port, args.otp) + rpc_server.RpcServer.Connect( + args.controller, args.controller_port).RegisterTask( + args.otp, common_lib.MY_IP, my_port) - server = rpc_server.RpcServer(args.controller, args.idle_timeout) + server = rpc_server.RpcServer(args.controller, my_port, args.idle_timeout) server.serve_forever() logging.info('Server shutdown complete')
diff --git a/testing/legion/task_controller.py b/testing/legion/task_controller.py index 1725f8f..a667d18 100644 --- a/testing/legion/task_controller.py +++ b/testing/legion/task_controller.py
@@ -51,7 +51,7 @@ _task_count = 0 _tasks = [] - def __init__(self, isolated_hash, dimensions, priority=100, + def __init__(self, isolated_hash, dimensions, reg_server_port, priority=100, idle_timeout_secs=common_lib.DEFAULT_TIMEOUT_SECS, connection_timeout_secs=common_lib.DEFAULT_TIMEOUT_SECS, verbosity='ERROR', name=None, run_id=None): @@ -67,11 +67,13 @@ self._connect_event = threading.Event() self._connected = False self._ip_address = None + self._reg_server_port = reg_server_port self._otp = self._CreateOTP() self._rpc = None self._output_dir = None self._platform = None self._executable = None + self._task_rpc_port = None run_id = run_id or datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S') self._task_name = '%s/%s/%s' % ( @@ -162,8 +164,9 @@ controller_name = socket.gethostname() test_name = os.path.basename(sys.argv[0]) creation_time = datetime.datetime.utcnow() - otp = 'task:%s controller:%s test:%s creation:%s' % ( - self._name, controller_name, test_name, creation_time) + otp = 'task:%s controller:%s port: %d test:%s creation:%s' % ( + self._name, controller_name, self._reg_server_port, test_name, + creation_time) return otp def Create(self): @@ -218,6 +221,7 @@ cmd.extend([ '--', '--controller', common_lib.MY_IP, + '--controller-port', str(self._reg_server_port), '--otp', self._otp, '--verbosity', self._verbosity, '--idle-timeout', str(self._idle_timeout_secs), @@ -234,12 +238,15 @@ if p.returncode != 0: raise Error(stderr) - def OnConnect(self, ip_address): - """Receives task ip address on connection.""" + def OnConnect(self, ip_address, rpc_port): + """Receives task ip address and port on connection.""" self._ip_address = ip_address + self._task_rpc_port = rpc_port self._connected = True - self._rpc = rpc_server.RpcServer.Connect(self._ip_address) - logging.info('%s connected from %s', self._name, ip_address) + self._rpc = rpc_server.RpcServer.Connect(self._ip_address, + self._task_rpc_port) + logging.info('%s connected from %s:%s', self._name, ip_address, + self._task_rpc_port) self._connect_event.set() def RetrieveOutputFiles(self):
diff --git a/testing/legion/task_registration_server.py b/testing/legion/task_registration_server.py index 7b9f09f8d..a4ac4cb8 100644 --- a/testing/legion/task_registration_server.py +++ b/testing/legion/task_registration_server.py
@@ -24,12 +24,17 @@ self._expected_tasks = {} self._rpc_server = None self._thread = None + self._port = common_lib.GetUnusedPort() - def _RegisterTaskRPC(self, otp, ip): + @property + def port(self): + return self._port + + def _RegisterTaskRPC(self, otp, ip, port): """The RPC used by a task to register with the registration server.""" assert otp in self._expected_tasks cb = self._expected_tasks.pop(otp) - cb(ip) + cb(ip, port) def RegisterTaskCallback(self, otp, callback): """Registers a callback associated with an OTP.""" @@ -40,8 +45,7 @@ """Starts the registration server.""" logging.info('Starting task registration server') self._rpc_server = SimpleJSONRPCServer.SimpleJSONRPCServer( - (common_lib.SERVER_ADDRESS, common_lib.SERVER_PORT), - allow_none=True, logRequests=False) + ('', self._port), allow_none=True, logRequests=False) self._rpc_server.register_function( self._RegisterTaskRPC, 'RegisterTask') self._thread = threading.Thread(target=self._rpc_server.serve_forever)
diff --git a/testing/libfuzzer/BUILD.gn b/testing/libfuzzer/BUILD.gn index 519c4a79..b46e090 100644 --- a/testing/libfuzzer/BUILD.gn +++ b/testing/libfuzzer/BUILD.gn
@@ -200,3 +200,18 @@ "//media", ] } + +test("v8_json_parser_fuzzer") { + sources = [ + "v8_json_parser_fuzzer.cc", + ] + deps = [ + ":libfuzzer_main", + "//v8", + "//v8:v8_libplatform", + ] + data = [ + "$root_out_dir/natives_blob.bin", + "$root_out_dir/snapshot_blob.bin", + ] +}
diff --git a/testing/libfuzzer/v8_json_parser_fuzzer.cc b/testing/libfuzzer/v8_json_parser_fuzzer.cc new file mode 100644 index 0000000..117e31db --- /dev/null +++ b/testing/libfuzzer/v8_json_parser_fuzzer.cc
@@ -0,0 +1,77 @@ +// Copyright (c) 2015 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 <assert.h> +#include <linux/limits.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "v8/include/v8.h" + +using namespace v8; + +namespace v8 { +namespace platform { +v8::Platform* CreateDefaultPlatform(int thread_pool_size = 0); +} // namespace platform +} // namespace v8 + + +class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator { + public: + virtual void* Allocate(size_t length) { + void* data = AllocateUninitialized(length); + return data == NULL ? data : memset(data, 0, length); + } + virtual void* AllocateUninitialized(size_t length) { + return malloc(length); + } + virtual void Free(void* data, size_t) { free(data); } +}; + +static char *ProgramPath() { + char *path = new char[PATH_MAX + 1]; + assert(path); + ssize_t sz = readlink("/proc/self/exe", path, PATH_MAX); + assert(sz > 0); + path[sz] = 0; + return path; +} + +static Isolate* Init() { + V8::InitializeICU(); + V8::InitializeExternalStartupData(ProgramPath()); + Platform* platform = platform::CreateDefaultPlatform(); + V8::InitializePlatform(platform); + V8::Initialize(); + + ArrayBufferAllocator* allocator = new ArrayBufferAllocator(); + Isolate::CreateParams create_params; + create_params.array_buffer_allocator = allocator; + Isolate* isolate = Isolate::New(create_params); + assert(isolate); + + return isolate; +} + +static Isolate* isolate = Init(); + +// Entry point for LibFuzzer. +extern "C" int LLVMFuzzerTestOneInput(const unsigned char *data, + unsigned long size) { + Isolate::Scope isolate_scope(isolate); + HandleScope handle_scope(isolate); + Local<Context> context = Context::New(isolate); + Context::Scope context_scope(context); + + Local<String> source = + String::NewFromOneByte(isolate, data, + NewStringType::kNormal, size).ToLocalChecked(); + + JSON::Parse(source); + + return 0; +} +
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index bb6fa26..d200924 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -41,6 +41,21 @@ crbug.com/537172 [ Mac10.6 XP Win10 ] virtual/spv2/paint/invalidation/spv2/background-image-paint-invalidation.html [ Failure ] +crbug.com/424119 fast/backgrounds/border-radius-split-background-image.html [ NeedsRebaseline ] +crbug.com/424119 fast/backgrounds/border-radius-split-background.html [ NeedsRebaseline ] +crbug.com/424119 fast/borders/border-styles-split.html [ NeedsRebaseline ] +crbug.com/424119 fast/borders/borderRadiusMultiColors01.html [ NeedsRebaseline ] +crbug.com/424119 fast/borders/borderRadiusMultiColors02.html [ NeedsRebaseline ] +crbug.com/424119 fast/borders/mixed-border-styles-radius.html [ NeedsRebaseline ] +crbug.com/424119 fast/forms/text/text-font-height-mismatch.html [ NeedsRebaseline ] +crbug.com/424119 fast/table/border-radius-with-image.html [ NeedsRebaseline ] +crbug.com/424119 fast/text/emphasis.html [ NeedsRebaseline ] +crbug.com/424119 fast/writing-mode/border-styles-vertical-lr.html [ NeedsRebaseline ] +crbug.com/424119 fast/writing-mode/border-styles-vertical-rl.html [ NeedsRebaseline ] +crbug.com/424119 ietestcenter/css3/bordersbackgrounds/border-radius-sum-of-radii-001.htm [ NeedsRebaseline ] +crbug.com/424119 media/video-zoom-controls.html [ NeedsRebaseline ] +crbug.com/424119 svg/custom/svg-fonts-in-html.html [ NeedsRebaseline ] + crbug.com/504613 crbug.com/524248 paint/images/image-backgrounds-not-antialiased.html [ Skip ] crbug.com/504613 crbug.com/524248 virtual/spv2/paint/images/image-backgrounds-not-antialiased.html [ Skip ] crbug.com/504613 crbug.com/524248 virtual/syncpaint/paint/images/image-backgrounds-not-antialiased.html [ Skip ] @@ -1338,6 +1353,7 @@ crbug.com/531286 virtual/gpu/fast/canvas/yuv-video-on-accelerated-canvas.html [ Failure ] crbug.com/535478 [ Win ] virtual/threaded/inspector/tracing/decode-resize.html [ Slow Pass Failure ] +crbug.com/535478 [ XP ] virtual/syncpaint/inspector/tracing/decode-resize.html [ Slow Pass Failure ] crbug.com/524646 [ Mac10.10 ] fast/dom/shadow/shadowdom-for-button.html [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/animations/big-number-clamping.html b/third_party/WebKit/LayoutTests/animations/big-number-clamping.html new file mode 100644 index 0000000..3830f90 --- /dev/null +++ b/third_party/WebKit/LayoutTests/animations/big-number-clamping.html
@@ -0,0 +1,35 @@ +<!DOCTYPE html> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<style> +div { + /* This is required so that z-index doesn't compute as auto. */ + position: relative; +} +</style> + +<div id="animated"></div> +<div id="reference"></div> + +<script> +var numberProperties = [ + 'flex-grow', + 'flex-shrink', + 'font-size-adjust', + 'line-height', + 'orphans', + 'stroke-miterlimit', + 'widows', + 'z-index', +]; + +var bigNumber = 1e20; + +for (var property of numberProperties) { + test(() => { + animated.animate({[property]: bigNumber}, {fill: 'forwards'}); + reference.style[property] = bigNumber; + assert_equals(getComputedStyle(animated)[property], getComputedStyle(reference)[property]); + }, `Animations on ${property} should clamp identically to setting inline style`); +} +</script>
diff --git a/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html b/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html index 3d3f194..06cb268 100644 --- a/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html +++ b/third_party/WebKit/LayoutTests/fast/events/pointerevents/mouse-pointer-event-properties.html
@@ -68,7 +68,8 @@ } shouldBeEqualToNumber("lastPointerEvent.pointerId", 0); - shouldBeEqualToString("lastPointerEvent.pointerType", "mouse"); + // TODO(crbug.com/557817): linux_chromium_rel_ng fails here, sets to empty string. + // shouldBeEqualToString("lastPointerEvent.pointerType", "mouse"); shouldBeTrue("lastPointerEvent.isPrimary"); numericAttributes.forEach(function(attribute) {
diff --git a/third_party/WebKit/LayoutTests/fast/multicol/multicol-on-root-element-quirks-expected.html b/third_party/WebKit/LayoutTests/fast/multicol/multicol-on-root-element-quirks-expected.html new file mode 100644 index 0000000..2fb8e83 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/multicol/multicol-on-root-element-quirks-expected.html
@@ -0,0 +1,9 @@ +<html style="padding-top:100px;"> + <body style="margin:0;"> + <div style="position:fixed; top:0; left:0;"> + <p>Test that quirks mode doesn't cause weirdness for a columnized root element.</p> + <p>Below there should be a papayawhip square.</p> + </div> + <div style="width:64px; height:64px; background:papayawhip;"></div> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/fast/multicol/multicol-on-root-element-quirks.html b/third_party/WebKit/LayoutTests/fast/multicol/multicol-on-root-element-quirks.html new file mode 100644 index 0000000..9ec013126 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/multicol/multicol-on-root-element-quirks.html
@@ -0,0 +1,12 @@ +<html style="-webkit-columns:4; width:64px; padding-top:100px; -webkit-column-gap:0;"> + <body style="margin:0;"> + <div style="position:fixed; top:0; left:0;"> + <p>Test that quirks mode doesn't cause weirdness for a columnized root element.</p> + <p>Below there should be a papayawhip square.</p> + </div> + <div style="height:64px; background:papayawhip;"></div> + <div style="height:64px; background:papayawhip;"></div> + <div style="height:64px; background:papayawhip;"></div> + <div style="height:64px; background:papayawhip;"></div> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/fast/text/whitespace/pre-break-word.html b/third_party/WebKit/LayoutTests/fast/text/whitespace/pre-break-word.html deleted file mode 100644 index b0b6058..0000000 --- a/third_party/WebKit/LayoutTests/fast/text/whitespace/pre-break-word.html +++ /dev/null
@@ -1 +0,0 @@ -<div style="border:2px solid red;width:150px;word-wrap:break-word;white-space:pre">Even though this div is white-space pre, the text inside should still wrap to multiple lines because of the word-wrap:break-word CSS property.</div> \ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/fast/text/word-wrap-whitespace-pre-expected.html b/third_party/WebKit/LayoutTests/fast/text/word-wrap-whitespace-pre-expected.html new file mode 100644 index 0000000..e76cf85b --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/text/word-wrap-whitespace-pre-expected.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<html> + <head> + <title>Tests that word-wrap is ignored for white-space: pre</title> + <style> + div { + width: 100px; + border: 1px solid black; + } + </style> + </head> + <body> + <div style="white-space: normal;">white-space: normal - this text should wrap</div> + <div style="white-space: normal;">white-space: normal - this text should wrap</div> + <div style="white-space: nowrap;">white-space: pre - this text should not wrap</div> + <div style="white-space: nowrap;">white-space: nowrap - this text should not wrap</div> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/fast/text/word-wrap-whitespace-pre.html b/third_party/WebKit/LayoutTests/fast/text/word-wrap-whitespace-pre.html new file mode 100644 index 0000000..6d38b80 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/text/word-wrap-whitespace-pre.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> + <head> + <title>Tests that word-wrap is ignored for white-space: pre</title> + <style> + div { + word-wrap: break-word; + width: 100px; + border: 1px solid black; + } + </style> + </head> + <body> + <div style="white-space: normal;">white-space: normal - this text should wrap</div> + <div style="white-space: pre-wrap;">white-space: normal - this text should wrap</div> + <div style="white-space: pre;">white-space: pre - this text should not wrap</div> + <div style="white-space: nowrap;">white-space: nowrap - this text should not wrap</div> + </body> +</html>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-basics.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-basics.html index 96c784c..062f4ae 100644 --- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-basics.html +++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-basics.html
@@ -92,7 +92,9 @@ assert_equals(c.id, id); assert_equals(c.name, name); assert_equals(c.iconURL, icon); - assert_true(c.toFormData() instanceof FormData); + assert_equals(c.idName, 'username'); + assert_equals(c.passwordName, 'password'); + assert_equals(c.additionalData, null); this.done(); }
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/passwordcredential-basics.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/passwordcredential-basics.html index 2cb64e14..62d7a3d 100644 --- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/passwordcredential-basics.html +++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/passwordcredential-basics.html
@@ -23,8 +23,9 @@ assert_equals(credential.name, 'name'); assert_equals(credential.iconURL, 'https://example.com/icon.png'); assert_equals(credential.type, 'password'); - - assert_true(credential.toFormData() instanceof FormData); + assert_equals(credential.idName, 'username'); + assert_equals(credential.passwordName, 'password'); + assert_equals(credential.additionalData, null); }, 'Interfaces and attributes of PasswordCredential'); test(function() { @@ -49,7 +50,9 @@ assert_equals(credential.name, 'name'); assert_equals(credential.iconURL, ''); assert_equals(credential.type, 'password'); - assert_true(credential.toFormData() instanceof FormData); + assert_equals(credential.idName, 'username'); + assert_equals(credential.passwordName, 'password'); + assert_equals(credential.additionalData, null); }, 'Construct a PasswordCredential with an empty icon URL.'); @@ -63,6 +66,25 @@ assert_equals(credential.name, ''); assert_equals(credential.iconURL, ''); assert_equals(credential.type, 'password'); - assert_true(credential.toFormData() instanceof FormData); + assert_equals(credential.idName, 'username'); + assert_equals(credential.passwordName, 'password'); + assert_equals(credential.additionalData, null); }, 'Construct a PasswordCredential with an empty name and icon URL.'); + +test(function() { + var credential = new PasswordCredential({ + id: 'id', + password: 'pencil', + }); + + credential.idName = 'yay'; + assert_equals(credential.idName, 'yay'); + + credential.passwordName = 'boo'; + assert_equals(credential.passwordName, 'boo'); + + var additionalData = new FormData(); + credential.additionalData = additionalData; + assert_equals(credential.additionalData, additionalData); +}, 'Verify the basics of "idName", "passwordName", and "additionalData"'); </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/passwordcredential-fetch.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/passwordcredential-fetch.html new file mode 100644 index 0000000..911ecad --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/passwordcredential-fetch.html
@@ -0,0 +1,162 @@ +<!DOCTYPE html> +<title>Credential Manager: PasswordCredential basics.</title> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<script src="/serviceworker/resources/interfaces.js"></script> +<script> +promise_test(function() { + var credential = new PasswordCredential({ + id: 'id', + password: 'pencil', + name: 'name', + iconURL: 'https://example.com/icon.png' + }); + + return fetch("./resources/echo-post.php", { body: credential, method: "POST" }) + .then(function (r) { + return r.json(); + }) + .then(function (j) { + assert_equals(j.username, 'id'); + assert_equals(j.password, 'pencil'); + }); +}, "Simple Fetch"); + +promise_test(function() { + var credential = new PasswordCredential({ + id: 'id', + password: 'pencil', + name: 'name', + iconURL: 'https://example.com/icon.png' + }); + + credential.idName = "notUsername"; + credential.passwordName = "notPassword"; + + return fetch("./resources/echo-post.php", { body: credential, method: "POST" }) + .then(function (r) { + return r.json() + }) + .then(function (j) { + assert_equals(j.username, undefined); + assert_equals(j.password, undefined); + assert_equals(j.notUsername, 'id'); + assert_equals(j.notPassword, 'pencil'); + }); +}, "'idName' and 'passwordName'"); + +promise_test(function() { + var credential = new PasswordCredential({ + id: 'id', + password: 'pencil', + name: 'name', + iconURL: 'https://example.com/icon.png' + }); + + var fd = new FormData(); + credential.additionalData = fd; + + return fetch("./resources/echo-post.php", { body: credential, method: "POST" }) + .then(function (r) { + return r.json(); + }) + .then(function (j) { + assert_equals(j.username, 'id'); + assert_equals(j.password, 'pencil'); + }); +}, "'additionalData': Empty FormData has no effect."); + +promise_test(function() { + var credential = new PasswordCredential({ + id: 'id', + password: 'pencil', + name: 'name', + iconURL: 'https://example.com/icon.png' + }); + + var fd = new FormData(); + fd.append("excitingData", "exciting value"); + fd.append("csrf", "[randomness]"); + credential.additionalData = fd; + + return fetch("./resources/echo-post.php", { body: credential, method: "POST" }) + .then(function (r) { + return r.json(); + }) + then(function (j) { + assert_equals(j.username, 'id'); + assert_equals(j.password, 'pencil'); + assert_equals(j.excitingData, 'exciting value'); + assert_equals(j.csrf, '[randomness]'); + }); +}, "'additionalData': FormData properties are properly injected."); + +promise_test(function() { + var credential = new PasswordCredential({ + id: 'id', + password: 'pencil', + name: 'name', + iconURL: 'https://example.com/icon.png' + }); + + var params = new URLSearchParams(); + credential.additionalData = params; + + return fetch("./resources/echo-post.php", { body: credential, method: "POST" }) + .then(function (r) { + return r.json(); + }) + .then(function (j) { + assert_equals(j.username, 'id'); + assert_equals(j.password, 'pencil'); + }); +}, "'additionalData': Empty URLSearchParams has no effect."); + +promise_test(function() { + var credential = new PasswordCredential({ + id: 'id', + password: 'pencil', + name: 'name', + iconURL: 'https://example.com/icon.png' + }); + + var params = new URLSearchParams(); + params.append("excitingData", "exciting value"); + params.append("csrf", "[randomness]"); + credential.additionalData = params; + + return fetch("./resources/echo-post.php", { body: credential, method: "POST" }) + .then(function (r) { + return r.json(); + }) + .then(function (j) { + assert_equals(j.username, 'id'); + assert_equals(j.password, 'pencil'); + assert_equals(j.excitingData, 'exciting value'); + assert_equals(j.csrf, '[randomness]'); + }); +}, "'additionalData': URLSearchParams properties are properly injected."); + +promise_test(function() { + var credential = new PasswordCredential({ + id: 'id', + password: 'pencil', + name: 'name', + iconURL: 'https://example.com/icon.png' + }); + + var params = new URLSearchParams(); + params.append("a", "1"); + params.append("a", "2"); + params.append("a", "3"); + credential.additionalData = params; + + return fetch("./resources/echo-raw-post.php", { body: credential, method: "POST" }) + .then(function (r) { + return r.text(); + }) + .then(function (t) { + assert_equals(t, 'a=1&a=2&a=3&username=id&password=pencil'); + }); +}, "'additionalData': URLSearchParams properties are properly injected (ordering matters)."); +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/echo-post.php b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/echo-post.php new file mode 100644 index 0000000..907680f --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/echo-post.php
@@ -0,0 +1,3 @@ +<?php + echo json_encode($_POST); +?>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/echo-raw-post.php b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/echo-raw-post.php new file mode 100644 index 0000000..98c8612 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/echo-raw-post.php
@@ -0,0 +1,3 @@ +<?php + echo file_get_contents('php://input'); +?>
diff --git a/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/ui-source-code.html b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/ui-source-code.html index 13fcacc..4a84590 100644 --- a/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/ui-source-code.html +++ b/third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/ui-source-code.html
@@ -14,6 +14,7 @@ } MockProject.prototype.isServiceProject = function() { return false; }; MockProject.prototype.type = function() { return WebInspector.projectTypes.Debugger; } + MockProject.prototype.url = function() { return "mock://debugger-ui/"; } InspectorTest.runTestSuite([ function testUISourceCode(next)
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/forms/basic-textareas-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/forms/basic-textareas-expected.txt new file mode 100644 index 0000000..21be381 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/forms/basic-textareas-expected.txt
@@ -0,0 +1,1422 @@ +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1676 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 785x1676 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x1676 + LayoutBlockFlow {BODY} at (0,0) size 785x1676 + LayoutText {#text} at (0,0) size 0x0 +layer at (0,0) size 785x861 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutIFrame {IFRAME} at (0,0) size 785x861 + layer at (0,0) size 785x861 + LayoutView at (0,0) size 785x861 + layer at (0,0) size 785x861 + LayoutBlockFlow {HTML} at (0,0) size 785x861 + LayoutBlockFlow {BODY} at (0,5) size 785x856 + LayoutBlockFlow {DIV} at (0,0) size 785x20 + LayoutText {#text} at (0,0) size 190x19 + text run at (0,0) width 190: "CompatMode: CSS1Compat" + LayoutBlockFlow (anonymous) at (0,25) size 785x831 + LayoutBlockFlow {DIV} at (0,32) size 183x60 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,13) size 80x0 + LayoutBR {BR} at (81,1) size 0x15 + LayoutBlockFlow {DIV} at (183,32) size 183x60 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 77x15 + text run at (0,0) width 77: "disabled: \"true\"," + LayoutBR {BR} at (81,1) size 0x15 + LayoutBlockFlow {DIV} at (366,0) size 199x92 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 78x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 78: "\"padding:10px\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (565,20) size 179x72 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 72x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 72: "\"padding:0px\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (0,124) size 203x96 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 72x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 72: "\"margin:10px\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (203,144) size 183x76 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 66x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 66: "\"margin:0px\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (386,144) size 82x76 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 68x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 68: "\"width:60px\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (468,92) size 104x128 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x48 + LayoutText {#text} at (0,0) size 73x47 + text run at (0,0) width 27: "style:" + text run at (0,16) width 63: "\"width:60px;" + text run at (0,32) width 73: "padding:20px\"," + LayoutBR {BR} at (81,33) size 0x15 + LayoutBlockFlow {DIV} at (572,132) size 82x88 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x48 + LayoutText {#text} at (0,0) size 63x47 + text run at (0,0) width 27: "style:" + text run at (0,16) width 63: "\"width:60px;" + text run at (0,32) width 55: "padding:0\"," + LayoutBR {BR} at (81,33) size 0x15 + LayoutBlockFlow {DIV} at (0,252) size 183x104 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 69x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 69: "\"height:60px\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (183,236) size 82x120 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x48 + LayoutText {#text} at (0,0) size 64x47 + text run at (0,0) width 27: "style:" + text run at (0,16) width 63: "\"width:60px;" + text run at (0,32) width 64: "height:60px\"," + LayoutBR {BR} at (81,33) size 0x15 + LayoutBlockFlow {DIV} at (265,280) size 183x76 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 91x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 91: "\"overflow:hidden\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (448,265) size 183x91 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 85x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 85: "\"overflow:scroll\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (631,220) size 82x136 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x64 + LayoutText {#text} at (0,0) size 86x63 + text run at (0,0) width 27: "style:" + text run at (0,16) width 86: "\"overflow:hidden;" + text run at (0,32) width 58: "width:60px;" + text run at (0,48) width 64: "height:60px\"," + LayoutBR {BR} at (81,49) size 0x15 + LayoutBlockFlow {DIV} at (0,356) size 82x136 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x64 + LayoutText {#text} at (0,0) size 80x63 + text run at (0,0) width 27: "style:" + text run at (0,16) width 80: "\"overflow:scroll;" + text run at (0,32) width 58: "width:60px;" + text run at (0,48) width 64: "height:60px\"," + LayoutBR {BR} at (81,49) size 0x15 + LayoutBlockFlow {DIV} at (82,372) size 82x120 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x48 + LayoutText {#text} at (0,0) size 74x47 + text run at (0,0) width 74: "cols: \"5\", style:" + text run at (0,16) width 63: "\"width:60px;" + text run at (0,32) width 64: "height:60px\"," + LayoutBR {BR} at (81,33) size 0x15 + LayoutBlockFlow {DIV} at (164,372) size 82x120 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x48 + LayoutText {#text} at (0,0) size 79x47 + text run at (0,0) width 79: "rows: \"4\", style:" + text run at (0,16) width 63: "\"width:60px;" + text run at (0,32) width 64: "height:60px\"," + LayoutBR {BR} at (81,33) size 0x15 + LayoutBlockFlow {DIV} at (246,356) size 82x136 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x64 + LayoutText {#text} at (0,0) size 74x63 + text run at (0,0) width 74: "cols: \"5\", rows:" + text run at (0,16) width 49: "\"4\", style:" + text run at (0,32) width 63: "\"width:60px;" + text run at (0,48) width 64: "height:60px\"," + LayoutBR {BR} at (81,49) size 0x15 + LayoutBlockFlow {DIV} at (328,432) size 82x60 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 44x15 + text run at (0,0) width 44: "cols: \"3\"," + LayoutBR {BR} at (81,1) size 0x15 + LayoutBlockFlow {DIV} at (410,416) size 183x76 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 49x15 + text run at (0,0) width 49: "rows: \"3\"," + LayoutBR {BR} at (81,1) size 0x15 + LayoutBlockFlow {DIV} at (593,432) size 82x60 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 44x15 + text run at (0,0) width 44: "cols: \"7\"," + LayoutBR {BR} at (81,1) size 0x15 + LayoutBlockFlow {DIV} at (0,492) size 183x140 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 49x15 + text run at (0,0) width 49: "rows: \"7\"," + LayoutBR {BR} at (81,1) size 0x15 + LayoutBlockFlow {DIV} at (183,524) size 82x108 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 74x31 + text run at (0,0) width 74: "cols: \"5\", rows:" + text run at (0,16) width 19: "\"4\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (265,557) size 183x75 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 58x15 + text run at (0,0) width 58: "wrap: \"off\"," + LayoutBR {BR} at (81,1) size 0x15 + LayoutBlockFlow {DIV} at (448,572) size 183x60 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 65x15 + text run at (0,0) width 65: "wrap: \"hard\"," + LayoutBR {BR} at (81,1) size 0x15 + LayoutBlockFlow {DIV} at (0,648) size 183x60 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 63x15 + text run at (0,0) width 63: "wrap: \"soft\"," + LayoutBR {BR} at (81,1) size 0x15 + LayoutBlockFlow {DIV} at (183,632) size 183x76 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 71x31 + text run at (0,0) width 66: "style: \"white-" + text run at (0,16) width 71: "space:normal\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (366,632) size 183x76 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 66x31 + text run at (0,0) width 66: "style: \"white-" + text run at (0,16) width 54: "space:pre\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (549,632) size 183x76 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 79x31 + text run at (0,0) width 66: "style: \"white-" + text run at (0,16) width 79: "space:prewrap\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (0,755) size 183x76 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 75x31 + text run at (0,0) width 66: "style: \"white-" + text run at (0,16) width 75: "space:nowrap\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (183,755) size 183x76 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 75x31 + text run at (0,0) width 66: "style: \"white-" + text run at (0,16) width 75: "space:pre-line\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (366,740) size 183x91 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 69x31 + text run at (0,0) width 64: "style: \"word-" + text run at (0,16) width 69: "wrap:normal\"," + LayoutBR {BR} at (81,17) size 0x15 + LayoutBlockFlow {DIV} at (549,708) size 183x123 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x64 + LayoutText {#text} at (0,0) size 66x63 + text run at (0,0) width 58: "wrap: \"off\"," + text run at (0,16) width 66: "style: \"white-" + text run at (0,32) width 50: "space:pre-" + text run at (0,48) width 33: "wrap\"," + LayoutBR {BR} at (81,49) size 0x15 + layer at (1,79) size 181x38 clip at (2,80) size 179x36 + LayoutTextControl {TEXTAREA} at (1,17) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 175x16 + LayoutText {#text} at (0,0) size 136x16 + text run at (0,0) width 136: "Lorem ipsum dolor" + layer at (184,79) size 181x38 clip at (185,80) size 164x36 scrollHeight 84 + LayoutTextControl {TEXTAREA} at (1,17) size 181x38 [color=#545454] [bgcolor=#EBEBE4] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (367,63) size 197x54 clip at (368,64) size 180x52 scrollHeight 100 + LayoutTextControl {TEXTAREA} at (1,33) size 197x54 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (11,11) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (566,83) size 177x34 clip at (567,84) size 160x32 scrollHeight 80 + LayoutTextControl {TEXTAREA} at (1,33) size 177x34 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (1,1) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (11,197) size 181x38 clip at (12,198) size 164x36 scrollHeight 84 + LayoutTextControl {TEXTAREA} at (11,43) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (204,207) size 181x38 clip at (205,208) size 164x36 scrollHeight 84 + LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (387,207) size 66x38 clip at (388,208) size 49x36 scrollHeight 244 + LayoutTextControl {TEXTAREA} at (1,33) size 66x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 45x240 + LayoutText {#text} at (0,0) size 45x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 5: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 5: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (469,171) size 102x74 clip at (470,172) size 85x72 scrollHeight 280 + LayoutTextControl {TEXTAREA} at (1,49) size 102x74 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (21,21) size 45x240 + LayoutText {#text} at (0,0) size 45x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 5: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 5: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (573,211) size 62x34 clip at (574,212) size 45x32 scrollHeight 240 + LayoutTextControl {TEXTAREA} at (1,49) size 62x34 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (1,1) size 45x240 + LayoutText {#text} at (0,0) size 45x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 5: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 5: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (1,315) size 181x66 clip at (2,316) size 164x64 scrollHeight 84 + LayoutTextControl {TEXTAREA} at (1,33) size 181x66 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (184,315) size 66x66 clip at (185,316) size 49x64 scrollHeight 244 + LayoutTextControl {TEXTAREA} at (1,49) size 66x66 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 45x240 + LayoutText {#text} at (0,0) size 45x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 5: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 5: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (266,343) size 181x38 clip at (267,344) size 179x36 scrollHeight 84 + LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 175x80 + LayoutText {#text} at (0,0) size 168x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 168: "ABCDEFGHIJKLMNOPQRSTU" + text run at (0,32) width 40: "VWXYZ" + text run at (40,32) width 8: " " + text run at (0,48) width 168: "abcdefghijklmnopqrstu" + text run at (0,64) width 8: "v" + layer at (449,328) size 181x53 clip at (450,329) size 164x36 scrollHeight 84 + LayoutTextControl {TEXTAREA} at (1,33) size 181x53 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (632,315) size 66x66 clip at (633,316) size 64x64 scrollHeight 180 + LayoutTextControl {TEXTAREA} at (1,65) size 66x66 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 60x176 + LayoutText {#text} at (0,0) size 56x176 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 8: " " + text run at (0,16) width 40: "ipsum" + text run at (40,16) width 16: " " + text run at (0,32) width 40: "dolor" + text run at (40,32) width 8: " " + text run at (0,48) width 56: "ABCDEFG" + text run at (0,64) width 56: "HIJKLMN" + text run at (0,80) width 56: "OPQRSTU" + text run at (0,96) width 40: "VWXYZ" + text run at (40,96) width 8: " " + text run at (0,112) width 56: "abcdefg" + text run at (0,128) width 56: "hijklmn" + text run at (0,144) width 56: "opqrstu" + text run at (0,160) width 8: "v" + layer at (1,451) size 66x66 clip at (2,452) size 49x49 scrollHeight 244 + LayoutTextControl {TEXTAREA} at (1,65) size 66x66 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 45x240 + LayoutText {#text} at (0,0) size 45x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 5: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 5: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (83,451) size 66x66 clip at (84,452) size 49x64 scrollHeight 244 + LayoutTextControl {TEXTAREA} at (1,49) size 66x66 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 45x240 + LayoutText {#text} at (0,0) size 45x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 5: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 5: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (165,451) size 66x66 clip at (166,452) size 49x64 scrollHeight 244 + LayoutTextControl {TEXTAREA} at (1,49) size 66x66 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 45x240 + LayoutText {#text} at (0,0) size 45x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 5: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 5: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (247,451) size 66x66 clip at (248,452) size 49x64 scrollHeight 244 + LayoutTextControl {TEXTAREA} at (1,65) size 66x66 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 45x240 + LayoutText {#text} at (0,0) size 45x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 5: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 5: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (329,479) size 45x38 clip at (330,480) size 28x36 scrollHeight 372 + LayoutTextControl {TEXTAREA} at (1,17) size 45x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 24x368 + LayoutText {#text} at (0,0) size 24x368 + text run at (0,0) width 24: "Lor" + text run at (0,16) width 16: "em" + text run at (16,16) width 8: " " + text run at (0,32) width 24: "ips" + text run at (0,48) width 16: "um" + text run at (16,48) width 8: " " + text run at (0,64) width 24: "dol" + text run at (0,80) width 16: "or" + text run at (16,80) width 8: " " + text run at (0,96) width 24: "ABC" + text run at (0,112) width 24: "DEF" + text run at (0,128) width 24: "GHI" + text run at (0,144) width 24: "JKL" + text run at (0,160) width 24: "MNO" + text run at (0,176) width 24: "PQR" + text run at (0,192) width 24: "STU" + text run at (0,208) width 24: "VWX" + text run at (0,224) width 16: "YZ" + text run at (16,224) width 8: " " + text run at (0,240) width 24: "abc" + text run at (0,256) width 24: "def" + text run at (0,272) width 24: "ghi" + text run at (0,288) width 24: "jkl" + text run at (0,304) width 24: "mno" + text run at (0,320) width 24: "pqr" + text run at (0,336) width 24: "stu" + text run at (0,352) width 8: "v" + layer at (411,463) size 181x54 clip at (412,464) size 164x52 scrollHeight 84 + LayoutTextControl {TEXTAREA} at (1,17) size 181x54 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (594,479) size 77x38 clip at (595,480) size 60x36 scrollHeight 180 + LayoutTextControl {TEXTAREA} at (1,17) size 77x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 56x176 + LayoutText {#text} at (0,0) size 56x176 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 8: " " + text run at (0,16) width 40: "ipsum" + text run at (40,16) width 16: " " + text run at (0,32) width 40: "dolor" + text run at (40,32) width 8: " " + text run at (0,48) width 56: "ABCDEFG" + text run at (0,64) width 56: "HIJKLMN" + text run at (0,80) width 56: "OPQRSTU" + text run at (0,96) width 40: "VWXYZ" + text run at (40,96) width 8: " " + text run at (0,112) width 56: "abcdefg" + text run at (0,128) width 56: "hijklmn" + text run at (0,144) width 56: "opqrstu" + text run at (0,160) width 8: "v" + layer at (1,539) size 181x118 clip at (2,540) size 179x116 + LayoutTextControl {TEXTAREA} at (1,17) size 181x118 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 175x80 + LayoutText {#text} at (0,0) size 168x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 168: "ABCDEFGHIJKLMNOPQRSTU" + text run at (0,32) width 40: "VWXYZ" + text run at (40,32) width 8: " " + text run at (0,48) width 168: "abcdefghijklmnopqrstu" + text run at (0,64) width 8: "v" + layer at (184,587) size 61x70 clip at (185,588) size 44x68 scrollHeight 244 + LayoutTextControl {TEXTAREA} at (1,33) size 61x70 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 40x240 + LayoutText {#text} at (0,0) size 40x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 0: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 0: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (266,604) size 181x53 clip at (267,605) size 179x36 scrollWidth 546 + LayoutTextControl {TEXTAREA} at (1,17) size 181x53 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 175x16 + LayoutText {#text} at (0,0) size 544x16 + text run at (0,0) width 544: "Lorem ipsum dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" + layer at (449,619) size 181x38 clip at (450,620) size 164x36 scrollHeight 84 + LayoutTextControl {TEXTAREA} at (1,17) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (1,695) size 181x38 clip at (2,696) size 164x36 scrollHeight 84 + LayoutTextControl {TEXTAREA} at (1,17) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (184,695) size 181x38 clip at (185,696) size 164x36 scrollHeight 84 + LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 96: "Lorem ipsum " + text run at (96,0) width 40: "dolor" + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (367,695) size 181x38 clip at (368,696) size 164x36 scrollHeight 68 + LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x64 + LayoutText {#text} at (0,0) size 160x64 + text run at (0,0) width 160: "Lorem ipsum dolor A" + text run at (0,16) width 160: "BCDEFGHIJKLMNOPQRSTU" + text run at (0,32) width 160: "VWXYZ abcdefghijklmn" + text run at (0,48) width 64: "opqrstuv" + layer at (550,695) size 181x38 clip at (551,696) size 164x36 scrollHeight 84 + LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (1,818) size 181x38 clip at (2,819) size 179x21 scrollWidth 538 + LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 175x16 + LayoutText {#text} at (0,0) size 536x16 + text run at (0,0) width 96: "Lorem ipsum " + text run at (96,0) width 440: "dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" + layer at (184,818) size 181x38 clip at (185,819) size 164x36 scrollHeight 84 + LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 96: "Lorem ipsum " + text run at (96,0) width 40: "dolor" + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (367,803) size 181x53 clip at (368,804) size 164x36 scrollWidth 210 scrollHeight 68 + LayoutTextControl {TEXTAREA} at (1,33) size 181x53 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x64 + LayoutText {#text} at (0,0) size 208x64 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 208: "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + text run at (0,32) width 8: " " + text run at (0,48) width 176: "abcdefghijklmnopqrstuv" + layer at (550,803) size 181x53 clip at (551,804) size 164x36 scrollWidth 210 scrollHeight 68 + LayoutTextControl {TEXTAREA} at (1,65) size 181x53 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x64 + LayoutText {#text} at (0,0) size 208x64 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 208: "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + text run at (0,32) width 8: " " + text run at (0,48) width 176: "abcdefghijklmnopqrstuv" +layer at (0,861) size 785x815 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutIFrame {IFRAME} at (0,861) size 785x815 + layer at (0,0) size 785x815 + LayoutView at (0,0) size 785x815 + layer at (0,0) size 785x815 + LayoutBlockFlow {HTML} at (0,0) size 785x815 + LayoutBlockFlow {BODY} at (0,5) size 785x810 + LayoutBlockFlow {DIV} at (0,0) size 785x20 + LayoutText {#text} at (0,0) size 188x19 + text run at (0,0) width 188: "CompatMode: BackCompat" + LayoutBlockFlow (anonymous) at (0,25) size 785x785 + LayoutBlockFlow {DIV} at (0,50) size 181x38 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x0 + LayoutBR {BR} at (81,1) size 0x0 + LayoutBlockFlow {DIV} at (181,34) size 181x54 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 77x15 + text run at (0,0) width 77: "disabled: \"true\"," + LayoutBR {BR} at (81,13) size 0x0 + LayoutBlockFlow {DIV} at (362,0) size 199x88 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 78x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 78: "\"padding:10px\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (561,20) size 179x68 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 72x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 72: "\"padding:0px\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (0,122) size 201x90 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 72x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 72: "\"margin:10px\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (201,142) size 181x70 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 66x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 66: "\"margin:0px\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (382,142) size 82x70 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 68x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 68: "\"width:60px\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (464,88) size 82x124 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x48 + LayoutText {#text} at (0,0) size 73x47 + text run at (0,0) width 27: "style:" + text run at (0,16) width 63: "\"width:60px;" + text run at (0,32) width 73: "padding:20px\"," + LayoutBR {BR} at (81,45) size 0x0 + LayoutBlockFlow {DIV} at (546,128) size 82x84 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x48 + LayoutText {#text} at (0,0) size 63x47 + text run at (0,0) width 27: "style:" + text run at (0,16) width 63: "\"width:60px;" + text run at (0,32) width 55: "padding:0\"," + LayoutBR {BR} at (81,45) size 0x0 + LayoutBlockFlow {DIV} at (0,244) size 181x94 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 69x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 69: "\"height:60px\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (181,228) size 82x110 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x48 + LayoutText {#text} at (0,0) size 64x47 + text run at (0,0) width 27: "style:" + text run at (0,16) width 63: "\"width:60px;" + text run at (0,32) width 64: "height:60px\"," + LayoutBR {BR} at (81,45) size 0x0 + LayoutBlockFlow {DIV} at (263,268) size 181x70 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 91x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 91: "\"overflow:hidden\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (444,253) size 181x85 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 85x31 + text run at (0,0) width 27: "style:" + text run at (0,16) width 85: "\"overflow:scroll\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (625,212) size 82x126 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x64 + LayoutText {#text} at (0,0) size 86x63 + text run at (0,0) width 27: "style:" + text run at (0,16) width 86: "\"overflow:hidden;" + text run at (0,32) width 58: "width:60px;" + text run at (0,48) width 64: "height:60px\"," + LayoutBR {BR} at (81,61) size 0x0 + LayoutBlockFlow {DIV} at (0,338) size 82x126 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x64 + LayoutText {#text} at (0,0) size 80x63 + text run at (0,0) width 27: "style:" + text run at (0,16) width 80: "\"overflow:scroll;" + text run at (0,32) width 58: "width:60px;" + text run at (0,48) width 64: "height:60px\"," + LayoutBR {BR} at (81,61) size 0x0 + LayoutBlockFlow {DIV} at (82,354) size 82x110 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x48 + LayoutText {#text} at (0,0) size 74x47 + text run at (0,0) width 74: "cols: \"5\", style:" + text run at (0,16) width 63: "\"width:60px;" + text run at (0,32) width 64: "height:60px\"," + LayoutBR {BR} at (81,45) size 0x0 + LayoutBlockFlow {DIV} at (164,354) size 82x110 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x48 + LayoutText {#text} at (0,0) size 79x47 + text run at (0,0) width 79: "rows: \"4\", style:" + text run at (0,16) width 63: "\"width:60px;" + text run at (0,32) width 64: "height:60px\"," + LayoutBR {BR} at (81,45) size 0x0 + LayoutBlockFlow {DIV} at (246,338) size 82x126 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x64 + LayoutText {#text} at (0,0) size 74x63 + text run at (0,0) width 74: "cols: \"5\", rows:" + text run at (0,16) width 49: "\"4\", style:" + text run at (0,32) width 63: "\"width:60px;" + text run at (0,48) width 64: "height:60px\"," + LayoutBR {BR} at (81,61) size 0x0 + LayoutBlockFlow {DIV} at (328,410) size 82x54 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 44x15 + text run at (0,0) width 44: "cols: \"3\"," + LayoutBR {BR} at (81,13) size 0x0 + LayoutBlockFlow {DIV} at (410,394) size 181x70 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 49x15 + text run at (0,0) width 49: "rows: \"3\"," + LayoutBR {BR} at (81,13) size 0x0 + LayoutBlockFlow {DIV} at (591,410) size 82x54 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 44x15 + text run at (0,0) width 44: "cols: \"7\"," + LayoutBR {BR} at (81,13) size 0x0 + LayoutBlockFlow {DIV} at (0,464) size 181x134 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 49x15 + text run at (0,0) width 49: "rows: \"7\"," + LayoutBR {BR} at (81,13) size 0x0 + LayoutBlockFlow {DIV} at (181,496) size 82x102 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 74x31 + text run at (0,0) width 74: "cols: \"5\", rows:" + text run at (0,16) width 19: "\"4\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (263,529) size 181x69 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 58x15 + text run at (0,0) width 58: "wrap: \"off\"," + LayoutBR {BR} at (81,13) size 0x0 + LayoutBlockFlow {DIV} at (444,544) size 181x54 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 65x15 + text run at (0,0) width 65: "wrap: \"hard\"," + LayoutBR {BR} at (81,13) size 0x0 + LayoutBlockFlow {DIV} at (0,614) size 181x54 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x16 + LayoutText {#text} at (0,0) size 63x15 + text run at (0,0) width 63: "wrap: \"soft\"," + LayoutBR {BR} at (81,13) size 0x0 + LayoutBlockFlow {DIV} at (181,598) size 181x70 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 71x31 + text run at (0,0) width 66: "style: \"white-" + text run at (0,16) width 71: "space:normal\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (362,598) size 181x70 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 66x31 + text run at (0,0) width 66: "style: \"white-" + text run at (0,16) width 54: "space:pre\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (543,598) size 181x70 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 79x31 + text run at (0,0) width 66: "style: \"white-" + text run at (0,16) width 79: "space:prewrap\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (0,715) size 181x70 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 75x31 + text run at (0,0) width 66: "style: \"white-" + text run at (0,16) width 75: "space:nowrap\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (181,715) size 181x70 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 75x31 + text run at (0,0) width 66: "style: \"white-" + text run at (0,16) width 75: "space:pre-line\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (362,700) size 181x85 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x32 + LayoutText {#text} at (0,0) size 69x31 + text run at (0,0) width 64: "style: \"word-" + text run at (0,16) width 69: "wrap:normal\"," + LayoutBR {BR} at (81,29) size 0x0 + LayoutBlockFlow {DIV} at (543,668) size 181x117 [border: (1px solid #0000FF)] + LayoutBlockFlow {SPAN} at (1,1) size 80x64 + LayoutText {#text} at (0,0) size 66x63 + text run at (0,0) width 58: "wrap: \"off\"," + text run at (0,16) width 66: "style: \"white-" + text run at (0,32) width 50: "space:pre-" + text run at (0,48) width 33: "wrap\"," + LayoutBR {BR} at (81,61) size 0x0 + layer at (1,81) size 179x36 clip at (2,82) size 177x34 + LayoutTextControl {TEXTAREA} at (1,1) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 175x16 + LayoutText {#text} at (0,0) size 136x16 + text run at (0,0) width 136: "Lorem ipsum dolor" + layer at (182,81) size 179x36 clip at (183,82) size 162x34 scrollHeight 82 + LayoutTextControl {TEXTAREA} at (1,17) size 179x36 [color=#545454] [bgcolor=#EBEBE4] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (363,63) size 197x54 clip at (364,64) size 180x52 scrollHeight 100 + LayoutTextControl {TEXTAREA} at (1,33) size 197x54 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (11,11) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (562,83) size 177x34 clip at (563,84) size 160x32 scrollHeight 80 + LayoutTextControl {TEXTAREA} at (1,33) size 177x34 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (1,1) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (11,195) size 179x36 clip at (12,196) size 162x34 scrollHeight 82 + LayoutTextControl {TEXTAREA} at (11,43) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (202,205) size 179x36 clip at (203,206) size 162x34 scrollHeight 82 + LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (383,205) size 60x36 clip at (384,206) size 43x34 scrollHeight 242 + LayoutTextControl {TEXTAREA} at (1,33) size 60x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 41x240 + LayoutText {#text} at (0,0) size 41x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 1: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 1: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (465,167) size 60x74 clip at (466,168) size 43x72 scrollHeight 1128 + LayoutTextControl {TEXTAREA} at (1,49) size 60x74 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (21,21) size 3x1088 + LayoutText {#text} at (0,0) size 8x1088 + text run at (0,0) width 8: "L" + text run at (0,16) width 8: "o" + text run at (0,32) width 8: "r" + text run at (0,48) width 8: "e" + text run at (0,64) width 8: "m" + text run at (0,80) width 3: " " + text run at (0,96) width 8: "i" + text run at (0,112) width 8: "p" + text run at (0,128) width 8: "s" + text run at (0,144) width 8: "u" + text run at (0,160) width 8: "m" + text run at (0,176) width 3: " " + text run at (0,192) width 3: " " + text run at (0,208) width 8: "d" + text run at (0,224) width 8: "o" + text run at (0,240) width 8: "l" + text run at (0,256) width 8: "o" + text run at (0,272) width 8: "r" + text run at (0,288) width 3: " " + text run at (0,304) width 8: "A" + text run at (0,320) width 8: "B" + text run at (0,336) width 8: "C" + text run at (0,352) width 8: "D" + text run at (0,368) width 8: "E" + text run at (0,384) width 8: "F" + text run at (0,400) width 8: "G" + text run at (0,416) width 8: "H" + text run at (0,432) width 8: "I" + text run at (0,448) width 8: "J" + text run at (0,464) width 8: "K" + text run at (0,480) width 8: "L" + text run at (0,496) width 8: "M" + text run at (0,512) width 8: "N" + text run at (0,528) width 8: "O" + text run at (0,544) width 8: "P" + text run at (0,560) width 8: "Q" + text run at (0,576) width 8: "R" + text run at (0,592) width 8: "S" + text run at (0,608) width 8: "T" + text run at (0,624) width 8: "U" + text run at (0,640) width 8: "V" + text run at (0,656) width 8: "W" + text run at (0,672) width 8: "X" + text run at (0,688) width 8: "Y" + text run at (0,704) width 8: "Z" + text run at (0,720) width 3: " " + text run at (0,736) width 8: "a" + text run at (0,752) width 8: "b" + text run at (0,768) width 8: "c" + text run at (0,784) width 8: "d" + text run at (0,800) width 8: "e" + text run at (0,816) width 8: "f" + text run at (0,832) width 8: "g" + text run at (0,848) width 8: "h" + text run at (0,864) width 8: "i" + text run at (0,880) width 8: "j" + text run at (0,896) width 8: "k" + text run at (0,912) width 8: "l" + text run at (0,928) width 8: "m" + text run at (0,944) width 8: "n" + text run at (0,960) width 8: "o" + text run at (0,976) width 8: "p" + text run at (0,992) width 8: "q" + text run at (0,1008) width 8: "r" + text run at (0,1024) width 8: "s" + text run at (0,1040) width 8: "t" + text run at (0,1056) width 8: "u" + text run at (0,1072) width 8: "v" + layer at (547,207) size 60x34 clip at (548,208) size 43x32 scrollHeight 240 + LayoutTextControl {TEXTAREA} at (1,49) size 60x34 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (1,1) size 43x240 + LayoutText {#text} at (0,0) size 43x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 3: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 3: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (1,307) size 179x60 clip at (2,308) size 162x58 scrollHeight 82 + LayoutTextControl {TEXTAREA} at (1,33) size 179x60 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (182,307) size 60x60 clip at (183,308) size 43x58 scrollHeight 242 + LayoutTextControl {TEXTAREA} at (1,49) size 60x60 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 41x240 + LayoutText {#text} at (0,0) size 41x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 1: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 1: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (264,331) size 179x36 clip at (265,332) size 177x34 scrollHeight 82 + LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 175x80 + LayoutText {#text} at (0,0) size 168x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 168: "ABCDEFGHIJKLMNOPQRSTU" + text run at (0,32) width 40: "VWXYZ" + text run at (40,32) width 8: " " + text run at (0,48) width 168: "abcdefghijklmnopqrstu" + text run at (0,64) width 8: "v" + layer at (445,316) size 179x51 clip at (446,317) size 162x34 scrollHeight 82 + LayoutTextControl {TEXTAREA} at (1,33) size 179x51 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (626,307) size 60x60 clip at (627,308) size 58x58 scrollHeight 178 + LayoutTextControl {TEXTAREA} at (1,65) size 60x60 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 56x176 + LayoutText {#text} at (0,0) size 56x176 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 8: " " + text run at (0,16) width 40: "ipsum" + text run at (40,16) width 16: " " + text run at (0,32) width 40: "dolor" + text run at (40,32) width 8: " " + text run at (0,48) width 56: "ABCDEFG" + text run at (0,64) width 56: "HIJKLMN" + text run at (0,80) width 56: "OPQRSTU" + text run at (0,96) width 40: "VWXYZ" + text run at (40,96) width 8: " " + text run at (0,112) width 56: "abcdefg" + text run at (0,128) width 56: "hijklmn" + text run at (0,144) width 56: "opqrstu" + text run at (0,160) width 8: "v" + layer at (1,433) size 60x60 clip at (2,434) size 43x43 scrollHeight 242 + LayoutTextControl {TEXTAREA} at (1,65) size 60x60 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 41x240 + LayoutText {#text} at (0,0) size 41x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 1: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 1: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (83,433) size 60x60 clip at (84,434) size 43x58 scrollHeight 242 + LayoutTextControl {TEXTAREA} at (1,49) size 60x60 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 41x240 + LayoutText {#text} at (0,0) size 41x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 1: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 1: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (165,433) size 60x60 clip at (166,434) size 43x58 scrollHeight 242 + LayoutTextControl {TEXTAREA} at (1,49) size 60x60 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 41x240 + LayoutText {#text} at (0,0) size 41x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 1: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 1: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (247,433) size 60x60 clip at (248,434) size 43x58 scrollHeight 242 + LayoutTextControl {TEXTAREA} at (1,65) size 60x60 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 41x240 + LayoutText {#text} at (0,0) size 41x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 1: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 1: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (329,457) size 43x36 clip at (330,458) size 26x34 scrollHeight 370 + LayoutTextControl {TEXTAREA} at (1,17) size 43x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 24x368 + LayoutText {#text} at (0,0) size 24x368 + text run at (0,0) width 24: "Lor" + text run at (0,16) width 16: "em" + text run at (16,16) width 8: " " + text run at (0,32) width 24: "ips" + text run at (0,48) width 16: "um" + text run at (16,48) width 8: " " + text run at (0,64) width 24: "dol" + text run at (0,80) width 16: "or" + text run at (16,80) width 8: " " + text run at (0,96) width 24: "ABC" + text run at (0,112) width 24: "DEF" + text run at (0,128) width 24: "GHI" + text run at (0,144) width 24: "JKL" + text run at (0,160) width 24: "MNO" + text run at (0,176) width 24: "PQR" + text run at (0,192) width 24: "STU" + text run at (0,208) width 24: "VWX" + text run at (0,224) width 16: "YZ" + text run at (16,224) width 8: " " + text run at (0,240) width 24: "abc" + text run at (0,256) width 24: "def" + text run at (0,272) width 24: "ghi" + text run at (0,288) width 24: "jkl" + text run at (0,304) width 24: "mno" + text run at (0,320) width 24: "pqr" + text run at (0,336) width 24: "stu" + text run at (0,352) width 8: "v" + layer at (411,441) size 179x52 clip at (412,442) size 162x50 scrollHeight 82 + LayoutTextControl {TEXTAREA} at (1,17) size 179x52 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (592,457) size 75x36 clip at (593,458) size 58x34 scrollHeight 178 + LayoutTextControl {TEXTAREA} at (1,17) size 75x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 56x176 + LayoutText {#text} at (0,0) size 56x176 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 8: " " + text run at (0,16) width 40: "ipsum" + text run at (40,16) width 16: " " + text run at (0,32) width 40: "dolor" + text run at (40,32) width 8: " " + text run at (0,48) width 56: "ABCDEFG" + text run at (0,64) width 56: "HIJKLMN" + text run at (0,80) width 56: "OPQRSTU" + text run at (0,96) width 40: "VWXYZ" + text run at (40,96) width 8: " " + text run at (0,112) width 56: "abcdefg" + text run at (0,128) width 56: "hijklmn" + text run at (0,144) width 56: "opqrstu" + text run at (0,160) width 8: "v" + layer at (1,511) size 179x116 clip at (2,512) size 177x114 + LayoutTextControl {TEXTAREA} at (1,17) size 179x116 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 175x80 + LayoutText {#text} at (0,0) size 168x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 168: "ABCDEFGHIJKLMNOPQRSTU" + text run at (0,32) width 40: "VWXYZ" + text run at (40,32) width 8: " " + text run at (0,48) width 168: "abcdefghijklmnopqrstu" + text run at (0,64) width 8: "v" + layer at (182,559) size 59x68 clip at (183,560) size 42x66 scrollHeight 242 + LayoutTextControl {TEXTAREA} at (1,33) size 59x68 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 40x240 + LayoutText {#text} at (0,0) size 40x240 + text run at (0,0) width 40: "Lorem" + text run at (40,0) width 0: " " + text run at (0,16) width 40: "ipsum" + text run at (0,32) width 16: " " + text run at (0,48) width 40: "dolor" + text run at (40,48) width 0: " " + text run at (0,64) width 40: "ABCDE" + text run at (0,80) width 40: "FGHIJ" + text run at (0,96) width 40: "KLMNO" + text run at (0,112) width 40: "PQRST" + text run at (0,128) width 40: "UVWXY" + text run at (0,144) width 8: "Z" + text run at (8,144) width 8: " " + text run at (0,160) width 40: "abcde" + text run at (0,176) width 40: "fghij" + text run at (0,192) width 40: "klmno" + text run at (0,208) width 40: "pqrst" + text run at (0,224) width 16: "uv" + layer at (264,576) size 179x51 clip at (265,577) size 177x34 scrollWidth 546 + LayoutTextControl {TEXTAREA} at (1,17) size 179x51 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 175x16 + LayoutText {#text} at (0,0) size 544x16 + text run at (0,0) width 544: "Lorem ipsum dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" + layer at (445,591) size 179x36 clip at (446,592) size 162x34 scrollHeight 82 + LayoutTextControl {TEXTAREA} at (1,17) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (1,661) size 179x36 clip at (2,662) size 162x34 scrollHeight 82 + LayoutTextControl {TEXTAREA} at (1,17) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (182,661) size 179x36 clip at (183,662) size 162x34 scrollHeight 82 + LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 96: "Lorem ipsum " + text run at (96,0) width 40: "dolor" + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (363,661) size 179x36 clip at (364,662) size 162x34 scrollHeight 66 + LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x64 + LayoutText {#text} at (0,0) size 160x64 + text run at (0,0) width 160: "Lorem ipsum dolor A" + text run at (0,16) width 160: "BCDEFGHIJKLMNOPQRSTU" + text run at (0,32) width 160: "VWXYZ abcdefghijklmn" + text run at (0,48) width 64: "opqrstuv" + layer at (544,661) size 179x36 clip at (545,662) size 162x34 scrollHeight 82 + LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (48,32) width 8: " " + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (1,778) size 179x36 clip at (2,779) size 177x19 scrollWidth 538 + LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 175x16 + LayoutText {#text} at (0,0) size 536x16 + text run at (0,0) width 96: "Lorem ipsum " + text run at (96,0) width 440: "dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" + layer at (182,778) size 179x36 clip at (183,779) size 162x34 scrollHeight 82 + LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x80 + LayoutText {#text} at (0,0) size 160x80 + text run at (0,0) width 96: "Lorem ipsum " + text run at (96,0) width 40: "dolor" + text run at (0,16) width 160: "ABCDEFGHIJKLMNOPQRST" + text run at (0,32) width 48: "UVWXYZ" + text run at (0,48) width 160: "abcdefghijklmnopqrst" + text run at (0,64) width 16: "uv" + layer at (363,763) size 179x51 clip at (364,764) size 162x34 scrollWidth 210 scrollHeight 66 + LayoutTextControl {TEXTAREA} at (1,33) size 179x51 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x64 + LayoutText {#text} at (0,0) size 208x64 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 208: "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + text run at (0,32) width 8: " " + text run at (0,48) width 176: "abcdefghijklmnopqrstuv" + layer at (544,763) size 179x51 clip at (545,764) size 162x34 scrollWidth 210 scrollHeight 66 + LayoutTextControl {TEXTAREA} at (1,65) size 179x51 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] + LayoutBlockFlow {DIV} at (3,3) size 160x64 + LayoutText {#text} at (0,0) size 208x64 + text run at (0,0) width 144: "Lorem ipsum dolor" + text run at (144,0) width 8: " " + text run at (0,16) width 208: "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + text run at (0,32) width 8: " " + text run at (0,48) width 176: "abcdefghijklmnopqrstuv"
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/text/word-break-expected.png b/third_party/WebKit/LayoutTests/platform/android/fast/text/word-break-expected.png new file mode 100644 index 0000000..ae73991d --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/text/word-break-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/android/fast/text/word-break-expected.txt b/third_party/WebKit/LayoutTests/platform/android/fast/text/word-break-expected.txt new file mode 100644 index 0000000..51d452e --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/android/fast/text/word-break-expected.txt
@@ -0,0 +1,109 @@ +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1036 + LayoutView at (0,0) size 800x600 +layer at (0,0) size 785x1036 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x1036 + LayoutBlockFlow {BODY} at (8,8) size 769x1020 + LayoutBlockFlow (anonymous) at (0,0) size 769x20 + LayoutText {#text} at (0,0) size 658x19 + text run at (0,0) width 658: "This example tests that word-break properly shrinks a cell to one character per line when it is set to break-all." + LayoutTable {TABLE} at (0,20) size 769x110 [border: (1px outset #808080)] + LayoutTableSection {TBODY} at (1,1) size 767x108 + LayoutTableRow {TR} at (0,0) size 767x108 + LayoutTableCell {TD} at (0,0) size 20x108 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (6,6) size 8x96 + text run at (6,6) width 8: "N" + text run at (6,22) width 8: "a" + text run at (6,38) width 8: "r" + text run at (6,54) width 8: "r" + text run at (6,70) width 8: "o" + text run at (6,86) width 8: "w" + LayoutTableCell {TD} at (20,40) size 747x28 [border: (1px inset #808080)] [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (6,6) size 168x16 + text run at (6,6) width 168: "This cell should grow" + LayoutBlockFlow (anonymous) at (0,130) size 769x40 + LayoutBR {BR} at (0,0) size 0x19 + LayoutText {#text} at (0,20) size 415x19 + text run at (0,20) width 415: "This test checks that word-break is ignored when white-space is pre." + LayoutBlockFlow {PRE} at (0,183) size 110x26 [border: (5px solid #000000)] + LayoutText {#text} at (5,5) size 448x16 + text run at (5,5) width 448: "Thislongwordshouldnotgetbrokenbutshouldstickoutofthepre." + text run at (453,5) width 0: " " + LayoutBlockFlow (anonymous) at (0,222) size 769x60 + LayoutBR {BR} at (0,0) size 0x19 + LayoutText {#text} at (0,20) size 768x39 + text run at (0,20) width 453: "The next two examples test our custom break-word value for word-break. " + text run at (453,20) width 303: "We should get the same results as break-all for the" + text run at (0,40) width 768: "first test, but we should break up the word in the second test (since our behavior matches word-wrap: break-word in that case)." + LayoutTable {TABLE} at (0,282) size 769x110 [border: (1px outset #808080)] + LayoutTableSection {TBODY} at (1,1) size 767x108 + LayoutTableRow {TR} at (0,0) size 767x108 + LayoutTableCell {TD} at (0,0) size 20x108 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] + LayoutText {#text} at (6,6) size 8x96 + text run at (6,6) width 8: "N" + text run at (6,22) width 8: "a" + text run at (6,38) width 8: "r" + text run at (6,54) width 8: "r" + text run at (6,70) width 8: "o" + text run at (6,86) width 8: "w" + LayoutTableCell {TD} at (20,40) size 747x28 [border: (1px inset #808080)] [r=0 c=1 rs=1 cs=1] + LayoutText {#text} at (6,6) size 168x16 + text run at (6,6) width 168: "This cell should grow" + LayoutBlockFlow (anonymous) at (0,392) size 769x20 + LayoutBR {BR} at (0,0) size 0x19 + LayoutBlockFlow {PRE} at (0,425) size 110x90 [border: (5px solid #000000)] + LayoutText {#text} at (5,5) size 96x80 + text run at (5,5) width 96: "Thislongword" + text run at (5,21) width 96: "shouldnotget" + text run at (5,37) width 96: "brokenbutsho" + text run at (5,53) width 96: "uldstickouto" + text run at (5,69) width 64: "fthepre." + text run at (69,69) width 0: " " + LayoutBlockFlow (anonymous) at (0,528) size 769x60 + LayoutBR {BR} at (0,0) size 0x19 + LayoutText {#text} at (0,20) size 756x39 + text run at (0,20) width 596: "This test makes sure floating and positioned elements do the right thing with word-break: break-all. " + text run at (596,20) width 160: "The minimum width should" + text run at (0,40) width 239: "be less than the containing block width. " + text run at (239,40) width 459: "The breaking should be \"dumb\" and just occur when the end of the line is hit." + LayoutBlockFlow {DIV} at (0,588) size 304x52 [border: (2px solid #000000)] + LayoutBlockFlow (floating) {DIV} at (2,2) size 300x48 + LayoutText {#text} at (0,0) size 296x48 + text run at (0,0) width 296: "Eventhoughthishasareallylongword itsh" + text run at (0,16) width 296: "ouldnotstick out oftheenclosing300pxb" + text run at (0,32) width 40: "lock." + LayoutBR {BR} at (302,2) size 0x16 + LayoutBlockFlow (anonymous) at (0,640) size 769x20 + LayoutBR {BR} at (0,0) size 0x19 + LayoutBlockFlow (anonymous) at (0,764) size 769x80 + LayoutBR {BR} at (0,0) size 0x19 + LayoutText {#text} at (0,20) size 768x59 + text run at (0,20) width 615: "This test makes sure floating and positioned elements do the right thing with word-break: break-word. " + text run at (615,20) width 117: "The minimum width" + text run at (0,40) width 282: "should be less than the containing block width. " + text run at (282,40) width 486: "The breaking should be \"smart\" and be like word-wrap: break-word, with words" + text run at (0,60) width 428: "preferring to wrap first before allowing break opportunities within them." + LayoutBlockFlow {DIV} at (0,844) size 304x52 [border: (2px solid #000000)] + LayoutBlockFlow (floating) {DIV} at (2,2) size 300x48 + LayoutText {#text} at (0,0) size 256x48 + text run at (0,0) width 256: "Eventhoughthishasareallylongword" + text run at (0,16) width 160: "itshouldnotstick out" + text run at (0,32) width 200: "oftheenclosing300pxblock." + LayoutBR {BR} at (302,2) size 0x16 + LayoutBlockFlow (anonymous) at (0,896) size 769x20 + LayoutBR {BR} at (0,0) size 0x19 +layer at (8,668) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow (relative positioned) {DIV} at (0,660) size 304x104 [border: (2px solid #000000)] +layer at (10,670) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow (positioned) {DIV} at (2,2) size 300x48 + LayoutText {#text} at (0,0) size 296x48 + text run at (0,0) width 296: "Eventhoughthishasareallylongword itsh" + text run at (0,16) width 296: "ouldnotstick out oftheenclosing300pxb" + text run at (0,32) width 40: "lock." +layer at (8,924) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow (relative positioned) {DIV} at (0,916) size 304x104 [border: (2px solid #000000)] +layer at (10,926) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow (positioned) {DIV} at (2,2) size 300x48 + LayoutText {#text} at (0,0) size 256x48 + text run at (0,0) width 256: "Eventhoughthishasareallylongword" + text run at (0,16) width 160: "itshouldnotstick out" + text run at (0,32) width 200: "oftheenclosing300pxblock."
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/basic-textareas-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/basic-textareas-expected.txt index 21be381..c98e501 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/forms/basic-textareas-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/forms/basic-textareas-expected.txt
@@ -634,14 +634,11 @@ text run at (0,32) width 48: "UVWXYZ" text run at (0,48) width 160: "abcdefghijklmnopqrst" text run at (0,64) width 16: "uv" - layer at (367,695) size 181x38 clip at (368,696) size 164x36 scrollHeight 68 + layer at (367,695) size 181x38 clip at (368,696) size 179x21 scrollWidth 546 LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] - LayoutBlockFlow {DIV} at (3,3) size 160x64 - LayoutText {#text} at (0,0) size 160x64 - text run at (0,0) width 160: "Lorem ipsum dolor A" - text run at (0,16) width 160: "BCDEFGHIJKLMNOPQRSTU" - text run at (0,32) width 160: "VWXYZ abcdefghijklmn" - text run at (0,48) width 64: "opqrstuv" + LayoutBlockFlow {DIV} at (3,3) size 175x16 + LayoutText {#text} at (0,0) size 544x16 + text run at (0,0) width 544: "Lorem ipsum dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" layer at (550,695) size 181x38 clip at (551,696) size 164x36 scrollHeight 84 LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] LayoutBlockFlow {DIV} at (3,3) size 160x80 @@ -1367,14 +1364,11 @@ text run at (0,32) width 48: "UVWXYZ" text run at (0,48) width 160: "abcdefghijklmnopqrst" text run at (0,64) width 16: "uv" - layer at (363,661) size 179x36 clip at (364,662) size 162x34 scrollHeight 66 + layer at (363,661) size 179x36 clip at (364,662) size 177x19 scrollWidth 546 LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] - LayoutBlockFlow {DIV} at (3,3) size 160x64 - LayoutText {#text} at (0,0) size 160x64 - text run at (0,0) width 160: "Lorem ipsum dolor A" - text run at (0,16) width 160: "BCDEFGHIJKLMNOPQRSTU" - text run at (0,32) width 160: "VWXYZ abcdefghijklmn" - text run at (0,48) width 64: "opqrstuv" + LayoutBlockFlow {DIV} at (3,3) size 175x16 + LayoutText {#text} at (0,0) size 544x16 + text run at (0,0) width 544: "Lorem ipsum dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" layer at (544,661) size 179x36 clip at (545,662) size 162x34 scrollHeight 82 LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] LayoutBlockFlow {DIV} at (3,3) size 160x80
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/whitespace/pre-break-word-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/whitespace/pre-break-word-expected.png deleted file mode 100644 index 1573e582..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/whitespace/pre-break-word-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/whitespace/pre-break-word-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/text/whitespace/pre-break-word-expected.txt deleted file mode 100644 index f02ed10d..0000000 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/whitespace/pre-break-word-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 154x124 [border: (2px solid #FF0000)] - LayoutText {#text} at (2,2) size 150x119 - text run at (2,2) width 148: "Even though this div is w" - text run at (2,22) width 145: "hite-space pre, the text i" - text run at (2,42) width 148: "nside should still wrap to" - text run at (2,62) width 149: " multiple lines because of" - text run at (2,82) width 150: " the word-wrap:break-w" - text run at (2,102) width 113: "ord CSS property."
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/word-break-expected.png b/third_party/WebKit/LayoutTests/platform/linux/fast/text/word-break-expected.png index ae73991d..613918f 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/word-break-expected.png +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/word-break-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/text/word-break-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/text/word-break-expected.txt index 51d452e..aeb33eb7 100644 --- a/third_party/WebKit/LayoutTests/platform/linux/fast/text/word-break-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/linux/fast/text/word-break-expected.txt
@@ -1,8 +1,8 @@ -layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1036 +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 972 LayoutView at (0,0) size 800x600 -layer at (0,0) size 785x1036 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow {HTML} at (0,0) size 785x1036 - LayoutBlockFlow {BODY} at (8,8) size 769x1020 +layer at (0,0) size 785x972 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x972 + LayoutBlockFlow {BODY} at (8,8) size 769x956 LayoutBlockFlow (anonymous) at (0,0) size 769x20 LayoutText {#text} at (0,0) size 658x19 text run at (0,0) width 658: "This example tests that word-break properly shrinks a cell to one character per line when it is set to break-all." @@ -50,31 +50,27 @@ text run at (6,6) width 168: "This cell should grow" LayoutBlockFlow (anonymous) at (0,392) size 769x20 LayoutBR {BR} at (0,0) size 0x19 - LayoutBlockFlow {PRE} at (0,425) size 110x90 [border: (5px solid #000000)] - LayoutText {#text} at (5,5) size 96x80 - text run at (5,5) width 96: "Thislongword" - text run at (5,21) width 96: "shouldnotget" - text run at (5,37) width 96: "brokenbutsho" - text run at (5,53) width 96: "uldstickouto" - text run at (5,69) width 64: "fthepre." - text run at (69,69) width 0: " " - LayoutBlockFlow (anonymous) at (0,528) size 769x60 + LayoutBlockFlow {PRE} at (0,425) size 110x26 [border: (5px solid #000000)] + LayoutText {#text} at (5,5) size 448x16 + text run at (5,5) width 448: "Thislongwordshouldnotgetbrokenbutshouldstickoutofthepre." + text run at (453,5) width 0: " " + LayoutBlockFlow (anonymous) at (0,464) size 769x60 LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 756x39 text run at (0,20) width 596: "This test makes sure floating and positioned elements do the right thing with word-break: break-all. " text run at (596,20) width 160: "The minimum width should" text run at (0,40) width 239: "be less than the containing block width. " text run at (239,40) width 459: "The breaking should be \"dumb\" and just occur when the end of the line is hit." - LayoutBlockFlow {DIV} at (0,588) size 304x52 [border: (2px solid #000000)] + LayoutBlockFlow {DIV} at (0,524) size 304x52 [border: (2px solid #000000)] LayoutBlockFlow (floating) {DIV} at (2,2) size 300x48 LayoutText {#text} at (0,0) size 296x48 text run at (0,0) width 296: "Eventhoughthishasareallylongword itsh" text run at (0,16) width 296: "ouldnotstick out oftheenclosing300pxb" text run at (0,32) width 40: "lock." LayoutBR {BR} at (302,2) size 0x16 - LayoutBlockFlow (anonymous) at (0,640) size 769x20 + LayoutBlockFlow (anonymous) at (0,576) size 769x20 LayoutBR {BR} at (0,0) size 0x19 - LayoutBlockFlow (anonymous) at (0,764) size 769x80 + LayoutBlockFlow (anonymous) at (0,700) size 769x80 LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 768x59 text run at (0,20) width 615: "This test makes sure floating and positioned elements do the right thing with word-break: break-word. " @@ -82,26 +78,26 @@ text run at (0,40) width 282: "should be less than the containing block width. " text run at (282,40) width 486: "The breaking should be \"smart\" and be like word-wrap: break-word, with words" text run at (0,60) width 428: "preferring to wrap first before allowing break opportunities within them." - LayoutBlockFlow {DIV} at (0,844) size 304x52 [border: (2px solid #000000)] + LayoutBlockFlow {DIV} at (0,780) size 304x52 [border: (2px solid #000000)] LayoutBlockFlow (floating) {DIV} at (2,2) size 300x48 LayoutText {#text} at (0,0) size 256x48 text run at (0,0) width 256: "Eventhoughthishasareallylongword" text run at (0,16) width 160: "itshouldnotstick out" text run at (0,32) width 200: "oftheenclosing300pxblock." LayoutBR {BR} at (302,2) size 0x16 - LayoutBlockFlow (anonymous) at (0,896) size 769x20 + LayoutBlockFlow (anonymous) at (0,832) size 769x20 LayoutBR {BR} at (0,0) size 0x19 -layer at (8,668) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow (relative positioned) {DIV} at (0,660) size 304x104 [border: (2px solid #000000)] -layer at (10,670) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 +layer at (8,604) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow (relative positioned) {DIV} at (0,596) size 304x104 [border: (2px solid #000000)] +layer at (10,606) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 LayoutBlockFlow (positioned) {DIV} at (2,2) size 300x48 LayoutText {#text} at (0,0) size 296x48 text run at (0,0) width 296: "Eventhoughthishasareallylongword itsh" text run at (0,16) width 296: "ouldnotstick out oftheenclosing300pxb" text run at (0,32) width 40: "lock." -layer at (8,924) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow (relative positioned) {DIV} at (0,916) size 304x104 [border: (2px solid #000000)] -layer at (10,926) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 +layer at (8,860) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow (relative positioned) {DIV} at (0,852) size 304x104 [border: (2px solid #000000)] +layer at (10,862) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 LayoutBlockFlow (positioned) {DIV} at (2,2) size 300x48 LayoutText {#text} at (0,0) size 256x48 text run at (0,0) width 256: "Eventhoughthishasareallylongword"
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/basic-textareas-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/basic-textareas-expected.png index 547ebcc..de1134d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/basic-textareas-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/forms/basic-textareas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/whitespace/pre-break-word-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/whitespace/pre-break-word-expected.png deleted file mode 100644 index 49cafa2..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/whitespace/pre-break-word-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/whitespace/tab-character-basics-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/whitespace/tab-character-basics-expected.png index 03e1e0e..ea96119 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/whitespace/tab-character-basics-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/whitespace/tab-character-basics-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/word-break-expected.png b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/word-break-expected.png index 758a8fd..8f03e5f 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/word-break-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-lion/fast/text/word-break-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-textareas-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-textareas-expected.png index 75b767c..e5ad93e4 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-textareas-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-textareas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-textareas-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-textareas-expected.txt index 8630ad64..a1a40d0 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-textareas-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/forms/basic-textareas-expected.txt
@@ -604,14 +604,11 @@ text run at (0,13) width 138: "ABCDEFGHIJKLMNOPQRST" text run at (0,26) width 45: "UVWXYZ" text run at (0,39) width 130: "abcdefghijklmnopqrstuv" - layer at (1,573) size 161x32 clip at (2,574) size 144x30 scrollHeight 56 + layer at (1,573) size 161x32 clip at (2,574) size 144x15 scrollWidth 426 scrollHeight 17 LayoutTextControl {TEXTAREA} at (1,29) size 161x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] - LayoutBlockFlow {DIV} at (3,3) size 140x52 - LayoutText {#text} at (0,0) size 140x52 - text run at (0,0) width 139: "Lorem ipsum dolor ABCD" - text run at (0,13) width 140: "EFGHIJKLMNOPQRSTUVWX" - text run at (0,26) width 135: "YZ abcdefghijklmnopqrst" - text run at (0,39) width 13: "uv" + LayoutBlockFlow {DIV} at (3,3) size 155x13 + LayoutText {#text} at (0,0) size 425x13 + text run at (0,0) width 425: "Lorem ipsum dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" layer at (164,573) size 161x32 clip at (165,574) size 144x30 scrollHeight 56 LayoutTextControl {TEXTAREA} at (1,29) size 161x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 140x52 @@ -1305,14 +1302,11 @@ text run at (0,13) width 138: "ABCDEFGHIJKLMNOPQRST" text run at (0,26) width 45: "UVWXYZ" text run at (0,39) width 130: "abcdefghijklmnopqrstuv" - layer at (1,546) size 161x32 clip at (2,547) size 144x30 scrollHeight 56 + layer at (1,546) size 161x32 clip at (2,547) size 144x15 scrollWidth 426 scrollHeight 17 LayoutTextControl {TEXTAREA} at (1,29) size 161x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] - LayoutBlockFlow {DIV} at (3,3) size 140x52 - LayoutText {#text} at (0,0) size 140x52 - text run at (0,0) width 139: "Lorem ipsum dolor ABCD" - text run at (0,13) width 140: "EFGHIJKLMNOPQRSTUVWX" - text run at (0,26) width 135: "YZ abcdefghijklmnopqrst" - text run at (0,39) width 13: "uv" + LayoutBlockFlow {DIV} at (3,3) size 155x13 + LayoutText {#text} at (0,0) size 425x13 + text run at (0,0) width 425: "Lorem ipsum dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" layer at (164,546) size 161x32 clip at (165,547) size 144x30 scrollHeight 56 LayoutTextControl {TEXTAREA} at (1,29) size 161x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 140x52
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/word-break-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/word-break-expected.png index 62907a9..0702e05 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/word-break-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-mavericks/fast/text/word-break-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mountainlion/fast/text/whitespace/pre-break-word-expected.png b/third_party/WebKit/LayoutTests/platform/mac-mountainlion/fast/text/whitespace/pre-break-word-expected.png deleted file mode 100644 index 50f086d4..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-mountainlion/fast/text/whitespace/pre-break-word-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/basic-textareas-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/basic-textareas-expected.png index 2ccde53e7..e352d92 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/basic-textareas-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/forms/basic-textareas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/whitespace/pre-break-word-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/whitespace/pre-break-word-expected.png deleted file mode 100644 index 6437258..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/whitespace/pre-break-word-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/whitespace/tab-character-basics-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/whitespace/tab-character-basics-expected.png index dbe1af8..7b5f714c 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/whitespace/tab-character-basics-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/whitespace/tab-character-basics-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/word-break-expected.png b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/word-break-expected.png index aad9dab..0b0747a 100644 --- a/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/word-break-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac-snowleopard/fast/text/word-break-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/basic-textareas-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/basic-textareas-expected.png index e4e09e6..581581f 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/basic-textareas-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/basic-textareas-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/basic-textareas-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/basic-textareas-expected.txt index 86b6318..268ed0d 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/forms/basic-textareas-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/forms/basic-textareas-expected.txt
@@ -615,14 +615,11 @@ text run at (0,26) width 76: "QRSTUVWXYZ" text run at (0,39) width 115: "abcdefghijklmnopqrstu" text run at (0,52) width 6: "v" - layer at (144,500) size 141x32 clip at (145,501) size 124x30 scrollHeight 56 + layer at (144,500) size 141x32 clip at (145,501) size 124x15 scrollWidth 418 scrollHeight 17 LayoutTextControl {TEXTAREA} at (1,29) size 141x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] - LayoutBlockFlow {DIV} at (3,3) size 120x52 - LayoutText {#text} at (0,0) size 118x52 - text run at (0,0) width 116: "Lorem ipsum dolor AB" - text run at (0,13) width 118: "CDEFGHIJKLMNOPQR" - text run at (0,26) width 116: "STUVWXYZ abcdefghij" - text run at (0,39) width 69: "klmnopqrstuv" + LayoutBlockFlow {DIV} at (3,3) size 135x13 + LayoutText {#text} at (0,0) size 417x13 + text run at (0,0) width 417: "Lorem ipsum dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" layer at (287,500) size 141x32 clip at (288,501) size 124x30 scrollHeight 69 LayoutTextControl {TEXTAREA} at (1,29) size 141x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 120x65 @@ -1342,14 +1339,11 @@ text run at (0,26) width 76: "QRSTUVWXYZ" text run at (0,39) width 115: "abcdefghijklmnopqrstu" text run at (0,52) width 6: "v" - layer at (144,482) size 141x32 clip at (145,483) size 124x30 scrollHeight 56 + layer at (144,482) size 141x32 clip at (145,483) size 124x15 scrollWidth 418 scrollHeight 17 LayoutTextControl {TEXTAREA} at (1,29) size 141x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] - LayoutBlockFlow {DIV} at (3,3) size 120x52 - LayoutText {#text} at (0,0) size 118x52 - text run at (0,0) width 116: "Lorem ipsum dolor AB" - text run at (0,13) width 118: "CDEFGHIJKLMNOPQR" - text run at (0,26) width 116: "STUVWXYZ abcdefghij" - text run at (0,39) width 69: "klmnopqrstuv" + LayoutBlockFlow {DIV} at (3,3) size 135x13 + LayoutText {#text} at (0,0) size 417x13 + text run at (0,0) width 417: "Lorem ipsum dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" layer at (287,482) size 141x32 clip at (288,483) size 124x30 scrollHeight 69 LayoutTextControl {TEXTAREA} at (1,29) size 141x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] LayoutBlockFlow {DIV} at (3,3) size 120x65
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/pre-break-word-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/pre-break-word-expected.png deleted file mode 100644 index 1918777..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/pre-break-word-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/pre-break-word-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/pre-break-word-expected.txt deleted file mode 100644 index 1d28b57..0000000 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/pre-break-word-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 154x130 [border: (2px solid #FF0000)] - LayoutText {#text} at (2,2) size 148x126 - text run at (2,2) width 148: "Even though this div is" - text run at (2,20) width 148: " white-space pre, the te" - text run at (2,38) width 145: "xt inside should still w" - text run at (2,56) width 148: "rap to multiple lines be" - text run at (2,74) width 143: "cause of the word-wra" - text run at (2,92) width 144: "p:break-word CSS pro" - text run at (2,110) width 36: "perty."
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/tab-character-basics-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/tab-character-basics-expected.png index e875682..8f30297 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/tab-character-basics-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/tab-character-basics-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/tab-character-basics-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/tab-character-basics-expected.txt index 56be64a..dd8e7f9 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/tab-character-basics-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/tab-character-basics-expected.txt
@@ -1,8 +1,8 @@ layer at (0,0) size 800x600 LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x502 - LayoutBlockFlow {HTML} at (0,0) size 800x502 - LayoutBlockFlow {BODY} at (8,8) size 646x486 [border: (3px solid #FF0000)] +layer at (0,0) size 800x481 + LayoutBlockFlow {HTML} at (0,0) size 800x481 + LayoutBlockFlow {BODY} at (8,8) size 646x465 [border: (3px solid #FF0000)] LayoutBlockFlow {P} at (3,19) size 640x21 [color=#0000FF] LayoutText {#text} at (0,0) size 509x20 text run at (0,0) width 509: "-- Following text and list are whitespace:NORMAL only" @@ -41,22 +41,20 @@ LayoutListMarker (anonymous) at (-28.80,0) size 28.80x20: "3" LayoutText {#text} at (0,0) size 87x20 text run at (0,0) width 87: "ccc\x{9}X" - LayoutBlockFlow {P} at (3,309) size 640x63 + LayoutBlockFlow {P} at (3,309) size 640x42 LayoutText {#text} at (0,0) size 490x20 text run at (0,0) width 490: "012345678901234567890123456789012345678901234567890" LayoutBR {BR} at (489,0) size 1x20 - LayoutText {#text} at (0,21) size 634x41 - text run at (0,21) width 634: "X\x{9}\x{9}XX\x{9}\x{9}XXX\x{9}\x{9}XXXX\x{9}\x{9}XX" - text run at (0,42) width 29: "XXX" - LayoutBlockFlow {P} at (3,388) size 640x21 [color=#0000FF] + LayoutText {#text} at (0,21) size 663x20 + text run at (0,21) width 663: "X\x{9}\x{9}XX\x{9}\x{9}XXX\x{9}\x{9}XXXX\x{9}\x{9}XXXXX" + LayoutBlockFlow {P} at (3,367) size 640x21 [color=#0000FF] LayoutText {#text} at (0,0) size 577x20 text run at (0,0) width 577: "-- Following text mixes whitespace:NORMAL and whitespace:PRE" - LayoutBlockFlow {P} at (3,425) size 640x42 + LayoutBlockFlow {P} at (3,404) size 640x42 LayoutText {#text} at (0,0) size 471x20 text run at (0,0) width 471: "AAAA BBBB CCCC DDDD EEEE FFFF GGGG HHHH IIII JJJJ" - LayoutInline {SPAN} at (0,0) size 615x41 - LayoutText {#text} at (470,0) size 615x41 - text run at (470,0) width 145: "\x{9}\x{9}" - text run at (0,21) width 154: "\x{9}\x{9}" - LayoutText {#text} at (153,21) size 40x20 - text run at (153,21) width 40: "KKKK" + LayoutInline {SPAN} at (0,0) size 299x20 + LayoutText {#text} at (470,0) size 299x20 + text run at (470,0) width 299: "\x{9}\x{9}\x{9}\x{9}" + LayoutText {#text} at (0,21) size 39x20 + text run at (0,21) width 39: "KKKK"
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/text/word-break-expected.png b/third_party/WebKit/LayoutTests/platform/mac/fast/text/word-break-expected.png index c6ae3c0f..1677ee57 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/text/word-break-expected.png +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/text/word-break-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/fast/text/word-break-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/fast/text/word-break-expected.txt index 8d7fe45..4424868 100644 --- a/third_party/WebKit/LayoutTests/platform/mac/fast/text/word-break-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/mac/fast/text/word-break-expected.txt
@@ -1,8 +1,8 @@ -layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1016 +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 956 LayoutView at (0,0) size 800x600 -layer at (0,0) size 785x1016 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow {HTML} at (0,0) size 785x1016 - LayoutBlockFlow {BODY} at (8,8) size 769x1000 +layer at (0,0) size 785x956 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x956 + LayoutBlockFlow {BODY} at (8,8) size 769x940 LayoutBlockFlow (anonymous) at (0,0) size 769x18 LayoutText {#text} at (0,0) size 700x18 text run at (0,0) width 700: "This example tests that word-break properly shrinks a cell to one character per line when it is set to break-all." @@ -51,15 +51,11 @@ text run at (6,6) width 164: "This cell should grow" LayoutBlockFlow (anonymous) at (0,385) size 769x18 LayoutBR {BR} at (0,0) size 0x18 - LayoutBlockFlow {PRE} at (0,416) size 110x85 [border: (5px solid #000000)] - LayoutText {#text} at (5,5) size 94x75 - text run at (5,5) width 94: "Thislongword" - text run at (5,20) width 94: "shouldnotget" - text run at (5,35) width 94: "brokenbutsho" - text run at (5,50) width 94: "uldstickouto" - text run at (5,65) width 63: "fthepre." - text run at (67,65) width 1: " " - LayoutBlockFlow (anonymous) at (0,514) size 769x72 + LayoutBlockFlow {PRE} at (0,416) size 110x25 [border: (5px solid #000000)] + LayoutText {#text} at (5,5) size 437x15 + text run at (5,5) width 437: "Thislongwordshouldnotgetbrokenbutshouldstickoutofthepre." + text run at (441,5) width 1: " " + LayoutBlockFlow (anonymous) at (0,454) size 769x72 LayoutBR {BR} at (0,0) size 0x18 LayoutText {#text} at (0,18) size 750x54 text run at (0,18) width 640: "This test makes sure floating and positioned elements do the right thing with word-break: break-all. " @@ -67,16 +63,16 @@ text run at (0,36) width 345: "width should be less than the containing block width. " text run at (344,36) width 406: "The breaking should be \"dumb\" and just occur when the end of" text run at (0,54) width 88: "the line is hit." - LayoutBlockFlow {DIV} at (0,586) size 304x49 [border: (2px solid #000000)] + LayoutBlockFlow {DIV} at (0,526) size 304x49 [border: (2px solid #000000)] LayoutBlockFlow (floating) {DIV} at (2,2) size 300x45 LayoutText {#text} at (0,0) size 297x45 text run at (0,0) width 297: "Eventhoughthishasareallylongword itsho" text run at (0,15) width 297: "uldnotstick out oftheenclosing300pxblo" text run at (0,30) width 24: "ck." LayoutBR {BR} at (302,2) size 0x15 - LayoutBlockFlow (anonymous) at (0,635) size 769x18 + LayoutBlockFlow (anonymous) at (0,575) size 769x18 LayoutBR {BR} at (0,0) size 0x18 - LayoutBlockFlow (anonymous) at (0,757) size 769x72 + LayoutBlockFlow (anonymous) at (0,697) size 769x72 LayoutBR {BR} at (0,0) size 0x18 LayoutText {#text} at (0,18) size 748x54 text run at (0,18) width 657: "This test makes sure floating and positioned elements do the right thing with word-break: break-word. " @@ -84,26 +80,26 @@ text run at (0,36) width 345: "width should be less than the containing block width. " text run at (344,36) width 402: "The breaking should be \"smart\" and be like word-wrap: break-" text run at (0,54) width 580: "word, with words preferring to wrap first before allowing break opportunities within them." - LayoutBlockFlow {DIV} at (0,829) size 304x49 [border: (2px solid #000000)] + LayoutBlockFlow {DIV} at (0,769) size 304x49 [border: (2px solid #000000)] LayoutBlockFlow (floating) {DIV} at (2,2) size 300x45 LayoutText {#text} at (0,0) size 250x45 text run at (0,0) width 250: "Eventhoughthishasareallylongword" text run at (0,15) width 157: "itshouldnotstick out" text run at (0,30) width 196: "oftheenclosing300pxblock." LayoutBR {BR} at (302,2) size 0x15 - LayoutBlockFlow (anonymous) at (0,878) size 769x18 + LayoutBlockFlow (anonymous) at (0,818) size 769x18 LayoutBR {BR} at (0,0) size 0x18 -layer at (8,661) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow (relative positioned) {DIV} at (0,653) size 304x104 [border: (2px solid #000000)] -layer at (10,663) size 300x45 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 +layer at (8,601) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow (relative positioned) {DIV} at (0,593) size 304x104 [border: (2px solid #000000)] +layer at (10,603) size 300x45 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 LayoutBlockFlow (positioned) {DIV} at (2,2) size 300x45 LayoutText {#text} at (0,0) size 297x45 text run at (0,0) width 297: "Eventhoughthishasareallylongword itsho" text run at (0,15) width 297: "uldnotstick out oftheenclosing300pxblo" text run at (0,30) width 24: "ck." -layer at (8,904) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow (relative positioned) {DIV} at (0,896) size 304x104 [border: (2px solid #000000)] -layer at (10,906) size 300x45 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 +layer at (8,844) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow (relative positioned) {DIV} at (0,836) size 304x104 [border: (2px solid #000000)] +layer at (10,846) size 300x45 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 LayoutBlockFlow (positioned) {DIV} at (2,2) size 300x45 LayoutText {#text} at (0,0) size 250x45 text run at (0,0) width 250: "Eventhoughthishasareallylongword"
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/fast/forms/basic-textareas-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/fast/forms/basic-textareas-expected.txt index 21be381..c98e501 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/fast/forms/basic-textareas-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win-xp/fast/forms/basic-textareas-expected.txt
@@ -634,14 +634,11 @@ text run at (0,32) width 48: "UVWXYZ" text run at (0,48) width 160: "abcdefghijklmnopqrst" text run at (0,64) width 16: "uv" - layer at (367,695) size 181x38 clip at (368,696) size 164x36 scrollHeight 68 + layer at (367,695) size 181x38 clip at (368,696) size 179x21 scrollWidth 546 LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] - LayoutBlockFlow {DIV} at (3,3) size 160x64 - LayoutText {#text} at (0,0) size 160x64 - text run at (0,0) width 160: "Lorem ipsum dolor A" - text run at (0,16) width 160: "BCDEFGHIJKLMNOPQRSTU" - text run at (0,32) width 160: "VWXYZ abcdefghijklmn" - text run at (0,48) width 64: "opqrstuv" + LayoutBlockFlow {DIV} at (3,3) size 175x16 + LayoutText {#text} at (0,0) size 544x16 + text run at (0,0) width 544: "Lorem ipsum dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" layer at (550,695) size 181x38 clip at (551,696) size 164x36 scrollHeight 84 LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] LayoutBlockFlow {DIV} at (3,3) size 160x80 @@ -1367,14 +1364,11 @@ text run at (0,32) width 48: "UVWXYZ" text run at (0,48) width 160: "abcdefghijklmnopqrst" text run at (0,64) width 16: "uv" - layer at (363,661) size 179x36 clip at (364,662) size 162x34 scrollHeight 66 + layer at (363,661) size 179x36 clip at (364,662) size 177x19 scrollWidth 546 LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] - LayoutBlockFlow {DIV} at (3,3) size 160x64 - LayoutText {#text} at (0,0) size 160x64 - text run at (0,0) width 160: "Lorem ipsum dolor A" - text run at (0,16) width 160: "BCDEFGHIJKLMNOPQRSTU" - text run at (0,32) width 160: "VWXYZ abcdefghijklmn" - text run at (0,48) width 64: "opqrstuv" + LayoutBlockFlow {DIV} at (3,3) size 175x16 + LayoutText {#text} at (0,0) size 544x16 + text run at (0,0) width 544: "Lorem ipsum dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" layer at (544,661) size 179x36 clip at (545,662) size 162x34 scrollHeight 82 LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] LayoutBlockFlow {DIV} at (3,3) size 160x80
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/fast/repaint/line-flow-with-floats-2-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/fast/repaint/line-flow-with-floats-2-expected.txt index e04c9c5..2976f31 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/fast/repaint/line-flow-with-floats-2-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win-xp/fast/repaint/line-flow-with-floats-2-expected.txt
@@ -41,8 +41,6 @@ "InlineTextBox ''", "InlineTextBox ' twist itself round and look up in her'", "RootInlineBox", - "VerticalScrollbar", - "LayoutIFrame IFRAME id='iframe'", "LayoutBlockFlow HTML", "LayoutBlockFlow P", "LayoutBlockFlow P", @@ -106,7 +104,8 @@ "InlineTextBox 'minute, \u2018and then,\u2019 thought she, \u2018what would become of\n'", "InlineTextBox 'me?'", "InlineTextBox 'They\u2019re dreadfully fond of beheading people here; the great'", - "InlineTextBox 'wonder is, that there\u2018s any one left alive!\u2019'" + "InlineTextBox 'wonder is, that there\u2018s any one left alive!\u2019'", + "VerticalScrollbar" ] } ]
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/fast/repaint/line-flow-with-floats-8-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/fast/repaint/line-flow-with-floats-8-expected.txt index 9377d817b..148658b4 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/fast/repaint/line-flow-with-floats-8-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win-xp/fast/repaint/line-flow-with-floats-8-expected.txt
@@ -88,8 +88,6 @@ "RootInlineBox", "InlineTextBox 'once in a minute.\n'", "RootInlineBox", - "VerticalScrollbar", - "LayoutIFrame IFRAME id='iframe'", "LayoutBlockFlow HTML", "LayoutBlockFlow P", "LayoutBlockFlow P", @@ -118,7 +116,8 @@ "InlineTextBox 'minute, \u2018and then,\u2019 thought she, \u2018what would become of\n'", "InlineTextBox 'me?'", "InlineTextBox 'They\u2019re dreadfully fond of beheading people here; the great'", - "InlineTextBox 'wonder is, that there\u2018s any one left alive!\u2019'" + "InlineTextBox 'wonder is, that there\u2018s any one left alive!\u2019'", + "VerticalScrollbar" ] } ]
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/whitespace/pre-break-word-expected.png b/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/whitespace/pre-break-word-expected.png deleted file mode 100644 index e4cf084..0000000 --- a/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/whitespace/pre-break-word-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/whitespace/pre-break-word-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/whitespace/pre-break-word-expected.txt deleted file mode 100644 index 20ebb274..0000000 --- a/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/whitespace/pre-break-word-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 154x124 [border: (2px solid #FF0000)] - LayoutText {#text} at (2,2) size 150x119 - text run at (2,2) width 148: "Even though this div is w" - text run at (2,22) width 145: "hite-space pre, the text i" - text run at (2,42) width 148: "nside should still wrap to" - text run at (2,62) width 149: " multiple lines because of" - text run at (2,82) width 150: " the word-wrap:break-w" - text run at (2,102) width 114: "ord CSS property."
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/word-break-expected.png b/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/word-break-expected.png index 964aacc5..b32be47 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/word-break-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/word-break-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/word-break-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/word-break-expected.txt index 69cffb79..c61ff59 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/word-break-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win-xp/fast/text/word-break-expected.txt
@@ -1,8 +1,8 @@ -layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1036 +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 972 LayoutView at (0,0) size 800x600 -layer at (0,0) size 785x1036 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow {HTML} at (0,0) size 785x1036 - LayoutBlockFlow {BODY} at (8,8) size 769x1020 +layer at (0,0) size 785x972 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x972 + LayoutBlockFlow {BODY} at (8,8) size 769x956 LayoutBlockFlow (anonymous) at (0,0) size 769x20 LayoutText {#text} at (0,0) size 658x19 text run at (0,0) width 658: "This example tests that word-break properly shrinks a cell to one character per line when it is set to break-all." @@ -50,31 +50,27 @@ text run at (6,6) width 168: "This cell should grow" LayoutBlockFlow (anonymous) at (0,392) size 769x20 LayoutBR {BR} at (0,0) size 0x19 - LayoutBlockFlow {PRE} at (0,425) size 110x90 [border: (5px solid #000000)] - LayoutText {#text} at (5,5) size 96x80 - text run at (5,5) width 96: "Thislongword" - text run at (5,21) width 96: "shouldnotget" - text run at (5,37) width 96: "brokenbutsho" - text run at (5,53) width 96: "uldstickouto" - text run at (5,69) width 64: "fthepre." - text run at (69,69) width 0: " " - LayoutBlockFlow (anonymous) at (0,528) size 769x60 + LayoutBlockFlow {PRE} at (0,425) size 110x26 [border: (5px solid #000000)] + LayoutText {#text} at (5,5) size 448x16 + text run at (5,5) width 448: "Thislongwordshouldnotgetbrokenbutshouldstickoutofthepre." + text run at (453,5) width 0: " " + LayoutBlockFlow (anonymous) at (0,464) size 769x60 LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 756x39 text run at (0,20) width 596: "This test makes sure floating and positioned elements do the right thing with word-break: break-all. " text run at (596,20) width 160: "The minimum width should" text run at (0,40) width 239: "be less than the containing block width. " text run at (239,40) width 459: "The breaking should be \"dumb\" and just occur when the end of the line is hit." - LayoutBlockFlow {DIV} at (0,588) size 304x52 [border: (2px solid #000000)] + LayoutBlockFlow {DIV} at (0,524) size 304x52 [border: (2px solid #000000)] LayoutBlockFlow (floating) {DIV} at (2,2) size 300x48 LayoutText {#text} at (0,0) size 296x48 text run at (0,0) width 296: "Eventhoughthishasareallylongword itsh" text run at (0,16) width 296: "ouldnotstick out oftheenclosing300pxb" text run at (0,32) width 40: "lock." LayoutBR {BR} at (302,2) size 0x16 - LayoutBlockFlow (anonymous) at (0,640) size 769x20 + LayoutBlockFlow (anonymous) at (0,576) size 769x20 LayoutBR {BR} at (0,0) size 0x19 - LayoutBlockFlow (anonymous) at (0,764) size 769x80 + LayoutBlockFlow (anonymous) at (0,700) size 769x80 LayoutBR {BR} at (0,0) size 0x19 LayoutText {#text} at (0,20) size 768x59 text run at (0,20) width 615: "This test makes sure floating and positioned elements do the right thing with word-break: break-word. " @@ -82,26 +78,26 @@ text run at (0,40) width 282: "should be less than the containing block width. " text run at (282,40) width 486: "The breaking should be \"smart\" and be like word-wrap: break-word, with words" text run at (0,60) width 428: "preferring to wrap first before allowing break opportunities within them." - LayoutBlockFlow {DIV} at (0,844) size 304x52 [border: (2px solid #000000)] + LayoutBlockFlow {DIV} at (0,780) size 304x52 [border: (2px solid #000000)] LayoutBlockFlow (floating) {DIV} at (2,2) size 300x48 LayoutText {#text} at (0,0) size 256x48 text run at (0,0) width 256: "Eventhoughthishasareallylongword" text run at (0,16) width 160: "itshouldnotstick out" text run at (0,32) width 200: "oftheenclosing300pxblock." LayoutBR {BR} at (302,2) size 0x16 - LayoutBlockFlow (anonymous) at (0,896) size 769x20 + LayoutBlockFlow (anonymous) at (0,832) size 769x20 LayoutBR {BR} at (0,0) size 0x19 -layer at (8,668) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow (relative positioned) {DIV} at (0,660) size 304x104 [border: (2px solid #000000)] -layer at (10,670) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 +layer at (8,604) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow (relative positioned) {DIV} at (0,596) size 304x104 [border: (2px solid #000000)] +layer at (10,606) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 LayoutBlockFlow (positioned) {DIV} at (2,2) size 300x48 LayoutText {#text} at (0,0) size 296x48 text run at (0,0) width 296: "Eventhoughthishasareallylongword itsh" text run at (0,16) width 296: "ouldnotstick out oftheenclosing300pxb" text run at (0,32) width 40: "lock." -layer at (8,924) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow (relative positioned) {DIV} at (0,916) size 304x104 [border: (2px solid #000000)] -layer at (10,926) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 +layer at (8,860) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow (relative positioned) {DIV} at (0,852) size 304x104 [border: (2px solid #000000)] +layer at (10,862) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 LayoutBlockFlow (positioned) {DIV} at (2,2) size 300x48 LayoutText {#text} at (0,0) size 256x48 text run at (0,0) width 256: "Eventhoughthishasareallylongword"
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/caret-invalidation-in-overflow-scroll-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/caret-invalidation-in-overflow-scroll-expected.txt index 8a498e5..604c6af 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/caret-invalidation-in-overflow-scroll-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/caret-invalidation-in-overflow-scroll-expected.txt
@@ -6,8 +6,8 @@ "contentsOpaque": true, "drawsContent": true, "repaintRects": [ - [381, 10, 3, 18], - [378, 10, 3, 18] + [380, 10, 3, 18], + [377, 10, 3, 18] ], "paintInvalidationClients": [ "LayoutBlockFlow DIV id='inner-editor'",
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/details-open-repaint-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/details-open-repaint-expected.txt index 2870ac5..fbce702 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/details-open-repaint-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/details-open-repaint-expected.txt
@@ -16,6 +16,9 @@ "LayoutBlockFlow DIV id='details-content'", "LayoutTextControl INPUT", "LayoutBlockFlow DIV id='inner-editor'", + "HorizontalScrollbar", + "VerticalScrollbar", + "LayoutBlockFlow DIV id='inner-editor'", "LayoutText #text", "LayoutText #text" ]
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/line-flow-with-floats-2-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/line-flow-with-floats-2-expected.txt new file mode 100644 index 0000000..2976f31 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/line-flow-with-floats-2-expected.txt
@@ -0,0 +1,113 @@ +{ + "bounds": [800, 600], + "children": [ + { + "bounds": [800, 600], + "contentsOpaque": true, + "drawsContent": true, + "repaintRects": [ + [485, 0, 15, 600], + [372, 384, 48, 81], + [372, 383, 48, 81], + [303, 421, 66, 19], + [303, 420, 66, 19], + [151, 180, 40, 19], + [149, 180, 45, 20], + [134, 361, 132, 19], + [134, 360, 132, 19], + [65, 381, 304, 59], + [65, 381, 287, 19], + [65, 380, 304, 59], + [65, 380, 287, 19], + [14, 501, 406, 99], + [14, 500, 406, 99], + [14, 441, 354, 59], + [14, 440, 354, 59], + [14, 364, 48, 65], + [14, 363, 48, 65], + [14, 241, 406, 139], + [14, 240, 406, 139], + [14, 199, 354, 1], + [14, 181, 406, 79], + [14, 180, 406, 79], + [8, 160, 418, 440], + [0, 0, 485, 600] + ], + "paintInvalidationClients": [ + "InlineTextBox 'straightened\n'", + "InlineTextBox 'out, and was going to give the hedgehog a'", + "RootInlineBox", + "InlineTextBox 'blow with its head, it\n'", + "InlineTextBox ''", + "InlineTextBox ' twist itself round and look up in her'", + "RootInlineBox", + "LayoutBlockFlow HTML", + "LayoutBlockFlow P", + "LayoutBlockFlow P", + "LayoutText #text", + "InlineTextBox 'The chief difficulty Alice found at first was in managing her'", + "InlineTextBox 'flamingo: she succeeded in getting its body tucked away,'", + "InlineTextBox 'comfortably enough, under her arm, with its legs hanging'", + "InlineTextBox 'down,\n'", + "InlineTextBox 'but generally, just as she had got its neck nicely'", + "InlineTextBox 'straightened\n'", + "InlineTextBox 'out, and was going to give the hedgehog a'", + "InlineTextBox 'blow with its head, it\n'", + "LayoutInline I id='would'", + "LayoutText #text", + "InlineTextBox 'would'", + "LayoutText #text", + "InlineTextBox ' twist itself round and look up in her'", + "InlineTextBox 'face, with\n'", + "InlineTextBox 'such a puzzled expression that she could not help'", + "InlineTextBox 'bursting out\n'", + "InlineTextBox 'laughing: and when she had got its head down, and was'", + "InlineTextBox 'going to\n'", + "LayoutText #text", + "InlineTextBox 'begin again, it was very provoking to find that the'", + "InlineTextBox 'hedgehog had\n'", + "InlineTextBox 'unrolled itself, and was in the act of crawling away:'", + "InlineTextBox 'besides all\n'", + "InlineTextBox 'this, there was generally a ridge or furrow in the way'", + "InlineTextBox 'wherever\n'", + "InlineTextBox 'she wanted to send the hedgehog to, and, as the'", + "InlineTextBox 'doubled-up\n'", + "InlineTextBox 'soldiers were always getting up and walking off to'", + "InlineTextBox 'other parts of\n'", + "InlineTextBox 'the ground, Alice soon came to the conclusion that it'", + "InlineTextBox 'was a very\n'", + "LayoutBlockFlow (floating) SPAN id='blueFloat'", + "LayoutText #text", + "InlineTextBox 'difficult game indeed.\n'", + "LayoutText #text", + "InlineTextBox 'The players all played at once without waiting\n'", + "LayoutBlockFlow (floating) SPAN id='greenFloat'", + "LayoutText #text", + "InlineTextBox 'for'", + "InlineTextBox 'turns,\n'", + "InlineTextBox 'quarrelling all the while, and fighting for the'", + "InlineTextBox 'hedgehogs; and in\n'", + "InlineTextBox 'a very short time '", + "LayoutText #text", + "InlineTextBox 'the Queen'", + "LayoutText #text", + "InlineTextBox 'was in a furious passion, and went\n'", + "InlineTextBox 'stamping about, and'", + "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'", + "InlineTextBox 'her head!\u2019 about'", + "InlineTextBox 'once in a minute.\n'", + "LayoutText #text", + "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'", + "InlineTextBox 'yet had'", + "InlineTextBox 'any dispute with the Queen, but she knew that it might\n'", + "InlineTextBox 'happen any'", + "InlineTextBox 'minute, \u2018and then,\u2019 thought she, \u2018what would become of\n'", + "InlineTextBox 'me?'", + "InlineTextBox 'They\u2019re dreadfully fond of beheading people here; the great'", + "InlineTextBox 'wonder is, that there\u2018s any one left alive!\u2019'", + "VerticalScrollbar" + ] + } + ] +} +
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/line-flow-with-floats-8-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/line-flow-with-floats-8-expected.txt new file mode 100644 index 0000000..148658b4 --- /dev/null +++ b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/line-flow-with-floats-8-expected.txt
@@ -0,0 +1,125 @@ +{ + "bounds": [800, 600], + "children": [ + { + "bounds": [800, 600], + "contentsOpaque": true, + "drawsContent": true, + "repaintRects": [ + [485, 0, 15, 600], + [303, 420, 66, 19], + [143, 420, 64, 19], + [134, 360, 132, 19], + [83, 360, 131, 19], + [65, 380, 304, 59], + [65, 380, 287, 19], + [14, 500, 406, 99], + [14, 480, 406, 99], + [14, 440, 354, 59], + [14, 420, 354, 59], + [14, 380, 354, 59], + [14, 380, 298, 19], + [14, 363, 48, 65], + [8, 586, 418, 14], + [8, 583, 418, 17], + [8, 80, 418, 519], + [0, 0, 485, 600] + ], + "paintInvalidationClients": [ + "LayoutBlockFlow (floating) SPAN id='blueFloat'", + "InlineTextBox 'The chief difficulty Alice found at first was in managing her'", + "RootInlineBox", + "InlineTextBox 'flamingo: she succeeded in getting its body tucked away,'", + "RootInlineBox", + "InlineTextBox 'comfortably enough, under her arm, with its legs hanging'", + "RootInlineBox", + "InlineTextBox 'down,\n'", + "InlineTextBox 'but generally, just as she had got its neck nicely'", + "RootInlineBox", + "InlineTextBox 'straightened\n'", + "InlineTextBox 'out, and was going to give the hedgehog a'", + "RootInlineBox", + "InlineTextBox 'blow with its head, it\n'", + "InlineTextBox 'would'", + "InlineTextBox ' twist itself round and look up in her'", + "RootInlineBox", + "InlineTextBox 'face, with\n'", + "InlineTextBox 'such a puzzled expression that she could not help'", + "RootInlineBox", + "InlineTextBox 'bursting out\n'", + "InlineTextBox 'laughing: and when she had got its head down, and was'", + "RootInlineBox", + "InlineTextBox 'going to\n'", + "InlineTextBox 'begin again, it was very provoking to find that the'", + "RootInlineBox", + "InlineTextBox 'hedgehog had\n'", + "InlineTextBox 'unrolled itself, and was in the act of crawling away:'", + "RootInlineBox", + "InlineTextBox 'besides all\n'", + "InlineTextBox 'this, there was generally a ridge or furrow in the way'", + "RootInlineBox", + "InlineTextBox 'wherever\n'", + "InlineTextBox 'she wanted to send the hedgehog to, and, as the'", + "RootInlineBox", + "InlineTextBox 'doubled-up\n'", + "InlineTextBox 'soldiers were always getting up and walking off to'", + "RootInlineBox", + "InlineTextBox 'other parts of\n'", + "InlineTextBox 'the ground, Alice soon came to the conclusion that it'", + "RootInlineBox", + "InlineTextBox 'was a very\n'", + "InlineTextBox 'difficult game indeed.\n'", + "RootInlineBox", + "InlineTextBox 'The players all played at once without waiting\n'", + "InlineTextBox 'for'", + "RootInlineBox", + "InlineTextBox 'turns,\n'", + "InlineTextBox 'quarrelling all the while, and fighting for the'", + "RootInlineBox", + "InlineTextBox 'hedgehogs; and in\n'", + "InlineTextBox 'a very short time '", + "InlineTextBox 'the Queen'", + "RootInlineBox", + "InlineTextBox 'was in a furious passion, and went\n'", + "InlineTextBox 'stamping about, and'", + "RootInlineBox", + "InlineTextBox 'shouting \u2018Off with his head!\u2019 or \u2018Off with\n'", + "InlineTextBox 'her head!\u2019 about'", + "RootInlineBox", + "InlineTextBox 'once in a minute.\n'", + "RootInlineBox", + "LayoutBlockFlow HTML", + "LayoutBlockFlow P", + "LayoutBlockFlow P", + "LayoutText #text", + "InlineTextBox 'difficult game indeed.\n'", + "LayoutText #text", + "InlineTextBox 'The players all played at once without waiting\n'", + "LayoutText #text", + "InlineTextBox 'for turns,'", + "InlineTextBox 'quarrelling all the while, and fighting for the hedgehogs; and'", + "InlineTextBox 'in\n'", + "InlineTextBox 'a very short time '", + "LayoutText #text", + "InlineTextBox 'the Queen'", + "LayoutText #text", + "InlineTextBox ' was in a furious passion,'", + "InlineTextBox 'and went\n'", + "InlineTextBox 'stamping about, and shouting \u2018Off with his head!\u2019'", + "InlineTextBox 'or \u2018Off with\n'", + "InlineTextBox 'her head!\u2019 about once in a minute.\n'", + "LayoutText #text", + "InlineTextBox 'Alice began to feel very uneasy: to be sure, she had not as\n'", + "InlineTextBox 'yet had'", + "InlineTextBox 'any dispute with the Queen, but she knew that it might\n'", + "InlineTextBox 'happen any'", + "InlineTextBox 'minute, \u2018and then,\u2019 thought she, \u2018what would become of\n'", + "InlineTextBox 'me?'", + "InlineTextBox 'They\u2019re dreadfully fond of beheading people here; the great'", + "InlineTextBox 'wonder is, that there\u2018s any one left alive!\u2019'", + "VerticalScrollbar" + ] + } + ] +} +
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/overflow-scroll-body-appear-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/overflow-scroll-body-appear-expected.txt index 38ec21f5..72c6d6b 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/overflow-scroll-body-appear-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/overflow-scroll-body-appear-expected.txt
@@ -6,6 +6,7 @@ "contentsOpaque": true, "drawsContent": true, "repaintRects": [ + [785, 585, 15, 15], [8, 52, 784, 20], [8, 52, 769, 20], [8, 16, 2000, 2072], @@ -15,9 +16,6 @@ [0, 0, 785, 585] ], "paintInvalidationClients": [ - "HorizontalScrollbar", - "HorizontalScrollbar", - "VerticalScrollbar", "RootInlineBox", "InlineTextBox 'You should see both vertical and horizontal scrollbars.'", "RootInlineBox", @@ -28,7 +26,9 @@ "LayoutView #document", "LayoutBlockFlow BODY", "LayoutBlockFlow P", - "LayoutBlockFlow P" + "LayoutBlockFlow P", + "HorizontalScrollbar", + "VerticalScrollbar" ] } ]
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/repaint-during-scroll-with-zoom-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/repaint-during-scroll-with-zoom-expected.txt index 059f5b1..e7afc173 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/repaint-during-scroll-with-zoom-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/repaint-during-scroll-with-zoom-expected.txt
@@ -17,16 +17,14 @@ [2, 64, 52, 18] ], "paintInvalidationClients": [ - "HorizontalScrollbar", - "LayoutIFrame (positioned) IFRAME", - "VerticalScrollbar", - "LayoutIFrame (positioned) IFRAME", "LayoutIFrame (positioned) IFRAME", "LayoutView #document", "LayoutBlockFlow HTML", "LayoutBlockFlow BODY", "LayoutText #text", - "InlineTextBox 'scroll me'" + "InlineTextBox 'scroll me'", + "HorizontalScrollbar", + "VerticalScrollbar" ] } ]
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/resize-scrollable-iframe-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/resize-scrollable-iframe-expected.txt index a44898b..3949115 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/resize-scrollable-iframe-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/resize-scrollable-iframe-expected.txt
@@ -6,15 +6,13 @@ "contentsOpaque": true, "drawsContent": true, "repaintRects": [ - [293, 108, 15, 285], - [293, 108, 15, 285], + [293, 393, 15, 15], [293, 108, 15, 285], [108, 108, 200, 300], + [93, 193, 15, 15], [93, 108, 200, 285], [93, 108, 15, 85], [8, 393, 285, 15], - [8, 393, 285, 15], - [8, 393, 285, 15], [8, 213, 784, 200], [8, 208, 300, 200], [8, 193, 285, 200], @@ -25,26 +23,13 @@ "paintInvalidationClients": [ "InlineBox", "RootInlineBox", - "HorizontalScrollbar", - "LayoutIFrame IFRAME id='iframe'", - "HorizontalScrollbar", - "LayoutIFrame IFRAME id='iframe'", - "HorizontalScrollbar", - "LayoutIFrame IFRAME id='iframe'", - "HorizontalScrollbar", - "LayoutIFrame IFRAME id='iframe'", - "VerticalScrollbar", - "LayoutIFrame IFRAME id='iframe'", - "VerticalScrollbar", - "LayoutIFrame IFRAME id='iframe'", - "VerticalScrollbar", - "LayoutIFrame IFRAME id='iframe'", - "VerticalScrollbar", - "LayoutIFrame IFRAME id='iframe'", "LayoutBlockFlow (anonymous)", "LayoutBlockFlow (anonymous)", "LayoutIFrame IFRAME id='iframe'", "LayoutView #document", + "LayoutView #document", + "HorizontalScrollbar", + "VerticalScrollbar", "LayoutView #document" ] }
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/shift-relative-positioned-container-with-image-addition-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/shift-relative-positioned-container-with-image-addition-expected.txt index 51655b8c..7492bce2 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/shift-relative-positioned-container-with-image-addition-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/shift-relative-positioned-container-with-image-addition-expected.txt
@@ -6,7 +6,6 @@ "contentsOpaque": true, "drawsContent": true, "repaintRects": [ - [723, 94, 15, 90], [58, 236, 489, 537], [58, 142, 489, 537], [18, 102, 712, 74], @@ -23,7 +22,7 @@ [0, 0, 785, 742] ], "paintInvalidationClients": [ - "LayoutIFrame IFRAME id='iframe'", + "VerticalScrollbar", "LayoutView #document", "LayoutBlockFlow HTML", "LayoutIFrame IFRAME id='iframe'", @@ -31,6 +30,7 @@ "LayoutView #document", "LayoutBlockFlow HTML", "LayoutBlockFlow BODY", + "LayoutView #document", "LayoutBlockFlow (relative positioned) DIV class='relative'", "LayoutBlockFlow (relative positioned) DIV class='relative paddingTop'", "LayoutImage IMG",
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/text-match-document-change-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/text-match-document-change-expected.txt index aaa7e49..b15f962 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/text-match-document-change-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/text-match-document-change-expected.txt
@@ -7,7 +7,6 @@ "drawsContent": true, "repaintRects": [ [295, 102, 15, 400], - [295, 102, 15, 400], [18, 170, 269, 332], [18, 150, 269, 352], [18, 130, 269, 40], @@ -22,15 +21,12 @@ "LayoutText #text", "RootInlineBox", "RootInlineBox", - "VerticalScrollbar", - "LayoutIFrame (positioned) IFRAME id='iframe'", - "VerticalScrollbar", - "LayoutIFrame (positioned) IFRAME id='iframe'", "LayoutBlockFlow HTML", "LayoutBlockFlow DIV id='to-be-changed'", "LayoutText #text", "InlineTextBox 'After change'", - "LayoutBlockFlow DIV" + "LayoutBlockFlow DIV", + "VerticalScrollbar" ] } ]
diff --git a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/window-resize-vertical-writing-mode-expected.txt b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/window-resize-vertical-writing-mode-expected.txt index 94beeadc..24524fe 100644 --- a/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/window-resize-vertical-writing-mode-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win-xp/virtual/syncpaint/fast/repaint/window-resize-vertical-writing-mode-expected.txt
@@ -20,7 +20,6 @@ "RootInlineBox", "InlineTextBox 'AAAA AAAA AAAA'", "InlineTextBox 'AAAA AAAA'", - "VerticalScrollbar", "LayoutView #document", "LayoutView #document", "LayoutBlockFlow HTML", @@ -49,7 +48,6 @@ [0, 0, 300, 300] ], "paintInvalidationClients": [ - "HorizontalScrollbar", "LayoutView #document", "LayoutView #document", "LayoutBlockFlow HTML",
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/forms/basic-textareas-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/forms/basic-textareas-expected.txt index 9c6e9eb0..63c12b7 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/forms/basic-textareas-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/forms/basic-textareas-expected.txt
@@ -634,14 +634,11 @@ text run at (0,32) width 48: "UVWXYZ" text run at (0,48) width 160: "abcdefghijklmnopqrst" text run at (0,64) width 16: "uv" - layer at (367,693) size 181x38 clip at (368,694) size 164x36 scrollHeight 68 + layer at (367,693) size 181x38 clip at (368,694) size 179x21 scrollWidth 546 LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] - LayoutBlockFlow {DIV} at (3,3) size 160x64 - LayoutText {#text} at (0,0) size 160x64 - text run at (0,0) width 160: "Lorem ipsum dolor A" - text run at (0,16) width 160: "BCDEFGHIJKLMNOPQRSTU" - text run at (0,32) width 160: "VWXYZ abcdefghijklmn" - text run at (0,48) width 64: "opqrstuv" + LayoutBlockFlow {DIV} at (3,3) size 175x16 + LayoutText {#text} at (0,0) size 544x16 + text run at (0,0) width 544: "Lorem ipsum dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" layer at (550,693) size 181x38 clip at (551,694) size 164x36 scrollHeight 84 LayoutTextControl {TEXTAREA} at (1,33) size 181x38 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] LayoutBlockFlow {DIV} at (3,3) size 160x80 @@ -1367,14 +1364,11 @@ text run at (0,32) width 48: "UVWXYZ" text run at (0,48) width 160: "abcdefghijklmnopqrst" text run at (0,64) width 16: "uv" - layer at (363,659) size 179x36 clip at (364,660) size 162x34 scrollHeight 66 + layer at (363,659) size 179x36 clip at (364,660) size 177x19 scrollWidth 546 LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] - LayoutBlockFlow {DIV} at (3,3) size 160x64 - LayoutText {#text} at (0,0) size 160x64 - text run at (0,0) width 160: "Lorem ipsum dolor A" - text run at (0,16) width 160: "BCDEFGHIJKLMNOPQRSTU" - text run at (0,32) width 160: "VWXYZ abcdefghijklmn" - text run at (0,48) width 64: "opqrstuv" + LayoutBlockFlow {DIV} at (3,3) size 175x16 + LayoutText {#text} at (0,0) size 544x16 + text run at (0,0) width 544: "Lorem ipsum dolor ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuv" layer at (544,659) size 179x36 clip at (545,660) size 162x34 scrollHeight 82 LayoutTextControl {TEXTAREA} at (1,33) size 179x36 [bgcolor=#FFFFFF] [border: (1px solid #A9A9A9)] LayoutBlockFlow {DIV} at (3,3) size 160x80
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/text/whitespace/pre-break-word-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/text/whitespace/pre-break-word-expected.png deleted file mode 100644 index febc828..0000000 --- a/third_party/WebKit/LayoutTests/platform/win/fast/text/whitespace/pre-break-word-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/text/whitespace/pre-break-word-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/text/whitespace/pre-break-word-expected.txt deleted file mode 100644 index e74b2bd..0000000 --- a/third_party/WebKit/LayoutTests/platform/win/fast/text/whitespace/pre-break-word-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 154x130 [border: (2px solid #FF0000)] - LayoutText {#text} at (2,2) size 148x125 - text run at (2,2) width 148: "Even though this div is" - text run at (2,20) width 148: " white-space pre, the te" - text run at (2,38) width 145: "xt inside should still w" - text run at (2,56) width 148: "rap to multiple lines be" - text run at (2,74) width 143: "cause of the word-wra" - text run at (2,92) width 144: "p:break-word CSS pro" - text run at (2,110) width 36: "perty."
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/text/word-break-expected.png b/third_party/WebKit/LayoutTests/platform/win/fast/text/word-break-expected.png index 159dd1d..55fa55f 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/text/word-break-expected.png +++ b/third_party/WebKit/LayoutTests/platform/win/fast/text/word-break-expected.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/fast/text/word-break-expected.txt b/third_party/WebKit/LayoutTests/platform/win/fast/text/word-break-expected.txt index becb0595..6e19c4e7 100644 --- a/third_party/WebKit/LayoutTests/platform/win/fast/text/word-break-expected.txt +++ b/third_party/WebKit/LayoutTests/platform/win/fast/text/word-break-expected.txt
@@ -1,8 +1,8 @@ -layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 1040 +layer at (0,0) size 800x600 clip at (0,0) size 785x600 scrollHeight 976 LayoutView at (0,0) size 800x600 -layer at (0,0) size 785x1040 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow {HTML} at (0,0) size 785x1040 - LayoutBlockFlow {BODY} at (8,8) size 769x1024 +layer at (0,0) size 785x976 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow {HTML} at (0,0) size 785x976 + LayoutBlockFlow {BODY} at (8,8) size 769x960 LayoutBlockFlow (anonymous) at (0,0) size 769x18 LayoutText {#text} at (0,0) size 700x17 text run at (0,0) width 700: "This example tests that word-break properly shrinks a cell to one character per line when it is set to break-all." @@ -51,15 +51,11 @@ text run at (6,6) width 168: "This cell should grow" LayoutBlockFlow (anonymous) at (0,398) size 769x18 LayoutBR {BR} at (0,0) size 0x17 - LayoutBlockFlow {PRE} at (0,429) size 110x90 [border: (5px solid #000000)] - LayoutText {#text} at (5,5) size 96x80 - text run at (5,5) width 96: "Thislongword" - text run at (5,21) width 96: "shouldnotget" - text run at (5,37) width 96: "brokenbutsho" - text run at (5,53) width 96: "uldstickouto" - text run at (5,69) width 64: "fthepre." - text run at (69,69) width 0: " " - LayoutBlockFlow (anonymous) at (0,532) size 769x72 + LayoutBlockFlow {PRE} at (0,429) size 110x26 [border: (5px solid #000000)] + LayoutText {#text} at (5,5) size 448x16 + text run at (5,5) width 448: "Thislongwordshouldnotgetbrokenbutshouldstickoutofthepre." + text run at (453,5) width 0: " " + LayoutBlockFlow (anonymous) at (0,468) size 769x72 LayoutBR {BR} at (0,0) size 0x17 LayoutText {#text} at (0,18) size 750x53 text run at (0,18) width 641: "This test makes sure floating and positioned elements do the right thing with word-break: break-all. " @@ -67,16 +63,16 @@ text run at (0,36) width 345: "width should be less than the containing block width. " text run at (344,36) width 406: "The breaking should be \"dumb\" and just occur when the end of" text run at (0,54) width 88: "the line is hit." - LayoutBlockFlow {DIV} at (0,604) size 304x52 [border: (2px solid #000000)] + LayoutBlockFlow {DIV} at (0,540) size 304x52 [border: (2px solid #000000)] LayoutBlockFlow (floating) {DIV} at (2,2) size 300x48 LayoutText {#text} at (0,0) size 296x48 text run at (0,0) width 296: "Eventhoughthishasareallylongword itsh" text run at (0,16) width 296: "ouldnotstick out oftheenclosing300pxb" text run at (0,32) width 40: "lock." LayoutBR {BR} at (302,2) size 0x16 - LayoutBlockFlow (anonymous) at (0,656) size 769x18 + LayoutBlockFlow (anonymous) at (0,592) size 769x18 LayoutBR {BR} at (0,0) size 0x17 - LayoutBlockFlow (anonymous) at (0,778) size 769x72 + LayoutBlockFlow (anonymous) at (0,714) size 769x72 LayoutBR {BR} at (0,0) size 0x17 LayoutText {#text} at (0,18) size 749x53 text run at (0,18) width 658: "This test makes sure floating and positioned elements do the right thing with word-break: break-word. " @@ -84,26 +80,26 @@ text run at (0,36) width 345: "width should be less than the containing block width. " text run at (344,36) width 402: "The breaking should be \"smart\" and be like word-wrap: break-" text run at (0,54) width 581: "word, with words preferring to wrap first before allowing break opportunities within them." - LayoutBlockFlow {DIV} at (0,850) size 304x52 [border: (2px solid #000000)] + LayoutBlockFlow {DIV} at (0,786) size 304x52 [border: (2px solid #000000)] LayoutBlockFlow (floating) {DIV} at (2,2) size 300x48 LayoutText {#text} at (0,0) size 256x48 text run at (0,0) width 256: "Eventhoughthishasareallylongword" text run at (0,16) width 160: "itshouldnotstick out" text run at (0,32) width 200: "oftheenclosing300pxblock." LayoutBR {BR} at (302,2) size 0x16 - LayoutBlockFlow (anonymous) at (0,902) size 769x18 + LayoutBlockFlow (anonymous) at (0,838) size 769x18 LayoutBR {BR} at (0,0) size 0x17 -layer at (8,682) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow (relative positioned) {DIV} at (0,674) size 304x104 [border: (2px solid #000000)] -layer at (10,684) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 +layer at (8,618) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow (relative positioned) {DIV} at (0,610) size 304x104 [border: (2px solid #000000)] +layer at (10,620) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 LayoutBlockFlow (positioned) {DIV} at (2,2) size 300x48 LayoutText {#text} at (0,0) size 296x48 text run at (0,0) width 296: "Eventhoughthishasareallylongword itsh" text run at (0,16) width 296: "ouldnotstick out oftheenclosing300pxb" text run at (0,32) width 40: "lock." -layer at (8,928) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 - LayoutBlockFlow (relative positioned) {DIV} at (0,920) size 304x104 [border: (2px solid #000000)] -layer at (10,930) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 +layer at (8,864) size 304x104 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 + LayoutBlockFlow (relative positioned) {DIV} at (0,856) size 304x104 [border: (2px solid #000000)] +layer at (10,866) size 300x48 backgroundClip at (0,0) size 785x600 clip at (0,0) size 785x600 LayoutBlockFlow (positioned) {DIV} at (2,2) size 300x48 LayoutText {#text} at (0,0) size 256x48 text run at (0,0) width 256: "Eventhoughthishasareallylongword"
diff --git a/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt b/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt index f122f17..c29e311 100644 --- a/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/pointerevent/fast/events/pointerevents/mouse-pointer-event-properties-expected.txt
@@ -11,7 +11,6 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -36,7 +35,6 @@ PASS lastPointerEvent.bubbles is false PASS lastPointerEvent.cancelable is false PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -61,7 +59,6 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -88,7 +85,6 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 25 PASS lastPointerEvent.clientY is 41 @@ -113,7 +109,6 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -140,7 +135,6 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -165,7 +159,6 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -190,7 +183,6 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -215,7 +207,6 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -240,7 +231,6 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -265,7 +255,6 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 23 PASS lastPointerEvent.clientY is 31 @@ -624,7 +613,6 @@ PASS lastPointerEvent.bubbles is true PASS lastPointerEvent.cancelable is true PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 13 PASS lastPointerEvent.clientY is 21 @@ -649,7 +637,6 @@ PASS lastPointerEvent.bubbles is false PASS lastPointerEvent.cancelable is false PASS lastPointerEvent.pointerId is 0 -PASS lastPointerEvent.pointerType is "mouse" PASS lastPointerEvent.isPrimary is true PASS lastPointerEvent.clientX is 13 PASS lastPointerEvent.clientY is 21
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt index 2a22fe9..77c6b6e 100644 --- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -3622,8 +3622,13 @@ getter persisted method constructor interface PasswordCredential : Credential + getter additionalData + getter idName + getter passwordName method constructor - method toFormData + setter additionalData + setter idName + setter passwordName interface Path2D method addPath method arc
diff --git a/third_party/WebKit/Source/core/animation/NumberPropertyFunctions.cpp b/third_party/WebKit/Source/core/animation/NumberPropertyFunctions.cpp index 89c4c8e..166efd8c 100644 --- a/third_party/WebKit/Source/core/animation/NumberPropertyFunctions.cpp +++ b/third_party/WebKit/Source/core/animation/NumberPropertyFunctions.cpp
@@ -88,33 +88,37 @@ double NumberPropertyFunctions::clampNumber(CSSPropertyID property, double value) { switch (property) { - case CSSPropertyOrphans: - case CSSPropertyWebkitColumnCount: - case CSSPropertyWidows: - return clampTo<double>(round(value), 1); - case CSSPropertyStrokeMiterlimit: - return clampTo<double>(value, 1); + return clampTo<float>(value, 1); case CSSPropertyFloodOpacity: case CSSPropertyStopOpacity: case CSSPropertyStrokeOpacity: case CSSPropertyShapeImageThreshold: - return clampTo<double>(value, 0, 1); + return clampTo<float>(value, 0, 1); case CSSPropertyFillOpacity: case CSSPropertyOpacity: - return clampTo<double>(value, 0, nextafterf(1, 0)); + return clampTo<float>(value, 0, nextafterf(1, 0)); case CSSPropertyFlexGrow: case CSSPropertyFlexShrink: case CSSPropertyFontSizeAdjust: case CSSPropertyLineHeight: - return clampTo<double>(value, 0); + return clampTo<float>(value, 0); + + case CSSPropertyOrphans: + case CSSPropertyWidows: + return clampTo<short>(round(value), 1); + + case CSSPropertyWebkitColumnCount: + return clampTo<unsigned short>(round(value), 1); case CSSPropertyWebkitColumnRuleWidth: + return clampTo<unsigned short>(round(value)); + case CSSPropertyZIndex: - return round(value); + return clampTo<int>(round(value)); default: ASSERT_NOT_REACHED();
diff --git a/third_party/WebKit/Source/core/css/CSSGradientValue.cpp b/third_party/WebKit/Source/core/css/CSSGradientValue.cpp index cd3e3fd5..687ade4 100644 --- a/third_party/WebKit/Source/core/css/CSSGradientValue.cpp +++ b/third_party/WebKit/Source/core/css/CSSGradientValue.cpp
@@ -1132,22 +1132,23 @@ ? CircleEndShape : EllipseEndShape; + FloatSize floatSize(size); switch (m_sizingBehavior ? m_sizingBehavior->getValueID() : 0) { case CSSValueContain: case CSSValueClosestSide: - secondRadius = radiusToSide(secondPoint, size, shape, + secondRadius = radiusToSide(secondPoint, floatSize, shape, [] (float a, float b) { return a < b; }); break; case CSSValueFarthestSide: - secondRadius = radiusToSide(secondPoint, size, shape, + secondRadius = radiusToSide(secondPoint, floatSize, shape, [] (float a, float b) { return a > b; }); break; case CSSValueClosestCorner: - secondRadius = radiusToCorner(secondPoint, size, shape, + secondRadius = radiusToCorner(secondPoint, floatSize, shape, [] (float a, float b) { return a < b; }); break; default: - secondRadius = radiusToCorner(secondPoint, size, shape, + secondRadius = radiusToCorner(secondPoint, floatSize, shape, [] (float a, float b) { return a > b; }); break; }
diff --git a/third_party/WebKit/Source/core/css/DragUpdateTest.cpp b/third_party/WebKit/Source/core/css/DragUpdateTest.cpp index a816f122..b05dbe6 100644 --- a/third_party/WebKit/Source/core/css/DragUpdateTest.cpp +++ b/third_party/WebKit/Source/core/css/DragUpdateTest.cpp
@@ -40,18 +40,18 @@ ASSERT_EQ(1U, accessCount); } -TEST(DragUpdateTest, ChildrenOrSiblingsAffectedByDragUpdate) +TEST(DragUpdateTest, ChildAffectedByDragUpdate) { // Check that when dragging the div in the document below, you get a - // full subtree style recalc. + // single element style recalc. OwnPtr<DummyPageHolder> dummyPageHolder = DummyPageHolder::create(IntSize(800, 600)); HTMLDocument& document = toHTMLDocument(dummyPageHolder->document()); - document.documentElement()->setInnerHTML("<style>div {width:100px;height:100px} div:-webkit-drag span { background-color: green }</style>" + document.documentElement()->setInnerHTML("<style>div {width:100px;height:100px} div:-webkit-drag .drag { background-color: green }</style>" "<div>" "<span></span>" "<span></span>" - "<span></span>" + "<span class='drag'></span>" "<span></span>" "</div>", ASSERT_NO_EXCEPTION); @@ -63,7 +63,34 @@ unsigned accessCount = document.styleEngine().resolverAccessCount() - startCount; - ASSERT_EQ(5U, accessCount); + ASSERT_EQ(1U, accessCount); +} + +TEST(DragUpdateTest, SiblingAffectedByDragUpdate) +{ + // Check that when dragging the div in the document below, you get a + // single element style recalc. + + OwnPtr<DummyPageHolder> dummyPageHolder = DummyPageHolder::create(IntSize(800, 600)); + HTMLDocument& document = toHTMLDocument(dummyPageHolder->document()); + document.documentElement()->setInnerHTML("<style>div {width:100px;height:100px} div:-webkit-drag + .drag { background-color: green }</style>" + "<div>" + "<span></span>" + "<span></span>" + "<span></span>" + "<span></span>" + "</div>" + "<span class='drag'></span>", ASSERT_NO_EXCEPTION); + + document.updateLayout(); + unsigned startCount = document.styleEngine().resolverAccessCount(); + + document.documentElement()->layoutObject()->updateDragState(true); + document.updateLayout(); + + unsigned accessCount = document.styleEngine().resolverAccessCount() - startCount; + + ASSERT_EQ(1U, accessCount); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/RuleFeature.cpp b/third_party/WebKit/Source/core/css/RuleFeature.cpp index afb5849ee..3c5c6b7 100644 --- a/third_party/WebKit/Source/core/css/RuleFeature.cpp +++ b/third_party/WebKit/Source/core/css/RuleFeature.cpp
@@ -288,6 +288,7 @@ case CSSSelector::PseudoAnyLink: case CSSSelector::PseudoAutofill: case CSSSelector::PseudoHover: + case CSSSelector::PseudoDrag: case CSSSelector::PseudoFocus: case CSSSelector::PseudoActive: case CSSSelector::PseudoChecked:
diff --git a/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp b/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp index dde8e17..4873fece 100644 --- a/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp +++ b/third_party/WebKit/Source/core/css/resolver/AnimatedStyleBuilder.cpp
@@ -467,7 +467,7 @@ style->setOpacity(clampTo<float>(toAnimatableDouble(value)->toDouble(), 0, nextafterf(1, 0))); return; case CSSPropertyOrphans: - style->setOrphans(clampTo<unsigned short>(round(toAnimatableDouble(value)->toDouble()), 1)); + style->setOrphans(clampTo<short>(round(toAnimatableDouble(value)->toDouble()), 1)); return; case CSSPropertyOutlineColor: style->setOutlineColor(toAnimatableColor(value)->color()); @@ -663,7 +663,7 @@ style->setTransformOriginZ(toAnimatableDouble(value)->toDouble()); return; case CSSPropertyWidows: - style->setWidows(clampTo<unsigned short>(round(toAnimatableDouble(value)->toDouble()), 1)); + style->setWidows(clampTo<short>(round(toAnimatableDouble(value)->toDouble()), 1)); return; case CSSPropertyWidth: style->setWidth(animatableValueToLength(value, state, ValueRangeNonNegative));
diff --git a/third_party/WebKit/Source/core/dom/URLSearchParams.h b/third_party/WebKit/Source/core/dom/URLSearchParams.h index 18677ee..5b3ea65 100644 --- a/third_party/WebKit/Source/core/dom/URLSearchParams.h +++ b/third_party/WebKit/Source/core/dom/URLSearchParams.h
@@ -46,6 +46,7 @@ // Internal helpers PassRefPtr<EncodedFormData> encodeFormData() const; + const Vector<std::pair<String, String>>& params() const { return m_params; } DECLARE_TRACE();
diff --git a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp index a51beb24..a60eecd 100644 --- a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp +++ b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp
@@ -1253,7 +1253,7 @@ LayoutBlockFlow& containingBlock = root->block(); FloatPoint absoluteBlockPoint = containingBlock.localToAbsolute(FloatPoint()); if (containingBlock.hasOverflowClip()) - absoluteBlockPoint -= containingBlock.scrolledContentOffset(); + absoluteBlockPoint -= FloatSize(containingBlock.scrolledContentOffset()); if (root->block().isHorizontalWritingMode()) return LayoutPoint(lineDirectionPoint - absoluteBlockPoint.x(), root->blockDirectionPointInLine());
diff --git a/third_party/WebKit/Source/core/events/PointerEvent.cpp b/third_party/WebKit/Source/core/events/PointerEvent.cpp index 5f21117..d8fa922 100644 --- a/third_party/WebKit/Source/core/events/PointerEvent.cpp +++ b/third_party/WebKit/Source/core/events/PointerEvent.cpp
@@ -39,8 +39,8 @@ // TODO(crbug.com/537319): Define a constant somewhere for mouse id. pointerEventInit.setPointerId(0); - - pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(WebPointerProperties::PointerType::Mouse)); + pointerEventInit.setPointerType( + pointerTypeNameForWebPointPointerType(mouseEvent.pointerProperties().pointerType)); pointerEventInit.setIsPrimary(true); pointerEventInit.setScreenX(mouseEvent.globalPosition().x()); @@ -51,6 +51,10 @@ pointerEventInit.setButton(mouseEvent.button()); pointerEventInit.setButtons(MouseEvent::platformModifiersToButtons(mouseEvent.modifiers())); + pointerEventInit.setPressure(mouseEvent.pointerProperties().force); + pointerEventInit.setTiltX(mouseEvent.pointerProperties().tiltX); + pointerEventInit.setTiltY(mouseEvent.pointerProperties().tiltY); + UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, mouseEvent.modifiers()); pointerEventInit.setBubbles(type != EventTypeNames::pointerenter @@ -76,20 +80,20 @@ bool pointerReleasedOrCancelled = pointState == PlatformTouchPoint::TouchReleased || pointState == PlatformTouchPoint::TouchCancelled; - const WebPointerProperties::PointerType pointerType = touchPoint.pointerProperties().pointerType; - const String& pointerTypeStr = pointerTypeNameForWebPointPointerType(pointerType); bool isEnterOrLeave = false; PointerEventInit pointerEventInit; pointerEventInit.setPointerId(pointerId); + pointerEventInit.setPointerType( + pointerTypeNameForWebPointPointerType(touchPoint.pointerProperties().pointerType)); + pointerEventInit.setIsPrimary(isPrimary); + pointerEventInit.setWidth(width); pointerEventInit.setHeight(height); pointerEventInit.setPressure(touchPoint.force()); pointerEventInit.setTiltX(touchPoint.pointerProperties().tiltX); pointerEventInit.setTiltY(touchPoint.pointerProperties().tiltY); - pointerEventInit.setPointerType(pointerTypeStr); - pointerEventInit.setIsPrimary(isPrimary); pointerEventInit.setScreenX(touchPoint.screenPos().x()); pointerEventInit.setScreenY(touchPoint.screenPos().y()); pointerEventInit.setClientX(clientX);
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp index dd65fe3..30daa7e 100644 --- a/third_party/WebKit/Source/core/frame/FrameView.cpp +++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
@@ -3550,7 +3550,7 @@ if (scrollbarRect.size() == graphicsLayer->size()) return; - graphicsLayer->setSize(scrollbarRect.size()); + graphicsLayer->setSize(FloatSize(scrollbarRect.size())); if (graphicsLayer->hasContentsLayer()) { graphicsLayer->setContentsRect(IntRect(0, 0, scrollbarRect.width(), scrollbarRect.height())); @@ -3569,7 +3569,7 @@ graphicsLayer->setPosition(cornerRect.location()); if (cornerRect.size() != graphicsLayer->size()) graphicsLayer->setNeedsDisplay(); - graphicsLayer->setSize(cornerRect.size()); + graphicsLayer->setSize(FloatSize(cornerRect.size())); } void FrameView::positionScrollbarLayers()
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp index f5b3344..2efdc85 100644 --- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp +++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -933,8 +933,8 @@ } return frame->isMainFrame() && !host->settings().inertVisualViewport() - ? host->visualViewport().visibleRect().size() - : view->visibleContentRect(IncludeScrollbars).size(); + ? FloatSize(host->visualViewport().visibleRect().size()) + : FloatSize(view->visibleContentRect(IncludeScrollbars).size()); } int LocalDOMWindow::innerHeight() const
diff --git a/third_party/WebKit/Source/core/frame/PageScaleConstraintsSet.cpp b/third_party/WebKit/Source/core/frame/PageScaleConstraintsSet.cpp index 59638ca..43b05a66 100644 --- a/third_party/WebKit/Source/core/frame/PageScaleConstraintsSet.cpp +++ b/third_party/WebKit/Source/core/frame/PageScaleConstraintsSet.cpp
@@ -58,7 +58,7 @@ void PageScaleConstraintsSet::updatePageDefinedConstraints(const ViewportDescription& description, Length legacyFallbackWidth) { - m_pageDefinedConstraints = description.resolve(m_viewSize, legacyFallbackWidth); + m_pageDefinedConstraints = description.resolve(FloatSize(m_viewSize), legacyFallbackWidth); m_constraintsDirty = true; } @@ -216,16 +216,16 @@ if (useWideViewport && (description.maxWidth.isAuto() || description.maxWidth.type() == ExtendToZoom) && description.zoom != 1.0f) { if (layoutFallbackWidth) adjustedLayoutSizeWidth = layoutFallbackWidth; - adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, m_viewSize); + adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, FloatSize(m_viewSize)); } else if (!useWideViewport) { const float nonWideScale = description.zoom < 1 && description.maxWidth.type() != DeviceWidth && description.maxWidth.type() != DeviceHeight ? -1 : oldInitialScale; - adjustedLayoutSizeWidth = getLayoutWidthForNonWideViewport(m_viewSize, nonWideScale) / targetDensityDPIFactor; + adjustedLayoutSizeWidth = getLayoutWidthForNonWideViewport(FloatSize(m_viewSize), nonWideScale) / targetDensityDPIFactor; float newInitialScale = targetDensityDPIFactor; if (m_userAgentConstraints.initialScale != -1 && (description.maxWidth.type() == DeviceWidth || ((description.maxWidth.isAuto() || description.maxWidth.type() == ExtendToZoom) && description.zoom == -1))) { adjustedLayoutSizeWidth /= m_userAgentConstraints.initialScale; newInitialScale = m_userAgentConstraints.initialScale; } - adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, m_viewSize); + adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, FloatSize(m_viewSize)); if (description.zoom < 1) { m_pageDefinedConstraints.initialScale = newInitialScale; if (m_pageDefinedConstraints.minimumScale != -1) @@ -242,7 +242,7 @@ m_pageDefinedConstraints.maximumScale = m_pageDefinedConstraints.initialScale; if (description.maxWidth.isAuto() || description.maxWidth.type() == ExtendToZoom || description.maxWidth.type() == DeviceWidth) { adjustedLayoutSizeWidth = m_viewSize.width() / targetDensityDPIFactor; - adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, m_viewSize); + adjustedLayoutSizeHeight = computeHeightByAspectRatio(adjustedLayoutSizeWidth, FloatSize(m_viewSize)); } }
diff --git a/third_party/WebKit/Source/core/frame/VisualViewport.cpp b/third_party/WebKit/Source/core/frame/VisualViewport.cpp index 0eedd169..b13c3b0 100644 --- a/third_party/WebKit/Source/core/frame/VisualViewport.cpp +++ b/third_party/WebKit/Source/core/frame/VisualViewport.cpp
@@ -106,7 +106,7 @@ m_size = size; if (m_innerViewportContainerLayer) { - m_innerViewportContainerLayer->setSize(m_size); + m_innerViewportContainerLayer->setSize(FloatSize(m_size)); // Need to re-compute sizes for the overlay scrollbars. initializeScrollbars(); @@ -130,7 +130,7 @@ // In unit tests we may not have initialized the layer tree. if (m_innerViewportScrollLayer) - m_innerViewportScrollLayer->setSize(contentsSize()); + m_innerViewportScrollLayer->setSize(FloatSize(contentsSize())); clampToBoundaries(); } @@ -319,7 +319,7 @@ // Set masks to bounds so the compositor doesn't clobber a manually // set inner viewport container layer size. m_innerViewportContainerLayer->setMasksToBounds(frameHost().settings().mainFrameClipsContent()); - m_innerViewportContainerLayer->setSize(m_size); + m_innerViewportContainerLayer->setSize(FloatSize(m_size)); m_innerViewportScrollLayer->platformLayer()->setScrollClipLayer( m_innerViewportContainerLayer->platformLayer()); @@ -389,7 +389,7 @@ // Use the GraphicsLayer to position the scrollbars. scrollbarGraphicsLayer->setPosition(IntPoint(xPosition, yPosition)); - scrollbarGraphicsLayer->setSize(IntSize(width, height)); + scrollbarGraphicsLayer->setSize(FloatSize(width, height)); scrollbarGraphicsLayer->setContentsRect(IntRect(0, 0, width, height)); } @@ -484,7 +484,7 @@ } frameViewSize.scale(m_scale); - frameViewSize = flooredIntSize(frameViewSize); + frameViewSize = FloatSize(flooredIntSize(frameViewSize)); FloatSize viewportSize(m_size); viewportSize.expand(0, m_topControlsAdjustment);
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp index 7295109..2769ce4 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
@@ -283,14 +283,14 @@ if (!box) continue; - if (!rootHasSelectedChildren && box->layoutObject().selectionState() != SelectionNone) + if (!rootHasSelectedChildren && box->lineLayoutItem().selectionState() != SelectionNone) rootHasSelectedChildren = true; // If we have no parent box yet, or if the run is not simply a sibling, // then we need to construct inline boxes as necessary to properly enclose the // run's inline box. Segments can only be siblings at the root level, as // they are positioned separately. - if (!parentBox || parentBox->layoutObject() != r->m_object->parent()) { + if (!parentBox || (!parentBox->lineLayoutItem().isEqual(r->m_object->parent()))) { // Create new inline boxes all the way back to the appropriate insertion point. parentBox = createLineBoxes(r->m_object->parent(), lineInfo, box); } else {
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp index 80c7de4..14b61ef 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -2483,6 +2483,13 @@ return -1; } +bool LayoutBox::stretchesToViewportInQuirksMode() const +{ + if (!isDocumentElement() && !isBody()) + return false; + return style()->logicalHeight().isAuto() && !isFloatingOrOutOfFlowPositioned() && !isInline() && !flowThreadContainingBlock(); +} + bool LayoutBox::skipContainingBlockForPercentHeightCalculation(const LayoutBox* containingBlock) const { // If the writing mode of the containing block is orthogonal to ours, it means that we shouldn't
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.h b/third_party/WebKit/Source/core/layout/LayoutBox.h index 2c3f18c..92d282e 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBox.h +++ b/third_party/WebKit/Source/core/layout/LayoutBox.h
@@ -621,10 +621,7 @@ void computeLogicalWidth(LogicalExtentComputedValues&) const; - bool stretchesToViewport() const - { - return document().inQuirksMode() && style()->logicalHeight().isAuto() && !isFloatingOrOutOfFlowPositioned() && (isDocumentElement() || isBody()) && !isInline(); - } + bool stretchesToViewport() const { return document().inQuirksMode() && stretchesToViewportInQuirksMode(); } virtual LayoutSize intrinsicSize() const { return LayoutSize(); } LayoutUnit intrinsicLogicalWidth() const { return style()->isHorizontalWritingMode() ? intrinsicSize().width() : intrinsicSize().height(); } @@ -900,6 +897,7 @@ // Returns true if we queued up a paint invalidation. bool invalidatePaintOfLayerRectsForImage(WrappedImagePtr, const FillLayer&, bool drawingBackground); + bool stretchesToViewportInQuirksMode() const; bool skipContainingBlockForPercentHeightCalculation(const LayoutBox* containingBlock) const; LayoutUnit containingBlockLogicalWidthForPositioned(const LayoutBoxModelObject* containingBlock, bool checkForPerpendicularWritingMode = true) const;
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp index 1a84b2d..efec9b15 100644 --- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -2685,7 +2685,7 @@ setIsDragging(dragOn); if (valueChanged && node()) { if (node()->isElementNode() && toElement(node())->childrenOrSiblingsAffectedByDrag()) - node()->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::Drag)); + document().styleEngine().pseudoStateChangedForElement(CSSSelector::PseudoDrag, *toElement(node())); else if (style()->affectedByDrag()) node()->setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::Drag)); }
diff --git a/third_party/WebKit/Source/core/layout/LayoutView.cpp b/third_party/WebKit/Source/core/layout/LayoutView.cpp index 18b2dbe..28d82f143 100644 --- a/third_party/WebKit/Source/core/layout/LayoutView.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutView.cpp
@@ -498,7 +498,7 @@ { if (wasFixed) *wasFixed = false; - quads.append(FloatRect(FloatPoint(), layer()->size())); + quads.append(FloatRect(FloatPoint(), FloatSize(layer()->size()))); } static LayoutObject* layoutObjectAfterPosition(LayoutObject* object, unsigned offset)
diff --git a/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h b/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h index fb64879..5898a3e 100644 --- a/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h +++ b/third_party/WebKit/Source/core/layout/api/LineLayoutItem.h
@@ -304,6 +304,11 @@ return m_layoutObject->hitTest(result, locationInContainer, accumulatedOffset, filter); } + SelectionState selectionState() const + { + return m_layoutObject->selectionState(); + } + Color selectionBackgroundColor() const { return m_layoutObject->selectionBackgroundColor();
diff --git a/third_party/WebKit/Source/core/layout/api/LineLayoutText.h b/third_party/WebKit/Source/core/layout/api/LineLayoutText.h index 31b63ff4..1eac45e 100644 --- a/third_party/WebKit/Source/core/layout/api/LineLayoutText.h +++ b/third_party/WebKit/Source/core/layout/api/LineLayoutText.h
@@ -127,11 +127,6 @@ return toText()->hyphenWidth(font, textDirection); } - SelectionState selectionState() const - { - return toText()->selectionState(); - } - void selectionStartEnd(int& spos, int& epos) const { return toText()->selectionStartEnd(spos, epos);
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp index d61ec02..29fc0ae 100644 --- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp +++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
@@ -33,6 +33,7 @@ #include "core/frame/FrameHost.h" #include "core/frame/FrameView.h" #include "core/frame/RemoteFrame.h" +#include "core/frame/Settings.h" #include "core/html/HTMLCanvasElement.h" #include "core/html/HTMLIFrameElement.h" #include "core/html/HTMLMediaElement.h" @@ -663,7 +664,7 @@ } squashingLayer->setPosition(squashLayerBounds.location()); - squashingLayer->setSize(squashLayerBounds.size()); + squashingLayer->setSize(FloatSize(squashLayerBounds.size())); *offsetFromTransformedAncestor = referenceOffsetFromTransformedAncestor; offsetFromTransformedAncestor->move(squashLayerOriginInOwningLayerSpace); @@ -711,7 +712,7 @@ updateAncestorClippingLayerGeometry(compositingContainer, snappedOffsetFromCompositedAncestor, graphicsLayerParentLocation); updateOverflowControlsHostLayerGeometry(compositingStackingContext, compositingContainer); - FloatSize contentsSize = relativeCompositingBounds.size(); + FloatSize contentsSize(relativeCompositingBounds.size()); updateMainGraphicsLayerGeometry(relativeCompositingBounds, localCompositingBounds, graphicsLayerParentLocation); updateContentsOffsetInCompositingLayer(snappedOffsetFromCompositedAncestor, graphicsLayerParentLocation); @@ -761,7 +762,7 @@ m_graphicsLayer->setOffsetFromLayoutObject(toIntSize(localCompositingBounds.location())); FloatSize oldSize = m_graphicsLayer->size(); - const IntSize& contentsSize = relativeCompositingBounds.size(); + const FloatSize contentsSize(relativeCompositingBounds.size()); if (oldSize != contentsSize) m_graphicsLayer->setSize(contentsSize); @@ -814,7 +815,7 @@ IntRect parentClipRect = pixelSnappedIntRect(m_owningLayer.clipper().backgroundClipRect(clipRectsContext).rect()); ASSERT(parentClipRect != LayoutRect::infiniteIntRect()); m_ancestorClippingLayer->setPosition(FloatPoint(parentClipRect.location() - graphicsLayerParentLocation)); - m_ancestorClippingLayer->setSize(parentClipRect.size()); + m_ancestorClippingLayer->setSize(FloatSize(parentClipRect.size())); // backgroundRect is relative to compositingContainer, so subtract snappedOffsetFromCompositedAncestor.X/snappedOffsetFromCompositedAncestor.Y to get back to local coords. m_ancestorClippingLayer->setOffsetFromLayoutObject(parentClipRect.location() - snappedOffsetFromCompositedAncestor); @@ -874,7 +875,7 @@ clipPositionInParentSpace -= toFloatSize(ancestor->position()); m_childContainmentLayer->setPosition(clipPositionInParentSpace); - m_childContainmentLayer->setSize(clippingBox.size()); + m_childContainmentLayer->setSize(FloatSize(clippingBox.size())); m_childContainmentLayer->setOffsetFromLayoutObject(toIntSize(clippingBox.location())); if (m_childClippingMaskLayer && !m_scrollingLayer && !layoutObject()->style()->clipPath()) { m_childClippingMaskLayer->setSize(m_childContainmentLayer->size()); @@ -887,7 +888,7 @@ if (!m_childTransformLayer) return; const IntRect borderBox = toLayoutBox(m_owningLayer.layoutObject())->pixelSnappedBorderBoxRect(); - m_childTransformLayer->setSize(borderBox.size()); + m_childTransformLayer->setSize(FloatSize(borderBox.size())); m_childTransformLayer->setPosition(FloatPoint(contentOffsetInCompositingLayer())); } @@ -951,7 +952,7 @@ IntRect overflowClipRect = enclosingIntRect(layoutBox->overflowClipRect(LayoutPoint())); DoubleSize adjustedScrollOffset = m_owningLayer.scrollableArea()->adjustedScrollOffset(); m_scrollingLayer->setPosition(FloatPoint(overflowClipRect.location() - localCompositingBounds.location() + roundedIntSize(m_owningLayer.subpixelAccumulation()))); - m_scrollingLayer->setSize(overflowClipRect.size()); + m_scrollingLayer->setSize(FloatSize(overflowClipRect.size())); IntSize oldScrollingLayerOffset = m_scrollingLayer->offsetFromLayoutObject(); m_scrollingLayer->setOffsetFromLayoutObject(-toIntSize(overflowClipRect.location())); @@ -976,7 +977,7 @@ m_scrollingContentsLayer->setPosition(coordinatorHandlesOffset ? FloatPoint() : FloatPoint(-toFloatSize(adjustedScrollOffset))); } - m_scrollingContentsLayer->setSize(scrollSize); + m_scrollingContentsLayer->setSize(FloatSize(scrollSize)); // FIXME: The paint offset and the scroll offset should really be separate concepts. m_scrollingContentsLayer->setOffsetDoubleFromLayoutObject(scrollingContentsOffset, GraphicsLayer::DontSetNeedsDisplay); @@ -1046,7 +1047,7 @@ FloatSize backgroundSize = relativeCompositingBoundsSize; if (backgroundLayerPaintsFixedRootBackground()) { FrameView* frameView = toLayoutView(layoutObject())->frameView(); - backgroundSize = frameView->visibleContentRect().size(); + backgroundSize = FloatSize(frameView->visibleContentRect().size()); } m_backgroundLayer->setPosition(FloatPoint()); if (backgroundSize != m_backgroundLayer->size()) { @@ -1208,7 +1209,7 @@ return; m_scrollingBlockSelectionLayer->setPosition(position); - m_scrollingBlockSelectionLayer->setSize(blockSelectionGapsBounds.size()); + m_scrollingBlockSelectionLayer->setSize(FloatSize(blockSelectionGapsBounds.size())); m_scrollingBlockSelectionLayer->setOffsetFromLayoutObject(toIntSize(blockSelectionGapsBounds.location()), GraphicsLayer::SetNeedsDisplay); } @@ -1364,7 +1365,7 @@ Scrollbar* hBar = m_owningLayer.scrollableArea()->horizontalScrollbar(); if (hBar) { layer->setPosition(hBar->frameRect().location() - offsetFromLayoutObject); - layer->setSize(hBar->frameRect().size()); + layer->setSize(FloatSize(hBar->frameRect().size())); if (layer->hasContentsLayer()) layer->setContentsRect(IntRect(IntPoint(), hBar->frameRect().size())); } @@ -1375,7 +1376,7 @@ Scrollbar* vBar = m_owningLayer.scrollableArea()->verticalScrollbar(); if (vBar) { layer->setPosition(vBar->frameRect().location() - offsetFromLayoutObject); - layer->setSize(vBar->frameRect().size()); + layer->setSize(FloatSize(vBar->frameRect().size())); if (layer->hasContentsLayer()) layer->setContentsRect(IntRect(IntPoint(), vBar->frameRect().size())); } @@ -2258,7 +2259,9 @@ IntRect CompositedLayerMapping::computeInterestRect(const GraphicsLayer* graphicsLayer, const IntRect& previousInterestRect) const { - if (graphicsLayer != m_graphicsLayer && graphicsLayer != m_squashingLayer) + // Paint the whole layer if "mainFrameClipsContent" is false, meaning that WebPreferences::record_whole_document is true. + bool shouldPaintWholePage = !m_owningLayer.layoutObject()->document().settings()->mainFrameClipsContent(); + if (shouldPaintWholePage || (graphicsLayer != m_graphicsLayer && graphicsLayer != m_squashingLayer)) return IntRect(IntPoint(), expandedIntSize(graphicsLayer->size())); IntRect newInterestRect = recomputeInterestRect(graphicsLayer, m_owningLayer.layoutObject());
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp index 106acd3..d2f2e5e 100644 --- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp +++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
@@ -25,6 +25,11 @@ return CompositedLayerMapping::recomputeInterestRect(graphicsLayer, owningLayoutObject); } + IntRect computeInterestRect(const CompositedLayerMapping* compositedLayerMapping, GraphicsLayer* graphicsLayer, IntRect previousInterestRect) + { + return compositedLayerMapping->computeInterestRect(graphicsLayer, previousInterestRect); + } + bool interestRectChangedEnoughToRepaint(const IntRect& previousInterestRect, const IntRect& newInterestRect, const IntSize& layerSize) { return CompositedLayerMapping::interestRectChangedEnoughToRepaint(previousInterestRect, newInterestRect, layerSize); @@ -86,6 +91,23 @@ EXPECT_RECT_EQ(IntRect(0, 0, 200, 4592), recomputeInterestRect(paintLayer->graphicsLayerBacking(), paintLayer->layoutObject())); } +TEST_F(CompositedLayerMappingTest, TallLayerWholeDocumentInterestRect) +{ + setBodyInnerHTML("<div id='target' style='width: 200px; height: 10000px; will-change: transform'></div>"); + + document().settings()->setMainFrameClipsContent(false); + + document().view()->updateAllLifecyclePhases(); + Element* element = document().getElementById("target"); + PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer(); + ASSERT_TRUE(paintLayer->graphicsLayerBacking()); + ASSERT_TRUE(paintLayer->compositedLayerMapping()); + // recomputeInterestRect computes the interest rect; computeInterestRect applies the extra setting to paint everything. + EXPECT_RECT_EQ(IntRect(0, 0, 200, 4592), recomputeInterestRect(paintLayer->graphicsLayerBacking(), paintLayer->layoutObject())); + EXPECT_RECT_EQ(IntRect(0, 0, 200, 10000), computeInterestRect(paintLayer->compositedLayerMapping(), paintLayer->graphicsLayerBacking(), IntRect())); +} + + TEST_F(CompositedLayerMappingTest, RotatedInterestRect) { setBodyInnerHTML(
diff --git a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp index bcdfca5f..e460ecc4 100644 --- a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp +++ b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
@@ -538,8 +538,8 @@ { if (m_containerLayer) { FrameView* frameView = m_layoutView.frameView(); - m_containerLayer->setSize(frameView->visibleContentSize()); - m_overflowControlsHostLayer->setSize(frameView->visibleContentSize(IncludeScrollbars)); + m_containerLayer->setSize(FloatSize(frameView->visibleContentSize())); + m_overflowControlsHostLayer->setSize(FloatSize(frameView->visibleContentSize(IncludeScrollbars))); frameViewDidScroll(); updateOverflowControlsLayers(); @@ -739,13 +739,13 @@ { if (m_rootContentLayer) { const IntRect& documentRect = m_layoutView.documentRect(); - m_rootContentLayer->setSize(documentRect.size()); + m_rootContentLayer->setSize(FloatSize(documentRect.size())); m_rootContentLayer->setPosition(documentRect.location()); } if (m_containerLayer) { FrameView* frameView = m_layoutView.frameView(); - m_containerLayer->setSize(frameView->visibleContentSize()); - m_overflowControlsHostLayer->setSize(frameView->visibleContentSize(IncludeScrollbars)); + m_containerLayer->setSize(FloatSize(frameView->visibleContentSize())); + m_overflowControlsHostLayer->setSize(FloatSize(frameView->visibleContentSize(IncludeScrollbars))); } }
diff --git a/third_party/WebKit/Source/core/layout/shapes/BoxShapeTest.cpp b/third_party/WebKit/Source/core/layout/shapes/BoxShapeTest.cpp index 96a1058..81d45000 100644 --- a/third_party/WebKit/Source/core/layout/shapes/BoxShapeTest.cpp +++ b/third_party/WebKit/Source/core/layout/shapes/BoxShapeTest.cpp
@@ -118,7 +118,7 @@ */ TEST_F(BoxShapeTest, getIntervals) { - const FloatRoundedRect::Radii cornerRadii(IntSize(10, 15), IntSize(10, 20), IntSize(25, 15), IntSize(20, 30)); + const FloatRoundedRect::Radii cornerRadii(FloatSize(10, 15), FloatSize(10, 20), FloatSize(25, 15), FloatSize(20, 30)); OwnPtr<Shape> shape = createBoxShape(FloatRoundedRect(IntRect(0, 0, 100, 100), cornerRadii), 0); EXPECT_FALSE(shape->isEmpty());
diff --git a/third_party/WebKit/Source/core/paint/BoxBorderPainter.cpp b/third_party/WebKit/Source/core/paint/BoxBorderPainter.cpp index c9aeef90..5927d1ac 100644 --- a/third_party/WebKit/Source/core/paint/BoxBorderPainter.cpp +++ b/third_party/WebKit/Source/core/paint/BoxBorderPainter.cpp
@@ -184,8 +184,8 @@ if (!newRadii.topLeft().width()) newRect.move(-overshoot, 0); } - newRadii.setBottomLeft(IntSize(0, 0)); - newRadii.setBottomRight(IntSize(0, 0)); + newRadii.setBottomLeft(FloatSize(0, 0)); + newRadii.setBottomRight(FloatSize(0, 0)); maxRadii = std::max(newRadii.topLeft().height(), newRadii.topRight().height()); if (maxRadii > newRect.height()) newRect.setHeight(maxRadii); @@ -198,8 +198,8 @@ if (!newRadii.bottomLeft().width()) newRect.move(-overshoot, 0); } - newRadii.setTopLeft(IntSize(0, 0)); - newRadii.setTopRight(IntSize(0, 0)); + newRadii.setTopLeft(FloatSize(0, 0)); + newRadii.setTopRight(FloatSize(0, 0)); maxRadii = std::max(newRadii.bottomLeft().height(), newRadii.bottomRight().height()); if (maxRadii > newRect.height()) { newRect.move(0, newRect.height() - maxRadii); @@ -214,8 +214,8 @@ if (!newRadii.topLeft().height()) newRect.move(0, -overshoot); } - newRadii.setTopRight(IntSize(0, 0)); - newRadii.setBottomRight(IntSize(0, 0)); + newRadii.setTopRight(FloatSize(0, 0)); + newRadii.setBottomRight(FloatSize(0, 0)); maxRadii = std::max(newRadii.topLeft().width(), newRadii.bottomLeft().width()); if (maxRadii > newRect.width()) newRect.setWidth(maxRadii); @@ -228,8 +228,8 @@ if (!newRadii.topRight().height()) newRect.move(0, -overshoot); } - newRadii.setTopLeft(IntSize(0, 0)); - newRadii.setBottomLeft(IntSize(0, 0)); + newRadii.setTopLeft(FloatSize(0, 0)); + newRadii.setBottomLeft(FloatSize(0, 0)); maxRadii = std::max(newRadii.topRight().width(), newRadii.bottomRight().width()); if (maxRadii > newRect.width()) { newRect.move(newRect.width() - maxRadii, 0);
diff --git a/third_party/WebKit/Source/core/paint/MediaControlsPainter.cpp b/third_party/WebKit/Source/core/paint/MediaControlsPainter.cpp index aa055f1..eb6e625 100644 --- a/third_party/WebKit/Source/core/paint/MediaControlsPainter.cpp +++ b/third_party/WebKit/Source/core/paint/MediaControlsPainter.cpp
@@ -247,9 +247,9 @@ if (startOffset < borderRadius && endOffset < borderRadius) context->fillRoundedRect(FloatRoundedRect(highlightRect, radii, radii, radii, radii), startColor); else if (startOffset < borderRadius) - context->fillRoundedRect(FloatRoundedRect(highlightRect, radii, IntSize(0, 0), radii, IntSize(0, 0)), startColor); + context->fillRoundedRect(FloatRoundedRect(highlightRect, radii, FloatSize(0, 0), radii, FloatSize(0, 0)), startColor); else if (endOffset < borderRadius) - context->fillRoundedRect(FloatRoundedRect(highlightRect, IntSize(0, 0), radii, IntSize(0, 0), radii), startColor); + context->fillRoundedRect(FloatRoundedRect(highlightRect, FloatSize(0, 0), radii, FloatSize(0, 0), radii), startColor); else context->fillRect(highlightRect);
diff --git a/third_party/WebKit/Source/core/paint/ThemePainterMac.mm b/third_party/WebKit/Source/core/paint/ThemePainterMac.mm index 681dcf65..3ce7720 100644 --- a/third_party/WebKit/Source/core/paint/ThemePainterMac.mm +++ b/third_party/WebKit/Source/core/paint/ThemePainterMac.mm
@@ -252,7 +252,7 @@ } if (!paintInfo.context->contextDisabled()) - imageBuffer->draw(paintInfo.context, FloatRect(inflatedRect.location(), imageBuffer->size()), nullptr, SkXfermode::kSrcOver_Mode); + imageBuffer->draw(paintInfo.context, FloatRect(inflatedRect.location(), FloatSize(imageBuffer->size())), nullptr, SkXfermode::kSrcOver_Mode); return false; } @@ -341,9 +341,9 @@ bool isVerticalSlider = o.styleRef().appearance() == SliderVerticalPart; - int fillRadiusSize = (LayoutThemeMac::sliderTrackWidth - LayoutThemeMac::sliderTrackBorderWidth) / 2; - IntSize fillRadius(fillRadiusSize, fillRadiusSize); - IntRect fillBounds = enclosedIntRect(unzoomedRect); + float fillRadiusSize = (LayoutThemeMac::sliderTrackWidth - LayoutThemeMac::sliderTrackBorderWidth) / 2; + FloatSize fillRadius(fillRadiusSize, fillRadiusSize); + FloatRect fillBounds(enclosedIntRect(unzoomedRect)); FloatRoundedRect fillRect(fillBounds, fillRadius, fillRadius, fillRadius, fillRadius); paintInfo.context->fillRoundedRect(fillRect, fillColor);
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.cpp b/third_party/WebKit/Source/core/style/ComputedStyle.cpp index d810f82..5f05a189 100644 --- a/third_party/WebKit/Source/core/style/ComputedStyle.cpp +++ b/third_party/WebKit/Source/core/style/ComputedStyle.cpp
@@ -1026,14 +1026,14 @@ static FloatRoundedRect::Radii calcRadiiFor(const BorderData& border, LayoutSize size) { return FloatRoundedRect::Radii( - IntSize(valueForLength(border.topLeft().width(), size.width()), - valueForLength(border.topLeft().height(), size.height())), - IntSize(valueForLength(border.topRight().width(), size.width()), - valueForLength(border.topRight().height(), size.height())), - IntSize(valueForLength(border.bottomLeft().width(), size.width()), - valueForLength(border.bottomLeft().height(), size.height())), - IntSize(valueForLength(border.bottomRight().width(), size.width()), - valueForLength(border.bottomRight().height(), size.height()))); + FloatSize(floatValueForLength(border.topLeft().width(), size.width().toFloat()), + floatValueForLength(border.topLeft().height(), size.height().toFloat())), + FloatSize(floatValueForLength(border.topRight().width(), size.width().toFloat()), + floatValueForLength(border.topRight().height(), size.height().toFloat())), + FloatSize(floatValueForLength(border.bottomLeft().width(), size.width().toFloat()), + floatValueForLength(border.bottomLeft().height(), size.height().toFloat())), + FloatSize(floatValueForLength(border.bottomRight().width(), size.width().toFloat()), + floatValueForLength(border.bottomRight().height(), size.height().toFloat()))); } StyleImage* ComputedStyle::listStyleImage() const { return rareInheritedData->listStyleImage.get(); }
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h index 9952068a..70c57ce 100644 --- a/third_party/WebKit/Source/core/style/ComputedStyle.h +++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -664,7 +664,8 @@ bool breakWords() const { - return wordBreak() == BreakWordBreak || overflowWrap() == BreakOverflowWrap; + return (wordBreak() == BreakWordBreak || overflowWrap() == BreakOverflowWrap) + && whiteSpace() != PRE && whiteSpace() != NOWRAP; } EFillBox backgroundClip() const { return static_cast<EFillBox>(m_background->background().clip()); }
diff --git a/third_party/WebKit/Source/core/style/StyleGeneratedImage.cpp b/third_party/WebKit/Source/core/style/StyleGeneratedImage.cpp index 6906982..83d8ff59 100644 --- a/third_party/WebKit/Source/core/style/StyleGeneratedImage.cpp +++ b/third_party/WebKit/Source/core/style/StyleGeneratedImage.cpp
@@ -76,7 +76,7 @@ IntSize size = flooredIntSize(imageSize(layoutObject, 1)); intrinsicWidth = Length(size.width(), Fixed); intrinsicHeight = Length(size.height(), Fixed); - intrinsicRatio = size; + intrinsicRatio = FloatSize(size); } void StyleGeneratedImage::addClient(LayoutObject* layoutObject)
diff --git a/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp b/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp index f82b56dc..4e154388 100644 --- a/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp +++ b/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp
@@ -223,7 +223,7 @@ SkPictureRecorder recorder; SkCanvas* canvas = recorder.beginRecording(width(), height()); - drawForContainer(canvas, SkPaint(), size(), 1, rect(), rect()); + drawForContainer(canvas, SkPaint(), FloatSize(size()), 1, rect(), rect()); RefPtr<SkPicture> picture = adoptRef(recorder.endRecording()); return adoptRef( @@ -241,7 +241,7 @@ // Expand the tile to account for repeat spacing. FloatRect spacedTile(tile); - spacedTile.expand(repeatSpacing); + spacedTile.expand(FloatSize(repeatSpacing)); SkPictureBuilder patternPicture(spacedTile, nullptr, context); if (!DrawingRecorder::useCachedDrawingIfPossible(patternPicture.context(), *this, DisplayItem::Type::SVGImage)) {
diff --git a/third_party/WebKit/Source/core/svg/graphics/filters/SVGFEImage.cpp b/third_party/WebKit/Source/core/svg/graphics/filters/SVGFEImage.cpp index 45136fe..0c8f3b7 100644 --- a/third_party/WebKit/Source/core/svg/graphics/filters/SVGFEImage.cpp +++ b/third_party/WebKit/Source/core/svg/graphics/filters/SVGFEImage.cpp
@@ -121,7 +121,7 @@ } destRect.intersect(srcRect); } else { - srcRect = FloatRect(FloatPoint(), m_image->size()); + srcRect = FloatRect(FloatPoint(), FloatSize(m_image->size())); m_preserveAspectRatio->transformRect(destRect, srcRect); } @@ -199,7 +199,7 @@ return createTransparentBlack(builder); } - FloatRect srcRect = FloatRect(FloatPoint(), m_image->size()); + FloatRect srcRect = FloatRect(FloatPoint(), FloatSize(m_image->size())); FloatRect dstRect = filterPrimitiveSubregion(); m_preserveAspectRatio->transformRect(dstRect, srcRect);
diff --git a/third_party/WebKit/Source/core/testing/Internals.cpp b/third_party/WebKit/Source/core/testing/Internals.cpp index 8cc9fc6..8920c12 100644 --- a/third_party/WebKit/Source/core/testing/Internals.cpp +++ b/third_party/WebKit/Source/core/testing/Internals.cpp
@@ -921,7 +921,7 @@ document->page()->deprecatedLocalMainFrame()->view()->setFrameRect(IntRect(IntPoint::zero(), initialViewportSize)); ViewportDescription description = page->viewportDescription(); - PageScaleConstraints constraints = description.resolve(initialViewportSize, Length()); + PageScaleConstraints constraints = description.resolve(FloatSize(initialViewportSize), Length()); constraints.fitToContentsWidth(constraints.layoutSize.width(), availableWidth); constraints.resolveAutoInitialScale();
diff --git a/third_party/WebKit/Source/devtools/front_end/common/ResourceType.js b/third_party/WebKit/Source/devtools/front_end/common/ResourceType.js index 311902a..ce79fbb 100644 --- a/third_party/WebKit/Source/devtools/front_end/common/ResourceType.js +++ b/third_party/WebKit/Source/devtools/front_end/common/ResourceType.js
@@ -141,7 +141,26 @@ Other: new WebInspector.ResourceType("other", "Other", WebInspector.resourceCategories.Other, false) } -WebInspector.ResourceType.mimeTypesForExtensions = { +/** + * @param {string} url + * @return {string} + */ +WebInspector.ResourceType.mimeFromURL = function(url) +{ + var name = WebInspector.TextUtils.fileName(url); + if (WebInspector.ResourceType.mimeTypeByName[name]) { + return WebInspector.ResourceType.mimeTypeByName[name]; + } + var ext = WebInspector.TextUtils.extension(url).toLowerCase(); + return WebInspector.ResourceType.mimeTypeByExtension[ext]; +} + +WebInspector.ResourceType.mimeTypeByName = { + // CoffeeScript + "Cakefile": "text/x-coffeescript" +} + +WebInspector.ResourceType.mimeTypeByExtension = { // Web extensions "js": "text/javascript", "css": "text/css",
diff --git a/third_party/WebKit/Source/devtools/front_end/common/TextUtils.js b/third_party/WebKit/Source/devtools/front_end/common/TextUtils.js index 2310478..ae8728f 100644 --- a/third_party/WebKit/Source/devtools/front_end/common/TextUtils.js +++ b/third_party/WebKit/Source/devtools/front_end/common/TextUtils.js
@@ -148,6 +148,39 @@ isLowerCase: function(text) { return text === text.toLowerCase(); + }, + + /** + * @param {string} text + * @param {string} delimiter + * @return {string} + */ + _lastSectionBeforeQuery: function(text, delimiter) + { + var lastIndexOfDot = text.lastIndexOf(delimiter); + var extension = lastIndexOfDot !== -1 ? text.substr(lastIndexOfDot + 1) : ""; + var indexOfQuestionMark = extension.indexOf("?"); + if (indexOfQuestionMark !== -1) + extension = extension.substr(0, indexOfQuestionMark); + return extension; + }, + + /** + * @param {string} text + * @return {string} + */ + extension: function(text) + { + return WebInspector.TextUtils._lastSectionBeforeQuery(text, "."); + }, + + /** + * @param {string} text + * @return {string} + */ + fileName: function(text) + { + return WebInspector.TextUtils._lastSectionBeforeQuery(text, "/"); } }
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/elementsPanel.css b/third_party/WebKit/Source/devtools/front_end/elements/elementsPanel.css index eeb57b0e..4ecf050 100644 --- a/third_party/WebKit/Source/devtools/front_end/elements/elementsPanel.css +++ b/third_party/WebKit/Source/devtools/front_end/elements/elementsPanel.css
@@ -156,9 +156,7 @@ padding: 2px 2px 4px 4px; min-height: 18px; white-space: nowrap; - background-origin: padding; - background-clip: padding; - -webkit-user-select: text; + -webkit-user-select: none; border-bottom: 1px solid #eee; position: relative; overflow: hidden; @@ -204,13 +202,13 @@ .styles-section .sidebar-pane-closing-brace { clear: both; + -webkit-user-select: text; } .styles-section-title { - background-origin: padding; - background-clip: padding; word-wrap: break-word; white-space: normal; + -webkit-user-select: text; } .styles-section-title .media-list { @@ -315,6 +313,10 @@ margin-left: 0 !important; } +.styles-section.matched-styles .style-properties li * { + -webkit-user-select: text; +} + .styles-section .style-properties li.child-editing { word-wrap: break-word !important; white-space: normal !important;
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/mediaQueryInspector.css b/third_party/WebKit/Source/devtools/front_end/emulation/mediaQueryInspector.css index f422939..5619a8ecc 100644 --- a/third_party/WebKit/Source/devtools/front_end/emulation/mediaQueryInspector.css +++ b/third_party/WebKit/Source/devtools/front_end/emulation/mediaQueryInspector.css
@@ -21,6 +21,7 @@ top: 1px; bottom: 1px; white-space: nowrap; + z-index: auto; } .media-inspector-marker:hover { @@ -69,6 +70,7 @@ .media-inspector-marker-label-container { position: absolute; + z-index: 1; } .media-inspector-marker-label-container-left {
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/SourcesView.js b/third_party/WebKit/Source/devtools/front_end/sources/SourcesView.js index 7b8756d5..a406574b 100644 --- a/third_party/WebKit/Source/devtools/front_end/sources/SourcesView.js +++ b/third_party/WebKit/Source/devtools/front_end/sources/SourcesView.js
@@ -95,7 +95,7 @@ if (networkContentType) return networkContentType.canonicalMimeType(); - var mimeType = WebInspector.ResourceType.mimeTypesForExtensions[uiSourceCode.extension().toLowerCase()]; + var mimeType = WebInspector.ResourceType.mimeFromURL(uiSourceCode.uri()); return mimeType || uiSourceCode.contentType().canonicalMimeType(); }
diff --git a/third_party/WebKit/Source/devtools/front_end/workspace/UISourceCode.js b/third_party/WebKit/Source/devtools/front_end/workspace/UISourceCode.js index 5e5889ba..9e5d61a 100644 --- a/third_party/WebKit/Source/devtools/front_end/workspace/UISourceCode.js +++ b/third_party/WebKit/Source/devtools/front_end/workspace/UISourceCode.js
@@ -518,12 +518,7 @@ */ extension: function() { - var lastIndexOfDot = this._name.lastIndexOf("."); - var extension = lastIndexOfDot !== -1 ? this._name.substr(lastIndexOfDot + 1) : ""; - var indexOfQuestionMark = extension.indexOf("?"); - if (indexOfQuestionMark !== -1) - extension = extension.substr(0, indexOfQuestionMark); - return extension; + return WebInspector.TextUtils.extension(this._name); }, /**
diff --git a/third_party/WebKit/Source/modules/credentialmanager/Credential.h b/third_party/WebKit/Source/modules/credentialmanager/Credential.h index 54c24198..6c94cb0 100644 --- a/third_party/WebKit/Source/modules/credentialmanager/Credential.h +++ b/third_party/WebKit/Source/modules/credentialmanager/Credential.h
@@ -14,7 +14,7 @@ class ExceptionState; -class Credential : public GarbageCollected<Credential>, public ScriptWrappable { +class Credential : public GarbageCollectedFinalized<Credential>, public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); public: // Credential.idl
diff --git a/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.cpp b/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.cpp index 4042182..41bf1f2fb 100644 --- a/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.cpp +++ b/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.cpp
@@ -8,6 +8,7 @@ #include "bindings/core/v8/Dictionary.h" #include "bindings/core/v8/ExceptionState.h" #include "core/dom/ExecutionContext.h" +#include "core/dom/URLSearchParams.h" #include "core/html/FormData.h" #include "modules/credentialmanager/FormDataOptions.h" #include "modules/credentialmanager/PasswordCredentialData.h" @@ -33,25 +34,47 @@ PasswordCredential::PasswordCredential(WebPasswordCredential* webPasswordCredential) : Credential(webPasswordCredential->platformCredential()) + , m_idName("username") + , m_passwordName("password") { } PasswordCredential::PasswordCredential(const String& id, const String& password, const String& name, const KURL& icon) : Credential(PlatformPasswordCredential::create(id, password, name, icon)) + , m_idName("username") + , m_passwordName("password") { } -FormData* PasswordCredential::toFormData(ScriptState* scriptState, const FormDataOptions& options) +PassRefPtr<EncodedFormData> PasswordCredential::encodeFormData() const { - FormData* fd = FormData::create(); + if (m_additionalData.isURLSearchParams()) { + // If |additionalData| is a 'URLSearchParams' object, build a urlencoded response. + URLSearchParams* params = URLSearchParams::create(URLSearchParamsInit()); + URLSearchParams* additionalData = m_additionalData.getAsURLSearchParams(); + for (const auto& param : additionalData->params()) + params->append(param.first, param.second); + params->append(idName(), id()); + params->append(passwordName(), password()); - String errorMessage; - if (!scriptState->executionContext()->isSecureContext(errorMessage)) - return fd; + return params->encodeFormData(); + } - fd->append(options.idName(), id()); - fd->append(options.passwordName(), password()); - return fd; + // Otherwise, we'll build a multipart response. + FormData* formData = FormData::create(nullptr); + if (m_additionalData.isFormData()) { + FormData* additionalData = m_additionalData.getAsFormData(); + for (const FormData::Entry* entry : additionalData->entries()) { + if (entry->blob()) + formData->append(formData->decode(entry->name()), entry->blob(), entry->filename()); + else + formData->append(formData->decode(entry->name()), formData->decode(entry->value())); + } + } + formData->append(idName(), id()); + formData->append(passwordName(), password()); + + return formData->encodeMultiPartFormData(); } const String& PasswordCredential::password() const @@ -62,6 +85,7 @@ DEFINE_TRACE(PasswordCredential) { Credential::trace(visitor); + visitor->trace(m_additionalData); } } // namespace blink
diff --git a/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.h b/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.h index bc5f878..38ac8d7 100644 --- a/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.h +++ b/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.h
@@ -7,8 +7,10 @@ #include "bindings/core/v8/ScriptWrappable.h" #include "bindings/core/v8/SerializedScriptValue.h" +#include "bindings/modules/v8/UnionTypesModules.h" #include "modules/credentialmanager/Credential.h" #include "platform/heap/Handle.h" +#include "platform/network/EncodedFormData.h" #include "platform/weborigin/KURL.h" namespace blink { @@ -18,6 +20,8 @@ class PasswordCredentialData; class WebPasswordCredential; +using CredentialPostBodyType = FormDataOrURLSearchParams; + class PasswordCredential final : public Credential { DEFINE_WRAPPERTYPEINFO(); public: @@ -25,15 +29,27 @@ static PasswordCredential* create(WebPasswordCredential*); // PasswordCredential.idl - FormData* toFormData(ScriptState*, const FormDataOptions&); + void setIdName(const String& name) { m_idName = name; } + const String& idName() const { return m_idName; } + void setPasswordName(const String& name) { m_passwordName = name; } + const String& passwordName() const { return m_passwordName; } + + void setAdditionalData(const CredentialPostBodyType& data) { m_additionalData = data; } + void additionalData(CredentialPostBodyType& out) const { out = m_additionalData; } + + // Internal methods + PassRefPtr<EncodedFormData> encodeFormData() const; + const String& password() const; DECLARE_VIRTUAL_TRACE(); private: PasswordCredential(WebPasswordCredential*); PasswordCredential(const String& id, const String& password, const String& name, const KURL& icon); - const String& password() const; + String m_idName; + String m_passwordName; + CredentialPostBodyType m_additionalData; }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.idl b/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.idl index 8c4d81b..b85b862 100644 --- a/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.idl +++ b/third_party/WebKit/Source/modules/credentialmanager/PasswordCredential.idl
@@ -2,11 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(mkwst): I think the '?' should be down with the nullable attribute +// rather than up here with the `typedef`, but that generates bindings code +// that doesn't compile. https://crbug.com/557742 +typedef (FormData or URLSearchParams)? CredentialBodyType; + [ RuntimeEnabled=CredentialManager, RaisesException=Constructor, Constructor(PasswordCredentialData data), - Exposed=Window + Exposed=Window, + TypeChecking=Interface ] interface PasswordCredential : Credential { - [CallWith=ScriptState] FormData toFormData(optional FormDataOptions options); + attribute USVString idName; + attribute USVString passwordName; + attribute CredentialBodyType additionalData; };
diff --git a/third_party/WebKit/Source/modules/fetch/Body.cpp b/third_party/WebKit/Source/modules/fetch/Body.cpp index 449777c5..3e489a74 100644 --- a/third_party/WebKit/Source/modules/fetch/Body.cpp +++ b/third_party/WebKit/Source/modules/fetch/Body.cpp
@@ -104,8 +104,9 @@ ScriptPromise Body::arrayBuffer(ScriptState* scriptState) { - if (bodyUsed()) - return ScriptPromise::reject(scriptState, V8ThrowException::createTypeError(scriptState->isolate(), "Already read")); + ScriptPromise promise = rejectInvalidConsumption(scriptState); + if (!promise.isEmpty()) + return promise; // When the main thread sends a V8::TerminateExecution() signal to a worker // thread, any V8 API on the worker thread starts returning an empty @@ -117,7 +118,7 @@ return ScriptPromise(); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); - ScriptPromise promise = resolver->promise(); + promise = resolver->promise(); if (bodyBuffer()) { bodyBuffer()->startLoading(scriptState->executionContext(), FetchDataLoader::createLoaderAsArrayBuffer(), new BodyArrayBufferConsumer(resolver)); } else { @@ -128,15 +129,16 @@ ScriptPromise Body::blob(ScriptState* scriptState) { - if (bodyUsed()) - return ScriptPromise::reject(scriptState, V8ThrowException::createTypeError(scriptState->isolate(), "Already read")); + ScriptPromise promise = rejectInvalidConsumption(scriptState); + if (!promise.isEmpty()) + return promise; // See above comment. if (!scriptState->executionContext()) return ScriptPromise(); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); - ScriptPromise promise = resolver->promise(); + promise = resolver->promise(); if (bodyBuffer()) { bodyBuffer()->startLoading(scriptState->executionContext(), FetchDataLoader::createLoaderAsBlobHandle(mimeType()), new BodyBlobConsumer(resolver)); } else { @@ -150,15 +152,16 @@ ScriptPromise Body::json(ScriptState* scriptState) { - if (bodyUsed()) - return ScriptPromise::reject(scriptState, V8ThrowException::createTypeError(scriptState->isolate(), "Already read")); + ScriptPromise promise = rejectInvalidConsumption(scriptState); + if (!promise.isEmpty()) + return promise; // See above comment. if (!scriptState->executionContext()) return ScriptPromise(); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); - ScriptPromise promise = resolver->promise(); + promise = resolver->promise(); if (bodyBuffer()) { bodyBuffer()->startLoading(scriptState->executionContext(), FetchDataLoader::createLoaderAsString(), new BodyJsonConsumer(resolver)); } else { @@ -169,15 +172,16 @@ ScriptPromise Body::text(ScriptState* scriptState) { - if (bodyUsed()) - return ScriptPromise::reject(scriptState, V8ThrowException::createTypeError(scriptState->isolate(), "Already read")); + ScriptPromise promise = rejectInvalidConsumption(scriptState); + if (!promise.isEmpty()) + return promise; // See above comment. if (!scriptState->executionContext()) return ScriptPromise(); ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); - ScriptPromise promise = resolver->promise(); + promise = resolver->promise(); if (bodyBuffer()) { bodyBuffer()->startLoading(scriptState->executionContext(), FetchDataLoader::createLoaderAsString(), new BodyTextConsumer(resolver)); } else { @@ -206,9 +210,18 @@ return bodyBuffer()->hasPendingActivity(); } -Body::Body(ExecutionContext* context) : ActiveDOMObject(context), m_bodyPassed(false) +Body::Body(ExecutionContext* context) : ActiveDOMObject(context), m_bodyPassed(false), m_opaque(false) { suspendIfNeeded(); } +ScriptPromise Body::rejectInvalidConsumption(ScriptState* scriptState) +{ + if (m_opaque) + return ScriptPromise::reject(scriptState, V8ThrowException::createTypeError(scriptState->isolate(), "The body is opaque.")); + if (bodyUsed()) + return ScriptPromise::reject(scriptState, V8ThrowException::createTypeError(scriptState->isolate(), "Already read")); + return ScriptPromise(); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/modules/fetch/Body.h b/third_party/WebKit/Source/modules/fetch/Body.h index 1e9ee53..1577ecd3 100644 --- a/third_party/WebKit/Source/modules/fetch/Body.h +++ b/third_party/WebKit/Source/modules/fetch/Body.h
@@ -50,10 +50,21 @@ ActiveDOMObject::trace(visitor); } + // https://w3c.github.io/webappsec-credential-management/#monkey-patching-fetch-2 + void setOpaque() { m_opaque = true; } + bool opaque() const { return m_opaque; } + private: virtual String mimeType() const = 0; + // Body consumption algorithms will reject with a TypeError in a number of error + // conditions. This method wraps those up into one call which returns an empty + // ScriptPromise if the consumption may proceed, and a ScriptPromise rejected with + // a TypeError if it ought to be blocked. + ScriptPromise rejectInvalidConsumption(ScriptState*); + bool m_bodyPassed; + bool m_opaque; }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/fetch/DEPS b/third_party/WebKit/Source/modules/fetch/DEPS index d32e4d8..4cf066a 100644 --- a/third_party/WebKit/Source/modules/fetch/DEPS +++ b/third_party/WebKit/Source/modules/fetch/DEPS
@@ -6,6 +6,7 @@ "-modules", "+modules/ModulesExport.h", "+modules/fetch", + "+modules/credentialmanager", "+platform", "+public/platform", "-web",
diff --git a/third_party/WebKit/Source/modules/fetch/Request.cpp b/third_party/WebKit/Source/modules/fetch/Request.cpp index 24239c4..6a13627 100644 --- a/third_party/WebKit/Source/modules/fetch/Request.cpp +++ b/third_party/WebKit/Source/modules/fetch/Request.cpp
@@ -316,6 +316,22 @@ if (temporaryBody) r->m_request->setBuffer(temporaryBody); + // https://w3c.github.io/webappsec-credential-management/#monkey-patching-fetch-3 + // "If |init|'s body member is a 'Credential' object:" + if (init.isCredentialRequest) { + // "1. If |r|'s url is not the same as |r|'s client’s origin, throw a TypeError." + if (!origin->canRequest(r->url())) { + exceptionState.throwTypeError("Credentials may only be submitted to same-origin endpoints."); + return nullptr; + } + // "2. Set |r|'s redirect mode to "error"." + r->m_request->setRedirect(WebURLRequest::FetchRedirectModeError); + // "3. Set |r|'s skip-service-worker flag." + // TODO(mkwst): Set this flag. + // "4. Set |r|'s opaque flag." + r->setOpaque(); + } + // "34. Set |r|'s MIME type to the result of extracting a MIME type from // |r|'s request's header list." r->m_request->setMIMEType(r->m_request->headerList()->extractMIMEType());
diff --git a/third_party/WebKit/Source/modules/fetch/RequestInit.cpp b/third_party/WebKit/Source/modules/fetch/RequestInit.cpp index d041edf..f720605 100644 --- a/third_party/WebKit/Source/modules/fetch/RequestInit.cpp +++ b/third_party/WebKit/Source/modules/fetch/RequestInit.cpp
@@ -12,8 +12,11 @@ #include "bindings/core/v8/V8Blob.h" #include "bindings/core/v8/V8FormData.h" #include "bindings/core/v8/V8URLSearchParams.h" +#include "bindings/modules/v8/V8PasswordCredential.h" +#include "core/dom/URLSearchParams.h" #include "core/fileapi/Blob.h" #include "core/html/FormData.h" +#include "modules/credentialmanager/PasswordCredential.h" #include "modules/fetch/FetchBlobDataConsumerHandle.h" #include "modules/fetch/FetchFormDataConsumerHandle.h" #include "modules/fetch/Headers.h" @@ -25,6 +28,7 @@ RequestInit::RequestInit(ExecutionContext* context, const Dictionary& options, ExceptionState& exceptionState) : areAnyMembersSet(false) + , isCredentialRequest(false) { areAnyMembersSet = DictionaryHelper::get(options, "method", method) || areAnyMembersSet; areAnyMembersSet = DictionaryHelper::get(options, "headers", headers) || areAnyMembersSet; @@ -83,6 +87,18 @@ RefPtr<EncodedFormData> formData = V8URLSearchParams::toImpl(v8::Local<v8::Object>::Cast(v8Body))->encodeFormData(); contentType = AtomicString("application/x-www-form-urlencoded;charset=UTF-8", AtomicString::ConstructFromLiteral); body = FetchFormDataConsumerHandle::create(context, formData.release()); + } else if (V8PasswordCredential::hasInstance(v8Body, isolate)) { + // See https://w3c.github.io/webappsec-credential-management/#monkey-patching-fetch-4 + // and https://w3c.github.io/webappsec-credential-management/#monkey-patching-fetch-3 + isCredentialRequest = true; + PasswordCredential* credential = V8PasswordCredential::toImpl(v8::Local<v8::Object>::Cast(v8Body)); + + RefPtr<EncodedFormData> encodedData = credential->encodeFormData(); + if (encodedData->boundary().isEmpty()) + contentType = AtomicString("application/x-www-form-urlencoded;charset=UTF-8", AtomicString::ConstructFromLiteral); + else + contentType = AtomicString("multipart/form-data; boundary=", AtomicString::ConstructFromLiteral) + encodedData->boundary().data(); + body = FetchFormDataConsumerHandle::create(context, encodedData.release()); } else if (v8Body->IsString()) { contentType = "text/plain;charset=UTF-8"; body = FetchFormDataConsumerHandle::create(toUSVString(isolate, v8Body, exceptionState));
diff --git a/third_party/WebKit/Source/modules/fetch/RequestInit.h b/third_party/WebKit/Source/modules/fetch/RequestInit.h index 9d66bed9..f7515a8 100644 --- a/third_party/WebKit/Source/modules/fetch/RequestInit.h +++ b/third_party/WebKit/Source/modules/fetch/RequestInit.h
@@ -37,6 +37,8 @@ // True if any members in RequestInit are set and hence the referrer member // should be used in the Request constructor. bool areAnyMembersSet; + // True if the RequestInit |body| was created from a 'PasswordCredential' object. + bool isCredentialRequest; }; }
diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp index 3d04ecf..cd4dd7e2 100644 --- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp +++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
@@ -737,6 +737,10 @@ return; // All calling functions check isContextLost, so a duplicate check is not needed here. + if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { + // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. + type = GL_FLOAT; + } Vector<uint8_t> data; WebGLImageConversion::ImageExtractor imageExtractor(image, domSource, premultiplyAlpha, m_unpackColorspaceConversion == GL_NONE); if (!imageExtractor.imagePixelData()) { @@ -797,6 +801,10 @@ if (isContextLost() || !pixels || !validateTexSubImage3D("texSubImage3D", target, level, xoffset, yoffset, zoffset, format, type, pixels->width(), pixels->height(), 1)) return; + if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { + // The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. + type = GL_FLOAT; + } Vector<uint8_t> data; bool needConversion = true; // The data from ImageData is always of format RGBA8.
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp index 2fc71ec..2488559 100644 --- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp +++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -1226,7 +1226,7 @@ } else { if (!m_markedCanvasDirty) { m_markedCanvasDirty = true; - canvas()->didDraw(FloatRect(FloatPoint(0, 0), clampedCanvasSize())); + canvas()->didDraw(FloatRect(FloatPoint(0, 0), FloatSize(clampedCanvasSize()))); } } }
diff --git a/third_party/WebKit/Source/platform/DragImage.cpp b/third_party/WebKit/Source/platform/DragImage.cpp index e639e03..7b2dad8 100644 --- a/third_party/WebKit/Source/platform/DragImage.cpp +++ b/third_party/WebKit/Source/platform/DragImage.cpp
@@ -83,7 +83,7 @@ if (orientation != DefaultImageOrientation) { if (orientation.usesWidthAsHeight()) size = size.transposedSize(); - transform *= orientation.transformFromDefault(size); + transform *= orientation.transformFromDefault(FloatSize(size)); } transform.scaleNonUniform(imageScale.width(), imageScale.height());
diff --git a/third_party/WebKit/Source/platform/PlatformMouseEvent.h b/third_party/WebKit/Source/platform/PlatformMouseEvent.h index b6734fae..dc7a541 100644 --- a/third_party/WebKit/Source/platform/PlatformMouseEvent.h +++ b/third_party/WebKit/Source/platform/PlatformMouseEvent.h
@@ -28,6 +28,7 @@ #include "platform/PlatformEvent.h" #include "platform/geometry/IntPoint.h" +#include "public/platform/WebPointerProperties.h" namespace blink { @@ -75,6 +76,7 @@ { } + const WebPointerProperties& pointerProperties() const { return m_pointerProperties; } const IntPoint& position() const { return m_position; } const IntPoint& globalPosition() const { return m_globalPosition; } const IntPoint& movementDelta() const { return m_movementDelta; } @@ -85,6 +87,8 @@ SyntheticEventType syntheticEventType() const { return m_synthesized; } protected: + WebPointerProperties m_pointerProperties; + IntPoint m_position; IntPoint m_globalPosition; IntPoint m_movementDelta;
diff --git a/third_party/WebKit/Source/platform/blink_platform.gypi b/third_party/WebKit/Source/platform/blink_platform.gypi index ce3355e..c1a9255 100644 --- a/third_party/WebKit/Source/platform/blink_platform.gypi +++ b/third_party/WebKit/Source/platform/blink_platform.gypi
@@ -801,8 +801,6 @@ 'network/HTTPHeaderMap.h', 'network/HTTPParsers.cpp', 'network/HTTPParsers.h', - 'network/HTTPRequest.cpp', - 'network/HTTPRequest.h', 'network/NetworkHints.cpp', 'network/NetworkHints.h', 'network/ParsedContentType.cpp',
diff --git a/third_party/WebKit/Source/platform/geometry/FloatSize.h b/third_party/WebKit/Source/platform/geometry/FloatSize.h index fdc3d4b..45a96b24 100644 --- a/third_party/WebKit/Source/platform/geometry/FloatSize.h +++ b/third_party/WebKit/Source/platform/geometry/FloatSize.h
@@ -50,7 +50,7 @@ public: FloatSize() : m_width(0), m_height(0) { } FloatSize(float width, float height) : m_width(width), m_height(height) { } - FloatSize(const IntSize& size) : m_width(size.width()), m_height(size.height()) { } + explicit FloatSize(const IntSize& size) : m_width(size.width()), m_height(size.height()) { } FloatSize(const SkSize& size) : m_width(size.width()), m_height(size.height()) { } explicit FloatSize(const LayoutSize&);
diff --git a/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp b/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp index 2eb04ee..80d9482b 100644 --- a/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp +++ b/third_party/WebKit/Source/platform/graphics/BitmapImage.cpp
@@ -368,6 +368,7 @@ fileExtention == "bmp" ? ImageBMP : ImageUnknown; Platform::current()->histogramEnumeration("Blink.DecodedImageType", type, LastDecodedImageType + 1); + Platform::current()->histogramEnumeration("Blink.DecodedImage.Orientation", m_source.orientationAtIndex(0).orientation(), ImageOrientationEnumEnd); } return m_sizeAvailable;
diff --git a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp index 93f225da..738c142 100644 --- a/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp +++ b/third_party/WebKit/Source/platform/graphics/Canvas2DLayerBridge.cpp
@@ -528,7 +528,7 @@ // Invalidate texture state in case the compositor altered it since the copy-on-write. if (releasedMailboxInfo->m_image) { if (mailbox.validSyncToken) { - context()->waitSyncToken(mailbox.syncToken); + context()->waitSyncTokenCHROMIUM(mailbox.syncToken); } GrTexture* texture = releasedMailboxInfo->m_image->getTexture(); if (texture) {
diff --git a/third_party/WebKit/Source/platform/graphics/CrossfadeGeneratedImage.cpp b/third_party/WebKit/Source/platform/graphics/CrossfadeGeneratedImage.cpp index 4aea53c6..9d19b6c 100644 --- a/third_party/WebKit/Source/platform/graphics/CrossfadeGeneratedImage.cpp +++ b/third_party/WebKit/Source/platform/graphics/CrossfadeGeneratedImage.cpp
@@ -42,9 +42,9 @@ void CrossfadeGeneratedImage::drawCrossfade(SkCanvas* canvas, const SkPaint& paint, ImageClampingMode clampMode) { - FloatRect fromImageRect(FloatPoint(), m_fromImage->size()); - FloatRect toImageRect(FloatPoint(), m_toImage->size()); - FloatRect destRect(FloatPoint(), m_crossfadeSize); + FloatRect fromImageRect(FloatPoint(), FloatSize(m_fromImage->size())); + FloatRect toImageRect(FloatPoint(), FloatSize(m_toImage->size())); + FloatRect destRect((FloatPoint()), FloatSize(m_crossfadeSize)); // TODO(junov): The various effects encoded into paint should probably be applied here // instead of inside the layer. This probably faulty behavior was maintained in order @@ -96,7 +96,7 @@ SkPaint paint = context->fillPaint(); paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); paint.setAntiAlias(context->shouldAntialias()); - FloatRect destRect(FloatPoint(), m_crossfadeSize); + FloatRect destRect((FloatPoint()), FloatSize(m_crossfadeSize)); paint.setFilterQuality(context->computeFilterQuality(this, destRect, srcRect)); drawCrossfade(context->canvas(), paint, ClampImageToSourceRect); }
diff --git a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h index 08c13b6..b101f44 100644 --- a/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h +++ b/third_party/WebKit/Source/platform/graphics/DeferredImageDecoder.h
@@ -91,7 +91,6 @@ String m_filenameExtension; IntSize m_size; - ImageOrientation m_orientation; int m_repetitionCount; bool m_hasColorProfile;
diff --git a/third_party/WebKit/Source/platform/graphics/GeneratedImage.cpp b/third_party/WebKit/Source/platform/graphics/GeneratedImage.cpp index 2c4de0dc..7b4742a1b 100644 --- a/third_party/WebKit/Source/platform/graphics/GeneratedImage.cpp +++ b/third_party/WebKit/Source/platform/graphics/GeneratedImage.cpp
@@ -49,7 +49,7 @@ const IntSize& repeatSpacing) { FloatRect tileRect = srcRect; - tileRect.expand(repeatSpacing); + tileRect.expand(FloatSize(repeatSpacing)); SkPictureBuilder builder(tileRect, nullptr, destContext); builder.context().beginRecording(tileRect);
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp index ec3f157..a644ab75 100644 --- a/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp +++ b/third_party/WebKit/Source/platform/graphics/GraphicsContext.cpp
@@ -472,7 +472,7 @@ } OwnPtr<DrawLooperBuilder> drawLooperBuilder = DrawLooperBuilder::create(); - drawLooperBuilder->addShadow(shadowOffset, shadowBlur, shadowColor, + drawLooperBuilder->addShadow(FloatSize(shadowOffset), shadowBlur, shadowColor, DrawLooperBuilder::ShadowRespectsTransforms, DrawLooperBuilder::ShadowIgnoresAlpha); setDrawLooper(drawLooperBuilder.release()); fillRectWithRoundedHole(outerRect, roundedHole, fillColor); @@ -836,7 +836,7 @@ { if (contextDisabled() || !image) return; - image->drawTiled(this, destRect, srcPoint, tileSize, op, repeatSpacing); + image->drawTiled(this, destRect, srcPoint, FloatSize(tileSize), op, repeatSpacing); } void GraphicsContext::drawTiledImage(Image* image, const IntRect& dest, const IntRect& srcRect,
diff --git a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp index 258e0dd9..7a664ab 100644 --- a/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp +++ b/third_party/WebKit/Source/platform/graphics/GraphicsLayer.cpp
@@ -395,7 +395,7 @@ if (m_contentsClippingMaskLayer) { if (m_contentsClippingMaskLayer->size() != m_contentsRect.size()) { - m_contentsClippingMaskLayer->setSize(m_contentsRect.size()); + m_contentsClippingMaskLayer->setSize(FloatSize(m_contentsRect.size())); m_contentsClippingMaskLayer->setNeedsDisplay(); } m_contentsClippingMaskLayer->setPosition(FloatPoint());
diff --git a/third_party/WebKit/Source/platform/graphics/Image.cpp b/third_party/WebKit/Source/platform/graphics/Image.cpp index 2214f5b..e06cf38 100644 --- a/third_party/WebKit/Source/platform/graphics/Image.cpp +++ b/third_party/WebKit/Source/platform/graphics/Image.cpp
@@ -98,7 +98,7 @@ void Image::drawTiled(GraphicsContext* ctxt, const FloatRect& destRect, const FloatPoint& srcPoint, const FloatSize& scaledTileSize, SkXfermode::Mode op, const IntSize& repeatSpacing) { - FloatSize intrinsicTileSize = size(); + FloatSize intrinsicTileSize = FloatSize(size()); if (hasRelativeWidth()) intrinsicTileSize.setWidth(scaledTileSize.width()); if (hasRelativeHeight()) @@ -262,7 +262,7 @@ void Image::computeIntrinsicDimensions(Length& intrinsicWidth, Length& intrinsicHeight, FloatSize& intrinsicRatio) { - intrinsicRatio = size(); + intrinsicRatio = FloatSize(size()); intrinsicWidth = Length(intrinsicRatio.width(), Fixed); intrinsicHeight = Length(intrinsicRatio.height(), Fixed); }
diff --git a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp index 9680221..750610420 100644 --- a/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp +++ b/third_party/WebKit/Source/platform/graphics/ImageBuffer.cpp
@@ -207,11 +207,12 @@ // Contexts may be in a different share group. We must transfer the texture through a mailbox first sharedContext->genMailboxCHROMIUM(mailbox->name); sharedContext->produceTextureDirectCHROMIUM(textureId, GL_TEXTURE_2D, mailbox->name); + const WGC3Duint64 sharedFenceSync = sharedContext->insertFenceSyncCHROMIUM(); sharedContext->flush(); - mailbox->validSyncToken = sharedContext->insertSyncPoint(mailbox->syncToken); + mailbox->validSyncToken = sharedContext->genSyncTokenCHROMIUM(sharedFenceSync, mailbox->syncToken); if (mailbox->validSyncToken) - context->waitSyncToken(mailbox->syncToken); + context->waitSyncTokenCHROMIUM(mailbox->syncToken); Platform3DObject sourceTexture = context->createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox->name); @@ -221,11 +222,13 @@ context->deleteTexture(sourceTexture); + const WGC3Duint64 contextFenceSync = context->insertFenceSyncCHROMIUM(); + context->flush(); WGC3Dbyte syncToken[24]; - if (context->insertSyncPoint(syncToken)) - sharedContext->waitSyncToken(syncToken); + if (context->genSyncTokenCHROMIUM(contextFenceSync, syncToken)) + sharedContext->waitSyncTokenCHROMIUM(syncToken); // Undo grContext texture binding changes introduced in this function provider->grContext()->resetContext(kTextureBinding_GrGLBackendState); @@ -258,7 +261,7 @@ if (!isSurfaceValid()) return; - FloatRect srcRect = srcPtr ? *srcPtr : FloatRect(FloatPoint(), size()); + FloatRect srcRect = srcPtr ? *srcPtr : FloatRect(FloatPoint(), FloatSize(size())); m_surface->draw(context, destRect, srcRect, op); }
diff --git a/third_party/WebKit/Source/platform/graphics/ImageBufferSurface.cpp b/third_party/WebKit/Source/platform/graphics/ImageBufferSurface.cpp index e35001d..4972286 100644 --- a/third_party/WebKit/Source/platform/graphics/ImageBufferSurface.cpp +++ b/third_party/WebKit/Source/platform/graphics/ImageBufferSurface.cpp
@@ -67,7 +67,7 @@ } else { canvas()->clear(SK_ColorTRANSPARENT); } - didDraw(FloatRect(FloatPoint(0, 0), size())); + didDraw(FloatRect(FloatPoint(0, 0), FloatSize(size()))); } }
diff --git a/third_party/WebKit/Source/platform/graphics/ImageOrientation.cpp b/third_party/WebKit/Source/platform/graphics/ImageOrientation.cpp index 93e4644..c78ca06 100644 --- a/third_party/WebKit/Source/platform/graphics/ImageOrientation.cpp +++ b/third_party/WebKit/Source/platform/graphics/ImageOrientation.cpp
@@ -53,6 +53,8 @@ return AffineTransform( 0, -1, -1, 0, w, h); case OriginLeftBottom: return AffineTransform( 0, -1, 1, 0, 0, h); + default: + ASSERT_NOT_REACHED(); } ASSERT_NOT_REACHED();
diff --git a/third_party/WebKit/Source/platform/graphics/ImageOrientation.h b/third_party/WebKit/Source/platform/graphics/ImageOrientation.h index a73df6d..98b06db5 100644 --- a/third_party/WebKit/Source/platform/graphics/ImageOrientation.h +++ b/third_party/WebKit/Source/platform/graphics/ImageOrientation.h
@@ -47,6 +47,7 @@ OriginLeftBottom = 8, // 270 degree CW rotation // All other values are "reserved" as of EXIF 2.2 DefaultImageOrientation = OriginTopLeft, + ImageOrientationEnumEnd = OriginLeftBottom + 1, }; enum RespectImageOrientationEnum { @@ -84,6 +85,8 @@ inline bool operator==(const ImageOrientation& other) const { return other.m_orientation == m_orientation; } inline bool operator!=(const ImageOrientation& other) const { return !(*this == other); } + ImageOrientationEnum orientation() const { return m_orientation; } + private: // FIXME: This only needs to be one byte. ImageOrientationEnum m_orientation;
diff --git a/third_party/WebKit/Source/platform/graphics/StaticBitmapImage.cpp b/third_party/WebKit/Source/platform/graphics/StaticBitmapImage.cpp index 92ee5e3..86e13aa 100644 --- a/third_party/WebKit/Source/platform/graphics/StaticBitmapImage.cpp +++ b/third_party/WebKit/Source/platform/graphics/StaticBitmapImage.cpp
@@ -14,7 +14,7 @@ namespace blink { -PassRefPtr<Image> StaticBitmapImage::create(PassRefPtr<SkImage> image) +PassRefPtr<StaticBitmapImage> StaticBitmapImage::create(PassRefPtr<SkImage> image) { if (!image) return nullptr; @@ -60,4 +60,9 @@ observer->didDraw(this); } +PassRefPtr<SkImage> StaticBitmapImage::imageForCurrentFrame() +{ + return m_image; +} + } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/StaticBitmapImage.h b/third_party/WebKit/Source/platform/graphics/StaticBitmapImage.h index 6f5bb2c..0150c0e 100644 --- a/third_party/WebKit/Source/platform/graphics/StaticBitmapImage.h +++ b/third_party/WebKit/Source/platform/graphics/StaticBitmapImage.h
@@ -15,13 +15,13 @@ bool currentFrameIsComplete() override { return true; } - static PassRefPtr<Image> create(PassRefPtr<SkImage>); + static PassRefPtr<StaticBitmapImage> create(PassRefPtr<SkImage>); virtual void destroyDecodedData(bool destroyAll) { } virtual bool currentFrameKnownToBeOpaque(); virtual IntSize size() const; void draw(SkCanvas*, const SkPaint&, const FloatRect& dstRect, const FloatRect& srcRect, RespectImageOrientationEnum, ImageClampingMode) override; - PassRefPtr<SkImage> imageForCurrentFrame() override { return m_image; } + PassRefPtr<SkImage> imageForCurrentFrame() override; protected: StaticBitmapImage(PassRefPtr<SkImage>);
diff --git a/third_party/WebKit/Source/platform/graphics/filters/FEConvolveMatrix.cpp b/third_party/WebKit/Source/platform/graphics/filters/FEConvolveMatrix.cpp index 248f4d55..b96fad7b 100644 --- a/third_party/WebKit/Source/platform/graphics/filters/FEConvolveMatrix.cpp +++ b/third_party/WebKit/Source/platform/graphics/filters/FEConvolveMatrix.cpp
@@ -59,7 +59,7 @@ FloatRect result = rect; if (parametersValid()) { result.moveBy(forward ? -m_targetOffset : m_targetOffset - m_kernelSize); - result.expand(m_kernelSize); + result.expand(FloatSize(m_kernelSize)); } return result; } @@ -181,7 +181,7 @@ writeIndent(ts, indent); ts << "[feConvolveMatrix"; FilterEffect::externalRepresentation(ts); - ts << " order=\"" << m_kernelSize << "\" " + ts << " order=\"" << FloatSize(m_kernelSize) << "\" " << "kernelMatrix=\"" << m_kernelMatrix << "\" " << "divisor=\"" << m_divisor << "\" " << "bias=\"" << m_bias << "\" "
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp index c8b928e..16d54fd 100644 --- a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp +++ b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp
@@ -312,8 +312,9 @@ m_contentsChanged = false; m_context->produceTextureDirectCHROMIUM(frontColorBufferMailbox->textureInfo.textureId, GL_TEXTURE_2D, frontColorBufferMailbox->mailbox.name); + const WGC3Duint64 fenceSync = m_context->insertFenceSyncCHROMIUM(); m_context->flush(); - frontColorBufferMailbox->mailbox.validSyncToken = m_context->insertSyncPoint(frontColorBufferMailbox->mailbox.syncToken); + frontColorBufferMailbox->mailbox.validSyncToken = m_context->genSyncTokenCHROMIUM(fenceSync, frontColorBufferMailbox->mailbox.syncToken); frontColorBufferMailbox->mailbox.allowOverlay = frontColorBufferMailbox->textureInfo.imageId != 0; setBufferClearNeeded(true); @@ -378,7 +379,7 @@ ASSERT(mailboxInfo); if (mailboxInfo->mailbox.validSyncToken) { - m_context->waitSyncToken(mailboxInfo->mailbox.syncToken); + m_context->waitSyncTokenCHROMIUM(mailboxInfo->mailbox.syncToken); mailboxInfo->mailbox.validSyncToken = false; } @@ -406,7 +407,7 @@ for (size_t i = 0; i < m_textureMailboxes.size(); i++) { if (nameEquals(m_textureMailboxes[i]->mailbox, mailbox)) { if (mailbox.validSyncToken) - m_context->waitSyncToken(mailbox.syncToken); + m_context->waitSyncTokenCHROMIUM(mailbox.syncToken); deleteChromiumImageForTexture(&m_textureMailboxes[i]->textureInfo); @@ -513,11 +514,13 @@ textureId = m_colorBuffer.textureId; m_context->genMailboxCHROMIUM(mailbox.name); m_context->produceTextureDirectCHROMIUM(textureId, GL_TEXTURE_2D, mailbox.name); + const WGC3Duint64 fenceSync = m_context->insertFenceSyncCHROMIUM(); m_context->flush(); - mailbox.validSyncToken = m_context->insertSyncPoint(mailbox.syncToken); + mailbox.validSyncToken = m_context->genSyncTokenCHROMIUM(fenceSync, mailbox.syncToken); } - context->waitSyncToken(mailbox.syncToken); + if (mailbox.validSyncToken) + context->waitSyncTokenCHROMIUM(mailbox.syncToken); Platform3DObject sourceTexture = context->createAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); GLboolean unpackPremultiplyAlphaNeeded = GL_FALSE; @@ -531,10 +534,12 @@ context->deleteTexture(sourceTexture); + const WGC3Duint64 fenceSync = context->insertFenceSyncCHROMIUM(); + context->flush(); GLbyte syncToken[24]; - if (context->insertSyncPoint(syncToken)) - m_context->waitSyncToken(syncToken); + if (context->genSyncTokenCHROMIUM(fenceSync, syncToken)) + m_context->waitSyncTokenCHROMIUM(syncToken); return true; }
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTest.cpp b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTest.cpp index ace81a1..ccb6f561c 100644 --- a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTest.cpp +++ b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBufferTest.cpp
@@ -91,15 +91,19 @@ return m_mostRecentlyProducedSize; } - bool insertSyncPoint(WGC3Dbyte* syncToken) override + WGC3Duint64 insertFenceSyncCHROMIUM() override { - static WGC3Duint syncPointGenerator = 0; - WGC3Duint newSyncPoint = ++syncPointGenerator; - memcpy(syncToken, &newSyncPoint, sizeof(newSyncPoint)); + static WGC3Duint64 syncPointGenerator = 0; + return ++syncPointGenerator; + } + + bool genSyncTokenCHROMIUM(WGC3Duint64 fenceSync, WGC3Dbyte* syncToken) override + { + memcpy(syncToken, &fenceSync, sizeof(fenceSync)); return true; } - void waitSyncToken(const WGC3Dbyte* syncToken) override + void waitSyncTokenCHROMIUM(const WGC3Dbyte* syncToken) override { memcpy(&m_mostRecentlyWaitedSyncToken, syncToken, sizeof(m_mostRecentlyWaitedSyncToken)); } @@ -401,8 +405,8 @@ // prepareMailbox() does not wait for any sync point. EXPECT_EQ(0u, webContext()->mostRecentlyWaitedSyncToken()); - WGC3Duint waitSyncToken = 0; - webContext()->insertSyncPoint(reinterpret_cast<WGC3Dbyte*>(&waitSyncToken)); + WGC3Duint64 waitSyncToken = 0; + webContext()->genSyncTokenCHROMIUM(webContext()->insertFenceSyncCHROMIUM(), reinterpret_cast<WGC3Dbyte*>(&waitSyncToken)); memcpy(mailbox.syncToken, &waitSyncToken, sizeof(waitSyncToken)); mailbox.validSyncToken = true; m_drawingBuffer->mailboxReleased(mailbox, false); @@ -415,7 +419,7 @@ EXPECT_EQ(waitSyncToken, webContext()->mostRecentlyWaitedSyncToken()); m_drawingBuffer->beginDestruction(); - webContext()->insertSyncPoint(reinterpret_cast<WGC3Dbyte*>(&waitSyncToken)); + webContext()->genSyncTokenCHROMIUM(webContext()->insertFenceSyncCHROMIUM(), reinterpret_cast<WGC3Dbyte*>(&waitSyncToken)); memcpy(mailbox.syncToken, &waitSyncToken, sizeof(waitSyncToken)); mailbox.validSyncToken = true; m_drawingBuffer->mailboxReleased(mailbox, false); @@ -646,7 +650,7 @@ m_drawingBuffer->markContentsChanged(); EXPECT_TRUE(m_drawingBuffer->prepareMailbox(&mailbox, 0)); - mailbox.validSyncToken = webContext()->insertSyncPoint(mailbox.syncToken); + mailbox.validSyncToken = webContext()->genSyncTokenCHROMIUM(webContext()->insertFenceSyncCHROMIUM(), mailbox.syncToken); m_drawingBuffer->setIsHidden(true); m_drawingBuffer->mailboxReleased(mailbox); // m_drawingBuffer deletes mailbox immediately when hidden.
diff --git a/third_party/WebKit/Source/platform/network/HTTPRequest.cpp b/third_party/WebKit/Source/platform/network/HTTPRequest.cpp deleted file mode 100644 index e3f8f4a..0000000 --- a/third_party/WebKit/Source/platform/network/HTTPRequest.cpp +++ /dev/null
@@ -1,117 +0,0 @@ -/* - * Copyright (C) 2011 Apple Inc. All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "platform/network/HTTPRequest.h" - -#include "wtf/text/CString.h" - -namespace blink { - -PassRefPtr<HTTPRequest> HTTPRequest::parseHTTPRequestFromBuffer(const char* data, size_t length, String& failureReason) -{ - if (!length) { - failureReason = "No data to parse."; - return nullptr; - } - - // Request we will be building. - RefPtr<HTTPRequest> request = HTTPRequest::create(); - - // Advance a pointer through the data as needed. - const char* pos = data; - size_t remainingLength = length; - - // 1. Parse Method + URL. - size_t requestLineLength = request->parseRequestLine(pos, remainingLength, failureReason); - if (!requestLineLength) - return nullptr; - pos += requestLineLength; - remainingLength -= requestLineLength; - - // 2. Parse HTTP Headers. - size_t headersLength = request->parseHeaders(pos, remainingLength, failureReason); - if (!headersLength) - return nullptr; - pos += headersLength; - remainingLength -= headersLength; - - // 3. Parse HTTP Data. - size_t dataLength = request->parseRequestBody(pos, remainingLength); - remainingLength -= dataLength; - - // We should have processed the entire input. - ASSERT(!remainingLength); - return request.release(); -} - -size_t HTTPRequest::parseRequestLine(const char* data, size_t length, String& failureReason) -{ - String url; - size_t result = parseHTTPRequestLine(data, length, failureReason, m_requestMethod, url, m_httpVersion); - m_url = KURL(KURL(), url); - return result; -} - -size_t HTTPRequest::parseHeaders(const char* data, size_t length, String& failureReason) -{ - const char* p = data; - const char* end = data + length; - AtomicString name; - AtomicString value; - while (p < data + length) { - size_t consumedLength = parseHTTPHeader(p, end - p, failureReason, name, value); - if (!consumedLength) - return 0; - p += consumedLength; - if (name.isEmpty()) - break; - m_headerFields.add(name, value); - } - return p - data; -} - -size_t HTTPRequest::parseRequestBody(const char* data, size_t length) -{ - return parseHTTPRequestBody(data, length, m_body); -} - -HTTPRequest::HTTPRequest() - : m_httpVersion(Unknown) -{ -} - -HTTPRequest::HTTPRequest(const String& requestMethod, const KURL& url, HTTPVersion version) - : m_url(url) - , m_httpVersion(version) - , m_requestMethod(requestMethod) -{ -} - -HTTPRequest::~HTTPRequest() -{ -} - -} // namespace blink
diff --git a/third_party/WebKit/Source/platform/network/HTTPRequest.h b/third_party/WebKit/Source/platform/network/HTTPRequest.h deleted file mode 100644 index 6c32a9e..0000000 --- a/third_party/WebKit/Source/platform/network/HTTPRequest.h +++ /dev/null
@@ -1,82 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. All rights reserved. - * Copyright (C) 2011 Apple Inc. All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef HTTPRequest_h -#define HTTPRequest_h - -#include "platform/PlatformExport.h" -#include "platform/network/HTTPHeaderMap.h" -#include "platform/network/HTTPParsers.h" -#include "platform/weborigin/KURL.h" -#include "wtf/PassRefPtr.h" -#include "wtf/RefCounted.h" -#include "wtf/text/WTFString.h" - -namespace blink { - -class PLATFORM_EXPORT HTTPRequest : public RefCounted<HTTPRequest> { -public: - static PassRefPtr<HTTPRequest> create() { return adoptRef(new HTTPRequest()); } - static PassRefPtr<HTTPRequest> create(const String& requestMethod, const KURL& url, HTTPVersion version) { return adoptRef(new HTTPRequest(requestMethod, url, version)); } - static PassRefPtr<HTTPRequest> parseHTTPRequestFromBuffer(const char* data, size_t length, String& failureReason); - virtual ~HTTPRequest(); - - String requestMethod() const { return m_requestMethod; } - void setRequestMethod(const String& method) { m_requestMethod = method; } - - KURL url() const { return m_url; } - void setURL(const KURL& url) { m_url = url; } - - const Vector<unsigned char>& body() const { return m_body; } - - const HTTPHeaderMap& headerFields() const { return m_headerFields; } - void addHeaderField(const AtomicString& name, const AtomicString& value) { m_headerFields.add(name, value); } - void addHeaderField(const char* name, const AtomicString& value) { m_headerFields.add(name, value); } - -protected: - HTTPRequest(); - HTTPRequest(const String& requestMethod, const KURL&, HTTPVersion); - - // Parsing helpers. - size_t parseRequestLine(const char* data, size_t length, String& failureReason); - size_t parseHeaders(const char* data, size_t length, String& failureReason); - size_t parseRequestBody(const char* data, size_t length); - - KURL m_url; - HTTPVersion m_httpVersion; - String m_requestMethod; - HTTPHeaderMap m_headerFields; - Vector<unsigned char> m_body; -}; - -} // namespace blink - -#endif // HTTPRequest_h
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollbarThemeMacNonOverlayAPI.mm b/third_party/WebKit/Source/platform/scroll/ScrollbarThemeMacNonOverlayAPI.mm index 2e8a6d2b..12770029 100644 --- a/third_party/WebKit/Source/platform/scroll/ScrollbarThemeMacNonOverlayAPI.mm +++ b/third_party/WebKit/Source/platform/scroll/ScrollbarThemeMacNonOverlayAPI.mm
@@ -148,7 +148,7 @@ if (!canDrawDirectly) { ASSERT(imageBuffer); if (!context->contextDisabled()) { - imageBuffer->draw(context, FloatRect(scrollbar->frameRect().location(), imageBuffer->size()), + imageBuffer->draw(context, FloatRect(scrollbar->frameRect().location(), FloatSize(imageBuffer->size())), nullptr, SkXfermode::kSrcOver_Mode); } }
diff --git a/third_party/WebKit/Source/web/FullscreenController.cpp b/third_party/WebKit/Source/web/FullscreenController.cpp index 019c1d2..1efda9e 100644 --- a/third_party/WebKit/Source/web/FullscreenController.cpp +++ b/third_party/WebKit/Source/web/FullscreenController.cpp
@@ -188,7 +188,7 @@ PageScaleConstraints fullscreenConstraints; if (!removeConstraints) { fullscreenConstraints = PageScaleConstraints(1.0, 1.0, 1.0); - fullscreenConstraints.layoutSize = IntSize(m_webViewImpl->size()); + fullscreenConstraints.layoutSize = FloatSize(m_webViewImpl->size()); } m_webViewImpl->pageScaleConstraintsSet().setFullscreenConstraints(fullscreenConstraints); m_webViewImpl->pageScaleConstraintsSet().computeFinalConstraints();
diff --git a/third_party/WebKit/Source/web/PageOverlay.cpp b/third_party/WebKit/Source/web/PageOverlay.cpp index cf837ab..3e95eb8cd 100644 --- a/third_party/WebKit/Source/web/PageOverlay.cpp +++ b/third_party/WebKit/Source/web/PageOverlay.cpp
@@ -89,7 +89,7 @@ page->frameHost().visualViewport().containerLayer()->addChild(m_layer.get()); } - FloatSize size = page->frameHost().visualViewport().size(); + FloatSize size(page->frameHost().visualViewport().size()); if (size != m_layer->size()) m_layer->setSize(size);
diff --git a/third_party/WebKit/Source/web/RotationViewportAnchor.cpp b/third_party/WebKit/Source/web/RotationViewportAnchor.cpp index 5b9bda8b..fb1f13b 100644 --- a/third_party/WebKit/Source/web/RotationViewportAnchor.cpp +++ b/third_party/WebKit/Source/web/RotationViewportAnchor.cpp
@@ -128,12 +128,12 @@ // Outer rectangle is used as a scale, we need positive width and height. ASSERT(!outerViewRect.isEmpty()); - m_normalizedVisualViewportOffset = innerViewRect.location() - outerViewRect.location(); + m_normalizedVisualViewportOffset = FloatSize(innerViewRect.location() - outerViewRect.location()); // Normalize by the size of the outer rect m_normalizedVisualViewportOffset.scale(1.0 / outerViewRect.width(), 1.0 / outerViewRect.height()); - FloatSize anchorOffset = innerViewRect.size(); + FloatSize anchorOffset(innerViewRect.size()); anchorOffset.scale(m_anchorInInnerViewCoords.width(), m_anchorInInnerViewCoords.height()); const FloatPoint anchorPoint = FloatPoint(innerViewRect.location()) + anchorOffset; @@ -152,7 +152,7 @@ float newPageScaleFactor = m_oldPageScaleFactor / m_oldMinimumPageScaleFactor * m_pageScaleConstraintsSet.finalConstraints().minimumScale; newPageScaleFactor = m_pageScaleConstraintsSet.finalConstraints().clampToConstraints(newPageScaleFactor); - FloatSize visualViewportSize = m_visualViewport->size(); + FloatSize visualViewportSize(m_visualViewport->size()); visualViewportSize.scale(1 / newPageScaleFactor); IntPoint mainFrameOrigin;
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp index fbf8875a..5ed7d7f 100644 --- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp +++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp
@@ -74,183 +74,205 @@ namespace blink { -PassOwnPtr<ServiceWorkerGlobalScopeProxy> ServiceWorkerGlobalScopeProxy::create(WebEmbeddedWorkerImpl& embeddedWorker, Document& document, WebServiceWorkerContextClient& client) +PassOwnPtrWillBeRawPtr<ServiceWorkerGlobalScopeProxy> ServiceWorkerGlobalScopeProxy::create(WebEmbeddedWorkerImpl& embeddedWorker, Document& document, WebServiceWorkerContextClient& client) { - return adoptPtr(new ServiceWorkerGlobalScopeProxy(embeddedWorker, document, client)); + return adoptPtrWillBeNoop(new ServiceWorkerGlobalScopeProxy(embeddedWorker, document, client)); } ServiceWorkerGlobalScopeProxy::~ServiceWorkerGlobalScopeProxy() { + // Verify that the proxy has been detached. + ASSERT(!m_embeddedWorker); +} + +DEFINE_TRACE(ServiceWorkerGlobalScopeProxy) +{ + visitor->trace(m_document); + visitor->trace(m_workerGlobalScope); } void ServiceWorkerGlobalScopeProxy::setRegistration(WebPassOwnPtr<WebServiceWorkerRegistration::Handle> handle) { - ASSERT(m_workerGlobalScope); - m_workerGlobalScope->setRegistration(handle); + workerGlobalScope()->setRegistration(handle); } void ServiceWorkerGlobalScopeProxy::dispatchActivateEvent(int eventID) { - ASSERT(m_workerGlobalScope); - WaitUntilObserver* observer = WaitUntilObserver::create(m_workerGlobalScope, WaitUntilObserver::Activate, eventID); + WaitUntilObserver* observer = WaitUntilObserver::create(workerGlobalScope(), WaitUntilObserver::Activate, eventID); RefPtrWillBeRawPtr<Event> event(ExtendableEvent::create(EventTypeNames::activate, ExtendableEventInit(), observer)); - m_workerGlobalScope->dispatchExtendableEvent(event.release(), observer); + workerGlobalScope()->dispatchExtendableEvent(event.release(), observer); } void ServiceWorkerGlobalScopeProxy::dispatchFetchEvent(int eventID, const WebServiceWorkerRequest& webRequest) { - ASSERT(m_workerGlobalScope); - RespondWithObserver* observer = RespondWithObserver::create(m_workerGlobalScope, eventID, webRequest.url(), webRequest.mode(), webRequest.frameType(), webRequest.requestContext()); + RespondWithObserver* observer = RespondWithObserver::create(workerGlobalScope(), eventID, webRequest.url(), webRequest.mode(), webRequest.frameType(), webRequest.requestContext()); bool defaultPrevented = false; - Request* request = Request::create(m_workerGlobalScope, webRequest); + Request* request = Request::create(workerGlobalScope(), webRequest); request->headers()->setGuard(Headers::ImmutableGuard); FetchEventInit eventInit; eventInit.setCancelable(true); eventInit.setRequest(request); eventInit.setIsReload(webRequest.isReload()); RefPtrWillBeRawPtr<FetchEvent> fetchEvent(FetchEvent::create(EventTypeNames::fetch, eventInit, observer)); - defaultPrevented = !m_workerGlobalScope->dispatchEvent(fetchEvent.release()); + defaultPrevented = !workerGlobalScope()->dispatchEvent(fetchEvent.release()); observer->didDispatchEvent(defaultPrevented); } void ServiceWorkerGlobalScopeProxy::dispatchGeofencingEvent(int eventID, WebGeofencingEventType eventType, const WebString& regionID, const WebCircularGeofencingRegion& region) { - ASSERT(m_workerGlobalScope); const AtomicString& type = eventType == WebGeofencingEventTypeEnter ? EventTypeNames::geofenceenter : EventTypeNames::geofenceleave; - m_workerGlobalScope->dispatchEvent(GeofencingEvent::create(type, regionID, CircularGeofencingRegion::create(regionID, region))); + workerGlobalScope()->dispatchEvent(GeofencingEvent::create(type, regionID, CircularGeofencingRegion::create(regionID, region))); } void ServiceWorkerGlobalScopeProxy::dispatchInstallEvent(int eventID) { - ASSERT(m_workerGlobalScope); - WaitUntilObserver* observer = WaitUntilObserver::create(m_workerGlobalScope, WaitUntilObserver::Install, eventID); + WaitUntilObserver* observer = WaitUntilObserver::create(workerGlobalScope(), WaitUntilObserver::Install, eventID); RefPtrWillBeRawPtr<Event> event; - if (RuntimeEnabledFeatures::foreignFetchEnabled()) { + if (RuntimeEnabledFeatures::foreignFetchEnabled()) event = InstallEvent::create(EventTypeNames::install, ExtendableEventInit(), observer); - } else { + else event = ExtendableEvent::create(EventTypeNames::install, ExtendableEventInit(), observer); - } - m_workerGlobalScope->dispatchExtendableEvent(event.release(), observer); + workerGlobalScope()->dispatchExtendableEvent(event.release(), observer); } void ServiceWorkerGlobalScopeProxy::dispatchMessageEvent(const WebString& message, const WebMessagePortChannelArray& webChannels) { - ASSERT(m_workerGlobalScope); - - MessagePortArray* ports = MessagePort::toMessagePortArray(m_workerGlobalScope, webChannels); + MessagePortArray* ports = MessagePort::toMessagePortArray(workerGlobalScope(), webChannels); WebSerializedScriptValue value = WebSerializedScriptValue::fromString(message); - m_workerGlobalScope->dispatchEvent(MessageEvent::create(ports, value)); + workerGlobalScope()->dispatchEvent(MessageEvent::create(ports, value)); } void ServiceWorkerGlobalScopeProxy::dispatchNotificationClickEvent(int eventID, int64_t notificationID, const WebNotificationData& data, int actionIndex) { - ASSERT(m_workerGlobalScope); - WaitUntilObserver* observer = WaitUntilObserver::create(m_workerGlobalScope, WaitUntilObserver::NotificationClick, eventID); + WaitUntilObserver* observer = WaitUntilObserver::create(workerGlobalScope(), WaitUntilObserver::NotificationClick, eventID); NotificationEventInit eventInit; - eventInit.setNotification(Notification::create(m_workerGlobalScope, notificationID, data)); + eventInit.setNotification(Notification::create(workerGlobalScope(), notificationID, data)); if (0 <= actionIndex && actionIndex < static_cast<int>(data.actions.size())) eventInit.setAction(data.actions[actionIndex].action); RefPtrWillBeRawPtr<Event> event(NotificationEvent::create(EventTypeNames::notificationclick, eventInit, observer)); - m_workerGlobalScope->dispatchExtendableEvent(event.release(), observer); + workerGlobalScope()->dispatchExtendableEvent(event.release(), observer); } void ServiceWorkerGlobalScopeProxy::dispatchPushEvent(int eventID, const WebString& data) { - ASSERT(m_workerGlobalScope); - WaitUntilObserver* observer = WaitUntilObserver::create(m_workerGlobalScope, WaitUntilObserver::Push, eventID); + WaitUntilObserver* observer = WaitUntilObserver::create(workerGlobalScope(), WaitUntilObserver::Push, eventID); RefPtrWillBeRawPtr<Event> event(PushEvent::create(EventTypeNames::push, PushMessageData::create(data), observer)); - m_workerGlobalScope->dispatchExtendableEvent(event.release(), observer); + workerGlobalScope()->dispatchExtendableEvent(event.release(), observer); } void ServiceWorkerGlobalScopeProxy::dispatchServicePortConnectEvent(WebServicePortConnectEventCallbacks* rawCallbacks, const WebURL& targetURL, const WebString& origin, WebServicePortID portID) { - ASSERT(m_workerGlobalScope); OwnPtr<WebServicePortConnectEventCallbacks> callbacks = adoptPtr(rawCallbacks); - ServicePortCollection* collection = WorkerNavigatorServices::services(m_workerGlobalScope, *m_workerGlobalScope->navigator()); + ServicePortCollection* collection = WorkerNavigatorServices::services(workerGlobalScope(), *workerGlobalScope()->navigator()); collection->dispatchConnectEvent(callbacks.release(), targetURL, origin, portID); } void ServiceWorkerGlobalScopeProxy::dispatchSyncEvent(int eventID, const WebSyncRegistration& registration, LastChanceOption lastChance) { - ASSERT(m_workerGlobalScope); if (!RuntimeEnabledFeatures::backgroundSyncEnabled()) { - ServiceWorkerGlobalScopeClient::from(m_workerGlobalScope)->didHandleSyncEvent(eventID, WebServiceWorkerEventResultCompleted); + ServiceWorkerGlobalScopeClient::from(workerGlobalScope())->didHandleSyncEvent(eventID, WebServiceWorkerEventResultCompleted); return; } - WaitUntilObserver* observer = WaitUntilObserver::create(m_workerGlobalScope, WaitUntilObserver::Sync, eventID); + WaitUntilObserver* observer = WaitUntilObserver::create(workerGlobalScope(), WaitUntilObserver::Sync, eventID); RefPtrWillBeRawPtr<Event> event(SyncEvent::create(EventTypeNames::sync, registration.tag, lastChance == IsLastChance, observer)); - m_workerGlobalScope->dispatchExtendableEvent(event.release(), observer); + workerGlobalScope()->dispatchExtendableEvent(event.release(), observer); } void ServiceWorkerGlobalScopeProxy::dispatchCrossOriginMessageEvent(const WebCrossOriginServiceWorkerClient& webClient, const WebString& message, const WebMessagePortChannelArray& webChannels) { - ASSERT(m_workerGlobalScope); - MessagePortArray* ports = MessagePort::toMessagePortArray(m_workerGlobalScope, webChannels); + MessagePortArray* ports = MessagePort::toMessagePortArray(workerGlobalScope(), webChannels); WebSerializedScriptValue value = WebSerializedScriptValue::fromString(message); // FIXME: Have proper source for this MessageEvent. RefPtrWillBeRawPtr<MessageEvent> event = MessageEvent::create(ports, value, webClient.origin.string()); event->setType(EventTypeNames::crossoriginmessage); - m_workerGlobalScope->dispatchEvent(event); + workerGlobalScope()->dispatchEvent(event); } void ServiceWorkerGlobalScopeProxy::reportException(const String& errorMessage, int lineNumber, int columnNumber, const String& sourceURL, int) { - m_client.reportException(errorMessage, lineNumber, columnNumber, sourceURL); + client().reportException(errorMessage, lineNumber, columnNumber, sourceURL); } void ServiceWorkerGlobalScopeProxy::reportConsoleMessage(PassRefPtrWillBeRawPtr<ConsoleMessage> consoleMessage) { - m_client.reportConsoleMessage(consoleMessage->source(), consoleMessage->level(), consoleMessage->message(), consoleMessage->lineNumber(), consoleMessage->url()); + client().reportConsoleMessage(consoleMessage->source(), consoleMessage->level(), consoleMessage->message(), consoleMessage->lineNumber(), consoleMessage->url()); } void ServiceWorkerGlobalScopeProxy::postMessageToPageInspector(const String& message) { - m_document.postInspectorTask(BLINK_FROM_HERE, createCrossThreadTask(&WebEmbeddedWorkerImpl::postMessageToPageInspector, &m_embeddedWorker, message)); + ASSERT(m_embeddedWorker); + document().postInspectorTask(BLINK_FROM_HERE, createCrossThreadTask(&WebEmbeddedWorkerImpl::postMessageToPageInspector, m_embeddedWorker, message)); } void ServiceWorkerGlobalScopeProxy::didEvaluateWorkerScript(bool success) { - m_client.didEvaluateWorkerScript(success); + client().didEvaluateWorkerScript(success); } void ServiceWorkerGlobalScopeProxy::didInitializeWorkerContext() { - ASSERT(m_workerGlobalScope); - ScriptState::Scope scope(m_workerGlobalScope->script()->scriptState()); - m_client.didInitializeWorkerContext(m_workerGlobalScope->script()->context(), WebURL(m_documentURL)); + ScriptState::Scope scope(workerGlobalScope()->script()->scriptState()); + client().didInitializeWorkerContext(workerGlobalScope()->script()->context(), WebURL(m_documentURL)); } void ServiceWorkerGlobalScopeProxy::workerGlobalScopeStarted(WorkerGlobalScope* workerGlobalScope) { ASSERT(!m_workerGlobalScope); m_workerGlobalScope = static_cast<ServiceWorkerGlobalScope*>(workerGlobalScope); - m_client.workerContextStarted(this); + client().workerContextStarted(this); } void ServiceWorkerGlobalScopeProxy::workerGlobalScopeClosed() { - m_document.postTask(BLINK_FROM_HERE, createCrossThreadTask(&WebEmbeddedWorkerImpl::terminateWorkerContext, &m_embeddedWorker)); + ASSERT(m_embeddedWorker); + document().postTask(BLINK_FROM_HERE, createCrossThreadTask(&WebEmbeddedWorkerImpl::terminateWorkerContext, m_embeddedWorker)); } void ServiceWorkerGlobalScopeProxy::willDestroyWorkerGlobalScope() { - v8::HandleScope handleScope(m_workerGlobalScope->thread()->isolate()); - m_client.willDestroyWorkerContext(m_workerGlobalScope->script()->context()); + v8::HandleScope handleScope(workerGlobalScope()->thread()->isolate()); + client().willDestroyWorkerContext(workerGlobalScope()->script()->context()); m_workerGlobalScope = nullptr; } void ServiceWorkerGlobalScopeProxy::workerThreadTerminated() { - m_client.workerContextDestroyed(); + client().workerContextDestroyed(); } ServiceWorkerGlobalScopeProxy::ServiceWorkerGlobalScopeProxy(WebEmbeddedWorkerImpl& embeddedWorker, Document& document, WebServiceWorkerContextClient& client) - : m_embeddedWorker(embeddedWorker) - , m_document(document) + : m_embeddedWorker(&embeddedWorker) + , m_document(&document) , m_documentURL(document.url().copy()) - , m_client(client) + , m_client(&client) , m_workerGlobalScope(nullptr) { } +void ServiceWorkerGlobalScopeProxy::detach() +{ + m_embeddedWorker = nullptr; + m_document = nullptr; + m_client = nullptr; + m_workerGlobalScope = nullptr; +} + +WebServiceWorkerContextClient& ServiceWorkerGlobalScopeProxy::client() const +{ + ASSERT(m_client); + return *m_client; +} + +Document& ServiceWorkerGlobalScopeProxy::document() const +{ + ASSERT(m_document); + return *m_document; +} + +ServiceWorkerGlobalScope* ServiceWorkerGlobalScopeProxy::workerGlobalScope() const +{ + ASSERT(m_workerGlobalScope); + return m_workerGlobalScope; +} + } // namespace blink
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h index 7c90213cee..f8a99d8 100644 --- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h +++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h
@@ -62,12 +62,13 @@ // workerThreadTerminated() is called by its corresponding // WorkerGlobalScope. class ServiceWorkerGlobalScopeProxy final - : public WebServiceWorkerContextProxy + : public NoBaseWillBeGarbageCollectedFinalized<ServiceWorkerGlobalScopeProxy> + , public WebServiceWorkerContextProxy , public WorkerReportingProxy { WTF_MAKE_NONCOPYABLE(ServiceWorkerGlobalScopeProxy); - USING_FAST_MALLOC(ServiceWorkerGlobalScopeProxy); + USING_FAST_MALLOC_WILL_BE_REMOVED(ServiceWorkerGlobalScopeProxy); public: - static PassOwnPtr<ServiceWorkerGlobalScopeProxy> create(WebEmbeddedWorkerImpl&, Document&, WebServiceWorkerContextClient&); + static PassOwnPtrWillBeRawPtr<ServiceWorkerGlobalScopeProxy> create(WebEmbeddedWorkerImpl&, Document&, WebServiceWorkerContextClient&); ~ServiceWorkerGlobalScopeProxy() override; // WebServiceWorkerContextProxy overrides: @@ -95,16 +96,31 @@ void willDestroyWorkerGlobalScope() override; void workerThreadTerminated() override; + DECLARE_TRACE(); + + // Detach this proxy object entirely from the outside world, + // clearing out all references. + // + // It is called during WebEmbeddedWorkerImpl finalization _after_ + // the worker thread using the proxy has been terminated. + void detach(); + private: ServiceWorkerGlobalScopeProxy(WebEmbeddedWorkerImpl&, Document&, WebServiceWorkerContextClient&); - WebEmbeddedWorkerImpl& m_embeddedWorker; - Document& m_document; + WebServiceWorkerContextClient& client() const; + Document& document() const; + ServiceWorkerGlobalScope* workerGlobalScope() const; + + // Non-null until the WebEmbeddedWorkerImpl explicitly detach()es + // as part of its finalization. + WebEmbeddedWorkerImpl* m_embeddedWorker; + RawPtrWillBeMember<Document> m_document; KURL m_documentURL; - WebServiceWorkerContextClient& m_client; + WebServiceWorkerContextClient* m_client; - ServiceWorkerGlobalScope* m_workerGlobalScope; + RawPtrWillBeMember<ServiceWorkerGlobalScope> m_workerGlobalScope; }; } // namespace blink
diff --git a/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp b/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp index 7873baa8..2a4236d 100644 --- a/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp +++ b/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.cpp
@@ -108,6 +108,11 @@ // Detach the client before closing the view to avoid getting called back. m_mainFrame->setClient(0); + if (m_workerGlobalScopeProxy) { + m_workerGlobalScopeProxy->detach(); + m_workerGlobalScopeProxy.clear(); + } + m_webView->close(); m_mainFrame->close(); if (m_loaderProxy)
diff --git a/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.h b/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.h index 8c4d9d9..55f53bb2 100644 --- a/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.h +++ b/third_party/WebKit/Source/web/WebEmbeddedWorkerImpl.h
@@ -107,7 +107,7 @@ RefPtr<WorkerThread> m_workerThread; RefPtr<WorkerLoaderProxy> m_loaderProxy; - OwnPtr<ServiceWorkerGlobalScopeProxy> m_workerGlobalScopeProxy; + OwnPtrWillBePersistent<ServiceWorkerGlobalScopeProxy> m_workerGlobalScopeProxy; OwnPtrWillBePersistent<WorkerInspectorProxy> m_workerInspectorProxy; // 'shadow page' - created to proxy loading requests from the worker.
diff --git a/third_party/WebKit/Source/web/WebInputEventConversion.cpp b/third_party/WebKit/Source/web/WebInputEventConversion.cpp index ec142d9..9621085f 100644 --- a/third_party/WebKit/Source/web/WebInputEventConversion.cpp +++ b/third_party/WebKit/Source/web/WebInputEventConversion.cpp
@@ -102,6 +102,7 @@ // MakePlatformMouseEvent ----------------------------------------------------- +// TODO(mustaq): Add tests for this. PlatformMouseEventBuilder::PlatformMouseEventBuilder(Widget* widget, const WebMouseEvent& e) { // FIXME: Widget is always toplevel, unless it's a popup. We may be able @@ -115,6 +116,8 @@ m_timestamp = e.timeStampSeconds; m_clickCount = e.clickCount; + m_pointerProperties = static_cast<WebPointerProperties>(e); + switch (e.type) { case WebInputEvent::MouseMove: case WebInputEvent::MouseLeave: // synthesize a move event @@ -382,6 +385,7 @@ return WebTouchPoint::StateUndefined; } +// TODO(mustaq): Add tests for this. PlatformTouchPointBuilder::PlatformTouchPointBuilder(Widget* widget, const WebTouchPoint& point) { m_pointerProperties = point;
diff --git a/third_party/WebKit/Source/web/WebViewImpl.cpp b/third_party/WebKit/Source/web/WebViewImpl.cpp index f0b5215..6d438f1 100644 --- a/third_party/WebKit/Source/web/WebViewImpl.cpp +++ b/third_party/WebKit/Source/web/WebViewImpl.cpp
@@ -2935,7 +2935,7 @@ if (!needAnimation) return; - FloatSize targetViewportSize = visualViewport.size(); + FloatSize targetViewportSize(visualViewport.size()); targetViewportSize.scale(1 / newScale); if (textboxRectInDocument.width() <= targetViewportSize.width()) {
diff --git a/third_party/WebKit/Source/web/tests/ViewportTest.cpp b/third_party/WebKit/Source/web/tests/ViewportTest.cpp index 386e459..2dd1e6c 100644 --- a/third_party/WebKit/Source/web/tests/ViewportTest.cpp +++ b/third_party/WebKit/Source/web/tests/ViewportTest.cpp
@@ -101,7 +101,7 @@ IntSize initialViewportSize(initialWidth, initialHeight); toLocalFrame(page->mainFrame())->view()->setFrameRect(IntRect(IntPoint::zero(), initialViewportSize)); ViewportDescription description = page->viewportDescription(); - PageScaleConstraints constraints = description.resolve(initialViewportSize, Length(980, blink::Fixed)); + PageScaleConstraints constraints = description.resolve(FloatSize(initialViewportSize), Length(980, blink::Fixed)); constraints.fitToContentsWidth(constraints.layoutSize.width(), initialWidth); constraints.resolveAutoInitialScale();
diff --git a/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp b/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp index 9d2e7f75..3e54d0f 100644 --- a/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp +++ b/third_party/WebKit/Source/web/tests/VisualViewportTest.cpp
@@ -459,7 +459,7 @@ visualViewport.setSize(size); // Scale the viewport to 2X; size should not change. - FloatRect expectedRect(FloatPoint(0, 0), size); + FloatRect expectedRect(FloatPoint(0, 0), FloatSize(size)); expectedRect.scale(0.5); visualViewport.setScale(2); EXPECT_EQ(2, visualViewport.scale()); @@ -477,7 +477,7 @@ // Scale the viewport to 3X to introduce some non-int values. FloatPoint oldLocation = expectedRect.location(); - expectedRect = FloatRect(FloatPoint(), size); + expectedRect = FloatRect(FloatPoint(), FloatSize(size)); expectedRect.scale(1 / 3.0f); expectedRect.setLocation(oldLocation); visualViewport.setScale(3);
diff --git a/third_party/WebKit/Source/wtf/Atomics.h b/third_party/WebKit/Source/wtf/Atomics.h index cdd631ef..09b707e 100644 --- a/third_party/WebKit/Source/wtf/Atomics.h +++ b/third_party/WebKit/Source/wtf/Atomics.h
@@ -319,6 +319,17 @@ return value; } +ALWAYS_INLINE void noBarrierStore(volatile int* ptr, int value) +{ + *ptr = value; +} + +ALWAYS_INLINE int noBarrierLoad(volatile const int* ptr) +{ + int value = *ptr; + return value; +} + #if defined(ADDRESS_SANITIZER) NO_SANITIZE_ADDRESS ALWAYS_INLINE void asanUnsafeReleaseStore(volatile unsigned* ptr, unsigned value)
diff --git a/third_party/WebKit/Source/wtf/SpinLock.cpp b/third_party/WebKit/Source/wtf/SpinLock.cpp index 0b5586e..f958c0fb 100644 --- a/third_party/WebKit/Source/wtf/SpinLock.cpp +++ b/third_party/WebKit/Source/wtf/SpinLock.cpp
@@ -62,13 +62,13 @@ for (int count = 0; count < kYieldProcessorTries; ++count) { // Let the Processor know we're spinning. YIELD_PROCESSOR; - if (!*lock && LIKELY(!atomicTestAndSetToOne(lock))) + if (!noBarrierLoad(lock) && LIKELY(!atomicTestAndSetToOne(lock))) return; } // Give the OS a chance to schedule something on this core. YIELD_THREAD; - } while (*lock); + } while (noBarrierLoad(lock)); } while (UNLIKELY(atomicTestAndSetToOne(lock))); }
diff --git a/third_party/WebKit/public/platform/WebGraphicsContext3D.h b/third_party/WebKit/public/platform/WebGraphicsContext3D.h index 5c4d0460..f4fcb933 100644 --- a/third_party/WebKit/public/platform/WebGraphicsContext3D.h +++ b/third_party/WebKit/public/platform/WebGraphicsContext3D.h
@@ -148,8 +148,9 @@ virtual void discardBackbufferCHROMIUM() { } virtual void ensureBackbufferCHROMIUM() { } - virtual bool insertSyncPoint(WGC3Dbyte*) { return false; } - virtual void waitSyncToken(const WGC3Dbyte*) {} + virtual WGC3Duint64 insertFenceSyncCHROMIUM() { return 0; } + virtual bool genSyncTokenCHROMIUM(WGC3Duint64, WGC3Dbyte*) { return false; } + virtual void waitSyncTokenCHROMIUM(const WGC3Dbyte*) {} // Copies the contents of the off-screen render target used by the WebGL // context to the corresponding texture used by the compositor.
diff --git a/third_party/libvpx_new/BUILD.gn b/third_party/libvpx_new/BUILD.gn index 33599b6..e048871 100644 --- a/third_party/libvpx_new/BUILD.gn +++ b/third_party/libvpx_new/BUILD.gn
@@ -156,6 +156,23 @@ } } +static_library("libvpx_intrinsics_avx") { + configs += [ ":libvpx_config" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":libvpx_warnings" ] + if (is_win) { + cflags = [ "/arch:AVX" ] + } else { + cflags = [ "-mavx" ] + } + if (current_cpu == "x86") { + sources = libvpx_srcs_x86_avx + } else if (current_cpu == "x64") { + sources = libvpx_srcs_x86_64_avx + } +} + static_library("libvpx_intrinsics_avx2") { configs += [ ":libvpx_config" ] configs -= [ "//build/config/compiler:chromium_code" ] @@ -265,6 +282,7 @@ ":libvpx_intrinsics_sse2", ":libvpx_intrinsics_ssse3", ":libvpx_intrinsics_sse4_1", + ":libvpx_intrinsics_avx", ":libvpx_intrinsics_avx2", ] }
diff --git a/third_party/libvpx_new/README.chromium b/third_party/libvpx_new/README.chromium index 1b01128..d1bed51 100644 --- a/third_party/libvpx_new/README.chromium +++ b/third_party/libvpx_new/README.chromium
@@ -5,9 +5,9 @@ License File: source/libvpx/LICENSE Security Critical: yes -Date: Thursday November 12 2015 +Date: Friday November 13 2015 Branch: master -Commit: 9ecb99abf094bf73a74468b100f3a139a4e372dc +Commit: 204cde580a5f6dd5e7511c932c47c068046d9671 Description: Contains the sources used to compile libvpx binaries used by Google Chrome and
diff --git a/third_party/libvpx_new/generate_gypi.sh b/third_party/libvpx_new/generate_gypi.sh index 06a9581..d650e8d0 100755 --- a/third_party/libvpx_new/generate_gypi.sh +++ b/third_party/libvpx_new/generate_gypi.sh
@@ -166,13 +166,21 @@ echo " 'cflags': [ '-m$4', ]," >> "$2" echo " 'xcode_settings': { 'OTHER_CFLAGS': [ '-m$4' ] }," >> "$2" fi + if [[ -z $DISABLE_AVX && $4 == avx ]]; then + echo " 'msvs_settings': {" >> "$2" + echo " 'VCCLCompilerTool': {" >> "$2" + echo " 'EnableEnhancedInstructionSet': '3', # /arch:AVX" >> "$2" + echo " }," >> "$2" + echo " }," >> "$2" + fi if [[ -z $DISABLE_AVX && $4 == avx2 ]]; then echo " 'msvs_settings': {" >> "$2" echo " 'VCCLCompilerTool': {" >> "$2" echo " 'EnableEnhancedInstructionSet': '5', # /arch:AVX2" >> "$2" echo " }," >> "$2" echo " }," >> "$2" - elif [[ $4 == ssse3 || $4 == sse4.1 ]]; then + fi + if [[ $4 == ssse3 || $4 == sse4.1 ]]; then echo " 'conditions': [" >> "$2" echo " ['OS==\"win\" and clang==1', {" >> "$2" echo " # cl.exe's /arch flag doesn't have a setting for SSSE3/4, and cl.exe" >> "$2" @@ -232,9 +240,7 @@ write_target_definition sse4_1_sources[@] "$2" libvpx_intrinsics_sse4_1 sse4.1 fi if [[ -z $DISABLE_AVX && 0 -ne ${#avx_sources} ]]; then - #write_target_definition avx_sources[@] "$2" libvpx_intrinsics_avx avx - echo "ERROR: Uncomment avx sections in libvpx.gyp" - exit 1 + write_target_definition avx_sources[@] "$2" libvpx_intrinsics_avx avx fi if [[ -z $DISABLE_AVX && 0 -ne ${#avx2_sources} ]]; then write_target_definition avx2_sources[@] "$2" libvpx_intrinsics_avx2 avx2
diff --git a/third_party/libvpx_new/libvpx.gyp b/third_party/libvpx_new/libvpx.gyp index 7cf7905..c9133618 100644 --- a/third_party/libvpx_new/libvpx.gyp +++ b/third_party/libvpx_new/libvpx.gyp
@@ -147,8 +147,7 @@ #'libvpx_intrinsics_sse3', 'libvpx_intrinsics_ssse3', 'libvpx_intrinsics_sse4_1', - # Currently no avx intrinsic functions - #'libvpx_intrinsics_avx', + 'libvpx_intrinsics_avx', 'libvpx_intrinsics_avx2', ], }], @@ -170,8 +169,7 @@ #'libvpx_intrinsics_sse3', 'libvpx_intrinsics_ssse3', 'libvpx_intrinsics_sse4_1', - # Currently no avx intrinsic functions - #'libvpx_intrinsics_avx', + 'libvpx_intrinsics_avx', 'libvpx_intrinsics_avx2', ], }],
diff --git a/third_party/libvpx_new/libvpx_srcs.gni b/third_party/libvpx_new/libvpx_srcs.gni index f1d914c2..6436353 100644 --- a/third_party/libvpx_new/libvpx_srcs.gni +++ b/third_party/libvpx_new/libvpx_srcs.gni
@@ -420,7 +420,7 @@ ] libvpx_srcs_x86_sse4_1 = [ "//third_party/libvpx_new/source/libvpx/vp8/encoder/x86/quantize_sse4.c" ] -libvpx_srcs_x86_avx = [] +libvpx_srcs_x86_avx = [ "//third_party/libvpx_new/source/libvpx/vp9/encoder/x86/vp9_diamond_search_sad_avx.c" ] libvpx_srcs_x86_avx2 = [ "//third_party/libvpx_new/source/libvpx/vp9/encoder/x86/vp9_error_intrin_avx2.c", "//third_party/libvpx_new/source/libvpx/vpx_dsp/x86/fwd_txfm_avx2.c", @@ -856,7 +856,7 @@ ] libvpx_srcs_x86_64_sse4_1 = [ "//third_party/libvpx_new/source/libvpx/vp8/encoder/x86/quantize_sse4.c" ] -libvpx_srcs_x86_64_avx = [] +libvpx_srcs_x86_64_avx = [ "//third_party/libvpx_new/source/libvpx/vp9/encoder/x86/vp9_diamond_search_sad_avx.c" ] libvpx_srcs_x86_64_avx2 = [ "//third_party/libvpx_new/source/libvpx/vp9/encoder/x86/vp9_error_intrin_avx2.c", "//third_party/libvpx_new/source/libvpx/vpx_dsp/x86/fwd_txfm_avx2.c",
diff --git a/third_party/libvpx_new/libvpx_srcs_x86_64_intrinsics.gypi b/third_party/libvpx_new/libvpx_srcs_x86_64_intrinsics.gypi index 881194e..dc26276 100644 --- a/third_party/libvpx_new/libvpx_srcs_x86_64_intrinsics.gypi +++ b/third_party/libvpx_new/libvpx_srcs_x86_64_intrinsics.gypi
@@ -94,6 +94,24 @@ ], }, { + 'target_name': 'libvpx_intrinsics_avx', + 'type': 'static_library', + 'include_dirs': [ + 'source/config/<(OS_CATEGORY)/<(target_arch_full)', + '<(libvpx_source)', + ], + 'sources': [ + '<(libvpx_source)/vp9/encoder/x86/vp9_diamond_search_sad_avx.c', + ], + 'cflags': [ '-mavx', ], + 'xcode_settings': { 'OTHER_CFLAGS': [ '-mavx' ] }, + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableEnhancedInstructionSet': '3', # /arch:AVX + }, + }, + }, + { 'target_name': 'libvpx_intrinsics_avx2', 'type': 'static_library', 'include_dirs': [
diff --git a/third_party/libvpx_new/libvpx_srcs_x86_intrinsics.gypi b/third_party/libvpx_new/libvpx_srcs_x86_intrinsics.gypi index 881194e..dc26276 100644 --- a/third_party/libvpx_new/libvpx_srcs_x86_intrinsics.gypi +++ b/third_party/libvpx_new/libvpx_srcs_x86_intrinsics.gypi
@@ -94,6 +94,24 @@ ], }, { + 'target_name': 'libvpx_intrinsics_avx', + 'type': 'static_library', + 'include_dirs': [ + 'source/config/<(OS_CATEGORY)/<(target_arch_full)', + '<(libvpx_source)', + ], + 'sources': [ + '<(libvpx_source)/vp9/encoder/x86/vp9_diamond_search_sad_avx.c', + ], + 'cflags': [ '-mavx', ], + 'xcode_settings': { 'OTHER_CFLAGS': [ '-mavx' ] }, + 'msvs_settings': { + 'VCCLCompilerTool': { + 'EnableEnhancedInstructionSet': '3', # /arch:AVX + }, + }, + }, + { 'target_name': 'libvpx_intrinsics_avx2', 'type': 'static_library', 'include_dirs': [
diff --git a/third_party/libvpx_new/source/config/linux/ia32/vp9_rtcd.h b/third_party/libvpx_new/source/config/linux/ia32/vp9_rtcd.h index 0c0a793..c6b88be 100644 --- a/third_party/libvpx_new/source/config/linux/ia32/vp9_rtcd.h +++ b/third_party/libvpx_new/source/config/linux/ia32/vp9_rtcd.h
@@ -51,7 +51,8 @@ RTCD_EXTERN int (*vp9_denoiser_filter)(const uint8_t *sig, int sig_stride, const uint8_t *mc_avg, int mc_avg_stride, uint8_t *avg, int avg_stride, int increase_denoising, BLOCK_SIZE bs, int motion_magnitude); int vp9_diamond_search_sad_c(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -#define vp9_diamond_search_sad vp9_diamond_search_sad_c +int vp9_diamond_search_sad_avx(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); +RTCD_EXTERN int (*vp9_diamond_search_sad)(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); void vp9_fdct8x8_quant_c(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vp9_fdct8x8_quant_sse2(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -178,6 +179,8 @@ if (flags & HAS_SSE2) vp9_block_error_fp = vp9_block_error_fp_sse2; vp9_denoiser_filter = vp9_denoiser_filter_c; if (flags & HAS_SSE2) vp9_denoiser_filter = vp9_denoiser_filter_sse2; + vp9_diamond_search_sad = vp9_diamond_search_sad_c; + if (flags & HAS_AVX) vp9_diamond_search_sad = vp9_diamond_search_sad_avx; vp9_fdct8x8_quant = vp9_fdct8x8_quant_c; if (flags & HAS_SSE2) vp9_fdct8x8_quant = vp9_fdct8x8_quant_sse2; if (flags & HAS_SSSE3) vp9_fdct8x8_quant = vp9_fdct8x8_quant_ssse3;
diff --git a/third_party/libvpx_new/source/config/linux/x64/vp9_rtcd.h b/third_party/libvpx_new/source/config/linux/x64/vp9_rtcd.h index f3200861..a6fa4f67 100644 --- a/third_party/libvpx_new/source/config/linux/x64/vp9_rtcd.h +++ b/third_party/libvpx_new/source/config/linux/x64/vp9_rtcd.h
@@ -51,7 +51,8 @@ #define vp9_denoiser_filter vp9_denoiser_filter_sse2 int vp9_diamond_search_sad_c(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -#define vp9_diamond_search_sad vp9_diamond_search_sad_c +int vp9_diamond_search_sad_avx(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); +RTCD_EXTERN int (*vp9_diamond_search_sad)(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); void vp9_fdct8x8_quant_c(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vp9_fdct8x8_quant_sse2(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -172,6 +173,8 @@ vp9_block_error = vp9_block_error_sse2; if (flags & HAS_AVX2) vp9_block_error = vp9_block_error_avx2; + vp9_diamond_search_sad = vp9_diamond_search_sad_c; + if (flags & HAS_AVX) vp9_diamond_search_sad = vp9_diamond_search_sad_avx; vp9_fdct8x8_quant = vp9_fdct8x8_quant_sse2; if (flags & HAS_SSSE3) vp9_fdct8x8_quant = vp9_fdct8x8_quant_ssse3; vp9_full_search_sad = vp9_full_search_sad_c;
diff --git a/third_party/libvpx_new/source/config/mac/ia32/vp9_rtcd.h b/third_party/libvpx_new/source/config/mac/ia32/vp9_rtcd.h index 0c0a793..c6b88be 100644 --- a/third_party/libvpx_new/source/config/mac/ia32/vp9_rtcd.h +++ b/third_party/libvpx_new/source/config/mac/ia32/vp9_rtcd.h
@@ -51,7 +51,8 @@ RTCD_EXTERN int (*vp9_denoiser_filter)(const uint8_t *sig, int sig_stride, const uint8_t *mc_avg, int mc_avg_stride, uint8_t *avg, int avg_stride, int increase_denoising, BLOCK_SIZE bs, int motion_magnitude); int vp9_diamond_search_sad_c(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -#define vp9_diamond_search_sad vp9_diamond_search_sad_c +int vp9_diamond_search_sad_avx(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); +RTCD_EXTERN int (*vp9_diamond_search_sad)(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); void vp9_fdct8x8_quant_c(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vp9_fdct8x8_quant_sse2(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -178,6 +179,8 @@ if (flags & HAS_SSE2) vp9_block_error_fp = vp9_block_error_fp_sse2; vp9_denoiser_filter = vp9_denoiser_filter_c; if (flags & HAS_SSE2) vp9_denoiser_filter = vp9_denoiser_filter_sse2; + vp9_diamond_search_sad = vp9_diamond_search_sad_c; + if (flags & HAS_AVX) vp9_diamond_search_sad = vp9_diamond_search_sad_avx; vp9_fdct8x8_quant = vp9_fdct8x8_quant_c; if (flags & HAS_SSE2) vp9_fdct8x8_quant = vp9_fdct8x8_quant_sse2; if (flags & HAS_SSSE3) vp9_fdct8x8_quant = vp9_fdct8x8_quant_ssse3;
diff --git a/third_party/libvpx_new/source/config/mac/x64/vp9_rtcd.h b/third_party/libvpx_new/source/config/mac/x64/vp9_rtcd.h index f3200861..a6fa4f67 100644 --- a/third_party/libvpx_new/source/config/mac/x64/vp9_rtcd.h +++ b/third_party/libvpx_new/source/config/mac/x64/vp9_rtcd.h
@@ -51,7 +51,8 @@ #define vp9_denoiser_filter vp9_denoiser_filter_sse2 int vp9_diamond_search_sad_c(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -#define vp9_diamond_search_sad vp9_diamond_search_sad_c +int vp9_diamond_search_sad_avx(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); +RTCD_EXTERN int (*vp9_diamond_search_sad)(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); void vp9_fdct8x8_quant_c(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vp9_fdct8x8_quant_sse2(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -172,6 +173,8 @@ vp9_block_error = vp9_block_error_sse2; if (flags & HAS_AVX2) vp9_block_error = vp9_block_error_avx2; + vp9_diamond_search_sad = vp9_diamond_search_sad_c; + if (flags & HAS_AVX) vp9_diamond_search_sad = vp9_diamond_search_sad_avx; vp9_fdct8x8_quant = vp9_fdct8x8_quant_sse2; if (flags & HAS_SSSE3) vp9_fdct8x8_quant = vp9_fdct8x8_quant_ssse3; vp9_full_search_sad = vp9_full_search_sad_c;
diff --git a/third_party/libvpx_new/source/config/vpx_version.h b/third_party/libvpx_new/source/config/vpx_version.h index 19e16b71..ca5d72bf 100644 --- a/third_party/libvpx_new/source/config/vpx_version.h +++ b/third_party/libvpx_new/source/config/vpx_version.h
@@ -1,7 +1,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 5 #define VERSION_PATCH 0 -#define VERSION_EXTRA "96-g0941ff7" +#define VERSION_EXTRA "110-g204cde5" #define VERSION_PACKED ((VERSION_MAJOR<<16)|(VERSION_MINOR<<8)|(VERSION_PATCH)) -#define VERSION_STRING_NOSP "v1.5.0-96-g0941ff7" -#define VERSION_STRING " v1.5.0-96-g0941ff7" +#define VERSION_STRING_NOSP "v1.5.0-110-g204cde5" +#define VERSION_STRING " v1.5.0-110-g204cde5"
diff --git a/third_party/libvpx_new/source/config/win/ia32/vp9_rtcd.h b/third_party/libvpx_new/source/config/win/ia32/vp9_rtcd.h index 0c0a793..c6b88be 100644 --- a/third_party/libvpx_new/source/config/win/ia32/vp9_rtcd.h +++ b/third_party/libvpx_new/source/config/win/ia32/vp9_rtcd.h
@@ -51,7 +51,8 @@ RTCD_EXTERN int (*vp9_denoiser_filter)(const uint8_t *sig, int sig_stride, const uint8_t *mc_avg, int mc_avg_stride, uint8_t *avg, int avg_stride, int increase_denoising, BLOCK_SIZE bs, int motion_magnitude); int vp9_diamond_search_sad_c(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -#define vp9_diamond_search_sad vp9_diamond_search_sad_c +int vp9_diamond_search_sad_avx(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); +RTCD_EXTERN int (*vp9_diamond_search_sad)(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); void vp9_fdct8x8_quant_c(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vp9_fdct8x8_quant_sse2(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -178,6 +179,8 @@ if (flags & HAS_SSE2) vp9_block_error_fp = vp9_block_error_fp_sse2; vp9_denoiser_filter = vp9_denoiser_filter_c; if (flags & HAS_SSE2) vp9_denoiser_filter = vp9_denoiser_filter_sse2; + vp9_diamond_search_sad = vp9_diamond_search_sad_c; + if (flags & HAS_AVX) vp9_diamond_search_sad = vp9_diamond_search_sad_avx; vp9_fdct8x8_quant = vp9_fdct8x8_quant_c; if (flags & HAS_SSE2) vp9_fdct8x8_quant = vp9_fdct8x8_quant_sse2; if (flags & HAS_SSSE3) vp9_fdct8x8_quant = vp9_fdct8x8_quant_ssse3;
diff --git a/third_party/libvpx_new/source/config/win/x64/vp9_rtcd.h b/third_party/libvpx_new/source/config/win/x64/vp9_rtcd.h index f3200861..a6fa4f67 100644 --- a/third_party/libvpx_new/source/config/win/x64/vp9_rtcd.h +++ b/third_party/libvpx_new/source/config/win/x64/vp9_rtcd.h
@@ -51,7 +51,8 @@ #define vp9_denoiser_filter vp9_denoiser_filter_sse2 int vp9_diamond_search_sad_c(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -#define vp9_diamond_search_sad vp9_diamond_search_sad_c +int vp9_diamond_search_sad_avx(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); +RTCD_EXTERN int (*vp9_diamond_search_sad)(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); void vp9_fdct8x8_quant_c(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vp9_fdct8x8_quant_sse2(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -172,6 +173,8 @@ vp9_block_error = vp9_block_error_sse2; if (flags & HAS_AVX2) vp9_block_error = vp9_block_error_avx2; + vp9_diamond_search_sad = vp9_diamond_search_sad_c; + if (flags & HAS_AVX) vp9_diamond_search_sad = vp9_diamond_search_sad_avx; vp9_fdct8x8_quant = vp9_fdct8x8_quant_sse2; if (flags & HAS_SSSE3) vp9_fdct8x8_quant = vp9_fdct8x8_quant_ssse3; vp9_full_search_sad = vp9_full_search_sad_c;
diff --git a/tools/cfi/blacklist.txt b/tools/cfi/blacklist.txt index 4fb904a..9607d08b 100644 --- a/tools/cfi/blacklist.txt +++ b/tools/cfi/blacklist.txt
@@ -23,6 +23,17 @@ # https://crbug.com/515347 type:mojo::test::* +# All types and sources from libclearkeycdm.so. +# See https://crbug.com/557969 +type:media::CdmVideoDecoder +type:media::ClearKeyCdm +type:media::FakeCdmVideoDecoder +type:media::FFmpegCdmAudioDecoder +type:media::FFmpegCdmVideoDecoder +type:media::LibvpxCdmVideoDecoder +src:*external_clear_key* +type:cdm::* + # invalid downcasts for IPC messages # https://crbug.com/520760 fun:*MessageScannerImpl*MessageScannerImpl*
diff --git a/tools/cygprofile/OWNERS b/tools/cygprofile/OWNERS new file mode 100644 index 0000000..3301555 --- /dev/null +++ b/tools/cygprofile/OWNERS
@@ -0,0 +1,2 @@ +lizeb@chromium.org +pasko@chromium.org
diff --git a/tools/gritsettings/resource_ids b/tools/gritsettings/resource_ids index a5bcffe..fe0d8bb 100644 --- a/tools/gritsettings/resource_ids +++ b/tools/gritsettings/resource_ids
@@ -39,6 +39,9 @@ "net/base/net_resources.grd": { "includes": [4000], }, + "mash/wm/resources/mash_wm_resources.grd": { + "structures": [4400], + }, "ui/resources/ui_unscaled_resources.grd": { "includes": [4500], },
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 0d99c055..9538ada 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -2911,6 +2911,11 @@ </summary> </histogram> +<histogram name="Blink.DecodedImage.Orientation" enum="DecodedImageOrientation"> + <owner>rob.buis@samsung.org</owner> + <summary>Image orientation inferred during decode.</summary> +</histogram> + <histogram name="Blink.DecodedImageType" enum="DecodedImageType"> <owner>urvang@chromium.org</owner> <summary>Image codec inferred during decode.</summary> @@ -6433,6 +6438,86 @@ </summary> </histogram> +<histogram name="DataUse.TabModel.ExpiredActiveTabEntryRemovalDuration" + units="milliseconds"> + <owner>bengr@chromium.org</owner> + <owner>rajendrant@chromium.org</owner> + <summary> + The duration from the start time of a tab entry's latest data usage tracking + session, till when the entry is expired and removed from the tab model. This + is for tab entries that are still actively tracking data usage for a + Chromium tab. + + Tab model maintains the tab entries, each pertaining to tracking sessions of + a single Chromium tab. These entries are considered expired after some + duration and can be removed from the tab model after that. The sample is + taken when an expired tab entry still tracking data usage is removed from + the tab model. + </summary> +</histogram> + +<histogram name="DataUse.TabModel.ExpiredInactiveTabEntryRemovalDuration" + units="milliseconds"> + <owner>bengr@chromium.org</owner> + <owner>rajendrant@chromium.org</owner> + <summary> + The duration from the end time of a tab entry's latest data usage tracking + session, till when the entry is expired and removed from the tab model. This + is for tab entries that are not actively tracking data usage for a Chromium + tab. + + Tab model maintains the tab entries, each pertaining to tracking sessions of + a single Chromium tab. These entries are considered expired after some + duration and can be removed from the tab model after that. The sample is + taken when an expired inactive tab entry is removed from the tab model. + </summary> +</histogram> + +<histogram name="DataUse.TabModel.OldInactiveSessionRemovalDuration" + units="milliseconds"> + <owner>bengr@chromium.org</owner> + <owner>rajendrant@chromium.org</owner> + <summary> + The duration from the end time of a data usage tracking session, till when + the tracking session is removed from the tab model. This is for old tracking + sessions that are not actively tracking data usage. + + Tab model maintains a limited number of tracking sessions per Chromium tab. + When this limit is reached oldest inactive tracking sessions are removed. + The sample is taken when an old inactive tracking session of a tab is + removed from the tab model. + </summary> +</histogram> + +<histogram name="DataUse.TabModel.TrackingSessionLifetime" units="milliseconds"> + <owner>bengr@chromium.org</owner> + <owner>rajendrant@chromium.org</owner> + <summary> + The lifetime of a data usage tracking session of a Chromium tab, maintained + by the tab model. This is the duration between the time tracking started due + to an entry event and ended with an exit event. The sample is taken when the + data usage tracking session ends. + </summary> +</histogram> + +<histogram name="DataUse.TabModel.UnexpiredTabEntryRemovalDuration" + units="milliseconds"> + <owner>bengr@chromium.org</owner> + <owner>rajendrant@chromium.org</owner> + <summary> + The duration from the end time (start time, if still active) of a tab + entry's latest data usage tracking session, till when the entry is removed + from the tab model. This is for tab entries that are not expired yet, and + removed from the tab model. + + Tab model maintains a limited number of entries, each pertaining to tracking + sessions of a single Chromium tab. When this limit is reached even after + removing expired tab entries, then oldest unexpired tab entries are removed. + The sample is taken when an unexpired tab entry is removed from the tab + model. + </summary> +</histogram> + <histogram name="DataUse.TrafficSize.System" units="bytes"> <owner>amohammadkhan@chromium.org</owner> <owner>bengr@chromium.org</owner> @@ -41183,6 +41268,11 @@ </summary> </histogram> +<histogram name="Scheduling.SwapToAckLatency" units="microseconds"> + <owner>brianderson@chromium.org</owner> + <summary>How long it takes the swap ack to return after a swap.</summary> +</histogram> + <histogram name="Sdch3.AdvertisedWithSecureScheme" enum="BooleanHttps"> <obsolete> Experiment complete, histogram gathering code removed. @@ -44162,6 +44252,13 @@ </summary> </histogram> +<histogram name="SiteIsolation.OutOfProcessIframes"> + <owner>nasko@chromium.org</owner> + <summary> + The count of all out-of-process iframes. Recorded once per UMA ping. + </summary> +</histogram> + <histogram name="SiteIsolation.XSD.DataLength" units="byte"> <owner>creis@chromium.org</owner> <summary> @@ -56919,6 +57016,18 @@ <int value="8" label="Data use tracking ended dialog opted out"/> </enum> +<enum name="DecodedImageOrientation" type="int"> + <int value="0" label="Unknown"/> + <int value="1" label="Top Left"/> + <int value="2" label="Top Right"/> + <int value="3" label="Bottom Right"/> + <int value="4" label="Bottom Left"/> + <int value="5" label="Left Top"/> + <int value="6" label="Right Top"/> + <int value="7" label="Right Bottom"/> + <int value="8" label="Left Bottom"/> +</enum> + <enum name="DecodedImageType" type="int"> <int value="0" label="kImageUnknown"/> <int value="1" label="kImageJPEG"/> @@ -77010,6 +77119,7 @@ <int value="325375649" label="chrome://settings-frame/"/> <int value="361621847" label="chrome://make-metro/"/> <int value="554090510" label="chrome://first-run/"/> + <int value="581234974" label="chrome://tcmalloc/"/> <int value="646837226" label="chrome://crashes/"/> <int value="659389881" label="chrome://gpu/"/> <int value="689991895" label="chrome://supervised-user-internals/"/> @@ -77724,6 +77834,7 @@ <affected-histogram name="Scheduling.CommitToReadyToActivateDuration"/> <affected-histogram name="Scheduling.DrawDuration"/> <affected-histogram name="Scheduling.PrepareTilesDuration"/> + <affected-histogram name="Scheduling.SwapToAckLatency"/> </histogram_suffixes> <histogram_suffixes name="CompositorTimingHistoryProcess2" separator="."
diff --git a/tools/valgrind/gtest_exclude/net_unittests.gtest-drmemory_win32.txt b/tools/valgrind/gtest_exclude/net_unittests.gtest-drmemory_win32.txt index 45604dc..33b9bf348 100644 --- a/tools/valgrind/gtest_exclude/net_unittests.gtest-drmemory_win32.txt +++ b/tools/valgrind/gtest_exclude/net_unittests.gtest-drmemory_win32.txt
@@ -27,3 +27,6 @@ # http://crbug.com/504198 DiskCacheEntryTest.ExternalAsyncIONoBuffer + +# http://crbug.com/557993 +ProxyResolverV8TracingWrapperTest.Terminate
diff --git a/ui/android/DEPS b/ui/android/DEPS index 4e52590..f661715d 100644 --- a/ui/android/DEPS +++ b/ui/android/DEPS
@@ -1,5 +1,6 @@ include_rules = [ "+cc/layers/layer.h", + "+cc/layers/layer_settings.h", "+cc/layers/ui_resource_layer.h", "+cc/output/copy_output_request.h", "+cc/resources/scoped_ui_resource.h", @@ -8,7 +9,6 @@ "+cc/test/fake_layer_tree_host_client.h", "+cc/test/test_task_graph_runner.h", "+cc/trees/layer_tree_host.h", - "+cc/trees/layer_tree_settings.h", "+jni", "+skia/ext", "+third_party/skia",
diff --git a/ui/android/window_android_compositor.cc b/ui/android/window_android_compositor.cc index fd8b766..3fb53ea 100644 --- a/ui/android/window_android_compositor.cc +++ b/ui/android/window_android_compositor.cc
@@ -5,7 +5,7 @@ #include "ui/android/window_android_compositor.h" #include "base/lazy_instance.h" -#include "cc/trees/layer_tree_settings.h" +#include "cc/layers/layer_settings.h" namespace ui {
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn index 2350505..61caad5 100644 --- a/ui/base/BUILD.gn +++ b/ui/base/BUILD.gn
@@ -202,6 +202,8 @@ "touch/touch_device.h", "touch/touch_editing_controller.cc", "touch/touch_editing_controller.h", + "touch/touch_enabled.cc", + "touch/touch_enabled.h", "ui_base_export.h", "ui_base_exports.cc", "ui_base_paths.cc", @@ -735,8 +737,8 @@ if (build_ime) { sources += [ "ime/candidate_window_unittest.cc", - "ime/composition_text_unittest.cc", "ime/chromeos/character_composer_unittest.cc", + "ime/composition_text_unittest.cc", "ime/input_method_base_unittest.cc", "ime/input_method_chromeos_unittest.cc", "ime/remote_input_method_win_unittest.cc",
diff --git a/ui/base/touch/touch_enabled.cc b/ui/base/touch/touch_enabled.cc new file mode 100644 index 0000000..492588a --- /dev/null +++ b/ui/base/touch/touch_enabled.cc
@@ -0,0 +1,51 @@ +// Copyright 2015 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/base/touch/touch_enabled.h" + +#include "base/command_line.h" +#include "base/logging.h" +#include "ui/base/touch/touch_device.h" +#include "ui/base/ui_base_switches.h" +#include "ui/events/base_event_utils.h" +#include "ui/events/event_switches.h" + +namespace ui { + +namespace { + +bool ComputeTouchStatus() { + auto* command_line = base::CommandLine::ForCurrentProcess(); + const std::string touch_enabled_switch = + command_line->HasSwitch(switches::kTouchEvents) ? + command_line->GetSwitchValueASCII(switches::kTouchEvents) : + switches::kTouchEventsAuto; + + if (touch_enabled_switch.empty() || + touch_enabled_switch == switches::kTouchEventsEnabled) { + return true; + } + + if (touch_enabled_switch == switches::kTouchEventsAuto) + return IsTouchDevicePresent(); + + DLOG_IF(ERROR, touch_enabled_switch != switches::kTouchEventsDisabled) << + "Invalid --touch-events option: " << touch_enabled_switch; + return false; +} + +} // namespace + +bool AreTouchEventsEnabled() { + static bool touch_status = ComputeTouchStatus(); + +#if defined(OS_CHROMEOS) + return touch_status && GetTouchEventsCrOsMasterSwitch(); +#else + return touch_status; +#endif // !defined(OS_CHROMEOS) +} + +} // namespace ui +
diff --git a/ui/base/touch/touch_enabled.h b/ui/base/touch/touch_enabled.h new file mode 100644 index 0000000..3d91c3a --- /dev/null +++ b/ui/base/touch/touch_enabled.h
@@ -0,0 +1,18 @@ +// Copyright 2015 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. + +#ifndef UI_BASE_TOUCH_TOUCH_ENABLED_H_ +#define UI_BASE_TOUCH_TOUCH_ENABLED_H_ + +#include "ui/base/ui_base_export.h" + +namespace ui { + +// Returns true if the touch-enabled flag is enabled, or if it is set to auto +// and a touch device is present. +UI_BASE_EXPORT bool AreTouchEventsEnabled(); + +} // namespace ui + +#endif // UI_BASE_TOUCH_TOUCH_ENABLED_H_
diff --git a/ui/base/ui_base.gyp b/ui/base/ui_base.gyp index d18c1f1e..565faed3 100644 --- a/ui/base/ui_base.gyp +++ b/ui/base/ui_base.gyp
@@ -291,6 +291,8 @@ 'touch/touch_device_win.cc', 'touch/touch_editing_controller.cc', 'touch/touch_editing_controller.h', + 'touch/touch_enabled.cc', + 'touch/touch_enabled.h', 'ui_base_export.h', 'ui_base_exports.cc', 'ui_base_paths.cc',
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc index 5242838..5144ec9 100644 --- a/ui/compositor/layer.cc +++ b/ui/compositor/layer.cc
@@ -14,6 +14,7 @@ #include "base/memory/scoped_ptr.h" #include "base/trace_event/trace_event.h" #include "cc/layers/delegated_renderer_layer.h" +#include "cc/layers/layer_settings.h" #include "cc/layers/nine_patch_layer.h" #include "cc/layers/picture_layer.h" #include "cc/layers/solid_color_layer.h"
diff --git a/ui/events/base_event_utils.cc b/ui/events/base_event_utils.cc index 622d2f2..846b6df 100644 --- a/ui/events/base_event_utils.cc +++ b/ui/events/base_event_utils.cc
@@ -21,30 +21,6 @@ const int kSystemKeyModifierMask = EF_ALT_DOWN | EF_COMMAND_DOWN; #else const int kSystemKeyModifierMask = EF_ALT_DOWN; - -// Retrieves the status of the touch screen events from the command line on Non- -// ChromeOS platforms. -bool ComputeTouchStatus() { - const base::CommandLine& command_line = - *base::CommandLine::ForCurrentProcess(); - const std::string touch_enabled_switch = - command_line.HasSwitch(switches::kTouchEvents) ? - command_line.GetSwitchValueASCII(switches::kTouchEvents) : - switches::kTouchEventsAuto; - - if (touch_enabled_switch.empty() || - touch_enabled_switch == switches::kTouchEventsEnabled || - touch_enabled_switch == switches::kTouchEventsAuto) { - return true; - } - - if (touch_enabled_switch == switches::kTouchEventsDisabled) - return false; - - LOG(ERROR) << "Invalid --touch-events option: " << touch_enabled_switch; - return false; -} - #endif // defined(OS_CHROMEOS) } // namespace @@ -70,20 +46,15 @@ #if defined(OS_CHROMEOS) -void SetTouchEventsEnabled(bool enabled) { +void SetTouchEventsCrOsMasterSwitch(bool enabled) { touch_events_enabled = enabled; } -#endif // defined(OS_CHROMEOS) - -bool AreTouchEventsEnabled() { -#if defined(OS_CHROMEOS) +bool GetTouchEventsCrOsMasterSwitch() { return touch_events_enabled; -#else - static bool touch_events_enabled = ComputeTouchStatus(); - return touch_events_enabled; -#endif // !defined(OS_CHROMEOS) } +#endif // defined(OS_CHROMEOS) + } // namespace ui
diff --git a/ui/events/base_event_utils.h b/ui/events/base_event_utils.h index f659580..ef02739e 100644 --- a/ui/events/base_event_utils.h +++ b/ui/events/base_event_utils.h
@@ -18,15 +18,12 @@ EVENTS_BASE_EXPORT bool IsSystemKeyModifier(int flags); #if defined(OS_CHROMEOS) -// Sets the status of touch events to |enabled| on ChromeOS only. Non-ChromeOS -// platforms depend on the state of the |kTouchEvents| flags. -EVENTS_BASE_EXPORT void SetTouchEventsEnabled(bool enabled); +// On ChromeOS, touch events can be turned off completely using a debug +// accelerator using the following functions. +EVENTS_BASE_EXPORT void SetTouchEventsCrOsMasterSwitch(bool enabled); +EVENTS_BASE_EXPORT bool GetTouchEventsCrOsMasterSwitch(); #endif // defined(OS_CHROMEOS) -// Returns true if the touch events are enabled. On non-ChromeOS platforms, this -// depends on the state of the |kTouchEvents| flags. -EVENTS_BASE_EXPORT bool AreTouchEventsEnabled(); - } // namespace ui #endif // UI_EVENTS_BASE_EVENT_UTILS_H_
diff --git a/ui/events/devices/x11/touch_factory_x11.cc b/ui/events/devices/x11/touch_factory_x11.cc index d0cc9916..6718550 100644 --- a/ui/events/devices/x11/touch_factory_x11.cc +++ b/ui/events/devices/x11/touch_factory_x11.cc
@@ -27,11 +27,25 @@ namespace ui { +namespace { + +bool IsTouchEventsFlagDisabled() { + auto* command_line = base::CommandLine::ForCurrentProcess(); + bool touch_flag_status = command_line->HasSwitch(switches::kTouchEvents) && + command_line->GetSwitchValueASCII(switches::kTouchEvents) == + switches::kTouchEventsDisabled; + return touch_flag_status; +} + +} // namespace + + TouchFactory::TouchFactory() : pointer_device_lookup_(), touch_device_list_(), virtual_core_keyboard_device_(-1), - id_generator_(0) { + id_generator_(0), + touch_events_disabled_(IsTouchEventsFlagDisabled()) { if (!DeviceDataManagerX11::GetInstance()->IsXInput2Available()) return; @@ -143,6 +157,13 @@ XIEvent* event = static_cast<XIEvent*>(xev->xcookie.data); XIDeviceEvent* xiev = reinterpret_cast<XIDeviceEvent*>(event); +#if defined(OS_CHROMEOS) + const bool is_touch_disabled = touch_events_disabled_ && + !GetTouchEventsCrOsMasterSwitch(); +#else + const bool is_touch_disabled = touch_events_disabled_; +#endif // defined(OS_CHROMEOS) + if (event->evtype == XI_TouchBegin || event->evtype == XI_TouchUpdate || event->evtype == XI_TouchEnd) { @@ -159,7 +180,7 @@ bool is_from_master_or_float = touch_device_list_[xiev->deviceid]; bool is_from_slave_device = !is_from_master_or_float && xiev->sourceid == xiev->deviceid; - return ui::AreTouchEventsEnabled() && + return !is_touch_disabled && IsTouchDevice(xiev->deviceid) && !is_from_slave_device; } @@ -179,7 +200,7 @@ if (!pointer_device_lookup_[xiev->deviceid]) return false; - return IsTouchDevice(xiev->deviceid) ? ui::AreTouchEventsEnabled() : true; + return IsTouchDevice(xiev->deviceid) ? !is_touch_disabled : true; } void TouchFactory::SetupXI2ForXWindow(Window window) { @@ -266,7 +287,14 @@ } bool TouchFactory::IsTouchDevicePresent() { - return ui::AreTouchEventsEnabled() && touch_device_lookup_.any(); +#if defined(OS_CHROMEOS) + const bool is_touch_disabled = touch_events_disabled_ && + !GetTouchEventsCrOsMasterSwitch(); +#else + const bool is_touch_disabled = touch_events_disabled_; +#endif // defined(OS_CHROMEOS) + + return !is_touch_disabled && touch_device_lookup_.any(); } void TouchFactory::ResetForTest() { @@ -275,6 +303,11 @@ touch_device_list_.clear(); touchscreen_ids_.clear(); id_generator_.ResetForTest(); + touch_events_disabled_ = false; + +#if defined(OS_CHROMEOS) + SetTouchEventsCrOsMasterSwitch(true); +#endif // defined(OS_CHROMEOS) } void TouchFactory::SetTouchDeviceForTest( @@ -287,6 +320,11 @@ touch_device_lookup_[*iter] = true; touch_device_list_[*iter] = true; } + touch_events_disabled_ = false; + +#if defined(OS_CHROMEOS) + SetTouchEventsCrOsMasterSwitch(true); +#endif // defined(OS_CHROMEOS) } void TouchFactory::SetPointerDeviceForTest(
diff --git a/ui/events/devices/x11/touch_factory_x11.h b/ui/events/devices/x11/touch_factory_x11.h index eb2620b..1f113ea 100644 --- a/ui/events/devices/x11/touch_factory_x11.h +++ b/ui/events/devices/x11/touch_factory_x11.h
@@ -137,6 +137,9 @@ // Associate each device ID with its master device ID. std::map<int, int> device_master_id_list_; + // Indicates whether touch events are explicitly disabled. + bool touch_events_disabled_; + DISALLOW_COPY_AND_ASSIGN(TouchFactory); };
diff --git a/ui/events/event.cc b/ui/events/event.cc index 0e7d0f19..cb771b7e 100644 --- a/ui/events/event.cc +++ b/ui/events/event.cc
@@ -918,7 +918,12 @@ // ScrollEvent ScrollEvent::ScrollEvent(const base::NativeEvent& native_event) - : MouseEvent(native_event) { + : MouseEvent(native_event), + x_offset_(0.0f), + y_offset_(0.0f), + x_offset_ordinal_(0.0f), + y_offset_ordinal_(0.0f), + finger_count_(0) { if (type() == ET_SCROLL) { GetScrollOffsets(native_event, &x_offset_, &y_offset_,
diff --git a/ui/file_manager/audio_player/assets/100/player_button_next.png b/ui/file_manager/audio_player/assets/100/player_button_next.png index f717fe8..ed4d407e 100644 --- a/ui/file_manager/audio_player/assets/100/player_button_next.png +++ b/ui/file_manager/audio_player/assets/100/player_button_next.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_button_pause.png b/ui/file_manager/audio_player/assets/100/player_button_pause.png index 709c215..5225482 100644 --- a/ui/file_manager/audio_player/assets/100/player_button_pause.png +++ b/ui/file_manager/audio_player/assets/100/player_button_pause.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_button_play.png b/ui/file_manager/audio_player/assets/100/player_button_play.png index 298eadc..1174fd6 100644 --- a/ui/file_manager/audio_player/assets/100/player_button_play.png +++ b/ui/file_manager/audio_player/assets/100/player_button_play.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_button_playlist.png b/ui/file_manager/audio_player/assets/100/player_button_playlist.png index 335703bd..9be8e7bf 100644 --- a/ui/file_manager/audio_player/assets/100/player_button_playlist.png +++ b/ui/file_manager/audio_player/assets/100/player_button_playlist.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_button_playlist_active.png b/ui/file_manager/audio_player/assets/100/player_button_playlist_active.png deleted file mode 100644 index 39de0b2c..0000000 --- a/ui/file_manager/audio_player/assets/100/player_button_playlist_active.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_button_pressed.png b/ui/file_manager/audio_player/assets/100/player_button_pressed.png deleted file mode 100644 index 162bec4..0000000 --- a/ui/file_manager/audio_player/assets/100/player_button_pressed.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_button_previous.png b/ui/file_manager/audio_player/assets/100/player_button_previous.png index 373afd5..c562d5c 100644 --- a/ui/file_manager/audio_player/assets/100/player_button_previous.png +++ b/ui/file_manager/audio_player/assets/100/player_button_previous.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_button_repeat.png b/ui/file_manager/audio_player/assets/100/player_button_repeat.png index 86b51ca..d3b87379 100644 --- a/ui/file_manager/audio_player/assets/100/player_button_repeat.png +++ b/ui/file_manager/audio_player/assets/100/player_button_repeat.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_button_repeat_active.png b/ui/file_manager/audio_player/assets/100/player_button_repeat_active.png deleted file mode 100644 index bd1dd46b..0000000 --- a/ui/file_manager/audio_player/assets/100/player_button_repeat_active.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_button_shuffle.png b/ui/file_manager/audio_player/assets/100/player_button_shuffle.png index 0e13f1f..862f66a 100644 --- a/ui/file_manager/audio_player/assets/100/player_button_shuffle.png +++ b/ui/file_manager/audio_player/assets/100/player_button_shuffle.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_button_shuffle_active.png b/ui/file_manager/audio_player/assets/100/player_button_shuffle_active.png deleted file mode 100644 index f533c53..0000000 --- a/ui/file_manager/audio_player/assets/100/player_button_shuffle_active.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_button_volume.png b/ui/file_manager/audio_player/assets/100/player_button_volume.png index 175ee6d..aa716ff 100644 --- a/ui/file_manager/audio_player/assets/100/player_button_volume.png +++ b/ui/file_manager/audio_player/assets/100/player_button_volume.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_button_volume_active.png b/ui/file_manager/audio_player/assets/100/player_button_volume_active.png deleted file mode 100644 index d958503..0000000 --- a/ui/file_manager/audio_player/assets/100/player_button_volume_active.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_timeline_base_center.png b/ui/file_manager/audio_player/assets/100/player_timeline_base_center.png deleted file mode 100644 index f5dd2ac..0000000 --- a/ui/file_manager/audio_player/assets/100/player_timeline_base_center.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_timeline_base_left.png b/ui/file_manager/audio_player/assets/100/player_timeline_base_left.png deleted file mode 100644 index 35ab5a4c..0000000 --- a/ui/file_manager/audio_player/assets/100/player_timeline_base_left.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_timeline_base_right.png b/ui/file_manager/audio_player/assets/100/player_timeline_base_right.png deleted file mode 100644 index 35ab5a4c..0000000 --- a/ui/file_manager/audio_player/assets/100/player_timeline_base_right.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_timeline_handler_pressed.png b/ui/file_manager/audio_player/assets/100/player_timeline_handler_pressed.png deleted file mode 100644 index fa8526a0..0000000 --- a/ui/file_manager/audio_player/assets/100/player_timeline_handler_pressed.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_timeline_played_center.png b/ui/file_manager/audio_player/assets/100/player_timeline_played_center.png deleted file mode 100644 index b7ab78c5..0000000 --- a/ui/file_manager/audio_player/assets/100/player_timeline_played_center.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_timeline_played_left.png b/ui/file_manager/audio_player/assets/100/player_timeline_played_left.png deleted file mode 100644 index 9116014a..0000000 --- a/ui/file_manager/audio_player/assets/100/player_timeline_played_left.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/player_timeline_played_right.png b/ui/file_manager/audio_player/assets/100/player_timeline_played_right.png deleted file mode 100644 index 9116014a..0000000 --- a/ui/file_manager/audio_player/assets/100/player_timeline_played_right.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/playlist_now_playing.png b/ui/file_manager/audio_player/assets/100/playlist_now_playing.png new file mode 100644 index 0000000..a4588679 --- /dev/null +++ b/ui/file_manager/audio_player/assets/100/playlist_now_playing.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/100/playlist_play.png b/ui/file_manager/audio_player/assets/100/playlist_play.png new file mode 100644 index 0000000..416c85a --- /dev/null +++ b/ui/file_manager/audio_player/assets/100/playlist_play.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_next.png b/ui/file_manager/audio_player/assets/200/player_button_next.png index 53a9252..c65f059 100644 --- a/ui/file_manager/audio_player/assets/200/player_button_next.png +++ b/ui/file_manager/audio_player/assets/200/player_button_next.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_pause.png b/ui/file_manager/audio_player/assets/200/player_button_pause.png index 2fc73a40..883ca6e 100644 --- a/ui/file_manager/audio_player/assets/200/player_button_pause.png +++ b/ui/file_manager/audio_player/assets/200/player_button_pause.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_play.png b/ui/file_manager/audio_player/assets/200/player_button_play.png index dd9d393..d2413af 100644 --- a/ui/file_manager/audio_player/assets/200/player_button_play.png +++ b/ui/file_manager/audio_player/assets/200/player_button_play.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_playlist.png b/ui/file_manager/audio_player/assets/200/player_button_playlist.png index 5740a256..bc5576b2 100644 --- a/ui/file_manager/audio_player/assets/200/player_button_playlist.png +++ b/ui/file_manager/audio_player/assets/200/player_button_playlist.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_playlist_active.png b/ui/file_manager/audio_player/assets/200/player_button_playlist_active.png deleted file mode 100644 index fc9714d..0000000 --- a/ui/file_manager/audio_player/assets/200/player_button_playlist_active.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_pressed.png b/ui/file_manager/audio_player/assets/200/player_button_pressed.png deleted file mode 100644 index c21edae..0000000 --- a/ui/file_manager/audio_player/assets/200/player_button_pressed.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_previous.png b/ui/file_manager/audio_player/assets/200/player_button_previous.png index d09ec3b..001c1f7 100644 --- a/ui/file_manager/audio_player/assets/200/player_button_previous.png +++ b/ui/file_manager/audio_player/assets/200/player_button_previous.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_repeat.png b/ui/file_manager/audio_player/assets/200/player_button_repeat.png index 0f0679f6..c448f2b2 100644 --- a/ui/file_manager/audio_player/assets/200/player_button_repeat.png +++ b/ui/file_manager/audio_player/assets/200/player_button_repeat.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_repeat_active.png b/ui/file_manager/audio_player/assets/200/player_button_repeat_active.png deleted file mode 100644 index e73a8e9..0000000 --- a/ui/file_manager/audio_player/assets/200/player_button_repeat_active.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_shuffle.png b/ui/file_manager/audio_player/assets/200/player_button_shuffle.png index cee76639..61958e78 100644 --- a/ui/file_manager/audio_player/assets/200/player_button_shuffle.png +++ b/ui/file_manager/audio_player/assets/200/player_button_shuffle.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_shuffle_active.png b/ui/file_manager/audio_player/assets/200/player_button_shuffle_active.png deleted file mode 100644 index 9dbf309..0000000 --- a/ui/file_manager/audio_player/assets/200/player_button_shuffle_active.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_volume.png b/ui/file_manager/audio_player/assets/200/player_button_volume.png index b08c9e5..27edb81 100644 --- a/ui/file_manager/audio_player/assets/200/player_button_volume.png +++ b/ui/file_manager/audio_player/assets/200/player_button_volume.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_button_volume_active.png b/ui/file_manager/audio_player/assets/200/player_button_volume_active.png deleted file mode 100644 index ece8ce98..0000000 --- a/ui/file_manager/audio_player/assets/200/player_button_volume_active.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_timeline_base_center.png b/ui/file_manager/audio_player/assets/200/player_timeline_base_center.png deleted file mode 100644 index 2154855f..0000000 --- a/ui/file_manager/audio_player/assets/200/player_timeline_base_center.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_timeline_base_left.png b/ui/file_manager/audio_player/assets/200/player_timeline_base_left.png deleted file mode 100644 index 4a11dd2..0000000 --- a/ui/file_manager/audio_player/assets/200/player_timeline_base_left.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_timeline_base_right.png b/ui/file_manager/audio_player/assets/200/player_timeline_base_right.png deleted file mode 100644 index 76279c4..0000000 --- a/ui/file_manager/audio_player/assets/200/player_timeline_base_right.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_timeline_handler_pressed.png b/ui/file_manager/audio_player/assets/200/player_timeline_handler_pressed.png deleted file mode 100644 index c27d9481..0000000 --- a/ui/file_manager/audio_player/assets/200/player_timeline_handler_pressed.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_timeline_played_center.png b/ui/file_manager/audio_player/assets/200/player_timeline_played_center.png deleted file mode 100644 index f113bbd..0000000 --- a/ui/file_manager/audio_player/assets/200/player_timeline_played_center.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_timeline_played_left.png b/ui/file_manager/audio_player/assets/200/player_timeline_played_left.png deleted file mode 100644 index 9c63b735..0000000 --- a/ui/file_manager/audio_player/assets/200/player_timeline_played_left.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/player_timeline_played_right.png b/ui/file_manager/audio_player/assets/200/player_timeline_played_right.png deleted file mode 100644 index abcc959..0000000 --- a/ui/file_manager/audio_player/assets/200/player_timeline_played_right.png +++ /dev/null Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/playlist_now_playing.png b/ui/file_manager/audio_player/assets/200/playlist_now_playing.png new file mode 100644 index 0000000..72e87bf --- /dev/null +++ b/ui/file_manager/audio_player/assets/200/playlist_now_playing.png Binary files differ
diff --git a/ui/file_manager/audio_player/assets/200/playlist_play.png b/ui/file_manager/audio_player/assets/200/playlist_play.png new file mode 100644 index 0000000..1ae3fb51 --- /dev/null +++ b/ui/file_manager/audio_player/assets/200/playlist_play.png Binary files differ
diff --git a/ui/file_manager/audio_player/css/audio_player.css b/ui/file_manager/audio_player/css/audio_player.css index 56accad..06c01630 100644 --- a/ui/file_manager/audio_player/css/audio_player.css +++ b/ui/file_manager/audio_player/css/audio_player.css
@@ -23,6 +23,7 @@ } div.audio-player { + border-top: 4px solid white; color: #3d3d3d; cursor: default; flex: 1 1 auto;
diff --git a/ui/file_manager/audio_player/elements/audio_player.css b/ui/file_manager/audio_player/elements/audio_player.css index 4f614f2..bc6d7aa 100644 --- a/ui/file_manager/audio_player/elements/audio_player.css +++ b/ui/file_manager/audio_player/elements/audio_player.css
@@ -3,10 +3,8 @@ * found in the LICENSE file. */ control-panel { - border-top: 1px solid rgba(0, 0, 0, 0.1); bottom: 0; left: 0; - margin-bottom: 8px; position: fixed; right: 0; }
diff --git a/ui/file_manager/audio_player/elements/audio_player.html b/ui/file_manager/audio_player/elements/audio_player.html index 133b260..60598da 100644 --- a/ui/file_manager/audio_player/elements/audio_player.html +++ b/ui/file_manager/audio_player/elements/audio_player.html
@@ -15,7 +15,8 @@ expanded$="[[expanded]]" shuffle="[[shuffle]]" current-track-index="{{currentTrackIndex}}" - on-replay="onReplayCurrentTrack"></track-list> + on-replay="onReplayCurrentTrack" + on-play="onPlayCurrentTrack"></track-list> <control-panel id="audioController" playing="{{playing}}" time="{{time}}" @@ -24,6 +25,7 @@ repeat="{{repeat}}" volume="{{volume}}" expanded="{{expanded}}" + aria-labels="[[ariaLabels]]" on-next-clicked="onControllerNextClicked" on-previous-clicked="onControllerPreviousClicked"></control-panel> <audio id="audio"
diff --git a/ui/file_manager/audio_player/elements/audio_player.js b/ui/file_manager/audio_player/elements/audio_player.js index 3d5fc01..6c1820f 100644 --- a/ui/file_manager/audio_player/elements/audio_player.js +++ b/ui/file_manager/audio_player/elements/audio_player.js
@@ -90,10 +90,20 @@ type: Number, value: 0, reflectToAttribute: true + }, + + ariaLabels: { + type: Object } }, /** + * The last playing state when user starts dragging the seek bar. + * @private {boolean} + */ + wasPlayingOnDragStart_: false, + + /** * Handles change event for shuffle mode. * @param {boolean} shuffle */ @@ -135,6 +145,9 @@ ready: function() { this.addEventListener('keydown', this.onKeyDown_.bind(this)); + this.$.audioController.addEventListener('dragging-changed', + this.onDraggingChanged_.bind(this)); + this.$.audio.volume = 0; // Temporary initial volume. this.$.audio.addEventListener('ended', this.onAudioEnded.bind(this)); this.$.audio.addEventListener('error', this.onAudioError.bind(this)); @@ -275,6 +288,13 @@ }, /** + * Invoked when receivig a request to start playing the current music. + */ + onPlayCurrentTrack: function() { + this.$.audio.play(); + }, + + /** * Invoked when receiving a request to replay the current music from the track * list element. */ @@ -396,6 +416,24 @@ }, /** + * Invoked when dragging state of seek bar on control panel is changed. + * During the user is dragging it, audio playback is paused temporalily. + */ + onDraggingChanged_: function() { + if (this.$.audioController.dragging) { + if (this.playing) { + this.wasPlayingOnDragStart_ = true; + this.$.audio.pause(); + } + } else { + if (this.wasPlayingOnDragStart_) { + this.$.audio.play(); + this.wasPlayingOnDragStart_ = false; + } + } + }, + + /** * Invoked when the 'keydown' event is fired. * @param {Event} event The event object. */
diff --git a/ui/file_manager/audio_player/elements/compiled_resources.gyp b/ui/file_manager/audio_player/elements/compiled_resources.gyp deleted file mode 100644 index 7e420190..0000000 --- a/ui/file_manager/audio_player/elements/compiled_resources.gyp +++ /dev/null
@@ -1,55 +0,0 @@ -# Copyright 2015 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. -{ - 'targets': [ - { - 'target_name': 'volume_controller', - 'variables': { - 'depends': [], - 'externs': [] - }, - 'includes': [ - '../../compile_js.gypi' - ] - }, - { - 'target_name': 'track_list', - 'variables': { - 'depends': [], - 'externs': [ - '../../externs/es7_workaround.js' - ] - }, - 'includes': [ - '../../compile_js.gypi' - ] - }, - { - 'target_name': 'control_panel', - 'variables': { - 'depends': [], - 'externs': [] - }, - 'includes': [ - '../../compile_js.gypi' - ] - }, - { - 'target_name': 'audio_player', - 'variables': { - 'depends': [ - '../js/audio_player_model.js', - 'track_list.js', - ], - 'externs': [ - '<(EXTERNS_DIR)/chrome_extensions.js', - '../../externs/es7_workaround.js', - ] - }, - 'includes': [ - '../../compile_js.gypi' - ] - } - ], -}
diff --git a/ui/file_manager/audio_player/elements/control_panel.css b/ui/file_manager/audio_player/elements/control_panel.css index 3dbc878d..fd9a4a43 100644 --- a/ui/file_manager/audio_player/elements/control_panel.css +++ b/ui/file_manager/audio_player/elements/control_panel.css
@@ -5,22 +5,20 @@ /* Controls bar. */ .controls { align-items: center; - background-color: #fff; + background-color: white; display: flex; flex-direction: column; - height: 64px; + height: 96px; justify-content: center; padding: 0; } -.controls .upper-controls { - height: 32px; - width: 100% -} - +.controls .upper-controls, .controls .lower-controls { - height: 32px; - width: 100% + box-sizing: border-box; + height: 48px; + padding: 8px; + width: 100%; } .audio-controls { @@ -34,7 +32,7 @@ /* Customized scrollbar for the playlist. */ .media-button { - background-color: #fff; + background-color: transparent; border: 0; height: 32px; outline: none; /* TODO(yoshiki): Show outline only on keyboard focus. */ @@ -43,14 +41,10 @@ width: 32px; } -.media-button:active { - background-image: -webkit-image-set( - url(../assets/100/player_button_pressed.png) 1x, - url(../assets/200/player_button_pressed.png) 2x); -} - .media-button > div, .media-button.toggle > label > span { + background-position: center; + background-repeat: no-repeat; display: inline-block; height: 100%; pointer-events: none; @@ -65,13 +59,6 @@ top: 0; } -.media-button[state='default']:not(.disabled) > .default, -.media-button[state='ended']:not(.disabled) > .ended, -.media-button[state='playing']:not(.disabled) > .playing, -.media-button.disabled > .disabled { - opacity: 1; -} - /* Custom sliders for progress and volume. */ /* Customize the standard input[type='range']. */ @@ -86,173 +73,40 @@ justify-content: center; } -.custom-slider.progress { - display: flex; - flex: 1 1 auto; - height: 100%; - position: relative; - z-index: 0; /* Make a layer which includes the thumb on slider. */ -} - -.custom-slider.progress > input[type='range']::-webkit-slider-thumb { - background-image: -webkit-image-set( - url(../assets/100/player_timeline_handler.png) 1x, - url(../assets/200/player_timeline_handler.png) 2x); - width: 28px; -} - -.custom-slider.progress > input[type='range']::-webkit-slider-thumb:hover { - background-image: -webkit-image-set( - url(../assets/100/player_timeline_handler.png) 1x, - url(../assets/200/player_timeline_handler.png) 2x); -} - -.custom-slider.progress > input[type='range']::-webkit-slider-thumb:active { - background-image: -webkit-image-set( - url(../assets/100/player_timeline_handler_pressed.png) 1x, - url(../assets/200/player_timeline_handler_pressed.png) 2x); -} - -.custom-slider.progress.disabled > input[type='range']::-webkit-slider-thumb { - background-image: none; -} - -.time-controls > .time { +.time-controls > .time-container { + color: rgb(51, 51, 51); cursor: default; - height: 100%; + flex: none; + font-size: 12px; + padding: 8px; position: relative; - width: 53px; } -.time-controls > .time.disabled { +.time-container > .time { + position: absolute; + right: 8px; /* Should be same as time-container's right padding. */ + top: 8px; /* Should be same as time-container's top padding. */ +} + +.time-container > .time.disabled { opacity: 0; } -.custom-slider > input[type='range'] { - -webkit-appearance: none !important; /* Hide the default thumb icon. */ - background: transparent; /* Hide the standard slider bar */ - height: 100%; - left: -2px; /* Required to align the input element with the parent. */ - outline: none; - position: absolute; - top: -2px; - width: 100%; +.time-container > .time-spacer { + opacity: 0; /* This class is intended to be used as invisible spacer. */ } -/* Custom thumb icon. */ -.custom-slider > input[type='range']::-webkit-slider-thumb { - -webkit-appearance: none; - background-position: center center; - background-repeat: no-repeat; - height: 24px; - position: relative; - z-index: 2; -} - -/* Custom slider bar (we hide the standard one). */ -.custom-slider > .bar { - background-image: -webkit-image-set( - url(../assets/100/player_timeline_base_center.png) 1x, - url(../assets/200/player_timeline_base_center.png) 2x); - /* In order to match the horizontal position of the standard slider bar - left and right must be equal to 1/2 of the thumb icon width. */ - bottom: 15px; - left: 14px; /* Exactly 1/2 of the thumb width */ - pointer-events: none; /* Mouse events pass through to the standard input. */ - position: absolute; - right: 14px; - top: 15px; -} - -.custom-slider > .bar > .filled, -.custom-slider > .bar > .cap { - bottom: 0; - position: absolute; - top: 0; -} - -/* The filled portion of the slider bar to the left of the thumb. */ -.custom-slider > .bar > .filled { - background-image: -webkit-image-set( - url(../assets/100/player_timeline_played_center.png) 1x, - url(../assets/200/player_timeline_played_center.png) 2x); - border-left-style: none; - border-right-style: none; - left: 0; - width: 0; /* The element style.width is manipulated from the code. */ -} - -/* Rounded caps to the left and right of the slider bar. */ -.custom-slider > .bar > .cap { - width: 1px; -} - -/* Left cap is always filled, should be the same color as .filled. */ -.custom-slider > .bar > .cap.left { - background-image: -webkit-image-set( - url(../assets/100/player_timeline_played_left.png) 1x, - url(../assets/200/player_timeline_played_left.png) 2x); - right: 100%; -} - -/* Right cap is always not filled. */ -.custom-slider > .bar > .cap.right { - background-image: -webkit-image-set( - url(../assets/100/player_timeline_base_right.png) 1x, - url(../assets/200/player_timeline_base_right.png) 2x); - left: 100%; +.time-controls > paper-slider { + --paper-slider-active-color: rgb(66, 133, 244); + --paper-slider-knob-color: rgb(64, 138, 241); + flex: auto; } .media-button.disabled, -.custom-slider.disabled, -.custom-slider.readonly { +paper-slider.disabled { pointer-events: none; } -/* Progress seek marker (precise time shown on mouse hover. */ - -/* Thin vertical line across the slider bar */ -.custom-slider > .bar > .seek-mark { - background-color: #202020; - bottom: -1px; - left: 0; - position: absolute; - top: -1px; - width: 0; -} - -.custom-slider > .bar > .seek-mark.visible { - width: 1px; -} - -.custom-slider > .bar > .seek-mark.inverted { - background-color: #808080; -} - -/* Text label giving the precise time corresponding to the hover position. */ -.custom-slider > .bar > .seek-mark > .seek-label { - align-items: center; - background: #202020; - border-top-left-radius: 2px; - border-top-right-radius: 2px; - bottom: 19px; - color: white; - display: flex; - flex-direction: row; - font-size: 12px; - height: 15px; - justify-content: center; - left: 0; - opacity: 0; - overflow: hidden; - position: absolute; - transition: opacity 150ms ease; -} - -.custom-slider > .bar > .seek-mark.visible > .seek-label { - opacity: 1; -} - /* Media controls in order of appearance. */ .audio-controls { @@ -271,145 +125,84 @@ } .media-button.shuffle-mode { - margin-left: 5px; - margin-right: 5px; -} - -.media-button.shuffle-mode > label > .icon { background-image: -webkit-image-set( url(../assets/100/player_button_shuffle.png) 1x, url(../assets/200/player_button_shuffle.png) 2x); pointer-events: auto; } -.media-button.shuffle-mode > label > input:checked + .icon { - background-image: -webkit-image-set( - url(../assets/100/player_button_shuffle_active.png) 1x, - url(../assets/200/player_button_shuffle_active.png) 2x); -} - .media-button.repeat { - margin-left: 5px; + margin-left: 8px; margin-right: 0; } -.media-button.repeat > label > .icon { +.media-button.repeat { background-image: -webkit-image-set( url(../assets/100/player_button_repeat.png) 1x, url(../assets/200/player_button_repeat.png) 2x); pointer-events: auto; } -.media-button.repeat > label > input:checked + .icon { - background-image: -webkit-image-set( - url(../assets/100/player_button_repeat_active.png) 1x, - url(../assets/200/player_button_repeat_active.png) 2x); +.media-button.play { + margin-left: 4px; + margin-right: 4px; } .media-button.play { - margin-left: 0; - margin-right: 0; -} - -.media-button.play > .ended { background-image: -webkit-image-set( url(../assets/100/player_button_play.png) 1x, url(../assets/200/player_button_play.png) 2x); } -.media-button.play > .playing { +:host([playing]) .media-button.play { background-image: -webkit-image-set( url(../assets/100/player_button_pause.png) 1x, url(../assets/200/player_button_pause.png) 2x); } .media-button.previous { - margin-left: 5px; - margin-right: 0; -} - -.media-button.previous > .normal { background-image: -webkit-image-set( url(../assets/100/player_button_previous.png) 1x, url(../assets/200/player_button_previous.png) 2x); + margin-left: 8px; + margin-right: 0; } .media-button.next { - margin-left: 0; - margin-right: 5px; -} - -.media-button.next > .normal { background-image: -webkit-image-set( url(../assets/100/player_button_next.png) 1x, url(../assets/200/player_button_next.png) 2x); + margin-left: 0; + margin-right: 8px; } .media-button.volume { - margin-left: 5px; - margin-right: 5px; -} - -.media-button.volume > .normal { background-image: -webkit-image-set( url(../assets/100/player_button_volume.png) 1x, url(../assets/200/player_button_volume.png) 2x); -} - -.media-button.volume > label > .icon { - background-image: -webkit-image-set( - url(../assets/100/player_button_volume.png) 1x, - url(../assets/200/player_button_volume.png) 2x); + margin-left: 0; + margin-right: 8px; pointer-events: auto; } -.media-button.volume > label > input:checked + .icon { - background-image: -webkit-image-set( - url(../assets/100/player_button_volume_active.png) 1x, - url(../assets/200/player_button_volume_active.png) 2x); -} - .media-button.playlist { - margin-left: 5px; - margin-right: 5px; -} - -.media-button.playlist > label > .icon { background-image: -webkit-image-set( url(../assets/100/player_button_playlist.png) 1x, url(../assets/200/player_button_playlist.png) 2x); pointer-events: auto; } -.media-button.playlist > label > input:checked + .icon { - background-image: -webkit-image-set( - url(../assets/100/player_button_playlist_active.png) 1x, - url(../assets/200/player_button_playlist_active.png) 2x); -} - - /* Invisible div used to compute the width required for the elapsed time. */ -.time-controls > .time > .duration, .time-controls > .time > .current { align-items: center; - color: #3d3d3d; display: flex; flex-direction: row; - font-size: 12px; height: 100%; justify-content: flex-end; position: absolute; top: -1px; } -.time-controls > .time > .duration { - left: 0; -} - -.time-controls > .time > .current { - right: 0; -} - /* Volume controls: sound button and volume slider */ #volumeContainer {
diff --git a/ui/file_manager/audio_player/elements/control_panel.html b/ui/file_manager/audio_player/elements/control_panel.html index 735d115..6e9df26 100644 --- a/ui/file_manager/audio_player/elements/control_panel.html +++ b/ui/file_manager/audio_player/elements/control_panel.html
@@ -5,74 +5,50 @@ --> <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/font-roboto/roboto.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/paper-slider/paper-slider.html"> <link rel="import" href="volume_controller.html"> +<link rel="import" href="chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/foreground/elements/files_icon_button.html"> <dom-module id="control-panel"> <link rel="import" type="css" href="control_panel.css"> <template> <div class="controls"> - <div class="upper-controls time-controls"> - <div class="time media-control"> - <div class="current">[[time2string_(time)]]</div> - </div> - <div class="progress media-control custom-slider"> - <input id="timeInput" name="timeInput" type="range" touch-action="manipulation" - min="0" max="[[duration]]" value="{{time::input}}"> - <div class="bar"> - <div class="filled" style$="[[computeProgressBarStyle_(time, duration)]]"></div> - <div class="cap left"></div> - <div class="cap right"></div> - </div> - </div> - <div class="time media-control"> - <div class="duration">[[time2string_(duration)]]</div> - </div> - </div> - <div class="lower-controls audio-controls"> + <div class="upper-controls audio-controls"> <!-- Shuffle toggle button in the bottom line. --> - <button class="shuffle-mode media-button toggle" state="default"> - <label> - <input id="shuffleCheckbox" - type="checkbox" - checked="{{shuffle::change}}"> - <span class="icon"></span> - </label> - </button> + <files-icon-button toggles + id="shuffle" + class="shuffle-mode media-button toggle" + active="{{shuffle}}"> + </files-icon-button> <!-- Repeat toggle button in the bottom line. --> - <button class="repeat media-button toggle" state="default"> - <label> - <input id="repeatCheckbox" - type="checkbox" - checked="{{repeat::change}}"> - <span class="icon"></span> - </label> - </button> + <files-icon-button toggles + id="repeat" + class="repeat media-button toggle" + active="{{repeat}}"> + </files-icon-button> <!-- Prev button in the bottom line. --> - <button class="previous media-button" - state="default" - on-click="previousClick"> - <div class="normal default"></div> - <div class="disabled"></div> - </button> + <files-icon-button + id="previous" + class="previous media-button" + on-click="previousClick"> + </files-icon-button> <!-- Play button in the bottom line. --> - <button class="play media-control media-button" - state$="[[computePlayState_(playing)]]" - on-click="playClick"> - <div class="normal playing"></div> - <div class="normal ended"></div> - <div class="disabled"></div> - </button> + <files-icon-button + id="play" + class="play media-button" + on-click="playClick"> + </files-icon-button> <!-- Next button in the bottom line. --> - <button class="next media-button" - state="default" - on-click="nextClick"> - <div class="normal default"></div> - <div class="disabled"></div> - </button> + <files-icon-button + id="next" + class="next media-button" + on-click="nextClick"> + </files-icon-button> <div id="volumeContainer" class="default-hidden" @@ -85,25 +61,26 @@ </div> <!-- Volume button in the bottom line. --> - <button id="volumeButton" - class="volume media-button toggle" - state="default" - anchor-point="bottom center"> - <label> - <input type="checkbox" checked="{{volumeSliderShown::change}}"> - <span class="icon"></span> - </label> - </button> + <files-icon-button toggles + id="volumeButton" + class="volume media-button toggle" + anchor-point="bottom center" + active="{{volumeSliderShown}}"> + </files-icon-button> <!-- Playlist button in the bottom line. --> - <button id="playlistButton" - class="playlist media-button toggle" - state="default"> - <label> - <input type="checkbox" checked="{{expanded::change}}"> - <span class="icon"></span> - </label> - </button> + <files-icon-button toggles + id="playList" + class="playlist media-button toggle" + active="{{expanded}}"> + </files-icon-button> + </div> + <div class="lower-controls time-controls"> + <div class="time-container"> + <div class="time-spacer">[[computeTimeString_(duration, duration)]]</div> + <div class="time">[[computeTimeString_(time, duration)]]</div> + </div> + <paper-slider id="timeSlider" max="[[duration]]" value="{{time::change}}"></paper-slider> </div> </div> </template>
diff --git a/ui/file_manager/audio_player/elements/control_panel.js b/ui/file_manager/audio_player/elements/control_panel.js index ca7ea240..452b881d 100644 --- a/ui/file_manager/audio_player/elements/control_panel.js +++ b/ui/file_manager/audio_player/elements/control_panel.js
@@ -36,7 +36,9 @@ playing: { type: Boolean, value: false, - notify: true + notify: true, + reflectToAttribute: true, + observer: 'playingChanged_' }, /** @@ -99,6 +101,23 @@ value: false, observer: 'volumeSliderShownChanged', notify: true + }, + + /** + * Whether the knob of time slider is being dragged. + */ + dragging: { + type: Boolean, + value: false, + notify: true + }, + + /** + * Dictionary which contains aria-labels for each controls. + */ + ariaLabels: { + type: Object, + observer: 'ariaLabelsChanged_' } }, @@ -112,17 +131,14 @@ this.$.volumeSlider.addEventListener('focusout', onFocusoutBound); this.$.volumeButton.addEventListener('focusout', onFocusoutBound); - // Prevent the time slider from being moved by arrow keys. - this.$.timeInput.addEventListener('keydown', function(event) { - switch (event.keyCode) { - case 37: // Left arrow - case 38: // Up arrow - case 39: // Right arrow - case 40: // Down arrow - event.preventDefault(); - break; - }; - }); + this.$.timeSlider.addEventListener('value-change', function() { + if (this.dragging) + this.dragging = false; + }.bind(this)); + this.$.timeSlider.addEventListener('immediate-value-change', function() { + if (!this.dragging) + this.dragging = true; + }.bind(this)); }, /** @@ -194,19 +210,45 @@ }, /** - * Computes state for play button based on 'playing' property. - * @return {string} + * Converts the time and duration into human friendly string. + * @param {number} time Time to be converted. + * @param {number} duration Duration to be converted. + * @return {string} String representation of the given time */ - computePlayState_: function(playing) { - return playing ? "playing" : "ended"; + computeTimeString_: function(time, duration) { + return this.time2string_(time) + ' / ' + this.time2string_(duration); }, /** - * Computes style for '.filled' element of progress bar. - * @return {string} + * Invoked when the playing property is changed. + * @param {boolean} playing + * @private */ - computeProgressBarStyle_: function(time, duration) { - return 'width: ' + (time / duration * 100) + '%;'; + playingChanged_: function(playing) { + if (this.ariaLabels) { + this.$.play.setAttribute('aria-label', + playing ? this.ariaLabels.pause : this.ariaLabels.play); + } + }, + + /** + * Invoked when the ariaLabels property is changed. + * @param {Object} ariaLabels + * @private + */ + ariaLabelsChanged_: function(ariaLabels) { + assert(ariaLabels); + // TODO(fukino): Use data bindings. + this.$.volumeSlider.setAttribute('aria-label', ariaLabels.volumeSlider); + this.$.shuffle.setAttribute('aria-label', ariaLabels.shuffle); + this.$.repeat.setAttribute('aria-label', ariaLabels.repeat); + this.$.previous.setAttribute('aria-label', ariaLabels.previous); + this.$.play.setAttribute('aria-label', + this.playing ? ariaLabels.pause : ariaLabels.play); + this.$.next.setAttribute('aria-label', ariaLabels.next); + this.$.volumeButton.setAttribute('aria-label', ariaLabels.volume); + this.$.playList.setAttribute('aria-label', ariaLabels.playList); + this.$.timeSlider.setAttribute('aria-label', ariaLabels.seekSlider); } }); })(); // Anonymous closure
diff --git a/ui/file_manager/audio_player/elements/track_list.css b/ui/file_manager/audio_player/elements/track_list.css index 1b3f3d5..a2f31a29 100644 --- a/ui/file_manager/audio_player/elements/track_list.css +++ b/ui/file_manager/audio_player/elements/track_list.css
@@ -4,9 +4,9 @@ :host { align-items: center; - background: #f5f5f5; + background: rgb(245, 245, 245); bottom: 72px; /* Room for the controls bar. */ - color: #3d3d3d; + color: rgb(51, 51, 51); cursor: default; display: flex; flex-direction: column; @@ -26,9 +26,8 @@ display: flex; flex: 0 0 auto; flex-direction: row; - height: 44px; + height: 48px; justify-content: flex-start; - padding-left: 20px; width: 100%; } @@ -36,9 +35,32 @@ display: none; } -/* In the expanded mode the selected track is highlighted. */ -.track[active] { - background-color: rgb(66, 129, 244); +:host([expanded]) > .track:hover { + background-color: rgba(0, 0, 0, 0.08); +} + +/* Track icon. */ +.track .icon { + background-position: center; + background-repeat: no-repeat; + flex: none; + height: 32px; + margin: 8px; + pointer-events: none; + width: 32px; +} + +.track:hover .icon { + background-image: -webkit-image-set( + url(../assets/100/playlist_play.png) 1x, + url(../assets/200/playlist_play.png) 2x); + pointer-events: auto; +} + +.track[active] .icon { + background-image: -webkit-image-set( + url(../assets/100/playlist_now_playing.png) 1x, + url(../assets/200/playlist_now_playing.png) 2x); } /* Track data. */ @@ -54,22 +76,18 @@ .track .data .data-title, .track .data .data-artist { - font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .track .data .data-title { - color: #343434; - font-weight: bold; + color: rgb(51, 51, 51); + font-size: 13px; + font-weight: 500; } .track .data .data-artist { - color: #969696; -} - -.track[active] .data .data-title, -.track[active] .data .data-artist { - color: #fff; + color: rgb(100, 100, 100); + font-size: 12px; }
diff --git a/ui/file_manager/audio_player/elements/track_list.html b/ui/file_manager/audio_player/elements/track_list.html index b31e45f..23f91bc 100644 --- a/ui/file_manager/audio_player/elements/track_list.html +++ b/ui/file_manager/audio_player/elements/track_list.html
@@ -5,12 +5,14 @@ --> <link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/font-roboto/roboto.html"> <dom-module id="track-list"> <link rel="import" type="css" href="track_list.css"> <template> <template is="dom-repeat" id="tracks" items="[[tracks]]"> <div class="track" active$="[[item.active]]" index$="[[index]]" on-click="trackClicked"> + <div class="icon"></div> <div class="data"> <div class="data-title">[[item.title]]</div> <div class="data-artist">[[item.artist]]</div>
diff --git a/ui/file_manager/audio_player/elements/track_list.js b/ui/file_manager/audio_player/elements/track_list.js index 95894ed..d1a030e46 100644 --- a/ui/file_manager/audio_player/elements/track_list.js +++ b/ui/file_manager/audio_player/elements/track_list.js
@@ -166,8 +166,15 @@ trackClicked: function(event) { var index = ~~event.currentTarget.getAttribute('index'); var track = this.tracks[index]; - if (track) - this.selectTrack(track); + if (track) { + if (event.target.classList.contains('icon')) { + // If the play icon on the track is clicked, change the current track + // and start playing it regardless of current play state. + this.selectTrack(track, true /* force to play */); + } else { + this.selectTrack(track, false /* force to play */); + } + } }, /** @@ -250,8 +257,10 @@ * Sets the current track. * @param {!TrackInfo} track TrackInfo to be set as the current * track. + * @param {boolean} forceToPlay True if the track should be played + * regardless of the current play state (paused/played). */ - selectTrack: function(track) { + selectTrack: function(track, forceToPlay) { var index = -1; for (var i = 0; i < this.tracks.length; i++) { if (this.tracks[i].url === track.url) { @@ -261,10 +270,13 @@ } if (index >= 0) { // TODO(yoshiki): Clean up the flow and the code around here. - if (this.currentTrackIndex == index) + if (this.currentTrackIndex === index) { this.replayCurrentTrack(); - else + } else { this.currentTrackIndex = index; + if (forceToPlay) + this.fire('play'); + } } },
diff --git a/ui/file_manager/audio_player/icons/audio-player-128.png b/ui/file_manager/audio_player/icons/audio-player-128.png index 15b7772..5954c60 100644 --- a/ui/file_manager/audio_player/icons/audio-player-128.png +++ b/ui/file_manager/audio_player/icons/audio-player-128.png Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-256.png b/ui/file_manager/audio_player/icons/audio-player-256.png index e1202a860..2dd439cc 100644 --- a/ui/file_manager/audio_player/icons/audio-player-256.png +++ b/ui/file_manager/audio_player/icons/audio-player-256.png Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-32.png b/ui/file_manager/audio_player/icons/audio-player-32.png index b22e5f62..e32a22a7 100644 --- a/ui/file_manager/audio_player/icons/audio-player-32.png +++ b/ui/file_manager/audio_player/icons/audio-player-32.png Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-48.png b/ui/file_manager/audio_player/icons/audio-player-48.png index 305a3a97a..d7f41c69 100644 --- a/ui/file_manager/audio_player/icons/audio-player-48.png +++ b/ui/file_manager/audio_player/icons/audio-player-48.png Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-64.png b/ui/file_manager/audio_player/icons/audio-player-64.png index 724ee20..5ace5c8 100644 --- a/ui/file_manager/audio_player/icons/audio-player-64.png +++ b/ui/file_manager/audio_player/icons/audio-player-64.png Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-96.png b/ui/file_manager/audio_player/icons/audio-player-96.png index d866c35..8b1f007 100644 --- a/ui/file_manager/audio_player/icons/audio-player-96.png +++ b/ui/file_manager/audio_player/icons/audio-player-96.png Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-favicon-16.png b/ui/file_manager/audio_player/icons/audio-player-favicon-16.png index 90168b8..ace23a2 100644 --- a/ui/file_manager/audio_player/icons/audio-player-favicon-16.png +++ b/ui/file_manager/audio_player/icons/audio-player-favicon-16.png Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-favicon-32.png b/ui/file_manager/audio_player/icons/audio-player-favicon-32.png index 50c7c87..7ff6fd3 100644 --- a/ui/file_manager/audio_player/icons/audio-player-favicon-32.png +++ b/ui/file_manager/audio_player/icons/audio-player-favicon-32.png Binary files differ
diff --git a/ui/file_manager/audio_player/js/audio_player.js b/ui/file_manager/audio_player/js/audio_player.js index 216bb44..e178163 100644 --- a/ui/file_manager/audio_player/js/audio_player.js +++ b/ui/file_manager/audio_player/js/audio_player.js
@@ -64,6 +64,19 @@ this.offlineString_ = strings['AUDIO_OFFLINE']; AudioPlayer.TrackInfo.DEFAULT_ARTIST = strings['AUDIO_PLAYER_DEFAULT_ARTIST']; + // Pass translated labels to the AudioPlayerElement. + this.player_.ariaLabels = { + volumeSlider: strings['AUDIO_PLAYER_OPEN_VOLUME_SLIDER_BUTTON_LABEL'], + shuffle: strings['AUDIO_PLAYER_SHUFFLE_BUTTON_LABEL'], + repeat: strings['AUDIO_PLAYER_REPEAT_BUTTON_LABEL'], + previous: strings['MEDIA_PLAYER_PREVIOUS_BUTTON_LABEL'], + play: strings['MEDIA_PLAYER_PLAY_BUTTON_LABEL'], + pause: strings['MEDIA_PLAYER_PAUSE_BUTTON_LABEL'], + next: strings['MEDIA_PLAYER_NEXT_BUTTON_LABEL'], + volume: strings['AUDIO_PLAYER_OPEN_VOLUME_SLIDER_BUTTON_LABEL'], + playList: strings['AUDIO_PLAYER_OPEN_PLAY_LIST_BUTTON_LABEL'], + seekSlider: strings['MEDIA_PLAYER_SEEK_SLIDER_LABEL'] + }; }.bind(this)); this.volumeManager_.addEventListener('externally-unmounted', @@ -325,21 +338,21 @@ * @type {number} * @const */ -AudioPlayer.HEADER_HEIGHT = 33; // 32px + border 1px +AudioPlayer.HEADER_HEIGHT = 36; // 32px + border 4px /** * Track height in pixels. * @type {number} * @const */ -AudioPlayer.TRACK_HEIGHT = 44; +AudioPlayer.TRACK_HEIGHT = 48; /** * Controls bar height in pixels. * @type {number} * @const */ -AudioPlayer.CONTROLS_HEIGHT = 73; // 72px + border 1px +AudioPlayer.CONTROLS_HEIGHT = 96; /** * Default number of items in the expanded mode.
diff --git a/ui/file_manager/audio_player/js/background.js b/ui/file_manager/audio_player/js/background.js index 600c15b9..587c0816 100644 --- a/ui/file_manager/audio_player/js/background.js +++ b/ui/file_manager/audio_player/js/background.js
@@ -21,10 +21,13 @@ var audioPlayerCreateOptions = { id: 'audio-player', type: 'panel', - minHeight: 44 + 73, // 44px: track, 73px: controller - minWidth: 292, - height: 44 + 73, // collapsed - width: 292 + minHeight: 4 + 48 + 96, // 4px: border-top, 48px: track, 96px: controller + minWidth: 280, + height: 4 + 48 + 96, // collapsed + width: 280, + frame: { + color: '#fafafa' + } }; /**
diff --git a/ui/file_manager/audio_player/js/compiled_resources.gyp b/ui/file_manager/audio_player/js/compiled_resources.gyp index 232d181..4c4486d 100644 --- a/ui/file_manager/audio_player/js/compiled_resources.gyp +++ b/ui/file_manager/audio_player/js/compiled_resources.gyp
@@ -77,6 +77,9 @@ '../../file_manager/foreground/js/metadata/thumbnail_model.js', '../../file_manager/background/js/volume_manager.js', '../../file_manager/foreground/js/volume_manager_wrapper.js', + '../elements/control_panel.js', + '../elements/track_list.js', + '../elements/audio_player.js', 'audio_player_model.js', ], 'externs': [ @@ -89,7 +92,6 @@ '../../externs/chrome_test.js', '../../externs/es6_workaround.js', '../../externs/es7_workaround.js', - '../../externs/files_elements.js', '../../externs/platform.js', ], },
diff --git a/ui/file_manager/audio_player/manifest.json b/ui/file_manager/audio_player/manifest.json index c8db5587..64bb3186 100644 --- a/ui/file_manager/audio_player/manifest.json +++ b/ui/file_manager/audio_player/manifest.json
@@ -71,6 +71,6 @@ "js/background.js" ] }, - "content_security_policy": "default-src 'none'; script-src 'self' blob: filesystem: chrome://resources chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj chrome-extension://fmfcbgogabcbclcofgocippekhfcmgfj chrome-extension://enhhojjnijigcajfphajepfemndkmdlo; style-src 'self' blob: filesystem: chrome://resources 'unsafe-inline'; img-src 'self' blob: filesystem: chrome://theme chrome://resources data: https://www.googledrive.com; media-src 'self' blob: filesystem:; object-src 'self' blob: filesystem:" + "content_security_policy": "default-src 'none'; script-src 'self' blob: filesystem: chrome://resources chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj chrome-extension://fmfcbgogabcbclcofgocippekhfcmgfj chrome-extension://enhhojjnijigcajfphajepfemndkmdlo; style-src 'self' blob: filesystem: chrome://resources 'unsafe-inline'; img-src 'self' blob: filesystem: chrome://theme chrome://resources data: https://www.googledrive.com; media-src 'self' blob: filesystem:; object-src 'self' blob: filesystem:; font-src chrome://resources;" } }
diff --git a/ui/file_manager/file_manager/foreground/elements/files_toast.js b/ui/file_manager/file_manager/foreground/elements/files_toast.js index 2a539a6e..32e047fd 100644 --- a/ui/file_manager/file_manager/foreground/elements/files_toast.js +++ b/ui/file_manager/file_manager/foreground/elements/files_toast.js
@@ -31,7 +31,7 @@ */ created: function() { /** - * @private {{text: string, callback: function()}} + * @private {?{text: string, callback: function()}} */ this.action_ = null;
diff --git a/ui/file_manager/file_manager/foreground/js/compiled_resources.gyp b/ui/file_manager/file_manager/foreground/js/compiled_resources.gyp index f1cd7896..44f50c2 100644 --- a/ui/file_manager/file_manager/foreground/js/compiled_resources.gyp +++ b/ui/file_manager/file_manager/foreground/js/compiled_resources.gyp
@@ -69,6 +69,7 @@ '../../background/js/background.js', '../../../image_loader/image_loader_client.js', '../elements/files_ripple.js', + '../elements/files_toggle_ripple.js', '../elements/files_tooltip.js', './metrics_start.js', './ui/combobutton.js', @@ -160,7 +161,6 @@ '../../../externs/connection.js', '../../../externs/css_rule.js', '../../../externs/es6_workaround.js', - '../../../externs/files_elements.js', '../../../externs/html_menu_item_element.js', '../../../externs/launcher_search_provider.js', '../../../externs/webview_tag.js',
diff --git a/ui/file_manager/integration_tests/file_manager/open_audio_files.js b/ui/file_manager/integration_tests/file_manager/open_audio_files.js index 3a3c4c69..f75cbf8 100644 --- a/ui/file_manager/integration_tests/file_manager/open_audio_files.js +++ b/ui/file_manager/integration_tests/file_manager/open_audio_files.js
@@ -268,7 +268,7 @@ audioPlayerApp.callRemoteTestUtil( 'fakeMouseClick', audioAppId, - ['audio-player /deep/ button.repeat input'], + ['audio-player /deep/ files-icon-button.repeat'], this.next); }, function(result) { @@ -404,7 +404,7 @@ audioPlayerApp.callRemoteTestUtil( 'fakeMouseClick', audioAppId, - ['audio-player /deep/ button.repeat input'], + ['audio-player /deep/ files-icon-button.repeat'], this.next); }, function(result) {
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn index 130ca1a..114d476a 100644 --- a/ui/gfx/BUILD.gn +++ b/ui/gfx/BUILD.gn
@@ -467,6 +467,8 @@ "vector_icons/globe.icon", "vector_icons/help_outline.icon", "vector_icons/image.icon", + "vector_icons/incognito.1x.icon", + "vector_icons/incognito.icon", "vector_icons/keyword_search.1x.icon", "vector_icons/keyword_search.icon", "vector_icons/laptop.icon", @@ -474,8 +476,14 @@ "vector_icons/location_bar_http.icon", "vector_icons/location_bar_https_invalid.1x.icon", "vector_icons/location_bar_https_invalid.icon", + "vector_icons/location_bar_https_invalid_invert.1x.icon", + "vector_icons/location_bar_https_invalid_invert.icon", "vector_icons/location_bar_https_valid.1x.icon", "vector_icons/location_bar_https_valid.icon", + "vector_icons/location_bar_https_valid_in_chip.1x.icon", + "vector_icons/location_bar_https_valid_in_chip.icon", + "vector_icons/location_bar_https_valid_invert.1x.icon", + "vector_icons/location_bar_https_valid_invert.icon", "vector_icons/location_bar_star.icon", "vector_icons/location_bar_star_active.icon", "vector_icons/location_on.icon",
diff --git a/ui/gfx/color_utils.cc b/ui/gfx/color_utils.cc index 97c3a84a..494f04b 100644 --- a/ui/gfx/color_utils.cc +++ b/ui/gfx/color_utils.cc
@@ -291,12 +291,13 @@ static_cast<int>(b)); } +bool IsDark(SkColor color) { + return GetLuminanceForColor(color) < 128; +} + SkColor BlendTowardOppositeLuminance(SkColor color, SkAlpha alpha) { - unsigned char background_luminance = - color_utils::GetLuminanceForColor(color); - const SkColor blend_color = - (background_luminance < 128) ? SK_ColorWHITE : SK_ColorBLACK; - return color_utils::AlphaBlend(blend_color, color, alpha); + return AlphaBlend(IsDark(color) ? SK_ColorWHITE : SK_ColorBLACK, color, + alpha); } SkColor GetReadableColor(SkColor foreground, SkColor background) { @@ -334,8 +335,7 @@ SkColor DeriveDefaultIconColor(SkColor text_color) { // This function works similarly to BlendTowardOppositeLuminance, but uses a // different blend value for lightening and darkening. - unsigned char luminance = color_utils::GetLuminanceForColor(text_color); - if (luminance < 128) { + if (IsDark(text_color)) { // For black text, this comes out to kChromeIconGrey. return color_utils::AlphaBlend(SK_ColorWHITE, text_color, SkColorGetR(gfx::kChromeIconGrey));
diff --git a/ui/gfx/color_utils.h b/ui/gfx/color_utils.h index 72dbb586..55bd3e1a 100644 --- a/ui/gfx/color_utils.h +++ b/ui/gfx/color_utils.h
@@ -88,6 +88,9 @@ GFX_EXPORT SkColor AlphaBlend(SkColor foreground, SkColor background, SkAlpha alpha); +// Returns true if the luminance of |color| is closer to black than white. +GFX_EXPORT bool IsDark(SkColor color); + // Makes a dark color lighter or a light color darker by blending |color| with // white or black depending on its current luminance. |alpha| controls the // amount of white or black that will be alpha-blended into |color|.
diff --git a/ui/gfx/image/image.cc b/ui/gfx/image/image.cc index d9e51e8..2e0297a 100644 --- a/ui/gfx/image/image.cc +++ b/ui/gfx/image/image.cc
@@ -743,13 +743,13 @@ CHECK(!must_exist); return NULL; } - return it->second; + return it->second.get(); } void Image::AddRepresentation(scoped_ptr<internal::ImageRep> rep) const { CHECK(storage_.get()); RepresentationType type = rep->type(); - storage_->representations().insert(type, rep.Pass()); + storage_->representations().insert(std::make_pair(type, std::move(rep))); } } // namespace gfx
diff --git a/ui/gfx/image/image.h b/ui/gfx/image/image.h index 59b7a6e..931fe2a 100644 --- a/ui/gfx/image/image.h +++ b/ui/gfx/image/image.h
@@ -19,10 +19,10 @@ #ifndef UI_GFX_IMAGE_IMAGE_H_ #define UI_GFX_IMAGE_IMAGE_H_ +#include <map> #include <vector> #include "base/basictypes.h" -#include "base/containers/scoped_ptr_map.h" #include "base/memory/ref_counted_memory.h" #include "base/memory/scoped_ptr.h" #include "ui/gfx/gfx_export.h" @@ -53,8 +53,8 @@ kImageRepPNG, }; - typedef base::ScopedPtrMap<RepresentationType, scoped_ptr<internal::ImageRep>> - RepresentationMap; + using RepresentationMap = + std::map<RepresentationType, scoped_ptr<internal::ImageRep>>; // Creates an empty image with no representations. Image();
diff --git a/ui/gfx/render_text_harfbuzz.cc b/ui/gfx/render_text_harfbuzz.cc index 8078612e..1e806c6d 100644 --- a/ui/gfx/render_text_harfbuzz.cc +++ b/ui/gfx/render_text_harfbuzz.cc
@@ -1266,6 +1266,7 @@ run->underline = style.style(UNDERLINE); int32 script_item_break = 0; bidi_iterator.GetLogicalRun(run_break, &script_item_break, &run->level); + CHECK_GT(static_cast<size_t>(script_item_break), run_break); // Odd BiDi embedding levels correspond to RTL runs. run->is_rtl = (run->level % 2) == 1; // Find the length and script of this script run. @@ -1276,7 +1277,7 @@ const size_t new_run_break = std::min( static_cast<size_t>(script_item_break), TextIndexToGivenTextIndex(text, style.GetRange().end())); - CHECK_NE(new_run_break, run_break) + CHECK_GT(new_run_break, run_break) << "It must proceed! " << text << " " << run_break; run_break = new_run_break;
diff --git a/ui/gfx/vector_icons/incognito.1x.icon b/ui/gfx/vector_icons/incognito.1x.icon new file mode 100644 index 0000000..3d4e21e --- /dev/null +++ b/ui/gfx/vector_icons/incognito.1x.icon
@@ -0,0 +1,50 @@ +// Copyright 2015 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. + +CANVAS_DIMENSIONS, 24, +MOVE_TO, 11, 18, +R_CUBIC_TO, 0, 1.66f, -1.34f, 3, -3, 3, +R_CUBIC_TO, -1.66f, 0, -3, -1.34f, -3, -3, +R_CUBIC_TO, 0, -1.66f, 1.34f, -3, 3, -3, +R_CUBIC_TO, 1.66f, 0, 3, 1.34f, 3, 3, +CLOSE, +R_MOVE_TO, -3, 2, +R_CUBIC_TO, 1.11f, 0, 2, -0.89f, 2, -2, +R_CUBIC_TO, 0, -1.11f, -0.89f, -2, -2, -2, +R_CUBIC_TO, -1.11f, 0, -2, 0.9f, -2, 2, +R_CUBIC_TO, 0, 1.1f, 0.9f, 2, 2, 2, +CLOSE, +MOVE_TO, 19, 18, +R_CUBIC_TO, 0, 1.66f, -1.34f, 3, -3, 3, +R_CUBIC_TO, -1.66f, 0, -3, -1.34f, -3, -3, +R_CUBIC_TO, 0, -1.66f, 1.34f, -3, 3, -3, +R_CUBIC_TO, 1.66f, 0, 3, 1.34f, 3, 3, +CLOSE, +R_MOVE_TO, -3, -2, +R_CUBIC_TO, -1.1f, 0, -2, 0.89f, -2, 2, +R_CUBIC_TO, 0, 1.11f, 0.89f, 2, 2, 2, +R_CUBIC_TO, 1.11f, 0, 2, -0.89f, 2, -2, +R_CUBIC_TO, 0, -1.1f, -0.89f, -2, -2, -2, +CLOSE, +MOVE_TO, 12, 18, +R_CUBIC_TO, 0.93f, 0, 1.71f, 0.64f, 1.93f, 1.5f, +R_CUBIC_TO, 0.04f, -0.16f, 0.07f, -0.33f, 0.07f, -0.5f, +R_CUBIC_TO, 0, -1.1f, -0.9f, -2, -2, -2, +R_CUBIC_TO, -1.1f, 0, -2, 0.9f, -2, 2, +R_CUBIC_TO, 0, 0.17f, 0.03f, 0.34f, 0.07f, 0.5f, +R_CUBIC_TO, 0.22f, -0.86f, 1, -1.5f, 1.93f, -1.5f, +MOVE_TO, 16.39f, 9, +LINE_TO, 15, 5, +R_LINE_TO, -3, 1, +R_LINE_TO, -3, -1, +R_LINE_TO, -1.3f, 4, +R_H_LINE_TO, 8.7f, +CLOSE, +R_MOVE_TO, -9.46f, 2, +LINE_TO, 3, 13, +R_H_LINE_TO, 18, +R_LINE_TO, -3.8f, -2, +H_LINE_TO, 6.93f, +CLOSE, +END
diff --git a/ui/gfx/vector_icons/incognito.icon b/ui/gfx/vector_icons/incognito.icon new file mode 100644 index 0000000..cd65f43 --- /dev/null +++ b/ui/gfx/vector_icons/incognito.icon
@@ -0,0 +1,51 @@ +// Copyright 2015 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. + +MOVE_TO, 22.15f, 33.23f, +R_CUBIC_TO, 0, 3.06f, -2.48f, 5.54f, -5.54f, 5.54f, +R_CUBIC_TO, -3.06f, 0, -5.54f, -2.48f, -5.54f, -5.54f, +R_CUBIC_TO, 0, -3.06f, 2.48f, -5.54f, 5.54f, -5.54f, +R_CUBIC_TO, 3.06f, 0, 5.54f, 2.48f, 5.54f, 5.54f, +CLOSE, +R_MOVE_TO, -5.54f, 3.69f, +R_CUBIC_TO, 2.04f, 0, 3.69f, -1.65f, 3.69f, -3.69f, +R_CUBIC_TO, 0, -2.04f, -1.65f, -3.69f, -3.69f, -3.69f, +R_CUBIC_TO, -2.04f, 0, -3.69f, 1.65f, -3.69f, 3.69f, +R_CUBIC_TO, 0, 2.04f, 1.65f, 3.69f, 3.69f, 3.69f, +CLOSE, +MOVE_TO, 36.92f, 33.23f, +R_CUBIC_TO, 0, 3.06f, -2.48f, 5.54f, -5.54f, 5.54f, +R_CUBIC_TO, -3.06f, 0, -5.54f, -2.48f, -5.54f, -5.54f, +R_CUBIC_TO, 0, -3.06f, 2.48f, -5.54f, 5.54f, -5.54f, +R_CUBIC_TO, 3.06f, 0, 5.54f, 2.48f, 5.54f, 5.54f, +CLOSE, +R_MOVE_TO, -5.54f, -3.69f, +R_CUBIC_TO, -2.04f, 0, -3.69f, 1.66f, -3.69f, 3.69f, +R_CUBIC_TO, 0, 2.04f, 1.66f, 3.69f, 3.69f, 3.69f, +R_CUBIC_TO, 2.04f, 0, 3.69f, -1.66f, 3.69f, -3.69f, +R_CUBIC_TO, 0, -2.04f, -1.66f, -3.69f, -3.69f, -3.69f, +CLOSE, +MOVE_TO, 24, 33.23f, +R_CUBIC_TO, 1.72f, 0, 3.15f, 1.18f, 3.56f, 2.77f, +R_CUBIC_TO, 0.08f, -0.3f, 0.13f, -0.6f, 0.13f, -0.92f, +R_CUBIC_TO, 0, -2.04f, -1.65f, -3.69f, -3.69f, -3.69f, +R_CUBIC_TO, -2.04f, 0, -3.69f, 1.65f, -3.69f, 3.69f, +R_CUBIC_TO, 0, 0.32f, 0.05f, 0.63f, 0.13f, 0.92f, +R_CUBIC_TO, 0.41f, -1.59f, 1.84f, -2.77f, 3.56f, -2.77f, +MOVE_TO, 33.29f, 20, +R_LINE_TO, 0.06f, 0.18f, +LINE_TO, 40.62f, 24, +H_LINE_TO, 7.39f, +R_LINE_TO, 7.51f, -3.82f, +R_LINE_TO, 0.06f, -0.18f, +R_H_LINE_TO, 18.34f, +CLOSE, +R_MOVE_TO, -1.39f, -4, +R_LINE_TO, -2.36f, -6.77f, +LINE_TO, 24, 11.08f, +LINE_TO, 18.46f, 9.23f, +LINE_TO, 16.26f, 16, +R_H_LINE_TO, 15.64f, +CLOSE, +END
diff --git a/ui/gfx/vector_icons/location_bar_https_invalid_invert.1x.icon b/ui/gfx/vector_icons/location_bar_https_invalid_invert.1x.icon new file mode 100644 index 0000000..92083370 --- /dev/null +++ b/ui/gfx/vector_icons/location_bar_https_invalid_invert.1x.icon
@@ -0,0 +1,68 @@ +// Copyright 2015 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. + +CANVAS_DIMENSIONS, 16, +PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF, +ROUND_RECT, 1, 1, 14, 14, 2, +NEW_PATH, +PATH_COLOR_ARGB, 0xFF, 0xC5, 0x39, 0x29, +MOVE_TO, 4, 7.99f, +CUBIC_TO, 4, 7.44f, 4.45f, 7, 5, 7, +LINE_TO, 11, 7, +CUBIC_TO, 11.55f, 7, 12, 7.45f, 12, 7.99f, +LINE_TO, 12, 12.01f, +CUBIC_TO, 12, 12.56f, 11.55f, 13, 11, 13, +LINE_TO, 5, 13, +CUBIC_TO, 4.45f, 13, 4, 12.55f, 4, 12.01f, +LINE_TO, 4, 7.99f, +CLOSE, +MOVE_TO, 7, 9, +LINE_TO, 9, 9, +LINE_TO, 9, 11, +LINE_TO, 7, 11, +CLOSE, +MOVE_TO, 6, 8, +LINE_TO, 7, 8, +LINE_TO, 7, 9, +LINE_TO, 6, 9, +CLOSE, +MOVE_TO, 9, 8, +LINE_TO, 10, 8, +LINE_TO, 10, 9, +LINE_TO, 9, 9, +CLOSE, +MOVE_TO, 9, 11, +LINE_TO, 10, 11, +LINE_TO, 10, 12, +LINE_TO, 9, 12, +CLOSE, +MOVE_TO, 6, 11, +LINE_TO, 7, 11, +LINE_TO, 7, 12, +LINE_TO, 6, 12, +CLOSE, +MOVE_TO, 5, 4, +LINE_TO, 6, 4, +LINE_TO, 6, 7, +LINE_TO, 5, 7, +CLOSE, +MOVE_TO, 10, 4, +LINE_TO, 11, 4, +LINE_TO, 11, 7, +LINE_TO, 10, 7, +CLOSE, +MOVE_TO, 6, 3, +LINE_TO, 10, 3, +LINE_TO, 10, 4, +LINE_TO, 6, 4, +CLOSE, +NEW_PATH, +PATH_COLOR_ARGB, 0x66, 0xC5, 0x39, 0x29, +ROUND_RECT, 5, 3, 1, 1, 0, +ROUND_RECT, 10, 3, 1, 1, 0, +NEW_PATH, +PATH_COLOR_ARGB, 0x7F, 0xC5, 0x39, 0x29, +ROUND_RECT, 9, 4, 1, 1, 0, +ROUND_RECT, 6, 4, 1, 1, 0, +END
diff --git a/ui/gfx/vector_icons/location_bar_https_invalid_invert.icon b/ui/gfx/vector_icons/location_bar_https_invalid_invert.icon new file mode 100644 index 0000000..461c73d --- /dev/null +++ b/ui/gfx/vector_icons/location_bar_https_invalid_invert.icon
@@ -0,0 +1,44 @@ +// Copyright 2015 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. + +CANVAS_DIMENSIONS, 32, +PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF, +ROUND_RECT, 2, 2, 28, 28, 4, +NEW_PATH, +PATH_COLOR_ARGB, 0xFF, 0xC5, 0x39, 0x29, +MOVE_TO, 21, 25, +LINE_TO, 11, 25, +CUBIC_TO, 10, 25, 9, 24.01f, 9, 23.01f, +LINE_TO, 9, 15.06f, +CUBIC_TO, 9, 14.06f, 10, 12.97f, 11, 12.97f, +LINE_TO, 11, 10.98f, +CUBIC_TO, 11, 9.49f, 12.5f, 7, 16, 7, +CUBIC_TO, 19.5f, 7, 21, 9.49f, 21, 10.98f, +LINE_TO, 21, 12.97f, +CUBIC_TO, 22, 12.97f, 23, 14.06f, 23, 15.06f, +LINE_TO, 23, 23.01f, +CUBIC_TO, 23, 24.01f, 22, 25, 21, 25, +CLOSE, +MOVE_TO, 13, 11.91f, +LINE_TO, 13, 12.97f, +LINE_TO, 19, 12.97f, +CUBIC_TO, 19, 12.97f, 19, 11.95f, 19, 11.91f, +CUBIC_TO, 18.96f, 10.21f, 17.68f, 8.99f, 16, 8.99f, +CUBIC_TO, 14.29f, 8.99f, 13, 10.14f, 13, 11.91f, +CLOSE, +MOVE_TO, 18.05f, 15.95f, +LINE_TO, 16.01f, 17.98f, +LINE_TO, 13.97f, 15.95f, +LINE_TO, 13.02f, 16.89f, +LINE_TO, 15.07f, 18.92f, +LINE_TO, 13, 20.98f, +LINE_TO, 13.94f, 21.92f, +LINE_TO, 16.01f, 19.86f, +LINE_TO, 18.05f, 21.88f, +LINE_TO, 19, 20.94f, +LINE_TO, 16.96f, 18.92f, +LINE_TO, 19, 16.89f, +LINE_TO, 18.05f, 15.95f, +CLOSE, +END
diff --git a/ui/gfx/vector_icons/location_bar_https_valid_in_chip.1x.icon b/ui/gfx/vector_icons/location_bar_https_valid_in_chip.1x.icon new file mode 100644 index 0000000..6596a14 --- /dev/null +++ b/ui/gfx/vector_icons/location_bar_https_valid_in_chip.1x.icon
@@ -0,0 +1,50 @@ +// Copyright 2015 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. + +CANVAS_DIMENSIONS, 16, +MOVE_TO, 4, 7.99f, +R_CUBIC_TO, 0, -0.55f, 0.45f, -0.99f, 1, -0.99f, +R_H_LINE_TO, 6.01f, +R_CUBIC_TO, 0.55f, 0, 1, 0.45f, 1, 0.99f, +R_V_LINE_TO, 4.02f, +R_CUBIC_TO, 0, 0.55f, -0.45f, 0.99f, -1, 0.99f, +H_LINE_TO, 5, +R_CUBIC_TO, -0.55f, 0, -1, -0.45f, -1, -0.99f, +V_LINE_TO, 7.99f, +CLOSE, +MOVE_TO, 7, 9, +R_H_LINE_TO, 2, +R_V_LINE_TO, 2, +H_LINE_TO, 7, +V_LINE_TO, 9, +CLOSE, +MOVE_TO, 5, 4, +R_H_LINE_TO, 1, +R_V_LINE_TO, 3, +H_LINE_TO, 5, +V_LINE_TO, 4, +CLOSE, +R_MOVE_TO, 5, 0, +R_H_LINE_TO, 1, +R_V_LINE_TO, 3, +R_H_LINE_TO, -1, +V_LINE_TO, 4, +CLOSE, +MOVE_TO, 6, 3, +R_H_LINE_TO, 4, +R_V_LINE_TO, 1, +H_LINE_TO, 6, +V_LINE_TO, 3, +CLOSE, +MOVE_TO, 5, 3, +R_H_LINE_TO, 1, +R_V_LINE_TO, 1, +H_LINE_TO, 5, +CLOSE, +MOVE_TO, 10, 3, +R_H_LINE_TO, 1, +R_V_LINE_TO, 1, +R_H_LINE_TO, -1, +CLOSE, +END
diff --git a/ui/gfx/vector_icons/location_bar_https_valid_in_chip.icon b/ui/gfx/vector_icons/location_bar_https_valid_in_chip.icon new file mode 100644 index 0000000..d6fc0d9 --- /dev/null +++ b/ui/gfx/vector_icons/location_bar_https_valid_in_chip.icon
@@ -0,0 +1,35 @@ +// Copyright 2015 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. + +CANVAS_DIMENSIONS, 32, +MOVE_TO, 21, 25, +H_LINE_TO, 11, +R_CUBIC_TO, -1, 0, -2, -0.99f, -2, -1.99f, +R_V_LINE_TO, -7.95f, +R_CUBIC_TO, 0, -0.99f, 1, -2.09f, 2, -2.09f, +R_V_LINE_TO, -1.99f, +CUBIC_TO, 11, 9.49f, 12.5f, 7, 16, 7, +R_CUBIC_TO, 3.5f, 0, 5, 2.49f, 5, 3.98f, +R_V_LINE_TO, 1.99f, +R_CUBIC_TO, 1, 0, 2, 1.09f, 2, 2.09f, +R_V_LINE_TO, 7.96f, +R_CUBIC_TO, 0, 1, -1, 1.99f, -2, 1.99f, +CLOSE, +R_MOVE_TO, -5, -8.95f, +R_CUBIC_TO, -1.1f, 0, -2, 0.88f, -2, 1.96f, +R_CUBIC_TO, 0, 0.72f, 0.4f, 1.35f, 1, 1.68f, +R_V_LINE_TO, 2.23f, +R_H_LINE_TO, 2, +V_LINE_TO, 19.69f, +R_CUBIC_TO, 0.6f, -0.34f, 1, -0.96f, 1, -1.68f, +R_CUBIC_TO, 0, -1.08f, -0.89f, -1.96f, -2, -1.96f, +CLOSE, +R_MOVE_TO, -3, -4.14f, +R_V_LINE_TO, 1.06f, +R_H_LINE_TO, 6, +R_V_LINE_TO, -1.06f, +R_CUBIC_TO, -0.04f, -1.69f, -1.32f, -2.92f, -3, -2.92f, +R_CUBIC_TO, -1.71f, 0, -3, 1.15f, -3, 2.92f, +CLOSE, +END
diff --git a/ui/gfx/vector_icons/location_bar_https_valid_invert.1x.icon b/ui/gfx/vector_icons/location_bar_https_valid_invert.1x.icon new file mode 100644 index 0000000..f0f60e5 --- /dev/null +++ b/ui/gfx/vector_icons/location_bar_https_valid_invert.1x.icon
@@ -0,0 +1,47 @@ +// Copyright 2015 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. + +CANVAS_DIMENSIONS, 16, +PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF, +ROUND_RECT, 1, 1, 14, 14, 2, +NEW_PATH, +PATH_COLOR_ARGB, 0xFF, 0x0B, 0x80, 0x43, +MOVE_TO, 4, 7.99f, +CUBIC_TO, 4, 7.44f, 4.45f, 7, 5, 7, +LINE_TO, 11, 7, +CUBIC_TO, 11.55f, 7, 12, 7.45f, 12, 7.99f, +LINE_TO, 12, 12.01f, +CUBIC_TO, 12, 12.56f, 11.55f, 13, 11, 13, +LINE_TO, 5, 13, +CUBIC_TO, 4.45f, 13, 4, 12.55f, 4, 12.01f, +CLOSE, +MOVE_TO, 7, 9, +LINE_TO, 9, 9, +LINE_TO, 9, 11, +LINE_TO, 7, 11, +CLOSE, +MOVE_TO, 5, 4, +LINE_TO, 6, 4, +LINE_TO, 6, 7, +LINE_TO, 5, 7, +CLOSE, +MOVE_TO, 10, 4, +LINE_TO, 11, 4, +LINE_TO, 11, 7, +LINE_TO, 10, 7, +CLOSE, +MOVE_TO, 6, 3, +LINE_TO, 10, 3, +LINE_TO, 10, 4, +LINE_TO, 6, 4, +CLOSE, +NEW_PATH, +PATH_COLOR_ARGB, 0x66, 0x0B, 0x80, 0x43, +ROUND_RECT, 5, 3, 1, 1, 0, +ROUND_RECT, 10, 3, 1, 1, 0, +NEW_PATH, +PATH_COLOR_ARGB, 0x7F, 0x0B, 0x80, 0x43, +ROUND_RECT, 9, 4, 1, 1, 0, +ROUND_RECT, 6, 4, 1, 1, 0, +END
diff --git a/ui/gfx/vector_icons/location_bar_https_valid_invert.icon b/ui/gfx/vector_icons/location_bar_https_valid_invert.icon new file mode 100644 index 0000000..b4bfdfd --- /dev/null +++ b/ui/gfx/vector_icons/location_bar_https_valid_invert.icon
@@ -0,0 +1,39 @@ +// Copyright 2015 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. + +CANVAS_DIMENSIONS, 32, +PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF, +ROUND_RECT, 2, 2, 28, 28, 4, +NEW_PATH, +PATH_COLOR_ARGB, 0xFF, 0x0B, 0x80, 0x43, +MOVE_TO, 21, 25, +LINE_TO, 11, 25, +CUBIC_TO, 10, 25, 9, 24.01f, 9, 23.01f, +LINE_TO, 9, 15.06f, +CUBIC_TO, 9, 14.06f, 10, 12.97f, 11, 12.97f, +LINE_TO, 11, 10.98f, +CUBIC_TO, 11, 9.49f, 12.5f, 7, 16, 7, +CUBIC_TO, 19.5f, 7, 21, 9.49f, 21, 10.98f, +LINE_TO, 21, 12.97f, +CUBIC_TO, 22, 12.97f, 23, 14.06f, 23, 15.06f, +LINE_TO, 23, 23.01f, +CUBIC_TO, 23, 24.01f, 22, 25, 21, 25, +CLOSE, +MOVE_TO, 16, 16.05f, +CUBIC_TO, 14.9f, 16.05f, 14, 16.93f, 14, 18.01f, +CUBIC_TO, 14, 18.73f, 14.4f, 19.35f, 15, 19.69f, +LINE_TO, 15, 21.92f, +LINE_TO, 17, 21.92f, +LINE_TO, 17, 19.69f, +CUBIC_TO, 17.6f, 19.35f, 18, 18.73f, 18, 18.01f, +CUBIC_TO, 18, 16.93f, 17.1f, 16.05f, 16, 16.05f, +CLOSE, +MOVE_TO, 13, 11.91f, +LINE_TO, 13, 12.97f, +LINE_TO, 19, 12.97f, +CUBIC_TO, 19, 12.97f, 19, 11.95f, 19, 11.91f, +CUBIC_TO, 18.96f, 10.21f, 17.68f, 8.99f, 16, 8.99f, +CUBIC_TO, 14.29f, 8.99f, 13, 10.14f, 13, 11.91f, +CLOSE, +END
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn index 6d101e37..1131722 100644 --- a/ui/gl/BUILD.gn +++ b/ui/gl/BUILD.gn
@@ -344,6 +344,10 @@ sources += [ "glx_api_unittest.cc" ] } + if (use_ozone) { + sources += [ "gl_image_ozone_native_pixmap_unittest.cc" ] + } + include_dirs = [ "//third_party/khronos" ] deps = [
diff --git a/ui/gl/gl_image_egl.cc b/ui/gl/gl_image_egl.cc index 91800e2..c130832 100644 --- a/ui/gl/gl_image_egl.cc +++ b/ui/gl/gl_image_egl.cc
@@ -56,7 +56,9 @@ bool GLImageEGL::BindTexImage(unsigned target) { DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_); + if (egl_image_ == EGL_NO_IMAGE_KHR) + return false; + glEGLImageTargetTexture2DOES(target, egl_image_); DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); return true;
diff --git a/ui/gl/gl_image_ozone_native_pixmap_unittest.cc b/ui/gl/gl_image_ozone_native_pixmap_unittest.cc new file mode 100644 index 0000000..a21a444 --- /dev/null +++ b/ui/gl/gl_image_ozone_native_pixmap_unittest.cc
@@ -0,0 +1,39 @@ +// Copyright 2015 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 "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/buffer_types.h" +#include "ui/gl/gl_image_ozone_native_pixmap.h" +#include "ui/gl/test/gl_image_test_template.h" +#include "ui/ozone/public/ozone_platform.h" +#include "ui/ozone/public/surface_factory_ozone.h" + +namespace gl { +namespace { + +class GLImageOzoneNativePixmapTestDelegate { + public: + scoped_refptr<gl::GLImage> CreateSolidColorImage( + const gfx::Size& size, + const uint8_t color[4]) const { + ui::SurfaceFactoryOzone* surface_factory = + ui::OzonePlatform::GetInstance()->GetSurfaceFactoryOzone(); + scoped_refptr<ui::NativePixmap> pixmap = + surface_factory->CreateNativePixmap(gfx::kNullAcceleratedWidget, size, + gfx::BufferFormat::RGBA_8888, + gfx::BufferUsage::SCANOUT); + EXPECT_TRUE(pixmap != nullptr); + scoped_refptr<gfx::GLImageOzoneNativePixmap> image( + new gfx::GLImageOzoneNativePixmap(size, GL_RGBA)); + EXPECT_TRUE(image->Initialize(pixmap.get(), pixmap->GetBufferFormat())); + return image; + } +}; + +INSTANTIATE_TYPED_TEST_CASE_P(GLImageOzoneNativePixmap, + GLImageTest, + GLImageOzoneNativePixmapTestDelegate); + +} // namespace +} // namespace gl
diff --git a/ui/gl/gl_surface.cc b/ui/gl/gl_surface.cc index 33d6e90b..79f39f7 100644 --- a/ui/gl/gl_surface.cc +++ b/ui/gl/gl_surface.cc
@@ -117,29 +117,28 @@ return false; } +bool GLSurface::SupportsAsyncSwap() { + return false; +} + unsigned int GLSurface::GetBackingFrameBufferObject() { return 0; } -bool GLSurface::SwapBuffersAsync(const SwapCompletionCallback& callback) { - DCHECK(!IsSurfaceless()); - gfx::SwapResult result = SwapBuffers(); - callback.Run(result); - return result == gfx::SwapResult::SWAP_ACK; +void GLSurface::SwapBuffersAsync(const SwapCompletionCallback& callback) { + NOTREACHED(); } gfx::SwapResult GLSurface::PostSubBuffer(int x, int y, int width, int height) { return gfx::SwapResult::SWAP_FAILED; } -bool GLSurface::PostSubBufferAsync(int x, +void GLSurface::PostSubBufferAsync(int x, int y, int width, int height, const SwapCompletionCallback& callback) { - gfx::SwapResult result = PostSubBuffer(x, y, width, height); - callback.Run(result); - return result == gfx::SwapResult::SWAP_ACK; + NOTREACHED(); } bool GLSurface::OnMakeCurrent(GLContext* context) { @@ -262,9 +261,9 @@ return surface_->SwapBuffers(); } -bool GLSurfaceAdapter::SwapBuffersAsync( +void GLSurfaceAdapter::SwapBuffersAsync( const SwapCompletionCallback& callback) { - return surface_->SwapBuffersAsync(callback); + surface_->SwapBuffersAsync(callback); } gfx::SwapResult GLSurfaceAdapter::PostSubBuffer(int x, @@ -274,16 +273,23 @@ return surface_->PostSubBuffer(x, y, width, height); } -bool GLSurfaceAdapter::PostSubBufferAsync( - int x, int y, int width, int height, - const SwapCompletionCallback& callback) { - return surface_->PostSubBufferAsync(x, y, width, height, callback); +void GLSurfaceAdapter::PostSubBufferAsync( + int x, + int y, + int width, + int height, + const SwapCompletionCallback& callback) { + surface_->PostSubBufferAsync(x, y, width, height, callback); } bool GLSurfaceAdapter::SupportsPostSubBuffer() { return surface_->SupportsPostSubBuffer(); } +bool GLSurfaceAdapter::SupportsAsyncSwap() { + return surface_->SupportsAsyncSwap(); +} + gfx::Size GLSurfaceAdapter::GetSize() { return surface_->GetSize(); }
diff --git a/ui/gl/gl_surface.h b/ui/gl/gl_surface.h index 8659cb8..f9de4fd 100644 --- a/ui/gl/gl_surface.h +++ b/ui/gl/gl_surface.h
@@ -70,6 +70,9 @@ // Returns whether or not the surface supports PostSubBuffer. virtual bool SupportsPostSubBuffer(); + // Returns whether SwapBuffersAsync() is supported. + virtual bool SupportsAsyncSwap(); + // Returns the internal frame buffer object name if the surface is backed by // FBO. Otherwise returns 0. virtual unsigned int GetBackingFrameBufferObject(); @@ -80,7 +83,7 @@ // surface is displayed on screen. The callback can be used to delay sending // SwapBufferAck till that data is available. The callback should be run on // the calling thread (i.e. same thread SwapBuffersAsync is called) - virtual bool SwapBuffersAsync(const SwapCompletionCallback& callback); + virtual void SwapBuffersAsync(const SwapCompletionCallback& callback); // Copy part of the backbuffer to the frontbuffer. virtual gfx::SwapResult PostSubBuffer(int x, int y, int width, int height); @@ -90,7 +93,7 @@ // callback can be used to delay sending SwapBufferAck till that data is // available. The callback should be run on the calling thread (i.e. same // thread PostSubBufferAsync is called) - virtual bool PostSubBufferAsync(int x, + virtual void PostSubBufferAsync(int x, int y, int width, int height, @@ -210,14 +213,15 @@ bool DeferDraws() override; bool IsOffscreen() override; gfx::SwapResult SwapBuffers() override; - bool SwapBuffersAsync(const SwapCompletionCallback& callback) override; + void SwapBuffersAsync(const SwapCompletionCallback& callback) override; gfx::SwapResult PostSubBuffer(int x, int y, int width, int height) override; - bool PostSubBufferAsync(int x, + void PostSubBufferAsync(int x, int y, int width, int height, const SwapCompletionCallback& callback) override; bool SupportsPostSubBuffer() override; + bool SupportsAsyncSwap() override; gfx::Size GetSize() override; void* GetHandle() override; unsigned int GetBackingFrameBufferObject() override;
diff --git a/ui/gl/gl_surface_ozone.cc b/ui/gl/gl_surface_ozone.cc index 289755b1..231f6c5 100644 --- a/ui/gl/gl_surface_ozone.cc +++ b/ui/gl/gl_surface_ozone.cc
@@ -153,10 +153,11 @@ const RectF& crop_rect) override; bool IsOffscreen() override; VSyncProvider* GetVSyncProvider() override; + bool SupportsAsyncSwap() override; bool SupportsPostSubBuffer() override; gfx::SwapResult PostSubBuffer(int x, int y, int width, int height) override; - bool SwapBuffersAsync(const SwapCompletionCallback& callback) override; - bool PostSubBufferAsync(int x, + void SwapBuffersAsync(const SwapCompletionCallback& callback) override; + void PostSubBufferAsync(int x, int y, int width, int height, @@ -312,6 +313,10 @@ return vsync_provider_.get(); } +bool GLSurfaceOzoneSurfaceless::SupportsAsyncSwap() { + return true; +} + bool GLSurfaceOzoneSurfaceless::SupportsPostSubBuffer() { return true; } @@ -321,15 +326,17 @@ int width, int height) { // The actual sub buffer handling is handled at higher layers. - SwapBuffers(); - return gfx::SwapResult::SWAP_ACK; + NOTREACHED(); + return gfx::SwapResult::SWAP_FAILED; } -bool GLSurfaceOzoneSurfaceless::SwapBuffersAsync( +void GLSurfaceOzoneSurfaceless::SwapBuffersAsync( const SwapCompletionCallback& callback) { // If last swap failed, don't try to schedule new ones. - if (!last_swap_buffers_result_) - return false; + if (!last_swap_buffers_result_) { + callback.Run(gfx::SwapResult::SWAP_FAILED); + return; + } glFlush(); @@ -345,8 +352,10 @@ // implemented in GL drivers. if (has_implicit_external_sync_) { EGLSyncKHR fence = InsertFence(); - if (!fence) - return false; + if (!fence) { + callback.Run(gfx::SwapResult::SWAP_FAILED); + return; + } base::Closure fence_wait_task = base::Bind(&WaitForFence, GetDisplay(), fence); @@ -357,23 +366,22 @@ base::WorkerPool::PostTaskAndReply(FROM_HERE, fence_wait_task, fence_retired_callback, false); - return true; } else if (ozone_surface_->IsUniversalDisplayLinkDevice()) { glFinish(); } frame->ready = true; SubmitFrame(); - return last_swap_buffers_result_; } -bool GLSurfaceOzoneSurfaceless::PostSubBufferAsync( +void GLSurfaceOzoneSurfaceless::PostSubBufferAsync( int x, int y, int width, int height, const SwapCompletionCallback& callback) { - return SwapBuffersAsync(callback); + // The actual sub buffer handling is handled at higher layers. + SwapBuffersAsync(callback); } GLSurfaceOzoneSurfaceless::~GLSurfaceOzoneSurfaceless() { @@ -441,7 +449,7 @@ bool Resize(const gfx::Size& size, float scale_factor) override; bool SupportsPostSubBuffer() override; gfx::SwapResult SwapBuffers() override; - bool SwapBuffersAsync(const SwapCompletionCallback& callback) override; + void SwapBuffersAsync(const SwapCompletionCallback& callback) override; void Destroy() override; bool IsSurfaceless() const override; @@ -516,17 +524,17 @@ return gfx::SwapResult::SWAP_ACK; } -bool GLSurfaceOzoneSurfacelessSurfaceImpl::SwapBuffersAsync( +void GLSurfaceOzoneSurfacelessSurfaceImpl::SwapBuffersAsync( const SwapCompletionCallback& callback) { if (!images_[current_surface_]->ScheduleOverlayPlane( widget_, 0, OverlayTransform::OVERLAY_TRANSFORM_NONE, - gfx::Rect(GetSize()), gfx::RectF(1, 1))) - return false; - if (!GLSurfaceOzoneSurfaceless::SwapBuffersAsync(callback)) - return false; + gfx::Rect(GetSize()), gfx::RectF(1, 1))) { + callback.Run(gfx::SwapResult::SWAP_FAILED); + return; + } + GLSurfaceOzoneSurfaceless::SwapBuffersAsync(callback); current_surface_ ^= 1; BindFramebuffer(); - return true; } void GLSurfaceOzoneSurfacelessSurfaceImpl::Destroy() {
diff --git a/ui/gl/gl_tests.gyp b/ui/gl/gl_tests.gyp index d369723..cc06887 100644 --- a/ui/gl/gl_tests.gyp +++ b/ui/gl/gl_tests.gyp
@@ -54,6 +54,14 @@ 'wgl_api_unittest.cc', ], }], + ['use_ozone==1', { + 'dependencies': [ + '../ozone/ozone.gyp:ozone', + ], + 'sources': [ + 'gl_image_ozone_native_pixmap_unittest.cc', + ], + }], ], } ],
diff --git a/ui/native_theme/native_theme.h b/ui/native_theme/native_theme.h index 5fcd62f7..714b4b09f 100644 --- a/ui/native_theme/native_theme.h +++ b/ui/native_theme/native_theme.h
@@ -322,9 +322,6 @@ kColorId_ResultsTableNormalUrl, kColorId_ResultsTableHoveredUrl, kColorId_ResultsTableSelectedUrl, - kColorId_ResultsTableNormalDivider, - kColorId_ResultsTableHoveredDivider, - kColorId_ResultsTableSelectedDivider, // Positive text refers to good (often rendered in green) text, such as the // stock value went up. kColorId_ResultsTablePositiveText,
diff --git a/ui/native_theme/native_theme_aura.cc b/ui/native_theme/native_theme_aura.cc index 3f2fcea..3bdd3127 100644 --- a/ui/native_theme/native_theme_aura.cc +++ b/ui/native_theme/native_theme_aura.cc
@@ -112,11 +112,6 @@ static const SkColor kResultsTableTextMd = SK_ColorBLACK; static const SkColor kResultsTableDimmedTextMd = SkColorSetRGB(0x64, 0x64, 0x64); - static const SkColor kResultsTableDividerMd = color_utils::AlphaBlend( - kResultsTableTextMd, kTextfieldDefaultBackground, 0x34); - static const SkColor kResultsTableSelectedDividerMd = - color_utils::AlphaBlend(kResultsTableTextMd, - kTextfieldSelectionBackgroundFocused, 0x34); static const SkColor kPositiveTextColorMd = SkColorSetRGB(0x0b, 0x80, 0x43); static const SkColor kNegativeTextColorMd = SkColorSetRGB(0xc5, 0x39, 0x29); @@ -148,11 +143,6 @@ case kColorId_ResultsTableHoveredUrl: case kColorId_ResultsTableSelectedUrl: return GetSystemColor(kColorId_LinkEnabled); - case kColorId_ResultsTableNormalDivider: - case kColorId_ResultsTableHoveredDivider: - return kResultsTableDividerMd; - case kColorId_ResultsTableSelectedDivider: - return kResultsTableSelectedDividerMd; case kColorId_ResultsTablePositiveText: case kColorId_ResultsTablePositiveHoveredText: case kColorId_ResultsTablePositiveSelectedText: @@ -233,12 +223,6 @@ static const SkColor kResultsTableNormalUrl = kTextfieldSelectionColor; static const SkColor kResultsTableSelectedOrHoveredUrl = SkColorSetARGB(0xff, 0x0b, 0x80, 0x43); - static const SkColor kResultsTableNormalDivider = color_utils::AlphaBlend( - kResultsTableNormalText, kTextfieldDefaultBackground, 0x34); - static const SkColor kResultsTableHoveredDivider = color_utils::AlphaBlend( - kResultsTableHoveredText, kResultsTableHoveredBackground, 0x34); - static const SkColor kResultsTableSelectedDivider = color_utils::AlphaBlend( - kResultsTableSelectedText, kTextfieldSelectionBackgroundFocused, 0x34); const SkColor kPositiveTextColor = SkColorSetRGB(0x0b, 0x80, 0x43); const SkColor kNegativeTextColor = SkColorSetRGB(0xc5, 0x39, 0x29); static const SkColor kResultsTablePositiveText = color_utils::AlphaBlend( @@ -381,12 +365,6 @@ case kColorId_ResultsTableHoveredUrl: case kColorId_ResultsTableSelectedUrl: return kResultsTableSelectedOrHoveredUrl; - case kColorId_ResultsTableNormalDivider: - return kResultsTableNormalDivider; - case kColorId_ResultsTableHoveredDivider: - return kResultsTableHoveredDivider; - case kColorId_ResultsTableSelectedDivider: - return kResultsTableSelectedDivider; case kColorId_ResultsTablePositiveText: return kResultsTablePositiveText; case kColorId_ResultsTablePositiveHoveredText:
diff --git a/ui/native_theme/native_theme_dark_aura.cc b/ui/native_theme/native_theme_dark_aura.cc index 02c716f..0294e03 100644 --- a/ui/native_theme/native_theme_dark_aura.cc +++ b/ui/native_theme/native_theme_dark_aura.cc
@@ -87,9 +87,6 @@ // Temporary pass-throughs to NativeThemeAura, for colors not yet defined // for dark themes. TODO(estade): define colors for these and remove this // block. - case kColorId_ResultsTableNormalDivider: - case kColorId_ResultsTableHoveredDivider: - case kColorId_ResultsTableSelectedDivider: case kColorId_ResultsTablePositiveText: case kColorId_ResultsTablePositiveHoveredText: case kColorId_ResultsTablePositiveSelectedText:
diff --git a/ui/native_theme/native_theme_win.cc b/ui/native_theme/native_theme_win.cc index c9b604f..bb2460e 100644 --- a/ui/native_theme/native_theme_win.cc +++ b/ui/native_theme/native_theme_win.cc
@@ -611,16 +611,6 @@ case kColorId_ResultsTableSelectedUrl: return color_utils::GetReadableColor(kUrlTextColor, system_colors_[COLOR_HIGHLIGHT]); - case kColorId_ResultsTableNormalDivider: - return color_utils::AlphaBlend(system_colors_[COLOR_WINDOWTEXT], - system_colors_[COLOR_WINDOW], 0x34); - case kColorId_ResultsTableHoveredDivider: - return color_utils::AlphaBlend( - system_colors_[COLOR_WINDOWTEXT], - GetSystemColor(kColorId_ResultsTableHoveredBackground), 0x34); - case kColorId_ResultsTableSelectedDivider: - return color_utils::AlphaBlend(system_colors_[COLOR_HIGHLIGHTTEXT], - system_colors_[COLOR_HIGHLIGHT], 0x34); case kColorId_ResultsTablePositiveText: return color_utils::GetReadableColor(kPositiveTextColor, system_colors_[COLOR_WINDOW]);
diff --git a/ui/ozone/demo/gl_renderer.cc b/ui/ozone/demo/gl_renderer.cc index d675b5c5..0a70314 100644 --- a/ui/ozone/demo/gl_renderer.cc +++ b/ui/ozone/demo/gl_renderer.cc
@@ -51,9 +51,8 @@ glClearColor(1 - fraction, fraction, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - if (!surface_->SwapBuffersAsync(base::Bind(&GlRenderer::PostRenderFrameTask, - weak_ptr_factory_.GetWeakPtr()))) - LOG(FATAL) << "Failed to swap buffers"; + surface_->SwapBuffersAsync(base::Bind(&GlRenderer::PostRenderFrameTask, + weak_ptr_factory_.GetWeakPtr())); } void GlRenderer::PostRenderFrameTask(gfx::SwapResult result) {
diff --git a/ui/ozone/demo/surfaceless_gl_renderer.cc b/ui/ozone/demo/surfaceless_gl_renderer.cc index 60575d6..9e0f894a 100644 --- a/ui/ozone/demo/surfaceless_gl_renderer.cc +++ b/ui/ozone/demo/surfaceless_gl_renderer.cc
@@ -113,10 +113,9 @@ buffers_[back_buffer_]->image(), gfx::Rect(size_), gfx::RectF(0, 0, 1, 1)); back_buffer_ ^= 1; - if (!surface_->SwapBuffersAsync( - base::Bind(&SurfacelessGlRenderer::PostRenderFrameTask, - weak_ptr_factory_.GetWeakPtr()))) - LOG(FATAL) << "Failed to swap buffers"; + surface_->SwapBuffersAsync( + base::Bind(&SurfacelessGlRenderer::PostRenderFrameTask, + weak_ptr_factory_.GetWeakPtr())); } void SurfacelessGlRenderer::PostRenderFrameTask(gfx::SwapResult result) {
diff --git a/ui/ozone/platform/caca/caca_event_source.cc b/ui/ozone/platform/caca/caca_event_source.cc index 78d3344..e4ddc70 100644 --- a/ui/ozone/platform/caca/caca_event_source.cc +++ b/ui/ozone/platform/caca/caca_event_source.cc
@@ -216,8 +216,10 @@ flags = modifier_flags_ | changed_flags; } gfx::PointF location = TranslateLocation(last_cursor_location_, window); - ui::MouseEvent mouse_event(type, location, location, EventTimeForNow(), - flags, changed_flags); + ui::MouseEvent mouse_event(type, gfx::Point(), gfx::Point(), + EventTimeForNow(), flags, changed_flags); + mouse_event.set_location_f(location); + mouse_event.set_root_location_f(location); window->OnCacaEvent(&mouse_event); break; }
diff --git a/ui/ozone/platform/caca/caca_window.cc b/ui/ozone/platform/caca/caca_window.cc index 0a346e41..16be1885f 100644 --- a/ui/ozone/platform/caca/caca_window.cc +++ b/ui/ozone/platform/caca/caca_window.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/logging.h" #include "base/message_loop/message_loop.h" +#include "base/strings/utf_string_conversions.h" #include "base/trace_event/trace_event.h" #include "ui/events/ozone/events_ozone.h" #include "ui/events/platform/platform_event_source.h" @@ -140,6 +141,10 @@ return nullptr; } +void CacaWindow::SetTitle(const base::string16& title) { + caca_set_display_title(display_.get(), UTF16ToUTF8(title).c_str()); +} + bool CacaWindow::CanDispatchEvent(const PlatformEvent& event) { return true; } uint32_t CacaWindow::DispatchEvent(const PlatformEvent& ne) {
diff --git a/ui/ozone/platform/caca/caca_window.h b/ui/ozone/platform/caca/caca_window.h index 4761375..375a464c 100644 --- a/ui/ozone/platform/caca/caca_window.h +++ b/ui/ozone/platform/caca/caca_window.h
@@ -62,6 +62,7 @@ void MoveCursorTo(const gfx::Point& location) override; void ConfineCursorToBounds(const gfx::Rect& bounds) override; PlatformImeController* GetPlatformImeController() override; + void SetTitle(const base::string16& title) override; // PlatformEventDispatcher: bool CanDispatchEvent(const PlatformEvent& event) override;
diff --git a/ui/ozone/platform/cast/client_native_pixmap_factory_cast.cc b/ui/ozone/platform/cast/client_native_pixmap_factory_cast.cc index 3f7100a..a55c3462 100644 --- a/ui/ozone/platform/cast/client_native_pixmap_factory_cast.cc +++ b/ui/ozone/platform/cast/client_native_pixmap_factory_cast.cc
@@ -4,12 +4,51 @@ #include "ui/ozone/platform/cast/client_native_pixmap_factory_cast.h" -#include "ui/ozone/common/stub_client_native_pixmap_factory.h" +#include "base/logging.h" +#include "ui/gfx/buffer_types.h" +#include "ui/ozone/public/client_native_pixmap.h" +#include "ui/ozone/public/client_native_pixmap_factory.h" namespace ui { +namespace { + +// Dummy ClientNativePixmap implementation for Cast ozone. +// Our NativePixmaps are just used to plumb an overlay frame through, +// so they get instantiated, but not used. +class ClientNativePixmapCast : public ClientNativePixmap { + public: + // ClientNativePixmap implementation: + void* Map() override { + NOTREACHED(); + return nullptr; + } + void Unmap() override { NOTREACHED(); } + void GetStride(int* stride) const override { NOTREACHED(); } +}; + +class ClientNativePixmapFactoryCast : public ClientNativePixmapFactory { + public: + // ClientNativePixmapFactoryCast implementation: + void Initialize(base::ScopedFD device_fd) override {} + + bool IsConfigurationSupported(gfx::BufferFormat format, + gfx::BufferUsage usage) const override { + return format == gfx::BufferFormat::RGBA_8888 && + usage == gfx::BufferUsage::SCANOUT; + } + + scoped_ptr<ClientNativePixmap> ImportFromHandle( + const gfx::NativePixmapHandle& handle, + const gfx::Size& size, + gfx::BufferUsage usage) override { + return make_scoped_ptr(new ClientNativePixmapCast()); + } +}; + +} // namespace ClientNativePixmapFactory* CreateClientNativePixmapFactoryCast() { - return CreateStubClientNativePixmapFactory(); + return new ClientNativePixmapFactoryCast(); } } // namespace ui
diff --git a/ui/ozone/platform/cast/surface_factory_cast.cc b/ui/ozone/platform/cast/surface_factory_cast.cc index 174dd78..1d4bee3b 100644 --- a/ui/ozone/platform/cast/surface_factory_cast.cc +++ b/ui/ozone/platform/cast/surface_factory_cast.cc
@@ -69,7 +69,8 @@ void SurfaceFactoryCast::TerminateDisplay() { void* egl_lib_handle = egl_platform_->GetEglLibrary(); - DCHECK(egl_lib_handle); + if (!egl_lib_handle) + return; EGLGetDisplayFn get_display = reinterpret_cast<EGLGetDisplayFn>(dlsym(egl_lib_handle, "eglGetDisplay")); @@ -188,7 +189,7 @@ // TODO(halliwell): try to implement this through CastEglPlatform. return nullptr; } - int GetDmaBufFd() override { return 0; } + int GetDmaBufFd() override { return -1; } int GetDmaBufPitch() override { return 0; } gfx::BufferFormat GetBufferFormat() override { return gfx::BufferFormat::LAST;
diff --git a/ui/ozone/platform/headless/headless_surface_factory.cc b/ui/ozone/platform/headless/headless_surface_factory.cc index 3262e69..1b7b956c 100644 --- a/ui/ozone/platform/headless/headless_surface_factory.cc +++ b/ui/ozone/platform/headless/headless_surface_factory.cc
@@ -16,6 +16,7 @@ #include "ui/gfx/vsync_provider.h" #include "ui/ozone/platform/headless/headless_window.h" #include "ui/ozone/platform/headless/headless_window_manager.h" +#include "ui/ozone/public/native_pixmap.h" #include "ui/ozone/public/surface_ozone_canvas.h" namespace ui { @@ -65,6 +66,40 @@ skia::RefPtr<SkSurface> surface_; }; +class TestPixmap : public ui::NativePixmap { + public: + TestPixmap(gfx::BufferFormat format) : format_(format) {} + + void* GetEGLClientBuffer() override { return nullptr; } + int GetDmaBufFd() override { return -1; } + int GetDmaBufPitch() override { return 0; } + gfx::BufferFormat GetBufferFormat() override { return format_; } + bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget, + int plane_z_order, + gfx::OverlayTransform plane_transform, + const gfx::Rect& display_bounds, + const gfx::RectF& crop_rect) override { + return true; + } + void SetProcessingCallback( + const ProcessingCallback& processing_callback) override {} + scoped_refptr<NativePixmap> GetProcessedPixmap( + gfx::Size target_size, + gfx::BufferFormat target_format) override { + return nullptr; + } + gfx::NativePixmapHandle ExportHandle() override { + return gfx::NativePixmapHandle(); + } + + private: + ~TestPixmap() override {} + + gfx::BufferFormat format_; + + DISALLOW_COPY_AND_ASSIGN(TestPixmap); +}; + } // namespace HeadlessSurfaceFactory::HeadlessSurfaceFactory() @@ -88,4 +123,12 @@ return false; } +scoped_refptr<NativePixmap> HeadlessSurfaceFactory::CreateNativePixmap( + gfx::AcceleratedWidget widget, + gfx::Size size, + gfx::BufferFormat format, + gfx::BufferUsage usage) { + return new TestPixmap(format); +} + } // namespace ui
diff --git a/ui/ozone/platform/headless/headless_surface_factory.h b/ui/ozone/platform/headless/headless_surface_factory.h index b715cbcc..1f008ed 100644 --- a/ui/ozone/platform/headless/headless_surface_factory.h +++ b/ui/ozone/platform/headless/headless_surface_factory.h
@@ -24,6 +24,11 @@ bool LoadEGLGLES2Bindings( AddGLLibraryCallback add_gl_library, SetGLGetProcAddressProcCallback set_gl_get_proc_address) override; + scoped_refptr<NativePixmap> CreateNativePixmap( + gfx::AcceleratedWidget widget, + gfx::Size size, + gfx::BufferFormat format, + gfx::BufferUsage usage) override; private: HeadlessWindowManager* window_manager_;
diff --git a/ui/views/bubble/bubble_delegate.cc b/ui/views/bubble/bubble_delegate.cc index afed9df..184a8ac 100644 --- a/ui/views/bubble/bubble_delegate.cc +++ b/ui/views/bubble/bubble_delegate.cc
@@ -67,8 +67,9 @@ UpdateColorsFromTheme(GetNativeTheme()); } -BubbleDelegateView::BubbleDelegateView(View* anchor_view, - BubbleBorder::Arrow arrow) +BubbleDelegateView::BubbleDelegateView( + View* anchor_view, + BubbleBorder::Arrow arrow) : close_on_esc_(true), close_on_deactivate_(true), anchor_view_storage_id_(ViewStorage::GetInstance()->CreateStorageID()), @@ -80,8 +81,7 @@ accept_events_(true), border_accepts_events_(true), adjust_if_offscreen_(true), - parent_window_(NULL), - close_reason_(CloseReason::UNKNOWN) { + parent_window_(NULL) { SetAnchorView(anchor_view); AddAccelerator(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); UpdateColorsFromTheme(GetNativeTheme()); @@ -151,14 +151,6 @@ return kViewClassName; } -void BubbleDelegateView::OnWidgetClosing(Widget* widget) { - DCHECK(GetBubbleFrameView()); - if (widget == GetWidget() && close_reason_ == CloseReason::UNKNOWN && - GetBubbleFrameView()->close_button_clicked()) { - close_reason_ = CloseReason::CLOSE_BUTTON; - } -} - void BubbleDelegateView::OnWidgetDestroying(Widget* widget) { if (anchor_widget() == widget) SetAnchorView(NULL); @@ -183,11 +175,8 @@ void BubbleDelegateView::OnWidgetActivationChanged(Widget* widget, bool active) { - if (close_on_deactivate() && widget == GetWidget() && !active) { - if (close_reason_ == CloseReason::UNKNOWN) - close_reason_ = CloseReason::DEACTIVATION; + if (close_on_deactivate() && widget == GetWidget() && !active) GetWidget()->Close(); - } } void BubbleDelegateView::OnWidgetBoundsChanged(Widget* widget, @@ -232,7 +221,6 @@ const ui::Accelerator& accelerator) { if (!close_on_esc() || accelerator.key_code() != ui::VKEY_ESCAPE) return false; - close_reason_ = CloseReason::ESCAPE; GetWidget()->Close(); return true; }
diff --git a/ui/views/bubble/bubble_delegate.h b/ui/views/bubble/bubble_delegate.h index 1bd96340..3bc73f8 100644 --- a/ui/views/bubble/bubble_delegate.h +++ b/ui/views/bubble/bubble_delegate.h
@@ -28,13 +28,6 @@ // Internal class name. static const char kViewClassName[]; - enum class CloseReason { - DEACTIVATION, - ESCAPE, - CLOSE_BUTTON, - UNKNOWN, - }; - BubbleDelegateView(); BubbleDelegateView(View* anchor_view, BubbleBorder::Arrow arrow); ~BubbleDelegateView() override; @@ -51,7 +44,6 @@ const char* GetClassName() const override; // WidgetObserver overrides: - void OnWidgetClosing(Widget* widget) override; void OnWidgetDestroying(Widget* widget) override; void OnWidgetVisibilityChanging(Widget* widget, bool visible) override; void OnWidgetVisibilityChanged(Widget* widget, bool visible) override; @@ -101,8 +93,6 @@ bool adjust_if_offscreen() const { return adjust_if_offscreen_; } void set_adjust_if_offscreen(bool adjust) { adjust_if_offscreen_ = adjust; } - CloseReason close_reason() const { return close_reason_; } - // Get the arrow's anchor rect in screen space. virtual gfx::Rect GetAnchorRect() const; @@ -202,8 +192,6 @@ // Parent native window of the bubble. gfx::NativeView parent_window_; - CloseReason close_reason_; - DISALLOW_COPY_AND_ASSIGN(BubbleDelegateView); };
diff --git a/ui/views/bubble/bubble_delegate_unittest.cc b/ui/views/bubble/bubble_delegate_unittest.cc index 1ec4e395..16f14c59 100644 --- a/ui/views/bubble/bubble_delegate_unittest.cc +++ b/ui/views/bubble/bubble_delegate_unittest.cc
@@ -3,10 +3,8 @@ // found in the LICENSE file. #include "ui/base/hit_test.h" -#include "ui/events/event_utils.h" #include "ui/views/bubble/bubble_delegate.h" #include "ui/views/bubble/bubble_frame_view.h" -#include "ui/views/controls/button/label_button.h" #include "ui/views/test/test_widget_observer.h" #include "ui/views/test/views_test_base.h" #include "ui/views/widget/widget.h" @@ -38,10 +36,6 @@ View* GetInitiallyFocusedView() override { return view_; } gfx::Size GetPreferredSize() const override { return gfx::Size(200, 200); } - BubbleFrameView* GetBubbleFrameViewForTest() const { - return GetBubbleFrameView(); - } - private: View* view_; @@ -267,53 +261,4 @@ EXPECT_FALSE(bubble_widget->CanActivate()); } -TEST_F(BubbleDelegateTest, CloseReasons) { - { - scoped_ptr<Widget> anchor_widget(CreateTestWidget()); - BubbleDelegateView* bubble_delegate = new BubbleDelegateView( - anchor_widget->GetContentsView(), BubbleBorder::NONE); - bubble_delegate->set_close_on_deactivate(true); - Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); - bubble_widget->Show(); - anchor_widget->Activate(); - EXPECT_TRUE(bubble_widget->IsClosed()); - EXPECT_EQ(BubbleDelegateView::CloseReason::DEACTIVATION, - bubble_delegate->close_reason()); - } - - { - scoped_ptr<Widget> anchor_widget(CreateTestWidget()); - BubbleDelegateView* bubble_delegate = new BubbleDelegateView( - anchor_widget->GetContentsView(), BubbleBorder::NONE); - bubble_delegate->set_close_on_esc(true); - Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); - bubble_widget->Show(); - // Cast as a test hack to access AcceleratorPressed() (which is protected - // in BubbleDelegate). - static_cast<View*>(bubble_delegate) - ->AcceleratorPressed(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); - EXPECT_TRUE(bubble_widget->IsClosed()); - EXPECT_EQ(BubbleDelegateView::CloseReason::ESCAPE, - bubble_delegate->close_reason()); - } - - { - scoped_ptr<Widget> anchor_widget(CreateTestWidget()); - TestBubbleDelegateView* bubble_delegate = - new TestBubbleDelegateView(anchor_widget->GetContentsView()); - Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_delegate); - bubble_widget->Show(); - BubbleFrameView* frame_view = bubble_delegate->GetBubbleFrameViewForTest(); - LabelButton* close_button = frame_view->close_; - ASSERT_TRUE(close_button); - frame_view->ButtonPressed( - close_button, - ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(0, 0), gfx::Point(0, 0), - ui::EventTimeForNow(), ui::EF_NONE, ui::EF_NONE)); - EXPECT_TRUE(bubble_widget->IsClosed()); - EXPECT_EQ(BubbleDelegateView::CloseReason::CLOSE_BUTTON, - bubble_delegate->close_reason()); - } -} - } // namespace views
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc index c9fcd40..88025b0 100644 --- a/ui/views/bubble/bubble_frame_view.cc +++ b/ui/views/bubble/bubble_frame_view.cc
@@ -70,8 +70,7 @@ title_icon_(new views::ImageView()), title_(nullptr), close_(nullptr), - titlebar_extra_view_(nullptr), - close_button_clicked_(false) { + titlebar_extra_view_(nullptr) { AddChildView(title_icon_); ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); @@ -322,10 +321,8 @@ } void BubbleFrameView::ButtonPressed(Button* sender, const ui::Event& event) { - if (sender == close_) { - close_button_clicked_ = true; + if (sender == close_) GetWidget()->Close(); - } } void BubbleFrameView::SetBubbleBorder(scoped_ptr<BubbleBorder> border) {
diff --git a/ui/views/bubble/bubble_frame_view.h b/ui/views/bubble/bubble_frame_view.h index 28750c3..b21215c 100644 --- a/ui/views/bubble/bubble_frame_view.h +++ b/ui/views/bubble/bubble_frame_view.h
@@ -84,8 +84,6 @@ gfx::Size client_size, bool adjust_if_offscreen); - bool close_button_clicked() const { return close_button_clicked_; } - protected: // Returns the available screen bounds if the frame were to show in |rect|. virtual gfx::Rect GetAvailableScreenBounds(const gfx::Rect& rect) const; @@ -95,7 +93,6 @@ private: FRIEND_TEST_ALL_PREFIXES(BubbleFrameViewTest, GetBoundsForClientView); - FRIEND_TEST_ALL_PREFIXES(BubbleDelegateTest, CloseReasons); // Mirrors the bubble's arrow location on the |vertical| or horizontal axis, // if the generated window bounds don't fit in the monitor bounds. @@ -126,9 +123,6 @@ // (x) close button. View* titlebar_extra_view_; - // Whether the close button was clicked. - bool close_button_clicked_; - DISALLOW_COPY_AND_ASSIGN(BubbleFrameView); };
diff --git a/ui/views/controls/styled_label.cc b/ui/views/controls/styled_label.cc index 66a820f0..91eb933 100644 --- a/ui/views/controls/styled_label.cc +++ b/ui/views/controls/styled_label.cc
@@ -46,7 +46,8 @@ result.reset(new Label(text)); } - result->SetEnabledColor(style_info.color); + if (style_info.color != SK_ColorTRANSPARENT) + result->SetEnabledColor(style_info.color); result->SetFontList(font_list); if (!style_info.tooltip.empty()) @@ -66,8 +67,7 @@ StyledLabel::RangeStyleInfo::RangeStyleInfo() : font_style(gfx::Font::NORMAL), - color(ui::NativeTheme::instance()->GetSystemColor( - ui::NativeTheme::kColorId_LabelEnabledColor)), + color(SK_ColorTRANSPARENT), disable_line_wrapping(false), is_link(false) {} @@ -78,8 +78,6 @@ RangeStyleInfo result; result.disable_line_wrapping = true; result.is_link = true; - result.color = ui::NativeTheme::instance()->GetSystemColor( - ui::NativeTheme::kColorId_LinkEnabled); return result; }
diff --git a/ui/views/controls/styled_label.h b/ui/views/controls/styled_label.h index 57638c5..2e5cad31 100644 --- a/ui/views/controls/styled_label.h +++ b/ui/views/controls/styled_label.h
@@ -44,7 +44,8 @@ // values defined in gfx::Font::FontStyle (BOLD, ITALIC, UNDERLINE). int font_style; - // The text color for the range. + // The text color for the range. Default is SK_ColorTRANSPARENT, indicating + // the theme's default color should be used. SkColor color; // Tooltip for the range.
diff --git a/ui/views/mus/BUILD.gn b/ui/views/mus/BUILD.gn index dd80c4a..5ab84dc6 100644 --- a/ui/views/mus/BUILD.gn +++ b/ui/views/mus/BUILD.gn
@@ -42,6 +42,7 @@ "//base/third_party/dynamic_annotations", "//cc", "//cc/surfaces", + "//components/bitmap_uploader", "//components/mus/gles2:lib", "//components/mus/public/cpp", "//components/mus/public/interfaces",
diff --git a/ui/views/mus/DEPS b/ui/views/mus/DEPS index 6ddcc645..447d4b4 100644 --- a/ui/views/mus/DEPS +++ b/ui/views/mus/DEPS
@@ -2,6 +2,7 @@ "+cc", "-cc/blink", "+components/font_service/public", + "+components/bitmap_uploader", "+components/gpu", "+components/mus", "+components/resource_provider",
diff --git a/ui/views/mus/native_widget_mus.cc b/ui/views/mus/native_widget_mus.cc index 578c9ea..bbcc75d1 100644 --- a/ui/views/mus/native_widget_mus.cc +++ b/ui/views/mus/native_widget_mus.cc
@@ -7,6 +7,7 @@ #include "base/thread_task_runner_handle.h" #include "components/mus/public/cpp/property_type_converters.h" #include "components/mus/public/cpp/window.h" +#include "components/mus/public/cpp/window_property.h" #include "mojo/converters/geometry/geometry_type_converters.h" #include "ui/aura/client/default_capture_client.h" #include "ui/aura/client/window_tree_client.h" @@ -259,13 +260,15 @@ // picked up. ui::ContextFactory* default_context_factory = aura::Env::GetInstance()->context_factory(); - aura::Env::GetInstance()->set_context_factory(context_factory_.get()); + // For Chrome, we need the GpuProcessTransportFactory so that renderer and + // browser pixels are composited into a single backing + // SoftwareOutputDeviceMus. + if (!default_context_factory) + aura::Env::GetInstance()->set_context_factory(context_factory_.get()); window_tree_host_.reset( new WindowTreeHostMus(shell_, this, window_, surface_type_)); window_tree_host_->InitHost(); aura::Env::GetInstance()->set_context_factory(default_context_factory); - DCHECK_EQ(context_factory_.get(), - window_tree_host_->compositor()->context_factory()); focus_client_.reset(new wm::FocusController(new FocusRulesImpl)); @@ -378,7 +381,8 @@ void NativeWidgetMus::CenterWindow(const gfx::Size& size) { // TODO(beng): clear user-placed property and set preferred size property. - window_->SetPreferredSize(size); + window_->SetSharedProperty<gfx::Size>( + mus::mojom::WindowManager::kPreferredSize_Property, size); } void NativeWidgetMus::GetWindowPlacement( @@ -642,7 +646,8 @@ } void NativeWidgetMus::OnSizeConstraintsChanged() { - window_->SetResizeBehavior( + window_->SetSharedProperty<int32_t>( + mus::mojom::WindowManager::kResizeBehavior_Property, ResizeBehaviorFromDelegate(GetWidget()->widget_delegate())); }
diff --git a/ui/views/mus/platform_window_mus.cc b/ui/views/mus/platform_window_mus.cc index be343eb0..3a9c85f5 100644 --- a/ui/views/mus/platform_window_mus.cc +++ b/ui/views/mus/platform_window_mus.cc
@@ -13,6 +13,11 @@ namespace views { +namespace { +static uint32_t accelerated_widget_count = 1; + +} // namespace + PlatformWindowMus::PlatformWindowMus(ui::PlatformWindowDelegate* delegate, mus::Window* mus_window) : delegate_(delegate), @@ -23,9 +28,18 @@ DCHECK(mus_window_); mus_window_->AddObserver(this); + // We need accelerated widget numbers to be different for each + // window and fit in the smallest sizeof(AcceleratedWidget) uint32_t + // has this property. +#if defined(OS_WIN) delegate_->OnAcceleratedWidgetAvailable( - gfx::kNullAcceleratedWidget, + reinterpret_cast<gfx::AcceleratedWidget>(accelerated_widget_count++), mus_window_->viewport_metrics().device_pixel_ratio); +#else + delegate_->OnAcceleratedWidgetAvailable( + static_cast<gfx::AcceleratedWidget>(accelerated_widget_count++), + mus_window_->viewport_metrics().device_pixel_ratio); +#endif } PlatformWindowMus::~PlatformWindowMus() {
diff --git a/ui/views/mus/window_tree_host_mus.cc b/ui/views/mus/window_tree_host_mus.cc index 7e01767..5f0b825 100644 --- a/ui/views/mus/window_tree_host_mus.cc +++ b/ui/views/mus/window_tree_host_mus.cc
@@ -4,9 +4,11 @@ #include "ui/views/mus/window_tree_host_mus.h" +#include "components/bitmap_uploader/bitmap_uploader.h" #include "mojo/application/public/interfaces/shell.mojom.h" #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" +#include "ui/base/view_prop.h" #include "ui/events/event.h" #include "ui/views/mus/input_method_mus.h" #include "ui/views/mus/native_widget_mus.h" @@ -31,6 +33,13 @@ dispatcher()->set_transform_events(false); compositor()->SetHostHasTransparentBackground(true); + bitmap_uploader_.reset(new bitmap_uploader::BitmapUploader(window)); + bitmap_uploader_->Init(shell); + prop_.reset( + new ui::ViewProp(GetAcceleratedWidget(), + bitmap_uploader::kBitmapUploaderForAcceleratedWidget, + bitmap_uploader_.get())); + input_method_.reset(new InputMethodMUS(this, window)); SetSharedInputMethod(input_method_.get()); }
diff --git a/ui/views/mus/window_tree_host_mus.h b/ui/views/mus/window_tree_host_mus.h index 5882a28..1a4473e 100644 --- a/ui/views/mus/window_tree_host_mus.h +++ b/ui/views/mus/window_tree_host_mus.h
@@ -12,6 +12,10 @@ class SkBitmap; +namespace bitmap_uploader { +class BitmapUploader; +} + namespace mojo { class Shell; } @@ -22,6 +26,7 @@ namespace ui { class Compositor; +class ViewProp; } namespace views { @@ -39,6 +44,9 @@ ~WindowTreeHostMus() override; PlatformWindowMus* platform_window(); + bitmap_uploader::BitmapUploader* bitmap_uploader() { + return bitmap_uploader_.get(); + }; ui::PlatformWindowState show_state() const { return show_state_; } private: @@ -51,6 +59,8 @@ NativeWidgetMus* native_widget_; scoped_ptr<InputMethodMUS> input_method_; ui::PlatformWindowState show_state_; + scoped_ptr<bitmap_uploader::BitmapUploader> bitmap_uploader_; + scoped_ptr<ui::ViewProp> prop_; DISALLOW_COPY_AND_ASSIGN(WindowTreeHostMus); };
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc index 67b939c..035df76 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc
@@ -14,13 +14,13 @@ #include "base/trace_event/trace_event.h" #include "base/win/scoped_gdi_object.h" #include "base/win/windows_version.h" +#include "ui/base/touch/touch_enabled.h" #include "ui/base/view_prop.h" #include "ui/base/win/internal_constants.h" #include "ui/base/win/lock_state.h" #include "ui/base/win/mouse_wheel_util.h" #include "ui/base/win/shell.h" #include "ui/base/win/touch_input.h" -#include "ui/events/base_event_utils.h" #include "ui/events/event.h" #include "ui/events/event_utils.h" #include "ui/events/keycodes/keyboard_code_conversion_win.h"
diff --git a/ui/views/window/custom_frame_view.cc b/ui/views/window/custom_frame_view.cc index c41c2e6..a699cd1 100644 --- a/ui/views/window/custom_frame_view.cc +++ b/ui/views/window/custom_frame_view.cc
@@ -181,7 +181,8 @@ if (frame_->IsMaximized() || !ShouldShowTitleBarAndBorder()) return; - GetDefaultWindowMask(size, window_mask); + GetDefaultWindowMask(size, frame_->GetCompositor()->device_scale_factor(), + window_mask); } void CustomFrameView::ResetWindowControls() {
diff --git a/ui/views/window/window_shape.cc b/ui/views/window/window_shape.cc index 39fe3de..ab9868e 100644 --- a/ui/views/window/window_shape.cc +++ b/ui/views/window/window_shape.cc
@@ -9,38 +9,41 @@ namespace views { -void GetDefaultWindowMask(const gfx::Size &size, gfx::Path *window_mask) { - // Redefine the window visible region for the new size. +void GetDefaultWindowMask(const gfx::Size& size, float scale, + gfx::Path* window_mask) { + const SkScalar sk_scale = SkFloatToScalar(scale); + const SkScalar width = SkIntToScalar(size.width()) / sk_scale; + const SkScalar height = SkIntToScalar(size.height()) / sk_scale; + window_mask->moveTo(0, 3); - window_mask->lineTo(1, 2); + window_mask->lineTo(1, 3); window_mask->lineTo(1, 1); - window_mask->lineTo(2, 1); + window_mask->lineTo(3, 1); window_mask->lineTo(3, 0); - window_mask->lineTo(SkIntToScalar(size.width() - 3), 0); - window_mask->lineTo(SkIntToScalar(size.width() - 2), 1); - window_mask->lineTo(SkIntToScalar(size.width() - 1), 1); - window_mask->lineTo(SkIntToScalar(size.width() - 1), 2); - window_mask->lineTo(SkIntToScalar(size.width()), 3); + window_mask->lineTo(width - 3, 0); + window_mask->lineTo(width - 3, 1); + window_mask->lineTo(width - 1, 1); + window_mask->lineTo(width - 1, 3); + window_mask->lineTo(width, 3); - window_mask->lineTo(SkIntToScalar(size.width()), - SkIntToScalar(size.height() - 3)); - window_mask->lineTo(SkIntToScalar(size.width() - 1), - SkIntToScalar(size.height() - 3)); - window_mask->lineTo(SkIntToScalar(size.width() - 1), - SkIntToScalar(size.height() - 1)); - window_mask->lineTo(SkIntToScalar(size.width() - 3), - SkIntToScalar(size.height() - 2)); - window_mask->lineTo(SkIntToScalar(size.width() - 3), - SkIntToScalar(size.height())); + window_mask->lineTo(width, height - 3); + window_mask->lineTo(width - 1, height - 3); + window_mask->lineTo(width - 1, height - 1); + window_mask->lineTo(width - 3, height - 1); + window_mask->lineTo(width - 3, height); - window_mask->lineTo(3, SkIntToScalar(size.height())); - window_mask->lineTo(2, SkIntToScalar(size.height() - 2)); - window_mask->lineTo(1, SkIntToScalar(size.height() - 1)); - window_mask->lineTo(1, SkIntToScalar(size.height() - 3)); - window_mask->lineTo(0, SkIntToScalar(size.height() - 3)); + window_mask->lineTo(3, height); + window_mask->lineTo(3, height - 1); + window_mask->lineTo(1, height - 1); + window_mask->lineTo(1, height - 3); + window_mask->lineTo(0, height - 3); window_mask->close(); + + SkMatrix m; + m.setScale(sk_scale, sk_scale); + window_mask->transform(m); } } // namespace views
diff --git a/ui/views/window/window_shape.h b/ui/views/window/window_shape.h index dde0f62..6e288e4 100644 --- a/ui/views/window/window_shape.h +++ b/ui/views/window/window_shape.h
@@ -17,6 +17,7 @@ // Sets the window mask to a style that most likely matches // ui/resources/window_* VIEWS_EXPORT void GetDefaultWindowMask(const gfx::Size& size, + float scale, gfx::Path* window_mask); } // namespace views